Transformer 的可变输入/输出长度

数据挖掘 nlp 注意机制
2021-10-07 04:34:40

我正在阅读论文“Attention is all you need”(https://arxiv.org/pdf/1706.03762.pdf )并偶然发现了这个网站 http://jalammar.github.io/illustrated-transformer/ Transformer 的架构分解。

不幸的是,我无法找到任何解释为什么它适用于不相等的输入/输出长度(例如输入:“je suis étudiant”和预期输出:“我是学生”)。

我的主要困惑是这个。据我了解,当我们将输出从编码器传递到解码器时(比如3×10 在这种情况下),我们通过一个多头注意力层来做到这一点,它接受 3 个输入:

  1. 查询(来自编码器),维度 3×k1
  2. 尺寸的钥匙(来自编码器) 3×k1
  3. 一个值(来自解码器),维度 L0×k1, 在哪里 L0 指(掩码)输出句子中的单词数。

鉴于 Multi-Head Attention 应该采用 3 个行数相同的矩阵(或者至少这是我从其架构中了解到的),我们如何处理输出长度变化的问题?

2个回答

你的理解是不正确的:在encoder-decoder attention中,Keys和Values来自encoder(即源序列长度),而Query来自decoder本身(即目标序列长度)。

Query 决定了输出序列的长度,因此我们得到一个正确长度的序列(即目标序列长度)。


为了理解注意力块是如何工作的,这个类比可能会有所帮助:将注意力块想象成一个 Python 字典,例如

keys =   ['a', 'b', 'c']
values = [2, 7, 1]
attention = {keys[0]: values[0], keys[1]: values[1], keys[2]: values[2]}
queries = ['c', 'a']
result = [attention[queries[0]], attention[queries[1]]]

在上面的代码中,result应该有 value [1, 2]

来自转换器的注意力以类似的方式工作,但它不是硬匹配,而是软匹配:它根据关联键与查询的相似程度为您提供加权值的组合。

虽然值和键的数量必须匹配,但查询的数量是独立的。

据我了解,我们没有通过 3 x 10maximum_sentence_size x 10. 实际上它在某种意义上是静态的,你不能超过这个最大的句子大小。如果你的句子小于这个大小会发生什么?你只需用“填充向量”填充。并确保您的模型不关注那些填充向量。