[深度学习 - 实操笔记] 注意力机制

注意力机制

注意力机制参考这篇博客中的部分:https://blog.csdn.net/jiaowoshouzi/article/details/89073944

从seq2seq说起

学完深度学习之后,我知道seq2seq这种编解码模型经常用在翻译软件上。

也就是说,要翻译的那句话首先会在一个编码模型上进行语义编码(压缩),将这段话做了个总结,然后传输给一个解码模型,解码模型通过这个总结翻译成最终结果。

但是这个模型是由缺陷的。

举个栗子,综艺节目经常有一个娱乐项目:你画我猜。

假设题目:人躺在地上

第一个接收题目的人就类似于编码器,他会对接收的题目做个总结,然后画在画上。
第二人就是解码器,他要根据第一个人的画画的信息,翻译出最终结果。

编解码

第一个人画了个 人躺在地上。

这个时候,往往前面这个人画的不够准确,或者提供的信息不够多,后面这个人就不能准确翻译出最终结果。

所以这个时候呢,当后面这个人翻译不出来的时候,前面这个人就换了种方法一个字一个字的拆开指引他翻译,就是把总结细分化,使后一个人更容易理解。

编解码改进

例如,他会把这段话拆开,成3部分。
先画一个人,让猜的那个人知道第一部分是人;
再画一个躺着的动作,让猜的那个人知道第二部分是躺;
再画一个地面,让猜的那个人知道第四五部分是地面。
然后就能猜到大概的意思是有个人躺在地面上。

但是这样也还不是完全正确。

所以这个时候,我们就要改改游戏规则了。游戏本身至少要给游戏者一点提示。否则这样猜也很难猜准。
因此,规则上就有了系统给猜者的游戏提示。

提示一:五个字
提示二:动作

根据提示一,猜者就会把注意力集中在压缩文字个数上。根据提示二,猜者就会注意到这个是个动作。
(也就是说,系统给游戏者提供了先验条件,引导游戏者关注某些重要的地方)

但是这样说注意力机制其实不是很准确。只是道理相同,我们让模型引入注意力机制,注意力机制为模型提供先验条件,引导模型关注某些重要的地方。
注意力机制

seq2seq 引入注意力机制

从上图,我们可以看到下面这一段还是一样是一个seq2seq模型。上面那些就是一个注意力机制。

下面中间那块就是编码器对翻译内容做的总结。
注意力机制根据这个总结以及原来的数据做内积并且归一化,(经过不断的训练)就可以得到注意力权重,(权重越大表示越重要)然后注意力机制结合解码器的输出(可通过全连接或者其他模型做融合),就可以得到较为准确的结果。

注意力模块

(1) 注意力公式

Q,K,V都是张量。
Q:查询向量;(也就是上面那个图seq2seq中间那个总结部分)
K:键(key);
V:值(value);
K对应的意思是,注意力要注意的地方;也就是编码器的数据。
V对应的意思是注意力机制模型的输入;在这里同样也是编码器的数据。(K和V可以是不同)
 注意力公式
(2)自注意力
自注意力的本质就是一个数据本身可以分为很多块,块与块之间比较相关性;Q、K、V都是同一个张量。(例如,人躺在地上这个例子,可以把人、躺、在、地、上,做相关性比较)
自注意力

(3)多头注意力
同时注意很多个地方。
Q、K、V可以分成多个,就能输出多个注意力。
多头注意力

class Attention(torch.nn.Module):
	
	def __init__(self, head_num, feature_num):
		super().__init__()
		self.head_num = head_num
		self.feature_num= feature_num
		self.fc = torch.nn.Linear(feature_num, feature_num*head_num)
		self.fc2 = torch.nn.Linear(feature_num * head_num, feature_num)
		
	def forward(self, Q, K, V):
		Qs = torch.stack(self.fc(Q).chunk(self.head_num, dum=1))
		Ks = torch.stack(self.fc(K).chunk(self.head_num, dum=1))
		Vs = torch.stack(self.fc(V).chunk(self.head_num, dum=1))
		dk = self.feature_num**0.5
		
		A = torch.nn.Softmax((Qs @ Ks.permute(0,2,1))/dk, dim=-1) @ Vs
		AA = torch.cat(A.permute(1,0,2),dim=1)
		return self.fc2(AA)

结论

注意力机制模型的提出本身是用在NLP上,语言序列问题,让模型更加关注重要得字词。

但是实际上所有模型都可以加上注意力模型来提高模型能力。(会有消耗性能的代价)

在图像上加注意力模型,要在特征图较小的时候加,否则计算量太大。

图像中引入注意力
上面的注意力模型是在像素上做相关性比较。
下面的注意力模型是在通道上做相关性比较。

猜你喜欢

转载自blog.csdn.net/weixin_41809530/article/details/108142366