ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

逻辑回归与最大熵模型:从对数线性模型到IIS/BFGS求解

逻辑回归与最大熵模型:从对数线性模型到IIS/BFGS求解

《统计学习方法》第二版刷到第六章的时候,很多人会突然卡住:前面几章还能靠着直觉理解,到逻辑回归和最大熵模型这里,公式密度一下子提上来,课后习题也不知道从哪里下手。尤其是“最大熵模型”这个概念,名字听起来很玄,书上又同时给了 IIS 和 BFGS 两种训练算法,第一次读很容易绕晕。我啃完这一章之后最大的感受是:这一章的难度不在单个公式,而在“为什么要这么定义模型”和“两个模型为什么放在同一章”。把这层逻辑打通了,后面那些推导和习题思路就顺了。所以这篇笔记不打算复述课本内容,而是带着“解题者”的视角,把模型主线、手推过程、训练算法和课后题拆开揉碎讲一遍。

1. 为什么这一章把两个模型放在一起:逻辑主线与前后章节的衔接

学第六章之前,最好先想清楚一个问题:逻辑回归和最大熵模型,一个是最常用的分类模型,一个看起来是“原理驱动的统计建模方法”,为什么会被编排在同一章?这绝不是随便凑在一起,而是因为它们在数学结构上根本就是同一类模型——对数线性模型。

所谓对数线性模型,核心特征是:条件概率 (P(y|x)) 的对数是一个关于特征 (x) 的线性函数。逻辑回归的形式是:

[ P(Y=1|x) = \frac{\exp(w\cdot x + b)}{1 + \exp(w\cdot x + b)} ]

把分子分母都用指数表示,它可以写成:

[ P(Y=1|x) = \frac{\exp(w\cdot x + b)}{\exp(w\cdot x + b) + \exp(0)} ]

这个形式一看就是“指数族分布”。最大熵模型在满足约束条件时得到的解也是:

[ P_w(y|x) = \frac{1}{Z_w(x)} \exp\left(\sum_{i=1}^n w_i f_i(x,y)\right) ]

如果把最大熵模型中的特征函数 (f_i(x,y)) 取成指示函数,比如 (f(x,1)=x)、(f(x,0)=0),那最大熵模型就退化成二项逻辑回归。所以我们可以把逻辑回归看成最大熵模型的一个特例,也可以把最大熵模型看成逻辑回归的推广版。这也是作者把两章内容合并的根本原因:它们的参数估计、模型求解、训练算法都能共用同一套框架。

从全书位置上看,第六章还起了一个“承上启下”的作用。对前的承接,体现在最大熵原理本质上就是“在已知信息约束下不做任何多余假设”,这是一种典型的统计建模思想;对后的衔接,体现在逻辑回归的多分类版本就是如今神经网络里到处用的 softmax 输出层。很多读者到后面看深度学习教材,看到交叉熵损失和 softmax 的梯度推导觉得眼熟,其实源头就在这里。如果能把这一章的数学结构吃透,后续看深度学习的损失函数、看条件随机场里的特征模板、甚至是看一些推荐模型里的 logit 变换,都会有一种“这我见过”的轻松感。

这一章还有一个容易被忽略的点:它第一次完整展示了“模型定义 → 约束构造 → 拉格朗日对偶 → 参数估计 → 数值优化”的完整链条。之前的感知机、k 近邻、朴素贝叶斯都没有这么完整地走完这条流程。所以做第六章习题的时候,不要满足于“能算出一个数”,而是要习惯性地问自己:这个形式从哪来?这个约束为什么成立?这步求导是对谁求的?带着这种问题刷题,收获会大很多。

2. 逻辑回归的三块硬骨头:模型形式、几率推导与参数估计

逻辑回归这部分,表面上是“套 sigmoid 函数”,但真到了课后题和面试题里,常考的是三块硬骨头:模型形式写成对数几率的形式、极大似然估计的推导、以及多分类 softmax 的扩展。一块一块说。

2.1 从条件概率到对数几率:为什么叫“回归”

二项逻辑回归的条件概率通常写成:

[ P(Y=1|x) = \frac{\exp(w\cdot x + b)}{1 + \exp(w\cdot x + b)} ]

很多初学者只把它当成“把线性输出塞进 sigmoid”。实际上,这个模型最优雅的地方是“对数几率”:

[ \log \frac{P(Y=1|x)}{P(Y=0|x)} = w \cdot x + b ]

这个式子可以直接作为课后证明题的答案框架:先分别写出 (P(Y=1|x)) 和 (P(Y=0|x)),两者相除再取对数,化简之后就会得到线性函数。这也解释了“回归”二字的来源:逻辑回归要对的是一个几率的对数,让它和 (x) 之间保持线性关系。

实际操作时,我建议把“sigmoid 函数性质”也一起复习:(\sigma(-z)=1-\sigma(z))、(\sigma'(z)=\sigma(z)(1-\sigma(z)))。课后题里一旦出现“证明梯度表达式”之类的问法,基本都要用到这些恒等变形。

2.2 极大似然估计与交叉熵:梯度的标准推导

设训练集是 ({(x_i,y_i)}_{i=1}^N),其中 (y_i\in{0,1})。把模型简写为 (p_i = P(Y=1|x_i;w,b)),那么单个样本的似然可以写成 (p_i^{y_i}(1-p_i)^{1-y_i})。于是负对数似然是:

[ L(w,b) = -\sum_{i=1}^N \big[ y_i \log p_i + (1-y_i)\log(1-p_i) \big] ]

这个式子和“交叉熵损失”完全一致。对 (w) 求偏导,用 (\partial p_i/\partial w = p_i(1-p_i)x_i),整理后得到:

[ \frac{\partial L}{\partial w} = \sum_{i=1}^N (p_i - y_i) x_i ]

注意这个梯度形式很干净:它是“预测概率减真实标签”乘以特征。感知机的符号函数不可导,所以只能靠误分类点驱动;逻辑回归处处可导,所以能让所有样本参与梯度更新。课后题如果要求推导梯度,必须从链式法则一步步写清楚,不要直接跳结论。

我在推导时会刻意区分两种“符号习惯”:有的教材把 (y) 标记为 ({-1, +1}),这时候对数似然形式和梯度都会变。大多数人容易在这里符号出错。建议固定一种约定,做题时先写出 (y\in{0,1}) 还是 (y\in{-1,+1}),再开始算。

2.3 多项逻辑回归:其实就是 softmax

当分类类别变成 (K) 类时,二项逻辑回归的自然扩展是:

[ P(Y=k|x) = \frac{\exp(w_k \cdot x)}{\sum_{j=1}^K \exp(w_j \cdot x)} ]

其中一般只使用 (K-1) 个参数向量(减去一个冗余类别)或直接保留 (K) 个参数。这个形式就是 softmax。理解它的技巧是:把每个类别的“得分” (\exp(w_k\cdot x)) 算出来,然后做归一化。课后题里常见的变体是让你写出多项逻辑回归的对数似然和梯度,这时梯度会变成:

[ \frac{\partial L}{\partial w_k} = \sum_{i=1}^N \big[ P(Y=k|x_i) - \mathbb{1}(y_i=k) \big] x_i ]

这里的 (\mathbb{1}(y_i=k)) 是指示函数。形式上可以看出,二分类只是它的特殊情形。如果后面学神经网络,会发现多分类交叉熵的梯度推导过程几乎一模一样,只是把“线性得分”换成“网络中间层输出”。

3. 最大熵模型的约束构造与对偶求解:把“最大熵”变成可计算的模型

最大熵模型是第六章真正的门槛。很多读者第一遍读完只记住了“熵最大”三个字,但完全不知道特征函数、约束条件、拉格朗日对偶之间是怎么串起来的。这里我建议把思路拆成四步:定义经验分布 → 构造特征函数和约束 → 最大化熵 → 对偶求解。

3.1 最大熵原理:已知信息之外的“不知道”

最大熵原理本身非常直觉:如果一个系统满足某些已知约束,那么我们对未知部分的概率分布应该选择“熵最大”的那个,也就是“在满足已知条件的所有可能分布里,最均匀、最不做额外假设的分布”。

书中用约束条件来刻画“已知信息”。给定训练集,先定义经验分布:

[ \tilde P(X=x, Y=y) = \frac{\nu(x,y)}{N} ]

也就是在训练样本中出现这个 ((x,y)) 组合的频率。模型需要满足:

[ \sum_{x,y} \tilde P(x) P(y|x) f_i(x,y) = \sum_{x,y} \tilde P(x,y) f_i(x,y) ]

左边是特征函数在“模型”下的期望,右边是特征函数在“训练数据”下的期望。这句话的意思很直白:模型算出来的特征期望应该和数据里观测到的特征期望一致。比如特征 (f_i) 表示“词 A 出现且类别是 B”,那么约束就要求模型的整体预测结果里,这种组合出现的频率必须和训练集吻合。

特征函数 (f_i(x,y)) 可以是任意实值函数,但书里最常见的是二值指示函数 (f_i(x,y)\in{0,1})。实际做 NLP 特征模板时,每个特征模板可能产生大量二值特征,这就是后面“特征期望”计算量大的原因。

3.2 约束优化与拉格朗日对偶

最大熵模型要求解的是:

[ \max_{P\in\mathcal{C}} H(P) = -\sum_{x,y} \tilde P(x) P(y|x) \log P(y|x) ]

其中 (\mathcal{C}) 是所有满足特征期望约束的条件概率分布集合。这是一个带约束的最优化问题,标准做法是引入拉格朗日函数:

[ \mathcal{L}(P,w) = H(P) + \sum_i w_i \left( \sum_{x,y} \tilde P(x,y) f_i(x,y) - \sum_{x,y} \tilde P(x) P(y|x) f_i(x,y) \right) ]

再加上归一化约束 (\sum_y P(y|x)=1)。对 (P(y|x)) 求偏导并令其为 0,得到:

[ P(y|x) = \frac{1}{Z_w(x)} \exp\left(\sum_i w_i f_i(x,y)\right) ]

这就是最大熵模型的指数族形式。(Z_w(x)) 是归一化因子:

[ Z_w(x) = \sum_y \exp\left(\sum_i w_i f_i(x,y)\right) ]

这一步推导建议亲自动手算一遍,尤其是偏导中“(\log P(y|x)) 求导得到 (1/P)”的部分,是最容易漏符号的地方。算完之后你会觉得豁然开朗:原来“最大熵”和“指数族分布”是一回事,熵最大化居然导出了和逻辑回归同构的模型形式。

3.3 对偶函数与极大似然的等价性

把求出的 (P_w(y|x)) 代回拉格朗日函数,经过整理可以得到对偶函数:

[ \Psi(w) = \sum_{x,y} \tilde P(x,y) \sum_i w_i f_i(x,y) + \sum_x \tilde P(x) \log Z_w(x) ]

这时最大熵模型的求解就变成:

[ \max_w \Psi(w) ]

而且可以证明,极大化 (\Psi(w)) 等价于极大化经验条件似然的对数。这个等价关系是整章最关键的理论基石之一。课后题如果问“为什么最大熵模型的参数估计可以用极大似然”,答案的骨架就是:先写出对偶函数,再写出对数似然,对比两者之差与 (w) 无关,因此优化目标一致。

学了这一段之后,我也理解了为什么自然语言处理里那么喜欢用最大熵模型:它给了一个非常灵活的特征框架,什么领域知识都可以通过特征函数塞进模型,不需要像朴素贝叶斯那样强加独立性假设。代价是特征一多,训练计算量就上去,于是就有了下一节说的 IIS 和 BFGS。

4. 两种训练算法的博弈:IIS 的针对性设计 vs BFGS 的通用性

最大熵模型的参数估计,本质上是一个无约束优化问题:对 (\Psi(w)) 求最大值。书中给了两种方法,一个是专门为最大熵设计的改进迭代尺度法 IIS,一个是通用拟牛顿法 BFGS。很多人学到这里会问:既然都是求极大,为什么还要分两种?我的理解是:IIS 更“懂得”最大熵模型的结构,而 BFGS 是通用工具箱里的多面手。

4.1 IIS 的核心思想:每次只改进一个特征权重

IIS 的思路是这样:当前参数是 (w),我们希望找到增量 (\delta),让更新后的参数 (w+\delta) 使 (\Psi(w)) 增大。为了让优化可解,IIS 对每个特征 (f_i) 分别计算增量 (\delta_i),再统一更新。

书中推导出的迭代更新方程是:

[ \sum_{x,y} \tilde P(x) P_w(y|x) f_i(x,y)\exp(\delta_i f^#(x,y)) = E_{\tilde P}[f_i] ]

其中:

[ f^#(x,y) = \sum_i f_i(x,y) ]

如果每个样本的 (f^#(x,y)) 都是同一个常数 (M),那么可以直接解出:

[ \delta_i = \frac{1}{M} \log \frac{E_{\tilde P}[f_i]}{E_{P_w}[f_i]} ]

这里的 (E_{\tilde P}[f_i]) 是特征在训练数据上的期望,(E_{P_w}[f_i]) 是特征在当前模型下的期望。说实话,第一次看到这个方程时我愣了很久,因为它比逻辑回归的梯度更新复杂得多。后来我才理解,这个“对数比值”本质上是在做一种特殊形式的“期望匹配”:数据上出现得多、模型给得少,就增大这个特征的权重;模型给得多、数据上出现得少,就减小权重。这和逻辑回归用“模型概率减真实标签”驱动更新的思路殊途同归,只是在形式上更贴近最大熵模型的约束结构。

实际问题里 (f^#(x,y)) 通常不是常数,这时 IIS 使用牛顿法近似求解每个 (\delta_i)。实现时有一个非常实用的技巧:对所有 (y),先算 (M = \max_{x,y} f^#(x,y)),然后用牛顿法迭代求解那个方程。

4.2 BFGS:把最大熵问题当作通用无约束优化

如果你不想专门实现 IIS,直接用 BFGS 优化 (\Psi(w)) 也可以。BFGS 属于拟牛顿法,它不需要计算 Hessian 矩阵,而是用迭代的方式近似 Hessian 的逆。对最大熵模型来说,目标函数的梯度非常好写:

[ \frac{\partial \Psi}{\partial w_i} = E_{\tilde P}[f_i] - E_{P_w}[f_i] ]

这里的 (E_{P_w}[f_i]) 是模型期望。梯度为零时,正好回到约束条件:模型期望等于数据期望。所以用 BFGS 求解,每次迭代的“感觉”就是:算当前模型期望,看它和观测期望差多少,然后沿着让差距变小的方向更新参数。

BFGS 的实现细节值得多说几句。书上给出的算法流程大致是:初始化 (w_0) 和近似逆矩阵 (H_0=I);迭代中计算梯度 (\mathbf{g}),搜索方向为 (\mathbf{d}=-H_k\mathbf{g});从 (w_k) 出发沿 (d) 做一维搜索得到步长 (\lambda_k),更新 (w_{k+1});再根据两次迭代的位移和梯度变化更新 (H_k)。这里最容易出错的是“用 (\mathbf{g}_{k+1}-\mathbf{g}_k) 还是 (\mathbf{g}k-\mathbf{g}{k+1})”的问题,差一个负号结果完全不对。我的经验是每次写代码前后都用简单二次函数测试一下,确保搜索方向确实是下降方向。

对比维度IISBFGS
设计出发点专门为最大熵模型的约束结构设计通用无约束优化算法
单次迭代成本需要计算每个特征在两个期望上的差值,特征多时开销大需要维护近似 Hessian 逆矩阵,维度高时存储大
更新方式每个特征权重独立更新增量所有参数统一向量更新
收敛速度通常较慢但稳定收敛较快,但受线搜索质量影响
实现复杂度中等,需要处理牛顿近似较高,要正确更新 BFGS 矩阵

4.3 怎么选:数据规模和特征数量的权衡

我的实际经验是:如果只是做一个小规模实验,手写逻辑回归加梯度下降就够了;但如果要正儿八经训一个 NLP 分类模型,特征维度很容易到几十万甚至上百万,这时候 IIS 的逐特征更新会非常慢,更常用的反而是有限内存的 BFGS 或者直接 SGD。至于课后题里“用 IIS 或 BFGS 求最大熵模型”这类题,关键是理解迭代流程和能正确写出梯度表达式,而不是真去手写了一百个特征再跑几十轮。

5. 课后习题的三类型拆解与常见推导雷区

第六章的课后题总量不大,但每一道都很有代表性。我做完之后把它们大致分成三类:一类是“模型形式与性质题”,一类是“推导证明题”,还有一类是“算法实现与计算题”。下面分别讲讲每一类应该怎么下手,以及我踩过的坑。

5.1 模型形式与性质题:抓住“对数几率”和“softmax”的共性

这类题通常让你写出二项逻辑回归模型、多项逻辑回归模型,或者证明某个概率形式的归一化性质。它的核心是把模型公式记牢,并且会从概率形式反推线性决策边界。

我做这类题时习惯先画一个“公式地图”放在旁边:左边是二项逻辑回归的 (P(Y=1|x)),右边是多项逻辑回归的 softmax,中间写上对数几率变换。看到题先判断它考的是“由线性模型到概率”还是“由概率到线性模型”,然后照方向套公式。比如“说明逻辑回归的决策边界是线性的”这题,其实一句话就能答完:因为 (P(Y=1|x)=P(Y=0|x)) 时,对数几率为零,即 (w\cdot x+b=0),这就是一个线性方程。

这里提醒一点:多项逻辑回归和 softmax 的关系,不少人会把“归一化参数”搞混。从数学上说,(K) 类问题可以只用 (K-1) 组参数,因为所有类别的概率之和为 1,存在冗余。很多教材处理方式不同,有的保留 K 组参数但效果一样。写课后题时最好先看清题目给的参数下标是从 1 到 K 还是从 1 到 K-1,别因为角标范围不同导致最终式子对不上。

5.2 推导证明题:九成是链式法则和对偶问题

推导证明题是第六章的大头,比如证明逻辑回归的对数似然是凸函数,或者证明最大熵模型的对偶问题和极大似然等价。这类题没有捷径,必须一步步把式子展开,用链式法则求导。

做逻辑回归凸性证明时,关键点是“逻辑回归的负对数似然关于参数是凸函数”。证明时可以写成矩阵形式:(L(w)=\sum_i \log(1+\exp(-y_i w\cdot x_i))),对一类样本固定时 ( \log(1+e^{-z})) 关于 (z) 是凸函数,而 (y_i w\cdot x_i) 关于 (w) 是仿射函数,凸函数与仿射函数的复合仍然凸。我最初想直接对 (w) 求二阶导,计算量很大还容易错;换成复合视角之后就清爽多了。

最大熵模型的证明题则要抓住拉格朗日对偶这条线。最典型的流程是:建立约束优化 → 写拉格朗日函数 → 对 (P(y|x)) 求导并令零 → 得到指数族形式 → 代回得到对偶函数 (\Psi(w)) → 指出极大化 (\Psi(w)) 与极大似然等价。这个流程我至少自己在草稿纸上完整写了三遍,才做到不翻书也能从头推到尾。第一遍肯定会在“带约束条件求导”时漏项,漏掉归一化约束 ( \sum_y P(y|x)=1) 对应的拉格朗日乘子项。这是最常见的推导雷区,没有之一。

5.3 算法实现与计算题:先手推一个小例子再写代码

书里这类题可能包括用 IIS 做一步迭代、或者手算某个最大熵模型在给定数据上的更新方向。做这种题最笨也最有效的方法,是先构造一个只有两个特征、两个样本的小数据集,把经验分布数出来,再选参数初值,按算法公式一步步代数字算。

举一个小例子:假设有二分类问题,特征向量 (x=(x_1,x_2)),某次预测时 (x=(1,1)),当前逻辑回归参数 (w=(0.5,-1.0)),偏置 (b=0.2)。要算 (P(Y=1|x)),先算线性得分:

[ z = w\cdot x + b = 0.5\times 1 + (-1.0)\times 1 + 0.2 = -0.3 ]

然后:

[ P(Y=1|x) = \frac{1}{1+e^{-(-0.3)}} = \frac{1}{1+e^{0.3}} \approx 0.4256 ]

这类小计算花不了几分钟,但能帮你把公式用顺。更重要的是,在实现逻辑回归和最大熵模型时,用小数据集跑一遍手算来验证代码是个好习惯。我多次因为公式里的“(p_i-y_i)”还是“(y_i-p_i)”搞混,全靠这种小样本核对才发现问题。

5.4 三个常见推导雷区盘点

最后把这章最常出错的三处集中列一下。

第一,符号约定混乱。逻辑回归的梯度、对数似然、负对数似然,不同资料里符号差一个负号。我的建议是始终固定“最大化对数似然”还是“最小化负对数似然”的口径。做课后题时先写清楚:我采用的是哪种目标,这一行的负号是干什么用的。

第二,拉格朗日函数里忘记归一化约束。最大熵模型是有两个约束条件的:特征期望匹配 + 概率和为 1。很多人只写特征期望等式,忘记 (\sum_y P(y|x)=1)。结果对 (P(y|x)) 求导时没有那个归一化乘子,后面整个式子都拼不出来。

第三,特征函数理解不到位。特征函数 (f_i(x,y)) 是“输入 (x) 和输出 (y) 的联合函数”,不是只依赖 (x) 的普通特征。IIS 公式里的 (f^#(x,y)) 和期望计算都要同时考虑 (x,y)。如果把特征函数理解成了 (f_i(x)),那后面所有模型期望的计算都会全错。

6. 把这章知识落到真实任务:数值稳定性、正则化与特征处理的实操备忘

课后题做得再熟练,最终还是要回到真实数据上。第六章的知识落到工程任务里,有几句实操备忘想分享给后来人。

6.1 数值稳定性:log-sum-exp 与 softmax 的防溢出

二分类的 sigmoid 很多时候直接用就够,但多分类 softmax 在真实场景中必须先做“减最大值”的变换。原因是 (\exp(w_k \cdot x)) 在参数较大的时候会直接溢出成无穷大,导致概率全是 NaN。标准做法是:

[ \max_k = \max_j(w_j\cdot x), \quad 然后计算 \exp(w_k\cdot x - \max_k) ]

这个变换不会改变 softmax 的结果,因为分子分母同时除以了 (\exp(\max_k))。最大熵模型里的 (Z_w(x)) 同理,计算 log 归一化因子时最好用 log-sum-exp 技巧而不是直接算指数再取对数。这一条工程经验,课本里不会重点写,但在真实任务里几乎必踩。

6.2 正则化:为什么逻辑回归和最大熵都离不开它

最大熵模型特别容易过拟合。原因是特征函数可以加很多,当特征数量接近训练样本量甚至超过时,模型会“记住”训练集,约束条件全部满足,但泛化能力很差。标准的解决办法是在目标函数后面加上参数向量的 L2 范数惩罚项:

[ \Psi(w) - \frac{\lambda}{2}\sum_i w_i^2 ]

这个操作在最大熵模型里也叫“高斯先验”:它等价于对参数 (w_i) 假定均值为 0 的高斯先验。逻辑回归做 L2 正则化同样常见,梯度表达式里会多出一项 (-\lambda w_i),实现起来很容易,但一定要在迭代更新时保持一致。

6.3 特征模板与稀疏性:先理解边界,再堆特征

最大熵模型允许我们自由定义特征,但这不代表特征越多越好。在 NLP 场景里,常用的特征模板包括“当前词是否等于某个词”“前一个词的词性标签”“当前词是否大写”等,每个模板展开后都是大量二值特征。特征工程的核心准则是:特征要和预测目标相关,并且在同一类型的特征之间保持一致性。

我用最大熵模型做文本分类时的经验是:一开始先用几十个强特征,比如“是否出现某些关键词”“是否包含否定词”,把基线模型跑通;然后再慢慢加组合特征。组合特征会显著提高模型的表达能力,但也明显增加特征期望的计算量。如果训练时间敏感,优先砍掉稀疏度过高的特征(即在整个训练集上出现次数极少的特征),因为它们对模型期望的影响很小,却让 IIS 的期望计算变得特别慢。

6.4 优化器的现实选择:梯度下降与 BFGS 的取舍

真实工程里,我反而很少直接落地书中那套 IIS 过程,因为现代框架里的逻辑回归和最大熵模型通常用 SGD 或拟牛顿法求解,IIS 更多被看作是理解“期望匹配”思想的教学工具。如果要从零实现逻辑回归,直接用随机梯度下降就够了,学习率建议从 0.1 开始,每次迭代后用验证集观察损失变化。如果特征维度不高但样本量很大,可以考虑批量梯度下降配合 BFGS 收敛。而如果特征维度非常高,BFGS 维护的近似 Hessian 矩阵会大得离谱,这时候优先用 L-BFGS 或 SGD。

无论是哪种优化器,都要记得监控训练集和验证集上的损失曲线。损失值不降、梯度为 NaN、概率输出集中到 0 或 1,这些现象背后通常对应数值溢出、学习率过大、特征归一化没做好等问题。一步步排查下来,你会发现第六章学到的那套“模型概率与观测概率期望匹配”的思想,反而比任何调试技巧都更能帮助定位问题。

刷完这一章,最大的收获不是背下了 sigmoid 公式或者最大熵模型形式,而是建立了一种“从约束到模型再到算法”的推导直觉。以后再遇到一个没见过的概率模型,我会先问:它的约束是什么?熵是什么?优化目标是什么?这三个问题想清楚,模型长什么样、参数怎么学,基本都顺理成章了。课后题不要只看答案,至少把最大熵模型的拉格朗日对偶推导亲手写三遍,写到某一步突然觉得“原来如此”的时候,这一章才算真正过关了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进