循环序列模型
为什么选择序列模型?
数据符号:
约定了一些符号表示,详情见书。
单词建立一个词典(大小为10,000的话),然后用一个独热编码向量来表示(10,000维)
循环神经网络模型 (RNN model)
首先,一句话之间各个单词是有关联的
其次,一句话中每个单词之间有先后顺序
其次,一句话中单词数量各不相同
单纯的利用以前学习到的神经网络模型,比如一句话有9个单词(也就是九个独热编码向量),输入进神经网络训练,彼此之间不共享信息
。X的长度也各不相同
再其次,比如10,000维的独热编码向量,总得输入大小是最大单词数乘以10,000,将有着巨大的权重矩阵。
以上问题需要,循环神经网络模型来解决:
![](https://i-blog.csdnimg.cn/blog_migrate/5d0614de23a155e1b394c44478d22a49.png)
只要按照作图来理解就好:
详细内容见深度学习笔记,简要来说:
权重矩阵有:
W
a
a
,
W
a
x
,
W
y
a
W_{aa},W_{ax},W_{ya}
Waa,Wax,Wya
各层共享以上相同的权重矩阵W
a < t > = g 1 ( W a a a < t − 1 > + W a x X < t > + b a ) a^{<t>}=g_1(W_{aa}a^{<t-1>}+W_{ax}X^{<t>}+b_a) a<t>=g1(Waaa<t−1>+WaxX<t>+ba)
y ^ < y > = g 2 ( W a y a < t > + b y ) \hat{y}^{<y>}=g_2(W_{ay}a^{<t>}+b_y) y^<y>=g2(Waya<t>+by)
激活函数常用tanh,具体使用根据情况而定,比如说:二分类问题,最后可能用sigmoid,而多类别分类问题,最后可能会用softmax
以上,在前向传播的时候,某一层就共享了前面单词(输入)的信息
但,比如Teddy bought a T-shirt yesterday,Teddy is a dog.在识别命名实体是否是一个人名的时候,其关键信息在后面,这是一个问题。需要双向循环神经网络模型,后讲
最后,简化下标, W a a , W a x W_{aa},W_{ax} Waa,Wax放在一起作为W_a, a < t − 1 > , X < t > a^{<t-1>},X^{<t>} a<t−1>,X<t>放在一起
以上等同。
W a y W_ay Way也命名为 W y W_y Wy
最终:如下图
通过时间的反向传播
![](https://i-blog.csdnimg.cn/blog_migrate/71bda3632d1d6ff85d5585f6bfee20c8.png)
不同类型的循环神经网络
多对多
- 输入和输出的的数量相同 (机器翻译)
- 输入和输出的数量不同 (命名实体识别)
多对一
- 情感分析
一对一
- 之前的神经网络几乎都是一对一
一对多
- 音乐生成
![](https://i-blog.csdnimg.cn/blog_migrate/81b5816ce8ce2ae745971cecab9fe348.png)
语言模型和序列生成
语言模型:计算出各句话出现的可能性
语料库:很大,可能出现的单词组成的一个字典,各个单词以one-hot形式表示
EOS:有时,需要一个标志标记句子的结束,但不总是如此
UNK:如果句子中出现了一个语料库中没有包括的单词,全部都用UNK表示
![](https://i-blog.csdnimg.cn/blog_migrate/87a7287135ae03c64bc6f6cdae5a3a5f.png)
模型如上
- 首先, a < 0 > , x < 0 > a^{<0>},x^{<0>} a<0>,x<0>都初始化为一个0向量
- 而后,通过一个softmax输出语料库中各个单词出现的概率(编号1),注意 y ^ < 1 > \hat{y}^{<1>} y^<1>和 y < 1 > y^{<1>} y<1>
- 而后下一个时间步,传入 y < 1 > y^{<1>} y<1>(或说是 x < 2 > x^{<2>} x<2>),也就是第一个单词cat,输出第 y ^ < 2 > \hat{y}^{<2>} y^<2>
- 一直如此,最后希望第九层输出eos的概率很高
对新序列进行采样
![](https://i-blog.csdnimg.cn/blog_migrate/b0373202311bb99a8cc99d612bd06feb.png)
与上一个最大的不同就是,除第一个时间步外,每一个时间步的输入都是上一个时间步的输出。
在第一个时间步依概率分布进行采样得到单词输入到第二个时间步,得到softmax输出后再次进行采样输入到下一层。
重复以上步骤,直到:
- 采样到一个
- 进行了特定的时间步
对于采样到UNK:
- 如果在时间步的结尾,字典中没有这个词,你可以从20个或100个或其他单词中进行采样,然后一直抽样下去,直到达到设定的时间步。
- 但是如果在此过程中又出现了 unknown word,则可以进行重采样,直到得到一个不是一个未知标识的词。如果不介意UNK的话,也可以忽略这些未知的单词。
基于字符进行采样模型:
优点
优点是不会出现未知的标识
缺点
缺点是使用字符进行采样的模型会得到很多很长的序列
因为一句话中的英文单词仅有几十个,但是字符的长度却有很多个,这样使得RNN的长度过大,使得其不可以捕捉长范围的关系,而且训练起来计算成本比较高昂。
所以现有的RNN都是使用基于单词的采样,但是随着计算机性能越来越高,使用基于字符进行采样也是一种趋势。
循环神经网络的梯度消失问题
经过上述内容我们已经了解到了循环神经网络如何工作的了,但是给定一个句子:
The cat,which already ate …,was full.
The cats,which already ate …,were full.
这样一个句子,它的系动词was和were受名词单复数的影响,而系动词与名词相距较远。
正是因为梯度消失的问题,在进行权重更新的时候,一个单词仅受其邻近范围单词的影响。
那么很有可能was和were与名词cat单复数的关系就很难建立。
同样也有梯度爆炸的问题,这个一般通过设立一个阈值,超过阈值后就进行梯度修剪就可以了。
而梯度消失问题就很难解决:通过GRU(门控循环单元网络)来解决