一个句子在送入transformer之前经历了什么

在进入 decoder(无论是 Transformer 的文本生成模型、机器翻译模型还是其他序列到序列模型)之前,输入的句子必须先被编码成 token(数值化表示),整个过程可以分成以下几个关键步骤:


文本标准化(Preprocessing/Normalization)

在真正分词之前,模型通常会先对原始文本进行一些预处理:

  • 大小写处理:是否保留大小写(如 GPT 系列保留大小写,BERT 不区分大小写)。

  • 空格/标点统一:去除多余空格、统一标点符号(如全角/半角)。

  • Unicode 规范化:把不同编码的同一字符(如“é” vs “e+´”)统一。

例如:
原句:

I’m learning Transformers!

可能会先标准化为:

I'm learning Transformers !

分词(Tokenization)

这是核心步骤,将句子拆分为模型词表(vocabulary)中存在的“token”单元。
不同模型的分词策略不同,但目标都是把文本映射到一系列离散的 token ID

常见分词算法:

算法特点例子
Word-level按单词切分"I", "love", "NLP"
Character-level按字符切分"I", "l", "o", "v", "e"
BPE (Byte Pair Encoding)根据统计频率,把常见子词合并"Trans", "form", "ers"
WordPiece类似 BPE,BERT 使用"learn", "##ing"
SentencePiece (Unigram)不依赖空格,适合多语言"▁I'm", "▁learning", "▁Transformers"

👉 例如使用 BPE 分词:

I'm learning Transformers!
↓
["I", "'", "m", " learning", " Transformers", "!"]

映射到 Token ID

模型的词表(vocabulary)中,每个 token 对应一个唯一的 整数 ID
分词器会把字符串 token 转换成对应的数字序列。

例如:

["I", "'", "m", " learning", " Transformers", "!"]
↓
[40, 12, 58, 305, 8971, 5]

(这里的数字只是示例,不同模型的词表不同)


添加特殊符号

在进入 decoder 之前,通常需要加上一些特殊 token:

  • <BOS>(Begin of Sentence):表示句子开始

  • <EOS>(End of Sentence):表示句子结束

  • <PAD>:用于填充到固定长度

  • <SEP>:分隔不同句子(用于多句任务)

例如(以机器翻译模型为例):

<BOS> I ' m learning Transformers ! <EOS>
↓
[1, 40, 12, 58, 305, 8971, 5, 2]

数值张量化

最终这些 Token ID 会被打包成 Tensor(通常是 int64),方便送入模型:

  • 形状[batch_size, sequence_length]

  • 例子:

[[1, 40, 12, 58, 305, 8971, 5, 2]]

在送入 decoder(或者任何 Transformer 层)之前,纯整数的 token id 不能直接进入网络,因为神经网络无法理解“40”或“8971”这样的离散编号。
通常的流程是:


Token ID → Embedding Lookup

  • 模型内部会有一个 嵌入层 (Embedding Layer),可以理解成一个 “词表大小 × 嵌入维度” 的矩阵。

  • 假设:

    • 词表大小 = V(比如 GPT-2 的词表大约 50,000)

    • 嵌入维度 = d_model(比如 128、256、512、768…)

  • 这个矩阵的形状就是:

[词表大小 V ,  d_model]
  • 每个 token id 就是去查这个矩阵对应行,把整数 id 映射成一个 d_model 维的向量

例如:

token_ids = [1, 40, 305]
Embedding 矩阵 E 的维度: [50000, 128]

查表后得到:

[
  E[1],     # 128维向量
  E[40],    # 128维向量
  E[305]    # 128维向量
]

形状就变成:

[sequence_length, d_model]

加入 位置编码 (Positional Encoding)

Transformer 没有循环结构,不知道 token 的顺序,因此需要加入位置信息:

  • 可学习位置向量(Learned Positional Embedding)

  • 固定正余弦位置编码(Sinusoidal Encoding)

这一步通常是向量相加

输入到decoder = Token Embedding + Positional Encoding

送入 Decoder

最终输入给 decoder 的张量形状一般是:

[batch_size, sequence_length, d_model]

例如:

[32, 20, 128]   # 32个句子,每句20个token,每个token是128维
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值