【AI笔记】认识循环神经网络(RNN)

这是 公众号:【朱利安笔记】2018年的原创文章,欢迎关注公众号,定期推送AI产品干货 ~

RNN,全称是Recurrent Neural Network,中文名循环神经网络,在NLU上运用很多。

以下内容根据台大李宏毅教授的课件整理而成

链接:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html


先不讲RNN的结构,首先抛个问题

一、Chatbot是怎么实现的?

1. Slot Filling

先看一个日常生活中的例子

当你用小米手机语音call小爱同学,让她帮你设定闹钟的时候,实际发生的事情如下


【AI笔记】认识循环神经网络(RNN)_第1张图片

步骤:

1)将用户的语音转化为文字

2)分析文字内容,进行填槽(Slot Filling)

3)根据填槽结果,执行命令

4)反馈结果到界面


这里的Slot Filling,中文称为填槽,将句子的内容的文字填写到正确的槽中,这个过程就是我们需要去训练Machine实现的。


训练填槽,实际就是Train一个CNN,我们希望

            input:闹钟和下午五点的时候

            期望output:闹钟是行为,下午五点是时间(能正确的填槽)

【AI笔记】认识循环神经网络(RNN)_第2张图片



2. Slot Filling存在的问题

利用CNNtrain的时候,存在一个问题,CNN没有memory(记忆)


例如当我们分别input

        “我想要加糖的咖啡”

        “我不想要加糖的咖啡”

如果机器仅仅识别出了“糖”和“咖啡”,填槽结果相同,即使这两句话表达的意思是完全不同的,但是得出的结果是相同的,这显然有问题!

我们除了要让machine认出“糖”和“咖啡”,还要让他知道句子中的其他内容是会影响到填槽的结果,需要machine能记住句子前面的内容。


又比如,当我们和machine说

        “给我推荐一顶帽子”

M:“好的”

        “白色的”

M:“我不知道你在说什么?”

        “…”

人类正常的对话中,后来的语句是可以补充,修改前面的语句,但是machine如果没有memory,就会不知道多个语句之间的关系,体验会很差。

所以我们希望machine也能记住句子后面的内容。


怎么实现呢?RNN来了。


3. RNN的粗线

RNN是一种特殊的CNN,引入了Store来存储信息

【AI笔记】认识循环神经网络(RNN)_第3张图片
图自李宏毅教授课程



每一次都将前一次RNN的结果,带入到下一次RNN的隐层中,一起train。


例如

“Leave Taipei on November 2nd”

【AI笔记】认识循环神经网络(RNN)_第4张图片

这样即使一个句子中,11月2号离开台北和11月2号回到台北,填槽都是“11月2号”和“台北”,但是最终的结果是不同的


二、RNN的类型

RNN可以分类两类,一种是

    · simple RNN

    · Long short term memory


1. Simple RNN

上文中提到的,采用sort存储信息,然后将信息带入到下一次的RNN的隐层的做法,就是simple RNN

1)按输入的前后向分类

按照语言顺序分类

- 前向RNN


【AI笔记】认识循环神经网络(RNN)_第5张图片

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


- 双向RNN

【AI笔记】认识循环神经网络(RNN)_第6张图片

Bidirectional RNN是先正向一次,再反向一次,将两者的store混合,再扔入NN中在来一次,好处是看的内容比较广,即考虑了句子的前部分,也考虑了句子的后部分。


2)按存储结果的不同输入到不同的隐藏层

- Elman Network

将上一隐层的结果传入到下一个RNN的隐层

【AI笔记】认识循环神经网络(RNN)_第7张图片

- Jordan Network

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

【AI笔记】认识循环神经网络(RNN)_第8张图片


3) 缺点

simpleRNN有两个缺点

- 记忆非常短期

第一个隐层的Store内容输入到第二个隐层后,store内的内容是会被改写的,再给到第三个隐层的store的内容,实际是混合的第一和第二个隐层。

换个角度讲,第一个隐层的store的内容在往后传递的时候,影响是逐渐减弱的,也可以理解为simpleRNN的记忆是非常短期的,很快就给改写了。


- 没法控制Store内的内容

第二个缺陷,一个语句中并不是所有的内容都应该写入到Store中影响整个语句。


例如

        “我想要加糖的咖啡”

句子中的“我”“的”这些词实际对整体影响是不大的,但是都会写入到store中,所以simpleRNN也没法控制store的内容。


如何解决以上的问题?

是时候祭出大杀器了——Long short term memory


2. Long short term memory(LSTM)

LSTM结构如下

【AI笔记】认识循环神经网络(RNN)_第9张图片

不同于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是震荡起伏的……

【AI笔记】认识循环神经网络(RNN)_第10张图片

为了解决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

例如分析文字情感

【AI笔记】认识循环神经网络(RNN)_第11张图片


3.多对多的应用

Both input and output are both sequences

例如无码科技做的Readhub

【AI笔记】认识循环神经网络(RNN)_第12张图片


4.超越序列的应用

Input is a vector,but output is beyond sequence

例如输入是语句,输出是对应的语法结构

【AI笔记】认识循环神经网络(RNN)_第13张图片



#推荐阅读

-【AI笔记】Chatbot中的填槽(Slot Filling)

-【AI笔记】人工智能的WHAT、HOW及WHY


更多内容,欢迎关注公众号【朱利安笔记】,定期推送AI产品干货 ~

【AI笔记】认识循环神经网络(RNN)_第14张图片

你可能感兴趣的:(【AI笔记】认识循环神经网络(RNN))