Appearance
神经网络基础与经典架构
本页从离散输入、线性层和激活函数出发,逐步建立 MLP、CNN、RNN、LSTM 与 GRU 的结构和梯度直觉。
一、神经网络的基本组成
神经网络由线性变换、偏置和非线性激活函数逐层组成。设
其中
神经网络的输入和输出维度由任务决定,中间隐藏表示的宽度通常记为 hidden_dim。增大隐藏维度一般会增加模型的参数量、显存占用和计算量,但不保证泛化性能一定提升。
二、Embedding:从离散 token 到连续表示
文本或类别特征不能直接把 token 的编号当作有序的连续数值输入神经网络。通常先由 tokenizer 将文本切分为 token,再把每个 token 映射为整数 ID;Embedding 层根据 ID 从可学习的矩阵中查出对应的稠密向量。
设词表大小为
对于 token ID
这里的
2.1 Tokenizer 与子词分词
Tokenizer 在模型输入接口上的最终职责通常是把文本转换为整数 token ID 序列。这个过程可以拆成两步:先按照词、子词、字符或字节等规则切分出 token,再按照词表把每个 token 映射为整数 ID;Embedding 才负责把这些 ID 查表为连续向量。token 不一定对应完整单词,也可以是字符、字节或词的一部分。
在一个已经训练好的模型中,Tokenizer 的词表、切分规则和 token 到 ID 的映射通常在训练前确定,并在训练过程中保持固定;它们不是通过标准反向传播更新的连续参数。Embedding 则是神经网络中的可训练参数矩阵,梯度会更新与当前输入 token 对应的行。两者必须保持兼容:如果只替换 tokenizer,导致同一个 ID 对应了不同 token,原 Embedding 行的语义就会错位,通常需要同步调整词表相关参数并重新训练或转换模型。
完整词分词和字符分词各有明显缺点:
| 分词粒度 | 优点 | 代价 |
|---|---|---|
| 完整词 | 常见词通常只占一个 token,序列较短 | 词表很大,罕见词和新词容易变成未知词 |
| 单字符或单字节 | 几乎不会遇到未知词 | 序列很长,模型需要处理更多位置 |
| 子词(subword) | 在词表大小和序列长度之间折中,可复用词根、前缀和后缀 | 同一词的切分依赖词表和具体算法 |
子词算法从较小的字符或字节单元出发,学习常见的相邻片段并将其作为词表项。例如:
text
playing → play + ing
player → play + er
played → play + ed这样,词表不必为每个完整单词都保存独立条目,罕见词也有机会由已有子词组合表示。子词词表越大,通常序列越短但 Embedding 和输出层词表参数越多;词表越小,通常序列越长,后续 Transformer 的计算和位置数也会增加。
BPE:按相邻片段频率合并
BPE(Byte-Pair Encoding)训练时从字符、字节或其他初始符号开始,反复执行以下过程:
- 统计当前语料中相邻 token 对的出现次数;
- 选择频率最高的相邻 token 对;
- 将它们合并成一个新 token,并加入词表;
- 持续合并,直到达到目标词表大小或满足停止条件。
因此 BPE 的核心判据是当前语料中的共现频率。训练完成后,推理阶段使用学习到的合并规则及其优先级,把新文本切分成词表中已有的子词。现代实现中常见 byte-level BPE,因此“从字符开始”不是所有 BPE 变体的硬性要求。
BPE 合并过程示例
假设初始符号按字符拆分,语料中出现:
text
l o w
l o w
l o w e r
n e w如果 l 与 o 是当前频率最高的相邻对,就先合并为 lo;之后继续统计新的相邻对,例如 lo 与 w,再按照合并规则逐步形成更大的片段。最终得到的词表和合并顺序共同决定推理阶段的切分结果。
WordPiece:按语言模型目标选择片段
WordPiece 同样学习子词词表,但合并时不只是选择出现次数最多的相邻对,而是更关注某次合并对语料概率模型或似然目标的改善。一个常见的直觉式评分可以写成:
这个表达式用于说明:两个片段即使不是语料中绝对频率最高的 token,只要它们特别倾向于一起出现,合并后也可能更有价值。不同实现的具体训练目标和评分细节可能不同,但与 BPE 直接按频率合并的思想不同。
WordPiece 的常见推理策略是使用词表中的最长匹配片段进行切分,并用词内延续标记区分片段边界。BERT 使用的 WordPiece 词表通常用特殊前缀表示一个片段位于词内部。具体标记、预处理和未知词处理取决于 tokenizer 实现;子词算法能降低未知词概率,但不保证任何输入都不会产生未知 token。
BPE 与 WordPiece 的区别
| 维度 | BPE | WordPiece |
|---|---|---|
| 基本类型 | 子词分词 | 子词分词 |
| 训练起点 | 字符、字节或其他初始符号 | 较小的词片段或字符单元 |
| 合并依据 | 通常选择频率最高的相邻 token 对 | 通常选择能带来更好概率/似然目标的合并 |
| 推理特点 | 按已学习的合并顺序和优先级切分 | 常见实现使用最长匹配策略 |
| 代表性应用 | GPT 早期及许多 byte-level tokenizer 变体 | BERT 系列 |
| 共同效果 | 高频片段可合并为较大 token,罕见词可拆成多个已有子词 | 高频片段可合并为较大 token,罕见词可拆成多个已有子词 |
即使使用完全相同的语料和目标词表大小,两种算法也不保证学出相同的词表,因为初始化符号、合并准则、边界标记和推理规则可能不同。
子词分词速记
BPE 主要按相邻片段频率合并;WordPiece 更关注合并对概率/似然目标的改善。二者都在完整词和字符之间折中,先产生 token ID,再由 Embedding 将 ID 映射为连续向量。
领域结构化文本的分词
网络配置、命令行、日志和故障案例通常同时包含自然语言与大量结构化字段,例如命令关键字、IP 地址、MAC 地址、端口号、VLAN ID、OID、接口名、错误码和版本号。通用文本 tokenizer 可能把这些字段切得过碎,使模型需要额外学习原本可以由格式直接表达的结构。
例如下面的内容同时包含命令层级、接口路径和网络前缀:
text
display interface GigabitEthernet0/0/1
ip route 192.168.1.0/24 10.0.0.1
mac-address 00:1A:2B:3C:4D:5E句点(.)、斜线(/)、冒号(:)、连字符以及大小写在不同字段中可能具有结构意义。将它们全部删除,或不加区分地把字符串拆成单字符,可能破坏地址层级、掩码、接口路径和标识符格式。因此领域 tokenizer 或预处理器通常需要:
- 为命令关键字、常见协议术语、错误码和接口类型提供领域词表或受保护 token;
- 识别 IP、MAC、端口、VLAN、OID 等字段的模式,在必要时将完整字段或结构化片段作为一个 span 处理;
- 只进行不会改变语义的大小写、空白和别名归一化,并保留有结构作用的标点;
- 对日志条目、命令块、告警事件和故障堆栈按语义边界切分,而不是从任意字符位置截断。
专用词表也不能简单等同于“把每个具体 IP 地址都加入词表”。IP、端口和 OID 等字段的取值空间很大且经常出现新值;将每个值都作为独立词表项会造成词表膨胀,并不能很好地处理未见过的地址。更常见的做法是固定高频命令和字段类型,对可变值使用模式化、分段化或受保护 span 表示。
分词只是输入表示的一部分。对于通信领域的检索或故障分析,还可以在领域语料上继续预训练或微调编码器,使 Embedding 更熟悉命令、告警和故障表述;检索侧则可以结合精确匹配与语义匹配:
| 检索信号 | 更擅长处理的内容 | 常见方法 |
|---|---|---|
| 词项和字段精确匹配 | 命令名、错误码、接口名、IP 或版本号 | BM25、倒排索引、字段过滤 |
| 语义相似性 | 不同措辞描述的相似故障、原因和解决方案 | 领域 Embedding、向量检索、重排序 |
| 混合信号 | 既要求关键字段一致,又要找到语义相近案例 | BM25 与向量检索融合,再进行重排序 |
因此,领域文本处理的目标不是单纯压缩字符串,而是在控制序列长度的同时保留字段结构,并让表示模型学习通信领域中的语义关系。
领域文本分词速记
结构化领域文本应保留命令、地址和标识符的格式信息,结合领域 tokenizer 与领域表示学习;日志和命令优先按语义单元切分,检索时可融合精确匹配与 Embedding 相似度。
2.2 查表、张量形状与参数量
Embedding 的输入通常是整数 token ID,而不是已经计算好的词向量,也不要求显式构造 one-hot 向量。常见输入输出形状如下:
| 输入 | 输出 | 含义 |
|---|---|---|
| 单个 ID,形状为 | 查出一个 token 的表示 | |
| 单条 ID 序列,形状为 | 长度为 | |
| 一个 batch,形状为 |
如果只考虑 Embedding 矩阵本身,参数量为:
Embedding 通常是查表层,不包含像全连接层那样的 bias;如果使用额外的投影层或其他参数,应单独计算。词表大小和向量维度决定参数量,序列长度不会增加这张查表矩阵的参数量,但会影响一次前向计算产生的激活数量和显存占用。
Embedding 参数量与输出形状示例
若词表大小为
一条长度为
从数学上看,查表等价于 one-hot 向量与 Embedding 矩阵相乘。若
但实际实现一般直接读取
Embedding 矩阵通常与模型一起通过梯度下降学习。对一次输入中出现的 token,反向传播会把对应输出向量的梯度累积到相应的矩阵行;离散 ID 本身不是连续可微参数,不会像普通权重那样被梯度改成另一个整数。重复出现的 token 会共享同一行参数,并累积来自各个位置的梯度。
Embedding 的表示边界
Token embedding 解决的是“离散 ID 如何表示为连续向量”,本身不是概率分布,也不自动表示 token 的顺序或当前句子的上下文。相同 token ID 在不同句子、不同位置查表时,得到的初始向量仍然相同;它与其他 token 的关系需要经过 Transformer 的 Self-Attention 等上下文层建模。序列模型通常还需要加入位置编码或位置 embedding,例如将 token 表示与对应位置表示相加。
Embedding 速记
Tokenizer 将文本变成整数 token ID 序列,Embedding 再将 ID 查表为稠密向量,Transformer Attention 最后根据上下文交互更新 token 表示;Embedding 参数量是词表大小乘 Embedding 维度,序列长度只决定一次输入的输出形状。
三、MLP 与隐藏层激活函数
MLP(Multi-Layer Perceptron,多层感知机)通常由多个全连接层和隐藏层激活函数组成。例如,两层 MLP 可以抽象为:
隐藏层激活函数的核心作用是引入非线性,使 MLP 能够拟合复杂模式。若连续堆叠的层之间没有非线性激活,多个线性变换仍可合并为一个线性变换:
因此,仅增加没有激活函数的线性层,并不会带来同等意义上的非线性表达能力。激活函数的主要职责不是把输出变成概率、替代损失函数或完成归一化;这些工作分别由输出层、损失函数和归一化模块负责。
常见激活函数的基础公式、输出范围,以及 Sigmoid、Tanh、Softmax 在不同任务中的位置,已在机器学习基础的分类输出函数中整理。下面重点补充深度学习中常见的隐藏层激活函数和门控结构。
3.1 ReLU:分段线性与零点不可导
ReLU(Rectified Linear Unit)定义为:
在
ReLU 的优点是计算简单、正区间梯度稳定,缺点是负区间梯度为
它可以降低神经元永久失活的风险;PReLU 则进一步把
Dead ReLU:形成条件与恢复边界
设某个 ReLU 神经元的线性输入为:
如果一个 mini-batch 中的样本都满足
令上游梯度为
于是该样本对这个神经元的入边参数不产生梯度:
如果只有部分样本处于负区间,那么只会丢失这些样本在该神经元上的梯度;只有当神经元对绝大多数或全部训练样本都落在负区间时,才容易形成持续性的 Dead ReLU。
较大的学习率可能让一次参数更新跨过较大的区域,把神经元推到对多数样本都满足
Leaky ReLU 在负区间的导数为
3.2 GELU:连续的软门控
GELU(Gaussian Error Linear Unit)使用标准正态分布的累积分布函数
常用的近似形式为:
这里的
GELU 的导数可以写成:
其中
3.3 ReLU 与 GELU 的梯度传播对比
设激活层为
对 ReLU 而言,正区间的局部梯度乘数为
这意味着在零点附近,GELU 会把上游梯度乘以约
其中
零点附近的局部梯度示例
假设上游梯度为
ReLU 在
激活函数与梯度范数
不能仅凭“GELU 的梯度更平滑”就断言替换 ReLU 后梯度范数一定显著减小。梯度大小还取决于输入分布、权重初始化、网络深度、LayerNorm、残差连接和损失函数;GELU 的导数在部分输入区域甚至大于
3.4 SiLU、GLU 与 SwiGLU
SiLU(也常称 Swish)是另一种平滑自门控函数:
其中
其中
随后再通过输出投影映射回模型隐藏维度:
因此,SwiGLU 不是把一个标量激活函数逐元素应用一次,而是由两条线性投影分支、一个 SiLU 门控和一个输出投影共同构成的前馈结构。它通常比单个 GELU 前馈层包含更多投影参数,实际设计会调整中间维度,使总参数量和计算量处于可接受范围。GeGLU 等变体则使用 GELU 等其他函数替换门控分支中的 SiLU。
SwiGLU 常见于现代 Transformer 的 FFN,但这不意味着它在所有模型中都必然取代 GELU。激活函数或门控结构的选择还要结合模型架构、参数预算、吞吐量和验证集效果判断。
3.5 常见激活函数的对比
| 函数或结构 | 核心机制 | 梯度与数值特点 | 常见位置 |
|---|---|---|---|
| ReLU | 负值截断,正值线性通过 | 计算便宜;负区间梯度为 | MLP、CNN 隐藏层 |
| Leaky ReLU | 负区间保留小斜率 | 降低死亡 ReLU 风险,但引入超参数 | 对 ReLU 的改进版本 |
| GELU | 使用 | 平滑;梯度峰值约为 | Transformer、部分 MLP |
| SiLU / Swish | 输入与 Sigmoid 门控相乘 | 平滑、自门控;常作为门控分支激活 | 深度网络、Transformer 变体 |
| SwiGLU | SiLU 门控分支与线性分支逐元素相乘 | 表达能力强,但需要额外投影和计算 | Transformer FFN |
3.6 饱和激活、阶跃函数与梯度可用性
Sigmoid 和 Tanh 的任务位置与基本性质可参见机器学习基础的分类输出函数。从反向传播角度看,它们的共同问题是:输入绝对值较大时,函数进入饱和区,局部导数接近
Sigmoid 的导数为:
当
因为
这说明 Sigmoid 在输入为
Tanh 的导数为:
Tanh 的严格输出范围是
阶跃函数可以抽象为:
它在阈值处不连续,阈值点没有普通导数;在其他位置导数几乎处处为
ReLU 在正区间的导数为常数
| 函数 | 局部梯度特征 | 反向传播中的主要问题 |
|---|---|---|
| Sigmoid | 容易饱和并导致梯度消失 | |
| Tanh | 输出范围为 | 大绝对值输入下容易梯度消失 |
| 阶跃函数 | 几乎处处导数为 | 无法直接提供有效的梯度下降信号 |
| ReLU | 正区间为 | 激活单元不饱和,但可能出现死亡 ReLU |
激活函数梯度速记
Sigmoid/Tanh 的饱和区会让导数接近
选择激活函数时,先区分它承担的角色:隐藏层激活主要提供非线性,输出层的 Sigmoid 或 Softmax 则由标签形式决定;损失函数仍然负责定义训练目标。平滑激活或门控结构可能改善优化和表达能力,但也会增加计算、参数或实现复杂度,应结合验证集指标和资源约束评估。
MLP 与激活函数速记
线性层负责变换表示,激活函数负责引入非线性;没有隐藏层非线性时,深层线性网络仍然只是一个线性模型。
四、卷积神经网络基础
卷积神经网络(CNN)利用局部连接和参数共享提取空间结构特征。与全连接层相比,一个卷积核只连接局部区域,并在不同空间位置复用同一组权重,因此参数量通常与特征图的空间尺寸无关。
4.1 卷积输出尺寸与参数量
对于输入空间尺寸为
当输入为正方形(
普通卷积的每个卷积核都会跨越全部输入通道。输入为
卷积输出尺寸示例
输入为
宽度同理,因此输出形状为
如果使用 bias,普通卷积的可训练参数量为:
其中最后一项是每个输出通道对应的一个偏置;如果关闭 bias,则去掉该项。输入的
卷积参数量示例
卷积核为
stride、padding 和输入特征图的空间尺寸只影响输出形状,不影响这个参数量。
4.2 卷积、步幅卷积与池化
当 stride 为
在每一个空间位置,它等价于对通道向量做一次线性变换:
因此,
stride 大于
Max Pooling 则在局部窗口中保留最大响应:
它没有可训练参数,通常只沿空间维度操作,不负责通道混合。池化可以降低空间尺寸和后续计算量,并对窗口内的小幅平移提供一定鲁棒性;但它会丢失精确位置信息,也不是严格的去噪算法。如果噪声在窗口中形成异常大的响应,Max Pooling 反而可能把噪声保留下来。
| 操作 | 参数是否可学习 | 主要作用 | 典型代价或边界 |
|---|---|---|---|
| stride 卷积 | 是 | 特征提取并学习下采样方式 | 有卷积参数和计算量 |
| Max Pooling | 否 | 保留局部强响应并降低空间尺寸 | 丢失精确位置,不能保证去噪 |
| 是 | 通道融合、降维或升维 | stride 为 |
4.3 感受野与小卷积核堆叠
感受野是某个特征位置在输入上能够看到的区域。对连续卷积层,可以用感受野大小
在 stride 和 dilation 都为
三个连续的
小卷积核堆叠并不意味着实际效果一定优于大卷积核,还需要考虑网络深度、内存访问、优化难度和任务数据;“感受野相同”也不等于模型学到的特征完全相同。
4.4 深度可分离卷积
深度可分离卷积(Depthwise Separable Convolution)把普通卷积拆成两个阶段:
- Depthwise Conv:每个输入通道单独使用空间卷积核,不在通道之间混合信息;
- Pointwise Conv:使用
卷积融合通道,并生成所需的输出通道。
在 depthwise multiplier 为
普通卷积的对应参数量是
深度可分离卷积的参数量示例
设
Depthwise 和 Pointwise 分别需要:
合计为
4.5 空洞卷积
空洞卷积(Dilated Convolution)在卷积核采样点之间插入间隔,用更大的覆盖范围获得更大的感受野。有效卷积核尺寸为:
例如
空洞卷积常在
CNN 速记
卷积参数量由卷积核尺寸和通道数决定,不由特征图的高宽决定;
五、循环神经网络:RNN、LSTM 与 GRU
循环神经网络(RNN)通过在时间步之间传递隐藏状态,将序列的历史信息带入当前计算。它适合处理时间序列、文本、语音等具有顺序关系的数据;与只根据当前输入独立计算的前馈网络相比,RNN 的关键是跨时间步复用同一组参数。
5.1 RNN 的递归计算与时间反向传播
最基本的 RNN 可以写成:
其中
训练 RNN 通常需要沿时间展开计算图并执行 BPTT(Backpropagation Through Time)。以只在最后时刻产生损失的情形为例,跨越较长序列时,梯度会连续乘上循环层的局部 Jacobian:
如果这些矩阵乘积的范数持续小于
5.2 LSTM:用门控维护细胞状态
LSTM 在隐藏状态
其中方括号表示向量拼接,则三个门和候选记忆可以写成:
细胞状态和隐藏状态的更新为:
其中
遗忘门主要筛选上一时刻的细胞状态
| 组件 | 作用 |
|---|---|
| 遗忘门 | 决定旧细胞状态 |
| 输入门 | 决定候选记忆 |
| 候选记忆 | 根据当前输入和历史隐藏状态生成待写入内容 |
| 输出门 | 决定细胞状态中有多少暴露为当前隐藏状态 |
5.3 GRU:更简化的门控循环单元
GRU 将细胞状态和隐藏状态合并为一个状态
这里
GRU 没有独立的细胞状态和输出门,结构比 LSTM 简单,通常参数更少、计算成本更低、训练速度更快;代价是状态控制更耦合,在某些需要精细区分长期记忆和短期输出的任务中,表达取舍可能不同。
在输入维度为
| 模型 | 状态结构 | 主要特点 | 常见取舍 |
|---|---|---|---|
| RNN | 一个隐藏状态 | 结构简单、计算便宜 | 长期依赖下容易梯度消失或爆炸 |
| LSTM | 隐藏状态 | 对长期记忆控制更细致 | 参数和计算开销较大 |
| GRU | 一个隐藏状态,更新门和重置门 | 简化门控,参数和计算通常少于 LSTM | 记忆与输出控制没有 LSTM 分离得细 |
传统序列建模中,短序列可以使用普通 RNN,存在长期依赖时通常优先考虑 LSTM 或 GRU;现代长文本生成和长上下文建模则更多使用 Transformer。模型选择仍需结合序列长度、数据规模、延迟和验证集效果,而不能只按“结构越复杂越好”判断。
RNN、LSTM、GRU 速记
RNN 把