【问题标题】:How does the Transformer Model Compute Self Attention?Transformer 模型如何计算自注意力?
【发布时间】:2020-08-29 01:16:16
【问题描述】:

在 Transformer 模型中,https://arxiv.org/pdf/1706.03762.pdf 存在自注意力,它使用 softmax 对 Query (Q)Key (K) 向量进行计算:

我正在尝试理解矩阵乘法:

Q = batch_size x seq_length x embed_size

K = batch_size x seq_length x embed_size

QK^T = batch_size x seq_length x seq_length

Softmax QK^T = Softmax (batch_size x seq_length x seq_length)

由于每个批次元素有 seq_length x seq_length 个值,如何计算 softmax?

对 Pytorch 计算的参考将非常有帮助。

干杯!

【问题讨论】:

标签: machine-learning deep-learning pytorch transformer attention-model


【解决方案1】:

QKᵀ 乘法是一个批处理矩阵乘法——它执行了一个单独的seq_length x embed_size 乘以embed_size x seq_length 乘法batch_size 次。每个都给出一个大小为seq_length x seq_length的结果,这就是我们最终得到具有batch_size x seq_length x seq_length形状的QKᵀ的方式。

Gabriela Melo's suggested resource 使用以下 PyTorch 代码进行此操作:

torch.matmul(query, key.transpose(-2, -1))

之所以有效,是因为torch.matmul 在输入具有至少 3 个维度时会执行批量矩阵乘法(请参阅https://pytorch.org/docs/stable/torch.html#torch.matmul)。

【讨论】:

    【解决方案2】:

    由于每个批次元素有 seq_length x seq_length 值,如何计算 softmax?

    softmax 在最后一个轴上执行(torch.nn.Softmax(dim=-1)(tensor),其中tensor 的形状为batch_size x seq_length x seq_length),以获得输入序列中每个元素关注每个元素的概率。


    假设,我们有一个文本序列“Thinking Machines”,所以在执行QK^T 之后我们有一个形状为“2 x 2”(其中seq_length = 2)的矩阵。

    我使用下面的插图 (reference) 来解释自注意力计算。如您所知,首先执行缩放点积QK^T/square_root(d_k),然后为每个序列元素计算softmax。

    这里,Softmax 是针对第一个序列元素“Thinking”执行的。 14 and 12的原始分数通过softmax变成0.88 and 0.12的概率。这些概率表明令牌“思考”以 88% 的概率出现,而令牌“机器”以 12% 的概率出现。同样,也会为标记“Machines”计算注意概率。


    注意。我强烈建议在 Transformer 上阅读这篇出色的 article。具体实现可以看OpenNMT

    【讨论】:

      猜你喜欢
      • 2021-04-18
      • 2022-12-15
      • 2022-07-02
      • 2022-12-04
      • 2021-02-07
      • 2019-11-18
      • 2018-06-30
      • 2022-01-03
      • 1970-01-01
      相关资源
      最近更新 更多