一、输入部分介绍
输入部分包含:
编码器源文本嵌入层及其位置编码器
解码器目标文本嵌入层及其位置编码器
在transformer的encoder和decoder的输入层中,使用了Positional Encoding,使得最终的输入满足:
这里,input_embedding是通过常规embedding层,将每一个词的向量维度从vocab_size映射到d_model,由于是相加关系,自然而然地,这里的positional_encoding也是一个d_model维度的向量。(在原论文里,d_model=512)
二、文本嵌入层
文本嵌入层(Text Embedding Layer)是深度学习模型中将文本(通常是单词或句子)转换为固定大小的向量表示的一个关键层。它的目标是将每个文本单元(如单词或子词)映射到一个高维空间中,以便模型能够更好地捕捉到词汇的语义信息和语法信息。
无论是源文本嵌入还是目标文本嵌入,都是为了将文本中词汇的数字表示转变为向量表示, 希望在这样的高维空间捕捉词汇间的关系。常见的词嵌入方法包括:Word2Vec, GloVe, FastText, 以及可学习的embedding层。
nn.Embedding演示:
Python
embedding = nn.Embedding(num_embeddings=10, embedding_dim=3)
input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
print(embedding(input))
# padding_idx: 指定用于填充的索引。如果设置为0,则索引为0的输入将始终映射到一个全零向量,并且在反向传播时不会更新该嵌入。
# 全零向量:padding_idx 指定的索引(如0)会被映射到一个全零向量。
# 不更新梯度:在训练过程中,padding_idx 对应的嵌入向量不会被更新。
# 用途:常用于处理变长序列的填充部分,避免填充部分对模型训练产生影响。
embedding = nn.Embedding(num_embeddings=10, embedding_dim=3, padding_idx=0)
input = torch.LongTensor([[0, 2, 0, 5]])
print(embedding(input))
输出结果:
Python
tensor([[[-1.0378, 0.0594, 2.6601],
[ 1.0423, -0.4094, 0.3436],
[-1.8989, 1.3664, -0.3701],
[ 0.3930, 0.9908, 1.5700]],
[[-1.8989, 1.3664, -0.3701],
[ 0.3479, -0.2118, -0.1244],
[ 1.0423, -0.4094, 0.3436],
[ 0.4161, 0.4799, -0.4094]]], grad_fn=<EmbeddingBackward0>)
tensor([[[ 0.0000, 0.0000, 0.0000],
[-0.3378, 1.1013, -1.7552],
[ 0.0000, 0.0000, 0.0000],
[ 0.9153, 0.3548, 2.1857]]], grad_fn=<EmbeddingBackward0>)
文本嵌入层的代码实现:
Python
# 导入必备的工具包
import torch
# 预定义的网络层torch.nn, 工具开发者已经帮助我们开发好的一些常用层,
# 比如,卷积层, lstm层, embedding层等, 不需要我们再重新造轮子.
import torch.nn as nn
# 数学计算工具包
import math
# Embeddings类 实现思路分析
# 1 init函数 (self, d_model, vocab)
# 设置类属性 定义词嵌入层 self.lut层
# 2 forward(x)函数
# self.lut(x) * math.sqrt(self.d_model)