隱含層,指除輸入、輸出層外,的中間層。輸入、輸出層對(duì)外可見(jiàn)。隱含層對(duì)外不可見(jiàn)。理論上,只要隱含層節(jié)點(diǎn)足夠多,只有一個(gè)隱含層,神經(jīng)網(wǎng)絡(luò)可以擬合任意函數(shù)。隱含層越多,越容易擬合復(fù)雜函數(shù)。擬合復(fù)雜函數(shù),所需隱含節(jié)點(diǎn)數(shù),隨隱含層數(shù)量增多指數(shù)下降。
過(guò)擬合,模型預(yù)測(cè)準(zhǔn)確率在訓(xùn)練集上升,在測(cè)試集下降。泛化性不好,模型記憶當(dāng)前數(shù)據(jù)特征,不具備推廣能力。參數(shù)太多。Hinton教授團(tuán)隊(duì),Dropout。隨便丟棄部分輸出數(shù)據(jù)節(jié)點(diǎn)。創(chuàng)造新隨機(jī)樣本,增大樣本量,減少特征數(shù)量,防止過(guò)擬合。bagging方法,對(duì)特征新種采樣。
SGD參數(shù)難調(diào)試,SGD設(shè)置不同學(xué)習(xí)速率,結(jié)果可能差異巨大。神經(jīng)網(wǎng)絡(luò)很多局部最優(yōu)解可以達(dá)到比較好分類(lèi)效果,全局最優(yōu)反而容易過(guò)擬合。Adagrad、Adam、Adadelta自適應(yīng)方法,減輕調(diào)試參數(shù)負(fù)擔(dān)。SGD需要調(diào)試學(xué)習(xí)速率、Momentum、Nesterov參數(shù)。
梯度彌散(Gradient Vanishment)。Sigmoid函數(shù)具有限制性,輸出數(shù)值在0?1,最符合概率輸出定義。非線性Sigmoid函數(shù),信號(hào)特征空間映射,中央?yún)^(qū)信號(hào)增益大,兩側(cè)區(qū)信息增益小。中央?yún)^(qū)像神經(jīng)元興奮態(tài),兩側(cè)區(qū)像神經(jīng)元抑制態(tài)。訓(xùn)練時(shí),重要特征放中央?yún)^(qū),非重要特征放兩側(cè)區(qū)。Sigmoid比最初期線性激活函數(shù)y=x,階梯激活函數(shù)y=-1(x<0)|y=1(x>=0)、y=0(x<0)|y=1(x>=0)好。Sigmoid函數(shù)反向傳播梯度值在多層傳遞指級(jí)急劇減小,根據(jù)訓(xùn)練數(shù)據(jù)反饋更新神經(jīng)網(wǎng)絡(luò)參數(shù)非常緩慢,不起訓(xùn)練作用。
ReLU,非線性函數(shù)y=max(0,x),坐標(biāo)軸上折線,當(dāng)x<=0,y=0,x>0,y=x。人腦閾值響應(yīng)機(jī)制,信號(hào)超過(guò)某個(gè)閾值,神經(jīng)元興奮激活狀態(tài),平時(shí)抑制狀態(tài)。ReLU很好傳遞梯度,多層反向傳播,梯度不會(huì)大幅縮小,適合很深神經(jīng)網(wǎng)絡(luò),不需要無(wú)監(jiān)督逐層初始化權(quán)重。ReLU變化,單側(cè)抑制,相對(duì)寬閣興奮邊界,稀疏激活性。神經(jīng)元同時(shí)激活1~4%,選擇性響應(yīng)很少部分輸入信號(hào),屏蔽大量不相關(guān)信號(hào),更高效提取重要特征。傳統(tǒng)Sigmoid函數(shù)接近一半神經(jīng)元被激活。Softplus,單側(cè)抑制,沒(méi)有稀疏激活性。ReLU及變種(EIU,PReLU,RReLU)為最注流激活函數(shù)。輸出層一般用Sigmoid函數(shù),最接近概率輸出分布。
隱含層可以解決XOR問(wèn)題,用曲線劃分兩類(lèi)樣本。隱含層越多,原有特征越抽象變換。是多層神經(jīng)網(wǎng)絡(luò)(多層感知機(jī) MLP)功能。
網(wǎng)絡(luò)神經(jīng)加上隱含層,使用Dropout、自適應(yīng)學(xué)習(xí)速率Adagrad,解決梯度彌散激活函數(shù)ReLU。
載入TensorFlow,加載MNIST數(shù)據(jù)集,創(chuàng)建Interactive Session。
隱含層參數(shù)設(shè)置Variable初始化。in_units輸入節(jié)點(diǎn)數(shù),h1_units隱含層輸出節(jié)點(diǎn)數(shù)設(shè)300(200?1000區(qū)別不大)。W1隱含層權(quán)重初始化截?cái)嗾龖B(tài)分布標(biāo)準(zhǔn)差0.1,b1偏置設(shè)0。模型激活函數(shù)ReLU,正態(tài)分布給參數(shù)加噪聲,打破完全對(duì)稱(chēng)避免0梯度。偏置賦小非零值避免dead neuron(死亡神經(jīng)元)。最后輸出層Softmax,權(quán)重W2偏置b2初始化0。Sigmoid,0附近最敏感,梯度最大。
訓(xùn)練和預(yù)測(cè),Dropout比率keep_prob(保留節(jié)點(diǎn)概率)不同。訓(xùn)練小于1。預(yù)測(cè)等于1。Dropout比率為計(jì)算圖輸入,定義placeholder。
定義模型結(jié)構(gòu)。tf.nn.relu(tf.matmul(x,W1+b1)),實(shí)現(xiàn)激活函數(shù)為ReLU的hidden1隱含層,y=relu(W1x+b1)。tf.nn.dropout實(shí)現(xiàn)Dropout,隨機(jī)置0分部節(jié)點(diǎn)。keep_prob參數(shù),保留數(shù)據(jù)不置為0比例,訓(xùn)練應(yīng)小于1,制造隨機(jī)性,防止過(guò)擬合,預(yù)測(cè)等于1,用全部特征預(yù)測(cè)樣本類(lèi)別。輸出層Softmax。
定義算法公式,神經(jīng)網(wǎng)絡(luò)forward計(jì)算。定義損失函數(shù)(交叉信息熵)和選擇優(yōu)化器(自適應(yīng)優(yōu)化器Adagrad),優(yōu)化loss,學(xué)習(xí)速率0.3,使用tf.train.AdagradOptimizer 。Adadelta、Adam優(yōu)化器。
訓(xùn)練,keep_prob計(jì)算圖輸入,訓(xùn)練時(shí)設(shè)0.75,保留75%節(jié)點(diǎn),其余25%置0。越復(fù)雜越大規(guī)模神經(jīng)網(wǎng)絡(luò),Dropout效果越顯著。隱含層,需要更多訓(xùn)練迭代優(yōu)化模型參數(shù)。3000個(gè)bacth,每個(gè)bacth100條樣本,30萬(wàn)樣本。相當(dāng)全數(shù)據(jù)集5輪epoch迭代。增大循環(huán)次數(shù),準(zhǔn)確率略有提高。
準(zhǔn)確率評(píng)測(cè),加入keep_prob輸入,等于1。
沒(méi)有隱含層Softmax Regression,直接從圖像像素推斷是哪個(gè)數(shù)字,沒(méi)有特征抽象過(guò)程。多層神經(jīng)網(wǎng)絡(luò)隱含層,組合高階特征或組件,再組合成數(shù)字,實(shí)現(xiàn)精準(zhǔn)匹配分類(lèi)。隱含層輸出高階特征組件可以復(fù)用,每一類(lèi)判別、概率輸出共享。
全連接神經(jīng)網(wǎng)絡(luò)(Fully Connected Network,FCN,MLP的另一種說(shuō)法)局限,很深網(wǎng)絡(luò),很多隱藏節(jié)點(diǎn),很大迭代輪數(shù),也難達(dá)到99%以上準(zhǔn)確率。
# Create the model
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
sess = tf.InteractiveSession()
in_units = 784
h1_units = 300
W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1))
b1 = tf.Variable(tf.zeros([h1_units]))
W2 = tf.Variable(tf.zeros([h1_units, 10]))
b2 = tf.Variable(tf.zeros([10]))
x = tf.placeholder(tf.float32, [None, in_units])
keep_prob = tf.placeholder(tf.float32)
hidden1 = tf.nn.relu(tf.matmul(x, W1) + b1)
hidden1_drop = tf.nn.dropout(hidden1, keep_prob)
y = tf.nn.softmax(tf.matmul(hidden1_drop, W2) + b2)
# Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)
# Train
tf.global_variables_initializer().run()
for i in range(3000):
batch_xs, batch_ys = mnist.train.next_batch(100)
train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})
# Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
參考資料:
《TensorFlow實(shí)戰(zhàn)》
歡迎付費(fèi)咨詢(xún)(150元每小時(shí)),我的微信:qingxingfengzi