Week8:门控循环网络、集成学习与半监督学习
摘要本周继续跟进李宏毅机器学习课程内容顺着时序网络、多模型融合再到小样本数据处理的脉络依次学习。在之前掌握的循环神经网络基础上拓展了双向结构与多层堆叠的搭建方式学习长序列信息提取与全局上下文信息利用的相关方法同时了解了梯度爆炸问题的约束解决手段接着学习集成学习相关内容理解通过多个基础模型组合来优化模型泛化效果的核心思路熟悉并行抽样训练与串行迭代修正两类主流集成方案以及工业里常用的随机森林、梯度提升类算法最后针对实际场景里标注数据难获取、样本数量有限的问题学习半监督学习的各类实现思路学会借助海量未标注数据来辅助模型训练丰富在数据资源受限情况下的建模手段。一、门控循环网络与序列模型拓展1.1 双向循环神经网络 Bi-RNN单向 RNN 仅能利用上文历史信息无法获取后文上下文内容双向 RNN 搭建两条独立反向传播的循环链一条从前往后正向遍历序列一条从后往前反向遍历序列最终拼接两个方向的隐藏层输出。适用场景文本分词、词性标注、语音识别等需要全局上下文的任务能同时融合前后文语义显著提升序列标注精度。1.2 多层堆叠循环网络将多层 RNN/LSTM/GRU 上下堆叠上一层 RNN 的输出作为下一层 RNN 的输入。浅层循环层提取基础时序特征深层循环层组合抽象长距离依赖特征堆叠层数不宜过多否则极易出现梯度消失一般堆叠 2~4 层即可。1.3 循环网络梯度裁剪实操方案RNN 时序反向传播 BPTT 极易出现梯度爆炸课程给出硬性梯度裁剪方法设定梯度最大阈值若梯度范数超过该数值按比例缩放梯度至阈值范围从数值层面直接约束梯度大小避免参数更新剧烈震荡。1.4 补充 RNN 常见应用任务序列生成机器翻译、文本续写、语音合成序列分类文本情感分析、故障时序信号判别序列标注命名实体识别、句子分词。二、集成学习 Ensemble2.1 集成学习核心逻辑不依赖单个强模型训练多个差异化弱学习器通过投票、加权组合方式融合所有模型预测结果。核心前提个体模型具备一定准确率且模型之间存在差异性二者缺一不可融合后整体效果优于任意单个模型。2.2 Bagging 自助聚合采样规则对原始数据集进行有放回随机抽样生成多份独立子数据集训练流程每份子集单独训练一个同类型模型预测方式分类任务采用多数投票回归任务取所有模型输出平均值典型代表随机森林 Random Forest。2.3 随机森林 Random Forest在 Bagging 基础上额外增加特征随机选取每棵决策树分裂节点时仅随机挑选部分特征用于划分。双重随机数据随机 特征随机极大降低树与树之间的关联性有效抑制单棵决策树过拟合并行训练速度快是工业界常用基线模型。2.4 Boosting 递进提升框架串行依次训练模型每一轮重点修正前一轮模型预测错误的样本AdaBoost对错分样本提升样本权重下一个学习器更关注难例样本最终按各模型准确率分配加权投票权重Gradient Boosting后续模型直接拟合前序整体模型的残差损失不断逼近真实标签代表算法XGBoost、LightGBM。2.5 集成学习适用边界优点抗过拟合能力强、泛化性能稳定、可适配分类 / 回归多类任务缺点模型体量变大、推理速度变慢训练与部署资源开销高于单一网络。三、Lecture14 半监督学习 Semi-supervised Learning3.1 适用场景人工标注数据成本高、带标签样本极少但存在海量无标注原始数据半监督学习利用无标注数据的数据分布信息辅助监督训练。3.2 自训练 Self-Training最简半监督方案先用少量标注数据训练初始模型用该模型预测无标注样本筛选置信度最高的样本赋予伪标签将带伪标签数据并入训练集迭代重训模型循环迭代扩充标注集。风险伪标签一旦存在大量错误会持续累积噪声污染后续训练。3.3 协同训练 Co-Training搭建两个特征视角完全独立的模型分别对无标注数据做预测互相挑选高置信样本补充给对方训练集利用两类特征空间的差异性降低伪标签出错概率。3.4 聚类假设核心思路同类样本在特征空间中会聚集在同一簇先对全部数据标注 无标注做聚类同一簇内若存在标注样本则把簇内其余无标注样本标注为同类标签依托数据分布划分类别。3.5 生成式半监督方法假设全部数据服从某一生成分布把无标注样本的隐标签当作待估计隐变量使用 EM 算法迭代估计分布参数与隐标签最大化整体数据对数似然。3.6 流形假设高维数据实际分布在低维流形曲面上流形上距离近的样本属于同一类别约束模型决策边界尽量避开数据稠密区域贴合流形结构划分分类面。本周拓展思考RNN 系列结构本质是通过权重共享建模时序维度依赖CNN 则针对空间维度权重共享二者可结合构成 CNNRNN 混合模型处理视频等时空数据集成学习并非一定优于单模型若基学习器本身偏差过大或模型高度同质化集成后效果不会提升甚至下降半监督学习高度依赖数据分布一致性当无标注数据与标注数据分布偏移严重时引入无标注数据会损害模型精度。总结本周完成时序网络拓展、集成学习、半监督学习三块内容。先在基础 RNN 框架上拓展双向、堆叠结构与梯度优化手段完善序列建模全套方案接着学习集成学习多种主流范式理解多模型融合的优化逻辑与工业常用树类集成算法最后针对标注稀缺场景学习半监督各类经典算法学会在少量标签条件下挖掘无标注数据价值补全机器学习从监督、无监督到半监督、多模型融合的知识体系。Python复现代码1. BiLSTM 双向循环网络 时序分类复现代码import osos.environ[TF_ENABLE_ONEDNN_OPTS] 0os.environ[TF_CPP_MIN_LOG_LEVEL] 2import numpy as npimport tensorflow as tffrom tensorflow.keras.layers import Input, LSTM, Bidirectional, Densefrom tensorflow.keras.models import Modelimport matplotlib.pyplot as pltplt.rcParams[font.family] [SimHei, WenQuanYi Micro Hei, Heiti TC]plt.rcParams[axes.unicode_minus] Falsetime_step 10def create_data():seq np.sin(np.linspace(0, 15*np.pi, 1500))x, y [], []for i in range(len(seq)-time_step):x.append(seq[i:itime_step])y.append(seq[itime_step])x np.array(x).reshape(-1, time_step, 1)y np.array(y)return x, yx_train, y_train create_data()inp Input(shape(time_step, 1))bi_lstm Bidirectional(LSTM(32))(inp)out Dense(1)(bi_lstm)model Model(inp, out)model.compile(optimizeradam, lossmse)history model.fit(x_train, y_train, epochs15, batch_size32, validation_split0.1)pred model.predict(x_train[:100], verbose0)plt.figure(figsize(10,4))plt.plot(y_train[:100], label真实序列)plt.plot(pred.flatten(), labelBiLSTM预测序列)plt.title(双向LSTM时序拟合效果)plt.legend()plt.grid(alpha0.3)plt.show()2. 随机森林Bagging 集成分类复现代码from sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scoreimport matplotlib.pyplot as pltplt.rcParams[font.family] [SimHei, WenQuanYi Micro Hei, Heiti TC]plt.rcParams[axes.unicode_minus] Falsedata load_iris()X, y data.data, data.targetX_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state6)rf RandomForestClassifier(n_estimators12, random_state6)rf.fit(X_train, y_train)y_pred rf.predict(X_test)acc accuracy_score(y_test, y_pred)print(f随机森林测试集准确率{acc:.4f})feature_import rf.feature_importances_plt.bar(range(len(feature_import)), feature_import)plt.title(随机森林特征重要性)plt.xticks(range(len(feature_import)), data.feature_names, rotation15)plt.show()
