目錄
線性回歸,邏輯回歸,神經網絡,SVM的總結
- 詳細的學習筆記.
- markdown的公式編輯手冊.
- 回歸的含義: 回歸就是指根據之前的數據預測一個准確的輸出值.
- 分類的含義: 分類就是預測離散的輸出值, 比如男生為1, 女生為0(0/1離散輸出問題).
- 機器學習中往往會有一個假設(hypothesis), 本質上來講\(h\)代表學習算法的解決方案或函數.
- \(h\)可以理解為是我們預先選定的規則或者函數的形式,我們需要不停地得到對應的參數.
- \(h\)是一個從\(x\)到\(y\)的函數映射.
單變量的線性回歸(Linear Regression with One Variable)
- 單變量的表達方式(hypothesis function):
\[h_{\theta(x)}\;=\;\theta_{0}+\theta_{1}x \]
- 因為只含有一個特征(即輸入變量), 因此這類問題叫作單變量線性回歸問題.
- 模型所預測的值與訓練集中實際值之間的差距就是建模誤差(modeling error).
- 目標函數(代價函數Cost Function): 目標是選擇出可以使得建模誤差的平方和能夠最小的模型參數.
- 代價函數的數學公式的表達為:
\[J(\theta_{0},\theta_{1})=\frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)}-y^{(i)}))^{2} \]- 這個公式的\(\frac{1}{2m}\)是為了求偏導好計算; 大致的意思就是求每個樣本的均方誤差.
- Goal: \(\min \limits_{\theta_{0},\theta_{1}}J(\theta_{0},\theta_{1})\), 讓代價函數最小.
- 需要一個有效的算法, 能夠自動地找出使代價函數\(J\)取最小值的參數\(\theta_{0}\)和\(\theta_{1}\), 這個算法就是梯度下降.
梯度下降(Gredient Descent)
- 梯度下降是一個用來求函數最小的優化算法, 在線性回歸的算法中, 用它來求代價函數\(J(\theta_{0},\theta_{1})\)的最小值.
- 梯度下降背后的思想: 開始隨機選擇一個參數組合\((\theta_{0},\theta_{1},\ldots,\theta_{n})\), 計算出代價函數對應的函數值, 然后尋找一個能讓代價函數下降最多的參數組合; 持續這么做直到找到一個局部最小值(local minimum),因為沒有嘗試所有的參數組合, 所以不能確定得到的局部最小值是否為全局最小值(global minimum), 選擇不同的初始參數組合可能會找到不同的局部最小值.
- 批量梯度下降(batch gradient descent)算法的公式:
\[\theta_{j}:=\theta_{j} - \alpha\frac{\partial}{\partial\theta_{j}}J(\theta_{0},\theta_{1})\qquad(for\,j = 0\,\,and\,\;j = 1) \]
- 其中$\alpha$是學習率(**learning rate**),它決定了我們沿着能讓代價函數下降程度最大的方向向下邁出的步子有多大,在批量梯度下降中,我們每一次都同時讓所有的參數減去學習速率乘以代價函數的導數。
- 梯度下降的過程為:
+ 根據代價函數求出其偏導函數, 因為所謂的梯度就是一階偏導, 也就是沿參數該方向的變化率.
+ 算出梯度的大小值(把上一次的$\theta_{0}$和$\theta_{1}$代入偏導函數求解).
+ 迭代算出可能更好的參數值(就是用原來的$\theta$值減去偏導值乘以學習率的積).
+ 不斷更新$\theta_{0}$和$\theta_{1}$
- $\alpha$太大或太小會出現什么情況:
+ 如果$\alpha$太小, 即學習速率太小, 需要迭代很多次才能達到局部最優.
+ 如果$\alpha$太大, 梯度下降可能會越過最低點, 甚至無法收斂, 出現震盪或發散現象.
+ 即使學習率$\alpha$保持不變時, 梯度下降也可以收斂到局部最優, 因為到最優點時偏導為零呀.
- 批量梯度下降是指在梯度下降的每一步中, 都用到了所有的訓練樣本, 在梯度下降中, 在計算微分求導時, 需要對所有$m$個訓練樣本求和.
- 有的梯度下降法不考慮整個訓練集, 而是每次關注訓練集中的一些小的子集.
- 梯度下降算法, 可以用來最小化任何代價函數\(J\), 不只是線性回歸中的代價函數, 只要是凸函數應該都可以使用梯度下降算法來求解局部最優.
- 在數據量較大的情況下, 梯度下降法比正規方程(normal equations)要更適用一些.
多變量的線性回歸(Linear Regression with Multiple Variables)
- 第\(i\)個訓練實例, 就是特征矩陣中的第\(i\)行, 是一個向量(vector).
- 多變量的hypothesis function(假設函數)的數學表達為:$$h_{\theta}(x) = \theta_{0}x_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\ldots+\theta_{n}x_{n}$$
- 此時模型有\(n+1\)維的特征向量, 特征矩陣的維度\(m*(n+1)\).
- hypothesis function的向量的表達式為: \(h_{\theta}(x) = \theta^{T}X\).
- 多變量的代價函數(cost function)為所有建模誤差的平方和, 數學表達為:
\[J(\theta_{0},\theta_{1},\ldots,\theta_{n})=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)}-y^{(i)}))^{2} \]
- 其中\(h_{\theta}(x) = \theta_{0}x_{0}+\theta_{1}x_{1}+\theta_{2}x_{2}+\ldots+\theta_{n}x_{n}\).
- 目標函數還是要找出使得代價函數最小的一系列參數.
- 多變量線性回歸的批量梯度下降算法為:
\[Repeat\{ \theta_{j}:=\theta_{j}-\alpha\frac{\partial}{\partial\theta_{j}}J(\theta_{0},\theta_{1},\ldots,\theta_{n}) \}\]
- 求導計算為:
\[Repeat\{ \theta_{j}:=\theta_{j}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})*x_{j}^{(i)} \}\]- python的代碼實現為:
def computeCost(X, Y, theta): inner = np.power(((X * theta.T) - y), 2) # 內積 return np.sum(inner) / (2 * len(X)) # len(X)為行數
- 特征縮放(即歸一化處理): 在多維特征的情況下, 讓這些特征具有相似的尺度, 將幫助梯度下降算法更快地收斂.
- 正規方程(Normal Equation): 是相對於梯度下降算法的另一種方法.
- 正規方程是為了求解偏導為0的點: \(\frac{\partial}{\partial\theta_{j}}J(\theta_{j})=0\).
- 利
用正規方程解出向量: \(\theta=(X^{T}X)^{-1}X^{T}y\). - 梯度下降與正規方程的比較:
- 梯度下降需要選擇學習率\(\alpha\), 梯度下降需要多次迭代, 當特征數量\(n\)特別大時也比較適用, 並適用於各種類型的模型.
- 正規方程不需要迭代, 一次計算即可得出結果, 但需要計算\((X^{T}X)^{-1}\), 計算矩陣的逆的時間復雜度為\(O(n^{3})\), 如果特征少還比較快, 特征特別多的話就不太能接受了.
- 正規方程只適用於線性模型, 不適合邏輯回歸等其他模型.
- 只要特征數量小於一萬, 通常適用標准方程(normal equation), 而不適用梯度下降法.
- 梯度下降可以適用在有大量特征變量的線性回歸問題上.
- 正規方程的Python實現:
import numpy as np def normalEqn(X, y): theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等價於X.T.dot(X) return theta
- 正規方程及不可逆性:
- 不可逆的矩陣稱為奇異或退化矩陣.
- 代價函數的向量形式為: \(J(\theta)=\frac{1}{2}(X\theta-y)^{2}\).
- 具體公式推導為:$$J(\theta)=\frac{1}{2}(X\theta-y)^{T}(X\theta-y)$$
\[=\frac{1}{2}(X^{T}\theta^{T}-y^{T})(X\theta-y) \]\[=\frac{1}{2}(X^{T}\theta^{T}X\theta-X^{T}\theta^{T}y-y^{T}X\theta-y^{T}y) \]- 對代價函數進行求偏導:\(\frac{dAB}{dB}=A^{T}\), \(\frac{dX^{T}AX}{dX} = (X^{T}A)^{T}\).
\[\frac{\partial(J\theta)}{\partial\theta}=\frac{1}{2}(2X^{T}X\theta-X^{T}y-(y^{T}X)^{T}-0) \]\[\frac{\partial(J\theta)}{\partial\theta}=\frac{1}{2}(2X^{T}X\theta-X^{T}y-X^{T}y) \]\[\frac{\partial(J\theta)}{\partial\theta}=X^{T}X\theta-X^{T}y \]- 令偏導為0, 即\(\frac{\partial J(\theta)}{\partial\theta}=0\), 則有\(\theta=(X^{T}X)^{-1}X^{T}y\).
邏輯回歸(Logistic Regression)
- 需要預測的變量\(y\)是離散的值, 將因變量(dependent variable)可能屬於的兩個類分別稱為負向量(negative class)和正向類(positive class), \(y\in 0,1\).
- 邏輯回歸是一個分類算法, 它的輸出值永遠在0和1之間.
- Hypothesis Representation: \(h_{\theta}(x)=g(\theta^{T}X)\).
- \(g\)代表邏輯函數(logistic function)是一個常用的邏輯函數, S型函數(Sigmoid function), 具體的數學表達為: \(g(z)=\frac{1}{1+e^{-z}}\).
- Python的代碼實現為:
import numpy as np def sigmoid(z): return 1 / (1 + np.exp(-z))
- 在邏輯回歸中, 當\(h_{theta}>=0.5\)時, 預測\(y=1\); 當\(h_{theta}<0.5\)時, 預測\(y=0\).
- 代價函數(cost function):
- 在線性回歸模型中, 我們定義的代價函數是所有模型誤差的平方和; 在邏輯回歸中, 重新定義了代價函數, 是對假設函數取了對數. 數學表達式為:
\[ Cost(h_{\theta}(x),y)= \left\{ \begin{array}{**lr**} -log(h_{\theta}(x))\;\;\;\;\;if\;\;\;y=1 & \\ -log(1-h_{\theta}(x))\;\;\;\;\;if\;\;\;y=0 \end{array} \right. \]- 簡化為:\(Cost(h_{\theta}(x),y)=-y*log(h_{\theta}(x))-(1-y)*log(1-h_{\theta}(x))\).
- 求每個樣本的平均值, 所以代價函數的數學表達為:
\[J(\theta)=\frac{1}{m}\sum^{m}_{i=1}[-y^{(i)}*log(h_{\theta}(x^{(i)}))-(1-y^{(i)})*log(1-h_{\theta}(x^{(i)}))] \]- 把負號提出來, 即: $$J(\theta)=-\frac{1}{m}\sum^{m}{i=1}[y^{(i)}*log(h{\theta}(x^{(i)}))+(1-y^{(i)})*log(1-h_{\theta}(x^{(i)}))]$$
- python的代碼實現為:
import numpy as np def cost(theta, X, y): theta = np.matrix(theta) X = np.matrix(X) y = np.matrix(y) first = np.multiply(-y, np.log(sigmoid(X * theta.T))) second = np.multiply((1-y), np.log(1 - sigmoid(X * theta.T))) return np.sum(first - second) / (len(X))
- 得到這個代價函數后, 就需要用梯度下降算法來求得能使代價函數最小的參數, 對代價函數求導后為:
\[\theta_{j}:=\theta{j}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})*x_{j}^{(i)} \]
- 然后不斷的更新\(\theta_{j}\)值, simultaneously update all \(\theta_{j}\).
- 雖然得到的梯度下降算法表面上和線性回歸的梯度下降算法一樣, 但是這里的\(h_{\theta}=g(\theta^{T}X)\)與線性回歸本質上是不一樣的.
- 使用梯度下降法(gradient descent)最小化代價函數.
- 線性回歸的假設函數為:\(h_{\theta}(x)=\theta^{T}X=\theta_{0}x_{0}+\theta_{1}x_{1}+\dots+\theta_{n}x_{n}\); 而現在邏輯回歸的假設函數為: \(h_{\theta}(x)=\frac{1}{1+e^{-\theta^{T}X}}\), 更新規則雖然一樣,但是假設的定義發生了變化.
- 特征縮放(特征數據的歸一化)同樣適用於邏輯回歸.
高級優化
- 在梯度下降的過程中, 需要計算兩樣東西: \(J(\theta)\)和\(J\)等於\(0, 1, \dots, n\)時的偏導數項.
- 另一種角度看待這個問題的思路是: 寫出代碼來計算\(J(\theta)\)和這些偏導數, 然后把這些插入到梯度下降中.
- 比梯度下降算法更好的優化算法:
- 共軛梯度(Conjugate Gradient).
- 局部優化算法(Broyden fletcher glodfarb shann, BFGS).
- 有限內存局部優化算法(LBFGS).
- 這三種算法有很多優點:
- 不需要手動選擇學習率\(\alpha\), 因為內部有個內部循環(稱為線性搜索line search), 嘗試不同的學習速率\(\alpha\), 並自動選擇一個好的學習速率\(\alpha\).
- 往往最終收斂得遠遠快於梯度下降.
正則化(Reguarization)
- 正則化主要是用來解決過擬合問題(overfitting): 減少或改善過度擬合問題.
- 正則化保留所有的特征, 但是減少參數的大小(magnitude).
- 在代價函數中增加一個懲罰項.
- 增加懲罰項后的數學表達為:
\[J(\theta)=\frac{1}{2m}[\sum_{i=1}^{m}(h_{\theta}(x^{(i))}-y^{(i)})^{2}+\lambda\sum_{j=1}^{n}\theta_{j}^{2}] \]
- \(\lambda\)稱為正則化參數(Regularization Parameter).
- 如果選擇的正則化參數\(\lambda\)過大, 則會把所有的參數都最小化了, 造成欠擬合.
- 正則化線性回歸的梯度下降算法的變化在於, 每次都在原有的算法更新規則基礎上令\(\theta\)值減少了一個額外的值.
\[\theta_{j}:=\theta_{j}(1-\alpha) \]
- 正則化的邏輯回歸模型: 代價函數\(J(\theta)\)增加一個懲罰項.
\[J(\theta)=-\frac{1}{m}\sum^{m}_{i=1}[y^{(i)}*log(h_{\theta}(x^{(i)}))+(1-y^{(i)})*log(1-h_{\theta}(x^{(i)}))]+\frac{\lambda}{2m}\sum_{j=1}^{n}\theta_{j}^{2} \]
神經網路(Neural Networks)
- 神經網絡是一個非線性假設的算法(non-linear hypotheses).
- 無論是線性回歸還是邏輯回歸,都會有一個缺點: 當特征太多時, 計算負荷會非常大.
- 神經網路模型建立在很多神經元之上, 每一個神經元又是一個小小學習模型, 這些神經元(也叫激活單元, activation unit), 有多個輸入和一個輸出; 神經網路中, 參數也被稱作權重(weight).
- Sigmoid(logistic) activation function(S激活函數).
- 第一層為輸入層(input layer), 最后一層為輸出層(output layer), 中間的層為隱藏層(Hidden Layers), 我們為每一層增加一個偏差單位(bias unit).
- 從左到右的算法稱為前向傳播算法(forward propagation)
- 數學表達為: \(z^{(2)}=\theta^{(1)}*X^{T}\), 激活為\(a^{(2)}=g(z^{(2)})\).
- 其實神經網絡就像是logistic regression, 只不過輸入向量變成了中間層a.
- 可以把a看成更高級的特征值, 也就是x的進化體, 因為他們是由x決定的, 因為是梯度下降的, 所以a是變化的, 並且越來越變化厲害, 所以這些更高級的特征值遠比僅僅將x次方厲害,也能更好的預測新數據.
- 從本質上講, 神經網絡能夠通過學習得出其自身的一系列特征.邏輯回歸中被限制使用原始特征. 可以認為隱藏層能輸出新的特征.
- 單層神經元(無中間層)的計算可用來表示邏輯運算, 邏輯與(AND), 邏輯或(OR).
- 神經網絡的代價函數: $$J(\Theta)=-\frac{1}{m}[\sum_{i=1}^{m}\sum_{k=1}^{k}y_{k}^{(i)}log(h_{\Theta}(x^{(i)})){k}+(1-y{k}^{(i)})log(1-(h_{\Theta}(x^{(i)})){k})]+\frac{\lambda}{2m}\sum{l=1}^{L-1}\sum_{i=1}^{s_{l}}\sum_{j=1}^{s_{l}+1}(\Theta_{ji}^{(l)})^{2}$$
- 希望通過代價函數來觀察算法預測的結果與真實情況的誤差有多大, 神經網絡對於每一行特征會給出K個預測.
- 正則化的哪一項是排除了每一層\(\theta_{0}\)后, 每一層的\(\theta\)矩陣的和.
- 神經網絡中比較重要的方向傳播算法(Backpropagation algorithm):
- 為了計算代價函數的偏導數\(\frac{\partial}{\partial\theta_{ij}^{(l)}}\), 需要采用一種反向傳播算法.
- 先計算最后一層誤差, 然后再一層一層方向求出各層的誤差, 直到倒數第二層.
- \(\Delta_{ij}^{(l)}\)來表示誤差矩陣.
\[D_{ij}^{(l)}:=\frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)} \] - 梯度的數值檢驗(Numerical Gradient Checking).
- 訓練神經網絡的步驟:
- 參數的隨機初始化.
- 利用正向傳播方法計算所有的\(h_{\theta}(x)\).
- 編寫計算代價函數\(J\)的代碼.
- 利用方向傳播方法計算所有偏導數.
- 利用數值檢驗方法檢驗這些偏導數.
- 使用優化算法來最小化代價函數.
應用機器學習的建議
- 獲得更多的訓練實例--通常是有效的, 但是代價較大, 可以先考慮一下的方法:
- 嘗試減少特征的數量.
- 嘗試獲得更多的特征.
- 嘗試增加多項式特征.
- 嘗試減少正則化程度\(\lambda\).
- 嘗試增加正則化程度\(\lambda\).
- 交叉驗證: 70%的數據作為訓練集, 30%的數據作為測試集.
- 測試集和訓練集都要含有各種類型的數據(數據洗牌).
- 一個算法表現不理想, 多半是兩種情況: 偏差比較大, 方差比較大.(要么是欠擬合, 要么是過擬合)
- 學習曲線: 經常用學習曲線來判斷某一個學習算法是否處於偏差/方差問題.
- 學習曲線是學習算法的一個很好的合理檢驗(sanity check).
- 獲得更多的訓練實例——解決高方差.
- 嘗試減少特征的數量——解決高方差.
- 嘗試獲得更多的特征——解決高偏差.
- 嘗試增加多項式特征——解決高偏差.
- 嘗試減少正則化程度 λ——解決高偏差.
- 嘗試增加正則化程度 λ——解決高方差.
- 使用較小的神經網絡,類似於參數較少的情況,容易導致高偏差和欠擬合,但計算代
價較小使用較大的神經網絡,類似於參數較多的情況,容易導致高方差和過擬合,雖然計算
代價比較大,但是可以通過正則化手段來調整而更加適應數據.- 正則化對大型神經網絡有很大的作用.
- 學習算法的推薦方法:
- 從一個簡單的能快速實現的算法開始,實現該算法並用交叉驗證集數據測試這個算法.
- 繪制學習曲線,決定是增加更多數據,或者添加更多特征,還是其他選擇.
- 進行誤差分析:人工檢查交叉驗證集中我們算法中產生預測誤差的實例,看看這些實例是否有某種系統化的趨勢.
- 查准率(Precision)和查全率(Recall),算法預測的結果分成四種情況:
- 正確肯定(True Positive,TP):預測為真,實際為真
- 正確否定(True Negative,TN):預測為假,實際為假
- 錯誤肯定(False Positive,FP):預測為真,實際為假
- 錯誤否定(False Negative,FN):預測為假,實際為真
- 查准率(P)=TP/(TP+FP)--越高越好(預測有惡性腫瘤的病人中,實際上有惡性腫
瘤的病人的百分比), 查全率(R)=TP/(TP+FN)--越高越好(在所有實際上有惡性腫瘤的病人中,成功預測有惡性腫瘤的
病人的百分比). - F1值(F1 score): \(F1 = 2\frac{PR}{P+R}\)
支持向量機(Support Vector Machines)
- SVM,在學習復雜的非線性方程時提供了一種更為清晰,更加強大的方式。
- SVM hypothesis的數學表達:
\[\min\limits_{\theta}C\sum_{i=1}^{m}[y^{(i)}cost_{1}(\theta^{T}x^{(i)})+(1-y^{(i)}cost_{0}(\theta^{T}x^{(i)}))]+\frac{1}{2}\sum^{n}_{i=1}\theta_{j}^{2} \]
- 將支持向量機看作是大間距分類器.
- C的作用類似與\(\frac{1}{\lambda}\), C不是非常非常大的時候, 它可以忽略掉一些異常點的影響, 得到更好的決策界.
- 高斯核函數(Gaussian Kernel), \(f_{1}=e(-\frac{||x-l^{(1)}||^{2}}{2\sigma^{2}})\), 這個函數與正態分布沒有實際上的關系,只是看上去有點像而已.
- 不使用核函數又稱為線性核函數(linear kernel).
- 多項式核函數(Polynomial Kernel).
- 字符串核函數(String kernel).
- 卡方核函數(chi-square kernel).
- 直方圖交集核函數(histogram intersection kernel).
- 這些核函數的目標也都是根據訓練集和地標之間的距離來構建新特征,這些核函數需要
滿足Mercer's定理. - 選擇支持向量機的原因主要在於它的代價函數是凸函數,不存在局部最小值.
- 邏輯回歸和不帶核函數的支持向量機它們都是非常相似的算法.
- 這些核函數的目標也都是根據訓練集和地標之間的距離來構建新特征,這些核函數需要
- 對於許多這樣的問題,神經網絡訓練起來可能會特別慢,但是如果你有一個非常好的 SVM 實現包,它可能會運行得比較快比神經網絡快很多.
- SVM 具有的優化問題,是一種凸優化問題.
- 你有多少數據,你有多熟練是否擅長做誤差分析和排除學習算法,指出如何設定新的特征變量和找出其他能決定你學習算法的變量等方面, 通常這些方面會比你使用邏輯回歸還是SVM這方面更加重要。