深度学习笔记之Seq2seq(二)基于Seq2seq注意力机制的动机

这篇具有很好参考价值的文章主要介绍了深度学习笔记之Seq2seq(二)基于Seq2seq注意力机制的动机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

上一节介绍了 Seq2seq \text{Seq2seq} Seq2seq网络常用的基本结构以及在机器翻译任务中,关于目标函数预测概率的描述。本节依然以机器翻译任务为例,对 Seq2seq \text{Seq2seq} Seq2seq中的注意力机制 ( Attention ) (\text{Attention}) (Attention)进行描述。

回顾:基于机器翻译任务的 Seq2seq \text{Seq2seq} Seq2seq网络结构

关于机器翻译任务的 Seq2seq \text{Seq2seq} Seq2seq网络结构表示如下:

深度学习笔记之Seq2seq(二)基于Seq2seq注意力机制的动机
该结构包含编码器 ( Encoder ) (\text{Encoder}) (Encoder)解码器 Decoder \text{Decoder} Decoder两部分。并且它们均是循环神经网络的网络结构。已知在编码器中输入的序列数据 X \mathcal X X表示如下:
X = ( x ( 1 ) , x ( 2 ) , ⋯   , x ( T ) ) T \mathcal X = (x^{(1)},x^{(2)},\cdots,x^{(\mathcal T)})^T X=(x(1),x(2),,x(T))T
通过循环神经网络我们可以得到最终 T \mathcal T T时刻的序列信息 Context \text{Context} Context向量,记作 C \mathcal C C。其中 C \mathcal C C记录了序列数据 X \mathcal X X所有时刻的序列信息

解码器的执行过程中,初始状态下,给定一个初始标识符 ⟨ Start ⟩ \left\langle\text{Start}\right\rangle Start,基于 Encoder \text{Encoder} Encoder读取的序列信息 C \mathcal C C,我们可以求解翻译过程中初始时刻 y ( 1 ) y^{(1)} y(1)的条件概率结果:
其中‘初始标识符’ ⟨ Start ⟩ \left\langle\text{Start}\right\rangle Start本身不包含任何语义信息。这里将其忽略;
y ( 1 ) ⇒ P ( y ( 1 ) ∣ C , ⟨ Start ⟩ ) = P ( y ( 1 ) ∣ C ) y^{(1)} \Rightarrow \mathcal P(y^{(1)} \mid \mathcal C,\left\langle\text{Start}\right\rangle) = \mathcal P(y^{(1)} \mid \mathcal C) y(1)P(y(1)C,Start)=P(y(1)C)
在得到概率分布 P ( y ( 1 ) ∣ C ) \mathcal P(y^{(1)} \mid \mathcal C) P(y(1)C)的同时,我们同样可以得到解码器初始时刻的序列信息 h D ; 1 h_{\mathcal D;1} hD;1

  • 这里以 RNN \text{RNN} RNN为例, LSTM,GRU \text{LSTM,GRU} LSTM,GRU同理。只不过 RNN \text{RNN} RNN的表述能够简单一些。
  • 由于 ⟨ Start ⟩ \left\langle\text{Start}\right\rangle Start中不包含语义信息,因而不希望其对应的权重 W C ⇒ h D ; 1 \mathcal W_{\mathcal C \Rightarrow h_{\mathcal D;1}} WChD;1学习到任何有用的信息,这里将其忽略。
    h D ; 1 = Tanh ( W C ⇒ h D ; 1 ⋅ C + W Start ⇒ h D ; 1 ⋅ ⟨ Start ⟩ ⏟ Delete + b h D ) = Tanh ( W C ⇒ h D ; 1 ⋅ C + b h D ) \begin{aligned} h_{\mathcal D;1} & = \text{Tanh} \left(\mathcal W_{\mathcal C \Rightarrow h_{\mathcal D;1}} \cdot \mathcal C + \underbrace{\mathcal W_{\text{Start} \Rightarrow h_{\mathcal D;1}} \cdot \left\langle\text{Start}\right\rangle}_{\text{Delete}} + b_{h_{\mathcal D}}\right) \\ & = \text{Tanh}( \mathcal W_{\mathcal C \Rightarrow h_{\mathcal D;1}} \cdot \mathcal C + b_{h_{\mathcal D}}) \end{aligned} hD;1=Tanh WChD;1C+Delete WStarthD;1Start+bhD =Tanh(WChD;1C+bhD)

同理,根据 Seq2seq \text{Seq2seq} Seq2seq结构,我们同样可以得到下一时刻 y ( 2 ) y^{(2)} y(2)后验概率分布以及对应时刻的序列信息 h D ; 2 h_{\mathcal D;2} hD;2
y ( 2 ) ⇒ P ( y ( 2 ) ∣ C , y ( 1 ) ) h D ; 2   = Tanh ( W h D ; 1 ⇒ h D ; 2 ⋅ h D ; 1 + W y ( 1 ) ⇒ h D ; 2 ⋅ y ( 1 ) + b h D ) \begin{aligned} y^{(2)} & \Rightarrow \mathcal P(y^{(2)} \mid \mathcal C,y^{(1)}) \\ h_{\mathcal D;2} \ & = \text{Tanh} \left(\mathcal W_{h_{\mathcal D;1} \Rightarrow h_{\mathcal D;2}} \cdot h_{\mathcal D;1} + \mathcal W_{y^{(1)} \Rightarrow h_{\mathcal D;2}} \cdot y^{(1)} + b_{h_{\mathcal D}} \right) \end{aligned} y(2)hD;2 P(y(2)C,y(1))=Tanh(WhD;1hD;2hD;1+Wy(1)hD;2y(1)+bhD)
以此类推。而最终关于生成序列 Y \mathcal Y Y基于 Context \text{Context} Context向量 C \mathcal C C条件下的联合概率分布 P ( Y ∣ C ) \mathcal P(\mathcal Y \mid \mathcal C) P(YC)可表示为:
P ( Y ∣ C ) = P ( y ( 1 ) , y ( 2 ) , ⋯   , y ( T ′ ) ∣ C ) = P ( y ( 1 ) ∣ C ) ⋅ ∏ t = 2 T ′ P ( y ( t ) ∣ C , y ( 1 ) , ⋯   , y ( t − 1 ) ) \begin{aligned} \mathcal P(\mathcal Y \mid \mathcal C) & = \mathcal P(y^{(1)},y^{(2)},\cdots,y^{(\mathcal T')} \mid \mathcal C) \\ & = \mathcal P(y^{(1)} \mid \mathcal C) \cdot \prod_{t=2}^{\mathcal T'} \mathcal P(y^{(t)} \mid \mathcal C,y^{(1)},\cdots,y^{(t-1)}) \end{aligned} P(YC)=P(y(1),y(2),,y(T)C)=P(y(1)C)t=2TP(y(t)C,y(1),,y(t1))

注意力机制的动机

循环神经网络作为 Encoder \text{Encoder} Encoder产生 Context \text{Context} Context向量的缺陷

如果将解码器各输出的条件概率看做是一个复杂函数 f ( ⋅ ) f(\cdot) f(),各条件概率可表示为如下形式:
除了第一项,虽然后续函数中没有体现出 C \mathcal C C的参与,但实际上,解码器每一个时刻关于 y ( t ) ( t = 1 , 2 , ⋯   , T ′ ) y^{(t)}(t=1,2,\cdots,\mathcal T') y(t)(t=1,2,,T)的生成过程均有 C \mathcal C C的参与,因为 h D ; 1 , h D ; 2 , ⋯ h_{\mathcal D;1},h_{\mathcal D;2},\cdots hD;1,hD;2,内均有 C \mathcal C C参与运算。
y ( 1 ) ⇒ P ( y ( 1 ) ∣ C ) = f ( C ) y ( 2 ) ⇒ P ( y ( 2 ) ∣ y ( 1 ) , C ) = f ( y ( 1 ) , h D ; 1 ) ⇒ f ( y ( 1 ) , C ⏟ from  h D ; 1 ) y ( 3 ) ⇒ P ( y ( 3 ) ∣ y ( 1 ) , y ( 2 ) , C ) = f ( y ( 2 ) , h D ; 2 ) ⇒ f ( y ( 2 ) , y ( 1 ) , C ⏟ from  h D ; 2 ) ⋮ \begin{aligned} y^{(1)} & \Rightarrow \mathcal P(y^{(1)} \mid \mathcal C) = f(\mathcal C) \\ y^{(2)} & \Rightarrow \mathcal P(y^{(2)} \mid y^{(1)},\mathcal C) = f(y^{(1)},h_{\mathcal D;1}) \Rightarrow f(y^{(1)},\underbrace{\mathcal C}_{\text{from } h_{\mathcal D;1}}) \\ y^{(3)} & \Rightarrow \mathcal P(y^{(3)} \mid y^{(1)},y^{(2)},\mathcal C) = f(y^{(2)},h_{\mathcal D;2}) \Rightarrow f(y^{(2)},\underbrace{y^{(1)},\mathcal C}_{\text{from } h_{\mathcal D;2}})\\ & \quad \quad \quad \quad \quad \vdots \end{aligned} y(1)y(2)y(3)P(y(1)C)=f(C)P(y(2)y(1),C)=f(y(1),hD;1)f(y(1),from hD;1 C)P(y(3)y(1),y(2),C)=f(y(2),hD;2)f(y(2),from hD;2 y(1),C)
因此,有:在生成 y ( t ) ( t = 1 , 2 , ⋯   , T ′ ) y^{(t)}(t=1,2,\cdots,\mathcal T') y(t)(t=1,2,,T)的每一个时刻中,都需要对原始的原始的输入数据 X \mathcal X X进行读取,并生成 Context \text{Context} Context向量 C \mathcal C C
这里描述的重点是:每生成一个 y ( t ) y^{(t)} y(t),都要重新从 Encoder \text{Encoder} Encoder中生成一遍 C \mathcal C C,再对 y ( t ) y^{(t)} y(t)进行翻译。

遗忘问题:但是这个过程的问题在于:由于循环神经网络梯度消失的问题,导致我们从 X \mathcal X X学习的 C \mathcal C C并不准确。这种不准确主要体现在: C \mathcal C C X \mathcal X X初始时刻信息存在遗忘现象

  • 由于梯度消失,导致 C \mathcal C C仅能有效地描述最后‘若干个’时刻的序列信息,对 X \mathcal X X初始时刻的序列信息,它并不能有效地记忆——长距离依赖问题。
  • 我们不否认 LSTM , GRU \text{LSTM},\text{GRU} LSTM,GRU能够缓解这种问题,以 GRU \text{GRU} GRU为例。以时间、空间复杂度的代价,通过‘路径’量的堆积以及‘更新门、重置门’结构的调节,使其有更多的可能将梯度传递给更深(更初始)的时刻。但是随着序列的增长,每一条路径的‘梯度消失现象’是客观存在的。

基于这种现象,可能导致:翻译出来的句子结果仅与 X \mathcal X X后半段信息存在更多关联

对齐问题:在正常的翻译逻辑中,翻译结果与被翻译句子之间,某些词之间存在映射关系。例如:
中文:早上好
英文: Good morning \text{Good morning} Good morning.
很明显,有:
早上 ⇒ morning \Rightarrow \text{morning} morning;
⇒ good \Rightarrow \text{good} good.
但是在 Context \text{Context} Context向量 C \mathcal C C作为解码器的输入,并不能很好地描述这个映射关系。换句话说:由于 C \mathcal C C仅仅描述的是最终时刻的序列信息,如果 C \mathcal C C描述的是早上好这句话的序列信息,无法将早上这两个词从 C \mathcal C C中挑选出来
相当于这个‘固定大小的序列向量’ Context \text{Context} Context将每个词在句子中的序列信息‘混在一起’,单个词相关的序列信息无法‘单独拎出来’。

注意力机制处理上述两种问题

我们基于序列数据 X \mathcal X X学习到的序列信息,如何避免上述两种情况 ? ? ?
一种直观的想法是:在学习过程中,将每一时刻的序列信息 h ( t ) ( t = 1 , 2 , ⋯   , T ) h^{(t)}(t=1,2,\cdots,\mathcal T) h(t)(t=1,2,,T)都存储下来
x ( t ) → h ( t ) ⇒ X → H = ( h ( 1 ) , h ( 2 ) , ⋯   , h ( T ) ) T x^{(t)} \rightarrow h^{(t)} \Rightarrow \mathcal X \rightarrow \mathcal H = (h^{(1)},h^{(2)},\cdots,h^{(\mathcal T)})^T x(t)h(t)XH=(h(1),h(2),,h(T))T
此时在解码过程中不再使用最终 T \mathcal T T时刻序列信息作为 Context \text{Context} Context向量 C \mathcal C C了,因为上述两种问题 C \mathcal C C无法解决。随之而来的是各时刻序列信息组成的矩阵 H \mathcal H H,新的问题随之出现:如何使用 H \mathcal H H取描述/确定 Context \text{Context} Context向量 C ? \mathcal C ? C?

例如如下的翻译例子:
中文:我 是 一名 演员
期望的翻译结果
英文: I am an actor \text{I am an actor} I am an actor.

首先观察 am \text{am} am这个词,它在编码前的中文对应的这个词,也就是说:这个词对翻译结果 am \text{am} am的作用很大。另一个问题:翻译结果为 am \text{am} am,对这个翻译结果产生贡献的仅仅只有[]这一个词吗 ? ? ?

在这里明显不是。 am \text{am} am在英语中是 be \text{be} be动词的一种,一般用来表示[]这个意思, be \text{be} be动词有好多种( am,is,are,was,were , ⋯ \text{am,is,are,was,were},\cdots am,is,are,was,were,),为什么这里要选择 am ? \text{am}? am?因为:输入的序列数据 X \mathcal X X中是第一人称——[]

假设从重要程度的角度观察,翻译结果 am \text{am} am关于输入序列数据 X \mathcal X X中各词的重要程度表示如下:
这里的‘重要程度’ 0.3 , 0.7 0.3,0.7 0.3,0.7是假设的结果。

深度学习笔记之Seq2seq(二)基于Seq2seq注意力机制的动机
这仅仅是从句子逻辑的角度考虑的,那换成向量 ? ? ?由于 h ( 1 ) , h ( 2 ) , ⋯ h ( T ) ∈ H h^{(1)},h^{(2)},\cdots h^{(\mathcal T)} \in \mathcal H h(1),h(2),h(T)H中, h ( t ) h^{(t)} h(t)所包含的序列信息也包含前面 t − 1 t-1 t1个时刻的序列信息,只不过因遗忘的因素存在, t t t越来越大,初始时刻保留的信息越来越少而已。将上述信息用向量进行表示,具体的重要程度分布表示如下:
这里比例设置得可能不太平衡,这仅是一个示例。

深度学习笔记之Seq2seq(二)基于Seq2seq注意力机制的动机
至此,可以认为:解码器预测的结果是基于编码器各时刻隐状态的共同结果,只不过不同隐状态对应的权重比率不同而已。从而针对这些向量进行加权求和
C 2 = C am ⇒ 0.2 ∗ h ( 1 ) + 0.7 ∗ h ( 2 ) + 0.05 ∗ h ( 3 ) + 0.03 ∗ h ( 4 ) + 0.02 ∗ h ( 5 ) \mathcal C_2 = \mathcal C_{\text{am}} \Rightarrow 0.2 * h^{(1)} + 0.7 * h^{(2)} + 0.05 * h^{(3)} + 0.03 * h^{(4)} + 0.02 * h^{(5)} C2=Cam0.2h(1)+0.7h(2)+0.05h(3)+0.03h(4)+0.02h(5)
这种基于加权求解解码器输出的方式相比于之前之前所有输出均基于 Context \text{Context} Context向量 C \mathcal C C的方式而言,能够得到更有注意力偏向的结果。
这里同样可以例举一个 an \text{an} an的例子。 an \text{an} an是不定冠词,为什么不选择 a \text{a} a而是选择 an \text{an} an——很明显,其后面第一个词是 actor \text{actor} actor,开头是元音字母。因此 an \text{an} an的生成从句子角度观察与[一名],[演员]两个词都有关联关系,这里就不展开描述了。

两者最明显的区别在于:每一个词均有不同的注意力偏向,即不同的 Context \text{Context} Context向量与其对应 ( C 1 , C 2 , ⋯   ) (\mathcal C_1,\mathcal C_2,\cdots) (C1,C2,)。从而不再共用同一个 Context \text{Context} Context向量 C \mathcal C C
这里两种方式做一个比对。
{ y ( 1 ) = f ( C ) y ( 2 ) = f ( y ( 1 ) , C ) y ( 3 ) = f ( y ( 1 ) , y ( 2 ) , C ) ⋮ ⟺ { y ( 1 ) = f ( C 1 ) y ( 2 ) = f ( y ( 1 ) , C 2 ) y ( 3 ) = f ( y ( 1 ) , y ( 2 ) , C 3 ) ⋮ \begin{aligned} \begin{cases} y^{(1)} & = f(\mathcal C) \\ y^{(2)} & = f(y^{(1)},\mathcal C) \\ y^{(3)} & = f(y^{(1)},y^{(2)},\mathcal C) \\ & \vdots \\ \end{cases} \Longleftrightarrow \begin{cases} y^{(1)} & = f(\mathcal C_1) \\ y^{(2)} & = f(y^{(1)},\mathcal C_2) \\ y^{(3)} & = f(y^{(1)},y^{(2)},\mathcal C_3) \\ & \vdots \\ \end{cases} \end{aligned} y(1)y(2)y(3)=f(C)=f(y(1),C)=f(y(1),y(2),C) y(1)y(2)y(3)=f(C1)=f(y(1),C2)=f(y(1),y(2),C3)

权重系数求解

针对上面描述,我们确定了针对不同的解码输出,从而对编码部分构建不同的注意力偏向。问题在于:这个偏向,也就是各时刻序列信息的权重系数/权重比例如何求解:

依然以上面的我 是 一名 演员 。 ⇒ I am an actor . \Rightarrow \text{I am an actor .} I am an actor .为例。假设 t = 2 t=2 t=2时刻要预测 am \text{am} am这个单词,如何给原始各时刻的序列信息 h ( 1 ) , h ( 2 ) , h ( 3 ) , h ( 4 ) , h ( 5 ) h^{(1)},h^{(2)},h^{(3)},h^{(4)},h^{(5)} h(1),h(2),h(3),h(4),h(5)分配权重 ? ? ?

一种朴素的想法:

  • 在解码过程的 t ( t = 1 , 2 , ⋯   , T ′ ) t(t=1,2,\cdots,\mathcal T') t(t=1,2,,T)时刻,选择该时刻的一个向量 Q t \mathcal Q_t Qt
  • Q t \mathcal Q_t Qt分别与编码器各时刻的序列信息 h ( i ) ( i = 1 , 2 , ⋯   , T ) h^{(i)}(i=1,2,\cdots,\mathcal T) h(i)(i=1,2,,T)进行比较,计算它们之间的相似度结果 Score ( Q t , h ( i ) ) \text{Score}(\mathcal Q_t,h^{(i)}) Score(Qt,h(i)),相似度高的 Score \text{Score} Score数值更大;
  • 最终将个 Score \text{Score} Score结果做一个归一化操作即可。

基于这种想法,关于解码器 t t t时刻,此时 y ( t ) y^{(t)} y(t)还没有被预测出来,那么选择哪一个向量作为 Q t \mathcal Q_t Qt h ( i ) ( i = 1 , 2 , ⋯   , T ) h^{(i)}(i=1,2,\cdots,\mathcal T) h(i)(i=1,2,,T)进行比较呢 ? ? ?

两种思路:

  • 解码器中当前 t t t时刻的上一时刻( t − 1 t-1 t1)的隐状态 h D ; t − 1 h_{\mathcal D;t-1} hD;t1作为 Q t \mathcal Q_t Qt
  • 解码器中当前 t t t时刻的隐状态 h D ; t h_{\mathcal D;t} hD;t作为 Q t \mathcal Q_t Qt

无论 Q t \mathcal Q_t Qt使用哪种选择方式,都被称作查询向量 ( Query ) (\text{Query}) (Query)。这里首先介绍 Score ( Q t , h ( i ) ) \text{Score}(\mathcal Q_t,h^{(i)}) Score(Qt,h(i))的计算方式。

Score \text{Score} Score函数的计算方式

计算两向量之间的相似度,最先想到的就是余弦相似度 ( Cosine Similarity ) (\text{Cosine Similarity}) (Cosine Similarity)。具体做法就是两向量之间做内积
M T N = ( m 1 , m 2 , ⋯ m k ) ( n 1 n 2 ⋮ n k ) = m 1 n 1 + m 2 n 2 + ⋯ + m k n k M , N ∈ R k × 1 \mathcal M^T\mathcal N = (m_1,m_2,\cdots m_k) \begin{pmatrix} n_1 \\ n_2 \\ \vdots \\ n_k \end{pmatrix} = m_1n_1 + m_2n_2 + \cdots + m_kn_k \quad \mathcal M,\mathcal N \in \mathbb R^{k \times 1} MTN=(m1,m2,mk) n1n2nk =m1n1+m2n2++mknkM,NRk×1
内积数值越大,意味着两向量的相似性程度越高;我们仅需要将解码器产生的查询向量 Q t \mathcal Q_t Qt(例如: h D ; t h_{\mathcal D;t} hD;t)与编码器各时刻产生的序列信息 h ( i ) ( i = 1 , 2 , ⋯   , T ) h^{(i)}(i=1,2,\cdots,\mathcal T) h(i)(i=1,2,,T)进行内积即可。

但这种操作的问题在于:需要 Q t \mathcal Q_t Qt h ( i ) h^{(i)} h(i)之间的张量格式相同,否则无法执行内积。这里的张量格式具体指什么 ? ? ?不可否认的是: Seq2seq \text{Seq2seq} Seq2seq模型结构中的 Encoder \text{Encoder} Encoder Decoder \text{Decoder} Decoder是两个独立的循环神经网络结构。这里以单层 GRU \text{GRU} GRU神经网络为例:

已知某 Batch \text{Batch} Batch的数据格式为: [ 100 , 10 , 8 ] [100,10,8] [100,10,8]。其中:

  • 100 100 100表示 BatchSize \text{BatchSize} BatchSize大小;
  • 10 10 10表示文本的序列长度
  • 8 8 8表示每个词的 Embedding \text{Embedding} Embedding维数;

关于 GRU \text{GRU} GRU的参数描述: EmbedSize = 8 \text{EmbedSize = 8} EmbedSize = 8;就是词语 Embedding \text{Embedding} Embedding维数; NumHiddens= 16 \text{NumHiddens= 16} NumHiddens= 16;(这里随意选择的值)表示神经元个数,但是这个参数和输出的序列长度,或者是 RNN \text{RNN} RNN循环次数之间没有任何关系

Seq2seq \text{Seq2seq} Seq2seq基本介绍中提到过,循环神经网络输入与输出的序列长度相同。这也是它无法直接做机器翻译的弊端。同理, NumLayers = 2 \text{NumLayers = 2} NumLayers = 2表示如果是深度循环神经网络,该参数描述神经网络堆叠的层数。观察上述格式数据,进入 GRU \text{GRU} GRU网络后的输出结果:

import torch
from torch import nn as nn

BatchSize = 100
SeqLength = 10
EmbedSize = 8
NumHiddens = 16
NumLayers = 2

x = torch.randn(BatchSize,SeqLength,EmbedSize).permute(1,0,2)
RNN = nn.GRU(EmbedSize,NumHiddens,NumLayers)
Output,State = RNN(x)
print(x.shape)
print(Output.shape,State.shape)

返回结果如下:

torch.Size([10, 100, 8])
torch.Size([10, 100, 16]) torch.Size([2, 100, 16])

可以看出,关于单个时刻的序列信息 State \text{State} State,影响它格式的有 NumLayers,NumHiddens \text{NumLayers,NumHiddens} NumLayers,NumHiddens,但绝对不会有序列长度相关的信息进行影响。
为什么要强调这个~是因为视频中存在一些偶然情况,导致理解错误。
由于是两个独立的循环结构,不同的网络参数也会影响各自 State \text{State} State输出的张量格式,从而导致无法直接求解内积。

这里介绍两种解决方式:

  • 既然 Q t \mathcal Q_t Qt h ( i ) h^{(i)} h(i)之间的张量格式不匹配,通过乘以一个参数矩阵 W Q t \mathcal W_{\mathcal Q_t} WQt,从而使他们的格式匹配,从而进行内积。例如:
    为简化起见,仅使用一个样本进行描述。即 BatchSize=1 \text{BatchSize=1} BatchSize=1并消掉维度;并且 NumLayers = 1 \text{NumLayers = 1} NumLayers = 1,主要观察 NumHiddens \text{NumHiddens} NumHiddens之间的区别。其中 N E n \mathcal N_{En} NEn表示编码器 Encoder \text{Encoder} Encoder NumLayers \text{NumLayers} NumLayers; N D e \mathcal N_{De} NDe表示 Decoder \text{Decoder} Decoder NumLayers \text{NumLayers} NumLayers
    { Q t ∈ R N E n × 1 , h ( i ) ∈ R N D e × 1 W Q t ∈ R N E n × N D e ⇒ [ W Q t ] T Q t ∈ R N D e × 1 \begin{cases} \mathcal Q_t \in \mathbb R^{\mathcal N_{En} \times 1},h^{(i)} \in \mathbb R^{\mathcal N_{De} \times 1} \\ \mathcal W_{\mathcal Q_t} \in \mathbb R^{\mathcal N_{En} \times \mathcal N_{De}}\Rightarrow [\mathcal W_{\mathcal Q_t}]^T \mathcal Q_t \in \mathbb R^{\mathcal N_{De} \times 1} \end{cases} {QtRNEn×1,h(i)RNDe×1WQtRNEn×NDe[WQt]TQtRNDe×1
    降维中介绍过,这实际上就是一种‘特征转换’:将原始向量(未丢失信息)从当前特征空间映射到高维/低维特征空间。基于映射情况来调整 W Q t \mathcal W_{\mathcal Q_t} WQt内向量间的关系。
    最终的内积结果可表示为如下形式:该结果就是编码器 t t t时刻的序列信息 Q t \mathcal Q_t Qt解码器 i i i时刻的生成序列信息 h ( i ) h^{(i)} h(i)相似度结果
    Score ( Q t , h ( i ) ) = [ [ W Q t ] T Q t ] T h ( i ) = [ Q t ] T W Q t h ( i ) \text{Score}(\mathcal Q_t,h^{(i)})= \left[[\mathcal W_{\mathcal Q_t}]^T \mathcal Q_t\right]^T h^{(i)} = [\mathcal Q_t]^T \mathcal W_{\mathcal Q_t} h^{(i)} Score(Qt,h(i))=[[WQt]TQt]Th(i)=[Qt]TWQth(i)
  • 另一种方式就是构建神经网络。将两向量拼接 ( Concatenate ) (\text{Concatenate}) (Concatenate)在一起作为神经网络的输入信息;根据神经网络的通用逼近定理 ( Universal Approximation Theorem ) (\text{Universal Approximation Theorem}) (Universal Approximation Theorem),使其结果返回 Score \text{Score} Score作为输出。
    需要训练的参数就是神经网络中神经元对应的权重信息。

两种方式的主要区别在于:

  • 内积方法是从余弦相似度的角度出发,虽然中间使用 W \mathcal W W执行特征转换,但其结果依然可以表达 Q t \mathcal Q_t Qt h ( i ) h^{(i)} h(i)之间的相关关系
  • 神经网络方法则全权交给通用逼近定理了,无法体现出 Q t \mathcal Q_t Qt h ( i ) h^{(i)} h(i)之间的相关关系

相关参考:
seq2seq与attention机制文章来源地址https://www.toymoban.com/news/detail-491137.html

到了这里,关于深度学习笔记之Seq2seq(二)基于Seq2seq注意力机制的动机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?

    请看vcr:https://transformers.run/back/transformer/

    2024年02月08日
    浏览(43)
  • 从零实现深度学习框架——带Attentiond的Seq2seq机器翻译

    本着“ 凡我不能创造的,我就不能理解 ”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。 要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实

    2024年02月15日
    浏览(96)
  • 机器学习&&深度学习——从编码器-解码器架构到seq2seq(机器翻译)

    👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习深度学习——注意力提示、注意力池化(核回归) 📚订阅专栏:机器学习深度学习 希望文章对你们有所帮助 接下来就要慢慢开始实战了,把这边过了,我们接下来就要进行机器翻译的实战

    2024年02月13日
    浏览(43)
  • 基于transformer的Seq2Seq机器翻译模型训练、预测教程

    机器翻译(Machine Translation, MT)是一类将某种语言(源语言,source language)的句子 x x x 翻译成另一种语言(目标语言,target language)的句子 y y y 的任务。机器翻译的相关研究早在上世纪50年代美苏冷战时期就开始了,当时的机器翻译系统是基于规则的,利用两种语言的单词、

    2024年02月03日
    浏览(40)
  • 【动画详解人工智能原理】Tranformer 模型中的注意力机制的工作过程是怎样的 ?一个带有注意力的 Seq2seq 模型的机制实例视频动画详细讲解

    Seq2seq 序列到序列模型是深度学习模型,在机器翻译、文本摘要和图像字幕等任务中取得了很多成功。谷歌翻译于 2016 年底开始在生产中使用此类模型。两篇开创性论文(Sutskever 等人,2014 年,Cho 等人,2014 年)对这

    2024年02月07日
    浏览(52)
  • 构建seq2seq模型的常见问题

    1. seq2seq模型,输入是一个词向量,而不是词向量列表,对吧? 是的,对于seq2seq模型,输入和输出都需要被转换成词向量形式。 对于输入来说,通常会将一个句子转换成一个词向量序列。具体地,对于每个单词或者字符,都会将其对应成一个词向量,然后将所有词向量按照它

    2024年02月06日
    浏览(38)
  • 【文本摘要(2)】pytorch之Seq2Seq

    改废了两个代码后,又找到了一个文本摘要代码 终于跑起来了 改废的两个代码: 一个是机器翻译改文本摘要,结果没跑起来。。。 一个是英文文本摘要改中文文本摘要,预测的摘要全是,,,这种 代码参考: https://github.com/jasoncao11/nlp-notebook/tree/master/4-2.Seq2seq_Att 跪谢大佬

    2024年02月03日
    浏览(45)
  • Seq2Seq在安全领域的应用实践

    非常感谢您委托我撰写这篇专业的技术博客文章。作为一位世界级人工智能专家、程序员、软件架构师,我会遵循您提供的目标和约束条件,以专业的技术语言,结合深入的研究和准确的信息,为您呈现一篇内容丰富、结构清晰、实用价值高的技术博客文章。 下面我将开始正文的

    2024年04月28日
    浏览(35)
  • Transformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT

    我在写上一篇博客《22下半年》时,有读者在文章下面评论道:“july大神,请问BERT的通俗理解还做吗?”,我当时给他发了张俊林老师的BERT文章,所以没太在意。 直到今天早上,刷到CSDN上一篇讲BERT的文章,号称一文读懂,我读下来之后,假定我是初学者,读不懂。 关于

    2024年02月02日
    浏览(34)
  • 自然语言处理: 第四章Seq2Seq

    开始之前,首先提出一个问题,电脑是怎么识别人类的命令的,首先人们通过输入代码(编码) ,带入输入给计算机然后再经过处理(解码)得到最终的命令。所以可以看到这其实是一个编码 + 解码的过程。可以看到首先我们将初始的信息通过编码,得到涵盖全局的信息的特征然

    2024年02月12日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包