正向传播、反向传播推导总结

最近在看《动手学深度学习》这本书,收获很大,在此想总结一下,方便日后回顾。也推荐大家去看看这本书。

一、正向传播:(这里不考虑偏差项b)

输入层到隐藏层中间变量:

z=W^{(1)}x

隐藏层:

h=\phi(z)

输出层:

o=W^{(2)}h

损失项:

L=\ell (o, y)

L_{2}正则化项:

s=\frac{\lambda }{2}(\parallel W^{(1)}\parallel _{F}^{2}+\parallel W^{(2)}\parallel _{F}^{2})

目标函数:

J=L+s

正向传播计算图:

二、反向传播:

首先确定目标,求:

\frac{\partial J}{\partial W^{(1)}}  ,  \frac{\partial J}{\partial W^{(2)}}

先计算最靠近输出层模型参数的梯度:

\begin{aligned} \frac{\partial J}{\partial W^{(2)}}& =prod(\frac{\partial J}{\partial o},\frac{\partial o}{\partial W^{(2)}})+prod(\frac{\partial J}{\partial s},\frac{\partial s}{\partial W^{(2)}}) \\&=\frac{\partial J}{\partial o}h^{T}+\lambda W^{(2)}\\& =prod(\frac{\partial J}{\partial L},\frac{\partial L}{\partial o})h^{T}+\lambda W^{(2)}\\& =\frac{\partial L}{\partial o}h^{T}+\lambda W^{(2)} \end{aligned}

再计算靠近输入层模型参数的梯度:

\begin{aligned} \frac{\partial J}{\partial W^{(1)}}& =prod(\frac{\partial J}{\partial z},\frac{\partial z}{\partial W^{(1)}})+prod(\frac{\partial J}{\partial s},\frac{\partial s}{\partial W^{(1)}})\\& =\frac{\partial J}{\partial z}x^{T}+\lambda W^{(1)}\\& =prod(\frac{\partial J}{\partial h},\frac{\partial h}{\partial z})x^{T}+\lambda W^{(1)}\\& =\frac{\partial J}{\partial h}\odot {\phi }'(z)x^{T}+\lambda W^{(1)}\\& =prod(\frac{\partial J}{\partial o},\frac{\partial o}{\partial h})\odot {\phi }'(z)x^{T}+\lambda W^{(1)}\\& =W^{(2)^{T}}\frac{\partial J}{\partial o}\odot {\phi }'(z)x^{T}+\lambda W^{(1)}\\& =W^{(2)^{T}}prod(\frac{\partial J}{\partial L},\frac{\partial L}{\partial o})\odot {\phi }'(z)x^{T}+\lambda W^{(1)}\\& =W^{(2)^{T}}\frac{\partial L}{\partial o}\odot {\phi }'(z)x^{T}+\lambda W^{(1)} \end{aligned}

 其中:\frac{\partial J}{\partial L}=1,\frac{\partial J}{\partial s}=1,\frac{\partial s}{\partial W^{(1)}}=\lambda W^{(1)},\frac{\partial s}{\partial W^{(2)}}=\lambda W^{(2)}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
神经网络误差反向传播是一种用于训练神经网络的常见方法,其基本原理如下: 1.前向传播:将输入数据通过神经网络进行正向传播,得到输出结果。 2.计算误差:将输出结果与真实标签进行比较,计算误差。 3.反向传播:将误差从输出层向输入层进行反向传播,更新每个神经元的权重和偏置,使得误差逐渐减小。 4.重复训练:重复执行前向传播、误差计算和反向传播,直到误差达到可接受的范围。 具体来说,误差反向传播的过程可以分为以下几个步骤: 1.计算输出层误差:将输出层的输出值与真实标签进行比较,计算输出层的误差。 2.计算隐藏层误差:将输出层误差按照权重进行反向传播,计算隐藏层的误差。 3.更新输出层权重和偏置:根据输出层误差和输出层的激活函数,更新输出层的权重和偏置。 4.更新隐藏层权重和偏置:根据隐藏层误差和隐藏层的激活函数,更新隐藏层的权重和偏置。 5.重复执行以上步骤:重复执行以上步骤,直到误差达到可接受的范围。 下面是一个简单的示例代码,演示了如何使用反向传播算法训练一个简单的神经网络: ```python import numpy as np # 定义激活函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 定义神经网络 class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重和偏置 self.W1 = np.random.randn(self.input_size, self.hidden_size) self.b1 = np.zeros((1, self.hidden_size)) self.W2 = np.random.randn(self.hidden_size, self.output_size) self.b2 = np.zeros((1, self.output_size)) # 前向传播 def forward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.y_hat = sigmoid(self.z2) return self.y_hat # 反向传播 def backward(self, X, y, y_hat): # 计算输出层误差 delta2 = (y_hat - y) * y_hat * (1 - y_hat) # 计算隐藏层误差 delta1 = np.dot(delta2, self.W2.T) * self.a1 * (1 - self.a1) # 更新输出层权重和偏置 dW2 = np.dot(self.a1.T, delta2) db2 = np.sum(delta2, axis=0, keepdims=True) self.W2 -= 0.1 * dW2 self.b2 -= 0.1 * db2 # 更新隐藏层权重和偏置 dW1 = np.dot(X.T, delta1) db1 = np.sum(delta1, axis=0, keepdims=True) self.W1 -= 0.1 * dW1 self.b1 -= 0.1 * db1 # 训练神经网络 def train(self, X, y): y_hat = self.forward(X) self.backward(X, y, y_hat) # 创建数据集 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) # 创建神经网络 nn = NeuralNetwork(2, 3, 1) # 训练神经网络 for i in range(10000): nn.train(X, y) # 测试神经网络 y_hat = nn.forward(X) print(y_hat) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值