什么是误差反向传播算法

什么是误差反向传播算法?

误差反向传播算法(Error Backpropagation Algorithm)是一种用于训练人工神经网络的常用方法。它通过计算每一层的误差梯度并反向传播,以便更新网络中的权重和偏置值。该算法使得神经网络逐渐优化,以使其输出更接近于期望输出。

算法原理

误差反向传播算法的原理基于梯度下降法,其目标是最小化网络输出与期望输出之间的误差。通过计算误差对每个网络参数的偏导数,并根据梯度的反方向更新参数,使得误差逐渐减小。

公式推导

首先,我们定义神经网络的损失函数为均方误差(Mean Squared Error, MSE)。对于一个具有o个输出节点的网络,MSE的计算公式如下:

$$ L = \frac{1}{2} \sum_{i=1}^{o}(target_i – output_i)^2 $$

其中,$target_i$表示期望输出值,$output_i$表示网络的实际输出值。

为了使用误差反向传播算法更新网络参数,我们需要计算损失函数对于网络参数的偏导数。根据链式法则,我们可以将这个偏导数写作链式形式。

设第l层的神经元输出为$a^l$,第l+1层的神经元输入为$z^{l+1}$,第l+1层的神经元激活函数为$f$,则有:

$$ \frac{\partial L}{\partial z^{l+1}} = \frac{\partial L}{\partial a^{l+1}} \cdot \frac{\partial a^{l+1}}{\partial z^{l+1}} = \delta^{l+1} \cdot f'(z^{l+1}) $$

其中,$\delta^{l+1}$是第l+1层的误差信号(即$\frac{\partial L}{\partial a^{l+1}}$),$f'(z^{l+1})$是第l+1层激活函数的导数。

根据误差信号的定义,有:

$$ \delta^{l+1} = \frac{\partial L}{\partial a^{l+1}} = \sum_{i=1}^{o} \frac{\partial L}{\partial output_i} \cdot \frac{\partial output_i}{\partial a^{l+1}} = \sum_{i=1}^{o} (output_i – target_i) \cdot f'(z^{l+1}) $$

根据上述计算结果,我们可以得到输出层的误差信号。

接下来,我们可以继续计算隐藏层的误差信号。

设第l层的误差信号为$\delta^{l}$,第l层的神经元输入为$z^{l}$,则有:

$$ \delta^{l} = \frac{\partial L}{\partial a^{l}} = \frac{\partial L}{\partial z^{l}} \cdot \frac{\partial z^{l}}{\partial a^{l}} = \delta^{l+1} \cdot \frac{\partial z^{l}}{\partial a^{l}} = \delta^{l+1} \cdot W^{l} $$

其中,$W^{l}$是连接第l层和第l+1层的权重矩阵。

计算步骤

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

  1. 初始化网络权重和偏置值。
  2. 对于每一个训练样本,依次进行前向传播计算输出结果。
  3. 根据输出结果和期望输出计算输出层的误差信号$\delta^{o}$。
  4. 从输出层开始,依次计算每一层的误差信号$\delta^{l}$。
  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))

# 定义误差函数(MSE)
def mse_loss(y_true, y_pred):
 return np.mean((y_true - y_pred)**2)

# 定义网络类
class NeuralNetwork:
 def __init__(self, num_inputs, num_hidden, num_outputs):
 self.weights_hidden = np.random.rand(num_hidden, num_inputs)
 self.weights_output = np.random.rand(num_outputs, num_hidden)
 self.bias_hidden = np.random.rand(num_hidden, 1)
 self.bias_output = np.random.rand(num_outputs, 1)

 def forward(self, x):
 self.hidden_layer = sigmoid(np.dot(self.weights_hidden, x) + self.bias_hidden)
 self.output_layer = sigmoid(np.dot(self.weights_output, self.hidden_layer) + self.bias_output)
 return self.output_layer

 def backward(self, x, y_true, learning_rate):
 m = x.shape[1] # 训练样本数量

 # 计算输出层的误差信号
 delta_output = (self.output_layer - y_true) 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(np.dot(self.weights_output, self.hidden_layer) + self.bias_output)

 # 计算隐藏层的误差信号
 delta_hidden = np.dot(self.weights_output.T, delta_output) 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(np.dot(self.weights_hidden, x) + self.bias_hidden)

 # 更新权重和偏置值
 self.weights_output -= 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 np.dot(delta_output, self.hidden_layer.T) / m
 self.bias_output -= 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 np.sum(delta_output, axis=1, keepdims=True) / m
 self.weights_hidden -= 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 np.dot(delta_hidden, x.T) / m
 self.bias_hidden -= 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 np.sum(delta_hidden, axis=1, keepdims=True) / m

 def train(self, x, y, epochs, learning_rate):
 for epoch in range(epochs):
 y_pred = self.forward(x)
 loss = mse_loss(y, y_pred)

 if epoch % 100 == 0:
 print(f"Epoch {epoch}, Loss: {loss}")

 self.backward(x, y, learning_rate)

# 创建一个虚拟的数据集
X = np.array([[0, 0, 1, 1], [0, 1, 0, 1]])
y = np.array([[0, 1, 1, 0]])

# 创建一个具有2个输入节点、4个隐藏节点、1个输出节点的神经网络
network = NeuralNetwork(2, 4, 1)

# 训练神经网络
network.train(X, y, epochs=1000, learning_rate=0.1)

代码细节解释

  1. sigmoid函数用于计算激活函数的值,sigmoid_derivative函数用于计算激活函数的导数。
  2. mse_loss函数用于计算均方误差。
  3. NeuralNetwork类初始化时随机生成权重和偏置值。
  4. forward方法用于进行前向传播计算输出结果。
  5. backward方法根据误差信号计算参数的偏导数,并更新参数。
  6. train方法用于训练网络,包括前向传播、误差计算、反向传播和参数更新。
  7. Xy分别为训练样本和对应的期望输出。

此代码示例通过梯度下降法和误差反向传播算法训练了一个简单的二分类神经网络,并使用虚拟数据集进行了演示。在实际应用中,我们可以根据具体问题的需求进行修改和扩展。

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

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

(0)

大家都在看

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