第1层我们获得了“学习引擎”,但光有这个引擎,我们只能拟合一个简单的线性函数(y=Wx+b),这在面对图像、语言、推理等复杂问题时,完全不够用。

第2层,就是在这个引擎上,用张量搭建出各种功能强大的“神经积木”。 每一块积木都是对张量的一次多维数学变换,内部封装了可训练的权重,并刻意引入非线性或结构先验,使得模型能够捕捉数据中极其复杂的模式。它们就像是从晶体管到逻辑门的抽象——把基础运算组合成具有特定功能的“标准件”。


2.1 线性层——最基本的“突触”单元

线性层(全连接层) 是所有积木里最基础的一块,它直接实现了你第1层中见到的 y = Wx + b,只不过这里 xy 不再是一个标量,而是张量

假设输入是一串词的特征向量,形状为 (batch, seq_len, d_in),线性层的参数是权重矩阵 W 形状 (d_in, d_out) 和偏置向量 b 形状 (d_out)。其运算为:

Output = Input @ W + b
  • Input @ W 是一个矩阵乘法,将每个输入向量从 d_in 维空间线性投影到 d_out 维空间。
  • + b 是一个广播加法,为每个投影结果加上一个平移偏置。

这看似简单,但它是神经网络存储和混合信息的核心。一个线性层能做的只是仿射变换(旋转、缩放、平移),无论你堆叠多少个线性层,最终等价于一个单一的线性层——即只能拟合线性函数,无法学习非线性决策边界。因此,我们必须注入“非线性灵魂”。


2.2 激活函数——注入非线性

激活函数 对张量进行逐元素的非线性变换,直接打破线性叠加的桎梏。它对一个向量的每一个数值独立作用,不改变张量的形状。

举几个经典的:

  • ReLUf(x) = max(0, x)。把负数直接变成0,正数原样通过。
    在0/1层面,就是GPU对每个浮点数执行一次比较和条件赋值。极其简单,却让网络拥有了分段线性的表达能力。
  • GELU(现代Transformer常用):x * Φ(x),其中 Φ 是标准正态累积分布。近似公式为 0.5x(1 + tanh(√(2/π)(x+0.044715x³)))
    相比ReLU,它在0附近更平滑,允许极小负值通过,对训练超大模型更稳定。
  • Sigmoid / Softmax:常用于门控或输出概率。Softmax 是对一个向量做指数归一化:softmax(x_i) = exp(x_i) / Σ exp(x_j),把任意实数向量变成和为1的概率分布。

激活函数本身没有可训练参数,但它们在反向传播时会贡献梯度(比如ReLU在 x>0 时梯度为1,<=0时梯度为0)。正是激活函数夹在两层线性层之间,让整个深度网络能拟合任意复杂函数——一个“线性→非线性→线性→非线性……”的管线,理论上可以逼近任何连续映射。


2.3 归一化层——驯服数值分布

深度网络训练时,每层的输入分布在训练过程中会剧烈变化(所谓“内部协变量偏移”),导致梯度不稳定,难以收敛。归一化层强制性地对张量进行标准化,稳定分布。它们通常包含可训练的缩放和偏移参数。

  • 批归一化:对每个批次的同一通道,计算均值和方差,进行 (x - mean) / sqrt(var + ε),然后乘以 γβ。常用于图像卷积网络。
  • 层归一化:在每一条样本的所有特征维度上做标准化,不依赖批次统计,因此极其适合序列模型。Transformer中每一层都会用到。

从张量运算来看,归一化就是:求均值(reduce操作)、求方差(元素平方后求均值)、元素级减法和除法,再加上乘 γβ。全部是可微的,梯度可通过反向传播顺利穿透。

归一化层像是一座“稳定器”,确保信号和梯度在深层网络中不爆炸也不消失,让第1层的学习引擎能很顺畅地在百层网络中运作。


2.4 卷积层——捕获空间结构的眼睛

面对图像或序列,全连接层把输入展平成一维,完全破坏了空间局部关联。卷积层则利用“参数共享”和“局部连接”这两大先验,极大提升了参数效率。

一个2D卷积层有一个可学习的卷积核张量,形状 (out_channels, in_channels, kernel_height, kernel_width)。它在输入特征图上滑动,每次取一个局部窗口,与卷积核做逐元素乘积再求和(即点积),生成输出特征图的一个点。

  • 运算本质就是大量的小点积,可以被高度并行化并映射到硬件张量核。
  • 卷积核的参数在整个空间上共享,所以不管图像中的猫移到哪里,都能被同一套参数检测到。
  • 通过堆叠卷积、激活、池化(一种降采样)和归一化,网络可以从边缘、纹理逐渐组合出眼睛、鼻子、脸部等高层语义。

尽管卷积层主要用在视觉,但它也是一种标准的“神经积木”,其核心概念——局部感知、参数共享——启发了后面许多模块的设计。


2.5 自注意力——理解上下文的灵魂

现在,到了让大语言模型成为可能的核心积木:自注意力机制

全连接和卷积都只能处理固定范围的上下文(卷积核大小就是感受野)。而语言中一个词的意义,往往依赖很远的上下文:“他”指代的是前文出现的一个具体人名。自注意力允许每个词直接“看到”序列中的所有其他词,并动态计算“应该重点关注谁”。

它的计算步骤完全基于张量运算,我们拆解一个单头自注意力:

  1. 生成Q, K, V:输入序列张量 X 形状 (seq_len, d_model),分别通过三个不同的线性层(无偏置常用)投影,得到查询 Q、键 K、值 V,形状都是 (seq_len, d_k)。这三个线性层的权重就是可训练参数。

  2. 计算注意力分数Scores = (Q @ K^T) / sqrt(d_k)

  3. Q @ K^T 是一个 (seq_len, seq_len) 的矩阵,元素 (i,j) 表示第 i 个词对第 j 个词的原始关注度。这本质上是在做点积相似度
  4. 除以 √d_k 是为了防止点积随维度增大而过大,避免进入softmax饱和区。

  5. 转为概率分布:对Scores的最后一行(或每一行独立)做Softmax,得到注意力权重矩阵 Attn,形状 (seq_len, seq_len)。此时每一行的数之和为1,表示该词把注意力的百分之多少分给其他各词。

  6. 加权聚合Output = Attn @ V。每个词的输出向量,是所有词的值向量根据注意力权重加权求和。这意味着输出里聚合了全文上下文信息。

现实中我们用多头自注意力:把 d_model 拆成 h 个头,每个头独立做上面的运算(各自有独立的Q,K,V线性层),然后再把所有头的输出拼接起来做一次线性融合。这让模型能从多个表征子空间同时关注不同类型的关系(语法、指代、语义等)。

从底层看,自注意力就是一连串巨大的矩阵乘法和Softmax,它高度依赖第0层的张量加速单元。 但正是这块积木,为模型赋予了超长程上下文建模能力,成为Transformer乃至整个现代NLP的基石。


2.6 这些积木如何组合

到这里,我们有了这些标准件:
- 线性层:仿射变换,记忆与混合。
- 激活函数:非线性,赋予复杂表达能力。
- 归一化层:稳定训练,加速收敛。
- 卷积层:处理空间/局部结构。
- 自注意力层:建模任意距离的依赖关系。

我们还经常见到残差连接Output = Layer(Input) + Input。它把输入恒等映射加到层的输出上,让梯度可以沿“高速公路”直达最底层,解决深层网络退化问题。

这些积木本身,每一个内部都充满了可训练的 Wb(由第1层的算法不断修正),其运算都被分解为海量的张量乘加(由第0层的硬件执行)。通过精心设计它们的连接方式,并重复堆叠数十上百次,我们就得到了最终的模型架构。