当前位置: 首页 > news >正文

【多模态大模型面经】 Transformer 专题面经

在这里插入图片描述

🧔 这里是九年义务漏网鲨鱼,研究生在读,主要研究方向是人脸伪造检测,长期致力于研究多模态大模型技术;国家奖学金获得者,国家级大创项目一项,发明专利一篇,多篇论文在投,蓝桥杯国家级奖项、妈妈杯一等奖。
✍ 博客主要内容为大模型技术的学习以及相关面经,本人已得到B站、百度、唯品会等多段多模态大模型的实习offer,为了能够紧跟前沿知识,决定写一个“从零学习 RL”主题的专栏。这个专栏将记录我个人的主观学习过程,因此会存在错误,若有出错,欢迎大家在评论区帮助我指出。除此之外,博客内容也会分享一些我在本科期间的一些知识以及项目经验。
🌎 Github仓库地址:Baby Awesome Reinforcement Learning for LLMs and Agentic AI
📩 有兴趣合作的研究者可以联系我:yirongzzz@163.com

前言

✍ 本专题假设读者已有相关基础知识储备,目标是帮助读者以更高效的方式快速回顾每个关键知识点。本专题汇集了个人在准备多模态、大模型、强化学习等前沿岗位面试过程中总结的核心知识点,同时记录了本人在真实面试中面试官的提问。通过高效回顾这些内容,读者可以快速掌握关键概念和实践经验,为面试和工作打下坚实基础。

文章目录

    • 前言
    • 一、Transformer 基本架构
        • 🧠 1. Transformer的Encoder和Decoder分别是怎么设计的
        • 🧠 2. 为什么有 Encoder-Decoder 和 Decoder-Only 两种不同的架构?它们各自适合什么场景?
        • 📝 主流 LLM 和多模态大模型架构对比表
    • 二、位置编码
        • 🧠 3. Transformer提出了什么位置编码,具体怎么实现的
        • 🧠 4. 你还了解过什么位置编码 (真实面试提问)
    • 三、多头注意力机制
        • 🧠 5. 为什么需要缩放因子 (真实面试)
        • 🧠 6. 为什么要采用多头注意力机制
        • 🧠 7. Encoder和Decoder中用的注意力机制有什么不同
    • 四、LayerNorm 与 残差连接
      • 🧱 1. 残差连接(Residual Connection)
      • ⚖️ 2. Layer Normalization(LN)
        • 🧠 8. 为什么 Transformer 不使用 BatchNorm(BN)
    • 五、手撕代码
      • 1️⃣ 手撕 Scaled Dot-Product Attention
      • 2️⃣ 手撕 Multi-Head Attention
      • 3️⃣ 手撕 Position-wise Feed Forward Network (FFN)
      • 4️⃣ 手撕 Add & Norm 模块(Residual + LayerNorm)
      • 5️⃣ 手撕 Encoder Layer
    • 六、总结

一、Transformer 基本架构

对于 Transformer,相信读者已经相当熟悉,因为当前大多数 LLM 都沿用了其基本架构。然而,一旦涉及具体细节,很多人可能一时难以回答。因此,本节将回顾 Transformer 的核心架构与设计要点,帮助读者在面试或实际应用中快速理清思路。

Transformer 采用了Encoder-Decoder架构,用来取代 RNN/LSTM 在长距离依赖建模上的局限。核心思想是通过注意力计算任意位置之间的信息交互,而不依赖递归或卷积的顺序处理,使得训练并行化更容易、捕捉长程依赖能力更强。

这时,面试官可能就会咨询你第一个问题了:

🧠 1. Transformer的Encoder和Decoder分别是怎么设计的
  • Encoder结构:每一层 Encoder Layer 包含两个主要的子层(Sub-layers):① 多头注意力层 ② 前馈网络层;
  • Decoder结构:每一层 Decoder Layer 包含三个主要的子层(Sub-layers):① 掩码多头自注意力 ② 编码器-解码器注意力 ③ 前馈网络层;
  • 连接方式:Encoder和Decoder层与层之间的连接方式都相同,每个子层都使用了残差连接 (Residual Connection)LayerNorm,即
Output = LayerNorm(X + SubLayer(X))

在这里插入图片描述


在了解了Transformer架构后,我们还需要知道为什么是Encoder-Decoder这样子的架构模式,在现在的主流LLM中,也依然存在着不少Decoder-Only的架构,因此面试官还可能问:

🧠 2. 为什么有 Encoder-Decoder 和 Decoder-Only 两种不同的架构?它们各自适合什么场景?
  • Encoder-Decoder 架构:适用于序列到序列(seq2seq)任务,如机器翻译、摘要生成。Encoder 编码完整输入序列,需要通过 Encoder 理解图文或文本知识,再通过 Decoder 生成输出序列,能够显式建模输入-输出对应关系,表现更强。

  • Decoder-Only 架构:适合语言建模、文本生成和自回归任务。整个模型只包含 Decoder,通过自回归预测下一个 token,结构更简洁,便于大规模训练,但在输入-输出对齐和条件生成任务上通常不如 Encoder-Decoder 强。因此,在纯生成任务中,使用 Decoder-Only 架构是可行且高效的,因为模型只需要预测下一个 token,不需要显式处理输入-输出对齐。对于这些任务,Decoder-Only 能够充分利用自回归生成能力,并且结构简单便于大规模训练。

在这里插入图片描述


📝 主流 LLM 和多模态大模型架构对比表
模型架构类型输入类型输出类型典型应用
GPT 系列Decoder-Only文本文本语言建模、文本生成、自回归任务
BERTEncoder-Only文本表征向量表征学习、分类、问答
T5Encoder-Decoder文本文本机器翻译、摘要、seq2seq 任务
FLAN-T5Encoder-Decoder文本文本指令微调任务、seq2seq
LLaMADecoder-Only文本文本LLM 训练、文本生成
GPT-4Decoder-Only文本/多模态文本/多模态大规模 LLM、通用生成
PaLMDecoder-Only文本文本LLM 训练、文本生成
BLIP-2Encoder-Decoder图像+文本文本图文理解、图文生成
OpenFlamingoEncoder-Decoder图像+文本文本多模态理解
MiniGPT-4Encoder-Decoder图像+文本文本多模态生成、问答

Transformer的核心内容还包括:

  • ① 位置编码
  • ② 多头注意力机制
  • ③ 自注意力机制
  • ④ 缩放点积注意力

二、位置编码

与传统的RNN、LSTM时序模型不同的是,为了充分利用序列之间的绝对以及相对位置信息,Transformer在对文本序列进行向量化的同时,加入了位置编码。
在这里插入图片描述

这是,面试官可能又会问了:

🧠 3. Transformer提出了什么位置编码,具体怎么实现的

Transformer 论文中使用了 绝对位置编码(Absolute Positional Encoding)。通过对每个 token 添加固定的向量来表示其在序列中的位置。使用正弦和余弦函数实现固定位置编码:
![[Pasted image 20251111140948.png]]
其中 p o s pos pos 是位置, i i i 是维度索引, d m o d e l d_{model} dmodel 是 embedding 维度。每个维度对应一个不同频率的正弦或余弦函数,波长呈几何级数,从 2 π 2\pi 2π 10000 ⋅ 2 π 10000 \cdot 2\pi 100002π。这种编码方式允许模型学习相对位置,因为对任意固定偏移 k k k P E p o s + k PE_{pos+k} PEpos+k 可以通过 P E p o s PE_{pos} PEpos 的线性组合表示。

✅ 注意: 论文中提出实验过 可学习的位置嵌入(learned positional embeddings),效果与正弦-余弦编码几乎相同,但正弦-余弦编码可让模型更好地外推到比训练序列更长的长度。这是由于绝对正弦-余弦位置编码是一个固定函数,波长随维度指数增长,因此即使序列长度超过训练长度,也可以直接计算对应的编码向量而可学习位置嵌入是训练中针对每个位置独立优化的向量,如果在训练中未出现过的更长序列位置,就没有对应的向量,模型需要“猜测”或插值,可能不如固定函数平滑。

原始的正弦(Sinusoidal)位置编码理论上可以通过三角函数的周期性处理更长的序列,但在实践中,模型往往“过拟合”了训练时的特定相位组合,导致外推时性能也会下降。为了进一步解决模型外推问题,面试官可能会进一步问你其他类型的位置编码,例如:

🧠 4. 你还了解过什么位置编码 (真实面试提问)
  • 相对位置编码 (Relative Positional Encoding - RPE)

    • 代表模型:Transformer-XL, T5, DeBERTa
    • 实现方式:为不同相对距离创建可学习嵌入表;长距离通过分桶共享嵌入。在注意力分数( Q K ⊤ QK^\top QK)前加上对应的距离偏置。
    • 解决外推问题:距离概念是通用的,任意序列长度都能共享相同嵌入,实现泛化。
  • 旋转位置编码 (Rotary Positional Embedding - RoPE)

    • 代表模型:LLaMA, Mistral, Qwen, PaLM 等主流 LLM
    • 实现方式:将 Q、K 向量按两维一组旋转角度,点积结果只依赖相对位置 ( m − n ) (m-n) (mn)
    • 解决外推问题:旋转后的相对角度概念通用,对长序列外推稳定。
      在这里插入图片描述

三、多头注意力机制

自注意力是面试官最喜欢提问的模块,因为他包括了更加深入的数学原理。我们知道,自注意力机制其实就是包括了 Q , K , V Q, K, V Q,K,V 以及一个缩放因子。数学公式如下:
A t t e n t i o n = softmax ( Q K T d k ) V Attention=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V Attention=softmax(dk QKT)V
在这里插入图片描述

自注意力机制的数学设计完美地模拟了人类“分配注意力”的过程:

  1. 匹配( Q K T Q K^T QKT): 我要查什么 (Q)?它和我的资料 (K) 有多相关? → \rightarrow 得出相关性分数。
  2. 归一化( softmax \text{softmax} softmax): 将分数转化为注意力权重(贡献度比例)。
  3. 提取( × V \times V ×V): 根据贡献度比例,从实际信息 (V) 中加权抽取所需的内容。
🧠 5. 为什么需要缩放因子 (真实面试)

d model d_\text{model} dmodel维度越大,方差越大,结果数值范围越极端。没有缩放时, Q K T QK^T QKT的数值随维度 d k d_k dk增大而增大,使 softmax 输入过大。由于 softmax 是一个指数函数,当输入过大时,输出接近 one-hot,梯度趋于0。从而导致梯度消失


在标准的自注意力中,我们通过 Q K T / d k QK^T / \sqrt{d_k} QKT/dk 来计算不同 token 之间的注意力权重。但作者发现,仅用一个注意力头往往难以同时捕捉多种语义关系(如词法、语义、句法等)。因此,Transformer 提出了 多头注意力机制 (Multi-Head Attention, MHA)

将输入特征通过不同的线性投影矩阵,映射到多个低维子空间中:

head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, \, KW_i^K, \, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)

然后将所有头拼接(concatenate)再线性变换:

MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O MultiHead(Q,K,V)=Concat(head1,,headh)WO

🧠 6. 为什么要采用多头注意力机制

Transformer 使用多头注意力是为了让模型在不同的子空间中独立学习不同类型的关系。多个小头可以从不同角度捕捉语义信息,增强模型的表达能力和稳定性,比单头更鲁棒。


🧠 7. Encoder和Decoder中用的注意力机制有什么不同
  • Encoder 用的是 双向(bidirectional)自注意力,让每个位置能看到序列中所有 token 的信息;
  • Decoder 包含 因果(causal / masked)自注意力(只看到当前及过去位置)以及 Encoder–Decoder(cross)注意力(把 Decoder 的查询与 Encoder 的键值对接),两者合起来保证生成时的自回归性并能利用输入上下文。

我们在注意力权重计算的过程中会先匹配( Q K T Q K^T QKT),这一过程会导致当前的token看到未来的token。因此,为了避免信息泄露,在计算完 Q K T Q K^T QKT 之后加入一个 MASK, 形成因果注意力机制。

MASK是一个与 A t t e n t i o n Attention Attention 大小相同的上三角矩阵作为 Mask。主对角线之上(即未来位置)的元素,用一个极大的负数(如 − 1 0 9 -10^{9} 109)进行填充。在遇到softmax后会趋近于0。

在这里插入图片描述

四、LayerNorm 与 残差连接

Transformer 的稳定训练,很大程度上依赖于 残差连接(Residual Connection) 与 层归一化(Layer Normalization, LN) 的配合。它们共同解决了深层网络的梯度消失与分布漂移问题

🧱 1. 残差连接(Residual Connection)

在每个子层(Self-Attention 或 Feed-Forward 层)中,Transformer 都采用如下结构:
x ′ = LayerNorm ( x + Sublayer ( x ) ) x' = \text{LayerNorm}(x + \text{Sublayer}(x)) x=LayerNorm(x+Sublayer(x))

📌 作用:: 允许梯度从更深层直接反向传播到浅层,避免梯度消失,使深层 Transformer(如 96 层的 GPT-3)仍能稳定训练。

⚖️ 2. Layer Normalization(LN)

LayerNorm 是在特征维度(feature dimension)上归一化的操作:
LN ( x i ) = x i − μ σ 2 + ϵ ⋅ γ + β \text{LN}(x_i) = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \beta LN(xi)=σ2+ϵ xiμγ+β
其中:

  • μ , σ \mu, \sigma μ,σ 是单个样本在特征维度上的均值与方差;
  • γ , β \gamma, \beta γ,β 是可学习缩放与平移参数。

📌 直觉:
LayerNorm 让每个 token 的特征分布稳定,不会因为输入尺度或激活偏移而导致模型震荡。

面试官可能会问:

🧠 8. 为什么 Transformer 不使用 BatchNorm(BN)

BatchNorm 对比 LayerNorm 的关键区别是 归一化的维度不同

归一化方法归一化范围是否依赖 Batch是否受序列长度影响
BatchNorm同一通道、跨样本✅ 是✅ 受影响
LayerNorm单样本、跨通道❌ 否❌ 不受影响

BN 的统计量(均值、方差)来自整个 batch,因此在 Transformer 中有以下问题:

  1. 变长序列问题
    每个样本的 token 数量不同,BN 无法在时间维度上统一统计。

  2. 小 batch 或自回归推理不稳定
    在推理(inference)阶段,batch size 往往为 1。BN 的统计量与训练时分布不匹配,容易导致性能下降。

  3. 分布漂移(Distribution Shift)
    自注意力中,不同 token 的激活分布差异大,BN 在 batch 内混合这些统计会引入噪声,破坏 token 表征独立性。

五、手撕代码

1️⃣ 手撕 Scaled Dot-Product Attention

import torch
import torch.nn.functional as Fdef scaled_dot_product_attention(Q, K, V, mask=None):"""Q: [B, h, L_q, d_k]K: [B, h, L_k, d_k]V: [B, h, L_k, d_v]mask: [B, 1, L_q, L_k]"""scores = Q @ K.transpose(-2, -1) / (K.size(-1) ** 0.5)if mask is not None:scores = scores.masked_fill(mask == 0, float('-inf'))attn = F.softmax(scores, dim=-1)out = attn @ Vreturn out, attn

2️⃣ 手撕 Multi-Head Attention

import torch
import torch.nn as nnclass MultiHeadAttention(nn.Module):def __init__(self, d_model, num_heads):super().__init__()assert d_model % num_heads == 0self.d_k = d_model // num_headsself.num_heads = num_headsself.W_q = nn.Linear(d_model, d_model)self.W_k = nn.Linear(d_model, d_model)self.W_v = nn.Linear(d_model, d_model)self.W_o = nn.Linear(d_model, d_model)def forward(self, Q, K, V, mask=None):B, L, _ = Q.shapedef split_heads(x):return x.view(B, L, self.num_heads, self.d_k).transpose(1, 2)Q, K, V = self.W_q(Q), self.W_k(K), self.W_v(V)Q, K, V = split_heads(Q), split_heads(K), split_heads(V)scores = (Q @ K.transpose(-2, -1)) / (self.d_k ** 0.5)if mask is not None:scores = scores.masked_fill(mask == 0, float('-inf'))attn = torch.softmax(scores, dim=-1)out = attn @ Vout = out.transpose(1, 2).contiguous().view(B, L, -1)return self.W_o(out)

3️⃣ 手撕 Position-wise Feed Forward Network (FFN)

class FeedForward(nn.Module):def __init__(self, d_model, d_ff=2048, dropout=0.1):super().__init__()self.fc1 = nn.Linear(d_model, d_ff)self.fc2 = nn.Linear(d_ff, d_model)self.dropout = nn.Dropout(dropout)def forward(self, x):return self.fc2(self.dropout(F.relu(self.fc1(x))))

4️⃣ 手撕 Add & Norm 模块(Residual + LayerNorm)

class AddNorm(nn.Module):def __init__(self, d_model, dropout=0.1):super().__init__()self.norm = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x, sublayer_out):return self.norm(x + self.dropout(sublayer_out))

5️⃣ 手撕 Encoder Layer

class EncoderLayer(nn.Module):def __init__(self, d_model, num_heads, d_ff, dropout=0.1):super().__init__()self.self_attn = MultiHeadAttention(d_model, num_heads)self.ffn = FeedForward(d_model, d_ff, dropout)self.addnorm1 = AddNorm(d_model, dropout)self.addnorm2 = AddNorm(d_model, dropout)def forward(self, x, mask=None):attn_out = self.self_attn(x, x, x, mask)x = self.addnorm1(x, attn_out)ffn_out = self.ffn(x)x = self.addnorm2(x, ffn_out)return x

六、总结

本章总结了Transformer的基本知识点以及问法,但也通常不会直接问了,更多的是融合其他LLM进行提问,例如:Transformer、Bert、GPT在架构上分别有什么差别。在面试或科研问答中,Transformer 相关问题往往不再单独考察“公式细节”,而是考查你是否更深层次的理解

http://www.dtcms.com/a/596700.html

相关文章:

  • 【微服务知识】SpringCloudGateway结合Sentinel实现服务的限流,熔断与降级
  • Python基础教学:Python中enumerate函数的使用方法-由Deepseek产生
  • 算法基础篇:(六)基础算法之双指针 —— 从暴力到高效的优化艺术
  • 家庭网络搭建网站做网站能赚钱吗 知乎
  • 江苏省住房与城乡建设厅网站首页广告网站建设报价
  • HarmonyOS状态管理精细化:控制渲染范围与变量拆分策略
  • win32k!ProcessKeyboardInputWorker函数和win32k!xxxProcessKeyEvent函数分析键盘扫描码和vk码
  • k均值,密度聚类,层次聚类三种聚类底层逻辑的区别
  • 基于微信小程序的茶叶茶具销售和管理系统(源码+论文+部署+安装)
  • INT303 Big Data Analysis 大数据分析 Pt.8 聚类
  • 4-ARM-PEG-Biotin(2)/Silane(2),特性与制备方法解析
  • 【成功案例】朗迪锋助力高校实验室数智化升级
  • 【开题答辩实录分享】以《证劵数据可视化分析项目设计与实现》为例进行答辩实录分享
  • 可信计算、TPM
  • SAP HANA 发展历史:内存计算如何重塑企业级数据平台
  • 存算一体架构在空间计算中的应用
  • docker swarm集群搭建,对比k8s
  • 为什么网站需要维护需要网站建设
  • 25年05月架构甄选范文“论多模型数据源”,软考高级,系统架构设计师论文
  • 重庆做网站公司哪家比较好图片设计在线
  • Ubuntu 上使用 VSCode 调试 C++ (CMake 项目) 指南
  • opencv 学习: 07 使用迭代器 (iterator) 遍历像素
  • Two Sigma 面经分享|智商检测级别的面试,逻辑与细节缺一不可
  • 【STM32项目开源】STM32单片机物联网门禁控制系统
  • Ubuntu 系统部署 PostgreSQL 主从复制 + 流复制(Streaming Replication)完整操作指南
  • 福州企业网站推广定制wordpress国人模板
  • 场景落地绘就创新图景,人工智能迎来应用浪潮
  • 数据结构(20)
  • 线性代数 - 理解求解矩阵特征值的特征方程
  • Swift的逃逸闭包