神经网络里的「偏置」(bias),是神经元公式里那个独立的可学习常数
一句话总结:偏置 = 神经元的"默认倾向",一个只做加法、不碰输入的可调常数。
用「评审团主席的默认立场」来理解
接着上一篇「神经元」里那个评审团的例子。主席把各位评审的分数按信任度加权汇总,得到综合分。但主席本人还有个默认立场:他天生偏保守,会先在心里扣掉一分再开始算;或者天生偏宽容,先给垫一分。
这个"先扣/先垫的一分",就是偏置
为什么这个默认立场非有不可?想象一个永远从零开始、没有任何默认倾向的主席——只要今天没人提交任何评审意见(所有输入都是 0),他的综合分就只能是 0,决定永远"原地不动"。可现实里,有些事"没什么证据也该默认通过",有些事"没什么证据也该默认否决"。偏置就是给神经元装上这个"没有输入时也有的倾向"。
拆开看:为什么需要 b、它和权重有何不同
偏置虽小,缺了它神经元会"瘸腿"。三件事讲清它的存在感:
- 让决策边界不必钉死在原点:偏置本质上在做"平移"。没有
,神经元的决策边界(综合分 那条线)必须穿过坐标原点;有了 ,整条线可以整体上下左右挪——这一挪,才能把现实中"并不围绕原点分布"的数据正确切开(见下面图 1)。 - 让"零输入"也能产生非零输出:所有输入
时,加权求和 一定是 0;如果没有 ,神经元输出就被钉死成激活函数在 0 处的值(比如 ReLU 恒为 0)。加个 ,神经元在没有明显输入时也能"有态度"。 - 把激活函数推到合适的工作区:像 sigmoid 这类函数,原点附近几乎是一条直线(接近线性),只有被
推一推、挪到曲线弯曲的地方,神经元才能用到"非线性"那部分——而这正是神经网络能学复杂规律的关键。(所谓线性就是直来直去、按比例放大缩小,画出来是一条直线;非线性就是会拐弯,能把简单零件拼成复杂的判断。光靠线性,再多层叠起来也等价于一层,网络就学不动复杂规律了。)
偏置和权重的区别(这是新手最容易混的):
| 权重 | 偏置 | |
|---|---|---|
| 怎么作用 | 和输入相乘 | 和输入无关,直接相加 |
| 调的是什么 | 每个输入的"重要程度" | 神经元整体的"激活门槛" |
| 数量 | 每个输入配一个( | 每个神经元只有 1 个 |
| 训练时 | 反向传播更新 | 反向传播一起更新 |
在 AI 体系里,偏置是神经元"五个零件"之一(输入、权重、偏置、加权和、激活函数),和权重一样是训练时要学的参数。它俩经常被合在一起记作
放在现实任务里就好懂了:比如一个专门"判断邮件是不是垃圾"的神经元,各种输入是邮件里的可疑信号(有没有"中奖"字眼、有没有奇怪链接),权重是每个信号有多可疑,而偏置就是神经元"默认有多怀疑"——偏置高,哪怕没什么可疑信号也容易报警;偏置低,就得攒够证据才肯报警。这个"默认怀疑度",就是
图 1:没有偏置,决策边界被钉死在原点,常常切不开两类点;加了 b,整条线能平移到合适位置正确分类——这是"为什么需要偏置"最直观的理由。
核心公式
把偏置放进神经元公式:
而神经元的决策边界(输出由"不激活"翻转为"激活"的那条分界)就是让
逐项解读:
:第 个输入。 :第 个权重(乘在第 个输入上,调它的"重要程度")。 :偏置——公式里唯一一个不乘输入、直接加上的数,作用是把 整体平移。 :输入的总个数。 :求和符号,让 从 1 取到 ,把所有"权重 × 输入"累加(等号中间那一长串的简写)。 :加权和(输入汇总后再加偏置的结果),也是后面要喂给激活函数的数。 :激活函数。 :神经元最终输出。
偏置怎么参与训练:偏置不是人手填死的,它和权重一样是训练时要"学"出来的。反向传播会算出损失
补几个符号的意思:
:损失,用一个数衡量这次预测离正确答案有多远。 :偏导数符号,读"偏"——表示"只盯着某一个变量看变化率,其他变量当作常数"。 :损失对偏置的偏导,即"b 微调一点点,损失会变多少"。 :损失对加权和 的偏导,即"z 微调一点点,损失会变多少"——也是这个公式最后算出来的结果。 :加和对偏置的偏导。因为 ,b 前面系数是 1,所以它恒等于 1。
因为
算一个小例子
固定输入和权重,只改偏置,看
先算不加偏置的部分(这是"纯加权求和",和
现在配上激活函数 ReLU(小于 0 一律归零),换不同的
(无偏置): , ,神经元沉默。 : , ,还是沉默。 : , ——神经元被激活!
自检:三组算出来的
看明白了吗?输入和权重都没变,只是把偏置从 0 调到 3,这个神经元就从"永远沉默"变成了"会被激活"——这就是偏置"调激活门槛"的直觉:它决定神经元有多容易被点亮。
图 2:偏置把激活函数整条左右平移。b 变了,ReLU 的拐点(激活门槛)跟着挪;同一个加权和,门槛挪动后可能从沉默变激活。
PyTorch 里长什么样
在 PyTorch 里,一行 nn.Linear 就把"加权求和 + 偏置"打包好了,而且偏置默认是开着的:
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.bias 是 None,神经元就退化成纯
下面是一个能直接跑的完整示例,重点观察训练一步后偏置和权重是怎么一起被更新的。
完整代码
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 有值(正是上面推导的 optimizer.step() 之后 bias.item() 变了——偏置和权重一样,被优化器悄悄更新了一步。这就是偏置在"学习"。
小结
偏置是神经元里那个只做加法、不碰输入的可学习常数
参考资料
- 动手学深度学习 - 4.1 多层感知机(李沐等) https://zh.d2l.ai/chapter_multilayer-perceptrons/mlp.html
- Why We Need Bias in Neural Networks - Towards Data Science https://towardsdatascience.com/why-we-need-bias-in-neural-networks-db8f7e07cb98/
- Role of bias in neural networks - GeeksforGeeks https://www.geeksforgeeks.org/machine-learning/what-is-the-role-of-the-bias-in-neural-networks/