写在前面
吴恩达(英语:Andrew Ng)是斯坦福大学计算机科学系和电气工程系的客座教授,曾任斯坦福人工智能实验室主任。他还与达芙妮·科勒一起创建了在线教育平台Coursera。
吴恩达老师的机器学习课程可以说是入门机器学习的同学最先接触的课程,当然后续的deeplearning.ai是更深入的课程。对在线教育,以及人工智能领域的发展提供了很大的帮助,感谢。
线性回归
回归问题损失函数一般为误差平方函数 mse
需要注意的事项:
- 变量的归一化,以免不同的量纲不同。要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
- 不同的初始化,可能会得到不同的局部最优解。如果初始化就在局部最低点,则不会更新相关的参数,梯度为0
- 梯度下降算法: 学习率不用没必要自己减小,当慢慢接近局部最小值时候,梯度自然就小了
求解
- 梯度下降算法
- 正规方程(矩阵求解)
逻辑回归
从线性回归那块演变过来用于分类的算法,不是回归,是分类算法。
损失函数不再是mse,而是变为二元交叉熵损失函数。
这是由于mse形式的损失函数,套用sigmoid激活函数后,整个损失函数是非凸的函数,这导致通过梯度下降算法求解到的可能是局部最优解,而不是全局最优解。
因此,逻辑回归的损失函数变换为二元交叉熵损失函数,这是一个凸函数,最终能得到全局最优解。
注意:
- 逻辑回归的特征处理也需要归一化
- 求解方法依然是梯度下降算法
- 但有更高级的优化算法:共轭梯度法BFGS、限制变尺度法LBFGS等。运行速度要远远超过梯度下降法。
- 在面临很大的机器学习问题时候,建议使用高级优化方法
- 多标签分类问题转化为多个二分类问题
- 初始化参数可以为0
正则化
- 过拟合:通过学习得到的假设可能能够非常好地适应训练集(代价函数可能几乎为 0),但是可能会不能推广到新的数据
- 欠拟合:不能很好地适应训练集
**为什么会出现过拟合 **
那些高次项导致了过拟合的产生,所以如果能让这些高次项的系数接近于 0 的话,就能很好的拟合。
解决方法
- 丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如 PCA)
- 正则化。 保留所有的特征,但是减少参数的大小(magnitude)
正则方法
- L0正则:模型参数中非零参数的个数,难求解
- L1正则: 各个参数绝对值之和,侧重于让其为0(LASSO)
- L2正则:各个参数的平方的和的开方值,侧重于让参数稀疏化(Ridge)
实现参数的稀疏有什么好处吗?
- 可以简化模型,避免过拟合。因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数起作用,那么可以对训练数据可以预测的很好,但是对测试数据就不行了
- 参数变少可以使整个模型获得更好的可解释性
参数值越小代表模型越简单吗?
是的。为什么参数越小,说明模型越简单呢,这是因为越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大。
总结
- L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候非常有用,而Ridge就只是一种规则化而已
- 在所有特征中只有少数特征起重要作用的情况下,选择Lasso比较合适,因为它能自动选择特征。而如果所有特征中,大部分特征都能起作用,而且起的作用很平均,那么使用Ridge也许更合适
神经网络
-
前向后向传播算法(forward and backpropagation)
zhuanlan.zhihu.com/p/45190898 -
参数初始化不能都为0,初始参数为正负𝜀之间的随机值
-
特征归一化
优化建议
- 性能优化
获得更多的训练实例通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法。
- 尝试减少特征的数量
- 尝试获得更多的特征
- 尝试增加多项式特征
- 尝试减少正则化程度𝜆
- 尝试增加正则化程度𝜆
- 评估训练好的算法
- 过拟合现象
- 画图(不适合多特征时)
- 训练集合与验证集合上的表现(7:3划分,shuffle)
3.模型选择与交叉验证
- 数据集划分(训练集、验证集、测试集(6:2:2)
4.诊断偏差和方差
当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:要么是偏差比较大,要么是方差比较大。换句话说,出现的情况要么是欠拟合,要么是过拟合问题。 - 欠拟合:高偏差
- 过拟合:高方差
训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合
5.正则化偏差与方差
在训练过程中,一般会使用一些正则化方法来防止过拟合。但是lambda 的取值也是要考虑的。过大,会导致欠拟合,相当于参数w都很小;过小,会导致过拟合,参数w可以比较大。
- 当 𝜆 较小时,训练集误差较小(过拟合)而交叉验证集误差较大;
- 随着 𝜆 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加;
6.学习曲线
使用学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)
- 欠拟合:增加训练数据,模型性能不一定能好;
- 过拟合:增加训练数据,可能提高算法效果;
- 在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助;在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果;
7.下一步能做什么
- 获得更多的训练实例——解决高方差(过拟合)
- 尝试减少特征的数量——解决高方差(过拟合)
- 尝试获得更多的特征——解决高偏差(欠拟合)
- 尝试增加多项式特征——解决高偏差(欠拟合)
- 尝试减少正则化程度 λ——解决高偏差(欠拟合)
- 尝试增加正则化程度 λ——解决高方差(过拟合)
神经网络的偏差与方差
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
机器学习系统的设计
1.头脑风暴:想想有哪些可以方法可以去提升精度
2.误差分析
- 快速构建baseline, 通过交叉检验来验证数据集
- 画出学习曲线,分析高偏差、高误差问题
- 针对曲线问题考虑是否扩充数据集以及增加特征等
- 看看哪些结果被算法错误分类,这过程能启发你构造新的特征变量,或者告诉你:现在这个系统的短处,然后启发你如何去提高它
- 看分类器对哪一组邮件的预测误差最大,并着手优化。思考怎样能改进分类器。例如,发现是否缺少某些特征,记下这些特征出现的次数。例如记录下错误拼写出现了多少次,异常的邮件路由情况出现了多少次等等,然后从出现次数最多的情况开始着手优化。
- 有了一个快速而不完美的算法实现,又有一个数值的评估数据,这会帮助你尝试新的想法,快速地发现你尝试的这些想法是否能够提高算法的表现,从而你会更快地做出决定,在算法中放弃什么,吸收什么。误差分析可以帮助我们系统化地选择该做什么。
快速实现—>分析误差原因—>优化或者再尝试新的方案
- 数据不平衡,类别偏差
偏斜类(skewed classes),类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。
召回率与准确率:
- 查准率=TP/(TP+FP)。例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。
- 查全率=TP/(TP+FN)。例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。
- 召回率与准确率的平衡
随着阈值的设定,会同时影响召回率与准确率
二者结合起来,使用F1分数来平衡二者的大小
支持向量机SVM
- SVM的损失函数可以由逻辑回归演变而来
- 大间距分类器
间隔不在是挨着,而是有一个间隔(1、-1),安全的间距因子。
支持向量机模型的做法,就是努力将正样本和负样本用最大的间距分开。
损失函数:
以两个特征为例子,且w0为0
|w|/2 st. y(wx+b) >=1
聚类
无监督学习:数据集没有标签
聚类算法可以用于推荐中的召回
1.k-means聚类
K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组
思想:
- K-均值是一个迭代算法,假设我们想要将数据聚类成 n 个组,其方法为:
- 1.首先选择𝐾个随机的点,称为聚类中心(cluster centroids);
- 2.对于数据集中的每一个数据,按照距离𝐾个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。
- 3.计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
- 4.重复步骤 2-4 直至中心点不再变化
2.优化目标
3.随机初始化聚类中心
随机初始化,会对算法有影响。在K小的时候,可以多次运行kmeans算法,然后选择最小的结果。
优化版:kmeans++,尽可能的让每一个聚类中心都离得比较远
4.选择聚类数
没有所谓最好的选择聚类数的方法,通常是需要根据不同的问题,人工进行选择的。
肘部法则:在肘部的时候,那个转折点的数量可以作为K值
5. 聚类参考资料
降维
1.数据压缩: 从高维度变成低维度,去除冗余特征
2.数据可视化: 将数据可视化,我们便能寻找到一个更好的解决方案
3. 主成分分析(PCA)
找到一个方向向量,希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。
PCA可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。
4.主成分分析算法
5.选择主成分数量
希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的𝑘值。
异常检测
异常检测主要用来识别欺骗
上述是一般的高斯分布模型,对于有两个相关的特征,而且这两个特征的值域范围比较宽时候,一般的高斯分布模型可能不能很好地识别异常数据。这是由于一般的高斯分布模型尝试的是去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界而。是要使用多元高斯分布模型(使用协方差矩阵来计算得到概率密度函数)
推荐系统
1.基于内容的推荐LR
1.2 FM
考虑特征相关性,在LR的基础上加多项式
2.协同过滤CF
- 基于用户的推荐:需要用户的相关信息,相似用户,将用户A喜欢的商品推荐给用户B
- 基于商品的推荐:不需要用户的相关信息,经常商品A与B经常被一起购买,当用户购买A时候,推荐商品B
3.数据处理
均值归一化处理
训练的时候均值归一化,预测的时候其输出结果需要加上均值
大规模机器学习
1.检查数据集是否有必要使用大数据集
先应该做的事是去检查一个这么大规模的训练集是否真的必要
2.随机梯度下降算法(SGD)
思想:随机使用一个样本进行参数的更新
优势:快,简便
劣势:不够稳定,无法找到真正的全局最小点
3.小批量梯度下降算法(mini-BGD)
小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每计算常数𝑏次训练实例,便更新一次参数 𝜃
4.随机梯度下降算法的收敛
机梯度下降中,我们在每一次更新 𝜃 之前都计算一次代价,然后每𝑥次迭代后,求出这𝑥次对训练实例计算代价的平均值。
随着迭代次数,降低学习率alpha。一般不用修改,随着逐渐逼近最低点,梯度本身就在减少,另外一方面,修改alpha进行调整所耗费的计算通常不值得。
5.在线学习
一个算法来从中学习的时候来模型化问题在线学习算法指的是对数据流而非离线的静态数据集的学习。
一旦对一个数据的学习完成了,我们便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,我们的算法可以很好的适应用户的倾向性,算法可以针对用户的当前行为不断地更新模型以适应该用户。
本质:对单一的实例进行学习,而非对一个提前定义的训练集进行循环训练
6.映射化简(MapReduce)与并行计算
思想:将数据切分然后并行处理,处理完后再综合起来使用,以达到加速的目的。
图片文字识别OCR
从一张给定的图片中识别文字
数据来源
- 人工另外收集扩增,或者人工创造
- 基于已有的数据进行变换扩增(旋转、扭曲、模糊等)
模型管道性能分析
如果不是end-to-end(one-stage)的模型,而是由几个阶段组成的模型。需要考虑对哪个阶段的模型花大力气进行性能提升,进而提升整个系统模型的性能。