零基础学习TRM学习

目录

  • 一、TRM大体框架
  • 二、编码器
    • [2.1 输入部分input](#2.1 输入部分input)
    • [2.2 注意力机制Attention](#2.2 注意力机制Attention)
      • [2.2.1 基本的注意力机制(公式用图片讲解)](#2.2.1 基本的注意力机制(公式用图片讲解))
      • [2.2.2 在TRM中怎么操作](#2.2.2 在TRM中怎么操作)
        • [2.2.2.1 在只有单词向量的情况下,如何获取QKV](#2.2.2.1 在只有单词向量的情况下,如何获取QKV)
        • [2.2.2.2 QKV 是如何从输入向量生成的](#2.2.2.2 QKV 是如何从输入向量生成的)
        • [2.2.2.3 自注意力机制的矩阵形式总览](#2.2.2.3 自注意力机制的矩阵形式总览)
        • [2.2.2.4 多头注意力(Multi-Head Attention)中的 QKV 投影](#2.2.2.4 多头注意力(Multi-Head Attention)中的 QKV 投影)
      • [2.2.3 编码器层核心机制:LayerNorm 与残差连接的协同作用](#2.2.3 编码器层核心机制:LayerNorm 与残差连接的协同作用)
        • [2.2.3.1 Add & Normalize 模块详解](#2.2.3.1 Add & Normalize 模块详解)
        • [2.2.3.2 整体数据流向](#2.2.3.2 整体数据流向)
        • [2.2.3.3 残差网络解析](#2.2.3.3 残差网络解析)
          • [1. 核心结构:Add Operation](#1. 核心结构:Add Operation)
          • [2. 反向传播的"高速公路"](#2. 反向传播的“高速公路”)
          • [3. 直观理解](#3. 直观理解)
      • [2.2.4 BNvsLN](#2.2.4 BNvsLN)
      • [2.2.5 为什么需要LN](#2.2.5 为什么需要LN)
      • [2.2.6 假如把 BN 引申到 RNN:为何它在序列模型中失效?](#2.2.6 假如把 BN 引申到 RNN:为何它在序列模型中失效?)
        • [1. BN 的核心逻辑 vs. RNN 的时序特性](#1. BN 的核心逻辑 vs. RNN 的时序特性)
        • [2. 实验结论:BN 在 RNN 中表现不佳](#2. 实验结论:BN 在 RNN 中表现不佳)
        • [3. LayerNorm 的完美适配](#3. LayerNorm 的完美适配)
  • 三、解码器
      • [1. 核心交互逻辑:Query, Key, Value](#1. 核心交互逻辑:Query, Key, Value)
      • [2. 动态对齐与解码过程](#2. 动态对齐与解码过程)

一、TRM大体框架

图中左侧是输入端,显示中文短语"我爱你",并标注为"输入",表明这是模型的原始文本输入;中间是一个标有「TRM」的蓝色处理模块,代表Transformer模型的核心计算单元,负责对输入文本进行编码、语义理解与跨语言映射;右侧是输出端,显示英文短语"I LOVE YOU",并标注为"输出",表示模型最终生成的翻译结果。

  1. 内容:源语言文本"我爱你"。

    过程:文字首先会被转化为向量(Token Embeddings),并注入位置信息(Positional Encoding),让模型知道"我"、"爱"、"你"的顺序和含义。

  2. 内部处理阶段(The Core)

    这是 Transformer 的"大脑",分为两个核心组件:

    Encoders(编码器):

    负责"读懂"输入。它通过自注意力机制(Self-Attention)分析"我爱你"这三个字之间的上下文关系,将它们"消化"并编码成一个包含了完整语义特征的"思想向量"(Context Vector)。

    Decoders(解码器):

    负责"表达"输出。它接收编码器传来的"思想",并结合已经生成的单词(例如先生成"I",再结合"I"来生成"LOVE"),以自回归(Auto-regressive)的方式,一个字一个字地将英文"I LOVE YOU"推导并预测出来。

  3. 输出阶段(Output)

    内容:目标语言文本"I LOVE YOU"。

    过程:解码器输出的向量经过一个线性层和 Softmax 激活函数,最终转换为概率最大的目标词,呈现在屏幕上。

二、编码器

注意:FeedForward就是全连接层

2.1 输入部分input

2.1.1 embeding词嵌入

这张图展示了 NLP 中最核心的Embedding Lookup (嵌入查找)过程。

● 输入端(左侧):文本"我爱你"被转化为数字索引(如 12)。这是计算机处理语言的起点------「Tokenization 」(分词与编码)。

● 输出端(右侧):索引 12 被映射为一个 512维 的向量空间。

  1. 核心原理:
    这本质上是一个查表操作。模型维护一个巨大的权重矩阵,当输入索引为 12 时,直接取出矩阵的第 12 行作为该字的向量表示。
  2. 为什么是 512 维?
    这 512 个浮点数构成了词的"语义坐标"。在这个高维空间中,语义相近的词距离更近,从而让计算机能够"计算"语言的含义。

2.1.2 RNN模型解析

我们对比RNN模型

RNN(循环神经网络)的核心思想------将网络按时间步展开,使模型能够处理序列数据。

折叠视角(左侧): 一个 RNN 单元包含输入层(X)、隐藏层(S)和输出层(O)。权重矩阵 U 控制输入到隐藏的映射,V 控制隐藏到输出的映射,而 W 是隐藏层自身的循环权重,负责将上一时刻的状态传递到当前时刻。

展开视角(右侧): 将同一个 RNN 单元沿时间轴复制多份,每个时间步(t-1, t, t+1)共享相同的参数(U、V、W),但拥有独立的输入(X)和隐藏状态(S)。隐藏状态 S 通过权重 W 在时间步之间传递,形成信息的"记忆链"。

关键特性:

  • 参数共享:所有时间步使用同一组 U、V、W,使模型能够泛化到任意长度的序列。
  • 状态传递:S_t = f(W · S_{t-1} + U · X_t + b),隐藏状态携带了历史信息,使模型具备"记住"前面内容的能力。
  • 输入示例:图中以"我 → 爱 → 你"为例,展示了序列数据如何逐时刻输入模型。

RNN 的展开形式揭示了循环结构的本质:一个固定参数的网络,通过状态的递归传递,处理变长序列。这也是后续 LSTM、GRU 等变体要解决的核心问题------长程依赖的梯度消失。

问:TRM的梯度消失和其他的神经网络的梯度消失有什么区别呢?

可以把它们理解成:本质一样,但 Transformer 更容易通过结构设计缓解。

对比 CNN / 普通深层神经网络 Transformer
梯度消失原因 网络太深,梯度连续经过很多层相乘,越来越小 同样会因为层数深导致梯度变小,但还会受到 Attention、FFN 等多层计算影响
最大问题 前面几层几乎学不到东西 底层 Transformer Block 更新困难,训练不稳定
常见解决方法 ReLU、合理初始化、BatchNorm、残差连接 残差连接 + LayerNorm,再配合合理初始化、学习率 Warmup 等

2.1.3 位置嵌入

  • Transformer 模型摒弃了 RNN 的串行结构,采用并行输入提升效率,但这也导致其无法天然捕捉词序信息。为解决此问题,Transformer 引入位置编码,将词的绝对或相对位置信息注入词向量,使模型能识别"我爱你"与"你爱我"的语义差异。
  • RNN 的顺序依赖:RNN 通过隐藏状态 S 在时间步间传递信息,天然具备顺序感知能力。但这也导致其训练速度慢、难以并行化,且易出现梯度消失问题。
  • Transformer 的全局视角:Transformer 使用自注意力机制一次性处理整个序列,实现全局信息交互。但其输入是"无序"的词向量集合,必须依赖位置编码补充顺序信息
  • 位置编码的作用:通常采用正弦/余弦函数生成固定位置向量,与词嵌入相加后输入模型。这样,即使两个词在不同位置,其向量也会因位置编码不同而被区分开。

2.1.4 位置编码的数学原理

Transformer 通过正弦/余弦函数为每个位置生成唯一的位置向量,与词向量相加后输入模型。核心公式:

P E ( p o s , 2 i ) = sin ⁡ ( p o s 10000 2 i / d m o d e l ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i)=sin(100002i/dmodelpos)

P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 10000 2 i / d m o d e l ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)

复制代码
pos:词在序列中的位置(如"爱"是第 2 个词,pos = 1)
i:位置编码的维度索引
d_model:向量总维度(如 512)

编码过程(以 512 维为例)

1.确定词的位置 Pos

2.对维度 0, 1, 2, 3, ..., 511 依次计算:

3.偶数维(0, 2, 4...)→ 用 sin

4.奇数维(1, 3, 5...)→ 用 cos

5.生成的位置编码 sin, cos, sin, cos, ..., cos 与词向量逐元素相加

为什么选 sin/cos?

  • 不同位置的编码具有唯一性,保证每个词的位置可区分
  • 相邻位置的编码值相近,保留相对距离信息
  • 模型可以通过线性变换学习到相对位置关系
  • 简言之:位置编码就是给每个词打上"座位号",让 Transformer 知道谁在前、谁在后。

2.2 注意力机制Attention

2.2.1 基本的注意力机制(公式用图片讲解)

注意:图片就是左上那些,换成语言文字就是每一个字或者说token

Query、Key、Value 三要素

  • Query(查询):代表当前正在处理的词,相当于"我在关注什么"。
  • Key(键):序列中每个词都携带一个 Key,相当于"我的标识是什么",用于和 Query 进行匹配。
  • Value(值):每个词携带的实际语义信息,相当于"我携带的内容是什么",是最终要被汇总的信息。
    注意力计算过程(结合下图理解):

    图中的虚线圆角框(Source 区域)内包含了 Key 和 Value 两排节点。计算过程分两步:
  1. 计算匹配度:将左侧的 Query(当前关注对象,图中以"婴儿"为例)分别与 Key1~Key4 进行相似度比较,匹配度越高,对应的权重越大。
  2. 加权汇总:用这些权重对下方的 Value1~Value4 进行加权求和,最终汇聚到右侧的 Attention Value 框中。
  3. 核心一句话(图中原文):根据 Query 与各 Key 的匹配程度,对 Value1~Value4 加权汇总,得到 Attention Value。

直观理解:

想象你在读"婴儿"这个词,你的注意力(Query)会去匹配上下文中所有词的 Key。如果前面出现了"小孩""宝宝",这些词的 Key 和"婴儿"的 Query 匹配度高,它们的 Value(实际语义信息)就会被更多地汇总到当前词的理解中;而无关词的 Value 则几乎不被关注。

这就是注意力机制的精髓------让模型学会"看哪里"。然后继续往下执行代码。

以"我不爱你"为例:输入序列:我 → 不 → 爱 → 你,每个词对应一个 Key(Key1~Key4)和一个 Value(Value1~Value4)。

  • 第一步:计算相关性得分

    用 Query 与每个 Key 计算匹配度:

    s₁ = F(Q, Key1),s₂ = F(Q, Key2),以此类推

    F 可以是点积或缩放点积函数

    得分越高,说明当前词与该 Key 越相关

  • 第二步:SoftMax 归一化将原始得分转化为权重:

    aᵢ = exp(sᵢ) / Σ exp(sⱼ)

    所有权重 aᵢ 之和为 1

    权重越大,表示模型越"关注"对应的词

  • 第三步:加权求和

    用权重对 Value 进行加权求和:

    Attention Value = a₁·V₁ + a₂·V₂ + a₃·V₃ + a₄·V₄

    得到当前 Query 的最终注意力输出

    整体公式:Attention(Q, K, V) = softmax(QKᵀ / √dₖ) · V

    其中:

    • Q(Query):来自当前正在处理的词
    • K(Key):来自序列中所有词
    • V(Value):来自序列中所有词
    • dₖ:Key 向量的维度
    • 简言之:注意力机制就是让模型"看一遍所有词,给每个词打个分数,分数高的多关注,分数低的少关注,最后汇总成一句话"。

2.2.2 在TRM中怎么操作

2.2.2.1 在只有单词向量的情况下,如何获取QKV
  • 这张图展示了注意力机制的第一步------如何从原始词向量分别生成 Query、Key、Value 三个向量。
  • 输入层(绿色): 以"Thinking"和"Machines"两个词为例,每个词首先被转化为一个词向量 xᵢ(维度为 d)。
  • 投影矩阵(右侧三个大矩阵): 模型训练了三组可学习的投影矩阵 WQ、WK、W^V,分别用于生成 Q、K、V:
    • W^Q(紫色):将词向量 xᵢ 投影到 Query 空间,得到 qᵢ = xᵢ · W^Q
    • W^K(橙色):将词向量 xᵢ 投影到 Key 空间,得到 kᵢ = xᵢ · W^K
    • W^V(蓝色):将词向量 xᵢ 投影到 Value 空间,得到 vᵢ = xᵢ · W^V
  • 维度变化:
    输入词向量 xᵢ 的维度为 d(如 512)
    W^Q 的维度为 d × dₖ,W^K 为 d × dₖ,W^V 为 d × dᵥ
    输出的 qᵢ、kᵢ 维度为 dₖ,vᵢ 维度为 dᵥ
    通常 dₖ = dᵥ,但不一定等于 d
  • 颜色编码对照:
    绿色 = 原始词向量 x
    紫色 = Query 相关(q、W^Q)
    橙色 = Key 相关(k、W^K)
    蓝色 = Value 相关(v、W^V)
    核心一句话:Q、K、V 不是凭空产生的,它们都来自同一个词向量 xᵢ,只是经过了三张不同的"滤镜"(投影矩阵)变换后,分别承担了"查询""匹配""承载信息"三种不同的角色。
2.2.2.2 QKV 是如何从输入向量生成的

以上是详细展示

2.2.2.3 自注意力机制的矩阵形式总览

本图以矩阵运算的方式,完整展示了自注意力机制(Self-Attention)的计算流程:

左侧:并行生成 Q、K、V 三个矩阵

输入矩阵 X (绿色,形状为 n × d n \times d n×d)分别与三组可学习的权重矩阵相乘:

  • W Q W^Q WQ(紫色)→ 得到 Q 矩阵(紫色)
  • W K W^K WK(橙色)→ 得到 K 矩阵(橙色)
  • W V W^V WV(蓝色)→ 得到 V 矩阵(蓝色)
右侧:注意力计算链路

Z = softmax ( Q × K T d k ) × V Z = \text{softmax}\left(\frac{Q \times K^T}{\sqrt{d_k}}\right) \times V Z=softmax(dk Q×KT)×V

分步拆解:

  1. Q × Kᵀ:计算每个词对所有词的注意力得分(原始分值)
  2. ÷ √dₖ:缩放操作,防止点积结果过大导致 Softmax 梯度消失
  3. softmax():将得分归一化为概率分布(权重和为 1)
  4. × V :以注意力权重对 Value 向量加权求和,得到最终输出 Z(粉色)
颜色编码对照
颜色 矩阵 含义
🟢 绿 X 输入词向量矩阵
🟣 紫 W^Q / Q 查询(Query)
🟠 橙 W^K / K 键(Key)
🔵 蓝 W^V / V 值(Value)
🩷 粉 Z 自注意力输出
2.2.2.4 多头注意力(Multi-Head Attention)中的 QKV 投影

这里可以理解成玄学了,多头就相当于多练几次,这样子效果就会好

本图展示了多头注意力机制如何通过不同的权重矩阵组 ,将同一个输入矩阵 X 映射到不同的特征子空间中:

  1. 统一的输入(X)

    • 输入矩阵 X(包含 "Thinking" 和 "Machines" 两个词向量)同时输入到所有注意力头中。
  2. 多组独立的投影矩阵

    • Head #0 拥有自己专属的一组权重: W 0 Q W_0^Q W0Q、 W 0 K W_0^K W0K、 W 0 V W_0^V W0V(深色矩阵),生成 Q 0 , K 0 , V 0 Q_0, K_0, V_0 Q0,K0,V0。
    • Head #1 拥有另一组独立的权重: W 1 Q W_1^Q W1Q、 W 1 K W_1^K W1K、 W 1 V W_1^V W1V(浅色矩阵),生成 Q 1 , K 1 , V 1 Q_1, K_1, V_1 Q1,K1,V1。
  3. 物理意义

    • 不同的注意力头可以学习到输入序列中不同层面的特征或上下文关系 (例如:Head 0 关注语法结构,Head 1 关注语义关联)。
  4. 统一输入

    • 同一个输入矩阵 X(包含 "Thinking" 和 "Machines" 两个词向量)被同时送入 8 个不同的注意力头(Attention Head #0 到 #7)。
  5. 独立计算注意力

    • 每个注意力头在各自的子空间内独立进行自注意力计算 (即 Z = softmax ( Q K T d k ) V Z = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V Z=softmax(dk QKT)V)。
  6. 多视角输出

    • 8 个头分别产生 8 个独立的输出矩阵 Z 0 , Z 1 , ... , Z 7 Z_0, Z_1, \dots, Z_7 Z0,Z1,...,Z7(粉色)。这些矩阵捕获了输入序列在不同特征空间下的上下文表示。

2.2.3 编码器层核心机制:LayerNorm 与残差连接的协同作用

本图展示了 Transformer 编码器层(Encoder Layer)内部的数据流转,其核心特征在于**自注意力(Self-Attention) 前馈网络(Feed Forward)**两个子层后,均紧跟了 Add & Normalize 模块。

2.2.3.1 Add & Normalize 模块详解

这是 Transformer 能够训练深层网络的关键组件,包含两个步骤:

  • Add(残差连接 / Residual Connection)

    • 如图中虚线箭头所示,将子层的输入(例如 X X X)直接"跨越"子层,与子层的输出(例如 Z Z Z)进行相加。
    • 作用:这种跳跃连接建立了梯度的"高速公路",有效缓解了深层网络中的梯度消失问题,使得模型可以堆叠更多层。
    • 公式表达: Output = Sublayer ( x ) + x \text{Output} = \text{Sublayer}(x) + x Output=Sublayer(x)+x
  • Normalize(层归一化 / Layer Normalization)

    • 操作对象 :对相加后的结果进行归一化处理。注意,这里的 LayerNorm 是针对单个样本的所有特征维度进行计算(即针对图中横向的一行向量),计算该向量的均值和方差,将其标准化为均值为0、方差为1的分布。
    • 与 BatchNorm 的区别:不同于 BatchNorm 依赖整个 Batch 的统计数据,LayerNorm 独立处理每个样本,因此不受 Batch Size 大小的影响,非常适合 NLP 中变长序列的训练。
    • 作用
      1. 加速收敛:将数据拉回标准分布,使得梯度下降更加平稳。
      2. 稳定训练:防止某一层输出数值过大或过小(Internal Covariate Shift),保证后续层接收到的输入分布相对稳定。
2.2.3.2 整体数据流向
  1. 第一层 Add & Norm :Self-Attention 的输出 Z Z Z 与原始输入 X X X 相加,经过 LayerNorm 后,作为下一阶段的输入。
  2. Feed Forward:归一化后的数据进入全连接前馈网络进行非线性变换。
  3. 第二层 Add & Norm:Feed Forward 的输出再次与其输入(即上一层的输出)相加,并再次经过 LayerNorm,最终输出编码器的结果。
2.2.3.3 残差网络解析
1. 核心结构:Add Operation

跳跃连接的本质是一个简单的加法操作。假设输入为 X A o u t X_{Aout} XAout,经过中间层 B B B 和 C C C 的变换后,输出 X D i n X_{Din} XDin 为:

X D i n = X A o u t + C ( B ( X A o u t ) ) X_{Din} = X_{Aout} + C(B(X_{Aout})) XDin=XAout+C(B(XAout))

这意味着网络不再需要学习完整的映射关系,而是学习输入与输出之间的残差(Residual)

2. 反向传播的"高速公路"

根据链式法则,损失函数 L L L 对输入 X A o u t X_{Aout} XAout 的梯度计算如下:

∂ L ∂ X A o u t = ∂ L ∂ X D i n ⋅ 1 + ∂ X D i n ∂ X C ⋅ ∂ X C ∂ X B ⋅ ∂ X B ∂ X A o u t \frac{\partial L}{\partial X_{Aout}} = \frac{\partial L}{\partial X_{Din}} \cdot \left 1 + \\frac{\\partial X_{Din}}{\\partial X_C} \\cdot \\frac{\\partial X_C}{\\partial X_B} \\cdot \\frac{\\partial X_B}{\\partial X_{Aout}} \\right ∂XAout∂L=∂XDin∂L⋅1+∂XC∂XDin⋅∂XB∂XC⋅∂XAout∂XB

这个公式揭示了梯度回传的两条路径:

  • 主路径(绿色框 - 直接传递):

    • 公式中的 1 1 1 代表跳跃连接带来的直接梯度通路。因为X那条路径,X对X求导还是1
    • 作用 :无论中间层 B , C B, C B,C 的梯度多么小(甚至趋近于0),这个 1 1 1 保证了梯度能够无损地直接传导回浅层。这就是所谓的"梯度高速公路"。
  • 残差路径(蓝色虚线框 - 经过变换):

    • 这是经过中间层权重矩阵连乘后的梯度。
    • 风险 :如果没有那个 1 1 1,当网络很深时,多个小于1的小数连乘会导致梯度指数级衰减(梯度消失),导致浅层参数无法更新。
3. 直观理解
  • 保底机制 :如果中间层 B , C B, C B,C 没有学到有效特征(即导数项很小),跳跃连接提供了一条"保底路径",确保模型至少能保留上一层的信息,不至于退化。
  • 优化更容易:模型只需要关注学习"差异部分"(即残差),这比学习完整的复杂映射要简单得多。

2.2.4 BNvsLN

BN设计出来的目的:消除量纲,让模型收敛更快。

横着看,其实就代表一个属性一个字段

什么是内部协变量的偏移?

内部协变量偏移(Internal Covariate Shift)是深度学习中的一种现象,指在神经网络训练过程中,由于前面层参数更新,导致后续层输入数据的分布(均值、方差等)持续变化,使后续层难以稳定学习,降低训练效率。

关键理解:

● 协变量:指神经网络的输入特征(如像素值、词向量)。

● 内部:特指网络中间隐藏层的输入数据,而非原始输入。

● 偏移:中间层输入数据的统计特性(均值、方差)在训练中持续变化。

一句话总结:前面层参数一变,后续层的输入分布就乱,导致学习效率暴跌。

二、乐高流水线类比

假设用 3 个工人(A、B、C)组装乐高消防车:

  1. 初始状态(无偏移)
    ○ 工人 A 挑出长度 2, 3, 4 cm 的积木 → 工人 B 用这些积木拼车轮支架(擅长处理 2-4 cm 积木)→ 工人 C 安装消防灯 → 完成任务。
  2. 第 2 天(偏移发生)
    ○ 工人 A 更新方法,输出 8, 9, 10 cm 的超长积木。
    ○ 工人 B 崩溃:无法处理超长积木,车轮支架变形,需花时间重学拼接技巧。
    ○ 工人 C 收到损坏的支架,任务失败。
    本质问题:工人 A 的改进,意外摧毁了工人 B 的稳定工作环境,导致整体效率下降。
    三、数值案例:神经网络中的梯度消失
    假设极简网络:输入 x → 第1层(权重 W1)→ 第2层(权重 W2)→ 输出
  3. 初始状态
    ○ 第1层输出:1.5(均值=1.5,方差=0)
    ○ 第2层输入该值,激活函数(Sigmoid)梯度 = 0.15(学习效率高)。
  4. 第1轮训练后(权重更新)
    ○ 第1层新输出:3.6(均值变为 3.6)
    ○ 第2层输入 3.6,Sigmoid 梯度 → 0.029(梯度暴跌 80%,学习停滞)。
    关键结论:前层权重更新导致后层输入分布右移,激活函数饱和,梯度消失,学习效率暴跌。
    四、解决方案:Batch Normalization (BatchNorm)
    作用:在每层前插入"质检员",动态校准输入分布,使其稳定在固定范围(如均值=0,方差=1),消除偏移影响。

BN的优缺点?

也就是经典的大数定律 。它是概率论的核心定律,描述随机事件在大量重复试验中,其频率会稳定趋近于理论概率的现象。当数据量无限大时,归一化就是会无限往中间靠拢。举例子就是高斯分布。

2.2.5 为什么需要LN

理解:为什么LayerNorm单独对一个样本的所有单词做缩放可以起到效果?

答:在标准 Transformer 里,LayerNorm 通常不是"对一个样本的所有单词一起缩放",而是"每个单词自己,对它的所有特征做归一化"。

比如一句话:

我 / 喜欢 / 人工智能

假设每个词被表示成 4 个特征:

"我"=2,4,6,8 "喜欢"=10,20,30,40 "人工智能"=−2,0,2,4

LayerNorm 做的其实类似:

"我" 2, 4, 6, 8 → LN → 比较稳定的分布

"喜欢" 10,20,30,40 → LN → 比较稳定的分布

"人工智能" -2,0,2,4 → LN → 比较稳定的分布

2.2.6 假如把 BN 引申到 RNN:为何它在序列模型中失效?

在前文中我们提到,LayerNorm 是针对"单个样本的所有特征"进行归一化。那么,为什么在 NLP 领域(尤其是早期的 RNN/LSTM)不直接使用计算机视觉中常用的 Batch Normalization (BN) 呢?

1. BN 的核心逻辑 vs. RNN 的时序特性
  • BN 的做法 :对同一个 Batch 中,所有样本同一个特征维度计算均值和方差。它假设不同样本在同一特征维度上的分布是相似的。
  • RNN 的痛点 :RNN 处理的是变长序列。
    • 时间步对齐问题 :句子长度不一(有的 5 个词,有的 20 个词)。如果在时间步 t = 10 t=10 t=10 做 BN,那些长度只有 5 的句子在该时间步是填充的(Padding),这会导致统计出的均值/方差被大量无效数据污染。
    • 时序依赖破坏:RNN 的核心在于捕捉时间步之间的动态变化。BN 强行将不同时间步的数据拉回到同一分布,可能会抹平时间维度上的重要差异(例如:句首和句尾的词性分布往往不同)。
2. 实验结论:BN 在 RNN 中表现不佳

研究表明,直接将 BN 应用于 RNN 的循环连接(Recurrent Connections)会导致训练不稳定,甚至无法收敛。

  • 原因 :RNN 的隐藏状态 h t h_t ht 随时间步剧烈变化,其统计特性(均值/方差)在不同时间步差异巨大。BN 强制归一化会破坏这种随时间演变的动态特征。
3. LayerNorm 的完美适配

相比之下,LayerNorm (LN) 天然适合 RNN 和 Transformer:

  • 独立性 :LN 只关注当前时间步、当前样本内部的特征分布,不依赖 Batch 中的其他样本,也不依赖其他时间步的数据。
  • 变长友好:无论序列多长,LN 都是对当前向量做归一化,完全不受 Padding 影响。

💡 总结

  • CV 领域 (CNN) → \rightarrow → 样本间同位置特征相似 → \rightarrow → BatchNorm
  • NLP 领域 (RNN/Transformer) → \rightarrow → 样本间长度不一、时序分布差异大 → \rightarrow → LayerNorm

三、解码器

本图展示了 Transformer 的宏观架构:左侧为 6 层堆叠的 Encoder(编码器) ,右侧为同样 6 层堆叠的 Decoder(解码器)

解码器的核心任务不仅仅是处理目标序列(如 "I am a student"),更重要的是它需要不断地"回头看"编码器的输出,以获取源语言(如 "Je suis étudiant")的上下文信息。这种交互是通过**交叉注意力机制(Cross-Attention)**实现的。

1. 核心交互逻辑:Query, Key, Value

在 Decoder 的每一层中,都存在一个特殊的注意力模块,用于连接 Encoder 和 Decoder。我们可以将其类比为"图书馆查书"的过程:

  • Encoder 提供知识库 (Keys & Values)

    • Encoder 的最终输出不仅仅是给最后一层用的,而是每一层 Decoder 都会用到
    • Encoder 的输出向量被转化为 Key(键)Value(值)
    • 含义:Key 代表了源句子中每个词的"索引标签"(例如:"Je"对应"我","étudiant"对应"学生"),而 Value 代表了这些词具体的"语义内容"。这相当于图书馆里整理好的书籍索引和内容。
  • Decoder 发起查询 (Query)

    • Decoder 在处理当前生成的词(例如正在生成 "student")时,会根据当前的上下文状态生成一个 Query(查询向量)
    • 含义:Query 代表了 Decoder 当前时刻"想要寻找什么信息"。例如,当 Decoder 想要翻译"学生"这个词时,它的 Query 就会去 Encoder 提供的 Keys 中寻找匹配度最高的那个键(即 "étudiant" 对应的 Key)。

2. 动态对齐与解码过程

如图所示,黑色的箭头从 Encoder 指向了每一个 Decoder 层,这代表了信息的流动方向:

  1. 计算注意力分数:Decoder 的 Query 与 Encoder 的所有 Keys 进行点积运算,计算出注意力分数(Attention Scores)。分数越高,代表相关性越强。
  2. 加权聚合 :根据分数,对 Encoder 的 Values 进行加权求和。
    • 例子:当 Decoder 生成 "student" 时,它会发现 Encoder 中 "étudiant" 对应的 Key 与自己的 Query 最匹配,因此会提取出 "étudiant" 对应的 Value 信息。
  3. 辅助生成:这个聚合后的向量包含了源句子的关键信息,帮助 Decoder 准确地预测出下一个单词。

通过这种机制,Transformer 实现了源语言和目标语言在语义层面的软对齐(Soft Alignment),不再像传统 RNN 那样依赖一个固定的上下文向量,而是每一步都能动态地关注源句子的不同部分。

相关推荐
又见情义6 小时前
RK3568 Android 13 板载驱动适配-USB
android·arm开发·驱动开发
delta_hell6 小时前
【阅读源码-Android】动画之Choreographer-2
android·源码·choreographer
for_ever_love__6 小时前
python基础语法学习: 闭包
开发语言·python·学习·闭包
mmsx6 小时前
基于 Android 的博物馆文化展示与预约 App —— 设计与实现(有源码和文档)
android·app·源码·文档
一笑的小酒馆7 小时前
AndroidAGP9.0升级之路
android
皮卡丘不断更7 小时前
从遥操作示范到可复现训练:LeRobot 0.6.1 的机器人学习工作流
人工智能·学习·机器人·开源·开发工具
阮胜昌8 小时前
MySQL 中的动态数据脱敏:无需更改应用程序即可保护敏感数据
android·mysql·adb
IZero078 小时前
Elasticsearch 学习笔记筑基-文档操作篇
笔记·学习·elasticsearch
小白说大模型9 小时前
AI驱动的个性化学习路径:知识图谱与知识点关联的存储与推理
大数据·人工智能·学习·mysql·机器学习·prompt·知识图谱
吃好睡好便好9 小时前
三伏天结束了
学习·生活·毕淑敏·心理游戏