本节摘要:SOURCE 4.2 介绍 RNN/LSTM、TextCNN 与 Transformer 微调。本节按演化顺序说明各架构捕捉的模式,并给出选型建议。
| 架构 | 捕捉模式 | 典型时代 |
|---|---|---|
| TextCNN | 局部 n-gram | 2015–2017 |
| LSTM/GRU | 序列依赖 | 2015–2018 |
| Transformer | 全局自注意力 | 2018+ |
# 概念:多尺寸卷积核 = 多尺度 n-gram # conv1d(kernel=3) → bigram 模式 # conv1d(kernel=5) → 4-gram 模式 # max-over-time pooling → 固定长向量
SOURCE 4.2:Kim 2014 TextCNN 在多个基准上超越传统方法,是嵌入时代的代表。
预训练 BERT + 任务头在大数据上 SOTA;小数据可尝试 冻结底层只训分类头 或 DistilBERT 蒸馏模型。

⚠️ 常见坑:LSTM batch 训练未 pad/pack——变长序列效率极差。
💡 关键直觉:CNN 看局部,LSTM 看顺序,Transformer 看全局——演化是能力递增。
TextCNN 的直觉是「卷积核等于局部 n-gram 检测器」:kernel 大小 3 的卷积等价于检测 trigram 模式,大小 5 则对应 5-gram。多组不同尺寸的卷积核并行,相当于同时抓多种局部模式;max-over-time pooling 从每个特征图上取最大值,把变长输入压成固定长度向量。TextCNN 参数少、训练快,在嵌入时代是性价比之王,但它是「局部窗口」模型,抓不到长距离依赖——这正是 LSTM 存在的意义。
LSTM 用门控机制(输入门、遗忘门、输出门)沿序列逐步编码,能建模长距离依赖,但训练比 CNN 慢,且序列很长时首尾信息仍会稀释。工程上 LSTM 常用双向变体,把正反两个方向的隐状态拼接,捕捉「后面的词对当前词的影响」。处理变长序列时要打包或按桶排序加 pad,避免把大量填充 token 也送进计算,既浪费算力又引入噪声。
Transformer 用自注意力让任意两个位置直接交互,全局建模能力最强,但需要更多数据与算力。BERT 微调是当前高精度的默认路线;对短文本、类别明确的场景,TextCNN 往往能以十分之一的开销达到接近的水平。架构选型不应只看基准分数,还要看推理预算与标注量。
一个容易被低估的点是 embedding 初始化:TextCNN/LSTM 用随机初始化的嵌入层,在数据量不足时学不出语义;用预训练词向量初始化嵌入层,能显著加速收敛并提升效果。但注意预训练词向量的词表与分词粒度要匹配——你用的是 jieba 分词,预训练向量也应该是按同样粒度训练的,否则查不到表。嵌入层冻结与否取决于数据量:数据多可微调,数据少应冻结,防止梯度冲坏先验。
训练深度模型的实践清单:固定随机种子保证可复现;记录每次实验的架构、超参与验证分数,形成实验台账;用早停控制训练轮数;对类别不均衡加类别权重;对过拟合先降容量或加 Dropout,而不是盲目加数据。这些内容在第 4.3 节展开,但它们与架构选择是同时发生的,别把「选模型」和「训模型」拆成两个孤立的环节。
# 概念:TextCNN 的卷积核与池化 # conv1d(kernel=3, filters=128) → trigram 特征 # conv1d(kernel=5, filters=128) → 5-gram 特征 # max-over-time pooling → 每特征图取最大值 # concat + dense + softmax → 类别概率
| 架构 | 捕捉模式 | 训练成本 | 适用 |
|---|---|---|---|
| TextCNN | 局部 n-gram | 低 | 短文本 |
| BiLSTM | 长距离依赖 | 中 | 序列建模 |
| Transformer | 全局交互 | 高 | 大数据 |
复现性是深度实验的基本要求,按下面清单逐项核对。
| 项 | 做法 |
|---|---|
| 随机种子 | 固定框架与库的种子 |
| 数据顺序 | 固定 shuffle 种子 |
| 框架版本 | 记录精确版本号 |
| 超参记录 | 写入实验日志 |
很多人「昨天跑出高分,今天却低一截」,原因往往是随机种子或数据打乱顺序变了。把复现清单固化成脚本模板,每次新建实验自动生成含版本号的配置,可大幅减少无效返工。第 4.3 节的训练策略与此处配合使用:先保证可复现,再谈调优。
深度模型训练失败往往有固定的模式,对照排查能省很多时间。loss 不下降:先查学习率是否过高或过低,再查数据预处理是否有大量空样本;loss 震荡:减小 batch 或降低学习率;验证分数远低于训练:典型过拟合,加 Dropout、降容量或加正则;训练集分数就不高:特征或模型容量不足,回到表示层面。记录下每次失败的上下文,比记住结论更可靠——因为同样一句话背后的配置可能完全不同。