1. 程式人生 > >tensorflow-2. 神經網路的優化

tensorflow-2. 神經網路的優化

神經網路的優化

入門篇的傳送門

1. 模型優化

在入門篇裡面,神經網路模型僅僅是 y = t f . m a t

m u l ( x , w 1 ) y = tf.matmul(x, w1)
,也就是 y = i x i w
i y = \sum_ix_iw_i
,現在可以在其之後加上常數項 b b ,同時再加上啟用函式 f f ,構成 :

y = f ( i x i w i + b ) y = f(∑_ix_iw_i+b)

常見的啟用函式 f f 有,

  • f ( x ) = m a x ( x , 0 ) f(x)=max(x,0) ,tensorflow表示為tf.nn.relu()
    在這裡插入圖片描述
  • f ( x ) = 1 1 + e x f(x)=\frac{1}{1+e^{-x}} ,tensorflow表示為tf.nn.sigmoid()
    在這裡插入圖片描述
  • f ( x ) = 1 e 2 x 1 + e 2 x f(x)=\frac{1-e^{-2x}}{1+e^{-2x}} ,tensorflow表示為tf.nn.tanh()
    在這裡插入圖片描述

2. loss優化

loss函式,也就是損失函式,用來表示真實值 y_ 與預測值 y 的差距,也就是訓練目標,使得loss越小越好

在入門篇中,損失函式採用的是均方誤差法,實際開發中,常用的損失函式有:

  • 均方誤差: i = 1 n ( y _ y ) 2 n \frac{\sum^n_{i=1} (y_{\_}-y)^2}{n}
    tensorflow表示為tf.reduce_mean(tf.square(y_-y))
  • 自定義:根據自身需求,自己定義損失函式,
    例如:tf.reduce_sum( tf.where( tf.greater(y,y_), 2*(y-y_), 5*(y_-y) ) )
  • 交叉熵:交叉熵表示了二分類問題中兩概率分佈之間的距離,值越小,距離越近。 y _ l o g y -\sum y_{\_}*log 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,才能使用交叉熵法。 s o f t m a x ( y i ) = e y i j = 1 n e y i softmax(y_i)=\frac{e^{y_i}}{\sum_{j=1}^ne^{y_i}}
    • 一般程式碼中直接將softmax和交叉熵合為一句:tf.reduce_mean( tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1)) )

3. 學習率

學習率表示每次參加更新的幅度大小,學習率過大會導致待優化的引數出現震盪不收斂的情況,學習率過小學習速度慢。通俗點講就是引數值不會一直慢慢往0減小,一下子減太過了。

在入門篇中,我們的學習率設定的為定值0.001。在實際應用中,這種設定為定值肯定是不夠好的,往往我們採用指數衰減學習率,也就是隨著訓練的次數增加,慢慢將學習率自動降低。

數學表達:

= ( ) 學習率=初始值*衰減率^{\frac{當前訓練輪數}{更新頻率(多少輪更新一次)}}

更新頻率一般設定為 總樣本數 / 每次喂入的樣本數
也就是一般為跑一遍樣本需要的輪數。

程式碼表示:

當前訓練輪數global_step = tf.Variable(0,trainavle=False)
learing_rate = tf.train.exponential_decay(
學習率初始值,
當前訓練輪數global_step,
更新頻率(多少輪更新一次),
衰減率,
staircase=True/False        # 設定是否平滑曲線下降,不然僅當指數部分取整才更新一次
)

4. 滑動平均

滑動平均值稱為影子,記錄了一段時間內模型中所有引數w和b各自的平均值,這樣下次取出模型進行測試的時候可以用平均值代替w和b了,是的模型有更好的泛化能力。

= + ( 1 ) 影子=衰減率 * 影子 + (1-衰減率)*引數
= m i n { , 1 + 10 + } 其中,衰減率 = min\{滑動平均衰減率,\frac{1+輪數}{10+輪數} \}
用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)

正則化計算方法有兩種:

  1. L1正則化: l o s s L 1 = i w i loss_{L1}=\sum_i|w_i|
  2. L2正則化: l o s s L 1 = i w i 2 loss_{L1}=\sum_i|w_i|^2

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'))