偏置(bias)是什么

偏置封面

神经网络里的「偏置」(bias),是神经元公式里那个独立的可学习常数 bb——它和权重 ww 并列,却不乘任何输入,只负责在最后一步把结果整体抬高或压低一点。如果说权重决定"每个输入有多重要",那偏置决定的是"神经元天生有多容易被激活"。

一句话总结:偏置 = 神经元的"默认倾向",一个只做加法、不碰输入的可调常数。

用「评审团主席的默认立场」来理解

接着上一篇「神经元」里那个评审团的例子。主席把各位评审的分数按信任度加权汇总,得到综合分。但主席本人还有个默认立场:他天生偏保守,会先在心里扣掉一分再开始算;或者天生偏宽容,先给垫一分。

这个"先扣/先垫的一分",就是偏置 bb

为什么这个默认立场非有不可?想象一个永远从零开始、没有任何默认倾向的主席——只要今天没人提交任何评审意见(所有输入都是 0),他的综合分就只能是 0,决定永远"原地不动"。可现实里,有些事"没什么证据也该默认通过",有些事"没什么证据也该默认否决"。偏置就是给神经元装上这个"没有输入时也有的倾向"。

拆开看:为什么需要 b、它和权重有何不同

偏置虽小,缺了它神经元会"瘸腿"。三件事讲清它的存在感:

  • 让决策边界不必钉死在原点:偏置本质上在做"平移"。没有 bb,神经元的决策边界(综合分 z=0z=0 那条线)必须穿过坐标原点;有了 bb,整条线可以整体上下左右挪——这一挪,才能把现实中"并不围绕原点分布"的数据正确切开(见下面图 1)。
  • 让"零输入"也能产生非零输出:所有输入 xi=0x_i=0 时,加权求和 wixi\sum w_i x_i 一定是 0;如果没有 bb,神经元输出就被钉死成激活函数在 0 处的值(比如 ReLU 恒为 0)。加个 bb,神经元在没有明显输入时也能"有态度"。
  • 把激活函数推到合适的工作区:像 sigmoid 这类函数,原点附近几乎是一条直线(接近线性),只有被 bb 推一推、挪到曲线弯曲的地方,神经元才能用到"非线性"那部分——而这正是神经网络能学复杂规律的关键。(所谓线性就是直来直去、按比例放大缩小,画出来是一条直线;非线性就是会拐弯,能把简单零件拼成复杂的判断。光靠线性,再多层叠起来也等价于一层,网络就学不动复杂规律了。)

偏置和权重的区别(这是新手最容易混的):

权重 ww偏置 bb
怎么作用和输入相乘和输入无关,直接相加
调的是什么每个输入的"重要程度"神经元整体的"激活门槛"
数量每个输入配一个(nn 个)每个神经元只有 1 个
训练时反向传播更新反向传播一起更新

在 AI 体系里,偏置是神经元"五个零件"之一(输入、权重、偏置、加权和、激活函数),和权重一样是训练时要学的参数。它俩经常被合在一起记作 (W,b)(W, b)——读代码或论文时看到"网络参数",指的就是这一整套权重加偏置。

放在现实任务里就好懂了:比如一个专门"判断邮件是不是垃圾"的神经元,各种输入是邮件里的可疑信号(有没有"中奖"字眼、有没有奇怪链接),权重是每个信号有多可疑,而偏置就是神经元"默认有多怀疑"——偏置高,哪怕没什么可疑信号也容易报警;偏置低,就得攒够证据才肯报警。这个"默认怀疑度",就是 bb 在现实里的样子。

决策边界平移对比

图 1:没有偏置,决策边界被钉死在原点,常常切不开两类点;加了 b,整条线能平移到合适位置正确分类——这是"为什么需要偏置"最直观的理由。

核心公式

把偏置放进神经元公式:

z=w1x1+w2x2++wnxn+b=i=1nwixi+bz = w_1 x_1 + w_2 x_2 + \cdots + w_n x_n + b = \sum_{i=1}^{n} w_i x_i + b
y=f(z)y = f(z)

而神经元的决策边界(输出由"不激活"翻转为"激活"的那条分界)就是让 z=0z=0

i=1nwixi+b=0\sum_{i=1}^{n} w_i x_i + b = 0

逐项解读:

  • xix_i:第 ii 个输入。
  • wiw_i:第 ii 个权重(乘在第 ii 个输入上,调它的"重要程度")。
  • bb偏置——公式里唯一一个不乘输入、直接加上的数,作用是把 zz 整体平移。
  • nn:输入的总个数。
  • i=1n\sum_{i=1}^{n}:求和符号,让 ii 从 1 取到 nn,把所有"权重 × 输入"累加(等号中间那一长串的简写)。
  • zz:加权和(输入汇总后再加偏置的结果),也是后面要喂给激活函数的数。
  • ff:激活函数。
  • yy:神经元最终输出。

偏置怎么参与训练:偏置不是人手填死的,它和权重一样是训练时要"学"出来的。反向传播会算出损失 LL 对偏置的梯度(梯度就是"该往哪个方向调、调多少"的指引)。由链式法则:

Lb=Lzzb=Lz1=Lz\frac{\partial L}{\partial b} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial b} = \frac{\partial L}{\partial z} \cdot 1 = \frac{\partial L}{\partial z}

补几个符号的意思:

  • LL:损失,用一个数衡量这次预测离正确答案有多远。
  • \partial:偏导数符号,读"偏"——表示"只盯着某一个变量看变化率,其他变量当作常数"。
  • Lb\dfrac{\partial L}{\partial b}:损失对偏置的偏导,即"b 微调一点点,损失会变多少"。
  • Lz\dfrac{\partial L}{\partial z}:损失对加权和 zz 的偏导,即"z 微调一点点,损失会变多少"——也是这个公式最后算出来的结果。
  • zb\dfrac{\partial z}{\partial b}:加和对偏置的偏导。因为 z=wixi+bz = \sum w_i x_i + b,b 前面系数是 1,所以它恒等于 1。

因为 z/b=1\partial z / \partial b = 1,偏置的梯度就等于损失对加权和 zz 的梯度。于是 bb 和权重一样,被优化器(SGD、Adam 等)一步步往下调,直到损失尽量小。

算一个小例子

固定输入和权重,只改偏置,看 bb 怎么左右神经元的激活。设 x1=2x_1 = 2x2=3x_2 = 3,权重 w1=0.5w_1 = 0.5w2=1w_2 = -1

先算不加偏置的部分(这是"纯加权求和",和 bb 无关):

wixi=0.5×2+(1)×3=13=2\sum w_i x_i = 0.5 \times 2 + (-1) \times 3 = 1 - 3 = -2

现在配上激活函数 ReLU(小于 0 一律归零),换不同的 bb

  • b=0b = 0(无偏置):z=2+0=2z = -2 + 0 = -2y=max(0,2)=0y = \max(0, -2) = 0,神经元沉默
  • b=1b = 1z=2+1=1z = -2 + 1 = -1y=max(0,1)=0y = \max(0, -1) = 0,还是沉默。
  • b=3b = 3z=2+3=1z = -2 + 3 = 1y=max(0,1)=1y = \max(0, 1) = 1——神经元被激活

自检:三组算出来的 zz 分别是 2,1,1-2, -1, 1,过 ReLU 后是 0,0,10, 0, 1,非负、方向合理(bb 越大 zz 越大、越容易过门槛),没问题。

看明白了吗?输入和权重都没变,只是把偏置从 0 调到 3,这个神经元就从"永远沉默"变成了"会被激活"——这就是偏置"调激活门槛"的直觉:它决定神经元有多容易被点亮。

偏置平移激活门槛

图 2:偏置把激活函数整条左右平移。b 变了,ReLU 的拐点(激活门槛)跟着挪;同一个加权和,门槛挪动后可能从沉默变激活。

PyTorch 里长什么样

在 PyTorch 里,一行 nn.Linear 就把"加权求和 + 偏置"打包好了,而且偏置默认是开着的

python
import torch.nn as nn

# 输入 3 个特征,输出 1 个值;bias=True 是默认值,可不写
layer = nn.Linear(in_features=3, out_features=1, bias=True)

# layer.weight 形状 [1, 3] —— 3 个权重
# layer.bias   形状 [1]    —— 1 个偏置
print(layer.bias)   # 看看初始化的 b

如果想做个"没有偏置"的对照(比如某些共享参数的设计),传 bias=False 即可,此时 layer.biasNone,神经元就退化成纯 z=wixiz = \sum w_i x_i

下面是一个能直接跑的完整示例,重点观察训练一步后偏置和权重是怎么一起被更新的

完整代码

python
import torch
import torch.nn as nn
import torch.nn.functional as F

# 单神经元:Linear 负责 w·x + b,ReLU 是激活函数
class SingleNeuron(nn.Module):
    def __init__(self, in_features):
        super().__init__()
        self.linear = nn.Linear(in_features, 1, bias=True)  # 加权求和 + 偏置

    def forward(self, x):
        z = self.linear(x)        # z = Σ wᵢxᵢ + b
        y = F.relu(z)             # 激活函数 f(z)
        return y

model = SingleNeuron(in_features=3)

# 训练前,看一眼初始的权重和偏置
print("初始偏置 b:", model.linear.bias.item())

# 假数据:1 个样本,3 个特征
x = torch.randn(1, 3)
target = torch.tensor([[1.0]])    # 假装正确输出是 1

# 训练一步
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

y = model(x)                      # 前向传播
loss = criterion(y, target)       # 算损失
loss.backward()                   # 反向传播:算出每个 w 和 b 该往哪调
print("偏置的梯度:", model.linear.bias.grad.item())  # 就是 ∂L/∂z
optimizer.step()                  # 更新 w 和 b

print("训练一步后的偏置 b:", model.linear.bias.item())

跑完你会看到:bias.grad 有值(正是上面推导的 L/z\partial L / \partial z),optimizer.step() 之后 bias.item() 变了——偏置和权重一样,被优化器悄悄更新了一步。这就是偏置在"学习"。

小结

偏置是神经元里那个只做加法、不碰输入的可学习常数 bb。它的全部作用就一个字:——把激活函数、把决策边界整体平移,好让神经元既能在"没有明显输入"时有自己的倾向,也能把数据正确切开。回到开头的评审团:那个先扣或先垫一分的主席,其实就是 bb。它和权重并列为训练时要学的参数,常被合记作 (W,b)(W, b)。下一篇我们会看前向传播,看数据和这一整套 wwbb 怎么从输入层一路算到输出。

参考资料

  1. 动手学深度学习 - 4.1 多层感知机(李沐等) https://zh.d2l.ai/chapter_multilayer-perceptrons/mlp.html
  2. Why We Need Bias in Neural Networks - Towards Data Science https://towardsdatascience.com/why-we-need-bias-in-neural-networks-db8f7e07cb98/
  3. Role of bias in neural networks - GeeksforGeeks https://www.geeksforgeeks.org/machine-learning/what-is-the-role-of-the-bias-in-neural-networks/