吳恩達老師機器學習課程筆記-第一周
來自專欄機器學習愛好者3 人贊了文章
機器學習筆記Markdown文件(視頻下載地址公布):
https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes筆記目錄
第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 第十周
第1周
一、 引言(Introduction)
1.1 歡迎
1.2 機器學習是什麼?
1.3 監督學習
1.4 無監督學習
二、單變數線性回歸(Linear Regression with One Variable)
2.1 模型表示
2.2 代價函數
2.3 代價函數的直觀理解I
2.4 代價函數的直觀理解II
2.5 梯度下降
2.6 梯度下降的直觀理解
2.7 梯度下降的線性回歸
2.8 接下來的內容
三、線性代數回顧(Linear Algebra Review)
3.1 矩陣和向量
3.2 加法和標量乘法
3.3 矩陣向量乘法
3.4 矩陣乘法
3.5 矩陣乘法的性質
3.6 逆、轉置
引言(Introduction)
1.1 歡迎
參考視頻: 1 - 1 - Welcome (7 min).mkv
第一個視頻主要講了什麼是機器學習,機器學習能做些什麼事情。
機器學習是目前信息技術中最激動人心的方向之一。在這門課中,你將學習到這門技術的前沿,並可以自己實現學習機器學習的演算法。
你或許每天都在不知不覺中使用了機器學習的演算法每次,你打開谷歌、必應搜索到你需要的內容,正是因為他們有良好的學習演算法。谷歌和微軟實現了學習演算法來排行網頁每次,你用Facebook或蘋果的圖片分類程序他能認出你朋友的照片,這也是機器學習。每次您閱讀您的電子郵件垃圾郵件篩選器,可以幫你過濾大量的垃圾郵件這也是一種學習演算法。對我來說,我感到激動的原因之一是有一天做出一個和人類一樣聰明的機器。實現這個想法任重而道遠,許多AI研究者認為,實現這個目標最好的方法是通過讓機器試著模仿人的大腦學習我會在這門課中介紹一點這方面的內容。
在這門課中,你還講學習到關於機器學習的前沿狀況。但事實上只了解演算法、數學並不能解決你關心的實際的問題。所以,我們將花大量的時間做練習,從而你自己能實現每個這些演算法,從而了解內部機理。
那麼,為什麼機器學習如此受歡迎呢?原因是,機器學習不只是用於人工智慧領域。
我們創造智能的機器,有很多基礎的知識。比如,我們可以讓機器找到A與B之間的最短路徑,但我們仍然不知道怎麼讓機器做更有趣的事情,如web搜索、照片標記、反垃圾郵件。我們發現,唯一方法是讓機器自己學習怎麼來解決問題。所以,機器學習已經成為計算機的一個能力。
現在它涉及到各個行業和基礎科學中。我從事於機器學習,但我每個星期都跟直升機飛行員、生物學家、很多計算機系統程序員交流(我在斯坦福大學的同事同時也是這樣)和平均每個星期會從矽谷收到兩、三個電子郵件,這些聯繫我的人都對將學習演算法應用於他們自己的問題感興趣。這表明機器學習涉及的問題非常廣泛。有機器人、計算生物學、矽谷中大量的問題都收到機器學習的影響。
這裡有一些機器學習的案例。比如說,資料庫挖掘。機器學習被用於數據挖掘的原因之一是網路和自動化技術的增長,這意味著,我們有史上最大的數據集比如說,大量的矽谷公司正在收集web上的單擊數據,也稱為點擊流數據,並嘗試使用機器學習演算法來分析數據,更好的了解用戶,並為用戶提供更好的服務。這在矽谷有巨大的市場。再比如,醫療記錄。隨著自動化的出現,我們現在有了電子醫療記錄。如果我們可以把醫療記錄變成醫學知識,我們就可以更好地理解疾病。再如,計算生物學。還是因為自動化技術,生物學家們收集的大量基因數據序列、DNA序列和等等,機器運行演算法讓我們更好地了解人類基因組,大家都知道這對人類意味著什麼。再比如,工程方面,在工程的所有領域,我們有越來越大、越來越大的數據集,我們試圖使用學習演算法,來理解這些數據。另外,在機械應用中,有些人不能直接操作。例如,我已經在無人直升機領域工作了許多年。我們不知道如何寫一段程序讓直升機自己飛。我們唯一能做的就是讓計算機自己學習如何駕駛直升機。
手寫識別:現在我們能夠非常便宜地把信寄到這個美國甚至全世界的原因之一就是當你寫一個像這樣的信封,一種學習演算法已經學會如何讀你信封,它可以自動選擇路徑,所以我們只需要花幾個美分把這封信寄到數千英里外。
事實上,如果你看過自然語言處理或計算機視覺,這些語言理解或圖像理解都是屬於AI領域。大部分的自然語言處理和大部分的計算機視覺,都應用了機器學習。學習演算法還廣泛用於自定製程序。每次你去亞馬遜或Netflix或iTunes Genius,它都會給出其他電影或產品或音樂的建議,這是一種學習演算法。仔細想一想,他們有百萬的用戶;但他們沒有辦法為百萬用戶,編寫百萬個不同程序。軟體能給這些自定製的建議的唯一方法是通過學習你的行為,來為你定製服務。
最後學習演算法被用來理解人類的學習和了解大腦。
我們將談論如何用這些推進我們的AI 夢想。幾個月前,一名學生給我一篇文章關於最頂尖的12個IT技能。擁有了這些技能HR絕對不會拒絕你。這是稍顯陳舊的文章,但在這個列表最頂部就是機器學習的技能。
在斯坦福大學,招聘人員聯繫我,讓我推薦機器學習學生畢業的人遠遠多於機器學習的畢業生。所以我認為需求遠遠沒有被滿足現在學習「機器學習」非常好,在這門課中,我希望能告訴你們很多機器學習的知識。
在接下來的視頻中,我們將開始給更正式的定義,什麼是機器學習。然後我們會開始學習機器學習的主要問題和演算法你會了解一些主要的機器學習的術語,並開始了解不同的演算法,用哪種演算法更合適。
1.2 機器學習是什麼?
參考視頻: 1 - 2 - What is Machine Learning_ (7 min).mkv
機器學習是什麼?在本視頻中,我們會嘗試著進行定義,同時讓你懂得何時會使用機器學習。實際上,即使是在機器學習的專業人士中,也不存在一個被廣泛認可的定義來準確定義機器學習是什麼或不是什麼,現在我將告訴你一些人們嘗試定義的示例。第一個機器學習的定義來自於Arthur Samuel。他定義機器學習為,在進行特定編程的情況下,給予計算機學習能力的領域。Samuel的定義可以回溯到50年代,他編寫了一個西洋棋程序。這程序神奇之處在於,編程者自己並不是個下棋高手。但因為他太菜了,於是就通過編程,讓西洋棋程序自己跟自己下了上萬盤棋。通過觀察哪種布局(棋盤位置)會贏,哪種布局會輸,久而久之,這西洋棋程序明白了什麼是好的布局,什麼樣是壞的布局。然後就牛逼大發了,程序通過學習後,玩西洋棋的水平超過了Samuel。這絕對是令人注目的成果。
儘管編寫者自己是個菜鳥,但因為計算機有著足夠的耐心,去下上萬盤的棋,沒有人有這耐心去下這麼多盤棋。通過這些練習,計算機獲得無比豐富的經驗,於是漸漸成為了比Samuel更厲害的西洋棋手。上述是個有點不正式的定義,也比較古老。另一個年代近一點的定義,由Tom Mitchell提出,來自卡內基梅隆大學,Tom定義的機器學習是,一個好的學習問題定義如下,他說,一個程序被認為能從經驗E中學習,解決任務T,達到性能度量值P,當且僅當,有了經驗E後,經過P評判,程序在處理T時的性能有所提升。我認為經驗E 就是程序上萬次的自我練習的經驗而任務T 就是下棋。性能度量值P呢,就是它在與一些新的對手比賽時,贏得比賽的概率。
在這些視頻中,除了我教你的內容以外,我偶爾會問你一個問題,確保你對內容有所理解。說曹操,曹操到,頂部是Tom Mitchell的機器學習的定義,我們假設您的電子郵件程序會觀察收到的郵件是否被你標記為垃圾郵件。在這種Email客戶端中,你點擊「垃圾郵件」按鈕,報告某些Email為垃圾郵件,不會影響別的郵件。基於被標記為垃圾的郵件,您的電子郵件程序能更好地學習如何過濾垃圾郵件。請問,在這個設定中,任務T是什麼?幾秒鐘後,該視頻將暫停。當它暫停時,您可以使用滑鼠,選擇這四個單選按鈕中的一個,讓我知道這四個,你所認為正確的選項。它可能是性能度量值P。所以,以性能度量值P為標準,這個任務的性能,也就是這個任務T的系統性能,將在學習經驗E後得到提高。
本課中,我希望教你有關各種不同類型的學習演算法。目前存在幾種不同類型的學習演算法。主要的兩種類型被我們稱之為監督學習和無監督學習。在接下來的幾個視頻中,我會給出這些術語的定義。這裡簡單說兩句,監督學習這個想法是指,我們將教計算機如何去完成任務,而在無監督學習中,我們打算讓它自己進行學習。如果對這兩個術語仍一頭霧水,請不要擔心,在後面的兩個視頻中,我會具體介紹這兩種學習演算法。此外你將聽到諸如,強化學習和推薦系統等各種術語。這些都是機器學習演算法的一員,以後我們都將介紹到,但學習演算法最常用兩個類型就是監督學習、無監督學習。我會在接下來的兩個視頻中給出它們的定義。本課中,我們將花費最多的精力來討論這兩種學習演算法。而另一個會花費大量時間的任務是了解應用學習演算法的實用建議。
我非常注重這部分內容,實際上,就這些內容而言我不知道還有哪所大學會介紹到。給你講授學習演算法就好像給你一套工具,相比於提供工具,可能更重要的,是教你如何使用這些工具。我喜歡把這比喻成學習當木匠。想像一下,某人教你如何成為一名木匠,說這是鎚子,這是螺絲刀,鋸子,祝你好運,再見。這種教法不好,不是嗎?你擁有這些工具,但更重要的是,你要學會如何恰當地使用這些工具。會用與不會用的人之間,存在著鴻溝。尤其是知道如何使用這些機器學習演算法的,與那些不知道如何使用的人。在矽谷我住的地方,當我走訪不同的公司,即使是最頂尖的公司,很多時候我都看到人們試圖將機器學習演算法應用於某些問題。有時他們甚至已經為此花了六個月之久。但當我看著他們所忙碌的事情時,我想說,哎呀,我本來可以在六個月前就告訴他們,他們應該採取一種學習演算法,稍加修改進行使用,然後成功的機會絕對會高得多所以在本課中,我們要花很多時間來探討,如果你真的試圖開發機器學習系統,探討如何做出最好的實踐類型決策,才能決定你的方式來構建你的系統,這樣做的話,當你運用學習演算法時,就不太容易變成那些為尋找一個解決方案花費6個月之久的人們的中一員。他們可能已經有了大體的框架,只是沒法正確的工作於是這就浪費了六個月的時間。所以我會花很多時間來教你這些機器學習、人工智慧的最佳實踐以及如何讓它們工作,我們該如何去做,矽谷和世界各地最優秀的人是怎樣做的。我希望能幫你成為最優秀的人才,通過了解如何設計和構建機器學習和人工智慧系統。
這就是機器學習,這些都是我希望講授的主題。在下一個視頻里,我會定義什麼是監督學習,什麼是無監督學習。此外,探討何時使用二者。
1.3 監督學習
參考視頻: 1 - 3 - Supervised Learning (12 min).mkv
在這段視頻中,我要定義可能是最常見一種機器學習問題:那就是監督學習。我將在後面正式定義監督學習。
我們用一個例子介紹什麼是監督學習把正式的定義放在後面介紹。假如說你想預測房價。
前陣子,一個學生從波特蘭俄勒岡州的研究所收集了一些房價的數據。你把這些數據畫出來,看起來是這個樣子:橫軸表示房子的面積,單位是平方英尺,縱軸表示房價,單位是千美元。那基於這組數據,假如你有一個朋友,他有一套750平方英尺房子,現在他希望把房子賣掉,他想知道這房子能賣多少錢。
那麼關於這個問題,機器學習演算法將會怎麼幫助你呢?
我們應用學習演算法,可以在這組數據中畫一條直線,或者換句話說,擬合一條直線,根據這條線我們可以推測出,這套房子可能賣$150,000,當然這不是唯一的演算法。可能還有更好的,比如我們不用直線擬合這些數據,用二次方程去擬合可能效果會更好。根據二次方程的曲線,我們可以從這個點推測出,這套房子能賣接近$200,000。稍後我們將討論如何選擇學習演算法,如何決定用直線還是二次方程來擬合。兩個方案中有一個能讓你朋友的房子出售得更合理。這些都是學習演算法裡面很好的例子。以上就是監督學習的例子。
可以看出,監督學習指的就是我們給學習演算法一個數據集。這個數據集由「正確答案」組成。在房價的例子中,我們給了一系列房子的數據,我們給定數據集中每個樣本的正確價格,即它們實際的售價然後運用學習演算法,算出更多的正確答案。比如你朋友那個新房子的價格。用術語來講,這叫做回歸問題。我們試著推測出一個連續值的結果,即房子的價格。
一般房子的價格會記到美分,所以房價實際上是一系列離散的值,但是我們通常又把房價看成實數,看成是標量,所以又把它看成一個連續的數值。
回歸這個詞的意思是,我們在試著推測出這一系列連續值屬性。
我再舉另外一個監督學習的例子。我和一些朋友之前研究過這個。假設說你想通過查看病歷來推測乳腺癌良性與否,假如有人檢測出乳腺腫瘤,惡性腫瘤有害並且十分危險,而良性的腫瘤危害就沒那麼大,所以人們顯然會很在意這個問題。
讓我們來看一組數據:這個數據集中,橫軸表示腫瘤的大小,縱軸上,我標出1和0表示是或者不是惡性腫瘤。我們之前見過的腫瘤,如果是惡性則記為1,不是惡性,或者說良性記為0。
我有5個良性腫瘤樣本,在1的位置有5個惡性腫瘤樣本。現在我們有一個朋友很不幸檢查出乳腺腫瘤。假設說她的腫瘤大概這麼大,那麼機器學習的問題就在於,你能否估算出腫瘤是惡性的或是良性的概率。用術語來講,這是一個分類問題。
分類指的是,我們試著推測出離散的輸出值:0或1良性或惡性,而事實上在分類問題中,輸出可能不止兩個值。比如說可能有三種乳腺癌,所以你希望預測離散輸出0、1、2、3。0 代表良性,1 表示第1類乳腺癌,2表示第2類癌症,3表示第3類,但這也是分類問題。
因為這幾個離散的輸出分別對應良性,第一類第二類或者第三類癌症,在分類問題中我們可以用另一種方式繪製這些數據點。
現在我用不同的符號來表示這些數據。既然我們把腫瘤的尺寸看做區分惡性或良性的特徵,那麼我可以這麼畫,我用不同的符號來表示良性和惡性腫瘤。或者說是負樣本和正樣本現在我們不全部畫X,良性的腫瘤改成用 O 表示,惡性的繼續用 X 表示。來預測腫瘤的惡性與否。
在其它一些機器學習問題中,可能會遇到不止一種特徵。舉個例子,我們不僅知道腫瘤的尺寸,還知道對應患者的年齡。在其他機器學習問題中,我們通常有更多的特徵,我朋友研究這個問題時,通常採用這些特徵,比如腫塊密度,腫瘤細胞尺寸的一致性和形狀的一致性等等,還有一些其他的特徵。這就是我們即將學到最有趣的學習演算法之一。
那種演算法不僅能處理2種3種或5種特徵,即使有無限多種特徵都可以處理。
上圖中,我列舉了總共5種不同的特徵,坐標軸上的兩種和右邊的3種,但是在一些學習問題中,你希望不只用3種或5種特徵。相反,你想用無限多種特徵,好讓你的演算法可以利用大量的特徵,或者說線索來做推測。那你怎麼處理無限多個特徵,甚至怎麼存儲這些特徵都存在問題,你電腦的內存肯定不夠用。我們以後會講一個演算法,叫支持向量機,裡面有一個巧妙的數學技巧,能讓計算機處理無限多個特徵。想像一下,我沒有寫下這兩種和右邊的三種特徵,而是在一個無限長的列表裡面,一直寫一直寫不停的寫,寫下無限多個特徵,事實上,我們能用演算法來處理它們。
現在來回顧一下,這節課我們介紹了監督學習。其基本思想是,我們數據集中的每個樣本都有相應的「正確答案」。再根據這些樣本作出預測,就像房子和腫瘤的例子中做的那樣。我們還介紹了回歸問題,即通過回歸來推出一個連續的輸出,之後我們介紹了分類問題,其目標是推出一組離散的結果。
現在來個小測驗:假設你經營著一家公司,你想開發學習演算法來處理這兩個問題:
- 你有一大批同樣的貨物,想像一下,你有上千件一模一樣的貨物等待出售,這時你想預測接下來的三個月能賣多少件?
- 你有許多客戶,這時你想寫一個軟體來檢驗每一個用戶的賬戶。對於每一個賬戶,你要判斷它們是否曾經被盜過?
那這兩個問題,它們屬於分類問題、還是回歸問題?
問題一是一個回歸問題,因為你知道,如果我有數千件貨物,我會把它看成一個實數,一個連續的值。因此賣出的物品數,也是一個連續的值。
問題二是一個分類問題,因為我會把預測的值,用 0 來表示賬戶未被盜,用 1 表示賬戶曾經被盜過。所以我們根據賬號是否被盜過,把它們定為0 或 1,然後用演算法推測一個賬號是 0 還是 1,因為只有少數的離散值,所以我把它歸為分類問題。
以上就是監督學習的內容。
1.4 無監督學習
參考視頻: 1 - 4 - Unsupervised Learning (14 min).mkv
本次視頻中,我們將介紹第二種主要的機器學習問題。叫做無監督學習。
上個視頻中,已經介紹了監督學習。回想當時的數據集,如圖表所示,這個數據集中每條數據都已經標明是陰性或陽性,即是良性或惡性腫瘤。所以,對於監督學習里的每條數據,我們已經清楚地知道,訓練集對應的正確答案,是良性或惡性了。
在無監督學習中,我們已知的數據。看上去有點不一樣,不同於監督學習的數據的樣子,即無監督學習中沒有任何的標籤或者是有相同的標籤或者就是沒標籤。所以我們已知數據集,卻不知如何處理,也未告知每個數據點是什麼。別的都不知道,就是一個數據集。你能從數據中找到某種結構嗎?針對數據集,無監督學習就能判斷出數據有兩個不同的聚集簇。這是一個,那是另一個,二者不同。是的,無監督學習演算法可能會把這些數據分成兩個不同的簇。所以叫做聚類演算法。事實證明,它能被用在很多地方。
聚類應用的一個例子就是在谷歌新聞中。如果你以前從來沒見過它,你可以到這個URL網址http://news.google.com去看看。谷歌新聞每天都在,收集非常多,非常多的網路的新聞內容。它再將這些新聞分組,組成有關聯的新聞。所以谷歌新聞做的就是搜索非常多的新聞事件,自動地把它們聚類到一起。所以,這些新聞事件全是同一主題的,所以顯示到一起。
事實證明,聚類演算法和無監督學習演算法同樣還用在很多其它的問題上。
其中就有基因學的理解應用。一個DNA微觀數據的例子。基本思想是輸入一組不同個體,對其中的每個個體,你要分析出它們是否有一個特定的基因。技術上,你要分析多少特定基因已經表達。所以這些顏色,紅,綠,灰等等顏色,這些顏色展示了相應的程度,即不同的個體是否有著一個特定的基因。你能做的就是運行一個聚類演算法,把個體聚類到不同的類或不同類型的組(人)……
所以這個就是無監督學習,因為我們沒有提前告知演算法一些信息,比如,這是第一類的人,那些是第二類的人,還有第三類,等等。我們只是說,是的,這是有一堆數據。我不知道數據裡面有什麼。我不知道誰是什麼類型。我甚至不知道人們有哪些不同的類型,這些類型又是什麼。但你能自動地找到數據中的結構嗎?就是說你要自動地聚類那些個體到各個類,我沒法提前知道哪些是哪些。因為我們沒有給演算法正確答案來回應數據集中的數據,所以這就是無監督學習。
無監督學習或聚集有著大量的應用。它用於組織大型計算機集群。我有些朋友在大數據中心工作,那裡有大型的計算機集群,他們想解決什麼樣的機器易於協同地工作,如果你能夠讓那些機器協同工作,你就能讓你的數據中心工作得更高效。第二種應用就是社交網路的分析。所以已知你朋友的信息,比如你經常發email的,或是你Facebook的朋友、谷歌+圈子的朋友,我們能否自動地給出朋友的分組呢?即每組裡的人們彼此都熟識,認識組裡的所有人?還有市場分割。許多公司有大型的資料庫,存儲消費者信息。所以,你能檢索這些顧客數據集,自動地發現市場分類,並自動地把顧客劃分到不同的細分市場中,你才能自動並更有效地銷售或不同的細分市場一起進行銷售。這也是無監督學習,因為我們擁有所有的顧客數據,但我們沒有提前知道是什麼的細分市場,以及分別有哪些我們數據集中的顧客。我們不知道誰是在一號細分市場,誰在二號市場,等等。那我們就必須讓演算法從數據中發現這一切。最後,無監督學習也可用於天文數據分析,這些聚類演算法給出了令人驚訝、有趣、有用的理論,解釋了星系是如何誕生的。這些都是聚類的例子,聚類只是無監督學習中的一種。
我現在告訴你們另一種。我先來介紹雞尾酒宴問題。嗯,你參加過雞尾酒宴吧?你可以想像下,有個宴會房間里滿是人,全部坐著,都在聊天,這麼多人同時在聊天,聲音彼此重疊,因為每個人都在說話,同一時間都在說話,你幾乎聽不到你面前那人的聲音。所以,可能在一個這樣的雞尾酒宴中的兩個人,他倆同時都在說話,假設現在是在個有些小的雞尾酒宴中。我們放兩個麥克風在房間中,因為這些麥克風在兩個地方,離說話人的距離不同每個麥克風記錄下不同的聲音,雖然是同樣的兩個說話人。聽起來像是兩份錄音被疊加到一起,或是被歸結到一起,產生了我們現在的這些錄音。另外,這個演算法還會區分出兩個音頻資源,這兩個可以合成或合併成之前的錄音,實際上,雞尾酒演算法的第一個輸出結果是:
1,2,3,4,5,6,7,8,9,10,
所以,已經把英語的聲音從錄音中分離出來了。
第二個輸出是這樣:
1,2,3,4,5,6,7,8,9,10。
看看這個無監督學習演算法,實現這個得要多麼的複雜,是吧?它似乎是這樣,為了構建這個應用,完成這個音頻處理似乎需要你去寫大量的代碼或鏈接到一堆的合成器JAVA庫,處理音頻的庫,看上去絕對是個複雜的程序,去完成這個從音頻中分離出音頻。事實上,這個演算法對應你剛才知道的那個問題的演算法可以就用一行代碼來完成。
就是這裡展示的代碼:
[W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x);
研究人員花費了大量時間才最終實現這行代碼。我不是說這個是簡單的問題,但它證明了,當你使用正確的編程環境,許多學習演算法是相當短的程序。所以,這也是為什麼在本課中,我們打算使用Octave編程環境。Octave,是免費的開源軟體,使用一個像Octave或Matlab的工具,許多學習演算法變得只有幾行代碼就可實現。
後面,我會教你們一點關於如何使用Octave的知識,你就可以用Octave來實現一些演算法了。或者,如果你有Matlab(盜版?),你也可以用Matlab。事實上,在矽谷里,對大量機器學習演算法,我們第一步就是建原型,在Octave建軟體原型,因為軟體在Octave中可以令人難以置信地、快速地實現這些學習演算法。這裡的這些函數比如SVM(支持向量機)函數,奇異值分解,Octave里已經建好了。如果你試圖完成這個工作,但藉助C++或JAVA的話,你會需要很多很多行的代碼,並鏈接複雜的C++或Java庫。所以,你可以實現這些演算法,藉助C++或Java或Python,它只是用這些語言來實現會更加複雜。
(編者註:這個是當時的情況,現在Python變主流了)
我已經見到,在我教機器學習將近十年後的現在,發現,學習可以更加高速,如果使用Octave作為編程環境,如果使用Octave作為學習工具,以及作為原型工具,它會讓你對學習演算法的學習和建原型快上許多。
事實上,許多人在大矽谷的公司里做的其實就是,使用一種工具像Octave來做第一步的學習演算法的原型搭建,只有在你已經讓它工作後,你才移植它到C++或Java或別的語言。事實證明,這樣做通常可以讓你的演算法運行得比直接用C++實現更快,所以,我知道,作為一名指導者,我必須說「相信我」,但對你們中從未使用過Octave這種編程環境的人,我還是要告訴你們這一點一定要相信我,我想,對你們而言,我認為你們的時間,你們的開發時間是最有價值的資源。我已經見過很多人這樣做了,我把你看作是機器學習研究員,或機器學習開發人員,想更加高產的話,你要學會使用這個原型工具,開始使用Octave。
最後,總結下本視頻內容,我有個簡短的複習題給你們。
我們介紹了無監督學習,它是學習策略,交給演算法大量的數據,並讓演算法為我們從數據中找出某種結構。
好的,希望你們還記得垃圾郵件問題。如果你有標記好的數據,區別好是垃圾還是非垃圾郵件,我們把這個當作監督學習問題。
新聞事件分類的例子,就是那個谷歌新聞的例子,我們在本視頻中有見到了,我們看到,可以用一個聚類演算法來聚類這些文章到一起,所以是無監督學習。
細分市場的例子,我在更早一點的時間講過,你可以當作無監督學習問題,因為我只是拿到演算法數據,再讓演算法去自動地發現細分市場。
最後一個例子,糖尿病,這個其實就像是我們的乳腺癌,上個視頻里的。只是替換了好、壞腫瘤,良性、惡性腫瘤,我們改用糖尿病或沒病。所以我們把這個當作監督學習,我們能夠解決它,作為一個監督學習問題,就像我們在乳腺癌數據中做的一樣。
好了,以上就是無監督學習的視頻內容,在下一個視頻中,我們將深入探究特定的學習演算法,開始介紹這些演算法是如何工作的,和我們還有你如何來實現它們。
二、單變數線性回歸(Linear Regression with One Variable)
2.1 模型表示
參考視頻: 2 - 1 - Model Representation (8 min).mkv
我們的第一個學習演算法是線性回歸演算法。在這段視頻中,你會看到這個演算法的概況,更重要的是你將會了解監督學習過程完整的流程。
讓我們通過一個例子來開始:這個例子是預測住房價格的,我們要使用一個數據集,數據集包含俄勒岡州波特蘭市的住房價格。在這裡,我要根據不同房屋尺寸所售出的價格,畫出我的數據集。比方說,如果你朋友的房子是1250平方尺大小,你要告訴他們這房子能賣多少錢。那麼,你可以做的一件事就是構建一個模型,也許是條直線,從這個數據模型上來看,也許你可以告訴你的朋友,他能以大約220000(美元)左右的價格賣掉這個房子。這就是監督學習演算法的一個例子。
它被稱作監督學習是因為對於每個數據來說,我們給出了「正確的答案」,即告訴我們:根據我們的數據來說,房子實際的價格是多少,而且,更具體來說,這是一個回歸問題。回歸一詞指的是,我們根據之前的數據預測出一個準確的輸出值,對於這個例子就是價格,同時,還有另一種最常見的監督學習方式,叫做分類問題,當我們想要預測離散的輸出值,例如,我們正在尋找癌症腫瘤,並想要確定腫瘤是良性的還是惡性的,這就是0/1離散輸出的問題。更進一步來說,在監督學習中我們有一個數據集,這個數據集被稱訓練集。
我將在整個課程中用小寫的來表示訓練樣本的數目。
以之前的房屋交易問題為例,假使我們回歸問題的訓練集(Training Set)如下表所示:
我們將要用來描述這個回歸問題的標記如下:
代表訓練集中實例的數量
代表特徵/輸入變數
代表目標變數/輸出變數
代表訓練集中的樣本
代表第 個觀察實例
代表學習演算法的解決方案或函數也稱為假設(hypothesis)
這就是一個監督學習演算法的工作方式,我們可以看到這裡有我們的訓練集里房屋價格 我們把它餵給我們的學習演算法,學習演算法的工作了,然後輸出一個函數,通常表示為小寫 表示。 代表hypothesis(假設),表示一個函數,輸入是房屋尺寸大小,就像你朋友想出售的房屋,因此根據輸入的 值來得出 值,值對應房子的價格,因此,是一個從 到 的函數映射。
我將選擇最初的使用規則 代表hypothesis,因而,要解決房價預測問題,我們實際上是要將訓練集「喂」給我們的學習演算法,進而學習得到一個假設,然後將我們要預測的房屋的尺寸作為輸入變數輸入給,預測出該房屋的交易價格作為輸出變數輸出為結果。那麼,對於我們的房價預測問題,我們該如何表達 ?
一種可能的表達方式為:,因為只含有一個特徵/輸入變數,因此這樣的問題叫作單變數線性回歸問題。
2.2 代價函數
參考視頻: 2 - 2 - Cost Function (8 min).mkv
在這段視頻中我們將定義代價函數的概念,這有助於我們弄清楚如何把最有可能的直線與我們的數據相擬合。如圖:
在線性回歸中我們有一個像這樣的訓練集, 代表了訓練樣本的數量,比如 。而我們的假設函數,也就是用來進行預測的函數,是這樣的線性函數形式:
。
接下來我們會引入一些術語,我們現在要做的便是為我們的模型選擇合適的參數(parameters) 和 ,在房價問題這個例子中便是直線的斜率和在 軸上的截距。
我們選擇的參數決定了我們得到的直線相對於我們的訓練集的準確程度,模型所預測的值與訓練集中實際值之間的差距(下圖中藍線所指)就是建模誤差(modeling error)。
我們的目標便是選擇出可以使得建模誤差的平方和能夠最小的模型參數。 即使得代價函數 最小。 我們繪製一個等高線圖,三個坐標分別為 和 和 :
則可以看出在三維空間中存在一個使得最小的點。
代價函數也被稱作平方誤差函數,有時也被稱為平方誤差代價函數。我們之所以要求出誤差的平方和,是因為誤差平方代價函數,對於大多數問題,特別是回歸問題,都是一個合理的選擇。還有其他的代價函數也能很好地發揮作用,但是平方誤差代價函數可能是解決回歸問題最常用的手段了。
在後續課程中,我們還會談論其他的代價函數,但我們剛剛講的選擇是對於大多數線性回歸問題非常合理的。
也許這個函數有點抽象,可能你仍然不知道它的內涵,在接下來的幾個視頻里,我們要更進一步解釋代價函數 的工作原理,並嘗試更直觀地解釋它在計算什麼,以及我們使用它的目的。
2.3 代價函數的直觀理解I
參考視頻: 2 - 3 - Cost Function - Intuition I (11 min).mkv
在上一個視頻中,我們給了代價函數一個數學上的定義。在這個視頻里,讓我們通過一些例子來獲取一些直觀的感受,看看代價函數到底是在幹什麼。
2.4 代價函數的直觀理解II
參考視頻: 2 - 4 - Cost Function - Intuition II (9 min).mkv
這節課中,我們將更深入地學習代價函數的作用,這段視頻的內容假設你已經認識等高線圖,如果你對等高線圖不太熟悉的話,這段視頻中的某些內容你可能會聽不懂,但不要緊,如果你跳過這段視頻的話,也沒什麼關係,不聽這節課對後續課程理解影響不大。
代價函數的樣子,等高線圖,則可以看出在三維空間中存在一個使得最小的點。
通過這些圖形,我希望你能更好地理解這些代價函數 所表達的值是什麼樣的,它們對應的假設是什麼樣的,以及什麼樣的假設對應的點,更接近於代價函數的最小值。
當然,我們真正需要的是一種有效的演算法,能夠自動地找出這些使代價函數 取最小值的參數 和 來。
我們也不希望編個程序把這些點畫出來,然後人工的方法來讀出這些點的數值,這很明顯不是一個好辦法。我們會遇到更複雜、更高維度、更多參數的情況,而這些情況是很難畫出圖的,因此更無法將其可視化,因此我們真正需要的是編寫程序來找出這些最小化代價函數的 和 的值,在下一節視頻中,我們將介紹一種演算法,能夠自動地找出能使代價函數 最小化的參數 和 的值。
2.5 梯度下降
參考視頻: 2 - 5 - Gradient Descent (11 min).mkv
梯度下降是一個用來求函數最小值的演算法,我們將使用梯度下降演算法來求出代價函數 的最小值。 梯度下降背後的思想是:開始時我們隨機選擇一個參數的組合 ,計算代價函數,然後我們尋找下一個能讓代價函數值下降最多的參數組合。我們持續這麼做直到到到一個局部最小值(local minimum),因為我們並沒有嘗試完所有的參數組合,所以不能確定我們得到的局部最小值是否便是全局最小值(global minimum),選擇不同的初始參數組合,可能會找到不同的局部最小值。
想像一下你正站立在山的這一點上,站立在你想像的公園這座紅色山上,在梯度下降演算法中,我們要做的就是旋轉360度,看看我們的周圍,並問自己要在某個方向上,用小碎步儘快下山。這些小碎步需要朝什麼方向?如果我們站在山坡上的這一點,你看一下周圍,你會發現最佳的下山方向,你再看看周圍,然後再一次想想,我應該從什麼方向邁著小碎步下山?然後你按照自己的判斷又邁出一步,重複上面的步驟,從這個新的點,你環顧四周,並決定從什麼方向將會最快下山,然後又邁進了一小步,並依此類推,直到你接近局部最低點的位置。 批量梯度下降(batch gradient descent)演算法的公式為:
其中 是學習率(learning rate),它決定了我們沿著能讓代價函數下降程度最大的方向向下邁出的步子有多大,在批量梯度下降中,我們每一次都同時讓所有的參數減去學習速率乘以代價函數的導數。
在梯度下降演算法中,還有一個更微妙的問題,梯度下降中,我們要更新 和 ,當 和 時,會產生更新,所以你將更新 和 。實現梯度下降演算法的微妙之處是,在這個表達式中,如果你要更新這個等式,你需要同時更新 和 ,我的意思是在這個等式中,我們要這樣更新: ,並更新 。 實現方法是:你應該計算公式右邊的部分,通過那一部分計算出 和 的值,然後同時更新 和 。 讓我進一步闡述這個過程:
在梯度下降演算法中,這是正確實現同時更新的方法。我不打算解釋為什麼你需要同時更新,同時更新是梯度下降中的一種常用方法。我們之後會講到,同步更新是更自然的實現方法。當人們談到梯度下降時,他們的意思就是同步更新。 在接下來的視頻中,我們要進入這個微分項的細節之中。我已經寫了出來但沒有真正定義,如果你已經修過微積分課程,如果你熟悉偏導數和導數,這其實就是這個微分項: , 。
如果你不熟悉微積分,不用擔心,即使你之前沒有看過微積分,或者沒有接觸過偏導數,在接下來的視頻中,你會得到一切你需要知道,如何計算這個微分項的知識。
下一個視頻中,希望我們能夠給出實現梯度下降演算法的所有知識 。
2.6 梯度下降的直觀理解
參考視頻: 2 - 6 - Gradient Descent Intuition (12 min).mkv
在之前的視頻中,我們給出了一個數學上關於梯度下降的定義,本次視頻我們更深入研究一下,更直觀地感受一下這個演算法是做什麼的,以及梯度下降演算法的更新過程有什麼意義。梯度下降演算法如下:
描述:對 賦值,使得 按梯度下降最快方向進行,一直迭代下去,最終得到局部最小值。其中 是學習率(learning rate),它決定了我們沿著能讓代價函數下降程度最大的方向向下邁出的步子有多大。
對於這個問題,求導的目的,基本上可以說取這個紅點的切線,就是這樣一條紅色的直線,剛好與函數相切於這一點,讓我們看看這條紅色直線的斜率,就是這條剛好與函數曲線相切的這條直線,這條直線的斜率正好是這個三角形的高度除以這個水平長度,現在,這條線有一個正斜率,也就是說它有正導數,因此,我得到的新的 ,更新後 等於 減去一個正數乘以 。 這就是我梯度下降法的更新規則:
讓我們來看看如果太小或太大會出現什麼情況:
如果 太小了,即我的學習速率太小,結果就是只能這樣像小寶寶一樣一點點地挪動,去努力接近最低點,這樣就需要很多步才能到達最低點,所以如果 太小的話,可能會很慢,因為它會一點點挪動,它會需要很多步才能到達全局最低點。 如果 太大,那麼梯度下降法可能會越過最低點,甚至可能無法收斂,下一次迭代又移動了一大步,越過一次,又越過一次,一次次越過最低點,直到你發現實際上離最低點越來越遠,所以,如果 太大,它會導致無法收斂,甚至發散。 現在,我還有一個問題,當我第一次學習這個地方時,我花了很長一段時間才理解這個問題,如果我們預先把 放在一個局部的最低點,你認為下一步梯度下降法會怎樣工作?
假設你將初始化在局部最低點,在這兒,它已經在一個局部的最優處或局部最低點。結果是局部最優點的導數將等於零,因為它是那條切線的斜率。這意味著你已經在局部最優點,它使得不再改變,也就是新的等於原來的,因此,如果你的參數已經處於局部最低點,那麼梯度下降法更新其實什麼都沒做,它不會改變參數的值。這也解釋了為什麼即使學習速率 保持不變時,梯度下降也可以收斂到局部最低點。
我們來看一個例子,這是代價函數 。
我想找到它的最小值,首先初始化我的梯度下降演算法,在那個品紅色的點初始化,如果我更新一步梯度下降,也許它會帶我到這個點,因為這個點的導數是相當陡的。現在,在這個綠色的點,如果我再更新一步,你會發現我的導數,也即斜率,是沒那麼陡的。隨著我接近最低點,我的導數越來越接近零,所以,梯度下降一步後,新的導數會變小一點點。然後我想再梯度下降一步,在這個綠點,我自然會用一個稍微跟剛才在那個品紅點時比,再小一點的一步,到了新的紅色點,更接近全局最低點了,因此這點的導數會比在綠點時更小。所以,我再進行一步梯度下降時,我的導數項是更小的, 更新的幅度就會更小。所以隨著梯度下降法的運行,你移動的幅度會自動變得越來越小,直到最終移動幅度非常小,你會發現,已經收斂到局部極小值。
回顧一下,在梯度下降法中,當我們接近局部最低點時,梯度下降法會自動採取更小的幅度,這是因為當我們接近局部最低點時,很顯然在局部最低時導數等於零,所以當我們接近局部最低時,導數值會自動變得越來越小,所以梯度下降將自動採取較小的幅度,這就是梯度下降的做法。所以實際上沒有必要再另外減小 。
這就是梯度下降演算法,你可以用它來最小化任何代價函數 ,不只是線性回歸中的代價函數 。
在接下來的視頻中,我們要用代價函數,回到它的本質,線性回歸中的代價函數。也就是我們前面得出的平方誤差函數,結合梯度下降法,以及平方代價函數,我們會得出第一個機器學習演算法,即線性回歸演算法。
2.7 梯度下降的線性回歸
參考視頻: 2 - 7 - GradientDescentForLinearRegression (6 min).mkv
在以前的視頻中我們談到關於梯度下降演算法,梯度下降是很常用的演算法,它不僅被用在線性回歸上和線性回歸模型、平方誤差代價函數。在這段視頻中,我們要將梯度下降和代價函數結合。我們將用到此演算法,並將其應用於具體的擬合直線的線性回歸演算法里。
梯度下降演算法和線性回歸演算法比較如圖:
對我們之前的線性回歸問題運用梯度下降法,關鍵在於求出代價函數的導數,即: 時: 時:
則演算法改寫成: Repeat {
?
? ?
}
我們剛剛使用的演算法,有時也稱為批量梯度下降。實際上,在機器學習中,通常不太會給演算法起名字,但這個名字」批量梯度下降」,指的是在梯度下降的每一步中,我們都用到了所有的訓練樣本,在梯度下降中,在計算微分求導項時,我們需要進行求和運算,所以,在每一個單獨的梯度下降中,我們最終都要計算這樣一個東西,這個項需要對所有個訓練樣本求和。因此,批量梯度下降法這個名字說明了我們需要考慮所有這一"批"訓練樣本,而事實上,有時也有其他類型的梯度下降法,不是這種"批量"型的,不考慮整個的訓練集,而是每次只關注訓練集中的一些小的子集。在後面的課程中,我們也將介紹這些方法。
但就目前而言,應用剛剛學到的演算法,你應該已經掌握了批量梯度演算法,並且能把它應用到線性回歸中了,這就是用於線性回歸的梯度下降法。
如果你之前學過線性代數,有些同學之前可能已經學過高等線性代數,你應該知道有一種計算代價函數 最小值的數值解法,不需要梯度下降這種迭代演算法。在後面的課程中,我們也會談到這個方法,它可以在不需要多步梯度下降的情況下,也能解出代價函數的最小值,這是另一種稱為正規方程(normal equations)的方法。實際上在數據量較大的情況下,梯度下降法比正規方程要更適用一些。
現在我們已經掌握了梯度下降,我們可以在不同的環境中使用梯度下降法,我們還將在不同的機器學習問題中大量地使用它。所以,祝賀大家成功學會你的第一個機器學習演算法。
在下一段視頻中,告訴你泛化的梯度下降演算法,這將使梯度下降更加強大。
2.8 接下來的內容
參考視頻: 2 - 8 - What_s Next (6 min).mkv
在接下來的一組視頻中,我會對線性代數進行一個快速的複習回顧。如果你從來沒有接觸過向量和矩陣,那麼這課件上所有的一切對你來說都是新知識,或者你之前對線性代數有所了解,但由於隔得久了,對其有所遺忘,那就請學習接下來的一組視頻,我會快速地回顧你將用到的線性代數知識。
通過它們,你可以實現和使用更強大的線性回歸模型。事實上,線性代數不僅僅在線性回歸中應用廣泛,它其中的矩陣和向量將有助於幫助我們實現之後更多的機器學習模型,並在計算上更有效率。正是因為這些矩陣和向量提供了一種有效的方式來組織大量的數據,特別是當我們處理巨大的訓練集時,如果你不熟悉線性代數,如果你覺得線性代數看上去是一個複雜、可怕的概念,特別是對於之前從未接觸過它的人,不必擔心,事實上,為了實現機器學習演算法,我們只需要一些非常非常基礎的線性代數知識。通過接下來幾個視頻,你可以很快地學會所有你需要了解的線性代數知識。具體來說,為了幫助你判斷是否有需要學習接下來的一組視頻,我會討論什麼是矩陣和向量,談談如何加、減 、乘矩陣和向量,討論逆矩陣和轉置矩陣的概念。
如果你十分熟悉這些概念,那麼你完全可以跳過這組關於線性代數的選修視頻,但是如果你對這些概念仍有些許的不確定,不確定這些數字或這些矩陣的意思,那麼請看一看下一組的視頻,它會很快地教你一些你需要知道的線性代數的知識,便於之後編寫機器學習演算法和處理大量數據。
三、線性代數回顧(Linear Algebra Review)
3.1 矩陣和向量
參考視頻: 3 - 1 - Matrices and Vectors (9 min).mkv
如圖:這個是4×2矩陣,即4行2列,如為行,為列,那麼即4×2
矩陣的維數即行數×列數
矩陣元素(矩陣項):
指第 行,第 列的元素。
向量是一種特殊的矩陣,講義中的向量一般都是列向量,如:
為四維列向量(4×1)。
如下圖為1索引向量和0索引向量,左圖為1索引向量,右圖為0索引向量,一般我們用1索引向量。 ,
3.2 加法和標量乘法參考視頻: 3 - 2 - Addition and Scalar Multiplication (7 min).mkv
矩陣的加法:行列數相等的可以加。
例:
矩陣的乘法:每個元素都要乘
組合演算法也類似。
3.3 矩陣向量乘法
參考視頻: 3 - 3 - Matrix Vector Multiplication (14 min).mkv
矩陣和向量的乘法如圖: 的矩陣乘以 的向量,得到的是 的向量
演算法舉例:
3.4 矩陣乘法
參考視頻: 3 - 4 - Matrix Matrix Multiplication (11 min).mkv
矩陣乘法:
矩陣乘以 矩陣,變成 矩陣。
如果這樣說不好理解的話就舉一個例子來說明一下,比如說現在有兩個矩陣 和 ,那麼它們的乘積就可以表示為圖中所示的形式。
3.5 矩陣乘法的性質
參考視頻: 3 - 5 - Matrix Multiplication Properties (9 min).mkv
矩陣乘法的性質:
矩陣的乘法不滿足交換律:
矩陣的乘法滿足結合律。即:
單位矩陣:在矩陣的乘法中,有一種矩陣起著特殊的作用,如同數的乘法中的1,我們稱這種矩陣為單位矩陣.它是個方陣,一般用 或者 表示,本講義都用 代表單位矩陣,從左上角到右下角的對角線(稱為主對角線)上的元素均為1以外全都為0。如:
對於單位矩陣,有
3.6 逆、轉置
參考視頻: 3 - 6 - Inverse and Transpose (11 min).mkv
矩陣的逆:如矩陣是一個矩陣(方陣),如果有逆矩陣,則:
我們一般在OCTAVE或者MATLAB中進行計算矩陣的逆矩陣。
矩陣的轉置:設 為 階矩陣(即 行 列),第 行 列的元素是 ,即:
定義 的轉置為這樣一個 階矩陣,滿足 ,即 ( 的第 行第 列元素是 的第 行第 列元素),記 。(有些書記為A=B) 直觀來看,將 的所有元素繞著一條從第1行第1列元素出發的右下方45度的射線作鏡面反轉,即得到 的轉置。
例:
矩陣的轉置基本性質:
matlab中矩陣轉置:直接打一撇,x=y
。
下一篇
第二周
推薦閱讀:
TAG:機器學習 | 吳恩達AndrewNg |