【转】一些因素对F1值的影响

时间:2024-03-26 13:37:25

截自:https://blog.csdn.net/qq_27590277/article/details/88374695

https://blog.csdn.net/qq_27590277/article/details/88367082

 

一些因素对F1值的影响

如果还没了解F1值的话,这里有我之前写的通俗易懂的文章

详谈P(查准率),R(查全率),F1值

通过控制变量法,对以下因素进行测试:

1.词向量维度,embed_size即Word Embedding size,词被映射到的向量空间的大小

【转】一些因素对F1值的影响

2.因为神经网路要学习到训练文本的每一个细节,这样会导致在文本数量很多的时候,出现过拟合现象。为了避免这样的现象,本文调参采用了dropout方法。Dropout使网络的部分连接部分节点的权重为0,导致该节点失活,从而达到防止过拟合的效果。设置每层神经网络不失活节点比例为x,则dropout=x。将dropout层加入到Embedding层和biLSTM层,防止两者过拟合。
【转】一些因素对F1值的影响

3.隐层里参数的个数即hidden_size。hidden_size越大,训练的精度越高,但是也就会越容易过拟合。所以这些也需要通过调参来选择最好的参数。

【转】一些因素对F1值的影响

4.批处理的大小batch_size,这里表示一批性处理多少训练语料。不同数据量的batch大小不同,batch越大GPU训练速度越快,但是精度可能会降低,所以需要通过调参来决定具体选择的大小为多少。

【转】一些因素对F1值的影响

5.隐藏层的数量hidden_num,数量越大,训练速度越慢,一般很有可能出现过拟合现象。在简单的网络中,一般隐藏层数为1即可,但是也要看看层数为2的效果,不好的话,就用1层隐藏层。所以,这里需要通过调参获得。

【转】一些因素对F1值的影响

6.权重衰退weight_decay,为了防止过拟合,在原本损失函数的基础上,加上L2正则化,而weight_decay就是这个正则化的lambda参数,一般设置为1e-8,所以调参的时候调整是否使用权重衰退即可。

【转】一些因素对F1值的影响

7.修剪梯度clip_grad,为了防止梯度爆炸(gradient explosion)。原理为:损失函数反向传播的时候,使得每个参数都有了梯度gradient,如果所有的梯度平方和sum_sq_gradient大于clip_grad,那么求出缩放因子:

    scale_factor = clip_grad / sum_sq _gradient

    接着改变每个gradient,使每个gradient都乘scale_factor,达到缩放的效果,使每个梯度的sum_sq_gradient都被限制在clip_grad里,来达到防止梯度爆炸的效果。通常设置为10,那么调参的内容为是否需要clip_grad机制。

【转】一些因素对F1值的影响

8.学习率衰退lr_decay,一般设置为1e-8,公式为:

    lr = lr/(1+step*lr_decay)#lr为学习率,step为当前迭代次数

因为一般情况下循环迭代次数越多的时候,学习率的步伐就应该越来越小,这样才能慢慢接近函数的极值点,。但是有时候也不一定会有效,所以这里需要通过调参来查看是否需要开启lr_decay。
【转】一些因素对F1值的影响

9.外部词向量,即提前提前训练好的词向量,这里指word2vec。因为以前自然语言处理用的是one-hot方法进行对每个词进行编码向量化的,维度为1*字典大小,就一位是1其余位都为0,但是这样在数据量大的情况下会让计算机达到难以计算困难的情况,而且每个词都是独立存在的,之间没有计算相似度的可能性。所以Word2vec在2012年被Google提出来,目的是将文本生成词向量模型,其中包括两个模型,分别是CBOW(continous bag of words)和Skip-Gram。这两个模型分别从两个不同的角度建立词向量模型。其中CBOW是通过一个或多个单词的上下文来对这个词进行预测,而这里用的正是CBOW方法训练的词向量。

【转】一些因素对F1值的影响


所以最终选择的参数为:

【转】一些因素对F1值的影响

 

 

这些神经网络调参细节,你都了解了吗

神经网络调参的一些细节问题,特来总结下。主要从weight_decay、clip_norm、lr_decay说起。

以前刚入门的时候调参只是从hidden_size、hidden_num、batch_size、lr、embed_size开始调,但是后来才逐渐明白:

embed_size一般是设置完后不用再调的,比如设定为128后,就不要调了,因为embed_size只是表示将词嵌入到几维的空间而已。

lr也一般都有固定值,比如选取优化器Adam的时候,lr=0.001,选取优化器SGD的时候,lr=0.01,

hidden_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实现代码:

【转】一些因素对F1值的影响

self.HyperParams里封装的就是我的所有参数,而decay是这里说的weight_decay,值为1e-8.

对weight_decay我做了实验,数据对比:

【转】一些因素对F1值的影响

F1为一个评测值,想了解的更加详细的,点这里

可以从实验看出weight_decay还是有点效果的,但不是对所有的试验有效果,所以这也是调参的一部分。

 

clip_norm
clip_grad即修剪梯度,为了防止梯度爆炸(gradient explosion)。

原理为:损失函数反向传播的时候,使得每个参数都有了梯度gradient,如果所有的梯度平方和sum_sq_gradient大于clip_grad,那么求出缩放因子:
【转】一些因素对F1值的影响

接着改变每个gradient,使每个gradient都乘scale_factor,达到缩放的效果,使每个梯度的sum_sq_gradient都被限制在clip_grad里,来达到防止梯度爆炸的效果。通常设置为10,那么调参的内容为是否需要clip_grad机制。

pytorch代码为(只看红框框里的就行):
【转】一些因素对F1值的影响

接整个图的目的是表示在哪里用这个函数。在网络获得损失,并进行后向传播梯度后用该方法,之后进行优化,更新参数即可。

数据对比:

【转】一些因素对F1值的影响

可以看出有那么一丢丢效果。随着不同的数据集,效果还是不一样的。

 

lr_decay

lr_decay学习率衰退,一般设置为1e-8,公式为:

【转】一些因素对F1值的影响

其中,lr为学习率,step为当前迭代次数

因为一般情况下循环迭代次数越多的时候,学习率的步伐就应该越来越小,这样才能慢慢接近函数的极值点,。但是有时候也不一定会有效,所以这里需要通过调参来查看是否需要开启lr_decay。

pytorch代码为:

【转】一些因素对F1值的影响

数据对比:

【转】一些因素对F1值的影响

依然那句话,不是所有的数据集都会有好的效果,需要自己调试,选择适合自己模型的参数。