ml人工智能时代(AI)人工智能

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

2018-03-04  本文已影响252人  c67a5dea0ca4

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

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

#推荐阅读

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

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

上一篇下一篇

猜你喜欢

热点阅读