掌握 Transformer 位置编码原理——为什么 Transformer 能理解词语顺序?

目录

一、前言

二、为什么 Transformer 需要位置编码

(一)RNN为什么天然具有顺序信息

(二)Transformer的特点

(三)顺序信息丢失问题

三、位置编码的核心思想

(一)给每个位置添加身份标识

(二)位置编码加入方式

四、最简单的位置编码方法

(一)绝对位置编号

(二)存在的问题

五、Transformer中的正弦位置编码

(一)Google提出的方法

(二)位置编码公式

(三)参数解释

六、为什么使用 Sin 和 Cos

(一)不同维度对应不同波长

(二)天然表达相对距离

(三)支持超长序列

七、位置编码生成示例

八、位置编码与Embedding融合

(一)Embedding表示什么

(二)位置编码表示什么

(三)最终融合

九、位置编码可视化理解

十、位置编码在Self-Attention中的作用

十一、位置编码存在的问题

(一)固定编码

(二)表达能力有限

(三)无法充分建模相对位置

十二、可学习位置编码

(一)基本思想

(二)训练过程中更新

(三)代表模型

十三、相对位置编码

(一)核心思想

(二)优势

(三)代表模型

十四、RoPE旋转位置编码

(一)核心思想

(二)优势

(三)应用模型

十五、PyTorch实现位置编码

十六、总结


在学习 Transformer 的过程中,很多人都会产生一个疑问:

既然 Transformer 已经如此强大,那么它是如何知道一句话中词语先后顺序的?

例如:

我喜欢学习人工智能

和:

人工智能喜欢我学习

虽然包含相同的词汇。

但是:

含义完全不同。

对于人类来说:

我们天然能够理解词语顺序的重要性。

但对于计算机而言:

输入本质上只是一个个数字向量。

如果不额外处理:

模型根本无法区分:

A B C D

和:

D C B A

的区别。

这正是 Transformer 面临的一个核心问题。

2017年,Google 在论文:

《Attention Is All You Need》

中提出了一种巧妙的解决方案:

Positional Encoding

即:

位置编码

位置编码的出现,使 Transformer 在不依赖 RNN 和 CNN 的情况下,依然能够理解序列顺序信息。

可以说:

没有位置编码,就没有真正意义上的 Transformer。

本文将深入讲解 Transformer 中位置编码的设计思想、数学原理、实现方式以及实际应用。


二、为什么 Transformer 需要位置编码

(一)RNN为什么天然具有顺序信息

在 Transformer 出现之前。

主流模型包括:

  • RNN

  • LSTM

  • GRU

例如:

我

↓

喜欢

↓

学习

↓

AI

RNN 是逐个词处理的。

因此:

顺序天然保留。

模型知道:

我

在前面

AI

在后面

(二)Transformer的特点

Transformer 完全不同。

其核心是:

Self-Attention

在计算过程中:

所有词同时进入模型

例如:

我

喜欢

学习

AI

会一次性输入。

结构如下:

Input

↓

Self-Attention

↓

Output

模型并不知道:

谁在前

谁在后

(三)顺序信息丢失问题

假设:

输入:

我 爱 北京

Embedding后:

[0.3,0.5...]

[0.7,0.2...]

[0.9,0.8...]

Transformer只能看到向量。

并不知道:

第一词

第二词

第三词

因此:

必须额外加入位置信息。


三、位置编码的核心思想

(一)给每个位置添加身份标识

类似于:

电影院座位号。

例如:

第1排

第2排

第3排

即使人换了。

座位顺序不会变。

同理:

Transformer希望告诉模型:

我是第1个词

我是第2个词

我是第3个词

(二)位置编码加入方式

假设:

词向量:

Embedding

位置向量:

Position Encoding

最终输入:

Input

=

Embedding

+

Position Encoding

即:

词语语义

+

位置信息

同时输入模型。


四、最简单的位置编码方法

(一)绝对位置编号

例如:

句子:

我 喜欢 学习 AI

位置:

我      → 1

喜欢    → 2

学习    → 3

AI      → 4

直接将位置作为数字。


(二)存在的问题

如果直接使用:

1

2

3

4

模型难以学习。

并且:

无法泛化到更长序列。

例如:

训练长度:

100

测试长度:

1000

效果会变差。

因此:

Google采用了更聪明的方法。


五、Transformer中的正弦位置编码

(一)Google提出的方法

Transformer论文采用:

Sin

Cos

函数构建位置编码。

原因:

连续

平滑

可泛化

(二)位置编码公式

Transformer原始公式:

PE(pos,2i)=\sin\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right)

偶数维:

使用 Sin。


奇数维:

PE(pos,2i+1)=\cos\left(\frac{pos}{10000^{\frac{2i}{d_{model}}}}\right)

使用 Cos。


(三)参数解释

其中:

pos

表示:

位置编号。

例如:

第1个词

第2个词

第3个词

i

表示:

向量维度索引。


d_model

表示:

Embedding维度。

例如:

512

六、为什么使用 Sin 和 Cos

(一)不同维度对应不同波长

例如:

某些维度:

变化较快。

波长短

某些维度:

变化较慢。

波长长

这样:

每个位置都会获得唯一编码。


(二)天然表达相对距离

例如:

位置:

10

与:

11

编码非常接近。

而:

10

与:

100

差异明显。

因此:

模型可以轻松学习:

词与词之间距离关系

(三)支持超长序列

即使训练时:

512 Tokens

推理时:

2048 Tokens

仍可计算位置编码。

无需重新训练。


七、位置编码生成示例

假设:

d_model = 4

位置:

pos = 1

生成:

[
sin(...),

cos(...),

sin(...),

cos(...)
]

位置:

pos = 2

生成:

[
sin(...),

cos(...),

sin(...),

cos(...)
]

最终:

每个位置对应唯一向量。


八、位置编码与Embedding融合

(一)Embedding表示什么

例如:

苹果

Embedding表示:

水果

食物

植物

等语义信息。


(二)位置编码表示什么

例如:

第5个词

表示:

位置信息。


(三)最终融合

Transformer采用:

Embedding

+

Position Encoding

例如:

[0.2,0.5,0.8]

+

[0.1,0.3,0.4]

=

[0.3,0.8,1.2]

最终送入Attention。


九、位置编码可视化理解

可以将位置编码看成:

GPS坐标

系统。

Embedding表示:

你是谁

位置编码表示:

你在哪

两者结合:

身份

+

位置

模型才能真正理解序列。


十、位置编码在Self-Attention中的作用

加入位置编码后:

输入变为:

Token

+

Position

随后:

进入:

Q

K

V

计算。

因此:

Attention不仅关注:

词义

同时关注:

词序

十一、位置编码存在的问题

虽然Sin-Cos编码非常经典。

但仍存在一些局限。


(一)固定编码

训练过程中:

无法更新。

属于:

Fixed Encoding

(二)表达能力有限

对于超长文本:

效果逐渐下降。


(三)无法充分建模相对位置

例如:

A距离B三个词

这种关系表达不够直接。


十二、可学习位置编码

后来研究人员提出:

Learnable Position Embedding

即:

可训练位置编码。


(一)基本思想

直接定义:

Position Matrix

例如:

512 × 768

矩阵。


(二)训练过程中更新

类似:

Embedding

不断优化。


(三)代表模型

例如:

  • BERT

  • ViT

都采用可学习位置编码。


十三、相对位置编码

随着大模型发展。

又出现:

Relative Position Encoding

相对位置编码。


(一)核心思想

不关注:

你在第几位

而关注:

你离我多远

(二)优势

更符合语言规律。

能够更好处理:

长文本

任务。


(三)代表模型

例如:

  • Transformer-XL

  • T5

  • DeBERTa


十四、RoPE旋转位置编码

近年来最热门的位置编码:

RoPE

即:

Rotary Position Embedding

旋转位置编码。


(一)核心思想

通过旋转矩阵:

将位置信息直接融入:

Q

K

计算。


(二)优势

支持:

超长上下文

表现优秀。


(三)应用模型

目前主流大模型:

  • GPT-NeoX

  • LLaMA

  • Qwen

  • DeepSeek

均采用:

RoPE

方案。


十五、PyTorch实现位置编码

下面实现经典Sin-Cos位置编码。

import torch
import math

class PositionalEncoding(torch.nn.Module):

    def __init__(
            self,
            d_model,
            max_len=5000):

        super().__init__()

        pe = torch.zeros(
            max_len,
            d_model
        )

        position = torch.arange(
            0,
            max_len
        ).unsqueeze(1)

        div_term = torch.exp(
            torch.arange(
                0,
                d_model,
                2
            )
            *
            (-math.log(10000.0)
             / d_model)
        )

        pe[:,0::2] = torch.sin(
            position * div_term
        )

        pe[:,1::2] = torch.cos(
            position * div_term
        )

        self.register_buffer(
            'pe',
            pe
        )

    def forward(self,x):

        return x + self.pe[
            :x.size(1)
        ]

该代码就是 Transformer 原始论文中的位置编码实现思想。


十六、总结

位置编码(Positional Encoding)是 Transformer 架构不可或缺的重要组成部分,它解决了 Self-Attention 无法感知词序的问题。

本文重点掌握了:

1、为什么 Transformer 需要位置编码;

2、RNN 与 Transformer 的区别;

3、位置编码核心思想;

4、Sin-Cos位置编码公式;

5、位置编码生成原理;

6、Embedding与位置编码融合方式;

7、固定位置编码与可学习位置编码;

8、相对位置编码思想;

9、RoPE旋转位置编码原理;

10、PyTorch实现方式。

可以将位置编码理解为:

“给每个Token附加一个位置身份证,让Transformer在全局并行计算的同时,依然能够理解序列顺序信息。”

正是位置编码的存在,Transformer 才真正具备了处理自然语言、代码、图像和多模态数据的能力。而随着大模型的发展,从 Sin-Cos 到 Relative Position,再到如今广泛使用的 RoPE,位置编码技术也正在不断演进,成为现代 AI 模型中的关键基础技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvad0s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值