一文讲清楚线性回归(Linear Regression)、逻辑回归(Logistic Regression)

139 阅读1分钟

前言

被各种ddl加上期末考试耽搁了一段时间,准备继续肝机器学习了,对前面学的东西做个阶段性总结。
刷的是吴恩达的课:[中英字幕]吴恩达机器学习系列课程
个人博客页(来凑热闹喵):一文讲清楚线性回归(Linear Regression)、逻辑回归(Logistic Regression) | Andrew的个人博客 (andreww1219.github.io)

一、线性回归(Linear Regression)

1. 问题描述

已知m组数据x(1),x(2),...,x(m)x^{(1)}, x^{(2)}, ..., x^{(m)},每组数据表示n个特征,可写为一个n+1维的向量
即:(x(i))T=(x0(i),x1(i),...,xn(i))(x^{(i)})^T = (x^{(i)}_0, x^{(i)}_1, ..., x^{(i)}_n),其中,x0(i)=1x^{(i)}_0=1
每组数据对应一个真实值y(i)y^{(i)},所有yy值在一块可表示为一个m维向量yy
我们需要构造一个预测值:y^=θ0+θ1x1+...+θnxn\widehat{y}=\theta_0+\theta_1x_1+...+\theta_nx_n
该函数叫做我们的hypothesis(假设),记为hθ(x)h_\theta(x)
那么有hθ(x)=θTxh_\theta(x)=\theta^Tx,其中θT\theta^Txx都为n+1维的向量,我们要求解的就是使预测值最准确的θ\theta

2. 梯度下降(Gradient Descend)

那么要怎么表示我们的预测和真实值的误差呢?我们引入cost function(代价函数 或 损失函数),记为J(θ)J(\theta),在线性回归中,我们通常使用平方误差作为损失函数,即: J(θ)=12mi=1m(hθ(x(i))y)2J(\theta) = \frac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)})-y)^2

现在我们要做的,就是找到一个θ\theta值,使得损失函数的值最小,最直接的方法就是求导找极值点,故有: J(θ)θ=1mi=1m(hθ(x(i))y)x(i)\frac{\partial J(\theta)}{\partial\theta} = \frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y)x^{(i)},前面取x0(i)=1x^{(i)}_0=1是为了使这里的偏导都符合同一形式。

在这里,当J(θ)θ>0\frac{\partial J(\theta)}{\partial\theta}>0时,我们的损失函数会随着θ\theta的增大而增大,当J(θ)θ<0\frac{\partial J(\theta)}{\partial\theta}<0时,我们的们的损失函数会随着θ\theta的增大而减小。

故只要将θ\theta减去偏导数的一定倍数(我们称之为学习率α\alpha),就可保证我们的θ\theta更优。之后重复这一过程,直到θ\theta收敛到一定区间,说明我们的θ\theta达到局部最优,这就是梯度下降法。

需要注意的是θ\theta会达到全局最优的条件是:我们的损失函数J(θ)J(\theta)凹函数,即2J(θ)θ2>0\frac{\partial^2 J(\theta)}{\partial\theta^2}>0。在使用平方误差作为我们的预测值时,能保证这一条件,故可使用梯度下降。

梯度下降中θ\theta的迭代公式为: θj=θjαJ(θ)θ,j=1,2,...,n\theta_j = \theta_j - \alpha\frac{\partial J(\theta)}{\partial\theta}, j = 1, 2, ..., n
使用平方误差时: θj=θjα1mi=1m(hθ(x(i))y)xj(i)\theta_j = \theta_j - \alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y)x_j^{(i)}

2.1 特征缩放(Feature Scaling)

每组数据xx包含m个维度,每个维度的数据范围不尽相同,例如200<x1<400-200<x_1<400,而3<x2<3-3<x_2<3,对他们的预测值求平方误差后,对θj\theta_j的影响幅度不同,这导致了θ\theta之间形成的等高线会相当陡峭,拟合的过程相对曲折。

所以,我们最好将每个维度的数据都放缩到接近1<xj<1-1<x_j<1的范围,下面有个示例: 已知:200<x1<400-200<x_1<400,取x1=x1100600(100=200+4002,600=400(200))x_1 = \frac{x_1 - 100}{600} (100 = \frac{-200+400}{2}, 600 = 400-(-200)),得到新的0.5<x1<0.5-0.5<x_1<0.5

2.2 学习率(Learning Rate)

选择学习率是一件需要技巧的事情,过低的学习率会使θ\theta收敛较慢,过高的学习率可能会使θ\theta无法准确收敛,甚至出现发散。

吴恩达的视频里只是讨论了学习率过高和学习率过低的影响,我就在想既然θ\theta是在计算中一步一步迭代的,那有没有方法也能对α\alpha进行迭代。网上果然能搜到许多方案,后面再深入了解一下吧。
可能是深度学习中最重要的超参数:学习率 - 知乎 (zhihu.com)

3. 正规方程(Normal Equation)

将m组数据表示为m(n+1)m*(n+1)维的矩阵,记为XX,每组数据对应的真实值表示为一个m维向量yy
则我们所需要的最优的θ=(XTX)1XTy\theta=(X^T X)^{-1}X^Ty
视频中没有给出证明,根据详解正规方程(Normal Equation) - 知乎 (zhihu.com),先用矩阵形式表示损失函数即Cost(θ)=12m(XθY)T(XθY)Cost(\theta) = \frac{1}{2m} (X\theta - Y)^T(X\theta - Y),对其求偏导,经过很多多多步化简,得到Δ=Cost(θ)θ=1m(XTXθXTY)\Delta = \frac{\partial Cost(\theta)}{\partial \theta} = \frac{1}{m}(X^T X\theta - X^TY)Δ=0\Delta = 0,得到正规方程θ=(XTX)1XTy\theta=(X^T X)^{-1}X^Ty

4. 梯度下降和正规方程的比较

梯度下降

  1. 需要选择学习率
  2. 需要多步迭代,且每一步迭代都需要对每个维度的偏导数进行计算
  3. nn较大,即数据维度很大时表现很好

正规方程

  1. 不需要选择学习率,不需要迭代,一步算出答案
  2. 矩阵的逆的计算复杂度很高,在nn较大,即数据维度很大时表现不好

二、逻辑回归(Logistic Regression)

1. 问题描述

已知m组数据x(1),x(2),...,x(m)x^{(1)}, x^{(2)}, ..., x^{(m)},每组数据表示n个特征,可写为一个n+1维的向量
即:(x(i))T=(x0(i),x1(i),...,xn(i))(x^{(i)})^T = (x^{(i)}_0, x^{(i)}_1, ..., x^{(i)}_n),其中,x0(i)=1x^{(i)}_0=1
且每组数据的真实值y(i)y^{(i)}只能为0或1
现在我们需要构造一个预测值hθ(x)h_\theta(x),同时求解使预测值最准确的θ\theta

2. Sigmoid函数的引入

更加自然的引入请见:机器学习笔记——概率生成模型 | Andrew的个人博客 (andreww1219.github.io)

————————分割线——————————

以下是未了解概率生成模型时的解释

前面说到的线性回归,是对xx的每一个维度xjx_j引入一个权值θj\theta_j,简单来说就是,通过θ\theta作用于xx中每个维度的信息,得到预测值,而我们想要的预测值范围可以是实数域上任意的数,所以就直接用θTx\theta^Tx作为预测值。

而现在,真实值是离散的,只能为0或1,使用hθ(x)=θTxh_\theta(x)=\theta^Tx可能会得到\infty这样的结果。我们需要的是一个关于θTx\theta^Tx的函数,即hθ(x)=g(θTx)h_\theta(x)=g(\theta^Tx),且函数g(z)g(z)是能够表示离散值取值的函数

因此引入sigmoid函数g(z)=11+ezg(z)=\frac{1}{1+e^{-z}},这个函数有很好的性质如0<g(z)=11+ez<10<g(z)=\frac{1}{1+e^{-z}}<1,可以用它来表示某一事件的概率。我们将zz替换为hθ(x)=θTxh_\theta(x)=\theta^Tx,可得hθ(x)=11+eθTxh_\theta(x)=\frac{1}{1+e^{-\theta^Tx}},表示在给定θ\theta的情况下,数据xx使y值得到1的概率。

3. 用概率论引出损失函数

参考文献:伯努利分布的最大似然估计_伯努利分布的似然函数-CSDN博客

上文中我们定义了hθ(x)h_\theta(x)为y值等于1的概率,我们将其记为pp
在伯努利分布中:P(Y=0)=1pP(Y=1)=pP(Y=0) = 1 - p, P(Y=1) = p
由于Y只能取0和1,我们可以将其概率分布用一个式子表示:P(Y=y)=py(1p)(1y)P(Y=y) = p^y(1-p)^{(1-y)}

我们记f(yip)=P(Y=yi)f(y_i |p)=P(Y=y_i)表示给定p下,我们取到真实值的概率,及预测的准确率
我们将取到所有真实值的概率累乘,得到关于p的似然函数L(p)=i=1mf(yip)L(p) = \prod_{i=1}^m{f(y_i|p)}
那么当似然函数L(p)L(p)L(hθ(x)L(h_\theta(x)的取值越大时,我们的预测越准确,
反之,L(p)-L(p)L(hθ(x))-L(h_\theta(x))的取值越大时,我们的预测越不准确,是的你没听错,这个函数反映了我们预测的误差,这正是我们要找的损失函数......的雏形。
先别着急,我们想要的损失函数应该方便求导之后做梯度下降,而似然函数是许多pp的指数形式连乘,不方便求导,于是对两边取对数
则有lnL(p)=i=1myilnp+(1yi)ln(1p)-\ln L(p) = -\sum_{i=1}^m y_i\ln p+(1-y_i)\ln (1-p)
lnL(hθ(x))=i=1myilnhθ(x(i))+(1yi)ln(1hθ(x(i)))-\ln L(h_\theta(x)) = -\sum_{i=1}^m y_i\ln h_\theta(x^{(i)}) + (1-y_i)\ln (1-h_\theta(x^{(i)}))
两边再除以mm取个平均值,得到损失函数得表达式如下:

J(θ)=1mi=1myilnhθ(x(i))+(1yi)ln(1hθ(x(i)))J(\theta) = -\frac{1}{m} \sum_{i=1}^m y_i\ln h_\theta(x^{(i)}) + (1-y_i)\ln (1-h_\theta(x^{(i)}))

之后就是进入梯度下降的步骤了

θj=θjαJ(θ)θ,j=1,2,...,n\theta_j = \theta_j - \alpha\frac{\partial J(\theta)}{\partial\theta}, j = 1, 2, ..., n

为什么我们费了这么大劲就是为了找这个损失函数,用平方误差不好吗?
还记得我们前面说的吗?:
θ\theta会达到全局最优的条件是:我们的损失函数J(θ)J(\theta)是凹函数
之前我们的预测值hθ(x)=θTxh_\theta(x) = \theta^Tx时,平方误差确实是凹函数,而我们现在的预测值改成了Sigmoid函数,即hθ(x)=11+eθTxh_\theta(x) = \frac{1}{1+e^{-\theta^Tx}},平方误差就不再是凹函数了,这点是是很致命的。

那为什么我们现在的损失函数就是凹函数呢
这点可以通过求2J(θ)θ2>0\frac{\partial^2 J(\theta)}{\partial\theta^2}>0去证明
可以参考:为什么不用平方误差(MSE)作为Logistic回归的损失函数?_平方误差成本函数不适用于逻辑回归-CSDN博客

最终得到逻辑回归中梯度下降的表达式: θj=θjαi=1m(hθ(x(i))y)xj(i)\theta_j = \theta_j - \alpha\sum_{i=1}^m (h_\theta(x^{(i)})-y)x_j^{(i)}
我们惊奇地发现!!它长得居然跟原来线性回归的梯度下降一样
不过特别要注意,这里的hθ(x(i))h_\theta(x^{(i)})跟线性回归有本质上的区别