RNN

2020-01-13  本文已影响0人  小幸运Q

https://www.jianshu.com/p/2a688b1eaeb3


如果你连续记录球位置的快照,那么你将有足够的信息来做出更好的预测。

image.png

序列数据有很多种形式。音频是一种自然的序列,你可以将音频频谱图分成块并将其馈入RNN。文本也是一种形式的序列,你可以将文本分成一系列字符或一系列单词。

更易懂的解释方法-将该物理结构逻辑摊开

将隐藏状态传递给下一个步骤

短期记忆问题:

短期记忆问题是由臭名昭着的梯度消失问题引起的。由于RNN处理有很多步骤,因此难以保留先前步骤中的信息。正如你所看到的,在最后的时间步骤中,“what”和“time”这个词的信息几乎不存在。短期记忆和梯度消失是由于反向传播的性质引起的。

为了减轻短期记忆的影响,研究者们创建了两个专门的递归神经网络,一种叫做长短期记忆或简称LSTM。另一个是门控循环单位或GRU。LSTM和GRU本质上就像RNN一样,但它们能够使用称为“门”的机制来学习长期依赖。这些门是不同的张量操作,可以学习添加或删除隐藏状态的信息。

RNN种类:

  1. sequence-to-sequence(many-to-many):输入输出都是一个序列。

例如股票预测中的RNN,输入是前N天价格,输出明天的股市价格。

image.png
  1. sequence-to-vector(many-one):输入是一个序列,输出单一向量。

例如,输入一个电影评价序列,输出一个分数表示情感趋势(喜欢还是讨厌)

image.png
  1. vector-to-sequence(one-many):输入单一向量,输出一个序列
image.png
  1. Encoder-Decoder():输入sequence-to-vector,称作encoder,输出vector-to-sequence,称作decoder

这是一个delay模型,经过一段延迟,即把所有输入都读取后,在decoder中获取输入并输出一个序列。这个模型在机器翻译中使用较广泛,源语言输在入放入encoder,浓缩在状态信息中,生成目标语言时,可以生成一个不长度的目标语言序列

image.png

计算流程:

image.png image.png

h_t=f_W(h_{t-1},x_t)

h_t=tanh(W_{hh}h_{t-1}+W_{xh}x_t)

y_t=W_{hy}h_t

loss计算

可以根据每一个输出y得到它对应的Loss,将这些Loss组合在一起就可以得到所需的反向传播的Loss,然后通过随机梯度下降的方式进行反向传播并更新网络中的参数W,这样就完成了整个的训练过程。

反向传播:

image.png

上图中的每次循环都对应着不同的time-step,其算法的名字叫做Backpropagation through time。即对于一个长序列,从第一个时间点计算到最后一个时间点,得到所有Loss之后,从最后一个时间点开始回传,直到到达最初的时间点,同时进行权重更新。这样的算法其实存在一定的问题,当序列过长的时候,一次回传必须要等整个序列完成解码之后才能开始,这样会导致速度变慢,会影响整个模型收敛的速度。

image.png

它的思想是将长序列截断成为多个短序列,然后对这些短序列进行权值更新。这样的好处在于,在对某个长序列进行计算,在中间某个时刻的时候,可以先返回一批梯度对参数进行更新,然后再此基础上对剩余的部分进行计算。这样权值更新的次数会增多,收敛速度也会加快。


RNN语言模型:

对于序列“hello”而言,它由五个字符组成,包含有四类字母——‘h’、‘e’‘l’‘o’,在实际的训练过程中,第一个输入自然是‘h’,然后依次是‘e’、‘l’和‘l’,对于最后一个字符‘o’,则不进行建模。如上图所示,先建立输入层(input layer),然后根据不同的输入得到其隐藏层(hidden layer)状态,即当前隐藏层状态是基于前一隐藏层状态得到的,对于每一个隐藏层,通过计算得到一个输出,该输出代表着当前字符可能生成的下一个字符,这样就得到了上述的计算图。在计算得到输出后,可以根据该输出已经相应的参考答案得到相应的Loss,借此进行参数更新。

image.png

假设拿到的第一个字符是‘h’,但是却不知道该字符的后续字符是什么,然后借助模型,经过隐藏层,得到输出层的输出,通过Softmax对输出进行概率化,然后取其中生成概率最大的字符作为输出。显然在输入字符‘h’时,最后得到的概率最大的字符就是‘e’,然后以此类推,就可以得到“hello”这个序列的预测。整个流程就是通过当前输入的字符预测出下一个字符,最终预测出一个完整的序列。


注意力机制:

注意力机制(Attention Mechanism)在很多任务中对性能有着很大的影响。例如在sequence to sequence model中(第一个sequence指原文,第二个sequence指译文),如下图所示:

image.png

上图中将英文的“I am a student”翻译成法文,在即将生成目标端的词语的时候,RNN模型会将源端的所有信息压缩在一个隐藏层当中,然后将该信息输入下一个sequence中进行翻译的预测。当源端的序列很长的时候,一个隐藏层很难存放这么多源端的信息,这样在信息严重压缩之后,在目标端生成翻译的时候,会导致所需的上下文的信息是不够的。这也是RNN在实际使用中常遇到的一个问题,在目前可以采用下图中的方法进行避免:

image.png

在生成第二个单词(Je已生成,现在在生成第二个单词suis)的时候,根据目标端的隐藏层状态和源端的每一个隐藏层之间做相似度的计算,根据规划得到一个权重的得分,接着生成一个上下文的Attention Layer,借助于这个Attention Layer作用于生成第二个词的过程,进而生成正确的翻译。Attention的这种机制其实是很符合翻译的这种直觉的,即生成每一个词的时候,关注的源端位置是不一样的。在实际的应用中,Attention的这种机制的表现也非常好,这个也解决了RNN在长序列压缩中造成的信息丢失的问题。



上一篇下一篇

猜你喜欢

热点阅读