sequence-to-sequence中的Attention注意力机制

sequence-to-sequence中的Attention注意力机制

1、简介

seq2seq模型的输入是序列(如单词、字母或图像特征等),输出是另外一个序列,模型训练过程可表示为如下过程:
在这里插入图片描述
在机器翻译中,输入的序列是单词,一个一个的处理,输出的同样是一系列的单词。
在这里插入图片描述

2、深度理解模型内部机制

在模型内部由encoder和decoder组成。encoder处理每一个输入序列,将输入序列转为一个向量(称为context)。处理完所有的输入序列,encoder将context发送给decoder,decoder开始逐渐项生成输出序列。
在这里插入图片描述
机器翻译过程的原理也类似
在这里插入图片描述
在机器翻译案例中context是一个向量,encoder和decoder都是循环神经网络。
在这里插入图片描述

设置模型时可设置context的大小,在encoder的RNN中它是隐藏单元的一个数字。上图中展示的是大小为4的向量,但在实际应用中这个向量大小可以更大,如256/512/1024.

设计时, RNN每一步都会接收两个输入:一个输入(在encoder中,它是输入句子中的一个单词)和一个隐藏状态。但是这个输入单词需要表征为一个向量。我们将单词转为向量的过程称为word embedding,词嵌入算法。这些由单词变成的矢量空间会捕捉单词的大量词义和语义信息。
在这里插入图片描述

在处理之前需要将输入单词转为向量。这个转变过程是通过word embedding词嵌入算法完成的。我们可以使用预训练的词嵌入或者在我们的数据集上训练我们自己的词嵌入。通常词嵌入向量大小是200或300,这里为了简化使用大小为4的向量。

下面介绍主要的向量/张量,回顾一下RNN的原理,建立一个可视化语言去描述这个模型。
在这里插入图片描述

下一个RNN将第二个输入向量和隐藏状态1去创建这个时间步的输出。
在下面的可视化过程中,encoder或decoder的每个脉冲都是RNN处理它的输入并生成该时间步的输出。因为encoder和decoder都是RNN,RNN的每个时间步都做同样的处理,根据当前的输入和上一次输入去更新它的隐藏状态。
在这里插入图片描述

decoder同样保留了隐藏状态,这个隐藏状态从当前时间步到下一个时间步。目前没有这个图形中把它可视化,因为现在关注的模型的主要部分。

下面看一下另外一种可视化sequence2sequence模型的方法。这个动画可以更好的描述模型的静态图形。这里称为“unrolled"视图。这里不显示解码器,而是显示它在每个时间步长的副本。这样可以看到每个时间步骤的输入和输出。
在这里插入图片描述

3、注意力机制

context向量被视为这类模型的瓶颈。在面临长序列时会是模型的挑战。Bahdanau et al., 2014 and Luong et al., 2015.提出了解决方法。论文中介绍并提炼了一种“注意力”机制,该机制极大的提升了机器翻译系统的质量。注意力机制允许模型根据需要关注输入序列的相关部分。
在这里插入图片描述

在第7步中,在生成英文翻译前,attention机制允许decoder关注"etudiant"(法语,表示“学生”)。这种放大输入序列相关部分的信号的能力使得模型比没有注意力的模型产生更好的结果。

在高度抽象的层面上继续查看这个模型。注意力模型与经典的sequence-to-sequence主要有如下两个方面的不同。
1、encoder会发送更多的数据给decoder。encoder将所有的隐藏状态发送给decoder而不是将encoder阶段最后的隐藏状态发送给decoder。
在这里插入图片描述

2、注意力decoder在生成输出前会有一个额外的步骤。为了关注与当前decode时间步相关的部分,decoder会做如下的处理
● 1、查看它接收的一系列encoder隐藏状态——每个encoder隐藏状态都会与输入序列中的特定单词相关。
● 2、给一个隐藏状态打分
● 3、将隐藏状态与softmax得分相乘,这会放大得分更高的隐藏状态,缩小得分低的隐藏状态。
在这里插入图片描述

打分过程在decoder阶段每个时间步都会执行。
在下面的动画过程中归纳以上所有的步骤,看看attention过程是如何完成的。
● 1、attention decoder接收标记的嵌入和初级decoder的隐藏状态。
● 2、RNN处理输入,产生输出和一个新的隐藏状态向量(h4)。输出被丢弃了。
● 3、attention step: 使用encoder的隐藏状态和h4向量计算当前时间步的context向量(C4)
● 4、将h4和C4拼接成一个向量。
● 5、将4中的拼接完成的向量输入到前馈神经网络中(与模型共同训练的)
● 6、前馈神经网络的输出代表的是当前时间步的输出单词
● 7、下一个时间步重复以上步骤。
在这里插入图片描述

下面是另外一种方法,该方法用来观测我们在每个decoder步骤中关注输入句子的哪一部分:
在这里插入图片描述

请注意,模型并不会毫无意识的将输出的第一个单词与输入的第一个单词对齐,实际上它在模型训练阶段学会了如何对齐该语言对中的单词。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的MATLAB代码示例,演示如何在CNN-LSTM模型使用注意力机制进行优化: ```matlab % 准备数据 % 假设你已经准备好了图像数据和对应的标签 % 定义CNN-LSTM网络结构 numHiddenUnits = 100; % LSTM隐层单元数量 numClasses = 2; % 分类任务的类别数量 imageSize = [224 224 3]; % 图像尺寸 layers = [ ... imageInputLayer(imageSize) % 输入层 convolution2dLayer(3,16,'Padding','same') % 卷积层 reluLayer % ReLU激活层 maxPooling2dLayer(2,'Stride',2) % 最大池化层 lstmLayer(numHiddenUnits,'OutputMode','sequence') % LSTM层 attentionLayer('AttentionType','additive') % 注意力层 fullyConnectedLayer(numClasses) % 全连接层 softmaxLayer % Softmax层 classificationLayer]; % 分类器层 % 定义训练选项 options = trainingOptions('adam', ... 'MaxEpochs',10, ... 'MiniBatchSize',64, ... 'InitialLearnRate',0.01, ... 'GradientThreshold',1, ... 'Shuffle','every-epoch', ... 'Plots','training-progress'); % 训练模型 net = trainNetwork(XTrain, YTrain, layers, options); % 使用训练好的模型进行预测 YPred = classify(net, XTest); % 计算准确率 accuracy = sum(YPred == YTest) / numel(YTest); disp(['准确率: ' num2str(accuracy)]); ``` 上述代码,我们使用了MATLAB的深度学习工具箱提供的卷积层、LSTM层和自定义的注意力层。注意力层可以根据你的需求进行调整,这里使用了加性注意力机制。 请注意,上述代码的`imageSize`、`XTrain`、`YTrain`、`XTest`和`YTest`是需要根据你的数据集进行相应的设置和替换。此外,你可能还需要根据你的具体任务和数据集对网络结构和训练选项进行调整。 希望这个简单的示例能够帮助你理解如何在MATLAB使用注意力机制优化CNN-LSTM模型。如果需要更复杂的实现,你可能需要参考更详细的文档和教程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值