神经网络中偏差的作用是什么?

959

我了解梯度下降和反向传播算法。但是我不明白的是: 什么时候使用偏置很重要,如何使用它?

例如,当映射AND函数时,使用两个输入和一个输出时,它不能给出正确的权重。但是,当我使用三个输入(其中一个是偏置)时,它可以给出正确的权重。


20
请查看这个问题:https://dev59.com/p3I-5IYBdhLWcg3wu7Pv,这是一个实际问题的例子,其中 OP 没有使用偏置项。 - Amro
7
以下是 Python 中一个很好的例子,展示了为什么偏置是重要的: https://dev59.com/n1oT5IYBdhLWcg3wtRUR - minerals
3
这是一篇非常棒的文章,充满了反向传播数学知识,并涵盖了偏差更新的内容:https://theclevermachine.wordpress.com/2014/09/06/derivation-error-backpropagation-gradient-descent-for-neural-networks/ - Andy
19个回答

1561

我认为偏置通常是有帮助的。实际上,偏置值使您能够将激活函数向左或向右移动,这可能对成功学习至关重要。

看一个简单的例子可能会有所帮助。考虑这个没有偏置的1输入、1输出网络:

simple network

网络的输出通过将输入(x)与权重(w0)相乘并通过某种激活函数(例如sigmoid函数)传递结果来计算。

这是该网络针对不同的w0值计算出的函数:

network output, given different w0 weights

改变权重w0本质上改变了Sigmoid曲线的“陡峭程度”。这很有用,但是如果您想在x等于2时使网络输出0怎么办?仅仅改变Sigmoid的陡峭程度不会真正起作用 - 您要能够将整个曲线向右移动

这正是偏置允许您做的。如果我们像这样向网络添加偏置:

simple network with a bias

...那么网络的输出变为sig(w0 * x + w1 * 1.0)。以下是网络在各种w1值下的输出:

network output, given different w1 weights

将w1设置为-5会将曲线向右移动,这使我们可以拥有在x等于2时输出0的网络。


9
最简单的方法是使用一个偏置节点连接到网络中所有非输入节点的网络。 - Nate Kohl
85
偏置的主要作用是为每个节点提供一个可训练的常量值(除了节点接收到的正常输入之外)。您可以使用单个偏置节点连接到N个节点,也可以使用N个偏置节点,每个节点都有一个连接来实现此目的;结果应该是相同的。 - Nate Kohl
5
@user132458,如果训练算法发现你不需要偏置移位,偏置权重可能会接近0,从而消除偏置信号。 - jorgenkg
5
我很喜欢你的回答,但是你说了一些听起来自相矛盾的话:“可训练常数值”…… 对我而言,“常数”是一个不会改变的值。然而你又写了“可训练”,这意味着这个值是可以改变的。所以,偏置是常数还是可训练的? - maikovich
9
每个隐藏神经元应该有一个偏差。 - user4846835
显示剩余13条评论

427
更简单理解偏差的方法是:它与线性函数的常数 b 有些相似,y = ax + b。它可以让你上下移动线条以更好地拟合数据预测。如果没有常数 b,线条总是通过原点 (0, 0),而你可能会得到一个较差的拟合结果。

8
很好的比喻,但如果我们将偏置设置为1,那么现在每条线都通过(0,1)而不是(0,0),为什么对拟合结果会有影响?由于所有线都偏向于y=1而不是y=0,这有什么帮助呢? - blue-sky
44
因为通过将偏置值乘以权重,你可以将其移动任意数量。 - Carcigenicate
3
把 b 称为“系数”正确吗?“系数”不是用来乘以变量的数字吗? - Ben
11
b不是“系数”,而是截距。 - Espanta
29
b是$x^0$的系数。a是$x^1$的系数。 - user2918461
显示剩余3条评论

114
以下是一些进一步的示例,展示了一个简单的2层前馈神经网络在具有和不具有偏置单元的两变量回归问题上的结果。权重是随机初始化的,并使用标准的ReLU激活函数。正如之前的答案所得出的结论,如果没有偏置,ReLU网络无法在(0,0)处偏离零。

enter image description here enter image description here enter image description here


4
请增加带有坐标轴标签的函数绘制功能。 - Komal-SkyNET
抱歉,这些点只是随机选择的,并没有真正的函数依据。 - JP K.
1
你能分享一下做动画的代码吗? - mon
你还对此感兴趣吗?在stackoverflow上分享代码的最佳方式是什么? - JP K.
1
@JPK,请将其分享为Github链接。 - Syntax Hacker
请看这里 https://github.com/JaPhi/NN_autograd_bias - JP K.

56
在ANN的训练过程中,有两种不同类型的参数可以进行调整,即权重和激活函数中的值。这是不切实际的,如果只有一个参数需要调整会更容易。为了解决这个问题,发明了偏置神经元。偏置神经元位于一层中,连接到下一层中的所有神经元,但不连接到上一层中的任何神经元,并且它总是发射1。由于偏置神经元发射1,与偏置神经元相连的权重直接添加到其他权重的组合总和中(公式2.1),就像激活函数中的t值一样。1 之所以不切实际,是因为同时调整权重和值,因此对权重的任何更改都可能抵消对先前数据实例有用的值的更改...添加一个没有变化值的偏置神经元允许您控制该层的行为。
此外,偏置还允许您使用单个神经网络来表示类似情况。考虑以下神经网络表示的AND布尔函数:ANN(来源: aihorizon.com)
  • w0对应于b
  • w1对应于x1
  • w2对应于x2

单个感知器可以用于表示许多布尔函数。

例如,如果我们假设布尔值为1(真)和-1(假),那么使用两个输入的感知器来实现AND函数的一种方法是将权重w0设置为-3,w1 = w2 = 0.5。通过将阈值更改为w0 = -0.3,可以使该感知器代表OR函数。实际上,AND和OR可以被视为m-of-n函数的特例:即,至少有m个n个输入到感知器必须为真的函数。 OR函数对应于m = 1,而AND函数对应于m = n。通过将所有输入权重设置为相同的值(例如0.5),然后相应地设置阈值w0,可以轻松地使用感知器表示任何m-of-n函数。

感知器可以表示所有基本布尔函数AND、OR、NAND(1 AND)和NOR(1 OR)。(机器学习-汤姆·米切尔)

阈值是偏置,w0是与偏置/阈值神经元相关联的权重。


8
把它看作一个经验法则:加上偏置!神经网络在一定程度上是“不可预测”的,因此如果您添加一个偏置神经元,那么您就更有可能比不使用偏置时更快地找到解决方案。当然,这并没有数学证明,但这是我在文献和一般用途中观察到的。 - Kiril

35

偏差不是一个NN术语。它是一个通用的代数术语。

Y = M*X + C(直线方程)

如果C(偏差)= 0,那么这条直线将始终通过原点,即(0,0),并且仅依赖于一个参数M,即斜率,因此我们有更少的变量可供操作。

C,也就是偏差,可以取任何数字,并具有移动图形的作用,从而能够表示更复杂的情况。

在逻辑回归中,目标的期望值通过链接函数进行转换,以将其值限制为单位间隔。通过这种方式,模型预测可以被视为主要的输出概率,如下所示:

Sigmoid function on Wikipedia

这是神经网络映射中的最终激活层,它打开和关闭神经元。在这里,偏差也有一个作用,它可以灵活地移动曲线,帮助我们映射模型。


33

神经网络中没有偏差的层仅仅是输入向量与矩阵相乘的结果。(输出向量可能会通过Sigmoid函数进行归一化,并在多层ANN中使用,但这不重要。)

这意味着您正在使用线性函数,因此所有零输入将始终映射到所有零输出。这对于某些系统可能是合理的解决方案,但通常过于严格。

使用偏差,您实际上是为您的输入空间添加了另一个维度,该维度始终取值为1,因此您避免了全零输入向量。这并不会使您失去任何普遍性,因为您训练的权重矩阵不需要是满射的,因此它仍然可以映射到以前可能的所有值。

2D ANN:

对于将两个维度映射到一个维度的ANN,例如复制AND或OR(或XOR)函数,您可以将神经网络视为执行以下操作:

在二维平面上标记所有输入向量的位置。因此,对于布尔值,您需要标记(-1,-1),(1,1),(-1,1),(1,-1)。现在,您的ANN正在二维平面上画一条直线,将正输出值与负输出值分开。

没有偏差时,这条直线必须经过零点,而有偏差时,您可以自由地将其放在任何位置。 因此,您会发现,在没有偏差的情况下,您面临AND函数的问题,因为您不能将(1,-1)和(-1,1)都放在负面。 (它们不允许处于线上。)OR函数的问题也是相同的。然而,有了偏差,画出这条直线就很容易。 请注意,即使有偏差,该情况下的XOR函数也无法解决。

6
如果使用sigmoid函数,则引入了非线性。说它是线性函数是错误的,也有些危险,因为sigmoid的非线性对解决几个问题至关重要。另外,sigmoid(0)=0.5,并且不存在x使得sigmoid(x)=0。 - bayer
2
是的,但是对于任何输入为0且没有偏差的情况下,它都是0.5,无论之前的线性函数长什么样子。这就是关键所在。通常情况下不会训练Sigmoid函数,你只需要使用它。线性问题早在Sigmoid函数之前就已经发生了。 - Debilski
我理解你的观点:该层无法学习与其最初输出不同的0值。这是正确且重要的。然而,在我看来,“线性函数参数”并不适用。即使有偏差,该函数仍然是线性的。在这里,线性属性是具有误导性的。(是的,我可能有点吹毛求疵。) - bayer
我认为,带有偏差的变换是仿射变换。(http://en.wikipedia.org/wiki/Affine_transformation#Representation) - Debilski
是的,你说得对。谢谢你指出了那个差异给我。(顺便问一句,既然它是仿射的,为什么我们还称其为线性回归呢?) - bayer
回归模型本身是线性的。它只是在扩充的输入空间上运行,其中每个向量都添加了一个元素“1”作为最后一个分量。如果偏差被固定,这可能会有所不同,但我对此不确定。即使那样,人们可能仍然称其为线性 - Debilski

27

当你使用人工神经网络时,很少了解要学习的系统的内部情况。有些事情没有偏见就无法学习。例如,看一下以下数据:(0, 1),(1, 1),(2, 1),基本上是将任何x映射到1的函数。

如果您只有一个节点(或线性映射),则无法找到解决方案。但是,如果您有一个偏差,它就很简单!

在理想的情况下,偏差还可以将所有点映射到目标点的平均值,并让隐藏神经元对该点的差异进行建模。


25

仅修改神经元的权重只能改变您的传递函数的形状/曲率,而不是它的平衡/零点交叉。

引入偏置神经元可以使您在沿着输入轴水平移动转移函数曲线(左/右)的同时保持形状/曲率不变。 这将允许网络产生与默认值不同的任意输出,因此您可以自定义/移动输入到输出的映射以满足您的特定需求。

有关图形解释,请参见: http://www.heatonresearch.com/wiki/Bias


链接已失效。 - Burak Kaymakci

20
我的硕士论文的几个实验中(例如第59页),我发现偏差可能对第一层很重要,但在末端的完全连接层似乎不起大的作用。
这可能高度依赖于网络架构/数据集。

这听起来完全类似于使用线性回归“手动”建模系统的过程。最简单的模型是Y_bar=mean(Y)。然后,通过包含各种X项来增加复杂性,在没有显著信息增益时停止。 - IRTFM

20

如果你正在处理图像,实际上你可能更喜欢根本不使用偏置。理论上,这样你的网络会更加独立于数据幅度,例如图片是暗的还是明亮和鲜艳的。而且网络将通过研究数据内部的相对性来学习完成它的工作。许多现代神经网络都使用此方法。

对于其他类型的数据,具有偏置可能至关重要。这取决于你正在处理什么类型的数据。如果你的信息是幅度不变的---如果输入[1,0,0.1]应该导致与输入[100,0,10]相同的结果,那么没有偏差可能更好。


你最好使用规范化。有哪些现代网络的例子使用“无偏差”来产生大小不变性? - AwokeKnowing
@AwokeKnowing,我相信通常的ResNet会使用这个,因为它是其“初始化”的一部分,但我不确定他们是否仅出于这个目的这样做,或者可能考虑了模型大小/效率,而且我不确定这个概念是否在任何地方都有发表。但我认为从理论上来说这是完全可以理解的。如果您没有一个不可扩展的偏差,当您扩展值时,所有输出都会相应地扩展。无论您是否意识到这个概念,现代架构的很大一部分至少在其结构的很大一部分中都没有偏差。 - Íhor Mé
不过,这个要带着一点保留地看待,因为我目前不记得当时测试时是否考虑了batchNorm引入自己的偏差,从而抛弃了对偏差的需求。理论上这是一个很好的想法,但请不要盲目相信,一定要进行测试。 - Íhor Mé
这是正确的。批量归一化在现代架构中常用,包含了偏置。请参阅第3.1节 https://arxiv.org/pdf/1502.03167.pdf - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接