第一课:机器学习
一、基本概念
#机器学习定义
#监督/无监督学习
#线性回归模型
#代价函数
#梯度下降及其理解
start point 不同,最终到达的局部极小点也不同。
α是学习率,即梯度下降的步长,后面的偏导代表方向(看下图进行理解),逐步更新参数
梯度下降方向的理解
学习率α的理解:太小了下降很慢,太大了容易不收敛
越是逼近局部最小点,偏导越小,所以可以通过固定的学习率到达最小点
成本函数永远只有一个全局最小值
梯度下降在线性回归模型中的运行过程
二、多维特征-具有多个变量的线性回归
1、多维特征
箭头代表是一个向量
多元线性回归模型表示
2、向量化
使用numpy的点积形式,更为简洁,并且计算速度更快,这是因为点乘使用了硬件的并行计算(想起来了当年写TDC代码计算电子耦合的时候,使用点积的形式大大加速了计算)。
3、特征缩放
特征标准化为一个量级,使得梯度下降得更快,更容易收敛(且安全无害)
实现方法有:均值归一化、Z-score 归一化等
4、判断梯度下降是否收敛
图:学习曲线。左侧紫色点代表按照梯度下降法,所有参数同时更新100次后,成本函数的值
5、选择适当的学习率
尝试不同的学习率,看学习曲线的下降情况。——这就是所谓调参侠的工作
6、特征工程
7、多项式回归
三、分类
1、动机
使用线性回归模型预测分类任务,通常会很糟糕
2、Logistic Regression
逻辑回归:世界上使用最广泛的单一分类算法。名字里面虽然有“回归”,但是它实际上是用于分类的任务(出于历史的原因)。
图 逻辑回归模型及其数学公式
3、Decision Boundary(决策边界)
4、Cost Function for Logistic Regression
sigmoid函数定义
线性回归的损失函数在这里不适用
为逻辑回归定义新的成本函数(f取值在0-1之间)
5、简化代价函数
6、应用梯度下降
7、过拟合问题
特征过多可能会导致过拟合(对新数据的预测具有高方差),特征过少可能会导致欠拟合(对新数据的预测具有高偏差)
8、解决过拟合
(1)增加训练集数据
(2)使用更少的特征
(3)正则化(Regularization):减小参数的尺寸
9、带有正则化的成本函数
类似减小某些特征的权重?
在成本函数原来的MSE的基础上引入正则化项,必须最小化MSE和正则化项,模型才最优。所以会在两项之间寻找平衡。正则化系数λ的值决定了正则化的程度,当其为0,即不进行正则化;当其为一个很大的数字如10**10,每模型拟合出的是一条直线。
10、用于线性回归的正则化方法(多特征+小训练集)
11 、用于逻辑回归的正则化方法(多特征+小训练集)
第二课
一、高阶学习算法-神经网络
1、神经元和大脑
只是起源于模仿,其实现在神经网络和生物基本没关系。
2、神经网络如何工作-需求预测
刚开始先将所有输入都指向每一个神经元,然后在学习过程中找到真正与该神经元相关的输入,并将无关或低相关的输入剔除或减小影响权重。
你的训练集只告诉你输入向量X(price,shipping cost,marketing,和material),以及输出Y。但是没有告诉你中间隐藏的afford ability,awareness和perceived quality的正确值(所以称之为隐藏层),这些值是神经网络算出来的。
将下图中的黄色部分隐藏起来,你会发现其实就是一个逻辑回归,只不过采用的特征从训练集的4个变成了现在的3个:afford ability,awareness和perceived quality。这3个特征能更好地描述Y。感觉这个处理过程类似特征工程?(事实上,神经网络可以学习输入的特征,自动化生成隐藏层特征,不需要用户手动定义。)
构建神经网络时,需要用户决定神经网络架构。即,有多少个隐藏层,以及希望每个隐藏层有多少个神经元。神经网络架构会对学习算法的性能产生影响。
3、神经网络举例-图像识别
4、神经网络中的网络层
预测网络:每一层输入一组数字向量,并对该向量应用一堆逻辑回归单元,然后输出另一组数字向量。。。从一层传递给另一层,直到到达最终的输出层。
5、更复杂的神经网络
这是一个4层的神经网络(一般不包含输入层),其工作方式如下图所示。输入向量X,使用第一层先计算出向量a[1],然后使用第二层神经元计算出来a[2]。。。最后使用第四层神经元计算出来a[4],即可进行预测(判断结果是否大于某个阈值)。
6、神经网络预测:前向传播
从左往右进行计算,所以称为前向传播:forward propagation
7、神经网络代码实现:TensorFlow
实现很简单:
8、TensorFlow中的数据形式
张量,数组,矩阵,向量的区别:
数组是一种数据结构,分为一维、二维和多维数组。在数学上,一般把一维数组称为向量;
二维数组称为矩阵;三维及以上的数组称为张量(Tensor)或多维数组。
9、搭建一个神经网络
更紧凑的Tensorfolow代码:
10、单个网络层上的前向传播
使用numpy来分解每一步(神经元中的参数使用随机硬编码):
11、前向传播的通用方法
12、通用人工智能 Artificial general intelligence(AGI)
13、神经网络为何如此高效
矩阵乘法
二、TensorFlow实现
1.1、TensorFlow实现
1.2 模型训练细节
2.1 Sigmoid激活函数的替代方案
针对不同的预测需求,可以使用不同的激活函数,最常用的有3种:
2.2 如何选择激活函数
(1())输出层激活函数的选择:
如果你在预测分类问题,建议直接用Sigmoid激活函数;
如果预测回归问题,预测上升或者下降,y可以为正也可以为负,建议用线性激活函数;
如果y只能取非负值,比如房屋价格,那可以用ReLU激活函数。
(2)隐藏层激活函数的选择:
ReLU激活函数是目前使用最为频繁的隐藏层激活函数(最早期是Sigmoid函数),因为它只有一个flat区域(小于0的区域),使用梯度下降的时候相比Sigmoid(有两个flat区域)收敛更快。
(3)激活函数选择总结:
输出层根据y的类型选择sigmoid/linear/relu,隐藏层可以无脑选择relu。
2.3 为什么模型需要激活函数
没有添加激活函数的神经网络模型 == 线性回归
3.1 多分类问题的定义
3.2 Softmax回归解决多分类问题
Softmax是逻辑回归的推广,也成为Softmax激活函数
3.3 神经网络的Softmax输出
softmax的tensorflow实现:
3.4 Softmax的改进实现
3.5 multi-label分类 vs multi-class 分类
multi-class分类举例:y的取值不止两个
multi-label分类举例:同时判断多个二元分类,如:图中是否有猫,是否有狗,是否有🐏。。。
4.1 高阶优化方法(beyond 梯度下降)
Adam Algorithm:自动调整学习率的大小,通常比梯度下降收敛地更快,更快地学习。
应用Adam算法:
4.2 其它的网络层类型
卷积层(称为卷积神经网络):每个神经元只代表图像的一部分
举例:心电图识 别
5.1 反向传播(计算导数)
三、模型评估
1.1 模型效果不好,如何处理?
有些尝试会fruitful,有些尝试not fruitful
1.2 模型评估
训练误差足以? No
1.3 模型选择、训练集/(交叉)验证集/测试集
可以理解为:训练集用来训练模型,验证集用来选择模型(调整超参数等,比如神经网络的层数,多项式的指数等);最后的测试集只是为了测试模型的真正性能(不能使用测试集做出任何决定)。
只有在确定一个模型作为最终模型之后,才可以在测试集上对其进行评估,并且因为没有使用测试集做出任何决定,可以确保测试集是公平的(不会做出过于乐观的评估)。
2.1 偏差(bias)和方差(variance)
Jtrain:Training error Jcv:Cross validation error(即验证集误差(区别于交叉验证))
-
偏差:描述样本拟合出的模型的预测结果的期望与样本真实结果的差距,要想偏差表现的好,就需要复杂化模型,增加模型的参数,但这样容易过拟合,过拟合对应上图的 High Variance,点会很分散。低偏差对应的点都打在靶心附近,所以喵的很准,但不一定很稳;
-
方差:描述样本上训练出来的模型在测试集上的表现,要想方差表现的好,需要简化模型,减少模型的复杂度,但这样容易欠拟合,欠拟合对应上图 High Bias,点偏离中心。低方差对应就是点都打的很集中,但不一定是靶心附近,手很稳,但不一定瞄的准。
2.2 正则化,偏差和方差
当正则化参数λ非常大(左图),多项式的w值都会接近0,得到的将会是接近一条y=b的直线,将会欠拟合,导致具有较高的bias;当正则化参数非常小比如为0,则依然过拟合,具有较高方差;当λ值合适的时候,无论训练集还是测试集的误差都会很小。
随着λ的增加,训练集误差逐渐增大,而验证集误差先减小后增大;这个过程正好和多项式的指数变化对训练和验证集误差带来的影响互为镜像(右插图),因为如果只有1项,对应于欠拟合,即大的λ,如果很多项,对应于过拟合,即小λ。
2.3 制定一个用于性能评估的基准
养成习惯,当一个模型训练好后,先评价其具有高偏差还是高方差。
评价模型具有高偏差还是高方差:
其中,基准性能可以是根据经验给出的,也可能是根据人类水平给出的。
可以根据自己的模型具有高偏差还是高方差,来指导λ,多项式次数等值的增加或减小(妙啊)。
2.4 学习曲线
随着训练集的增大,Jcv逐渐减小,而Jtrain逐渐增加。 解释如右图。
2.5 例子:决定下一步做什么
下图中,减小λ意味着使模型更加关注J(w,b)的前面一项,使模型更加复杂和灵活;反之反之
获取更多的训练数据:有助于解决高方差问题——如算法对非常小的数据集过拟合,那么获得更多的训练样本会有很大帮助。。。
2.6 偏差/方差和神经网络
更大的网络可以减小偏差;更多的数据可以降低方差。 但是也存在两个问题:1,大网络需要更大的计算量。2,有时候无法获取更多的数据。
如果正则化使用合适,大的神经网络也能和小的表现一样好(即可以解决过拟合问题),所以增大网络几乎没有坏处。 所以当神经网络足够大的时候,一般不与偏差问题作斗争。。。
在tensorflow中使用正则化:
3.1 机器学习系统开发的 Iterative loop
3.2 错误分析
首先关注的是偏差和方差,其次就是误差分析。
误差分析:将错误分类的例子拎出来作为一类,观察它们的特征。以决定后续改进的重点。
如XX活性预测时,发现预测错误的都是某一类,那可能是这一类的训练数据太小了?增加数据可以改进模型性能? 等等。
3.3 添加更多数据
可以有针对性地添加数据,比如哪类预测效果不好,就添加哪一类数据。
AI = Code + Data #改进代码或者改进数据both work
3.4 迁移学习-使用其他任务中的参数数据
迁移学习:
第一个神经网络已经训练好,有5层,最终的输出是分类猫,狗,人。。。等等。。
第二个神经网络也有5层,最终的输出是分类1,2,3.。。等等。 可以直接使用第一个神经网络的前4层的参数(w,b),只不过最后的输出层进行更改。
我们希望的是第一个神经网络已经为处理图像输入的前几层学习了一些合理的参数集,然后通过将这些参数转移到新的神经网络,新的网络将从一个更好的地方开始训练调参,可能只需要再学习一点点即可(微调权重)。
好处:第一个神经网络不必是你亲自训练的,可能你只需要下载别人花费很长时间训练的神经网络,然后将输出层替换为自己的输出层并执行选项1或选项2即可。调整一个别人已经进行过监督预训练的神经网络,只需要做一点微调就可以快速得到一个在你的任务上表现良好的神经网络。
PS:输入类型应该相同。比如你做的是语音识别,那使用别人图像识别的参数效果就不好。
3.5 机器学习项目的完整周期
3.6 公平、偏见和伦理
4.1 不平衡数据集
比如,测试集中有0.5%患病,99.5%没病,你的模型无脑地将其全部判断为没病。那么准确率Accuracy为99.5%,误差error为0.5%,但是这两个数据说明不了预测能力。
因此,我们引入了精确率/查准率(precision)和召回率/查全率(recall)两个指标。这两个指标可以根据混淆矩阵来计算:
可以理解为:精确率是针对预测的,即预测里面有多少是对的;召回率是针对数据的,即一类数据里面有多少被识别出来。
4.2 精确率/查准率和召回率/查全率之间的权衡
很多时候,需要手动选择阈值以权衡精确率和召回率:
#不同算法带来不同的精确率和召回率,如何评价哪个更好?
因此,引入了F1 Score:P和R的调和平均数(harmonic mean),数学上是一种取平均值的方法,更强调较小的值。
四、决策树
1.1 决策树模型
1.2 决策树学习过程
(1)每个节点使用哪个特征?
(2)何时停止拆分?
①当一个节点百分百是某一类
②当分裂某一节点将导致超过设置的最大深度
③当纯度分数提升小于某个阈值
④当某一个节点中例子的数量小于某个阈值。 PS:小树不容易过拟合。
2.1 测量纯度
熵越大,数据的混乱度越高,越不纯。
熵函数是一组数据的不纯度的度量。根据样本中正例的数量,从0开始上升到1,然后下降到0。
还有一种类似的构建决策树的函数:Gini标准
2.2 基于信息增益选择节点拆分特征
构建决策树时,在某个节点上拆分哪个特征基于哪个特征能最大程度地减少熵,最大化纯度。我们需要选择具有最低平均加权熵的分支:
不分裂的时候熵为H(0.5)=1,分裂的熵为图中括号中的计算值,前者减去后者即为熵的减少,称为信息增益(information gain)。
为什么要计算信息增益? 因为决定不再进行分裂的标准之一是熵的减少是否太小。
信息增益的公式定义(类似上张图片中的计算):
2.3 整合-构建决策树的整个过程
构建决策树的过程:对于每一个节点,计算所有可能特征的信息增益,并选择具有最高信息增益的特征进行分裂(树的根节点是所有训练数据examples)。在树的左分支和右分支上重复拆分过程,直到达到某一个停止条件:
(1)当某一个节点100%是单个类别时
(2)当分裂一个节点导致超过你设置的最大深度时
(3)当信息增益值低于一个阈值时
(4)当某一个节点中的examples少于一个阈值时
决策树深度更大类似于更高阶的多项式,或更大的神经网络。
2.4 独热编码(One-hot encoding)
2.5 连续的数值特征
对于连续数值,尝试不同的阈值,进行信息增益计算,然后选择信息增益最大的阈值对样例进行拆分。
2.6 决策树预测回归问题
决策树预测回归问题:因变量y是一个连续型数值:
决策树预测回归问题:当构建好一个决策树,即确定好最后一个节点的动物是什么了。当有一个新的动物具有Pointy 耳朵形状,具有Round脸形状,那么它的体重将是最终节点动物体重的平均值,如下图所示:
如何确定回归树使用哪一个特征进行分支?
构建回归树的时候,目的不是试图减少熵,所以在进行分裂时不需要像构建决策树一样:先计算加权平均熵,然后计算信息增益,最后选择信息增益最大的特征进行分支。而是,先计算加权平均方差,然后计算方差的减少,最后选择提供最大方差减少的分支,如下图所示。 #个人理解:让方差逐步减少,即是使得后面的节点中的物种逐步逼近具有相同的数值。
3.1 使用多个决策树
原因:使用单棵树的话,可能样例一点小小的改变,你通过信息增益计算获得的分裂将会不同,得到一个完全不同的树,使得该算法不健壮。这种情况下,构建树集合并让它们投票,会使得整体算法对任何一棵树不太敏感,使算法更加健壮:
如上图,根据三棵已经构建好的决策树,来预测右边的动物是否是一只猫,两棵树给了是,一棵树说不是,根据投票机制(少数服从多数),最终结果预测为:是猫。
3.2 有放回采样
3.3 随机森林算法
(1)Bagged决策树:训练集中有m个示例,有放回采样B次,每一次都构建一个决策树,最后让这些树来投票。
事实证明,B设置的再大一些不会损害性能,但是超过某个点后,性能会逐渐下降。并且当B远大于100左右的时候,性能实际上不会变得更好。所以我从不用1000棵树,这只会显著降低计算速度而不会显著提升算法性能。
(2)随机森林
在上述Bagged决策树中,即使使用有放回的采样,有时候也会在root note使用相同的拆分特征,而且在root note附近使用非常相似的拆分特征。
对上述Bagged决策树进行一些修改,实际上性能将会更好,并将该算法变成了随机森林算法:
使用随机森林,使得树集合中的树之间变得更加不同,同时训练集的任何微小变化都不太可能对整个随机森林算法的整体输出产生巨大影响。
问:机器学习工程师去哪里露营: 随机森林😄
3.4 XGBoost (eXtreme Gradient Boosting极端梯度提升)
XGBoost与bagged decision tree不同的是,当第一次抽样构建好第一棵树,从第二次抽样开始,每一次抽样,都更倾向于抽到上一棵树分错的样本。
内置了正则化以防止过拟合、开源、快速高效、较好的默认分裂标准和停止分裂的标准、XGB和深度学习算法是两种赢得很多比赛的方法。
3.5 何时使用决策树/神经网络?
在结构化的数据上(如电子表格里面的数据)使用决策树算法,而在非结构化的数据上(如图像,时评,音频和文本)使用神经网络。
如果你决定使用决策树或者集成树算法,推荐在大多数时候使用XGBoost。
神经网络在每一种类型的数据上都表现良好,包括结构化或非结构化数据
第三课:无监督学习、推荐系统和强化学习
1.1 导读
2.1 聚类
2.2 K-means 聚类直观理解
(1)首先随机分配cluster centroid,将每个点按照最近原则分配给cluster centroid
(2)将每个cluster centroid移动到分配给它的所有点的平均值。
循环进行步骤(1)和(2),直到cluster centroid位置不再发生变化,或位置收敛。
2.3 K-means 聚类算法
2.4 K-means的优化目标
最小化 样本点-聚类中心的距离的平方:
2.5 初始化K-means
核心思想是用多个随机化种子,取损失函数最小的那个。
2.6 选择聚类数量
很多人使用 肘法。。。 最有效的还是根据需求来定数量
3.1 异常检测
3.2 高斯(正态)分布
3.3 异常检测算法
步骤:
1、选择能反映异常的特征xi
2、拟合每个异常特征数据的的高斯分布参数
3、给定新的例子xi,计算每个特征的概率之乘集,决定是否是异常(只要某一个异常,那么结果就是异常的)
例子:
3.4 开发与评估异常检测系统
3.5异常检测与监督学习对比
对于反例特别多,而正例特别少的情况:
异常检测是学习正常情况下(这里是反例)是什么样的,任何偏离该情况的样本都会认为是不正常的,因此未来预测的正例可能和训练集相距很远(如,全新欺诈情况检测 ); 而监督学习是分别学习正例和反例具体是什么样的,因此未来预测的正例应该与训练集中的正例类似(如,垃圾邮件分类)。 ——所以监督学习需要的正例样本数量要更多一些。
3.6 选择特征
第二周: 电影推荐
1.1 提出建议
1.2 使用每个特征
1.3 协同过滤算法
1.4 二进制标签
2.1 均值归一化
2.2 找到相关特征
3.1 协同过滤与基于内容过滤对比
3.2 基于内容过滤的深度学习方法
3.3 从大型目录中推荐
3.4 推荐系统中的伦理问题
3.5 基于内容过滤的Tensorflow实现
4.1 主成分分析-降低特征数量
PCA的目的是找到一个或者多个新轴,比如下图中的z,这样我们在新轴上测量数据坐标时,我们仍然可以获得有关汽车的非常有用的信息。 这样就把两个特征x1和x2减少到了1个特征z。
比如手机屏幕大小可以用长和 宽表示,也可以用斜对角线长度表示。
4.2 主成分分析算法
目标:找到一个主成分(轴),使得数据方差最大化
PCA与线性回归的区别,如下图,线性回归主要关注y,使得所有小y的平均距离最小;而PCA主要关注在某一个轴上面的投影的方差,使得方差最大(事实证明,最大化投影的方差对应于最小化投影距离)。
当你有多个特征时,线性回归和PCA之间的差异会非常大。
另一个例子:
4.3 使用Scikit-learn库来进行PCA
(1)特征缩放
(2)拟合数据获得n个主成分
PCA的应用:目前主要就是可视化。 以前会用来进行数据压缩和减少机器学习的特征维度,但是现在一般用的很少了,因为现代网络存储比较大,并且特征维度多的话可以用神经网络。
第三周: 强化学习
1.1 什么是强化学习?
关键思想:指定一个奖励函数,告诉算法什么时候做的好,什么时候做的不好。而不是告诉它每个输入的正确输出y是什么。
比如:无人机在天空飞行,有各种摇杆,你很难告诉它哪一组推动摇杆的组合是对的,哪一种是错误的。 你就告诉他当前的是对的还是错的就行了,错的给一个惩罚,对的就奖励,这样它就慢慢学会了。
1.2 示例:火星探测器
1.3 强化学习的回报
总回报 = 每一步的奖励*折扣因子 的总和。 如下图,越早获得的奖励会导致总回报值越高,花的时间越长,收益越低(比如读博。。。)。
1.4 决策:强化学习中的策略
1.5 审查关键概念
……
3.8 课程总结和致谢