Advertisement

Self-Attention机制学习

阅读量:

Self-Attention机制学习

注意力机制解决问题

  • CNN网络用输入是 一个向量 比如图像处理之后 3x224x224 所有图片大小一致
  • 但是输入可以是一排向量 并且每行长度都不一样
    • 文字处理–句子长度不一样 vector set 长度不一样 常规做法one-hot encoding 问题:向量里面没有语义 另一个方法: word embedding
    • 一段语音 每个window包含的语音信息都是不一样的
    • 关联图 其实每个节点可以看作一个向量

对应输出

each vector has a label(输出和输入一样) 比如说: 词性标注

复制代码
* I saw a saw pos tagging: N V DET N

输出只有一个label

复制代码
* 比如情感分类之类的

输入N个 输出M个 : seq2seq

复制代码
* 比如翻译任务

Sequence labeling(序列标注问题)

通过全连接层对输入的一个句子进行处理后会生成与该句子所含单词数量相对应的标签。当一个句子中出现两个相同的词语且它们的词性不同时(例如,在"I saw a saw."中),就需要结合语境进行分析:采用滑动窗口的方式查看当前向量与其他相邻向量之间的关系特征。

  • is it possible to consider the context ?

    • FC can consider the neighbor
  • What considerations are needed for the entire sequence?

    • A window that covers the entire sequence is required.
    • All inputs have varying lengths.

self-attention 基本步骤

[1706.03762] Attention Is All You Need (arxiv.org)

首先来看下整个过程

在这里插入图片描述
在这里插入图片描述

由此可以看出整个过程基本分为三步

**1.计算 Q 和 K 的 关联性 **

什么是Q,K?

其中Q代表查询,K代表关键词,类似于信息检索系统中的机制.通过分析查询与关键词之间的关联关系, 进而推导出相应的结果.值得注意的是,自注意力机制并非仅仅用于提取特征向量V

为什么Q*K计算自己的关联性

我们都知道计算矩阵乘法转置后的结果XX^T所代表的意义,并且这正是反映第一个向量在第二个方向上延伸的程度这一重要指标。

为什么不用**XX^T** * 我认为有以下几点好处

Q和K通过空间变换矩阵经过转换后分别变为Q和K从而解决了输入长度不一致的问题。经过中间层的计算输入数据量从(seqLen × inputDim × inputDim × seqLen)减少到Q(seqLen × inputDim × inputDim × dimK)K(seqLen × inputDim × inputDim × dimK)随后将这两个矩阵相乘得到Q×K(seqLen×seqLen)。这一过程使得模型在保持复杂度的同时显著降低了计算开销并成功捕获并学习了非线性特征。

2.对关联性进行softmax处理
  • 在什么情况下需要对计算结果进行归一化处理?
  • 论文中提出的核心观点认为,在dk维度较小时加性注意力的表现优于点积注意力;研究者推测这种现象可能源于点积操作具有较大的跨度导致的影响,并因此采取了相应的调整措施。
  • 数学原理 假设矩阵Q和K的均值均为零且方差归一化至1,则它们之间的点积q·k等于各分量乘积之和Σ_{i=1}^{d_k} q_i k_i;此时该运算结果服从均值为零、方差等于维度数dk的正态分布。
3.根据权重系数对Value进行加权求和,得到Attention Value
  • 为何在自注意力机制中将自身作为Q和K之后还需经过进一步的转换以得到V向量?
  • 这也反映出自注意力机制中自变量既充当了key又充当了value的角色。
    尽管在推荐系统中key和value属性原始的特征空间不同, 但它们之间存在较强的关联性, 因此经过特定的空间转换过程, 可以将两者统一到同一个特征空间中。

self-attention 算法步骤

1.计算比较Q和K的相似度,用f来表示

f(Q,K_i), i = 1, 2, 3,...,m

2.将得到的相似度进行Softmax操作,进行归一化

\alpha_i = \frac{e^{f_{(Q, K_i)}}}{\sum_{j=1}^{m}f(Q, K_i)}, i=1,2,...,m

通过使用这些权重系数对V中的所有值进行加权求和运算,并结合相应的公式推导过程, 最终能够获得一个用于后续处理的Attention向量

\sum_{i=1}^{m}\alpha_iV_i

self-attention 代码实现

复制代码
    from math import sqrt
    import torch
    import torch.nn
    
    
    class Self_Attention(nn.Module):
    # input : batch_size * seq_len * input_dim
    # q : batch_size * input_dim * dim_k
    # k : batch_size * input_dim * dim_k
    # v : batch_size * input_dim * dim_v
    def __init__(self,input_dim,dim_k,dim_v):
        super(Self_Attention,self).__init__()
        self.q = nn.Linear(input_dim,dim_k)
        self.k = nn.Linear(input_dim,dim_k)
        self.v = nn.Linear(input_dim,dim_v)
        self._norm_fact = 1 / sqrt(dim_k)
        
    
    def forward(self,x):
        Q = self.q(x) # Q: batch_size * seq_len * dim_k
        K = self.k(x) # K: batch_size * seq_len * dim_k
        V = self.v(x) # V: batch_size * seq_len * dim_v
         
        atten = nn.Softmax(dim=-1)(torch.bmm(Q,K.permute(0,2,1))) * self._norm_fact # Q * K.T() # batch_size * seq_len * seq_len
        
        output = torch.bmm(atten,V) # Q * K.T() * V # batch_size * seq_len * dim_v
        
        return output

参考:

1706.03762.pdf (arxiv.org)

超详细图解Self-Attention - 知乎 (zhihu.com)

在 Transformer 模型中探讨 Query、Key 和 Value 的内涵及作用机制。可参考 yafee123 博客的文章《_key query value》。其中 Query 是用来获取信息的位置编码 Key 是用来表示位置的信息 Value 则是用来存储实际输入数据的信息。在 Transformer 模型中 Query 用于获取位置编码以识别输入序列中的各个元素 Key 则用于编码每个元素的位置信息 Value 存储了输入数据的具体内容。通过学习注意力机制 Transformer 可以有效地捕捉长距离依赖关系并实现高效的特征提取。

https://www.youtube.com/watch?v=hYdO9CscNes&feature=youtu.be

全部评论 (0)

还没有任何评论哟~