第2次課改善深層神經網絡:超參數優化、正則化以及優化 - week3 超參數調試、Batch正則化和程序框架

1. 調試處理

超參數重要性排序

  1. 學習速率(learning rate)α
  2. 動量權重β=0.9 ,隱藏層節點數,mini-batch size
  3. 層數,learning rate decay
  4. Adam優化算法的參數β1=0.9, β2=0.999, ϵ=108 一般不改

調參方法

  1. 網格搜索,使用參數較少的情況
  2. 隨機選擇,該方法較優,原因是對於一個具體問題,不清楚哪個參數比較重要,而網格搜索是各個參數地位是平等的

    • 先確定一個大致的參數區間,然後再細緻搜索

2. 爲超參數選擇合適的範圍

一個例子 - 隱藏層節點數nx 和層數L

  • 隱藏層節點數,隨機選擇50-100個
  • 層數,可以隨機選擇2-4,也可以網格搜索

另一個例子 - 學習速率α

  • 問題:選擇一個可能下界0.0001和一個上界1,在[0.0001,1]中隨機取點,由於尺寸不對稱,小的數字被取到的概率小
  • 解決方法:把區間劃分成4個部分,[0.0001,0.001], [0.001,0.01], [0.01,0.1], [0.1,1],然後在4個區間內隨機取點,也就是對其取對數
  • 示例代碼:
    python
    r = -4*np.random.rand()
    alpha = 10**r

最後一個例子 - 動量權重β

  • 問題:和學習速率一樣,[0.9,0.999]之間不能均勻取值
  • 解決方法:通過1β 到[0.001,0.1],然後用學習速率的方法進行對數取值
  • 原因:11β 之後,0.9到0.9005不敏感,但是0.999到0.9995很敏感,對結果的影響大,所以需要在接近1的地方密集取值

3. 超參數訓練實踐 - Pandas vs. Caviar魚子醬(analogy)

調整參數的方法 - 看計算能力

  1. Pandas - 計算能力不夠的時候,邊訓練邊調整參數
  2. Caviar - 同時嘗試多種參數組合進行模型訓練

4. 正則化網絡的激活函數

  • Batch Norm,對隱藏層節點激活函數輸入或者輸出進行歸一化

Batch Norm

歸一化輸入可以加快訓練速度

x=xμσ

Batch Norm是對隱藏層進行歸一化操作

有兩個版本的Batch Norm:
1. (Default)對節點激活函數的輸入z 進行歸一化
2. 對節點的輸出a 進行歸一化

算法步驟

  • Given some intermediate values in NN z(1), ... ,z(m)

    • μ=1miz(i)
    • σ2=1mi(ziμ)2
    • z(i)norm=z(i)μσ2+ϵ
      • 分母加上ϵ 是爲了防止分母太小,保證算法穩定性
    • z~(i)=γz(i)norm+β
      • 爲了不讓隱藏層節點激活函數的輸入都是均值爲0方差爲1,其中γ,β 都是模型的學習參數,可以用梯度下降或者其他方法來更新這兩個參數的值,也可以設置成固定值
    • Use z~(i) to be the input of activate function
  • 如果γ=σ2+ϵ,β=μ ,那麼z(i)=z~(i)

5. 將Batch Nrom擬合進神經網絡

一個完整的網絡

這裏寫圖片描述

一個節點

  1. X通過w和b進行求和得到z
  2. z通過γ[1],β[1] 參數和BatchNorm操作得到z~[1]
  3. 用激活函數計算節點的輸出

一些注意點

  1. 參數β 和上一節中的不是一個參數
  2. γ[l],β[l] 和w,b等價,可以用梯度下降進行更新,也可以用優化方法進行優化加快學習
  3. tf.nn.batch-normalization框架實現,不需要自己手動實現,但是要理解做法
  4. 因爲歸一化要減去均值,所以偏置b就沒有用了,刪掉,β 有相似的作用
  5. γ[l],β[l] 的維度是(n[l] , 1)

6. Batch Norm爲什麼奏效

通過歸一化操作,把尺度不一的輸入限定在相同的量綱下,從而加快學習速度

Covariate shift

  • 定義:已經學習了x到y的映射,如果x的分佈改變了,需要重新訓練學習算法。

對於一個多層的神經網絡,把第二層的輸出當作輸入,有一個A[2]y^ 的映射,但是第二層的輸出也在變化,也就是x的分佈改變了,所以使用Batch Norm保證輸入的均值方差,減少了輸入改變的我呢體,變得更穩定,保證每層都可以獨立學習,從而加速整個網絡的學習。

Batch Norm和regularization正則化

使用mini-batch,在每個mini-batch上計算均值方差進行歸一化。會給隱藏層的激活函數帶來噪聲,產生類似於dropout的效果。因爲添加的噪聲很小,只有輕微的正則化效果

和dropout一起使用獲得更好的正則化效果,mini-batch size越大,正則化效果越弱,Batch Norm的正則化效果只是小的副作用,不是其主要功能。

7. 測試時的Batch Norm

訓練的做法

分別對每個mini-batch進行歸一化處理

測試的做法

測試的時候需要對樣本逐個處理樣本

使用指數加權平均來估計均值和方差,也可以使用其他方法

  • X{1}>μ{1}[l]
  • X{2}>μ{2}[l]
  • X{3}>μ{3}[l]
  • μ{1}[l],μ{2}[l],μ{3}[l]>μ

對於σ 也是一樣的操作

8. Softmax迴歸

  • logistic迴歸的一般形式,用於多分類問題

問題描述

給定一個圖像,判斷是貓還是狗還是鳥還是其他,總共個有4類,C=4

網絡描述

第L層有4個節點,分別代表P(cat|X), P(dog|X), P(bird|X), P(other|X),和爲1

  • L層的Activation function:

    a[L]=ez[L]Cj=1ez[L]j
    • 先計算ez ,然後歸一化

輸入一個向量,輸出一個同樣大小的向量

9. 訓練一個Sofrmax分類器

和hard max相反,hard max是輸出0,1,其中輸入最大的是1,其他都是0

損失函數和成本函數

y = [0,1,0,0] y^ = [0.3,0.2,0.4,0.1]

l(y^,y)=j=14yjlogy^j

神經網絡是使損失函數最小,134項都爲0,也就是使y^j ,即貓的概率最大,理論依據:最大似然估計

  • 成本函數
    J(w[1],b[1]...)=1mi=1ml(y^(i),y(i))

在程序中輸出是水平放的矩陣

Y==[y(1),y(2), ... ,y(m)]0 0 11 0 00 1 00 0 0 ...

Softmax的反向傳播

梯度dz[L]=y^y 同樣是一個(4,1)的向量

10. 深度學習框架

框架列表

Caffe/Caffe2, CNTK, DL4J, Keras, Lasagne, mxnet, PaddlePaddle, Tensorflow, Theano, Torch

選擇依據

  1. 開發應用變成的難易程度
  2. 運行速度
  3. 是否開源以及是否有好的開源管理

11. Tensorflow

  • 優化目標:

    J(w)=w210w+25
  • 代碼

    • 導包

      import numpy as np
      import tensorflow as tf
      1. 一些設置

        
        # 把w初始化爲0,w是TensorFlow變量
        
        w = tf.Variable(0, dtype=tf.float32)
        
        # 定義損失函數
        
        
        # cost = tf.add(tf.add(w**2, tf.multiply(-10., w)),25)
        
        cost = w**2 - 10*w + 25 # 重載了簡單的運算,比如平方乘法加減
        
        # 定義train爲學習算法,用梯度下降法是損失函數最小化
        
        train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01
      2. 慣用寫法,初始化

        init = tf.global_varibales_initializer()
        session = tf.Session()
        session.run(init) # 初始化全局變量
        print(session.run()) # 讓Tensorflow評估一個變量
        • 也可以用下面的寫法
          with tf.session as session:
              session.run(init)
              print(session.run())
      3. 運行梯度下降法

        
        # 運行一步梯度下降
        
        seesion.run(train)
        print(session.run(w)) # 評估一下w的值,輸出它
        
        
        # 運行1000次梯度下降
        
        for i in range(1000):
            session.run(train)
        print(session.rumn(w))
    • 有數據集的情況

      coefficients = np.array([1.], [10.], [25.])
      
      
      # 把w初始化爲0,w是TensorFlow變量
      
      w = tf.Variable(0, dtype=tf.float32)
      
      # 訓練集,這個例子中只有x,定義爲(3,1)的數組
      
      x = tf.placeholder(tf.float32, [3,1])
      
      # 定義損失函數
      
      cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
      
      # 定義train爲學習算法,用梯度下降法優化算法使損失函數最小化,也可以使用AdamOptimizer
      
      train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # learning_rate=0.01
      
      init = tf.global_varibales_initializer()
      session = tf.Session()
      session.run(init) # 初始化全局變量
      print(session.run()) # 讓Tensorflow評估一個變量
      
      
      # 運行一步梯度下降
      
      seesion.run(train, feed_dict={x:coefficients})
      print(session.run(w)) # 評估一下w的值,輸出它
      
      
      # 運行1000次梯度下降
      
      for i in range(1000):
          session.run(train, feed_dict={x:coefficients})
      print(session.rumn(w))
  • cost function
    python
    cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]
graph LR
x00-->l1((*))
w1[w]-->w*w
w*w-->l1
x10-->l2((*))
w2[w]-->l2
l1-->l3((+))
x20-->l3
l2-->l3
l3-->cost
  • 定義了前向傳播,框架會自動進行反向傳播

課程地址

http://mooc.study.163.com/course/deeplearning_ai-2001281003?tid=2001391036#/info

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