在进入 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维

1333

被折叠的 条评论
为什么被折叠?



