0%

机器学习(持续更新)

监督学习

监督学习是从“标记”的训练数据来推断一个功能的机器学习任务,训练数据包括一套训练示例

  • 在监督学习中,每个实例都是由一个输入对象(通常为矢量)和一个期望的输出值(也称为监督信号)组成
  • 监督学习算法是分析该训练数据,并产生一个推断的功能,其可以用于映射出新的实例
  • 一个最佳的方案将允许该算法来正确地决定那些看不见的实例的类标签
  • 这就要求学习算法是在一种“合理”的方式从一种从训练数据到看不见的情况下形成

监督学习可以分为两类:回归问题,分类问题

  • 回归问题:通过给定一组数据,我们想要预测出连续的数值输出
  • 分类问题:我们没法预测一个离散值输出(对或者错,“0”或者“1”,当然也可能是多个确定的选项),只能推测一种结果的可能性

无监督学习

在监督学习中,程序被明确告知了什么是“正确”,而在无监督学习中,训练数据没有任何的“标记”,而程序会尝试把这些训练数据分为:有着某些相同性质的簇(聚类算法)

  • 无监督学习即没有标注的训练数据集,需要根据样本间的统计规律对样本集进行分析,常常被用于数据挖掘,用于在大量无标签数据中发现规律
  • 而聚类是无监督学习的常见任务,就是将观察值聚成一个一个的组,每一个组都含有一个或者几个特征,‎聚类的目的在于‎‎把相似的东西聚在一起,而我们并不关心这一类是什么‎‎
  • 因此,一个聚类算法通常只需要知道‎‎如何计算相似度‎‎就可以开始工作了
  • ‎例如无监督学习应该能在不给任何额外提示的情况下,仅依据一定数量的“狗”的图片特征,将“狗”的图片从大量的各种各样的图片中将区分出来

线性回归-回归

线性回归分析(Linear Regression Analysis)是确定两种或两种以上 变量间相互依赖的定量关系 的一种 统计分析方法

例如:

  • 身高:由父亲的身高、母亲的身高、家庭收入、所在地区等因素决定
  • 房价:由地段、面积、周围配套、时间等因素决定

线性回归要做的是就是找到一个数学公式能相对较完美地把所有自变量组合(加减乘除)起来,得到的结果和目标越接近越好(也就是说,代价函数越小越好)

  • 线性回归本质上就是把“散点图”拟合为一条直线,有许多种方法可以实现这个操作
  • 其中最常见的算法就是梯度下降,梯度下降可以是代价函数到达最下值

多项式回归-回归

如果您的数据点显然不适合线性回归(通过所有数据点的直线),则多项式回归可能是理想选择

多项式回归与线性回归一样,使用变量 x 和 y 之间的关系来找到通过数据点画线的最佳方法

案例:

我们可以从另外一个角度来理解这个式子,如果把 “x的平方” 理解成一个特征,把 “x” 理解成另外一个特征,这样这式子依然是线性回归的式子,但从 “x” 的角度来看是一个非线性的方程

这样的方式就叫多项式回归,相当于我们为样本多添了特征,这些特征是原来样本的多项式项

均方误差-代价函数

首先我们需要知道:代价是什么?

  • 可以简单的把“代价”理解为“误差”
  • 对于机器学习的目标,无非也就是最小化误差,也就是让代价最小化

假设有训练样本 (x, y),模型为 h,参数为 θ:

概况来讲,任何能够衡量模型预测出来的值 h(θ) 与真实值 y 之间的差异的函数都可以叫做代价函数C(θ),如果有多个样本,则可以将所有代价函数的取值求均值,记做J(θ),因此可以得出以下关于代价函数的性质:

  • 对于每种算法来说,代价函数不是唯一的
  • 代价函数是参数 θ 的函数
  • 总之,代价函数 J(θ) 可以用来评价模型的好坏,代价函数越小说明模型和参数越符合训练样本 (x, y)
  • J(θ) 是一个标量

代价函数(cost function)是用来衡量模型好坏的函数,我们的目标当然是得到最好的模型(也就是最符合训练样本的模型),因此训练参数的过程就是不断改变 θ,从而得到更小的 J(θ) 的过程,理想情况下,当我们取到代价函数 J 的最小值时,就得到了最优的参数 θ

均方误差(Mean squared error)是在线性回归中最常用的代价函数:

  • m:训练样本的个数
  • hθ(x):用参数θ和x预测出来的y值
  • y:原训练样本中的y值,也就是标准答案
  • 上角标(i):第i个样本

适用的线性方程为:(其实就是一次函数)

注意:在实际的操作中,代价函数处理返回 cost(代价) 以外,还需要返回 grad(梯度),也就是当前代价的偏导数(可以去看看后续的实验操作中的代价函数,它们都是返回这两个值的)

  • 相应地,线性回归的代价对 θj 的偏导数定义为:(无正则化)

梯度下降-拟合函数

梯度下降用于将函数 J(代价函数)最小化,其核心思想是通过求梯度的方法来找到代价函数的最小值

  • 假设我们有一个需要最小化的函数 J(θ) ,我们需要做的就是从“0”开始一点一点改变 θ(如果有 θ1,θ2 …. 也要一起修改),直到我们找到 J(θ) 的最小值
  • 当然不是随意修改 θ,每次都要在原来的基础上选择下降最快的方式

第一次操作:

第二次操作:

可以发现:两次操作都是在当前的基础上获取最优解,但是结果却截然不同,这就是梯度下降的特点之一,下面看看梯度下降具体的数学原理:(为了方便理解,这里只设置了两个参数θ)

反复执行这个过程,直至收敛

  • “:=” 用来表示赋值,相当于C语言中的“=”
  • “α”(学习率)用于控制每次梯度下降时需要迈出的步幅
  • “θ” 用于表示参数(案例中就是代表了x,y),每次需要同时同步更新各个“θ”

正确的更新方式:

错误的更新方式:

正规方程-拟合函数

为了获取代价函数的最小值,我们采用了梯度下降这种迭代的方式,分多次进行求解,而正规方程只需要运算一次就可以获取最小值

如果我们要获取一个函数最小值,最常见的办法就是对它求导,如果函数的最高次很高的话,方程就会很复杂,使用算法难以实现,而正规方程利用矩阵完成了这个过程

PS:本人太菜,理解不了正规方程

特征规范化-优化

不同特征具有不同量级时会导致:

  • 数量级的差异将导致量级较大的特征占据主导地位
  • 数量级的差异将导致迭代收敛速度减慢(收敛过程会来回偏转)
  • 依赖于样本距离的算法对于数据的数量级非常敏感

所以,当特征相差几个数量级时,首先执行特征缩放可以使梯度下降更快地收敛,另外,特征的值过大或过小也会导致收敛速度下降

特征缩放:我们可以对特征进行“乘除”操作,来使其到达合适的范围

  • 从数据集中减去每个特征的平均值
  • 减去平均值后,再将特征值按各自的“标准偏差”进行缩放(除)

逻辑回归-分类

Logistic Regression 虽然被称为回归,但其实际上是分类模型,并常用于二分类,用于解决分类问题

下面是一些分类问题的例子:

  • 邮件垃圾分类
  • 交易是否有欺诈

通常,这些数据都只有两种或几种可能(有限次数):

用线性回归来不能很好的拟合这些数据,因此逻辑回归诞生了

逻辑回归的本质是:假设数据服从这个分布,然后使用极大似然估计做参数的估计

假设陈述-分类

首先,我们需要我们的分类器输出值在 [ 0 , 1 ] 之间,因此,我们提出一个“假设”来满足该性质,假设的形式为:

我们定义函数 g 为:

把它们组合一下,可以得到:

这就是 Sigmoid 函数(另外,sigmoid 函数和 logistic 函数是同一个意思,完全可以相互替换),它的图形大概是这个样子:

当假设输出某个数字时,我们会把这个数字当做:对于输入值“x”,“y=1”的概率估计

例如:假设一个学校需要根据学生的成绩来录取学生,而我们拥有学生成绩这一数据集,于是我们把学生成绩作为“x”输入 Sigmoid 函数 h(x),就可以得到该学生录取的概率

但是,我们仍然需要利用各种拟合函数使 θ 最小化,这样 Sigmoid 函数才有意义

决策边界-分类

理解决策边界(Decision Boundary),可以帮助我们了解 Sigmoid 函数到底在计算什么

Sigmoid 函数的图形:

1651831283984

我们发现:

  • 当 z < 0 时,h(x) < 0.5(“z”就是函数 g(z) 的参数)
  • 当 z > 0 时,h(x) > 0.5(“z”就是函数 g(z) 的参数)

所以点 (0 , 0.5) 就是“决策边界”的判定点:

  • 如果 “h(x) < 0.5” ,z < 0,我们判断 “y=0”
  • 如果 “h(x) > 0.5” ,z > 0,我们判断 “y=1”
  • 如果 “h(x) = 0.5” ,预测为正类(我们不用在意)

于是判断样本是否为某个“可能”的条件,从 “h(x) vs 0.5” 转化为了 “z vs 0”,这里的 z 就是我们需要拟合的模板函数(要根据数据集散点图判断该函数的形状,然后添加对应的多项式),当拟合完毕后,z 就是“决策边界”

案例一:

假设我们有如下一组数据集:(多特征)

并且我们已经拟合好了数据(利用“拟合函数”使“代价函数”最小),得到一组固定的 θ [-3,1,1]

用直线 -3+x1+x2 = 0 作为“决策边界”:

  • 如果 “ -3+x1+x2 > 0 ” ,我们判断 “y=1”
  • 如果 “ -3+x1+x2 < 0 ” ,我们判断 “y=0”
  • 如果 “ -3+x1+x2 < 0 ” ,预测为正类

案例二:

假设我们有如下一组数据集:(增添两个格外特征)

并且我们已经拟合好了数据,得到一组固定的 θ [-1,0,0,1,1]

用圆 -1+(x1)^2+(x2)^2 = 0 作为“决策边界”:

  • -1+(x1)^2+(x2)^2 > 0,我们判断 “y=1”
  • -1+(x1)^2+(x2)^2 < 0,我们判断 “y=0”
  • -1+(x1)^2+(x2)^2 = 0,预测为正类

通过在特征中增加这些复杂的多项式,我们可以得到更复杂的决策边界

注意:决策边界不是训练集的属性,只要给定了 θ ,决策边界就确定了,而不是用训练集来定义决策边界

多元分类-分类

在实际问题中,我们可能会遇到有“多种可能”的特征

例如:

  • 邮件分类:家人,同学,诈骗……
  • 考试等级:A,B,C,D……

接下来我们就来讨论遇到多元分类时的处理办法,假设有一个三元分类:

我们可以把这个三元分类分为三个二元分类:

可以把另外两个分类定义为新的“伪训练集”,然后按照二元分类的方式进行拟合

最后,我们有三个分类器,每个分类器都针对其中一种情况进行训练,得到对应分类“P==1”成立的概率,分类器通式如下:

意义为:当给定了 “x” 和 “θ” 时,“y = i” 的概率,虽然这三者的概率加起来可能不为“1”,但是我们并不关心,我们只需要选择概率最高的那个就可以了

交叉熵-代价函数

先看看回归问题常用的代价函数:均方误差(做了一些变化)

我们把关键的部分提取出来:

问题的关键就是 h(x) 函数(模型),线性回归和逻辑回归的 h(x) 函数是不同的:

线性回归:

  • 公式
  • 图像

逻辑回归:

  • 公式
  • 图像

可以发现:h(x) 函数的改变导致“代价函数-均方误差”变为了非凸函数,使梯度下降算法不容易找到代价函数的最小值(可能找到一个极小值点就停了),这样会导致梯度下降的拟合性很差

为了解决这个问题,逻辑回归会使用适用于它自己的代价函数-交叉熵

fminunc-拟合函数

fminunc 采用拟牛顿法 (QN),是一种使用导数的算法,优化工具箱提供 fmincon 函数用于对有约束优化问题进行求解

Octave/MATLAB 的 fminunc 是一个优化解算器,可以找到无约束函数的最小值,对于逻辑回归,需要优化成本函数 J(θ),具体来说,您将使用 fminunc 找到最佳参数 θ 对于逻辑回归成本函数 J(θ)

在 Python 中也有该函数:

1
2
3
import scipy.optimize # SciPy的optimize模块提供了常用的最优化算法函数实现

theta, cost, *unused = opt.fmin_bfgs(f=cost_func, fprime=grad_func, x0=init_theta, maxiter=400, full_output=True, disp=False)

过拟合问题-优化

我们还是以“预测房子的价格”为案例:

  • 房子的价格和房子的大小有关

现在根据拟合程度的不同,有三种情况:A(左),B(中),C(右)

  • 随着房子的面积增大,房子的价格趋于平缓,所以 A 不能很好的拟合该模型(称为欠拟合)
  • 在 B 中加入了一个2次多项式,使拟合效果很好
  • 而 C 中加入了一个3次多项式,一个4次多项式,在现有的数据集中也许可以很好的拟合,但是总体来说不符合实际,我们也没有更多的数据来约束它(称为过拟合)

这种过度拟合的问题会在参数θ变多的情况下发生:

  • 因为能更好的拟合现有的数据,所以随着参数θ增多, J(θ)(代价函数)会不断的接近“0”,但是拟合曲线也会越来越扭曲
  • 拟合曲线会千方百计的拟合数据集,如果没有足够的数据来约束它,它就可能无法泛化到新的样本中,导致无法预测数据

下面这个逻辑回归的例子可能会明显些:

解决办法:

  • 数据可视化:绘制决策边界的图像,初步判断参数θ的数目合不合适
  • 人工调查选择:在数据比较复杂的模型中,绘图是比较困难的而且往往解决不了问题(有时即使有图形,也不好判断是否过拟合),所以需要人工排查哪些变量比较重要,那些可以去除,尽可能减少变量
  • 模型选择算法:可以自动选择哪些特征变量可以保留,哪些可以去除(但是这种算法不可控,可能会因为舍弃关键变量,而导致拟合程度下降)
  • 正则化:我们将保留所有特征变量,但是减少量级,或者参数θ的大小

正则化-优化-代价函数

在之前的案例中:增加参数θ的数目会导致 过拟合,使泛化效果不好

如果我们在函数中加入“惩罚项”,使“θ3”,“θ4”变得很小,这就可以平衡过拟合的影响

正则化-均方误差

其实就是在标准均方误差上面加了一项(惩罚项,正则化项),使其缩小所有的参数(因为我们不知道要优化哪些参数),这里的 λ 就是正则化参数,用于控制各个参数之间的平衡

PS:之后在重选择中 ,会有很多方法来自动选择 λ

正则化-交叉熵

正则化-优化-拟合函数

之前我们使用了梯度下降的方法来拟合模型,如果对代价函数进行了正则化,那么 梯度下降 也要进行正则化才行

适用于均方误差-梯度下降

梯度下降通用公式:

把 J(θ) 替换为均方误差:

进行正则化:

适用于交叉熵-梯度下降

交叉熵通用公式:

进行正则化:

同时,求梯度的公式也需要正则化(通常的代价函数都会返回:cost(代价),grad(梯度))

求梯度通用公式:

进行正则化:(注意:正则化是从“1”开始,而不是“0”)

向量化-优化-代价函数

向量化是非常基础的去除代码中 for 循环的艺术

  • 当在深度学习安全领域、深度学习实践中应用深度学习算法时,会发现在代码中显式地使用 for 循环使算法很低效
  • 所以算法能应用且没有显式的 for 循环是很重要的,并且会帮助你适用于更大的数据集

在深度学习领域这里有一项叫做向量化的技术,是一个关键的技巧,它可以允许你的代码摆脱这些显式的 for 循环,举个栗子说明什么是向量化:

在逻辑回归中,需要去计算 z = (w^T)x + b(其中 w,x 都是列向量),如果有很多的特征,那么就会有一个非常大的向量,那么如果想使用非向量化方法去计算 (w^T)x ,就需要如下的方法:

1
2
3
4
z = 0
for i in range(n_x):
z += w[i] * x[i]
z += b

可以发现非向量化的实现有 for 循环,作对对比,向量化的实现将会直接计算:

1
z = np.dot(w, x) + b

神经网络

神经网络产生的最初目的是为了制造出模拟人脑的机器,下面是我们神经元的结构图:

神经元通过许多树突来接收电信号,在细胞体中处理过后,又通过轴突输出电信号,我们可以用以下这个模型来模拟这个过程:

x1,x2,x3 通过“树突”传输到运算函数 hθ(x),然后通过“轴突”输出数据

这里的 hθ(x) 就可以是逻辑回归中的 Sigmoid 函数(假设陈述),而 θ 就是模型的参数向量(在神经网络中也被称为“权重”)

而这个模型就被称为:带有 Sigmoid 激活函数的人工神经元

神经网络其实就是一组神经元连接在一起的集合,第一层被称为“输入层”,第二层被称为“隐藏层”,最后一层被称为“输出层”(其实除了第一层和最后一层,其他层都是“隐藏层”)

接下来来分析一下神经网络的计算流程:

  • 假设我们输入 x1,x2,x3 到“隐藏层”,“隐藏层”根据自己的算法输出 a1,a2,a3,然后这3个数据作为最终“输出层” hθ(x) 的参数,计算出最终的结果
  • 每个样本都会根据当前 θ 拟合出的函数模型进行计算,输出一个预测的结果,然后把预测结果同真实数据进行对比,通过一些算法来调整 θ,使其结果更加趋近于真实值
  • 当所有数据都处理完毕以后,每个节点都大概拥有了一个相对稳定的 θ 值,然后就可以预测数据了

接下来我们把视角聚集到某个节点:

  • 我们把上述模型中的“输入层”屏蔽,后续的“隐藏层”和“输出层”其实构成了一个“逻辑回归模型”(只不过这里不直接传入数据集,而是传入“上一层”的运算结果)
  • 对这一个节点进行拟合,就可以得到一组确定的参数 θ
  • 而把整个神经网络都拟合完毕以后,每个节点都可能有一组不同的参数 θ(每个节点都输出它们认为的“最佳值”,到最后的“输出层”就可以输出该样本最可能的类)

神经网络的连接方式也被称为神经网络架构,通过改变架构,就可以模拟出更加复杂的特征(相比于逻辑回归中,通过增加参数 θ 的数目来模拟复杂的特征,这种方式更为高效)

案例一:使用神经网络来模拟 AND(OR同理)

假设我们有两个 x1,x2 两个输入特征,它们只能取“0”或者“1”

现在 y = x1 AND x2(和“&&”一样,当“x1==x2”时,“y=1”,否则“y=0”),它的神经网络模型如下:

  • PS:这个“+1”被称为“+1单元”,是我们引入的值

经过拟合之后的权重结果为:θ [-30,20,20],也就意味着该模型为:

解释一下该模型:

  • g(x) 就是 Sigmoid 函数
  • x1 和 x2 就只有两种可能:“0”,“1”
  • 当 x1 == 0 && x2 == 0 时,g(-30) ≈ 0
  • 当 x1 == 0 && x2 == 1 时,g(-10) ≈ 0
  • 当 x1 == 1 && x2 == 0 时,g(-10) ≈ 0
  • 当 x1 == 1 && x2 == 1 时,g(10) ≈ 1

和逻辑运算符 AND 的逻辑基本相同,成功模拟出 AND(注意:这个权重 θ 是拟合出来的)

案例二:使用神经网络来模拟 XNOR

XNOR为“同或”,和“异或相反”:若相同则输出为“1”,不同则输出为“0”,它的图像如下:

  • 这是明显的非线性结构,使用单一的逻辑回归是解决不了问题的,不过使用神经网络就可以通过结点之间的组合来解决问题
  • 学习这个模型,其实是想体验一下各个神经结点的组合搭配过程

“同或”其实就是以上这3个模型拼接出来的:

  • 红色的部分(-30,20,20)是 AND
  • 蓝色的部分(10,-20,-20)是 AND-NOT
  • 它们组合出来的“隐藏层”可以放入下表的 a1,a2:
  • 绿色的部分(-10,20,20)是 OR,发现“隐藏层”进行“或”操作后,刚好就可以得到 XNOR 的结果

这个案例证明了神经网络的功能强大:通过改变架构,就可以模拟出更加复杂的特征

交叉熵(神经网络)-代价函数

先看看逻辑回归中,正则化的交叉熵公式:

对于神经网络,我们将不再只有一个逻辑回归输出单元,而是有 K 个

那么它的公式如下:(又长又复杂)

对于一个确定的(xi,yi),那么它的代价函数可以看做是:

为了方便理解,也可以把代价函数看做是如下式子:

类似于均方误差,代表了神经网络预测样本值的精确程度

反向传播-优化

  • 梯度下降:是寻找代价函数最小值的一种方法
  • 交叉熵(神经网络):神经网络的代价函数,需要提供“梯度”
  • 反向传播:是求解梯度的一种方法

我们先分析一下正向传播的过程

为了拟合神经网络,我们需要使用反向传播算法,所以我们先分析一下程序正向传播的过程

  • a1 就是第一层的激活值,因其在输入层,我们假设它为 x
  • 然后计算模型函数 z(x) 的值,把计算结果放入 Sigmoid 激活函数,计算出另一个激活值 a2
  • 接着进行两次前向传播,分别计算出 a3,a4
  • 最后的 a4 就是假设函数 h(x) 的输出

案例一:(直观的展示了某个神经结点的运算过程)

  • 注意紫色标注出来的 z1(模型函数):

对于正向传播而言,我们采用梯度下降来拟合函数,但是在神经网络中,参数的数量是一个可怕的数字,动辄上万,十几万,并且,其取值有时是十分灵活的,甚至精确到小数点后若干位,若使用穷举法,将会造成一个几乎不可能实现的计算量

解决的办法就是:反向传播算法

采用反向传播算法来计算各个神经网络节点的梯度,并把它提供给代价函数(通常是交叉熵)

接下来就来分析反向传播算法

从直观上来说,反向传播算法就是对每一个结点进行一次这样的运算:

  • δ( l , j ) 代表了第 l 层的第 j 结点的误差

案例:对如下这个图像进行反向传播算法

计算公式为:

  • 对于最后一层(输出层),δ4 就是 a4(输出层预测的结果)和 y(真实的结果)之间的差值
  • 而对于中间的隐藏层,因为不清楚“预测结果”和“真实结果”的具体值,所以就只能通过以上的公式进行模拟计算
  • 值得注意的是:
    • “ .* ”对应了“点乘”,其结果会是一个标量
    • 最后的结果运算到 δ2 就可以了,因为 δ1 就是真实的数据,没有误差

我们可以简单把 δ( l , j ) 理解为第 l 层的第 j 结点的误差,但它有更实际的意义:(需要高数基础,给跪了)

  • 在神经网络内部,只要稍微改动一下 z(l),就会影响到 cost(某个结点的代价),从而影响整个代价函数的值
  • 所以 δ( l , j ) 其实是用于衡量:为了影响这些中间值(中间层的运算结果),将要改变多少权重(改变权重的程度)

案例二:

假设我们已经计算出了 δ(3).1,δ(3).2,接下来我们要计算 δ(2).2

这个过程其实就是正向传播反了过来:

  • 列出节点 z(2).2 输出的两个权重:θ(2).12 和 θ(2).22
  • 列出节点 z(3).1 和 z(3).2 的δ值:δ(3).1 和 δ(3).2
  • 通过以下公式进行计算:

梯度检测-优化

神经网络有一个不好的性质,那就是它容易产生BUG

当它也梯度下降或者其他算法一起工作时,也许它看起来确实能正常运行,但是反向传播的过程可能会因为一些BUG导致效率下降,因而使最后的结果和没有BUG时差出几个量级,更致命的是,我们可能根本就不知道发生了BUG

这个问题的解决办法就是梯度检测,原理如下:

  • 梯度检测会估计梯度(导数)值,然后和你程序计算出来的梯度的值进行对比,以判断程序算出的梯度值是否正确
  • 上图中,我们关注θ0点的函数的导数,即θ0点切线(图中蓝线)的斜率,现在我们在“θ0−ε”和“θ0+ε”两点连一条线(图中红线),我们发现红线的斜率和蓝线斜率很相似
  • 红线的斜率可以用以下式子表示:
  • 实际上,以上的式子很好地表示了θ0点导数的近似值
  • 在实际的应用中,θ往往是一个向量,梯度下降算法要求我们对向量中的每一个分量进行偏导数的计算,对于偏导数,我们同样可以用以下式子进行近似计算:
  • 梯度检测方法的开销是非常大的,比反向传播算法的开销都大,所以一旦用梯度检测方法确认了梯度下降算法算出的梯度(或导数)值是正确的,那么就及时关闭它
  • 一般来说ε的值选“10的-4次方”,注意并不是越小越好

随机初始化-优化

对于一个高级算法,需要对它的 θ 集合进行初始化,通常的想法就是把它们初始化为“0”

这个在逻辑回归中是没有问题的,但是在训练神经网络的时候,因为权重都是“0”,导致所有节点的激活值都是一样的,最后使每次更新出来的 θ 都一样

  • 如果把某一层的 θ 都初始化为“0”,那么在梯度下降更新 θ 时,有如下的等式成立:
  • 例如:第一条蓝线的权重会更新为“学习率”乘左边的式子,而第二条蓝线的权重会更新为“学习率”乘右边的式子,因为“θ1”和“θ2”都初始化为“0”,所以这个等式是恒成立的
  • 接下来的两条红线也会相等,同样,两条绿线也会相等

所以我们需要对 θ 进行随机初始化:

  • 对于每一个 θ,我们需要将其初始化为一个范围在 [-ε,ε] 之间的随机值
  • ε 是一个很小的值,通常为“10的-4次方”

偏差方差-误差

当一个算法拟合效果不佳时,只有两种情况:偏差较大,方差较大(也就是欠拟合,过拟合)

  • Error,误差:模型的计算值和真实数据之间的差值
  • Irreducible Error,不可避免的误差:刻画了当前任务任何算法所能达到的期望泛化误差的下限,即刻画了问题本身的难度
  • Bias,偏差:刻画了算法的拟合能力(Bias 高表示预测函数与真实结果相差很大,拟合程度太低)
  • Variance,方差:代表 “同样大小的不同数据集训练出的模型” 与 “这些模型的期望输出值” 之间的差异(Var高表示模型很不稳定,泛化效果差)

交叉验证-误差

之前我们已经介绍了误差的产生和原理,接下来就来看看误差的检查方法:交叉验证

  • 基本思想是将数据分为两部分,一部分数据用来模型的训练,称为训练集
  • 另外一部分用于测试模型的误差,称为验证集

还是那个熟悉的例子:(这里就不赘述了)

首先需要补充几个概念:

  • 训练集:数据集中,用于训练模型的部分
  • 验证集:数据集中,用于调整模型的超参数和用于对模型的能力进行初步评估的部分
  • 测试集:数据集中,用来评估模最终模型泛化能力的部分

下面一张图片将会展示“偏差”,“方差”的区别:(以上述案例为例)

  • J(θ)train 代表了训练集的误差:我们会很明显的发现,随着特征值的增加,函数的误差明显下降
  • J(θ)cv 代表了测试集的误差:和训练集的误差曲线不同,测试集的误差曲线反应了该模型的真实拟合水平

从 J(θ)cv 中我们可以发现两个极点:

  • 左极点代表了:偏差较大,拟合程度不够(欠拟合)
  • 右极点代表了:方差较大,泛化效果不足(过拟合)

学习曲线-误差

如果你想检测你的模型是否可以正常运行,那么学习曲线就是一种很好的工具

学习曲线的基本原理:人为减少训练集的数量,观察模型的误差曲线

一,通常来说,一个良好的模型应该具有以下的性质:

  • 随着训练集数目m的增大,训练集的误差增大,测试集的误差减小

二,对于高 Bias(偏差)的模型:

  • 随着训练集数目m的增大,训练集和测试集的误差都逐渐趋于平缓,也就意味着,不管再投入多少数据,测试集的误差都不会有明显的下降了

三,对于高 Variance(方差)的模型:

  • 不管训练集数目m再怎么增大,训练集和测试集的误差始终都有一大截“鸿沟”,不过在高方差的模型中,投入更多数据还是对训练有帮助的

支持向量机SVM

与逻辑回归和神经网络相比,支持向量机(support vector machines,SVM)能提供一种更为清晰和强大的方式,来运算 复杂的非线性方程

我们先从逻辑回归说起:

  • 当真实数据 y=1 时,我们想要 hθ(x) ≈ 1,所以 z > 0
  • 当真实数据 y=0 时,我们想要 hθ(x) ≈ 0,所以 z < 0

逻辑回归的代价函数为:交叉熵

把单独的 Cost 函数提取出来:

把 hθ 替换为 Sigmoid 函数:

针对这个函数,SVM 其实就是做了一件如下图所示的事情:

  • y = 1 时,函数的图像:取点 (1,0) 然后作一条和逻辑回归曲线相似的直线,名为 Cost1(z)

  • y = 0 时,函数的图像:取点 (-1,0) 然后作一条和逻辑回归曲线相似的直线,名为 Cost0(z)

SVM 就是把两条与逻辑回归曲线相似的直线,当做了代价函数,这样虽然牺牲了一点准确度,但是大大降低了运算的难度

对此,我们只需要把交叉熵简单修改一下,就可以得到 SVM 的代价函数

  • 交叉熵:
  • SVM 的代价函数:(注意这里去掉了“m”,而“C”是一个常数)
  • 当真实数据 y=1 时,我们想要 hθ(x) = 1,所以 z > 1(而不仅仅是 z > 0)
  • 当真实数据 y=0 时,我们想要 hθ(x) = 0,所以 z < -1(而不仅仅是 z < 0)

和逻辑回归不同,SVM 对于分类的判断不是“连续”的,而是有一个“间隔”,这就相当于在SVM中构建了一个安全因子(安全距离)

案例一:假设有一个 y=1 的训练样本,常量 C 很大

  • 因为 y=1 ,所以我们只用看 Cost1
  • 算法的目的是:预测正确 => hθ(x)≈1 => J(θ)尽可能小 => θ尽可能小
  • 这样,公式就可以简化为:
  • 最小化代价函数,其实就是使 θ 的平方和最小
  • PS:这里的 θ 其实是向量,具体的数学原理和向量内积有关

案例二:为数据集画决策边界

  • 紫线,绿线,都是不合理的决策边界
  • 而 SVM 会选择黑线,因为黑线距离样本的最小距离更大一些
  • 看看两条蓝线的距离,这个距离就叫做支持向量机的间距

因为 SVM 每次都会尽量用更大的间距去分离,所以它也被称为大间距分类器

案例三:为数据集画决策边界

  • 对于这个样本,SVM 有两种画法:黑线和紫线
  • 具体采用谁为决策边界是常数C决定的:
    • C 比较小:采用黑线
    • C 比较大:采用紫线
  • 所以我们可以通过调节C,来改变 SVM 的决策方式

高斯核函数

核函数也被称为相似度函数,用于模拟 非线性 决策边界的特征

接下来就通过一个案例来理解核函数的使用场景和作用:

假设有一块非线性的区域,我们想拟合一个决策边界来区分正负实例,通常有两种办法:

  • 第一种方法:通过构建高次项来拟合更复杂的决策边界
  • 第二种方法:通过高斯核函数来定义这些特征值

第一种方法会面临“过拟合”,“欠拟合”等一系列问题,所以第二种方法诞生了,以下图为例:

  • 我们先手动取“3”个点:L1,L2,L3,把这些点成为“标记”
  • 然后用高斯核函数来定义特征:
  • PS:||X-Y|| 就是向量作差之后各分量的平方和的开根号

现在解释一下高斯核函数:

  • 但点 (x1,x2) 靠近 L(i) 时,x ≈ L(i) ,f(i) ≈ exp(0) ≈ 1
  • 但点 (x1,x2) 远离 L(i) 时,x !≈ L(i) ,f(i) ≈ exp(∞) ≈ 0

正样本的附近大概率也是正样本,依照这个规律,相似度函数会根据目标和“标记”之间的距离,来判断该样本是不是正样本,现在再回看一下决策边界的基本模型:

把每一个相似度函数的结果进行整合(“标记”越多,最终结果的判断也越精确),作为特征用于 θ 的拟合,然后就可以用 SVM 对模型进行训练了,那么接下来的问题就是:如何选取 L1,L2,L3…

  • 而我们的解决办法也是简单暴力:直接把样本数据当做“标记”
  • 对于每一个样本 (x,y,z…) 都可以被放入相似度函数中,生成 n 个 f (x,y,z…)

高斯核函数的完整公式为:

在描绘 非线性决策边界 时,单纯的 SVM 算法起不到良好的效果,而如果用高斯核函数来定义特征的话,效果会好很多:

  • 只使用 SVM 算法:
  • 同时使用 SVM 算法和高斯核函数: