人工智能小白日记之6 ML学习篇之1
机器学习
https://developers.google.cn/machine-learning/crash-course/ml-intro
1 机器学习简介
wtf?中文的,看着一个外国人讲英语,然后用中文在这里播,还是很不适应的。我习惯给我来点中英文字幕,然后听英文原话。
而且这语音怎么听起来这么机械化。等等…我知道了,机械化,666。show啊,绝对在show。我猜测他们用了AI技术对视频进行了实时翻译,我是中国的,它就给我翻译成了中文,然后用语音库读出来。是不是666.
而且,左下角有两个好玩的工具。哦,右下角按钮可以调整语音。
视频中举了几个例子,说明什么是机器学习。都是需要提供大量的样本,让其学习,然后达到想要的目的。比如给它100本棋谱,他就会成为一个下棋高手,哈,alpha狗。不过alpha狗更高端,人家学完棋谱为了突破极限还能玩左右互搏术,自己和自己打。
也提到了机器学习是通过统计信息,而不是人脑这样的逻辑来判定的。
2 监督式机器学习
在监督式机器学习中, 我们将学习如何创建模型来结合输入信息, 对以前从未见过的数据做出有用的预测。
视频里,以分类垃圾邮件为例,提到几个关键概念:
标签(标注):指出是垃圾邮件还是非垃圾邮件
特征:可以从邮件中提取的各种信息
样本:一封邮件就是一个样本
模型:机器学习的过程就是创建并训练模型的过程,训练后得到的模型工具将被用作实际应用。例如,回归模型可预测连续值。分类模型可预测离散值。
后面有几道测试题目,大家可以自测一下。
3 线性回归
通过已知的样本,得到一条预测线(模型),
也就是y=wx+b。其中x对应特征,y对应标签,b为偏差,w为特征x的权重。当有多个特征的时候,可以更加精确的得到一个模型。
比如判断一个人的性别的模型:头发权重1,胸部权重5,喉结权重8,这样会有多个特征,综合判断性别。
损失:是一个数值,表示对于单个样本而言模型预测的准确程度。
均方误差 (MSE) 指的是每个样本的平均平方损失。
很明显,损失低的模型预测的准确度越高,所以才会去研究这个损失函数,MSE是其中一种。
4 降低损失
为啥有这个话题?我们采样的数据,不可能刚好就是最佳的数据。如果我们选择的训练数据,是整体数据的一部分,比如线性问题的偏上部分数据。由于忽略的下面部分的数据,得到的模型,偏差就大了。
这样的话就需要一种办法,来降低损失(Reducing Loss),得到最佳模型。
4-1 迭代方法
迭代方法,让我想到小时候玩过的猜数游戏。写上一个数字,比如2019,然后来猜:
我猜100,小了。
根据上轮结果,我猜500,还是小了。
根据上轮结果,我猜1000,还是小了。
根据上轮结果,我猜5000,大了。
诶,这时候,根据上轮结果,我探出一个范围1000-5000。
然后接着不断缩小这个范围,得到最终答案。
这也是迭代方法的原理
就y = wx+b 的模型来说,为了得到最佳的w,b。执行如下循环迭代:
》1.假设w=1,b=0, 这时候模型为y=x
》2.用新得到的y=x进行预测,输入特征x=1,得到标签y=1
》3.计算损失,x=1时的正确标签应该是y=2,根据MSE算出误差
》4.损失过大,重新假设w,b,回到第1步
在训练机器学习模型时,首先对权重和偏差进行初始猜测,然后反复调整这些猜测,直到获得损失可能最低的权重和偏差为止。
4-2 梯度下降法
回归问题的损失与参数的关系始终是凹形的(为啥教程里面会写成凸形的?,要凸形也得写个下凸形),通过整个数据集来查找效率很低。我们知道下凹形只有一个最低点,也就是斜率为0的部位,就是我们要找的最佳参数的位置。
因此,针对回归问题,有个热门的方法,叫梯度下降算法。
随机选个起点w1,算出此点斜率,如果为负数,很明显,第2个点应该继续选择w1的右边。朝着这个方向走,直到斜率大于或等于0.
但是每次的选点应该偏离上一个点多少呢,太大容易越过低点,太小有可能爬的太慢。
4-3 学习速率
梯度下降法算法用梯度乘以一个称为学习速率(有时也称为步长)的标量,以确定下一个点的位置。
每个回归问题都存在一个金发姑娘学习速率。(好吧,真有聊)
4-4 随机梯度下降法
到目前为止,我们一直假定批量是指整个数据集。就 Google 的规模而言,数据集通常包含数十亿甚至数千亿个样本。如果是超大批量,则单次迭代就可能要花费很长时间进行计算。
随机梯度下降法 (SGD) 每次迭代只使用一个样本(批量大小为 1)。如果进行足够的迭代,SGD 也可以发挥作用,但过程会非常杂乱。
小批量随机梯度下降法(小批量 SGD)是介于全批量迭代与 SGD 之间的折衷方案。小批量通常包含 10-1000 个随机选择的样本。小批量 SGD 可以减少 SGD 中的杂乱样本数量,但仍然比全批量更高效。
5 TF用法
插入这个,主要是里面有线性回归的编程练习。
5-1 pandas 跳过,这个我们上节看过了
5-2 first_steps_with_tensor_flow
first_steps_with_tensor_flow.ipynb:此练习介绍了线性回归。
找到jupyter中的练习
本来想在这里继续写的。篇幅不够,完全单独可以写一篇了,叫线性回归实战,后面补充。
5-3 synthetic_features_and_outliers
这个是线性回归的续集,讲的是合成特征和离群值,提高模型的有效性,也单独发布。毕竟作为第一个实战demo,还是有很强的参考性的。
6 泛化
纯拟合的问题:如果我们现在来分类垃圾邮件和非垃圾邮件。根据已采样数据,我们可以想尽办法得到一个完美模型。
够扭曲,够霸气吧,完全正确。对于已出现的所有样本,确实可以准确分类。如果出现了一些新样本呢?我们希望它能划分,但实际上有可能出现偏差。
由于过于拟合了训练数据,等待生产数据来的时候已经没有办法适应了。
如何解决这个问题呢?
奥卡姆剃刀定律(Occam’s Razor, Ockham’s Razor)又称“奥康的剃刀”,它是由14世纪英格兰的逻辑学家、圣方济各会修士奥卡姆的威廉(William of Occam,约1285年至1349年)提出。这个原理称为“如无必要,勿增实体”,即“简单有效原理”。正如他在《箴言书注》2卷15题说“切勿浪费较多东西去做,用较少的东西,同样可以做好的事情。
假设现实会给我不断产生新的样本,比如新的垃圾邮件。旧的垃圾邮件+新的垃圾邮件 = 新的总体样本。周而复始。
既然这样,那我在生产模型的时候,直接从总体样本上随机仅抽取一部分作为训练样本,这样总体样本中的其他就相当于新的样本,关键在于这些新样本我已经拿到手了。这时候用新样本进行测试,就知道模型是否能很好的适应新样本了,也就是模型可以很好的泛化到还未出现的新数据了。(这么抽象我居然看懂了,哈哈)
以上成立的关键假设:
因此,我们必须知道这些假设,密切关注各项指标, 这样在违反了这些假设时就能立即知晓。
7 训练集和测试集
训练集 - 用于训练模型的子集。训练集规模越大,模型的学习效果就越好。
测试集 - 用于测试训练后模型的子集。测试集规模越大,我们对于评估指标的信心越充足, 置信区间就越窄。
我们可以将一个大型数据集分成两个小数据集: 一个用于训练,一个用于测试。这两个数据集相互独立,拆分前需要随机化。
如果我们有十亿样本, 我们可以使用其中的10-15%进行测试,置信区间依然会很窄。
如果数据集规模很小,我们可能需要 执行诸如交叉验证之类较为复杂的操作。
为了防止长期迭代对于测试集可能产生的过拟合问题,衍生出验证集,顶替原来测试集的位置。测试集则放到一边完全不用,最后拿来测试即可。