Tensorflow 筆記:神經網絡優化(1)

轉載於人工智能實踐:Tensorflow筆記

  • 神經元模型:用數學公式表示爲:𝐟(∑𝒊𝒙𝒊𝒘𝒊 + 𝐛),f 爲激活函數。神經網絡是以神經元爲基本單元構成的。

  • 激活函數:引入非線性激活因素,提高模型的表達力。
    常用的激活函數有 relu、sigmoid、tanh 等。

  • ① 激活函數 relu: 在 Tensorflow 中,用 tf.nn.relu()表示
    在這裏插入圖片描述

  • ② 激活函數 sigmoid:在 Tensorflow 中,用 tf.nn.sigmoid()表示
    在這裏插入圖片描述

  • ③ 激活函數 tanh:在 Tensorflow 中,用 tf.nn.tanh()表示
    在這裏插入圖片描述

  • 神經網絡的複雜度:可用神經網絡的層數和神經網絡中待優化參數個數表示

  • 神經網路的層數:一般不計入輸入層,層數 = n 個隱藏層 + 1 個輸出層

  • 神經網路待優化的參數:神經網絡中所有參數 w 的個數 + 所有參數 b 的個數

例如:
在這裏插入圖片描述

  • 在該神經網絡中,包含 1 個輸入層、1 個隱藏層和 1 個輸出層,該神經網絡的層數爲 2 層。

  • 在該神經網絡中,參數的個數是所有參數 w 的個數加上所有參數 b 的總數,第一層參數用三行四列的二階張量表示(即 12 個線上的權重 w)再加上 4 個偏置 b;第二層參數是四行兩列的二階張量()即 8 個線上的權重 w)再加上 2 個偏置 b。總參數 = 34+4 + 42+2 = 26。

  • 損失函數(loss):用來表示預測值(y)與已知答案(y_)的差距。在訓練神經網絡時,通過不斷改變神經網絡中所有參數,使損失函數不斷減小,從而訓練出更高準確率的神經網絡模型。

  • 常用的損失函數有均方誤差自定義交叉熵等。
    均方誤差 mse:n 個樣本的預測值 y 與已知答案 y_之差的平方和,再求平均值。
    在這裏插入圖片描述
    在 Tensorflow 中用 loss_mse = tf.reduce_mean(tf.square(y_ - y))

    自定義損失函數:根據問題的實際情況,定製合理的損失函數。
    自定義損失函數爲:loss = ∑𝑛𝑓(y_, y)
    其中,損失定義成分段函數:
    在這裏插入圖片描述
    用 Tensorflow 函數表示爲:

    loss = tf.reduce_sum(tf.where(tf.greater(y,y_),COST(y-y_),PROFIT(y_-y)))
    

    交叉熵(Cross Entropy):表示兩個概率分佈之間的距離。交叉熵越大,兩個概率分佈距離越遠,兩個概率分佈越相異;交叉熵越小,兩個概率分佈距離越近,兩個概率分佈越相似。
    交叉熵計算公式:𝐇(𝐲_ , 𝐲) = −∑𝐲_ ∗ 𝒍𝒐𝒈 𝒚
    用 Tensorflow 函數表示爲 ce= -tf.reduce_mean(y_* tf.log(tf.clip_by_value(y, 1e-12, 1.0)))

  • softmax 函數:將 n 分類的 n 個輸出(y1,y2…yn)變爲滿足以下概率分佈要求的函數。
    在這裏插入圖片描述- softmax 函數應用:在 n 分類中,模型會有 n 個輸出,即 y1,y2…yn,其中 yi 表示第 i 種情況出現的可能性大小。將 n 個輸出經過 softmax
    函數,可得到符合概率分佈的分類結果。

  • 在 Tensorflow 中,一般讓模型的輸出經過 sofemax 函數,以獲得輸出分類的概率分佈,再與標準
    答案對比,求出交叉熵,得到損失函數,用如下函數實現:

   ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1)) cem = 
    tf.reduce_mean(ce)
  • 學習率
    學習率 learning_rate:表示了每次參數更新的幅度大小。學習率過大,會導致待優化的參數在最小值附近波動,不收斂;學習率過小,會導致待優化的參數收斂緩慢。
    在訓練過程中,參數的更新向着損失函數梯度下降的方向。參數的更新公式爲:W𝒏+𝟏 = W𝒏 − 𝒍𝒆𝒂𝒓𝒏𝒊𝒏𝒈_𝒓𝒂𝒕𝒆𝛁
    學習率過大,會導致待優化的參數在最小值附近波動,不收斂;學習率過小,會導致待優化的參數收斂緩慢。
    學習率計算公式如下:
    在這裏插入圖片描述
    用 Tensorflow的函數表示 函數表示 爲:
global_step = tf.Variable(0, trainable=False)
learning_rate = tf.train.exponential_decay( LEARNING_RATE_BASE,
global_step,
LEARNING_RATE_STEP, LEARNING_RATE_DECAY,
staircase=True/False)
  • 其中,LEARNING_RATE_BASE 爲學習率初始值,LEARNING_RATE_DECAY 爲學習率衰減率,global_step 記錄了當前訓練輪數,爲不可訓練型參數。學習率 learning_rate 更新頻率爲輸入數據集總樣本數除以每次喂入樣本數。若 staircase 設置爲 True 時,表示 global_step/learning rate step 取整數,學習率階梯型衰減;若 staircase 設置爲 false 時,學習率會是一條平滑下降的曲線。

  • 滑動平均:記錄了一段時間內模型中所有參數 w 和 b 各自的平均值。利用滑動平均值可以增強模
    型的泛化能力。

  • 滑動平均值(影子)計算公式:
    影子 = 衰減率 * 影子 +(1 - 衰減率)* 參數
    在這裏插入圖片描述
    用 Tesnsorflow 函數表示爲:
    ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
    其中,MOVING_AVERAGE_DECAY 表示滑動平均衰減率,一般會賦接近 1 的值,global_step 表示當前訓練了多少輪。
    ema_op = ema.apply(tf.trainable_variables())
    其中,**ema.apply()函數實現對括號內參數求滑動平均,tf.trainable_variables()**函數實現把所有待訓練參數彙總爲列表。

with tf.control_dependencies([train_step, ema_op]): 
      train_op = tf.no_op(name='train') 

  其中,該函數實現將滑動平均和訓練過程同步運行。 查看模型中參數的平均值,可以用 **ema.average()**函數。

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