器學(xué)習(xí)入門第一性原理:線性模型核心推導(dǎo)與工程實(shí)踐)
1. 為什么線性模型是機(jī)器學(xué)習(xí)入門的“第一性原理”很多人學(xué)機(jī)器學(xué)習(xí)一上來就被各種深度網(wǎng)絡(luò)、注意力機(jī)制、Transformer 架構(gòu)唬住了覺得線性模型太簡單、太基礎(chǔ)不值得花時(shí)間。但我?guī)Я诉@么多屆學(xué)生、看了這么多份簡歷和項(xiàng)目一個(gè)非常真實(shí)的感受是真正能把線性模型講清楚的人后面學(xué)什么都快講不清楚的人后面基本都在調(diào)包。線性模型這一章表面上是講幾個(gè)公式實(shí)際上是在給你搭建整個(gè)監(jiān)督學(xué)習(xí)的思維骨架——假設(shè)空間怎么定、損失函數(shù)怎么來、優(yōu)化目標(biāo)怎么解、正則化為什么能防過擬合這些東西在后面每一個(gè)模型里都會反復(fù)出現(xiàn)。這一章的核心內(nèi)容圍繞線性回歸、對數(shù)幾率回歸邏輯回歸、線性判別分析、多分類學(xué)習(xí)、類別不平衡這幾塊展開。它解決的是一個(gè)最樸素但也最本質(zhì)的問題給定一堆輸入特征怎么用一個(gè)線性組合去預(yù)測輸出如果輸出是連續(xù)的就是回歸如果輸出是離散的類別就是分類。聽起來簡單但里面的門道非常多比如為什么最小二乘能推出閉式解、為什么邏輯回歸要用極大似然而不是最小二乘、為什么 LDA 被稱為“降維分類一體機(jī)”、為什么多分類要用 OvO 或 OvR 而不是直接硬上。這篇文章適合三類人看第一類是在校學(xué)生正在啃這本書需要一份能串起全章邏輯的復(fù)習(xí)筆記第二類是轉(zhuǎn)行做算法的朋友想補(bǔ)一補(bǔ)最底層的數(shù)學(xué)直覺第三類是做工程的同學(xué)平時(shí)調(diào)包調(diào)得多但面試一問“邏輯回歸的損失函數(shù)怎么推的”就卡殼。我會盡量用大白話把每個(gè)公式背后的“人話解釋”講透同時(shí)給出可以直接復(fù)現(xiàn)的代碼和參數(shù)計(jì)算過程讓你不只是“看懂了”而是“能講出來、能寫出來、能用起來”。2. 線性回歸從最小二乘到閉式解的完整推導(dǎo)2.1 線性回歸到底在擬合什么線性回歸的假設(shè)非常直接輸出是輸入的線性組合。用數(shù)學(xué)寫出來就是$$ f(\boldsymbol{x}) \boldsymbol{w}^\top \boldsymbol{x} b $$其中 $\boldsymbol{w}$ 是權(quán)重向量$b$ 是偏置。為了方便推導(dǎo)通常把 $b$ 吸收進(jìn) $\boldsymbol{w}$寫成 $\hat{\boldsymbol{w}} (\boldsymbol{w}; b)$同時(shí)給 $\boldsymbol{x}$ 補(bǔ)一列 1變成 $\hat{\boldsymbol{x}} (\boldsymbol{x}; 1)$。這樣模型就簡化為 $f(\hat{\boldsymbol{x}}) \hat{\boldsymbol{w}}^\top \hat{\boldsymbol{x}}$。那怎么衡量這個(gè)模型好不好最自然的想法是看預(yù)測值和真實(shí)值差多少。均方誤差MSE就是最常用的度量$$ E(\hat{\boldsymbol{w}}) \sum_{i1}^{m} (y_i - \hat{\boldsymbol{w}}^\top \hat{\boldsymbol{x}}_i)^2 $$寫成矩陣形式就是$$ E(\hat{\boldsymbol{w}}) (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}})^\top (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}) $$這里 $\boldsymbol{X}$ 是 $m \times (d1)$ 的設(shè)計(jì)矩陣每一行是一個(gè)樣本。這個(gè)損失函數(shù)是凸的所以最小值點(diǎn)可以通過求導(dǎo)得到。2.2 閉式解的推導(dǎo)與幾何直覺對 $\hat{\boldsymbol{w}}$ 求導(dǎo)$$ \frac{\partial E}{\partial \hat{\boldsymbol{w}}} 2\boldsymbol{X}^\top(\boldsymbol{X}\hat{\boldsymbol{w}} - \boldsymbol{y}) $$令導(dǎo)數(shù)為零得到$$ \boldsymbol{X}^\top\boldsymbol{X}\hat{\boldsymbol{w}} \boldsymbol{X}^\top\boldsymbol{y} $$如果 $\boldsymbol{X}^\top\boldsymbol{X}$ 可逆那么$$ \hat{\boldsymbol{w}}^* (\boldsymbol{X}^\top\boldsymbol{X})^{-1}\boldsymbol{X}^\top\boldsymbol{y} $$這就是著名的最小二乘閉式解。幾何上$\boldsymbol{X}\hat{\boldsymbol{w}}$ 是 $\boldsymbol{X}$ 列空間中的一個(gè)向量我們要找的是 $\boldsymbol{y}$ 在這個(gè)列空間上的正交投影。殘差 $\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}$ 垂直于列空間所以內(nèi)積為零這正是 $\boldsymbol{X}^\top(\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}) 0$ 的含義。注意當(dāng)特征數(shù) $d$ 大于樣本數(shù) $m$ 時(shí)$\boldsymbol{X}^\top\boldsymbol{X}$ 不可逆會有無窮多解。這時(shí)候需要引入正則化也就是嶺回歸。2.3 嶺回歸給矩陣“加點(diǎn)料”讓解穩(wěn)定現(xiàn)實(shí)數(shù)據(jù)里特征之間經(jīng)常高度相關(guān)導(dǎo)致 $\boldsymbol{X}^\top\boldsymbol{X}$ 接近奇異閉式解數(shù)值不穩(wěn)定。嶺回歸的做法是在損失函數(shù)里加一個(gè) L2 正則項(xiàng)$$ E(\hat{\boldsymbol{w}}) (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}})^\top (\boldsymbol{y} - \boldsymbol{X}\hat{\boldsymbol{w}}) \lambda |\hat{\boldsymbol{w}}|_2^2 $$求導(dǎo)后得到$$ \hat{\boldsymbol{w}}^* (\boldsymbol{X}^\top\boldsymbol{X} \lambda \boldsymbol{I})^{-1}\boldsymbol{X}^\top\boldsymbol{y} $$加 $\lambda \boldsymbol{I}$ 之后矩陣一定可逆這就是它最直接的好處。$\lambda$ 越大權(quán)重被壓得越小模型越簡單偏差增大但方差減小。下面是一段可以直接跑的 Python 代碼對比普通最小二乘和嶺回歸import numpy as np np.random.seed(42) m, d 50, 10 X np.random.randn(m, d) X np.hstack([X, np.ones((m, 1))]) # 補(bǔ)一列1 true_w np.random.randn(d 1) y X true_w 0.1 * np.random.randn(m) # 普通最小二乘 w_ols np.linalg.inv(X.T X) X.T y # 嶺回歸 lam 1.0 I np.eye(d 1) I[-1, -1] 0 # 通常不正則化偏置項(xiàng) w_ridge np.linalg.inv(X.T X lam * I) X.T y print(OLS 權(quán)重范數(shù):, np.linalg.norm(w_ols)) print(Ridge 權(quán)重范數(shù):, np.linalg.norm(w_ridge))實(shí)測下來當(dāng)特征相關(guān)性強(qiáng)時(shí)OLS 的權(quán)重范數(shù)會非常大而 Ridge 明顯更穩(wěn)。這也是為什么工業(yè)界做線性模型時(shí)幾乎默認(rèn)都會加正則。3. 對數(shù)幾率回歸為什么分類要用極大似然3.1 從線性回歸到分類的鴻溝線性回歸輸出的是實(shí)數(shù)但分類任務(wù)要的是概率或者類別。最直接的想法是把線性輸出通過一個(gè)函數(shù)映射到 $(0,1)$ 區(qū)間這個(gè)函數(shù)就是Sigmoid 函數(shù)$$ \sigma(z) \frac{1}{1 e^{-z}} $$于是模型變成$$ P(y1|\boldsymbol{x}) \sigma(\boldsymbol{w}^\top \boldsymbol{x} b) $$這里有一個(gè)非常關(guān)鍵的細(xì)節(jié)為什么不用最小二乘去優(yōu)化這個(gè)模型因?yàn)槿绻?$\sigma(\boldsymbol{w}^\top \boldsymbol{x})$ 代入 MSE損失函數(shù)會變成非凸的有多個(gè)局部極小值梯度下降很容易卡住。而用極大似然估計(jì)損失函數(shù)是凸的優(yōu)化起來穩(wěn)定得多。3.2 極大似然推導(dǎo)與對數(shù)損失對于二分類問題樣本的似然函數(shù)是$$ L(\boldsymbol{w}) \prod_{i1}^{m} P(y_i|\boldsymbol{x}_i) $$取對數(shù)后變成$$ \ell(\boldsymbol{w}) \sum_{i1}^{m} \left[ y_i \ln \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i) (1-y_i) \ln (1 - \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i)) \right] $$我們要最大化這個(gè)對數(shù)似然等價(jià)于最小化它的相反數(shù)也就是對數(shù)損失Log Loss$$ E(\boldsymbol{w}) -\sum_{i1}^{m} \left[ y_i \ln \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i) (1-y_i) \ln (1 - \sigma(\boldsymbol{w}^\top \boldsymbol{x}_i)) \right] $$這個(gè)損失函數(shù)是凸的可以用梯度下降、牛頓法等方法求解。梯度形式非常漂亮$$ \frac{\partial E}{\partial \boldsymbol{w}} \sum_{i1}^{m} (\sigma(\boldsymbol{w}^\top \boldsymbol{x}_i) - y_i) \boldsymbol{x}_i $$你會發(fā)現(xiàn)它和線性回歸的梯度形式幾乎一樣只是把預(yù)測值換成了 Sigmoid 輸出。這也是為什么邏輯回歸在工程上這么好用——梯度計(jì)算簡單易于并行。3.3 牛頓法為什么它比梯度下降收斂快邏輯回歸的損失函數(shù)二階可導(dǎo)所以可以用牛頓法$$ \boldsymbol{w}_{t1} \boldsymbol{w}_t - \boldsymbol{H}^{-1} \nabla E(\boldsymbol{w}_t) $$其中 $\boldsymbol{H}$ 是 Hessian 矩陣。牛頓法利用了二階曲率信息通常迭代幾次就能收斂比梯度下降快得多。但代價(jià)是每次迭代要計(jì)算 $d \times d$ 的 Hessian 矩陣及其逆當(dāng)特征維度很高時(shí)開銷很大。所以實(shí)際工程中維度低時(shí)用牛頓法維度高時(shí)用 L-BFGS 或者隨機(jī)梯度下降。實(shí)操心得邏輯回歸在特征維度幾千以內(nèi)、樣本量幾十萬以內(nèi)時(shí)用 L-BFGS 基本是“秒級”收斂。如果維度上百萬那就老老實(shí)實(shí)上 SGD 或者 FTRL。4. 線性判別分析降維和分類如何一箭雙雕4.1 LDA 的核心思想投影后類內(nèi)緊湊、類間分散線性判別分析LDA的思路和前面兩個(gè)模型不太一樣。它不直接擬合概率而是想找一個(gè)投影方向 $\boldsymbol{w}$讓數(shù)據(jù)投影到這條直線上之后同類樣本盡量聚在一起不同類樣本盡量分開。用數(shù)學(xué)語言描述就是最大化$$ J(\boldsymbol{w}) \frac{\boldsymbol{w}^\top \boldsymbol{S}_b \boldsymbol{w}}{\boldsymbol{w}^\top \boldsymbol{S}_w \boldsymbol{w}} $$其中 $\boldsymbol{S}_b$ 是類間散度矩陣$\boldsymbol{S}_w$ 是類內(nèi)散度矩陣。這個(gè)比值越大說明投影后類間距離相對于類內(nèi)距離越大分類效果越好。4.2 廣義瑞利商與閉式解這個(gè)優(yōu)化問題是一個(gè)廣義瑞利商問題可以通過拉格朗日乘子法求解。最終得到$$ \boldsymbol{S}_w^{-1} \boldsymbol{S}_b \boldsymbol{w} \lambda \boldsymbol{w} $$也就是說$\boldsymbol{w}$ 是 $\boldsymbol{S}_w^{-1} \boldsymbol{S}_b$ 的特征向量。對于二分類問題$\boldsymbol{S}_b$ 的秩最多為 1所以 $\boldsymbol{w}$ 的方向就是$$ \boldsymbol{w} \boldsymbol{S}_w^{-1} (\boldsymbol{\mu}_0 - \boldsymbol{\mu}_1) $$這個(gè)結(jié)果非常直觀先把兩類均值差的方向找出來再用類內(nèi)散度矩陣的逆去“白化”它讓類內(nèi)分布更均勻。4.3 LDA 與 PCA 的區(qū)別很多人會把 LDA 和 PCA 搞混因?yàn)樗鼈兌际墙稻S方法。但兩者的目標(biāo)完全不同對比項(xiàng)PCALDA是否有監(jiān)督無監(jiān)督有監(jiān)督優(yōu)化目標(biāo)最大化投影方差最大化類間/類內(nèi)散度比適用場景數(shù)據(jù)壓縮、可視化分類前的降維降維后維度可指定最多為類別數(shù)減一PCA 只關(guān)心保留信息量不關(guān)心類別標(biāo)簽LDA 則充分利用標(biāo)簽信息讓降維后的數(shù)據(jù)更容易分類。所以如果你做的是分類任務(wù)LDA 通常比 PCA 更合適。5. 多分類學(xué)習(xí)與類別不平衡從二分類到真實(shí)場景5.1 OvO、OvR 與 MvM 的取舍現(xiàn)實(shí)中大部分分類問題都不是二分類而是多分類。把二分類器擴(kuò)展到多分類常見有三種策略O(shè)vO一對一每兩個(gè)類別訓(xùn)練一個(gè)分類器共 $N(N-1)/2$ 個(gè)。預(yù)測時(shí)投票決定。優(yōu)點(diǎn)是每個(gè)分類器只用到兩類數(shù)據(jù)訓(xùn)練快缺點(diǎn)是分類器數(shù)量隨類別數(shù)平方增長。OvR一對其余每個(gè)類別訓(xùn)練一個(gè)分類器共 $N$ 個(gè)。預(yù)測時(shí)取置信度最大的類別。優(yōu)點(diǎn)是分類器數(shù)量少缺點(diǎn)是每個(gè)分類器都用了全部數(shù)據(jù)且正負(fù)樣本不平衡。MvM多對多每次選一部分類作為正類一部分作為負(fù)類需要設(shè)計(jì)糾錯(cuò)輸出碼ECOC。理論上更優(yōu)雅但實(shí)現(xiàn)復(fù)雜實(shí)際用得少。實(shí)操建議類別數(shù)少于 10 時(shí)OvO 和 OvR 差別不大類別數(shù)很多時(shí)優(yōu)先考慮 OvR 或者直接上 Softmax 回歸。5.2 類別不平衡的三大處理策略類別不平衡是工業(yè)界最常見的問題之一。比如風(fēng)控場景壞樣本可能只占千分之一。處理方法主要有三類欠采樣從多數(shù)類中隨機(jī)丟棄一些樣本讓正負(fù)樣本接近。優(yōu)點(diǎn)是訓(xùn)練快缺點(diǎn)是丟失信息。改進(jìn)版是 EasyEnsemble做多次欠采樣然后集成。過采樣復(fù)制少數(shù)類樣本或者用 SMOTE 生成新的少數(shù)類樣本。優(yōu)點(diǎn)是保留信息缺點(diǎn)是容易過擬合。SMOTE 通過在近鄰之間插值生成新樣本效果通常比簡單復(fù)制好。閾值移動不改變訓(xùn)練數(shù)據(jù)而是在預(yù)測時(shí)調(diào)整決策閾值。如果正類先驗(yàn)概率是 $\pi^$負(fù)類是 $\pi^-$那么最優(yōu)決策閾值是 $\frac{\pi^}{\pi^-}$ 的某種縮放。實(shí)際中常用的是根據(jù)業(yè)務(wù)需求調(diào)整閾值比如風(fēng)控場景寧可錯(cuò)殺不可放過就把閾值調(diào)低。下面是一個(gè)用imbalanced-learn做 SMOTE 的示例from imblearn.over_sampling import SMOTE from sklearn.datasets import make_classification from collections import Counter X, y make_classification(n_samples1000, n_features20, weights[0.95, 0.05], random_state42) print(原始分布:, Counter(y)) smote SMOTE(random_state42) X_res, y_res smote.fit_resample(X, y) print(SMOTE 后分布:, Counter(y_res))實(shí)測下來SMOTE 在中小規(guī)模數(shù)據(jù)上效果穩(wěn)定但樣本量特別大時(shí)計(jì)算開銷會明顯上升這時(shí)候可以考慮先用欠采樣再上 SMOTE 的混合策略。6. 常見問題與排查技巧實(shí)錄6.1 線性模型常見問題速查表問題現(xiàn)象可能原因排查思路解決方案訓(xùn)練損失不下降學(xué)習(xí)率太小或特征未歸一化檢查梯度范數(shù)、特征尺度歸一化特征調(diào)大學(xué)習(xí)率權(quán)重范數(shù)爆炸特征共線性嚴(yán)重計(jì)算特征相關(guān)系數(shù)矩陣加 L2 正則或做 PCA 降維邏輯回歸預(yù)測全為同一類類別極度不平衡查看標(biāo)簽分布調(diào)整閾值或用 SMOTELDA 降維后效果差類內(nèi)散度矩陣奇異檢查特征維度與樣本量先做 PCA 降維再 LDA閉式解報(bào)錯(cuò)矩陣不可逆特征數(shù)大于樣本數(shù)檢查 $d$ 與 $m$ 的關(guān)系改用嶺回歸或梯度下降6.2 獨(dú)家避坑技巧第一個(gè)坑是忘記補(bǔ)偏置列。很多人寫線性回歸代碼時(shí)直接把 $\boldsymbol{X}$ 丟進(jìn)去算結(jié)果模型沒有截距擬合效果差一大截。記住只要模型有 $b$就要在 $\boldsymbol{X}$ 后面補(bǔ)一列 1。第二個(gè)坑是正則化時(shí)把偏置項(xiàng)也正則了。偏置項(xiàng)控制的是模型的整體偏移正則化它會導(dǎo)致模型欠擬合。標(biāo)準(zhǔn)做法是在正則化矩陣 $\boldsymbol{I}$ 中把最后一行最后一列設(shè)為 0。第三個(gè)坑是邏輯回歸用 MSE 當(dāng)損失。前面說過MSE 加 Sigmoid 是非凸的梯度下降容易卡在局部極小值。一定要用對數(shù)損失這是從極大似然推出來的凸性有保證。第四個(gè)坑是多分類時(shí) OvR 的正負(fù)樣本比例失衡。比如 10 分類每個(gè)分類器正樣本占 10%負(fù)樣本占 90%。這時(shí)候要么用類別權(quán)重要么直接用 Softmax 回歸。6.3 參數(shù)計(jì)算實(shí)例嶺回歸的 $\lambda$ 怎么選$\lambda$ 的選擇沒有解析解通常用交叉驗(yàn)證。下面是一個(gè) 5 折交叉驗(yàn)證選 $\lambda$ 的代碼from sklearn.linear_model import RidgeCV from sklearn.datasets import make_regression X, y make_regression(n_samples200, n_features20, noise0.1, random_state42) alphas [0.01, 0.1, 1.0, 10.0, 100.0] model RidgeCV(alphasalphas, cv5) model.fit(X, y) print(最優(yōu) alpha:, model.alpha_)實(shí)測下來$\lambda$ 在 $[0.01, 100]$ 之間按對數(shù)刻度取 5 到 10 個(gè)值基本能覆蓋大多數(shù)場景。如果最優(yōu)值落在邊界上說明搜索范圍需要擴(kuò)大。7. 從公式到代碼線性模型的工程落地要點(diǎn)7.1 特征工程比模型本身更重要線性模型對特征尺度非常敏感。如果某個(gè)特征取值范圍是 $[0, 1]$另一個(gè)是 $[0, 10000]$那么梯度下降會走“之”字形收斂極慢。標(biāo)準(zhǔn)做法是做Z-score 標(biāo)準(zhǔn)化$$ x \frac{x - \mu}{\sigma} $$或者M(jìn)in-Max 歸一化$$ x \frac{x - x_{min}}{x_{max} - x_{min}} $$注意標(biāo)準(zhǔn)化參數(shù)必須只在訓(xùn)練集上計(jì)算然后應(yīng)用到驗(yàn)證集和測試集。如果在全量數(shù)據(jù)上計(jì)算會造成信息泄露。7.2 稀疏特征與 FTRL工業(yè)界很多場景比如廣告點(diǎn)擊率預(yù)測的特征維度是千萬甚至上億級別的而且非常稀疏。這時(shí)候用 L-BFGS 就不合適了因?yàn)?Hessian 矩陣根本存不下。FTRLFollow The Regularized Leader是這類場景的標(biāo)配它結(jié)合了 L1 和 L2 正則能在線學(xué)習(xí)而且對稀疏特征非常友好。FTRL 的核心更新公式是$$ w_{t1,i} -\frac{z_{t,i} - \text{sign}(z_{t,i}) \lambda_1}{(\beta \sqrt{n_{t,i}})/\alpha \lambda_2} $$其中 $z$ 和 $n$ 是累積的梯度和梯度平方。這個(gè)公式看起來復(fù)雜但實(shí)現(xiàn)起來并不難而且工程上非常穩(wěn)定。7.3 模型評估不要只看準(zhǔn)確率線性模型做分類時(shí)如果類別不平衡準(zhǔn)確率會嚴(yán)重誤導(dǎo)。比如 99% 的樣本是負(fù)類模型全預(yù)測負(fù)類也有 99% 準(zhǔn)確率但毫無意義。這時(shí)候要看AUC、F1、召回率、精確率。AUC 衡量的是模型對正負(fù)樣本的排序能力不受閾值影響是分類任務(wù)最常用的指標(biāo)之一。8. 線性模型的邊界與延伸線性模型最大的局限是它只能擬合線性關(guān)系。如果數(shù)據(jù)本身是非線性的線性模型就會欠擬合。解決辦法有兩個(gè)一是做特征交叉手動構(gòu)造多項(xiàng)式特征二是用核方法把線性模型擴(kuò)展到高維空間這就是核線性回歸和核邏輯回歸。另一個(gè)延伸方向是廣義線性模型GLM。線性回歸假設(shè)輸出服從高斯分布邏輯回歸假設(shè)輸出服從伯努利分布它們都是 GLM 的特例。GLM 的統(tǒng)一框架是輸出變量服從指數(shù)族分布均值通過鏈接函數(shù)與線性組合相連。理解了 GLM你就理解了線性模型的“終極形態(tài)”。我個(gè)人在實(shí)際項(xiàng)目中的體會是線性模型不是“簡單模型”而是“基礎(chǔ)模型”。它訓(xùn)練快、可解釋性強(qiáng)、易于部署在很多業(yè)務(wù)場景下比如風(fēng)控評分卡、推薦粗排依然是首選。真正把線性模型吃透的人再去學(xué)樹模型、神經(jīng)網(wǎng)絡(luò)會發(fā)現(xiàn)很多概念都是相通的——正則化、損失函數(shù)、梯度下降、偏差方差權(quán)衡這些東西在哪個(gè)模型里都跑不掉。所以別急著跳過這一章多花點(diǎn)時(shí)間把公式推一遍、代碼寫一遍后面會省很多力氣。