一文讲清楚机器学习中的正则化、神经网络、机器学习诊断法

148 阅读3分钟

前言

学习吴恩达机器学习视频的第二篇笔记,内容包括:

  1. 第七章————正则化
  2. 第八、九章————神经网络
  3. 第十章————机器学习诊断法

个人博客页:一文讲清楚机器学习中的正则化、神经网络、机器学习诊断法 | Andrew的个人博客 (andreww1219.github.io)

一、正则化

1. 应用背景

在前面对线性回归、逻辑回归的学习中,我们都是构造一个假设hθ(x)h_\theta(x),然后得到他的损失函数J(θ)J(\theta),对其进行梯度下降操作使损失函数的值尽可能小。总而言之,就是对我们的训练集作出最好的拟合。

然而,当我们增加特征的维度,完美地去拟合我们的训练集时,会得到一条相当扭曲,不具有泛化性地曲线,这就是过拟合的问题。解决过拟合问题主要有以下两个手段:

  1. 减少特征的数量nn
  2. 采用正则化(也就是我们今天要介绍的内容)

2. 什么是正则化?

我们采集了许多特征,并且相信这些特征对假设的预测值是有用的,并不想去舍弃它,又担心过拟合的问题。所以我们尽可能减小每个特征或某个特征对整体预测值的影响,在损失函数中增加对高特征值的惩罚,这就是正则化的思想。

3. 线性回归中的正则化

3.1 梯度下降中的正则化

由2可知,我们要在损失函数J(θ)J(\theta)增加对高特征值的惩罚,得到:

J(θ)=12m[i=1m(hθ(x(i))y(i))2+λj=1nθj2]J(\theta) = \frac{1}{2m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{j=1}^n \theta_j^2]

得到 J(θ)θj=1m[i=1m(hθ(x(i))y(i))xj(i)+λθj]\frac{\partial J(\theta) }{\partial \theta_j}= \frac{1}{m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \lambda \theta_j]

那么有:

{θ0=θ0αmi=1m(hθ(x(i))y(i))θj=θjαm[i=1m(hθ(x(i))y(i))xj(i)+λθj]=θj(1αλm)αmi=1m(hθ(x(i))y(i))xj(i)\begin{cases} \theta_0 = \theta_0 - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) \\ \theta_j = \theta_j - \frac{\alpha}{m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \lambda \theta_j] = \theta_j(1 - \frac{\alpha\lambda}{m}) - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} \end{cases}

3.2 正规方程中的正则化

将损失函数表示为矩阵形式,可得:

J(θ)=12m[(XθY)T(XθY)+λθTθ]J(\theta) = \frac{1}{2m} [(X\theta - Y)^T(X\theta - Y) + \lambda \theta^T \theta]

得到 J(θ)θ=1m[XTXθXTY+λθ]\frac{\partial J(\theta) }{\partial \theta}= \frac{1}{m} [X^TX\theta - X^TY + \lambda \theta]

J(θ)θ=0\frac{\partial J(\theta) }{\partial \theta} = 0 ,得

θ=(XTXλE)XTY\theta = (X^TX - \lambda E)X^TY

由于约定俗成的规则,θ0\theta_0不参与正则化(实际参与得到的结果也差别不大),所以将上述式子中Ei,jE_{i,j}的位置修改为0,就是正规方程带正则化的表达式。

4. 逻辑回归中的正则化

同线性回归中的梯度下降,我们可以得到相同的结果即:

{θ0=θ0αmi=1m(hθ(x(i))y(i))θj=θjαm[i=1m(hθ(x(i))y(i))xj(i)+λθj]=θj(1αλm)αmi=1m(hθ(x(i))y(i))xj(i)\begin{cases} \theta_0 = \theta_0 - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})\\ \theta_j = \theta_j - \frac{\alpha}{m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \lambda \theta_j] = \theta_j(1 - \frac{\alpha\lambda}{m}) - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} \end{cases}

二、神经网络

1. 问题描述

输入层(Input Layer):已知m组数据x(1),x(2),...,x(m)x^{(1)}, x^{(2)}, ..., x^{(m)},每组数据表示n个特征,可写为一个n+1维的向量
即:(x(i))T=(x0(i),x1(i),...,xn(i))(x^{(i)})^T = (x^{(i)}_0, x^{(i)}_1, ..., x^{(i)}_n),其中,x0(i)=1x^{(i)}_0=1

隐层(Hidden Layer):介于输入层和输出层之间,每个隐层的每个结点接收上一个隐层(或输入层)的信号,经过一定处理后得到新的信号并传递给下一个隐层(或输出层)

输出层(Output Layer):接受最后一个隐层的信号,经过加权处理后输出y(i)y^{(i)}。在多元分类问题中,向量y(i)y^{(i)}的维度就是所需要区分的类别的数量。

2. 前向传播(Forward Propagation)

我们用zi(j)z_i^{(j)}表示第jj层的第ii个结点接收到的前一层的值加权后的总和,ai(j)a_i^{(j)}表示第jj层的第ii个结点的输出,矩阵Θ(j)\Theta^{(j)}表示从第jj层到第j+1j+1层的权值,行数为j+1j+1层的节点数,列数为jj层的节点数+1(存在常数固定层,可看作激活阈值),即

zi(j+1)=k=0j层的结点数Θi,k(j)akjz_i^{(j+1)} = \sum_{k=0}^{第j层的结点数} \Theta_{i, k}^{(j)} a_k^j

ai(j+1)=g(zi(j+1))a_i^{(j+1)} = g(z_i^{(j+1)})

写成矩阵形式,则有 a(j+1)=g(Θ(j)a(j)) a^{(j+1)} = g( \Theta^{(j)} a^{(j)} )

于是我们可以写出神经网络的假设hθ(x(i))=g(Θ(L1)a(L1)))h_\theta(x^{(i)}) = g( \Theta^{(L-1)} a^{(L-1)} )),其中LL为神经网络的层数。

3. 反向传播(Back Propagation)

3.1 定义损失函数

有了假设,我们想要优化现有的模型,就需要对原有参数进行梯度下降,需要定义损失函数J(Θ)J(\Theta),并对每一个参数即Θi,k(j)\Theta_{i, k}^{(j)}求偏导数J(Θ)Θi,k(j)\frac{\partial J(\Theta)}{\partial \Theta_{i, k}^{(j)}}

于是我们有预测值hθ(x)=a(L)h_\theta(x) = a^{(L)},真实值yy,第jj层的节点数为sjs_j,则有

每个样本的均方误差 E=12i=1sL(ai(L)yi)2E = \frac{1}{2} \sum_{i=1}^{s_L} (a_i^{(L)} - y_i)^2

损失函数J(Θ)=1mi=1mE(i)J(\Theta) = \frac{1}{m} \sum_{i=1}^m E^{(i)}

损失函数对参数的偏导数J(Θ)Θ(j)=1mi=1mE(i)Θ(j)\frac{\partial J(\Theta)}{\partial \Theta^{(j)}} = \frac{1}{m} \sum_{i=1}^m \frac{\partial E^{(i)}}{\partial \Theta^{(j)}}

3.2 引入链式求导法

我们想要直接求EEΘi,k(j)\Theta_{i, k}^{(j)}的偏导数不太容易,因为我们的预测值是前面一步一步传递过来的,离输出层越远,EEΘi,k(j)\Theta_{i, k}^{(j)}的关系就越复杂。但是其中项之间的关系简单,偏导数易求,所以我们可以通过链式求导法则,由中间项之间的偏导数累乘得到EEΘi,k(j)\Theta_{i, k}^{(j)}的偏导数。

对输出层的参数,则有EΘi,k(L1)=Eai(L)ai(L)zi(L)zi(L)Θi,k(L1) \frac{\partial E}{\partial \Theta_{i, k}^{(L-1)}} = \frac{\partial E}{\partial a_i^{(L)}} \frac{\partial a_i^{(L)}}{\partial z_i^{(L)}} \frac{\partial z_i^{(L)}}{\partial \Theta_{i, k}^{(L-1)}}

其中,Eai(L)=ai(L)yi,ai(L)zi(L)=g(zi(L))=ai(L)(1ai(L)),zi(L)Θi,k(L1)=ak(L1)\frac{\partial E}{\partial a_i^{(L)}} = a_i^{(L)} - y_i, \frac{\partial a_i^{(L)}}{\partial z_i^{(L)}} = g'(z_i^{(L)}) = a_i^{(L)}(1 - a_i^{(L)}), \frac{\partial z_i^{(L)}}{\partial \Theta_{i, k}^{(L-1)}} =a_k^{(L-1)}

EΘi,k(L1)=(ai(L)yi)ai(L)(1ai(L))ak(L1) \frac{\partial E}{\partial \Theta_{i, k}^{(L-1)}} = (a_i^{(L)} - y_i) a_i^{(L)}(1 - a_i^{(L)}) a_k^{(L-1)}

我们将Ezi(L)=Eai(L)ai(L)zi(L)=(ai(L)yi)ai(L)(1ai(L))\frac{\partial E}{\partial z_i^{(L)}} = \frac{\partial E}{\partial a_i^{(L)}} \frac{\partial a_i^{(L)}}{\partial z_i^{(L)}} = (a_i^{(L)} - y_i) a_i^{(L)}(1 - a_i^{(L)}) 记作输出层的误差(error)为δi(L)\delta_i^{(L)},即

δ(L)=(a(L)y).g(z(L))\delta^{(L)} = (a^{(L)} - y) .* g'(z^{(L)})
(存疑,视频中取的δ(L)=a(L)y\delta^{(L)} = a^{(L)} - y)

于是我们用δ(l)\delta^{(l)}表示均方误差EE对第llzz的偏导

3.3 矩阵形式

矩阵/向量/标量之间求导参考:机器学习中的数学理论1:三步搞定矩阵求导

我们希望得到EE对结果层参数Θ(L1)\Theta^{(L-1)}的偏导数,即标量对矩阵的求导,使用分母布局,得到与Θ(L1)\Theta^{(L-1)}相同维度的矩阵,方便减法运算作梯度下降。

由链式求导法则,有

EΘ(L1)=Ez(L)z(L)Θ(L1) \frac{\partial E}{\partial \Theta^{(L-1)}} = \frac{\partial E}{\partial z^{(L)}} \frac{\partial z^{(L)}}{\partial \Theta^{(L-1)}}

由于Ez(L)=δ(L)\frac{\partial E}{\partial z^{(L)}} = \delta^{(L)}

z(L)=Θ(L1)a(L1)z^{(L)} = \Theta^{(L-1)} a^{(L-1)},则有z(L)Θ(L1)=Θ(L1)α(L1)Θ(L1)=(α(L1))T\frac{\partial z^{(L)}}{\partial \Theta^{(L-1)}} = \frac{\partial \Theta^{(L-1)} \alpha^{(L-1)}}{\partial \Theta^{(L-1)}} = (\alpha^{(L-1)})^T(使用分母布局)

综上所述,EΘ(L1)=δ(L)(α(L1))T \frac{\partial E}{\partial \Theta^{(L-1)}} = \delta^{(L)} (\alpha^{(L-1)})^T

记均方误差EEΘ(j)\Theta^{(j)}的偏导为Δ(j)\Delta^{(j)},则有Δ(L1)=δ(L)(α(L1))T \Delta^{(L-1)} = \delta^{(L)} (\alpha^{(L-1)})^T

3.3 推导递推公式

已知δ(l1)=Ez(l1)\delta^{(l-1)} = \frac{\partial E}{\partial z^{(l-1)}},那么

δ(l1)=Ez(l)z(l)z(l1)=δ(l)z(l)a(l1)a(l1)z(l1)=(Θ(l1))Tδ(l).g(z(l1))\delta^{(l-1)} = \frac{\partial E}{\partial z^{(l)}} \frac{\partial z^{(l)}}{\partial z^{(l-1)}} = \delta^{(l)} \frac{\partial z^{(l)}}{\partial a^{(l-1)}} \frac{\partial a^{(l-1)}}{\partial z^{(l-1)}} = (\Theta^{(l-1)})^T \delta^{(l)} .* g'(z^{(l-1)})

δ(l1)=(Θ(l1))Tδ(l).g(z(l1))\delta^{(l-1)} = (\Theta^{(l-1)})^T \delta^{(l)} .* g'(z^{(l-1)}) ,这就是误差反向传导的递推公式

z(l1)Θ(l1)=(a(l1))T\frac{\partial z^{(l-1)}}{\partial \Theta^{(l-1)}} = (a^{(l-1)})^T 同理

Δ(l1)=EΘ(l1)=δ(l)(a(l1))T\Delta^{(l-1)} = \frac{\partial E}{\partial \Theta^{(l-1)}} = \delta^{(l)} (a^{(l-1)})^T

3.4 小结

记损失函数对Θ(l)\Theta^{(l)}的偏导数为D(l)=J(Θ)Θ(l)D^{(l)} = \frac{\partial J(\Theta)}{\partial \Theta^{(l)}},则有

Di,j(l)=1mmΔi,j(l)=1mmδi(l)aj(l1)D_{i, j}^{(l)} = \frac{1}{m} \sum^m \Delta_{i, j}^{(l)} = \frac{1}{m} \sum^m \delta_i^{(l)} a_j^{(l-1)}

若引入正则化项,则有

Di,j(l)=1mmΔi,j(l)=1mmδi(l)aj(l1)+λΘi,j(l)D_{i, j}^{(l)} = \frac{1}{m} \sum^m \Delta_{i, j}^{(l)} = \frac{1}{m} \sum^m \delta_i^{(l)} a_j^{(l-1)} + \lambda \Theta_{i, j}^{(l)}

三、机器学习诊断法

1. 问题描述

我们需要评估我们训练出来的模型,判断是否过拟合,即高方差(variance),还是欠拟合,即高偏差(bias)。通常情况下,我们有许多方式去改进模型,但是不知道应该选哪一种。我们将讨论各个参数与偏差、方差的关系,帮助我们确定模型是处于高方差还是高偏差,应该怎样采取调整策略。

2.讨论变量

我们将遵循同一分布的数据集划分为训练集和验证集,训练集用来训练得到某一变量在不同值下的模型,由验证集对该变量进行选择。

记训练集误差为Jtrain(θ)J_{train}(\theta),验证集误差为Jcv(θ)J_{cv}(\theta)

我们选择测试集误差最小的模型作为结果

但是,要如何验证我们模型的泛化能力?即模型对不同但具有相似分布的数据集(测试集)的表现。

所以我们一开始将数据集划分为训练集、验证集和测试集,由验证集对变量进行选择,由测试集对模型的泛化能力进行评估,不能将测试集用于调整参数,否则会导致过拟合

2.1 特征数dd

我们记参数的多项式次数(相当于特征数)为d

当特征数过少时,训练集误差Jtrain(θ)J_{train}(\theta)和验证集误差Jcv(θ)J_{cv}(\theta)都很大,模型欠拟合;
当特征数过多时,训练集误差Jtrain(θ)J_{train}(\theta)很小,而验证集误差Jcv(θ)J_{cv}(\theta)较大,模型过拟合

2.2 正则化参数λ\lambda

λ\lambda很小时,训练集误差Jtrain(θ)J_{train}(\theta)很小,而验证集误差Jcv(θ)J_{cv}(\theta)较大,模型过拟合;
λ\lambda很大时,训练集误差Jtrain(θ)J_{train}(\theta)和验证集误差Jcv(θ)J_{cv}(\theta)都很大,模型欠拟合

2.3 数据集规模mm

我们将数据集规模mm与误差关系的曲线叫做学习曲线

在高偏差即欠拟合的情况下,随着数据集规模mm的增大,训练集误差将非常接近于验证集误差
在高方差即过拟合的情况下,随着数据集规模mm的增大,验证集误差能有效减小,说明在过拟合情况下,增大数据规模是有效的

3. 小结

当模型高方差时,我们可以选择:

  1. 增大数据集规模
  2. 减小特征数dd
  3. 增大正则化参数λ\lambda

当模型高偏差时,我们可以选择:

  1. 增加特征数dd
  2. 减小正则化参数λ\lambda