# 输入编码
# 直观理解
在Transformer中,输入编码就像是将文本转换成机器可以理解的语言。想象一个翻译官,在开始翻译之前,需要先将每个单词转换成一种标准化的表示形式,这就是输入编码的过程。
# 技术原理
# 1. 词嵌入(Word Embedding)
词嵌入是将离散的词转换为连续的向量表示。在Transformer中,每个词都被映射到一个d_model维的向量空间(通常是512维)。
# 2. 嵌入维度
选择合适的嵌入维度d_model非常重要,它需要:
- 足够大以捕获词的语义信息
- 不能过大以避免计算开销
- 通常选择512或768等2的幂次
# 数学表达
# 1. 词嵌入计算
对于输入序列中的每个词 ,通过查找嵌入矩阵 得到其向量表示:
其中:
- 是词的one-hot编码
- 是嵌入矩阵,维度为
- 是词的嵌入向量,维度为
# 2. 缩放因子
为了保持嵌入值的适当范围,通常会应用一个缩放因子:
# 实现细节
class InputEmbedding(nn.Module):
def __init__(self, vocab_size, d_model):
super().__init__()
self.d_model = d_model
self.embedding = nn.Embedding(vocab_size, d_model)
def forward(self, x):
# 应用缩放因子
return self.embedding(x) * math.sqrt(self.d_model)
# 注意事项
词表大小选择
- 需要在覆盖率和计算效率之间权衡
- 常见大小为30k-50k
嵌入共享
- 编码器和解码器的嵌入层可以共享权重
- 可以与最后的输出层共享权重
预训练词嵌入
- 可以使用预训练的词嵌入初始化
- 需要确保维度匹配
# 优化技巧
词表压缩
- 使用子词分词算法(BPE、WordPiece等)
- 减少罕见词的影响
嵌入正则化
- 使用权重衰减
- 应用dropout
参数高效性
- 使用参数共享减少模型大小
- 采用低秩分解减少参数量
← Transformer架构 位置编码 →