在AI算法中,什么是反向传播算法

什么是反向传播算法?

在深度学习中,反向传播算法(Backpropagation)是一种用于训练神经网络的优化算法。它通过计算损失函数对网络参数的梯度,并将其反向传播到网络的每层,从而更新参数以使损失最小化。反向传播算法是深度学习中最重要的算法之一,它使得神经网络能够自动学习和调整自己的权重和参数。

算法原理

反向传播算法利用了链式法则(chain rule)来计算网络参数的梯度。链式法则用于计算复合函数的导数,它将导数的计算分解为一系列局部导数的乘积。

对于一个具有多个参数和层的神经网络,反向传播算法计算损失函数关于每个参数的偏导数,然后使用梯度下降法来更新参数。算法的核心思想是将网络的前向传播过程和反向传播过程结合起来,通过计算每一层的误差梯度,逐层向后传播梯度,从而更新参数。

公式推导

首先我们定义一个多层神经网络的损失函数为$J$,神经网络的输出为$y$,真实标签为$t$。我们使用交叉熵损失函数来度量预测值与真实值之间的差异:

$$J = -\sum_i t_i \log(y_i)$$

其中,$t_i$是真实标签的第$i$个元素,$y_i$是网络输出的第$i$个元素。

下面推导反向传播算法的核心公式,我们以一个具有一个隐藏层的神经网络为例进行推导。

假设网络的输入层与隐藏层之间的权重矩阵为$W_1$,隐藏层与输出层之间的权重矩阵为$W_2$,并且该网络使用sigmoid激活函数。

计算输出层的梯度:

首先计算输出层的误差项$\delta_2$(即输出层的梯度):

$$\delta_2 = y – t$$

然后计算输出层权重矩阵$W_2$的梯度:

$$\frac{\partial J}{\partial W_2} = \delta_2 \cdot a_1^T$$

其中,$a_1$是隐藏层的输出。

计算隐藏层的梯度:

首先计算隐藏层的误差项$\delta_1$(即隐藏层的梯度):

$$\delta_1 = (W_2^T \cdot \delta_2) \cdot f'(z_1)$$

其中,$f'(z_1)$是隐藏层神经元激活函数sigmoid的导数。

然后计算隐藏层权重矩阵$W_1$的梯度:

$$\frac{\partial J}{\partial W_1} = \delta_1 \cdot x^T$$

其中,$x$是网络的输入。

计算步骤

反向传播算法的计算步骤如下:

  1. 初始化网络参数(权重矩阵和偏置向量)。
  2. 前向传播:计算网络的输出。
  3. 计算损失函数的梯度。
  4. 反向传播:计算每一层的梯度。
  5. 更新网络参数:使用梯度下降法更新网络的权重矩阵和偏置向量。
  6. 重复步骤2到5,直到收敛或达到最大迭代次数。

Python代码示例

下面是一个使用Python实现的简单的反向传播算法的示例代码,代码中使用的是虚拟数据集:

import numpy as np

# 定义sigmoid函数及其导数
def sigmoid(x):
 return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x):
 return sigmoid(x) artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls (1 - sigmoid(x))

# 初始化网络参数
input_size = 2
hidden_size = 4
output_size = 1
learning_rate = 0.1

W1 = np.random.randn(hidden_size, input_size)
b1 = np.random.randn(hidden_size, 1)
W2 = np.random.randn(output_size, hidden_size)
b2 = np.random.randn(output_size, 1)

# 定义前向传播函数
def forward_propagation(x):
 z1 = np.dot(W1, x) + b1
 a1 = sigmoid(z1)
 z2 = np.dot(W2, a1) + b2
 y = sigmoid(z2)
 return y, a1

# 定义反向传播函数
def backward_propagation(x, y, a1):
 delta2 = y - t
 delta1 = np.dot(W2.T, delta2) artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls sigmoid_derivative(a1)

 dW2 = np.dot(delta2, a1.T)
 db2 = delta2
 dW1 = np.dot(delta1, x.T)
 db1 = delta1

 return dW1, db1, dW2, db2

# 定义梯度下降函数
def gradient_descent(dW1, db1, dW2, db2):
 global W1, b1, W2, b2
 W1 -= learning_rate artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls dW1
 b1 -= learning_rate artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls db1
 W2 -= learning_rate artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls dW2
 b2 -= learning_rate artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls db2

# 训练神经网络
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
Y = np.array([[0], [1], [1], [0]])
for i in range(100000):
 for j in range(len(X)):
 x = X[j].reshape(-1, 1)
 t = Y[j].reshape(-1, 1)

 y, a1 = forward_propagation(x)
 dW1, db1, dW2, db2 = backward_propagation(x, y, a1)
 gradient_descent(dW1, db1, dW2, db2)

# 预测输出
for j in range(len(X)):
 x = X[j].reshape(-1, 1)
 t = Y[j].reshape(-1, 1)
 y, _ = forward_propagation(x)
 print("Input:", x.flatten(), "Target:", t.flatten(), "Predicted:", y.flatten())

代码细节解释

  1. 初始化网络参数:初始化输入层到隐藏层之间的权重矩阵$W1$和偏置向量$b1$,隐藏层到输出层之间的权重矩阵$W2$和偏置向量$b2$。
  2. 前向传播:计算输入数据通过网络后的输出。首先计算第一层的加权和$z1$,然后通过sigmoid函数$f(z1)$得到隐藏层的输出$a1$。然后,计算第二层的加权和$z2$,再通过sigmoid函数$f(z2)$得到最终的输出$y$。
  3. 反向传播:计算每一层的梯度。首先计算输出层的梯度$delta2$,然后通过传播到隐藏层计算隐藏层的梯度$delta1$。然后,计算损失函数对参数$W1, b1, W2, b2$的偏导数$dW1, db1, dW2, db2$。
  4. 更新网络参数:根据梯度下降法更新参数$W1, b1, W2, b2$。
  5. 训练神经网络:使用虚拟数据集进行训练,对每个输入样本进行前向传播和反向传播,并更新网络参数。
  6. 预测输出:通过训练后的网络进行预测,输出每个输入样本的预测结果。

总之,反向传播算法通过计算损失函数对网络参数的梯度,并将其反向传播到每一层,实现了神经网络的训练。通过反向传播算法,神经网络能够自动学习和调整自己的权重和参数,从而提高模型的准确性。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/823306/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球