《hands-on ml》Chapter 4

线性回归(Linear Regression)

线性回归模型

回顾之前的例子,幸福指数与人均GDP呈线性正相关。一个线性回归模型,就是在输入特征上加权之后相加,再加上一个常量,称之为bias term(intercept term)。用方程来表示,就是

\hat{y} = \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_nx_n

用向量方式来表达就是

\hat{y} = h_\theta(x) = \theta^T\cdot\mathrm{x}
  • y为模型的预测值。
  • θ 就是模型的参数向量,包括bias term θ0,以及特征上的权重θ1到θn
  • θT,就是θ向量的转置,从(n+1) * 1变化为1 * (n+1)
  • x是实例的特征向量,包含从x0到xn,其中x0永远为1。
  • θT . x,是两个向量的点积(dot product)。
  • hθ就是基于参数θ的假设方程。

点积的定义如下

\mathrm{a}\cdot\mathrm{b} = \sum_{i=1}^{n}a_ib_i=a_1b_1+a_2b_2+...+a_nb_n
\\
\mathrm{a}\cdot\mathrm{b} = \mathrm{a}^\mathrm{T}\mathrm{b}

为了评估模型的表现,可以用Root Mean Square Error(RMSE)

RMSE((\mathrm{X},h)) = \sqrt{\frac{1}{m}\sum_{i=1}^{m}(h(\mathrm{x}^{(i)}) - y^{(i)})^2}

为了节约计算,也可以用更简单的Mean Square Error(MSE)

MSE((\mathrm{X},h)) = \frac{1}{m}\sum_{i=1}^{m}(h(\mathrm{x}^{(i)}) - y^{(i)})^2

所以线性回归模型,最终就是要找到这个θ,从而让MSE收敛至最小。


正规方程(The Normal Equation)

为了找到最小化代价函数的θ,其实有个方程可以直接给出答案,就是正规方程(The Normal Equation)

\hat{\theta}=(\mathrm{X}^\mathrm{T}\cdot\mathrm{X})^{-1}\cdot\mathrm{X}^\mathrm{T}\cdot\mathrm{y}

以下是证明过程,来自Deepseek。

\begin{aligned}
J(\theta)&=(\mathrm{y}-\mathrm{X}\theta)^{T}(\mathrm{y}-\mathrm{X}\theta)\\
&=\mathrm{y}^{T}\mathrm{y}-\mathrm{y}^{T}\mathrm{X}\theta-\theta^{T}\mathrm{X}^{T}\mathrm{y}+\theta^{T}\mathrm{X}^{T}\mathrm{X}\theta\\
\quad\\
\mathrm{y}&:n\times 1\quad(n个观测值)\\
\mathrm{y}^{T}&:1\times n\quad(行向量)\\
\mathrm{X}&:n\times (p+1)\quad(n个观测值, p+1个特征)\\
\theta&:(p+1)\times 1\quad(列向量)\\
\mathrm{y}^{T}\mathrm{X}\theta&=1\times n \times n \times (p+1) \times (p+1) \times 1\\
&=1 \times 1\\
&=标量\\
&=\theta^{T}\mathrm{X}^{T}\mathrm{y}\\
\quad\\
J(\theta)&=\mathrm{y}^{T}\mathrm{y}-2\theta^{T}\mathrm{X}^{T}\mathrm{y}+\theta^{T}\mathrm{X}^{T}\mathrm{X}\theta\\
\quad\\
对\theta求导数\\
\frac{\partial J(\theta)}{\partial \theta}&=\frac{\partial}{\partial \theta}(\mathrm{y}^{T}\mathrm{y}) - 2\frac{\partial}{\partial \theta}(\theta^{T}\mathrm{X}^{T}\mathrm{y})+\frac{\partial}{\partial \theta}(\theta^{T}\mathrm{X}^{T}\mathrm{X}\theta)\\
&=0-2\mathrm{X}^{T}\mathrm{y}+2\mathrm{X}^{T}\mathrm{X}\theta\\
\quad\\
最小值处导数为0,所以\\
0&=-2\mathrm{X}^{T}\mathrm{y}+2\mathrm{X}^{T}\mathrm{X}\theta\\
\mathrm{X}^{T}\mathrm{X}\theta&=\mathrm{X}^{T}\mathrm{y}\\
\theta&=(\mathrm{X}^{T}\mathrm{X})^{-1}\mathrm{X}^{T}\mathrm{y}
\end{aligned}\\

再来看计算复杂度,XTX,得到的是一个d*d的矩阵(这里的d指的是特征的数量),所以计算复杂度通常会达到O(d3)。所以当特征数量达到十万的量级时,计算就会非常耗时。

与y点积的时候,计算复杂度是O(n),和训练集的数量呈正比,所以大的训练集也足以放入内存。

当训练好的模型用于预测时,仅仅是简单的X与θ的点积,与特征数呈正比,预测的复杂度并不高。


梯度下降(Gradient Descent)

梯度下降的定义

上文中的正规方程,虽然可以直接给出结果,但是仅适用于线性回归模型,且有较大的计算复杂度。还有一种算法,适用于多种模型,就是梯度下降(Gradient Descent)。

梯度,其实就是函数的导数。一元函数的导数表示这个函数图形的切线的斜率,多元函数上的梯度则是一个向量,它的方向是这个函数在某个点上最大增长的方向,它的量是在这个方向上的增长率。

梯度下降的目的,就是找到参数调整的方向,并最终找到整个代价函数的最低点,也就是梯度为0的点。参数调整的方向,就是梯度的反方向。

梯度下降的做法,就是先随机初始化一个起点(称为random initalization),不断迭代调整参数,并最终达到最优点,如下图所示:

在调整过程中,比较重要的一个参数就是学习率(learning rate)。如果学习率太低,则会耗时太久才找到最优解;如果学习率过大,则会跳过最优解,而代价越来越大,导致训练失败。

当然,并不是所有的代价函数都是完美的碗形状,实际可能有更多的复杂形状。如下图所示,如果起始点随机在左侧,则只会达到local最优(local minimum),并非全局最优(global minimum)。如果随机在右侧,则会耗费很久无法达到最优点。

然而对于线性回归模型来说,其代价函数是一个凸函数,所以肯定仅有一个全局最优点。因此只要学习率适当,等待足够的时间,最终肯定可以找到最优解。

线性回归模型的代价函数,是一个圆,但是如果不同特征之间的取值范围不一,则会变成椭圆,如下图所示

左边的图中,特征之间取值范围相同,则梯度下降的方向就是最优的方向,所以很快就能找到最优解。而右侧的图中,由于取值不相同,导致梯度下降的方向并非最优。所以在训练之间的准备过程中,就用通过Standard Scaler等手段,进行特征缩放,从而有利于更快找到最优解。


批量梯度下降(Batch Gradient Descent)

为了计算梯度下降,就需要计算出每个参数θj的梯度。换句话说,需要计算出θj变化后,代价函数会减少多少,称为偏导数(或者偏微分,partial derivative)。单个参数的偏导数公式以及推导过程如下:

\begin{aligned}
J(\theta)&=\frac{1}{m}\sum_{i=1}^{m}(y^i-\hat{y^i})^2\\
\hat{y^i}&=\theta_0+\theta_1x_{i1}+\theta_2x_{i2}+...+\theta_px_{ip}=\sum_{j=0}^p\theta_jx_{ij}\\
\quad\\
对特定参数\theta_j求偏导数\\
\frac{\partial{J}}{\partial{\theta_j}}&=\frac{\partial}{\partial{\theta_j}}\left[\frac{1}{m}\sum_{i=1}^{m}(y^i-\hat{y^i})^2\right]\\
&=\frac{1}{m}\sum_{i=1}^{m}\frac{\partial}{\partial{\theta_j}}\left[(y^i-\hat{y^i})^2\right]\\
\quad\\
\frac{\partial}{\partial{\theta_j}}\left[(y^i-\hat{y^i})^2\right]&=2(y^i-\hat{y^i})\frac{\partial}{\partial{\theta_j}}(y^i-\hat{y^i})\\
\quad\\
由于y_i为常数,不依赖\theta_j\\
\frac{\partial}{\partial{\theta_j}}(y^i-\hat{y^i}) &=-\frac{\partial\hat{y^i}}{\partial\theta_j}\\
\quad\\
非\theta_j的项都视为常数\\
\frac{\partial\hat{y^i}}{\partial\theta_j}&=x_{ij}\\
\quad\\
组合起来后就有\\
\frac{\partial{J}}{\partial{\theta_j}}&=\frac{2}{m}\sum_{i=1}^{m}(\hat{y^i}-y^i)x_{ij}

\end{aligned}

梯度向量,记为▽θMSE(θ),包含了每一个参数的偏导数方程,如下所示

\nabla_{\theta}MSE(\theta)=\left(
\begin{aligned}
\frac{\partial}{\partial\theta_0}MSE(\theta)\\
\frac{\partial}{\partial\theta_1}MSE(\theta)\\
...\\
\frac{\partial}{\partial\theta_n}MSE(\theta)\\
\end{aligned}
\right)=\frac{2}{m}\mathrm{X}^{T}\cdot(\mathrm{X}\cdot\theta-\mathrm{y})

这里的计算复杂度为O(nd),其中n为样本数,d为特征数。这里每一步迭代,都会使用全部的样本数进行训练,所以对于大训练集来说还是很耗时的。不过相比于正规方程(The Normal Equation)来说,海量特征的场景下,梯度下降的优势还是比较明显的。

每次迭代需要调整参数,这里引入了学习率 η,每次调整都会乘上学习率。

\theta^{(next\ step)}=\theta-\eta\nabla_{\theta}MSE(\theta)

不同的学习率的效果如下图所示。学习率太低的时候,迭代了很多次仍然没有达到最优。学习率太高的时候,会直接错过最优解。只有学习率合适的时候,才能在有效的迭代中找到最优解。


随机梯度下降(Stochastic Gradient Descent)

批量梯度下降的问题,就是每一次迭代都需要完整的训练集进行计算,计算成本太高。所以SGD每一步迭代的时候,仅挑选一个样本进行梯度计算,如下所示。所以即使是大的训练集,每一步迭代的速度也会很快。

\nabla_{\theta}MSE(\theta)=2x_i^{T}\cdot(x_i\cdot\theta-y_i)

另一方面,SGD由于随机的特性,当达到临近最优解的时候,并不会收敛,而是会在最优解附近反复,如下图所示。所以SGD算法终止的时候,结果是临近最优,但并不一定是最优。

SGD还有一点好处,就是随机特性,所以有可能能跳过local最优,而达到全局最优。

如下图所示,经过10次迭代后,最终也是可以找到最优附近的解。


小批量梯度下降(Mini-batch Gradient Descent)

既然SGD太多随机,批量的方式计算量太大,那么就选择一种中间的方式,就是挑选样本的时候,仅随机挑选小批量的样本进行学习。

如下图所示,使用三种方式进行训练。batch方式会持续迭代到最优解,而SGD和mini-batch两种都会在最优解附近反复横跳。相比而言,mini-batch的幅度更小,不会偏离太多。

下表就是三种方式的一个对比,m为样本数,n为特征数。

算法Large mOut-of-core supportLarge nScaling required
正规方程FastNoSlowNo
批量梯度下降SlowNoFastYes
随机梯度下降FastYesFastYes
小批量梯度下降FastYesFastYes

多项式回归(Polynomial Regression)

多项式回归的实现

比如有一个多项式模型为y=ax2+bx+c,多项式会自动发现特征的多项式关系。对于这个例子,之前的单一特征{x},就会被拓展为{x, x2}两个特征。根据这两个特征再去进行线性回归,从而找到对应的参数。

多项式展开,就是根据多项式的最高项数,穷举所有的可能。比如有两个特征a和b,最高项数为3,则多项式展开后,会增加a2,b2,a3,b3,ab,a2b,ab2

多项式展开的公式,就是最高项数d,n个特征,最终会展开出(n+d)! / d!n! 个特征。

这个问题其实就是d个项数,需要分到n个特征上,每个特征上可以为0。

\begin{aligned}
e_1+e_2+e_3+...+e_n&\leqslant d, \quad e_i\geqslant0\\
引入辅助变量e_{n+1} &= d-(e_1+e_2+e_3+...+e_n)\\
e_1+e_2+e_3+...+e_n+e_{n+1}&=d\\
等价于d个球放入n+1个盒子,&盒子可空\\
等价于d+n+1个球放入n+1个盒子,&盒子不可空\\
根据隔板法,可得:\\
\left(\frac{d+n}{n}\right)&=\frac{(d+n)!}{d!n!}
\end{aligned}

学习曲线(Learning Curve)

毫无疑问,当多项式的项数更高的时候,就能与训练模型更拟合,如下图所示:

从上图可以看到,线性模型明显是欠拟合,而300项的多项式模型则明显过拟合。那么如何判断一个模型是欠拟合还是过拟合呢?这就需要引入学习曲线(Learning Curve)来进行判断。

上图中的数据用线性模型来拟合,其学习曲线如下图所示,曲线上的两条线分别是训练集和验证集的表现。

当训练集很少的时候,比如仅有1-2个样本,则线性模型很容易拟合训练集,代价基本为0。但是这个模型明显无法拟合验证模型,初始代价很很大。

随着训练集样本数增加,线性模型无法完美拟合了,代价也随之增加,随后样本数再增加也无法改善了。而在验证集上的表现,样本数增加也能帮忙模型更好拟合验证集,但后续后续无法继续改善了。

这个图就是明显的欠拟合,模型过于简单,以至于样本数增加也无法继续优化。

再用最高10项的多项式模型来拟合同样的数据,其学习曲线如下图所示:

通过这张图可以看出,相比于线性模型,代价明显更小。但是同样可以看到,训练集的表现要比验证集的表现要好,当然这也是过拟合的表现。随着样本数增加,两者之间的差距也会渐渐缩小。

Bias/Variance Tradeoff

一个模型的泛化误差,可以表达为三部分误差之和:

  • Bias。这部分的误差,主要是因为模型的预测与真实值之间的差异。可能是选择了错误的模型,比如多项式场景用了线性模型。如果这部分误差很大,则代表模型是欠拟合的。
  • Variance。这部分的误差,主要是因为模型对于训练集中的一些小的偏差过于敏感,甚至尽量去拟合训练集中的正常噪音,从而导致不同的验证集会有不同的表现,也就是过拟合。
  • Irreducible error。一般是由于训练集中的噪音导致,这种需要数据清理来减少噪音的影响。

所以提升模型的复杂度,就会增加variance,而减少bias。相反,减少模型的复杂度,会增加bias,减少variance。具体如下图所示:


正则化的线性模型(Regularized Linear Models)

第一章提到,为了避免过拟合,可以通过正则化来限制模型的复杂度。对于线性模型来说,正则化有三种方式:Ridge Regression,Lasso Regression,Elastic Net。

Ridge Regression

Ridge Regression(也称Tikhonov正则化)是正则化版本的线性回归。具体做法就是在代价函数中增加特征权重的l2-norm,这就保证拟合模型不会有太大的权重。

超参数α用于设置正则化的程度,如果为0,则没有任何的限制,等价于线性回归。如果很大,则权重会被限制到基本为0,那么模型就退化为一个常量(样本的平均值)了。

正则化后的代价函数,可以描述为

J(\theta)=MSE(\theta)+\alpha\frac{1}{2}\sum_{i=1}^{n}\theta_i^2

因为是平方求和,所以参数权重的归一化特别重要,不要有太大的值,否则会被放大而影响结果。

下图就是不同超参数对于模型的限制效果。左侧的线性回归,α为0时为原始的模型,α越大,模型斜率越低。右侧的多项式回归模型,α越大,模型越平缓,波动越小。

Ridge Regression求解

Ridge Regression也有直接求解的方程,这里的A是一个n*n的单位矩阵。

\hat\theta=\left(\mathrm{X}^T\cdot\mathrm{X} + \alpha\mathrm{A}\right)^{-1}\cdot\mathrm{X}^T\cdot\mathrm{y}

证明过程如下

\begin{aligned}
J(\theta)&=(\mathrm{y}-\mathrm{X}\theta)^{T}(\mathrm{y}-\mathrm{X}\theta)+\alpha\theta^T\theta\\
&=\mathrm{y}^{T}\mathrm{y}-\mathrm{y}^{T}\mathrm{X}\theta-\theta^{T}\mathrm{X}^{T}\mathrm{y}+\theta^{T}\mathrm{X}^{T}\mathrm{X}\theta+\alpha\theta^T\theta\\
&=\mathrm{y}^{T}\mathrm{y}-2\theta^{T}\mathrm{X}^{T}\mathrm{y}+\theta^{T}\mathrm{X}^{T}\mathrm{X}\theta+\alpha\theta^T\theta\\
\quad\\
对\theta求导数\\
\frac{\partial J(\theta)}{\partial \theta}&=\frac{\partial}{\partial \theta}(\mathrm{y}^{T}\mathrm{y}) - 2\frac{\partial}{\partial \theta}(\theta^{T}\mathrm{X}^{T}\mathrm{y})+\frac{\partial}{\partial \theta}(\theta^{T}\mathrm{X}^{T}\mathrm{X}\theta)+\frac{\partial}{\partial \theta}(\alpha\theta^T\theta)\\
&=0-2\mathrm{X}^{T}\mathrm{y}+2\mathrm{X}^{T}\mathrm{X}\theta+2\alpha\theta\\
\quad\\
最小值处导数为&0,所以\\
\mathrm{X}^{T}\mathrm{X}\theta+\alpha\theta&=\mathrm{X}^{T}\mathrm{y}\\
为了对齐\mathrm{X}^{T}\mathrm{X},&需要乘以单位矩阵\\
(\mathrm{X}^{T}\mathrm{X}+\alpha\mathrm{A})\theta&=\mathrm{X}^{T}\mathrm{y}\\
\theta&=(\mathrm{X}^{T}\mathrm{X}+\alpha\mathrm{A})^{-1}\mathrm{X}^{T}\mathrm{y}
\end{aligned}\\

Lasso Regression

Lasso Regression,使用的是l1-norm,其公式如下

J(\theta)=MSE(\theta)+\alpha\sum_{i=1}^{n}|\theta_i|

下图就是Lasso Regression对于模型的约束效果

对于Ridge和Lasso两张图可以发现一个明显的不同点。同样的最大约束条件下,Ridge左侧线性模型的斜率接近0,但还是会稍微大于0,右侧多项式模型仍然为多项式。而相比之下,Lasso左侧的线性模型斜率直接为0,左侧多项式模型也退化为斜率为0的直线,也就是说参数被限制为0了。

这就是Lasso Regression的一个关键特性,就是它可以将不重要的特征参数直接降为0,从而实现了特征选择的效果,最终会输出一个稀疏的模型(仅保留重要特征参数)。

为什么Ridge Regression只能让参数接近0,而Lasso Regression可以让参数降为0呢?可以从下图中得出答案

左上图中,椭圆是未正则化的代价函数(仅有两个参数θ1和θ2),每一圈的代价相同(代价函数的等高线)。白色点连成的线,就是通过BGD(批量梯度下降)寻找最优解的路径。

菱形则是l1-norm的代价约束(不同参数绝对值相加,因此是一个菱形,l2-norm是一个椭圆)。黄色点的连接,就是BGD寻找α->∞时的最优解,路径基本是沿着代价等高线的垂直方向,先定位到θ1的点,再定位到θ1和θ2都是0的点。

因此,正则化后的线性模型,本质就是寻找在一定的约束条件下(l1-norm的菱形范围内,l2-norm的椭圆范围内),求出代价函数的最小值。l1-norm限制下,椭圆与菱形的切点,很大概率是菱形的顶点,因此就会将某些参数限制为0。

右上的图,就是α=0.5情况下正则化的代价函数,其等高线不是标准的椭圆了,左侧有一个突出的尖角,因为左侧有一个l1-norm的额外代价,越靠左额外代价越小。最终的最优解将θ2限制为0了。

而下面两张图则是Ridge Regression。首先椭圆与椭圆的切点,不太会出现在参数为0的坐标轴上,因此最后的最优解也是θ2接近0。

Lasso Regression求解

Lasso Regression没有closed-form solution,不过也有办法求解,其证明过程如下:

\begin{aligned}
J(\theta)&=MSE(\theta)+\alpha\sum_{j=0}^p|\theta_j|\\
\frac{\partial J(\theta)}{\partial \theta_j}&=\frac{2}{m}\sum_{i=1}^{m}(\hat{y^i}-y^i)x_{ij} + \alpha\frac{\partial|\theta_j|}{\partial{\theta_j}}\\
由于\theta_j为0处&不可微分,求\theta_j的次梯度\\
\frac{\partial|\theta_j|}{\partial{\theta_j}}&=sign(\theta_j)\\
\quad\\
因此\\
g(\theta,J)&=\nabla_{\theta}MSE(\theta)+\alpha\left(
\begin{aligned}
sign(\theta_1)\\
sign(\theta_2)\\
...\\
sign(\theta_n)\\
\end{aligned}
\right)
\quad\\
\end{aligned}

Elastic Net

Elastic Net是结合Ridge Regression和Lasso Regression的一种正则化方式,并通过一个参数r来控制更偏向于哪一种正则化方式。其公式如下

J(\theta)=MSE(\theta)+r\alpha\sum_{i=1}^n|\theta_j|+\frac{1-r}{2}\alpha\sum_{i=1}^n\theta_i^2

r是介于0~1的参数,当r=0时等价于Ridge Regression,当r=1时等价于Lasso Regression。实际情况中,一般会更偏向于Lasso Regression,因为可以去除掉无用的特征。


早停法(Early Stopping)

为了避免过拟合,还有一种办法就是使用早停法(Early Stopping),也就是说当验证误差低于阈值后,及时终止训练,从而避免过拟合。

下图就是通过BGD训练一个高阶多项式模型的学习曲线,可以看出随着训练次数越来越多,虽然训练的误差越来越小,但是在验证集的误差却渐渐增加,表示这个模型已经开始过拟合了。

对于随机梯度下降或者小批量梯度下降,学习曲线并不一定如上图那般平滑,所以并不好判断何时应该及时停止。一个有效的判断办法,就是当误差持续停留在最小值附近,则可以断定模型已经无法继续优化了,将参数回滚到最小值那一步即可。


逻辑回归(Logistic Regression)

在第一章提到,有些回归算法也可以用于分类。逻辑回归就是用于预测一个样本属于某个分类的概率(比如这个邮件是垃圾邮件的概率),概率大于等于50%则判断属于该分类(positive,标记为1),否则不属于该分类(negtive,标记为0),因此也是一个二元分类器。

预测概率

逻辑回归和线性回归类似,也是需要输入特征以及特征的参数(权重),不同的是它仅输出一个概率,其向量化方式表达如下:

\hat{p}=h_{\theta}(\mathrm{x})=\sigma(\theta^T\cdot \mathrm{x})

σ是一个sigmoid函数,呈S型,其具体公式以及图形表达如下所示

\sigma(t)=\frac{1}{1+e^{-t}}

当计算出概率后,最终的分类结果通过下式可以得出:

\hat{y}=\begin{cases}
0\quad if\ \hat{p}\ <\ 0.5,\\
1\quad if\ \hat{p}\ \ge\ 0.5.
\end{cases}

训练模型及代价函数

那么应该如何训练一个逻辑回归模型呢?训练的目的就是找到这样的参数,能让y=1的样本预测概率很高(接近1),并让y=0的样本预测概率很低(接近0)。因此如果模型的预测概率恰好与之相反,就要给予较大的惩罚,让其概率特别大。因此单个样本的代价函数可以定位为:

c(\theta)=\begin{cases}
-log(\hat{p}) \qquad &if\ y=1,\\
-log(1-\hat{p}) &if\ y=0.\\
\end{cases}

当y=1且概率接近0时,会返回特别大的值,同样当y=0且概率接近1的时候,也会返回大数。因此实现了预测不符合预期给予较大代价的目的。

总体的代价函数,就是所有样本代价的平均值,如下式所示:

J(\theta)=-\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}log(\hat{p}^{(i)}) + (1-y^{(i)})log(1-\hat{p}^{(i)})\right]

这里的代价函数,没有一个类似正规方程那样的求解,不过可以针对某一个参数求偏导数,从而利用梯度下降算法来寻求最优解。某一参数的偏导数推导过程如下:

\begin{aligned}
首先,&log函数的导数为\\
log'(p) &= \frac{1}{p}\\
sigmoid&函数的导数为\\
\sigma'(z)&=\sigma(z)(1-\sigma(z))\\
逻辑回归&输出的导数为(BGD部分有类似过程)\\
\frac{\partial}{\partial\theta_j}(\theta^T\cdot\mathrm{x})&=x_{ij}\\
\quad\\
因此&应用链式法则\\
\frac{\partial}{\partial{\theta_j}}J(\theta)&=-\frac{1}{m}\sum_{i=1}^{m}\frac{\partial}{\partial{\theta_j}}\left[y^{(i)}log(\hat{p}^{(i)}) + (1-y^{(i)})log(1-\hat{p}^{(i)}))\right]\\
&=-\frac{1}{m}\sum_{i=1}^{m}\left[\frac{y^{(i)}}{\sigma^{(i)}} +  \frac{1-y^{(i)}}{1-\sigma^{(i)}}\right]\cdot\left[\sigma^{(i)}(1-\sigma^{(i)})\right]\cdot x_{ij}\\
&=-\frac{1}{m}\sum_{i=1}^{m}(\sigma(\theta^T\cdot\mathrm{x}^{(i)})-y^{(i)})x_{ij}
\end{aligned}

Softmax Regression

逻辑回归也可以用于多分类场景,不需要像第三章那样训练多个二元分类器。这种多分类场景,也被称为Softmax Rgression或者多元逻辑回归(Multinomial Logistic Regression)。

其原理也是比较简单易懂,对于一个样本x,回归模型会针对每个分类k计算一个得分sk(x),然后通过softmax函数来预估每个分类的概率。

计算每个分类k得分的方法,与线性回归算法类似,具体如下

s_k(\mathrm{x})=\theta_k^T\cdot\mathrm{x}

每一个分类都有其独有的参数向量θk,每个向量都是参数矩阵Θ的一行。

计算概率时使用的softmax函数,定义如下所示

\hat{p_k}=\sigma(\mathrm{s}(\mathrm{x}))_k=\frac{\exp(s_k(\mathrm{x}))}{\sum_{j=1}^{K}\exp(s_j(\mathrm{x}))}
  • K为分类的数量
  • s(x)是某个样本x在每个分类得分的向量
  • σ(s(x))k是样本x属于某个分类的概率

与逻辑回归分类器类似,最终也是根据概率高低,找到最终属于的分类。

\hat{y}=\argmax_k\ \sigma(\mathrm{s}(\mathrm{x}))_k=\argmax_k\ s_k(\mathrm{x})=\argmax_k\ (\theta_k^T\cdot\mathrm{x})

那么模型训练时的代价函数,目标就是对于某个样本,其正确的分类有最高的概率,其他分类都概率很低。这种代价函数,也被称为交叉熵(cross entropy)。当y为1,但是概率很低的时候,其代价就会很大,从而用来惩罚预测错误的模型。

J(\Theta)=-\frac{1}{m}\sum_{i=1}^m\sum_{k=1}^K y_k^{(i)}\log(\hat{p}_k^{(i)})

对于某个分类k,其梯度向量如下所示

\nabla_{\theta_k}J(\Theta)=\frac{1}{m}\sum_{i=1}^m(\hat{p}_k^{(i)}-y_k^{(i)})\mathrm{x}^{(i)}

发表评论