tensorflow-2. 神經網路的優化
阿新 • • 發佈:2018-11-03
神經網路的優化
1. 模型優化
在入門篇裡面,神經網路模型僅僅是 ,也就是 ,現在可以在其之後加上常數項 ,同時再加上啟用函式 ,構成 :
常見的啟用函式 有,
-
,tensorflow表示為
tf.nn.relu()
-
,tensorflow表示為
tf.nn.sigmoid()
-
,tensorflow表示為
tf.nn.tanh()
2. loss優化
loss函式,也就是損失函式,用來表示真實值 y_
與預測值 y
的差距,也就是訓練目標,使得loss越小越好
在入門篇中,損失函式採用的是均方誤差法,實際開發中,常用的損失函式有:
- 均方誤差:
,
tensorflow表示為tf.reduce_mean(tf.square(y_-y))
- 自定義:根據自身需求,自己定義損失函式,
例如:tf.reduce_sum( tf.where( tf.greater(y,y_), 2*(y-y_), 5*(y_-y) ) )
- 交叉熵:交叉熵表示了二分類問題中兩概率分佈之間的距離,值越小,距離越近。
,
tensorflow表示為:tf.reduce_mean( y_*tf.log( tf.clip_by_value(y, 1e-12, 1.0) ) )
,其中tf.clip_by_value(y, 1e-12, 1.0) )
保證了y的值在合法範圍之內- softmax 函式:在n分類中,為了使n中情況的概率和為1,才能使用交叉熵法。
- 一般程式碼中直接將softmax和交叉熵合為一句:
tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1)) )
3. 學習率
學習率表示每次參加更新的幅度大小,學習率過大會導致待優化的引數出現震盪不收斂的情況,學習率過小學習速度慢。通俗點講就是引數值不會一直慢慢往0減小,一下子減太過了。
在入門篇中,我們的學習率設定的為定值0.001。在實際應用中,這種設定為定值肯定是不夠好的,往往我們採用指數衰減學習率,也就是隨著訓練的次數增加,慢慢將學習率自動降低。
數學表達:
更新頻率一般設定為 總樣本數 / 每次喂入的樣本數
也就是一般為跑一遍樣本需要的輪數。
程式碼表示:
當前訓練輪數global_step = tf.Variable(0,trainavle=False)
learing_rate = tf.train.exponential_decay(
學習率初始值,
當前訓練輪數global_step,
更新頻率(多少輪更新一次),
衰減率,
staircase=True/False # 設定是否平滑曲線下降,不然僅當指數部分取整才更新一次
)
4. 滑動平均
滑動平均值稱為影子,記錄了一段時間內模型中所有引數w和b各自的平均值,這樣下次取出模型進行測試的時候可以用平均值代替w和b了,是的模型有更好的泛化能力。
用tensorflow表示為:
ema = tf.train.ExponentialMovingAverage(滑動平均衰減率,當前訓練輪數global_step)
ema_op = ema.apply(tf.trainable_variables())
# 下面方法可實現滑動平均與訓練過程同步執行
with tf.control_dependencies([train_step, ema_op]):
train_op = tf.no_op(name='train')
5. 正則化解決過擬合問題
過擬合:指訓練過度,模型在訓練集上的準確率很高,一旦出現新的測試資料,準確率就低了。
正則化:為每個引數w加上權重,引入模型複雜度指標,從而抑制模型噪聲,達到減少過擬合的現象。
新增正則化之後,損失函式loss就需要再加一項REGULARIZER*loss(w)
正則化計算方法有兩種:
- L1正則化:
- L2正則化:
tensorflow表示分別為:
loss(w) = tf.contrib.layers.l1_regularizer(REGULARIZER)(w)
loss(w) = tf.contrib.layers.l2_regularizer(REGULARIZER)(w)
在tensorflow中的使用:
tf.add_to_collection('losses',loss(w))
loss = 之前的損失函式 + tf.add_n(tf.get_collection('losses'))