如何指导神经网络模型的调优设计?

来源:互联网 发布:我国网络安全形势 编辑:程序博客网 时间:2024/06/06 03:48

本文主要讲解一些参数初始化技巧和超参数的设置技巧,模型的理解和设计技巧,如何去指导我们对模型进行调优设计,如何从高(层数深)胖(卷积核庞大)的模型到高瘦或者矮(层数浅)瘦(卷积核较少)的模型去演变,同时性能得到优化或者保持!


训练的过程和阶段可以分为3个阶段:

欠拟合:模型没有很好地捕捉到数据特征(训练集和验证集的loss都大于0.3)。

刚刚好:模型已经完成了我们的任务,满足要求(训练集和验证集上的loss都小于0.01)。

过拟合:模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了(训练集上loss小于0.01,验证集上loss大于0.3)。

 

遵守的基本原则:快速试错

 

基本流程:

1 小规模数据集和大模型

能用256filter你就别用128.直接奔着过拟合去.没错,就是训练过拟合网络,连测试集验证集这些都可以不用,检验模型流程对不对,是否可以过拟合。

2 LOSS设计要合理

3 观察loss价值大于观察准确率

4 确认分类网络学习充分

表现就是:如果是二分类, 你会发现, 刚开始的网络预测都是在0.5上下, 很模糊. 随着学习过程, 网络预测会慢慢的移动到0,1这种极值附近. 所以, 如果你的网络预测分布靠中间,再学习学习。

5 学习率的设置

6 对比训练集和验证集的loss

7 清楚receptivefield的大小

 

模型的理解技巧:

1 Visualize Layer Activations activationmatrix是否具备sparselocalized的特性(神经元特性的体现)

如果训练出的模型,用于预测某张图片时,发现在卷积层里的某个feature mapactivation matrix可视化以后,基本跟原始输入长得一样,基本就表明出现了一些问题,因为这意味着这个feature map没有学到多少有用的东西。

2 Visualize Layer Weights中卷积层的weightmatrix是否具备smooth的特性

左图存在很多的噪点,右图则比较平滑。出现左图这个情形,往往意味着我们的模型训练过程出现了问题。


3 Retrieving Images That MaximallyActivate a Neuron感受野上的语义亲和性

4.Embedding the Hidden Layer Neuronswith t-SNE

通过t-SNE降维去认识数据。用高斯分布衡量高维和地位空间数据点之间进行数据聚类,得到相似性

5 Occluding Parts of the Image

高层特征如何收敛。每个卷积层学习到了什么东西

眼睛和鼻子与图片内部其他特征存在相关性

6 掩模图片的不同区域对分类预测结果以及feature mapactivationvalue的影响

 

参数初始化技巧:
1 使用xavier

2 使用BN

 

通用技巧:
1 Relu:一个很万能的激活函数,可以很好的防止梯度弥散问题,当然最后一层的激活函数千万慎用relu

2 明确任务目的:如果是连续的用identify(还是叫identity,记不清了),分类的用softmax,拟合回归的话我最后一层也经常不用激活函数,直接wx +b就行

3 Batchnorm:可以大大加快训练速度和模型性能

4 Dropout:(让神经元以一定的概率不工作)防止过拟合,如果不知道怎么设比例的话,就直接设置为0.5

5 Adam:这个优化函数是收敛非常快的一个优化函数

 

简短的注意事项:

1. 预处理: -mean/stdzero-center就够了, PCA, 白化什么的都用不上.我个人观点, 反正CNN能学习encoder, PCA用不用其实关系不大, 大不了网络里面自己学习出来一个.

2. shuffle, shuffle,shuffle.

3. 网络原理的理解最重要, CNN的conv这块, 你得明白sobel算子的边界检测.

4. Dropout, Dropout,Dropout(不仅仅可以防止过拟合, 其实这相当于做人力成本最低的Ensemble, 当然, 训练起来会比没有Dropout的要慢一点, 同时网络参数你最好相应加一点, 对, 这会再慢一点).

5. CNN更加适合训练回答是否的问题, 如果任务比较复杂, 考虑先用分类任务训练一个模型再finetune.

6. 无脑用ReLU(CV领域).

7. 无脑用3x3.

8. 无脑用xavier.

9. LRN一类的, 其实可以不用. 不行可以再拿来试试看.

10.filter数量2^n.

11.多尺度的图片输入(或者网络内部利用多尺度下的结果)有很好的提升效果.

12.第一层的filter, 数量不要太少. 否则根本学不出来(底层特征很重要).

13.sgd adam 这些选择上, 看你个人选择. 一般对网络不是决定性的. 反正我无脑用sgd + momentum.

14.batch normalization我一直没用, 虽然我知道这个很好, 我不用仅仅是因为我懒. 所以要鼓励使用batch normalization.

15.不要完全相信论文里面的东西. 结构什么的觉得可能有效果, 可以拿去试试.

16.你有95%概率不会使用超过40层的模型.

17.shortcut的联接是有作用的.

18.暴力调参最可取, 毕竟, 自己的生命最重要. 你调完这个模型说不定过两天这模型就扔掉了.

19.机器, 机器, 机器.

20.Google的inception论文, 结构要好好看看.

21.一些传统的方法, 要稍微了解了解. 我自己的程序就用过1x14的手写filter, 写过之后你看看inception里面的1x7, 7x1 就会会心一笑...

 

一方面我们能够看到DLmodel应用的门槛相较于shallow model要高,另一方面能够看到这个领域的快速进展。所以对这个领域的技术进展保持及时的跟进,对于模型的设计调优以及在业务中的真正应用会有着重要的帮助。像LRGBDT这种经典的shallow model那样,搞明白基本建模原理就可以捋起袖子在业务中开搞,不需要再分配太多精力关注模型技术的进展的工作方式,在当下的DL建模场景,我个人认为这种技术工作的模式并不适合。也许未来随着技术、工具平台的进步,可以把DL也做得更为易用,到那时,使用DL建模的人也能跟现在使用shallowmodel一样,可以从模型技术方面解放出更多精力,用于业务问题本身了。

 

参考链接:

1 http://blog.csdn.net/willduan1/article/details/53070777
2 https://www.zhihu.com/question/25097993/answer/127374415