《统计学习方法》第二版刷到第六章的时候,很多人会突然卡住:前面几章还能靠着直觉理解,到逻辑回归和最大熵模型这里,公式密度一下子提上来,课后习题也不知道从哪里下手。尤其是“最大熵模型”这个概念,名字听起来很玄,书上又同时给了 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})”的问题,差一个负号结果完全不对。我的经验是每次写代码前后都用简单二次函数测试一下,确保搜索方向确实是下降方向。
| 对比维度 | IIS | BFGS |
|---|---|---|
| 设计出发点 | 专门为最大熵模型的约束结构设计 | 通用无约束优化算法 |
| 单次迭代成本 | 需要计算每个特征在两个期望上的差值,特征多时开销大 | 需要维护近似 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 公式或者最大熵模型形式,而是建立了一种“从约束到模型再到算法”的推导直觉。以后再遇到一个没见过的概率模型,我会先问:它的约束是什么?熵是什么?优化目标是什么?这三个问题想清楚,模型长什么样、参数怎么学,基本都顺理成章了。课后题不要只看答案,至少把最大熵模型的拉格朗日对偶推导亲手写三遍,写到某一步突然觉得“原来如此”的时候,这一章才算真正过关了。