第七章讲解的是关于反向传播法,主要的知识点包含:
- 导数和梯度基础知识点
- 神经网络中常用的几个激活函数的导数
- 损失函数的梯度计算
- 全连接的梯度计算
- 单个神经元
- 全连接层
- 反向传播法
导数和梯度
导数
函数的输出值的增量和自变量的增量的比值在趋于0的时极限为
,定义为:
导数表征了函数在某个方向上的变化率。
在网络中自变量是网络参数集,对于每个参数的偏导数为:
梯度下降法沿着向量的形式更新梯度值
如果希望求解函数的最大值,需要按着梯度方向更新:
称之为梯度上升法
梯度
向量叫做函数的梯度
- 有所有的梯度组成
- 表征方向
image
重要导数
导数形式
激活函数导数
Sigmoid函数
Sigmoid
函数容易出现梯度弥散现象,表达式为:
求导过程:
这个非常重要:
image
import numpy as np
def sigmoi(x):
return 1 / (1 + np.exp(-x)) # 原函数形式
def derivative(x):
return sigmoid(x) * (1 - sigmoid(x)) # 导数形式
ReLU函数
解决了梯度弥散现象,表达式为
image
def derivative(x):
d = np.array(x, copy=True)
d[x < 0] = 0
d[x >= 0] = 1
return d
LeakyReLU 函数
表达式为
导数为
p一般是较小的值
image
def derivative(x, p):
dx = np.ones_like(x)
dx[x < 0] = p
return dx
Tanh 函数
表达式
导数为
image
def sigmoid(x):
return 1 / (1+np.exp(-x))
def tanh(x):
return 2 * sigmoid(2*x) - 1
def derivative(x):
return 1-tanh(x) ** 2
损失函数梯度
均方误差函数梯度
MSE表达式为
偏导数为
利用链式法则分解成
即
当且仅当时才是1,其他为0,上式可以表达成
交叉熵函数梯度
在计算交叉熵损失函数时,一般将 Softmax 函数与交叉熵函数统一实现
Softmax函数梯度
表达式
image
导数公式为
交叉熵损失函数
表达式为
网络输出logits对变量的导数为
其中为Sotfmax函数的偏导数结果。分
讨论上面的式子,得到
全连接层梯度
单个神经元梯度
采用的Sigmoid为激活函数
image
上图解释
- x是网络的输入,总共有J个节点
- w是权值;
- 其中输入第
个节点到输出
的权值连接记为
。比如j1表示上一层的j号节点到当前层的1号节点
- 通过权值和偏置变成了z
- z通过激活函数变成了
- 由于是单节点,
损失函数为
求偏导数
将分解,并且有
其中
其中可得:
总结:
误差对权值
的偏导数只和输出值
真实
以及当前权值连接的输入
有关系
全连接层梯度
多输出的全连接层具有多个输出节点,同时具有多个真实值标签
MSE函数表示为
image
反向传播法
下图的相关介绍
- 输出层节点数为K,输出为
,
- 倒数第二层的节点数为J,输出为
- 倒数第三层的节点数为I,输出为
image
推导过程:
image
image
每层的偏导公式为
- 倒数第一层
- 倒数第二层
- 倒数第三层
其中为倒数第三层的输入,即倒数第四层的输出。规律:迭代每层的节点
可以求出当前层的偏导数,从而得到权值矩阵W的梯度。