深度学习笔记-6:Transformer与图神经网络 - MuxiaoWF跳到主要内容

深度学习笔记-6:Transformer与图神经网络

深度学习笔记-6,涵盖Transformer注意力机制(自注意力、多头注意力、位置编码)、语言模型(GPT/BERT)与图神经网络(消息传递、图卷积、图注意力)。对应《深度学习:基础与概念》第12-13章。

周一 9月 01 2025
9613 字 · 36 分钟

系列第 6/8 篇 ← 上一篇 | 下一篇 | 术语表

建议先看第1-5篇,尤其是第5篇的 CNN(理解卷积→注意力的演进)和第4篇的残差连接。本篇讲 Transformer 的注意力机制、为什么它比 RNN 强,以及图神经网络怎么处理非网格数据。

Chapter 12 Transformer

注意力

注意力(Attention)是 Transformer 模型的核心概念。它允许神经网络在处理序列数据时,动态地为不同输入分配不同的重要性权重。这些权重本身也依赖于输入数据,从而能够捕捉序列中的依赖关系。

与传统神经网络中固定的权重不同,注意力机制的权重是数据依赖的,即根据当前输入动态计算。

考虑以下两个句子:

  1. I swam across the river to get to the other bank.
  2. I walked across the road to get cash from the bank.

同一个词 “bank” 在不同上下文中有不同含义(河岸 vs. 银行)。模型需要根据上下文中的其他词(如 “swam”, “river”, “cash” )来判断其正确含义。

这表明,模型在处理某个词时,应该“关注”序列中与之相关的其他词。这种关注的程度(权重)取决于输入序列本身。

  • 传统词嵌入:每个词映射到一个固定的向量(如 “bank” 总是同一个向量),无法区分多义词。
  • Transformer 的目标:通过注意力机制,将词映射到一个新的表示空间,使得同一个词在不同上下文中得到不同的向量表示。
    • 在第一个句子中,“bank” 的表示会靠近 “water”。
    • 在第二个句子中,“bank” 的表示会靠近 “money”。

Transformer 的输入是一组向量 {xn}\{x_n\},其中 n=1,,Nn = 1, \dots, N

  • 每个向量 xnx_n 称为一个 token(令牌)。
    • 在 NLP 中,token 可以是一个词、子词或字符。
    • 在图像中,token 可以是一个图像块(patch)。
    • 在蛋白质序列中,token 可以是一个氨基酸。
  • 向量 xnx_n 的每个元素称为一个 特征(feature)。
  • 向量维度为 DD,序列长度为 NN

我们将输入组织成一个 N×DN \times D 的矩阵 XX

X=[x1Tx2TxNT]X = \begin{bmatrix} x_1^T \\ x_2^T \\ \vdots \\ x_N^T \end{bmatrix}

因此Transformer 的基本单元是一个函数,它将输入矩阵 XX 转换为输出矩阵 X~\tilde{X},且维度保持不变:

X~=TransformerLayer[X]\tilde{X} = \text{TransformerLayer}[X]

可以堆叠多个这样的层,形成深度网络。每一层都有自己的可学习参数(权重和偏置),通过梯度下降进行训练。

一个 Transformer 层包含两个主要阶段:

  1. 注意力机制:在列方向(特征维度)上混合不同 token 的信息。
  2. 逐行变换:在每一行(每个 token)内部进行特征变换。

注意力系数

想象你在阅读一篇文章时,为了理解某个句子,你需要”关注”文章中的某些部分。注意力机制就是让机器学习也能做到这一点。

目标:将输入向量 x1,,xNx_1, \dots, x_N 映射到输出向量 y1,,yNy_1, \dots, y_N,使得 yny_n 的表示更丰富。

关键思想:输出向量 yny_n 不仅依赖于对应的输入 xnx_n(某单个输入向量),还依赖于所有其他输入 x1,,xNx_1, \dots, x_N(整体的意思) 。依赖程度由注意力权重 anma_{nm} 控制。

定义每个输出向量为输入向量的线性组合:

yn=m=1Nanmxmy_n = \sum_{m=1}^{N} a_{nm} x_m

注意力权重 anma_{nm} 应满足:

  1. 非负性anm>0a_{nm} > 0 (避免正负抵消)
  2. 归一化m=1Nanm=1\sum_{m=1}^{N} a_{nm} = 1 (保证权重总和为1)

这两个约束意味着 anm[0,1]a_{nm} \in [0, 1],即权重构成一个“单位划分”。

  • ann=1a_{nn} = 1anm=0a_{nm} = 0(当 mnm \neq n),则 yn=xny_n = x_n,输入不变。
  • 一般情况下,yny_n 是所有输入向量的加权平均,权重由输入数据决定。

总而言之,注意力机制通过动态分配权重,使模型能够关注输入序列中的重要部分。

假设我们有3个输入向量:

  • x1=[1,2,3]x_1 = [1, 2, 3](比如描述”猫”)
  • x2=[4,5,6]x_2 = [4, 5, 6](比如描述”狗”)
  • x3=[7,8,9]x_3 = [7, 8, 9](比如描述”动物”)

我们要计算输出向量 y1y_1y1=a11×x1+a12×x2+a13×x3y_1 = a_{11} \times x_1 + a_{12} \times x_2 + a_{13} \times x_3

假设注意力系数为:

  • a11=0.5a_{11} = 0.5(50%关注自己)
  • a12=0.3a_{12} = 0.3(30%关注第二个输入)
  • a13=0.2a_{13} = 0.2(20%关注第三个输入)

那么:

y1=0.5×[1,2,3]+0.3×[4,5,6]+0.2×[7,8,9]=[0.5,1.0,1.5]+[1.2,1.5,1.8]+[1.4,1.6,1.8]=[3.1,4.1,5.1]\begin{align} y_1 &= 0.5 \times [1,2,3] + 0.3 \times [4,5,6] + 0.2 \times [7,8,9] \\ &= [0.5,1.0,1.5] + [1.2,1.5,1.8] + [1.4,1.6,1.8] \\ &= [3.1, 4.1, 5.1] \end{align}

还可以动态调整关注点:

  • y1y_1 可能更关注”猫”的信息(a11=0.7,a12=0.2,a13=0.1a_{11}=0.7, a_{12}=0.2, a_{13}=0.1
  • y2y_2 可能更关注”狗”的信息(a21=0.2,a22=0.7,a23=0.1a_{21}=0.2, a_{22}=0.7, a_{23}=0.1
  • y3y_3 可能更关注整体概念(a31=0.3,a32=0.3,a33=0.4a_{31}=0.3, a_{32}=0.3, a_{33}=0.4

自注意力

如何计算注意力权重 anma_{nm}

首先通过信息检索类比:

  • Key (键):描述项目的属性(如电影的类型、演员)。
  • Value (值):项目本身(如电影文件)。
  • Query (查询):用户的偏好(如想看的类型)。

系统通过比较 Query 和 Key 来找到最佳匹配,并返回对应的 Value。

而在 Transformer 中:

  • Value:输入向量 xnx_n 直接作为 Value。
  • Key:输入向量 xnx_n 也作为 Key。
  • Query:输入向量 xmx_m 作为输出 ymy_m 的 Query。

这称为“自注意力”,因为 Query、Key、Value 都来自同一输入序列

要计算 Query xnx_n 和 Key xmx_m 的相似度。一个简单方法是点积,点积越大,说明两个词越相关:

similarity=xnTxm\text{similarity} = x_n^T x_m

使用 Softmax 函数将点积转换为归一化的注意力权重:

anm=exp(xnTxm)m=1Nexp(xnTxm)a_{nm} = \frac{\exp(x_n^T x_m)}{\sum_{m'=1}^{N} \exp(x_n^T x_{m'})}

Softmax 确保了权重的非负性和归一化。

将所有注意力权重组织成一个 N×NN \times N 的矩阵:

A=Softmax(XXT)A = \text{Softmax}(X X^T)

其中 Softmax(L)\text{Softmax}(L) 表示对矩阵 LL 的每个元素取指数,然后对每一行进行归一化。

输出矩阵 YY 为:

Y=AX=Softmax(XXT)XY = A X = \text{Softmax}(X X^T) X

假设输入序列有3个词:

X=[x1,x2,x3]=[[1,0,1],[2,1,0],[0,1,2]]X = [x_1, x_2, x_3] = [[1,0,1], [2,1,0], [0,1,2]]

计算相似度矩阵:

XXT=[[2,2,2],[2,5,1],[2,1,5]]X X^T = [[2, 2, 2], [2, 5, 1], [2, 1, 5]]

对每一行应用Softmax得到注意力权重:

A=[[0.33,0.33,0.33],[0.05,0.89,0.05],[0.05,0.05,0.89]]A = [[0.33, 0.33, 0.33], [0.05, 0.89, 0.05], [0.05, 0.05, 0.89]]

最后计算最终输出Y

网络参数

上述自注意力机制没有可学习参数,因此无法从数据中学习。此外,所有特征在计算相似度时权重相同。

解决方案:对输入进行线性变换,引入可学习权重矩阵。

定义:

  • Query 矩阵Q=XW(q)Q = X W^{(q)}
  • Key 矩阵K=XW(k)K = X W^{(k)}
  • Value 矩阵V=XW(v)V = X W^{(v)}

其中 W(q),W(k),W(v)W^{(q)}, W^{(k)}, W^{(v)} 是可学习的权重矩阵。

维度说明:

  • W(k)W^{(k)}W(q)W^{(q)} 的维度为 D×DkD \times D_k,确保 QQKK 的列数相同,以便计算点积 QKTQ K^T
  • W(v)W^{(v)} 的维度为 D×DvD \times D_v,决定输出向量的维度。
  • 通常设 Dk=DD_k = DDv=DD_v = D,以保持输入输出维度一致,便于堆叠层和使用残差连接。

最终的自注意力输出为:

Y=Softmax(QKTDk)VY = \text{Softmax}\left(\frac{Q K^T}{\sqrt{D_k}}\right) V

缩放自注意力

问题:当 DkD_k 较大时,点积 qnTkmq_n^T k_m 的方差会很大(约为 DkD_k),导致 Softmax 函数的输入值过大,使其进入梯度很小的饱和区,影响训练。

解决方案:将点积结果除以 Dk\sqrt{D_k} 进行缩放。

最终的自注意力公式为:

Y=Attention(Q,K,V)Softmax(QKTDk)VY = \text{Attention}(Q, K, V) \equiv \text{Softmax}\left(\frac{Q K^T}{\sqrt{D_k}}\right) V

多头注意力

单个注意力头可能只能捕捉一种类型的依赖关系(如语法关系或语义关系)。

解决方案:使用多个并行的注意力头,每个头学习不同的投影空间,从而捕捉不同类型的模式。

定义 HH 个头:

  • hh 个头的输出为:Hh=Attention(Qh,Kh,Vh)H_h = \text{Attention}(Q_h, K_h, V_h)
  • 其中: Qh=XWh(q),Kh=XWh(k),Vh=XWh(v)Q_h = X W_h^{(q)}, \quad K_h = X W_h^{(k)}, \quad V_h = X W_h^{(v)}
  • 每个头有独立的可学习参数 Wh(q),Wh(k),Wh(v)W_h^{(q)}, W_h^{(k)}, W_h^{(v)}

将所有头的输出拼接起来:

Concat(H1,,HH)\text{Concat}(H_1, \dots, H_H)

维度为 N×(HDv)N \times (H \cdot D_v)

然后通过一个线性变换 W(o)W^{(o)} 投影回原始维度 DD

Y(X)=Concat(H1,,HH)W(o)(公式 12.19)Y(X) = \text{Concat}(H_1, \dots, H_H) W^{(o)} \quad \text{(公式 12.19)}

其中 W(o)W^{(o)} 的维度为 (HDv)×D(H \cdot D_v) \times D

通常设置 Dv=D/HD_v = D / H,这样拼接后的维度正好是 N×DN \times D

多头注意力的信息流

多头注意力的信息流

Transformer 层

多头自注意力是 Transformer 的核心。为了构建深度网络,需要堆叠多个层。

为了改善训练,引入残差连接(见第9章-残差连接)和层归一化(Layer Normalization,对每个token的特征向量独立归一化,稳定训练):

设多头注意力的输出为 Y(X)Y(X),则加入残差连接和层归一化后的结果为:

Z=LayerNorm(Y(X)+X)Z = \text{LayerNorm}(Y(X) + X)

这确保了即使注意力层没有学到任何东西Y(X)0Y(X) \approx 0,信息也能通过残差路径 XX 传递。

也可以采用“预归一化”:

Z=Y(X)+X,其中X=LayerNorm(X)Z = Y(X') + X, \quad \text{其中} \quad X' = \text{LayerNorm}(X)

注意力层的输出是输入向量的线性组合(通过注意力权重),这限制了其表达能力。

为了引入非线性变换,通常在注意力层之后添加一个多层感知机(MLP):

  • 例如,一个两层全连接网络,中间使用 ReLU 激活函数。
  • 同样使用残差连接和层归一化。

一个完整的 Transformer 层

一个完整的 Transformer 层:输入 XX 经过多头自注意力(加残差和归一化)得到 ZZ,然后 ZZ 经过 MLP(多层网络,加残差和归一化)得到最终输出 X~\tilde{X},包含两个子层:

  1. 多头自注意力子层(突出关系)
  • 接收输入 XX
  • 计算多头注意力输出 Y(X)Y(X)
  • 应用残差连接:X+Y(X)X + Y(X)。(稳定表达)
  • 应用层归一化:Z=LayerNorm(X+Y(X))Z = \text{LayerNorm}(X + Y(X))
  • 输入 X → 多头自注意力 → Y(X) → 残差连接+层归一化 → Z

  1. 前馈神经网络子层(丰富表达)
  • 接收上一步的输出 ZZ
  • 通过一个全连接的 MLP 进行非线性变换。通常的结构是: MLP(z)=W2ReLU(W1z+b1)+b2\text{MLP}(z) = W_2 \cdot \text{ReLU}(W_1 \cdot z + b_1) + b_2 其中 W1W_1 的维度通常是 D×DffD \times D_{ff}Dff>DD_{ff} > D,例如 4 倍),W2W_2 的维度是 Dff×DD_{ff} \times D ,确保输出维度与输入相同。
  • 应用残差连接:Z+MLP(Z)Z + \text{MLP}(Z)
  • 应用层归一化:X~=LayerNorm(Z+MLP(Z))\tilde{X} = \text{LayerNorm}(Z + \text{MLP}(Z))
  • Z → MLP → MLP(Z) → 残差连接+层归一化 → 最终输出X̃

最终输出 X~\tilde{X} 的维度与输入 XX 相同,为 N×DN \times D


通过将多个这样的 Transformer 层堆叠起来,可以构建一个深度网络:

X(1)=TransformerLayer1[X(0)]X(2)=TransformerLayer2[X(1)]X(L)=TransformerLayerL[X(L1)]\begin{aligned} X^{(1)} &= \text{TransformerLayer}_1[X^{(0)}] \\ X^{(2)} &= \text{TransformerLayer}_2[X^{(1)}] \\ &\vdots \\ X^{(L)} &= \text{TransformerLayer}_L[X^{(L-1)}] \end{aligned}

其中 X(0)X^{(0)} 是初始输入(通常是词嵌入加上位置编码),X(L)X^{(L)} 是最终的表示,可用于下游任务(如分类、生成等)。

位置编码

自注意力机制有一个关键特性:它是排列不变的序列顺序无关的

从公式 Y=Softmax(QKT/Dk)VY = \text{Softmax}(QK^T / \sqrt{D_k}) V 可以看出,计算过程只依赖于向量之间的点积和线性组合。如果我们将输入序列 XX 的行(即 tokens)进行任意重新排列,只要同时对 Q,K,VQ, K, V 做相同的排列,最终的输出 YY 也会是相同排列的结果。

然而,在大多数序列任务中(尤其是 NLP),顺序至关重要。例如,“猫追老鼠” 和 “老鼠追猫” 含义完全不同。标准的自注意力层无法区分这两种情况。


为了使模型能够利用序列顺序,必须显式地将位置信息(token 在序列中的索引 nn)注入到输入中。(给词加上”位置标签”)

最常用的方法是位置编码(Positional Encoding): 将位置编码向量 pnp_n 加到第 nn 个 token 的输入嵌入向量 xnx_n 上:

xnxn+pnx_n \leftarrow x_n + p_n

在矩阵形式中,将位置编码矩阵 PP 加到输入矩阵 XX 上:

XX+PX \leftarrow X + P

其中 PP 是一个 N×DN \times D 的矩阵,第 nn 行是位置 nn 的编码向量 pnp_n

位置编码向量 pnp_n 必须满足:

  1. 唯一性:每个位置 nn 有唯一的编码。
  2. 可学习或确定性:编码可以是可学习的参数,也可以是预先定义的函数。

正弦/余弦编码:

使用不同频率的正弦和余弦函数来生成 pnp_n。对于位置 nn 和维度 ii

pn,2i=sin(nL2i/D)pn,2i+1=cos(nL2i/D)\begin{aligned} p_{n,2i} &= \sin\left(\frac{n}{L^{2i/D}}\right) \\ p_{n,2i+1} &= \cos\left(\frac{n}{L^{2i/D}}\right) \end{aligned}

其中 i=0,1,,D/21i = 0, 1, \dots, D/2 - 1

特点

  • 确定性:编码是预先计算好的,不是可学习的。
  • 周期性:不同维度具有不同的波长(LL控制)。
  • 相对位置:模型可以相对容易地学习到 pn+kp_{n+k}pnp_n 之间的关系(例如,通过线性变换),这有助于捕捉相对位置信息。

正弦/余弦编码

(a) 图中横轴表示嵌入向量rn的不同组件,纵轴表示序列中的位置。位置n和位置m的向量元素值均由相应的正弦和余弦曲线与水平灰线的交点表示。 (b)由上式定义且对于前N=200个位置,L=30的位置编码向量的热图说明,其中维度为D=100

可学习的位置编码

更简单的方法是将位置编码 PP 视为可学习的参数。初始化一个 Nmax×DN_{\text{max}} \times D 的矩阵(NmaxN_{\text{max}} 是模型支持的最大序列长度),其中每一行对应一个位置的编码向量。在训练过程中,这些向量作为模型参数一起被优化。

这种方法在实践中通常表现良好,且实现简单。


xnx_n 变为 xn+pnx_n + p_n 后,计算 Query、Key、Value 时:

qn=(xn+pn)W(q)kn=(xn+pn)W(k)vn=(xn+pn)W(v)\begin{aligned} q_n &= (x_n + p_n) W^{(q)} \\ k_n &= (x_n + p_n) W^{(k)} \\ v_n &= (x_n + p_n) W^{(v)} \end{aligned}

位置信息 pnp_n 被编码进了 qn,kn,vnq_n, k_n, v_n 中。因此,在计算注意力权重 Softmax(QKT/Dk)\text{Softmax}(QK^T / \sqrt{D_k}) 时,点积 qnTkmq_n^T k_m 不仅依赖于 xnx_nxmx_m 的语义,还依赖于它们的位置 nnmm。这使得模型能够区分不同顺序的序列。

输入序列的每个 token 都加上一个与其位置相关的向量,然后这个增强后的序列表示被送入第一个Transformer层。

自然语言

自然语言(如英语、中文)本质上是符号的序列。一个句子可以被看作是一个由单词和标点符号组成的有序列表,这些元素通常由空格分隔。例如: ["The", "cat", "sat", "on", "the", "mat", "."]

这种顺序性是语言理解的核心。改变词序通常会改变句子的含义,甚至使其变得无意义。例如:

  • "The cat chased the dog." (猫追狗)
  • "The dog chased the cat." (狗追猫)
  • "Chased cat the dog the." (语法错误,难以理解)

因此,处理语言的模型必须能够捕捉和利用序列中的长期依赖关系,例如主语和动词的依存关系,即使它们相隔很远。


one-hot(独热)编码: one-hot编码将每个单词映射到一个长度为词典大小的向量,向量中只有一个元素为1,其余元素为0。例如,对于词典大小为10的词典,单词” cat”的one-hot编码为:[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]。每个单词在词典中占据一个独立的维度。

词嵌入

one-hot编码存在高维度(词典规模大时)和无法捕捉词间关系的问题,词嵌入通过将词映射到低维稠密向量解决这些问题。

  • 嵌入矩阵定义:设嵌入空间维度为D,词典规模为K,嵌入矩阵E的维度为D×KD \times K 。对于one-hot编码的输入向量xnx_n,其对应的嵌入向量为: vn=Exnv_n = E x_n 由于xnx_n是one-hot向量,vnv_n本质上是矩阵E中对应的列向量。
  • Word2vec模型
    • 是一种通过两层神经网络学习词嵌入的方法,基于自监督学习(从无标签文本中生成训练样本)。
    • 两种变体:
      • 连续词袋模型(CBOW):以窗口内的上下文词为输入,预测中间词(“填空”任务)。
      • 跳字模型(Skip-gram):以中心词为输入,预测窗口内的上下文词。 word2vec

        Word2vec模型 左词袋模型 右跳字模型

  • 词嵌入的语义特性
    • 语义相关的词在嵌入空间中距离更近(如“Paris”和“London”)。
    • 支持简单向量运算,例如:
      v(Paris)v(France)+v(Italy)v(Rome)v(\text{Paris}) - v(\text{France}) + v(\text{Italy}) \simeq v(\text{Rome})
  • 应用方式
    • 作为预训练层,可固定预训练的嵌入矩阵,或在端到端训练中作为可学习层(初始值可随机或用预训练矩阵)。

分词

固定词表无法处理未登录词、拼写错误,字符级处理则丢失词结构且计算成本高。

  • 目标:结合词级和字符级的优势,将文本转换为 token(字符组,可能包含完整词、词片段或单个字符)。
  • 字节对编码(Byte Pair Encoding, BPE)
    • 过程:从单个字符开始,迭代合并最频繁的相邻 token 对(不跨词合并),直到达到预设的 token 数量。 示例
    • 如图所示,先合并“pe”(出现4次,不包括”Pe""),再合并“ck”(出现3次),以此类推。
  • 优势:处理未登录词、保留词结构、支持多模态(如代码)处理。

词袋模型

  • 联合分布假设:假设序列中词独立,联合分布分解为: p(x1,...,xN)=n=1Np(xn)p(x_1, ..., x_N) = \prod_{n=1}^N p(x_n) 完全忽略词序(“词袋”由此得名)。
  • 文本分类应用
    • 朴素贝叶斯分类器:假设每个类别内词独立,类条件概率为: p(x1,...,xNCk)=n=1Np(xnCk)p(x_1, ..., x_N | \mathcal{C}_k) = \prod_{n=1}^N p(x_n | \mathcal{C}_k)
    • 后验概率计算: p(Ckx1,...,xN)p(Ck)n=1Np(xnCk)p(\mathcal{C}_k | x_1, ..., x_N) \propto p(\mathcal{C}_k) \prod_{n=1}^N p(x_n | \mathcal{C}_k)
  • 平滑处理:测试集中出现训练未见过的词时,概率会为0,需通过平滑(如均匀分配小概率)避免。

自回归模型

  • 联合分布分解:考虑词序,将联合分布分解为条件概率乘积: p(x1,...,xN)=n=1Np(xnx1,...,xn1)p(x_1, ..., x_N) = \prod_{n=1}^N p(x_n | x_1, ..., x_{n-1})
  • n-gram模型
    • 简化假设:条件概率仅依赖前L个词(如L=1为bigram,L=2为trigram)。
    • 示例(L=2): p(x1,...,xN)=p(x1)p(x2x1)n=3Np(xnxn1,xn2)p(x_1, ..., x_N) = p(x_1) p(x_2 | x_1) \prod_{n=3}^N p(x_n | x_{n-1}, x_{n-2})
  • 局限性
    • 参数爆炸:随L增长,概率表规模呈指数增长(难以超过trigram)。
    • 长程依赖:无法捕捉长距离词间关系,生成文本可能不连贯。
  • 隐马尔可夫模型(HMM):通过潜在变量传递长程信息,但能力有限(依赖潜在状态链)。

递归神经网络(RNN)

  • 动机:解决序列长度可变和参数共享问题,支持 equivariance(同词在不同位置语义一致)。
  • 结构
    • 引入隐藏状态znz_n,输入为当前词xnx_n和前一隐藏状态zn1z_{n-1},输出为当前词yny_n和新隐藏状态znz_nRNN
    • 权重共享 across 序列位置,结构如图所示(初始隐藏状态z0z_0通常设为全0向量)。
  • 机器翻译示例
    • 编码器:处理输入序列(如英语),压缩为隐藏状态zz^*
    • 解码器:以zz^*start\langle \text{start} \rangle token为起点,生成输出序列(如荷兰语),直到 end\langle \text{end} \rangle token,结构如下图所示。 机器翻译示例
    • 自回归特性:每个输出词作为下一输入,类似上面自回归的公式。

时间反向传播

  • 训练方法:通过反向传播计算梯度,误差函数为交叉熵(输出用softmax激活)。
  • 问题
    • 梯度消失/爆炸:长序列训练时,梯度经过多步传递后衰减或激增。
    • 长程依赖差:输入序列需压缩为固定长度zz^*,长序列易丢失信息(瓶颈问题)。
  • 改进模型
    • LSTM(长短期记忆网络)和GRU(门控循环单元):通过门控机制增强长程信息保留能力。
  • 局限性
    • 并行计算差:序列处理依赖前序步骤,无法高效利用GPU。
    • 仍受限于长程依赖建模能力。

Transformer语言模型

按输入输出形式分为三类:

  • 编码器模型:输入序列,输出固定向量(如情感分析)。
  • 解码器模型:输入向量,输出序列(如文本生成)。
  • 序列到序列模型:输入输出均为序列(如翻译)。

解码器Transformer

  • GPT模型:生成式预训练Transformer,自回归模型,目标是学习条件概率p(xnx1,...,xn1)p(x_n | x_1, ..., x_{n-1})
  • 架构
    • 输入: token序列x1,...,xNx_1, ..., x_N(含位置编码)。
    • 输出:通过线性变换+softmax得到 token 概率分布: Y=Softmax(X~W(p))Y = \text{Softmax}(\tilde{X} W^{(p)}) 解码器结构
  • 训练方式
    • 自监督学习:从无标签文本中取序列,以xn+1x_{n+1}为目标训练。
    • 并行处理:将序列拆分为多个子序列(如“我游泳过河”拆分为“我游泳”→“过”、“我游泳过”→“河”等)。
    • 掩码注意力(因果注意力):确保预测xnx_n时仅关注前序 token,如下图所示(红色区域注意力权重设为0)。 解码器
  • 序列处理
    • 填充 tokenpad\langle \text{pad} \rangle:统一不同长度序列,通过掩码忽略pad\langle \text{pad} \rangle的注意力。
    • 生成过程:每次采样下一个 token 并加入序列,循环直至 end\langle \text{end} \rangle token。

采样策略

  • 贪心搜索:每次选概率最高的 token, deterministic 但可能不是最优序列。
  • 束搜索
    • 保留B个最优假设(束宽B),每次扩展为B2B^2个,再筛选出B个。
    • 需长度归一化(避免偏向短序列),计算成本为O(BKN)O(BKN)
  • 随机采样
    • Top-K采样:从概率最高的KK个 token 中按归一化概率采样。
    • Top-p采样(核采样):累积概率达阈值p的 token 集合中采样。
    • 温度参数:调整softmax分布: yi=exp(ai/T)jexp(aj/T)y_i = \frac{\exp(a_i / T)}{\sum_j \exp(a_j / T)} T0T \to 0接近贪心,T=1为原始分布,TT \to \infty趋向均匀。
  • 问题:贪心/束搜索可能重复序列,随机采样可能生成无意义文本(人类文本概率更低但更合理)。

编码器Transformer

  • BERT模型:双向编码器表示,预训练后通过微调适应下游任务。
  • 预训练方式
    • 随机选择15% token 替换为 mask\langle \text{mask} \rangle(80%)、随机词(10%)或保留原词(10%),训练模型预测原词。
    • 双向性:允许关注前后 token,无需右移输入或掩码,结构如下所示。 解码器
  • 微调
    • 分类任务:用首个tokentoken 的输出,接线性层+softmax。
    • token 级任务:用所有输出,接共享线性层+softmax。
  • 局限:训练效率低(仅部分 token 为目标),无法生成序列。

序列到序列Transformer

  • 应用:如翻译(输入英语,输出荷兰语),结合编码器和解码器。
  • 交叉注意力:解码器的查询QQ来自生成序列,键KK和值VV来自编码器输出ZZ
  • 整体架构:如下图所示,编码器处理输入序列,解码器通过交叉注意力结合编码器输出,生成目标序列。

序列到序列Transformer

大语言模型(LLMs)

  • 规模:参数达万亿级(如GPT-4),依赖大规模文本数据和并行计算(GPU集群)。
  • 训练范式
    • 自监督预训练:在海量无标签文本上学习语言规律。
    • 微调:通过少量有标签数据适配下游任务(迁移学习)。
  • 低秩适应(LoRA)
    • 冻结预训练模型权重,新增低秩矩阵(A(D×R)A (D \times R))和(B(R×D)B (R \times D)),输出为(XW0+XABX W_0 + XAB)。
    • 微调后合并权重:W^=W0+AB\hat{W} = W_0 + AB,减少参数量(如1/10000)。
  • 提示工程:通过设计输入提示(如“翻译:…”)引导模型完成任务,支持少样本学习。
  • RLHF:通过人类反馈的强化学习优化模型输出(如ChatGPT)。

多模态Transformer

  • 核心:将不同模态(文本、图像、音频等)转换为 token,用Transformer统一处理。

视觉Transformer

  • 图像 token 化
    • 将图像H×W×CH \times W \times C拆分为P×PP \times P非重叠 patches(如P=16P=16),展平为向量。
    • 或用小型CNN下采样生成 token。
  • 架构:如下图所示,加入tokentoken 和学习的位置编码,通过编码器输出分类结果。
  • 特点: inductive bias 弱(依赖数据学习图像几何特性),需更多训练数据,精度可能更高。

视觉Transformer

生成式图像Transformer

  • 自回归生成:按光栅扫描顺序(阅读顺序)预测像素,联合分布分解为:
    p(x1,...,xN)=n=1Np(xnx1,...,xn1)p(x_1, ..., x_N) = \prod_{n=1}^N p(x_n | x_1, ..., x_{n-1})
  • 离散表示
    • 向量量化(VQ):用码本C\mathcal{C}近似像素patch,xnargminckCxnck2x_n \to \arg\min_{c_k \in \mathcal{C}} \|x_n - c_k\|^2 ,解决连续值生成模糊问题。
    • ImageGPT:将像素映射到离散颜色码本,用Transformer学习 next-token 预测。

音频数据处理

  • 梅尔频谱图(Mel Spectrogram):将音频波形转换为时间-频率矩阵(感知均匀的频率划分)。
  • 音频分类
    • 将梅尔频谱图拆分为 patches,生成 token 后输入Transformer编码器。
    • tokentoken 输出分类结果,性能优于CNN(擅长长程依赖)。

文本到语音

Vall-E

Vall-E

  • Vall-E模型
    • 语音 token 化:用向量量化将语音转换为离散 token。
    • 输入:文本 token + 少量目标 speaker 的语音 token,输出对应语音 token,如上图所示。
    • 优势:仅需几秒样本即可模仿新 speaker 声音。

视觉与语言Transformer

  • 数据:如LAION400M(文本-图像对),支持文本生成图像、图像生成文本等。
  • Parti模型:编码器-解码器架构,输入文本 token,输出图像 token(向量量化后的patch)。
  • CM3Leon模型
    • 训练数据:含文本和图像的HTML文档。
    • 支持文本-图像生成、图像编辑、 caption 生成等多任务。
习题1

注意力公式里有个 ÷dk\div \sqrt{d_k},不除会怎样?

维度 dkd_k 大了之后,QQKK 的点积数值会很大,softmax 直接”饱和”了——输出全是 0 和 1,梯度几乎为零,训练就卡住了。除以 dk\sqrt{d_k} 把数值拉回合理范围,softmax 才能正常工作。

多头注意力比单头好在哪?举个例子?

单头只能学一种关系,多头可以同时学好几种。比如 “The cat that sat on the mat is black”,一个头可能关注 cat→is(语法),另一个头关注 cat→black(语义),还有一个头关注 cat→mat(位置)。最后拼在一起,信息比单头丰富得多。

习题2

RNN 天生就知道词语的顺序,Transformer 却要额外加位置编码。为啥?

RNN 是一个一个读的,第 tt 步的隐状态天然包含了”前面有 tt 个词”的信息。Transformer 的自注意力是一次性把所有词同时处理的,它只看”谁和谁像”,完全不管顺序。不加位置编码的话,“猫追狗”和”狗追猫”在它眼里一模一样。


第12章小结

一句话版本

  • 注意力机制:让模型动态决定”看哪里”,用Q/K/V的信息检索类比理解——查询和键越匹配,对应的值权重越大
  • 自注意力:Q、K、V都来自同一序列,解决”bank到底是河岸还是银行”的消歧问题
  • 多头注意力:多个注意力头并行,各自捕捉不同类型的依赖(语法、语义等),拼接后投影
  • 位置编码:给token加上位置标签,解决自注意力”排列不变”的短板——没有它,“猫追狗”和”狗追猫”分不清
  • Transformer层:注意力子层(混合token间关系)+ 前馈子层(丰富每个token的表达),靠残差连接和层归一化稳定训练
  • 三大架构:编码器(BERT,双向理解)、解码器(GPT,自回归生成)、Seq2Seq(翻译等,交叉注意力连接两者)

知识地图

自注意力(Q/K/V + Softmax)
↓ 引入可学习参数
缩放自注意力(÷√D_k 防饱和)
↓ 并行多组
多头注意力 → 拼接 + 线性投影
↓ 加残差连接 + 层归一化 + 前馈MLP
Transformer层 → 堆叠L层 → 深度网络
↓ 加位置编码(正弦/可学习)
├── 编码器(BERT):双向,掩码语言模型
├── 解码器(GPT):自回归,因果注意力
└── Seq2Seq:编码器+解码器+交叉注意力

Chapter 13 图神经网络

序列(1D)和图像(2D网格)是结构化数据的特例,而更通用的结构化数据可用(Graph)描述——由节点(node)和边(edge)组成,节点和边均可关联数据(如分子中原子类型、铁路网中行程时间)。

基于图的机器学习

  • 节点预测:预测节点属性(如根据网页间超链接分类文档主题)。
  • 边预测(图完成):预测边是否存在(如蛋白质相互作用网络中补全未观测的相互作用)。
  • 图预测(回归/分类):预测整个图的属性(如分子的水溶性),训练数据为多个独立图的集合。
  • 归纳学习与转导学习
    • 归纳学习:训练和测试图/节点独立(如预测新分子的性质)。
    • 转导学习:已知整个图结构,仅部分节点有标签,预测剩余节点标签(如社交网络中区分真人与机器人)。
  • 图表示学习:学习图的有效内部表示,用于下游任务(如预训练分子基础模型,再微调至特定任务)。

图的基本概念与符号

  • 图的定义:图G=(V,E)G=(V, E),其中VV为节点集,EE为边集。节点索引n=1,...,Nn=1,...,N,边(n,m)(n,m)连接节点nnmm,节点nn的邻居集记为N(n)\mathcal{N}(n)
  • 节点数据:每个节点nn的属性用DD维向量xnx_n表示,所有节点数据组成N×DN \times D矩阵XX(行nnxnTx_n^T)。

邻接矩阵

N×NN \times N矩阵AA,若节点nnmm有边,则Anm=1A_{nm}=1,否则为0。无向图的AA是对称的Anm=AmnA_{nm}=A_{mn}

  • 问题:邻接矩阵依赖节点排序,而图的属性应与节点排序无关。

邻接矩阵依赖节点排序

邻接矩阵依赖节点排序

置换不变性与等变性

  • 置换矩阵PPN×NN \times N矩阵,每行每列仅1个1,用于表示节点重排序。若节点nn重排为m=π(n)m=\pi(n),则PP 的行nn 为单位向量uπ(n)Tu_{\pi(n)}^T
  • 数据置换
    • 节点数据矩阵:X~=PX\tilde{X} = PX行随节点重排。
    • 邻接矩阵:A~=PAPT\tilde{A} = PAP^T(行和列均重排)。
  • 网络输出要求
    • 图级预测需置换不变性y(X~,A~)=y(X,A)y(\tilde{X},\tilde{A}) = y(X,A)
    • 节点级预测需置换等变性y(X~,A~)=Py(X,A)y(\tilde{X},\tilde{A}) = Py(X,A)(预测随节点同步重排)。

神经消息传递

  • 目标:构建满足置换等变性/不变性、支持多层非线性变换、处理可变长度图、可扩展的网络。
  • 卷积神经网络(CNN,见第5篇)——图像可视为特殊图(像素为节点,邻接像素为边),CNN通过局部滤波器聚合信息,图神经网络类似地通过邻居聚合信息。

图卷积与消息传递框架

  • 从CNN到图卷积

    • CNN中3×33 \times 3滤波器:zi(l+1)=f(jwjzj(l)+b)z_i^{(l+1)} = f\left( \sum_j w_j z_j^{(l)} + b \right)(j为局部像素)。
    • 图卷积修改:聚合邻居信息,共享参数确保等变性: zi(l+1)=f(wneighjN(i)zj(l)+wselfzi(l)+b)z_i^{(l+1)} = f\left( w_{\text{neigh}} \sum_{j \in \mathcal{N}(i)} z_j^{(l)} + w_{\text{self}} z_i^{(l)} + b \right) 其中wneighw_{\text{neigh}}(邻居权重)和wselfw_{\text{self}}(自身权重)为所有节点共享。
  • 消息传递神经网络

    • 流程:每层分为聚合更新 两步。
    • 聚合:对节点 n ,聚合邻居嵌入: zn(l)=Aggregate({hm(l):mN(n)})z_n^{(l)} = \text{Aggregate}\left( \{ h_m^{(l)} : m \in \mathcal{N}(n) \} \right)
    • 更新:结合自身嵌入与聚合结果: hn(l+1)=Update(hn(l),zn(l))h_n^{(l+1)} = \text{Update}\left( h_n^{(l)}, z_n^{(l)} \right)
    • 初始化:hn(0)=xnh_n^{(0)} = x_n(节点初始嵌入为其属性)。

消息传递

聚合算子

需满足:与邻居顺序无关、支持可变数量邻居、可微。常见形式:

  • 求和: 收集所有邻居节点的信息 Aggregate(...)=mN(n)hm(l)\text{Aggregate}(...) = \sum_{m \in \mathcal{N}(n)} h_m^{(l)} 优点:保留邻居数量信息;缺点:邻居多的节点影响过强。
  • 平均Aggregate(...)=1N(n)mN(n)hm(l)\text{Aggregate}(...) = \frac{1}{|\mathcal{N}(n)|} \sum_{m \in \mathcal{N}(n)} h_m^{(l)} 优点:归一化;缺点:丢失邻居数量信息。
  • 对称归一化Aggregate(...)=mN(n)hm(l)N(n)N(m)\text{Aggregate}(...) = \sum_{m \in \mathcal{N}(n)} \frac{h_m^{(l)}}{\sqrt{|\mathcal{N}(n)| \cdot |\mathcal{N}(m)|}} 平衡不同节点的邻居数量差异。
  • 元素最大/最小:对邻居嵌入逐元素取最大/最小,同样满足置换不变性。
  • 带参数聚合:通过MLP引入可学习参数(通用近似器): Aggregate(...)=MLPθ(mN(n)MLPϕ(hm(l)))\text{Aggregate}(...) = \text{MLP}_\theta\left( \sum_{m \in \mathcal{N}(n)} \text{MLP}_\phi(h_m^{(l)}) \right) 其中MLPϕ\text{MLP}_\phi(邻居变换)和MLPθ\text{MLP}_\theta(聚合后变换)为共享网络。

更新算子

节点的新状态 = 处理(聚合后的信息 + 节点的原始信息)

  • 基本形式:结合自身嵌入与聚合结果,通过非线性变换更新: Update(hn(l),zn(l))=f(Wselfhn(l)+Wneighzn(l)+b)\text{Update}(h_n^{(l)}, z_n^{(l)}) = f\left( W_{\text{self}} h_n^{(l)} + W_{\text{neigh}} z_n^{(l)} + b \right) 其中ff为激活函数(如ReLU),Wself,WneighW_{\text{self}}, W_{\text{neigh}}为权重矩阵。
  • 简化形式:若Wself=WneighW_{\text{self}} = W_{\text{neigh}}且聚合用求和,则: hn(l+1)=f(WneighmN(n){n}hm(l)+b)h_n^{(l+1)} = f\left( W_{\text{neigh}} \sum_{m \in \mathcal{N}(n) \cup \{n\}} h_m^{(l)} + b \right)

假设我们有一个3x3的图像块

[123][456][789]\begin{align} [1 2 3]\\ [4 5 6]\\ [7 8 9] \end{align}
  • CNN:中心像素5会考虑周围的1,2,3,4,6,7,8,9
  • GNN:中心节点5只考虑直接相连的节点1,2,6,7

节点/边/图分类实现

  • 节点分类:(预测图中每个节点的类别)

    • 输出层:对最终嵌入hn(L)h_n^{(L)}应用softmax: yni=exp(wiThn(L))jexp(wjThn(L))y_{ni} = \frac{\exp(w_i^T h_n^{(L)})}{\sum_j \exp(w_j^T h_n^{(L)})}
    • 损失函数:交叉熵损失(仅训练节点Vtrain\mathcal{V}_{\text{train}}参与): L=nVtraini=1Cynitni\mathcal{L} = -\sum_{n \in \mathcal{V}_{\text{train}}} \sum_{i=1}^C y_{ni}^{t_{ni}} 其中tnit_{ni}为one-hot目标标签。
    • 每个节点经过GNN处理后得到嵌入向量hnh_n。再对 hnh_n 做softmax分类:yn=softmax(W×hn)y_n = softmax(W × h_n) 得到各类别的概率

  • 边分类:(预测两个节点之间是否有边(关系预测))利用节点嵌入的相似度:

    p(n,m)=σ(hnThm)p(n,m) = \sigma(h_n^T h_m)

    其中σ\sigma为sigmoid函数。

  • 图分类:(预测整个图的类别)

    • 图表示:聚合所有节点最终嵌入(确保置换不变性): y=f(nVhn(L))y = f\left( \sum_{n \in V} h_n^{(L)} \right) 聚合函数可选求和、平均、最大等(见前文),ff为输出网络。

通用图网络

图注意力网络

就像在社交中,我们会更关注某些朋友的意见一样,图注意力网络让节点能够”关注”更重要的邻居。

  • 核心:用注意力系数加权邻居信息,动态调整邻居重要性: zn(l)=mN(n)Anmhm(l)z_n^{(l)} = \sum_{m \in \mathcal{N}(n)} A_{nm} h_m^{(l)} 其中Anm0A_{nm} \geq 0mAnm=1\sum_m A_{nm} = 1(注意力系数)。
  • 注意力系数计算
    • 双线性形式:Anm=exp(hnTWhm)mexp(hnTWhm)A_{nm} = \frac{\exp(h_n^T W h_m)}{\sum_{m'} \exp(h_n^T W h_{m'})}
    • MLP形式:Anm=exp(MLP(hn,hm))mexp(MLP(hn,hm))A_{nm} = \frac{\exp(\text{MLP}(h_n, h_m))}{\sum_{m'} \exp(\text{MLP}(h_n, h_{m'}))}
  • 多头注意力:使用 H 组独立注意力头,结果拼接后投影,增强表达能力。

边嵌入与图嵌入

不仅节点有特征,连接节点的边也有自己的特征。

  • 边嵌入:引入边的隐藏变量enm(l)e_{nm}^{(l)},更新公式: enm(l+1)=Updateedge(enm(l),hn(l),hm(l))e_{nm}^{(l+1)} = \text{Update}_{\text{edge}}(e_{nm}^{(l)}, h_n^{(l)}, h_m^{(l)}) 节点聚合改为基于边嵌入:zn(l+1)=Aggregatenode({enm(l+1)})z_n^{(l+1)} = \text{Aggregate}_{\text{node}}(\{e_{nm}^{(l+1)}\})

整个图有一个全局的特征向量。

  • 图嵌入:引入全局图嵌入g(l)g^{(l)},综合所有节点和边信息更新: g(l+1)=Updategraph(g(l),{hn(l+1)},{enm(l+1)})g^{(l+1)} = \text{Update}_{\text{graph}}(g^{(l)}, \{h_n^{(l+1)}\}, \{e_{nm}^{(l+1)}\})

更新

(a) 边更新、(b) 节点更新,(c) 全局图更新。正在更新的变量用红色显示,而那些对该更新有贡献的变量则用蓝色显示

过平滑

“近朱者赤,近墨者黑”,经过很多轮消息传递后,所有节点变得越来越相似。

社交网络谣言传播类比:想象一条谣言在社交网络中传播——第1轮,你的直接朋友告诉你一些信息;第2轮,你朋友的朋友的信息也传到你这里;第3轮、第4轮……经过很多轮之后,网络中每个人”听到的版本”都差不多,原始的个性化信息(谁是消息源头、中间经过了谁)完全被”平均”掉了。GNN的过平滑问题与此类似:层数太多,所有节点的嵌入都趋于同一个”平均值”,失去了区分性。

  • 问题:多层消息传递后,节点嵌入趋于相似,限制网络深度。
  • 缓解方法
    • 残差连接(见第4篇):hn(l+1)=Update(...)+hn(l)h_n^{(l+1)} = \text{Update}(...) + h_n^{(l)}
    • 多层特征融合:yn=f(hn(1)hn(2)...hn(L))y_n = f(h_n^{(1)} \oplus h_n^{(2)} \oplus ... \oplus h_n^{(L)})\oplus为拼接)。

几何深度学习

  • 核心:在图网络中融入空间对称性(如分子旋转/平移不变性)。例如,分子模型中引入原子坐标嵌入( r_n^{(l)} ),更新时使用坐标差的平方(旋转/平移不变): enm(l+1)=Updateedge(...,rn(l)rm(l)2)e_{nm}^{(l+1)} = \text{Update}_{\text{edge}}(..., \|r_n^{(l)} - r_m^{(l)}\|^2) 确保分子性质预测与坐标系无关。
习题3

社交网络里,节点是用户,边是朋友关系。要预测每个用户的兴趣(节点分类),聚合算子用求和还是平均好?要是预测整个网络的活跃度(图分类)呢?

节点分类的话,看情况:如果”朋友多不多”本身就是重要特征(比如社交达人 vs 社恐),用求和;不然用平均更稳定,不会被朋友数量干扰。

图分类的话,得先把所有节点表示”压缩”成一个向量(全局池化),然后才能做预测。这里必须用置换不变的操作(比如求和或平均),因为节点编号是随便标的。

GNN 有什么明显的短板?

最大的问题是过平滑:层数一多,所有节点的表示变得一模一样——因为每层都在聚合邻居信息,传了好几轮之后每个节点都”看到了”整个图,区分度就没了。

另外 GNN 对某些图结构天生分不清(比如一个环和一条链,GNN 可能觉得是一回事),而且远距离的节点要靠堆层数才能”沟通”,但堆层数又会导致过平滑。挺矛盾的。


第13章小结

一句话版本

  • 图数据:比序列和图像更通用的结构——节点(实体)+ 边(关系),适用场景从分子到社交网络
  • 消息传递:GNN的核心操作——每轮聚合邻居信息、更新自身状态,就像”听朋友的意见来更新自己的看法”
  • 聚合算子:求和(保留邻居数量)、平均(归一化)、最大值(抓关键特征),选择取决于任务
  • 置换不变/等变:图的预测不能依赖节点编号顺序——图级预测要不变,节点级预测要随节点同步变化
  • 图注意力:让节点学会”更关注哪些邻居”,就像社交中更信任某些朋友的意见
  • 过平滑:消息传递太多轮,所有节点嵌入趋同——用残差连接和多层特征融合缓解

知识地图

图 = 节点 + 边(邻接矩阵表示)
↓ 置换不变性/等变性约束
消息传递框架:聚合(邻居信息)→ 更新(自身状态)
├── 图卷积:共享参数的邻居聚合(类比CNN)
├── 图注意力:动态加权邻居(类比Transformer注意力)
└── 通用图网络:+ 边嵌入 + 全局图嵌入
↓ 多层堆叠 → 过平滑问题 → 残差连接缓解
下游任务:节点分类 / 边预测 / 图分类

感谢您的阅读!如果可以,给俺点些关注吧~

深度学习笔记-6:Transformer与图神经网络

周一 9月 01 2025
9613 · 36 分钟
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00