自学内容网 自学内容网

深入解读 Transformer 编码器中的嵌入与位置编码

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)

这两行代码的功能是将输入的词转换为向量表示,并为每个词加上位置信息。具体含义如下:

  1. src_vocab_size:词汇表的大小,代表模型可识别的所有独特词汇数量。
  2. nn.Embedding:这是 PyTorch 中的嵌入层,用于将词索引转换为高维向量。
  3. 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 编码器或其他部分有进一步兴趣,欢迎继续探索或留言讨论!


原文地址:https://blog.csdn.net/weixin_52582573/article/details/143580171

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!