神經網絡訓練中的調參“四重奏”

數據科學家是人工智能、算法模型、大數據挖掘的專家,也是目前人工智能領域受人羨慕、集萬般寵愛於一身的職業,聽起來怎麼樣?高端、大氣、上檔次。作爲高大上的數據科學家當然要附庸風雅一些(數據科學家:你在諷刺我嗎?),他們在機器學習、模型訓練的枯燥工作閒暇之餘,也要聽聽優美、高雅的音樂放鬆下心情。在公認的高雅音樂中,有一種四重奏樂曲,它由4種樂器協奏,樂器之間有一定類似的特質和旋律,在四位演奏家的高超技藝、默契良好地協調合作下,演奏出來的樂曲優美動聽、音色純粹美麗,是廣大音樂愛好者和藝術家們最喜愛的一種樂曲形式。

 

在人工智能領域的深度學習過程中,尤其在數據科學家訓練神經網絡時,經常會對神經網絡模型進行調參優化,以獲得最佳的模型效果。其中有四類最基本的調參方法,它們分別是:調整隱藏層節點數、增加隱藏層數量、調整激活函數、調整模型複雜度控制。數據科學家經常把這四類調參方法正確有序地組合起來使用,使它們相互作用、交叉融合,讓神經網絡模型產生了奇妙的效果,此時數據科學家變身成爲模型訓練的“藝術演奏家”,譜寫並奏響了神經網絡訓練中的調參“四重奏”。

 

調參“四重奏”之“舞臺”與“樂器”

首先,我們來準備數據集和建立訓練模型,搭建“四重奏”的“舞臺”。本文通過python語言調用scikit-learn庫中的紅酒數據集,並使用MLP神經網絡來進行分類模擬訓練。scikit-learn庫中的紅酒數據集共有178個數據樣本,它們被歸入三個類別中,分別是class_0,class_1,和class_2,其中class_0中包含59個樣本,class_1中包含71個樣本,class_2中包含48個樣本。我們開始準備數據集,搭建“四重奏舞臺”。

 

輸入代碼如下:

#導入MLP神經網絡

fromsklearn.neural_network import MLPClassifier

#從sklearn的datasets模塊載入紅酒數據集

fromsklearn.datasets import load_wine

wine_data= load_wine()

#導入數據集拆分工具

fromsklearn.model_selection import train_test_split

X=wine_data['data']

y=wine_data['target']

#將數據集拆分爲訓練數據集和驗證數據集

X_train,X_test, y_train, y_test = train_test_split(X,y,random_state=42)

#定義MLP分類器

mlp= MLPClassifier(solver='lbfgs')

mlp.fit(X_train,y_train)

 

運行結果如下:

MLPClassifier(activation='relu',alpha=0.0001,batch_size='auto', beta_1=0.9,beta_2=0.999, early_stopping=False,epsilon=1e-08,

hidden_layer_sizes=(100,),learning_rate='constant',

learning_rate_init=0.001,max_iter=200, momentum=0.9,

n_iter_no_change=10,nesterovs_momentum=True, power_t=0.5,

random_state=None,shuffle=True, solver='lbfgs', tol=0.0001,

validation_fraction=0.1,verbose=False, warm_start=False)

 

其次,我們再通俗理解下神經網絡的這四類基礎調參的內容,對於四重奏的重要角色——樂器我們可以比喻爲這幾個基礎參數:

  • 小提琴、中提琴——隱藏層節點數、隱藏層數量(hidden_layer_sizes)。小提琴、中提琴的音色優美柔和,在協奏中兩者配合起來非常協和,在神經網絡調參中,隱藏層節點數與層數也是緊密配合使用,能充分調節神經網絡的效果。在上面的運行結果中,就是指hidden_layer_sizes參數。該參數值默認情況下爲[100,],表示模型中只有一個隱藏層,而隱藏層中的節點數是100。如果hidden_layer_sizes定義爲[10,10],那就表示模型中有兩個隱藏層,每層有10個節點。
  • 鋼琴——激活函數(activation)。鋼琴被人們稱作樂器之王,音色洪亮動聽,在協奏中能發揮主要的影響力,在神經網絡調參中,激活函數的使用也能起到主要的影響作用。在上面的運行結果中,激活函數就是activation參數,它是將隱藏單元進行非線性化的方法,一共有四種值:“identity”、“logistic”、“tanh”以及“relu”,而在默認情況下,參數值是“relu”。
  • 大提琴——模型複雜度控制(alpha)。大提琴音色低沉穩重,在協奏中有着深沉的控制力,訓練神經網絡的調參中,對模型的複雜度控制也有類似的效果。在上面的運行結果中,模型複雜度控制就是alpha參數。它是一個用來控制正則化的程度,默認的數值是0.0001。

 

奏響神經網絡的調參“四重奏”

下面使用上面搭建好的舞臺(數據集和模型),看看調參四重奏的表演效果。

 

1、缺省參數下的模型測試

print('缺省參數下MLP模型的測試數據集得分:{:.2f}'.format(mlp.score(X_test,y_test)))

輸出結果爲:

缺省參數下MLP模型的測試數據集得分:0.96

這個數據集和訓練出來的MLP模型,表現還不錯。

 

2、小提琴獨奏——隱藏層節點數爲200的MLP模型

我們嘗試一下修改隱藏層參數hidden_layer_sizes的節點數,看看它自己的獨奏效果(當然其他參數並不是不起作用,而是在幕後充當了背景音樂):

#修改隱藏層參數hidden_layer_sizes的節點數爲200

mlp_200=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200])

mlp_200.fit(X_train,y_train)

print('節點數爲200的MLP模型測試數據集得分:{:.2f}'.format(mlp_200.score(X_test,y_test)))

輸出結果爲:

節點數爲200的MLP模型測試數據集得分:0.71

好像效果一般,我們再接着調整其他參數,開始二重奏。

 

3、小提琴與中提琴協奏——隱藏層節點數爲200、層數爲2的MLP模型

#修改隱藏層參數hidden_layer_sizes的層數爲2、節點數爲200

mlp_2L=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200,200])

mlp_2L.fit(X_train,y_train)

print('隱藏層數爲2、節點數爲200的MLP模型測試數據集得分:{:.2f}'.format(mlp_2L.score(X_test,y_test)))

輸出結果爲:

隱藏層數爲2、節點數爲200的MLP模型測試數據集得分:0.93

模型效果得到明顯的改善,繼續增加參數看看三重奏的效果。

 

4、小提琴、中提琴、鋼琴三重奏——隱藏層節點數爲200、層數爲2、激活函數值爲tanh的MLP模型

#增加修改激活函數的值爲tanh

mlp_tanh=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200,200],

 activation='tanh')

mlp_tanh.fit(X_train,y_train)

print('隱藏層數爲2、節點數爲200、激活函數爲tanh的MLP模型測試數據集得分:{:.2f}'.format(mlp_tanh.score(X_test,y_test)))

輸出結果爲:

隱藏層數爲2、節點數爲200、激活函數爲tanh的MLP模型測試數據集得分:0.84

好像有點不和諧了,模型效果反而降低了,也許是這個數據集不能這樣來調參吧,繼續增加參數,嘗試一下四重奏的效果。

 

5、四重奏——隱藏層節點數爲200、層數爲2、激活函數值爲tanh、模型複雜度控制alpha=1的MLP模型

mlp_4cz=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200,200],

 activation='tanh',alpha=1)

mlp_4cz.fit(X_train,y_train)

print('隱藏層數爲2、節點數爲200、激活函數爲tanh、模型複雜度控制爲1的MLP模型測試數據集得分:{:.2f}'.format(mlp_4cz.score(X_test,y_test)))

輸出結果爲:

隱藏層數爲2、節點數爲200、激活函數爲tanh、模型複雜度控制爲1的MLP模型測試數據集得分:0.82

好像效果也沒有提高,四重奏沒有發揮更大的效果。難道折騰了好一會的四重奏演奏會就這樣結束了,好像有點不甘心。

 

6、正確認識調參

其實,在神經網絡訓練過程中(其他模型訓練也一樣),參數調整是通過不斷嘗試和磨合的,現實情況中,不能是隻要覺得調整了參數就會一定有好的效果,就像作曲家譜寫的四重奏樂章,如果一定要把不合適的樂器、旋律、節奏搭配在一起,那麼再優秀的演奏家,做多大的努力進行協同演奏,也奏不出優美動聽的音樂來。

 

:本文爲了幫助讀者朋友方便理解四個基本調參方法做的粗淺比喻,並不是指其他參數就不起作用了,其他參數都做了背景音樂,在幕後當着幕後英雄呢。而且在調參過程中,也可以多增加幾個參數一起調節,可以奏響調參的五重奏、六重奏,甚至是交響樂團演奏。

 

調參四重奏之結語

根據上述對MLP神經網絡簡單的訓練過程,我們可以小結如下:

本文對神經網絡模型中的四種參數調節方法是常用的優化手段,這四種調參需要不斷試驗組合,達到模型最佳。其中隱藏層的數量和隱藏層中節點的數量使用最多,但是神經網絡的隱藏節點個數選取問題至今仍是一個 世界難題,根據經驗,建議神經網絡中隱藏層的節點數與訓練數據集的特徵數量大致相等,但是一般不要超過500。

神經網絡訓練中的調參還有很多方式,比如loss函數的選擇、Regularization、dropout、調節mini-batchsize等等。限於篇幅,這裏不再贅述,有興趣的讀者可以在網絡上查找資料進行操作演練。

本項目使用的MLP神經網絡是一種多層感知器,在實際項目中應用不是太多,讀者朋友可以再使用卷積神經網絡、遞歸神經網絡等算法模型嘗試一下調參效果。

 

喜歡我們的文章嗎?還想了解互聯網哪些技術,歡迎留言告訴我們

【AI課工場】互聯網知識也能如此好玩~

更多熱門互聯網技術文章搶先知微信公衆號【kgc-cn】

 

 

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