Encoder-Decoder框架与Attention机制

Attention机制 – 潘登同学的深度学习笔记

Encoder-Decode框架

要了解深度学习中的注意力模型,就不得不先谈 Encoder-Decoder 框架,因为目前大多数注意力模型附着在 Encoder-Decoder 框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。

Encoder-Decoder 框架可以看作是一种深度学习领域的研究模式,应用场景异常广泛。下图是文本处理领域里常用的 Encoder-Decoder 框架最抽象的一种表示

在这里插入图片描述

文本处理领域的 Encoder-Decoder 框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对 < S o u r c e , T a r g e t > <Source,Target> <Source,Target>,我们的目标是给定输入句子 Source,期待通过Encoder-Decoder 框架来生成目标句子 Target。Source 和 Target 可以是同一种语言,也可以是两种不同的语言。而 Source 和 Target 分别由各自的单词序列构成

S o u r c e = ( x 1 , x 2 , … , x m ) T a r g e t = ( y 1 , y 2 , … , y n ) Source = (x_1,x_2,\ldots,x_m) \\ Target = (y_1,y_2,\ldots,y_n) \\ Source=(x1,x2,,xm)Target=(y1,y2,,yn)
Encoder 顾名思义就是对输入句子 Source 进行编码,将输入句子通过非线性变换转化为中间语义表示 C
C = F ( x 1 , x 2 , … , x m ) C = F(x_1,x_2,\ldots,x_m) C=F(x1,x2,,xm)
对于解码器 Decoder 来说,其任务是根据句子 Source 的中间语义表示 C 和之前已经生成的历史信息 y 1 , y 2 , … , y i − 1 y_1,y_2,\ldots,y_{i-1} y1,y2,,yi1来生成i时刻要生成的单词
y i = G ( C , y 1 , y 2 , … , y i − 1 ) y_i = G(C,y_1,y_2,\ldots,y_{i-1}) yi=G(C,y1,y2,,yi1)

  • 每个 yi 都依次这么产生,那么看起来就是整个系统根据输入句子 Source 生成了目标句子 Target。如果 Source 是中文句子,Target 是英文句子,那么这就是解决机器翻译问题的 Encoder-Decoder 框架;
  • 如果 Source 是一篇文章,Target 是概括性的几句描述语句,那么这是文本摘要的 Encoder-Decoder 框架;
  • 如果 Source 是一句问句,Target 是一句回答,那么这时问答系统或者对话机器人的 Encoder-Decoder 框架。由此可见,在文本处理领域,Encoder-Decoder 的应用领域相当广泛。
  • Encoder-Decoder 框架不仅仅在文本领域广泛使用,在语音识别、图像处理等领域也经常使用。比如对于语音识别来说,上图所示的框架完全适用,区别无非是 Encoder 部分的输入是语音流,输出是对应的文本信息;

在这里插入图片描述

Encoder-Decode应用于聊天机器人

聊天机器人是一种many to many的网络拓扑结构,核心还是用Encoder-Decoder对不同长度的序列进行处理

数据预处理

在这里插入图片描述

训练模型

在这里插入图片描述

模型应用

在这里插入图片描述

Attention机制

注意力模型最近几年在深度学习各个领域被广泛使用,无论是图像处理、语音识别还是自然语言处理的各种不同类型的任务中,都很容易遇到注意力模型的身影。

觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。

在这里插入图片描述

简单的描述一下上图,Attention机制主要是在Decoder的地方加了一层Attention Layer,以往Decoder从Encoder中获取的信息只有Encoder最后的隐状态,包含的信息量不够,或者说在做翻译任务的时候,我们拿笼统的一句话去做翻译是效率比较低的,要关注不同语言相同语义的词语的位置信息,如中文: 你好吗? 英文: How are you? 的位置不同,的位置也不同,Attention机制就是解决这种问题的;

所以在每个Dncoder隐状态 S i S_i Si向下一时刻传递的时候,会将 S i S_i Si与Encoder的每一时刻的隐状态 h 1 , … , h n h_1, \ldots, h_n h1,,hn计算相似度, 再将相似度进行softmax归一化操作,得到权重(使得权重之和为1), 再用权重与各个隐状态相乘相加得到 C i C_i Ci, 这个 C i C_i Ci就是Attention Layer的产物,最后将 S i , C i , O u t p u t i − 1 S_i,C_i,Output_{i-1} Si,Ci,Outputi1(上一时刻的输出,这一时刻的输入)进行拼接,再计算得到结果(Encoder的隐状态不会受 C i C_i Ci的影响,只是最终经过FC的时候,拼接了一个 C i C_i Ci)

注意 这里说的下标,与上图标注的有一些偏差,以上图来说,就是 S i , C i − 1 , S i − 1 S_i,C_{i-1},S_{i-1} Si,Ci1,Si1进行拼接;(具体要看S与C从几开始数,如果都是从0开始数的话,上图就是正确的,如果S从0开始数,C从1开始说,那么上文就是正确的,理解即可)

计算相似度矩阵的方式

论文提出的方法

S 0 S_0 S0去计算权重为例

在这里插入图片描述

其中 V T , W V^T,W VT,W都是要计算的矩阵,然后对每个计算出的 α i ~ \tilde{\alpha_i} αi~进行softmax变换,得到 α i \alpha_i αi

更常用的方法

在这里插入图片描述

其中 W K , W Q W_K,W_Q WK,WQ都是要计算的矩阵

Self-Attention机制

前面说的Attention机制是在Encoder与Decoder之间计算相似性的一种方式,关注的点在于两种不同序列的相关关系,而Self-Attention则是在Encoder或Decoder中,取代RNN或者LSTM层的一种机制,因为RNN不能很好的做到并行计算,总是会有序列依赖,导致计算只能串行

在这里插入图片描述

上图就是Self-Attention计算第一个时刻的上下文向量的过程,计算的 b i b_i bi都不依赖于序列信息,可以并行计算

Multi head

Self-Attention的作者认为一组 W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv矩阵还不够爽,于是拿了 j j j W q , W k , W v W^q,W^k,W^v Wq,Wk,Wv,计算 b i , j b_{i,j} bi,j,最后将 j j j组b拼接起来,再乘上矩阵 W O W^O WO得到一个时刻的上下文向量 b i b_i bi

在这里插入图片描述

在这里插入图片描述

Attention与Self-Attention的区别

如下图所示,线越深表示两者关系越紧密,在英语中的area与在法语中的zone的意思是相同的,只是两种语言之间的语法有区别(我猜的…),所以Attention是用于解决Decoder应该侧重学习Encoder的哪些方面的问题

在这里插入图片描述

如下图所示,线越深表示两者关系越紧密,Self-attention的作用可以总结为指代消歧,能得出某一个序列内部词语的相关性,将一些指代不明的词转换成有意义的词语,或者能记住一些固定搭配…

在这里插入图片描述

在这里插入图片描述

在self-Attention下的一个Encoder

在这里插入图片描述

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的基于LSTMattention机制的Python代码: ```python import tensorflow as tf # define variables input_seq_len = 10 # 输入序列长度 output_seq_len = 10 # 输出序列长度 hidden_dim = 128 # LSTM隐藏层维度 embedding_dim = 100 # 词向量维度 # define inputs encoder_inputs = tf.keras.layers.Input(shape=(input_seq_len,)) decoder_inputs = tf.keras.layers.Input(shape=(output_seq_len,)) # define embedding layers enc_emb = tf.keras.layers.Embedding(input_dim=100, output_dim=embedding_dim) dec_emb = tf.keras.layers.Embedding(input_dim=100, output_dim=embedding_dim) # define LSTM layers encoder_lstm = tf.keras.layers.LSTM(units=hidden_dim, return_sequences=True, return_state=True) decoder_lstm = tf.keras.layers.LSTM(units=hidden_dim, return_sequences=True, return_state=True) # encode inputs encoder_inputs_emb = enc_emb(encoder_inputs) encoder_outputs, state_h, state_c = encoder_lstm(encoder_inputs_emb) # decode inputs decoder_inputs_emb = dec_emb(decoder_inputs) decoder_outputs, _, _ = decoder_lstm(decoder_inputs_emb, initial_state=[state_h, state_c]) # define attention layer attention = tf.keras.layers.dot([decoder_outputs, encoder_outputs], axes=[2, 2]) attention = tf.keras.layers.Activation('softmax')(attention) context = tf.keras.layers.dot([attention, encoder_outputs], axes=[2, 1]) decoder_combined_context = tf.keras.layers.concatenate([context, decoder_outputs]) # pass through dense layer and softmax activation output = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(hidden_dim, activation="softmax"))(decoder_combined_context) # define model model = tf.keras.models.Model(inputs=[encoder_inputs, decoder_inputs], outputs=[output]) # compile model model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.01), loss='categorical_crossentropy') ``` 该代码使用了TensorFlow作为主要框架,并采用了LSTMattention机制来构建一个机器翻译模型。模型的输入和输出均为数字序列,输出为根据输入序列生成的另一语言的数字序列,主要有以下步骤: 1. 定义输入和输出序列的长度和词向量维度。 2. 定义输入层。 3. 定义嵌入层将输入的数字序列映射为词向量形式。 4. 定义LSTM层并对输入进行编码。 5. 对输出数字序列同样进行嵌入和LSTM编码。 6. 定义attention层对两个输入序列的信息进行关联。 7. 将attention的输出与LSTM层的输出级联,并通过全连接层进行转换。 8. 定义模型并编译,使用RMSprop梯度下降算法进行优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PD我是你的真爱粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值