跳转至

注意力机制

1244 个字 8 张图片 预计阅读时间 5 分钟

对比

对应 paper abstract、background

vs CNN

CNN 只考虑卷积核的感受野,而 attention 考虑整个序列

所以卷积难以考虑较长的序列,如果距离较远的话,需要很多层卷积才可以达到效果;

图源网络,侵删

attention 可以考虑整个序列,所以可以考虑较长的序列


可以说 CNN attention 的特例

attention 也可以说是特殊的 CNN,相当于 CNN receptive filed learn 出来的

graph TD
    subgraph Self-Attention["Self-Attention"]
        style Self-Attention fill:#e6f3ff,stroke:#2196f3,stroke-width:4px,rx:50,ry:50
        D[Learnable Global<br/>Receptive Field]
        subgraph CNN["CNN"]
            style CNN fill:#ffe6e6,stroke:#f44336,stroke-width:2px,rx:30,ry:30
            C[Fixed Local<br/>Receptive Field]
        end
    end
    
    style D fill:none,stroke:none
    style C fill:none,stroke:none
  • data 较少的时候,CNN 训练效果好
  • 数据量较大的时候,attention 效果好,有 scaling 效应

vs RNN

  • RNN 计算 \(h_t\) 的时候,需要考虑 hidden state \(h_{t-1}\) and the input for position \(t\)
  • 很早期的信息在后续计算的时候可能会丢失,做大的 ht 对内存开销较大
  • RNN 虽然可以双向,但是不可以并行计算,对 memory 要求高

vs GNN

  • 应用在 gragh 结构上的时候,可以使用 edge 已经给出的连接关系,直接计算 attention score,其他节点可以直接设置成 0
graph LR
    subgraph Graph["Node Graph"]
        1((1)) --- 8((8))
        1 --- 6((6))
        1 --- 7((7))
        6 --- 7
        6 --- 5((5))
        5 --- 4((4))
        5 --- 3((3))
        3 --- 2((2))
    end
    
    subgraph Matrix["Attention Matrix"]
        M["1 2 3 4 5 6 7 8<br/>□ □ □ □ ■ ■ □ ■<br/>□ □ ■ □ □ □ □ □<br/>□ ■ □ □ □ □ □ □<br/>□ □ □ □ ■ □ □ □<br/>■ □ □ ■ □ □ □ □<br/>■ □ □ □ □ □ □ □<br/>□ □ ■ □ □ □ □ □<br/>■ □ □ □ □ □ □ □"]
    end
    
    style 1 fill:#000000,stroke:#000000,color:#fff
    style 2 fill:#000000,stroke:#000000,color:#fff
    style 3 fill:#000000,stroke:#000000,color:#fff
    style 4 fill:#000000,stroke:#000000,color:#fff
    style 5 fill:#000000,stroke:#000000,color:#fff
    style 6 fill:#000000,stroke:#000000,color:#fff
    style 7 fill:#000000,stroke:#000000,color:#fff
    style 8 fill:#000000,stroke:#000000,color:#fff
    style M fill:none,stroke:none

Self-Attention

思考下面的问题:

  • 同一个词汇,放在句子不同位置,它的语义可能不同(我们需要上下文信息:可以开 window 解决
  • 但如果输入是一个变长的序列:开 window 就解决不了了

所以需要一个机制,让每个词汇都考虑整个序列的信息(这个序列是变长的,这就是 self-attention


注意力机制有两种

  • additive attention
  • dot-product attention(矩阵乘法)

word embedding

word2vec:获得词汇的最初始含义

Word embedding.

  • W_E GPT3 50267 token,每个 token 具有 12288 维度,共 6 亿左右参数,随机初始化
  • 嵌入是一个“抽象”的过程,把高维向量嵌入到一个低维度当中

in the embedding layers, we multiply weights by \(\sqrt{d_{model}} = \sqrt{512}\) 防止,维度一高,导致初始时候与position encoding的值相差太大

position encoding

我们不仅仅需要考虑词汇的语义信息,还需要考虑词汇的位置信息,所以需要一个 position encoding

在原始论文当中,使用一个 sin cos 的组合来表示 position encoding

\[ PE(pos,2i) = \sin(\frac{pos}{10000^{2i/d_{model}}})\\ PE(pos,2i+1) = \cos(\frac{pos}{10000^{2i/d_{model}}}) \]

当然表示位置的算法可以自己创造

Attention 计算 – scaled dot-product attention

word embedding 解决了词汇本身的含义,position encoding 附加了词汇的位置信息,那么词汇的不同位置(或者说上下文信息)是如何影响到这个词汇的最终含义呢?

这里涉及到计算 attention score,如何计算 attention score 呢?

我们使用三个矩阵,来计算 attention score

  • \(Q\): query
  • \(K\): key
  • \(V\): value, 如何让前面的词汇影响后面的词汇,word embedding 乘上这个矩阵得到一个转移到向量

attention 分数:\(K\) \(Q\) 的点积,可以看作 \(K\) \(Q\) 的相似度,为 value 矩阵提供权重。对于如果 \(Q\) \(K\) 相似度很高,那么就给予 \(V\) 更多的权重

\[ Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V \]

\(d_k\) Q K 的维度,因为 Q K 的维度是相同的,在论文中是 \(d_k = 512\)

如果 \(d_k\) 很大,那么 \(QK^T\) 的值会很大,导致 softmax 的值趋近于 1,导致梯度消失 所以需要除以\(\sqrt{d_k}\) 来归一化

图片来源:李宏毅老师 ppt

图片来源:3b1b

预测时候,把最后一个词乘上一个矩阵,得到映射到词库上面的得分,经过 softmax 层后,就有了概率分布

使用 softmax 函数的目的

softmax:指数 scale 再归一化

\[ softmax(x) = \frac{e^x}{\sum_{i=1}^n e^{x_i}} \]

我们需要归一化的系数,来作为计算语意移动操作的权重

同时让高值更多权重,采样的时候,让高值更容易被采样到


这里要引入一个超参数 T,来控制 softmax scale。可以类比化学反应中的温度。T 越大,活性越小,softmax scale 越大,即让高值更多权重。

\[ softmax(x,T) = \frac{e^{x/T}}{\sum_{i=1}^n e^{x_i/T}} \]

T 较大的时候,让 scale 较小,即让低值更多权重

最后一个词向量,成为预测下一个词的 logit

Multi-Head Attention

单头注意力机制,是没有参数可以学习的。

多头注意力,模型能学习到根据上下文改变语意的多种方式。使用多个线性层投影到低维空间,再进行 attention 计算,那么线性层的 \(\omega\) 的参数是可以学习的。

使用不同的 \(Q\),学习不同种类的相关性

改进

attention 对于模型的假设更少,所以需要更大的模型,更多的数据量,更多的计算时间,才能达到好的效果

速度 & 准确

训练速度

Acknowledgement