目录
概述
反向传播算法是深度学习的优化算法,主要应用的是链式求导法则去求得每个层的参数的梯度,从而反向的更新梯度,神经网络的一次迭代包含了一次前向传播和一次反向传播。本文将包含反向传播的推导,依据代码和具体数值来诠释神经网络的一次迭代。
推导
为了图片清晰,部分神经元的连接没有在图片中展示:
loss函数是MSE
MSE损失函数:
当loss函数是MSE,则=
未做非线性变换,假设
是sigmoid函数,故而有:
loss函数是交叉熵
- 二分类交叉熵
- 多分类交叉熵
如果是二分类,f_3是sigmoid函数,同时假设激活函数f_1,f_2是sigmoid函数,有:
多分类的的链式求导表达式与MSE和二分类交叉熵一致,由于多分类假设服从的是多项式分布,二分类假设分布服从二项分布,线性回归的残差假设服从的是正太分布,它们都是指数族分布
神经网络迭代
为方便数值计算,降低计算复杂度,只使用一条样本计算梯度,如果是多条样本,梯度就等于所有样本梯度的加和。损失函数是MSE,是sigmoid函数
前向传播
反向传播
- 计算梯度
依据上面推导的公式有:
- 梯度更新
依据 ,即可更新梯度
- 代码验证梯度计算
import tensorflow as tf
import numpy as np
X = tf.expand_dims(np.array([1., 2., 3.]), axis=0)
# X = tf.reshape(tf.range(1, 7, dtype=tf.double),shape=(2, 3))
y = tf.constant([5], dtype=tf.double)
# 第一层theta
theta_1 = tf.Variable(tf.convert_to_tensor(np.zeros((3, 2)), dtype=tf.double))
print("初始theta_1:\n{}".format(theta_1))
# 第二层theta
theta_2 = tf.Variable(tf.convert_to_tensor(np.arange(3, 5).reshape(2, 1), dtype=tf.double))
print("初始theta_2:\n{}".format(theta_2))
with tf.GradientTape() as tape:
# 第一层前向传播
y_hat = tf.sigmoid(tf.matmul(X, theta_1))
print('第一层前向传播:\n{}'.format(y_hat))
# 第二层前向传播
y_hat = tf.matmul(y_hat, theta_2)
print('第二层前向传播:\n{}'.format(y_hat))
# mse loss
loss = tf.reduce_mean(tf.square(y - y_hat)) / 2
print('MSE:\n{}'.format(loss))
# 求梯度
gradients = tape.gradient(loss, [theta_2, theta_1])
print('gradients:\n{}'.format(gradients))
结果: