Transformer 学习笔记

自注意力

image

可以将 \(q^{<i>}\) 理解为单词 \(x^{<i>}\) 提出的问题,将 \(k^{<j>}\) 理解为单词 \(x^{<j>}\) 做出的回答。将 \(v^{<z>}\) 理解为单词 \(x^{<z>}\) 的含义。

参考:Self-Attention | Coursera

多头注意力

image

一个注意力头可以理解为一个类型的问题。多个注意力头就是多个类型的问题。

参考:Multi-Head Attention | Coursera

交叉注意力

当注意力网络的 \(Q\)\(K, V\) 来源于不同输入序列时,就是在计算交叉注意力。在 Transformer 网络中,解码器的第二个 Multi-Head Attention 层输入的 \(Q\) 来自于编码器,而 \(K, V\) 来自于第一个 Multi-Head Attention 层,这里就在计算交叉注意力。

Transformer 网络

image

位置编码

\[\text{PE}(pos, 2i) = \sin\left(\frac{pos}{10000^{2i/d}}\right) \]

\[\text{PE}(pos, 2i+1) = \cos\left(\frac{pos}{10000^{2i/d}}\right) \]

  • \(10000^{2i/d}\):频率,不同的维度 \(i\) 有不同的频率
  • \(d\):嵌入向量的总维度
  • \(i\):特征在嵌入向量中的维度,是总维度的一半(\(2i \in [0, d)\)
  • \(pos\):嵌入向量在向量序列中的位置

比如 \(x^{<1>}\) 的位置编码可能为:\([\sin(\frac{1}{10000^0}), \cos(\frac{1}{10000^0}), \sin(\frac{1}{10000^{1/2}}), \cos(\frac{1}{10000^{1/2}})]\)

这种位置编码也叫绝对位置编码

import numpy as np
import matplotlib.pyplot as plt

def get_angles(pos, k, d):
    i = k // 2
    angles = pos / np.power(10000, 2 * i / d)
    return angles

def positional_embedding(pos, d):
    angle_rads = get_angles(np.arange(pos)[:, np.newaxis], np.arange(d)[np.newaxis, :], d)
    angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2])
    angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2])
    pos_embedding = angle_rads[np.newaxis, :, :]
    return pos_embedding

pos_embedding = positional_embedding(50, 512)
plt.pcolormesh(pos_embedding[0], cmap='RdBu')
plt.xlabel('d')
plt.xlim((0, 512))
plt.ylabel('Position')
plt.colorbar()
plt.savefig('positional_embedding.svg')

positional_encoding

每一行代表一个位置编码,可以看到没有任何两行是相同的。

参考:Transformer Network | Coursera

参见:

原始论文:Attention is all you need | Proceedings of the 31st International Conference on Neural Information Processing Systems

posted @ 2025-01-23 23:48  undefined443  阅读(83)  评论(0)    收藏  举报