重学逻辑回归 (LR) —— 从极大似然到 FTRL 工业实践

29 阅读2分钟

重学逻辑回归 (LR) —— 从极大似然到 FTRL 工业实践

前言

在深度学习满天飞的今天,逻辑回归(Logistic Regression, LR)听起来像是一个上个世纪的老古董。很多人觉得它“太简单”、“只是个 baseline”。

但当你真正深入工业界,特别是推荐系统(CTR预估)和广告算法领域,你会发现 LR 依然是不死的灵魂。它不仅是无数复杂模型的基石,更蕴含着机器学习最底层的数学美感工程智慧

最近我在重刷基础和实习项目的过程中,对 LR 有了全新的认识。今天这篇文章,不讲 sklearn.fit(),我们从最底层的数学推导开始,聊聊 MSE vs BCE 的爱恨情仇极大似然的物理意义偏置项的几何本质,最后硬核拆解工业界大杀器 FTRL


一、 灵魂拷问:分类问题为什么不用 MSE?

面试官最爱问:“为什么逻辑回归的损失函数是交叉熵(BCE),而不是均方误差(MSE)?”

很多人只能回答:“因为 MSE 效果不好。” 但究竟哪里不好?

1.1 从梯度的角度看“学不动”

假设我们的激活函数是 Sigmoid:a=σ(z)=11+eza = \sigma(z) = \frac{1}{1+e^{-z}}

如果使用 MSE (L=12(ya)2L = \frac{1}{2}(y-a)^2),对权重 ww 求导,根据链式法则:

Lw=(ya)σ(z)x=(ya)a(1a)x\frac{\partial L}{\partial w} = -(y-a) \cdot \sigma'(z) \cdot x = -(y-a) \cdot \mathbf{a(1-a)} \cdot x

致命的问题就在这个 a(1a)a(1-a) 上。

想象一下,真实标签 y=1y=1,但模型预测错得离谱,输出 a0a \approx 0。此时误差 (ya)(y-a) 很大,我们要大力修正参数对吧?

然而,当 a0a \approx 0 时,Sigmoid 的导数 a(1a)a(1-a) 趋近于 0。

结论:你的模型虽然错得离谱,但梯度却是 0。模型“躺平”了,根本更新不动。这就是梯度消失。

1.2 从几何的角度看“非凸”

MSE + Sigmoid 组合出来的损失函数曲面,是非凸的(Non-Convex)。它像连绵起伏的山峦,充满了局部最优解(Local Minima)和平坦区(Plateau) 。梯度下降很容易陷在半山腰出不来。

1.3 BCE 的救赎

反观二元交叉熵(BCE):L=[ylna+(1y)ln(1a)]L = -[y \ln a + (1-y) \ln (1-a)]

它的梯度推导极其优雅,对数 ln\ln 完美抵消了 Sigmoid 的指数项:

Lw=(ay)x\frac{\partial L}{\partial w} = (a-y) \cdot x

没有了 a(1a)a(1-a) 的阻碍!你错得越离谱(aya-y 越大),梯度就越大,回传的力度就越猛。

这就是为什么在分类问题上,BCE 是绝对的统治者——它把 Loss 曲面变成了一个光滑的凸函数(Convex)大碗,让你能一路滚到全局最优的谷底。


二、 溯源:为什么是交叉熵?

BCE 不是凭空捏造的,它的数学根基是极大似然估计(Maximum Likelihood Estimation, MLE)

直觉理解:

既然我们在训练集中观测到了样本 {x1,y1},{x2,y2}...\{x_1, y_1\}, \{x_2, y_2\}... 发生了,那么我们相信,最优的模型参数 θ\theta,应该让**“这组数据出现的概率”最大化**。

对于二分类,样本服从伯努利分布。似然函数为:

L(θ)=i=1np(yixi;θ)L(\theta) = \prod_{i=1}^{n} p(y_i|x_i; \theta)

为了方便计算(变连乘为连加)和优化(变最大化为最小化),我们做如下操作:

  1. 取对数lnln\ln \prod \rightarrow \sum \ln
  2. 取负号:Max Likelihood \rightarrow Min Negative Log-Likelihood

一顿操作猛如虎,推导出来的公式,正是交叉熵。所以,用 BCE 本质上就是在做极大似然估计。


三、 细节魔鬼:为什么要计算偏置 (Bias) 的梯度?

在写代码实现反向传播时,我们会有两行代码:

Python

dl_dw = (prediction - y) * x  # 权重的梯度
dl_db = (prediction - y)      # 偏置的梯度

既然 dl_db 只是纯误差,为什么不能忽略它?这就涉及到了线性代数几何变换

  1. 几何自由度:如果不更新 bb(即 b=0b=0),决策超平面 wTx=0w^Tx = 0 被强制锁死在坐标原点。模型只能旋转,不能平移。如果数据分布远离原点,模型将无法正确切分。
  2. Sigmoid 的平移bb 决定了 Sigmoid 函数的中心点位置。计算 bb 的梯度,就是让激活函数根据数据分布左右平移,寻找最佳的阈值点。
  3. 零输入陷阱:如果遇到稀疏特征,输入 x=0x=0,此时 ww 的梯度也是 0(学不动)。只有 bb 依然能收到误差信号并更新,保证模型具有基础的判别能力(Base Rate)。

四、 演进之路:从 LR 到 Deep Learning

LR 很强,但它有一个致命弱点:线性坍塌。

y=σ(w2σ(w1x))y = \sigma(w_2 \cdot \sigma(w_1x))

如果不加激活函数,多层网络 W2(W1x)W_2(W_1x) 等价于单层 WxW'x

为了解决非线性问题,工业界走了两条路:

  1. 向深走 (Deep) :引入 Sigmoid/ReLU。非线性激活函数阻断了线性合并,让每一层网络都能对特征空间进行扭曲。没有激活函数,深度学习就是伪命题。

  2. 向宽走 (Divide & Conquer) :比如阿里的 MLR (LS-PLM) 。既然一个 LR 画不出曲线,我就用 mm 个 LR 来拼。

    • 分片 (Softmax) :决定样本属于哪个区域。
    • 拟合 (Sigmoid) :区域内用 LR 拟合。
    • 这就是“三个臭皮匠顶个诸葛亮”的工程实践。

五、 工业级大杀器:FTRL (Follow The Regularized Leader)

在动辄百亿特征的推荐系统中,普通的 SGD(随机梯度下降)已经不够看了。我们需要模型既,又稀疏(省内存),还适应流式数据

Google 在 2013 年提出的 FTRL 至今仍是工程标杆。它不是存权重 ww,而是维护两个“账本”:

  1. ziz_i (强弱账本) :累积梯度。反映该特征在历史上的整体方向。
  2. nin_i (稳定账本) :累积梯度平方和。反映该特征的抖动程度。

FTRL 的核心魔法公式

wt,i={0if zt,iλ1(1ηt,i+λ2)1(zt,isgn(zt,i)λ1)if zt,i>λ1w_{t,i} = \begin{cases} 0 & \text{if } |z_{t,i}| \le \lambda_1 \\ - \left( \frac{1}{\eta_{t,i}} + \lambda_2 \right)^{-1} (z_{t,i} - \text{sgn}(z_{t,i})\lambda_1) & \text{if } |z_{t,i}| > \lambda_1 \end{cases}

这里蕴含了三个设计哲学:

  1. L1 正则的硬截断if |z| < lambda1, w=0。如果一个特征累积的梯度不够强(没啥用),直接把权重置为 0。这带来了极高的稀疏性,节省了海量内存。

  2. 自适应学习率:分母中包含 ni\sqrt{n_i}

    • 热门特征(出现多,nn 大):学习率自动降低,防止震荡。
    • 冷门特征(出现少,nn 小):学习率自动调高,快速学习。
  3. Lazy Evaluation:每次只更新非零特征对应的 zznn,计算时现算 ww,用完即焚。


结语

逻辑回归看起来简单,但它串联起了概率论(MLE)、凸优化(BCE Convexity)、深度学习基础(Activation Function)以及大规模工程实践(FTRL)。