一、梯度下降法
1.什么是梯度下降法
順着梯度下滑,找到最陡的方向,邁一小步,然后再找當前位,置最陡的下山方向,再邁一小步…
通過比較以上兩個圖,可以會發現,由於初始值的不同,會得到兩個不同的極小值,所以權重初始值的設定也是十分重要的,通常的把W全部設置為0很容易掉到局部最優解,一般可以按照高斯分布的方式分配初始值。
2.有兩種計算梯度的方法:
(1)慢一些但是簡單一些的數值梯度/numerical gradient
對每個維度,都在原始值上加上一個很小的h,然后計算這個維度/方向上的偏導,最后組在一起得到梯度grad。
#encoding:utf-8 import numpy as np def eval_numeriical(f,x): """"計算x上f的梯度算法,x是一個vector,f為參數為x的函數""" fx=f(x) grad=np.zero(x.shape) h=0.00001 #對x的每個維度都計算一遍 it=np.nditer(x,flags=['multi_index'],op_flags=['readwrite']) while not it.finished: #計算x+h處的函數值 ix=it.multi_index old_value=x[ix] x[ix]=old_value+h fxh=f(x) x[ix]=old_value #計算偏導數 grad[ix]=(fxh-fx)/h it.iternext()
return grad
關於迭代的步長:1)步子邁得太小,時間耗不起。 2)步子邁得太大,容易跳過最小值,可能找不到最優點
(2) 速度快但是更容易出錯的解析梯度/analytic gradient
解析法計算梯度:速度非常快,但是容易出錯(反倒之前的數值法就顯出優勢),我們可以先計算解析梯度和數值梯度,然后比對結果和校正,然后就可以大膽地進行解析法計算了(這個過程叫做梯度檢查/檢測)
舉例:一個樣本點的SVM損失函數:
求偏導:
這個求偏導的意思是:當括號里的l是個布爾函數,表示如果括號里的表達式成立的話就是1,不成立的話就是0.
3.這個簡單的循環就是很多神經網絡庫的核心
4.什么是Mini-batch,以及其作用
Mini-batch就是從所有的訓練樣本中抽出一部分來訓練,被抽出的訓練樣本就是Mini-batch。
對整個訓練數據集的樣本都算一遍損失函數,以完成參數迭代是一件非常耗時的事情,一個我們通常會用到的替代方法是,采樣出一個子集在其上計算梯度。
二、反向傳播
簡單來說就是高數中得鏈式法則。
比如函數f(x,y,z)=(x+y)*z
Sigmoid例子
函數:
Sigmoid函數 的導數
具體算一下:
Sigmoid神經網絡的例子
(1)
(2)
(3)
(4)
以上為正向傳播的公式,(2)是對(1)的簡單縮寫,a=sigmod(z),c為cost損失函數,c對z的偏導為輸出層的誤差
損失函數要可導,第一個公式是求損失函數對於L層的神經元的偏導,為了更容易理解,不是對a求偏導,而是對z求偏導,其中a=sigmod(a)。也就是可以得出dc/dz,我們要求得dc/dw=dc/dz * dz/dw,而dz/dw就是a的值,最終推得第四個公式。
概括的一個描述: