前言
皆为粗浅的理解,作为记录使用。
注意力
人类的注意力成为一种商品,销售者买广告吸引消费者的注意力,消费者买会员消除广告让自己的注意力集中在想看的内容上面。大概来讲我们的注意力是"双组件框架"的,即由非自主性提示和自主性提示组成的。
非自主性提示
当我们看这个世界时,会不自觉地关注某些东西,这就是非自主性提示,例如颜色鲜艳的,大的东西。
自主性提示
当我们主观的去看世界时,我们会格外关注某些东西,例如一个留学生会刻意更关注别人的穿着而不是内涵。当然了,这个行为成为习惯后会成为他自己的非自主性提示。
总的来说,自主性和非自主性的注意力揭示了人们的注意力方式。
引入一:心理学哲学理解
我们可以把自主性提示当成(query,Q)作为一种观察世界的主观意识(证据),我们观察这个世界称为感官的输入把它当为(value,V)。此时我们就知道,如果我们既有Q又有V,那么就可以通过Q去发现V中的类Q,从而看看我们主观意识可视化后的样子。
引入二:形象理解
另一种更形象的说法是,Q就相当于一个单词,V就相当于一个字典,我们希望在字典里找到这个单词。
关于Key(K)的理解是众说纷纭。我的理解是,首先K的数量和V是一致的,如果以引入一的视角来看,K就相当于一个意识和现实的链接。引入二的视角来看,K有点类似于把字典变成另一本全是同义词的字典。
公式
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_{k}}})V Attention(Q,K,V)=softmax(dkQKT)V
点积表示相似度,除以 d k \sqrt{d_{k}} dk是防止在高维空间中计算softmax时的梯度消失问题。对缩放后的点积结果应用softmax函数。Softmax可以将点积转换成概率分布,这些概率表明在每个位置上应该给予其他位置多少“注意力”。换句话说,这个步骤决定了每个元素应该在多大程度上关注序列中的其他元素。最后,将softmax的输出(注意力权重)与Value相乘。这意味着每个Value都会根据计算出的注意力权重进行加权。如果一个元素的Key与另一个元素的Query更相似,则在最终输出中它的Value会被赋予更高的权重。
自注意力机制
如果不是自注意力机制,例如我想通过文本查找图像中的部分图像,那么文本就是我们观察图像的证据,也就是Q,图像就是一个V相当于一个搜索库。
自注意力机制只有单源数据本身,例如一个句子,我们需要在句子内部做各种运算,具体来说就是把这个句子乘3个矩阵得到QKV,自己对自己进行搜索。
CLS
[CLS]是Bert输入句子时的开头嵌入,相当于一种概括,或是一种证据。我们认为[CLS]包含了句子的总结性信息(概括),在分类任务中可以直接拿出来分类。
import torch
import torch.nn as nn
class TransformerWithClsToken(nn.Module):
def __init__(self, embed_size, num_heads, num_layers, num_classes):
super(TransformerWithClsToken, self).__init__()
# 初始化 <cls> 向量
self.cls_token = nn.Parameter(torch.randn(1, 1, embed_size))
self.transformer = nn.Transformer(
d_model=embed_size, nhead=num_heads, num_layers=num_layers
)
self.fc = nn.Linear(embed_size, num_classes)
def forward(self, x):
# 假设 x 的形状为 [batch_size, seq_length, embed_size]
batch_size = x.shape[0]
# 复制 <cls> 向量到每个样本中
cls_tokens = self.cls_token.expand(batch_size, -1, -1)
# 将 <cls> 向量和序列拼接
x = torch.cat((cls_tokens, x), dim=1)
# 通过 Transformer
x = self.transformer(x)
# 使用 <cls> 向量的输出进行分类
cls_output = x[:, 0, :]
out = self.fc(cls_output)
return out
实际操作中,把变成整个网络可学习的一部分,这样就可以后续直接拿出来分类。所以其实可以被视为一种表示学习,就是通过不断的学习把输入数据进行了降维。
总结
Attention通过一系列计算增加了模型的可学习能力(增加了很多没那么冗余的参数),让模型能学到更多的东西。至于有没有真的关注到想关注的,目前我还没有更多的理解