循环系列模型
本周是序列模型第一周的内容。
1.1 为什么选择序列模型
序列模型有非常多的应用:
语音识别、音乐生成、情感分类、DNA序列分析、机器翻译、视频行为识别、命名实体识别等等。
1.2 数学符号
从上一节可以看到,序列模型依然是监督学习范畴,即需要给定x和y。
举一个例子,给定一段文本,想要识别其中表示名字的单词。下图展示了一些数学符号,表示单词位置。
在自然语言处理中,x序列中每一个单词应该如何表示呢?需要一个词典(商用通常几万词,这里1万词)存储所有单词,然后x序列每个单词一个one-hot向量表示该单词在词典中的位置。
1.3 循环神经网络模型
前面提到的序列问题,如果用标准神经网络来做,主要有两个问题:
- 泛化能力极差,因为每个句子长度都会不同
- 不同位置学到的特征并不能共享
于是引出循环神经网络(RNN),大概的一个框架(这里是Tx=Ty的情况,多对多输出,还有其他框架类型)如下图所示:
这是一个单向的循环神经网络,具体到人名识别例子上,就是输入一个词就给一个输出,这个输出由当前单词以及之前识别过的单词共同决定,由于没有考虑到后面序列的情况,因此会不准确,后续会有双向循环神经网络解决该问题。
接着给出了前向传播公式及其公式简化,手写熟悉一下即可
1.4 通过时间的反向传播
该节讲反向传播,首先明确一点,同之前的DNN一样,反向传播就是沿着前向传播的反方向链式求导推回去。
下面是前向和反向的详细计算图,首先要做反向传播需要定义一个损失函数,这里使用标准logistics损失函数(交叉熵损失函数),然后把所有时间步的损失累和起来。
具体的实现过程通常交由一些成熟的框架来实现,知道这些大概逻辑即可
1.5 不同类型的循环神经网络
前面几节讲到的这个框架属于Tx=Ty的多对多问题,而还有很多其他的问题需要其他的框架来解决。
- 多对多问题(Tx=Ty)——前面几节讲的,命名实体识别问题
- 多对一问题——情感分类问题,根据电影评论给出评价人认为的电影好坏
- 一对一问题——标准神经网络,不需要RNN
- 一对多问题——序列生成问题,例如音乐生成,给定一个数生成一段音符
根据实际的不同问题,选取最合适的框架去解决问题
1.6 语言模型和序列生成
这里也没有明确说语言模型的定义,反正语言模型的工作就是告诉你某个特定句子出现的概率。
用RNN来生成这样一个语言模型,首先训练集是一个语料库,包含了非常非常非常多的句子,然后对于其中的句子我们要进行标记化,每个单词用一个one-hot向量表示,然后可以用EOS表示句子结尾,标点可以不算。
下面是RNN实现的最基本的框架,首先是从第0个神经网络开始进行的,初始输入的a0和x1都是全0向量,正常情况下预测输出的y1就应该是第一个单词,然后再把y1作为x2输入,即x2=y1,
以此类推。其中y1,y2都是softmax输出,表示当前单词是词典中各个单词的概率,把所有y1,y2,…,yt乘起来就是整个句子的概率,实际上这里有一个条件概率,因为每一次输出都会基于前面的单词输出。
注意,损失函数和交叉熵函数有区别。
1.7 对新序列采样
序列模型创建好以后,为了测试效果,可以进行采样,生成随机的单词序列。
上面是基于词汇的RNN模型,特殊情况下还可以选择基于字符的RNN模型:
优点:不会产生未知标识
缺点:往往序列太长,计算成本高
1.8 带有神经网络的梯度消失
前面章节谈到过梯度消失和梯度爆炸,这往往是由于神经网络层数过大,反向传播的误差不能很好地传到最前面层。RNN中同样有该问题,序列比较长,神经网络层数就会很多,一样容易发生梯度消失和梯度爆炸。
梯度爆炸就是参数呈指数级增长,它比较容易发现,结果中会出现很多NaN或数字0。可以使用梯度修剪来解决,即观察梯度向量,太大时适当缩放。
梯度消失就是参数呈指数级下降,这个很难发现,后面小节会讲如何解决。
1.9 GRU单元
首先,给一个RNN每个隐层的可视化图:
GRU就是利用门控循环单元来捕捉各隐藏层间的深层连接,有效解决梯度消失问题。
首先举一个例子,比如一个比较长的英文句子,例如:
The cat,… …,was full
The cats,… …,were full
中间省略号是一个比较长的从句,RNN网络需要很好地识别到单复数问题,以便确定从句结束后是用was还是were,而由于中间从句太长,RNN序列会很长,梯度消失问题发生后就容易出现单复数错误。
具体到上述问题来讲GRU更容易理解:由于中间序列过长,扫描到后面RNN就不记得前面是单数还是复数了,因此我们需要记住前面的主语单复数。引入一个记忆细胞变量c,c专门用来记忆单复数(针对该问题),还需要一个门变量gamma-u,其范围在0-1之间,gamma的作用是决定c在什么时候进行更新,因为如果这个主语对应谓语扫描完了,就不需要再标记它了。此外,还有一个变量c~(tlide),这个是作为c的候选值,作为更新以后的值。
完整的GRU还需要加一个gamma-r参数,其作用是衡量候选c和前一时刻c之间的相关性
1.10 长短期记忆(LSTM)
LSTM也是一种能够有效捕捉深层连接,并解决梯度消失问题的方法。其与GRU各有千秋,式子上略微更复杂一些,具体使用哪一个根据具体情况。(GRU被使用的更多一些)
LSTM和GRU的主要区别:
- 开始时没有将a<t>赋值给c<t>
- 增设了门控单元,遗忘单元gamma-f和输出单元gamma-o,取消了gamma-r
- 式子上的变化
有一种说法叫做偷窥孔连接,也就是各门控单元的值有时也由c<t>决定,知道概念就行
1.11 双向神经网络
正如1.3节说道,标准的单向RNN在处理句子的每个单词时都只根据了之前序列的单词值来预测,而很多情况下需要后面序列的单词来决定。如下图的Teddy,如果只看前面无法判断其是否是一个人名还是熊名,因此需要双向神经网络。
BRNN双向神经网络的标准框架如下:
注意其和反向传播不是一回事,每个输出y值由所有前后激活值共同决定。
1.12 深层循环神经网络
RNN的深层就是在每个输入与输出之间增加激活单元数。
这个是标准的RNN:
这个是深层的RNN:
注意激活计算的表达式,每一个单元都可以使用GRU或者LSTM,通常3层就算比较深了。
注意有一些情况下可以在输出的地方堆叠很多循环层。