深度学习
一、神经网络基础
1、几个词的包含关系
2、人工神经元
- 人工神经元: 人类神经元中抽象出来的数学模型。
- M-P模型: 基于人工神经元提出下面的模型。
- 人工神经网络: 大量神经元以某种连接方式构成的机器学习模型。
例如: - 感知机(Perceptron): 只有输入和输出层;激活函数为阶跃函数。
- 缺陷: 无法解决异或问题,本质上是线性的,当然无法解决异或问题。
3、多层感知机
- 定义: 在单层神经网络基础上引入一个或多个隐藏层,使神经网络有多个隐藏层。
- 多层感知机的前向传播:
I n p u t : H = σ 1 ( X w 1 ) Input:H=σ_1(Xw_1) Input:H=σ1(Xw1) O u t p u t : O = σ 2 ( H w 2 ) Output:O=σ_2(Hw_2) Output:O=σ2(Hw2)
σ ( ) σ() σ()为激活函数。 - 为什么需要激活函数?
- 隐藏层并非也越多越好
结论: 神经元个数越多,分界面就可以越复杂,在这个集合上的分类能力就越强。依据分类任务的难易程度来调整神经网络模型的复杂程度。分类任务越难,我们设计的神经网络结构就应该越深、越宽。但是需要注意的是对训练集分类精度最高的全连接神经网络模型,在
真实场景下识别性能未必是最好的(过拟合) 。
4、激活函数
-
激活函数的作用:
(1) 让多层感知机成为真正的多层,否则等价于一层
(2) 引入非线性,使网络可以逼近任意非线性函数 (万能逼近定理,ununiversal approximator)。 -
激活函数需要的性质:
(1) 连续并可导(允许少数点上不可导),便于利用数值优化的方法来学习网络参数。
(2) 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
(3) 激活函数的导函数的值域要在合适区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。 -
常见的激活函数:
- (1) Sigmoid函数(S型):
g ( x ) = 1 1 + e − x g(x)=\frac{1}{1+e^{-x}} g(x)=1+e−x1 g ′ ( x ) = g ( x ) ∗ ( 1 − g ( x ) ) g^{'}(x)=g(x)*(1-g(x)) g′(x)=g(x)∗(1−g(x))
特点: 简单,导函数两边存在饱和区(趋近于0),梯度几乎是零,会导致网络训练比较困难,导数中间部分趋近线性,称为线性区。
当输入值大于10或者小于-10时局部梯度都是0;非常不利于网络的梯度流传递的。
- (1) Sigmoid函数(S型):
-
梯度消失是神经网络训练中非常致命的一个问题,其本质是由于链式法则的乘法特性导致的。
值域:(0,1)-
(2) Tanh函数(双曲正切):
t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+e−xex−e−x g ′ ( x ) = 1 − ( g ( x ) ) 2 g^{'}(x)=1-(g(x))^2 g′(x)=1−(g(x))2
特点: 对称,也同样存在饱和区和线性区。与sigmoid类似,局部梯度特性不利于网络梯度流的反向传递.
值域:(-1,1) -
(3) ReLu函数:
R e L u = m a x ( 0 , x ) ReLu=max(0,x) ReLu=max(0,x) g ′ ( x ) = { 1 x>0 u n d e f i n e d x=0 0 x<0 g^{'}(x)= \begin{cases} 1& \text{x>0}\\ undefined& \text{x=0}\\ 0& \text{x<0} \end{cases} g′(x)=⎩⎪⎨⎪⎧1undefined0x>0x=0x<0
-
(4)LeakyRelu函数:
m a x ( 0.1 x , x ) max (0.1x, x) max(0.1x,x)
-
特点: 主要运用在CNN隐藏层中,在0处不可导,可以人为设置为0或1。
总结: 分为两类:前两个为饱和类型激活函数,ReLu为非饱和激活函数。
5、反向传播
-
前向传播: 输入层数据开始从前向后,数据逐步传递至输出层。
-
反向传播: 损失函数开始从后向前,梯度逐步传递到第一层。
-
反向传播作用: 用于权重更新,使网络输出更接近标签。
-
反向传播原理: 微积分中的链式求导法则: y = f ( u ) , u = g ( x ) y=f(u),u=g(x) y=f(u),u=g(x) ∂ y ∂ x = ∂ y ∂ u ∂ u ∂ x \frac{\partial y}{\partial x}=\frac{\partial y}{\partial u}\frac{\partial u}{\partial x} ∂x∂y=∂u∂y∂x∂u
-
传播示意图:
-
具体传播:(这个图很good)
- 梯度下降法:
权值沿梯度负方向更新,使函数值减小。
导数: 函数在指定坐标轴上的变化率。
方向导数: 指定方向上的变化率(多元函数)。
梯度: 一个向量,方向为方向导数取得最大值的方向 - 学习率: 控制更新步长。
6、梯度下降法的改进
https://www.bilibili.com/video/BV1V54y1B7K3?p=5&spm_id_from=pageDriver
- 1、小批量梯度下降法:
- 伪代码:
- Require: 学习率 ϵ \epsilon ϵ
- Require: 初始参数 θ \theta θ
- 初始化速度 ϑ \vartheta ϑ = 0
-
w
h
i
l
e
while
while 停止标准未满足
d
o
do
do:
- 从训练集中采样m(批量大小)个样本 { x ( 1 ) , ⋯ , x ( m ) } \left\{x^{(1)}, \cdots, x^{(m)}\right\} {x(1),⋯,x(m)},对应的目标为 { y ( 1 ) , ⋯ , y ( m ) } \left\{y^{(1)}, \cdots, y^{(m)}\right\} {y(1),⋯,y(m)}
- 计算梯度: g ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) \boldsymbol{g} \leftarrow \frac{1}{m} \nabla_{\boldsymbol{\theta}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \theta\right), \boldsymbol{y}^{(i)}\right) g←m1∇θ∑iL(f(x(i);θ),y(i))
- 更新权值: θ ← θ − ϵ ϑ \theta \leftarrow \theta-\epsilon \vartheta θ←θ−ϵϑ
- 2、动量法:
-
目标: 改进梯度下降算法存在的问题,即减少震荡,加速通往谷低。
-
改进思想: 利用累加历史梯度信息更新梯度,累加过程中震荡方向相互抵消,
平坦方向得到加强。 -
使用动量的小批量梯度下降算法(伪代码):
- Require: 学习率 ϵ \epsilon ϵ ,动量系数 μ \mu μ
- Require: 初始参数 θ \theta θ
- 初始化速度 ϑ \vartheta ϑ = 0
-
w
h
i
l
e
while
while 停止标准未满足
d
o
do
do:
- 从训练集中采样m(批量大小)个样本 { x ( 1 ) , ⋯ , x ( m ) } \left\{x^{(1)}, \cdots, x^{(m)}\right\} {x(1),⋯,x(m)},对应的目标为 { y ( 1 ) , ⋯ , y ( m ) } \left\{y^{(1)}, \cdots, y^{(m)}\right\} {y(1),⋯,y(m)}
- 计算梯度: g ← 1 m ∇ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) \boldsymbol{g} \leftarrow \frac{1}{m} \nabla_{\boldsymbol{\theta}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \theta\right), \boldsymbol{y}^{(i)}\right) g←m1∇θ∑iL(f(x(i);θ),y(i))
- 速度更新: v = μ v + ( 1 − μ ) g v=\mu v+(1-\mu) g v=μv+(1−μ)g
- 更新权值: θ ← θ − ϵ ϑ \theta \leftarrow \theta-\epsilon \vartheta θ←θ−ϵϑ
-
μ
\mu
μ取值范围[0,1),
μ
\mu
μ =0 时等价于梯度下降算法,建议设置:0.9
现象: 损失函数常具有不太好的局部最小值或鞍点(高维空间非常常见)梯度下降算法存在的问题:局部最小处与鞍点处梯度为0,算法无法通过。
动量法的优势: 由于动量的存在,算法可以冲出局部最小点以及鞍点,找到更优的解。
7、损失函数
-
三个函数的区别:
- 损失函数: 衡量模型输出与真是标签的差异, L o s s f ( y , , y ) Loss f(y^,,y) Lossf(y,,y)(描述的是单样本)。
- 代价函数: C o s t = 1 N ∑ i N f ( y i , , y i ) Cost=\frac{1}{N}\sum_i^Nf(y_i^,,y_i) Cost=N1∑iNf(yi,,yi) (描述的是总体) 。
- 目标函数: O b j = C o s t + R e g u l a r i z a t i o n T e r m Obj=Cost+Regularization Term Obj=Cost+RegularizationTerm (加上了正则项,防止过拟合)。
-
常见的损失函数:
- MSE(均方误差): M S E = ∑ i N ( y i , − y i p ) 2 n MSE=\frac{\sum_i^N(y_i^,-y_i^p)^2}{n} MSE=n∑iN(yi,−yip)2,常用在回归任务中。
- CE(交叉熵):
H
(
p
,
q
)
=
−
∑
i
=
1
n
p
(
x
i
)
l
o
g
q
(
x
i
)
H(p,q)=-\sum_{i=1}^np(x_i)logq(x_i)
H(p,q)=−∑i=1np(xi)logq(xi),源自信息论,用于衡量两个分布的差异,常用在分类任务中。
p p p是真实分布, q q q是模型。
-
相关概念:
- 相对熵(又叫K-L散度)
D
k
l
(
P
∣
∣
Q
)
D_{kl}(P||Q)
Dkl(P∣∣Q)、交叉熵
H
(
p
,
q
)
H(p,q)
H(p,q)、信息熵
H
(
x
)
H(x)
H(x)
D K L ( P ∥ Q ) = E x ∼ p [ log P ( x ) Q ( x ) ] = E x ∼ p [ log P ( x ) − log Q ( x ) ] = ∑ i = 1 N P ( x i ) ( log P ( x i ) − log Q ( x i ) ) \begin{aligned} D_{K L}(P \| Q)=E_{x \sim p}\left[\log \frac{P(x)}{Q(x)}\right] &=E_{x \sim p}[\log P(x)-\log Q(x)] &=\sum_{i=1}^{N} \mathrm{P}\left(\mathrm{x}_{i}\right)\left(\log P\left(\mathrm{x}_{i}\right)-\log \mathrm{Q}\left(\mathrm{x}_{i}\right)\right) \end{aligned} DKL(P∥Q)=Ex∼p[logQ(x)P(x)]=Ex∼p[logP(x)−logQ(x)]=i=1∑NP(xi)(logP(xi)−logQ(xi))
H ( p , q ) = − ∑ i = 1 n p ( x i ) l o g q ( x i ) H(p,q)=-\sum_{i=1}^np(x_i)logq(x_i) H(p,q)=−i=1∑np(xi)logq(xi)
H ( x ) = E x ∼ p [ I ( x ) ] = − E [ log P ( x ) ] = − ∑ i = 1 N p i log ( p i ) H(\mathrm{x})=E_{x \sim p}[I(x)]=-E[\log P(x)]=-\sum_{i=1}^{N} p_{i} \log \left(p_{i}\right) H(x)=Ex∼p[I(x)]=−E[logP(x)]=−i=1∑Npilog(pi)
三个之间关系: 交叉熵=信息熵+相对熵,(因为信息熵一般算出来等于0,所以可以用交叉熵代替K-L散度)即:
H ( p , q ) = H ( p ) + D k l ( P ∣ ∣ Q ) H(p,q)=H(p)+D_{kl}(P||Q) H(p,q)=H(p)+Dkl(P∣∣Q)
因此优化交叉熵等价于优化相对熵。
- 相对熵(又叫K-L散度)
D
k
l
(
P
∣
∣
Q
)
D_{kl}(P||Q)
Dkl(P∣∣Q)、交叉熵
H
(
p
,
q
)
H(p,q)
H(p,q)、信息熵
H
(
x
)
H(x)
H(x)
-
注意点:
- 交叉熵:衡量两个概率分布的差异
- 概率有两个性质:
1 . 概率值是非负的
2 . 概率之和等于1
-
交叉熵的好伙伴——Softmax函数: 将数据变换到符合概率分布的形式。
y i = S ( z ) i = e z i ∑ j = 1 C e z j , i = 1 , … , C y_{i}=S(\boldsymbol{z})_{i}=\frac{e^{z_{i}}}{\sum_{j=1}^{C} e^{z_{j}}}, i=1, \ldots, C yi=S(z)i=∑j=1Cezjezi,i=1,…,C
-
没有一个适合所有任务的损失函数,损失函数设计会涉及算法类型、求导是否容易、数据中异常值的分布等问题。
更多损失函数可到PyTorch网站:https://pytorch.org/docs/stable/nn.html#loss-functions
函数解读: https://zhuanlan.zhihu.com/p/61379965
8、权值初始化
- 定义: 训练前对权值参数赋值,良好的权值初始化有利于模型训练。
- 注意点: 全部初始化为零(错误做法,会使神经网络退化)(权重也不能太大,容易进入激活函数的饱和区)。
- 初始化方法:
- 随机初始化方法: 高斯分布随机初始化,从高斯分布中随机采样,对权值进行赋值,比如
N
(
0
,
0.01
)
N~(0,0.01)
N (0,0.01)。
- 自适应标准差: Xavier初始化、Kaiming初始化(MSRA)。
- 随机初始化方法: 高斯分布随机初始化,从高斯分布中随机采样,对权值进行赋值,比如
N
(
0
,
0.01
)
N~(0,0.01)
N (0,0.01)。
9、正则化方法
-
Regularization: 减小方差的策略,通俗理解为减轻过拟合的策略。直观理解视频
-
误差=偏差+方差+噪声
- 偏差: 度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
- 方差: 度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
- 噪声: 则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界。
-
过拟合: 方差过大,在训练集表现良好,在测试集表现糟糕。
-
正则化: L1正则 ∣ w i ∣ |w_i| ∣wi∣、L2正则(也叫权值衰减) w i 2 w_i^{2} wi2:
- 目标函数(加了L2正则): O b j = L o s s + λ 2 ∗ ∑ i N w i 2 Obj=Loss+\frac{\lambda}{2} * \sum_{i}^{N} w_{i}^{2} Obj=Loss+2λ∗∑iNwi2
- 无正则项: w i + 1 = w i − ∂ O b j ∂ w i = w i − ∂ L o s s ∂ w i w_{i+1}=w_{i}-\frac{\partial O b j}{\partial w_{i}}=w_{i}-\frac{\partial L o s s}{\partial w_{i}} wi+1=wi−∂wi∂Obj=wi−∂wi∂Loss
- 有正则项:
λ
∈
(
0
,
1
)
\lambda∈(0,1)
λ∈(0,1)
w i + 1 = w i − ∂ O b j ∂ w i = w i − ( ∂ L o s s ∂ w i + λ ⋆ w i . ) = w i ( 1 − λ ) − ∂ L i ∂ w i w_{i+1}=w_{i}-\frac{\partial O b j}{\partial w_{i}}=w_{i}-(\frac{\partial L o s s}{\partial w_{i}}+\lambda^{\star} w_{i} .)=w_{i}(1-\lambda)-\frac{\partial L_{i}}{\partial w_{i}} wi+1=wi−∂wi∂Obj=wi−(∂wi∂Loss+λ⋆wi.)=wi(1−λ)−∂wi∂Li - 效果对比:
- 另一种正则化方法:
- Dropout:随机失活
- 优点: 避免过度依赖某个神经元,实现减轻过拟合
- 随机: dropout probability (eg:p=0.5)
- 失活: weight = 0
- 注意事项: 训练和测试两个阶段的数据尺度变化测试时,神经元输出值需要乘以p。如图:
- 其他正则化方法:
回顾
二、卷积神经网络
1、卷积网络发展史
卷积神经网络(convolutional neural networks,CNN): CNN是针对图像领域任务提出的神经网络, 经历数代人的发展, 在2012年之后大部分图像任务被CNN统治,例如图像分类,图像分割(图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程),目标检测(也叫目标提取,是一种基于目标几何和统计特征的图像分割),图像检索(文本+图像)等。
- 图像分割
- 目标检测
- 结构进化史:
2、卷积层
- 图像识别特点:
- 特征具有局部性: 老虎重要特征“王字”仅出现在头部区域。
- 特征可能出现在任何位置
- 下采样图像,不会改变图像目标
- 如图:
- CNN由图像识别得到的启发:
- (1) 特征具有局部性:卷积核每次仅连接
K
∗
K
K*K
K∗K区域,
K
∗
K
K*K
K∗K是卷积核尺寸:
- (1) 特征具有局部性:卷积核每次仅连接
K
∗
K
K*K
K∗K区域,
K
∗
K
K*K
K∗K是卷积核尺寸:
- (2) 特征可能出现在任何位置:卷积核参数重复使用(参数共享),在图像上滑动:
卷积核: 具可学习参数的算子,用于对输入图像进行特征提取,输出通常称为特征图(feature maps):
- 卷积层操作:
- Padding(填充): 在输入图像的周围添加额外的行/列。
- 作用:
- 使卷积后图像分辨率不变, 方便计算特征图尺寸的变化
- 弥补边界信息“ 丢失”
- Strike(步幅): 卷积核滑动的⾏数和列数称为步幅,控制输出特征图的大小,会被缩小1/s倍。
- 如何计算经过Padding和Strike后的输出图片大小?
F o = ∣ F in − k + 2 p s ] + 1 \left.F_{o}=\mid \frac{F_{\text {in }}-k+2 p}{s}\right]+1 Fo=∣sFin −k+2p]+1
F o : 输 出 大 小 F_o:输出大小 Fo:输出大小
F i n : 输 入 大 小 F_in:输入大小 Fin:输入大小
k : F i l t e r 的 大 小 k:Filter的大小 k:Filter的大小
p : P a d d i n g 大 小 p:Padding大小 p:Padding大小
s : S t r i k e 大 小 s:Strike大小 s:Strike大小 - 多通道卷积: RGB图像是
3
∗
h
∗
w
3*h*w
3∗h∗w的三维的数据,第一个维度3,表示channel,通道数。
一个卷积核是3-D张量,第一个维与输入通道有关
注: 卷积核尺寸通常指高、宽
- Padding(填充): 在输入图像的周围添加额外的行/列。
3、池化操作
- 启发于图像识别第三个特点: 下采样图像,不会改变图像目标:降低计算量,减少特征冗余。
- 池化: 一个像素表示一块区域的像素值, 降低图像分辨率。
- 方法:
- Max pooling: 取最大值
- Average Pooling: 取平均值
- 输出尺寸计算与卷积操作类似
- 注意: 池化层无可学习参数
对输入加入影响噪声变化,池化后影响减小:
- 减少冗余
- 降低图像分辨率,从而减少参数量
4、Lenet-5及CNN结构
-
网络结构:
- C1层: 卷积核 K 1 = ( 6 , 1 , 5 , 5 ) , p = 1 , s = 1 , o u t p u t = ( 6 , 28 , 28 ) K1=(6, 1, 5, 5), p=1, s=1,output=(6, 28, 28) K1=(6,1,5,5),p=1,s=1,output=(6,28,28)
- S2层: 最大池化层, 池化窗口 = ( 2 , 2 ) , s = 2 , o u t p u t = ( 6 , 14 , 14 ) =(2,2),s=2,output=(6, 14, 14) =(2,2),s=2,output=(6,14,14)
- C3层: 卷积核 K 3 = ( 16 , 6 , 5 , 5 ) , p = 1 , s = 1 , o u t p u t = ( 16 , 10 , 10 ) K3=(16, 6, 5, 5), p=1, s=1,output=(16, 10, 10) K3=(16,6,5,5),p=1,s=1,output=(16,10,10)
- S4层: 最大池化层, 池化窗口 = ( 2 , 2 ) , s = 2 , o u t p u t = ( 16 , 5 , 5 ) =(2,2),s=2,output=(16, 5, 5) =(2,2),s=2,output=(16,5,5)
- FC层: 3个FC层输出分类
-
注意: 前四层相当于是feature提取,FC层是根据特征进行分类层。
- 特征提取器: C1、S2、C3、S4
- 分类器: 3个FC层
三、循环神经网络
1、序列数据
- 定义: 序列数据是常见的数据类型, 前后数据通常具有关联性。
例如句子 “Cats average 15 hours of sleep a day ” - 其他例子: 语音识别、音乐生成、文本分析、DNA序列分析、机器翻译、视频识别、实体识别等等。
2、语言模型
- 语音模型是自然语言处理(NLP)重要技术,NLP中常把文本看作离散时间序列,一段长度为 T T T 的文本的词依次为 w 1 , w 2 , . . . , w T w_1,w_2,...,w_T w1,w2,...,wT。其中 w t ( 1 ≤ t ≤ T ) w_t(1≤t≤T) wt(1≤t≤T)是时间步(Time Step) t t t 的输出标签。
- 语言模型会计算序列概率
P
(
w
1
,
w
2
,
…
,
w
T
)
=
∏
t
=
1
T
P
(
w
t
∣
w
1
,
…
,
w
t
−
1
)
P\left(w_{1}, w_{2}, \ldots, w_{T}\right)=\prod_{t=1}^{T} P\left(w_{t} \mid w_{1}, \ldots, w_{t-1}\right)
P(w1,w2,…,wT)=t=1∏TP(wt∣w1,…,wt−1)
例如:
P ( 我 , 在 , 听 , 课 ) = P ( 我 ) ∗ P ( 在 | 我 ) ∗ P ( 听 | 我 , 在 ) ∗ P ( 课 | 我 , 在 , 听 ) P( 我, 在, 听, 课)=P(我) * P(在|我)*P(听| 我,在)*P( 课|我,在,听) P(我,在,听,课)=P(我)∗P(在|我)∗P(听|我,在)∗P(课|我,在,听) - 统计语料库(Corpus) 中的词频, 得到以上概率, 最终得到P ( 我, 在, 听, 课)
- 缺点: 时间步t 的词需要考虑t - 1 步的词, 其计算量随t 呈指数增长(由此引出RNN)
3、RNN-循环神经网络(Recurrent neural networks)
-
RNN 是针对序列数据而生的神经网络结构, 核心在于循环使用网络层参数, 避免时间步增大带来的参数激增, 并引入隐藏状态(Hidden State) 用于记录历史信息, 有效的处理数据的前后关联性。
-
隐藏状态(Hidden State) 用于记录历史信息, 有效处理数据的前后关联性激活函数采用Tanh, 将输出值域限制在 [ − 1 , 1 ] [-1,1] [−1,1], 防止数值呈指数级变化。
-
RNN循环结构如下图:
-
与多层感知机的区别:
- 多层感知机:
H = ϕ ( X W x h + b h ) O = H W h q + b q \begin{aligned} \boldsymbol{H} &=\phi\left(\boldsymbol{X} \boldsymbol{W}_{x h}+\boldsymbol{b}_{h}\right) \\ \boldsymbol{O} &=\boldsymbol{H} \boldsymbol{W}_{h q}+\boldsymbol{b}_{q} \end{aligned} HO=ϕ(XWxh+bh)=HWhq+bq - RNN:
H t = ϕ ‾ ( X t W x h + H t − 1 W h h ( + b h ) O t = H t W h q + b q \begin{array}{l} \boldsymbol{H}_{t}=\underline{\phi}\left(\boldsymbol{X}_{t} \boldsymbol{W}_{x h}+\boldsymbol{H}_{t-1} \boldsymbol{W}_{h h}\left(+\boldsymbol{b}_{h}\right)\right.\\ \boldsymbol{O}_{t}=\boldsymbol{H}_{t} \boldsymbol{W}_{h q}+\boldsymbol{b}_{q} \end{array} Ht=ϕ(XtWxh+Ht−1Whh(+bh)Ot=HtWhq+bq
考虑了历史信息 H t − 1 W h h H_{t-1}W_{hh} Ht−1Whh
- 多层感知机:
-
RNN特性:
- 循环神经网络的隐藏状态可以捕捉截至当前时间步的序列的历史信息
- 循环神经网络模型参数的数量不随时间步的增加而增长
-
应用例子:
-
RNN的参数如何更新?
-
RNN的通过(穿越)时间反向传播(backpropagation through time)
- 基本原理还是梯度下降,与之前的区别是,多层感知机的梯度下降只有一条回路,而RNN的梯度下降存在多条回路,只要考虑全面所有回路即可,如图:
- 基本原理还是梯度下降,与之前的区别是,多层感知机的梯度下降只有一条回路,而RNN的梯度下降存在多条回路,只要考虑全面所有回路即可,如图:
-
公式总结如下:
∂ L ∂ W q h = ∑ t = 1 T prod ( ∂ L ∂ o t , ∂ o t ∂ W q h ) = ∑ t = 1 T ∂ L ∂ o t h t ⊤ ∂ L ∂ h T = prod ( ∂ L ∂ o T , ∂ o T ∂ h T ) = W q h ⊤ ∂ L ∂ o T ∂ L ∂ h t = prod ( ∂ L ∂ h t + 1 , ∂ h t + 1 ∂ h t ) + prod ( ∂ L ∂ o t , ∂ o t ∂ h t ) = W h h ⊤ ∂ L ∂ h t + 1 + W q h ⊤ ∂ L ∂ o t 归 纳 得 下 式 : ∂ L ∂ h t = ∑ i = t T ( W h h ⊤ ) T − i W q h ⊤ ∂ L ∂ o T + t − i ∂ L ∂ W h x = ∑ t = 1 T prod ( ∂ L ∂ h t , ∂ h t ∂ W h x ) = ∑ t = 1 T ( ∂ L ∂ h t ) x t ⊤ ∂ L ∂ W h h = ∑ t = 1 T prod ( ∂ L ∂ h t , ∂ h t ∂ W h h ) = ∑ t = 1 T ∂ L ∂ h t h t − 1 ⊤ \begin{array}{l} \frac{\partial L}{\partial \boldsymbol{W}_{q h}}=\sum_{t=1}^{T} \operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{o}_{t}}, \frac{\partial \boldsymbol{o}_{t}}{\partial \boldsymbol{W}_{q h}}\right)=\sum_{t=1}^{T} \frac{\partial L}{\partial \boldsymbol{o}_{t}} \boldsymbol{h}_{t}^{\top}\\ \frac{\partial L}{\partial \boldsymbol{h}_{T}}=\operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{o}_{T}}, \frac{\partial \boldsymbol{o}_{T}}{\partial \boldsymbol{h}_{T}}\right)=\boldsymbol{W}_{q h}^{\top} \frac{\partial L}{\partial \boldsymbol{o}_{T}}\\ \frac{\partial L}{\partial \boldsymbol{h}_{t}}=\operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_{t+1}}, \frac{\partial \boldsymbol{h}_{t+1}}{\partial \boldsymbol{h}_{t}}\right)+\operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{o}_{t}}, \frac{\partial \boldsymbol{o}_{t}}{\partial \boldsymbol{h}_{t}}\right) =\boldsymbol{W}_{h h}^{\top} \frac{\partial L}{\partial \boldsymbol{h}_{t+1}}+\boldsymbol{W}_{q h}^{\top} \frac{\partial L}{\partial \boldsymbol{o}_{t}}\\ 归纳得下式:\\ \frac{\partial L}{\partial \boldsymbol{h}_{t}}=\sum_{i=t}^{T}\left(\boldsymbol{W}_{h h}^{\top}\right)^{T-i} \boldsymbol{W}_{q h}^{\top} \frac{\partial L}{\partial \boldsymbol{o}_{T+t-i}}\\ \frac{\partial L}{\partial \boldsymbol{W}_{h x}} =\sum_{t=1}^{T} \operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_{t}}, \frac{\partial \boldsymbol{h}_{t}}{\partial \boldsymbol{W}_{h x}}\right)=\sum_{t=1}^{T}\left(\frac{\partial L}{\partial \boldsymbol{h}_{t}}\right) \boldsymbol{x}_{t}^{\top}\\ \frac{\partial L}{\partial \boldsymbol{W}_{h h}} =\sum_{t=1}^{T} \operatorname{prod}\left(\frac{\partial L}{\partial \boldsymbol{h}_{t}}, \frac{\partial \boldsymbol{h}_{t}}{\partial \boldsymbol{W}_{h h}}\right)=\sum_{t=1}^{T} \frac{\partial L}{\partial \boldsymbol{h}_{t}} \boldsymbol{h}_{t-1}^{\top} \end{array} ∂Wqh∂L=∑t=1Tprod(∂ot∂L,∂Wqh∂ot)=∑t=1T∂ot∂Lht⊤∂hT∂L=prod(∂oT∂L,∂hT∂oT)=Wqh⊤∂oT∂L∂ht∂L=prod(∂ht+1∂L,∂ht∂ht+1)+prod(∂ot∂L,∂ht∂ot)=Whh⊤∂ht+1∂L+Wqh⊤∂ot∂L归纳得下式:∂ht∂L=∑i=tT(Whh⊤)T−iWqh⊤∂oT+t−i∂L∂Whx∂L=∑t=1Tprod(∂ht∂L,∂Whx∂ht)=∑t=1T(∂ht∂L)xt⊤∂Whh∂L=∑t=1Tprod(∂ht∂L,∂Whh∂ht)=∑t=1T∂ht∂Lht−1⊤
p r o d 代 表 向 量 乘 积 prod代表向量乘积 prod代表向量乘积 -
注意: 由上面可知,计算梯度时存在指数,梯度随时间t呈指数变化, 易引发
梯度消失或梯度爆炸。(由此引出门控单元)
4、门控循环单元(Gated recurrent unit)
- 引入门的循环网络: 缓解RNN 梯度消失带来的问题(梯度爆炸可以由阈值解决), 引入门概念, 来控制信息流动, 使模型更好的记住长远时期的信息, 并缓解梯度消失。
- 重置门: 哪些信息需要遗忘
- 更新门: 哪些信息需要注意
- 激活函数为: Sigmoid, 值域为(0,1),0表示遗忘,1表示保留
R t = σ ( X t W x r + H t − 1 W h r + b r ) , Z t = σ ( X t W x z + H t − 1 W h z + b z ) \begin{array}{l} \boldsymbol{R}_{t}=\sigma\left(\boldsymbol{X}_{t} \boldsymbol{W}_{{xr}}+\boldsymbol{H}_{t-1} \boldsymbol{W}_{{h r}}+\boldsymbol{b}_{r}\right), \\ \boldsymbol{Z}_{t}={\sigma}\left(\boldsymbol{X}_{t} \boldsymbol{W}_{xz}+\boldsymbol{H}_{t-1} \boldsymbol{W}_{{h z}}+\boldsymbol{b}_{z}\right) \end{array} Rt=σ(XtWxr+Ht−1Whr+br),Zt=σ(XtWxz+Ht−1Whz+bz)
- 候选隐藏状态: 输入与上一时间步隐藏状态共同计算得到候选隐藏状态, 用于隐藏状态计算。通过重置门, 对上一时间步隐藏状态进行选择性遗忘, 对历史信息更好的选择。
GRU : H ~ t = tanh ( X i W x h + ( R t ∙ H t − 1 ) W h h + b h ) RNN: H t = ϕ ( X t W x h + H t − 1 W h h + b h ) \begin{array}{l} \text { GRU : } \\ \tilde{H}_{t}=\tanh \left(\boldsymbol{X}_{i} \boldsymbol{W}_{x h}+\left(\boldsymbol{R}_{t} \bullet \boldsymbol{H}_{t-1}\right) \boldsymbol{W}_{h h}+\boldsymbol{b}_{h}\right)\\\\ \text { RNN: } \\ \boldsymbol{H}_{t}=\phi\left(\boldsymbol{X}_{t} \boldsymbol{W}_{x h}+{\boldsymbol{H}}_{t-1} \boldsymbol{W}_{h h}+\boldsymbol{b}_{h}\right) \end{array} GRU : H~t=tanh(XiWxh+(Rt∙Ht−1)Whh+bh) RNN: Ht=ϕ(XtWxh+Ht−1Whh+bh) - 隐藏状态: 隐藏状态由候选隐藏状态及上一时间步隐藏状态组合得来,如图:
H t = Z t ⊙ H t − 1 + ( 1 − Z t ) ⊙ H ~ t \boldsymbol{H}_{t}=\boldsymbol{Z}_{t} \odot \boldsymbol{H}_{t-1}+\left(1-\boldsymbol{Z}_{t}\right) \odot \tilde{\boldsymbol{H}}_{t} Ht=Zt⊙Ht−1+(1−Zt)⊙H~t - GRU特点: 门机制采用Sigmoid 激活函数, 使门值为( 0 , 1 ) , 0 表示遗忘, 1 表示保留。若更新门自第一个时间步到t - 1 时间过程中, 一直保持为1 , 信息可有效传递到当前时间步。
5、LSTM(长短期记忆网络)
-
LSTM: 引入3 个门和记忆细胞, 控制信息传递
- 遗忘门 F t F_t Ft: 哪些信息需要遗忘
- 输入门 I t I_t It: 哪些信息需要流入当前记忆细胞
- 输出门 O t O_t Ot: 哪些记忆信息流入隐藏状态
- 记忆细胞
C
t
C_t
Ct: 特殊的隐藏状态, 记忆历史信息
I t = σ ( X t W x i + H t − 1 W h i + b i ) , F t = σ ( X t W x f + H t − 1 W h f + b f ) , O t = σ ( X t W x o + H t − 1 W h o + b o ) , \begin{aligned} \boldsymbol{I}_{t} &=\sigma\left(\boldsymbol{X}_{t} \boldsymbol{W}_{x i}+\boldsymbol{H}_{t-1} \boldsymbol{W}_{h i}+\boldsymbol{b}_{i}\right), \\ \boldsymbol{F}_{t} &=\sigma\left(\boldsymbol{X}_{t} \boldsymbol{W}_{x f}+\boldsymbol{H}_{t-1} \boldsymbol{W}_{h f}+\boldsymbol{b}_{f}\right), \\ \boldsymbol{O}_{t} &=\sigma\left(\boldsymbol{X}_{t} \boldsymbol{W}_{x o}+\boldsymbol{H}_{t-1} \boldsymbol{W}_{h o}+\boldsymbol{b}_{o}\right), \end{aligned} ItFtOt=σ(XtWxi+Ht−1Whi+bi),=σ(XtWxf+Ht−1Whf+bf),=σ(XtWxo+Ht−1Who+bo), - 候选记忆细胞
C
~
t
\tilde{\boldsymbol{C}}_{t}
C~t:
C ~ t = tanh ( X t W x c + H t − 1 W h c + b c ) \tilde{\boldsymbol{C}}_{t}=\tanh \left(\boldsymbol{X}_{t} \boldsymbol{W}_{x c}+\boldsymbol{H}_{t-1} \boldsymbol{W}_{h c}+\boldsymbol{b}_{c}\right) C~t=tanh(XtWxc+Ht−1Whc+bc)
-
记忆细胞与隐藏状态: 记忆细胞由候选记忆细胞及上一时间步记忆细胞组合得来。 C t = F t ⊙ C t − 1 + I t C t ~ \boldsymbol{C}_{t}=\boldsymbol{F}_{t} \odot \boldsymbol{C}_{t-1}+\boldsymbol{I}_{t}\tilde{\boldsymbol{C}_{t}} Ct=Ft⊙Ct−1+ItCt~
-
由输出门控制记忆细胞信息流入隐藏状态:
H t = O t ⊙ tanh ( C t ) \boldsymbol{H}_{t}=\boldsymbol{O}_{t} \odot \tanh \left(\boldsymbol{C}_{t}\right) Ht=Ot⊙tanh(Ct)