【浅谈机器学习原理】李宏毅2021/2022春机器学习课程笔记EP6(P23,P32)
从今天开始我将学习李宏毅教授的机器学习视频,下面是课程的连接(强推)李宏毅2021/2022春机器学习课程_哔哩哔哩_bilibili。一共有155个视频,争取都学习完成吧。
那么首先这门课程需要有一定的代码基础,简单学习一下Python的基本用法,还有里面的NumPy库等等的基本知识。再就是数学方面的基础啦,微积分、线性代数和概率论的基础都是听懂这门课必须的。
这节课再探了宝可梦和数码宝贝的分类器问题,从这个问题引入这节课的内容,机器学习的原理。
本次内容可以算是2022年对2021年课程的一个补充内容。
知道的人想必都知道宝可梦和数码宝贝的区别,那么我们可不可以让机器去学习,然后让机器去区别宝可梦和数码宝贝的区别呢?
总所周知,宝可梦的画风是偏卡通风格的可爱小动物,而数码宝贝大多是偏人型的生物。所以,一般来说,数码宝贝的线条大多都比宝可梦复杂,那我们就可以通过这个入手去区分宝可梦和数码宝贝。
这里先引入的Edge detection的方法,这个方法可以将图片转变成黑白的像素点,我们只要数出白色的点就可以去量化出图片中的线条。
接着机器学习就是要我们找到一个阈值(threshold)h,让后我们定义一个function,如果输入一张图片,输出的值大于等于阈值h,那我们就判断这个是数码宝贝,如果输出的值小于阈值h,那我们就判断这个是宝可梦。
那这个h我们该如何求得呢?这里引入了一个|H|向量,它里面是所有h可能的取值。然后这个|H|里面元素的个数我们就称作模型的复杂度。我们可以通过训练集的数据不断调整这个h值去不断优化这个模型。
接下去我们要考虑的是Loss function的定义。
Loss function的作用是给予训练集(图片和宝可梦或者数码宝贝的label),输出这个model的正确率,差不多就是这个模型的效果好坏。这里我们可以使用很多方法去表述这个损失函数,这里为了方便起见,我们使用的是Error rate方法。这个方法的效果就是如果模型输出不等于label,那么就输出1(机器判断错误);如果模型输出等于label(机器判断正确),那么就输出0。
问题前景引入完成,下面就是本节课的重点内容,训练集的选择Training Examples。
先引入几个概念。如果今天我们把这个世界上所有的宝可梦和数码宝贝都拿过来作为训练集,我们把这个很厉害的资料集称之为Dall,然后我们在这个资料集中找到的最好的阈值h称之为hall。但是我们知道,宝可梦和数码宝贝每年都会出新的,我们不可能知道这个世界上的所有宝可梦和数码宝贝(这里可以类比任何现实中的其他问题),还有好多宝可梦或者数码宝贝是我们还不知道和没有发现的,每年宝可梦或者数码宝贝图鉴里都会新多出来很多新的宝可梦或者数码宝贝。所以,我们只能拿一部分的资料集作为训练集来使用,这里我们称之为Dtrain,然后用这个训练集训练得到的阈值h我们称之为htrain。
换言之,这里一个all一个train,对应了我们的理想和现实,现实不可能完全等同于理想,但是我们可以希望现实跟理想越接近越好。
那如果我们运气好的话,情况如下图所示:
在运气好的情况下,我们选择的一部分资料集的训练效果甚至好于全部的资料集。但是请注意,Lall>Ltrain不能说明我们选的train资料集的效果就好于all的资料集,现实不可能超过理想的。这里只能说明,在Dall这组资料中训练效果好,并不一定在所有资料中的效果好。
但是如果我们运气不好的话,情况就如下图所示:
所以我们得出结论:得到结果的好坏,取决于simple到什么样的资料。也就是,我们选择的训练集很大程度上决定了我们模型效果的好坏。
那么如果我们用同一个选择的资料集训练出的htrain去计算all资料集和train资料集的损失Loss,它们之间的差距有多大呢?
这里我们用以上一系列的推导,这里我们直接给出结论。
我们期望在同一个数据集Dall中的htrain的loss和hall的loss之差为一个确定的数值δ,这个δ是一个超参数,这个参数是我们期望理想与现实之间的差距大小。这里换句话说就是另一个式子,对于任何一个|H|中的h而言都有h在Dtrain和h在Dall之中的loss差小于δ/2,这也就意味着Dtrain和Dall很像,所以不管h是什么,算出来的loss都很小。
那么再来总结一下就是:如何让理想和现实很接近?要找到一个具有代表性的Dtrain,让不管是那个h在Dtrain和Dall上都差不多。
那既然得到的结果的好坏取决于取到什么样子的资料集。那没有办法让理想更现实接近的几率有多大?
对于下面的讲解,先在此处声明(一般化的原理):
1.以下讨论跟模型无关
2.以下讨论对资料集没有假设
3.以下讨论跟损失函数无关,它适用于任何损失函数。
下面先看上图的右边。通过上面的解释我们知道,训练集可以决定模型训练的效果好坏,所以我们在这里把蓝色的点看作训练效果好的good Dtrain,把橙色的点看作训练效果不好的bad Dtrain。
那么我们如何去定义坏的Dtrain?即达到坏的Dtrain有什么条件?
对于任何h,它在Dtrain中和Dall中的loss之差大于δ,那么我们就说这是一个坏的训练集。
然后我们看对于图中所有训练集的解释。
可以看到,会有一个h,让方框中的训练集与所有训练集的差距超过δ(坏的Dtrain);同一个训练集,可能会被同一个阈值h弄坏;每个坏的Dtrain,至少被一个阈值h弄坏。
这里一个阈值h会弄坏Dtrain的说法老师用了一个通俗的表达方式让人更容易理解,这里的意思应该就是我们在|H|中寻找合适的h的时候,总会有特定的h我们在训练的时候发现我们的训练集效果并不好,也就是阈值h带我们找到一堆效果不好的训练集。
然后我们使用了概率论与数理统计的魔法解释下面的式子:
回到之前的问题,我们想要知道我们遇到训练集不好的概率是多少。那么这个的概率是所有因为h坏的Dtrain概率的union,这个union就是不考虑因为多个h而重复发现坏的Dtrain的概率或者说那些重复的Dtrain我们只考虑一次。但是因为有重复的,我们并不好去计算,所有如果我们干脆直接把所有因为当前阈值h导致出现坏的Dtrain的概率全部加起来,那当然这个时候的概率P一定是大于或者等于训练集不好的概率的。
接下去就是利用概率论与数理统计的内容去证明,这里先做解释。首先损失的取值范围是[0,1],然后这里的N是Dtrain中的样本数量。
最后通过推导,我们发现训练集不好的概率由N和|H|决定。大的N和小的|H|可以让Dtrain不好的概率变小。
顺便一提,这里的N和|H|都是超参数可以由我们自己自由调整。
接下来我们来看看分别调整这两个参数的效果:
从上面的图中我们可以发现:
调大N的效果:每个弄坏的Dtrain数量变少。
减小|H|的效果:弄坏Dtrain的h数量减少。
然后我们用两个例子来对上面的内容进行进一步的说明。
既然我们求遇到坏的训练集的概率进行的是简单的概率相加,那么在实际上训练模型的时候,我们很有可能发现遇到坏的Dtrain的概率大于1!从上面的例子中我们发现这个概率甚至到了2707!这样子我们上面的方法就没有了什么参考价值!
接下去我们再对刚才的式子进行变换,我们可以得到N的值设置的最优解。
那么如果N的设置有一个最优的解,那么|H|这个参数是不是有最优解呢?
我们之前说|H|是所有可能的h的向量,那么我们把问题的范围扩大,我们在讨论其他问题的时候很有可能这个h是一个带有小数点的数,那么是不是意味着h有无数个?
为了解释这个|H|参数一定是可数的,李老师在这里提供了两个希望令人信服的说法:
1.所有在电脑中可以被描述的数据都一定是可数的(电子信号一定可以被量化)。
2.VC-dimension(这节课先不提)
最后我们就模型的复杂度做出解释:
为了使我们simple到的训练集是坏的可能性尽可能的小,所以我们希望|H|是越小越好的。但是如果我们减小|H|的话,我们在|H|中可以选择的阈值h就会变少和有限,这样会导致我们没有办法让hall在Dall中的损失值真的很小,就会导致我们的理想崩坏了!
这里没有理解也没关系,我们用下面图的角度去解释:
上面的意思换句话说就是这样。如果我们选择大的|H|,理想的L(hall,Dall)会比较小,但是理想和现实终归会有差距,但是选择大的|H|带来的后果就是,理想和现实的差距比较大;如果我们选择小的|H|,起点理想的L(hall,Dall)会比较大,但是因为我们选择的是小的|H|,所以理想和现实的差距会比较小。
如果对这里的原理还有一点疑问,可以去看看原视频里的P32(2022 – 为什么用了验证集 (validation set) 结果却还是过拟合(overfitting)了呢?_哔哩哔哩_bilibili),里面简单的对验证集做了解释。
这样就会带来一个问题,|H|应该选择大的还是小的?鱼和熊掌真的可以兼得吗?
这里的答案是可以的!这个答案就是深度学习Deep Learning!
以上就是浅谈机器学习原理的内容。
评论