线性回归与逻辑回归#
学习目标与记号#
准确解释监督学习、线性回归与逻辑回归;
根据公式和张量维度分析交叉熵,并识别常见实现错误;
用
Python实现或验证梯度下降与牛顿法。此外,每次只改变一个需要研究的因素,并保持数据、随机种子、训练过程和评价方法不变,再比较模型结果的变化。
本节沿用统一记号:普通小写字母表示标量,粗体小写字母表示向量,粗体大写字母表示矩阵或高阶张量;样本或时间编号写作下标;转置写作 \(\trans\)。除非另有说明,批量样本按行存放。正文与练习中的程序都应同时检查数值结果和数组维度。本节练习的参考答案见 线性回归、逻辑回归与优化基础答案。
本节回顾线性回归和逻辑回归。逻辑回归可以看作不含隐藏层的简单神经网络,其前向计算、损失函数和梯度优化过程也是理解全连接神经网络的基础。
线性回归#
我们已经在 一元变量的线性回归 部分中,结合 Python 基本命令简要介绍了如何分析一个特殊的、具有一元特征的线性回归模型。在本节中,我们首先将在更一般的情况下,介绍线性模型的基本统计结果。我们考虑以下线性回归模型:
其中,\(y_i\) 为第 \(i\) 个样本对应的观测标签;\(b_0\) 为偏置项(bias),\(\bx_i\in\mathbb{R}^d\) 为特征向量,\(\bw_0\in\mathbb{R}^d\) 为权重向量(weight vector),\(n\) 为样本量。假设误差满足条件均值为零,即 \(\mathbb{E}(\epsilon_i\mid\bx_i)=0\)。若进一步假设同方差性(homoscedasticity),则 \(\operatorname{Var}(\epsilon_i\mid\bx_i)=\sigma^2\),其中 \(\sigma^2>0\)。
备注
式 (6) 给出的模型是 一元线性回归 的多元推广。在统计学中,偏置项和权重通常称为截距和回归系数。注意不要把神经网络中的偏置项(bias term)与估计量的偏差(statistical bias)混淆。
记 \(\tilde{\bx}_i=(1,\bx_i\trans)\trans\),对应地记模型参数为 \({\btheta}_0=(b_0,\bw_0\trans)\trans\)。在新的符号下,式 (6) 给出的模型等价于:
用 \(\btheta\) 表示待估计参数。最小二乘法最小化如下平方损失:
其中,观测标签向量 \(\by=(y_1,\ldots,y_n)\trans\in\mathbb{R}^n\),设计矩阵 \(\bX=[\tilde{\bx}_1\trans;\ldots;\tilde{\bx}_n\trans]\in\mathbb{R}^{n\times(d+1)}\)。粗体小写表示向量,粗体大写表示矩阵。
备注
若进一步假设误差项相互独立且服从 \(\mathcal{N}(0,\sigma^2)\),则最小化 \(\mathcal{J}(\btheta)\) 等价于最大化关于 \(\btheta\) 的对数似然。请大家自行验证这个结论,具体推导要求见 本章综合练习。
\(\mathcal{J}(\btheta)\) 是关于 \(\btheta\) 的凸函数。请大家自行验证这个结论,并进一步思考设计矩阵满足什么条件时它是严格凸函数;具体推导要求见 本章综合练习。其任一最小值 \(\widehat{\btheta}\) 满足一阶条件
将式 (9) 中的梯度展开,可知参数估计量 \(\widehat{\btheta}\) 满足如下 正规方程 (normal equations)。如果需要检查公式推导或程序给出的梯度是否正确,可参见 数值梯度检验:
备注
式 (10) 给出的正规方程表明,估计残差 \(\by-\bX\cdot\widehat{\btheta}\) 与设计矩阵 \(\bX\) 的每一列正交。等价地,\(\sum_{i=1}^n(y_i-\tilde{\bx}_i\trans\cdot\widehat{\btheta})\tilde{\bx}_i=\bzero\)。
通过式 (10) 可知,线性模型的参数估计量为
上式要求 \(\bX\) 列满秩。实际计算不应显式形成逆矩阵,而应使用 QR、SVD 或最小二乘求解器;若 \(\bX\) 不满列秩,SVD 可给出最小范数解。
逻辑回归#
逻辑回归的模型为
其中,\(\tilde{\bx}_i=(1,\bx_i\trans)\trans\),\(\btheta_0=(b_0,\bw_0\trans)\trans\),sigmoid 函数为 \(\sigma(z)=\{1+\exp(-z)\}^{-1}\)。因此,\(\sigma(\tilde{\bx}_i\trans\cdot\btheta_0)\) 表示给定特征向量 \(\bx_i\) 时,\(Y_i=1\) 的条件概率。逻辑回归是广义线性模型;随着线性预测量 \(\tilde{\bx}_i\trans\cdot\btheta_0\) 增加,正类概率单调增加 2我们通常用小写字母表示观测,而用相应的大写字母表示随机变量。例如,\(y_i\) 表示观测到的第 \(i\) 个样本的标签,而 \(Y_i\) 表示其对应的随机变量。。
备注
关于(广义)线性模型更加深入的探讨,请参见 Hastie 等(2009)。
给定特征向量 \(\bx_i\) 后,式 (12) 给出的模型指定了随机标签 \(Y_i\) 的条件分布。对观测标签 \(y_i\) 最大化条件似然,等价于最小化平均负对数似然:
其中,\(z_i(\btheta)=\tilde{\bx}_i\trans\cdot\btheta\),\(a_i(\btheta)=\sigma\{z_i(\btheta)\}\)。后续章节沿用这一记号:\(z\) 表示线性变换的结果,\(a\) 表示激活值;详见 单隐藏层神经网络的引入。
逻辑回归的负对数似然是凸函数。请大家自行验证这个结论,并进一步分析严格凸性与有限最小值是否存在;具体推导要求见 本章综合练习。若最小值存在,则任一最小值满足
与普通最小二乘不同,逻辑回归参数通常没有显式解,需要使用 Newton-Raphson 算法 3参见 Hastie 等(2009) 第 4.4.1 节。、梯度下降法或其他数值优化算法求解。
Newton-Raphson 算法#
Newton-Raphson 算法需要计算损失函数的二阶偏导数组成的 Hessian 矩阵。对于逻辑回归,该矩阵为:
请大家自行验证上述 Hessian 公式,具体推导要求见 本章综合练习。
Newton-Raphson 算法
初始化权重向量 \(\btheta^{(0)}\)。
给定 \(\btheta^{(t)}\),计算
重复第二步直至收敛。
Newton-Raphson 算法利用二阶信息,在最优点附近通常收敛较快;但高维问题中构造并求解 Hessian 相关线性方程的计算代价很高。因此,训练深度神经网络时更常使用一阶优化算法,例如下面要介绍的(批量)梯度下降法。
(批量)梯度下降算法#
梯度下降只使用一阶导数,单次更新的计算和存储开销通常低于二阶算法,因此更适合参数量较大的神经网络。
(批量)梯度下降法
初始化权重向量 \(\btheta^{(0)}\)。
给定 \(\btheta^{(t)}\),计算
重复第二步直至收敛。
更新步长由 学习率 (learning rate) \(\alpha\) 控制。学习率过大可能导致迭代震荡或发散,过小则会使收敛缓慢。这里的“批量”是指每步使用全部训练样本 4批量(Batch) 是指我们在每步更新时,使用所有的训练样本。如果每次更新只使用部分样本,对应的算法叫做 (小批量)梯度下降法 或者 随机梯度下降法。;后续章节将进一步介绍小批量梯度下降及其变体。
交叉熵#
逻辑回归通常用于二分类,而 交叉熵 刻画真实分布与模型分布之间的差异。下面继续沿用全书记号:\(p\) 表示真实分布,\(q\) 表示分析模型;在监督学习中,模型通常还带参数 \(\btheta\)。
首先,由 Jensen 不等式可得如下结论,等价地也可由 Kullback-Leibler 散度的非负性推出 5关于 Jensen 不等式与 Kullback-Leibler 散度,可参见 Cover 与 Thomas(2006)。。
交叉熵与极大似然
在特定条件下,我们有
其中,\(p\) 是分布 \(P\) 的密度或概率质量函数,\(q\) 是定义在同一支持集上的分析模型,并假设期望存在。两边之差正是 \(D_{\mathrm{KL}}(p\|q)=\mathbb{E}_{X\sim P}[\log p(X)]-\mathbb{E}_{X\sim P}[\log q(X)]\geq0\);几乎处处满足 \(p=q\) 时取等号。
根据以上定理,我们可知当随机变量 \(X\) 的真实分布为 \(P\),且该分布具有密度函数 \(p(x)\) 时,该真实密度函数 \(p(x)\) 最小化如下关于密度函数 \(q(x)\) 的目标函数:
我们将式 (15) 表示的量称为由 \(p\) 和 \(q\) 确定的交叉熵,记为
其中,\(p\) 为真实密度函数,\(q\) 为分析模型的密度函数。交叉熵可用于衡量 \(q\) 对真实分布 \(P\) 的拟合程度。
在实际问题中,我们通常无法观测随机变量 \(X\) 的总体分布,只能得到一个样本量为 \(n\) 的随机样本 \(S=\{x_1,\ldots,x_n\}\)。此时,可以利用大数定理,用样本平均近似式 (16) 中的总体期望,即
我们希望在给定的模型族中选择密度函数 \(q\),使 \(\widehat{H}(p,q)\) 最小。
例如,如果我们想要找一个正态密度函数 \(q(x;\mu,\sigma^2) = (2\pi\sigma^2)^{-1/2}\exp\{-(x-\mu)^2/(2\sigma^2)\}\) 对真实密度函数 \(p(x)\) 进行近似,那么我们需要寻找参数 \(\mu\) 和 \(\sigma^2\) 最小化
我们可以观察到,式 (18) 正是关于参数 \(\mu\) 和 \(\sigma^2\) 的负对数似然函数。因此,最小化式 (18) 等价于最大化对应的对数似然函数。从本例中可以看出,最小化交叉熵与最大化对数似然在一定的条件下是等价的。
备注
由大数定律,式 (17) 给出的经验交叉熵在适当条件下收敛到式 (16) 给出的总体交叉熵。也可令 \(P_n=n^{-1}\sum_{i=1}^n\delta_{x_i}\) 表示经验分布,其中 \(\delta_{x_i}\) 是位于 \(x_i\) 的 Dirac 测度;此时 \(\widehat{H}(p,q)=H(P_n,q)\)。
关于逻辑回归模型的编程,请参见 与逻辑回归模型的比较。
逻辑回归与交叉熵#
设训练集 \(S=\{(\bx_i,y_i)\}_{i=1}^n\) 独立同分布,且 \(y_i\in\{0,1\}\)。逻辑回归定义条件模型
将这个条件概率代入经验交叉熵,参数估计量 \(\widehat{\btheta}\) 最小化
右端正是式 (13)。因此,对条件模型而言,最小化二元交叉熵就是最大化条件似然;不需要对特征的边际分布 \(p(\bx)\) 建模。这个结论也解释了为何分类网络只需输出 \(q_{\btheta}(y\mid\bx)\)。
Shiny 交互演示:线性模型与分类模型
“NumPy 广播与线性回归损失”页面可以改变偏置和权重,观察拟合直线及平方损失曲面;“逻辑回归与 Softmax 回归”页面则按照正文公式展示 Newton-Raphson 参数更新、决策边界和稳定的 Softmax 概率计算。页面中的逻辑回归准确率只描述当前随机生成的训练数据,不能代替验证集或测试集评价。
核心推导与实现核验#
核心关系
推导路径。 由伯努利似然取负对数得到二元交叉熵;又因 \(p_i=\sigma(z_i)\) 且 \(\sigma'(z_i)=p_i(1-p_i)\),链式法则给出对线性运算结果的导数 \(p_i-y_i\)。
关键条件
交叉熵非负,因为概率在 \((0,1)\) 内时对数不大于 0;在标签确定的单样本情形,正确类别概率趋近 1 时损失下确界为 0。
数据规模
若有 \(n\) 个样本、每个样本有 \(d\) 个特征,则特征矩阵 \(\bX\) 的大小为 \(n\times d\),权重 \(\bw\) 有 \(d\) 个数。模型会为每个样本产生一个预测,因此 \(\bz=\bX\cdot\bw+b\bone\) 有 \(n\) 个数。
常见误区
直接计算 \(\log\{\sigma(z)\}\) 会在线性运算结果的绝对值很大时下溢;把分类阈值固定为 0.5 也不一定符合代价不对称任务。
logaddexp 的含义与提出背景
在概率模型中,若概率非常小,程序通常把概率转换到对数域中保存,这样可以把概率的连乘转化为对数的相加。但是,当两个对数值 \(x\) 和 \(y\) 所对应的概率需要相加时,仍需计算 \(\log(e^x+e^y)\)。直接先计算指数可能造成数值过大或数值过小,因此数值计算程序库提供了 logaddexp 函数,用来稳定地完成“取指数、相加、再取对数”这一组运算。它的名称由 logarithm、addition 和 exponential 三部分缩写而来,而不是一种新的概率模型。
其中,\(x\) 和 \(y\) 是两个对数域中的数值。令 \(m=\max(x,y)\),可将上式稳定地改写为
由于 \(x-m\leq 0\) 且 \(y-m\leq 0\),两个指数项都不会溢出。特别地,\(\operatorname{logaddexp}(0,z)=\log(1+e^z)\),因此单个样本的二元交叉熵可以稳定地写成 \(\operatorname{logaddexp}(0,z)-yz\)。这一计算形式在统计计算和机器学习中很常见,主要目的是避免直接计算指数以及随后取对数所造成的溢出、下溢或 \(\log(0)\) 问题。
本节小结#
概率模型、损失函数和优化算法是三个不同层次。
交叉熵梯度的简洁形式来自 sigmoid 函数与对数似然的配合。
数值稳定性与数据划分会直接影响结论。
综合练习#
题目依次覆盖记号、概念、推导、证明、维度、实现、数值核验和受控实验。程序题应固定随机种子、写出维度断言并报告运行环境。全部参考答案见 线性回归、逻辑回归与优化基础答案。
证明题。 在线性回归模型 \(y_i=\tilde{\bx}_i\trans\cdot\btheta+\epsilon_i\) 中,假设误差项相互独立且均服从 \(\mathcal{N}(0,\sigma^2)\)。从每个观测标签的条件密度出发,写出样本的联合似然函数和对数似然函数,并证明当 \(\sigma^2>0\) 固定时,最大化关于 \(\btheta\) 的对数似然等价于最小化 \(\mathcal{J}(\btheta)\)。再说明把 \(\sigma^2\) 作为未知参数一同估计时,这一结论为何仍然成立。
证明题。 将平方损失写成 \(\mathcal{J}(\btheta)=n^{-1}(\by-\bX\cdot\btheta)\trans\cdot(\by-\bX\cdot\btheta)\),计算它关于 \(\btheta\) 的梯度与 Hessian 矩阵。利用 Hessian 矩阵证明 \(\mathcal{J}(\btheta)\) 是凸函数,并说明当 \(\bX\) 满足什么条件时 Hessian 矩阵正定、损失函数严格凸且最小值唯一。若该条件不成立,还应说明凸性与最小值唯一性有何区别。
证明题。 从逻辑回归负对数似然 \(\mathcal{J}(\btheta)\) 的梯度出发,逐项计算二阶偏导,验证 Newton-Raphson 算法 中给出的 Hessian 公式,并把 Hessian 写成加权 Gram 矩阵。证明它半正定,从而说明 \(\mathcal{J}(\btheta)\) 是凸函数;再说明在参数取有限值时,设计矩阵满足什么条件可使 Hessian 正定。最后讨论“严格凸”“最小值唯一”和“有限最小值存在”三个结论之间的区别,并说明数据完全分离时可能出现什么情况。
证明题。 证明二元交叉熵非负,并说明其下确界何时逼近 0。
维度检查。 针对“线性回归、逻辑回归与优化基础”,按正文的批量约定写出核心关系中输入、参数、中间量和输出的矩阵或者向量的规模;逐项验证乘法、求和、转置或广播运算是否合理。
错误分析。 围绕以下风险构造一个错误实现并解释其后果:直接计算 log(sigmoid(z)) 会在线性运算结果的绝对值很大时下溢;把分类阈值固定为 0.5 也不一定符合代价不对称任务。再给出能够稳定暴露该错误的最小测试。
核心编程。 在只调取基本运算包,例如
NumPy的情况下,实现 sigmoid 函数、二元交叉熵及逻辑回归梯度下降的程序编写,并与对应的库函数核对。数值稳定性。 针对“逻辑回归”及 \(\mathcal{J}(\btheta)=-\frac1n\sum_{i=1}^n[y_i\log p_i+(1-y_i)\log(1-p_i)]\) 检查真正可能出现的溢出、下溢、除零、病态或消减问题;不要机械罗列与本节无关的风险,并给出稳定改写。
受控实验。 在不同学习率和观测标签取 1 的不同成功概率下,比较参数的更新路径以及所拟合模型在测试集上的表现。除研究因素外保持数据划分、随机种子集合、训练预算和评价代码一致。
算法比较与实验。 基于本节的蒙特卡洛模拟设定以及正文给出的 Newton-Raphson 算法和梯度下降法代码,在相同数据、相同参数初值和相同运行环境下,分别执行 \(100\) 步参数更新,比较两种算法的计算时间、损失函数变化、参数更新路径和最终参数估计结果。对梯度下降法进一步比较多种学习率造成的影响,并根据实验结果讨论两种算法的优点、局限和适用情形。