10. embedding
深入解读 Transformer 编码器中的嵌入与位置编码
在搭建 Transformer 编码器时,有两步至关重要:词嵌入(Embedding) 和 位置编码(Positional Encoding)。这两者的组合让模型不仅能够理解词汇的语义信息,还能捕捉序列中词汇的顺序关系。今天,我们将逐步解析代码中的每个组件,理解它们的作用和实现背后的原理。
代码概览
首先来看看这两行关键代码:
self.word_embedding = nn.Embedding(src_vocab_size, embed_size)
self.position_encoding = PositionalEncoding(embed_size, max_length)
这两行代码的功能是将输入的词转换为向量表示,并为每个词加上位置信息。具体含义如下:
src_vocab_size
:词汇表的大小,代表模型可识别的所有独特词汇数量。nn.Embedding
:这是 PyTorch 中的嵌入层,用于将词索引转换为高维向量。PositionalEncoding
:位置编码层,为每个词加上位置信息,使模型能够捕捉词的顺序关系。
1. 什么是 src_vocab_size
?
src_vocab_size
指代源语言(即输入语言)中所有独特词汇的数量,即词汇表的大小。- 词汇表可以看作是模型能“理解”的单词集合,每个词都有一个唯一的索引,这样方便模型操作。
示例代码如下:
src_vocab = {'hello': 0, 'world': 1, 'transformer': 2, 'model': 3}
src_vocab_size = len(src_vocab) # 词汇表大小为 4
在这个示例中,词汇表大小 src_vocab_size
为 4,表示模型可以识别的四个词汇。
2. nn.Embedding
的作用
nn.Embedding
是一个嵌入层,用于将词汇表中的每个词索引转换为向量表示。它的输入是词汇索引,输出是对应的嵌入向量。
工作机制
nn.Embedding
将每个词转换为一个向量。比如,如果词汇表中“hello”的索引是 0,nn.Embedding
会返回一个对应的向量。嵌入层的目标是让模型通过训练学习到一个“词向量空间”,在这个空间中,相关词汇距离更近,从而表达出词汇之间的语义关系。
参数说明
src_vocab_size
:词汇表大小,表示嵌入层能处理的词汇数量。embed_size
:词嵌入的维度,也就是每个词向量的长度。
示例代码
假设我们定义了一个小型嵌入层:
src_vocab_size = 4 # 假设词汇表大小为4
embed_size = 3 # 每个词的嵌入向量为3维embedding_layer = nn.Embedding(src_vocab_size, embed_size)
使用 nn.Embedding
将每个词索引映射为 3 维向量:
print(embedding_layer(torch.tensor([0, 1, 2, 3])))
# 输出的张量形状为 (4, 3),每个词有一个3维向量表示
理解嵌入层的作用:nn.Embedding
的主要目的是将离散的词汇索引转换为连续向量,这些向量在训练中不断调整,使得语义相近的词聚集在一起,而语义差异大的词则保持距离。
3. PositionalEncoding
的作用
位置编码(Positional Encoding)用于为每个词嵌入向量加入位置信息。在 Transformer 中,自注意力机制是无序的,这意味着模型不会自动捕捉到词序。因此,位置编码是必不可少的,它帮助模型理解句子中词汇的顺序。
工作机制
位置编码为每个词生成一个唯一的编码向量,编码的生成通常使用正弦和余弦函数。这些位置向量与词嵌入相加,使得模型在学习过程中能够区分出词语的相对位置。
- 输入:词嵌入向量
x
,形状为(batch_size, seq_length, embed_size)
。 - 输出:在词嵌入向量上加上位置编码后的向量,形状不变,但包含了位置信息。
示例代码
embed_size = 4
max_length = 10
pos_encoding = PositionalEncoding(embed_size, max_length)x = torch.rand(1, 5, embed_size) # 假设有一个句子,长度为5,batch_size为1
output = pos_encoding(x)
直观理解:位置编码通过正弦和余弦函数,为每个词的嵌入向量加上一个独特的“标记”,让模型识别词的相对位置关系。
综合应用:词嵌入和位置编码的结合
在 Transformer 编码器中,首先使用 nn.Embedding
将输入的词索引转换为向量表示,然后通过 PositionalEncoding
层将位置信息加到词向量中,使得模型既能理解词汇语义,又能识别词序信息。
代码片段:
out = self.word_embedding(x) # 将词索引转换为嵌入向量
out = self.position_encoding(out) # 加入位置编码信息
总结
src_vocab_size
:定义词汇表大小,表示模型可处理的词汇数量。nn.Embedding
:将词汇索引转化为连续向量,为模型提供词汇的语义表示。PositionalEncoding
:为每个词向量加上位置信息,使模型能够捕捉序列中的词序关系。
通过这些模块的结合,模型不仅能够理解词汇语义,还能识别词汇的相对位置,为后续的编码过程奠定基础。如果你对 Transformer 编码器或其他部分有进一步兴趣,欢迎继续探索或留言讨论!