1. 各位好,今天這門 AI 工具手把手工作坊會教大家使用一些 AI 工具,之前大家應該都已經上過一些理論課程了,所以今天這門課主要是著重在實作方面,希望讓大家在這個領域上能夠先入門上手。
2. 好,首先跟各位介紹一下我自己,我是林志傑,網路上常用的名字是 Fukuball,所以各位可以用 Fukuball 這個關鍵字找到我。我現在在 KKBOX 工作,之前在 iNDIEVOX 當過技術長、目前也是 CodeTengu 碼天狗技術週刊作者群之一,我使用 PHP 及 Python,最近對機器學習很有興趣,今天會把我所知道的都分享給大家,讓大家都有收穫。
3. 今天這門課程名稱有 AI 兩個字,我想就 AI 這個名詞再做一些說明,大家可能在科幻電影或小說上都有看過一些對 AI 的描寫與想像,其實這些在電影或小說上的 AI 是所謂的 Strong AI,主要是希望讓電腦能夠自己擁有智慧。而現今發展的 AI 技術大部分都還是所謂的 Weak AI,主要是希望電腦能夠展現出有智慧的行為。所以只要你能夠讓你的應用程式看起來能夠展現出智慧的行為,其實就是一種 AI。而今天大家要學的 Machine Learning 工具就是一種實踐 AI 的方法。
4. 那 Machine Learning 主要在做什麼呢?ML 說穿了就是在找一個 function,例如在語音辨識上,我們可以用 ML 找到一個 function 輸入「你好嗎」的音訊,電腦就會回傳「你好嗎」這個字串;在圖像辨識上,我們可以用 ML 找到一個 function 輸入貓的圖片,電腦就會回傳 “Cat”;在下圍棋上,我們可以用 ML 找到一個 function 輸入現在的棋盤圖片,電腦就會回傳下一步怎麼走;在金融業方面,我們可以用 ML 來預測風險等級,輸入目前的股票資訊,電腦就會回傳這個股票風險等級如何。所以 ML 其實就是去透過訓練資料來找出一個最好的 function 來完成我們以上所想達到的功能。
5. ML 的基本架構大概是長這樣子的,首先我們要先定義一堆 function 出來,這些 function 各有不同的參數,然後要定義 function 怎麼樣會是好的,比如在圖像辨識問題上,我們可以去定義犯錯較少的 function 比較好,然後從我們準備好的訓練資料丟到這些 function 全部算一算之後找到最好的 function,也就是犯錯最少的 function f*,我們就可以拿這個 function 來做未來新圖像的分類辨識。左邊就是我們的訓練過程,而右邊就是我們的測試過程。這就是 ML 的架構,基本上所有的 ML 流程就是這樣子。
6. 而 ML 的類型大致又可以分為監督式學習與非監督式學習,監督式學習就是你的訓練資料有標示出正確答案,非監督式學習就是訓練資料沒有正確答案。監督式學習比較容易理解,比如考試有正確答案,我們讓 ML 模型學習大量的題庫他就可能可以學到考試的內容,監督式學習主要就是用在學習分類以及迴歸,分類就是讓 function 回傳出一個類型,迴歸就是讓 function 回傳一個實數值,比如在金融應用上可以回傳股票的指數。非監督式學習比較難理解,沒有正確答案要怎麼學習呢?我們舉例來說,比如在作文考試時,其實就沒有正確答案,你是從大量文章中學習到怎麼去寫作文的,同樣的,非監督式學習用類似的方式來學習,我們一樣可能讓電腦寫作文,不過我們這堂課會教的是分群,分群的問題會比較通用,比如用在分析文章的主題。
7. 在進入實作之前,先讓大家看一張圖,這張圖是 scikit-learn ML 工具提供的 algorithm cheat-sheet,他展示了你遇到什麼問題應該要用什麼樣的 ML 演算法,其中可用的 ML 演算法可能有幾百個,不過他大致將問題分成四大類了,有 classification、regression、clusterning 以及降維,這四大類我們今天都會學到一些,讓大家有初步的認識,之後可以自己再慢慢延伸。
8. 大家剛剛已經看到 ML 演算法很多,其實就像海賊王裡面的喬巴一樣,喬巴會因為敵人招數的特性運用不同的形態來對付敵人,ML 的演算法也是一樣的,我們會因應問題的不同、資料的不同去使用不同的 ML 演算法,各種 ML 演算法在處理不同問題上各有優劣,沒有哪一個比較好,你只能從實驗中去挑選最好的模型出來。
9. 接下來我們就一起跟著喬巴動手做吧!
10. 今天會使用到的 ML 工具有下列的 Python 套件,Numpy 是用在矩陣運算的函式庫,Scikit-learn 是機器學習演算法函式庫,Pandas 是資料處理函式庫,Jieba 是中文斷詞函式庫,Jupyter Notebook 是我們的編譯器環境,大家應該在課堂前都已經裝好了。
11. 今天所有的範例程式碼我也都放到 github 了,大家可以去下載回來參考運用。
12. 首先我們遇到的第一個問題是惡性腫瘤分類問題。
13. 進一步探討惡性腫瘤診斷這個問題,其實他就是一個二元分類問題,可能是良性或惡性兩種分類,這在數學物理意義上,就是在訓練資料中找到一個 fucntion 也就是在空間中找到一條線或是超平面來將訓練資料中的良性或惡性的結果分開來。
14. 我們等一下會練習使用邏輯思迴歸 Logistic Regression Classifier 及隨機梯度下降 Stochastic Gradient Descent Classifier 來解這個分類問題。先讓我們來實作一下,等一下再來說明這個圖。
15. 接下來我們遇到的是手寫數字分類問題。
16. 進一步探討手寫數字辨識這個問題,其實他就是一個多元分類問題,可分成 0、1、2、3、4、5、6、7、8、9,這在數學物理意義上,一樣就是在訓練資料中找到一個 fucntion 也就是在空間中找到一條線或是超平面來將訓練資料中的良性或惡性的結果分開來。
17. 我們等一下會練習使用支持向量機 Support Vector Machine Classifier 這個分類問題。這邊稍微說明一下什麼事支持向量機,右邊這個圖,我們知道分類問題上就是在空間中找到一個超平面來將訓練資料分開來,而 SVM 不同的地方在於他要找一個最胖的超平面來將訓練資料分開來。最胖的超平面有什麼好處呢?其實從圖中我們就可以看出來,最胖的超平面能夠將不同的資料分最開,這在未來預測時可以容忍較多的雜訊,通常正確性也會比較高。讓我們來實作一下。
18. 接下來我們遇到的是美國波士頓房價問題。
19. 進一步探討美國波士頓這個問題,我們要預測房價,也就是 fucntion 需要回傳一個實數值,這就是一個迴歸問題。迴歸在數學物理意義上就是在空間中找一條線或者是超平面,讓訓練資料與超平面之間的差距最小,未來我們就可以用這條超平面來預測 y 值,也就是預測房價。
20. 我們等一下會練習使用線性迴歸 Linear Regression Classifier 及隨機梯度下降 Stochastic Gradient Descent Regression 來解這個迴歸問題。讓我們來實作一下。
21. 接下來練習使用支持向量機 Support Vector Machine Regression 來解這個迴歸問題。之前我們知道 SVM 有找胖胖的線的特性,他還有另外一個特性,就是可以更換他的核函數,核函數其實就是不同的數學模型,在空間上就是不同形狀的超平面,就像右圖二維平面所呈現的,不同的核函數就是不同的曲線,我們不知訓練資料的分佈形狀如何,使用不同的核函數,可能可以讓訓練出來的 function 可以更接近真實的資料分布。讓我們來實作一下。
22. 從這邊我們可以了解,有很多不同的機器學習演算法可以用,同一個演算法也可能有很多參數可以使用,比如 SVR 用了不同的核函數其實就是不同的模型,我們怎麼評估要使用哪個模型才能帶來最好的預測結果呢?ML 上發展了 Cross Validatinon 這個方法來幫助我們挑選模型,理論上會比較客觀,而且也可以帶來最好的預測結果。(稍微解釋一下 cross validation)
23. 接下來我們遇到的是無標籤資料問題。
24. 假設現在我們拿到了一堆沒有標示正確答案的訓練資料,又想要讓電腦可以預測新資料的類型是什麼,這樣的問題其實就是分群問題,是一種非監督式學習。我們要讓 ML 演算法從資料的特徵中去學習資料的異同。
比如現在有一堆不同顏色的積木散在地上,小孩子可以從中去觀察積木的形狀、顏色去將相似的積木分成一堆一堆,其實這就是一種分群的訓練方式。
25. 在分群問題上,我們等一下會使用 K-Means 這個經典的分群方法,讓我們來實作一下。
26. 接下來我們遇到的是自然語言處理。
27. 自然語言是什麼呢?其實就是我們平常常用的句子跟文章。句子與文章的資料特徵有其中的用字遣詞,這些用字遣詞就是句子與文章最小有意義的單位,也就是說我們在訓練資料中常會用到的資料特徵,在自然語言這樣的問題就是其中的「用詞」,因此自然語言處理的第一步就是斷詞。
28. 比如以「塵世中一個迷途小書僮」這個例子來說,沒有特別處理的話,電腦會將每個字分開處理,但這對我們來說是沒有意義的,因此在處理語意相關問題時,就會造成效果不佳。如果能夠斷成「塵世 / 中 / 一個 / 迷途 / 小 / 書僮」,這樣對我們來說就有意義多了,對於語意理解也會比較有幫助。
29. 這裡讓我們來說明一下中文斷詞有什麼特別的地方(說明投影片),以「我們在野生動物園玩」這句話來說,英文是「We play at the wildlife park」,在英文中我們可以直接以句子中的空白來斷詞,即可斷出有意義的詞出來。但中文我們沒有詞與詞之間的空白來斷詞,且中文中會有歧異詞的問題,因此「我們在野生動物園玩」可以斷出「我們 / 在野 / 生動 / 物 / 園 / 玩」或是「我們 / 在 / 野生 / 動物園 / 玩」,對我們來說,我們會希望電腦能斷出後面這個結果,但這個問題無法用簡單的 programming 來解決,這也是中文斷詞與英文斷詞不同的地方。
30. 了解了中文斷詞的背景知識之後,大家可能會想要知道那究竟要怎麼做中文斷詞,我在這邊會直接推薦使用 Jieba,因為我個人是工程師,還是以開發應用為導向,Jieba 應該是目前最穩定也最容易使用的中文斷詞程式。
31. 讓我們來實際使用一下 Jieba 來處理中文斷詞。
32. 最後我們來展示一個自然語言處理的應用範例,這邊我們會使用到潛在語意分析這個演算法。
33. 我們先用一個簡單的例子來說明潛在語意分析。
36. 接下來讓我們用真實的資料來實作出一個中文歌詞相似推薦系統。
37. 相似歌詞推薦系統大致的開發訓練流程如下:第一步,我們使用結巴中文斷詞將斷好詞的歌詞集合成一個資料集;然後我們需要去掉一些無用的停用字;接下來將每首歌詞做 encoding,把歌詞轉成用向量來表示;接下來使用 LSA 語意分析演算法進行降維,讓歌詞的潛在語意被凸顯出來;最後我們就可以使用 cosin similarity 來計算歌詞之間的相似度了。我這邊使用了 gensim 套件處理步驟 2-5,但全部自幹也不算太難。
因此完成這個訓練之後,我們就可以輸入一首歌詞,讓系統能夠推薦出語意相似的歌詞。
38. 這是剛才輸入的歌詞:楊培安的「我的驕傲」,推薦出來的結果很理想,前五名是:「楊培安 我的驕傲」、「五月天 倔強」、「張雨生 我的未來不是夢」、「五月天 憨人」、「五月天 一顆蘋果」基本上都是有關「夢想」、「不放棄」、「勵志」相關的歌曲。
39. 如果我們把歌詞攤開來看,我們的確可以感覺到歌詞中的語意是很相似的(分析歌詞)
40. 我們再展示一個例子,輸入周杰倫的「安靜」,推薦出來的結果很理想,前五名是:「周杰倫 安靜」、「黃品源 那麼愛你為什麼」、「孫燕姿 我不難過」、「陳奕迅 婚禮的祝福」、「周杰倫 斷了的弦」基本上都是有關「失戀」、「分手」、「心碎」相關的歌曲。
41. 這就是我今天這個講題所有的內容,希望大家都有得到收獲,如果有問題可以現在發問,或者用上面這些方式與我聯繫,謝謝!