面经(三)

1、请你解释一下神经网络训练中为什么会出现梯度消失和梯度爆炸?它们分别会带来什么现象?通常怎么解决?
答:

梯度消失和梯度爆炸本质上都来自**反向传播中的链式法则。**因为前面层的梯度是后面很多层局部导数和权重连乘得到的,所以如果这些乘子的绝对值大多小于 1,梯度传到前层时就会越来越小,最后接近 0,这就是梯度消失;如果这些乘子大多大于 1,梯度就会被不断放大,最后变得非常大甚至数值溢出,这就是梯度爆炸。

梯度消失常见于深层网络和长序列 RNN ,尤其是用了 sigmoid、tanh 这类容易饱和的激活函数时。它的表现通常是前面层几乎学不到东西,训练很慢,loss 下降停滞。 梯度爆炸则更容易让训练直接不稳定,比如 loss 剧烈震荡、梯度特别大,甚至出现 NaN。

工程上,两者的处理思路不完全一样。缓解梯度消失,通常会用 ReLU 类激活函数、合理初始化、残差连接、归一化层,RNN 场景下会用 LSTM 或 GRU。抑制梯度爆炸,常见方法是梯度裁剪、减小学习率和更稳定的初始化。

梯度消失和梯度爆炸的本质,都是反向传播中"多层连乘"导致的梯度衰减或放大,核心是让梯度既能传得动,又不会失控。
2、请你比较一下标准 RNN 和 LSTM 的区别。为什么在很多序列任务中,LSTM 比普通 RNN 更常用?
答:LSTM 相比普通 RNN 的核心优势,在于它更擅长处理长序列中的长期依赖问题 。普通 RNN 只有一个隐藏状态,每个时间步都会对历史信息重新变换和压缩,所以序列一长,早期信息很容易被冲淡,训练时也更容易出现梯度消失或爆炸。
**LSTM 在结构上引入了一个专门的记忆单元,也就是 cell state,同时通过遗忘门、输入门和输出门来控制信息的保留、写入和输出。**这样做的好处是,重要的历史信息可以沿着记忆单元更稳定地传播,而不是每一步都被强行覆盖,所以它在长依赖任务上通常比普通 RNN 更稳定、效果也更好。

从工程角度看,LSTM 的优势是记忆能力更强、训练更稳,尤其适合语音、文本、时间序列这类有长上下文依赖的任务;它的代价是参数更多、计算更重、速度更慢。所以如果任务依赖较短或者资源特别受限,普通 RNN 也可能够用;但在大多数实际序列任务里,LSTM 往往比标准 RNN 更实用。
3、请你从输入到输出,完整讲一下 Transformer 的结构,包括 Encoder、Decoder、注意力、残差、位置编码等。
答:

Transformer 的整体结构可以分为 Encoder 和 Decoder 两部分 。输入首先会经过 embedding 和位置编码,然后进入多层 Encoder。每一层 Encoder 主要包含两个子模块:**一个是 Self-Attention,用来建模序列中任意位置之间的依赖关系;另一个是前馈网络,用来做特征变换和非线性表达增强。**每个子模块后面都会加残差连接和 LayerNorm,以保证训练稳定性。

Encoder 的输出是一个包含全局上下文信息的表示序列 。Decoder 在生成时,会**先对已生成的序列做 Masked Self-Attention,保证不能看到未来信息,然后通过 Cross Attention 去关注 Encoder 的输出,**从而结合输入信息进行生成,最后经过前馈网络输出结果。

整体来说,Transformer 的核心思想是用注意力机制替代传统的序列递归结构,使每个位置可以直接和全局信息交互,从而更高效地建模长距离依赖。

复制代码
#encorder
def encorder_block(x):
    x = x+self.attention(x)
    x = layer_norm(x)

    x = x +feed_forward(x)
    x = layer_norm(x)
    return x

def decorder(x):
    x = x + masked_self_attention(x)
    x = layer_norm(x)

    # Cross Attention
    x = x + cross_attention(x, enc_out)
    x = layer_norm(x)

    # FFN
    x = x + feed_forward(x)
    x = layer_norm(x)

    return x

4、Transformer 为什么引入注意力机制?Self-Attention、Masked Self-Attention、Cross-Attention 分别是什么?为什么还要做 Multi-Head Attention?
答:

Transformer 之所以使用注意力机制,核心是为了更灵活地建模序列中不同位置之间的依赖关系。相比 RNN 需要按时间步逐步传递信息,注意力机制可以让当前 token 直接和全局所有 token 交互,从而更容易捕捉长距离依赖,同时也更适合并行计算。

在 Transformer 里常见有三种注意力。第一种是 Self-Attention ,q、k、v 都来自同一个序列,主要用在Encoder ,用来建立序列内部的全局上下文关系。第二种是 Masked Self-Attention ,它本质上也是自注意力,只不过在 Decoder 中加了 mask ,保证当前位置不能看到未来信息,以满足自回归生成。第三种是Cross-Attention,q 来自 Decoder,k 和 v 来自 Encoder,作用是让解码端在生成时关注输入序列中最相关的信息。

至于为什么要用多头注意力,而不是单头,是因为单头通常只能在一个表示空间里学习一种主导关系,而多头可以把特征投影到多个不同子空间,让不同头分别学习不同类型的依赖,比如局部关系、长距离关系、语义对齐等,最后再融合起来,所以表达能力更强。不过头数也不是越多越好,还要考虑维度分配和计算开销。

注意力机制的本质是让模型按需从全局信息中检索关键内容,而多头注意力的本质是让模型在多个子空间同时学习不同类型的关系。

复制代码
import torch
import torch.nn.functional as F
import math

def attention (Q,K,V mask = None):
    scores = Q @ K.transpose(-2,-1)/math.sqrt(Q.size(-1))
    if mask is not None:
        scores = scores.masked_fill(mask == 0, float('-inf'))    
    weights = F.softmax(scores,-1)
    out = weights@ V
    return out,weights
复制代码
import torch
import torch.nn as nn
import math

class MultiHeadAttention(nn.Module):
    def __init__(self, d_model, num_heads):
        super().__init__()
        assert d_model % num_heads == 0
        
        self.d_model = d_model
        self.num_heads = num_heads
        self.d_k = d_model // num_heads
        
        # 定义四个线性变换矩阵
        self.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):
        batch_size = Q.size(0)
        
        # 1. 线性变换并拆分为多个头
        # (batch, seq_len, d_model) -> (batch, n_heads, seq_len, d_k)
        Q = self.W_q(Q).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
        K = self.W_k(K).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
        V = self.W_v(V).view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)

        # 2. 计算缩放点积注意力 (使用之前定义的函数)
        # scores: (batch, n_heads, seq_len, seq_len)
        attn_output, weights = attention(Q, K, V, mask)

        # 3. 拼接 (Concat) 所有头的输出
        # (batch, n_heads, seq_len, d_k) -> (batch, seq_len, d_model)
        concat_output = attn_output.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)

        # 4. 最后经过一个线性层 (W^O)
        return self.W_o(concat_output)

5、请解释一下 Transformer 中的 q、k、v 机制和注意力公式,为什么要除以根号 dk?
答:Transformer 中的注意力机制通过 qkv 来计算各个位置之间的依赖关系。具体来说,q 是查询,k 是键,v 是值。计算时,首先通过 qk 的点积来衡量它们之间的相关性,然后使用 softmax 得到每个位置的注意力权重,最后通过加权求和的方式,从 v 中提取相关信息,得到当前 token 的表示。

为了保证训练稳定性,在计算点积时,我们需要对 qk 的点积值进行缩放,除以根号 dk(dk 是 k 的维度)。这是因为如果不做缩放,点积值会随着维度增大而变得过大,导致 softmax 的梯度过小,训练变得困难。

在多头注意力中,qkv 会被分别映射到多个子空间,每个头独立计算注意力,最后将所有头的输出拼接起来,经过一个线性变换得到最终的输出。这样做的好处是,可以让模型在不同子空间中并行学习多种不同的关系,从而增强模型的表达能力。
6、Transformer 中为什么需要位置编码?相对位置编码是什么,和绝对位置编码有何区别?
答:

在 Transformer 中,位置编码的目的是让模型能够理解序列中每个 token 的位置。由于 Transformer 的 Self-Attention 机制没有时间步的递归结构,因此无法像 RNN 那样自动学习顺序信息。为了弥补这一点,我们通过位置编码为每个 token 添加一个位置信息,使得模型能够知道每个 token 在序列中的位置。

最初的做法是 绝对位置编码,通过正弦和余弦函数生成一个固定的位置信息向量,并加到输入 embedding 中。然而,绝对位置编码只能为每个位置提供固定的位置信息,并不能很好地建模 token 之间的相对关系。

为了更好地建模 token 之间的相对距离,提出了 相对位置编码。它通过在计算注意力时引入相对位置的偏移量,使得模型能够根据 token 之间的相对距离调整注意力权重,特别适合处理长序列和变长输入。

复制代码
scores += relative_positions

目前更火的LLaMA等模型使用的方案,其核心思想是通过旋转矩阵实现。

7、Transformer 训练一次都会有哪些参数会更新?Transformer 训练一次都会有哪些参数会更新?为什么要位置嵌入,使用加法嵌入而不直接拼接?
答:

在 Transformer 的训练过程中,所有的 可学习参数 (如 嵌入层 的权重、Self-Attention 层q、k、v 权重前馈网络的权重和偏置LayerNorm 的参数输出层的权重)都会在每次前向传播和反向传播后更新。这些参数决定了模型如何从输入数据中提取特征并生成输出,目的是最小化损失函数,提升模型的预测能力。

Transformer 的 参数量 较大,尤其在 d_model层数 增加时,参数量会快速增加。每一层的 多头注意力前馈网络 都需要大量的权重矩阵,因此 Transformer 模型通常需要数百万到数十亿的参数。

为了让模型理解输入的顺序信息,位置编码 被添加到每个 token 的嵌入向量中,通常使用 加法嵌入 方式,这样可以高效地为每个 token 提供位置信息,帮助 Transformer 捕捉长距离的依赖关系。加法嵌入拼接嵌入 更常用,因为它不会增加额外的维度,且简单高效。
8、为什么 Transformer 要层归一化(LayerNorm)而不用批归一化(BatchNorm)?它们两个的区别是什么?
答:BatchNorm 和 LayerNorm 的核心区别 在于归一化的维度。BatchNorm 在训练时依赖于整个 batch 的均值和方差,而 LayerNorm 则是基于 每个样本的每一层 来进行归一化。虽然 BatchNorm 在卷积网络中非常成功,但在处理时序数据(如 NLP 中的 Transformer)时,BatchNorm 会引入不必要的时间步之间的依赖问题,使得它无法高效处理序列数据。

LayerNorm 的设计恰好解决了这些问题,因为它在每个时间步独立对每个位置的特征进行标准化,不受其他位置样本的影响。因此,LayerNorm 在 Transformer 中能保持每个位置的顺序信息和上下文依赖,并且能独立于 batch 进行计算,适应更灵活的序列长度。

1

1

相关推荐
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【28】Nacos Skill 管理中心功能说明
java·人工智能·spring
AI医影跨模态组学2 小时前
Cancer Letters(IF=10.1)中科院自动化研究所田捷等团队:整合纵向MRI与活检全切片图像用于乳腺癌新辅助治疗反应的早期预测及个体化管理
人工智能·深度学习·论文·医学·医学影像
oioihoii2 小时前
Graphify 简明指南
人工智能
数字供应链安全产品选型2 小时前
AI全生命周期安全:从开发到下线,悬镜安全灵境AIDR如何覆盖智能体每一个环节?
人工智能
2501_933329552 小时前
企业舆情处置实战:Infoseek数字公关AI中台技术架构与功能解析
大数据·人工智能·架构·数据库开发
带娃的IT创业者2 小时前
深度解析 Claude Design:如何利用 Anthropic 最新设计范式构建 AI 原生应用
人工智能·python·llm·claude·应用开发·anthropic·ai原生应用
QC·Rex2 小时前
Spring AI MCP Apps 实战:打造聊天与富 UI 融合的智能化应用
人工智能·spring·ui·spring ai·mcp
koharu1232 小时前
大模型后训练全解:SFT、RLHF/PPO、DPO 的原理、实践与选择
人工智能·llm·后训练
Kel2 小时前
LangChain.js 架构设计深度剖析
人工智能·设计模式·架构