监督学习

机器学习(Machine Learning),简称ML,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

目前常用的机器学习算法有:

  • 监督学习(supervised learning)
    • 回归(regression)
    • 分类(classification)
  • 无监督学习(unsupervised learning)
    • 聚类(clustering)
    • 降维(dimensionality reduction)
    • 异常检测(Anomaly detection)
  • 半监督学习(semi-supervised learning)
  • 强化学习(reinforcement learning)

监督学习主要解决两类问题:回归(regression)和分类(classification)。

两类问题的主要区别在于:
回归问题的预测结果一般是连续的,而且对于无穷多个不同的输入,会对应无穷多个输出。比如最经典的房价预测问题,给定一个房子的参数,对房子的价格进行预测,不同面积的房子对应的价格也不尽相同。

分类问题的预测结果一般离散的,而且对于无穷多个不同的输入,对应的输出是有限个。比如肿瘤良性恶性的预测问题,对于不同的肿瘤大小,得到的结果只有良性或恶性两种结果。

一、线性回归

1.1 单变量线性回归

1.1.1 房价预测问题

我们先看最简单的房价预测问题:
我们已知一些房子的大小与价格,现在我们想找到一个函数f(x)f(x)使得当我们输入房子的大小xx时,能够通过函数f(x)f(x)准确预测出当前房子的价格y^\hat{y}

这里我们使用最简单的一次函数进行模型构建:fw,b(x)=wx+bf_{w,b}(x)=wx+b,其中xx是输入的房子的大小,wwbb是模型中的参数,不同的wwbb对应了不同的直线,我们要做的就是通过调整wwbb来使模型更好的拟合我们已知的数据(训练集)。

1.1.2 代价函数

那么如何评价模型与训练集的拟合程度呢,这里我们引入代价函数(cost function):平方误差成本函数(squared error cost function)进行评价:

J(w,b)=12mi=1m(y^(i)y(i))2J(w,b)={1\over2m}\displaystyle\sum_{i=1}^m({\hat{y}^{(i)}-y^{(i)}})^{2}

其中:mm表示训练集中样本的数量,对于给定的样本输入x(i)x^{(i)}y(i)y^{(i)}表示其实际结果,y^(i)\hat{y}^{(i)}表示其通过模型得到的预测结果,其中

y^(i)=fw,b(x(i))=wx+b\hat{y}^{(i)}=f_{w,b}(x^{(i)})=wx+b

所以最终:

J(w,b)=12mi=1m(fw,b(x(i))y(i))2J(w,b)={1\over2m}\displaystyle\sum_{i=1}^m({f_{w,b}(x^{(i)})-y^{(i)}})^{2}

J(w,b)J(w,b)越小,说明我们的模型越拟合样本数据,所以我们的目标是使J(w,b)J(w,b)尽可能的小。

1.1.3 只考虑一个参数w

为了方便分析,我们先固定bb的值为100,只考虑ww对模型的影响:我们可以看到,当参数bb固定时,J(w,b)J(w,b)就是一个关于ww的开口朝上的二次函数,当J(w,b)J(w,b)最小时ww在其对称轴处:
w=110
w=200
w=280

1.1.4 同时考虑w和b

当我们同时考虑wwbb时,J(w,b)J(w,b)就是关于wwbb的一个二元二次函数了,我们可以得到一个三维图像,将三维图像进行平面化后可以得到类似于等高线的一个图像,在等高线的中心处就对应了J(w,b)J(w,b)的最小值:

1.2 梯度下降

1.2.1 算法思想

在上面我们通过调整wwbb可以得到许多J(w,b)J(w,b)函数,我们想得到的是对于相同的样本输入,所得到的J(w,b)J(w,b)最小,那么如何得到想要的J(w,b)J(w,b)呢,这里我们就需要使用梯度下降算法。
梯度下降算法的思想如下:

  • 设定wwbb的初始值(比如w=0,b=0w=0,b=0
  • 通过不断改变wwbb的值来使J(w,b)J(w,b)减小
  • 最终得到一个最小值或局部最小值时停止
    我们可以在三维图上进行分析,假设我们初始时在山上某处,我们的目标就是要到山脚下,函数中某一点(x, y)的梯度代表函数在该点变化最快的方向。

    不同的路径选择可能会使我们到达不同的局部最小值。

1.2.2 梯度下降公式

wwbb的更新方法如下:

repeat until convergence:  {  w=wαJ(w,b)w  b=bαJ(w,b)b}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline \; w &= w - \alpha \frac{\partial J(w,b)}{\partial w} \; \newline b &= b - \alpha \frac{\partial J(w,b)}{\partial b} \newline \rbrace \end{align*}

其中:
α\alpha表示学习率,相当于下山时迈出步的大小;
J(w,b)w\frac{\partial J(w,b)}{\partial w}表示函数J(w,b)对w的偏导数,相当于下山时迈出步的方向。

J(w,b)w=1mi=1m(fw,b(x(i))y(i))x(i)J(w,b)b=1mi=1m(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(w,b)}{\partial w} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)} \\ \frac{\partial J(w,b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)}) \end{align*}

这里需要注意的是wwbb必须同时更新:

如果按照上图右侧的方式进行更新,那么当更新bb时使用的ww就是更新后的ww而不是原来的ww了。

1.2.3 梯度下降的实现原理


在公式w=wαJ(w,b)ww=w-\alpha\frac{\partial J(w,b)}{\partial w}中,偏导数表示的是斜率,当ww在最低点右侧时,斜率为正数,ww减去一个整数则向左移动;当ww在最低点左侧时,斜率为负数,ww减去一个负数则向右移动。在移动过程中,由于α\alpha不变,斜率逐渐变小,所以每次移动的步幅也会逐渐减小,最终不断收敛达到最低点;当达到最低点时偏导数为0,ww就不再改变了。

1.2.4 学习率α (learning rate)

在实现梯度下降的过程中,α\alpha控制的是每次改变的幅度,α\alpha的选择也会影响梯度下降的过程:

  • 如果α\alpha选择太小,那么会导致梯度下降过慢,需要很长时间才能够收敛
  • 如果α\alpha选择太大,会导致每次移动的步幅过大,可能会越过最小值,无法收敛甚至会发散

    在实现过程中,我们一般选择一个固定的α\alpha,当J(w,b)J(w,b)接近最小值时,偏导数会变小从而使ww每次变化的幅度减小,从而最终达到收敛。

1.2.5 线性回归中的梯度下降

线性回归中的梯度下降与之前的梯度下降类似,具体公式如下:
线性回归模型:

fw,b(x(i))=wx+bf_{w,b}(x^{(i)})=wx+b

代价函数:

J(w,b)=12mi=1m(fw,b(x(i))y(i))2J(w,b)={1\over2m}\displaystyle\sum_{i=1}^m({f_{w,b}(x^{(i)})-y^{(i)}})^{2}

梯度下降算法:

repeat until convergence:  {  w=wαJ(w,b)w  b=bαJ(w,b)b}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline \; w &= w - \alpha \frac{\partial J(w,b)}{\partial w} \; \newline b &= b - \alpha \frac{\partial J(w,b)}{\partial b} \newline \rbrace \end{align*}

对以上公式进行推导可得:

J(w,b)w=1mi=1m(wx+by(i))x(i)=1mi=1m(fw,b(x(i))y(i))x(i)J(w,b)b=1mi=1m(wx+by(i))=1mi=1m(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(w,b)}{\partial w} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (wx+b - y^{(i)})x^{(i)} = \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)} \\ \frac{\partial J(w,b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (wx+b - y^{(i)}) = \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)}) \end{align*}

与之前的梯度下降不同之处在于,一般的代价函数会有不止一个局部最小值,这就使得我们在执行梯度下降算法的过程中可能会最终收敛到不同的最小值处:

而当我们在执行线性回归中的梯度下降时,我们使用的代价函数是平方误差函数,这就使得最小值只有一个,所以无论我们选择的路径如何,最后都能收敛到同一个最小值:

我们也成这种梯度下降叫做批量梯度下降(batch gradient descent)

1.3 多元线性回归

在实际问题中,我们遇到的一般都是多变量问题,所以我们需要研究多元线性回归。

1.3.1 多元房价预测问题

在多元房价预测问题中,房子的价格不再只是受房子大小的影响,而且还受房子内卧室的数量、房子的层数以及房子的时间等因素的影响。

所以,我们的房价预测模型就应该由原先的fw,b(x)=wx+bf_{w,b}(x)=wx+b变为:$$f_{w,b}(x)=w_1x_1+w_2x_2+w_3x_3+w_4x_4+b$$其中xjx_j表示第jj个特征。
为了方便和高效地计算,我们引入向量化,fw,b(x)=w1x1+w2x2+w3x3+w4x4+bf_{w,b}(x)=w_1x_1+w_2x_2+w_3x_3+w_4x_4+b就可以写为:fw,b(x)=wx+bf_{\vec{w},b}(\vec{x})=\vec w \cdot \vec x+b,其中w=[w1,w2,w3,w4]x=[x1,x2,x3,x4]\vec w =[w_1,w_2,w_3,w_4],\vec x =[x_1,x_2,x_3,x_4],这样我们就可以使用Numpy库进行计算,具体代码如下:

1
2
3
4
5
6
import numpy as np 
w = np.array([1.0, 2.5, -3.3, 4.0])
x = np.array([10, 20, 30, 40])
b = 4

f = np.dot(w, x) + b

1.3.2 多元线性回归中的梯度下降

与单元线性回归不同之处是,在多元线性回归中我们需要同时更新多个ww,在引入矢量化后我们的公式就可以表示为:

J(w,b)wj=1mi=1m(fw,b(x(i))y(i))xj(i)J(w,b)b=1mi=1m(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(\vec{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_j^{(i)} \\ \frac{\partial J(\vec{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)}) \end{align*}

梯度下降算法:

repeat until convergence:  {  wj=wjαJ(w,b)wj  b=bαJ(w,b)b}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline \; w_j &= w_j - \alpha \frac{\partial J(\vec{w},b)}{\partial w_j} \; \newline b &= b - \alpha \frac{\partial J(\vec{w},b)}{\partial b} \newline \rbrace \end{align*}

需要注意的是每个参数的更新都需要使用到所有参数的值,所以依然要注意同时更新的问题

repeat until convergence:  {  w1=w1α1mi=1m(fw,b(x(i))y(i))x1(i)  w2=w2α1mi=1m(fw,b(x(i))y(i))x2(i)  w3=w3α1mi=1m(fw,b(x(i))y(i))x3(i)  w4=w4α1mi=1m(fw,b(x(i))y(i))x4(i)  b=bαJ(w,b)b}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline\; w_1 &= w_1 - \alpha\frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_1^{(i)} \; \newline w_2 &= w_2 - \alpha\frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_2^{(i)} \; \newline w_3 &= w_3 - \alpha\frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_3^{(i)} \; \newline w_4 &= w_4 - \alpha\frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_4^{(i)} \; \newline b &= b - \alpha \frac{\partial J(\vec{w},b)}{\partial b} \newline \rbrace \end{align*}

1.3.3 特征缩放

在房价预测问题中,房子的价格与多种因素相关,为了方便分析这里我们只取房子的大小x1x_1和卧室数量x2x_2,那么房屋价格prices=w1x1+w2x2+bprices=w_1x_1+w_2x_2+b,这里我们假设x1x_1的取值范围为300-2000,x2x_2的范围为0-5,假设现在有一个样本数据x1=2000,x2=5,price=$500kx_1=2000,x_2=5,price=\$500k,那w1w2w_1,w_2bb应该如何取值呢?
如果我们假设w1=50,w2=0.1,b=50w_1=50,w_2=0.1,b=50,那么price=502000k+0.15+50=$100050.5kprice=50*2000k+0.1*5+50=\$100050.5k,我们会发现这与房子实际的价格相差甚远,如果我们假设w1=0.1,w2=50,b=50w_1=0.1,w_2=50,b=50,那么price=0.12000k+505+50=$500kprice=0.1*2000k+50*5+50=\$500k,正好与房子实际的价格相等。

在散点图和等高线图中我们可以看出,当特征值的范围差距过大时,散点图会较为密集的分布在下方,等高线图也呈椭圆形,这会使得在梯度下降的过程中w1w_1的一个微小变化会导致J(w,b)J(w,b)改变很多,而w2w_2需要改变很大才会影响到$J(w,b),从而导致在梯度下降的过程中可能会左右来回震荡,影响梯度下降的效率。
解决这种问题的方式就是对特征值进行特征缩放,使得特征值都处于一个合理的范围内,比如0-1,这样就会使得散点图的分布更加均匀,等高线图呈现圆形,从而提高梯度下降的效率。

1.3.4 实现特征缩放

实现特征缩放的方式主要有三种:

  1. 特征缩放
    将特征值都除以该特征值中的最大值,从而实现特征缩放。如300x12000,0x25300 \leq x_1 \leq 2000,0 \leq x_2 \leq 5,我们可以将x1=x12000,x2=x25x_1=\frac{x_1}{2000},x_2=\frac{x_2}{5},最终得到0.15x11,0x210.15 \leq x_1 \leq 1,0 \leq x_2 \leq 1
  2. 均值归一化
    均值归一化是指将该特征值减去该特征值的平均值后在进行缩放。如300x12000,0x25300 \leq x_1 \leq 2000,0 \leq x_2 \leq 5,其中x1x_1的平均值μ1=600\mu_1=600x2x_2的平均值为μ2=2.3\mu_2=2.3,之后进行缩放x1=x1μ12000300x2=x2μ250x_1=\frac{x_1-\mu_1}{2000-300},x_2=\frac{x_2-\mu_2}{5-0},最终得到0.18x10.82,0.46x20.54-0.18 \leq x_1 \leq 0.82,-0.46 \leq x_2 \leq 0.54
  3. Z-score标准化
    Z-score标准化是指将该特征值减去其平均值后除以标准差进行缩放。如300x12000,0x25300 \leq x_1 \leq 2000,0 \leq x_2 \leq 5,其中x1x_1的平均值μ1=600\mu_1=600x2x_2的平均值为μ2=2.3\mu_2=2.3,其中x1x_1的标准差σ1=450\sigma_1=450x2x_2的标准差为σ2=1.4\sigma_2=1.4,最终得到0.67x13.1,1.6x21.9-0.67 \leq x_1 \leq 3.1,-1.6 \leq x_2 \leq 1.9

1.3.5 判断梯度下降是否收敛

判断梯度下降是否收敛有两种方法:

  1. 绘制迭代次数-J(w,b)J(\vec w,b)图像
    在梯度下降正常运行的情况下,随着迭代次数的增加,J(w,b)J(\vec w,b)会越来越小,直到趋于一个比较小的值。如果在过程中出现J(w,b)J(\vec w,b)随着迭代次数的增加而增加的现象,说明梯度下降的过程中出现问题,需要及时调整。
  2. 使用自动收敛测试
    在梯度下降开始之前,设置一个比较小的值ϵ\epsilon,比如等于0.001,当在某次迭代之后J(w,b)J(\vec w,b)的减少量小于ϵ\epsilon时,说明J(w,b)J(\vec w,b)已经收敛。但这种方法存在一种问题,就是无法判断收敛过程中是否一直是正确的,所以不推荐使用。

1.3.6 学习率α的选择

与单元线性回归中类似,多元线性回归中学习率α\alpha的选择也非常重要。

如果α\alpha过大,会导致J(w,b)J(\vec w,b)的值不断在上升与下降之间重复,使得收敛过慢甚至无法收敛;而如果α\alpha过小,则会导致J(w,b)J(\vec w,b)收敛很慢,梯度下降效率很低。
我们一般采取选取合适的α\alpha的措施是从一个比较小的值开始,如0.001,之后以其3倍增长0.001,0.003,0.01,0.03,0.1,0.3,1,…,最终找到一个合适的值,以该最大值或比该最大值略小的值作为α\alpha

1.3.7 特征工程与多项式回归

特征工程与多项式回归都是为了选取更好的函数来拟合样本数据。

1.3.7.1 特征工程

对于房屋预测问题,现在我们假设每个样本有两个参数,一个是房子占地面积的长x1x_1,一个是房子占地面积的宽x2x_2,我们可以得到一个模型:fw,b(x)=w1x1+w2x2+bf_{\vec w,b}(\vec x)=w_1x_1+w_2x_2+b,但是我们可以选择另一种参数,就是利用现有的两个参数来得到房子的占地面积x3=x1x2x_3=x_1*x_2,它作为一个单独的特征能够更好地预测房子的价格,从而得到一个新的模型:fw,b(x)=w1x1+w2x2+w3x3+bf_{\vec w,b}(\vec x)=w_1x_1+w_2x_2+w_3x_3+b
所谓的特征工程,就是通过直觉将现有的特征合并或转化为新的特征,从而创造更好的模型。

1.3.7.2 多项式回归

在之前的问题中,我们通常都使用一次函数进行模型构建,但对于某些问题,一次函数无法满足我们的要求,而使用多项式能够更好地拟合样本数据,从而得到更加有效的预测模型。
比如下图中的房价预测问题:对于曲线数据,我们可能首先会想到使用二次多项式对其进行拟合,但二次多项式在对称轴的右侧会下降,也就是房价随着房子面积的大小而下降,显然这是不合理的,所以我们可以采用三次多项式进行拟合结果就会合理的多。

但是由于三次方的出现,特征放缩就显得十分重要。
还有一种方法就是我们可以用xx的平方根来创造多项式拟合,这样随着房屋面积的增加,房价也会随着增加,同时特征放缩也会更加方便。

所以,选择合适的多项式回归也十分重要。

二、逻辑回归

线性回归可以很好的解决回归问题,但是对于输出变量yy只能取有限的可能值的分类问题,如下图中的判断肿瘤是否为恶性的问题时,线性回归就不能很好的解决了。所以我们引入逻辑回归来解决分类问题。

2.1 sigmoid函数

在肿瘤分类问题中,我们用0表示肿瘤为良性,1表示肿瘤为恶性。我们的目标是要找到一条"S形"曲线来解决分类问题。比如,当我们输出大于0.5时,说明该肿瘤为恶性的可能性大一些,当输出小于0.5时说明该肿瘤为良性的概率大一些。
在构建逻辑回归函数时,我们常用的函数为sigmoid函数:

g(z)=11+ezg(z)=\frac 1 {1+e^{-z}}

其中:

z=wx+bz=\vec w \cdot \vec x+b

也可以写为:

fw,b(x)=g(wx+b)=11+e(wx+b)f_{\vec w,b}(\vec x)=g(\vec w \cdot \vec x+b)=\frac 1 {1+e^{-(\vec w \cdot \vec x+b)}}


其中x是我们输入的肿瘤大小。通过使用sigmoid函数,我们可以将输出结果控制在0~1之间。我们可以将输出结果解释为该肿瘤为恶性的概率,比如当预测结果为0.7时,我们可以预测该患者肿瘤为恶性的概率为0.7。

2.2 决策边界

2.2.1 线性决策边界

决策边界是分类模型中的一个重要概念。它是一个分隔不同类别的边界,将特征空间分成两个或多个区域,每个区域内的数据点被归类为相应的类别。简单来说,决策边界就是不同分类之间的分界线。
比如在之前的肿瘤预测问题中:

当输出结果fw,b(x)f_{\vec w,b}(\vec x)大于0.5时,我们预测结果为1(恶性),当输出结果fw,b(x)f_{\vec w,b}(\vec x)小于0.5时,我们预测结果为0(良性)。所以该问题中的决策边界在fw,b(x)=0.5f_{\vec w,b}(\vec x)=0.5处。我们继续往前计算可以发现,当fw,b(x)=0.5f_{\vec w,b}(\vec x)=0.5时,即g(z)=0.5g(z)=0.5时,z=0z=0,从而得到wx+b=0\vec w \cdot \vec x +b=0。在该问题中,当wx+b0\vec w \cdot \vec x +b \geq 0时,预测结果y^=1\hat y =1;当wx+b<0\vec w \cdot \vec x +b < 0时,预测结果y^=0\hat y =0。所以wx+b=0\vec w \cdot \vec x +b = 0就是该问题的决策边界。
又比如下面这个例子,预测结果受x1x_1x2x_2两个因素影响。其中红色叉号表示y=1y=1,蓝色圆圈表示y=0y=0。当我们使用逻辑回归模型时,fw,b(x)=g(z)=g(w1x1+w2x2+b)f_{\vec w,b}(\vec x)=g(z)=g(w_1x_1+w_2x_2+b)。当我们假设w1=1,w2=1,b=3w_1=1,w_2=1,b=-3时,我们会发现一条特殊的直线:z=wx+b=x1+x23=0z=\vec{w} \cdot \vec{x}+b=x_1+x_2-3=0。当特征xx在这条线左侧时,逻辑回归将预测0,当特征xx在这条线右侧时,逻辑回归预测为1,所以这条线就是该问题的决策边界。

当我们选择不同的参数w1,w2w_1,w_2bb时,决策边界也会相应的发生变化,即不同的算法对于相同的数据集可能产生不同的决策边界,因为它们对数据的理解和处理方式不同。此外,即使是相同的算法,如果使用不同的参数或特征工程进行处理,也可能导致不同的决策边界。

2.2.2 非线性决策边界

我们再看一个非线性的决策边界。下图中预测结果受x1x_1x2x_2两个因素影响。其中红色叉号表示y=1y=1,蓝色圆圈表示y=0y=0。与线性回归中类似,我们在逻辑回归中也可以使用多项式。我们可以令z=w1x12+w2x22+bz=w_1x_1^{2}+w_2x_2^{2}+b,则fw,b(x)=g(z)=g(w1x12+w2x22+b)f_{\vec w,b}(\vec x)=g(z)=g(w_1x_1^{2}+w_2x_2^{2}+b)。我们假设w1=1,w2=1b=1w_1=1,w_2=1,b=-1,则与之前相同,决策边界对应z=0z=0处,即x12+x22=1x_1^{2}+x_2^{2}=1。当x12+x221x_1^{2}+x_2^{2} \geq 1时,即圆外区域,我们预测y^=1\hat y = 1;当x12+x22<1x_1^{2}+x_2^{2} < 1时,即圆内区域,我们预测y^=0\hat y = 0

2.3 逻辑回归中的代价函数

在线性回归中,我们使用平方误差成本函数J(w,b)=12mi=1m(fw,b(x(i))y(i))2J(\vec{w},b)={1\over2m}\displaystyle\sum_{i=1}^m({f_{\vec w,b}(x^{(i)})-y^{(i)}})^{2}作为了代价函数使得曲线w,bJ(w,b)\vec{w},b-J(\vec{w},b)为一个凸函数(convex),从而使用梯度下降算法确定最合适的w\vec wbb的值。但在逻辑回归中我们依然使用该函数作为代价函数,就会出现下图中的问题:

曲线w,bJ(w,b)\vec{w},b-J(\vec{w},b)不再是一个凸函数,而是具有很多局部最小值,这就使得我们在梯度下降的过程中不一定能收敛到最小的J(w,b)J(\vec{w},b)处,所以为了使曲线继续为一个凸函数,我们对原来的代价函数进行修改,从而得到一个新的代价函数:

J(w,b)=1mi=1m12(fw,b(x(i))y(i))2J(\vec{w},b)={1\over m}\displaystyle\sum_{i=1}^m{1 \over 2}({f_{\vec w,b}(x^{(i)})-y^{(i)}})^{2}

我们通常将该函数内部的12(fw,b(x(i))y(i))2{1 \over 2}({f_{\vec w,b}(x^{(i)})-y^{(i)}})^{2}部分称为逻辑损失函数(对数损失函数)L(fw,b(x(i)),y(i))L(f_{\vec w,b}(x^{(i)}),y^{(i)}),它用于表示单个训练示例中的损失。

2.3.1 逻辑损失函数(对数损失函数)

逻辑损失函数具体定义为:

L(fw,b(x(i)),y(i))={ln(fw,b(x(i)))ify(i)=1ln(1fw,b(x(i)))ify(i)=0L(f_{\vec w,b}(x^{(i)}),y^{(i)})=\begin{cases} -ln(f_{\vec w,b}(x^{(i)})) &if&y^{(i)}=1\\ -ln(1-f_{\vec w,b}(x^{(i)})) &if&y^{(i)}=0\end{cases}

y(i)=1y^{(i)}=1时,图像如下:

fw,b(x(i))1f_{\vec w,b}(x^{(i)}) \rightarrow 1时,损失loss0loss \rightarrow 0,表明我们的预测非常接近正确答案;
fw,b(x(i))0f_{\vec w,b}(x^{(i)}) \rightarrow 0时,损失lossloss \rightarrow \infin,说明我们的预测错误可能性很大。
这就表明当真实的结果为1时,损失函数会激励算法使预测结果更接近1,因为此时损失最小。
y(i)=1y^{(i)}=1时,图像如下:

fw,b(x(i))1f_{\vec w,b}(x^{(i)}) \rightarrow 1时,损失lossloss \rightarrow \infin,表明我们的预测非常接近正确答案;
fw,b(x(i))0f_{\vec w,b}(x^{(i)}) \rightarrow 0时,损失loss0loss \rightarrow 0,说明我们的预测错误可能性很大。
也就是说,当真实结果为1时,损失函数会激励算法使预测结果不要太接近0,否则损失会很大。

2.3.2 简化逻辑损失函数

对于上面的逻辑损失函数,我们可以将其简化为:

L(fw,b(x(i)),y(i))=y(i)ln(fw,b(x(i)))(1y(i))ln(1fw,b(x(i)))L(f_{\vec w,b}(x^{(i)}),y^{(i)})=-y^{(i)}ln(f_{\vec w,b}(x^{(i)}))-(1-y^{(i)})ln(1-f_{\vec w,b}(x^{(i)}))

y(i)=1y^{(i)}=1时,$$L(f_{\vec w,b}(x^{(i)}),y^{(i)})=-1ln(f_{\vec w,b}(x^{(i)}))-(1-1)ln(1-f_{\vec w,b}(x^{(i)}))=-ln(f_{\vec w,b}(x^{(i)}))$$
y(i)=0y^{(i)}=0时,$$L(f_{\vec w,b}(x^{(i)}),y^{(i)})=-0ln(f_{\vec w,b}(x^{(i)}))-(1-0)ln(1-f_{\vec w,b}(x^{(i)}))=-ln(1-f_{\vec w,b}(x^{(i)}))$$
最终我们可以得到简化后的逻辑回归中的代价函数:

J(w,b)=1mi=1m[L(fw,b(x(i)),y(i))]=1mi=1m[y(i)ln(fw,b(x(i)))+(1y(i))ln(1fw,b(x(i)))]\begin{align*} J(\vec{w},b) &= {1\over m}\displaystyle\sum_{i=1}^m[L(f_{\vec w,b}(x^{(i)}),y^{(i)})] \\ &= -{1\over m}\displaystyle\sum_{i=1}^m[y^{(i)}ln(f_{\vec w,b}(x^{(i)}))+(1-y^{(i)})ln(1-f_{\vec w,b}(x^{(i)}))] \end{align*}

2.4 实现梯度下降

为了寻找到使代价函数J(w,b)J(\vec{w},b)最小的w\vec{w}bb,我们依然使用梯度下降算法。
逻辑回归中的梯度下降算法与线性回归类似:

repeat until convergence:  {  wj=wjαJ(w,b)wj  b=bαJ(w,b)b}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline \; w_j &= w_j - \alpha \frac{\partial J(\vec{w},b)}{\partial w_j} \; \newline b &= b - \alpha \frac{\partial J(\vec{w},b)}{\partial b} \newline \rbrace \end{align*}

但由于成本函数的变化,所以逻辑回归中的偏导数如下:

J(w,b)wj=1mi=1m(fw,b(x(i))y(i))xj(i)J(w,b)b=1mi=1m(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(\vec{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_j^{(i)} \\ \frac{\partial J(\vec{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)}) \end{align*}

我们会发现这与线性回归中的偏导数表面上一样,但是实际上fw,b(x(i))f_{\vec{w},b}(\vec{x}^{(i)})已经发生了变化:
在线性回归中:fw,b(x(i))=wx+bf_{\vec{w},b}(\vec{x}^{(i)})=\vec{w} \cdot \vec{x}+b
而在逻辑回归中:fw,b(x(i))=11+e(wx+b)f_{\vec{w},b}(\vec{x}^{(i)})=\frac 1 {1+e^{-(\vec w \cdot \vec x+b)}}
偏导数的具体推导过程如下:

三、过拟合

3.1 过拟合问题

过拟合问题是指机器学习模型在训练数据上表现良好,但是在未见过的数据上表现不佳的现象。

3.1.1 回归问题中的过拟合

如下图所示:

当我们使用的多项式非常简单时,它可能不能很好地拟合所有训练集,我们一般称其为欠拟合(underfit);
而当我们使用的多项式过于复杂时,虽然模型完美地拟合了所有的训练集,但是它在很多地方会上下波动,从而影响实际的预测结果。

3.1.2 分类问题中的过拟合

如下图所示

当我们使用的多项式非常简单时,它可能不能正确地划出决策边界,从而出现欠拟合问题;
而当我们使用的多项式过于复杂时,虽然模型完美地分类了所有的训练集,但是它并不能很好地泛化到新的例子。

3.2 解决过拟合问题

过拟合问题一般有三种解决方法:

3.2.1 使用更多的训练示例

当发生过拟合现象时,我们可以使用更多的训练示例,让算法自动调整到一个波动更小的函数

3.2.2 检查是否可以使用更少的特征

减少过拟合的另一种方法就是看是否可以使用更少的特征。
比如我们在预测房价时可以使用很多特征,比如房子的大小、卧室的数量、房子的层数等等,但是如果我们有很多特征可用但是没有足够的训练集时,就会出现过拟合现象。所以我们可以选择性的使用部分与房价最相关的特征而不是使用所有特征,但是该方法也有一定的缺点,那就是我们抛弃了一些可用的信息,也许这些特征全部可以用来预测房价。

3.2.3 正则化

正则化与第二种方法有些类似,在第二种方法中,我们消去了一些特征,也就是将模型中该特征对应的参数wjw_j置为了0;而在正则化中,我们不必将其完全消除,而是可以将该参数变得很小,从而创造一个可以使用所有已知特征值的模型。

3.3 正则化

3.3.1 正则化成本函数

正则化的原理是通过在损失函数中添加一个额外的惩罚项,来限制模型的复杂度,从而防止过拟合。
以线性回归为例,在下图的例子中,我们知道二次函数可以很好的拟合数据集,但高阶多项式会产生过拟合现象。那么我们有没有办法使高阶项的参数变得很小从而减小他们对于模型的影响呢?

假设我们在原来的线性回归成本函数后面添加两项:

J(w,b)=12mi=1m(fw,b(x(i))y(i))2+1000w32+1000w42J(\vec{w},b)={1\over 2m}\displaystyle\sum_{i=1}^m({f_{\vec w,b}(x^{(i)})-y^{(i)}})^{2}+1000w_3^2+1000w_4^2

那么由于w3w_3w4w_4对成本函数JJ的值影响很大,所以当我们使成本函数最小时,就可以同时使w3w_3w4w_4变得很小。
所以我们正则化后的代价函数一般形式为:

J(w,b)=12mi=1m(fw,b(x(i))y(i))2+λ2mj=1nwj2J(\vec{w},b)={1\over 2m}\displaystyle\sum_{i=1}^m({f_{\vec w,b}(x^{(i)})-y^{(i)}})^{2}+{\lambda \over 2m}\displaystyle\sum_{j=1}^nw_j^{2}

其中:λ\lambda是正则化参数,它控制了正则化项在代价函数中的权重,从而影响了模型在拟合训练数据和保持简单性之间的平衡。较大的λ\lambda值会导致更强的正则化,从而使模型更加趋于简单的解,有助于防止过拟合,而较小的λ\lambda会减弱正则化的影响,允许模型更灵活地拟合训练数据。

3.3.2 线性回归中的正则化

当我们使用正则化后的代价函数后,梯度下降算法依然为:

repeat until convergence:  {  wj=wjαJ(w,b)wj  b=bαJ(w,b)b}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline \; w_j &= w_j - \alpha \frac{\partial J(\vec{w},b)}{\partial w_j} \; \newline b &= b - \alpha \frac{\partial J(\vec{w},b)}{\partial b} \newline \rbrace \end{align*}

但由于代价函数的改变,所以偏导数发生了变化:

J(w,b)w=1mi=1m(fw,b(x(i))y(i))x(i)+λmwjJ(w,b)b=1mi=1m(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(w,b)}{\partial w} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}+{\lambda \over m}w_j \\ \frac{\partial J(w,b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)}) \end{align*}

因为我们没有正则化bb,所以对bb的梯度下降没有变化。

所以最终正则化线性回归的梯度下降算法为:

repeat until convergence:  {  wj=wjα[1mi=1m(fw,b(x(i))y(i))x(i)+λmwj];b=bα1mi=1m(fw,b(x(i))y(i))}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline \; w_j &= w_j - \alpha [\frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}+{\lambda \over m}w_j]; \newline b &= b - \alpha \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)}) \newline \rbrace \end{align*}

在对第一个式子进行简单化简后我们可以得到:

wj=wj(1αλm)α1mi=1m(fw,b(x(i))y(i))x(i)w_j = w_j(1-\alpha \frac{\lambda}{m}) - \alpha \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}

与正则化之前的式子相比我们会发现其实改变的只有等号右侧wjw_j乘上的参数,通常来说α,λ\alpha,\lambda都是一个比较小的值,如α=0.01,λ=1\alpha=0.01,\lambda=1,样本数量m=50m=50,那么1αλm1-\alpha \frac{\lambda}{m}就等于0.9998,所以在每次梯度下降的迭代中,wjw_j都会首先乘以一个比1小一点的数字,这就可以实现不断缩小wjw_j的值,从而实现对参数的正则化。

3.3.3 逻辑回归中的正则化

与线性回归类似,正则化逻辑回归的代价函数为:

J(w,b)=1mi=1m[y(i)ln(fw,b(x(i)))+(1y(i))ln(1fw,b(x(i)))]+λ2mj=1nwj2J(\vec{w},b) = -{1\over m}\displaystyle\sum_{i=1}^m[y^{(i)}ln(f_{\vec w,b}(x^{(i)}))+(1-y^{(i)})ln(1-f_{\vec w,b}(x^{(i)}))]+{\lambda \over 2m}\displaystyle\sum_{j=1}^nw_j^{2}

正则化逻辑回归后的梯度下降算法为:

repeat until convergence:  {  wj=wjα[1mi=1m(fw,b(x(i))y(i))x(i)+λmwj];b=bα1mi=1m(fw,b(x(i))y(i))}\begin{align*} \text{repeat}&\text{ until convergence:} \; \lbrace \newline \; w_j &= w_j - \alpha [\frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}+{\lambda \over m}w_j]; \newline b &= b - \alpha \frac{1}{m} \sum\limits_{i = 1}^{m} (f_{w,b}(x^{(i)}) - y^{(i)}) \newline \rbrace \end{align*}

3.3.4 正则化的优点

正则化参数与直接消除某些参数相比具有以下优点:

  1. 保留信息: 正则化参数可以在一定程度上保留所有特征的信息,而不是丢弃某些特征。这样做有助于避免信息的丢失,并确保模型利用了所有可用的信息。

  2. 灵活性: 正则化参数可以控制模型的复杂度,使得模型可以在简单性和拟合能力之间取得平衡。通过调整正则化参数的大小,可以在不同的情况下调整模型的复杂度,以满足特定的需求。

  3. 泛化能力: 正则化参数可以帮助防止过拟合,从而提高模型在新数据上的泛化能力。通过控制模型的复杂度,可以使模型更好地适应未见过的数据,并减少模型在训练数据上的过度拟合。

  4. 解释性: 正则化参数的值可以提供有关模型复杂度的重要信息。例如,在调整正则化参数时,观察模型参数的变化可以帮助理解模型的复杂度以及特征对模型的影响程度。

综上所述,正则化参数提供了一种灵活且可解释的方法来控制模型的复杂度,并帮助提高模型的泛化能力,这对于处理各种机器学习问题都是非常有价值的。