深度学习的疑问--Transformer【4】:为什么我看有些模型在使用transformer的时候会用一个encoder+一个positioning encoding?

总结: positioning encoding位置编码模块主要是用于为Transformer提供输入序列的位置信息。那位置编码模块是如何提供位置信息的呢?即把位置信息编码与输入嵌入向量相加,形成带有位置感知的输入。

你看到的这些模型使用 Encoder + Position Encoding 的原因是,Position Encoding(位置编码)对于 Transformer 模型来说是至关重要的,尤其是在处理 序列数据(如文本、时间序列等)时,因为 Transformer 自身不具备顺序感知

1. 为什么需要 Position Encoding?

Transformer 模型的核心优势在于 自注意力机制(Self-Attention),它能够捕捉输入序列中各个位置之间的依赖关系。然而,自注意力机制并不保留输入的顺序信息,也就是说,Transformer 对于输入的顺序(即哪个词在前,哪个词在后)是无感知的。

在传统的 RNN(递归神经网络)和 LSTM(长短期记忆网络)中,序列的顺序是通过时间步逐个处理隐层状态来保留的,但 Transformer 不会像 RNN 那样逐步处理数据,因此必须显式地给模型提供位置信息。

2. Position Encoding 的作用

Position Encoding 就是用来向 Transformer 模型提供位置信息的,它在模型的输入中起到了标记序列中各个位置的作用,使得模型能够区分不同位置的输入。它的作用相当于给每个输入 token 添加一个位置标识符,让模型知道哪个 token 在序列中处于哪个位置。

如何使用 Position Encoding?

  1. 位置编码的形式

    • Sinusoidal Encoding(正弦编码):最初的 Transformer 使用的是正弦函数和余弦函数结合的方式来生成位置编码。这种方式的优点是能确保每个位置编码具有不同的模式,且不依赖于序列的长度。

      • 对于每个位置 pospos 和每个维度 ii,位置编码的值可以通过以下公式计算:

        PEpos,2i=sin⁡(pos/100002i/d)PE_{pos, 2i} = \sin(pos / 10000^{2i/d}) PEpos,2i+1=cos⁡(pos/100002i/d)PE_{pos, 2i+1} = \cos(pos / 10000^{2i/d})

        其中,pospos 是当前 token 的位置,dd 是嵌入维度,ii 是维度的索引。正弦编码通过低频分量捕捉较低位的位置信息,高频分量捕捉较高位的信息。

    • Learnable Position Encoding(可学习的编码):另一种方式是让模型直接学习位置编码。这样,每个位置编码会作为训练参数,随着模型训练而不断调整,可能对于某些特定任务更加有效。

  2. 位置编码如何加到输入中? 在 Transformer 的实现中,位置编码通常会与输入嵌入(Embedding)相加,形成带有位置感知的输入表示。具体步骤如下:

    • 输入嵌入:将输入的每个 token 转换成一个固定维度的向量(如词向量)。

    • 位置编码:为每个 token 生成一个与其位置相关的向量。

    • 相加:将位置编码与输入嵌入相加,得到最终的表示。这样,输入就不仅包含了词汇的语义信息,还包含了词汇的位置信息。

    这种加法操作确保了每个位置的 token 都能携带自己的位置知识。

3. 示例:如何在 Encoder 中使用 Position Encoding

假设输入是一个句子 "I am learning",首先,每个单词会被转换成嵌入向量,然后添加位置编码。

步骤:

  1. 将单词转化为嵌入(Embedding)

    • "I" -> embedding: [e1][e_1]

    • "am" -> embedding: [e2][e_2]

    • "learning" -> embedding: [e3][e_3]

  2. 为每个词生成位置编码

    • "I" (位置 1) -> Position Encoding: [pe1][pe_1]

    • "am" (位置 2) -> Position Encoding: [pe2][pe_2]

    • "learning" (位置 3) -> Position Encoding: [pe3][pe_3]

  3. 将嵌入向量与位置编码相加

    • "I" -> [e1]+[pe1][e_1] + [pe_1]

    • "am" -> [e2]+[pe2][e_2] + [pe_2]

    • "learning" -> [e3]+[pe3][e_3] + [pe_3]

最终输入到 Encoder 的向量就是

[e1+pe1],[e2+pe2],[e3+pe3][e_1 + pe_1], [e_2 + pe_2], [e_3 + pe_3]

这些经过位置编码增强的嵌入向量会被传递到 Transformer 的 Encoder 中进行处理。

4. 总结:为什么使用 Encoder 和 Position Encoding?

  • Encoder:负责提取输入数据(如文本)的特征表示。在 Transformer 中,Encoder 通过自注意力机制捕捉不同 token 之间的关系,从而生成具有丰富上下文信息的特征。

  • Position Encoding:由于 Transformer 模型自身无法感知序列中 token 的位置,因此需要通过 Position Encoding 显式地提供每个 token 的位置信息,使得模型能区分不同位置的 token。

你可能感兴趣的:(深度学习,transformer,人工智能)