神经网络反向传播权重更新疑问:多样本误差如何更新单个权重
嘿,作为刚入门神经网络的新手,你遇到的这个反向传播权重更新问题简直是入门期的核心难点,我来结合你的4-4-1网络和16个样本的情况,一步步给你掰扯清楚~
先明确你的网络对应关系
先把你的网络结构捋明白,避免搞混:
- 输入层:4个神经元,对应每个样本的4维二进制特征,16个样本就是16×4的输入矩阵
- 隐藏层:4个神经元,负责提取中间特征
- 输出层:1个神经元,对应每个样本的1维预测输出,真实值和预测值的误差是16×1的向量
反向传播的本质是用梯度下降让权重朝着误差减小的方向调整,核心是用链式法则计算每个权重对总误差的影响,然后更新权重。下面分输出层和隐藏层的权重来具体说:
第一步:更新输出层到隐藏层的权重(W2,形状4×1)
假设你用的是最常见的均方误差(MSE)损失,激活函数是sigmoid(如果是线性激活,逻辑类似,去掉导数部分就行)。
单个样本的误差传递
对于第i个样本(i从1到16):
- 先算出隐藏层的输出
h_i(4×1向量):h_i = σ(x_i · W1 + b1),其中σ是sigmoid激活函数,x_i是第i个样本的4维输入,b1是隐藏层的偏置(4×1) - 输出层的预测值
y_pred_i:y_pred_i = σ(h_i · W2 + b2),b2是输出层的偏置(1×1) - 单个样本的误差
e_i = y_true_i - y_pred_i(就是你得到的误差向量里的第i个值) - 输出层的误差项
δ2_i:这是误差对输出层输入的导数,sigmoid的导数是σ(z)*(1-σ(z)),而z = h_i·W2 + b2,所以σ(z)=y_pred_i,因此δ2_i = e_i * y_pred_i * (1 - y_pred_i)
批量更新权重(用16个样本的平均梯度)
对于W2中第j个权重(对应隐藏层第j个神经元到输出层的连接),更新公式是:
w2_j = w2_j - α * (sum(h_ij * δ2_i for i in range(16)) / 16)
这里的关键点:
α是学习率,控制权重更新的步长(比如0.1、0.01,新手可以先选小一点的值试试)sum(...) /16是对16个样本的梯度取平均(批量梯度下降),如果用随机梯度下降,就直接用单个样本的h_ij * δ2_i来更新,不用平均- 偏置
b2的更新类似:b2 = b2 - α * (sum(δ2_i for i in range(16)) /16)
第二步:更新输入层到隐藏层的权重(W1,形状4×4)
这一步需要把输出层的误差反向传播到隐藏层,计算隐藏层的误差项:
单个样本的误差反向传播
对于第i个样本:
- 隐藏层的误差项
δ1_i(4×1向量):这是误差对隐藏层输入的导数,公式是δ1_i = (W2 * δ2_i) * h_i * (1 - h_i)W2 * δ2_i是把输出层的误差传递到隐藏层的每个神经元h_i * (1 - h_i)是隐藏层sigmoid激活函数的导数
- 对于W1中第k行第j列的权重(对应输入层第k个神经元到隐藏层第j个神经元的连接),更新公式是:
w1_kj = w1_kj - α * (sum(x_ik * δ1_ij for i in range(16)) / 16)
x_ik是第i个样本的第k个输入特征- 偏置
b1的每个元素更新:b1_j = b1_j - α * (sum(δ1_ij for i in range(16)) /16)
几个新手必注意的细节
- 激活函数导数匹配:如果你用的是ReLU激活,导数就是“大于0时为1,否则为0”,要把上面的导数部分换成对应的计算方式
- 损失函数选择:如果是分类任务(二进制输出),用交叉熵损失会比MSE更高效,这时候输出层的误差项
δ2_i可以直接等于e_i,不用乘激活函数导数 - 手动计算验证:新手可以先拿1-2个样本手动算一遍权重更新,搞清楚每一步的来源,比直接写代码理解得更透彻
内容的提问来源于stack exchange,提问作者bob




