Transformer模型的输入表示部分是通过以下步骤生成的:
-
词汇表(Vocabulary):需要建立一个包含所有可能词汇的词汇表。词汇表通常是按照词频排序的,以便模型能够更有效地学习常见的词汇。
-
分词(Tokenization):文本数据被分割成一系列的词或子词(tokens)。这个过程可能涉及到单词分割、去除标点符号等。
-
索引化(Indexing):将分词后的词转换为词汇表中的索引。每个索引代表词汇表中对应的词。
-
嵌入层(Embedding Layer):索引化的词汇通过嵌入层转换为密集的向量表示。嵌入层通常是一个可学习的参数矩阵,其中每一行代表词汇表中一个词的向量表示。
-
位置编码(Positional Encoding):由于Transformer模型没有递归和卷积层,无法自动捕获序列中的位置信息,因此需要手动添加位置编码。位置编码通常是基于正弦和余弦函数的固定模式,添加到嵌入向量中。
以下为一个简化的Python代码示例,说明如何实现上述步骤:
import torch
import torch.nn as nn
import torch.nn.functional as F
# 假设我们已经有了一个词汇表,并定义了一些基本的参数
vocab_size = 10000
embed_dim = 512
max_seq_len = 100
# 嵌入层
embedding = nn.Embedding(vocab_size, embed_dim)
# 位置编码
pos_encoding = torch.zeros(max_seq_len, embed_dim)
position = torch.arange(0, max_seq_len, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, embed_dim, 2).float() * (-math.log(10000.0) / embed_dim))
pos_encoding[:, 0::2] = torch.sin(position * div_term)
pos_encoding[:, 1::2] = torch.cos(position * div_term)
# 假设我们有一段文本数据,已经被分词并转换为索引序列
text_indices = [...] # 例如:[123, 456, 789, ...]
# 将索引序列转换为张量,并嵌入词汇
text_embedding = embedding(torch.LongTensor(text_indices))
# 添加位置编码
text_embedding_pos = text_embedding + pos_encoding[:text_embedding.size(0)]
# 现在text_embedding_pos包含了模型输入的表示
在这个示例中,embedding
是嵌入层,pos_encoding
是位置编码,text_indices
是分词后文本的索引序列。
整个代码实现过程中,首先将索引序列通过嵌入层转换为词向量,然后将位置编码加到这些词向量上,以形成模型的输入表示。