如何更新神经网络反向传播中的偏差?

Posted

技术标签:

【中文标题】如何更新神经网络反向传播中的偏差?【英文标题】:How to update the bias in neural network backpropagation? 【发布时间】:2011-04-16 01:24:31 【问题描述】:

有人可以向我解释如何在整个反向传播过程中更新偏差吗?

我读了很多书,但找不到更新偏见!

我知道偏差是一个额外的输入 1,并附加了一个权重(对于每个神经元)。一定有公式。

【问题讨论】:

这是一个大问题,答案却大得令人遗憾。这是一个不错的起点:ftp.sas.com/pub/neural/FAQ2.html#A_bias 使用梯度下降法像所有其他人一样训练这个权重 需要偏置项,偏置值允许您将激活函数(sigmoid 函数)向左或向右移动。偏置项中使用的权重将在反向传播算法中进行更改,并将使用梯度下降或 Octave/Matlab 中的 fminunc 函数等高级优化技术进行优化。 【参考方案1】:

按照Rojas 1996, chapter 7 的符号,反向传播计算误差函数E 的偏导数(又名成本,又名损失)

∂E/∂w[i,j] = delta[j] * o[i]

其中w[i,j] 是神经元ij 之间连接的权重,j 在网络中比i 高一层,o[i] 是@ 的输出(激活) 987654330@(在“输入层”的情况下,这只是所考虑的训练样本中特征i的值)。如何确定delta在任何教科书中都有给出,取决于激活函数,这里不再赘述。

这些值随后可用于权重更新,例如

// update rule for vanilla online gradient descent
w[i,j] -= gamma * o[i] * delta[j]

gamma 是学习率。

偏差权重的规则非常相似,只是没有来自前一层的输入。相反,偏差(在概念上)是由固定激活值为 1 的神经元的输入引起的。因此,偏差权重的更新规则是

bias[j] -= gamma_bias * 1 * delta[j]

其中bias[j] 是神经元j 上的偏差权重,与1 的乘法显然可以省略,gamma_bias 可以设置为gamma 或其他值。如果我没记错的话,较低的值是首选,尽管我不确定其理论依据。

【讨论】:

人们是否将l层的偏差(1)作为该层的激活?我的意思是如果是这样,那么l 层中权重的更新,包括其偏差的权重可以写成一个公式:w(l) -= gamma * dot( delta(l+1), o(l)),对吗?【参考方案2】:

您更改每个单独的权重和偏差的量将是您的成本函数相对于每个单独的权重和每个单独的偏差的偏导数。

∂C/∂(index of bias in network)

由于您的成本函数可能不明确依赖于单个权重和值(例如,成本可能等于(网络输出 - 预期输出)^2),因此您需要关联每个权重和偏差的偏导数到你知道的东西,即神经元的激活值(输出)。这是一个很好的指南:

https://medium.com/@erikhallstrm/backpropagation-from-the-beginning-77356edf427d

本指南清楚地说明了如何做这些事情,但有时可能缺乏解释。当我阅读上面链接的指南时,我发现阅读本书的第 1 章和第 2 章非常有帮助:

http://neuralnetworksanddeeplearning.com/chap1.html (为回答您的问题提供基本背景)

http://neuralnetworksanddeeplearning.com/chap2.html (回答你的问题)

基本上,偏差的更新方式与更新权重的方式相同:根据多维点的成本函数梯度确定变化。

将您的网络试图解决的问题想象为多维山丘和山谷(渐变)景观。此景观是您的成本如何随着权重和偏差的变化而变化的图形表示。神经网络的目标是到达这个领域的最低点,从而找到最小的成本并最小化错误。如果你把你的网络想象成一个试图到达这些梯度底部的旅行者(即梯度下降),那么你将改变每个权重(和偏差)的量与倾斜的斜率(函数的梯度)有关旅行者目前正在往下爬。旅行者的确切位置由一个多维坐标点(weight1, weight2, weight3, ... weight_n)给出,其中的偏差可以被认为是另一种重量。将网络的权重/偏差视为网络成本函数的变量,这清楚地表明必须使用∂C/∂(网络偏差指数)。

【讨论】:

【参考方案3】:

我了解偏差的作用是调整 输入值。下面是神经元内部发生的事情。当然是激活函数 将产生最终输出,但为了清楚起见,将其省略。

O = W1 I1 + W2 I2 + W3 I3

在真正的神经元中,突触已经发生了一些事情,输入数据根据样本的平均值进行水平调整,并根据样本的偏差进行缩放。因此,输入数据被归一化并且具有相同的权重,它们将产生相同的效果。归一化的 In 是根据原始数据 in 计算出来的(n 是索引)。

Bn = 平均值(in); Sn = 1/stdev((in); In= (in+Bn)

但是这不是必须单独执行的,因为神经元的权重和偏置可以完成相同的功能。当你用 in 代替 In 时,你会得到新的公式

O = w1 i1 + w2 i2 + w3 i3+ wbs

最后一个 wbs 是偏差和新的权重 wn 以及

wbs = W1 B1 S1 + W2 B2 S2 + W3 B3 S3 wn =W1 (in+Bn) Sn

因此存在偏差,它将/应该通过反向传播自动调整

【讨论】:

以上是关于如何更新神经网络反向传播中的偏差?的主要内容,如果未能解决你的问题,请参考以下文章

每层多个节点的反向传播

如何通过反向传播训练卷积神经网络中的过滤器?

神经网络 - 更新权重矩阵 - 反向传播算法

神经网络和深度学习之——误差反向传播算法

神经网络入门——15反向传播

如何在 autograd 反向传播中禁用某些模块的梯度更新?