阅读大概需要4分钟

跟随小博主,每天进步一丢丢
今天在写本科毕业论文的时候又回顾了一下神经网络调参的一些细节问题,特来总结下。主要从weight_decayclip_normlr_decay说起。
以前刚入门的时候调参只是从hidden_sizehidden_numbatch_sizelrembed_size开始调,但是后来才逐渐明白embed_size一般是设置完后不用再调的,比如设定为128后,就不要调了,因为embed_size只是表示将词嵌入到几维的空间而已。lr也一般都有固定值,比如选取优化器Adam的时候,lr=0.001,选取优化器SGD的时候,lr=0.01hidden_num一般设置为1的时候就行,2层以上在简单的网络上只会到的适得其反的效果。
所以剩下该调的也只有hidden_size,batch_size,weight_decay,clip_norm,lr_decay了。但是hidden_size,batch_size大家应该知道怎么调,这里就不讲了。还有其他的调参细节部分,等以后详细用到了再总结给大家。
weight_decay
weight_decay权重衰退。为了防止过拟合,在原本损失函数的基础上,加上L2正则化,而weight_decay就是这个正则化的lambda参数,一般设置为1e-8,所以调参的时候调整是否使用权重衰退即可。这个防止过拟合的正则化我之前和dropout一起讲过的,想要巩固下,点这里
pytorch实现代码:
self.HyperParams里封装的就是我的所有参数,而decay是这里说的weight_decay,值为1e-8.
对weight_decay我做了实验,数据对比
F1为一个评测值,想了解的更加详细的,点这里
可以从实验看出weight_decay还是有点效果的,但不是对所有的试验有效果,所以这也是调参的一部分。
clip_norm
clip_grad修剪梯度,为了防止梯度爆炸(gradient explosion)
原理为:损失函数反向传播的时候,使得每个参数都有了梯度gradient,如果所有的梯度平方和sum_sq_gradient大于clip_grad,那么求出缩放因子:
接着改变每个gradient,使每个gradient都乘scale_factor,达到缩放的效果,使每个梯度的sum_sq_gradient都被限制在clip_grad里,来达到防止梯度爆炸的效果。通常设置为10,那么调参的内容为是否需要clip_grad机制。
pytorch代码为(只看红框框里的就行):
接整个图的目的是表示在哪里用这个函数。在网络获得损失,并进行后向传播梯度后用该方法,之后进行优化,更新参数即可。
数据对比
可以看出有那么一丢丢效果。随着不同的数据集,效果还是不一样的。
lr_decay
lr_decay学习率衰退,一般设置为1e-8,公式为:
其中,lr为学习率,step为当前迭代次数

因为一般情况下循环迭代次数越多的时候,学习率的步伐就应该越来越小,这样才能慢慢接近函数的极值点,。但是有时候也不一定会有效,所以这里需要通过调参来查看是否需要开启lr_decay。
pytorch代码为:
数据对比:
依然那句话,不是所有的数据集都会有好的效果,需要自己调试,选择适合自己模型的参数。
IELTS a bit
chill n.寒冷;寒意;寒心
       adj.寒冷的;冷漠的;扫兴的

       vt.冷冻,冷藏;使寒心,使感到冷

       vi.冷藏;变冷

prescription n.药方;指示;惯性
mantle n.地幔;斗篷;覆盖物
            vi. 覆盖;脸红

            vt.覆盖

            n.人名;曼特尔

ascend vi.上升;登高;追溯
            vt.攀登;上升

hypothesis n. 假设
推荐阅读:

欢迎关注深度学习自然语言处理公众号,我会每天更新自己在机器学习深度学习NLPlinuxpython以及各种数学知识学习的一点一滴!再小的人也有自己的品牌!期待和你一起进步!
长按识别二维码
点个赞呗
继续阅读
阅读原文