我在阅读这份文档,他们提到权重调整公式如下:
新权重 = 旧权重 + 学习率 * delta * df(e)/de * 输入
其中的df(e)/de
部分是激活函数的导数,通常是像tanh
这样的Sigmoid函数。
- 这实际上是用来做什么的?
- 为什么我们要乘以这个?
- 为什么单单
学习率 * delta * 输入
不够?
这个问题是在这个问题之后提出的,并且与之密切相关:为什么在反向传播神经网络中必须使用非线性激活函数?。
回答:
训练神经网络只是指为每个单元格找到权重矩阵的值(对于有一个隐藏层的NN有两个权重矩阵),以便最小化观察数据和预测数据之间的平方差。在实践中,组成两个权重矩阵的各个权重会在每次迭代中进行调整(它们的初始值通常设置为随机值)。这也被称为在线模型,与批处理模型相对,后者在大量迭代后调整权重。
但是,权重应该如何调整——即,方向是正还是负?调整幅度是多少?
这就是导数的用武之地。 导数值大会导致相应权重的大幅调整。这很有道理,因为如果导数值大,就意味着你离最小值还很远。换句话说,在每次迭代中,权重会沿着成本函数表面(由总误差定义,即观察值与预测值的差异)最陡的下降方向(导数值最高的地方)进行调整。
在计算每个模式上的误差后(通过在该迭代中神经网络预测的值减去响应变量或输出向量的实际值),权重矩阵中的每个权重都会根据计算出的误差梯度成比例地进行调整。
因为误差计算从神经网络的末端开始(即,从输出层开始,通过从预测值中减去观察值),然后向前进行,所以这被称为反向传播。
更一般地说,导数(或对于多变量问题称为梯度)被优化技术使用(对于反向传播,共轭梯度可能是最常见的)来定位目标函数(也称为损失函数)的最小值。
它的工作原理如下:
一阶导数是曲线上的点,使得与其相切的直线的斜率为0。
所以,如果你在由目标函数定义的3D表面上行走,并且你走到斜率=0的点,那么你就在底部——你找到了函数的一个最小值(无论是全局还是局部)。
但是一阶导数的重要性远不止于此。它还告诉你是否在正确的方向上以达到函数的最小值。
如果你考虑当曲线/表面上的点向函数最小值移动时,切线斜率的变化,你很容易理解为什么会这样。
斜率(因此该点函数的导数值)逐渐减小。换句话说,要最小化一个函数,就要沿着导数方向前进——即,如果值在减小,那么你就在正确的方向上移动。