人工智能:你知道神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的調(diào)參“四重奏”是什么嗎?
數(shù)據(jù)科學(xué)家是人工智能、算法模型、大數(shù)據(jù)挖掘的專家,也是目前人工智能領(lǐng)域受人羨慕、集萬(wàn)般寵愛(ài)于一身的職業(yè),聽(tīng)起來(lái)怎么樣?高端、大氣、上檔次。作為高大上的數(shù)據(jù)科學(xué)家當(dāng)然要附庸風(fēng)雅一些(數(shù)據(jù)科學(xué)家:你在諷刺我嗎??),他們?cè)跈C(jī)器學(xué)習(xí)、模型訓(xùn)練的枯燥工作閑暇之余,也要聽(tīng)聽(tīng)優(yōu)美、高雅的音樂(lè)放松下心情。在公認(rèn)的高雅音樂(lè)中,有一種四重奏樂(lè)曲,它由4種樂(lè)器協(xié)奏,樂(lè)器之間有一定類似的特質(zhì)和旋律,在四位演奏家的高超技藝、默契良好地協(xié)調(diào)合作下,演奏出來(lái)的樂(lè)曲優(yōu)美動(dòng)聽(tīng)、音色純粹美麗,是廣大音樂(lè)愛(ài)好者和藝術(shù)家們最喜愛(ài)的一種樂(lè)曲形式。 在人工智能領(lǐng)域的深度學(xué)習(xí)過(guò)程中,尤其在數(shù)據(jù)科學(xué)家訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),經(jīng)常會(huì)對(duì)神經(jīng)網(wǎng)絡(luò)模型進(jìn)行調(diào)參優(yōu)化,以獲得最佳的模型效果。其中有四類最基本的調(diào)參方法,它們分別是:調(diào)整隱藏層節(jié)點(diǎn)數(shù)、增加隱藏層數(shù)量、調(diào)整激活函數(shù)、調(diào)整模型復(fù)雜度控制。數(shù)據(jù)科學(xué)家經(jīng)常把這四類調(diào)參方法正確有序地組合起來(lái)使用,使它們相互作用、交叉融合,讓神經(jīng)網(wǎng)絡(luò)模型產(chǎn)生了奇妙的效果,此時(shí)數(shù)據(jù)科學(xué)家變身成為模型訓(xùn)練的“藝術(shù)演奏家”,譜寫(xiě)并奏響了神經(jīng)網(wǎng)絡(luò)訓(xùn)練中的調(diào)參“四重奏”。
調(diào)參“四重奏”之“舞臺(tái)”與“樂(lè)器”
首先,我們來(lái)準(zhǔn)備數(shù)據(jù)集和建立訓(xùn)練模型,搭建“四重奏”的“舞臺(tái)”。本文通過(guò)python語(yǔ)言調(diào)用scikit-learn庫(kù)中的紅酒數(shù)據(jù)集,并使用MLP神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行分類模擬訓(xùn)練。scikit-learn庫(kù)中的紅酒數(shù)據(jù)集共有178個(gè)數(shù)據(jù)樣本,它們被歸入三個(gè)類別中,分別是class_0,class_1,和class_2,其中class_0中包含59個(gè)樣本,class_1中包含71個(gè)樣本,class_2中包含48個(gè)樣本。我們開(kāi)始準(zhǔn)備數(shù)據(jù)集,搭建“四重奏舞臺(tái)”。
#導(dǎo)入MLP神經(jīng)網(wǎng)絡(luò)
fromsklearn.neural_network import MLPClassifier
#從sklearn的datasets模塊載入紅酒數(shù)據(jù)集
fromsklearn.datasets import load_wine
fromsklearn.model_selection import train_test_split
#將數(shù)據(jù)集拆分為訓(xùn)練數(shù)據(jù)集和驗(yàn)證數(shù)據(jù)集
X_train,X_test, y_train, y_test = train_test_split(X,y,random_state=42)
mlp= MLPClassifier(solver='lbfgs')
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)
其次,我們?cè)偻ㄋ桌斫庀律窠?jīng)網(wǎng)絡(luò)的這四類基礎(chǔ)調(diào)參的內(nèi)容,對(duì)于四重奏的重要角色——樂(lè)器我們可以比喻為這幾個(gè)基礎(chǔ)參數(shù):
小提琴、中提琴——隱藏層節(jié)點(diǎn)數(shù)、隱藏層數(shù)量(hidden_layer_sizes)。小提琴、中提琴的音色優(yōu)美柔和,在協(xié)奏中兩者配合起來(lái)非常協(xié)和,在神經(jīng)網(wǎng)絡(luò)調(diào)參中,隱藏層節(jié)點(diǎn)數(shù)與層數(shù)也是緊密配合使用,能充分調(diào)節(jié)神經(jīng)網(wǎng)絡(luò)的效果。在上面的運(yùn)行結(jié)果中,就是指hidden_layer_sizes參數(shù)。該參數(shù)值默認(rèn)情況下為[100,],表示模型中只有一個(gè)隱藏層,而隱藏層中的節(jié)點(diǎn)數(shù)是100。如果hidden_layer_sizes定義為[10,10],那就表示模型中有兩個(gè)隱藏層,每層有10個(gè)節(jié)點(diǎn)。
鋼琴——激活函數(shù)(activation)。鋼琴被人們稱作樂(lè)器之王,音色洪亮動(dòng)聽(tīng),在協(xié)奏中能發(fā)揮主要的影響力,在神經(jīng)網(wǎng)絡(luò)調(diào)參中,激活函數(shù)的使用也能起到主要的影響作用。在上面的運(yùn)行結(jié)果中,激活函數(shù)就是activation參數(shù),它是將隱藏單元進(jìn)行非線性化的方法,一共有四種值:“identity”、“l(fā)ogistic”、“tanh”以及“relu”,而在默認(rèn)情況下,參數(shù)值是“relu”。
大提琴——模型復(fù)雜度控制(alpha)。大提琴音色低沉穩(wěn)重,在協(xié)奏中有著深沉的控制力,訓(xùn)練神經(jīng)網(wǎng)絡(luò)的調(diào)參中,對(duì)模型的復(fù)雜度控制也有類似的效果。在上面的運(yùn)行結(jié)果中,模型復(fù)雜度控制就是alpha參數(shù)。它是一個(gè)用來(lái)控制正則化的程度,默認(rèn)的數(shù)值是0.0001。
奏響神經(jīng)網(wǎng)絡(luò)的調(diào)參“四重奏”
下面使用上面搭建好的舞臺(tái)(數(shù)據(jù)集和模型),看看調(diào)參四重奏的表演效果。
print('缺省參數(shù)下MLP模型的測(cè)試數(shù)據(jù)集得分:{:.2f}'.format(mlp.score(X_test,y_test)))
缺省參數(shù)下MLP模型的測(cè)試數(shù)據(jù)集得分:0.96
這個(gè)數(shù)據(jù)集和訓(xùn)練出來(lái)的MLP模型,表現(xiàn)還不錯(cuò)。
2、小提琴獨(dú)奏——隱藏層節(jié)點(diǎn)數(shù)為200的MLP模型
我們嘗試一下修改隱藏層參數(shù)hidden_layer_sizes的節(jié)點(diǎn)數(shù),看看它自己的獨(dú)奏效果(當(dāng)然其他參數(shù)并不是不起作用,而是在幕后充當(dāng)了背景音樂(lè)):
#修改隱藏層參數(shù)hidden_layer_sizes的節(jié)點(diǎn)數(shù)為200
mlp_200=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200])
mlp_200.fit(X_train,y_train)
print('節(jié)點(diǎn)數(shù)為200的MLP模型測(cè)試數(shù)據(jù)集得分:{:.2f}'.format(mlp_200.score(X_test,y_test)))
節(jié)點(diǎn)數(shù)為200的MLP模型測(cè)試數(shù)據(jù)集得分:0.71
好像效果一般,我們?cè)俳又{(diào)整其他參數(shù),開(kāi)始二重奏。
3、小提琴與中提琴協(xié)奏——隱藏層節(jié)點(diǎn)數(shù)為200、層數(shù)為2的MLP模型
#修改隱藏層參數(shù)hidden_layer_sizes的層數(shù)為2、節(jié)點(diǎn)數(shù)為200
mlp_2L=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200,200])
mlp_2L.fit(X_train,y_train)
print('隱藏層數(shù)為2、節(jié)點(diǎn)數(shù)為200的MLP模型測(cè)試數(shù)據(jù)集得分:{:.2f}'.format(mlp_2L.score(X_test,y_test)))
隱藏層數(shù)為2、節(jié)點(diǎn)數(shù)為200的MLP模型測(cè)試數(shù)據(jù)集得分:0.93
模型效果得到明顯的改善,繼續(xù)增加參數(shù)看看三重奏的效果。
4、小提琴、中提琴、鋼琴三重奏——隱藏層節(jié)點(diǎn)數(shù)為200、層數(shù)為2、激活函數(shù)值為tanh的MLP模型
mlp_tanh=MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200,200],
mlp_tanh.fit(X_train,y_train)
print('隱藏層數(shù)為2、節(jié)點(diǎn)數(shù)為200、激活函數(shù)為tanh的MLP模型測(cè)試數(shù)據(jù)集得分:{:.2f}'.format(mlp_tanh.score(X_test,y_test)))
隱藏層數(shù)為2、節(jié)點(diǎn)數(shù)為200、激活函數(shù)為tanh的MLP模型測(cè)試數(shù)據(jù)集得分:0.84
好像有點(diǎn)不和諧了,模型效果反而降低了,也許是這個(gè)數(shù)據(jù)集不能這樣來(lái)調(diào)參吧,繼續(xù)增加參數(shù),嘗試一下四重奏的效果。
5、四重奏——隱藏層節(jié)點(diǎn)數(shù)為200、層數(shù)為2、激活函數(shù)值為tanh、模型復(fù)雜度控制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('隱藏層數(shù)為2、節(jié)點(diǎn)數(shù)為200、激活函數(shù)為tanh、模型復(fù)雜度控制為1的MLP模型測(cè)試數(shù)據(jù)集得分:{:.2f}'.format(mlp_4cz.score(X_test,y_test)))
隱藏層數(shù)為2、節(jié)點(diǎn)數(shù)為200、激活函數(shù)為tanh、模型復(fù)雜度控制為1的MLP模型測(cè)試數(shù)據(jù)集得分:0.82
好像效果也沒(méi)有提高,四重奏沒(méi)有發(fā)揮更大的效果。難道折騰了好一會(huì)的四重奏演奏會(huì)就這樣結(jié)束了,好像有點(diǎn)不甘心。
其實(shí),在神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程中(其他模型訓(xùn)練也一樣),參數(shù)調(diào)整是通過(guò)不斷嘗試和磨合的,現(xiàn)實(shí)情況中,不能是只要覺(jué)得調(diào)整了參數(shù)就會(huì)一定有好的效果,就像作曲家譜寫(xiě)的四重奏樂(lè)章,如果一定要把不合適的樂(lè)器、旋律、節(jié)奏搭配在一起,那么再優(yōu)秀的演奏家,做多大的努力進(jìn)行協(xié)同演奏,也奏不出優(yōu)美動(dòng)聽(tīng)的音樂(lè)來(lái)
注:本文為了幫助讀者朋友方便理解四個(gè)基本調(diào)參方法做的粗淺比喻,并不是指其他參數(shù)就不起作用了,其他參數(shù)都做了背景音樂(lè),在幕后當(dāng)著幕后英雄呢。而且在調(diào)參過(guò)程中,也可以多增加幾個(gè)參數(shù)一起調(diào)節(jié),可以奏響調(diào)參的五重奏、六重奏,甚至是交響樂(lè)團(tuán)演奏。
根據(jù)上述對(duì)MLP神經(jīng)網(wǎng)絡(luò)簡(jiǎn)單的訓(xùn)練過(guò)程,我們可以小結(jié)如下: