深度学习(四)~循环神经网络
循环神经网络
1. RNN训练流程
【RNN训练过程】
a. 前向计算每个神经元的输出值;
b. 反向计算每个神经元的误差项值;
c. 计算每个权重的梯度。
d. 最后再用随机梯度下降算法更新权重
2. 参数学习
(1)【RNN前向传播算法】
循环神经网络在时刻t的更新公式为
- x(t)代表在序列 t 时刻训练样本的输入;
- h(t) 代表在序列 t 时刻模型的隐藏状态. h(t)由x(t)和 h(t-1) 共同决定;
- o(t) 代表在序列 t 时刻模型的输出. o(t)只由模型当前的隐藏状态 h(t) 决定;
- L(t) 代表在序列 t 时刻模型的损失函数. 模型整体的损失函数是所有的L(t)相加和;
- y(t) 代表在序列 t 时刻训练样本序列的真实输出;
- f,σ为激活函数,通常前者f选择tanh,后者σ选择softmax;
- U是状态-状态权重矩阵,W是状态-输入权重矩阵,U,W,V这三个矩阵就是我们的模型的线性关系参数,它在整个RNN网络中是共享的。也正是因为是共享的,它体现了RNN的模型的“循环反馈”的思想.
(2)【随时间反向传播算法(BPTT)】
由于序列的每个位置都有损失函数,因此最终损失L为:
求 L 在 t 时刻对 W 、U 、V的偏导数:
(3) 随时间反向传播算法(BPTT) VS 实时循环学习算法(RTRL)
① 在RNN中,一般网络输出维度远低于输入维度,因此BPTT算法计算量更小;
② BPTT需要保存所有时刻的中间梯度,空间复杂度较高,RTRL算法不需要梯度回传,适合在线学习或者无限序列任务
3. RNN应用:
(1). 序列到类别模式
特点:
输入:单词序列
输出:文本类别
一种是将最后时刻的状态作为整个序列的表示;另一种是对整个序列的所有状态进行平均,从而作为整个序列的表示
g(*)为分类器
应用:文本分类
(2). 同步的序列到序列模式
特点:每一时刻都有输入和输出,输入序列与输出序列的长度相同。例如为每个单词标注对应的词性标签
g(*)为分类器
应用:序列标注
(3). 异步的序列到序列模式
特点:也称编码器-解码器(Encoder-Decoder)模型,即输入序列和输出序列不需要严格的对应关系,也不需要保持相同的长度
流程:异步的序列到序列模式一般通过先编码后解码的方式来实现。先将样本x按不同时刻输入到一个循环神经网络(编码器)中,并得到其编码hT.再使用另一个循环神经网络(解码器)得到输出序列y(1:M)
应用:机器翻译
4. 长程依赖问题
参数学习过程中连乘项可能发生极大或极小的情况,从而影响最终结果,也即梯度消失与梯度爆炸问题
(1). 梯度消失
在参数学习过程中,连乘项若很多项小于1,则结果越来越趋近于0,导致信息损失过多,发生梯度消失
sigmoid 函数的导数范围是(0, 0.25],tanh 函数的导数范围是 (0, 1] ,均不大于一,因此容易累乘越来越小,出现梯度消失问题(例如:δ(wx+b)中,wx+b越大,δ导数越小).
一般采取的方式是优化技巧(优化激活函数,譬如将sigmold改为relu)或改变模型
(2). 梯度爆炸
在参数学习过程中,连乘项若很多项很大,则结果越来越大,导致计算量极大,发生梯度爆炸问题
一般采取的方式是权重衰减(正则化)或梯度截断
梯度截断思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,从而防止梯度爆炸。
tanh 函数的收敛速度要快于 sigmoid 函数,梯度消失的速度要慢于 sigmoid 函数。
5. 改进方案-基于门控的循环神经网络
为了解决这两个问题,学者们引入了基于门控的循环神经网络.
(1) LSTM
与传统的循环神经网络相比,LSTM采用三门机制,输入门、遗忘门以及输出门和一个内部记忆单元。
遗忘门: 控制前一步记忆单元中的信息有多大程度被遗忘掉
输入门: 决定从当前步骤添加哪些信息
输出门: 决定下一个隐藏状态应该是什么
(2) GRU
GRU是在LSTM上进行简化而得到的,只有两个门,分别为更新门和重置门
重置门: 候选隐含状态使用了重置门来控制过去有多少信息被遗忘
更新门: 控制过去的隐含状态在当前时刻的重要性
LSTM与GRU等算法将在续篇详细介绍