跳转至

07 - Transformer架构面试题

Transformer架构面试题图

注意力机制、位置编码、多头注意力

📖 章节概述

本章将深入探讨Transformer架构的面试题,包括注意力机制、位置编码、多头注意力等核心内容。

🎯 学习目标

完成本章后,你将能够:

  • 深入理解Transformer架构
  • 掌握注意力机制的原理
  • 了解各种位置编码方法
  • 能够回答相关面试题

1. 注意力机制

Q1: 什么是自注意力机制?

解答: 自注意力机制允许序列中的每个位置都关注序列中的所有其他位置,计算它们之间的相关性。

核心步骤: 1. 线性变换:将输入X通过三个线性变换得到Q、K、V 2. 计算注意力分数:Q和K的点积 3. 缩放:除以√d_k防止梯度消失 4. Softmax归一化:得到注意力权重 5. 加权求和:用注意力权重对V进行加权求和

公式

Text Only
Attention(Q, K, V) = softmax(QK^T / √d_k) V

Q2: 多头注意力的优势是什么?

解答: 多头注意力将注意力机制并行执行多次,每个头学习不同的表示。

优势: 1. 捕获不同特征:每个头可以关注不同的子空间 2. 提高表达能力:组合多个头的输出 3. 并行计算:多个头可以并行计算 4. 更好的泛化:避免单一注意力的局限性

计算公式

Text Only
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) W^O
head_i = Attention(Q W_i^Q, K W_i^K, V W_i^V)

Q3: 为什么需要缩放因子?

解答: 缩放因子1/√d_k用于防止点积过大导致Softmax梯度消失。

原因: 1. 点积值过大:当d_k较大时,QK^T的值会很大 2. Softmax梯度消失:大的输入会导致Softmax梯度接近0 3. 训练不稳定:梯度消失导致训练困难

解决方案: - 除以√d_k缩放点积 - 使Softmax输入保持在合理范围 - 保证梯度稳定

2. 位置编码

Q4: 为什么需要位置编码?

解答: Transformer的自注意力机制本身没有位置信息,需要显式添加位置编码。

原因: 1. 置换不变性:自注意力对输入顺序不敏感 2. 需要位置信息:语言任务依赖词序 3. 显式编码:通过位置编码注入位置信息

Q5: 常见的位置编码方法有哪些?

解答: 常见的位置编码方法:

  1. 正弦/余弦位置编码
  2. 使用固定正弦余弦函数
  3. 不同维度使用不同频率
  4. 可以处理未见过的位置

  5. 可学习位置嵌入

  6. 将位置编码为可学习参数
  7. 简单有效
  8. 限制最大序列长度

  9. 相对位置编码

  10. T5 Bias
  11. Transformer-XL
  12. 可以处理更长序列

  13. 旋转位置编码(RoPE)

  14. 通过旋转矩阵编码相对位置
  15. 当前最流行
  16. 兼容性好

Q6: RoPE相比其他位置编码的优势?

解答: RoPE(Rotary Positional Embedding)的优势:

  1. 相对位置:自然编码相对位置信息
  2. 数值稳定:避免数值溢出问题
  3. 外推性好:可以处理比训练时更长的序列
  4. 计算高效:可以与注意力计算融合
  5. 兼容性好:可以与现有模型无缝集成

3. 架构组件

Q7: 前馈网络的作用是什么?

解答: 前馈网络(FFN)对每个位置的表示进行非线性变换。

作用: 1. 增加模型容量:提供额外的参数 2. 非线性变换:激活函数引入非线性 3. 特征提取:提取更高级的特征

结构

Text Only
FFN(x) = max(0, xW_1 + b_1) W_2 + b_2

Q8: 残差连接和层归一化的作用?

解答: 残差连接和层归一化是Transformer的关键组件。

残差连接: - 作用:缓解梯度消失问题 - 原理:x + F(x) - 优势:允许梯度直接流过网络

层归一化: - 作用:稳定训练过程 - 原理:归一化层输入 - 优势:加速收敛,提高稳定性

Q9: Encoder和Decoder的区别是什么?

解答: Encoder和Decoder的主要区别:

特性 Encoder Decoder
注意力类型 自注意力 自注意力 + 编码-解码注意力
掩码 不需要 需要因果掩码
应用 理解输入 生成输出
输入 源序列 目标序列 + 编码输出

4. 练习题

基础练习

  1. 实现自注意力

    Python
    # TODO: 实现自注意力
    def self_attention(Q, K, V, mask=None):
        # 你的代码
        pass
    

  2. 实现位置编码

    Python
    # TODO: 实现正弦位置编码
    def sinusoidal_positional_encoding(seq_len, d_model):
        # 你的代码
        pass
    

进阶练习

  1. 实现多头注意力

    Python
    # TODO: 实现多头注意力
    class MultiHeadAttention(nn.Module):
        def __init__(self, d_model, num_heads):
            # 你的代码
            pass
    
        def forward(self, x, mask=None):
            # 你的代码
            pass
    

  2. 实现RoPE

    Python
    # TODO: 实现旋转位置编码
    def rotate_positional_embeddings(x, cos, sin):
        # 你的代码
        pass
    

5. 最佳实践

✅ 面试技巧

  1. 深入理解
  2. 理解每个组件的作用
  3. 掌握数学原理
  4. 了解设计决策

  5. 代码实现

  6. 准备关键代码
  7. 理解实现细节
  8. 能够解释代码

  9. 对比分析

  10. 对比不同方法
  11. 分析优缺点
  12. 说明适用场景

❌ 避免做法

  1. 表面理解
  2. 不要只记概念
  3. 理解原理和公式
  4. 能够灵活应用

  5. 忽视细节

  6. 注意技术细节
  7. 理解设计权衡
  8. 了解最新进展

  9. 缺乏实践

  10. 结合代码实现
  11. 动手实践验证
  12. 积累项目经验

6. 总结

本章介绍了Transformer架构的面试题:

  • 注意力机制: 自注意力、多头注意力、缩放因子
  • 位置编码: 正弦编码、可学习编码、RoPE
  • 架构组件: FFN、残差连接、层归一化、Encoder vs Decoder

深入理解这些内容是面试的关键。

7. 下一步

继续学习08-预训练和微调面试题,了解预训练和微调的相关知识。