| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> seq2seq发展介绍 -> 正文阅读 |
|
[人工智能]seq2seq发展介绍 |
seq2seq发展介绍因为seq2seq相关介绍博客很多,之前只是通过博客学习,一直没有读过相关论文。虽然通过博客对seq2seq大体框架有所了解,但是对于实现细节和发展并不是很清楚。近日在学习copynet时看到使用了seq2seq作为模型的主体框架,便借此机会对细节发展进行详细了解。 传统的rnn对于输入一个字符预测一个字符这种情况有着不错的使用效果,但对于翻译任务而言,源句子和目标句子常常并不有着相同长度。在这种情况下,传统的rnn将难以胜任,为了解决这个问题,在Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation论文中提出encoder-decoder这种两个rnn模块结合的结构,encoder模块负责将输入序列映射到一个固定长度的概要向量c,decoder模块引入向量c并结合前一时间步的预测结果来进行目标序列的预测。后来因为源句子与目标句子的对齐问题,引入了注意力机制,将由encoder的编码向量直接得到的概要向量c变为根据decoder输入对encoder编码向量进行加权融合得到。之后因为rnn不利于并行计算,开始使用attention进行特征的提取得到输入序列的向量特征。 下面便具体介绍下seq2seq的变迁。 荷角初露传统的rnn网络中,一直存在着这样一个问题,文本生成的输出结果必须要和输入一一对应(输入一个字符,预测一个字符)。这样在生成对联或者诗词这样长度一致的文本时还没什么问题,但当遇到文本摘要/文本翻译/语音识别这种输入序列和输出序列长度不一定相同的情况,就无能为力了。 到了2014年,在Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation中,创造性的提出encoder-decoder结构,由两个模块共同协作完成序列转换任务,一个模块负责编码输入序列的特征,因此将这个模块称为encoder(编码器)。另一个模块负责根据概要向量c进行解码预测目标序列,所以这个模块叫做decoder(解码器)。概要向量c是一个固定维度的包含输入序列上下文信息的向量,此时还没有引入attention(注意力),直接使用输入序列最后一个字符的encoder的隐层状态的非线性变换作为概要向量。 除了提出了encoder-decoder结构,在这篇文章也首次提出了GRU神经网络(模仿LSTM但减少了参数量和计算量)。 下面是encoder模块的具体计算方式: decoder模块整体结构和encoder模块相似,但是在进行隐层状态计算时,除了使用前一时间步的隐层状态向量
h
t
?
1
h^{t-1}
ht?1和预测结果嵌入向量
e
(
y
t
?
1
)
e(y^{t-1})
e(yt?1),还会使用encoder得到的概要向量c。具体计算公式如下所示: encoder-decoder在训练和预测时,使用 黎明前夜上一节介绍的encoder-decoder已经解决了源序列和目标序列不等长的问题,但是在目标序列的生成效果方面仍然不尽如人意。 之后的论文Sequence to Sequence Learning with Neural Networks发现通过上面方法生成概要向量c在进行decoder解码预测阶段时会产生较大的时滞,例如目标序列生成的第一个词对应源序列的第一个词,但是使用的encoder的概要向量c距离源序列的第一个字符的编码向量会经过源序列长度的时间步n。在论文中提出使用倒序输入,正序预测的方式(例如源序列为A,B,C,目标生成序列为A’,B’,C’,则输入为C,B,A,最终得到 同时这篇论文发现使用深层网络进行encoder学习;encoder和decoder使用不同的模型权重和embedding会获得模型效果提升。另外可以在decoder阶段通过 横空出世前面文章已经意识到源序列和目标序列存在时滞问题,同时提出使用倒序输入的方式来解决,但是倒序实际上只能解决目标序列最开始几个字符的时滞问题,对于后面字符的时滞问题依然无能为力。 所以在Neural Machine Translation by Jointly Learning to Align and Translate中认为问题关键在于每次decoder进行预测时都使用同一个概要向量c,在面对长序列时难以将完整的句子信息压缩到概要向量c中。针对这个问题,此文提出使用模型自动搜索的方式(attention)得到与待预测的目标词汇相关的源序列内容的概要向量 c i c_i ci?,而不必强行关注整个输入序列的内容得到概要向量c。 下面我们就具体介绍下如何使用attention来实现动态概要向量
c
i
c_i
ci?的生成。 h j h_j hj?表示输入序列第j个字符对应的encoder的隐层向量表示, e i , j e_{i,j} ei,j?是目标序列中第i个字符对源序列中第j个字符的注意力, α i , j \alpha_{i,j} αi,j?是注意力计算后得到的注意力权重, c i c_i ci?为将输入序列 h = [ h 1 , . . . , h T ] h=[h_1,...,h_T] h=[h1?,...,hT?]根据注意力加权求和得到的概要向量。 v α , W α , U α v_\alpha,W_\alpha,U_\alpha vα?,Wα?,Uα?是随机初始化生成得到的形如 W α ∈ R n × n , U α ∈ R n × 2 n , v α ∈ R n W_\alpha \in \mathbb{R}^{n\times n},U_\alpha \in \mathbb{R}^{n \times 2n},v_\alpha \in \mathbb{R}^n Wα?∈Rn×n,Uα?∈Rn×2n,vα?∈Rn的数字矩阵。
除了使用注意力的方式得到概要向量 c i c_i ci?,本文使用双向循环神经网络(BiRNN)的方式来对源序列进行编码。这样每个向量 h j h_j hj?除了可以获取到源序列第j个字符以前的信息,也可以获取到源序列第j个字符以后的信息。 双向循环神经网络包含正向循环神经网络和负向循环神经网络。正向循环神经网络将源序列按照 x 1 ? > x T x_1->x_T x1??>xT?顺序输入循环神经网络,得到正向隐层状态 ( h → 1 , . . . , h → t ) (\overrightarrow{h}_1,...,\overrightarrow{h}_t) (h1?,...,ht?)。负向循环神经网络将源序列按照 x T ? > x 1 x_T->x_1 xT??>x1?顺序输入循环神经网络得到负向隐层状态 ( h ← 1 , . . . , h ← T ) (\overleftarrow{h}_1,...,\overleftarrow{h}_T) (h1?,...,hT?).我们将正向隐层状态 h → j \overrightarrow h_j hj?和负向隐层状态 h ← j \overleftarrow h_j hj?拼接到一起得到源序列字符 x j x_j xj?的表达向量 h j = [ h ← j ? ; h → j ? ] ? h_j=[\overleftarrow h_j^\top;\overrightarrow h_j^\top]^\top hj?=[hj??;hj??]?。 通过使用attention机制,有效的解决了seq2seq结构中概要向量c和目标序列 x i x_i xi?不匹配的问题,使得seq2seq在长序列转换时也可取得不错的效果。后续谷歌也逐渐将翻译模型从传统统计模型转换成神经网络模型。seq2seq+attention的方式也开始在各个领域开始广泛使用。 下面我们详细介绍下模型细节: 输入和输出: 编码器: 编码器使用双向的循环神经网络进行特征提取。 下面是其中正向状态的计算方式,
h
→
0
\overrightarrow{h}_0
h0?初始状态为0,后续
h
→
i
\overrightarrow{h}_i
hi?由
h
→
i
?
1
\overrightarrow{h}_{i-1}
hi?1?和
h
→
i
 ̄
\underline {\overrightarrow h_i}
hi??加权得到。 h → i  ̄ = t a n h ( W → E x x i + U → [ r → i ⊙ h → i ? 1 ] ) r → i = σ ( W → r E x x i + U → r h → i ? 1 ) z → i = σ ( W → z E x x i + U → r h → i ? 1 ) \underline {\overrightarrow h_i}=tanh(\overrightarrow{W}E_xx_i+\overrightarrow{U}[\overrightarrow{r}_i\odot \overrightarrow{h}_{i-1}])\\ \overrightarrow{r}_i=\sigma(\overrightarrow{W}_rE_xx_i+\overrightarrow{U}_r\overrightarrow{h}_{i-1})\\ \overrightarrow{z}_i=\sigma(\overrightarrow{W}_zE_xx_i+\overrightarrow{U}_r\overrightarrow{h}_{i-1}) hi??=tanh(WEx?xi?+U[ri?⊙hi?1?])ri?=σ(Wr?Ex?xi?+Ur?hi?1?)zi?=σ(Wz?Ex?xi?+Ur?hi?1?) E x ∈ R m × K x E_x \in \mathbb{R}^{m \times K_x} Ex?∈Rm×Kx? 是词嵌入矩阵, W → , W → z , W → r ∈ R n × n , U → , U → z , U → r \overrightarrow W,\overrightarrow W_z,\overrightarrow W_r \in \mathbb{R}^{n\times n},\overrightarrow{U},\overrightarrow{U}_z,\overrightarrow{U}_r W,Wz?,Wr?∈Rn×n,U,Uz?,Ur?是权重矩阵。 ⊙ \odot ⊙为按位元素相乘, σ \sigma σ为激活函数sigmoid。m和n分别表示词嵌入矩阵的维度和隐层状态的维度。 反向状态的计算方式和正向状态计算方式类似,在正向和反向计算中共享词嵌入矩阵 E x E_x Ex?,但是计算时用到的权重矩阵不做共享。 最终合并正向和反向状态得到最终的信息表达 ( h 1 , . . . , h T x ) (h_1,...,h_{T_x}) (h1?,...,hTx??), h i = [ h → i ; h ← i ] h_i=[\overrightarrow h_i;\overleftarrow h_i] hi?=[hi?;hi?]. 解码器: 解码器使用单向循环神经网络,其网络的隐层状态
s
i
s_i
si?计算方式如下: 概要向量
c
i
c_i
ci?每个时间步的计算方式为: **注意:**当固定 c i = h → T x c_i=\overrightarrow h_{T_x} ci?=hTx??时,整个模型便退化成Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation中提出的encoder-decoder模型。 通过解码器的隐层向量 s i ? 1 s_{i-1} si?1?,概要向量 c i c_i ci?和上一步生成的字符 y i ? 1 y_{i-1} yi?1?,我们可以定义目标字符 y i y_i yi?的概率。 p ( y i ∣ s i , y i ? 1 , c i ) ∝ e x p ( y i ? W o t i ) p(y_i|s_i,y_i-1,c_i)\propto exp(y_i^\top W_ot_i) p(yi?∣si?,yi??1,ci?)∝exp(yi??Wo?ti?) 其中 t i t_i ti?为使用单层maxout的隐层, t i = [ m a x { t ~ i , 2 j ? 1 , t ~ i , 2 j } ] j = 1 , . . . , l ? t_i=[max\{\widetilde t_{i,2j -1},\widetilde t_{i,2j}\}]^\top_{j=1,...,l} ti?=[max{t i,2j?1?,t i,2j?}]j=1,...,l?? t ~ i , k \widetilde t_{i,k} t i,k?是向量 t ~ i \widetilde t_i t i?的第k维元素,向量 t ~ i \widetilde t_i t i?的可以通过如下方式计算, t ~ i = U o s i ? 1 + V o E y y i ? 1 + C o c i \widetilde t_i=U_os_{i-1}+V_oE_yy_{i-1}+C_oc_i t i?=Uo?si?1?+Vo?Ey?yi?1?+Co?ci? 当训练时使用 y i = s o f t m a x ( W o t i ) y_i=softmax(W_ot_i) yi?=softmax(Wo?ti?)作为预测值进行训练,输入的字符则使用 y i = a r g m a x ( y i ) y_i=argmax (y_i) yi?=argmax(yi?)的onehot编码输入到下一个字符的预测当中。 参考Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation Sequence to Sequence Learning with Neural Networks Generating Sequences With Recurrent Neural Networks NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 10:22:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |