標籤:

自動調參、ROC——2017.03.13

小樣本序列數據的LSTM超參數調優

參考資料:

  • zhuanlan.zhihu.com/p/24

  • zhuanlan.zhihu.com/p/20

1. 自動調參方法

  • Gird Search: 實現簡單,遍歷原理,但是耗時,遍歷所有參數組合不太現實;

  • Random Search: 實際操作時先用Gird Search的方法,得到所有候選參數,然後每次從中隨機選擇進行訓練,比Gird Search更有效;

  • Bayesian Optimization考慮到了不同參數對應的實驗結果值,因此更節省時間,和Gird Search相比簡直就是老牛和跑車的區別。推薦了兩個實現貝葉斯調參的Python庫,可以上手即用:① jaberg/hyperopt——比較簡單;② fmfn/BayesianOptimization, 比較複雜,支持並行調參。

最後總結是:使用Random Search來搜索最優超參數,分階段從粗(較大超參數範圍訓練較少周期)到細(較小超參數範圍訓練較長周期)進行搜索。

2. 手動調參經驗參數

  • learning rate: 1 0.1 0.01 0.001, 一般從1開始嘗試。很少見learning rate大於10的。學習率一般要隨著訓練進行衰減。衰減係數一般是0.5。 衰減時機,可以是驗證集準確率不再上升時,或固定訓練多少個周期以後。 不過更建議使用自適應梯度方法,例如adam, adadelta, rmsprop等,這些一般使用相關論文提供的默認值即可,可以避免再費勁調節學習率。對RNN來說,有個經驗,如果RNN要處理的序列比較長,或者RNN層數比較多,那麼learning rate一般小一些比較好,否則有可能出現結果不收斂,甚至Nan等問題。
  • 網路層數: 先從1層開始。

  • 每層結點數: 16 32 128,超過1000的情況比較少見。超過1W的從來沒有見過。

  • batch size: 128上下開始。batch size值增加,的確能提高訓練速度。但是有可能收斂結果變差。如果顯存大小允許,可以考慮從一個比較大的值開始嘗試。因為batch size太大,一般不會對結果有太大的影響,而batch size太小的話,結果有可能很差。

  • clip c(梯度裁剪): 限制最大梯度,其實是value = sqrt(w1^2+w2^2….),如果value超過了閾值,就算一個衰減系係數,讓value的值等於閾值: 5,10,15

  • dropout: 0.5

  • L2正則:1.0,超過10的很少見。

  • 詞向量embedding大小:128,256

  • 正負樣本比例: 這個是非常忽視,但是在很多分類問題上,又非常重要的參數。很多人往往習慣使用訓練數據中默認的正負類別比例,當訓練數據非常不平衡的時候,模型很有可能會偏向數目較大的類別,從而影響最終訓練結果。除了嘗試訓練數據默認的正負類別比例之外,建議對數目較小的樣本做過採樣,例如進行複製。提高他們的比例,看看效果如何,這個對多分類問題同樣適用。 在使用mini-batch方法進行訓練的時候,盡量讓一個batch內,各類別的比例平衡,這個在圖像識別等多分類任務上非常重要。

---------------------------------------------------------------------------------------------------------------------------

ROC

下圖是一個示例,圖中共有20個測試樣本,「Class」一欄表示每個測試樣本真正的標籤(p表示正樣本,n表示負樣本),「Score」表示每個測試樣本屬於正樣本的概率。

接下來,我們從高到低,依次將「Score」值作為閾值threshold,當測試樣本屬於正樣本的概率大於或等於這個threshold時,我們認為它為正樣本,否則為負樣本。舉例來說,對於圖中的第4個樣本,其「Score」值為0.6,那麼樣本1,2,3,4都被認為是正樣本,因為它們的「Score」值都大於等於0.6,而其他樣本則都認為是負樣本。每次選取一個不同的threshold,我們就可以得到一組FPR和TPR,即ROC曲線上的一點。這樣一來,我們一共得到了20組FPR和TPR的值,將它們畫在ROC曲線的結果如下圖:

當我們將threshold設置為1和0時,分別可以得到ROC曲線上的(0,0)和(1,1)兩個點。將這些(FPR,TPR)對連接起來,就得到了ROC曲線。當threshold取值越多,ROC曲線越平滑。

其實,我們並不一定要得到每個測試樣本是正樣本的概率值,只要得到這個分類器對該測試樣本的「評分值」即可(評分值並不一定在(0,1)區間)。評分越高,表示分類器越肯定地認為這個測試樣本是正樣本,而且同時使用各個評分值作為threshold。我認為將評分值轉化為概率更易於理解一些。

計算ROC:訓練數據x_test,標籤y_test

from keras.models import Sequentialfrom sklearn.metrics import roc_curve, roc_auc_scoreimport matplotlib.pyplot as pltlstmModel = Sequential()predictProba = lstmModel.predict_proba(x_test, batch_size = batch_size, verbose = 1)fpr, tpr, thresholds = roc_curve(y_test, predictProba, pos_label = 1)# specify the positive classaucScore = roc_auc_score(y_test, predictProba)lw = 2#linewidthplt.clf()#Empty the current image( .cla():used to empty the current coordinates)plt.title("ROC curve (AUC = %.4f)" % (aucScore))plt.xlabel("False Positive Rate")plt.ylabel("True Positive Rate")plt.ylim([0.0, 1.0])#fix the range of the coordinatesplt.xlim([0.0, 1.0])plt.plot(fpr, tpr, color=navy, lw = lw, label = Sat)plt.legend(loc="lower right")plt.savefig("roc.png", dpi=75)plt.show()

圖:

  • 公式1:Precision^{+}=PPV=frac{TP}{TP+FP}
  • 公式2:Precision^{-}=NPV=frac{TN}{TN+FN}
  • 公式3:Recall^{+}=TPR = frac{TP}{TP+FN}  =1-FNR
  • 公式4:Recall^{-}=TNR = frac{TN}{TN+FP}  =1-FPR
  • 公式5:F1=frac{2	imes Precision	imes Recall}{Precision+Recall}

Precision and Recall

防止分母為0 ↓

prec = float(cntfr) / (cntf + 1E-12)

recl = float(cntfr) / (cntr + 1E-12)

---------------------------------------------------------------------------------------------------------------------------


推薦閱讀:

知識布局-tensorflow-梯度下降
提升方法(AdaBoost)
馬庫斯:DeepMind新出的機器心智網路不錯,但有誤導性
過擬合與模型容量
2018AI學習清單丨150個最好的機器學習和Python教程

TAG:機器學習 |