# 输入编码

# 直观理解

在Transformer中,输入编码就像是将文本转换成机器可以理解的语言。想象一个翻译官,在开始翻译之前,需要先将每个单词转换成一种标准化的表示形式,这就是输入编码的过程。

# 技术原理

# 1. 词嵌入(Word Embedding)

词嵌入是将离散的词转换为连续的向量表示。在Transformer中,每个词都被映射到一个d_model维的向量空间(通常是512维)。

# 2. 嵌入维度

选择合适的嵌入维度d_model非常重要,它需要:

  • 足够大以捕获词的语义信息
  • 不能过大以避免计算开销
  • 通常选择512或768等2的幂次

# 数学表达

# 1. 词嵌入计算

对于输入序列中的每个词 xix_i,通过查找嵌入矩阵 EE 得到其向量表示:

hi=Exih_i = E x_i

其中:

  • xix_i 是词的one-hot编码
  • EE 是嵌入矩阵,维度为 [V,dmodel][V, d_{model}]
  • hih_i 是词的嵌入向量,维度为 dmodeld_{model}

# 2. 缩放因子

为了保持嵌入值的适当范围,通常会应用一个缩放因子:

hi=dmodelExih_i = \sqrt{d_{model}} \cdot E x_i

# 实现细节

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)

# 注意事项

  1. 词表大小选择

    • 需要在覆盖率和计算效率之间权衡
    • 常见大小为30k-50k
  2. 嵌入共享

    • 编码器和解码器的嵌入层可以共享权重
    • 可以与最后的输出层共享权重
  3. 预训练词嵌入

    • 可以使用预训练的词嵌入初始化
    • 需要确保维度匹配

# 优化技巧

  1. 词表压缩

    • 使用子词分词算法(BPE、WordPiece等)
    • 减少罕见词的影响
  2. 嵌入正则化

    • 使用权重衰减
    • 应用dropout
  3. 参数高效性

    • 使用参数共享减少模型大小
    • 采用低秩分解减少参数量