From ccf2c0a3e4446c2bbc4e7175041d5ee47a9b4d46 Mon Sep 17 00:00:00 2001 From: scruel Date: Sun, 14 Jan 2018 10:06:14 +0800 Subject: [PATCH] =?UTF-8?q?finish=20"7=20=E6=AD=A3=E5=88=99=E5=8C=96(Regul?= =?UTF-8?q?arization)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- image/20180114_090054.png | Bin 0 -> 27809 bytes week3.html | 11 +++-- week3.md | 99 ++++++++++++++++++++++++++++++-------- 3 files changed, 85 insertions(+), 25 deletions(-) create mode 100644 image/20180114_090054.png diff --git a/image/20180114_090054.png b/image/20180114_090054.png new file mode 100644 index 0000000000000000000000000000000000000000..53b419d50c52ecaf3c0ed9dfd5566968c716e74e GIT binary patch literal 27809 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 -

6 逻辑回归(Logistic Regression)

6.1 分类(Classification)

在分类问题中,预测的结果是离散值(结果是否属于某一类),逻辑回归算法(Logistic Regression)被用于解决这类分类问题。

  • 垃圾邮件判断
  • 金融欺诈判断
  • 肿瘤诊断

讨论肿瘤诊断问题:

肿瘤诊断问题的目的是告诉病人是否为恶性肿瘤,是一个二元分类问题(binary class problems),则定义 ,其中 0 表示负向类(negative class),代表恶性肿瘤("-"),1 为正向类(positive class),代表良性肿瘤("+")。如图,定义最右边的样本为偏差项

在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定

,预测为 ,即正向类;

,预测为 ,即负向类。

即以 0.5 为阈值(threshold),则我们就可以根据线性回归结果,得到相对正确的分类结果

 

接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。

不仅如此,线性回归算法的值域为 ,则当线性回归函数给出诸如 等很大/很小(负数)的数值时,结果 ,这显得非常怪异。

 

区别于线性回归算法,逻辑回归算法是一个分类算法,其输出值永远在 0 到 1 之间,即

6.2 假设函数表示(Hypothesis Representation)

为了使 ,引入逻辑回归模型,定义假设函数

对比线性回归函数 表示逻辑函数(logistic function),复合起来,则称为逻辑回归函数。

逻辑函数是 S 形函数,会将所有实数映射到 范围。

sigmoid 函数(如下图)是逻辑函数的特殊情况,其公式为

sigmoid function

应用 sigmoid 函数,则逻辑回归模型:

逻辑回归模型中, 的作用是,根据输入 以及参数 ,计算得出”输出 “的可能性(estimated probability),概率学中表示为:

 

以肿瘤诊断为例, 表示病人有 的概率得了恶性肿瘤。

6.3 决策边界(Decision Boundary)

决策边界的概念,可帮助我们更好地理解逻辑回归模型的拟合原理。

在逻辑回归中,有假设函数

为了得出分类的结果,这里和前面一样,规定以 为阈值:

回忆一下逻辑函数的图像:

sigmoid function

观察可得当 时,有 ,即

同线性回归模型的不同点在于:

直观一点来个例子, 是下图模型的假设函数:

根据上面的讨论,要进行分类,那么只要 时,就预测 ,即预测为正向类。

如果取 ,则有 ,当 时,易绘制图中的品红色直线即决策边界,为正向类(以红叉标注的数据)给出 的分类预测结果。

 

上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中的情况也是类似的。

为了拟合下图数据,建模多项式假设函数:

这里取 ,决策边界对应了一个在原点处的单位圆(),如此便可给出分类结果,如图中品红色曲线:

 

当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界形似碗状、爱心状等等。

 

简单来说,决策边界就是分类的分界线,分类现在实际就由 (中的 )决定啦。

6.4 损失函数(Cost Function)

上节又留下了个问题,我们怎么知道决策边界是啥样? 多少时能很好的拟合数据?当然,见招拆招,总要来个

如果直接套用线性回归的损失函数:

其中 ,可绘制关于 的图像,如下图

回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样梯度下降算法将无法确定收敛点是全局最优。

如果是一个凸函数,可以对其进行最优化分析,这类最优化问题,称为凸优化问题。还好,损失函数不止平方损失函数一种。

对于逻辑回归,更换平方损失函数为对数损失函数,可由统计学中的最大似然估计方法推出损失函数 :

则可绘制关于 的图像如下:

如左图,当训练集的结果为 (正样本)时,随着假设函数趋向于 ,损失函数的值会趋于 ,即意味着拟合程度很好。如果假设函数此时趋于 ,则会给出一个很高的损失,拟合程度,算法会根据其迅速纠正 值,右图 同理。

区别于平方损失函数,对数损失函数也是一个凸函数,但没有局部最优值。

6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent)

由于懒得分类讨论,对于二元分类问题,我们把损失函数简化为一个函数: -

,左边式子整体为 ,当 ,则 ,右边式子整体为0,也就和上面的分段函数一样了,而一个式子计算起来更方便。

向量化实现:

 

为了最优化 ,仍使用梯度下降法,算法同线性回归中一致:

解出偏导得:

注意,虽然形式上梯度下降算法同线性回归一样,但其中的假设函不同,即,不过求导后的结果也相同。

向量化实现:

 

对数损失函数求导的推导过程:

带入得

+

6 逻辑回归(Logistic Regression)

6.1 分类(Classification)

在分类问题中,预测的结果是离散值(结果是否属于某一类),逻辑回归算法(Logistic Regression)被用于解决这类分类问题。

  • 垃圾邮件判断
  • 金融欺诈判断
  • 肿瘤诊断

讨论肿瘤诊断问题:

肿瘤诊断问题的目的是告诉病人是否为恶性肿瘤,是一个二元分类问题(binary class problems),则定义 ,其中 0 表示负向类(negative class),代表恶性肿瘤("-"),1 为正向类(positive class),代表良性肿瘤("+")。如图,定义最右边的样本为偏差项

在未加入偏差项时,线性回归算法给出了品红色的拟合直线,若规定

,预测为 ,即正向类;

,预测为 ,即负向类。

即以 0.5 为阈值(threshold),则我们就可以根据线性回归结果,得到相对正确的分类结果

 

接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。

不仅如此,线性回归算法的值域为全体实数集(),则当线性回归函数给出诸如 等很大/很小(负数)的数值时,结果 ,这显得非常怪异。

 

区别于线性回归算法,逻辑回归算法是一个分类算法,其输出值永远在 0 到 1 之间,即

6.2 假设函数表示(Hypothesis Representation)

为了使 ,引入逻辑回归模型,定义假设函数

对比线性回归函数 表示逻辑函数(logistic function),复合起来,则称为逻辑回归函数。

逻辑函数是 S 形函数,会将所有实数映射到 范围。

sigmoid 函数(如下图)是逻辑函数的特殊情况,其公式为

sigmoid function

应用 sigmoid 函数,则逻辑回归模型:

逻辑回归模型中, 的作用是,根据输入 以及参数 ,计算得出”输出 “的可能性(estimated probability),概率学中表示为:

 

以肿瘤诊断为例, 表示病人有 的概率得了恶性肿瘤。

6.3 决策边界(Decision Boundary)

决策边界的概念,可帮助我们更好地理解逻辑回归模型的拟合原理。

在逻辑回归中,有假设函数

为了得出分类的结果,这里和前面一样,规定以 为阈值:

回忆一下逻辑函数的图像:

sigmoid function

观察可得当 时,有 ,即

同线性回归模型的不同点在于:

直观一点来个例子, 是下图模型的假设函数:

根据上面的讨论,要进行分类,那么只要 时,就预测 ,即预测为正向类。

如果取 ,则有 ,当 时,易绘制图中的品红色直线即决策边界,为正向类(以红叉标注的数据)给出 的分类预测结果。

 

上面讨论了逻辑回归模型中线性拟合的例子,下面则是一个多项式拟合的例子,和线性回归中的情况也是类似的。

为了拟合下图数据,建模多项式假设函数:

这里取 ,决策边界对应了一个在原点处的单位圆(),如此便可给出分类结果,如图中品红色曲线:

 

当然,通过一些更为复杂的多项式,还能拟合那些图像显得非常怪异的数据,使得决策边界形似碗状、爱心状等等。

 

简单来说,决策边界就是分类的分界线,分类现在实际就由 (中的 )决定啦。

6.4 损失函数(Cost Function)

那我们怎么知道决策边界是啥样? 多少时能很好的拟合数据?当然,见招拆招,总要来个

如果直接套用线性回归的损失函数:

其中 ,可绘制关于 的图像,如下图

回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样将使得梯度下降算法无法确定收敛点是全局最优。

如果损失函数也是一个凸函数,是否也有同样的性质,从而最优化?这类讨论凸函数最优值的问题,被称为凸优化问题(Convex optimization)

当然,损失函数不止平方损失函数一种。

对于逻辑回归,更换平方损失函数为对数损失函数,可由统计学中的最大似然估计方法可推出损失函数

则有关于 的图像如下:

如左图,当训练集的结果为 (正样本)时,随着假设函数趋向于 ,损失函数的值会趋于 ,即意味着拟合程度很好。如果假设函数此时趋于 ,则会给出一个很高的损失,拟合程度,算法会根据其迅速纠正 值,右图 同理。

区别于平方损失函数,对数损失函数也是一个凸函数,但没有局部最优值。

6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent)

由于懒得分类讨论,对于二元分类问题,我们可把损失函数简化为一个函数: +

,左边式子整体为 ,当 ,则 ,右边式子整体为0,也就和上面的分段函数一样了,而一个式子计算起来更方便。

向量化实现:

 

为了最优化 ,仍使用梯度下降法,算法同线性回归中一致:

解出偏导得:

注意,虽然形式上梯度下降算法同线性回归一样,但其中的假设函不同,即,不过求导后的结果也相同。

向量化实现:

 

对数损失函数求导的推导过程:

带入得

根据求偏导的性质,没有 的项都消去,则得:

所以有:

@@ -341,10 +341,11 @@ header, .context-menu, .megamenu-content, footer { font-family: "Segoe UI", Aria -

则可得对数损失函数的导数:

6.6 进阶优化(Advanced Optimization)

运行梯度下降算法,其能最小化损失函数 并得出 的最优值,在使用梯度下降算法时,如果不需要观察损失函数的收敛情况,则直接计算 的导数项即可,而不需要计算 值。

我们编写代码给出损失函数及其偏导数然后传入梯度下降算法中,接下来算法则会为我们最小化损失函数给出参数的最优解。这类算法被称为最优化算法(Optimization Algorithms),梯度下降算法不是唯一的最小化算法1

一些最优化算法:

  • 梯度下降法(Gradient Descent)

  • 共轭梯度算法(Conjugate gradient)

  • 牛顿法和拟牛顿法(Newton's method & Quasi-Newton Methods)

    • DFP算法
    • 局部优化法(BFGS)
    • 有限内存局部优化法(L-BFGS)
  • 拉格朗日乘数法(Lagrange multiplier)

比较梯度下降算法:一些最优化算法虽然会更为复杂,难以调试,自行实现又困难重重,开源库又效率也不一,哎,做个调包侠还得碰运气。不过这些算法通常效率更高,并无需选择学习速率 (少一个参数少一份痛苦啊!)。

Octave/Matlab 中对这类高级算法做了封装,易于调用。

 

假设有 ,要求参数 的最优值。

下面为 Octave/Matlab 求解最优化问题的代码实例:

  1. 创建一个函数以返回损失函数及其偏导数:
 
  1. costFunction 函数及所需参数传入最优化函数 fminunc,以求解最优化问题:
 

'GradObj', 'on': 启用梯度目标参数(则需要将梯度传入算法)

'MaxIter', 100: 最大迭代次数为 100 次

@xxx: Octave/Matlab 中的函数指针

optTheta: 最优化得到的参数向量

functionVal: 引用函数最后一次的返回值

exitFlag: 标记损失函数是否收敛

注:Octave/Matlab 中可以使用 help fminunc 命令随时查看函数的帮助文档。

  1. 返回结果
 

6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all)

一直在讨论二元分类问题,这里谈谈多类别分类问题(比如天气预报)。

原理是,转化多类别分类问题为多个二元分类问题,这种方法被称为 One-vs-all。

正式定义:

: 输出 (属于第 个分类)的可能性

: 类别总数,如上图

注意多类别分类问题中 的结果不再只是一个实数而是一个向量,如果类别总数为 ,现在 就是一个 维向量。

对于某个样本实例,需计算所有的 种分类情况得到 ,然后看分为哪个类别时预测输出的值最大,就说它输出属于哪个类别,即

7 正则化(Regularization)

7.1 过拟合问题(The Problem of Overfitting)

对于拟合的表现,可以分为三类情况:

  • 欠拟合(Underfitting)

    无法很好的拟合训练集中的数据,预测值和实际值的误差很大,这类情况被称为欠拟合。拟合模型比较简单(特征选少了)时易出现这类情况。类似于,你上课不好好听,啥都不会,下课也差不多啥都不会。

  • 优良的拟合(Just right)

    不论是训练集数据还是不在训练集中的预测数据,都能给出较为正确的结果。类似于,学霸学神!

  • 过拟合(Overfitting)

    能很好甚至完美拟合训练集中的数据,即 ,但是对于不在训练集中的新数据,预测值和实际值的误差会很大,泛化能力弱,这类情况被称为过拟合。拟合模型过于复杂(特征选多了)时易出现这类情况。类似于,你上课跟着老师做题都会都听懂了,下课遇到新题就懵了不会拓展。

线性模型中的拟合情况(左图欠拟合,右图过拟合): +

则可得对数损失函数的导数:

6.6 进阶优化(Advanced Optimization)

运行梯度下降算法,其能最小化损失函数 并得出 的最优值,在使用梯度下降算法时,如果不需要观察损失函数的收敛情况,则直接计算 的导数项即可,而不需要计算 值。

我们编写代码给出损失函数及其偏导数然后传入梯度下降算法中,接下来算法则会为我们最小化损失函数给出参数的最优解。这类算法被称为最优化算法(Optimization Algorithms),梯度下降算法不是唯一的最小化算法1

一些最优化算法:

  • 梯度下降法(Gradient Descent)

  • 共轭梯度算法(Conjugate gradient)

  • 牛顿法和拟牛顿法(Newton's method & Quasi-Newton Methods)

    • DFP算法
    • 局部优化法(BFGS)
    • 有限内存局部优化法(L-BFGS)
  • 拉格朗日乘数法(Lagrange multiplier)

比较梯度下降算法:一些最优化算法虽然会更为复杂,难以调试,自行实现又困难重重,开源库又效率也不一,哎,做个调包侠还得碰运气。不过这些算法通常效率更高,并无需选择学习速率 (少一个参数少一份痛苦啊!)。

Octave/Matlab 中对这类高级算法做了封装,易于调用。

 

假设有 ,要求参数 的最优值。

下面为 Octave/Matlab 求解最优化问题的代码实例:

  1. 创建一个函数以返回损失函数及其偏导数:
 
  1. costFunction 函数及所需参数传入最优化函数 fminunc,以求解最优化问题:
 

'GradObj', 'on': 启用梯度目标参数(则需要将梯度传入算法)

'MaxIter', 100: 最大迭代次数为 100 次

@xxx: Octave/Matlab 中的函数指针

optTheta: 最优化得到的参数向量

functionVal: 引用函数最后一次的返回值

exitFlag: 标记损失函数是否收敛

注:Octave/Matlab 中可以使用 help fminunc 命令随时查看函数的帮助文档。

  1. 返回结果
 

6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all)

一直在讨论二元分类问题,这里谈谈多类别分类问题(比如天气预报)。

原理是,转化多类别分类问题为多个二元分类问题,这种方法被称为 One-vs-all。

正式定义:

: 输出 (属于第 个分类)的可能性

: 类别总数,如上图

注意多类别分类问题中 的结果不再只是一个实数而是一个向量,如果类别总数为 ,现在 就是一个 维向量。

对于某个样本实例,需计算所有的 种分类情况得到 ,然后看分为哪个类别时预测输出的值最大,就说它输出属于哪个类别,即

7 正则化(Regularization)

7.1 过拟合问题(The Problem of Overfitting)

对于拟合的表现,可以分为三类情况:

  • 欠拟合(Underfitting)

    无法很好的拟合训练集中的数据,预测值和实际值的误差很大,这类情况被称为欠拟合。拟合模型比较简单(特征选少了)时易出现这类情况。类似于,你上课不好好听,啥都不会,下课也差不多啥都不会。

  • 优良的拟合(Just right)

    不论是训练集数据还是不在训练集中的预测数据,都能给出较为正确的结果。类似于,学霸学神!

  • 过拟合(Overfitting)

    能很好甚至完美拟合训练集中的数据,即 ,但是对于不在训练集中的新数据,预测值和实际值的误差会很大,泛化能力弱,这类情况被称为过拟合。拟合模型过于复杂(特征选多了)时易出现这类情况。类似于,你上课跟着老师做题都会都听懂了,下课遇到新题就懵了不会拓展。

线性模型中的拟合情况(左图欠拟合,右图过拟合):

逻辑分类模型中的拟合情况:

 

为了度量拟合表现,引入:

  • 偏差(bias)

    指模型的预测值与真实值的偏离程度。偏差越大,预测值偏离真实值越厉害。偏差低意味着能较好地反应训练集中的数据情况。

  • 方差(Variance)

    指模型预测值的离散程度或者变化范围。方差越大,数据的分布越分散,函数波动越大,泛化能力越差。方差低意味着拟合曲线的稳定性高,波动小。

据此,我们有对同一数据的各类拟合情况如下图: -

据上图,高偏差意味着欠拟合,高方差意味着过拟合。

我们应尽量使得拟合模型处于低方差(较好地拟合数据)状态且同时处于低偏差(较好地预测新值)的状态。

避免过拟合的方法有:

  • 减少特征的数量

    • 手动选取需保留的特征
    • 使用模型选择算法来选取合适的特征(如 PCA 算法)
    • 减少特征的方式易丢失有用的特征信息
  • 正则化(Regularization)

    • 可保留所有参数(许多有用的特征都能轻微影响结果)
    • 减少/惩罚各参数大小(magnitude),以减轻各参数对模型的影响程度
    • 当有很多参数对于模型只有轻微影响时,正则化方法的表现很好

7.2 代价函数(Cost Function)

很多时候由于特征数量过多,过拟合时我们很难选出要保留的特征,这时候正则化则能解决过拟合的问题。

上文中, 这样一个复杂的多项式较易过拟合,在不减少特征的情况下,如果能消除类似于 等复杂部分,那复杂函数就变得简单了

为了保留各个参数的信息,不修改假设函数,改而修改代价函数:

上式中,我们在代价函数中增加了 的惩罚项 ,如果要最小化代价函数,那么势必需要极大地减小 ,从而使得假设函数中的 这两项的参数非常小,就相当于没有了,假设函数也就“变得”简单了,从而在保留各参数的情况下避免了过拟合问题。

 

根据上面的讨论,有时也无法决定要减少哪个参数,故统一进行参数惩罚。

代价函数:

: 正则化参数(Regularization Parameter)

: 不惩罚基础参数

: 正则化项

正则化参数类似于学习速率,也需要我们自行对其选择一个合适的值,虽然看似更为麻烦了一些,不过通常都会使用正则化方法来避免过拟合。

  • 过大

    • 导致模型欠拟合
    • 无法正常去过拟问题
    • 梯度下降可能无法收敛
  • 过小

    • 无法避免过拟合(等于没有)

7.3 线性回归正则化(Regularized Linear Regression)

7.4 逻辑回归正则化(Regularized Logistic Regression)

+

据上图,高偏差意味着欠拟合,高方差意味着过拟合。

我们应尽量使得拟合模型处于低方差(较好地拟合数据)状态且同时处于低偏差(较好地预测新值)的状态。

避免过拟合的方法有:

  • 减少特征的数量

    • 手动选取需保留的特征
    • 使用模型选择算法来选取合适的特征(如 PCA 算法)
    • 减少特征的方式易丢失有用的特征信息
  • 正则化(Regularization)

    • 可保留所有参数(许多有用的特征都能轻微影响结果)
    • 减少/惩罚各参数大小(magnitude),以减轻各参数对模型的影响程度
    • 当有很多参数对于模型只有轻微影响时,正则化方法的表现很好

7.2 损失函数(Cost Function)

很多时候由于特征数量过多,过拟合时我们很难选出要保留的特征,这时候应用正则化方法则是很好的选择。

上文中, 这样一个复杂的多项式较易过拟合,在不减少特征的情况下,如果能消除类似于 等复杂部分,那复杂函数就变得简单了

为了保留各个参数的信息,不修改假设函数,改而修改损失函数:

上式中,我们在损失函数中增加了 的惩罚项(penalty term) ,如果要最小化损失函数,那么势必需要极大地减小 ,从而使得假设函数中的 这两项的参数非常小,就相当于没有了,假设函数也就“变得”简单了,从而在保留各参数的情况下避免了过拟合问题。

 

根据上面的讨论,有时也无法决定要减少哪个参数,故统一惩罚除了 外的所有参数。

损失函数:

: 正则化参数(Regularization Parameter),

: 不惩罚基础参数

: 正则化项

正则化参数类似于学习速率,也需要我们自行对其选择一个合适的值。

  • 过大

    • 导致模型欠拟合(假设可能会变成近乎 的直线 )
    • 无法正常去过拟问题
    • 梯度下降可能无法收敛
  • 过小

    • 无法避免过拟合(等于没有)

正则化符合奥卡姆剃刀(Occam's razor)原理。在所有可能选择的模型中,能够很好地解释已知数据并且十分简单才是最好的模型,也就是应该选择的模型。从贝叶斯估计的角度来看,正则化项对应于模型的先验概率。可以假设复杂的模型有较大的先验概率,简单的模型有较小的先验概率。

正则化是结构风险最小化策略的实现,是去过拟合问题的典型方法,虽然看起来多了个一参数多了一重麻烦,后文会介绍自动选取正则化参数的方法。模型越复杂,正则化参数值就越大。比如,正则化项可以是模型参数向量的范数。

7.3 线性回归正则化(Regularized Linear Regression)

应用正则化的线性回归梯度下降算法:

也可以移项得到更新表达式的另一种表示形式

: 正则化项

 

应用正则化的正规方程法2

: 正则化项

: 第一行第一列为 维单位矩阵

Matlab/Octave 代码:

 

 

前文提到正则化可以解决正规方程法中不可逆的问题,即增加了 正则化项后,可以保证 可逆(invertible),即便 不可逆(non-invertible)。

7.4 逻辑回归正则化(Regularized Logistic Regression)

为逻辑回归的损失函数添加正则化项:

前文已经证明过逻辑回归和线性回归的损失函数的求导结果是一样的,此处通过给正则化项添加常数 ,则其求导结果也就一样了。

从而有应用正则化的逻辑回归梯度下降算法:

 

\ No newline at end of file diff --git a/week3.md b/week3.md index fbfdb80..08295a8 100644 --- a/week3.md +++ b/week3.md @@ -28,7 +28,7 @@ $h_\theta(x) \lt 0.5$ ,预测为 $y = 0$,即负向类。 接下来加入偏差项,线性回归算法给出了靛青色的拟合直线,如果阈值仍然为 0.5,可以看到算法在某些情况下会给出完全错误的结果,对于癌症、肿瘤诊断这类要求预测极其精确的问题,这种情况是无法容忍的。 -不仅如此,线性回归算法的值域为 $R$,则当线性回归函数给出诸如 $h_\theta(x) = 10000, h_\theta(x) = -10000$ 等很大/很小(负数)的数值时,结果 $y \in \lbrace 0, 1\rbrace$,这显得非常怪异。 +不仅如此,线性回归算法的值域为全体实数集($h_\theta(x) \in R$),则当线性回归函数给出诸如 $h_\theta(x) = 10000, h_\theta(x) = -10000$ 等很大/很小(负数)的数值时,结果 $y \in \lbrace 0, 1\rbrace$,这显得非常怪异。 @@ -110,7 +110,7 @@ ${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2 ## 6.4 损失函数(Cost Function) -上节又留下了个问题,我们怎么知道决策边界是啥样?$\theta$ 多少时能很好的拟合数据?当然,见招拆招,总要来个 $J(\theta)$。 +那我们怎么知道决策边界是啥样?$\theta$ 多少时能很好的拟合数据?当然,见招拆招,总要来个 $J(\theta)$。 如果直接套用线性回归的损失函数: $J\left( {\theta} \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( h_{\theta} \left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}$ @@ -118,17 +118,19 @@ ${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2 ![](image/20180111_080314.png) -回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样梯度下降算法将无法确定收敛点是全局最优。 +回忆线性回归中的损失函数,其是一个二次凸函数(碗状),二次凸函数的重要性质是只有一个局部最小点即全局最小点。上图中有许多局部最小点,这样将使得梯度下降算法无法确定收敛点是全局最优。 ![](image/20180111_080514.png) -如果是一个凸函数,可以对其进行最优化分析,这类最优化问题,称为**凸优化问题**。还好,损失函数不止平方损失函数一种。 +如果损失函数也是一个凸函数,是否也有同样的性质,从而最优化?这类讨论凸函数最优值的问题,被称为**凸优化问题(Convex optimization)**。 -对于逻辑回归,更换平方损失函数为**对数损失函数**,可由统计学中的最大似然估计方法推出损失函数 $J(\theta)$: +当然,损失函数不止平方损失函数一种。 + +对于逻辑回归,更换平方损失函数为**对数损失函数**,可由统计学中的最大似然估计方法可推出损失函数 $J(\theta)$: $\begin{align*}& J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \newline & \mathrm{Cost}(h_\theta(x),y) = -\log(h_\theta(x)) \; & \text{if y = 1} \newline & \mathrm{Cost}(h_\theta(x),y) = -\log(1-h_\theta(x)) \; & \text{if y = 0}\end{align*}$ -则可绘制关于 $J(\theta)$ 的图像如下: +则有关于 $J(\theta)$ 的图像如下: ![](image/20180111_080614.png) @@ -138,7 +140,7 @@ $\begin{align*}& J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^ ## 6.5 简化的成本函数和梯度下降(Simplified Cost Function and Gradient Descent) -由于懒得分类讨论,对于二元分类问题,我们把损失函数**简化**为一个函数: +由于懒得分类讨论,对于二元分类问题,我们可把损失函数**简化**为一个函数: $Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)$ 当 $y = 0$,左边式子整体为 $0$,当 $y = 1$,则 $1-y=0$,右边式子整体为0,也就和上面的分段函数一样了,而一个式子计算起来更方便。 @@ -272,9 +274,6 @@ functionVal = 0 exitFlag = 1 ``` - -[^1]: https://en.wikipedia.org/wiki/List_of_algorithms#Optimization_algorithms - ## 6.7 多类别分类: 一对多(Multiclass Classification: One-vs-all) 一直在讨论二元分类问题,这里谈谈多类别分类问题(比如天气预报)。 @@ -346,41 +345,101 @@ exitFlag = 1 - 减少/惩罚各参数大小(magnitude),以减轻各参数对模型的影响程度 - 当有很多参数对于模型只有轻微影响时,正则化方法的表现很好 -## 7.2 代价函数(Cost Function) +## 7.2 损失函数(Cost Function) -很多时候由于特征数量过多,过拟合时我们很难选出要保留的特征,这时候正则化则能解决过拟合的问题。 +很多时候由于特征数量过多,过拟合时我们很难选出要保留的特征,这时候应用正则化方法则是很好的选择。 上文中,$\theta_0 + \theta_1x + \theta_2x^2 + \theta_3x^3 + \theta_4x^4$ 这样一个复杂的多项式较易过拟合,在不减少特征的情况下,**如果能消除类似于 $\theta_3x^3$、$\theta_4x^4$ 等复杂部分,那复杂函数就变得简单了**。 -为了保留各个参数的信息,不修改假设函数,改而修改代价函数: +为了保留各个参数的信息,不修改假设函数,改而修改损失函数: $min_\theta\ \dfrac{1}{2m}\sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + 1000\cdot\theta_3^2 + 1000\cdot\theta_4^2$ -上式中,我们在代价函数中增加了 $\theta_3$、$\theta_4$ 的惩罚项 $1000\cdot\theta_3^2 + 1000\cdot\theta_4^2$,如果要最小化代价函数,那么势必需要**极大地减小 $\theta_3$、$\theta_4$**,从而使得假设函数中的 $\theta_3x^3$、$\theta_4x^4$ 这两项的参数非常小,就相当于没有了,假设函数也就**“变得”简单**了,从而在保留各参数的情况下避免了过拟合问题。 +上式中,我们在损失函数中增加了 $\theta_3$、$\theta_4$ 的惩罚项(penalty term) $1000\cdot\theta_3^2 + 1000\cdot\theta_4^2$,如果要最小化损失函数,那么势必需要极大地**减小 $\theta_3$、$\theta_4$**,从而使得假设函数中的 $\theta_3x^3$、$\theta_4x^4$ 这两项的参数非常小,就相当于没有了,假设函数也就**“变得”简单**了,从而在保留各参数的情况下避免了过拟合问题。 + +![](image/20180114_090054.png) -根据上面的讨论,有时也无法决定要减少哪个参数,故统一进行参数惩罚。 +根据上面的讨论,有时也无法决定要减少哪个参数,故统一惩罚除了 $\theta_0$ 外的所有参数。 -代价函数: +损失函数: $J\left( \theta \right)=\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}]}$ -> $\lambda$: 正则化参数(Regularization Parameter) +> $\lambda$: 正则化参数(Regularization Parameter),$\lambda > 0$ > > $\sum\limits_{j=1}^{n}$: 不惩罚基础参数 $\theta_0$ > > $\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}$: 正则化项 -$\lambda$ 正则化参数类似于学习速率,也需要我们自行对其选择一个合适的值,虽然看似更为麻烦了一些,不过实际上通常都会使用正则化方法来避免过拟合。 +$\lambda$ 正则化参数类似于学习速率,也需要我们自行对其选择一个合适的值。 - 过大 - - 导致模型欠拟合 + - 导致模型欠拟合(假设可能会变成近乎 $x = \theta_0$ 的直线 ) - 无法正常去过拟问题 - 梯度下降可能无法收敛 - 过小 - 无法避免过拟合(等于没有) + +> 正则化符合奥卡姆剃刀(Occam's razor)原理。在所有可能选择的模型中,能够很好地解释已知数据并且十分简单才是最好的模型,也就是应该选择的模型。从贝叶斯估计的角度来看,正则化项对应于模型的先验概率。可以假设复杂的模型有较大的先验概率,简单的模型有较小的先验概率。 + +> 正则化是结构风险最小化策略的实现,是去过拟合问题的典型方法,虽然看起来多了个一参数多了一重麻烦,后文会介绍自动选取正则化参数的方法。模型越复杂,正则化参数值就越大。比如,正则化项可以是模型参数向量的范数。 + ## 7.3 线性回归正则化(Regularized Linear Regression) -## 7.4 逻辑回归正则化(Regularized Logistic Regression) \ No newline at end of file +应用正则化的线性回归梯度下降算法: + +$\begin{align*} & \text{Repeat}\ \lbrace \newline & \ \ \ \ \theta_0 := \theta_0 - \alpha\ \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)} \newline & \ \ \ \ \theta_j := \theta_j - \alpha\ \left[ \left( \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \right) + \frac{\lambda}{m}\theta_j \right], \ \ \ j \in \lbrace 1,2...n\rbrace\newline & \rbrace \end{align*}$ + +也可以移项得到更新表达式的另一种表示形式 + +$\theta_j := \theta_j(1 - \alpha\frac{\lambda}{m}) - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}$ + +> $\frac{\lambda}{m}\theta_j$: 正则化项 + + + +应用正则化的正规方程法[^2]: + +$\begin{align*}& \theta = \left( X^TX + \lambda \cdot L \right)^{-1} X^Ty \newline& \text{where}\ \ L = \begin{bmatrix} 0 & & & & \newline & 1 & & & \newline & & 1 & & \newline & & & \ddots & \newline & & & & 1 \newline\end{bmatrix}\end{align*}$ + +> $\lambda\cdot L$: 正则化项 +> +> $L$: 第一行第一列为 $0$ 的 $n+1$ 维单位矩阵 + +Matlab/Octave 代码: +``` +>> L = eye(5) +>> L(1,1) = 0 + +L = + + 0 0 0 0 0 + 0 1 0 0 0 + 0 0 1 0 0 + 0 0 0 1 0 + 0 0 0 0 1 +``` + + + +前文提到正则化可以解决正规方程法中不可逆的问题,即增加了 $\lambda \cdot L$ 正则化项后,可以保证 $X^TX + \lambda \cdot L$ 可逆(invertible),即便 $X^TX$ 不可逆(non-invertible)。 + +## 7.4 逻辑回归正则化(Regularized Logistic Regression) + +为逻辑回归的损失函数添加正则化项: + +$J(\theta) = - \frac{1}{m} \sum_{i=1}^m \large[ y^{(i)}\ \log (h_\theta (x^{(i)})) + (1 - y^{(i)})\ \log (1 - h_\theta(x^{(i)}))\large] + \frac{\lambda}{2m}\sum_{j=1}^n \theta_j^2$ + +前文已经证明过逻辑回归和线性回归的损失函数的求导结果是一样的,此处通过给正则化项添加常数 $\frac{1}{2}$,则其求导结果也就一样了。 + +从而有应用正则化的逻辑回归梯度下降算法: + +$\begin{align*} & \text{Repeat}\ \lbrace \newline & \ \ \ \ \theta_0 := \theta_0 - \alpha\ \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)} \newline & \ \ \ \ \theta_j := \theta_j - \alpha\ \left[ \left( \frac{1}{m}\ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \right) + \frac{\lambda}{m}\theta_j \right], \ \ \ j \in \lbrace 1,2...n\rbrace\newline & \rbrace \end{align*}$ + + + +[^1]: https://en.wikipedia.org/wiki/List_of_algorithms#Optimization_algorithms +[^2]: week2 - 4.6 \ No newline at end of file