李宏毅ML笔记11:RNN

编程入门 行业动态 更新时间:2024-10-09 23:17:54

李宏毅ML<a href=https://www.elefans.com/category/jswz/34/1770047.html style=笔记11:RNN"/>

李宏毅ML笔记11:RNN

目录

应用例子Slot Filling

向量表示词汇

1-of-N encoding

Beyond 1-of-N encoding

Feedforward Network

Recurrent Neural Network

RNN处理Slot Filling的流程

RNN架构的不同设计

LSTM

LSTM 3 闸门

Memory Cell

LSTM 过程演示

对比普通NN

LSTM流程

RNN 训练

训练目标

训练问题

问题原因

解决办法

其他应用

多对一

多对多

语音识别

Seq2Seq

Attention-based Model

DL与Structured Learning对比


一般说RNN, 指的就是LSTM.

应用例子Slot Filling

在智能客服、智能订票系统中,往往会需要slot filling(自动填充)技术,分析用户说出的语句,将有效关键词填到对应的slot槽,并过滤掉无效的词语. 如:

Destination

Taipei

time of arrival:

November 2nd

放入网络之前, 词汇要转化成vector.

向量表示词汇

1-of-N encoding

独热编码

用一个字典lexicon, 其中每个词对应向量中一个维度(0/1). 向量的长度等于字典的大小.

lexicon = {apple, bag, cat, dog, elephant}

apple = [ 1  0  0  0  0]

bag = [ 0  1  0  0  0]

cat = [ 0  0  1  0  0]

dog = [ 0  0  0  1  0]

elephant = [ 0  0  0  0  1]

Beyond 1-of-N encoding

独热编码的改进

1.增加一个Other维度, 存放未在字典中图像.

 2. word hashing

将字母组合作为向量维度, 则不存在出现字典未含词问题.

Feedforward Network

向量表示词汇后,可放入Feedforward Neural Network分析词汇.

输入: vector, 代表词

输出: 概率分布, 包括词属于每个solt的概率(离开时间time of departure, 目的地Destination).

但这不够, 对于以下两句话:

arrive     Taipei     on     November     2nd

leave     Taipei     on     November     2nd

其输入Taipei相同, 输出概率也相同, 无法区分出“Taipei”是出发地还是目的地.

希望神经网络有记忆,在看到“Taipei”时,还记住已经看过的“arrive”或是“leave”,根据上下文判断. 即Recurrent Neural Network(RNN).

Recurrent Neural Network

RNN隐藏层产生的output都会被存到memory(记为a),下次该隐藏层有input,神经元就会将输入和a一起考虑.

假设有一个RNN, 其所有权重w=1, b=0, 所有激活函数都是线性的.

输入序列为:

$$ \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix}\begin{bmatrix} 1 \\ 1 \\ \end{bmatrix}  $$

进行第一次输入:

在input之前,先给内存a赋初始值(0).

两个输入神经元值为1,1.

隐藏层接到输入的1,1和memory的0,0. 因为所有的权重w为1, 所以隐藏层输出为2,2.

输出层分别接到这两个2, w=1, 输出为4,4.

并且隐藏层的输出2,2会存储在memory中.

第二次输入:

两个输入神经元值为1,1.

隐藏层接到输入的1,1和memory的2,2. 权重w为1, 所以隐藏层输出为6,6.

输出层分别接到这两个6, w=1, 输出为12,12.

并且隐藏层的输出6,6会存储在memory中.

因为考虑memory存储的临时值,即使输入相同, 在序列中的顺序不同, 输出结果不同. (Changing the sequence order will change the output)

RNN处理Slot Filling的流程

第一个词向量输入RNN,得到“arrive”属于每个slot的概率,memory保存隐藏层得到的输出.

第二个词向量输入RNN,此时隐藏层同时考虑输入和memory中的值,得到“Taipei”属于每个slot的概率,更新memory. 依次类推.

同一个RNN在三个不同时间点被使用了三次,并非是三个RNN.

RNN架构的不同设计

deep: 可以加多个隐藏层(多个memory值).

Elman Network:隐藏层输出保存在memory里. (与上例同)

Jordan Network

整个neural network的输出保存在memory.

由于隐藏层没有明确的训练目标,而整个NN具有明确的目标,Jordan Network的表现会更好一些.

 Bidirectional RNN

双向RNN. 训练一对正向(从前向后读)和反向(从后向前读)的RNN,把同一个对应的隐藏层输出接给一个output layer.

Bi-RNN优点: 视野较广,上文+下文,相当于看了整个句子才决定分配到哪一个槽.

LSTM

改进memory的管理方式(对删改查进行约束),即长短期记忆LSTM (Long Short-term Memory). 名字中-(连字符Dash)的位置: 理解为比较长的短期记忆,因此是short-term,而非是long-short term

LSTM 3 闸门

1.input gate: 神经元输出写进memory cell前,经过input gate的闸门. 关闭则无法被写入. 什么时候关闭,由神经网络自己学习到.

2.output gate: 决定外界是否可以从memory cell中读取值,关闭则无法被读取.

3.forget gate: 决定是否把memory cell内容忘记清空

该结构4个input,1个output:

4个input=将存入memory cell的值+input gate/output gate/forget gate信号

1个output=将从memory cell读取的值

Memory Cell

从表达式的角度看LSTM的Memory Cell.

初始状态:

$$ z $$

存到cell里的输入值(标量)

$$ z_i $$

操控input gate的信号

$$ z_o $$

操控output gate的信号

$$ z_f $$

操控forget gate的信号

$$ c $$

原先存在memory的值

计算过程:

以上5个值,分别经过激活函数(一般用sigmoid function,其输出在0~1之间,代表gate被打开的程度).

其中, 通过激活函数后的输入值与Input Gate相乘, 控制数据是否能被写入.

原memory值与Forget Gate相乘, 控制原数据是否被遗忘(Forget Gate=0时遗忘).

所得新memory值与Output Gate相乘, 控制输出a是否读取memory值.

$$ c^{'} = g\left( z \right)f\left( z_{i} \right) + cf\left( z_{f} \right) $$

更新memory值

$$ a = h\left( c' \right)f\left( z_{o} \right) $$

output值

LSTM 过程演示

(人体LSTM)假设网络中只有一个LSTM cell,单元 input 3维, output 1维.(与整个网络的input , output不同).

x1

将写入memory的值

x2(input gate/forget gate同时开, 同时关)

1则input gate打开, 将x1写入

-1则forget gate关闭, memory清0

x3

1则output gate打开, memory中值输出

memory cell的4个输入都是标量, 这些标量是上方的3维vector作线性变换(wi*xi+b)所得. 其中w, b的值为经过训练所得.

假设cell中激活函数g与h皆为线性, memory初始值0.

假设每个gate处的w, b已知:

位置

w,b参数值

含义

传入值处

1, 0, 0, 0

不考虑其他阀门开关, 只接收传入值.

Input Gate

0, 100, 0, -10

x2>0时阀门打开, 否则关闭.

Forget Gate

0, 100, 0, 10

当x2<0时关闭阀门(清零), 否则打开(不清零).

Output Gate

0, 0, 100, -10

x3>0时打开阀门(输出), 否则关闭.

输入第一组x:

每个gate的激活函数输入值, 都是x[3,1,0,1]与对应weight相乘.

得更新memory为3, 输出y为0.

以此类推, 输入各组值(此次forget gate关闭):

对比普通NN

把LSTM整体看做一个神经元.

有的机器(NN)插一个电源线就能跑:

有的机器(LSTM)要插四个电源线才能跑:

当神经元数量一样, LSTM需要4个input, 4倍参数.

LSTM流程

一排LSTM作为neuron,每个LSTM的cell存一个scalar值,所有scalar一个vector. 记t时刻的该scalar vector:

$$ c^{t-1} $$

在时间点t,输入vector x^t,乘上matrix,转换得vector z, z每个dimension代表操控每个LSTM的输入值.

同理经过不同的转换得到4个vector,得到操控每个LSTM的门信号:

单个LSTM的input由4个vector中各自的1维组成,每个LSTM cell所得input不同,但可以一起共同运算:

上流程图的红蓝圆圈代表加/乘操作.

上述的过程反复进行,得在各时间点, 同一个LSTM值的变化情况.

常用的一般是peephole LSTM:

连接时需要把hidden layer的最终输出以及当前cell的值都连接到下一个时间点的输入上. 这3个vector并在一起,乘上4个不同的转换矩阵,得到LSTM的4个输入值

 以上为单个LSTM, 现实中多层LSTM, 左边两个LSTM代表了两层叠加,右边两个则是它们在下一个时间点的状态.

Keras 可以调用LSTM, GRU, SimpleRNN层.

RNN 训练

训练目标

训练需要定义Loss Function来评估模型表现. 选用loss最小的模型.

以Slot Filling为例:

输入句子

arrive     Taipei     on     November     2nd

标记label

other     dest     other     time     time

标记对应一个reference vector, 其中代表该词类别的维度为1, 其他为0.

将句子放入网络训练, 输出也得到一个代表预测slot类别的vector.

把model的输出与reference vector求交叉熵.

RNN的output和reference vector的cross entropy之和就是损失函数,即最小化目标.

训练问题

发展太酷了, 09年时候还是第一批RNN, 全部手刻, 现在就有这么多套件了.

RNN训练也用梯度下降法,为了计算方便,采取反向传播(Backpropagation)的进阶版BPTT算法,Backpropagation through time. 比BP多些时间维度信息.

RNN训练很可能会遇到loss剧烈抖动,在某个时刻跳到无穷大,导致程序运行失败(NAN).

RNN的误差曲面在某些地方非常平坦,在某些地方又非常的陡峭.

z轴代表loss,x轴和y轴代表两个参数,可以看到loss在某些地方非常平坦,在某些地方又非常的陡峭.

如果由于参数的细微变化跳到悬崖上方,则导致loss上下抖动得非常剧烈.

如果正好踩在悬崖上,梯度极大. 加上之前太平坦, 更新步长(learning rate)很大,gradient*learning rate就起飞(NaN, Segment Fault).

这个问题可用Clipping方法暴力解决, 如:

if gradient>15

       gradient=15

问题原因

不是sigmoid function的问题, 因为激活函数换成ReLU效果还更差.

把参数(w)做微小变化, 观察输出变化, 可以测出梯度大小.

以全世界最简单RNN为例:

假设RNN只含1个linear 的neuron,input和output的weight都是1,没有bias. memory值接到下一时刻的input的weight是w.

按照时间点顺序输入[1, 0, 0, 0, ..., 0]. 则第1个时间点输入1时,第1000个时间点输出w^999.

w

𝑦1000= w^999

1

1

1.01

20000+

0.99

0

0.01

0

w从1->1.01,y从1变到了20000,梯度很大.

w从0.99->0.01,几乎没有变化,梯度很小.

gradient时大时小,误差曲面尤其1周围很崎岖,很难调整learning rate.

该现象原因: 同样的东西w在时间转换的时候反复使用. 变化可能完全没有造成影响(影响被缩小), 但一旦有影响, 都无限放大.

出现问题:

梯度消失(gradient vanishing),一直在梯度平缓的地方停滞不前.

梯度爆炸(gradient explode),梯度改变太大导致直接飞出有效区间.

解决办法

梯度消失

RNN换成LSTM可解决梯度消失(使用最广泛). 能把误差曲面平坦部分梯度恢复到比较大, 但无法解决梯度爆炸. 但由于梯度一直大,因此可以放心设小learning rate.

LSTM解决梯度消失原因:

(花书: LSTM引入了自循环self-loops使得梯度可以flow for long duration)看不懂.

rnn中ht在时间轴上不断累乘wh,而LSTM记忆单元只是forget一部分后加上一部分. Rnn是連乘后直接替换,lstm是累加不会导致梯度消失,保存了参数的低阶项.

但要加大bias, 保证Forget Gate在大多数情况打开(清除次数少).

其他处理梯度消失技术:

Clockwise RNN

SCRN(Structurally Constrained Recurrent Network)

过拟合

GRU (Gated Recurrent Unit),只有两个gate(LSTM有3个), 模型简单, 容错性比LSTM好,不容易过拟合. 精神是旧的不去,新的不来,把input gate和forget gate联动,当forget gate把memory里的值清空时,input gate才会打开,再放入新的值.

(上一节LSTM流程演示举的例子是 input gate打开时, forget gate打开, 保存下新值.)

神奇方法Vanilla RNN

如果是随机选取初始(Initialized)点, 激活函数用ReLU表现不太好,

但用identity matrix 单位矩阵初始化, 比原LSTM表现好很多.

其他应用

一对一

Slot Filling中,输入输出数目一样多. 每个word vector一个slot label.

多对一

输入vector sequence, 输出一个vector

情感分析Sentiment Analysis

语义情绪分析,爬影片相关的文章,分析其正面/负面情绪.

RNN输入是字符序列(character sequence),在不同时间点输入不同的字符,最后一个时间点输出该文章语义情绪.

关键词分析Key term Extraction

可以分析一篇文章并提取出其中的关键词.

需要把含有关键词标签的文章作为RNN的训练数据.

文章句子作为输入, 通过Embedding layer和RNN把文章读过一次. 最后一个时间点的输出作为attention(注意力机制). 把重要的信息从attention中抽出来, 再放入网络, 得到最后关键词输出.

多对多

语音识别

输入输出都是sequence,且输出sequence比输入sequence短.

输入一段声音信号,每隔一小段时间(0.01s)用1个vector表示,因此输入为vector sequence,输出是character sequence.

用Slot Filling时方法,每个vector对应1个输出的character,识别将有重复冗余结果,可以使用Trimming的技术把重复内容消去.

 (听段子精神饱满: 老师的女朋友所在公司要求编口号, 收到命令的员工是个对公司心怀怨恨的阴阳人, 口号XXX好棒棒, 主管都觉得很好, 但不知道'好棒棒'和'好棒'是不一样的意思>w<)

如何区分“好棒”和“好棒棒”

CTC算法基本思想: 输出不只是字符,还要填充NULL,最后结果去掉NULL就可以得到连词的效果.

CTC训练

输入是一连串Acoustic Features, 输出是字符串++NULL. 并不知道一个字符对应哪几个声音片段. 穷举所有可能的排列, 假设全是对的. (google的语音识别系统用CTC实现)

Seq2Seq

Sequence to Sequence Learning

在Seq2Seq中,输入输出都是sequence,不确定谁长谁短.

比如机器翻译(Machine Translation),将英文的word sequence翻译成中文的character sequence. 不确定长度.

假设RNN在两个时间点分别输入“machine”和“learning”,在最后1个时间点memory就存了整个句子的信息,接下来让RNN输出,就会得到“机”,把“机”当做input,并读取memory里的值,就会输出“器”,依次类推,会一直输出,不会停止. (类似接龙推文)

如何停止输出:

多加一个停止的symbol “===”,当输出到这个symbol时,机器就停止输出.

翻译上用这个方法已经可以达到state of the art的结果.

目前谷歌可以不做语音辨识, 输入一种语言的声音信号, 另一种语言的文字. (.01744v1.pdf)

Beyond Sequence

Seq2Seq还可以用在句法解析(Syntatic Parsing)上,输入一个句子,生成树状的语法结构图.

传统要用structure learning的技术. 现在可以把树状图描述成句子.

Auto-encoder Text 

把文字表示成vector时, 常用bag-of-word. 该方法容易丢失语序信息.

比如“白血球消灭了感染病”和“感染病消灭了白血球”,两者bag-of-word是相同的,但语义却是完全相反的.

Seq2Seq Autoencoder,输入一个word sequence, 通过RNN编码成embedding的vector. 把embedding vector当作decode的输入, 可通过RNN找回一个一模一样的句子. 此时编码(encode)的vector可代表输入句子的重要信息. (考虑语序,把RNN当做编码器和解码器)

另一个版本skip thought, 输出的句子不再是原句子, 而是下一个句子.

 这个结构可以是层次化的,可以分别做vector转换,合并得到整个句子的vector.

word->sentence sequence->document

再解回document-> sentence sequence-> word.

Auto-encoder Speech

Seq2Seq autoencoder用在语音处理,语音信号audio segments (word-level)编码成Fixed-length vector

用处: 语音搜索.

把声音信号(Audio Segment)都转化为vecotr,并通过计算相似度来做语音搜索.

先把声音信号转化成声学特征向量(acoustic features),通过RNN编码,最后一个时间点存在memory里的值就代表了整个声音信号的信息.

还需要训练一个RNN作为解码器,得到还原后的acoustic features sequence,使之差距最小.

 但该部分目前只考虑了声音的相似性, 没有考虑语义的相似性.

seq2seq可以训练Chat-bot聊天机器人. 搜集很多对话/台词, 上句结下句.

Attention-based Model

除了RNN,Attention-based Model也用到memory的思想.

大容量记忆, 提取相关信息, 忽略无关信息.

其中每个vector代表被存储的记忆.

内容输入处理器(DNN/RNN), 处理器操控读头(Reading Head Controller)决定(Reading Head存放的位置. 机器再从这个Reading Head指定位置读取信息.

这个模型的升级版本操控Writing Head Controller决定Writing Head 位置. 机器通过Writing Head写入信息.

 这个过程跟图灵机很像,因此也被称为neural turing machine.

这种方法通常用在阅读理解上,让机器读一篇文章,再把每句话的语义都存到不同的vector中. 给机器提问,神经网络调用读头的中央处理器,读出memory中与查询语句相关的信息,读取的过程可以多次, 在不同地方读. 综合处理之后,可以给出正确的回答.

 Visual Question Answering

看图回答图中有什么.

输入一张图, 用CNN得到每个区域的vector表示.

给机器提问,神经网络调用读头的中央处理器,读出memory中与查询语句相关的信息,给出回答.

Speech Question Answering

托福听力测验, 给音频, 问问题, 选正确选项.

音频转文字, 和question转成语义做语义分析, 做attention找到哪些部分与回答问题有关, 产生答案. 答案也可回去修正attention. 把所得答案与选项计算相似度, 选相似度最高的选项.

不管文章内容直接看问题猜选项的所有简单方法中, 最好的方法是选择与其他三个选项相似度最高的一个选项. 用音频识别的准确率接近1/2.

DL与Structured Learning对比

RNN, LSTM

HMM, CRF, Structured Perceptron/SVM

单向Unidirectional RNN无法考虑整个句子

维特比算法Viterbi考虑了整个句子

损失Cost 与误差error不直接相关

损失Cost是误差error的上界

难以直接对输出标记加特定偏好

可考虑标记间依赖(如连着5个输出同样标记) 可以加特定偏好

Deep

难以叠很多层, 且往往为线性neuron

但这两者可以配合使用, 用RNN/LSTM的输出定义HMM的评估函数.

 语音识别

语音识别时常结合CNN/LSTM/DNN + HMM隐马尔可夫

这样得到的Hierarchies system结果是最好的.

看得不太懂. 后面这项估计是HMM(因为里面有贝叶斯公式).

HMM可以改善output的y1...yl之间independent的问题

Semantic Tagging

Bi-directional LSTM + CRF/Structured SVM

常用Bi-directional LSTM抽出feature, 再拿这些feature给CRF学习

GAN

GAN要考虑3个问题

 GAN可以看作训练structured learning(Energy-Based)的一种方法.

老师的教科书(有中文版):

/

更多推荐

李宏毅ML笔记11:RNN

本文发布于:2024-03-07 08:18:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1717307.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔记   ML   李宏毅   RNN

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!