前言
学习吴恩达机器学习视频的第二篇笔记,内容包括:
- 第七章————正则化
- 第八、九章————神经网络
- 第十章————机器学习诊断法
个人博客页:一文讲清楚机器学习中的正则化、神经网络、机器学习诊断法 | Andrew的个人博客 (andreww1219.github.io)
一、正则化
1. 应用背景
在前面对线性回归、逻辑回归的学习中,我们都是构造一个假设hθ(x),然后得到他的损失函数J(θ),对其进行梯度下降操作使损失函数的值尽可能小。总而言之,就是对我们的训练集作出最好的拟合。
然而,当我们增加特征的维度,完美地去拟合我们的训练集时,会得到一条相当扭曲,不具有泛化性地曲线,这就是过拟合的问题。解决过拟合问题主要有以下两个手段:
- 减少特征的数量n
- 采用正则化(也就是我们今天要介绍的内容)
2. 什么是正则化?
我们采集了许多特征,并且相信这些特征对假设的预测值是有用的,并不想去舍弃它,又担心过拟合的问题。所以我们尽可能减小每个特征或某个特征对整体预测值的影响,在损失函数中增加对高特征值的惩罚,这就是正则化的思想。
3. 线性回归中的正则化
3.1 梯度下降中的正则化
由2可知,我们要在损失函数J(θ)增加对高特征值的惩罚,得到:
J(θ)=2m1[∑i=1m(hθ(x(i))−y(i))2+λ∑j=1nθj2]
得到 ∂θj∂J(θ)=m1[∑i=1m(hθ(x(i))−y(i))xj(i)+λθj]
那么有:
{θ0=θ0−mα∑i=1m(hθ(x(i))−y(i))θj=θj−mα[∑i=1m(hθ(x(i))−y(i))xj(i)+λθj]=θj(1−mαλ)−mα∑i=1m(hθ(x(i))−y(i))xj(i)
3.2 正规方程中的正则化
将损失函数表示为矩阵形式,可得:
J(θ)=2m1[(Xθ−Y)T(Xθ−Y)+λθTθ]
得到 ∂θ∂J(θ)=m1[XTXθ−XTY+λθ]
令 ∂θ∂J(θ)=0,得
θ=(XTX−λE)XTY
由于约定俗成的规则,θ0不参与正则化(实际参与得到的结果也差别不大),所以将上述式子中Ei,j的位置修改为0,就是正规方程带正则化的表达式。
4. 逻辑回归中的正则化
同线性回归中的梯度下降,我们可以得到相同的结果即:
{θ0=θ0−mα∑i=1m(hθ(x(i))−y(i))θj=θj−mα[∑i=1m(hθ(x(i))−y(i))xj(i)+λθj]=θj(1−mαλ)−mα∑i=1m(hθ(x(i))−y(i))xj(i)
二、神经网络
1. 问题描述
输入层(Input Layer):已知m组数据x(1),x(2),...,x(m),每组数据表示n个特征,可写为一个n+1维的向量
即:(x(i))T=(x0(i),x1(i),...,xn(i)),其中,x0(i)=1。
隐层(Hidden Layer):介于输入层和输出层之间,每个隐层的每个结点接收上一个隐层(或输入层)的信号,经过一定处理后得到新的信号并传递给下一个隐层(或输出层)
输出层(Output Layer):接受最后一个隐层的信号,经过加权处理后输出y(i)。在多元分类问题中,向量y(i)的维度就是所需要区分的类别的数量。
2. 前向传播(Forward Propagation)
我们用zi(j)表示第j层的第i个结点接收到的前一层的值加权后的总和,ai(j)表示第j层的第i个结点的输出,矩阵Θ(j)表示从第j层到第j+1层的权值,行数为j+1层的节点数,列数为j层的节点数+1(存在常数固定层,可看作激活阈值),即
zi(j+1)=∑k=0第j层的结点数Θi,k(j)akj
ai(j+1)=g(zi(j+1))
写成矩阵形式,则有 a(j+1)=g(Θ(j)a(j))
于是我们可以写出神经网络的假设hθ(x(i))=g(Θ(L−1)a(L−1))),其中L为神经网络的层数。
3. 反向传播(Back Propagation)
3.1 定义损失函数
有了假设,我们想要优化现有的模型,就需要对原有参数进行梯度下降,需要定义损失函数J(Θ),并对每一个参数即Θi,k(j)求偏导数∂Θi,k(j)∂J(Θ)
于是我们有预测值hθ(x)=a(L),真实值y,第j层的节点数为sj,则有
每个样本的均方误差 E=21∑i=1sL(ai(L)−yi)2
损失函数J(Θ)=m1∑i=1mE(i)
损失函数对参数的偏导数∂Θ(j)∂J(Θ)=m1∑i=1m∂Θ(j)∂E(i)
3.2 引入链式求导法
我们想要直接求E对Θi,k(j)的偏导数不太容易,因为我们的预测值是前面一步一步传递过来的,离输出层越远,E和Θi,k(j)的关系就越复杂。但是其中项之间的关系简单,偏导数易求,所以我们可以通过链式求导法则,由中间项之间的偏导数累乘得到E对Θi,k(j)的偏导数。
对输出层的参数,则有∂Θi,k(L−1)∂E=∂ai(L)∂E∂zi(L)∂ai(L)∂Θi,k(L−1)∂zi(L)
其中,∂ai(L)∂E=ai(L)−yi,∂zi(L)∂ai(L)=g′(zi(L))=ai(L)(1−ai(L)),∂Θi,k(L−1)∂zi(L)=ak(L−1)
得∂Θi,k(L−1)∂E=(ai(L)−yi)ai(L)(1−ai(L))ak(L−1)
我们将∂zi(L)∂E=∂ai(L)∂E∂zi(L)∂ai(L)=(ai(L)−yi)ai(L)(1−ai(L)) 记作输出层的误差(error)为δi(L),即
δ(L)=(a(L)−y).∗g′(z(L))
(存疑,视频中取的δ(L)=a(L)−y)
于是我们用δ(l)表示均方误差E对第l层z的偏导
3.3 矩阵形式
矩阵/向量/标量之间求导参考:机器学习中的数学理论1:三步搞定矩阵求导
我们希望得到E对结果层参数Θ(L−1)的偏导数,即标量对矩阵的求导,使用分母布局,得到与Θ(L−1)相同维度的矩阵,方便减法运算作梯度下降。
由链式求导法则,有
∂Θ(L−1)∂E=∂z(L)∂E∂Θ(L−1)∂z(L)
由于∂z(L)∂E=δ(L),
又z(L)=Θ(L−1)a(L−1),则有∂Θ(L−1)∂z(L)=∂Θ(L−1)∂Θ(L−1)α(L−1)=(α(L−1))T(使用分母布局)
综上所述,∂Θ(L−1)∂E=δ(L)(α(L−1))T
记均方误差E对Θ(j)的偏导为Δ(j),则有Δ(L−1)=δ(L)(α(L−1))T
3.3 推导递推公式
已知δ(l−1)=∂z(l−1)∂E,那么
δ(l−1)=∂z(l)∂E∂z(l−1)∂z(l)=δ(l)∂a(l−1)∂z(l)∂z(l−1)∂a(l−1)=(Θ(l−1))Tδ(l).∗g′(z(l−1))
即δ(l−1)=(Θ(l−1))Tδ(l).∗g′(z(l−1)) ,这就是误差反向传导的递推公式
又∂Θ(l−1)∂z(l−1)=(a(l−1))T
同理
Δ(l−1)=∂Θ(l−1)∂E=δ(l)(a(l−1))T
3.4 小结
记损失函数对Θ(l)的偏导数为D(l)=∂Θ(l)∂J(Θ),则有
Di,j(l)=m1∑mΔi,j(l)=m1∑mδi(l)aj(l−1)
若引入正则化项,则有
Di,j(l)=m1∑mΔi,j(l)=m1∑mδi(l)aj(l−1)+λΘi,j(l)
三、机器学习诊断法
1. 问题描述
我们需要评估我们训练出来的模型,判断是否过拟合,即高方差(variance),还是欠拟合,即高偏差(bias)。通常情况下,我们有许多方式去改进模型,但是不知道应该选哪一种。我们将讨论各个参数与偏差、方差的关系,帮助我们确定模型是处于高方差还是高偏差,应该怎样采取调整策略。
2.讨论变量
我们将遵循同一分布的数据集划分为训练集和验证集,训练集用来训练得到某一变量在不同值下的模型,由验证集对该变量进行选择。
记训练集误差为Jtrain(θ),验证集误差为Jcv(θ)
我们选择测试集误差最小的模型作为结果
但是,要如何验证我们模型的泛化能力?即模型对不同但具有相似分布的数据集(测试集)的表现。
所以我们一开始将数据集划分为训练集、验证集和测试集,由验证集对变量进行选择,由测试集对模型的泛化能力进行评估,不能将测试集用于调整参数,否则会导致过拟合
2.1 特征数d
我们记参数的多项式次数(相当于特征数)为d
当特征数过少时,训练集误差Jtrain(θ)和验证集误差Jcv(θ)都很大,模型欠拟合;
当特征数过多时,训练集误差Jtrain(θ)很小,而验证集误差Jcv(θ)较大,模型过拟合
2.2 正则化参数λ
当λ很小时,训练集误差Jtrain(θ)很小,而验证集误差Jcv(θ)较大,模型过拟合;
当λ很大时,训练集误差Jtrain(θ)和验证集误差Jcv(θ)都很大,模型欠拟合
2.3 数据集规模m
我们将数据集规模m与误差关系的曲线叫做学习曲线
在高偏差即欠拟合的情况下,随着数据集规模m的增大,训练集误差将非常接近于验证集误差
在高方差即过拟合的情况下,随着数据集规模m的增大,验证集误差能有效减小,说明在过拟合情况下,增大数据规模是有效的
3. 小结
当模型高方差时,我们可以选择:
- 增大数据集规模
- 减小特征数d
- 增大正则化参数λ
当模型高偏差时,我们可以选择:
- 增加特征数d
- 减小正则化参数λ