ps自学网官方网站,公司网站建站要多少钱一年,资源分享wordpress,智慧团建电脑版登录官网当我们要训练一个已经写好的神经网络时#xff0c;我们就要直面诸多的超参数啦。这些超参数一旦选不好#xff0c;那么很有可能让神经网络跑的还不如感知机。因此在面对神经网络这种容量很大的model前#xff0c;是很有必要深刻的理解一下各个超参数的意义及其对model的影响… 当我们要训练一个已经写好的神经网络时我们就要直面诸多的超参数啦。这些超参数一旦选不好那么很有可能让神经网络跑的还不如感知机。因此在面对神经网络这种容量很大的model前是很有必要深刻的理解一下各个超参数的意义及其对model的影响的。 贴心的小夕还是先带领大家简单回顾一下神经网络的一次迭代过程 即首先选择n个样本组成一个batch然后将batch丢进神经网络得到输出结果。再将输出结果与样本label丢给loss函数算出本轮的loss而后就可以愉快的跑BP算法了从后往前逐层计算参数之于loss的导数。最后将每个参数的导数配合步长参数来进行参数更新。这就是训练过程的一次迭代。 由此最直观的超参数就是batch的大小——我们可以一次性将整个数据集喂给神经网络让神经网络利用全部样本来计算迭代时的梯度即传统的梯度下降法也可以一次只喂一个样本即严格意义上的随机梯度下降法也称在线梯度下降法简称SGD也可以取个折中的方案即每次喂一部分样本让其完成本轮迭代即batch梯度下降法。 数学基础不太好的初学者可能在这里犯迷糊——一次性喂500个样本并迭代一次跟一次喂1个样本迭代500次相比有区别吗 其实这两个做法就相当于第一种total 旧参下计算更新值1旧参下计算更新值2...旧参下计算更新值500 ;新参数 旧参数 total 第二种新参数1 旧参数 旧参数下计算更新值1新参数2 新参数1 新参数1下计算更新值1新参数3 新参数2 新参数2下计算更新值1...新参数500 新参数500 新参数500下计算更新值1 也就是说第一种是将参数一次性更新500个样本的量第二种是迭代的更新500次参数。当然是不一样的啦。 那么问题来了哪个更好呢 我们首先分析最简单的影响哪种做法收敛更快呢 我们假设每个样本相对于大自然真实分布的标准差为σ那么根据概率统计的知识很容易推出n个样本的标准差为有疑问的同学快翻开概率统计的课本看一下推导过程。从这里可以看出我们使用样本来估计梯度的时候1个样本带来σ的标准差但是使用n个样本区估计梯度并不能让标准差线性降低也就是并不能让误差降低为原来的1/n即无法达到σ/n而n个样本的计算量却是线性的每个样本都要平等的跑一遍前向算法。 由此看出显然在同等的计算量之下一定的时间内使用整个样本集的收敛速度要远慢于使用少量样本的情况。换句话说要想收敛到同一个最优点使用整个样本集时虽然迭代次数少但是每次迭代的时间长耗费的总时间是大于使用少量样本多次迭代的情况的。 那么是不是样本越少收敛越快呢理论上确实是这样的使用单个单核cpu的情况下也确实是这样的。但是我们要与工程实际相结合呀~实际上工程上在使用GPU训练时跑一个样本花的时间与跑几十个样本甚至几百个样本的时间是一样的当然得益于GPU里面超多的核超强的并行计算能力啦。因此在工程实际中从收敛速度的角度来说小批量的样本集是最优的也就是我们所说的mini-batch。这时的batch size往往从几十到几百不等但一般不会超过几千你有土豪显卡的话当我没说。 那么如果我真有一个怪兽级显卡使得一次计算10000个样本跟计算1个样本的时间相同的话是不是设置10000就一定是最好的呢虽然从收敛速度上来说是的但是我们知道神经网络是个复杂的model它的损失函数也不是省油的灯在实际问题中神经网络的loss曲面以model参数为自变量以loss值为因变量画出来的曲面往往是非凸的这意味着很可能有多个局部最优点而且很可能有鞍点 插播一下鞍点就是loss曲面中像马鞍一样形状的地方的中心点如下图 图片来自《Deep Learning》想象一下在鞍点处横着看的话鞍点就是个极小值点但是竖着看的话鞍点就是极大值点线性代数和最优化算法过关的同学应该能反应过来鞍点处的Hessian矩阵的特征值有正有负。不理解也没关系小夕过几天就开始写最优化的文章啦~因此鞍点容易给优化算法一个“我已经收敛了”的假象殊不知其旁边有一个可以跳下去的万丈深渊。。。可怕 回到主线上来小夕在《机器学习入门指导4》中提到过传统的最优化算法是无法自动的避开局部最优点的对于鞍点也是理论上很头疼的东西。但是实际上工程中却不怎么容易陷入很差劲的局部最优点或者鞍点这是为什么呢 暂且不说一些很高深的理论如“神经网络的loss曲面中的局部最优点与全局最优点差不太多”我们就从最简单的角度想~ 想一想样本量少的时候会带来很大的方差而这个大方差恰好会导致我们在梯度下降到很差的局部最优点只是微微凸下去的最优点和鞍点的时候不稳定一不小心就因为一个大噪声的到来导致炸出了局部最优点或者炸下了马此处请保持纯洁的心态从而有机会去寻找更优的最优点。 因此与之相反的当样本量很多时方差很小咦最开始的时候好像在说标准差来着反正方差与标准差就差个根号没影响的哈~对梯度的估计要准确和稳定的多因此反而在差劲的局部最优点和鞍点时反而容易自信的呆着不走了从而导致神经网络收敛到很差的点上跟出了bug一样的差劲。 小总结一下batch的size设置的不能太大也不能太小因此实际工程中最常用的就是mini-batch一般size设置为几十或者几百。但是 好像这篇文章的转折有点多了诶(∇)细心的读者可能注意到了这之前我们的讨论是基于梯度下降的而且默认是一阶的即没有利用二阶导数信息仅仅使用一阶导数去优化。因此对于SGD随机梯度下降及其改良的一阶优化算法如Adagrad、Adam等是没问题的但是对于强大的二阶优化算法如共轭梯度法、L-BFGS来说如果估计不好一阶导数那么对二阶导数的估计会有更大的误差这对于这些靠二阶导数吃饭的算法来说是致命的。 因此对于二阶优化算法减小batch换来的收敛速度提升远不如引入大量噪声导致的性能下降因此在使用二阶优化算法时往往要采用大batch哦。此时往往batch设置成几千甚至一两万才能发挥出最佳性能比如小夕曾经试验过做信息抽取中的关系分类分类时batch设置的2048配合L-BFGS取得了比SGD好得多的效果无论是收敛速度还是最终的准确率。 另外听说GPU对2的幂次的batch可以发挥更佳的性能因此设置成16、32、64、128...时往往要比设置为整10、整100的倍数时表现更优不过小夕没有验证过有兴趣的同学可以试验一下~