前馈型神网络:指网络的传播方向是单向的,先将输入信号传给下一层(隐藏层),接收到信号的层也同样传给下一层,然后再传给下一层……像这样,信号仅在一个方向上传播。
存在问题:不能很好地处理时间序列数据(以下简称为“时序数据”)即单纯的前馈网络无法充分学习时序数据的性质。
所以需要引入RNN(循环神经网络)
1 概率和语言模型
1.1 概率视角下的word2vec
与之前不同的是,这里我们将上下文限定为左侧窗口。
CBOW
模型的学习旨在找到使式
(5
.
3)
表示的损失函数(确切地说,是整个语料库的损失函数之和)最小的权重参数。
1.2 语言模型
语言模型
(
language model
)给出了单词序列发生的概率。
比如,对于“
you say goodbye
”这一单词序列,语言模型给出高概率(比如 0
.
092
);对于“
you say good die
”这一单词序列,模型则给出低概率(比如 0
.
000 000 000 003 2
)。
![](https://img-blog.csdnimg.cn/direct/94bcc5f944c84c74b20509905ea7a444.png)
![](https://img-blog.csdnimg.cn/direct/22ef5b2dad7243b69727a5f8312e67c2.png)
![](https://img-blog.csdnimg.cn/direct/620440636a3641a8b59f3f54e94902bc.png)
1.3 将CBOW模型用作语言模型?
马尔可夫性是指未来的状态仅依存于当前状态。此外,当某个事件的概率仅取决于其前面的 N
个
事件时,称为“
N 阶马尔可夫链”。
若下一个单词仅取决
于前面
2
个单词的模型,称为“
2
阶马尔可夫链”。
CBOW模型存在上下文大小问题以及忽略上下文单词顺序问题。
2 RNN
2.1 循环的神经网络
随着数据的循环,信息不断被更新。
通过数据的循环,
RNN
一边记住过去的数据,一边更新到最新
的数据。
![](https://img-blog.csdnimg.cn/direct/86771d133f7b43b08b29e59292e4bd97.png)
![](https://img-blog.csdnimg.cn/direct/4296ccb4bb7247dab170278ad1bb4678.png)
2.2 展开循环
RNN
层是“具有状态的层”或“具有存储(记忆) 的层”
![](https://img-blog.csdnimg.cn/direct/695d9c23133f4affa09fc34eae4912dd.png)
从
RNN
层输出了两个箭头,但是请注意这两个箭头代表的是同一份数据(准确地说,是同一份数据被复制了)。
2.3 Backpropagation Through Time
存在问题:
2.4 Truncated BPTT
RNN
执行
Truncated BPTT
时,数据需要按顺序输入。
![](https://img-blog.csdnimg.cn/direct/c794467aa19646e5b2d0b61474a42bf8.png)
结论:正向传播不会断,误差反向传播按块进行。
2.5 Truncated BPTT的mini-batch学习
在输入数据的开始位置,需要在各个批次中进行“偏移”。
![](https://img-blog.csdnimg.cn/direct/9bad13158c8e4ddabd31794a61cdedb9.png)
![](https://img-blog.csdnimg.cn/direct/b34e80d9a2ed4b8f8446eb0b4e76a723.png)
需要注意的是:
一是要按顺序输入数据;二是要平移各批次(各样本)输入数据的开始位置。
3 RNN的实现
目标神经网络接收长度为
T
的时序数据(
T
为任意值),输出各个时刻的隐藏状态 T
个。
我们接下来进行的实现的流程是:首先,实现进行
RNN
单步处理的
RNN类;然后,利用这个 RNN
类,完成一次进行
T
步处理的
TimeRNN
类。
3.1 RNN层的实现
RNN正向传播的数学式:
![](https://img-blog.csdnimg.cn/direct/21e8ba357c1a4de8b0b2d6fcd0a3bb03.png)
![](https://img-blog.csdnimg.cn/direct/2f51a9527fbf4038adecb8e3019d0563.png)
![](https://img-blog.csdnimg.cn/direct/c5490ef2d35546fdb6280e1a75e0fd28.png)
![](https://img-blog.csdnimg.cn/direct/dba0b032ce8b4a118988c37db4ac2946.png)
![](https://img-blog.csdnimg.cn/direct/cc7542a2ae0b486bbe428e3ce6de80a6.png)
![](https://img-blog.csdnimg.cn/direct/79444dfa1e384422a6932d00451be8df.png)
![](https://img-blog.csdnimg.cn/direct/7485e58c939d4f55a05efb4cd99734c1.png)
![](https://img-blog.csdnimg.cn/direct/9646a83f11f541c995b6c833b53aa90d.png)
![](https://img-blog.csdnimg.cn/direct/1f520dc1cbb54c69a5ba54bcbd9b204e.png)
3.2 Time RNN层的实现
这里,
RNN
层的隐藏状态
h
保存在成员变量中。如图 5
-
22
所示,在进行隐藏状态的“继承”时会用到它。
![](https://img-blog.csdnimg.cn/direct/aa6f1846107f46ba9168b7b0c74b1a72.png)
另外,我们可以用
stateful
这个参数来控制是否继承隐藏状态。
![](https://img-blog.csdnimg.cn/direct/8a545860443e454b95011ee3a294b419.png)
![](https://img-blog.csdnimg.cn/direct/7d5889c6f1a24157bc0c94bd02c7d82e.png)
![](https://img-blog.csdnimg.cn/direct/6216acf2abe54ab7b6c20e52f8bbc683.png)
![](https://img-blog.csdnimg.cn/direct/a90642c3f4464b4eb74e5b53b9288b76.png)
![](https://img-blog.csdnimg.cn/direct/81321fcd114342c194cd38aa0eeb0e1b.png)
![](https://img-blog.csdnimg.cn/direct/6391cd414aab492fbfa11ee728f85ee1.png)
![](https://img-blog.csdnimg.cn/direct/6277147ebc0141a39126a5bb37ed41c5.png)
![](https://img-blog.csdnimg.cn/direct/526feead054c4118a939d53c1266d9f2.png)
![](https://img-blog.csdnimg.cn/direct/82646a35c4aa45c286da116b3b942bea.png)
这里需要注意的是,
RNN
层的正向传播的输出有两个分叉。在正向传播存在分叉的情况下,在反向传播时各梯度将被求和。因此,在反向传播时,流向 RNN
层的是求和后的梯度。
![](https://img-blog.csdnimg.cn/direct/bd2b49f2acf04c7c8608e145755c6b0b.png)
![](https://img-blog.csdnimg.cn/direct/d21699b01e0847b59e73328a4617f7f9.png)
4 处理时序数据的层的实现
我们将基于
RNN
的语言模型称为
RNNLM
4.1 RNNLM的全貌图
这里需要注意的是,RNN 层“记忆”了“
you say
”这一上下文。更准确地说,
RNN
将“
you say”这一过去的信息保存为了简短的隐藏状态向量。
RNN
层的工作是将这个信息传送到上方的 Affine
层和下一时刻的
RNN
层。
RNNLM 可以“记忆”目前为止输入的单词,并以此为基础预
测接下来会出现的单词。
RNN
层通过从过去到现在继承并传递数据,使得
编码和存储过去的信息成为可能。
4.2 Time层的实现
之前我们将整体处理时序数据的层实现为了
Time RNN
层,这里也同样使用 Time Embedding
层、
Time Affine
层等来实现整体处理时序数据的层。
![](https://img-blog.csdnimg.cn/direct/d1a698afc6d8499f90c1ea8e15c3f146.png)
Time Affine
层的情况下,
准备
T
个
Affine
层分别处理各个时刻的数据即可。
![](https://img-blog.csdnimg.cn/direct/ed5485064f494d498c904ce3d6b0c29b.png)
Time Embedding
层也一样,在正向传播时准备
T
个
Embedding
层,由各个 Embedding
层处理各个时刻的数据。
需要注意的是,
Time Affine
层并不是单纯地使用
T
个Affine 层,而是使用矩阵运算实现了高效的整体处理。
![](https://img-blog.csdnimg.cn/direct/0cf1fb45804a4395a53aae11c4769180.png)
T
个Softmax with Loss 层各自算出损失,然后将它们加在一起取平均。
![](https://img-blog.csdnimg.cn/direct/ad5294efbaca431f93137e809c5cf394.png)
5 RNNLM的学习和评价
5.1 RNNLM的实现
代码p208
在深度学习中,权重的初始值非常重要。
通过设置好的初始值,学习的进展和最终的精度都会有很大变化。本书此后都将使用 Xavier
初始值作为权重的初始值。
5.2 语言模型的评价
语言模型基于给定的已经出现的单词(信息)输出将要出现的单词的概率分布。
困惑度:概率的倒数
![](https://img-blog.csdnimg.cn/direct/e64b11557f7c4ecdb2df82b8cdc75cc2.png)
![](https://img-blog.csdnimg.cn/direct/c0a964f25710487f970229201f960a38.png)
![](https://img-blog.csdnimg.cn/direct/bdeb8de425684a409cfb9ae39506bb40.png)
困惑度也可以解释为分叉度,
在刚才的例子中,好的预测模型的分叉度是
1
.
25
,这意味着下
一个要出现的单词的候选个数可以控制在
1
个左右。而在差的模型中,下一个单词的候选个数有 5
个。
困惑度越小,分叉度越小,表明模型越好。
5.3 RNNLM的学习代码
p213
运行效果,困惑度明显下降。
5.4 RNNLM的Trainer类
p216
6 总结
RNN
通过数据的循环,从过去继承数据并传递到现在和未来。如此,RNN
层的内部获得了记忆隐藏状态的能力。