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