| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 李宏毅深度学习笔记(三)——调整模型的技巧 -> 正文阅读 |
|
[人工智能]李宏毅深度学习笔记(三)——调整模型的技巧 |
在训练神经网络的时候,如果没有得到好的结果,我们就需要使用一些特殊的技巧。下面分别讨论在两种不同的情况下,调整模型的方法。 1.训练集上得到的误差很大如果模型在训练集上得到的误差就已经很大,说明可能是你没有选择合适的函数集或者是漏掉了最优解,针对这两种情况,可以选择两种改进方法。 (1)修改激活函数(activation?function)在之前两篇文章中使用的激活函数是sigmoid函数,但是sigmoid函数的问题在于它对于输入的变化是不敏感的,也就是说,输入产生的变化对输出的影响是很小的。 于是,每经过一次sigmoid函数,输入的变化就会衰减一次,在经过很多层Hidden?Layer之后,输入对于输出的结果就几乎没有什么影响了。这会导致我们的训练误差偏大。 选用其他的激活函数可以解决这个问题。 ReLU:在z<0时,函数值为0;在z>0时,函数值等于输入。这样z<0的部分对于整个神经网络没有影响,z>0的部分,函数是线性的,,解决了衰减的问题。 ? Maxout:把原本要作为激活函数的输入的值进行分组(分组的方式和数量人为指定),取每组的最大值作为输出。 这样的结构代表了激活函数的形式是可学习的。它能包含许多函数形式在内,包括ReLU。下图展示了Maxout如何实现与ReLU相同的效果。 ?当然,Maxout也可以实现更多的函数形式。这些函数都是分段的,并且每一段都是线性的。 但是有一个问题,这样的激活函数是不能微分的,那么如何使用梯度下降的方法训练这样的神经网络呢?答案是如果每次只使用分段函数的一段就可以避免这个问题。我们注意到,在取max之后,只有一个神经元的输入发挥了作用。这意味着,对于一组固定的输入而言,删去那些没有被用到的神经元对整个神经网络的学习是没有影响的,激活函数等同于一个线性的函数。所以在训练的时候只需要考虑这些发挥作用的神经元的参数即可。 如下图所示,在训练过程中,针对输入x1和x2,第一层只有和发挥了作用,此时相当于删除了神经元和,激活函数是。这样我们就能像处理一般的神经网络一样,使用Backpropagation训练参数。 那没有被考虑到的神经元呢?他们的参数如何训练?答案是在训练神经网络的过程中,通常会提供多批输入数据,数据不同,被训练到的神经元也不同。只要多次训练模型,就可以保证每个神经元的参数都被训练到。 (2)采用不固定的学习率RMSProb:如下图所示是RMSProp的递推式,其中α是一个超参,取值范围是0到1。α越大,代表越重视之前的计算出的梯度;α越小代表越重视刚计算出的梯度。 Momentum:假设从处开始计算,定义一个量Movement,每次迭代的方向变就变成该点梯度(Gradient)和Movement的矢量和。具体的迭代式子如下图所示,其中 和是常数。 这个过程与物理过程类似。如图中的小球,假如从一个比较高的的地方滚下来的话,有可能借助惯性翻过比较大的局部最小值,从而达到更小的局部最小值,得到更优解。 Adam:这种方法综合了前两种方法,能得到更好的效果。 ?2.训练集上得到的误差较小,但是测试集的误差较大如果在训练集上得到的误差较小,但是在测试集上的误差较大,说明有可能出现了过拟合的情况。有三种常见的方法能解决该问题。 ?(1)及时停止为了避免在测试集上的误差过大,采用让训练的迭代次数减少的方法可以减少过拟合的情况。与一般机器学习使用方法相同。 (2)正则化?为了防止过拟合,可以在Loss?function中增加正则项,来增加对参数过多的“惩罚”。与一般的机器学习使用方法相同。 ?(3)DropoutDropout是在深度学习特有的一种方法。在训练之前,把每个神经元以p%的概率删除,用得到的新的神经网络训练参数。在测试的的时候,保留所有的神经元,但是每个神经元的weight都要乘1-p%。通常p%取0.5. ?dropout神奇的地方在于,这样的做法与集成的做法(训练许多神经网络然后对结果取平均)得到的结果是相似的。而且如果使用类似线性的激活函数,dropout的效果往往比其他的函数效果要好。 最后要指出的是调整模型一定要对症下药,先判断出目前的模型处于什么状态再做出改变,否则可能无济于事甚至得到更差的结果。比如,模型在训练集上就表现得不好,如果此时再使用dropout的方法,模型可能就会越来越差。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/22 10:12:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |