導數
導數反映的是函數 f(x) 在 x 軸上某一點處沿着 x 軸正方向的變化率/變化趨勢。
f′(x0)=Δx→0limΔxΔy=Δx→0limΔxf(x0+Δx)−f(x0)
偏導數
因爲曲面上的每一點都有無窮多條切線,描述曲面函數的導數相當困難。偏導數就是選擇其中一條切線,並求出它的斜率。
z=f(x,y)=x2+xy+y2
-
一種求出這些切線的好辦法是把其他變量視爲常數。例如,欲求出以上的曲面函數在點(1,1,3) 與 y=1 平面的切線。(右圖爲 y=1 切面)
-
我們把變量 y 視爲常數,過對 x 求導:
∂x∂z=2x+y
-
得到點(1, 1, 3)的與 xOz 平面平行的切線的斜率爲 3。
一般地,函數 f(x1,...,xn) 在點 (a1,...,an) 關於 xi 的偏導數定義爲:
∂xi∂f(a1,…,an)=h→0limhf(a1,…,ai+h,…,an)−f(a1,…,an)
方向導數
導數和偏導數的定義中,均是沿座標軸正方向討論函數的變化率。而方向導數則是求某一點在某一趨近方向上的導數值,反映函數在特定方向上的變化率:
梯度
梯度即函數在某一點最大的方向導數,函數沿梯度方向函數有最大的變化率,梯度的值是最大方向導數的值。
利用有限差值計算梯度
對 x 所有維度進行迭代,在每個維度上產生一個很小的變化 h,通過觀察函數值變化,計算函數在該維度上的偏導數。最後,所有的梯度存儲在變量 grad 中:
def eval_numerical_gradient(f, x):
"""
一個f在x處的數值梯度法的簡單實現
- f是隻有一個參數的函數
- x是計算梯度的點
"""
fx = f(x)
grad = np.zeros(x.shape)
h = 0.00001
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
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
實際中用中心差值公式(centered difference formula)[f(x+h)−f(x−h)]/2h 效果較好。
代價函數的梯度
hθ(x)=θ0+θ1∗x
- 不同參數的 θi 可以擬合出不同的直線:
- 代價函數 J(θ) 隨參數 θi 的變化而變化:
-
θ0,θ1 初始值不同的時候,可能會找到不同局部最小值,這個正是 梯度下降算法 的特點。
-
一般線性迴歸的代價函數都是凸函數,只有一個全局最優值,如下圖:
梯度下降的詳細算法
先決條件
-
確認優化模型的 假設函數 和 代價函數。比如對於線性迴歸,假設函數表示爲:
hθ(x1,x2,...xn)=θ0x0+θ1x1+...+θnxn
即:
hθ(X)=Xθ
其中 θi 爲模型參數,xi 爲每個樣本 x 的第 i 個特徵值。X 爲 m∗(n+1) 維的矩陣,m 代表樣本的個數,n+1 代表樣本的特徵數,多加的1維作爲偏置項。
-
對應於上面的假設函數,代價函數爲:
J(θ0,θ1...,θn)=2m1j=0∑m(hθ(x0(j),x1(j),...xn(j))−y(j))2
即:
J(θ)=21(Xθ−Y)T(Xθ−Y)
其中 Y 是樣本的標籤值,維度爲 m∗1
算法過程
-
確定當前位置的代價函數的梯度,對於 θ 向量,其梯度表達式如下:
∂θ∂J(θ)=∂θi∂J(θ0,θ1...,θn)=m1j=0∑m(hθ(x0(j),x1(j),...xn(j))−y(j))xi(j)
即:
∂θ∂J(θ)=XT(Xθ−Y)
-
用學習速率 α 乘以代價函數的梯度,得到當前位置將要下降的距離:
α∂θ∂J(θ)=α∂θi∂J(θ0,θ1...,θn)
-
同步更新所有的 θ,對於 θi,其更新表達式如下。更新完畢後繼續轉入步驟1。
θi=θi−α∂θi∂J(θ0,θ1...,θn)
即:
θ=θ−αXT(Xθ−Y)
代價損失中 θ 偏導數公式推導
代價損失函數對於 θi 的偏導數計算,推導如下:
假設函數:
hθ(x1,x2)=θ0x0+θ1x1
代價損失函數:
J(θ0,θ1)=2m1j=0∑m(hθ(x0(j),x1(j))−y(j))2
=2m1j=0∑m((θ0x0(j)+θ1x1(j))−y(j))2
=2m1j=0∑m((θ0x0(j)+θ1x1(j))2+y(j)2−2(θ0x0(j)+θ1x1(j))y(j))
=2m1j=0∑m(θ02x0(j)2+θ12x1(j)2+2θ0x0(j)θ1x1(j)+y(j)2−2θ0x0(j)y(j)−2θ1x1(j)y(j))
代價損失函數對於θ0 的偏導數:
∂θ0∂J(θ0,θ1)=2m1j=0∑m(2θ0x0(j)2+2x0(j)θ1x1(j)−2x0(j)y(j))
=m1j=0∑m(θ0x0(j)2+x0(j)θ1x1(j)−x0(j)y(j))
=m1j=0∑m(θ0x0(j)+θ1x1(j)−y(j))x0(j)
=m1j=0∑m(hθ(x0(j),x1(j))−y(j))x0(j)
即:
∂θ∂J(θ)=∂θi∂J(θ0,θ1...,θn)=m1j=0∑m(hθ(x0(j),x1(j),...xn(j))−y(j))xi(j)
即:
∂θ∂J(θ)=XT(Xθ−Y)
批量梯度下降(Batch Gradient Descent,BGD)
- 批量梯度下降法,就是在梯度下降的每一步中,都 使用所有的樣本 來進行更新。前面的梯度下降算法過程,就是批量梯度下降法。
θi=θi−αj=0∑m(hθ(x0(j),x1(j),...xn(j))−yj)xi(j)
隨機梯度下降法(Stochastic Gradient Descent,SGD)
隨機梯度下降法,其實和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的 m 個樣本的數據,而是僅僅選取一個樣本 j 來求梯度。對應的更新公式是:
θi=θi−α(hθ(x0(j),x1(j),...xn(j))−yj)xi(j)
-
隨機梯度下降法,和批量梯度下降法是兩個極端,一個採用所有數據來梯度下降,一個用 1 個樣本來梯度下降。自然各自的優缺點都非常突出。
-
對於訓練速度來說,隨機梯度下降法由於每次僅僅採用 1 個樣本來迭代,訓練速度很快,而批量梯度下降法在樣本量很大的時候,訓練速度不能讓人滿意。
-
對於準確度來說,隨機梯度下降法用於僅僅用一個樣本決定梯度方向,導致解很有可能不是最優。對於收斂速度來說,由於隨機梯度下降法一次迭代一個樣本,導致迭代方向變化很大,不能很快的收斂到局部最優解。
小批量梯度下降法(Mini-batch Gradient Descent,MBGD)
-
小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對於 m 個樣本,我們採用 x 個樣本來迭代,1<x<m。
-
小批量數據的大小是一個超參數,但是一般並不需要通過交叉驗證來調參。它一般由存儲器的限制來決定的,比如 32,64,128 等。之所以使用2的指數,是因爲在實際中許多向量化操作實現的時候,如果輸入數據量是 2 的倍數,那麼運算更快。
-
對應的更新公式是:
θi=θi−αj=t∑t+x−1(hθ(x0(j),x1(j),...xn(j))−yj)xi(j)
-
使用向量化操作的代碼,一次計算 100 個數據 比100次計算 1 個數據要高效很多。