首页 > 解决方案 > 在训练期间如何修改人工神经元之间的连接?

问题描述

背景

在特斯拉自治日,Andrej Karpathy 做了一个演讲。在这个演讲中,他说,除其他外,一开始,人工神经网络中人工神经元之间的连接是随机初始化的。因此,网络进行随机预测。

后来他说信息通过网络向前流动,然后通过反向传播算法,信息通过网络向后流动。当信息向后流动时,神经元之间的连接被修改。反过来,网络做出越来越好的预测。

此外,我还从网上的一些讲座中了解到,神经元之间的连接(权重)存储在矩阵中。

问题

所以我的问题是连接这两个事实的数学公式或方程式是什么?

也就是说,这些矩阵是如何通过反向传播算法修改的?

标签: deep-learningneural-networkartificial-intelligence

解决方案


这是一个很好的问题。

假设您有一个带有单个隐藏层的简单神经网络

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)是关于 的导数fx或者在这种情况下,是关于权重矩阵的误差。

但是我们如何计算导数呢?这就是反向传播的用武之地。Tensorflow 和 Pytorch 等软件包不是通过分析找到导数,而是使用称为自动微分的东西来自动化该过程。

这个想法是递归地应用链式规则,直到您将复杂的误差函数分解为您手动计算导数的原子函数的总和。由于这从最后一层开始并通过网络向后流动,因此称为反向传播,尽管我认为它有点误导。

回想一下,链式法则是

(f(g(x)))' = f'(g(x)) g'(x)

分解复合函数f(g(x))后,如果您不知道如何计算f或的导数,则可以再次应用链式法则g


总而言之,你问

  1. 所以我的问题是连接这两个事实的数学公式或方程式是什么?

在推理过程中,信息“向前流动”(前向传播),因为您从第一层的输入开始,到最后一层的输出结束。

当分解从最后一层开始的导数时,信息“向后流动”,通过网络向后移动到第一层。

  1. 也就是说,这些矩阵是如何通过反向传播算法修改的?

使用称为梯度下降的算法修改矩阵,该算法试图迭代地使权重矩阵相对于某些误差函数更好一些。为了做到这一点,它需要误差函数的梯度,为此我们使用自动微分,其中我们递归地分解从最后一层开始向后移动到第一层的导数,因此称为反向传播。


推荐阅读