Google ML
Machine Learning Crash Course
Rules of Machine Learning
Machine Learning Practica
People + AI Guidebook
Google AI Education
入门介绍
问题定义
- 分类:监督学习、无监督学习,强化学习
- 区别:通常软件工程可从需求出发分析设计,而ML需要实践确定设计(超参数) 黑盒子
- 流程:提出问题→做出假设→收集数据→构建模型→分析结果→改进假设(循环反馈)
- 从问题出发,并围绕问题分析,数据中的模式可能改变,但要解决的问题不变
- 以问题为中心,有时经验规律或简单统计分析就很有效,不要拿着锤子找钉子
- 足够的数据,良好的线性模型样本量在千的量级,神经网络则在十万百万量级
- 黑盒子的机器学习更适于直接辅助决策/执行行动,认识规律还需要统计分析
- 问题定义:fail fast, iterate fast 快速失败、反馈迭代
- 明确问题及预期结果,并围绕预期建立成败的量化指标 (独立于模型)
- 围绕预期确定模型输出以及模型在整体系统中的应用位置
- 基于应用位置确定可获取的数据、访问延迟及响应延迟要求
- 设计有效优化目标,比如单以点击率为目标会强化标题党
- 当指标成为目标就不再是好指标,优化目标与评价指标隔离
- 从简单的模型入手,建立并验证整个Pipeline后,再迭代优化
上手尝试
- 泛化的基本假设:样本独立同分布(i.i.d)、分布是平稳的、样本分布与目标分布相同
- 验证集:数量足够(能做出有统计意义的评价)、分布相同(与目标环境样本分布一致)
- 模型训练时(model.fit)可以指定
validation_split
,自动从训练集中划分验证集
数据可能存在某种排序,而为了保证数据划分同分布,shuffle通常是个不错的选项
1 | import tensorflow as tf |
数据预处理
- 数据编码:类别数据(数字序号、One-hot/Multi-hot)
- 避免使用出现次数太少的类别(e.g. <5),模型无法有效学习这些特征值;
- 数据取值的含义最好简单直观,便于模型的解释与理解;
- 创建单独标识特征而不要混合数值与标识值,如为特征创建专门的缺失值标识特征,对于原始特征中的缺失值,分类数据可视作单独类别,连续取值则可填充平均值;
- 考虑到输入的波动,确保特征取值是稳定而不随时间变动的。
- 数据处理:数据归一(Scale)、极端值处理(Outliers)、数据分箱(Binning)、错误修正()
- 数据归一:避免损失函数出现狭长等高线,加快收敛;便于识别训练时数值溢出造成的Nan;赋予不同特征相对均衡的初始权重
- 极端值处理:长尾数据可以取对数或截断(注意截断不是丢弃越界数据,而是将取值重置为界线值),或者借助(分位数)分箱技巧
- 数据分箱:通常可根据取值范围分箱或者取值分布(分位数)分箱。分箱除了减少极端值影响、提升运算速度等效果之外,更根本的原因在于某些特征虽然取值连续,但其具体值对于预测目标而言可能没有意义,比如经纬度(位置)对房价有影响,但并不意味着经度或纬度的具体数值与房价存在关联,通常只是某个经纬度区间(城区)房价普遍高或低,更合理的应该是经纬度分箱并做特征交叉。
- 错误修正:单个样本(遗漏、重复、错误),统计特征(直方图、最大、最小、均值、方差)
- 特征交叉:引入特征的指数项(AxA, AxAxA)或交叉乘积(AxB, AxCxD)作为新特征
- 为线性模型中引入非线性特征(多项式 → 线性)
- 实际中更常见于分类数据间(类似逻辑与操作)
- 随着特征增加模型存在过拟合风险 → 正则化(正则项参数过大,结果不稳定?)
1 | # tf.feature_column是TF 1.x 时代配合Estimators的产物 |
二分类问题
混淆矩阵(confusion matrix):实际类别X预测类别,常见于二分类问题,但也可用于多分类
Predicted Positive | Predicted Negative | |
---|---|---|
Actual Positive(P) | True positive(TP) | False Negative(FN) 漏报 |
Actual Negative(N) | False positive(FP) 误报 | True Negative(TN) |
- Accuracy(正确率):ACC = (TP+TN)/(P+N) ↔ 错误率(Error Rate) = 1-ACC
- True Positive Rate(真阳率):TPR = TP/P,也称为灵敏度、召回率 ↔ 漏报率(FNR)
- True Negative Rate(真阴率):TNR = TN/N,也称特效度、筛选率 ↔ 误报率(FPR)
- Positive Predictive Value(阳性预测值):PPV = TP/(TP+FP),也称精度(Precision)
正确率并不是一个很好的评价标准,尤其是当类别不均衡时,假设一个疾病出现概率为万分之一,则只需要始终预测为阴,正确率就可达到99.99%,但这并没有什么意义。精度和召回率是两个更关注阳性预测的评价指标:
- 正确率(Accuracy):预测总体上的准确性
- 精度(Precision):当预测为阳性时的,预测的准确性
- 召回率(Recall):对阳性样本而言,预测确认其为阳性(召回)的概率(反之为漏报)
上述评价的指标的计算都依赖于分类标准或阈值(threshold)的选取,当我们希望结果精度更高,提升阈值、减少误报即可,但相应的漏报会增加,召回率减少;反之降低阈值,则召回率增加、精度降低。理想的模型应该是精度和召回率都高,单独的精度和召回率都是没有意义的,总可以通过牺牲另外一个得以提升,重要的是两者的平衡(F-score是一个综合两者的指标)。而在没有预先设定阈值时,可以反复尝试多个阈值,绘制ROC曲线(真阳率 v.s. 假阳率),或者直接使用不依赖阈值选择的AUC作为评价指标。
ROC曲线 (假阳率 v.s. 真阳率)
- ROC曲线(Receiver Operating Characteristic Curve):横轴为假阳率/误报率(FPR),纵轴为真阳率/召回率(TPR),每个数据点对应一个阈值选择。
- 当阈值取最高,所有样本预测为阴性,FPR=TPR=0,对应坐标左下角
- 当阈值取最低,所有样本预测为阳性,FPR=TPR=1,对应坐标右上角
- 随阈值增加,TN,FN减少(或不变),TP,FP增加(或不变),FPR,TPR都不会减小
- 因此ROC曲线只能位于对角线一侧(不能跨越),通常取对角线之上(TPR>FPR)
- 位于对角线之下的情况可以通过调换阳性与阴性,将曲线变换至对角线之上
- AUC(Area Under the Curve of ROC):ROC曲线需要根据阈值逐点计算,而AUC是整个曲线(区间0到1)的积分,给出的是对分类指标(模型)不依赖于阈值选择的整体评价。
- AUC指示了,按分类指标排序,任一阳性样本比任一阴性样本排序高的概率
- AUC=0.5,代表模型随机预测,不提供有效信息,对应于ROC曲线取对角线
- AUC取0对应模型分类全部错误(都预测反了),而AUC取1对应分类完全正确
- AUC<0.5也是提供有效信息的,对应ROC曲线位于对角线下(可变换至之上)
- AUC代表了模型对类别正确排序的能力,与具体数值无关、与阈值选取无关
- 上述是AUC的优点,但也使得AUC无法用于校准概率值,也无助于阈值选取
校准曲线 (预测标签 v.s. 实际标签)
预测偏置 = 预测标签均值 - 真实标签平均值。偏置接近0并不能说明什么,但当偏置显著偏离0时,则代表预测存在问题,如信息不全或数据质量差、训练集与测试集分布不一致、模型错误以及过强的正则化等。
除了整体偏置,还可以根据预测标签对数据分箱(线性或分位数分箱),分组计算标签均值,绘制模型的校准曲线(预测标签 v.s. 实际标签)。校准曲线可反映模型在数据子集上的表现,理想情况散点应靠近对角线分布,如果特定部分表现差可能源于对应的数据子集质量差或不具有代表性,也可能是因为正则化过强。最后,二分类预测输出通常是概率,为应对类别不均衡时的小概率,可使用对数坐标放大靠近0部分。
网络训练
- 在数据噪声比较大时,增加网络层数或隐层节点数可能还不如特征工程(通过特征交叉等引入新特征)来的效果明显
- 短期内的变化不说明问题,训练时随着训练集误差降低,验证集误差上升也属正常,关键要看模型最终收敛后的表现
- 梯度消失(ReLU)、梯度爆炸(初始化、批归一化、学习率)、ReLU节点死亡(减小学习率、Leaky ReLU)、随机失活
- 归一化:平衡权重,快收敛,避免NaN tap;线性变换、对数变换、强制截断
多分类问题
- One-vs-all:将多分类问题转换为N个二分类问题,每个类别对应一个(二)分类器(one-vs-all),在使用神经网路时,只需输出层的Sigmoid节点与类别对应即可。
- Softmax:借助Softmax函数,直接给出对应所有分类的概率(输出层节点同样需要与类别对应)。当类别较多时,模型训练时可借助候选采样(Candidate Sampling)策略减少计算量,即输出预期类别对应取值,其余类别则随机挑选几个进行计算。显然这只是训练时采用的策略(类别已知),预测时还是需要对所有类别进行计算。
- Softmax直接给出属于各类别的概率,非常适合处理单标签多分类(多选一)问题,但对于多标签分类(多选多),目标对象可同时属于多个类别(概率和不再为1),此时只能用One-vs-all策略,针对每个类别单独判断。
数据嵌入
- 词袋(bag of word):单词使用One-hot编码,句子对应为稀疏的词频向量
- 超大稀疏向量输入相对应的是大量的模型参数,依赖更多数据和计算量
- 编码相对随机,数据编码的相对位置不能反映对象的内在关联性
- 嵌入(Embedding):将稀疏向量映射到更低维度的空间/将数据嵌入低维度空间
- 维度:维度取值的经验法则为所有可能取值数目开四次方
- 实现:主成分分析(PCA)、Word2vec词向量、作为深度网络的一部分
- 嵌入向量可用于度量各种非结构化数据甚至不同类别数据间的相似度
- 词袋 → 将单词嵌入向量相加 → 稀疏词频向量与所有单词的嵌入矩阵相乘
- Word2vec:[分布假设] 常出现于相同上下文中的单词有相似的语义
Word2vec提出于2013年,此前代表性的神经网络语言模型为2000年左右的NNLM,NNLM是一个三层神经网络,基于序列中若干连续单词预测后续单词:输入时将One-hot编码与嵌入矩阵相乘/查表(table lookup)得到嵌入向量并拼接在一起(没有激活),之后经后续隐藏层最终由输出层计算softmax概率(维度和One-hot编码一致),训练的目标是最大化预测词为正确单词的概率(对应于交叉熵损失)。经过训练后的嵌入矩阵可用于词嵌入,不过作为神经网络的一部分,嵌入矩阵并没有单独得到更多应用。而从Word2vec开始,后续又有了GloVe(2014)、fastText(2016)等词嵌入算法,以及2018年提出的ELMo、GPT、BERT等可在应用时动态调整嵌入的预训练模型。
相比NNLM,Word2vec将词向量的拼接操作替换为求平均(同样没有激活),并去掉了后面的非线性隐层,仅使用两层神经网络:将One-hot编码与嵌入矩阵相乘得到的词向量求平均后,直接由输出层计算softmax概率。为了减少softmax计算量,计算时会采用前面提到的候选采样(Candidate Sampling)/负采样(Negative Sampling)策略,即不会计算所有维度的softmax值,除正确候选词外,只随机选取一些词汇作为负例(另一种策略是基于霍夫曼编码的层次softmax)。
此外,训练时Word2vec同时考虑上下文信息,实现上可以由上下文计算中心词概率(Continuous bag-of-words, CBOW)或者由中心词计算上下文词汇概率(Skip-gram)。CBOW会对上下文平均,Skip-gram则只能pairwise逐对训练,因此CBOW训练速度更快,但在生僻字应对上不如Skip-gram。
注意:这里上下文信息不是作为训练样本依次输入,而是同时输入,以便在隐藏层中拼接或求平均,通常神经网络需要为每个输入(特征)对应一组参数,嵌入的特别之处在于所有上下文共享权重(嵌入矩阵),由此实现信息的压缩提取。
全局视角
数据收集、检验清洗、探索分析、特征工程、模型监测、资源调度、流程管理
- 模型训练:动态(在线) v.s. 静态(离线)
[离线]构建和测试都更简单,[在线]随时适应数据变化波动
无论在线还是离线都需要留意数据变动,确保模型能正确应对 - 模型预测:动态(在线) v.s. 静态(离线)
[离线]直接查表使用、批量并行加快运算、可预先检验结果;无法预见低频事件
[在线]可更好应对对低频事件;计算量、响应延迟、需要时刻关注预测以防出错 - 数据依赖:将输入数据情况纳入系统测试及监测
- 可靠性(Reliability):数据是否始终可获得?获取不到怎么办?
- 兼容性(Versioning):上游系统更新频率?版本信息?兼容策略?
- 必要性(Necessity):权衡保留特定特征的效果提升与成本增加
- 关联性(Correlations):不必要的关联性可人为引入随机性打破
- 反馈回路(Feedback Loops):基于模型预测的决策可能改变模型的输入数据
- 模型公平性:
- 常见偏置:报告偏置(热点不反映现实)、自动化偏置(未经检验的系统判断)、选择效应、群体归因、隐形偏置(认知偏差)
- 分组检验:辛普森悖论,不平衡的分组数据不能简单相加…
- 数据泄露:目标泄露、分组泄露(group leakage)
实践建议
- 从简单模型入手,梳理整个数据流程,建立评判基准
- 用简单模型进行验证,确保数据处理Pipline的正确性
- 建立简单直观有效的评价标准用于模型训练和检验
- 自主掌控并实时监测模型所依赖的数据
- 重视模型配置,请同事检查审核
- 详细记录实验(无论效果好坏)