1 循环序列模型
1.1 循环序列模型的应用
序列模型是神经网络中的几大分支之一,比如循环神经网络(RNN)就属于序列模型。序列模型运用得很广,下面给出了一些常见得例子:
从上图可以看到,序列模型也存在不同类型,有些 X 和 Y 都是序列,而有些只是两者之一是序列数据。
1.2 符号标记
符号说明:
上标
(
i
)
(i)
(i) :第
i
i
i 个样本;
上标
⟨
t
⟩
\left \langle t \right \rangle
⟨t⟩ :一个序列样本中的第
t
t
t 个位置;
T
T
T :表示某个序列样本的长度,比如
T
(
i
)
T^{(i)}
T(i) 表示第
i
i
i 个样本有
T
(
i
)
T^{(i)}
T(i) 个元素。
构建字典与如何表示序列中的单词:
词典:包含多词的向量,涵盖应用常见的一些常见词,一般为3万至5万词。
在训练时,样本中的单词用独热(ont-hat)向量来表示,如下图。若字典中不包含当前词,则创建一个新的标记, 或者说是一个伪词(Unknown Word), 并使用尖括号加UNK() 来表示这些不在词汇表中的词。
1.3 循环神经网络模型(Recurrent Neural Network)
为社么不用标准神经网络(全连接神经网络)来处理序列数据?
循环神经网络模型:
1、对于一个样本,不仅仅依靠
x
⟨
t
⟩
x^{\left \langle t \right \rangle}
x⟨t⟩ 去预测
y
⟨
t
⟩
y^{\left \langle t \right \rangle}
y⟨t⟩,还需要前一步的激活值
a
⟨
t
−
1
⟩
a^{\left \langle t-1 \right \rangle}
a⟨t−1⟩。对于第一步,其前一步的激活值
a
⟨
0
⟩
a^{\left \langle 0 \right \rangle}
a⟨0⟩ 往往初始化为 0。
2、参数共享,每一步的都共享同一组参数(
W
a
x
W_{ax}
Wax、
W
a
a
W_{aa}
Waa、
W
y
a
W_{ya}
Wya)。
缺点:
1、只用早期的信息来做预测,预测
y
⟨
t
⟩
y^{\left \langle t \right \rangle}
y⟨t⟩ 只用到了
a
⟨
0
⟩
,
.
.
.
,
a
⟨
t
−
1
⟩
a^{\left \langle 0 \right \rangle}, ... \ ,a^{\left \langle t-1 \right \rangle}
a⟨0⟩,... ,a⟨t−1⟩,但是却没有用到
a
⟨
t
+
1
⟩
,
.
.
.
a^{\left \langle t+1 \right \rangle}, ...
a⟨t+1⟩,... 。
1.4 前线传播与反向传播
前向传播过程:
反向传播:
反向传播关键:值的传递和递归计算(基于时间的反向传播算法);
蓝色箭头:前向传播
红色箭头:反向传播
2 更多的 RNN 架构
2.1 常见 RNN 架构
1、一对一(one-to-one0):
2、一对多(one-to-many):
比如音乐生成。
3、多对一(many-to-one):
比如情感分类。
4、多对多(many-to-many):
(1) 输入序列长度与输出序列长度相等,比如命名实体识别。
(2) 输入序列长度与输出序列长度不相等,比如机器翻译。
2.2 语言模型和序列生成
大文本集(corpus)作为训练集,一个句子就是一个样本。
标记化:将句子映射为各个标记:
在句子后面加入 < EOS > 表示这个句子的结束。标点可以不算作标记,如果要算如标记,那么需要把这些标点添加至词典。用 < UNK > 表示词典中没有的词,
然后将这个句子对照这词典转化成独热编码。
例:生成一个随机的句子。
2.3 采样新的序列
词级RNN模型:
字符级RNN模型:
主要缺点:是字符级RNN模型会有更长的序列,需要更强的硬体,更多的计算力来做训练。
3 RNN的梯度消失与梯度爆炸
3.1 梯度消失导致 RNN 的“附近效应”
有些句子前面的部分会影响后面的部分,后面的某些词会对前面的词产生一定的依赖。比如:
而RNN不善于捕捉长期的依赖关系。因为很长的句子很容易造成梯度消失。换句话说,RNN模型有 “附近效应”。
假使要处理含有1,000 甚至10,000 个以上时间序列的数据集,那就至少需要 1,000 或 10,000 层的神经网络。这导致对RNN的梯度消失就需要更多步骤来处理。常见的解决 RNN 中梯度消失的方法有 GRU 和 LSTM,下面给出介绍。
3.2 门控循环单元 Gated Recurrent Unit (GRU)
作用:它修改了循环神经网络的隐藏层,从而更好地捕捉长距离的关系,同时有助于减轻梯度消失的问题。
计算过程:
GRU包含两个控制门,即
更新门:
Γ
u
\Gamma_u
Γu
相关门:
Γ
r
\Gamma_r
Γr
且
c
⟨
t
⟩
=
a
⟨
t
⟩
c^{\left \langle t \right \rangle}=a^{\left \langle t \right \rangle}
c⟨t⟩=a⟨t⟩
3.3 长短期记忆单元 Long Short Term Memory (LSTM)
除了 GRU,LSTM 也是一种能更好解决 RNN 梯度消失问题的方法。
LSTM 包含三个控制门,即
更新门:
Γ
u
\Gamma_u
Γu
遗忘门:
Γ
f
\Gamma_f
Γf
输出门:
Γ
o
\Gamma_o
Γo
且
c
⟨
t
⟩
=
̸
a
⟨
t
⟩
c^{\left \langle t \right \rangle} =\not a^{\left \langle t \right \rangle}
c⟨t⟩=a⟨t⟩
比起GRU,LSTM更加的强大。LSTM是经过历史检验的方法,因此可以把LSTM作为 默认第一个去尝试的方法。
3.4 梯度爆炸与梯度修剪
除了梯度消失,梯度爆炸也有可能发生。但而梯度爆炸很容易被发现,因为参数可能会变成 NaN 或者显示为非数字,这代表出现了数值溢位问题。可解决方法是运用梯度修剪(gradient clipping)。具体来说就是观察梯度向量,如果它大于某个阈值,则重新缩放梯度向量,确保它不会太大。
剪裁渐变的方法有很多种。这里给出一个简单的梯度修剪示例:梯度向量的每个元素被剪切为位于某个范围 [-N,N] 之间。具体地说,你会提供一个 maxValue(比如10)。在此示例中,如果梯度向量的任何分量大于10,则将其设置为10;如果梯度向量的任何分量小于 -10,则将其设置为 -10。如果介于 -10 和 10 之间,则不用做任何处理。
4 其他版本的 RNN
4.1 双向循环神经网络 Bidirectional RNN(BRNN)
在用RNN进行预测时,往往根据某个标记本身以及前面的序列信息不足以对这个标记做出判断,还需要后面的序列信息。
比如根据红色方框中 “Teddy” 这个单词以及它前面的两个单词根本无法得知 “Teddy” 是否为一个人名。但通过它后面的单词就可以得知,一个指的是 “泰迪熊”,另一个是指美国总统 泰迪·罗伯特。
BRNN:利用序列从前到后和从后到前两个方向上的前向传播来进行预测。
步骤:
step1:以
a
⟨
t
−
1
⟩
a^{\left \langle t-1 \right \rangle}
a⟨t−1⟩ 与
x
⟨
t
⟩
x^{\left \langle t \right \rangle}
x⟨t⟩ 作为输入,从左到右前向传播计算紫色的激活值
a
⟨
t
⟩
a^{\left \langle t \right \rangle}
a⟨t⟩;
step2:以
a
⟨
t
+
1
⟩
a^{\left \langle t+1 \right \rangle}
a⟨t+1⟩ 与
x
⟨
t
⟩
x^{\left \langle t \right \rangle}
x⟨t⟩ 作为输入,从右到左前向传播计算绿色的激活值
a
⟨
t
⟩
a^{\left \langle t \right \rangle}
a⟨t⟩;
setp3:根据紫色
a
⟨
t
⟩
a^{\left \langle t \right \rangle}
a⟨t⟩ 与绿色
a
⟨
t
⟩
a^{\left \langle t \right \rangle}
a⟨t⟩ 做出预测,即计算
y
^
⟨
t
⟩
\hat{y}^{\left \langle t \right \rangle}
y^⟨t⟩。
缺点:需要整个数据序列, 然后才能在任何地方进行预测。
例如:用 BRNN 进行语音识别时,需要等待人停止说话,得到完整的一句话, BRNN 才可以实际处理它,并进行语音识别预测。所以对于一个实时类型的语音识别应用程序,他们有更复杂的模块,,而不是仅仅使用标准的双向 RNN。
4.2 Deep RNNs
但对于学习非常复杂的函数,有时候 把多层 RNNs 堆在一起形成更深层的这些模型的版本会很有帮助。