自 2018 年開始接觸機器學習後, 三年下來仍然是一知半解. 最近從母校借來的 "精通機器學習 (第二版)" 因被預約即將歸還, 但書卻沒看多少, 只好將前三章閱讀筆記整理如下.
Source : 博客來
此書譯自 Oreilly 2019 年出版的原文書第二版 :
# Hands-on Machine Learning with Scikit-Learn, Keras, and TensorFlow (Oreilly, 2019)
Source : 博客來
之前也曾從母校借過此書原文第一版 (僅 16 章), 新版內容修訂擴充為 19 章. 與原文書價格相比, 翻譯本真的便宜多多, 且中文版閱讀速度可以更快.
此書屬於實作類, 沒有演算法方程式的理論推導, 而是簡單介紹概念後直接給出演算式, 接著列出 Python 實作, 用的是準生產框架 (scikit-learn 與 TensorFlow/Keras), 不是用來演繹理論的玩具版本 Python 程式. 本書 Jupyter 範例可從 GitHub 下載 :
閱讀此書的先備知識包括 :
- Numpy + Pandas + Matplotlib
- 微積分 + 線性代數 + 機率統計
手上還有其它幾本參考書也是很不錯, 可交互參照學習 :
# 深度學習必讀 (旗標)
# 最新 tf.Keras 深度學習攻略手冊 (旗標)
此書內容主要分成兩大部分, 第一部分介紹 Scikit-Learn 套件 (淺水區), 第二部分則是 TensorFlow 與 Keras (深水區). 但作者提醒不要匆忙地跳入深水區, 因為大部分的機器學習問題都可以用比較簡單的淺水區技術例如隨機森林等解決, 比較複雜的問題例如影像辨識, 語音辨識, 與自然語言處理才需要使用深度學習技術.
摘要整理前兩章筆記如下 :
CH1 :
- 深度神經網路是人類大腦的極度簡化模型, 深度學習一詞源自 Geoffrey Hinton 於 2006 年發表的一篇論文 "A Fast Learning Algorithm for Deep Belief Nets", 此論文介紹如何訓練深度神經網路使其能以 >%98 的準確度辨識手寫數字, 此論文重新喚起科學社群對神經網路的興趣.
- 機器學習是屬於計算機科學的一門科學及藝術, 可讓計算機用資料來學習. Arther Samuel 於 1959 年為機器學習所下的定義是 : "機器學習是一種學習領域, 可賦予電腦學習的能力, 且不需要明確地將規則編寫為程式".
- 雖然深度學習無疑是機器學習中最令人興奮的領域, 但也不要匆忙跳入深水區, 因為大部分的問題都可以用比較簡單的技術例如隨機森林等來解決. 深度學習非常適合用來處理複雜的問題, 例如影像辨識, 語音辨識, 或自然語言處理.
- 計算機傳統上是以編寫含有複雜規則的軟體 (rule-based) 來處理問題, 但有些問題 (例如語音與影像辨識) 並沒有很確切的規則或演算法來編寫程式, 而是需要從資料中動態學習其規則.
- 機器學習的分類 :
(1). 監督學習 vs 非監督學習 vs 半監督 vs 強化 (是否需要人類監督)
(2). 線上學習 vs 批次學習 (是否可在運行中不斷學習)
(3). 基於實例學習 vs 基於模型學習 (只拿新資料與已知資料比較, 或需建構預測模型) - 機器學習適合處理的問題 :
(1). 傳統解決方案需要許多微調與使用大量規則去處理的問題.
(2). 使用傳統方法無法得到良好解答之複雜問題.
(3). 波動的環境, 因為機器學習系統可以適應新資料.
(4). 需要深入了解的複雜問題或有大量資料的問題. - 機器學習的應用範例 :
(1). 生產線產品圖片自動分類 (可用 CNN)
(2). 辨識 CT 掃描圖片中的腫瘤部位 (可用 CNN)
(3). 新聞自動分類 (可用 RNN, CNN, 或 Transformer 等 NLP 技術)
(4). 自動標示論壇中的冒犯言論 (可用 RNN, CNN, 或 Transformer 等 NLP 技術)
(5). 自動摘要長篇文章 (可用 RNN, CNN, 或 Transformer 等 NLP 技術)
(6). 建立聊天機器人或數位助理 (使用 NLP 與詢答系統)
(7). 預測公司營收 (使用回歸模型)
(8). 建立語音回應 App (可用 RNN, CNN, 或 Transformer 等 NLP 技術)
(9). 偵測信用卡詐騙
(10). 依據顧客消費紀錄協助制訂行銷策略 (分群技術 & 推薦系統)
(11). 建立遊戲中的智慧機器人 (例如 AlphaGo 使用強化學習) - 典型的監督式學習任務 (task) 是分類, 例如分辨垃圾信件. 另外一個任務是依據特徵來預測目標 (target) 的數值, 稱為廻歸. 不過有些廻歸演算法也可以用來分類, 反之亦然. 例如 Logistic 回歸演算法經常被拿來做分類用.
- 在機器學習中, 屬性 (attribute) 指的是資料類型 (例如 gender), 而特徵 (feature) 則視情況而有不同意思, 但通常是指屬性加上其值 (例如 gender='female'), 屬性與特徵這兩個詞常常被混用.
- 最重要的幾個監督式學習演算法 :
(1). K-近鄰
(2). 線性回歸
(3). Logistic 回歸
(4). 支援向量機 (SVM)
(5). 決策樹與隨機森林
(6). 神經網路 (例如深度信念網路 deep belief network 為半監督式學習) - 在無監督式學習中, 訓練資料是沒有標籤的. 最重要的無監督學習演算法 :
(1). 分群 : K-Means, DBSCAN, 階層式分群 (HCA)
(2). 異常與新穎檢測 : one-class SVM, 孤立森林 (isolation forest)
(3). 視覺化與降維 : 主成分分析 (PCA), Kernel PCA, 局部線性嵌入 (LLE), t-隨機近鄰嵌入 (t-SNE)
(4). 關聯規則學習 : 先驗, Eclat
所謂新穎檢測 (novelty detection) 是檢測與訓練組的所有實例不一樣的新實例. - 降維 (dimensionality reduction) 目的是在不損失過多資訊的前題下簡化資料, 其中一種作法是將許多相關的特徵合併為一個, 例如汽車里程數與其車齡有緊密關係, 故降維演算法會將其合併為一個特徵, 以示汽車之損耗, 稱為特徵擷取 (feature extraction).
- 批次學習系統與線上學習的差別是, 系統能不能用持續傳入的資料來逐漸學習. 批次系統無法漸進學習, 必須先用所有可用資料來訓練, 通常需要大量時間與計算資源, 因此通常是離線的. 批次學習先訓練再於運營環境啟動它, 當它開始運行時就不再學習了, 只利用它學過的東西完成任務. 如果要讓批次系統認識新資料, 必須用新舊完整資料重新訓練, 然後停止系統換上新的模型. 有些任務 (例如預測股價) 因為新資料不斷出現, 因此頻繁地重新訓練系統所費不眥, 甚至因為資料量太大而無法使用批次學習系統.
- 線上學習系統可以在收到資料時立刻來學習, 資料彙分別依序傳入或以小批次 (mini batch) 的方式傳入, 每一個訓練步驟既快速又便宜. 線上學習適合需要持續接收資料串流的任務 (例如預測股價), 也適合在有限的計算資源下使用, 在學習過新資料實例後便不再需要它們, 因此可節省大量儲存空間.
- 線上學習有一個重要參數叫做學習速度 (learning rate), 表示系統適應不斷變動的資料速度有多快. 此學習率若設得很高, 系統會很快適應新資料, 但往往也會快速忘掉舊資料. 反之若設得低, 系統的慣性大, 學習速度慢, 但也對新資料的雜訊 (不具代表性的資料點) 較不敏感. 線上學習有一個很大的挑戰是, 進入系統的不良資料會讓系統的效能逐漸下滑, 為了降低這種風險, 必須監視密切系統, 一旦發現系統性能下降立即關閉線上學習; 或者需要監視輸入資料 (例如使用異常檢測演算法) 並處理異常資料.
- 機器學習系統還可以用其類推 (inference) 所學之方式來分類. 類推的方式主要有兩種 : 一是基於實例 (instance-based) 的學習, 一是基於模型 (model-based) 的學習. 基於實例的學習就是系統用死記硬背的方式學習樣本, 將新案例與學過的舊案例比較, 根據相似度 (similarity) 來類推新案例. 而基於模型的學習則是用一組樣本來建立這些樣本的模型, 然後再使用這些模型來類推新案例.
- 機器學習主要的工作簡單來說就是 :
(1). 選擇學習演算法
(2). 使用良好的資料進行訓練
機器學習出錯的原因也同樣有兩個原因 :
(1). 不良的演算法 (過擬或欠擬)
(2). 不良的資料 (訓練資料不足, 無代表性, 資料品質低, 使用無關的特徵) - 所謂抽樣雜訊指的就是無代表性的資料, 使用無代表性的資料不太可能訓練出準確的模型. 如果抽樣的方法有缺陷, 即使是很大的樣本也可能無代表性, 此種情形叫做抽樣偏差.
- 機器學習專案成功的關鍵之一在於找出一組良好的特徵來訓練, 此程序稱為特徵工程 (feature engineering), 它包含如下步驟 :
(1). 特徵選擇 (選出最有用的特徵來訓練)
(2). 特徵提取 (利用既有特徵來產生更時用的特徵)
(3). 收集新資料來建立新的特徵 - 所謂過擬 (overfitting) 是指模型在處理訓練資料時有很好的表現, 但是它無法進行正確的類推. 當模型的複雜程度遠超過訓練資料的數量和雜訊時, 就會出現過擬現象. 解決辦法是 :
(1). 簡化模型 : 選擇參數較少的模型, 減少訓練資料之屬性數量, 約束模型
(2). 收集更多訓練資料
(3). 減少訓練資料的雜訊 - 約束模型來簡化它以減少過擬風險稱為正則化 (regularization), 可以利用超參數 (superparameter) 來控制炫練期間的正則化程度. 超參數是演算法的參數, 它不會被學習演算法本身影響, 它必須在訓練之前設定好, 並且在訓練期間保持不變. 調整超參數是建立機器學習系統的重要程序.
- 欠擬 (underfitting) 就是過擬的相反, 它代表模型太簡單了, 以至於無法學習資料的任何底層結構, 不論是預測訓練案例或測試案例都是不準確的. 解決欠擬的辦法是 :
(1). 選擇更強大的模型, 使用更多參數
(2). 利用特徵工程餵更好的特徵給學習演算法
(3). 減少對模型的約束 (例如減少正則化超參數) - 機器學習專案的執行過程首先是收集訓練資料集 (訓練組), 然後將訓練資料餵給學習演算法. 如果演算法是基於模型的, 你需要調整一些參數來擬合訓練組 (即準確預測訓練組本身), 然後期待模型能準確預測新案例; 如果是基於實例的模型, 它只會用強記硬背的方式學習案例, 在使用相似度來比較新案例與已學過的實例以類推新案例.
- 類推新案例時的錯誤率稱為類推誤差 (generalization error 或 out-of-example error), 你可以用測試組來評估模型, 得到類推誤差的估計值, 藉以了解當模型遇到沒有看過的新實例時表現如何. 通常會將資料分成訓練組與測試組, 用訓練組來訓練學習模型, 然後用測試組來測試它. 一般使用 80% 的資料來訓練, 保留 20% 的資料來測試.
- 如果有多種模型可用不知道該選擇哪一個該怎麼做? 常用的解決辦法採用保留驗證 (holdout validation) 程序, 將訓練組挪出一部份稱為驗證組 (validation set) 或開發組 (dev set), 先用裁員過的訓練組 (即完整訓練組扣掉驗證組) 加上各種超參數來訓練多個模型, 再用驗證組來選出表現最好的模型. 完成這個保留驗證程序後, 再完整的訓練組來訓練這個最佳模型, 最後使用測試組來評估此模型的表現, 以便估計類推誤差. 驗證組不可太小, 否則模型的評估結果會不準確, 你可能會選到次優的模型. 但驗證組也不可太大, 因為這樣用來訓練各模型的資料就太少, 也無法挑到最好的模型. 可以使用許多小型的驗證組重複交叉驗證來解決此問題.
沒有留言:
張貼留言