Andrew 機器學習課程筆記
完成 Andrew 的課程結束至今已有一段時間,課程介紹深入淺出,很好的解釋了模型的基本原理以及應用。在我看來這是個很好的入門視頻,他老人家現在又出了一門 deep learning 的教程,雖然介紹的內容很淺,畢竟針對大部分初學者。不管學習到什么程度,能將課程跟一遍,或多或少會對知識體系的全貌有一個大致的理解。如果有時間的話,強烈建議跟完課程的同時完成各項作業。但值得注意的是,機器學習除了需要適當的數理基礎之外,還是一門實踐科學,只有通過不斷的深入積累才能有更好的成長。
本文僅是對自身學習的一個 log,總結的順序有所調整,其中也加入了自己的一些總結與思考。本想在此基礎上進行更多的擴展,但越想發現內容越多,似乎不是一篇博文能容納的,這或許要在以后分章節深入。既然是日記,還是點到為止就好,要不然就沒辦法寫完了。
筆記鏈接,每個小結前面都有一個總結概述。
目錄
Supervised Learning
Unsupervised Learning
Application
Introduction
機器學習的定義
機器學習的定義,我覺得還是 Tom Mitchell 的表述很到位:
"Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance P, if its performance on T, as measured by P, improves with experience E".
以垃圾郵件分類為例:
T : 基於郵件的內容,將郵件分為垃圾郵件(1)和 正常郵件(0)。這是一個典型的二分類問題。
E : 歷史數據,每個實例可以是 [text, label] 這樣的元組,而 label = 1 or 0。
P : 被分正確的實例占總實例的比例,accuracy
也就是說,在抽象一個實際問題時,我們要弄明白任務(T)是什么,要調研好我們是否有足夠的 Experience 來供模型進行學習,最后還要選擇好的 matrics 來評價你當前模型的好壞。
其實這和我們人類學習的過程是類似的,我們總以某種目的去完成某個學習任務(T),此過程中我們可以通過一些歷史的經驗(E,看書或從老師那里獲取經驗性的知識),對於紛繁復雜的信息我們需要有一定的判別能力(P)去度量我們當前的學習情況。
課程的主要內容
- 監督學習(supervised learning)(有 label,ground truth)
- 分類(classification):label 是離散的 (垃圾郵件分類)
- 回歸(regression):label 是連續的 (房價預測)
- 非監督學習(unsupervised learning)
- 聚類(clustering)
- 降維(dimensionality reduction)
- 異常檢測(anomaly detection)
- 其他話題:推薦系統,大規模機器學習任務的並行
- 一些關於模型選擇或參數選擇的經驗介紹
課程最開始以線性回歸解決房價預測問題為切入點,介紹了常用的監督學習方法(linear regression,logistic regression,svm,neural network),中間還穿插了優化方法(主要是 gradient decent)以及模型選擇和調優的一些經驗性建議(欠擬合/過擬合問題的發現和解決,模型選擇,參數選擇技巧等)。接下來過渡到非監督學習,每個話題列舉了一個常用的算法,聚類(k-means),降維(PCA),異常檢測(density estimation)。在介紹各算法過程中,不僅介紹了基本原理,還適當介紹了算法的優缺點,適用場景,關鍵參數選擇等。
最后基於業界很火的商業介紹了幾個方向上的應用,比如推薦系統。以 OCR 為例探討了如何運用機器學習解決實際問題。還討論了大規模數據中的優化問題(map-reduce)。
supervised learning
02. linear regression
核心思想:每個實例可以看成<features, y> 這樣的一個向量,簡單的線性回歸就是直接構建多個 feature 和目標 y 的線性關系,權重直接表示了 feature 的重要性,此外還有一個殘差項/常數項 bias。基於此升級得到多元回歸,這里主要是對 features 進行處理,對已有的 feature 進行更復雜的組合。
典型的例子:房價預測
線性回歸:y = w1*x1 + ... + wm*xm + bias
多元回歸:y = w1*x1 + w2*x2 + w3*x1*x2 (除了單個變量的系數之外,還有變量間的相互作用,實際上變量間的相互作用可以看作是新生成的特征)
loss function: 誤差平方和
求解方法:梯度下降,最小二乘法
python regression tutorial 很好的介紹了常用的線性回歸模型
03. Logistic regression
LR 是廣義線性模型,用以解決二分類問題。目標是在空間中找到一個決策平面將兩個不同類別的實例分開,其核心是在決策邊界上通過 sigmoid 函數將 [-inf,inf] 的區間映射到 [0,1] 范圍內,可以看作直接對后驗概率的估計,這一性質在很多場景中很有用,比如在點擊率預估的應用中,LR 的輸出可以直接表達為點擊概率。
LR 的 loss function 可以通過二項分布結合最大似然推倒而得,同時也是交叉熵的特例。在實際優化過程中往往還會加上 L1 或 L2 正則。
LR 解決的是二分類問題,通常采用 one-vs-all 的方式來解決多分類問題。對於 k 個類,我們需要 k 個分類器,每個分類器的對應一個類的識別,預測時將 k 個輸出中最大值對應的類標作為預測結果。
-
優化方法:GD,或高級的優化算法
-
優點:廣義線性模型,權重直接反應 feature 的重要性,可解釋性好;輸出為概率值,在很多應用場景很有用;sigmoid 函數處處可導,擁有很好的數學性質;容易實現,容易並行,效率高。
-
缺點:廣義線性模型,需要很多特征工程,適用於大規模離散數據,因為離散后的高維空間中更容易找到線性可分的分類面。
-
很受工業界歡迎。
-
一些典型的應用:
- Email: Spam / Not Spam
- Online Transactions : Fraudulent (Yes/No)
- Tumor : Malignant / Benign
- 點擊率預估: click or not
04. Neural Network
神經網絡是一種類人腦的設計,在人腦中神經元之間通過突觸進行連接。當人的某個部位受到刺激之后,就會沿着這樣連接起來的神經元進行信號的傳遞,一個神經元接收來自多個神經元的信號作為輸入,只有當這些信號的累計值超過某一個閾值時,當前的神經元才會興奮。
由此可得到神經網絡中的關鍵組件:
- neurons(神經元)
- activation (激活函數)
- bias / threshold (控制是否興奮的閾值)
- layer
- input layer (輸入層)
- hidden layer (隱藏層,可以有多層,神經元帶有 activation function)
- out put layer :全連接層,對於多分類問題可以使用 one-hot-vector 編碼,即對於 k 個類,可以使用 k 個值的向量,預測的類對應的元素為 1, 其他位為 0。還可以使用 one-vs-all。
神經網絡在 80 到 90 年代早期得到廣泛的應用,之后由於深層網絡優化困難而一度沉寂。后來在反向傳播這樣的有效優化算法出來后又再次復蘇。神經網絡的層層連接,相當於函數的層層嵌套,整合起來就是一個復雜的非線性函數,具有很強大的學習能力,從理論上來說任何一個問題都可以被一個或多個這樣的函數逼近。值得注意的是,學習能力強大的同時導致了容易過擬合的問題。
簡單的例子:
- AND, OR 函數可以通過一層神經網絡進行構造 (相當於感知機)
- XOR 需要兩層
神經網絡的訓練:
- 隨機初始值(最好多嘗試幾組)
- 執行前向傳播(forward propagation),計算預測值
- 計算預測值和 ground truth 的差異得到誤差
- 執行反向傳播(backpropagation),將錯誤反向傳播,達到減小誤差的目的
- 注意:
- 檢查 GD 的正確性,可以使用數值解來校驗近似解(驗證以后注意將數值解部分的代碼注釋掉)
- 使用 GD 或高級的優化方法通過反向傳播優化模型
05. SVM
SVM 有一套完整的嚴格的理論支持,在實際中得到廣泛應用,經常和Logistic regression 一起出現。這里只做一個直觀性的總結。SVM 的基本型是解決如下圖的線性可分問題,即找到一個分類平面使得兩個類別之間的 margin 最大化,margin 是支持向量間的距離,即結構風險最小化。其中支持向量(support vector)是那些落在距離決策平面距離為 +/-1 的面上的點。
核技巧是 SVM 的一個關鍵技術。引入核技巧解決非線性可分問題,即將線性不可分問題的樣本空間映射到映射到高維空間中,在高維空間中更容易找到線性可分的分類面。
在應用方面。線性可分的情況下使用 linear svm。非線性可分的情況下,一般使用 Gaussian 核,還有其他的核函數,String kernel, chi-square kernel, histogram intersection kernel 可以嘗試。
訓練過程中涉及的重要參數(通常使用 cross-validation 來進行參數選擇):
- C : 懲罰因子,是我們常說的 regularization parameter 的倒數 (1/lamda),其值越大越容易過擬合
- 核函數和核參數的選擇
優化算法:SMO(Sequential Minimal Optimization)
對噪聲敏感,如何解決過擬合問題?
- noise: 加入松弛變量,在一定程度上容許錯誤的存在
- 使用 cross-validation 選擇合適的參數
標准型的 SVM 只針對二分類問題,解決多分類問題需要進一步調整,經常用的是 on-vs-all 的建模方式:
對於回歸問題可以使用 SVR。
06. some advice
對模型進行診斷和fine tune 往往是個耗時的過程,但卻是一個必須和有效的過程。
梯度下降(GD)優化算法
-
gradient descendent
- 梯度的反方向是函數減小最大的方向
- loss function 對各個參數求偏導得到梯度
- 參數初始化
- 參數沿着梯度的反方向,以某一個學習率迭代更新直到收斂
-
注意:
- 變量的規范化,加快 GD
- 注意 loss 隨着迭代的次數不增(plot 圖檢查訓練過程是否正確)
- 可調參數有:初始值,學習率,迭代更新的方式(batch, minibatch, stochastic)
- 其他高級的優化方法有:BFGS, L-BFGS, Conjugate
-
GD:
- batch GD : 每次迭代都使用完所有數據
- 耗時
- stochastic GD (SGD) : 每次迭代只需要一個實例
- 高效
- 崎嶇的往最優值逼近,可能存在收斂問題,可以隨着時間逐漸減小學習率以保證最后收斂
- mini-batch GD : 介於 batch GD 和 SGD 之間,每次使用 b 個實例構成的小數據集
- balance choice
- checking for convergence
- 作圖,error vs number of iteration,誤差隨着迭代次數是不增函數
- Note: for SGD, error should be a mean error during a time section
- batch GD : 每次迭代都使用完所有數據
欠擬合(underfitting) vs 過擬合(overffiting)
機器學習實際上是求解 NP 問題近似解的過程,我們總在以某種方式去逼近最優解。這個逼近的過程會產生兩個問題:underfitting(欠擬合) 和 overfitting(過擬合)。欠擬合是指模型的學習能力太弱,無法很好的擬合歷史數據;而過擬合剛好相反,反應了模型學習能力太強,及時是歷史數據中的微小變化(噪聲)都能被模型捕捉到,以至於模型對未知的樣例預測能力很弱,即泛化能力差。
欠擬合的問題比較好解決,我們可以通過提高模型的復雜度和增加特征等方式來提高模型的學習能力。而過擬合的問題比較麻煩,可以說,我們只能盡可能降低過擬合的風險,卻不能絕對的避免過擬合。
欠擬合和過擬合的現象 (detection & analysis)
最小化泛化誤差是我們最終的目的,然而真實的泛化誤差無法被測量到,這個時候我們通常將數據集分成 trainning set, validation set, testing set。trainning set 用於訓練模型,validation set 用於模型選擇,而 testing set 用於測試最終模型的泛化能力。
基於這樣的數據划分,我們可以通過 bias-variance analysis 來發現欠擬合和過擬合問題,進而對模型進行調整。
除此之外,我們還可以用學習曲線來發現問題。判斷“增加數據是否有效???”
正則化(regularization)
- 任何模型的 loss function 都可以分為兩個部分:
- 誤差項: 衡量模型的 accuracy,即對歷史數據的擬合能力
- 正則項: 對模型的復雜程度的懲罰項,最常用的是 L1 和 L2 正則
- L2 : 又稱 ridge regression, 偏向於保留所有的 feature,但每個 feature 權重較小,即大家都對目標 y 有貢獻,即使關系不大也可以有很小的貢獻。
- L1 : 又稱 Lasso, 偏向於較少的 feature,將不太相關即全中很小的 feature 去掉,可以進行 sparcity, feature selection.
- regularization parameter: (can be selected by cross validation)
- too large: underfitting
- too small: cann't address the overfitting problem
如何解決欠擬合問題
欠擬合的根本問題是模型的學習能力不足,這時一味的增加數據是不可行的,應該從提高模型學習能力的角度考慮。兩個方向,提高模型的復雜度或增加特征。
- 嘗試增加特征:
- 發現新的特征
- 在原來的特征上構建新的特征(polynomial feature)
- 嘗試減小 regularization parameter (正則項是對模型復雜程度的懲罰,減小對應的闡述即提高模型的復雜程度,在一定程度上可以認為模型的復雜程度和模型的學習能力是成正比的)
如何解決過擬合問題
過擬合的核心問題在於模型太過於復雜,擬合能力(學習能力)太強,以至於即使數據有輕微的擾動都能被模型捕捉到,導致模型對未出現過的實例具有很差的泛化能力。思考的兩個方向:減少特征和降低模型的復雜程度。
- 減小特征:
- 手動選擇特征
- 通過模型選擇算法(比如 L1 稀疏)
- 加入正則項:
- 增大 regularization parameter
- L2 保存所有的 feature,但是每個 feature 的系數都很小,當存在很多 feature 並且每個 feature 對目標變量都有或多或少的貢獻時。
- 獲取更多的數據(往往最有用)
對於神經網絡
通常使用 dropout 來防止過擬合,增加數據量也是一個方向。
unsupervised learning
07. Clustering
核心思想:最大化簇間距離,最小化簇內距離,將無類標數據聚成相似的幾個簇。
- 聚類的 cost funtion 是非凸的,對初始值和 k 值的選擇敏感
- 如何選擇參數:
- 嘗試多個不同的初始值進行訓練
- K 的選擇:
- 嘗試不同的K, 並作圖,K vs cost function,
- 一般 kmean 常用做預處理階段,可以根據下游模型的結果來調整 K 的選擇。
- 核心思想與 EM 算法類似
- E: 估計新的中心 (hidden variable, random initialization in the beginning)
- M: maximization, <=> minimize Objective function
08. Dimensionality Reduction
PCA 是一種常用的降緯方法,在更低維度的空間中找到原數據的映射,並盡可能保留原有數據的信息。一般可作為模型前的特征選擇過程使用。
- 動機:
- 壓縮:減少存儲數據開銷的內存和磁盤
- 可視化
- 對 PCA 不好的應用:
- 用於解決過擬合
- 可能有用,但!!!建議使用正則化來解決過擬合問題
- 算法描述:
- PCA:
- [U,S,V] = svd(Sigma), U_[n*n]
- U_reduce = U(1,2..,k), 1<=k<=n, n feature, z = U_reduce' * x , z_[k*1]
- Reconstruction: x = U_reduce * z
- PCA:
- 注意事項和建議:
- k 的選擇:決定了有多少信息能夠得到保留
- 對於 supervised learning,PCA 不僅僅用於 training set,還應該用於 validating set 和 testing set
- 在使用 PCA 之前,最好在全集上進行訓練,方便評估 PCA 所起到的作用
- scale feature,使得各值之間都是可比的
- PCA != Linear regression
09. Anomaly Detection
核心思想:每個數據集在正常情況下都應該遵循某一未知的分布,而異常檢測就是檢測哪些點違背了數據集隱含的分布。我們可以使用單個高斯分布或聯合高斯分布對數據進行擬合,即估計數據集的隱含分布。當某個數集明顯偏離給定的閾值時,可認為異常發生。
- 密度估計(density estimation)
- 高斯分布(guassian distribution)
- one variable
- multi-variable
- 參數估計(parameter estimation)
- mean
- standard
- 預測(prediction)
- calculate density for example x, p(x)
- p(x) large for normal examples
- p(x) small for anomalous examples
- 評估(evaluation)
- charateristic:
- very small number of postive examples
- larege number of negative
- many different 'types' of anomalies
- future anomalies may look nothing like any anomalous examples we've seen so far
- true positive, false positive, true negative, false negative
- precision / recall
- f-score
- charateristic:
- 特征選擇(choosing feature)
- non-guassian feature, (log transformation)
- error analysis
- 應用(application):
- fraud detection
- manufacturing monitor
application
10. Recommender Systems
推薦系統里最常用的協同過濾算法核心思想是維護一個二維矩陣 R,行表示用戶 user,列表示物品 item,而每個元素 R[i,j] 表示 user j 到 item i 的評分。
基於內容的推薦
- feature 是一些基於 item 的特性
- x[i],表示 item i 的分值向量,即在每個 feature 上的得分 (已知的)
- theta[j],表示用戶 j 對每個 feature 的關注程度 (從打分數據中學習而得)
- 那么用戶 j 對 item i 的打分 rating[i,j] = x[i] .* theta[j]
協同過濾:
基於 CF 的相似性度量:
- user-based similarity:column[i] 和 column[j] 之間的相似性
- item-based similarity:row[i] 和 row[j] 之間的相似性
實現細節:
- 缺失值的填充
- 歸一化處理
11. Large Scale Machine Learning
數據的作用:
往往比的不是算法,而是數據。當數據量足夠時,不同算法的效果趨於一致。
online learning
- shipping service website
- product search
- click throgh rate
- choosing special offers to show user
- customized selection of news articles
- product recommendation
large scale machine learning
- mini-bach
- map: divide training data and learn each part on parallel computer
- reduce: combine all error for model update
多機器 or 多線程
12. Application photo OCR
以 OCR 的應用為例,介紹如何使用機器學習解決實際問題。
- 建模並建立一個 pipline
- for instance OCR: text detection -> character segmentation -> charater classification
- segmentation : sliding window
- win size
- classfication problem for each segmentation
- get more data
- artifical
- sythesis
- Note:
- make sure you have a low bias classification
- "how much work would it be to get 10x as much data as we currently have?"
- artificial data synthesis
- collect / label it yourself
- "crowd source"
- ceiling analysis
pipline
sliding window
get more data
通常是為了降低過擬合的風險,如果通過對原有數據進行變換來增加數據?比如圖片中的變形。
ceiling analysis
往往一個大問題由幾個模塊構成,如何找出限制整體優化目標的局部模塊很關鍵。