梯度降低是一個用來求函數最小值的算法,咱們將使用梯度降低算法來求出代價函數J(θ0,θ1)J(θ0,θ1) 的最小值。算法
梯度降低背後的思想是:開始時咱們隨機選擇一個參數的組合(θ0,θ1,......,θn)(θ0,θ1,......,θn),計算代價函數,而後咱們尋找下一個能讓代價函數值降低最多的參數組合。咱們持續這麼作直到到到一個局部最小值(local minimum),由於咱們並無嘗試完全部的參數組合,因此不能肯定咱們獲得的局部最小值是否即是全局最小值(global minimum),選擇不一樣的初始參數組合,可能會找到不一樣的局部最小值。數組
想象一下你正站立在山的這一點上,站立在你想象的公園這座紅色山上,在梯度降低算法中,咱們要作的就是旋轉360度,看看咱們的周圍,並問本身要在某個方向上,用小碎步儘快下山。這些小碎步須要朝什麼方向?若是咱們站在山坡上的這一點,你看一下週圍,你會發現最佳的下山方向,你再看看周圍,而後再一次想一想,我應該從什麼方向邁着小碎步下山?而後你按照本身的判斷又邁出一步,重複上面的步驟,從這個新的點,你環顧四周,並決定從什麼方向將會最快下山,而後又邁進了一小步,並依此類推,直到你接近局部最低點的位置。機器學習
批量梯度降低(batch gradient descent)算法的公式爲:函數
其中α是學習率(learning rate),它決定了咱們沿着能讓代價函數降低程度最大的方向向下邁出的步子有多大,在批量梯度降低中,咱們每一次都同時讓全部的參數減去學習速率乘以代價函數的導數。導數是選擇一個方向學習
何時終止?atom
斜率等於0的時候spa
爲何不求導?3d
導數爲0時不必定是極值點,何況也不知道是否有導數orm
在梯度降低算法中,還有一個更微妙的問題,梯度降低中,咱們要更新θ0θ0和θ1θ1 ,當 j=0 和j=1時,會產生更新,因此你將更新J(θ0)J(θ0)和J(θ1)J(θ1)。實現梯度降低算法的微妙之處是,在這個表達式中,若是你要更新這個等式,你須要同時更新θ0θ0和θ1θ1,個人意思是在這個等式中,咱們要這樣更新:視頻
θ0θ0:= θ0θ0 ,並更新θ1θ1:= θ1θ1。
實現方法是:你應該計算公式右邊的部分,經過那一部分計算出θ0θ0和θ1θ1的值,而後同時更新θ0θ0和θ1θ1。
讓我進一步闡述這個過程:
在梯度降低算法中,這是正確實現同時更新的方法。我不打算解釋爲何你須要同時更新,同時更新是梯度降低中的一種經常使用方法。咱們以後會講到,同步更新是更天然的實現方法。當人們談到梯度降低時,他們的意思就是同步更新。
在接下來的視頻中,咱們要進入這個微分項的細節之中。我已經寫了出來但沒有真正定義,若是你已經修過微積分課程,若是你熟悉偏導數和導數,這其實就是這個微分項:
若是你不熟悉微積分,不用擔憂,即便你以前沒有看過微積分,或者沒有接觸過偏導數,在接下來的視頻中,你會獲得一切你須要知道,如何計算這個微分項的知識。
下一個視頻中,但願咱們可以給出實現梯度降低算法的全部知識 。
在以前的視頻中,咱們給出了一個數學上關於梯度降低的定義,本次視頻咱們更深刻研究一下,更直觀地感覺一下這個算法是作什麼的,以及梯度降低算法的更新過程有什麼意義。梯度降低算法以下圖:
θj:=θj−α∂∂θjJ(θ)θj:=θj−α∂∂θjJ(θ)
描述:對$\theta 賦值,使得賦值,使得J\left( \theta \right)按梯度下降最快方向進行,一直迭代下去,最終得到局部最小值。其中按梯度降低最快方向進行,一直迭代下去,最終獲得局部最小值。其中a$是學習率(learning rate),它決定了咱們沿着能讓代價函數降低程度最大的方向向下邁出的步子有多大。
對於這個問題,求導的目的,基本上能夠說取這個紅點的切線,就是這樣一條紅色的直線,恰好與函數相切於這一點,讓咱們看看這條紅色直線的斜率,就是這條恰好與函數曲線相切的這條直線,這條直線的斜率正好是這個三角形的高度除以這個水平長度,如今,這條線有一個正斜率,也就是說它有正導數,所以,我獲得的新的θ1θ1,θ1θ1更新後等於θ1θ1減去一個正數乘以aa。
這就是我梯度降低法的更新規則:θj:=θj−α∂∂θjJ(θ)θj:=θj−α∂∂θjJ(θ)
讓咱們來看看若是aa過小或aa太大會出現什麼狀況:
若是aa過小了,即個人學習速率過小,結果就是隻能這樣像小寶寶同樣一點點地挪動,去努力接近最低點,這樣就須要不少步才能到達最低點,因此若是aa過小的話,可能會很慢,由於它會一點點挪動,它會須要不少步才能到達全局最低點。
若是aa太大,那麼梯度降低法可能會越過最低點,甚至可能沒法收斂,下一次迭代又移動了一大步,越過一次,又越過一次,一次次越過最低點,直到你發現實際上離最低點愈來愈遠,因此,若是aa太大,它會致使沒法收斂,甚至發散。
如今,我還有一個問題,當我第一次學習這個地方時,我花了很長一段時間才理解這個問題,若是咱們預先把θ1θ1放在一個局部的最低點,你認爲下一步梯度降低法會怎樣工做?
假設你將θ1θ1初始化在局部最低點,在這兒,它已經在一個局部的最優處或局部最低點。結果是局部最優勢的導數將等於零,由於它是那條切線的斜率。這意味着你已經在局部最優勢,它使得θ1θ1再也不改變,也就是新的θ1θ1等於原來的θ1θ1,所以,若是你的參數已經處於局部最低點,那麼梯度降低法更新其實什麼都沒作,它不會改變參數的值。這也解釋了爲何即便學習速率aa保持不變時,梯度降低也能夠收斂到局部最低點。
咱們來看一個例子,這是代價函數J(θ)J(θ)。
我想找到它的最小值,首先初始化個人梯度降低算法,在那個品紅色的點初始化,若是我更新一步梯度降低,也許它會帶我到這個點,由於這個點的導數是至關陡的。如今,在這個綠色的點,若是我再更新一步,你會發現個人導數,也即斜率,是沒那麼陡的。隨着我接近最低點,個人導數愈來愈接近零,因此,梯度降低一步後,新的導數會變小一點點。而後我想再梯度降低一步,在這個綠點,我天然會用一個稍微跟剛纔在那個品紅點時比,再小一點的一步,到了新的紅色點,更接近全局最低點了,所以這點的導數會比在綠點時更小。因此,我再進行一步梯度降低時,個人導數項是更小的,θ1θ1更新的幅度就會更小。因此隨着梯度降低法的運行,你移動的幅度會自動變得愈來愈小,直到最終移動幅度很是小,你會發現,已經收斂到局部極小值。
回顧一下,在梯度降低法中,當咱們接近局部最低點時,梯度降低法會自動採起更小的幅度,這是由於當咱們接近局部最低點時,很顯然在局部最低時導數等於零,因此當咱們接近局部最低時,導數值會自動變得愈來愈小,因此梯度降低將自動採起較小的幅度,這就是梯度降低的作法。因此實際上沒有必要再另外減少aa。
這就是梯度降低算法,你能夠用它來最小化任何代價函數JJ,不僅是線性迴歸中的代價函數JJ。
在接下來的視頻中,咱們要用代價函數JJ,回到它的本質,線性迴歸中的代價函數。也就是咱們前面得出的平方偏差函數,結合梯度降低法,以及平方代價函數,咱們會得出第一個機器學習算法,即線性迴歸算法。
也就是說,即便學習學習效率α不變時,在接近最優解時,梯度也會很緩,因此降低的愈來愈慢因此依舊收斂
在之前的視頻中咱們談到關於梯度降低算法,梯度降低是很經常使用的算法,它不只被用在線性迴歸上和線性迴歸模型、平方偏差代價函數。在這段視頻中,咱們要將梯度降低和代價函數結合。咱們將用到此算法,並將其應用於具體的擬合直線的線性迴歸算法裏。
梯度降低算法和線性迴歸算法比較如圖:
對咱們以前的線性迴歸問題運用梯度降低法,關鍵在於求出代價函數的導數,即:
j=0 時:
j=1 時:
咱們剛剛使用的算法,有時也稱爲批量梯度降低。實際上,在機器學習中,一般不太會給算法起名字,但這個名字」批量梯度降低」,指的是在梯度降低的每一步中,咱們都用到了全部的訓練樣本,在梯度降低中,在計算微分求導項時,咱們須要進行求和運算,因此,在每個單獨的梯度降低中,咱們最終都要計算這樣一個東西,這個項須要對全部m個訓練樣本求和。所以,批量梯度降低法這個名字說明了咱們須要考慮全部這一"批"訓練樣本,而事實上,有時也有其餘類型的梯度降低法,不是這種"批量"型的,不考慮整個的訓練集,而是每次只關注訓練集中的一些小的子集。在後面的課程中,咱們也將介紹這些方法。
但就目前而言,應用剛剛學到的算法,你應該已經掌握了批量梯度算法,而且能把它應用到線性迴歸中了,這就是用於線性迴歸的梯度降低法。
若是你以前學過線性代數,有些同窗以前可能已經學太高等線性代數,你應該知道有一種計算代價函數J最小值的數值解法,不須要梯度降低這種迭代算法。在後面的課程中,咱們也會談到這個方法,它能夠在不須要多步梯度降低的狀況下,也能解出代價函數J的最小值,這是另外一種稱爲正規方程(normal equations)的方法。實際上在數據量較大的狀況下,梯度降低法比正規方程要更適用一些。
如今咱們已經掌握了梯度降低,咱們能夠在不一樣的環境中使用梯度降低法,咱們還將在不一樣的機器學習問題中大量地使用它。因此,祝賀你們成功學會你的第一個機器學習算法。
在下一段視頻中,告訴你泛化的梯度降低算法,這將使梯度降低更增強大。
在接下來的一組視頻中,我會對線性代數進行一個快速的複習回顧。若是你歷來沒有接觸過向量和矩陣,那麼這課件上全部的一切對你來講都是新知識,或者你以前對線性代數有所瞭解,但因爲隔得久了,對其有所遺忘,那就請學習接下來的一組視頻,我會快速地回顧你將用到的線性代數知識。
經過它們,你能夠實現和使用更強大的線性迴歸模型。事實上,線性代數不只僅在線性迴歸中應用普遍,它其中的矩陣和向量將有助於幫助咱們實現以後更多的機器學習模型,並在計算上更有效率。正是由於這些矩陣和向量提供了一種有效的方式來組織大量的數據,特別是當咱們處理巨大的訓練集時,若是你不熟悉線性代數,若是你以爲線性代數看上去是一個複雜、可怕的概念,特別是對於以前從未接觸過它的人,沒必要擔憂,事實上,爲了實現機器學習算法,咱們只須要一些很是很是基礎的線性代數知識。經過接下來幾個視頻,你能夠很快地學會全部你須要瞭解的線性代數知識。具體來講,爲了幫助你判斷是否有須要學習接下來的一組視頻,我會討論什麼是矩陣和向量,談談如何加、減 、乘矩陣和向量,討論逆矩陣和轉置矩陣的概念。
若是你十分熟悉這些概念,那麼你徹底能夠跳過這組關於線性代數的選修視頻,可是若是你對這些概念仍有些許的不肯定,不肯定這些數字或這些矩陣的意思,那麼請看一看下一組的視頻,它會很快地教你一些你須要知道的線性代數的知識,便於以後編寫機器學習算法和處理大量數據。