02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架
文章目錄
- 1. 調試處理
- 2. 為超參數選擇合適的范圍
- 3. 超參數調試的實踐
- 4. 歸一化網絡的激活函數
- 5. 將 Batch Norm 擬合進神經網絡
- 6. Batch Norm 為什么奏效
- 7. 測試時的 Batch Norm
- 8. Softmax 回歸
- 9. 訓練一個 Softmax 分類器
- 10. 深度學習框架
- 11. TensorFlow
- 作業
參考:
吳恩達視頻課
深度學習筆記
1. 調試處理
需要處理的參數:
| 學習率 α\alphaα | ★★★★ |
| Momentum(動量梯度下降法)參數 β=0.9\beta = 0.9β=0.9 | ★★★ |
| 隱藏單元數量 | ★★★ |
| mini-batch size | ★★★ |
| 網絡層數 | ★★ |
| 學習衰減率 | ★★ |
| Adam 優化算法的 β1=0.9,β2=0.999,ε=1e?8\beta_1=0.9,\beta_2=0.999, \varepsilon=1e^{-8}β1?=0.9,β2?=0.999,ε=1e?8 | ★ |
- 在深度學習領域,常采用隨機選點進行參數搜索(試驗了更多的不同的超參數值)
- 由粗糙到精細的策略(集中計算資源到可能更優的小區域進行更密集的搜索)
2. 為超參數選擇合適的范圍
隨機取值,并不是在范圍內均勻取值。
- 使用對數標尺搜索超參數的方式會更合理
比如想取參數 α∈[0.0001,1]\alpha \in [0.0001, 1]α∈[0.0001,1]
- r=-4*np.random.rand(),r∈[?4,0]r \in [-4,0]r∈[?4,0],然后取 α=10r\alpha = 10^{r}α=10r,在 r 的區間均勻取值
再比如計算指數的加權平均值參數 β∈[0.9,0.999]\beta \in [0.9, 0.999]β∈[0.9,0.999]
- 我們考察 1?β∈[0.001,0.1]1-\beta \in [0.001, 0.1]1?β∈[0.001,0.1],那么我們令 r∈[?3,?1]r \in [-3, -1]r∈[?3,?1], r 在里面均勻取值
- 1?β=10r→β=1?10r1-\beta=10^r \rightarrow \beta = 1-10^r1?β=10r→β=1?10r
因為加權平均值大概是基于過去 11?β\frac{1}{1-\beta}1?β1? 個值進行平均,當 β\betaβ 接近 1 的時候,對細微的變化非常敏感,需要更加密集的取值
如果你使用均勻取值,應用從粗到細的搜索方法,取足夠多的數值,最后也會得到不錯的結果
3. 超參數調試的實踐
- 在數據更新后,要重新評估超參數是否依然合適
- 沒有計算資源,你可以試驗一個或者少量的模型,不斷的調試和觀察效果
- 如果有計算資源,盡管試驗不同參數的模型,最后選擇一個最好的
4. 歸一化網絡的激活函數
Batch歸一化 會使你的參數搜索問題變得很容易,使神經網絡對超參數的選擇更加穩定,超參數的范圍會更加龐大,工作效果也很好,也會使你的訓練更加容易
那么對于任意一層的輸入 我們將其歸一化 z[l]z^{[l]}z[l](有爭議,歸一化激活函數值a[l]a^{[l]}a[l])
znorm?(i)=z(i)?μσ2+εz_{\text {norm }}^{(i)}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}}znorm?(i)?=σ2+ε?z(i)?μ?
但是我們不想讓每一層的均值都為0,方差為1,也許有不同的分布有意義,加上2個超參數 γ,β\gamma, \betaγ,β
z~(i)=γznorm?(i)+β\tilde{z}^{(i)}=\gamma z_{\text {norm }}^{(i)}+\betaz~(i)=γznorm?(i)?+β
- 通過賦予 γ,β\gamma, \betaγ,β 其它值,可以使你構造含其它均值和方差的隱藏單元值
5. 將 Batch Norm 擬合進神經網絡
前向傳播:
計算完前一層的輸出,先進行歸一化,再計算激活函數值
反向傳播:
現在網絡里引入了新的參數 β,γ\beta, \gammaβ,γ(跟優化算法的 β\betaβ 是兩個東西) ,然后可以用之前學到的 Adam、RMSprop、Momentum梯度下降來更新參數
β[l]=β[l]?α?dβ[l]\beta^{[l]}=\beta^{[l]}-\alpha* d \beta^{[l]}β[l]=β[l]?α?dβ[l]
γ[l]=γ[l]?α?dγ[l]\gamma^{[l]}=\gamma^{[l]}-\alpha *d \gamma^{[l]}γ[l]=γ[l]?α?dγ[l]
w[l]=w[l]?α?dw[l]w^{[l]}=w^{[l]}-\alpha* d w^{[l]}w[l]=w[l]?α?dw[l]
b[l]b^{[l]}b[l] 參數沒有用,做歸一化會被減去。
6. Batch Norm 為什么奏效
原因1,使得輸入特征、隱藏單元的值獲得類似的范圍,可以加速學習
原因2,在前面層輸入值改變的情況下,BN 使得他們的均值和方差不變(更穩定),即使輸入分布改變了一些,它會改變得更少。
它減弱了前層參數的作用與后層參數的作用之間的聯系,它使得網絡每層都可以自己學習,稍稍獨立于其它層,這有助于加速整個網絡的學習
BN 有輕微的正則化效果,因為它在 mini-batch 上計算的均值和方差是有小的噪聲,給隱藏單元添加了噪聲,迫使后部單元不過分依賴任何一個隱藏單元(類似于 dropout)。
因為添加的噪聲很微小,所以正則化效果也很小
當增大 mini-batch size ,那么噪聲會降低,因此正則化效果減弱
不要把 Batch歸一化當作正則化
把它當作將你歸一化隱藏單元激活值并加速學習的方式
注意:
Batch歸一化一次只能處理一個mini-batch數據
7. 測試時的 Batch Norm
μ=1m∑iz(i)σ2=1m∑i(z(i)?μ)2znorm?(i)=z(i)?μσ2+εz~(i)=γznorm?(i)+β\begin{aligned} \mu &=\frac{1}{m} \sum_{i} z^{(i)} \\ \sigma^{2} &=\frac{1}{m} \sum_{i}\left(z^{(i)}-\mu\right)^{2} \\ z_{\text {norm }}^{(i)} &=\frac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}} \\ \tilde{z}^{(i)} &=\gamma z_{\text {norm }}^{(i)}+\beta \end{aligned}μσ2znorm?(i)?z~(i)?=m1?i∑?z(i)=m1?i∑?(z(i)?μ)2=σ2+ε?z(i)?μ?=γznorm?(i)?+β?
Batch歸一化 將你的數據以 mini-batch 的形式逐一處理,但是測試的時候,你可能不能將一個 mini-batch 中的所有樣本同時處理。
- 用指數加權平均來估算,這個平均數涵蓋了所有 mini-batch(訓練過程中計算 μ,σ2\mu, \sigma^2μ,σ2 的加權平均)
- 其他合理的方法也可以,比如對整個訓練集進行估計 μ,σ2\mu, \sigma^2μ,σ2
使用 Batch歸一化,你能夠訓練更深的網絡,學習算法運行速度更快
8. Softmax 回歸
可以用于多分類問題
Softmax 激活函數:
- 先計算 t=ez[l]t = e^{z^{[l]}}t=ez[l]
- 再每個元素除以總和a[l]=ez[l]∑j=1Ctia^{[l]}=\frac{e^{z^{[l]}}}{\sum_{j=1}^{C} t_{i}}a[l]=∑j=1C?ti?ez[l]?
Softmax 激活函數需要將所有可能的輸出歸一化,需要輸入一個向量,最后輸出一個向量
9. 訓練一個 Softmax 分類器
Softmax 層反向傳播時的梯度計算 :dz[l]=y^?yd z^{[l]}=\hat{y}-ydz[l]=y^??y
Softmax分類可以運用學習算法將輸入分成不止兩類,而是 C 個不同類別
10. 深度學習框架
Caffe/Caffe2
CNTK
DL4J
Keras
Lasagne
mxnet
Paddlepaddle
TensorFlow
Theano
Torch
選擇標準:
-
便于編程,包括神經網絡的開發和迭代,還包括為產品進行配置,為巨大的用戶的實際使用考慮
-
運行速度,特別是訓練大數據集時,一些框架能讓你更高效地運行和訓練神經網絡
-
框架是否真的開放,不僅需要開源,而且需要良好的管理。
程序框架 通過提供比數值線性代數庫更高程度的抽象化,讓你在開發深度學習應用時更加高效
11. TensorFlow
不安裝TF,直接在Google Colab 編程
import numpy as np import tensorflow as tf import tensorflow.compat.v1 as tf # 防止1.0版本語句報錯 tf.disable_v2_behavior() # 定義參數w w = tf.Variable(0, dtype=tf.float32)# 定義損失函數 w**2-10w+25 # cost = tf.add(tf.add(w**2,tf.multiply(-10.,w)),25) # 以下寫法也是可以的 cost = w**2-10*w+25# 0.01的學習率,目標是最小化損失函數 # train 為學習算法,使用梯度下降 train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)# 初始化 init = tf.global_variables_initializer()# 開啟 tf session session = tf.Session()# 初始化全局變量 session.run(init)# 讓tf評估一個變量 session.run(train) # 運行一次梯度下降 print(session.run(w)) # 打印w的現在的值 0.099999994# 運行1000次梯度下降迭代 for i in range(1000):session.run(train) print(session.run(w)) # 4.999988 很接近最優值5了 # 定義參數w w = tf.Variable(0, dtype=tf.float32)# 定義損失函數 w**2-10w+25 # cost = tf.add(tf.add(w**2,tf.multiply(-10.,w)),25) # 以下寫法也是可以的 # cost = w**2-10*w+25# 上面是對固定的函數而言的 # 給上面的函數添加變化的3個系數(placeholder,稍后給你數據) x = tf.placeholder(tf.float32, [3,1]) cost = x[0][0]*w**2 + x[1][0]*w + x[2][0]# 定義系數 coeff 提供給 x coefficient = np.array([[1.],[-10.],[25.]])# 0.01的學習率,目標是最小化損失函數 # train 為學習算法,使用梯度下降 train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)# 初始化 init = tf.global_variables_initializer()# 開啟 tf session session = tf.Session()# 初始化全局變量 session.run(init)# 讓tf評估一個變量 session.run(train, feed_dict={x:coefficient}) # 運行一次梯度下降 print(session.run(w)) # 打印w的現在的值 0.099999994# 運行1000次梯度下降迭代 for i in range(1000):session.run(train, feed_dict={x:coefficient}) print(session.run(w)) # 4.999988TensorFlow中的placeholder是一個你之后會賦值的變量,這種方式便于把訓練數據加入損失方程
運行訓練迭代,用feed_dict來讓x=coefficients。
如果在做mini-batch梯度下降,在每次迭代時,需要插入不同的mini-batch,那么每次迭代,你就用feed_dict來喂入訓練集的不同子集,把不同的mini-batch喂入損失函數需要數據的地方
TensorFlow如此強大,只需說明如何計算損失函數,它就能求導,用一兩行代碼就能運用梯度優化器,Adam優化器 或 其他優化器
作業
02.改善深層神經網絡:超參數調試、正則化以及優化 W3. 超參數調試、Batch Norm和程序框架(作業:TensorFlow教程+數字手勢預測)
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 473. 火柴拼正方形
- 下一篇: 天池 在线编程 捡胡萝卜(模拟)