误差逆传播算法公式理解及推导

前言:公式理解及推导参考自《机器学习》周志华 P101

BP网络

BP网络一般是指由 误差逆传播(error BackPropagation, BP)算法训练的多层前馈神经网络。

给定训练集 D = { ( x 1 , y 1 ) D=\left\{\left(\boldsymbol{x}_1, \boldsymbol{y}_1\right)\right. D={(x1,y1), ( x 2 , y 2 ) , … , ( x m , y m ) } , x i ∈ R d , y i ∈ R l \left.\left(\boldsymbol{x}_2, \boldsymbol{y}_2\right), \ldots,\left(\boldsymbol{x}_m, \boldsymbol{y}_m\right)\right\}, \boldsymbol{x}_i \in \mathbb{R}^d, \boldsymbol{y}_i \in \mathbb{R}^l (x2,y2),,(xm,ym)},xiRd,yiRl,即输入示例由 d d d 个属性描述,输出 l l l 维实值向量。如下图所示,给出一个拥有 d d d 个输入神经元、 l l l 个输出神经元、 q q q 个隐层神经元的多层前馈网络结构。

对训练例 ( x k , y k ) , k ∈ ( 1 , m ) \left(\boldsymbol{x}_k, \boldsymbol{y}_k\right), k∈(1, m) (xk,yk),k(1,m),假定神经网终的输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , … , y ^ l k ) \hat{\boldsymbol{y}}_k=\left(\hat{y}_1^k, \hat{y}_2^k, \ldots, \hat{y}_l^k\right) y^k=(y^1k,y^2k,,y^lk),即 y ^ j k = f ( β j − θ j ) \hat{y}_j^k=f\left(\beta_j-\theta_j\right) y^jk=f(βjθj)。关于 y ^ j k \hat{y}_j^k y^jk 的表达式来源于 MP 神经元模型,简单来说,当总输入超过阈值则输出一个信号,当总输入低于阈值会输出另一个信号。

网络在 ( x k , y k ) , k ∈ ( 1 , m ) \left(\boldsymbol{x}_k, \boldsymbol{y}_k\right), k∈(1, m) (xk,yk),k(1,m) 上的均方误差为 E k = 1 2 ∑ j = 1 l ( y ^ j k − y j k ) 2 E_k=\frac{1}{2} \sum_{j=1}^l\left(\hat{y}_j^k-y_j^k\right)^2 Ek=21j=1l(y^jkyjk)2,此处 1/2 是为了后面求导方便。

BP网络及算法中变量符号

参数更新式

网络中有 ( d + l + 1 ) q + l (d+l+1) q+l (d+l+1)q+l 个参数需确定:输入层到隐层的 d × q d \times q d×q 个连接权、隐层到输出层的 q × l q \times l q×l 个连接权、 q q q 个隐层神经元的阈值、 l l l 个输出层神 经元的阈值。以隐层到输出层的连接权 w h j w_{hj} whj 为例分析参数更新, w h j w_{hj} whj 参数更新估计式为:
w h j ′ = w h j + Δ v = w h j − η ∂ E k ∂ w h j w_{hj}'=w_{hj}+ \Delta v = w_{hj}-\eta \frac{\partial E_k}{\partial w_{hj}} whj=whj+Δv=whjηwhjEk
其中, η ∈ ( 0 , 1 ) \eta \in (0, 1) η(0,1),成为学习率(learning rate)。
因为每次更新只考虑一个参数,所以 E k E_k Ek 可视为关于 w h j w_{hj} whj 的一元函数。若 ∂ E k ∂ w h j \frac{\partial E_k}{\partial w_{hj}} whjEk 为正值,说明 w h j w_{hj} whj 越大, E k E_k Ek 越大,为使 E k E_k Ek 尽可能小,所以应减去这个正的导数;若 ∂ E k ∂ w h j \frac{\partial E_k}{\partial w_{hj}} whjEk 为负值,说明 w h j w_{hj} whj 越大, E k E_k Ek 越小,为使 E k E_k Ek 尽可能小,所以应减去这个负的导数,增大 w h j w_{hj} whj

计算导数–链式法则

注意到 w h j w_{h j} whj 先影响到第 j j j 个输出层神经元的输入值 β j \beta_j βj,再影响到其输出值 y ^ j k \hat{y}_j^k y^jk,然后影响到 E k E_k Ek,有:
∂ E k ∂ w h j = ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j . \frac{\partial E_k}{\partial w_{h j}}=\frac{\partial E_k}{\partial \hat{y}_j^k} \cdot \frac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial w_{h j}} . whjEk=y^jkEkβjy^jkwhjβj.
根据定义 β j = ∑ h = 1 q w h j b h \beta_j = \sum_{h=1}^q w_{h j} b_h βj=h=1qwhjbh ,有
∂ β j ∂ w h j = b h \frac{\partial \beta_j}{\partial w_{h j}}=b_h whjβj=bh
计算 ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j \frac{\partial \mathrm{E}_{\mathrm{k}}}{\partial \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}} \cdot \frac{\partial \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}}{\partial \beta_{\mathrm{j}}} y^jkEkβjy^jk
= ∂ E k ∂ y ^ j k ⋅ ∂ [ f ( β j − θ j ) ] ∂ β j = ∂ E k ∂ y ^ j k ⋅ f ′ ( β j − θ j ) = ∂ E k ∂ y ^ j k ⋅ f ( β j − θ j ) × [ 1 − f ( β j − θ j ) ] = ∂ E k ∂ y ^ k k ⋅ y ^ j k ( 1 − y ^ j k ) = ∂ [ 1 2 ∑ j = 1 1 ( y ^ j k − y j k ) 2 ] ∂ y ^ j k ⋅ y ^ j k ( 1 − y ^ j k ) = 1 2 × 2 ( y ^ j k − y ^ j k ) × 1 × y ^ j k ( 1 − y ^ j k ) = ( y ^ j k − y ^ j k ) y ^ j k ( 1 − y ^ j k ) =\frac{\partial \mathrm{E}_{\mathrm{k}}}{\partial \hat{\mathbf{y}}_{\mathrm{j}}^{\mathrm{k}}} \cdot \frac{\partial\left[\mathrm{f}\left(\beta_{\mathrm{j}}-\theta_{\mathrm{j}}\right)\right]}{\partial \beta_{\mathrm{j}}}=\frac{\partial \mathrm{E}_{\mathrm{k}}}{\partial \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}} \cdot \mathrm{f}^{\prime}\left(\beta_{\mathrm{j}}-\theta_{\mathrm{j}}\right)=\frac{\partial \mathrm{E}_{\mathrm{k}}}{\partial \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}} \cdot \mathrm{f}\left(\beta_{\mathrm{j}}-\theta_{\mathrm{j}}\right) \times\left[1-\mathrm{f}\left(\beta_{\mathrm{j}}-\theta_{\mathrm{j}}\right)\right] = \frac{\partial \mathrm{E}_{\mathrm{k}}}{\partial \hat{\mathrm{y}}_{\mathrm{k}}^{\mathrm{k}}} \cdot \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\left(1-\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\right) \\ =\frac{\partial\left[\frac{1}{2} \sum_{\mathrm{j}=1}^1\left(\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}-\mathrm{y}_{\mathrm{j}}^{\mathrm{k}}\right)^2\right]}{\partial \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}} \cdot \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\left(1-\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\right)=\frac{1}{2} \times 2\left(\hat{y}_{\mathrm{j}}^{\mathrm{k}}-\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\right) \times 1 \times \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\left(1-\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\right)=\left(\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}-\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\right) \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\left(1-\hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}\right) =y^jkEkβj[f(βjθj)]=y^jkEkf(βjθj)=y^jkEkf(βjθj)×[1f(βjθj)]=y^kkEky^jk(1y^jk)=y^jk[21j=11(y^jkyjk)2]y^jk(1y^jk)=21×2(y^jky^jk)×1×y^jk(1y^jk)=(y^jky^jk)y^jk(1y^jk)

上式计算 f ′ ( β j − θ j ) \mathrm{f}^{\prime}\left(\beta_{\mathrm{j}}-\theta_{\mathrm{j}}\right) f(βjθj) 时,涉及 Sigmoid 函数 f ( x ) f(x) f(x) 的导数: f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f^{\prime}(x)=f(x)(1-f(x)) f(x)=f(x)(1f(x))

再令
g j = − ∂ E k ∂ β j = − ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j g_j=-\frac{\partial \mathrm{E}_{\mathrm{k}}}{\partial \beta_{\mathrm{j}}}=-\frac{\partial \mathrm{E}_{\mathrm{k}}}{\partial \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}} \cdot \frac{\partial \hat{\mathrm{y}}_{\mathrm{j}}^{\mathrm{k}}}{\partial \beta_{\mathrm{j}}} gj=βjEk=y^jkEkβjy^jk
综上,得到关于 w h j w_{hj} whj 的更新公式为:
Δ w h j = − η ∂ E k ∂ w h j = − η ∂ E k ∂ y ^ j k ⋅ ∂ y ^ j k ∂ β j ⋅ ∂ β j ∂ w h j = − η ( − g j ) b h = η g j b h \Delta w_{hj} =-\eta \frac{\partial E_k}{\partial w_{hj}}=-\eta \frac{\partial E_k}{\partial \hat{y}_j^k} \cdot \frac{\partial \hat{y}_j^k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial w_{h j}}= -\eta (-g_j) b_h= \eta g_j b_h Δwhj=ηwhjEk=ηy^jkEkβjy^jkwhjβj=η(gj)bh=ηgjbh
同理可得 θ j \theta_j θj v i h v_{ih} vih γ h \gamma_h γh 的更新公式。需注意的是,在计算过程中,确定链式求导公式是关键。


补充 f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1 的导数:
f ′ ( x ) = e − x ( 1 + e − x ) 2 = 1 + e − x − 1 ( 1 + e − x ) 2 = 1 1 + e − x − 1 ( 1 + e − x ) 2 = f ( x ) − ( f ( x ) ) 2 = f ( x ) [ 1 − f ( x ) ] f'(x)=\frac{e^{-x}}{(1+e^{-x})^2} = \frac{1+e^{-x}-1}{(1+e^{-x})^2}= {\frac{1}{1+e^{-x}} - \frac{1}{(1+e^{-x})^2}}=f(x)-(f(x))^2=f(x)[1-f(x)] f(x)=(1+ex)2ex=(1+ex)21+ex1=1+ex1(1+ex)21=f(x)(f(x))2=f(x)[1f(x)]


参考文章:

梯度下降的参数更新公式是如何确定的? - 老董的回答 - 知乎

神经网络之反向传播算法(BP)公式推导 - jsfantasy - 博客园 (cnblogs.com)

DATAWHALE - 一个热爱学习的社区 (linklearner.com)

### 神经网络中误差逆传播算法的原理与实现 #### 1. 原理概述 误差逆传播算法(Backpropagation Algorithm,简称BP算法)是神经网络训练的核心机制。其基本思想是通过前向传播计算输出层的结果,并根据真实值与预测值之间的误差,反向传播调整网络中的权重和偏置参数,从而使损失函数最小化[^1]。 BP算法可以分为以下几个关键部分: - **前向传播**:输入信号从输入层传递到隐含层,再由隐含层传递到输出层,最终生成预测结果。 - **误差计算**:在输出层计算预测值与真实值之间的误差,通常使用均方误差或交叉熵作为损失函数。 - **反向传播**:将误差从输出层逐层向前传播至隐含层,计算每一层的梯度。 - **参数更新**:根据梯度下降法或其他优化算法,调整权重和偏置以减少误差。 #### 2. 数学推导 BP算法的核心在于利用链式法则计算梯度。假设神经网络的损失函数为 \( L \),第 \( i \) 层的激活值为 \( a_i \),权重为 \( w_i \),偏置为 \( b_i \),则梯度计算公式如下: - 输出层误差项: \[ \delta^{(L)} = \nabla_a L \odot f'(z^{(L)}) \] 其中,\( \nabla_a L \) 是损失函数对激活值的导数,\( f'(z^{(L)}) \) 是激活函数的导数[^2]。 - 隐含层误差项: \[ \delta^{(l)} = ((w^{(l+1)})^T \delta^{(l+1)}) \odot f'(z^{(l)}) \] 这里,\( \delta^{(l+1)} \) 是下一层的误差项,\( (w^{(l+1)})^T \) 是权重矩阵的转置[^3]。 - 权重和偏置的更新规则: \[ w^{(l)} = w^{(l)} - \eta \frac{\partial L}{\partial w^{(l)}} = w^{(l)} - \eta \delta^{(l+1)} (a^{(l)})^T \] \[ b^{(l)} = b^{(l)} - \eta \frac{\partial L}{\partial b^{(l)}} = b^{(l)} - \eta \delta^{(l+1)} \] 其中,\( \eta \) 是学习率。 #### 3. 实现代码示例 以下是一个简单的BP算法实现示例,用于训练一个两层神经网络: ```python import numpy as np # 定义激活函数及其导数 def sigmoid(x): return 1 / (1 + np.exp(-x)) def sigmoid_derivative(x): return x * (1 - x) # 初始化神经网络参数 np.random.seed(0) input_layer_size = 2 hidden_layer_size = 3 output_layer_size = 1 # 随机初始化权重 weights_input_hidden = np.random.randn(input_layer_size, hidden_layer_size) bias_hidden = np.random.randn(hidden_layer_size) weights_hidden_output = np.random.randn(hidden_layer_size, output_layer_size) bias_output = np.random.randn(output_layer_size) # 训练数据 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) # 超参数 learning_rate = 0.1 epochs = 10000 # 训练过程 for epoch in range(epochs): # 前向传播 hidden_layer_input = np.dot(X, weights_input_hidden) + bias_hidden hidden_layer_output = sigmoid(hidden_layer_input) output_layer_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output output_layer_output = sigmoid(output_layer_input) # 计算误差 error = y - output_layer_output # 反向传播 d_output = error * sigmoid_derivative(output_layer_output) error_hidden_layer = d_output.dot(weights_hidden_output.T) d_hidden_layer = error_hidden_layer * sigmoid_derivative(hidden_layer_output) # 更新权重和偏置 weights_hidden_output += hidden_layer_output.T.dot(d_output) * learning_rate bias_output += np.sum(d_output, axis=0, keepdims=True) * learning_rate weights_input_hidden += X.T.dot(d_hidden_layer) * learning_rate bias_hidden += np.sum(d_hidden_layer, axis=0, keepdims=True) * learning_rate # 输出训练结果 print("预测输出:") print(output_layer_output) ``` #### 4. 总结 BP算法通过前向传播和反向传播两个阶段实现了神经网络的高效训练。其核心在于利用链式法则计算梯度,并通过梯度下降法不断优化网络参数。上述代码展示了如何手动实现一个简单的BP算法,适用于初学者理解其工作原理[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值