在https://blog.csdn.net/hxx123520/article/details/104183577這個鏈接中已經詳細推導了線性損失函數函數的由來以及使用梯度下降和矩陣式求解求得θ使得損失函數最小。這個鏈接只是單純了介紹了梯度下降和矩陣式求解的方法。今天在詳細的介紹一下線性損失函數使用梯度下降的整體流程以及引入正則化。
首先先介紹兩個概念:梯度下降法和梯度下降思想。
梯度下降算法是一種通過迭代計算來不斷逼近目標函數的局部最優解的優化算法。當目標函數是凸函數(MSE就是一個凸函數)時,局部最優解就是全局最優解,在機器學習中目標函數就是損失函數。
梯度下降的思想很簡單,假設你一覺醒來發現自己身處某一座山的山頂,你想要下山,採用梯度下降的思想,你首先確定了你要去的方向,找到這個方向上的最佳下山方向,向下走了一小段。然後你休息一下,順便找到了接下來最佳的下山方向…一直重複執行這個操作,直到你順利到達山腳。但是可能一開始你並不知道你在山頂的那個地方,可能是左邊的紅圈,也可能是右邊的紅圈。很顯然,他們到達的山腳是不同的,所以這些“山腳”其實就是一個個 局部最優解(local minimum) ,你選擇的方向不同,就會得到不同的局部最優解。而你並不能確定到底哪個纔是我們需要的全局最優解(global minimum) 。
而對於凸函數,例如線性迴歸的均方誤差損失函數,無論選取如何的初始點,你到達的“山腳”都會到最低的那個地方。即最終都會收斂到相同的最小值。
在實際的計算中,“梯度”就是下山的方向,是函數在當前點的偏導數組成的向量。沿着梯度方向函數數值增長最快,沿着梯度相反方向函數下降最快。
接下來我們來看線性損失函數:
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
對於某個參數每次調整的公式如下:
θj:=θj−α∂θj∂J(θ)
對θ 賦值,使得J(θ)按梯度下降最快方向進行,一直迭代下去,最終得到局部最小值。其中是α(learning rate )叫做學習步長,代表下降幅度,步長,小會導致收斂慢,大會導致錯過最優點。它決定了我們沿着能讓代價函數下降程度最大的方向向下邁出的步子有多大。
對於這個問題,求導的目的,基本上可以說取這個紅點的切線,就是這樣一條紅色的直線,剛好與函數相切於這一點,讓我們看看這條紅色直線的斜率,就是這條剛好與函數曲線相切的這條直線,這條直線的斜率正好是這個三角形的高度除以這個水平長度,現在,這條線有一個正斜率,也就是說它有正導數,因此,我得到的新的θ1,θ1 更新後等於θ1 減去一個正數乘以α 。
假設損失函數有兩個參數θ0和θ1
θ0的調整公式如下:
θ0:=θ0−α∂θ0∂J(θ)
θ1的調整公式如下:
θ1:=θ1−α∂θ1∂J(θ)
接下來求解梯度∂θ0∂J(θ)和∂θ1∂J(θ)推導過程:
訓練集中只有一個樣本:
上面就是當訓練集只有一個樣本時的θ0和θ1的梯度推導過程,進行一個整合其實就是如下公式:
∂θj∂J(θ)=(hθ(x)−y)xj
θ0的調整如下:
θ0:=θ0−α(hθ(x)−y)x0
θ1的調整如下:
θ1:=θ1−α(hθ(x)−y)x1
整合θj的調整公式如下:
θj:=θj−α(hθ(x)−y)xj
訓練集中有m個樣本:
上面就是當訓練集有m個樣本時的θ0和θ1的梯度推導過程,進行一個整合其實就是如下公式:
∂θj∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))xj(i)
θ0的調整如下:
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)
θ1的調整如下:
θ1:=θ1−αm1i=1∑m(hθ(x(i))−y(i))x1(i)
整合θj的調整公式如下:
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
從上面的流程可以總結具體步驟爲:
1. 隨機初始化θ0和 θ1 ,即給一個隨機的點 (θ0,θ1) 開始下降
2.同時減小 θ0,θ1,到達一個新的點。
3.循環執行第二步直至收斂。
梯度下降算法中還有一個較爲重要的地方就是選擇學習率
只要學習率足夠小, J(θ) 就會必然減小。但如果學習率 a 太小,梯度下降的收斂過程可能會很慢,梯度下降的迭代次數會增多。就會讓算法失去意義。而學習率 a 過大,會使梯度下降的過程不斷震盪,導致無法收斂。
具體情況如下:
看到這裏,機智的你可能會想到,學習率大的時候下降快,小的時候下降穩,那這樣,我是不是可以先選個大的學習率來讓函數快速下降,然後改用小的學習率逼近收斂?實際上是不需要的,適當大的固定的學習率也可以保證收斂,因爲越接近最優值時梯度越小,梯度與學習率的乘積也會越小,對x的更新也就越小。也就是說,越接近最優值,梯度下降的增量就會自動變得越小。
以上的梯度下降算法,有時也稱爲 批量梯度下降 ,指的是在每個單獨的梯度下降中,我們都要計算微分求導項(也就是θ0,θ1的求導),這個項需要對所有m個訓練樣本求和。所以在梯度下降的每一步中,我們都用到了所有的訓練樣本,即“批量”的來歷。
正則化
正則化就是爲了解決過擬合問題,這邊先簡單的介紹一下正則化線性迴歸的推導,詳細的正則化內容將在下一篇中講解。
對於線性迴歸的求解,本文使用的基於梯度下降求解,線性迴歸的代價函數如下:
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
正則化線性迴歸的代價函數:
J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2]
可以看出,在線性損失函數中加入了正則項,正規化項中的λ稱爲正規化參數。
在前面列舉的例子是線性代價函數m個樣本θ0和θ1的推導過程,在實際情況中包含j個參數,會反覆更新參數θj,其中j=0,1,2,3,…,n。
先把j=0的情況單獨寫出來:θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)
j=(1,2,3,4…n)
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
對於正則化的線性迴歸,懲罰參數從θ1開始,不懲罰θ0。所以當修改這個正則化線性迴歸的算法時,將對θ0有所不同。
具體地說,如果要對這個算法進行修改,並用它求解正則化的目標函數,我們需要做的是把下面的這一項加上正則化項:
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)
j=(1,2,3,4…n)
θj:=θj−α[m1i=1∑m(hθ(x(i))−y(i))xj(i)+mλθj]
可以改寫成這種形式:
θj:=θj(1−αmλ)−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
下面是正則化線性代價函數中當θj中j爲(1,2,3…n,不包含0)梯度的推導,以及最小化正則化代價函數J(θ)的梯度下降算法
具體來講,這一項的值:
1−αmλ
通常是一個小於1的具體的實數(通常情況下是一個比1小一點點的值),所以我們可以把它想成一個像0.99一樣的數字。
所以 θj 更新的結果可以看作是被替換爲 θj 的0.99倍(把θj向0壓縮了一點點)。
另外後面的這一項:
αm1i=1∑m(hθ(x(i))−y(i))xj(i)
實際上與原來的梯度下降更新完全一樣。當使用正則化線性迴歸時,需要做的就是在每一個被正則化的參數θj上乘以了一個比1小一點點的數字,然後,執行跟以前一樣的更新。