【AI笔记】认识循环神经网络(RNN)
RNN,全称是Recurrent Neural Network,中文名循环神经网络,在NLU上运用很多。
以下内容根据台大李宏毅教授的课件整理而成
链接:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html
先不讲RNN的结构,首先抛个问题
一、Chatbot是怎么实现的?
1. Slot Filling
先看一个日常生活中的例子
当你用小米手机语音call小爱同学,让她帮你设定闹钟的时候,实际发生的事情如下

步骤:
1)将用户的语音转化为文字
2)分析文字内容,进行填槽(Slot Filling)
3)根据填槽结果,执行命令
4)反馈结果到界面
这里的Slot Filling,中文称为填槽,将句子的内容的文字填写到正确的槽中,这个过程就是我们需要去训练Machine实现的。
训练填槽,实际就是Train一个CNN,我们希望
input:闹钟和下午五点的时候
期望output:闹钟是行为,下午五点是时间(能正确的填槽)

2. Slot Filling存在的问题
利用CNNtrain的时候,存在一个问题,CNN没有memory(记忆)
例如当我们分别input
“我想要加糖的咖啡”
“我不想要加糖的咖啡”
如果机器仅仅识别出了“糖”和“咖啡”,填槽结果相同,即使这两句话表达的意思是完全不同的,但是得出的结果是相同的,这显然有问题!
我们除了要让machine认出“糖”和“咖啡”,还要让他知道句子中的其他内容是会影响到填槽的结果,需要machine能记住句子前面的内容。
又比如,当我们和machine说
“给我推荐一顶帽子”
M:“好的”
“白色的”
M:“我不知道你在说什么?”
“…”
人类正常的对话中,后来的语句是可以补充,修改前面的语句,但是machine如果没有memory,就会不知道多个语句之间的关系,体验会很差。
所以我们希望machine也能记住句子后面的内容。
怎么实现呢?RNN来了。
3. RNN的粗线
RNN是一种特殊的CNN,引入了Store来存储信息

每一次都将前一次RNN的结果,带入到下一次RNN的隐层中,一起train。
例如
“Leave Taipei on November 2nd”

这样即使一个句子中,11月2号离开台北和11月2号回到台北,填槽都是“11月2号”和“台北”,但是最终的结果是不同的
二、RNN的类型
RNN可以分类两类,一种是
· simple RNN
· Long short term memory
1. Simple RNN
上文中提到的,采用sort存储信息,然后将信息带入到下一次的RNN的隐层的做法,就是simple RNN
1)按输入的前后向分类
按照语言顺序分类
- 前向RNN

即只将语句前部分的内容不断的向后一个RNN传递,但这样带来的缺陷是位于句子后半部分的内容没法影响前半部分。
- 双向RNN

Bidirectional RNN是先正向一次,再反向一次,将两者的store混合,再扔入NN中在来一次,好处是看的内容比较广,即考虑了句子的前部分,也考虑了句子的后部分。
2)按存储结果的不同输入到不同的隐藏层
- Elman Network
将上一隐层的结果传入到下一个RNN的隐层

- Jordan Network
将上一output的结果传入到下一个RNN的隐层

3) 缺点
simpleRNN有两个缺点
- 记忆非常短期
第一个隐层的Store内容输入到第二个隐层后,store内的内容是会被改写的,再给到第三个隐层的store的内容,实际是混合的第一和第二个隐层。
换个角度讲,第一个隐层的store的内容在往后传递的时候,影响是逐渐减弱的,也可以理解为simpleRNN的记忆是非常短期的,很快就给改写了。
- 没法控制Store内的内容
第二个缺陷,一个语句中并不是所有的内容都应该写入到Store中影响整个语句。
例如
“我想要加糖的咖啡”
句子中的“我”“的”这些词实际对整体影响是不大的,但是都会写入到store中,所以simpleRNN也没法控制store的内容。
如何解决以上的问题?
是时候祭出大杀器了——Long short term memory
2. Long short term memory(LSTM)
LSTM结构如下

不同于store直接存入的结构,LSTM由4个输入一个输出组成
1)input,就是外界要存入memory的内容
2)input gate,控制存入门的开关
3)forget gate,控制是否清空memory的开关
4)output gate,控制是否输入memory的开关
5)output,输入memory的内容到其他的隐层
有了以上的结构,就能控制只将重要的内容存入到memory中,不重要的内容不存入,需要的时候输出,必要的时候清空等,十分强大。
所以LSTM解决了上述simpleRNN的两个问题。
LSTM看起来复杂,但实际控制各个gate的参数,是后期machine自己train的过程中学会的,并不需要设定好,并且他是work的!
不过,LSTM也有缺点,因为他的特殊结构,所以所需的参数量是simpleRNN的四倍。
三、RNN的特性
RNN train的时候,Loss波动很大
由于RNN特有的memory会影响后期其他的RNN的特点,梯度时大时小,learning rate没法个性化的调整,导致RNN在train的过程中,Loss是震荡起伏的……

为了解决RNN的这个问题,在train的时候,可以有个clipping的方式,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止飞出去…(居然还能这么操作,66666)
四、RNN的运用
RNN有很广泛的运用,根据input和output的不同,可以分为以下4种
1.一对一的应用
Input is a vector,output is a vector
上文提到的填槽,将每个词都填充指定类型的槽中,就是一对一的应用。
2.多对一的应用
Input is a vector sequence, but output is only one vector
例如分析文字情感

3.多对多的应用
Both input and output are both sequences
例如无码科技做的Readhub

4.超越序列的应用
Input is a vector,but output is beyond sequence
例如输入是语句,输出是对应的语法结构
