自然语言处理算法

Seq2Seq模型概述

2019-01-12  本文已影响0人  骆旺达

seq2seq序列到序列模型

本文从RNN角度出发,主要是讲述seq2seq模型的原理。

Seq2Seq模型简介

      Seq2Seq模型是输出的长度不确定时采用的模型,这种情况一般是在机器翻译的任务中出现,将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输出的长度就不确定了。如下图所,输入的中文长度为4,输出的英文长度为2。


seq2seq模型

       在网络结构中,输入一个中文序列,然后输出它对应的中文翻译,输出的部分的结果预测后面,根据上面的例子,也就是先输出“machine”,将"machine"作为下一次的输入,接着输出"learning",这样就能输出任意长的序列。
       机器翻译、人机对话、聊天机器人等等对话生成场景人物,这些都是应用在当今社会都或多或少的运用到了我们这里所说的Seq2Seq。
       举个简单的例子,当我们使用机器翻译时:输入(Hello) --->输出(你好)。再比如在人机对话中,我们问机器:“你是谁?”,机器会返回答案“我是某某某”。如下图所示为一个简单的邮件对话的场景,发送方问:“你明天是否有空”;接收方回答:“有空,怎么了?”。

邮箱对话:输入:你明天有空?回复:有,怎么啦?

Seq2Seq结构

       seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。

RNN网络
       而decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的RNN中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。
语义无关seq2seq:语义向量只作初始化参数参与运算

       decoder处理方式还有另外一种,就是语义向量C参与了序列所有时刻的运算,如下图,上一时刻的输出仍然作为当前时刻的输入,但语义向量C会参与所有时刻的运算。


语义相关seq2seq:语义向量参与解码的每一个过程

如何训练Seq2Seq模型

       RNN是可以学习概率分布,然后进行预测,比如我们输入t时刻的数据后,预测t+1时刻的数据,比较常见的是字符预测例子或者时间序列预测。为了得到概率分布,一般会在RNN的输出层使用softmax激活函数,就可以得到每个分类的概率。(在对话生成任务中,即得到词典中每个单词出现的概率)
       Softmax 在机器学习和深度学习中有着非常广泛的应用。尤其在处理多分类(C分类数 > 2)问题,分类器最后的输出单元需要Softmax 函数进行数值处理。关于Softmax 函数的定义如下所示:

S_i=\frac {e^{vi}}{\Sigma^C_i e^{vi}}

       其中,V_i是分类器前级输出单元的输出。i 表示类别索引,总的类别个数为C,表示的是当前元素的指数与所有元素指数和的比值。Softmax 将多分类的输出数值转化为相对概率,更容易理解和比较。我们来看下面这个例子。
       一个多分类问题,C = 4。线性分类器模型最后输出层包含了四个输出值,分别是:
V= \left [ \begin{matrix} -3 \\ 2 \\ -1 \\ 0 \end {matrix} \right ]
       经过Softmax处理后,数值转化为相对概率:(和为1,即被称为归一化的过程)
V= \left [ \begin {matrix} 0.0057 \\ 0.8390 \\ 0.0418 \\ 0.1135 \end {matrix} \right ]
       很明显,Softmax 的输出表征了不同类别之间的相对概率。我们可以清晰地看出,S1 = 0.8390,对应的概率最大,则更清晰地可以判断预测为第1类的可能性更大。Softmax 将连续数值转化成相对概率,更有利于我们理解。 (在对话生成任务中,则输出字典第1个序号代表的单词)

RNN模型

       对于RNN,对于某个序列,对于时刻t,它的词向量输出概率为P(x_t | x_1,x_2,...,x_{t-1}),则softmax层每个神经元的计算如下:
P(x_t ,t| x_1,...,x_{t-1}) = \frac {exp(w_th_t)}{\Sigma^K_{i=1}exp(w_ih_t)}
       其中h_t是当前第t个位置的隐含状态,它与上一时刻的状态及当前输入有关,即h_t=f(h_{t-1},x_t)t表示文本词典中的第t个词对应的下标。x_t表示词典中第t个词;w_t是词权重参数。
       那么整个序列的生成概率就为
p(x) = \Pi^T_{t=1} p(x_t|x_1,...,x_{t-1})
       其表示从第一个词到第T个词一次生成,产生这个词序列的概率。

Seq2Seq模型

       而对于encoder-decoder模型,设有输入序列x_1,x_2,...,x_T,输出序列y_1,y_2,...,y_T,输入序列和输出序列的长度可能不同。那么其实就需要根据输入序列去得到输出序列可能输出的词概率,于是有下面的条件概率,x_1,x_2,...,x_T发生的情况下,y_1,y_2,...,y_T发生的概率等于p(y_t|v,y_1,y_2,...,y_{t-1})连乘,如下公式所示。其中,v表示x_1,x_2,...,x_T对应的隐含状态向量(输入中每个词的词向量),它其实可以等同表示输入序列(模型依次生成y_1,y_2,...,y_T的概率)。
p(y_1,y_2,...,y_T|x_1,x_2,...,x_T) = \Pi^T_{t=1}p(y_t|x_1,...,x_{t-1},y_1,...,y_{t-1})
= \Pi^T_{t=1}p(y_t|v,y_1,...,y_t-1)
       此时,h_t = f(h_{t-1},y_{t-1},v),decode编码器中隐含状态与上一时刻状态、上一时刻输出和状态v都有关(这里不同于RNN,RNN是与当前时刻的输入相关,而decode编码器是将上一时刻的输出输入到RNN中。于是decoder的某一时刻的概率分布可用下式表示,
p(y_t|v,y_1,y_2,...,y_{t-1}) = g(h_t,y_{t-1},v)
       所以对于训练样本,我们要做的就是在整个训练样本下,所有样本的p(y_1,y_2,...,y_T|x_1,...,x_T)概率之和最大。对应的对数似然条件概率函数为\frac {1}{N} \Sigma^N_{n=1} log(y_n|x_n,θ),使之最大化,θ则是待确定的模型参数。

参考:
1、NLP之Seq2Seq:
原文:https://blog.csdn.net/qq_32241189/article/details/81591456
2、深度学习的seq2seq模型:
原文:https://blog.csdn.net/wangyangzhizhou/article/details/77883152
3、Seq2Seq模型简介
原文:https://www.jianshu.com/p/1c6b1b0cd202
4、三分钟带你对 Softmax 划重点
原文:https://blog.csdn.net/red_stone1/article/details/80687921

上一篇下一篇

猜你喜欢

热点阅读