1. Transformer输入部分概述
在自然语言处理领域,Transformer模型彻底改变了序列建模的方式。与传统的RNN或CNN不同,Transformer完全依赖注意力机制来处理序列数据,这就对输入表示提出了更高要求。输入部分作为模型的第一道"工序",需要完成两项核心任务:将离散的词汇符号转化为连续的向量表示(文本嵌入),以及为这些向量注入位置信息(位置编码)。
我曾在一个机器翻译项目中深刻体会到输入处理的重要性。当源语言句子"我爱自然语言处理"被输入模型时,首先会被转换为类似[23, 56, 102, 304, 198]的索引序列(假设这些数字代表词汇在词表中的位置)。但这种纯数字表示丢失了太多信息——既无法体现词语之间的语义关系,也无法反映它们在句子中的位置。这正是Transformer输入部分要解决的关键问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 文本嵌入层深度解析
2.1 嵌入层的本质作用
文本嵌入层的核心使命是将稀疏的离散表示转化为稠密的连续表示。想象一下,如果我们直接用one-hot编码表示词汇,对于10,000词的词表,每个词都将表示为10,000维的向量,其中只有一位是1,其余全是0。这不仅浪费存储空间,更重要的是无法表达词与词之间的任何关系。
嵌入层通过一个可学习的查找表(lookup table)解决了这个问题。在我的实践中,使用512维嵌入时,每个词会被映射为512维空间中的一个点。语义相近的词(如"猫"和"狗")在这个空间中会自然靠近,这为模型后续理解语义关系奠定了基础。
关键经验:嵌入维度并非越大越好。在某个文本分类任务中,当我将d_model从256增加到1024时,准确率仅提升0.3%,但计算成本却翻了两番。通常512维在效果和效率之间取得了良好平衡。
2.2 嵌入层的PyTorch实现细节
让我们深入分析Embeddings类的实现要点:
python复制class Embeddings(nn.Module):
def __init__(self, d_model, vocab):
super(Embeddings, self).__init__()
self.d_model = d_model # 典型值:512
self.vocab = vocab # 词表大小,如30000
self.lut = nn.Embedding(vocab, d_model)
def forward(self, x):
return self.lut(x) * math.sqrt(self.d_model)
这里的nn.Embedding是PyTorch提供的嵌入层实现,其本质是一个可训练的矩阵,行数为vocab大小,列数为d_model。当输入一个形状为[batch_size, seq_len]的索引张量时,它会输出[batch_size, seq_len, d_model]的嵌入结果。
乘以`
