目录
- 1 机器学习及深度学习基础知识
- 2 机器学习模型
- 3 CNN模型
- 4 NLP相关
- 5 Learning to Rank (TODO)
- 6 推荐系统
- 7 强化学习
- 8 常见问题
1 机器学习及深度学习基础知识
1.1 模型分类
-
判别模型 vs 生成模型
判别模型对P(Y|X)进行建模
生成模型对P(X, Y)及P(Y)进行建模 -
参数化模型 vs 非参数化模型
参数化模型:参数的维度固定,如LR、朴素贝叶斯、Kmeans、GMM
非参数化模型:参数的维度随着训练数据量的增大而增大,如决策树、SVM、KNN、AdaBoost -
回归模型 vs 分类模型
区别主要在于:
1、预测的label不同,回归label为连续值,分类label为离散值
2、损失函数不同,回归一般可用MSE,分类一般用交叉熵
3、评价指标不同,回归一般就用均方误差,二分类有准确率、召回率、精确率、敏感度、F1、AUC等
1.2 交叉验证
它的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。
交叉验证
1.3 评价指标
-
均方误差
MSE,一般用于回归模型 -
准确率、精确率、召回率
都是用于分类模型
准确率 = (TN + TP) / (TN + TP + FN + FP)
精确率 = TP / (TP + FP)
召回率 = TP / (TP + FN)
当正负样本数量不平衡的时候,准确率不再具有参考意义 -
F1
F1是精确率和召回率的调和平均数
2 / F1 = 1 / P + 1 / R -
PR曲线、ROC曲线
PR曲线是精确率-召回率曲线
ROC曲线是真正率-假正率曲线
ROC与PR曲线的对比 -
AUC
指曲线下面积,一般指ROC曲线的AUC
ROC曲线的AUC的物理意义:随机取一个正样本以及一个负样本,模型对正样本打分高于负样本的概率,相当于是一个序的关系
AUC的计算方法有三种,最简单的是把曲线画出来之后进行计算,另外两种是根据其物理意义进行采样计算:AUC的计算方法
1.4 正则化(Regularization)
-
正则化为什么可以降低过拟合
正则化降低过拟合的直观解释
-
L1正则化与L2正则化的区别
L1正则化与L2正则化的对比 -
L1正则化为什么可以使参数稀疏化
L1正则化使得参数稀疏化的直观解释
1.5 特征工程
1.5.1 样本不平衡问题
样本不平衡会导致预测结果不准确,例如99%的样本都是负样本,那么只要模型永远预测为负,则模型的准确率可以达到99%,但这是没有意义的
通常可以用几种方法来解决:
1、改变预测分类的阈值
2、使用对类别比例不敏感的模型,比如决策树、SVM
3、改变评价指标,比如弃用准确率,改用AUC
4、对负样本进行负采样,或者对正样本进行过采样,还有一种合成样本的方法SMOTE(个人感觉不是特别靠谱),从而使得正负样本比例维持在一个合理的范围
补充:
当使用负采样方法时,因为改变了数据的分布,因此对模型的预测值需要进行修正
负采样的预测值校准公式推导
1.5.2 特征选择的方法
有三种:
1、过滤型:主要利用特征与label的相关度直接过滤特征
2、包裹型:每次增加/减少特征,进行交叉验证找出能提升模型效果的特征
3、嵌入型:模型本身就带有特征选择的能力,比如决策树、带L1正则化的LR等
1.5.3 数据预处理
-
数据清洗
缺失值清理:填经验值、均值、中位数等,或者如果缺失过多可以直接去掉这个特征
格式内容清理:统一同一特征的格式,剔除明显有问题的数据
修正逻辑错误:比如身份证生日与生日不符
关联性验证:剔除和label不相关或相关性太低的特征
统计不同特征取值的个数,以及不同取值的个数:取值很少的连续特征可以转化为离散特征,如果大部分的数据在这个特征上取值相同,可以去掉这个特征(关联性太弱)
数据清洗流程 -
数据增广
例如对图像进行剪切、平移、旋转从而产生多个与同一标签对应的数据
扩大数据集,且能提升模型的鲁棒性
数据增广 -
预处理
对连续特征进行归一化
把离散特征转化为one-hot编码(进一步转换为embedding向量)
变长特征根据情况进行处理
1.6 优化方法
1.6.1 梯度下降法
基于一个原理:负梯度方向是函数值下降最快的方向
简单证明:可以看成是损失函数的一阶泰勒展开,而方向相反的两个向量乘积最小
梯度下降法是机器学习中应用最广的优化方法,有众多变种(优化器)
梯度下降优化算法
-
Batch Gradient Descent / Stochastic Gradient Descent / mini-batch Gradient Descent
BGD比较准确,但速度慢,SGD速度快,但每次梯度更新方向不准,mini-batch是一个折中方案 -
Momentum Gradient Descent
引入动量概念,类似加速度,学习速度会越来越快,若梯度方向发生改变,则速度会变慢
-
Nesterov accelerated gradient(NAG)
Momentum的改进,在t时刻做优化的时候,预先估算在下一时刻的梯度,并对t时刻的梯度进行修正,这样可以保证参数变化速度不至于过快
-
Adagrad
对不同的参数自适应地选择不同的学习率,对于经常出现的特征使用较小的学习率,反之则使用大学习率,适合处理稀疏数据。优化器会累计每个参数的历史梯度,总历史梯度和学习率大小呈负相关,因此,学习率会随学习轮次增加而不断减小,导致最后无法再进行学习。
-
Adadelta
是Adagrad的一种改进,为了防止学习率无限单调递减,在累计参数的历史梯度时,Adadelta限制了时间窗。Adadelta不需要设置默认学习率。
-
RMSprop
类似Adadelta,解决同样的问题,需要提供初始学习率,推荐默认学习率1e-3
-
Adam
Adaptive Moment Estimation,也是自适应对不同参数选择不同的学习率。可以看做RMSprop和Momentum的结合
-
AdaMax
Adam的一种变种 -
Nadam
可以看做Adam和NAG的一种结合 -
AMSGrad
Adam的一种改进,但并不一定比Adam好 -
梯度下降的改进策略
每个epoch对数据集进行shuffle,或者用curriculum learning学习出一种合理的数据顺序;Batch normalization;Early stop;给梯度增加噪音
1.6.2 牛顿法
牛顿法又名切线法,它的基本思想是对损失函数的二阶泰勒展开进行求导。
从本质上去看,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。
从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
但牛顿法需要计算二阶导,也就是Hessian矩阵,这是非常耗时且耗内存的
同时牛顿法仅在Hessian矩阵正定时可以保证取到极小值,否则可能是极大值或者鞍点
1.6.3 拟牛顿法
为了解决Hessian矩阵计算复杂的问题,拟牛顿法会构造一个正定的矩阵去拟合Hessian矩阵
常见的方法有:DFP,BFGS,LBFGS
拟牛顿法(DFP)的推导
1.6.4 共轭梯度法
共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一
1.7 参数初始化
1.7.1 全部参数使用相同值初始化的问题
如果所有参数的初始化值相同,那么每个神经元的输出也都一样,那么每次更新时,传递到每层的每个参数的梯度也都一样(因为w、x都一样),导致到下一次所有参数的值还是一样,这样一来神经网络就退化成了每层只有一个神经元的网络
所有参数用相同值初始化的问题
1.7.2 标准初始化
保证神经网络中每一层的输入的方差、均值不变
1.7.3 Xavier初始化
保证神经网络中每一层的输入的方差、均值不变,同时保证反向传播的梯度在每一层的方差、均值不变,这样一来网络才不会随着参数更新而失去初始化时的特性
Xavier初始化原理
1.8 激活函数
1.8.1 Sigmoid
特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1
导数:sigmoid * (1 - sigmoid)
缺点:
1、存在饱和区(主要问题)
2、输出不是以0为中心的,全是正数,且梯度也全是正数
1.8.2 tanh
特点:
把连续实数转化为-1和1之间的输出
导数:1 - tanh ^ 2
缺点:
存在饱和区
1.8.3 relu
特点:
分段函数,输入是正数则为线性输出,输入是负数则输出全0
在负数段导数为0,正数段导数为1
不存在饱和区,因此不容易出现梯度消失的问题
计算快,收敛快,使得一部分神经元输出为0,相当于增加网络的稀疏性,不容易过拟合
缺点:
会出现神经元死亡的问题,不适合大的学习率
神经元死亡问题解释
1.8.4 Leaky Relu / PReLU
解决relu神经元死亡问题,主要是保证负数输入的梯度不为0
PReLU有一个可学习的参数p,f(x)=max(px,x)
Leaky Relu提供一个默认的小值,f(x)=max(αx,x)
1.8.5 maxout
具有relu的优点,没有relu的缺点
但是需要两套神经网络的参数,代价太大(类似于Double DQN)
1.9 Batch Normalization
-
实现方法
对一个batch的数据,在神经网络的每一层,每一个神经元上进行归一化(减去偏差,再除以标准差),之后再进行一次偏移和缩放
偏移和缩放的值是学习出来的
在训练阶段,batch normalization是用一个batch的数据来计算bias和variance,但在测试阶段,是用全量的测试数据的bias和variance -
原理及优点
1、保证神经网络每一层的输入的分布大致相同,从而使训练更加稳定
2、把神经元输入拉到0均值1方差,不至于落入激活函数的饱和区,缓解了梯度消失的问题
3、梯度里增加了一项1 / var,当参数普遍较大时,神经元输出会偏大(经过BN层之前),那么var也会相应的偏大,从而减小梯度的尺度,保证梯度不会因为参数过大而梯度爆炸;反之也可以保证梯度不会因为参数过小而梯度消失
4、给数据添加了一定噪声,有一定轻微的正则化效果
5、可以使用更大的学习率 -
Layer Normalization
不再计算一个batch内的mean和var,而是计算一个layer里的不同神经元的mean和var
1.10 Dropout
-
实现方法
在训练阶段,对于隐层的每个神经元,以一定的概率使其输出为0
在测试阶段,计算所有神经元,但输出时乘以dropout的概率,保证和训练时数据的尺度一致 -
原理及优点
相当于做了集成学习,网络结构是随机的,最后的结果是不同网络结构平均的结果
因此可以降低过拟合,并且减少不同神经元之间的耦合度,增加网络的鲁棒性
1.11 梯度爆炸 / 梯度消失
产生梯度爆炸或者梯度消失的根本原因:链式求导法则的连乘造成的指数效应
解决梯度爆炸的方法:
梯度裁剪、使用Batch Norm、使用较小的学习率、参数初始化到较小的值、进行正则化(保证参数不会过大)
解决梯度消失的方法:
使用Relu激活函数、使用Batch Norm、参数初始化增大一点、引入残差
1.12 过拟合 / 欠拟合
-
过拟合的解决方法
正则化、使用Batch Normalization、Early Stop、集成学习、Dropout、扩大数据集、降低网络复杂度、减少特征数量 -
欠拟合的解决方法
改变网络结构、改变模型、增加网络复杂度、调参、增加新特征、增加训练轮数、解决梯度消失和梯度爆炸问题
1.13 Attention机制
-
原理
本质是Key、Value、Query
Attention机制的原理
-
权重计算函数
1、Dot Product
2、Scaled Dot Product
3、Bilinear
4、网络学习
5、Cosine -
各种Attention
1、Self Attention,Query和Key是一致的
2、Soft Attention,关注所有的Key,Query和每个Key都产生一个权重
3、Hard Attention,每次只关注一个Key,Query和Key产生的权重只有一个不为0
4、Local Attention,每次只计算一个窗口内的Key与Query的相似度,避免了大量的计算
2 机器学习模型
2.1 Logistic Regression
-
LR公式推导
LR公式推导 -
LR为什么用sigmoid函数
LR是广义线性模型在样本分布为伯努利分布时的特殊情况,可以利用广义线性模型推导出LR的公式P(y = 1|x) = sigmoid(wx + b)
广义线性模型 -
LR与SVM的异同
同:
1、都是分类模型(也可用于回归)
2、如果不考虑核函数,那么他们都是线性算法
3、都是监督学习
4、都是判别模型
异:
1、本质上Loss函数不同,LR为log loss,SVM为Hinge Loss
2、所有样本对于LR模型参数都有贡献,而只有支撑向量对于SVM的参数有贡献,因此SVM不用担心数据不均衡的问题,但如果SVM的支撑向量存在异常,对结果影响很大,相对而言异常点对于LR的影响不大
3、LR只能解决线性分类问题,而SVM可以利用核方法解决非线性分类问题
4、LR是基于概率的,SVM是基于距离的,因此SVM对于数据的距离很敏感
5、SVM自带正则化项,LR必须自己添加正则化 -
为什么线性回归不能做分类,而逻辑回归可以
所有的点都会对这两个模型的参数做出贡献,对于线性回归而言,异常点会造成非常大的影响,而对于逻辑回归而言,异常点的影响被sigmoid函数压缩了 -
Ridge Regression、Lasso Regression
线性回归的变种,Ridge Regression是在线性回归的基础上增加L2正则化,Lasso Regression是在线性回归的基础上增加L1正则化 -
Logistic Regression如何实现并行化
按行并行(数据并行,梯度合并)、按列并行(特征并行)
LR并行化 -
多类分类推广
可以利用多个二分类模型组合成多分类模型,具体实现方法有one vs all、one vs one两种
也可以把LR推广为Softmax函数
Softmax推导
当各类互斥时,用softmax更好,当各类可以重叠时,用one vs all更好
2.2 SVM
-
SVM公式推导
主要是构造对偶问题,利用KKT条件,优化时使用SMO方法,每次优化两个alpha,第一个和第二个alpha选择策略不同
SVM公式推导
朴素的SVM只能解决线性可分的情况,而对于线性不可分的数据集,要引入软间隔来解决 -
Hinge Loss
带软间隔的SVM可以看做是以Hinge Loss为损失函数,带L2正则化的线性回归
Hinge Loss -
核函数
使用核函数可以把样本映射到高维空间,在低维空间线性不可分的样本在高维空间往往是线性可分的,使用核函数后,没有办法预先计算出w和b,因为无法使用单独的某个x(被映射到了高维空间,而我们不知道这个高维空间的实际值,只知道在高维空间中两个x的内积),因此必须保留所有支撑向量以计算预测值
常见核函数
2.3 朴素贝叶斯算法
-
原理
朴素贝叶斯算法原理 -
Laplace平滑
为了解决数据不足时可能出现的P(xj | Ci) = 0从而导致的连乘为0的问题
在统计每种xj出现的次数时,从1开始累积而不是从0
2.4 高斯判别模型(GDA)
属于生成模型,假设数据的总体分布是由多个高斯分布叠加得到的,而每一类数据都服从其中一个高斯分布
高斯判别模型公式推导
2.5 高斯混合模型(GMM)
无监督版的GDA,把label当成一个隐变量,从而使用EM算法+GDA的优化方法来优化模型
高斯混合模型公式推导
2.6 KNN
-
三要素
K值、距离度量方法(欧拉距离、cosine距离等)、输出决策策略(通常为投票或者均值) -
KD-Tree
KNN的优化算法,加快最近邻的计算速度,本质思想类似于二分查找,但数据是k维的
KD Tree原理
2.7 决策树
-
ID3、C4.5、CART
决策树原理
决策树优点:
1、可解释性强
2、对数据尺度不敏感
3、可以处理缺失值
4、预测速度快
5、对异常点不敏感
决策树缺点:
1、容易过拟合
2、样本小的变动会对树结构产生大的影响
3、难以学习复杂的函数关系
Gini系数的优点:
1、计算速度快,不需要进行log计算
2、二叉树结构更适合计算机计算
信息增益的问题:
1、倾向于选择取值数量多的特征
信息增益比的问题:
1、倾向于选择取值数量少的特征 -
三类决策树算法对比
-
缺失值处理
1、如果有单独的缺失分支,使用此分支
2、把待分类的样本的属性a值分配一个最常出现的a的属性值,然后进行分支预测
3、根据其他属性为该待分类样本填充一个属性a值,然后进行分支处理
4、在决策树中属性a节点的分支上,遍历属性a节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类
5、待分类样本在到达属性a节点时就终止分类,然后根据此时a节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类 -
决策树剪枝
决策树剪枝
预剪枝策略:作为叶结点或作为根结点需要含的最少样本个数、分裂所需要的最小样本数、决策树的层数、结点的经验熵小于某个阈值才停止
后剪枝策略:主要是交叉验证
2.8 集成学习
2.8.1 Bagging vs Boosting vs Stacking
三类集成学习方法总结
Bagging主要是减少方差
Boosting主要是减少偏差
Stacking可以结合多种不同的基模型,提升准确率
2.8.2 Adaboost
是前向分步模型在损失函数为指数损失函数时的特例
Adaboost原理推导
2.8.3 随机森林
基学习器为决策树模型,行列都进行采样,降低过拟合
随机森林原理
2.8.4 GBDT / XGBoost / LightGBM
XGBoost原理详解
GBDT、XGBoost、LightGBM的对比
XGBoost的改进:
1、基模型可以用线性模型
2、引入二阶信息计算残差,预测更加准确
3、支持并行化(特征分裂并行计算)
4、引入了行采样(不放回)、列采样从而降低过拟合
5、特征分裂点的候选减少(只检查几个分位点,还可以进一步优化,检查加权分位点)
6、提供了处理缺失值的方法(计算一个默认方向)
7、Loss函数增加正则化项,引入多层模型的shrinkage
8、所有特征预排序
9、内置交叉验证
LightGBM的改进:
1、特征分裂算法用直方图法(每个特征一个直方图,不需要预排序记录大量索引,同时离散化连续特征,节省内存;每个节点的直方图等于父节点的直方图减去兄弟节点的直方图,节省一半的直方图计算量;分裂值只考虑桶间值,大大减少计算量)
2、leaf-wise分裂策略(带深度限制防止过拟合)
3、支持直接输入分类特征
4、支持两种并行(特征并行,不同节点计算不同特征的分裂点;数据并行,不同节点计算部分数据的直方图,最后合并)
2.8.5 GBDT与随机森林的区别
1、随机森林采用的bagging思想,而GBDT采用的boosting思想。这两种方法都是Bootstrap思想的应用,Bootstrap是一种有放回的抽样方法思想。虽然都是有放回的抽样,但二者的区别在于:Bagging采用有放回的均匀取样,而Boosting根据错误率来取样(Boosting初始化时对每一个训练样例赋相等的权重1/n,然后用该算法对训练集训练t轮,每次训练后,对训练失败的样例赋以较大的权重),因此Boosting的分类精度要优于Bagging。Bagging的训练集的选择是随机的,各训练集之间相互独立,弱分类器可并行,而Boosting的训练集的选择与前一轮的学习结果有关,是串行的。
2、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只能由回归树组成。
3、组成随机森林的树可以并行生成;而GBDT只能是串行生成。
4、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来。
5、随机森林对异常值不敏感;GBDT对异常值非常敏感。
6、随机森林对训练集一视同仁;GBDT是基于权值的弱分类器的集成。
7、随机森林是通过减少模型方差提高性能;GBDT是通过减少模型偏差提高性能。
2.9 聚类
2.9.1 Kmeans
只有一个参数K,属于懒惰学习
K-means原理
2.9.2 层次聚类法BIRCH
基于CF-Tree数据结构,节省内存,但因为每个节点有限制,聚类出来的类别数不一定符合实际
BIRCH原理
2.9.3 基于密度的聚类DBSCAN
基于密度,可以聚类任意的形状分布
主要参数有:邻域半径、核心点的邻域内最小元素数量、距离度量方法
DBSCAN原理
2.9.4 谱聚类
基于二分图的最小割
谱聚类原理
2.10 降维
2.10.1 PCA
原理是,方差最大的维度上保有的信息量最大,因此PCA要把数据投影到若干个方差最大的坐标轴上
PCA的原理
2.10.2 LDA
当类别信息包含在数据的偏差里而不是方差里的时候,PCA降维可能会丢失重要的信息
LDA是一种带监督的降维算法,思想是最大化类间方差,最小化类内方差
LDA最多降维到(类别数 - 1)维
LDA降维后保证了最佳的分类性能
LDA的原理
2.10.3 Encoder-Decoder
把输入值当做label,把隐层输出作为降维后的目标向量
2.11 半监督学习
3 CNN模型
3.1 CNN
3.1.1 卷积层
-
局部感知(稀疏连接)
卷积神经网络有两种神器可以降低参数数目,局部感知野和权值共享。先来说说局部感知,一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。即,局部感受野指卷积层的神经元只和上一层map的局部相联系。 -
参数共享
权值共享(也就是卷积操作)减少了权值数量,降低了网络复杂度。可以看成是特征提取的方式。其中隐含的原理是:图像中的一部分的统计特性与其他部分是一样的。意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。 -
多核卷积
如权值共享的部分所说我们用一个卷积核操作只能得到一部分特征可能获取不到全部特征,这么一来我们就引入了多核卷积。用每个卷积核来学习不同的特征(每个卷积核学习到不同的权重)来提取原图特征
3.1.2 池化层
池化层的意义:
1、引入局部平移不变性(也得益于共享权重和稀疏连接)
2、减少网络参数个数
3、压缩信息,突出整体结构信息
4、解决不同输入尺度的问题(需要动态调整pooling大小)
3.1.3 不变性
由于稀疏连接、权重共享、以及尤其是池化层的存在,CNN有着一定的局部平移不变性
但CNN对于大的平移没有不变性
CNN没有旋转不变性以及形变不变性,但可以通过数据增广来使得CNN学习到少量的这样的不变性
3.1.4 输出特征图大小
3.1.5 感受野大小
其中 l k − 1 l_{k-1} lk−1是第k−1层的感受野大小,而