该笔记以视频内容为主体,融合了网上资料和自身理解,目录与视频略有不同,旨在对知识进行简单的梳理归纳,如有不妥之处,欢迎交流指正。
文章目录
视频链接[中英字幕]
https://www.bilibili.com/video/BV164411b7dx?p=4
第一章 介绍
1.1 机器学习的定义(Machine Learning)
- Arthur Samuel(1959)
机器学习是这样的领域:它赋予计算机学习的能力,(这种学习能力)不是通过显著式编程获得的。
- Tom Mitshell(1998)
一个适当的学习问题定义如下:计算机程序从经验E中学习解决某一任务T,进行某一性能度量P,通过P测定在T上的表现因经验E而提高。
1.2 机器学习的分类
根据数据集中是否含有标签,可以将机器学习分为监督学习和无监督学习。
1.2.1 监督学习(Supervised Learning)
数据集是由特征向量和标签组成,目的是训练机器对标签取值的准确预测。
根据标签类型,可以将监督学习分为回归问题和分类问题。
- 回归问题(Regression):预测连续值输出(标签为连续值)
例子:预测房价 - 分类问题(Classification):预测离散值输出(标签为离散值)
例子:预测肿瘤性质
1.2.2 无监督学习(Unsupervised Learning)
数据集中没有任何标签或者只有相同的标签,目的是让机器从一堆未标记的数据中自行学习数据的统计规律或内在结构。
无监督学习通常可以分为聚类和降维两种类型。
-
聚类(Clustering):根据数据的相似度将数据分为多类的过程。
例子:新闻分类、客户市场划分 -
降维(Dimensionality Reduction):在保证数据所具有的代表性特性或者分布的情况下,将高维数据转化为低维数据的过程,主要用于数据压缩和数据的可视化。
例子:“鸡尾酒会”声音分割
第二章 一元线性回归
2.1 模型描述
符号定义如下:
m
m
m:训练样本的数量
x
x
x:输入变量/特征
y
y
y:输出变量/预测的目标变量
(
x
,
y
)
(x,y)
(x,y):一个训练样本
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i)):第
i
i
i个训练样本
h
θ
(
x
)
h_\theta(x)
hθ(x)或
h
(
x
)
h(x)
h(x)或
h
h
h:假设函数(Hypothesis)
一元线性回归模型(也叫单变量线性回归模型)的假设函数:
h
θ
(
x
)
=
θ
0
+
θ
1
x
h_\theta(x)=\theta_0+\theta_1x
hθ(x)=θ0+θ1x
这里的
θ
i
\theta_i
θi表示模型参数
2.2 代价函数(cost function)
学习算法的优化目标:选择合适的参数
θ
0
\theta_0
θ0和
θ
1
\theta_1
θ1使得预测出的值
h
θ
(
x
)
h_\theta(x)
hθ(x)最接近该样本对应的
y
y
y值
引出代价函数的定义:
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J\left(\theta_0, \theta_1\right)=\frac{1}{2 m} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2
J(θ0,θ1)=2m1∑i=1m(hθ(x(i))−y(i))2
目标函数:
min
J
(
θ
0
,
θ
1
)
\min J\left(\theta_0, \theta_1\right)
minJ(θ0,θ1) 即使得代价函数最小
代价函数也被称作平方误差函数,有时也被称作平方误差代价函数
平方误差代价函数是解决线性回归问题最常用的手段
公式汇总:
可视化理解:
有一个模型参数时:
有两个模型参数时:
用等高线图表示,每个等值线表示代价相同,越接近中心,代价越小:
2.3 梯度下降算法(Gradient descent algorithm)
梯度下降算法是一种用来使代价函数最小化的算法,不仅用于线性回归领域,而且也被广泛应用于机器学习的众多领域。
思路:从某个初始点出发,不断沿负梯度方向更新模型参数,最终使代价函数达到局部最低点。
存在的问题:只能得到局部最低点,初始点改变可能导致得到的最低点不同。
这个部分主要介绍的是批量(Batch)梯度下降算法。
参数更新规则的数学定义:
其中
α
\alpha
α表示学习率(learning rate),控制我们以多大的幅度更新参数
θ
j
\theta_j
θj
α
\alpha
α太小:收敛速度较慢
α
\alpha
α太大:可能导致无法收敛甚至发散
注意:梯度下降算法中所有参数是同步更新的,如图中左边的过程所示。
根据定义,局部最低点的偏导数为0。当我们接近局部最低点时,偏导数的绝对值越来越小,因此梯度下降法将自动采取较小的幅度,这就是梯度下降的运行方式,所以实际上没有必要再另外减小 α \alpha α。
线性回归的梯度下降算法:
线性回归的代价函数是一个凸函数,只有全局最优,没有局部最优,因此使用梯度下降算法时总是能收敛到全局最优。等高线图可以直观地感受到梯度下降的概念。
2.4 后续延伸
梯度下降算法除了批量梯度下降算法之外,还包括随机梯度下降算法、小批量梯度下降算法等。
在批量梯度下降算法中,由于代价函数
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J\left(\theta_0, \theta_1\right)=\frac{1}{2 m} \sum_{i=1}^m\left(h_\theta\left(x^{(i)}\right)-y^{(i)}\right)^2
J(θ0,θ1)=2m1∑i=1m(hθ(x(i))−y(i))2 ,因此每一步梯度下降都会遍历整个训练集的样本,当训练样本很多时,训练过程会很慢。后续也会介绍其他梯度下降算法,不需要遍历整个训练集,只需要关注部分子集。
线性回归中求解代价函数最小值对应的模型参数,除了梯度下降算法之外,还有正规方程法。
正规方程法不需要使用多步骤梯度下降。两者相比,梯度下降适用于更大的数据集。
第三章 线性代数复习
本章主要介绍了矩阵和向量的一些概念和运算,不作详细介绍,仅记录一些关键点。
3.1 矩阵向量乘法
这里提到一个写程序的小技巧。
在预测房价时,代码可以写成数据矩阵与参数向量相乘,或者可以写成for循环的形式。
当数据集很大时,左边的代码会更加简洁,计算效率也会更高。
3.2 矩阵乘法
这里又提到一个小技巧,使用一次矩阵乘法可以实现基于多种假设的预测。
目前有很多线性代数库可以进行高效的矩阵间的乘法计算,从而可以高效地基于众多假设进行预测。
3.3 逆和转置
matlab求逆矩阵的函数:pinv(A)
不存在逆矩阵的矩阵称为奇异矩阵或者退化矩阵。
第四章 多元线性回归
4.1 模型描述
符号定义如下:
n
n
n:特征的数量
x
(
i
)
x^{(i)}
x(i):第
i
i
i个训练样本的特征向量
x
j
(
i
)
x^{(i)}_{j}
xj(i):第
i
i
i个训练样本中第
j
j
j个特征的值
假设函数形式:
4.2 多元梯度下降算法
公式汇总:
一元梯度下降算法与多元梯度下降算法对比:
实际上一元梯度下降算法只是多元梯度下降算法的特例。
4.2.1 多元梯度下降算法实用技巧1:特征缩放(Feature Scaling)
当多个特征的取值范围相差较大时,代价函数的等高线会呈非常瘦长的椭圆形状,会导致梯度下降的迭代次数增加,降低运算效率。
特征缩放可以将多个特征的取值范围变得较为接近,使得梯度下降算法能够更快地收敛。
一般将特征的值统一到 [-1,1] 附近。
在特征缩放的过程中,有时还会进行均值归一化(Mean normalization):
均值归一化是为了让特征的平均值为0(
x
0
x_0
x0=1不需要这个操作):
均值归一化公式:
x
j
(
i
)
=
x
j
(
i
)
−
a
v
g
(
x
j
)
m
a
x
(
x
j
)
−
m
i
n
(
x
j
)
x^{(i)}_j=\frac{x^{(i)}_j-avg(x_j)}{max(x_j)-min(x_j)}
xj(i)=max(xj)−min(xj)xj(i)−avg(xj)
4.2.2 多元梯度下降算法实用技巧2:学习率(Learning rate)
检查梯度下降算法是否正常工作的方法:
1、画出代价函数随迭代步数增加的曲线,观察梯度下降算法是否已经收敛。
2、自动收敛测试:如果代价函数某次迭代之后小于某个很小的值,则认为梯度下降算法已收敛。
但是通常选择一个合适的阈值比较困难,因此第一种方法更为有效。
如何选择合适的学习率
α
\alpha
α:
对于线性回归问题来说,当学习率
α
\alpha
α足够小时,每次迭代之后代价函数都会下降。
因此,当代价函数不是持续下降时,可以减小学习率
α
\alpha
α。
但是当学习率
α
\alpha
α太小时,梯度下降可能会收敛得很慢。
总结:
学习率
α
\alpha
α太小:收敛慢
学习率
α
\alpha
α太大:代价函数可能不会在每次迭代时都下降,甚至可能不收敛。
技巧:
通常以3的倍数来取一系列的值,然后找到一个太小的值和一个太大的值,最后选择一个最大可能值或者比最大值略小一些的比较合理的值作为学习率。
4.3 特征和多项式回归
特征的选择:
以预测房价为例,可以将长和宽分别作为一个特征,也可以将土地面积即长×宽作为一个特征。有时候通过定义一个新特征会得到一个更好的模型。
多项式回归:
当一次函数模型不能很好地拟合曲线时,还可以考虑用二次多项式、三次多项式等,转化为多项式回归问题,然后多项式回归问题可以通过变量转换化为多元线性回归问题来解决(定义多个特征)。
如果像这样选择特征的话,需要注意特征缩放。
4.4 正规方程(区别于梯度下降算法的直接解法)
线性回归中求解代价函数最小值对应的模型参数的方法:
1、梯度下降算法(迭代方法)
2、正规方程(直接解法)
4.4.1 使用方法
正规方程:
通过导数值为零的点为原函数最小值(不考虑最大值)这一原理直接找到代价损失函数
J
(
θ
)
J(θ)
J(θ)的最小值,从而确定最优参数
θ
θ
θ。
用法举例:
视频中未进行公式推导,直接给出了
θ
θ
θ的求解结果:
注:使用正规方程不需要进行特征缩放。
4.4.2 梯度下降算法与正规方程的对比
梯度下降算法与正规方程的优缺点正好相互对应。
梯度下降算法的缺点 | 正规方程的优点 |
---|---|
需要多次尝试,选择合适的学习率 α \alpha α | 不需要选择学习率 α \alpha α |
需要多次迭代,计算可能会更慢 | 不需要多次迭代 |
当特征取值范围差别较大时需要特征缩放 | 不需要特征缩放 |
梯度下降算法的优点 | 正规方程的缺点 |
---|---|
当特征变量很多时仍然可以很好地工作 | 需要计算
(
X
T
X
)
−
1
(X^TX)^{-1}
(XTX)−1,时间复杂度为
O
(
n
3
)
O(n^3)
O(n3), 当特征变量很多时计算会很慢 |
适用于各种算法 | 只适用于线性回归模型, 不适用于逻辑回归算法、分类算法等更复杂的学习算法 |
适用场景总结:
对于线性回归问题:
当特征变量数量不太大时(如
n
<
10000
n<10000
n<10000),更适合用正规方程;
当特征变量数量太大时(如
n
≥
10000
n≥10000
n≥10000),更适合用梯度下降算法。
对于其他类型的问题:用梯度下降算法。
4.4.3 正规方程在矩阵不可逆的情况下的解决办法
选学内容,实际上这种情况非常少见。
MATLAB / python 中求解逆矩阵的函数有两种:
pinv:求伪逆矩阵(可求解逆矩阵不存在的情况)
inv:求逆矩阵(仅适用于逆矩阵存在的情况)
因此,使用pinv函数仍然可以得到想要的
θ
\theta
θ值。
矩阵
X
T
X
X^TX
XTX不可逆的原因和解决办法:
(1)存在多余的特征(某些特征线性相关)
解决办法:删去线性相关的多余特征
(2)存在太多的特征(如样本数量
m
m
m<特征数量
n
n
n)
解决办法:删去一些影响不大的特征;采用正则化(regularization)方法(详见7.3.2 小节)
第五章 Octave教程
本章内容在此不赘述。
需要注意的是,在本章结尾提到一个重要的概念:向量化。
使用向量化方法实现线性回归,通常运行速度更快。在后面的算法中是一个重要的技巧。
MATLAB未向量化与向量化的对比:
C++未向量化与向量化的对比:
梯度下降算法用向量化实现:
第六章 逻辑回归(Logistic Regression)
6.1 分类问题
前面提到过,当预测的变量
y
y
y为连续值时为回归问题,当预测的变量
y
y
y为离散值时为分类问题。
将线性回归模型用于分类问题,有时效果较好,但有时效果不理想,因此不推荐使用。
另外,对于二分类问题,输出值为0或1。但是使用线性回归时,输出值可能会远大于1或者远小于0。
因此,引入逻辑(Logistic)回归算法,其特点是输出值始终介于0-1之间。
注意:逻辑回归算法是一种分类算法,用于解决二分类问题。
6.2 假设函数(Sigmoid函数)
逻辑回归的假设函数
h
θ
(
x
)
h_\theta(x)
hθ(x)使用Sigmoid函数(也叫做Logistic函数)将输出值置于[0,1]区间。
假设函数
h
θ
(
x
)
h_\theta(x)
hθ(x)输出值的含义:输入
x
x
x时
y
=
1
y=1
y=1的概率估计
6.3 决策边界
Sigmoid函数将分类问题转化为:
当
θ
T
x
≥
0
\theta^Tx≥0
θTx≥0时,输出
y
=
1
y=1
y=1;
当
θ
T
x
<
0
\theta^Tx<0
θTx<0时,输出
y
=
0
y=0
y=0。
假设已经确定了合适的模型参数,则可得到相应的决策边界。
线性的决策边界:
非线性的决策边界:
注意:
即使没有画出训练集,只要假设函数的参数
θ
θ
θ给定,决策边界以及两部分区域都是确定的。
决策边界是假设函数的属性,取决于参数,而不是取决于训练集。
我们不是用训练集来确定决策边界,而是用训练集来拟合参数。
6.4 代价函数与梯度下降
如果将Sigmoid函数直接代入线性回归的代价函数,会发现这是一个非凸函数,存在许多局部最优解,不能保证梯度下降能收敛到全局最小值。
因此,我们定义逻辑回归中要付的惩罚或代价为:
根据统计学中的极大似然法,可得简化之后的代价函数:
再次提到,假设函数的输出值的含义为:在
θ
\theta
θ条件下,输入
x
x
x时估计
y
=
1
y=1
y=1的概率。
我们的目的是找出让
J
(
θ
)
J(\theta)
J(θ)取得最小值的
θ
\theta
θ,使用梯度下降算法来完成。
梯度下降算法的更新公式:
和线性回归的公式形式相同,不同的是假设函数有所变化。
我们可以使用for循环来更新
θ
\theta
θ,也可以使用速度更快的向量化方式更新参数。
线性回归中的特征缩放也可以应用到逻辑回归中,用来提高梯度下降的收敛速度。
6.5 高级优化
除了梯度下降算法外,还有其他一些更高级的优化算法,比如:
共轭梯度法(Conjugate gradient)、BFGS和L-BFGS。
这些高级优化算法有一个智能内循环,称为线搜索算法,它可以自动尝试不同的学习率并选择一个好的学习率,甚至可以为每次迭代选择不同的学习率。
优点:不需要手动选择学习率;收敛速度远远快于梯度下降。
缺点:更复杂。
举了Octave里 fminunc函数的例子:
6.6 多元分类:一对多
如何使用逻辑回归解决多分类问题:采用一对多分类
原理:将多分类问题转化为多个独立的二元分类问题。
每个分类器分别对应一个假设函数
h
θ
i
(
x
)
h_\theta^i(x)
hθi(x),
i
i
i为
y
y
y的取值情况,每个只针对其中一种情况进行训练。
最后输入
x
x
x,比较多个逻辑回归分类器的输出,选择可信度最高、效果最好的分类器,即
h
θ
i
(
x
)
h_\theta^i(x)
hθi(x)最大的分类器,找到对应的
i
i
i,说明
y
=
i
y=i
y=i的概率最大,因此预测
y
=
i
y=i
y=i。
第七章 正则化
7.1 过拟合问题
拟合的效果不好可能会出现两种问题:
欠拟合(underfitting):也称该算法具有高偏差,表示没有很好地拟合训练数据。
过拟合(overfitting):也称该算法具有高方差,通常在模型特征变量较多而样本较少时出现,尽管训练出的假设函数能很好地拟合训练集,但是曲线过于扭曲,无法泛化到新样本中。
这里提到一个概念:
泛化:表示一个假设模型应用到新样本的能力,新样本即训练集之外的数据
下面分别是线性回归和逻辑回归欠拟合、恰当拟合、过拟合的情况:
如何解决过拟合问题:
- 尽量减少特征变量的数量
——人工选择更为重要的特征,或者使用模型选择算法自动选择保留哪些特征变量(比如PCA主成分分析)。
——该方法可以有效减少过拟合的发生,缺点是舍弃一些特征变量意味着舍弃了关于问题的一些信息。 - 正则化
——保留所有的特征变量,但是减少量级或者说是参数 θ j \theta_j θj的大小。
——当有很多特征变量并且每一个变量对结果都有影响时,这种方法非常有效。
7.2 代价函数
正则化的思想:在代价函数中加入惩罚项。
我们一开始并不知道哪些参数要惩罚,因此我们将所有参数
θ
j
\theta_j
θj都加上惩罚项,从而尽量去简化假设模型。参数
θ
j
\theta_j
θj越小,得到的函数就会越平滑,因此也更不容易出现过拟合问题。
加入惩罚项之后的代价函数:
(按照惯例,一般不给
θ
0
\theta_0
θ0加上惩罚项,求和从
θ
1
\theta_1
θ1开始,实际上加不加影响都不大)
其中,
λ
\lambda
λ称为正则化参数,作用是控制两个不同目标之间的平衡关系。
第一个目标与代价函数的第一项有关,是想更好地拟合训练集数据;
第二个目标与代价函数的第二项有关,即正则化项,是想使得参数尽可能小,从而简化假设模型,避免出现过拟合。
在正则化的线性回归中,如果
λ
\lambda
λ设置过大,会导致对所有参数的惩罚程度过大,从而使得所有参数都会接近于0,假设模型近似一条直线,出现欠拟合情况。
因此为了正则化起到应有的效果,必须选择一个合适的正则化参数
λ
\lambda
λ。
7.3 线性回归的正则化
拟合线性回归模型,所用到的求解代价函数最小值有两种方法:梯度下降算法和正规方程。
7.3.1 正则化后的梯度下降算法
其中,由于
θ
0
\theta_0
θ0不加惩罚项,因此单独列出。
正则化线性回归的梯度下降算法的变化在于,每次迭代都将参数
θ
j
\theta_j
θj乘以一个很接近于1的值,将参数缩小一点,然后再进行之前的更新操作。
7.3.2 正则化后的正规方程
此外,4.4.3小节提到过,当样本数量小于特征变量数量时,矩阵
X
T
X
X^TX
XTX是不可逆的,称为奇异矩阵。
而当正则化参数
λ
\lambda
λ严格大于0时,可以保证括号内的式子一定是可逆的。因此正则化也可以解决矩阵
X
T
X
X^TX
XTX不可逆的问题。
7.4 逻辑回归的正则化
7.4.1 正则化后的梯度下降算法
首先和线性回归一样,在代价函数中加入惩罚项。
正则化后的更新规则:
和正则化线性回归的梯度下降算法形式相同,不同的是假设函数变成了Sigmoid函数。
7.4.2 正则化后的高级优化算法
采用Octave的fminunc函数
第八章 神经网络:表述
8.1 非线性假设
当初始特征个数
n
n
n很大时,将大量高阶多项式项数包含到特征里,会使特征空间急剧膨胀。
因此当
n
n
n很大时,通过增加特征来建立非线性分类器并不是一个好办法。
对于许多实际的机器学习问题,特征个数
n
n
n都是很大的。下面列举了一个计算机视觉的例子。
我们采用图片上一个个像素点的像素强度作为特征值(表示像素点的亮度)。
比如对于一张50×50像素的图片,表示有2500个像素点。如果是灰度图,则有2500个特征变量;如果是RGB图,则有7500个特征变量。特征向量x即为包含了所有像素强度的列表。
对于典型的计算机图片表示方法,如果存储的是每个像素点的灰度值,则每个像素强度的值应在0-255之间(因为灰度图采用一个字节表示一个像素值)。如果要通过包含所有的二次项特征来学习得到非线性假设,则总共就有约300万个特征,计算成本太高。
因此在n很大时,简单的逻辑回归算法并不是一个学习非线性假设的好办法,从而引入神经网络,它在学习复杂的非线性假设上被证明是一种好得多的算法。
8.2 模型展示I
神经网络模仿了大脑中的神经元。
神经元是一个计算单元,它有一个细胞体,从输入通道(树突)接收来自其他神经元的信息并做一些计算,然后将结果通过它的输出通道(轴突)传送到其他神经元。
在人工神经网络里,首先我们使用一个最简单的模型来模拟单个神经元工作,如下图所示。
将神经元模拟成一个逻辑单元,图中黄色的圈可以看作是神经元的细胞体,它从输入通道(树突)接收信息
x
1
,
x
2
,
x
3
.
.
.
x_1,x_2,x_3...
x1,x2,x3...,然后神经元做一些计算,再通过输出通道(轴突)输出计算结果。这里所做的计算就是对假设函数
h
θ
(
x
)
h_\theta(x)
hθ(x)的计算。
在绘制一个神经网络图表时,通常只绘制输入节点 x 1 , x 2 , x 3 . . . x_1,x_2,x_3... x1,x2,x3...,有必要时会增加一个额外的节点 x 0 x_0 x0,这个 x 0 x_0 x0节点被称为偏置单元或偏置神经元。但由于 x 0 = 1 x_0=1 x0=1,因此可根据需要选择是否画出。
这里提到几个神经网络术语:
激活函数(activation function):在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端,为非线性函数
g
(
z
)
g(z)
g(z)。sigmoid函数(也叫作logistic函数)是常用的激活函数之一,还有其他的激活函数如tanh函数、Relu函数等。
模型的权重(weight):即之前提到的模型参数
θ
\theta
θ,在人工神经网络中常常用权重
w
w
w表示。
神经网络其实就是一组神经元连接在一起的组合。下图为一个3层的神经网络。
其中
x
0
x_0
x0和
a
0
a_0
a0均为偏置单元,
x
0
=
a
0
=
1
x_0=a_0=1
x0=a0=1。
输入层:神经网络中的第一层,用于输入特征
x
1
,
x
2
,
x
3
.
.
.
x_1,x_2,x_3...
x1,x2,x3...。输入层的神经元称为输入单元。
隐藏层:神经网络中非输入层和非输出层的中间层均称为隐藏层,可以不止一个。隐藏层的神经元称为隐藏单元。
输出层:神经网络中的最后一层,用于输出假设的最终计算结果。输出层的神经元称为输出单元。
下面详细介绍神经网络内部的计算过程。
神经网络定义了从
x
x
x输入到
y
y
y输出的映射关系,即假设函数,并将其参数化,将参数定义为
Θ
\Theta
Θ,改变
Θ
\Theta
Θ即可得到不同的假设函数
h
Θ
(
x
)
h_\Theta(x)
hΘ(x)。每一层的输出变量都是下一层的输入变量。
符号定义:
a
i
(
j
)
a_{i}^{(j)}
ai(j):表示第
j
j
j层的第
j
j
j个神经元的激活项。所谓激活项就是由一个具体神经元计算并输出的值。
Θ
(
j
)
\Theta^{(j)}
Θ(j) :表示权重矩阵,控制从第
j
j
j层到第
j
+
1
j+1
j+1层的映射。
如果一个神经网络在第
j
j
j层有
s
j
s_j
sj个单元,第
j
+
1
j+1
j+1层有
s
j
+
1
s_{j+1}
sj+1个单元,则
Θ
(
j
)
\Theta^{(j)}
Θ(j)的维度为
s
j
+
1
s_{j+1}
sj+1×
(
s
j
+
1
)
(s_j+1)
(sj+1)。(+1是因为算上了偏置单元)
具体举例:
Θ
(
1
)
\Theta^{(1)}
Θ(1)表示从第一层3个输入单元到第二层3个隐藏单元的映射的参数(权重)矩阵。
Θ
(
1
)
\Theta^{(1)}
Θ(1)是一个3×4的矩阵,3表示第2层的单元数量,4表示第1层的单元数量+1(因为算上了偏置单元)
Θ
10
(
1
)
\Theta_{10}^{(1)}
Θ10(1):即表示
Θ
(
1
)
\Theta^{(1)}
Θ(1)矩阵中第一行第一列的元素,表示
a
1
(
2
)
a_{1}^{(2)}
a1(2)与
x
0
x_0
x0映射的参数。
a
1
(
2
)
a_{1}^{(2)}
a1(2)为第2层第1个神经元的激活项,等于sigmoid激活函数作用在第一层输入的加权线性组合的结果。同理可得到
a
2
(
2
)
a_{2}^{(2)}
a2(2)和
a
3
(
2
)
a_{3}^{(2)}
a3(2)。
最后输出单元计算
h
Θ
(
x
)
h_\Theta(x)
hΘ(x),也可以表示成第3层第1个神经元的激活项
a
1
(
3
)
a_{1}^{(3)}
a1(3),等于sigmoid激活函数作用在第二层输入的加权线性组合的结果。
8.3 模型展示II
下图讲述了如何用向量化的方式表示神经网络从而实现高效计算。
左边为详细的展开式,右边为向量化表示方法。
这种依次计算激活项,从输入层到隐藏层再到输出层的过程称为前向传播。
暂时遮住神经网络的左半部分,右半部分(即黄色部分)非常像标准的逻辑回归模型,只不过这里参数表示为大写的 Θ \Theta Θ,而不是小写的 θ \theta θ。实际上这就是逻辑回归,只不过输入逻辑回归的特征是隐藏层计算的这些数值 a 1 ( 2 ) a_{1}^{(2)} a1(2)、 a 2 ( 2 ) a_{2}^{(2)} a2(2)、 a 3 ( 2 ) a_{3}^{(2)} a3(2),而不是原本的特征 x 1 x_{1} x1、 x 2 x_{2} x2、 x 3 x_{3} x3。
这里的 a 1 ( 2 ) a_{1}^{(2)} a1(2)、 a 2 ( 2 ) a_{2}^{(2)} a2(2)、 a 3 ( 2 ) a_{3}^{(2)} a3(2)就是第一层映射到第二层的函数计算的结果,这个函数是由参数 Θ ( 1 ) \Theta^{(1)} Θ(1)决定的。因此在神经网络中,它没有用输入特征 x 1 x_{1} x1、 x 2 x_{2} x2、 x 3 x_{3} x3来训练逻辑回归,而是自己训练逻辑回归的特征,即 a 1 ( 2 ) a_{1}^{(2)} a1(2)、 a 2 ( 2 ) a_{2}^{(2)} a2(2)、 a 3 ( 2 ) a_{3}^{(2)} a3(2)。根据不同的参数 Θ ( 1 ) \Theta^{(1)} Θ(1),有时可以学习到一些很有趣和复杂的特征,从而得到一个更好的假设函数,比使用原始的 x 1 x_{1} x1、 x 2 x_{2} x2、 x 3 x_{3} x3特征得到的假设更好。我们也可以选择多项式作为输入,但这个算法可以灵活地尝试快速学习任意的特征项,把 a 1 ( 2 ) a_{1}^{(2)} a1(2)、 a 2 ( 2 ) a_{2}^{(2)} a2(2)、 a 3 ( 2 ) a_{3}^{(2)} a3(2)输入到最后的单元,实际上这部分就是使用的逻辑回归算法。
神经网络中神经元的连接方式称为神经网络的架构。
比如上图中,第一层为输入层,最后一层为输出层,中间的都为隐藏层。前向传播的过程就是:第二层(即第一隐藏层)通过映射函数计算输入层的输出,作为新的特征项;第三层(即第二隐藏层)将第二层训练出特征项作为输入,计算出更复杂的特征项;第四层就利用第三层更复杂的特征项作为输入,从而得到非线性假设函数。
8.4 例子与直觉理解I
拟合逻辑与运算的神经网络:
拟合逻辑或运算的神经网络:
8.5 例子与直觉理解II
拟合逻辑非运算的神经网络:
主要思路:在预期得到非结果的变量
x
1
x_1
x1前面,放一个很大的负权重
因此拟合(NOT
x
1
x_1
x1) AND (NOT
x
2
x_2
x2) 运算可以使用g(10-20
x
1
x_1
x1-20
x
2
x_2
x2)
拟合同或运算的神经网络:
将三种逻辑运算结合起来。隐藏层的第一个激活项
a
1
(
2
)
a_{1}^{(2)}
a1(2)计算
x
1
x_1
x1 AND
x
2
x_2
x2 ,第二个激活项
a
2
(
2
)
a_{2}^{(2)}
a2(2)计算(NOT
x
1
x_1
x1) AND (NOT
x
2
x_2
x2),最后输出层的激活项
a
1
(
3
)
a_{1}^{(3)}
a1(3)计算
a
1
(
2
)
a_{1}^{(2)}
a1(2) OR
a
2
(
2
)
a_{2}^{(2)}
a2(2),输出结果即为
x
1
x_1
x1 XNOR
x
2
x_2
x2 。
这个例子主要是为了说明多层神经网络如何经过一层又一层构造出越来越复杂的函数。对于多层神经网络来说,第二层是实现一些关于输入的略微简单的函数,第三层又在此基础上计算更加复杂的函数,再往后计算的函数会越来越复杂。
8.6 多元分类
下图是四输出单元的神经网络,实现四分类。其中训练样本用
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i))表示,
h
θ
(
x
(
i
)
)
h_\theta(x^{(i)})
hθ(x(i))和
y
(
i
)
y^{(i)}
y(i)都是四维变量。
第九章 神经网络:学习
9.1 代价函数
这里重点讲解神经网络在分类问题上的应用。
L
L
L表示神经网络结构的总层数。
s
l
s_l
sl表示第
L
L
L层的单元数,也就是神经元的数量(不包括偏差单元)。
对于二元分类来说,只有一个输出单元,假设函数的输出是一个实数。
对于多元分类(K个类别,K≥3)来说,有K个输出单元,假设函数的输出是K维向量。
由逻辑回归的代价函数引申到神经网络的代价函数定义:
第一项内层的求和项是:对第
i
i
i个输入样本来说,从输出层第一项到第K项依次求每个逻辑回归算法的代价函数(即将第
k
k
k个输出单元的值
(
h
Θ
(
x
(
i
)
)
)
k
(h_\Theta(x^{(i)}))_k
(hΘ(x(i)))k与
y
k
y_k
yk进行比较),然后再将这些相加。
第二项即为逻辑回归中的正则项,对所有模型参数的平方求和。类比于处理逻辑回归那样,不将偏置项加入正则项中,因为我们并不想让这些值设为0。不过即使加入也是有效的,并不会有太大的区别。只是不将偏置项正则化的规定会更常用些。
9.2 反向传播算法
(本小节较难理解,将视频9-2与9-3放在一起看,此外需要结合其他视频理解)
知道了代价函数的表达式之后,我们要做的就是设法找到参数
Θ
\Theta
Θ使得代价函数
J
(
Θ
)
J(\Theta)
J(Θ)最小。
为了使用梯度下降法或者其他高级优化算法,我们需要计算
J
(
Θ
)
J(\Theta)
J(Θ)和
J
(
Θ
)
J(\Theta)
J(Θ)对
Θ
i
j
(
l
)
\Theta_{ij}^{(l)}
Θij(l)的偏导项。
计算
J
(
Θ
)
J(\Theta)
J(Θ)有已知的公式,而计算
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ)需要用到反向传播算法。
首先应用前向传播方法进行计算:
然后为了计算
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ),我们采用反向传播算法:
这里引入了
δ
j
(
l
)
\delta_j^{(l)}
δj(l)的概念,吴恩达老师并没有给出
δ
j
(
l
)
\delta_j^{(l)}
δj(l)的定义,也没有讲这些公式的推导,所以刚看的时候并不能理解,要结合其他视频。
注意:不存在
δ
j
(
1
)
\delta_j^{(1)}
δj(1),因为我们不需要对输入层求误差项。
辅助视频:
李宏毅老师:https://www.bilibili.com/video/BV1Vt411276w/?p=11&vd_source=f500206017491eabf5e44f485398240d
B站SeekerChan视频:https://www.bilibili.com/video/BV1GK4y1s76c/?spm_id_from=333.337.search-card.all.click&vd_source=f500206017491eabf5e44f485398240d
下面结合这几个视频,从几个方面来讲解这一块的内容:
(1)如何理解
δ
j
(
l
)
\delta_j^{(l)}
δj(l):
在视频9-3中,吴恩达老师提到
δ
j
(
l
)
=
∂
∂
z
j
(
l
)
c
o
s
t
(
i
)
\delta_j^{(l)}=\frac{\partial}{\partial z_j^{(l)}} \mathrm{cost}(i)
δj(l)=∂zj(l)∂cost(i):
这里的
c
o
s
t
(
i
)
\mathrm{cost}(i)
cost(i)是代价函数
J
(
Θ
)
J(\Theta)
J(Θ)简化之后的式子(只有一个输入样本,一个输出单元,忽略正则化项):
实际上,真正的定义为: δ j ( l ) = ∂ ∂ z j ( l ) J ( Θ ) \delta_j^{(l)}=\frac{\partial}{\partial z_j^{(l)}} J(\Theta) δj(l)=∂zj(l)∂J(Θ).
(2)为什么要引入这个 δ j ( l ) \delta_j^{(l)} δj(l):
因为我们用梯度下降算法的话需要计算
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ),吴恩达老师的视频中提到
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
=
a
j
(
l
)
δ
i
(
l
+
1
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)=a_j^{(l)}\delta_i^{(l+1)}
∂Θij(l)∂J(Θ)=aj(l)δi(l+1),但是并没有给出推导。推导过程如下:
因此,我们要计算
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ)的话,就需要解决
δ
j
(
l
)
\delta_j^{(l)}
δj(l)的计算。
而
δ
j
(
l
)
\delta_j^{(l)}
δj(l)的计算就需要用到反向传播算法。
(3)如何计算 δ j ( l ) \delta_j^{(l)} δj(l):
①特殊地,当 l = L l=L l=L时, δ ( l ) = a ( l ) − y \delta^{(l)}=a^{(l)}-y δ(l)=a(l)−y
以吴恩达老师视频中
δ
(
4
)
=
a
(
4
)
−
y
\delta^{(4)}=a^{(4)}-y
δ(4)=a(4)−y的公式为例,推导如下:
这里作者SeekerChan的代价函数也是简化后的,由于代价函数少了一个负号所以结果相反。
这里还用到了一个公式:
g
′
(
z
(
3
)
)
=
a
(
3
)
.
∗
(
1
−
a
(
3
)
)
g'(z^{(3)})=a^{(3)}.*(1-a^{(3)})
g′(z(3))=a(3).∗(1−a(3)),推导如下:
②当
l
≠
L
l≠L
l=L时,
δ
(
l
)
=
(
Θ
(
l
)
)
T
δ
(
l
+
1
)
.
∗
g
′
(
z
(
l
)
)
\delta^{(l)}=(\Theta^{(l)})^T\delta^{(l+1)}.*g'(z^{(l)})
δ(l)=(Θ(l))Tδ(l+1).∗g′(z(l))
这个式子就体现了反向传播的特点。(反向传播过程的直观理解可参考上述李宏毅老师的视频链接)
以吴恩达老师视频中
δ
(
3
)
=
(
Θ
(
3
)
)
T
δ
(
4
)
.
∗
g
′
(
z
(
3
)
)
\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)})
δ(3)=(Θ(3))Tδ(4).∗g′(z(3))的公式为例,推导如下:
(4)推广到有多个训练样本时,如何计算
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ):
前面都是对一个训练样本来说,即
m
=
1
m=1
m=1,所以代价函数的系数没有
1
m
\frac1m
m1,也没有加上正则化项。
下面推广到有多个训练样本的情况。
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ)需要在原来的基础上乘以
1
m
\frac1m
m1,再加上正则化项对
Θ
i
j
(
l
)
\Theta_{ij}^{(l)}
Θij(l)的偏导(
j
≠
0
j≠0
j=0).
这里引入了
Δ
i
j
(
l
)
\Delta_{ij}^{(l)}
Δij(l),用于对
a
j
(
l
)
δ
i
(
l
+
1
)
a_j^{(l)}\delta_i^{(l+1)}
aj(l)δi(l+1)进行累加求和。
详细推导过程如下:
9.3 使用注意:展开参数
本小节讲了如何利用Octave进行参数的矩阵表达式和向量表达式之间的转换。
矩阵表达式的好处:当参数以矩阵形式储存时,在进行正向传播和反向传播时会更加方便,更容易充分利用。
向量表达式的好处:能够使用一些高级的优化算法,这些算法通常要求把所有的参数展开成向量化的形式。
转换代码示例:
使用思路示例:
9.4 梯度检测
梯度检测是用来检测反向传播算法所计算的代价函数的导数是否正确。
利用导数的计算公式求导:
Octave代码实现:
总结流程:
1、先用反向传播算法计算
D
i
j
(
l
)
D_{ij}^{(l)}
Dij(l);
2、再用梯度检测方法计算
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ);
3、确保两者相似,只有几位小数的差距;
4、最后也是最重要的一步:在训练网络之前一定要关掉梯度检测。这是因为梯度检测代码计算量非常大,运行起来非常慢,而反向传播算法是一个高性能的计算导数的方法,一旦检验得出反向传播算法是正确的,就应当关闭梯度检测。
9.5 随机初始化
当我们执行梯度下降算法或者其他高级优化算法时,需要为参数
Θ
\Theta
Θ赋初值。
如果将参数
Θ
\Theta
Θ的初始值全部设为0,在逻辑回归中是被允许的,但是在训练神经网络时实际上没有作用。因为这会导致神经网络第二层的隐藏单元对于同一个输入具有相同的权重参数,从而具有相同的值,意味着最后的逻辑回归单元只能得到一个特征。
这个问题称为对称权重问题,为了解决这个问题,在训练神经网络时要使用随机初始化的思想。
即:对于每一个
Θ
i
j
(
l
)
\Theta_{ij}^{(l)}
Θij(l),将其初始化为一个接近0的范围
[
−
ε
,
ε
]
[-\varepsilon,\varepsilon]
[−ε,ε]内的随机值。
9.6 总结
这一节归纳了神经网络的总体实现过程。
在实现神经网络之前,需要选择网络结构。
输入单元数目即训练集的特征数量,输出单元数目即所要区分的类别个数(二分类只有一个)。
关于隐藏层的数量和每层隐藏单元的数量的选择:
默认是一个隐藏层;如果隐藏层数量大于2,默认每个隐藏层具有相同的隐藏单元数量(通常来讲,隐藏单元越多越好,但是也会增加计算量);每层的隐藏单元数量可以与输入单元相同或者是输入单元的几倍。
训练神经网络总共分为六步:
1、构建神经网络然后随机初始化权重,通常设置权重初始化值为很小的值,接近于0。
2、执行前向传播算法,即对于任一输入
x
(
i
)
x^{(i)}
x(i),计算假设函数
h
Θ
(
x
(
i
)
)
h_\Theta(x^{(i)})
hΘ(x(i))。
3、通过代码计算代价函数
J
(
θ
)
J(\theta)
J(θ)。
4、执行反向传播算法,计算
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ)。
具体来说,使用for循环遍历m个训练样本,分别执行前向传播和反向传播,从而得到每一层每个单元对应的激励值和
δ
\delta
δ项。
5、使用梯度检验比较使用反向传播计算出的偏导数值
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)
∂Θij(l)∂J(Θ)和用数值方法得到的估计值,确保两者相近,然后停用梯度检验。
6、使用梯度下降算法或者其他高级的优化算法,与反向传播相结合,来最小化代价函数
J
(
θ
)
J(\theta)
J(θ)。
需要补充的是,神经网络的代价函数
J
(
θ
)
J(\theta)
J(θ)是非凸函数,因此使用优化算法理论上可能收敛在局部最小值,但实际操作中这些算法的表现还是不错的。
第十章 应用机器学习的建议
10.1 决定下一步做什么
当运用训练好了的模型来预测未知数据的时候发现有较大的误差,下一步可以做什么?
1、获得更多的训练样本
2、尝试减少特征的数量
3、尝试获得更多的特征
4、尝试增加多项式特征(如
x
1
2
x_1^2
x12,
x
2
2
x_2^2
x22,
x
1
x
2
x_1x_2
x1x2等)
5、尝试减小正则化参数
λ
\lambda
λ
6、尝试增大正则化参数
λ
\lambda
λ
如果随便选取一种方法的话,可能花费了很多时间却发现效果并不好。
我们可以采用机器学习诊断法了解算法在哪里有问题,从而知道使用哪种方法来改进算法才是最有意义的,从而节省不必要的时间。
10.2 评估假设
为了检验算法是否过拟合,可以将数据分成训练集和测试集。一种典型的分割方法是70%的数据作为训练集,30%的数据作为测试集。需要注意的是数据必须是随机排列。
训练和测试学习算法的步骤:
- 对于线性回归模型
首先对训练集进行学习得到参数 θ \theta θ,具体来说,就是最小化训练误差 J ( θ ) J(\theta) J(θ);
然后计算测试误差,即把从训练集中学习得到的参数 θ \theta θ代入测试集的假设函数,计算测试集平方误差的平均值。
- 对于逻辑回归模型
与前面步骤类似,区别在于测试误差的计算方式不同。
此外,还有另一种测试度量,叫做错误分类(0/1分类错误)。我们可以应用错误分类误差来定义测试误差,即对错误分类误差求平均值。
10.3 模型选择和训练、验证、测试集
对于模型选择问题(如确定多项式次数、选择特征数量、确定正则化参数等),单纯将数据分为训练集和测试集往往是不够的,需要将数据分成三个部分:训练集、交叉验证集(有时就称为验证集)、测试集。
以确定多项式次数为例,相当于多了一个参数 d d d需要通过数据集确定。
假设数据只分为训练集和测试集:
对于不同的多项式模型,通过最小化训练误差得到对应的参数向量,然后再通过对这些模型求测试集误差,选出测试集误差最小的一种模型,最后为了测试模型的泛化能力,再观察该模型对测试集的拟合情况。
问题在于:我们使用测试集拟合了参数
d
d
d,再用测试集评估模型的性能,很可能是对泛化误差过于乐观的估计。
因此,更合理的办法是将数据集分成三个部分。典型的分配比例为60%训练集,20%交叉验证集,20%测试集。
训练误差、交叉验证误差、测试误差的定义:
模型选择的步骤:
1、对于不同的多项式模型,通过最小化训练误差得到对应的参数向量;
2、代入得到的参数向量,分别计算这些假设模型在交叉验证集上的交叉验证误差;
3、选取交叉验证误差最小的假设模型,即确定拟合效果最好的参数
d
d
d;
4、用第3步的模型计算在测试集上的测试误差,衡量模型的泛化误差。
10.4 诊断偏差与方差
当运行一个模型效果不好时,通常只有两种情况:欠拟合(偏差较大)或者过拟合(方差较大)。
改变多项式次数,训练误差和交叉验证误差的变化趋势:
随着多项式次数增加,训练误差不断减小,交叉验证误差先减小后增大
如何判断是偏差问题还是方差问题:
高偏差:训练误差较大,交叉验证误差接近训练误差,表示模型欠拟合
高方差:训练误差较小,但交叉验证误差远远大于训练误差,表示模型过拟合
10.5 正则化和偏差、方差
正则化可以有效防止模型的过拟合问题,这节讨论正则化和偏差、方差的关系。
回顾:
当正则化参数
λ
\lambda
λ较大时,模型欠拟合(高偏差);
当正则化参数
λ
\lambda
λ较小时,模型过拟合(高方差)。
注意:代价函数有正则化项,训练误差、交叉验证误差、测试误差均没有正则化项。
选择正则化参数
λ
\lambda
λ的步骤:
1、选取一系列想要尝试的
λ
\lambda
λ,通常将步长设为两倍增长,直到一个比较大的值;
2、依次训练各个模型,通过最小化代价函数,得到相应的参数向量;
3、代入得到的参数向量,分别计算这些模型在交叉验证集上的交叉验证误差;
4、选取交叉验证误差最小的模型;
5、用第4步的模型计算在测试集上的测试误差,观察模型对新样本的泛化能力。
改变
λ
\lambda
λ,训练误差和交叉验证误差的变化趋势:
当
λ
\lambda
λ较小时,模型过拟合(高方差),训练误差小,交叉验证误差大;
当
λ
\lambda
λ较大时,模型欠拟合(高偏差),训练误差大,交叉验证误差大。
随着
λ
\lambda
λ增大,训练误差不断增大,交叉验证误差先减小后增大。
10.6 学习曲线
学习曲线可以用来判断某个学习算法是否处于偏差、方差问题或者两者都有。
学习曲线描绘的是训练误差、交叉验证误差关于训练集样本总数的变化趋势。
当
m
m
m增大时,难以保证对所有样本的拟合效果都很好,因此训练误差会不断增大;
当
m
m
m增大时,模型的泛化表现越来越好,因此交叉验证误差会不断减小。
高偏差(欠拟合)情况下的学习曲线:
随着
m
m
m的增大,训练误差不断增大然后趋于水平,交叉验证误差不断减小然后趋于水平,最终两者相近,均处于比较大的值。
结论:
如果一个模型处于高偏差(欠拟合)情况,那么选用更多的训练集样本对改进算法没有太大帮助。
高方差(过拟合)情况下的学习曲线:
随着
m
m
m的增大,训练误差不断增大,但总的来说仍然很小;而模型的泛化表现并不会很好,因此交叉验证误差不断减小,但总的来说仍然很大。
训练误差和交叉验证误差之间存在较大差距,但是随着
m
m
m的增大,两者会越来越接近。
结论:
如果一个模型处于高方差(过拟合)情况,那么选用更多的训练集样本对改进算法是有帮助的。
10.7 决定接下来做什么
与10.1节相对应,怎么判断哪些改进模型的方法有效?
画出学习曲线,观察模型处于高偏差还是高方差,然后再对应采用下列方法:
1、获得更多的训练样本——解决高方差问题
2、尝试减少特征的数量——解决高方差问题
3、尝试获得更多的特征——解决高偏差问题
4、尝试增加多项式特征(如
x
1
2
x_1^2
x12,
x
2
2
x_2^2
x22,
x
1
x
2
x_1x_2
x1x2等)——解决高偏差问题
5、尝试减小正则化参数
λ
\lambda
λ——解决高偏差问题
6、尝试增大正则化参数
λ
\lambda
λ——解决高方差问题
将本章内容与神经网络结合起来:
较简单的神经网络结构:缺点为参数较少,容易出现欠拟合;优点在于计算量小。
较大型的神经网络结构:缺点为参数较多,容易出现过拟合,并且计算量大;优点在于性能更好。
实际中,通常选择较大型的神经网络并采用正则化来修正过拟合问题,会比采用较小的神经网络效果更好。
此外,还需要选择隐藏层的层数,做法为将数据分割为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络结构进行训练,然后选择在交叉验证集上表现最好的模型。
第十一章 机器学习系统设计
11.1 确定执行的优先级
以一个垃圾邮件分类问题为例:
为了应用监督学习,首先需要表示邮件的特征向量
x
x
x,通过特征向量
x
x
x和分类标签
y
y
y来训练分类器。特征向量可以是一个含100个单词的列表,通过这些单词是否在邮件中出现来区分垃圾邮件和非垃圾邮件。
如何在有限的时间内让垃圾邮件分类器具有高精准度和低错误率:
- 收集大量的数据
- 基于邮件的路由信息(邮件表头)构建更复杂的特征向量
- 基于邮件的正文信息构建更复杂的特征向量,比如截词、首字母大小写、标点符号等
- 开发更复杂的算法来检测拼写错误
下一节将讲解误差分析的思想,学习如何用更系统的方式从这些办法中作出选择。
11.2 误差分析
如果要研发机器学习产品或者开发机器学习应用,建议做法为:
- 先建立一个简单的能快速实现的算法,实现该算法并用交叉验证集数据测试该算法
- 绘制学习曲线来帮助之后的判断,决定是否要增加数据或者添加特征等
- 进行误差分析,人工检查交叉验证集中算法产生预测误差的实例,观察它们有什么共同的特征和规律,从而改进算法
此外,在改进学习算法时,另一个技巧是通过一个数值评价指标(比如交叉验证错误率)来估计算法执行的效果。
注意:推荐在交叉验证集上进行误差分析,而不是在测试集上。
11.3 不对称性分类的误差评估(查准率P和查全率R)
当正例和负例的比率非常接近于一个极端情况,称为偏斜类(skewed classes)问题。
此时通过分类误差或分类准确率来评估算法就变得不合理。比如我们预测病人是否患有癌症,通过机器学习模型得到分类误差为1%,然而我们发现在测试集中只有0.5%的病人患有癌症,如果编写一个非机器学习程序,判定所有病人都不患有癌症,分类误差只有0.5%。虽然分类误差降低了,但是显然算法是不合理的。因此面对偏斜类问题不能仅通过分类误差或分类准确率来评估算法。
在偏斜类问题中,常用的评估度量值为查准率(Precision,亦称为准确率)和查全率(Recall ,亦称为召回率)。
对于二分类问题,通常以我们希望检测的出现较少的类为正类(
y
=
1
y=1
y=1),算法预测的结果可以分成四种情况:
- 真正例(True Positive,TP):预测为正类,实际为正类
- 真反例(True Negative,TN):预测为负类,实际为负类
- 假正例(False Positive,FP):预测为正类,实际为负类
- 假反例(False Negative,FN):预测为负类,实际为正类
得到分类结果的混淆矩阵(confusion matrix)如下表所示:(参考西瓜书2.3.2小节)
真实情况 | 预测结果 | |
---|---|---|
正例 | 反例 | |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
以预测癌症为例,查准率表示在所有预测患有癌症的病人中,真正患有癌症的病人比例。
查准率定义:
P
=
T
P
T
P
+
F
P
P=\frac{TP}{TP+FP}
P=TP+FPTP
查全率表示在所有真正患有癌症的病人中,预测出患有癌症的病人比例。
查全率定义:
R
=
T
P
T
P
+
F
N
R=\frac{TP}{TP+FN}
R=TP+FNTP
查准率和查全率都是越高越好。对于前面提到的判定所有病人都不患有癌症的模型来说,查全率为0,显然这个模型是不合理的。因此,当出现偏斜类问题时,使用查准率和查全率来评估算法模型要比分类误差或分类准确率好的多。
11.4 查准率和查全率的权衡( F 1 F_1 F1值)
查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。在很多应用中,我们希望能够保证查准率和查全率的相对平衡。
还是以预测癌症为例,算法输出的结果在0-1之间,使用临界值0.5来预测是否患有癌症。
如果提高临界值,即在非常确信的情况下才告知病人患有癌症,可以有更高的查准率,但是查全率会降低,因为会遗漏很多真正患有癌症的病人。
如果降低临界值,尽可能地让所有有可能患有癌症的病人都得到进一步的检查,可以有更高的查全率,但是查准率会降低,因为有较大一部分病人可能并未真正患有癌症。
因此对大多数的回归模型来说,需要权衡查准率和查全率。通过改变临界值,可以得到不同的查准率和查全率曲线。
为了综合考虑查准率和查全率,提出了一个评估度量
F
F
F值,一般写作
F
1
F_1
F1值,
F
1
F_1
F1值越大算法综合表现越好。
定义式:
F
1
=
2
P
R
P
+
R
F_1=2\frac{PR}{P+R}
F1=2P+RPR
自动选取最佳临界值的方法:
选取不同的临界值,在交叉验证集上进行测试,观察哪个临界值在交叉验证集上得到的
F
1
F_1
F1值最大,即为最佳临界值。
11.5 机器学习数据
要想得到一个高性能的算法,需要满足低偏差和低方差,可以通过以下两个条件实现:
1、特征值具有足够的信息量,可以使用需要大量参数的学习算法(比如有很多特征的逻辑回归或线性回归或者是有许多隐藏单元的神经网络),拟合出非常复杂的函数,从而能够很好地拟合训练集,拥有较低的训练误差,保证得到一个低偏差的算法。
2、拥有庞大的训练集,训练集数量比参数更多,就不太容易过拟合,因此测试集误差会接近训练误差,从而保证得到一个低方差的算法。
综合这两点,就可以得到一个低偏差和低方差的学习算法。
第十二章 支持向量机
12.1 优化目标
支持向量机,也称SVM,在学习复杂的非线性方程时能够提供一种更为清晰和更加强大的方式。
首先回顾逻辑回归的代价函数,考虑单独一项对逻辑回归总体代价函数所产生的影响。
当
y
=
1
y=1
y=1时,代价函数只取决于前面一项,函数图像如左下图所示,SVM使用的新代价函数如紫色线所示,命名为
c
o
s
t
1
(
z
)
cost_1(z)
cost1(z)。
当
y
=
0
y=0
y=0时,代价函数只取决于后面一项,函数图像如右下图所示,SVM使用的新代价函数如紫色线所示,命名为
c
o
s
t
0
(
z
)
cost_0(z)
cost0(z)。
SVM的总代价函数:
将逻辑回归的代价函数中相应的部分替换成
c
o
s
t
1
(
z
)
cost_1(z)
cost1(z)和
c
o
s
t
0
(
z
)
cost_0(z)
cost0(z),再除去
1
m
\frac{1}{m}
m1(常数项不影响
θ
\theta
θ的最优值),然后将正则化参数
λ
\lambda
λ除去,引入新参数
C
C
C,两者作用一致,都是权衡第一项和第二项比重的方式,C类似于
1
λ
\frac{1}{\lambda}
λ1。
通过优化代价函数得到参数
θ
\theta
θ。与逻辑回归不同的是,SVM并不是输出概率,而是直接预测
y
=
0
y=0
y=0还是
1
1
1。
如果
θ
T
x
≥
0
\theta^Tx≥0
θTx≥0,假设函数输出1,否则输出0。
【未完待续】