前言
被各种ddl加上期末考试耽搁了一段时间,准备继续肝机器学习了,对前面学的东西做个阶段性总结。
刷的是吴恩达的课:[中英字幕]吴恩达机器学习系列课程
个人博客页(来凑热闹喵):一文讲清楚线性回归(Linear Regression)、逻辑回归(Logistic Regression) | Andrew的个人博客 (andreww1219.github.io)
一、线性回归(Linear Regression)
1. 问题描述
已知m组数据x(1),x(2),...,x(m),每组数据表示n个特征,可写为一个n+1维的向量
即:(x(i))T=(x0(i),x1(i),...,xn(i)),其中,x0(i)=1
每组数据对应一个真实值y(i),所有y值在一块可表示为一个m维向量y
我们需要构造一个预测值:y=θ0+θ1x1+...+θnxn
该函数叫做我们的hypothesis(假设),记为hθ(x),
那么有hθ(x)=θTx,其中θT和x都为n+1维的向量,我们要求解的就是使预测值最准确的θ值
2. 梯度下降(Gradient Descend)
那么要怎么表示我们的预测和真实值的误差呢?我们引入cost function(代价函数 或 损失函数),记为J(θ),在线性回归中,我们通常使用平方误差作为损失函数,即:
J(θ)=2m1∑i=1m(hθ(x(i))−y)2
现在我们要做的,就是找到一个θ值,使得损失函数的值最小,最直接的方法就是求导找极值点,故有:
∂θ∂J(θ)=m1∑i=1m(hθ(x(i))−y)x(i),前面取x0(i)=1是为了使这里的偏导都符合同一形式。
在这里,当∂θ∂J(θ)>0时,我们的损失函数会随着θ的增大而增大,当∂θ∂J(θ)<0时,我们的们的损失函数会随着θ的增大而减小。
故只要将θ减去偏导数的一定倍数(我们称之为学习率α),就可保证我们的θ更优。之后重复这一过程,直到θ收敛到一定区间,说明我们的θ达到局部最优,这就是梯度下降法。
需要注意的是:θ会达到全局最优的条件是:我们的损失函数J(θ)是凹函数,即∂θ2∂2J(θ)>0。在使用平方误差作为我们的预测值时,能保证这一条件,故可使用梯度下降。
梯度下降中θ的迭代公式为: θj=θj−α∂θ∂J(θ),j=1,2,...,n
使用平方误差时: θj=θj−αm1∑i=1m(hθ(x(i))−y)xj(i)
2.1 特征缩放(Feature Scaling)
每组数据x包含m个维度,每个维度的数据范围不尽相同,例如−200<x1<400,而−3<x2<3,对他们的预测值求平方误差后,对θj的影响幅度不同,这导致了θ之间形成的等高线会相当陡峭,拟合的过程相对曲折。
所以,我们最好将每个维度的数据都放缩到接近−1<xj<1的范围,下面有个示例:
已知:−200<x1<400,取x1=600x1−100(100=2−200+400,600=400−(−200)),得到新的−0.5<x1<0.5
2.2 学习率(Learning Rate)
选择学习率是一件需要技巧的事情,过低的学习率会使θ收敛较慢,过高的学习率可能会使θ无法准确收敛,甚至出现发散。
吴恩达的视频里只是讨论了学习率过高和学习率过低的影响,我就在想既然θ是在计算中一步一步迭代的,那有没有方法也能对α进行迭代。网上果然能搜到许多方案,后面再深入了解一下吧。
可能是深度学习中最重要的超参数:学习率 - 知乎 (zhihu.com)
3. 正规方程(Normal Equation)
将m组数据表示为m∗(n+1)维的矩阵,记为X,每组数据对应的真实值表示为一个m维向量y
则我们所需要的最优的θ=(XTX)−1XTy
视频中没有给出证明,根据详解正规方程(Normal Equation) - 知乎 (zhihu.com),先用矩阵形式表示损失函数即Cost(θ)=2m1(Xθ−Y)T(Xθ−Y),对其求偏导,经过很多多多步化简,得到Δ=∂θ∂Cost(θ)=m1(XTXθ−XTY) 令Δ=0,得到正规方程θ=(XTX)−1XTy
4. 梯度下降和正规方程的比较
梯度下降
- 需要选择学习率
- 需要多步迭代,且每一步迭代都需要对每个维度的偏导数进行计算
- 在n较大,即数据维度很大时表现很好
正规方程
- 不需要选择学习率,不需要迭代,一步算出答案
- 矩阵的逆的计算复杂度很高,在n较大,即数据维度很大时表现不好
二、逻辑回归(Logistic Regression)
1. 问题描述
已知m组数据x(1),x(2),...,x(m),每组数据表示n个特征,可写为一个n+1维的向量
即:(x(i))T=(x0(i),x1(i),...,xn(i)),其中,x0(i)=1
且每组数据的真实值y(i)只能为0或1
现在我们需要构造一个预测值hθ(x),同时求解使预测值最准确的θ值
2. Sigmoid函数的引入
更加自然的引入请见:机器学习笔记——概率生成模型 | Andrew的个人博客 (andreww1219.github.io)
————————分割线——————————
以下是未了解概率生成模型时的解释
前面说到的线性回归,是对x的每一个维度xj引入一个权值θj,简单来说就是,通过θ作用于x中每个维度的信息,得到预测值,而我们想要的预测值范围可以是实数域上任意的数,所以就直接用θTx作为预测值。
而现在,真实值是离散的,只能为0或1,使用hθ(x)=θTx可能会得到∞这样的结果。我们需要的是一个关于θTx的函数,即hθ(x)=g(θTx),且函数g(z)是能够表示离散值取值的函数
因此引入sigmoid函数g(z)=1+e−z1,这个函数有很好的性质如0<g(z)=1+e−z1<1,可以用它来表示某一事件的概率。我们将z替换为hθ(x)=θTx,可得hθ(x)=1+e−θTx1,表示在给定θ的情况下,数据x使y值得到1的概率。
3. 用概率论引出损失函数
参考文献:伯努利分布的最大似然估计_伯努利分布的似然函数-CSDN博客
上文中我们定义了hθ(x)为y值等于1的概率,我们将其记为p
在伯努利分布中:P(Y=0)=1−p,P(Y=1)=p
由于Y只能取0和1,我们可以将其概率分布用一个式子表示:P(Y=y)=py(1−p)(1−y)
我们记f(yi∣p)=P(Y=yi)表示给定p下,我们取到真实值的概率,及预测的准确率
我们将取到所有真实值的概率累乘,得到关于p的似然函数L(p)=∏i=1mf(yi∣p)
那么当似然函数L(p)即L(hθ(x)的取值越大时,我们的预测越准确,
反之,−L(p)即−L(hθ(x))的取值越大时,我们的预测越不准确,是的你没听错,这个函数反映了我们预测的误差,这正是我们要找的损失函数......的雏形。
先别着急,我们想要的损失函数应该方便求导之后做梯度下降,而似然函数是许多p的指数形式连乘,不方便求导,于是对两边取对数
则有−lnL(p)=−∑i=1myilnp+(1−yi)ln(1−p)
即−lnL(hθ(x))=−∑i=1myilnhθ(x(i))+(1−yi)ln(1−hθ(x(i)))
两边再除以m取个平均值,得到损失函数得表达式如下:
J(θ)=−m1∑i=1myilnhθ(x(i))+(1−yi)ln(1−hθ(x(i)))
之后就是进入梯度下降的步骤了
θj=θj−α∂θ∂J(θ),j=1,2,...,n
为什么我们费了这么大劲就是为了找这个损失函数,用平方误差不好吗?
还记得我们前面说的吗?:
θ会达到全局最优的条件是:我们的损失函数J(θ)是凹函数
之前我们的预测值hθ(x)=θTx时,平方误差确实是凹函数,而我们现在的预测值改成了Sigmoid函数,即hθ(x)=1+e−θTx1,平方误差就不再是凹函数了,这点是是很致命的。
那为什么我们现在的损失函数就是凹函数呢
这点可以通过求∂θ2∂2J(θ)>0去证明
可以参考:为什么不用平方误差(MSE)作为Logistic回归的损失函数?_平方误差成本函数不适用于逻辑回归-CSDN博客
最终得到逻辑回归中梯度下降的表达式:
θj=θj−α∑i=1m(hθ(x(i))−y)xj(i)
我们惊奇地发现!!它长得居然跟原来线性回归的梯度下降一样
不过特别要注意,这里的hθ(x(i))跟线性回归有本质上的区别