李宏毅深度学习笔记2-从线性模型到时序神经网络
·
📘 机器学习基础:从线性模型到时序神经网络
—— 学习笔记(含时序建模进阶方向思考)
一、问题背景:预测每日视频观看人次
- 任务:根据历史观看数据,预测未来某日的观看人次。
- 已知数据:2017–2020 年每天的真实观看次数(训练集);
- 测试目标:2021 年 1 月 1 日至 2 月 14 日的观看人次(验证集);
- 评估指标:平均绝对误差(MAE),单位:千人。
💡 关键挑战:数据呈现强周期性(每周五、六显著下降),且存在特殊事件(如除夕)导致异常低谷。
二、从简单线性模型起步
1. 单变量线性模型
- 形式: [ y = b + w x_1 ] 其中 (x_1) 是前一天观看人次。
- 训练损失:480(千人);
- 测试误差:580(千人);
- 行为分析:预测曲线 ≈ 真实曲线右移一天 → 模型仅“复制”前一天值((w \approx 0.97, b \approx 100))。
2. 多变量线性模型(引入历史窗口)
- 7天模型: [ y = b + \sum_{j=1}^{7} w_j x_j ]
- 训练损失 ↓ 至 380;
- 测试误差 ↓ 至 490;
- 权重显示:某些天数(如前2、4、5天)与未来呈负相关。
- 扩展至28天、56天:
- 训练损失持续下降(330 → 320);
- 但测试误差稳定在 460 → 信息增益饱和。
✅ 结论:线性模型能利用多天信息,但受限于线性假设,无法捕捉非线性动态或复杂周期模式。
三、突破线性限制:引入非线性激活函数
1. 线性模型的瓶颈(模型偏差)
- 假设 (x) 与 (y) 呈单调关系;
- 无法表达:阈值效应、饱和效应、周期突变等。
2. 分段线性逼近思想
- 任意连续函数可由分段线性曲线逼近;
- 分段线性曲线可由多个 Hard Sigmoid 函数叠加而成。
3. 实用激活函数替代方案
| 激活函数 | 表达式 | 特点 |
|---|---|---|
| Sigmoid | (\sigma(z) = \frac{1}{1 + e^{-z}}) | 平滑、有界,但易梯度消失 |
| ReLU | (\text{ReLU}(z) = \max(0, z)) | 计算高效、缓解梯度消失,实验表现更优 |
🔬 实验发现:使用 100个 ReLU 的模型,训练损失降至 280,测试误差也略有改善。
四、构建神经网络:从单层到多层
1. 单隐藏层模型(浅层网络)
- 输入:前56天观看数据 (\mathbf{x} \in \mathbb{R}^{56});
- 隐藏层(100个 ReLU): [ \mathbf{a} = \text{ReLU}(\mathbf{W} \mathbf{x} + \mathbf{b}) ]
- 输出: [ y = c_0 + \mathbf{c}^T \mathbf{a} ]
2. 多层堆叠(深度网络)
- 将 ReLU 层重复多次(如3层、4层): [ \mathbf{a}^{(1)} = \text{ReLU}(\mathbf{W}^{(1)} \mathbf{x} + \mathbf{b}^{(1)}) \ \mathbf{a}^{(2)} = \text{ReLU}(\mathbf{W}^{(2)} \mathbf{a}^{(1)} + \mathbf{b}^{(2)}) \ y = \mathbf{c}^T \mathbf{a}^{(L)} ]
- 效果:
- 3层:训练损失 140,测试损失 380;
- 4层:训练损失 100,测试损失 440 ↑。
3. 过拟合(Overfitting)现象
- 模型在训练集上表现越来越好,但在未见数据上性能下降;
- 根本原因:模型复杂度 > 数据信息量,记住了噪声而非规律。
✅ 应对策略:选择验证集表现最优的模型(如3层),而非训练损失最低者。
五、优化与训练机制
1. 参数统一表示
- 所有可学习参数(权重、偏置)拼接为向量 (\theta);
- 损失函数写作 (L(\theta))。
2. 梯度下降(Gradient Descent)
- 更新规则: [ \theta \leftarrow \theta - \eta \nabla_\theta L(\theta) ]
- 当参数量大时,穷举不可行,必须依赖梯度优化。
3. 批量训练(Mini-batch Training)
- 将数据分为 batch(如每批10条);
- 每处理一个 batch 更新一次参数;
- 1 epoch = 遍历全部数据一次;
- 优点:降低计算开销,引入噪声提升泛化。
六、核心方法论:机器学习三步法
- 定义模型:设计含参数 (\theta) 的函数 (f_\theta(x));
- 定义损失:衡量预测与真实值的差距,如 MAE、MSE;
- 优化参数:通过梯度下降求解 (\theta^* = \arg\min_\theta L(\theta));
- 部署预测:将 (\theta^*) 应用于测试输入,输出预测结果。
🎯 成功关键:模型灵活性 + 数据理解 + 泛化控制。
七、延伸思考:面向时间序列建模的进阶方向 🌟
当前模型虽有效,但对时间本质结构的建模仍显粗糙。以下是值得深入探索的时序建模范式:
1. 显式建模周期性与季节性
- 问题:7天周期被隐式学习,效率低且不稳定。
- 解决方案:
- 使用 傅里叶级数 或 正余弦时间编码(如 Prophet、Transformer 中的位置编码);
- 添加“星期几”作为分类特征,或使用循环嵌入(cyclic embedding)。
2. 融合外部变量(Exogenous Regressors)
- 问题:无法解释“除夕观看骤降”等事件。
- 解决方案:
- 引入日历特征(是否周末、节假日、季节);
- 构建多变量时间序列模型(如 TFT、N-HiTS、DeepAR);
- 示例:添加
is_chinese_new_year二元特征,显著提升对异常点的预测能力。
3. 长期依赖建模
- 问题:56天窗口可能不足以捕捉年度趋势或缓慢漂移。
- 解决方案:
- RNN/LSTM/GRU:天然支持变长序列,记忆长期状态;
- TCN(Temporal Convolutional Network):并行高效,感受野随层数指数增长;
- Transformer:通过自注意力机制建模任意距离依赖(需位置编码)。
4. 概率预测与不确定性量化
- 问题:点预测无法反映风险(如“可能在 5000±1000 之间”)。
- 解决方案:
- 分位数回归:预测多个分位点(如 10%、50%、90%);
- 概率模型:DeepAR 输出高斯分布参数;
- 集成方法:Dropout 作为贝叶斯近似,估计预测方差。
5. 自监督预训练与时序表征学习
- 问题:标注数据有限,模型泛化弱。
- 解决方案:
- 在大量无标签时序数据上预训练(如掩码重建、对比学习);
- 使用 TS2Vec、TimesNet、PatchTST 等方法学习通用时间模式;
- 下游任务只需微调少量参数。
💡 时序建模黄金法则:
好的时序模型 = 对时间结构的理解 × 灵活的函数逼近 × 对不确定性的尊重
八、总结
| 模型类型 | 训练损失 | 测试误差 | 优势 | 缺陷 |
|---|---|---|---|---|
| 线性(1天) | 480 | 580 | 简单、可解释 | 无法捕捉周期 |
| 线性(56天) | 320 | 460 | 利用更多信息 | 仍为线性 |
| 100-ReLU(单层) | 280 | ~440 | 非线性拟合 | 表达能力有限 |
| 3层 ReLU | 140 | 380 | 深度提取特征 | 需防过拟合 |
| 4层 ReLU | 100 | 440 | 更强拟合 | 过拟合 |
✅ 最终建议:在实际部署中,应选择验证集误差最小的模型(如3层网络),并考虑引入日历特征和概率输出以提升实用性。
更多推荐
所有评论(0)