Q1005LLM 基础概念真题解析LLM 基础AgentAlpha 社区真题库约 8 分钟更新 2026-09-29

Transformer在哪里做了权重共享

Transformer在哪里做了权重共享

1️⃣ 考察意图

面试官想考察你对 Transformer 参数效率的深度理解,而非简单背诵架构图。这是“工程取舍”型问题,刁钻点在于:权重共享看似节省参数,但会引入梯度耦合和表达瓶颈,需要你辩证分析利弊。答好了能展示你对模型压缩、训练稳定性、以及不同任务(如生成 vs 分类)下共享策略的实战洞察,而非纸上谈兵。

2️⃣ 标准答

Transformer 的权重共享主要发生在两个层面:嵌入层与输出层,以及少数变体中的跨层共享。标准 Transformer 的注意力层(Q/K/V/O)和 FFN 层各自独立,不共享。

1. 嵌入层与输出层共享(Token Embedding & LM Head)

  • 机制:输入 Embedding 矩阵(形状 [vocab_size, d_model])与 Softmax 前的线性投影层(LM Head)共享同一权重。在 GPT、BERT、T5 等主流模型中,这是默认做法。
  • 为什么这么做:
  • 参数节省:当 vocab_size 很大(如 50k-100k)时,LM Head 的参数量可达 vocab_size * d_model,与 Embedding 层相同。共享后直接减半这部分参数,对 1B+ 模型可节省数亿参数。
  • 语义对齐:Embedding 层学习“词义向量”,LM Head 学习“预测该词的概率分布”。共享强制两者在同一语义空间,避免梯度冲突,加速收敛。论文《Using the Output Embedding to Improve Language Models》(Press & Wolf, 2017)首次验证了这一点。
  • 实际落地的坑 + 解法:
  • 坑:共享后,Embedding 层同时接收输入梯度和输出梯度,导致梯度爆炸或消失,尤其在训练初期。例如,LLaMA 系列在预训练时发现共享后 loss 下降变慢。
  • 解法:对 Embedding 层施加 LayerNorm(如 GPT-2 的做法)或 权重衰减(weight decay)来稳定梯度;或采用 Tie Embedding with Scale(如 ALBERT 中除以 sqrt(d_model) 缩放)。

2. 跨层共享(Cross-layer Sharing)

  • 机制:在标准 Transformer 中,每层有独立的 Q/K/V/O 和 FFN 权重。但 ALBERT 等模型在所有层间共享同一套注意力参数和 FFN 参数。
  • 为什么这么做:
  • 极致参数压缩:ALBERT 的参数量仅为 BERT-base 的 1/18,但性能下降有限(GLUE 上仅低 1-2 分)。适合移动端或低资源场景。
  • 工程取舍:共享层数后,模型深度不变(仍为 12 层),但每层权重相同。这相当于用“循环迭代”替代“层级分化”,牺牲了每层学习不同特征的能力,但保留了深度带来的感受野。
  • 实际落地的坑 + 解法:
  • 坑:跨层共享导致所有层梯度相同,模型容易陷入局部最优,表达能力下降。例如,在长文本分类任务中,共享模型比非共享模型 F1 低 3-5%。
  • 解法:在共享层间插入 Layer-wise Adapter(如 LoRA 微调时对不同层施加不同秩)或 Stochastic Depth(随机跳过某些共享层),打破梯度同质性。

3. 位置编码不共享

  • 绝对位置编码(如 Sinusoidal)或可学习位置编码(如 BERT)是独立的,不与任何层共享。RoPE 等相对位置编码通过旋转矩阵实现,也不涉及权重共享。

4. 注意力层内部不共享

  • Q、K、V 投影矩阵各自独立,即使多头注意力中,每个 head 的 Q/K/V 也是独立子矩阵(通过切分实现)。共享 Q/K/V 会导致注意力分布退化,无法捕捉不同子空间的关系。

3️⃣ 答题模板(30 秒电梯版)

“这个问题我从三个层面回答:第一,嵌入层与输出层共享,这是最普遍的,能节省 vocab_size * d_model 参数,但需注意梯度稳定性;第二,跨层共享,如 ALBERT,用于极致压缩,但会牺牲表达能力;第三,位置编码和注意力层内部不共享,这是架构设计决定的。总结一句:权重共享的核心是参数效率与表达能力的 trade-off,具体选择取决于任务对模型大小和精度的要求。”

4️⃣ 高频追问 & 应对

追问 1:为什么 BERT 和 GPT 都默认共享嵌入层和输出层,但 LLaMA 却选择不共享?

应对策略:LLaMA 不共享是因为其训练策略和架构设计。首先,LLaMA 使用 SwiGLU 激活函数和 RoPE 位置编码,模型本身参数量已通过其他方式优化(如 FFN 的 hidden_dim 缩放)。其次,不共享可以解耦输入和输出梯度,避免共享带来的梯度耦合,这在超大规模(65B+)训练中更稳定。最后,LLaMA 的 vocab_size 较小(32k),不共享仅增加约 0.5% 参数,影响可忽略。所以,共享与否取决于 vocab_size 大小和训练稳定性需求。

追问 2:如果我要在 1B 参数的模型上做权重共享,你会建议共享哪些层?为什么?

应对策略:建议共享嵌入层和输出层,但不共享跨层。原因:1B 模型参数量适中,跨层共享会显著降低性能(GLUE 上可能掉 3-5 分),而嵌入层共享可节省约 10-15% 参数(假设 vocab_size=50k, d_model=2048),且对下游任务影响小。如果追求极致压缩(如部署到手机),可考虑共享前 6 层和后 6 层(分组共享),而非全部共享,这样保留部分层级差异。

追问 3:权重共享对微调(Fine-tuning)有什么影响?

应对策略:共享的权重在微调时梯度更新更剧烈,因为输入和输出梯度叠加。这可能导致微调后嵌入层过拟合,尤其在小数据集上。解法:微调时对共享层使用更低的学习率(如 1e-5 vs 其他层 3e-5),或冻结嵌入层只微调上层。另外,共享模型在微调时更易出现“灾难性遗忘”,因为共享层同时影响输入和输出,建议使用 LoRA 等参数高效微调方法,只更新低秩矩阵,避免扰动共享权重。

5️⃣ 避坑 · 常见错误答法

  • ❌ 说“Transformer 所有层都共享权重,像 RNN 一样” → ✅ 正确:标准 Transformer 每层独立,只有 ALBERT 等变体做跨层共享。混淆了“深度”和“循环”概念。
  • ❌ 说“位置编码也共享,因为每个位置都用同一个向量” → ✅ 正确:位置编码是独立的,每个位置有唯一向量,不与其他层或位置共享。共享位置编码会导致模型无法区分位置。
  • ❌ 说“权重共享一定更好,因为参数少” → ✅ 正确:共享会降低表达能力,需根据任务权衡。例如,在机器翻译中共享嵌入层可提升 BLEU 0.5-1 分,但在情感分类中可能无影响甚至下降。

6️⃣ 简历呼应

  • 如果你有 RAG 项目:从“检索器与生成器共享 Embedding”角度切入,说明共享可减少存储(如 FAISS 索引与 LLM 嵌入层共享),但需注意检索精度下降,可用双编码器(DPR)解耦。
  • 如果你只做过传统 NLP:用“词向量与分类器共享”类比,说明在文本分类中,共享词向量和 softmax 权重可减少过拟合,类似 Transformer 的嵌入层共享。
  • 如果你是校招无项目:聚焦 ALBERT 论文复现,强调你实现了跨层共享并对比了参数量和 GLUE 分数,展示对 trade-off 的理解。
  • 《Using the Output Embedding to Improve Language Models》(Press & Wolf, 2017)
  • 《ALBERT: A Lite BERT for Self-supervised Learning of Language Representations》(Lan et al., 2019)
  • 《T5: Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》(Raffel et al., 2020)——附录中讨论嵌入层共享
  • 《LLaMA: Open and Efficient Foundation Language Models》(Touvron et al., 2023)——不共享的实践细节
  • 《LoRA: Low-Rank Adaptation of Large Language Models》(Hu et al., 2021)——微调共享层时的参数高效方法

—— 本场面试完 ——