前言

被各种ddl加上期末考试耽搁了一段时间,准备继续肝机器学习了,对前面学的东西做个阶段性总结。
刷的是吴恩达的课:[中英字幕]吴恩达机器学习系列课程

一、线性回归(Linear Regression)

1. 问题描述

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

2. 梯度下降(Gradient Descend)

那么要怎么表示我们的预测和真实值的误差呢?我们引入cost function(代价函数 或 损失函数),记为$J(\theta)$,在线性回归中,我们通常使用平方误差作为损失函数,即:

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

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

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

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

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

2.1 特征缩放(Feature Scaling)

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

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

2.2 学习率(Learning Rate)

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

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

3. 正规方程(Normal Equation)

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

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

梯度下降

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

正规方程

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

二、逻辑回归(Logistic Regression)

1. 问题描述

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

2. Sigmoid函数的引入

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

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

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

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

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

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

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

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

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

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

$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)}))$

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

$\theta_j = \theta_j - \alpha\frac{\partial J(\theta)}{\partial\theta}, j = 1, 2, …, n$

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

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

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