前言

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

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

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

一、正则化

1. 应用背景

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

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

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

2. 什么是正则化?

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

3. 线性回归中的正则化

3.1 梯度下降中的正则化

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

得到

那么有:

3.2 正规方程中的正则化

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

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

得到

,得

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

4. 逻辑回归中的正则化

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

二、神经网络

1. 问题描述

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

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

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

2. 前向传播(Forward Propagation)

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

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

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

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

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

3. 反向传播(Back Propagation)

3.1 定义损失函数

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

于是我们有预测值$h_\theta(x) = a^{(L)}$,真实值$y$,第$j$层的节点数为$s_j$,则有

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

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

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

3.2 引入链式求导法

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

对输出层的参数,则有$ \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)}}$

其中,$\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)} $

得$ \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)}$

我们将$\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)为$\delta_i^{(L)}$,即

$\delta^{(L)} = (a^{(L)} - y) .* g’(z^{(L)})$

(存疑,视频中取的$\delta^{(L)} = a^{(L)} - y$)

于是我们用$\delta^{(l)}$表示均方误差$E$对第$l$层$z$的偏导

3.3 矩阵形式

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

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

由链式求导法则,有

$ \frac{\partial E}{\partial \Theta^{(L-1)}} =
\frac{\partial E}{\partial z^{(L)}}
\frac{\partial z^{(L)}}{\partial \Theta^{(L-1)}}$

由于$\frac{\partial E}{\partial z^{(L)}} = \delta^{(L)}$,

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

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

记均方误差$E$对$\Theta^{(j)}$的偏导为$\Delta^{(j)}$,则有$ \Delta^{(L-1)} = \delta^{(L)} (\alpha^{(L-1)})^T$

3.4 推导递推公式

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

$\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)})
$

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

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

$\Delta^{(l-1)} = \frac{\partial E}{\partial \Theta^{(l-1)}} = \delta^{(l)} (a^{(l-1)})^T$

3.5 小结

记损失函数对$\Theta^{(l)}$的偏导数为$D^{(l)} = \frac{\partial J(\Theta)}{\partial \Theta^{(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)}$

若引入正则化项,则有

$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.讨论变量

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

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

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

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

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

2.1 特征数$d$

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

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

2.2 正则化参数$\lambda$

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

2.3 数据集规模$m$

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

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

3. 小结

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

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

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

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