seq2seq
seq2seq
1.seq2seq(序列到序列模型)简介
对于很多自然语言处理任务,比如聊天机器人,机器翻译,自动文摘,智能问答等,传统的解决方案都是检索式,这对素材的完善程度要求很高,随着深度学习的发展,研究界将深度学习技术应用与自然语言的生成和自然语言的理解的方面的研究,并取得了一些突破性的成果,比如,Sequence-to-sequence (seq2seq) 模型,该技术突破了传统的固定大小输入问题框架,将经典深度神经网络模型运用于翻译与职能问答这一类序列型任务,并在各主流语言之间的相互翻译以及语音助手中人机短问答的应用。
参考资料:Visualizing A Neural Machine Translation Model
2.编码解码模型
seq2seq模型不仅仅是用在NLP中的模型,它的输入也可以是语音信号或者图像表示。
在NLP的任务中,其实输入的是文本序列,输出的很多时候也是文本序列。
这是一个“编码解码器”结构,编码器处理输入序列中的每个元素(在这里可能是1个词),将捕获的信息编译成向量(称为上下文内容向量)。在处理整个输入序列之后,编码器将上下文发送到解码器,解码器逐项开始产生输出序列。
在机器翻译的场景下,是下面这样的。
上下文向量其实就是
输入的数据(文本序列)中的每个元素(词)被编码成一个稠密的向量word embedding
encoder和decoder一般为循环神经网络(RNN),循环神经网络会接受每个位置(时间点)上的输入,同时经过处理进行信息融合,并可能会在某些位置(时间点)上输出。
所以动态地展示整个编码器和解码器。
在更多的时候,为提升效果,会采用一个叫做注意力模型的模型来动态处理和解码
所谓的注意力机制,可以粗略地理解为是一种对于输入的信息,根据重要程度进行不同权重的加权处理(通常加权的权重来源于softmax后的结果)的机制,如下图所示,是一个在解码阶段,简单地对编码器中的hidden states进行不同权重的加权处理的过程。
更详细一点的注意力解码过程如下图所示。
- 带注意力的解码器RNN接收
的嵌入(embedding)和一个初始的解码器隐藏状态(hidden state)。 - RNN处理输入,产生新的隐藏状态向量(h4)。
- attention的步骤:使用编码器隐藏状态(hidden state)和h4向量来计算该时间步长的上下文向量(C4)。
- 把h4和C4拼接成一个向量。
- 把拼接后的向量连接全连接层和softmax完成解码
- 每个时间点上重复这个操作
也可以把这个动态解码的过程展示成下述图所示的过程。
注意力机制可以学习源语言和目标语言之间词和词对齐关系的方式。
3.Attention
seq2seq 是一个Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。
输入: \(x = (x_1,...,x_{T_x})\)
输出: \(y = (y_1,...,y_{T_y})\)
\(h_t = RNN_{enc}(x_t, h_{t-1})\) , Encoder方面接受的是每一个单词word embedding,和上一个时间点的hidden state。输出的是这个时间点的hidden state。
\(s_t = RNN_{dec}(\hat{y_{t-1}},s_{t-1})\) , Decoder方面接受的是目标句子里单词的word embedding,和上一个时间点的hidden state。
\(c_i = \sum_{j=1}^{T_x} \alpha_{ij}h_j\) , context vector是一个对于encoder输出的hidden states的一个加权平均。
\(\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}\) , 每一个encoder的hidden states对应的权重。
\(e_{ij} = score(s_i, h_j)\) , 通过decoder的hidden states加上encoder的hidden states来计算一个分数,用于计算权重(4)
\(\hat{s_t} = tanh(W_c[c_t;s_t])\), 将context vector 和 decoder的hidden states 串起来。
\(p(y_t|y_{<t},x) = softmax(W_s\hat{s_t})\) ,计算最后的输出概率。
其中Encoder的hidden state不一定要作为Decoder的hidden state输入,可以将Decoder的hidden state仅仅做常规初始化。
score
一般有三种score的计算方法
第1种
输入是encoder的所有hidden states H: 大小为(hid dim, sequence length)。decoder在一个时间点上的hidden state, s: 大小为(hid dim, 1)。
第一步:旋转H为(sequence length, hid dim) 与s做点乘得到一个 大小为(sequence length, 1)的分数。
第二步:对分数做softmax得到一个合为1的权重。
第三步:将H与第二步得到的权重做点乘得到一个大小为(hid dim, 1)的context vector。
第2种
输入是encoder的所有hidden states H: 大小为(hid dim1, sequence length)。decoder在一个时间点上的hidden state, s: 大小为(hid dim2, 1)。此处两个hidden state的纬度并不一样。
第一步:旋转H为(sequence length, hid dim1) 与 Wa [大小为 hid dim1, hid dim 2)] 做点乘, 再和s做点乘得到一个 大小为(sequence length, 1)的分数。
第二步:对分数做softmax得到一个合为1的权重。
第三步:将H与第二步得到的权重做点乘得到一个大小为(hid dim, 1)的context vector。
NMT官方Git:https://github.com/tensorflow/nmt
NMT官方Git翻译版本:HTML
tensorflow attention wrapper实现机制
ref : https://tangshusen.me/2019/03/09/tf-attention/
AttentionWrapper实现相对于理解理论更复杂一些。
简而言之,增加了attention layer,将attention算法中得到的context vector与decoder当前输出cell_outputs(即hidden state)通过计算得到一个attention向量。当attention layer没有指定时,attention向量直接取context vector(即,算法理论中的计算方式)。
增加了cell_input_fn,将上一步的attention向量与当前步的inputs,联合成新的cell_inputs。
attention mechanism:输入decoder的cell_outputs(即hidden state),与memory(encoder的hidden state)计算alignments(权重)
Code Demo
对联生成 -- dir
诗歌生成 -- dir
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!