【机器学习任务攻略】李宏毅2021/2022春机器学习课程笔记EP3(P18)
从今天开始我将学习李宏毅教授的机器学习视频,下面是课程的连接(强推)李宏毅2021/2022春机器学习课程_哔哩哔哩_bilibili。一共有155个视频,争取都学习完成吧。
那么首先这门课程需要有一定的代码基础,简单学习一下Python的基本用法,还有里面的NumPy库等等的基本知识。再就是数学方面的基础啦,微积分、线性代数和概率论的基础都是听懂这门课必须的。
在进行homework 1之前,我们先来看看机器学习任务攻略,这是本系列课程的第2课的开头部分,主要讲解的是我们该如何完成本节课的作业,在拿到作业的代码之后应该怎么修改才能让模型的训练效果更加好。
首先是HW中的数据部分,作业中一般会提供上面的两个数据集,一个是训练集,它包括了各个x的值和对应y的label值。然后还有一个是测试集(做笔记的时候手误记错位置了,Training data是训练集,Testing data是测试集),它只包括了和训练集中不同的各个x值,我们需要将我们训练好的模型用在测试集上面,用我们自己的模型跑出x对应的y值,然后将y值上传作业即可。也就是说测试集中得到的y值也反映了我们的模型的好坏。
虽然课程中都会给每个作业提供完整的基础代码,但是它们训练的效果往往都不好,比如下面这样,训练到一半就因为效果不好暂停了。
因此,如果我们想要训练出一个效果更加好的模型,我们需要修改作业中的基础代码。接下去就来介绍修改代码的思路。
loss值在训练集中出现问题后我们应该如何去解决?这里分了两种情况,分别是loss过大和过小的情况。
我们先从loss值过大开始说起,loss值过大的其中一个原因是模型中的bias值没有被合适地设定。也即是说我们的模型太过简答了,这样子很可能导致模型中没有包含任何一个function可以让loss的值变低。那解决的方法在lecture 1中就已经说明过了其实,就是重新设置一个模型,增加模型的弹性,具体来说就是增加模型的features,或者从深度学习的角度,增加神经元个数和加深模型的层数都是可以尝试的方法。下面的笔记应该可以帮助理解一些。
然后,loss的值过大不一定是因为模型的bias,还可能因为我们之前也提到过的梯度下降法的问题。简单的说就是梯度下降法中找到的是局部最优解,但不是我们想要找到最终的全局最优解。
那么问题就来了,如果我们在训练集中训练模型的时候遇到loss值过大,该如何去判断问题是出在model的bias还是Optimization呢?
解决方式就是比较不同模型来得知我们的model够不够大。这里需要一提的是,在测试集中,加深神经网络的层数出现效果不好的情况不叫overfitting。在训练集中加深层数后的效果还是不如之前的话,那么就可以判断是Optimization没有做好,比如下图中因为56层加深后,也就是模型的弹性变大后,效果依旧不如20层的模型,但是56层的模型弹性显然比20层的要好,这样说model的bias出现问题显然是不合理的,那么我们就完全可以判断这里的问题出在了Optimization,也就是寻找loss的最小值的方法上面。
如果遇到了Optimization不够好的问题,我们可以尝试先跑一些浅的小神经网络,甚至用一些无视深度学习的方法(linear model或支持向量机),这些方法比较不容易出现Optimization不好的问题,如果这样子依旧不能在训练集中降低loss,那么问题就一定出现在了Optimization上面。那接下去的改进方法会在后面的一课中继续讲到,目前我们只要先能找出Optimization的问题即可。
下面我们来说训练集中loss的值过小的问题。
如果在训练集中的loss值小,在测试集中的loss值也小,那么就说明我们训练出来的模型效果比较好,无需再做出什么改进。
如果在训练集上的loss值小,但是在测试集上的loss值大,这就说明出现了过拟合(overfitting)的问题。也就是说我们训练出来了一个没有用的函数,这个函数在得到输入x后会去找训练集中有没有x对应的y值,如果有就输出这个y,如果没有就会随机输出一个值,那么自然在训练集上的效果看起来会很好,但我们需要的是预测未知,所以我们也说这样的函数是一个没有用处的函数,其实这个模型什么都没有学。
出现overfitting的原因一般是因为模型的弹性过大,更有弹性的模型,更加容易发生过拟合。具体对于过拟合的讲解会在之后的课程中再讲到。
那解决过拟合问题的方法主要有下面两种:增加训练资料和减小模型的弹性。
先从增加训练资料开始说起,比较有效的方法是翻转图片,或者利用其他方式让同一个数据以不同的方式呈现,但是需要注意的是增加的数据本身需要是合理的才行。
再来说减小模型的弹性,换句话说就是限制模型,让它在一个合理的范围内生成函数。我们主要可以使用的方法有权重共享、Regularization和正则化等等。但是还需要强调的是不能给太多的限制,不然会导致生成不出来我们需要的模型,最后问题又会回到模型弹性过小的问题上。
刚才说了一大堆的模型的大小、弹性什么的,但是目前我们都没有给出明确的定义。目前我们只需要了解当模型到达一个什么样子的复杂程度以后,我们才能得到最好的效果。为了防止loss值在训练集和测试集不合适,我们要选择正确、合适的模型复杂度或者说弹性。
最后是一些对于kaggle提交作业的部分,提到了public数据集和private数据集,然后对交叉验证进行了说明,这里因为不涉及老课程的作业提交就先不进行说明。
以上就是李宏毅机器学习课程的P18,主要说明了应该如何去改进作业中的模型,改进模型时应该有一个什么样子的思路。