详解反向传播算法

反向传播算法一般用链式法解释,例如有如下神经网络

这里写图片描述

一 前向传播

对于节点h1来说,h1的净输入neth1如下
这里写图片描述

接着对neth1做一个sigmoid函数得到节点h1的输出
这里写图片描述

类似的,我们能得到节点h2,o1,o2的输出outh2,outo1,outo2.

二 误差

得到结果后整个神经网络的输出误差可以表示为:
这里写图片描述

其中output就是刚刚前向传播算出来的outo1,outo2;target是节点o1,o2的目标值。Etotal是衡量二值误差的。
这个Etatol也可以认为是cost function,不过这里省略了防止overfit的regularization term(这里写图片描述)
展开得到
这里写图片描述

三 后向传播

对输出层的w5

通过梯度下降调整w5,需要求这里写图片描述 由链式法则:
这里写图片描述

如下图所示:
这里写图片描述

以上3个相乘得到梯度这里写图片描述,之后就可以训练了:
这里写图片描述

很多教材,比如stanford的课程,为了计算方便会把中间结果
这里写图片描述

记做这里写图片描述

表示这个节点对最终的误差需要负多少责任。所以有
这里写图片描述

对隐藏层w1

通过梯度下降调整w1,需要求这里写图片描述 ,由链式法则:

这里写图片描述

如图所示:
这里写图片描述

参数w1影响了、neth1,进而影响了outh1,之后影响了Eo1,Eo2。

求解每一部分:
这里写图片描述
其中
这里写图片描述
这里这里写图片描述 之前计算过。

这里写图片描述 的计算也类似,所以得到

这里写图片描述
这里写图片描述 的链式中其他两项如下:
这里写图片描述
这里写图片描述

相乘得到
这里写图片描述

得到梯度后,就可以对w1迭代了
这里写图片描述
在前一个式子里同样可以对这里写图片描述 进行定义
这里写图片描述

所以整梯度可以写成这里写图片描述

所谓的后向传播,其实就是『将来在宣传传播上出了偏差,你们要负责的!』,每一个节点负责的量用\delta表示,那么,隐藏节点需要负责的量,就由输出节点负责的量一层层往前传导。

四 图示

这里写图片描述

这里写图片描述

这里写图片描述

参考:
【1】A Step by Step Backpropagation Example
【2】Unsupervised Feature Learning and Deep Learning Tutorial
【3】https://www.zhihu.com/question/24827633

### 反向传播算法原理及实现过程 #### 1. 定义与背景 反向传播算法是一种用于训练多层前馈神经网络的方法,它通过最小化预测输出与实际目标之间的差异来调整权重。该算法由 Rumelhart 和 Hinton 提出,是当前主流机器学习和深度学习框架中不可或缺的一部分[^3]。 #### 2. 前向传播阶段 在网络接收输入信号时,数据会依次经过每一层节点直到最终得到输出结果。这一过程中涉及到了激活函数的应用: \[ z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)} \] 其中 \(z^{(l)}\) 表示第 l 层的线性组合;\(W^{(l)}\) 是连接矩阵;\(b^{(l)}\) 则代表偏置项;而 \(a^{(l-1)}\) 即为上一层的激活值。接着应用非线性的激活函数 g() 来获取新的激活状态: \[ a^{(l)}=g(z^{(l)}) \][^1]. #### 3. 计算损失函数 当获得模型对于给定样本集产生的估计之后,则可以利用特定形式的成本/损失函数 J(W,b;X,y),衡量这些预估值同真实标签 y 的差距大小。常见的有均方差(MSE) 或交叉熵(Cross Entropy Loss): \[ L(a^{(L)},y)=\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})^2 \quad (MSE)\] 这里 m 指的是批量处理的数据量,\( h_\theta(x^{(i)}) \) 就是指代最后一层输出单元所给出的概率分布情况。\(^{(L)}\)表示最顶层即输出层[^2]. #### 4. 后向传递计算梯度 一旦确定了总成本 C ,就可以开始执行 BP 步骤了——从右至左逐级求解各参数对应的敏感度δ : \[ \delta^{(L)}=\nabla_aC⊙σ'(z^{(L)}) \] 这里的 σ' () 函数指的是对应于隐藏结点使用的激活函数之导数版本;符号 ⊙ 表明按元素相乘操作而非矩阵乘法。随后依据链式法则继续向前推进直至首端位置: \[ \delta^{(l)}=((W^{(l+1)})^\top\delta^{(l+1)})⊙σ'(z^{(l)}) \] 最后基于上述所得 δ^(l)_j 对应关系更新权值 w_ij 和阈限 θ_j : \[ Δw_{ij}=ηδ_j^{(l)}a_i^{(l−1)} \\ Δθ_j=-ηδ_j^{(l)} \] 此处 η 称作学习速率因子用来控制步长幅度. ```python def backpropagation(X, Y, weights, biases, learning_rate): # 初始化变量... for i in range(iterations): # 执行一次完整的正向传播 # ...省略具体细节... # 开始BP流程:先针对末端部分做初步设定 delta_output_layer = np.multiply( -(Y - output), sigmoid_derivative(output)) deltas = [None]*len(weights) deltas[-1] = delta_output_layer # 接着往回走遍历其他层次 for layer_index in reversed(range(len(deltas)-1)): weight_matrix_next_level = weights[layer_index+1] current_delta = deltas[layer_index+1] weighted_sum_of_deltas = np.dot(weight_matrix_next_level.T, current_delta) activation_function_prime = \ relu_derivative if use_relu else sigmoid_derivative deltas[layer_index] = np.multiply( weighted_sum_of_deltas, activation_function_prime(layer_activations[layer_index])) # 更新所有可调参量 for idx, delta in enumerate(reversed(deltas)): gradient_wrt_weights = np.outer(delta, activations[idx]) gradients.append((gradient_wrt_weights * learning_rate).T) updated_weight_matrices.insert(0,weights[idx]-gradients.pop()) new_biases = list(map(lambda d:b-d*learning_rate,deltas,biases)) return updated_weight_matrices,new_biases ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值