1. 調試處理
超參數重要性排序
- 學習速率(learning rate)
α - 動量權重
β=0.9 ,隱藏層節點數,mini-batch size - 層數,learning rate decay
- Adam優化算法的參數
β1=0.9, β2=0.999, ϵ=10−8 一般不改
調參方法
- 網格搜索,使用參數較少的情況
隨機選擇,該方法較優,原因是對於一個具體問題,不清楚哪個參數比較重要,而網格搜索是各個參數地位是平等的
- 先確定一個大致的參數區間,然後再細緻搜索
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)
調整參數的方法 - 看計算能力
- Pandas - 計算能力不夠的時候,邊訓練邊調整參數
- Caviar - 同時嘗試多種參數組合進行模型訓練
4. 正則化網絡的激活函數
- Batch Norm,對隱藏層節點激活函數輸入或者輸出進行歸一化
Batch Norm
歸一化輸入可以加快訓練速度
Batch Norm是對隱藏層進行歸一化操作
有兩個版本的Batch Norm:
1. (Default)對節點激活函數的輸入
2. 對節點的輸出
算法步驟
Given some intermediate values in NN
z(1), ... ,z(m) μ=1m∑iz(i) σ2=1m∑i(zi−μ)2 z(i)norm=z(i)−μσ2+ϵ√
- 分母加上
ϵ 是爲了防止分母太小,保證算法穩定性
- 分母加上
z~(i)=γz(i)norm+β
- 爲了不讓隱藏層節點激活函數的輸入都是均值爲0方差爲1,其中
γ,β 都是模型的學習參數,可以用梯度下降或者其他方法來更新這兩個參數的值,也可以設置成固定值
- 爲了不讓隱藏層節點激活函數的輸入都是均值爲0方差爲1,其中
- Use
z~(i) to be the input of activate function
如果
γ=σ2+ϵ−−−−−√,β=μ ,那麼z(i)=z~(i)
5. 將Batch Nrom擬合進神經網絡
一個完整的網絡
一個節點
- X通過w和b進行求和得到z
- z通過
γ[1],β[1] 參數和BatchNorm操作得到z~[1] - 用激活函數計算節點的輸出
一些注意點
- 參數
β 和上一節中的不是一個參數 γ[l],β[l] 和w,b等價,可以用梯度下降進行更新,也可以用優化方法進行優化加快學習- tf.nn.batch-normalization框架實現,不需要自己手動實現,但是要理解做法
- 因爲歸一化要減去均值,所以偏置b就沒有用了,刪掉,
β 有相似的作用 γ[l],β[l] 的維度是(n[l] , 1)
6. Batch Norm爲什麼奏效
通過歸一化操作,把尺度不一的輸入限定在相同的量綱下,從而加快學習速度
Covariate shift
- 定義:已經學習了x到y的映射,如果x的分佈改變了,需要重新訓練學習算法。
對於一個多層的神經網絡,把第二層的輸出當作輸入,有一個
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]
神經網絡是使損失函數最小,134項都爲0,也就是使
- 成本函數
J(w[1],b[1]...)=1m∑i=1ml(y^(i),y(i))
在程序中輸出是水平放的矩陣
Softmax的反向傳播
梯度
10. 深度學習框架
框架列表
Caffe/Caffe2, CNTK, DL4J, Keras, Lasagne, mxnet, PaddlePaddle, Tensorflow, Theano, Torch
選擇依據
- 開發應用變成的難易程度
- 運行速度
- 是否開源以及是否有好的開源管理
11. Tensorflow
優化目標:
J(w)=w2−10w+25 代碼
導包
import numpy as np import tensorflow as tf
一些設置
# 把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
慣用寫法,初始化
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())
- 也可以用下面的寫法
運行梯度下降法
# 運行一步梯度下降 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