深度模型训练优化
模型偏差可能会影响模型训练。举个例子,假设模型过于简单,一个有未知参数的函数代 θ1 得到一个函数fθ1 (x),同理可得到另一个函数fθ2 (x),把所有的函数集合起来得到一个函 数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不在模 型可以描述的范围内。在这种情况下,就算找出了一个θ∗,虽然它是这些蓝色的函数里面最 好的一个,但损失还是不够低。这种情况就是想要在大海里面捞针(一个损失低的函数),结 果针根本就不在海里。
这个时候重新设计一个模型,给模型更大的灵活性。以第一章的预测未来观看人数为例, 可以增加输入的特征,本来输入的特征只有前一天的信息,假设要预测接下来的观看人数,用 前一天的信息不够多,用56天前的信息,模型的灵活性就比较大了。也可以用深度学习,增 加更多的灵活性。所以如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模 型,可以用深度学习来增加模型的灵活性,这是第一个可以的解法。但是并不是训练的时候, 损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好。
一般只会用到梯度下降进行优化,这种优化的方法很多的问题。比如可能会卡在局部最 小值的地方,无法找到一个真的可以让损失很低的参数,如图1(a)所示。如图1(b)所示 蓝色部分是模型可以表示的函数所形成的集合,可以把θ代入不同的数值,形成不同的函数, 把所有的函数通通集合在一起,得到这个蓝色的集合。这个蓝色的集合里面,确实包含了一些 函数,这些函数它的损失是低的。但问题是梯度下降这一个算法无法找出损失低的函数,梯度 下降是解一个优化的问题,找到θ∗ 就结束了。但θ∗ 的损失不够低。这个模型里面存在着某一个函数的损失是够低的,梯度下降没有给这一个函数。这就像是想大海捞针,针确实在海 里,但是无法把针捞起来。训练数据的损失不够低的时候,到底是模型偏差,还是优化的问题 呢。找不到一个损失低的函数,到底是因为模型的灵活性不够,海里面没有针。还是模型的灵 活性已经够了,只是优化梯度下降不给力,它没办法把针捞出来 到底是哪一个。到底模型已 经够大了,还是它不够大,怎么判断这件事呢?
图1 优化方法的问题
一个建议判断的方法,通过比较不同的模型来判断模型现在到底够不够大。举个例子,这 一个实验是从残差网络的论文“DeepResidual Learning for Image Recognition”[1] 里面节录出 来的。这篇论文在测试集上测试两个网络,一个网络有20层,一个网络有56层。图2(a) 横轴指的是训练的过程,就是参数更新的过程,随着参数的更新,损失会越来越低,但是结果 20 层的损失比较低,56层的损失还比较高。残差网络是比较早期的论文,2015年的论文。很 多人看到这张图认为这个代表过拟合,深度学习不奏效,56层太深了不奏效,根本就不需要 这么深。但 这个不是过拟合,并不是所有的结果不好,都叫做过拟合。在训练集上,20层的 网络损失其实是比较低的,56层的网络损失是比较高的,如图2(b)所示,这代表56层的 网络的优化没有做好,它的优化不给力。
图2 残差网络的例子
Q:如何知道是56 层的优化不给力,搞不好是模型偏差,搞不好是56层的网络的模 型灵活性还不够大,它要156层才好,56层也许灵活性还不够大? A:但是比较56层跟20层,20层的损失都已经可以做到这样了,56层的灵活性一定 比20 层更大。如果56 层的网络要做到20层的网络可以做到的事情,对它来说是轻 而易举的。它只要前20层的参数,跟这个20层的网络一样,剩下36层就什么事都不 做,复制前一层的输出就好了。如果优化成功,56层的网络应该要比20层的网络可以 得到更低的损失。但结果在训练集上面没有,这个不是过拟合,这个也不是模型偏差, 因为56层网络灵活性是够的,这个问题是优化不给力,优化做得不够好。
这边给大家的建议是看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网 络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(SupportVectorMachine, SVM),SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题。也就是这些模型 它会竭尽全力的,在它们的能力范围之内,找出一组最好的参数,它们比较不会有失败的问 题。因此可以先训练一些比较浅的模型,或者是一些比较简单的模型,先知道这些简单的模 型,到底可以得到什么样的损失。
接下来还缺一个深的模型,如果深的模型跟浅的模型比起来,深的模型明明灵活性比较 大,但损失却没有办法比浅的模型压得更低代表说优化有问题,梯度下降不给力,因此要有一 些其它的方法来更好地进行优化。
举个观看人数预测的例子,如图3 所示,在训练集上面,2017 年到 2020 年的数据是 训练集,1层的网络的损失是280,2层就降到180,3层就降到140,4层就降到100。但是 测5层的时候结果变成340。损失很大显然不是模型偏差的问题,因为4层都可以做到100 了,5 层应该可以做得更低。这个是优化的问题,优化做得不好才会导致造成这样子的问题。 如果训练损失大,可以先判断是模型偏差还是优化。如果是模型偏差,就把模型变大。假设经 过努力可以让训练数据的损失变小,接下来可以来看测试数据损失;如果测试数据损失也小, 比这个较强的基线模型还要小,就结束了。
图3 层数越深,损失反而变大
但如果训练数据上面的损失小,测试数据上的损失大,可能是真的过拟合。在测试上的结 果不好,不一定是过拟合。要把训练数据损失记下来,先确定优化没有问题,模型够大了。接 下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。
原文地址:https://blog.csdn.net/u013963578/article/details/143641530
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!