【说在前面】本人博客新手一枚,象牙塔的老白,职业场的小白。如下内容仅为我的看法,欢迎批评指正,不喜勿喷![认真看图][认真看图]html
【补充说明】深度学习有多火,我就很少说了。本文主要介绍深度学习项目实践过程当中可能遇到的一些组件及使用技巧!python
梯度降低的通用计算公式以下:面试
其中,是学习率,
是梯度。梯度降低彻底依赖于当前的梯度,因此
可理解为容许当前梯度多大程度影响参数更新。算法
梯度降低主要包含三种梯度降低:网络
(1)批量梯度降低(Batch Gradient Descent)cors
(2)随机梯度降低(Stochastic Gradient Descent)框架
(3)小批量梯度降低(Mini-Batch Gradient Descent):这个最经常使用机器学习
梯度降低的缺点:函数
Momentum是模拟物理里动量的概念,公式以下:post
其中,是动量因子。Momentum积累以前的动量来替代真正的梯度。
Momentum有以下特色:
总的来讲,Momentum能够加速SGD算法的收敛速度,而且下降SGD算法收敛时的震荡。
将上一节中的公式展开可得:
能够看出,Momentum并无直接改变当前梯度。Nesterov的改进就是让以前的动量直接影响当前的动量。即:
其中,加上Nesterov项后,梯度在大的跳跃后,再计算当前梯度进行校订。
Nesterov有以下特色:
总的来讲,Nesterov项在梯度更新时作了一个校订,避免前进太快,同时提升灵敏度。
Adagrad对学习率进行了一个约束。即:
其中,对从1到
进行一个递推,造成一个约束项regularizer,
用来保证分母非0。
Adagrad有以下特色:
Adagrad的缺点:
Adadelta是对Adagrad的扩展,它主要解决了adagrad算法单调递减学习率的问题。Adagrad会累加以前全部的梯度平方,而Adadelta只累加固定大小的项,而且也不直接存储这些项,仅仅是近似计算对应的平均值。即:
其中,Adadelta仍是依赖于全局学习率,可是作了必定处理,通过近似牛顿迭代法以后:
其中,表明求指望。此时,能够看出Adadelta已经不用依赖于全局学习率了。
Adadelta还有以下特色:
RMSprop能够算做Adadelta的一个特例,一样是用于解决adagrad算法学习率消失的问题。
当时,
就变为了求梯度平方和的平均数。
若是再求根的话,就变成了RMS(均方根):
此时,这个RMS就能够做为学习率的一个约束:
RMSprop有以下特色:
Adam本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每一个参数的学习率。
通过偏置校订后,每一次迭代学习率都有个肯定范围,使得参数比较平稳。公式以下:
其中,,
分别是对梯度的一阶矩估计和二阶矩估计,能够看做对指望
,
的估计;
,
是对
,
的校订,这样能够近似为对指望的无偏估计。 能够看出,直接对梯度的矩估计对内存没有额外的要求,并且能够根据梯度进行动态调整,而
对学习率造成一个动态约束,并且有明确的范围。
Adam有以下特色:
例如Adamax(Adam的一种变体)、Nadam(相似于带有Nesterov动量项的Adam)等,这里不展开了。
发现这么写下去,篇幅太大了,因此找到一张图,归纳一下吧:
经常使用的主要是这些吧,各类激活函数的特色看图也显而易见,其余的(例如PReLU等)就不拓展了。
即增大训练集的规模,实在难以得到新数据也可使用数据集加强的方法。
例如能够对图像数据集采用水平/垂直旋转/翻转、随机改变亮度和颜色、随机模糊图像、随机裁剪等方法进行数据集加强。
正则化,就是在原来的loss function的基础上,加上了一些正则化项或者称为模型复杂度惩罚项。
以线性回归为例,优化目标:
min
加上L1正则项(lasso回归):
min
加上L2正则项(岭回归):
min
其中,L1范数更容易获得稀疏解(解向量中0比较多);L2范数能让解比较小(靠近0),可是比较平滑(不等于0)。
Dropout提供了一个简单的方法来提高性能。其实至关于作简单的Ensemble,但训练速度会慢一些。
剩下就是选择合适的模型和网络结构了,甚至能够采用多模型融合等思路。
解决Sigmoid函数存在的梯度消失/爆炸问题。
Hinton为了解决梯度的问题,提出采起无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出做为输入,而本层隐节点的输出做为下一层隐节点的输入,此过程就是逐层“预训练”。在预训练完成后,再对整个网络进行“微调”。
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,而后更新梯度的时候,若是梯度超过这个阈值,那么就将其强制限制在这个范围以内。另一种解决梯度爆炸的手段是采用权重正则化,比较常见的是L1正则和L2正则,以上已经提到了。
对每一层的输出作scale和shift的方法,经过必定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到接近均值为0方差为1的标准正太分布,即严重偏离的分布强制拉回比较标准的分布。这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会致使损失函数较大的变化,使得让梯度变大,避免梯度消失问题产生。并且梯度变大意味着学习收敛速度快,能大大加快训练速度。
Resnet
若是你但愿训练一个更深更复杂的网络,那么残差块绝对是一个重要的组件,它可让你的网络训练的更深。
我在序列模型专题有介绍到LSTM,这里再也不赘述。
有一些经常使用的初始化方法:
初始化很重要,知乎大佬们的惨痛教训:
能够采用迁移学习预训练的方式。说到这里,我以后想写一个迁移学习的专题。
就是0均值和1方差化。主要是为了公平对待每一个特征、使优化过程变得平稳、消除量纲影响等。
在训练的过程当中,若是数据很整齐,那每次学习到的特征都是与某一个特征相关,会让学习效果有所误差。
所以,通常在训练的过程当中,建议要将数据打乱,这样才可以更好的实现泛化能力。
通常建议从一个正常大小的学习率开始,朝着终点不断缩小。
batch_size会影响优化过程,建议值取64和128等,过小训练速度慢,太大容易过拟合。
当Sigmoid函数和MSE一块儿使用时会出现梯度消失。缘由以下:
MSE对参数的偏导:
corss-entropy对参数的偏导:
以上,相对于Sigmoid求损失函数,在梯度计算层面上,交叉熵对参数的偏导不含对Sigmoid函数的求导,而均方偏差MSE等则含有Sigmoid函数的偏导项。同时,Sigmoid的值很小或者很大时梯度几乎为零,这会使得梯度降低算法没法取得有效进展,交叉熵则避免了这一问题。
为了弥补Sigmoid 型函数的导数形式易发生饱和的缺陷,能够引入Softmax做为预测结果,再计算交叉熵损失。因为交叉熵涉及到计算每一个类别的几率,因此在神经网络中,交叉熵与Softmax函数紧密相关。
例如训练时能够先用一小部分数据集跑,看看损失的变化趋势,有助于更快找到错误并调整网络结构等技巧。
另外,看到一张不一样参数对于网络训练的影响程度图,分享一下:
最后,虽然有不少组件和技巧能够方便使用(框架中通常都封装好了),可是仍是须要注意各组件、技巧之间的灵活组合,才能取得最佳结果。
若是您对数据挖掘感兴趣,欢迎浏览个人另几篇博客:数据挖掘比赛/项目全流程介绍
若是你对智能推荐感兴趣,欢迎先浏览个人另几篇随笔:智能推荐算法演变及学习笔记
若是您对人工智能算法感兴趣,欢迎浏览个人另外一篇博客:人工智能新手入门学习路线和学习资源合集(含AI综述/python/机器学习/深度学习/tensorflow)、人工智能领域经常使用的开源框架和库(含机器学习/深度学习/强化学习/知识图谱/图神经网络)
若是你是计算机专业的应届毕业生,欢迎浏览个人另一篇博客:若是你是一个计算机领域的应届生,你如何准备求职面试?
若是你是计算机专业的本科生,欢迎浏览个人另一篇博客:若是你是一个计算机领域的本科生,你能够选择学习什么?
若是你是计算机专业的研究生,欢迎浏览个人另一篇博客:若是你是一个计算机领域的研究生,你能够选择学习什么?
若是你对金融科技感兴趣,欢迎浏览个人另外一篇博客:若是你想了解金融科技,不妨先了解金融科技有哪些可能?
以后博主将持续分享各大算法的学习思路和学习笔记:hello world: 个人博客写做思路