您的位置:首页 > 其它

5.序列模型 第一周 循环序列模型

2018-02-23 17:35 489 查看
Core:学习搭建循环神经网络并将其应用于自然语言识别和音频应用。

本课程分3周:

第一周 循环序列模型(只学习)

第二周 自然语言处理与词嵌入

第三周 序列模型与注意力机制

1.1 为什么选择序列模型?



X与Y可能都是序列,也可能有一方是序列。输入与输出的序列长度可以不同。

1.2 数学符号

识别句中人名位置的序列模型。(命名实体识别问题)

用x<t>x<t>来索引序列中的位置。



one-hot向量(向量中只有一个1,其余都是0)



1.3 循环神经网络模型

在每一个时间步中,循环神经网络传递一个激活值到下一个时间步中用于计算。

如何才能建立一个模型,建立一个神经网络来学习x到y的映射呢?



每一步用相同的参数,



循环神经网络是从左到右扫描数据,同时每个时间步的参数也是共享的。

局限:在某一时刻的预测仅仅使用了the information from the inputs earlier in the sequence.并没有使用the information later in the sequence.



BRNN可以解决这种看不到后面序列的问题,能同时使用序列前后的信息来做预测。



前向传播:

对于y,选用哪个激活函数,根据具体的任务决定,如果是二分分类的问题,用sigmoid函数,如果是k分类,用softmax函数。这里激活函数的类型取决于有什么样的输出y。



上图左右两边画线部分等价。



好处是可以不使用两个参数矩阵,而是将其压缩成一个参数矩阵。所以,当建立更复杂模型时,这就能简化要用到的符号。





wywy和byby表示计算时会输出什么类型的量,wywy是计算yy类型的量的权重矩阵。而wawa和baba则表示这些参数是用来计算aa类型输出或者激活值的。

1.4 通过时间的反向传播

Backpropagation through time

反向传播是怎样在循环神经网络中运行的?

方向:



前向传播的部分



所有的激活项都要依赖于wawa和baba.





为了计算反向传播,还需要定义一个损失函数。

先定义一个元素的损失函数,对应序列中一个具体的词。

交叉熵cross entropy loss损失函数/标准logistic regression损失函数:



整个序列的损失函数:对每一个时间步的损失求和。



第一个时间步的损失表示为L<1>L<1>。为计算总的损失函数,要将所有单独时间步的损失加起来,



完整的计算图:



输入序列的长度 = 输出序列的长度

1.5 不同类型的循环神经网络

可处理更加广泛的应用。TxTx 和 TyTy并不一定相等。都是序列,但长度不同。所以应该修改基本的RNN结构来处理这些问题。

多对多结构:输入序列有很多输入,而输出序列也有很多输出。



情感分类:

x: 电影没有什么好看的。

y: 可能是1-5的一个数字。或者是0-1,代表正面评价或者负面评价。

不再在每个时间上都有输出了,而是让这个RNN网络读入整个句子,然后在最后一个时间上得到输出。输出一个数字。

所以,这叫做多对一。



此外还有一对一











音乐合成:通常会把第一层合成的输出喂给下一层。



上图的网络结构(编码器+解码器),输入和输出的序列长度不同也是OK的,适用于机器翻译。

1.6 语言模型和序列生成

序列模型有一些特别。



上图是序列模型的例子

学习用RNN构建一个语言模型。

根据RNN所做的概率值,输出最可能的句子。



UNK代表未知词的标记。只针对UNK建立概率模型,而不是针对具体的词。

完成标记化的过程后,意味着将输入的句子都映射到了各个标记上,或者说字典的各个词上。



下面,用RNN来构建这些序列的概率模型,用到softmax。



1.7 对新序列采样

在训练了一个序列模型后,要想了解这个模型学到了什么,一个非正式的方法是进行一次新序列采样。

这里,一个序列模型模拟了任意特定单词序列的概率。要做的就是对这个概率分布进行采样,来生成一个新的单词序列。

要做一些事情,如对生成的第一个词进行采样,第一个时间步,得到的是所有可能的输出,是经过softmax层后得到的概率。然后,根据这个softmax的分布,进行随机采样。softmax分布给的信息是第一个词是a的概率是多少,第一个词是zulu的概率是多少。。。采样命令是np.random.choice。

在第二个时间步,将刚刚采样得到的y<1>y<1>作为下一个时间步的输入。



不管在第一步得到什么词,都要把它传递到下一位置作为输入,然后,softmax层就会预测y<2>y<2>.计算在第一个单词是…的情况下,第二个单词是…的概率,得到的结果就是y<2>y<2>。

EOS在字典中,遇到就意味着可以停止采样了。

EOS不在字典中,方法可以用采样其他值,一直达到所设定的时间步。

不过呢,最好也不要输出未知标记。当然了,如果不介意的话,忽略。





基于单词(UNK)与基于字符(不存在UNK,但是计算力高)。

1.8 带有神经网络的梯度消失

梯度消失是传统RNN遇到的最为严重的问题。

这个句子有长期的依赖,cat的单复数对句子后面的单词有影响。



最初的RNN不擅长捕获这种长期依赖效应。这种RNN结构是:



在反向传播时,随着层数的增多,梯度不仅可能指数型的下降,也可能指数型的上升。

梯度消失时训练RNN时要关注的首要问题。至于梯度爆炸,很容易被发现。

梯度爆炸易被发现:

因为梯度很大,所以参数会变得极大,以至于网络参数崩溃。会看到很多NaN,或者不是数字的情况,意味着网络计算出现了数值溢出。

如果发现了梯度爆炸,一个解决方法就是用梯度修剪。

梯度修剪的意思是:观察梯度向量,如果它大于某个阈值,那么缩放梯度向量,保证它不会太大,这就是通过一些最大值来修剪的方法。

而梯度消失相比梯度下降而言,就难解决了。

解决梯度消失的集中方法:

1.9 GRU单元

门控循环单元网络(GRU),可以很好的用来解决梯度消失的问题,可以使得神经网络捕获更长的长期依赖。

GRU,改变了RNN的隐藏层,使其可以更好的捕捉深层连接,并改善了梯度消失问题。

RNN隐藏层单元的可视化实现:



门控循环单元:

句子:



从左到右读这个句子,GRU单元将会有新的变量,称为cc,代表细胞,即记忆细胞。记忆细胞的作用是提供记忆的能力,如:一只猫是单数还是复数。

对于GRU,两值相等。



但对于LSTM,上述两值是不相等的。

这些等式表示了GRU单元的计算。

在每一个时间步,将用一个候选值重写记忆细胞,



在GRU中真正重要的思想是we have 一个门ΓuΓu。uu代表更新门,ΓuΓu是一个0-1的门值。



GRU的关键部分就是细胞更新式+用门来决定是否要更新它。



细胞状态C<t>C<t>为1,考虑的单词在句子中是cat,单数。0的话是复试形式。

然后GRU单元将会一直记住C<t>C<t>的值。And 门的作用,即ΓuΓu的作用是决定什么时候更新细胞值。

C<t>C<t>的实际值= 门*候选值……,



也就是门更新的话,结果就是候选值,否则就是上一时间步的真实值,即旧值。

不更新,一直用旧值,就说明记住了,记住了,一直在记着。



优点是:当从左到右扫描句子时,要判断更新某个记忆细胞,还是不进行更新(维持细胞的值)。不更新直到真的需要使用该记忆细胞的时候。



因为ΓuΓu很接近于0,那么就不会有梯度消失的问题了。这也是缓解梯度消失问题的关键,允许长期的依赖。基本上是C<t>C<t>等于C<t−1>C<t−1>。

完整的GRU:



对于完整的GRU单元,要做的一个改变是在第一个式子中给记忆细胞的新候选值加上一个新的项ΓrΓr。rr代表相关性,用这项表明在计算下一个候选项时,与前一个值有多大的相关性。

GRU可以更好地捕捉非常长范围的依赖,让RNN更加有效,可以在序列中学习非常深的连接。

1.10 长短时记忆LSTM

LSTM比GRU更加有效。



GRU有两个门:the update gate and the relevance gate.

LSTM的一个特点是:不只有一个更新门控制。

ΓuΓu:update gate

ΓfΓf:forget gate.

ΓoΓo: output gate

* 表示元素对应相乘。

LSTM有3个门,而不是两个。



控制LSTM行为的主要式子:



用图片解释:



个人感觉:式子比图片好理解,但图片更加直观些。

只要正确设置了忘记门和更新门,LSTM很容易把C<0>C<0>的值一直往下传递的。比如C<0>C<0>=C<3>C<3>。所以说,LSTM和GRU一样,非常擅长记忆某个值。对于存在于记忆细胞的某个值,即使经过很长很长的时间



GRU的优点是模型更加简单,更容易创建一个更大的网络。而且只有两个门,在计算性上,也运行的更快,可以扩大模型的规模。

LSTM更加灵活,因为有三个门,而不是两个。

但是LSTM更通用。他们都可以capture a much longer range dependencies.

窥视孔连接:a peephole connection

gate values may depend not just on



but also on the previous memory cell value.

And the peephole connection 就可以结合着3个门的计算了。



影响的关系是one-to-one的。如第50个ct−1ct−1元素只能影响第50个元素对应的门。



构建更好的模型

1.11 双向神经网络

双向RNNs

这个模型可以让你在序列的某点处不仅可以获取之前的信息,还可以获取未来的信息。

为了了解双向RNN的动机,先看之前的这个例子,



在这个例子中,只根据前3个单词无法判断人名。不管那些单元是RNN,GRU还是LSTM,这个网络都是单向的。

请看双向的RNN:

为了简单,使用一个只有4个单元的句子。



forward recurrent component

前向的循环单元





上图还是单向的RNN。

Now,我们要增加一个反向循环层a backward recurrent layer。



这样,就构成了一个无环图acyclic graph。给定一个输入序列x,这个序列首先计算前向的a。而反向序列从计算a4开始,反向进行,计算反向的a3,a2,a1.注意:计算的是网络的激活值,这不是反向传播backward,而是前向传播forward prop。所以说,图中的这个前向传播一部分计算是从左到右,另一部分计算是从右到左。所有的激活值a都计算完毕之后,就可以计算预测结果了。

在计算预测结果时,如



双向RNN的优点:过去+现在+为了的信息都考虑了,即考虑整个句子的信息。



全貌:



这一改进的结果,不仅可以用于RNN,还可以用于GRU和LSTM。

双向RNN的缺点:

需要完整的数据序列,才能预测任意位置。

1.12深层循环神经网络

Deep RNNs

要学习非常复杂的函数,通常会把RNN的多个层堆叠在一起,构建更深的模型。

那么,如何构建这些更深的RNN呢?

layer l和第t个时间点



如一个有三个隐层的新的网络



激活值的计算:



参数w和b,在这一层的计算里都一样。

对于RNN来说,有3层就已经不少了,由于时间的维度,RNN网络会变得相当大,即使只有很少的几层。

但是,有一种这样的情况。就是在每一个上面堆叠循环层。

recurrent layers that are stacked on top of each other.

把输出yy给去掉,然后换成一些深的层。这些层并不水平连接,而是一个深层的网络,然后用来预测y。



这种类型的网络结构,用的会多点。这种结构有3个循环单元that connected in time,followed by a network.

这是一个深层网络,但没有水平方向的连接。

Deep RNN训练需要很长的时间,尽管看起来没有多少循环层。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: