/ NLP  

NLP系列

图解seq2seq

1.seq2seq(序列到序列模型)简介

对于很多自然语言处理任务,比如聊天机器人,机器翻译,自动文摘,智能问答等,传统的解决方案都是检索式(从候选集中选出答案),这对素材的完善程度要求很高,随着深度学习的发展,研究界将深度学习技术应用与自然语言的生成和自然语言的理解的方面的研究,并取得了一些突破性的成果,比如,Sequence-to-sequence (seq2seq) 模型,它是目前自然语言处理技术中非常重要和流行的一个模型,该技术突破了传统的固定大小输入问题框架,开通了将经典深度神经网络模型运用于翻译与职能问答这一类序列型任务的先河,并且被证实在各主流语言之间的相互翻译以及语音助手中人机短问快答的应用中有着非常好的表现,我们在这个notebook中主要给大家以动图的方式展示一下seq2seq模型的一些细节。

参考资料:图解seq2seq

seq2seq模型

seq2seq 是一个Encoder–Decoder 结构的网络,它的输入是一个序列,输出也是一个序列, Encoder 中将一个可变长度的信号序列变为固定长度的向量表达,Decoder 将这个固定长度的向量变成可变长度的目标的信号序列。

输入: $x = (x_1,…,x_{T_x})$

输出: $y = (y_1,…,y_{T_y})$

(1) $h_t = RNN_{enc}(x_t, h_{t-1})$ , Encoder方面接受的是每一个单词word embedding,和上一个时间点的hidden state。输出的是这个时间点的hidden state。

(2) $s_t = RNN_{dec}(\hat{y_{t-1}},s_{t-1})$ , Decoder方面接受的是目标句子里单词的word embedding,和上一个时间点的hidden state。

(3) $c_i = \sum_{j=1}^{T_x} \alpha_{ij}h_j$ , context vector是一个对于encoder输出的hidden states的一个加权平均。

(4) $\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}$ , 每一个encoder的hidden states对应的权重。

(5) $e_{ij} = score(s_i, h_j)$ , 通过decoder的hidden states加上encoder的hidden states来计算一个分数,用于计算权重(4)

(6) $\hat{s_t} = tanh(W_c[c_t;s_t])$, 将context vector 和 decoder的hidden states 串起来。

(7) $p(y_t|y_{<t},x) = softmax(W_s\hat{s_t})$ ,计算最后的输出概率。

(1) $h_t = RNN_{enc}(x_t, h_{t-1})$ , Encoder方面接受的是每一个单词word embedding,和上一个时间点的hidden state。输出的是这个时间点的hidden state。

(2) $s_t = RNN_{dec}(\hat{y_{t-1}},s_{t-1})$ , Decoder方面接受的是目标句子里单词的word embedding,和上一个时间点的hidden state。

(3) $c_i = \sum_{j=1}^{T_x} \alpha_{ij}h_j$ , context vector是一个对于encoder输出的hidden states的一个加权平均。

(4) $\alpha_{ij} = \frac{exp(e_{ij})}{\sum_{k=1}^{T_x}exp(e_{ik})}$ , 每一个encoder的hidden states对应的权重。

(5) $e_{ij} = score(s_i, h_j)$ , 通过decoder的hidden states加上encoder的hidden states来计算一个分数,用于计算权重(4)

下一个时间点

(6) $\hat{s_t} = tanh(W_c[c_t;s_t])$, 将context vector 和 decoder的hidden states 串起来。

(7) $p(y_t|y_{<t},x) = softmax(W_s\hat{s_t})$ ,计算最后的输出概率。

在luong中提到了三种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。