deep-learning - 在训练期间如何修改人工神经元之间的连接?
问题描述
背景
在特斯拉自治日,Andrej Karpathy 做了一个演讲。在这个演讲中,他说,除其他外,一开始,人工神经网络中人工神经元之间的连接是随机初始化的。因此,网络进行随机预测。
后来他说信息通过网络向前流动,然后通过反向传播算法,信息通过网络向后流动。当信息向后流动时,神经元之间的连接被修改。反过来,网络做出越来越好的预测。
此外,我还从网上的一些讲座中了解到,神经元之间的连接(权重)存储在矩阵中。
问题
所以我的问题是连接这两个事实的数学公式或方程式是什么?
也就是说,这些矩阵是如何通过反向传播算法修改的?
解决方案
这是一个很好的问题。
假设您有一个带有单个隐藏层的简单神经网络
a1 = g(x W1)
a2 = g(a1 W2)
y = g(a2)
哪里a1
是第一层的激活,或者说输出,a2
是隐藏层的激活,y
是输出。W1,W2
是权重矩阵。g()
是一些非线性“激活函数”,用于使神经网络编码更复杂的关系。另请注意,为了引入偏差元素(b
来自线性回归),按照惯例,我们使第一个元素a
等于1
: ak[0]=1
。
现在计算y
就是我们所说的“前向流”或“前向传播”。请注意,为了计算y
,您只需要输入数据x
。这也称为推理。
然而,为了让网络做出有效的预测,我们必须更新权重矩阵。更新网络有多种不同的方法,但梯度下降是一种常用方法。
为了使用梯度下降,我们需要某种指标来衡量网络做得有多好,或者更准确地说,它做得有多糟糕。我们定义了一个称为误差函数的函数,它取决于网络的输出以及真实答案。
def error(y, y'):
# approximately MSE.
return sum((y-y').^2)
现在为了更新权重,我们想弄清楚每个权重对错误分数的贡献程度,并以一种使贡献更小的方式更新它。这就是梯度下降的用武之地
W -= alpha * diff(error(y,y'), W)
其中alpha
是一些小的正实值,并且diff(f,x)
是关于 的导数f
,x
或者在这种情况下,是关于权重矩阵的误差。
但是我们如何计算导数呢?这就是反向传播的用武之地。Tensorflow 和 Pytorch 等软件包不是通过分析找到导数,而是使用称为自动微分的东西来自动化该过程。
这个想法是递归地应用链式规则,直到您将复杂的误差函数分解为您手动计算导数的原子函数的总和。由于这从最后一层开始并通过网络向后流动,因此称为反向传播,尽管我认为它有点误导。
回想一下,链式法则是
(f(g(x)))' = f'(g(x)) g'(x)
分解复合函数f(g(x))
后,如果您不知道如何计算f
或的导数,则可以再次应用链式法则g
。
总而言之,你问
- 所以我的问题是连接这两个事实的数学公式或方程式是什么?
在推理过程中,信息“向前流动”(前向传播),因为您从第一层的输入开始,到最后一层的输出结束。
当分解从最后一层开始的导数时,信息“向后流动”,通过网络向后移动到第一层。
- 也就是说,这些矩阵是如何通过反向传播算法修改的?
使用称为梯度下降的算法修改矩阵,该算法试图迭代地使权重矩阵相对于某些误差函数更好一些。为了做到这一点,它需要误差函数的梯度,为此我们使用自动微分,其中我们递归地分解从最后一层开始向后移动到第一层的导数,因此称为反向传播。
推荐阅读
- javascript - 如何将来自 javascript 的信息存储到 Django 模型中?
- php - 如何从客户端而不是从服务器或我的 Web 应用程序获取数据?
- javascript - 如何获取数字数组并返回数字加倍的数组?
- python - Python 包执行逻辑回归,连续目标在 0 和 1 之间?
- reactjs - 如何链接 mongo 数据库中的两个项目?
- html - 全屏和地理位置按钮在我的网络地图中不起作用
- ios - 上下文闭包类型 '(Data?, URLResponse?, Error?) -> Void' 需要 3 个参数,但 1 在闭包主体中使用
- android-fragments - 将 Xamarin.Forms 片段嵌入导致“孩子已经有父母”崩溃的片段中
- javascript - javascript on form 选项传递两个值,一个用于隐藏/可见功能,第二个用于数据值
- r - 代码不再适用于在 R 中的 vegan 中更改 metaMDS 中点的形状/颜色