【NLP】完全解析RNN, Seq2Seq, Attention注意力机制

 这里仅仅是备份,具体原文章请查看完全解析RNN, Seq2Seq, Attention注意力机制 - 知乎

目录

1.经典的RNN结构

2.Sequence to Sequence模型 

​编辑2.1 Embedding

2.2 Seq2Seq训练问题

3.Attention注意力机制

4.如何向RNN加入额外信息 

参考


循环神经网络RNN结构被广泛应用于自然语言处理、机器翻译、语音识别、文字识别等方向。本文主要介绍经典的RNN结构,以及RNN的变种(包括Seq2Seq结构和Attention机制)。希望这篇文章能够帮助初学者更好地入门。

1.经典的RNN结构

 这就是最经典的RNN结构,它的输入是:

输出为:

也就是说,输入和输出序列必有相同的时间长度!

  

2.Sequence to Sequence模型 

 

在Seq2Seq结构中,编码器Encoder把所有的输入序列都编码成一个统一的语义向量Context,然后再由解码器Decoder解码。在解码器Decoder解码的过程中,不断地将前一个时刻 t−1 的输出作为后一个时刻 t 的输入,循环解码,直到输出停止符为止。

接下来以机器翻译为例,看看如何通过Seq2Seq结构把中文“早上好”翻译成英文“Good morning”:

  1. 将“早上好”通过Encoder编码,并将最后 t=3 时刻的隐藏层状态 h3 作为语义向量。
  2. 以语义向量为Decoder的 h0 状态,同时在 t=1 时刻输入<start>特殊标识符,开始解码。之后不断的将前一时刻输出作为下一时刻输入进行解码,直接输出<stop>特殊标识符结束。

当然,上述过程只是Seq2Seq结构的一种经典实现方式。与经典RNN结构不同的是,Seq2Seq结构不再要求输入和输出序列有相同的时间长度!

进一步来看上面机器翻译例子Decoder端的 t 时刻数据流,如图7:

2.1 Embedding

还有一点细节,就是如何将前一时刻输出类别index(数值)送入下一时刻输入(向量)进行解码。假设每个标签对应的类别index如下:

'<start>' : 0,
'<stop>' : 1,
'good' : 2,
'morning' : 3,
...

'<start>' : 0  <-----> label('<start>')=[1, 0, 0, 0, 0,..., 0]
'<stop>' :  1  <-----> label('<stop>') =[0, 1, 0, 0, 0,..., 0]
'hello':    2  <-----> label('hello')  =[0, 0, 1, 0, 0,..., 0]
'good' :    3  <-----> label('good')   =[0, 0, 0, 1, 0,..., 0]
'morning' : 4  <-----> label('morning')=[0, 0, 0, 0, 1,..., 0]
.......

 但是使用one-hot编码进行嵌入过于稀疏,所以我们使用一种更加优雅的办法:

可以看到,其实Seq2Seq引入嵌入机制解决从label index数值到输入向量的维度恢复问题。在Tensorflow中上述过程通过以下函数实现:

tf.nn.embedding_lookup

 而在pytorch中通过以下接口实现:

torch.nn.Embedding

 需要注意的是:train和test阶段必须使用一样的embedding矩阵!否则输出肯定是乱码。

当然,还可以使用word2vec/glove/elmo/bert等更加“精致”的嵌入方法,也可以在训练过程中迭代更新embedding。这些内容超出本文范围,不再详述。embedding入门请参考:

快速入门词嵌入之word2vec - 知乎word2vec是Google在2013年推出的一个工具。word2vec通过训练,可以将所有的词向量化,这样就可以定量的去度量词与词之间的关系,挖掘词之间的联系;同时还可以将词向量输入到各种RNN网络中进一步处理。因此,word2…https://zhuanlan.zhihu.com/p/89637281

2.2 Seq2Seq训练问题

Scheduled Sampling对应文章如下:

https://arxiv.org/pdf/1506.03099.pdf

3.Attention注意力机制

在Seq2Seq结构中,encoder把所有的输入序列都编码成一个统一的语义向量Context,然后再由Decoder解码。由于context包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个Context可能存不下那么多信息,就会造成精度的下降。除此之外,如果按照上述方式实现,只用到了编码器的最后一个隐藏层状态,信息利用率低下。

所以如果要改进Seq2Seq结构,最好的切入角度就是:利用Encoder所有隐藏层状态解决Context长度限制问题。

接下来了解一下attention注意力机制基本思路(Luong Attention)

 

那么到底什么是LuongAttention注意力机制?

文献:https://arxiv.org/abs/1508.04025

 

 

4.如何向RNN加入额外信息 

 Attention机制其实就是将的Encoder RNN隐藏层状态加权后获得权重向量 ct ,额外加入到Decoder中,给Decoder RNN网络添加额外信息,从而使得网络有更完整的信息流。

特别说明:上文介绍的LuongAttention仅仅是注意力机制的一种具体实现,不代表Attention仅此一种。事实上Seq2Seq+Attention还有很多很玩法。望读者了解!

参考

完全解析RNN, Seq2Seq, Attention注意力机制 - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值