2.1 模型表示
我們的第一個學習算法是線性回歸算法。在這段視頻中,你會看到這個算法的概況,更重要的是你將會了解監督學習過程完整的流程。
讓我們通過一個例子來開始:這個例子是預測住房價格的,我們要使用一個數據集,數據集包含俄勒岡州波特蘭市的住房價格。在這里,我要根據不同房屋尺寸所售出的價格,畫出我的數據集。比方說,如果你朋友的房子是1250平方尺大小,你要告訴他們這房子能賣多少錢。那么,你可以做的一件事就是構建一個模型,也許是條直線,從這個數據模型上來看,也許你可以告訴你的朋友,他能以大約220000(美元)左右的價格賣掉這個房子。這就是監督學習算法的一個例子。
它被稱作監督學習是因為對于每個數據來說,我們給出了“正確的答案”,即告訴我們:根據我們的數據來說,房子實際的價格是多少,而且,更具體來說,這是一個回歸問題。回歸一詞指的是,我們根據之前的數據預測出一個準確的輸出值,對于這個例子就是價格,同時,還有另一種最常見的監督學習方式,叫做分類問題,當我們想要預測離散的輸出值,例如,我們正在尋找癌癥腫瘤,并想要確定腫瘤是良性的還是惡性的,這就是0/1離散輸出的問題。更進一步來說,在監督學習中我們有一個數據集,這個數據集被稱訓練集。
我將在整個課程中用小寫的來表示訓練樣本的數目。
以之前的房屋交易問題為例,假使我們回歸問題的訓練集(Training Set)如下表所示:
我們將要用來描述這個回歸問題的標記如下:
代表訓練集中實例的數量
代表特征/輸入變量
代表目標變量/輸出變量
代表訓練集中的實例
代表第
個觀察實例
代表學習算法的解決方案或函數也稱為假設(hypothesis)
這就是一個監督學習算法的工作方式,我們可以看到這里有我們的訓練集里房屋價格 我們把它喂給我們的學習算法,學習算法的工作了,然后輸出一個函數,通常表示為小寫 表示。
代表hypothesis(假設),
表示一個函數,輸入是房屋尺寸大小,就像你朋友想出售的房屋,因此
根據輸入的
值來得出
值,
值對應房子的價格 因此,
是一個從
到
的函數映射。
我將選擇最初的使用規則代表hypothesis,因而,要解決房價預測問題,我們實際上是要將訓練集“喂”給我們的學習算法,進而學習得到一個假設
,然后將我們要預測的房屋的尺寸作為輸入變量輸入給
,預測出該房屋的交易價格作為輸出變量輸出為結果。那么,對于我們的房價預測問題,我們該如何表達
?
一種可能的表達方式為:,因為只含有一個特征/輸入變量,因此這樣的問題叫作單變量線性回歸問題。
在這段視頻中我們將定義代價函數的概念,這有助于我們弄清楚如何把最有可能的直線與我們的數據相擬合。如圖:
在線性回歸中我們有一個像這樣的訓練集,代表了訓練樣本的數量,比如
。而我們的假設函數,也就是用來進行預測的函數,是這樣的線性函數形式:
。
接下來我們會引入一些術語我們現在要做的便是為我們的模型選擇合適的參數(parameters),在房價問題這個例子中便是直線的斜率和在
軸上的截距。
我們選擇的參數決定了我們得到的直線相對于我們的訓練集的準確程度,模型所預測的值與訓練集中實際值之間的差距(下圖中藍線所指)就是建模誤差(modeling error)。
我們的目標便是選擇出可以使得建模誤差的平方和能夠最小的模型參數。 即使得代價函數 最小。
我們繪制一個等高線圖,三個坐標分別為:
則可以看出在三維空間中存在一個使得最小的點。
代價函數也被稱作平方誤差函數,有時也被稱為平方誤差代價函數。我們之所以要求出誤差的平方和,是因為誤差平方代價函數,對于大多數問題,特別是回歸問題,都是一個合理的選擇。還有其他的代價函數也能很好地發揮作用,但是平方誤差代價函數可能是解決回歸問題最常用的手段了。
在后續課程中,我們還會談論其他的代價函數,但我們剛剛講的選擇是對于大多數線性回歸問題非常合理的。
也許這個函數有點抽象,可能你仍然不知道它的內涵,在接下來的幾個視頻里,我們要更進一步解釋代價函數J的工作原理,并嘗試更直觀地解釋它在計算什么,以及我們使用它的目的。
在上一個視頻中,我們給了代價函數一個數學上的定義。在這個視頻里,讓我們通過一些例子來獲取一些直觀的感受,看看代價函數到底是在干什么。
這節課中,我們將更深入地學習代價函數的作用,這段視頻的內容假設你已經認識等高線圖,如果你對等高線圖不太熟悉的話,這段視頻中的某些內容你可能會聽不懂,但不要緊,如果你跳過這段視頻的話,也沒什么關系,不聽這節課對后續課程理解影響不大。
代價函數的樣子,等高線圖,則可以看出在三維空間中存在一個使得最小的點。
通過這些圖形,我希望你能更好地理解這些代價函數所表達的值是什么樣的,它們對應的假設是什么樣的,以及什么樣的假設對應的點,更接近于代價函數
的最小值。
當然,我們真正需要的是一種有效的算法,能夠自動地找出這些使代價函數取最小值的參數
來。
我們也不希望編個程序把這些點畫出來,然后人工的方法來讀出這些點的數值,這很明顯不是一個好辦法。我們會遇到更復雜、更高維度、更多參數的情況,而這些情況是很難畫出圖的,因此更無法將其可視化,因此我們真正需要的是編寫程序來找出這些最小化代價函數的的值,在下一節視頻中,我們將介紹一種算法,能夠自動地找出能使代價函數
最小化的參數
的值。
梯度下降是一個用來求函數最小值的算法,我們將使用梯度下降算法來求出代價函數的最小值。
梯度下降背后的思想是:開始時我們隨機選擇一個參數的組合,計算代價函數,然后我們尋找下一個能讓代價函數值下降最多的參數組合。我們持續這么做直到找到一個局部最小值(local minimum),因為我們并沒有嘗試完所有的參數組合,所以不能確定我們得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數組合,可能會找到不同的局部最小值。
想象一下你正站立在山的這一點上,站立在你想象的公園這座紅色山上,在梯度下降算法中,我們要做的就是旋轉360度,看看我們的周圍,并問自己要在某個方向上,用小碎步盡快下山。這些小碎步需要朝什么方向?如果我們站在山坡上的這一點,你看一下周圍,你會發現最佳的下山方向,你再看看周圍,然后再一次想想,我應該從什么方向邁著小碎步下山?然后你按照自己的判斷又邁出一步,重復上面的步驟,從這個新的點,你環顧四周,并決定從什么方向將會最快下山,然后又邁進了一小步,并依此類推,直到你接近局部最低點的位置。
批量梯度下降(batch gradient descent)算法的公式為:
其中是學習率(learning rate),它決定了我們沿著能讓代價函數下降程度最大的方向向下邁出的步子有多大,在批量梯度下降中,我們每一次都同時讓所有的參數減去學習速率乘以代價函數的導數。
在梯度下降算法中,還有一個更微妙的問題,梯度下降中,我們要更新 ,當
時,會產生更新,所以你將更新
。實現梯度下降算法的微妙之處是,在這個表達式中,如果你要更新這個等式,你需要同時更新
,我的意思是在這個等式中,我們要這樣更新:
,并更新
。
實現方法是:你應該計算公式右邊的部分,通過那一部分計算出的值,然后同時更新
。
讓我進一步闡述這個過程:
在梯度下降算法中,這是正確實現同時更新的方法。我不打算解釋為什么你需要同時更新,同時更新是梯度下降中的一種常用方法。我們之后會講到,同步更新是更自然的實現方法。當人們談到梯度下降時,他們的意思就是同步更新。
在接下來的視頻中,我們要進入這個微分項的細節之中。我已經寫了出來但沒有真正定義,如果你已經修過微積分課程,如果你熟悉偏導數和導數,這其實就是這個微分項:
。
如果你不熟悉微積分,不用擔心,即使你之前沒有看過微積分,或者沒有接觸過偏導數,在接下來的視頻中,你會得到一切你需要知道,如何計算這個微分項的知識。
下一個視頻中,希望我們能夠給出實現梯度下降算法的所有知識 。
在之前的視頻中,我們給出了一個數學上關于梯度下降的定義,本次視頻我們更深入研究一下,更直觀地感受一下這個算法是做什么的,以及梯度下降算法的更新過程有什么意義。梯度下降算法如下:
描述:對賦值,使得
按梯度下降最快方向進行,一直迭代下去,最終得到局部最小值。其中
是學習率(learning rate),它決定了我們沿著能讓代價函數下降程度最大的方向向下邁出的步子有多大。
對于這個問題,求導的目的,基本上可以說取這個紅點的切線,就是這樣一條紅色的直線,剛好與函數相切于這一點,讓我們看看這條紅色直線的斜率,就是這條剛好與函數曲線相切的這條直線,這條直線的斜率正好是這個三角形的高度除以這個水平長度,現在,這條線有一個正斜率,也就是說它有正導數,因此,我得到的新的更新后等于
減去一個正數乘以
。
這就是我梯度下降法的更新規則:
讓我們來看看如果太小或
太大會出現什么情況:
如果太小了,即我的學習速率太小,結果就是只能這樣像小寶寶一樣一點點地挪動,去努力接近最低點,這樣就需要很多步才能到達最低點,所以如果
太小的話,可能會很慢,因為它會一點點挪動,它會需要很多步才能到達全局最低點。
如果太大,那么梯度下降法可能會越過最低點,甚至可能無法收斂,下一次迭代又移動了一大步,越過一次,又越過一次,一次次越過最低點,直到你發現實際上離最低點越來越遠,所以,如果
太大,它會導致無法收斂,甚至發散。
現在,我還有一個問題,當我第一次學習這個地方時,我花了很長一段時間才理解這個問題,如果我們預先把放在一個局部的最低點,你認為下一步梯度下降法會怎樣工作?
假設你將初始化在局部最低點,在這兒,它已經在一個局部的最優處或局部最低點。結果是局部最優點的導數將等于零,因為它是那條切線的斜率。這意味著你已經在局部最優點,它使得
不再改變,也就是新的
等于原來的
,因此,如果你的參數已經處于局部最低點,那么梯度下降法更新其實什么都沒做,它不會改變參數的值。這也解釋了為什么即使學習速率
保持不變時,梯度下降也可以收斂到局部最低點。
我們來看一個例子,這是代價函數。
我想找到它的最小值,首先初始化我的梯度下降算法,在那個品紅色的點初始化,如果我更新一步梯度下降,也許它會帶我到這個點,因為這個點的導數是相當陡的。現在,在這個綠色的點,如果我再更新一步,你會發現我的導數,也即斜率,是沒那么陡的。隨著我接近最低點,我的導數越來越接近零,所以,梯度下降一步后,新的導數會變小一點點。然后我想再梯度下降一步,在這個綠點,我自然會用一個稍微跟剛才在那個品紅點時比,再小一點的一步,到了新的紅色點,更接近全局最低點了,因此這點的導數會比在綠點時更小。所以,我再進行一步梯度下降時,我的導數項是更小的,更新的幅度就會更小。所以隨著梯度下降法的運行,你移動的幅度會自動變得越來越小,直到最終移動幅度非常小,你會發現,已經收斂到局部極小值。
回顧一下,在梯度下降法中,當我們接近局部最低點時,梯度下降法會自動采取更小的幅度,這是因為當我們接近局部最低點時,很顯然在局部最低時導數等于零,所以當我們接近局部最低時,導數值會自動變得越來越小,所以梯度下降將自動采取較小的幅度,這就是梯度下降的做法。所以實際上沒有必要再另外減小。
這就是梯度下降算法,你可以用它來最小化任何代價函數,不只是線性回歸中的代價函數
。
在接下來的視頻中,我們要用代價函數,回到它的本質,線性回歸中的代價函數。也就是我們前面得出的平方誤差函數,結合梯度下降法,以及平方代價函數,我們會得出第一個機器學習算法,即線性回歸算法。
在以前的視頻中我們談到關于梯度下降算法,梯度下降是很常用的算法,它不僅被用在線性回歸上和線性回歸模型、平方誤差代價函數。在這段視頻中,我們要將梯度下降和代價函數結合。我們將用到此算法,并將其應用于具體的擬合直線的線性回歸算法里。
梯度下降算法和線性回歸算法比較如圖:
對我們之前的線性回歸問題運用梯度下降法,關鍵在于求出代價函數的導數,即:
則算法改寫成:
Repeat {
??}
我們剛剛使用的算法,有時也稱為批量梯度下降。實際上,在機器學習中,通常不太會給算法起名字,但這個名字”批量梯度下降”,指的是在梯度下降的每一步中,我們都用到了所有的訓練樣本,在梯度下降中,在計算微分求導項時,我們需要進行求和運算,所以,在每一個單獨的梯度下降中,我們最終都要計算這樣一個東西,這個項需要對所有個訓練樣本求和。因此,批量梯度下降法這個名字說明了我們需要考慮所有這一"批"訓練樣本,而事實上,有時也有其他類型的梯度下降法,不是這種"批量"型的,不考慮整個的訓練集,而是每次只關注訓練集中的一些小的子集。在后面的課程中,我們也將介紹這些方法。
但就目前而言,應用剛剛學到的算法,你應該已經掌握了批量梯度算法,并且能把它應用到線性回歸中了,這就是用于線性回歸的梯度下降法。
如果你之前學過線性代數,有些同學之前可能已經學過高等線性代數,你應該知道有一種計算代價函數最小值的數值解法,不需要梯度下降這種迭代算法。在后面的課程中,我們也會談到這個方法,它可以在不需要多步梯度下降的情況下,也能解出代價函數
的最小值,這是另一種稱為正規方程(normal equations)的方法。實際上在數據量較大的情況下,梯度下降法比正規方程要更適用一些。
現在我們已經掌握了梯度下降,我們可以在不同的環境中使用梯度下降法,我們還將在不同的機器學習問題中大量地使用它。所以,祝賀大家成功學會你的第一個機器學習算法。
在下一段視頻中,告訴你泛化的梯度下降算法,這將使梯度下降更加強大。
在接下來的一組視頻中,我會對線性代數進行一個快速的復習回顧。如果你從來沒有接觸過向量和矩陣,那么這課件上所有的一切對你來說都是新知識,或者你之前對線性代數有所了解,但由于隔得久了,對其有所遺忘,那就請學習接下來的一組視頻,我會快速地回顧你將用到的線性代數知識。
通過它們,你可以實現和使用更強大的線性回歸模型。事實上,線性代數不僅僅在線性回歸中應用廣泛,它其中的矩陣和向量將有助于幫助我們實現之后更多的機器學習模型,并在計算上更有效率。正是因為這些矩陣和向量提供了一種有效的方式來組織大量的數據,特別是當我們處理巨大的訓練集時,如果你不熟悉線性代數,如果你覺得線性代數看上去是一個復雜、可怕的概念,特別是對于之前從未接觸過它的人,不必擔心,事實上,為了實現機器學習算法,我們只需要一些非常非常基礎的線性代數知識。通過接下來幾個視頻,你可以很快地學會所有你需要了解的線性代數知識。具體來說,為了幫助你判斷是否有需要學習接下來的一組視頻,我會討論什么是矩陣和向量,談談如何加、減 、乘矩陣和向量,討論逆矩陣和轉置矩陣的概念。
如果你十分熟悉這些概念,那么你完全可以跳過這組關于線性代數的選修視頻,但是如果你對這些概念仍有些許的不確定,不確定這些數字或這些矩陣的意思,那么請看一看下一組的視頻,它會很快地教你一些你需要知道的線性代數的知識,便于之后編寫機器學習算法和處理大量數據。
參考:https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/master/markdown/week1.md