【轉】一些因素對F1值的影響

原文鏈接:https://blog.csdn.net/qq_27590277/article/details/88374695

截自: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,詞被映射到的向量空間的大小

2.因爲神經網路要學習到訓練文本的每一個細節,這樣會導致在文本數量很多的時候,出現過擬合現象。爲了避免這樣的現象,本文調參採用了dropout方法。Dropout使網絡的部分連接部分節點的權重爲0,導致該節點失活,從而達到防止過擬合的效果。設置每層神經網絡不失活節點比例爲x,則dropout=x。將dropout層加入到Embedding層和biLSTM層,防止兩者過擬合。

3.隱層裏參數的個數即hidden_size。hidden_size越大,訓練的精度越高,但是也就會越容易過擬合。所以這些也需要通過調參來選擇最好的參數。

4.批處理的大小batch_size,這裏表示一批性處理多少訓練語料。不同數據量的batch大小不同,batch越大GPU訓練速度越快,但是精度可能會降低,所以需要通過調參來決定具體選擇的大小爲多少。

5.隱藏層的數量hidden_num,數量越大,訓練速度越慢,一般很有可能出現過擬合現象。在簡單的網絡中,一般隱藏層數爲1即可,但是也要看看層數爲2的效果,不好的話,就用1層隱藏層。所以,這裏需要通過調參獲得。

6.權重衰退weight_decay,爲了防止過擬合,在原本損失函數的基礎上,加上L2正則化,而weight_decay就是這個正則化的lambda參數,一般設置爲1e-8,所以調參的時候調整是否使用權重衰退即可。

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機制。

8.學習率衰退lr_decay,一般設置爲1e-8,公式爲:

    lr = lr/(1+step*lr_decay)#lr爲學習率,step爲當前迭代次數

因爲一般情況下循環迭代次數越多的時候,學習率的步伐就應該越來越小,這樣才能慢慢接近函數的極值點,。但是有時候也不一定會有效,所以這裏需要通過調參來查看是否需要開啓lr_decay。

9.外部詞向量,即提前提前訓練好的詞向量,這裏指word2vec。因爲以前自然語言處理用的是one-hot方法進行對每個詞進行編碼向量化的,維度爲1*字典大小,就一位是1其餘位都爲0,但是這樣在數據量大的情況下會讓計算機達到難以計算困難的情況,而且每個詞都是獨立存在的,之間沒有計算相似度的可能性。所以Word2vec在2012年被Google提出來,目的是將文本生成詞向量模型,其中包括兩個模型,分別是CBOW(continous bag of words)和Skip-Gram。這兩個模型分別從兩個不同的角度建立詞向量模型。其中CBOW是通過一個或多個單詞的上下文來對這個詞進行預測,而這裏用的正是CBOW方法訓練的詞向量。


所以最終選擇的參數爲:

 

 

這些神經網絡調參細節,你都瞭解了嗎

神經網絡調參的一些細節問題,特來總結下。主要從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實現代碼:

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代碼爲:

數據對比:

依然那句話,不是所有的數據集都會有好的效果,需要自己調試,選擇適合自己模型的參數。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章