作者:知乎 CVer
原文链接:请点击
本文仅作为学术分享,如果侵权,会删文处理
Qustion 深度学习调参有哪些技巧?
深度学习的效果很大程度上取决于参数调节的好坏,那么怎么才能最快最好的调到合适的参数呢?求解
Answer 1 作者:Jarvix
只想说一句:初始化
一次惨痛的教训是用normal初始化cnn的参数,最后acc只能到70%多,仅仅改成xavier,acc可以到98%。
还有一次给word embedding初始化,最开始使用了TensorFlow中默认的initializer(即glorot_uniform_initializer,也就是大家经常说的无脑使用xavier),训练速度慢不说,结果也不好。改为uniform,训练速度飙升,结果也飙升。
所以,初始化就跟黑科技一样,用对了超参都不用调;没用对,跑出来的结果就跟模型有bug一样不忍直视。
Answer 2 作者:BBuf
大概调了快一年CNN(2019年1月到今天),看到这个话题挺感兴趣的,以下是我的总结
做比赛
VGG16
提取出的特征向量维度是
[N,c1]
,
ResNet50
提取的特征向量维度是
[N,c2]
,
Xception
提取的特征向量维度是
[N, c3]
,那么我们可以使用三个系数
a、b、c
将其组合为形状为
[N, a*c1+b*c2+c*c3]
,其中
a、b、c
三个参数的取值代表我们使用哪个模型的特征多一些,如果是分类回归比赛,我们在后面接特征处理网络就可以了。可以取不同的
a、b、c
得到不同的特征,然后对结果做
voting
,
soft-voting
等多种处理,一般结果不会太差啦。
batch_size
,优化器)训练出不同模型,然后做ensemble。
因为我就做了一点点入门级比赛,上面介绍的方法取得了还不错的结果,所以我就在这里献丑啦,方法确实挺无脑的,大家笑一笑就好啦。继续想了下,我好像除了这些有接触或者使用到,暂时没有什么其它的了,如果想起其他的了,之后补充下。
Answer 3 作者:Captain Jack
我和@杨军类似, 也是半路出家. 现在的工作内容主要就是使用CNN做CV任务. 干调参这种活也有两年时间了. 我的回答可能更多的还是侧重工业应用, 技术上只限制在CNN这块.
先说下我的观点, 调参就是trial-and-error. 没有其他捷径可以走. 唯一的区别是有些人盲目的尝试, 有些人思考后再尝试. 快速尝试, 快速纠错 这是调参的关键.
看了杨军的回答. 对于这个回答, 下面的评论里面@纪秋佳说的很对. 这个回答主要内容更多的是侧重理解网络. 而非训练网络.
我要再强调下, 杨军的回答更多的涉及是理解网络而非训练网络 . 是的, 没错. 你看完回答中的所有内容, 对不起, 你还是不知道怎么实际训练一个网络, 尤其是复杂任务下的网络(因为简单任务根本不需要, 直接上来效果就会很好, 除非你要刷简单任务的排行榜).
我个人的理解, 对于可视化, 更多的还是帮助人类以自己熟悉的方式来观察网络. 因为, 你是不可能边观察网络, 还边调参的. 你只是训练完成后(或者准确率到达一个阶段后), 才能可视化. 在这之前, 网络没有学习到良好的参数, 你可视化了也没意义, 网络达到不错的准确率了, 你看看其实也就听个响. 同样, 你的网络训练的一塌糊涂, 你可视化也没什么意义, 唯一能够看到的就是中间结果乱七八糟, 或者全黑全白, 这时候你直接看最后准确率就可以知