複雜度
- 空間複雜度(用層數和待優化的參數個數表示)
- 層數 = 隱藏層的層數+1個輸出層(輸入層不算)
- 總參數 = 總w + 總b
- 時間複雜度:
乘加運算次數
學習率
學習率是一個超參數,根據經驗來設定,學習速率調得太低,訓練速度會很慢,學習速率調的過高,每次迭代波動會很大,再反向傳播的過程中會更新權值w
指數衰減學習率:可以先用較大的學習率,快速得到較優解,然後逐步減小學習率,使模型再訓練後期穩定。
指數衰減學習率 = 初始學習率 * (學習率衰減率^(當前輪數/多少輪衰減一次))
激活函數
-
激活函數的定義:
激活函數(Activation Function),就是在人工神經網絡的神經元上運行的函數,負責將神經元的輸入映射到輸出端 -
爲什麼要有激活函數
如果不用激活函數,每一層輸出都是上層輸入的線性函數,無論神經網絡有多少層,輸出都是輸入的線性組合,這種情況就是最原始的感知機。
如果使用激活函數,激活函數給神經元引入了非線性因素,使得神經網絡可以逼近人任何非線性函數,這樣神經網絡可以用到多種非線性的模型中。 -
常用的激活函數
-
Sigmoid函數
特點:- 容易造成梯度消失
- 輸出非0均值,收斂慢
- 冪運算複雜,訓練時間長
-
Tanh函數
特點:- 輸出均值是0
- 易造成梯度損失
- 冪運算複雜,訓練時間長
-
Relu函數
優點:- 解決了梯度消失問題(在正區間)
- 只需判斷輸入是否大於0,計算速度快
- 收斂速度遠快於sigmoid和tanh
缺點:
- 輸出非0均值,收斂慢
- Dead RelU問題:某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新(不會被激活的原因:在負區間,輸入特徵爲0,在進行反向傳播的時候,梯度一直爲0,不會進行參數的更新)
-
Leaky Relu函數
理論上講,leaky Relu函數解決了輸入特徵爲負區間的問題,但是在實際操作中,多用Relu函數
-
-
總結:(對於初學者)
- 首選relu激活函數
- 學習率設置較小值
- 輸入特徵標準化,即讓輸入特徵滿足以0爲均值,1爲標準差的正態分佈
初始參數中心化,即讓隨機生成的參數滿足以0爲均值,爲標準差的正態分佈
損失函數
損失函數表示的是預測值y與標準答案y_的差距,損失函數可以定量判斷w、b的優劣,當損失函數輸出最小時,參數w、b會出現最優值
常用的損失函數:
-
均方誤差mse
loss_mse = tf.reduce_mean(tf.square(y - y_)) -
自定義損失函數(根據實際情況進行自定義,相當於自己建立模型)
如預測商品銷量,預測多了,損失成本;預測少了,損失利潤。若利潤不等於成本,則mse產生的loss無法利益最大化
自定義損失函數
loss_zdy = tf.reduce_sum(tf.where(tf.greater(y,y_),COST (y - y_),PROFIT(y_-y))) -
交叉熵損失函數CE(Cross Entropy):表徵兩個概率分佈之間的距離
Tf.losses.categorical_crossentory(y_,y)
例子:已知答案y_=(1,0) 預測y1=(0.6,0.4) y2=(0.8,0.2) 哪個更接近標準答案?softmax與交叉熵結合 輸出先過sofimax函數,再計算y與y_的交叉熵損失函數 tf.nn.softmax_cross_entropy_with_logits(y_,y)
下面的是筆者的微信公衆號,歡迎關注,會持續更新c++、python、tensorflow、機器學習、深度學習等系列文章