BP(Backpropagation)神经网络是一种多层前馈神经网络,其训练过程使用反向传播算法。它是通过不断调整网络的权重和偏置,使预测值与实际值之间的误差最小化。以下是BP神经网络的主要原理:
1. 网络结构
BP神经网络通常包括以下几层:
- 输入层:接收输入数据。
- 隐藏层:通过加权求和和非线性激活函数对输入进行处理,可以有一个或多个隐藏层。
- 输出层:给出最终的预测输出。
2. 前向传播
在训练过程中,数据通过神经网络的每一层传递:
- 输入数据通过输入层进入网络。
- 在隐藏层,每个神经元接收输入,计算加权和并应用激活函数(如ReLU、sigmoid或tanh)得到输出。
- 最终,经过所有隐藏层的处理,数据到达输出层,生成预测值。
3. 损失函数
损失函数用于衡量网络的预测输出与真实值之间的误差。常见的损失函数有均方误差(MSE)和交叉熵损失。
L=12∑i=1n(yi−y^i)2 L = \frac{1}{2} \sum_{i=1}^n (y_i - \hat{y}_i)^2 L=21i=1∑n(yi−y^i)2
4. 反向传播
BP神经网络的关键部分是反向传播。它通过链式法则(Chain Rule)将输出层的误差逐层传播回隐藏层和输入层,计算各个权重的梯度,以便更新它们。
反向传播的过程分为以下步骤:
- 计算误差:在输出层,计算预测输出和实际输出之间的误差。
- 误差反向传播:从输出层开始,将误差反向传递给每个连接的神经元,通过链式法则计算每个神经元对应的权重的梯度。
- 更新权重:使用梯度下降算法,根据梯度调整每个连接的权重。权重的更新公式如下:
wij=wij−η∂L∂wij w_{ij} = w_{ij} - \eta \frac{\partial L}{\partial w_{ij}} wij=wij−η∂wij∂L
其中,wijw_{ij}wij是连接第iii个神经元和第jjj个神经元的权重,η\etaη是学习率,∂L∂wij\frac{\partial L}{\partial w_{ij}}∂wij∂L是损失函数相对于权重的梯度。
5. 梯度下降
梯度下降算法用于最小化损失函数。常用的优化方法包括:
- 批量梯度下降:对整个训练集计算损失和梯度,并一次性更新权重。
- 小批量梯度下降(Mini-batch Gradient Descent):将训练集分成小批量,计算每个小批量的损失和梯度,进行权重更新。
- 随机梯度下降(SGD):每次仅使用一个样本计算损失和梯度。
6. 迭代训练
BP神经网络的训练过程是一个不断迭代的过程,通过多次前向传播和反向传播来逐步减小损失函数值,使网络的预测能力不断提高。
7. 收敛
当损失函数的值达到某个阈值或者在一定次数的迭代后不再显著减小时,训练过程结束,网络权重被认为已经优化。
总结
BP神经网络通过前向传播产生预测值,并通过反向传播不断调整权重来减少误差。这种网络结构适用于分类、回归等任务。尽管BP神经网络是基础算法,但其原理构成了许多深度学习模型的核心思想。
详细推导
BP神经网络中权重 wijw_{ij}wij 的更新是通过梯度下降算法实现的。要推导 wijw_{ij}wij 的更新公式,我们需要根据损失函数 LLL 对 wijw_{ij}wij 求导,并结合反向传播的步骤来详细说明。
1. 前向传播中的符号定义
我们首先定义一些符号,假设有一个简单的三层神经网络(输入层、一个隐藏层和输出层)来进行推导:
- xix_ixi:输入层的第 iii 个神经元的输出。
- hjh_jhj:隐藏层的第 jjj 个神经元的输出。
- yky_kyk:输出层的第 kkk 个神经元的输出(预测值)。
- wijw_{ij}wij:从输入层的第 iii 个神经元到隐藏层的第 jjj 个神经元的权重。
- vjkv_{jk}vjk:从隐藏层的第 jjj 个神经元到输出层的第 kkk 个神经元的权重。
- y^k\hat{y}_ky^k:输出层的第 kkk 个神经元的真实值(标签)。
- zj=∑iwijxi+bjz_j = \sum_i w_{ij} x_i + b_jzj=∑iwijxi+bj:隐藏层第 jjj 个神经元的输入(加权和),其中 bjb_jbj 是偏置项。
- aj=f(zj)a_j = f(z_j)aj=f(zj):隐藏层第 jjj 个神经元的输出,经过激活函数 fff 处理。
- yk=g(∑jvjkaj+bk)y_k = g\left(\sum_j v_{jk} a_j + b_k\right)yk=g(∑jvjkaj+bk):输出层第 kkk 个神经元的输出,经过激活函数 ggg 处理。
2. 损失函数
假设损失函数为均方误差(MSE):
L=12∑k(y^k−yk)2 L = \frac{1}{2} \sum_k (\hat{y}_k - y_k)^2 L=21k∑(y^k−yk)2
3. 反向传播——目标是更新 wijw_{ij}wij
为了更新权重 wijw_{ij}wij,我们需要计算损失函数 LLL 对 wijw_{ij}wij 的偏导数 ∂L∂wij\frac{\partial L}{\partial w_{ij}}∂wij∂L。反向传播算法利用链式法则逐层求导。
3.1. 从输出层开始求导
首先,我们从输出层开始,根据损失函数 LLL 对输出层 yky_kyk 求导:
∂L∂yk=−(y^k−yk) \frac{\partial L}{\partial y_k} = -( \hat{y}_k - y_k ) ∂yk∂L=−(y^k−yk)
如果输出层使用的是线性激活函数,那么 yk=∑jvjkajy_k = \sum_j v_{jk} a_jyk=∑jvjkaj,则对 vjkv_{jk}vjk 求导:
∂L∂vjk=∂L∂yk⋅∂yk∂vjk=−(y^k−yk)aj \frac{\partial L}{\partial v_{jk}} = \frac{\partial L}{\partial y_k} \cdot \frac{\partial y_k}{\partial v_{jk}} = -( \hat{y}_k - y_k ) a_j ∂vjk∂L=∂yk∂L⋅∂vjk∂yk=−(y^k−yk)aj
3.2. 隐藏层权重 wijw_{ij}wij 的更新
接下来我们需要计算 wijw_{ij}wij 的更新,这需要通过链式法则从损失函数 LLL 反向传播到输入权重 wijw_{ij}wij。
首先,我们对隐藏层第 jjj 个神经元的输出 aja_jaj 求导:
∂L∂aj=∑k∂L∂yk⋅∂yk∂aj=∑k−(y^k−yk)vjk \frac{\partial L}{\partial a_j} = \sum_k \frac{\partial L}{\partial y_k} \cdot \frac{\partial y_k}{\partial a_j} = \sum_k -( \hat{y}_k - y_k ) v_{jk} ∂aj∂L=k∑∂yk∂L⋅∂aj∂yk=k∑−(y^k−yk)vjk
由于 aj=f(zj)a_j = f(z_j)aj=f(zj),其中 fff 是激活函数,因此我们需要对 zjz_jzj 求导:
∂aj∂zj=f′(zj) \frac{\partial a_j}{\partial z_j} = f'(z_j) ∂zj∂aj=f′(zj)
结合起来,得到:
∂L∂zj=∂L∂aj⋅f′(zj)=(∑k−(y^k−yk)vjk)f′(zj) \frac{\partial L}{\partial z_j} = \frac{\partial L}{\partial a_j} \cdot f'(z_j) = \left( \sum_k -( \hat{y}_k - y_k ) v_{jk} \right) f'(z_j) ∂zj∂L=∂aj∂L⋅f′(zj)=(k∑−(y^k−yk)vjk)f′(zj)
接下来,我们对权重 wijw_{ij}wij 求导:
∂zj∂wij=xi \frac{\partial z_j}{\partial w_{ij}} = x_i ∂wij∂zj=xi
因此,损失函数 LLL 对 wijw_{ij}wij 的偏导数为:
∂L∂wij=∂L∂zj⋅∂zj∂wij=(∑k−(y^k−yk)vjk)f′(zj)xi \frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial z_j} \cdot \frac{\partial z_j}{\partial w_{ij}} = \left( \sum_k -( \hat{y}_k - y_k ) v_{jk} \right) f'(z_j) x_i ∂wij∂L=∂zj∂L⋅∂wij∂zj=(k∑−(y^k−yk)vjk)f′(zj)xi
3.3. 权重更新公式
在梯度下降中,使用学习率 η\etaη 对权重进行更新:
wij←wij−η∂L∂wij w_{ij} \leftarrow w_{ij} - \eta \frac{\partial L}{\partial w_{ij}} wij←wij−η∂wij∂L
将偏导数 ∂L∂wij\frac{\partial L}{\partial w_{ij}}∂wij∂L 代入,得到更新公式:
wij←wij+η(∑k(y^k−yk)vjk)f′(zj)xi w_{ij} \leftarrow w_{ij} + \eta \left( \sum_k ( \hat{y}_k - y_k ) v_{jk} \right) f'(z_j) x_i wij←wij+η(k∑(y^k−yk)vjk)f′(zj)xi
4. 总结
权重 wijw_{ij}wij 的更新过程可以分为以下步骤:
- 计算输出层的误差,即预测值与真实值之间的差异。
- 将误差通过输出层的权重 vjkv_{jk}vjk 传播回隐藏层,并计算隐藏层的梯度。
- 根据隐藏层的梯度和输入层的输出 xix_ixi,更新隐藏层到输入层的权重 wijw_{ij}wij。
这个过程通过反复迭代,使得网络中的权重不断调整,以减小预测误差并优化模型的性能。
如果激活函数是 Sigmoid,我们需要在推导过程中用到 Sigmoid 的导数。Sigmoid 函数的表达式为:
σ(z)=11+e−z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1
Sigmoid 函数的导数可以简化为:
σ′(z)=σ(z)⋅(1−σ(z)) \sigma'(z) = \sigma(z) \cdot (1 - \sigma(z)) σ′(z)=σ(z)⋅(1−σ(z))
1. Sigmoid 激活函数的前向传播
假设隐藏层的神经元使用 Sigmoid 激活函数,那么隐藏层第 jjj 个神经元的输出 aja_jaj 可以表示为:
aj=σ(zj)=11+e−zj a_j = \sigma(z_j) = \frac{1}{1 + e^{-z_j}} aj=σ(zj)=1+e−zj1
其中,zj=∑iwijxi+bjz_j = \sum_i w_{ij} x_i + b_jzj=∑iwijxi+bj。
输出层的前向传播公式依然是:
yk=g(∑jvjkaj+bk) y_k = g\left(\sum_j v_{jk} a_j + b_k \right) yk=g(j∑vjkaj+bk)
如果输出层使用的是线性激活函数,输出 yky_kyk 将是线性组合。
2. 损失函数
损失函数仍然可以选择均方误差(MSE):
L=12∑k(y^k−yk)2 L = \frac{1}{2} \sum_k (\hat{y}_k - y_k)^2 L=21k∑(y^k−yk)2
3. 反向传播过程(使用 Sigmoid 激活函数)
为了更新 wijw_{ij}wij,我们依然需要根据损失函数 LLL 对 wijw_{ij}wij 求导数 ∂L∂wij\frac{\partial L}{\partial w_{ij}}∂wij∂L。
3.1. 从输出层开始求导
首先计算损失函数 LLL 对输出层神经元 yky_kyk 的导数:
∂L∂yk=−(y^k−yk) \frac{\partial L}{\partial y_k} = -( \hat{y}_k - y_k ) ∂yk∂L=−(y^k−yk)
然后,根据输出层的加权和 yky_kyk 对隐藏层权重 vjkv_{jk}vjk 的导数(假设输出层的激活函数是线性):
∂L∂vjk=∂L∂yk⋅∂yk∂vjk=−(y^k−yk)aj \frac{\partial L}{\partial v_{jk}} = \frac{\partial L}{\partial y_k} \cdot \frac{\partial y_k}{\partial v_{jk}} = -( \hat{y}_k - y_k ) a_j ∂vjk∂L=∂yk∂L⋅∂vjk∂yk=−(y^k−yk)aj
3.2. 计算隐藏层的误差项
接下来我们需要将误差从输出层反向传播到隐藏层。隐藏层的误差可以通过损失函数对隐藏层输出 aja_jaj 的导数求得:
∂L∂aj=∑k∂L∂yk⋅∂yk∂aj=∑k−(y^k−yk)vjk \frac{\partial L}{\partial a_j} = \sum_k \frac{\partial L}{\partial y_k} \cdot \frac{\partial y_k}{\partial a_j} = \sum_k -( \hat{y}_k - y_k ) v_{jk} ∂aj∂L=k∑∂yk∂L⋅∂aj∂yk=k∑−(y^k−yk)vjk
3.3. 考虑 Sigmoid 的导数
由于隐藏层使用的是 Sigmoid 激活函数 aj=σ(zj)a_j = \sigma(z_j)aj=σ(zj),根据链式法则,我们需要将隐藏层的误差进一步传播到 zjz_jzj,即对 zjz_jzj 求导。Sigmoid 函数的导数为:
σ′(zj)=σ(zj)⋅(1−σ(zj))=aj⋅(1−aj) \sigma'(z_j) = \sigma(z_j) \cdot (1 - \sigma(z_j)) = a_j \cdot (1 - a_j) σ′(zj)=σ(zj)⋅(1−σ(zj))=aj⋅(1−aj)
因此,隐藏层神经元 jjj 的误差项 δj\delta_jδj(用于更新权重 wijw_{ij}wij 的中间量)为:
δj=∂L∂zj=∂L∂aj⋅σ′(zj)=(∑k−(y^k−yk)vjk)aj(1−aj) \delta_j = \frac{\partial L}{\partial z_j} = \frac{\partial L}{\partial a_j} \cdot \sigma'(z_j) = \left( \sum_k -( \hat{y}_k - y_k ) v_{jk} \right) a_j (1 - a_j) δj=∂zj∂L=∂aj∂L⋅σ′(zj)=(k∑−(y^k−yk)vjk)aj(1−aj)
3.4. 权重 wijw_{ij}wij 的更新公式
接下来,对权重 wijw_{ij}wij 求导。zjz_jzj 是输入 xix_ixi 的加权和,因此有:
∂zj∂wij=xi \frac{\partial z_j}{\partial w_{ij}} = x_i ∂wij∂zj=xi
根据链式法则,损失函数 LLL 对权重 wijw_{ij}wij 的导数为:
∂L∂wij=∂L∂zj⋅∂zj∂wij=δj⋅xi \frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial z_j} \cdot \frac{\partial z_j}{\partial w_{ij}} = \delta_j \cdot x_i ∂wij∂L=∂zj∂L⋅∂wij∂zj=δj⋅xi
将 δj\delta_jδj 代入上式,得到:
∂L∂wij=(∑k−(y^k−yk)vjk)aj(1−aj)xi \frac{\partial L}{\partial w_{ij}} = \left( \sum_k -( \hat{y}_k - y_k ) v_{jk} \right) a_j (1 - a_j) x_i ∂wij∂L=(k∑−(y^k−yk)vjk)aj(1−aj)xi
4. 权重更新
在梯度下降中,使用学习率 η\etaη 来更新权重 wijw_{ij}wij:
wij←wij−η∂L∂wij w_{ij} \leftarrow w_{ij} - \eta \frac{\partial L}{\partial w_{ij}} wij←wij−η∂wij∂L
将上面的导数公式代入,最终的更新公式为:
wij←wij+η(∑k(y^k−yk)vjk)aj(1−aj)xi w_{ij} \leftarrow w_{ij} + \eta \left( \sum_k ( \hat{y}_k - y_k ) v_{jk} \right) a_j (1 - a_j) x_i wij←wij+η(k∑(y^k−yk)vjk)aj(1−aj)xi
5. 总结
当隐藏层使用 Sigmoid 激活函数时,反向传播中的权重更新推导步骤如下:
- 计算输出层的误差。
- 通过输出层的权重 vjkv_{jk}vjk,将误差传播到隐藏层。
- 由于隐藏层的激活函数是 Sigmoid,需要将误差乘以 Sigmoid 函数的导数 aj⋅(1−aj)a_j \cdot (1 - a_j)aj⋅(1−aj)。
- 根据隐藏层的输出 aja_jaj 和输入层的输出 xix_ixi,更新权重 wijw_{ij}wij。
Sigmoid 函数的导数特性使得它在反向传播过程中会影响梯度的缩放(容易导致梯度消失问题),因此在深层网络中,常用其他激活函数(如 ReLU)代替 Sigmoid。
2584

被折叠的 条评论
为什么被折叠?



