Deep Learning Note: 2-2 正则化

  解决过拟合问题的主要方法是使用正则化(Regularization)和获取更多数据,但并不是总能获取到更多的数据,或者获取更多数据的成本过高,因此通常首选使用正则化。

1. 逻辑回归的正则化

  首先以逻辑回归为例,说明正则化的过程。逻辑回归的代价函数为:

\begin{equation}
J(w, b) = \frac{1}{m} \sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)}) \tag{1}
\end{equation}

  式 (1) 中 $w$ 为权重,是一个 $n_x \times 1$ 的向量,即 $w \in \mathbb{R}^{n_x}$,$n_x$ 为特征数量。$b$ 为偏置,是一个实数,即 $b \in \mathbb{R}$。

  应用正则化的方法是,为代价函数额外加上一项 $\frac{\lambda}{2m} \Vert w \Vert_2^2$,即:

\begin{equation}
J(w, b) = \frac{1}{m} \sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m} \Vert w \Vert_2^2 \tag{2}
\end{equation}

  式 (2) 中,$\lambda$ 为正则化系数,$\Vert w \Vert_2$ 为向量 $w$ 的欧几里得范数(Euclidean Norm),也称为 L2 范数,是向量元素平方和再开平方:

\begin{equation}
\Vert w \Vert_2 = \sqrt{\sum_{j=1}^{n_x} w_j^2} = \sqrt{w^Tw} \tag{3}
\end{equation}

  式 (2) 中使用平方的形式:

\begin{equation}
\Vert w \Vert_2^2 = \sum_{j=1}^{n_x} w_j^2 = w^Tw
\end{equation}

  因此式 (2) 所示的正则化方法称为 L2 正则化(L2 Regularization),是最常见的正则化方法。

  注意是 (2) 中只增加了关于 $w$ 的项,而没有增加关于 $b$ 的项,例如:

\begin{equation}
J(w, b) = \frac{1}{m} \sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m} \Vert w \Vert_2^2 + \frac{\lambda}{2m}b^2
\end{equation}

  实际上,也可以像上式那样,添加关于 $b$ 的项 $\frac{\lambda}{2m}b^2$。$w$ 通常是一个非常高维的向量,它对模型的高方差问题做出了主要“贡献”,而 $b$ 只是一个实数,对模型的影响较小。因为几乎所有的参数都集中在 $w$ 中,即便像上式那样加上关于 $b$ 的项,它的影响也微乎其微,所以通常省略关于 $b$ 的项,只对 $w$ 进行正则化。

  此外,还有 L1 正则化,它在代价函数后添加 $\frac{\lambda}{2m} \Vert w \Vert_1$ 一项,其中 $\Vert w \Vert_1$ 为向量 $w$ 的 L1 范数,即向量元素绝对值之和:

\begin{equation}
\Vert w \Vert_1 = \sum_{j=1}^{n_x} \vert w \vert \tag{4}
\end{equation}

  使用 L1 正则化可以让 $w$ 变得稀疏,即有很多项为 0,有观点认为这有利于压缩模型的大小,存储模型所需的内存更少,但在实际应用中,其压缩的作用并不明显,

  至于正则化参数 $\lambda$,它是一个超参数,其值可以通过开发集来选择,即尝试不同的值,在开发集上比较其性能,选择最佳值。$\lambda$ 较大时,$w$ 会倾向于较小,有助于降低拟合;当 $\lambda$ 较小时,$w$ 会倾向于较大,有助于提高拟合。

2. 神经网络的正则化

  在神经网络中,代价函数为:

\begin{equation}
J(W^{[1]}, b^{[1]}, …,W^{[L]}, b^{[L]}) = \frac{1}{m} \sum_{i=1}^m L(\hat{y}^{(i)}, y^{(i)}) + \frac{\lambda}{2m} \sum_{l=1}^{L}\Vert W^{[l]} \Vert_F^2 \tag{5}
\end{equation}

  其中 $L$ 为网络层数,$\Vert W^{[l]} \Vert_F$ 为 $W^{[l]}$ 的 F-范数,即 Frobenius 范数,是矩阵元素的平方和再开平方。$W^{[l]}$ 是一个 $n^{[l]} \times n^{[l-1]}$ 的矩阵,因此有:

\begin{equation}
\Vert W^{[l]} \Vert_F = \sqrt{\sum_{i=1}^{n^{[l-1]}} \sum_{j=1}^{n^{[l]}} (W_{ij}^{[l]})^2} \tag{6}
\end{equation}

  式 (5) 中使用平方的形式:

\begin{equation}
\Vert W^{[l]} \Vert_F^2 = \sum_{i=1}^{n^{[l-1]}} \sum_{j=1}^{n^{[l]}} (W_{ij}^{[l]})^2
\end{equation}

  此时 $dW^{[l]}$ 除了从原来反向传播得到的项,也会多出一项 $\frac{\lambda}{m}W^{[l]}$:

\begin{equation}
dW^{[l]} = (原反向传播得到的项) + \frac{\lambda}{m}W^{[l]}
\end{equation}

  此时梯度下降对权重 $W^{[l]}$ 的更新为:

\begin{align}
W^{[l]} & := W^{[l]} – \alpha dW^{[l]} \\
& = W^{[l]} – \alpha [(原反向传播得到的项) + \frac{\lambda}{m}W^{[l]}] \\
& = (1 – \frac{\alpha \lambda}{m})W^{[l]} – \alpha(原反向传播得到的项)
\end{align}

  每次更新 $W^{[l]}$ 时,L2 正则化都让 $W^{[l]}$ 乘以一个略小于 1 的系数 $(1 – \frac{\alpha \lambda}{m}) $,使 $W^{[l]}$ 按比例缩小,因此 L2 正则化又称为权重衰减(Weight Decay)。

3. 正则化避免过拟合的原因

  正则化可以降低权重参数 $W$,使其趋向于 0,进而导致神经网络中的相关节点输出减小、对结果产生的影响降低,相当于使神经网络的有效结构变得更简单,降低网络拟合复杂函数的能力,不容易过拟合。对于过拟合的模型,通过逐步增大正则化参数 $lambda$,可以让模型逐步从过拟合向欠拟合移动,使用开发集找到某个适中的 $lambda$,达到期望的低偏差和低方差的结果。

  还可以从激活函数的角度来理解正则化避免过拟合的原因。例如使用如图 1 所示的 Tanh 作为激活函数:

图 1

图 1

  通过增大正则化参数 $lambda$,可以降低权重参数 $W^{[l]}$,由:

\begin{equation}
Z^{[l]} = W^{[l]}a^{[l-1]} + b^{[l]} \\
a^{[l]} = tanh(Z^{[l]})
\end{equation}

  可知 $Z^{[l]}$ 也会减小。由图 1 可见,当 Tanh 函数的输入较小时,Tanh 接近线性函数,因此该层接近于一个线性函数。即便对于很深的网络,如果每一层都是线性的,则整个网络也是线性的。通过增大正则化参数 $lambda$,可以使网络接近于线性,不容易拟合复杂的非线性函数,降低过拟合的风险。

4. Dropout

  Dropout 也是一种有效的正则化方法。举例来说,对于图 2 所示的网络:

图 2

图 2

  对于每一个训练样本,对于网络的每一层,以一个特定的概率随机移除一些节点。例如对于每一层,以 0.5 的概率移除其中的节点,此时得到的结果可能如图 3 所示:

图 3

图 3

  使用如图 3 这样的移除了部分节点的网络,进行当前一个样本的前向传播和反向传播。对于后续各个样本,都以特定概率随机移除原网络各层的节点,再进行前向传播和反向传播的计算。相当于每个样本的训练都使用了不同的、“缩水”的网络,也因此带来正则化的效果。

  Dropout 有多种实现方式,最常见的 Interted Dropout 实现方式为,给定第 l 层的保留节点的概率 keep_prob,计算:

d[l] = np.random.rand(a[l].shape[0], a[l].shape[1]) < keep_prob
a[l] = a[l].multiply(d[l])
a[l] /= keep_prob

  第 1 行计算一个与第 l 层激活值 a[l] 具有相同大小的矩阵 d[l],它的每一个元素有 keep_prob 的概率为 1,有 1 - keep_prob 的概率为 0。第 2 行更新 a[l] 为其与 d[l] 逐元素相乘的结果,即使用 d[l] 作为掩码,以 keep_prob 的概率设置 a[l] 中的元素为 0。第 3 行又更新 a[l] 为其与 keep_prob 相除的结果,这是因为在为以 keep_prob 的概率随机移除 a[l] 中的元素后,在后续计算 $Z^{[l+1]} = W^{[l+1]} a^{[l]} + b^{[l+1]}$ 时,$W^{[l+1]} a^{[l]}$ 的值也会相应缩小,为了避免这一情况,在随机移除节点后,再使用 a[l] /= keep_prob 将其缩放回原来的比例。因此该方法被称为 Interted Dropout。

  需要注意的是,如果使用向量化的实现方式,上面代码第 1 行计算的激活值掩码 d[l] 仅在每次迭代时会更新,对于某一次迭代的所有样本,使用的 d[l] 是相同的,移除的节点是相同的。即每次迭代中所有样本使用的网络是相同的,而不同迭代使用的网络是不同的。

  不同层可以使用不同的节点保留概率 keep_prob,例如对于节点数很多层,有较大的概率发生过拟合,可以使用较低的 keep_prob,移除更多的节点。对于节点数较少的层,可以使用较大的 keep_prob,甚至令 keep_prob 为 1,即保留所有节点。通常会将输入层的 keep_prob 设置为 1 或接近于 1,尽量保留所有的输入特征。为不同层设置不同 keep_prob 更加灵活,但缺点是引入了更多的超参数。

  在测试时,不要使用 Dropout,因为 Dropout 的随机性会带来额外的噪声,干扰预测结果。如果一定要使用 Dropout,则可以多次计算移除不同节点的预测结果,取平均值,但这样做计算量更大,且结果和不使用 Dropout 差别不大。如果使用了 Interted Dropout,将各层保留概率(keep_prob)设置为 1,即可保留所有节点。

5. 理解 Dropout

  Dropout 通过随机地移除网络中的节点,使得网络变得更简单,更不容易拟合复杂函数。此外还可以从另一个角度理解 Dropout。

  对于网络中的某一个节点 N,它接受前一层各节点的输出,分别乘以对应的权重,然后输出自己的结果。当使用了 Dropout 时,由于任一节点都可能被移除,对于前述节点 N,其任一输入都可能被移除,则节点 N 的输出不能依赖于任一个特定输入,其权重会倾向于分散到各个输入,而不是集中在某一个输入上。权重的分散有利于降低权重的F-范数,就像 L2 正则化一样,可以避免过拟合。Dropout 可以看做是一种自适应的 L2 正则化。

  Dropout 最早成功应用于计算机视觉领域,因为该领域的输入,比如图像,通常非常大。Dropout 本质上是解决过拟合问题的方法,在其他领域,如果算法不存在过拟合,则不需要使用 Dropout。

  使用 Dropout 的一个缺点是会影响代价函数的定义。因为每次迭代都会随机移除不同的节点,代价函数不再能真实地反映整个模型的性能。在 Debug 时,可以先禁用 Dropout,比如设置节点保留概率(keep_prop)为 1,绘制代价函数随迭代次数变化的图像,确认代价函数的值随迭代次数的增加而单调下降,算法及其实现没有问题,可以收敛;然后再启用 Dropout,解决过拟合问题。

6. 其他正则化方法

  除了前面提到的 L2 正则化和 Dropout,还有其他一些方法可以降低过拟合。

6.1. 数据扩充

  获取更多数据是解决过拟合问题的有效途径,但有时无法获取更多数据,或者候获取数据的代价很大,此时可以尝试通过数据扩充(Data Augmentation),从现有数据中生成新的数据。例如对于图像识别的场景,可以将现有训练图片通过翻转、裁剪、旋转、变形、引入失真、添加噪声等方式,生成新的图片用于训练。虽然这些图片并没有引入多少额外的信息,但这样做的成本很低,并能在一定程度上降低过拟合。例如将图片水平翻转,相当于告诉算法,同一个物体水平转后还是该物体。

6.2. 提前终止

  在梯度下降过程中,训练集错误率或代价函数应随迭代次数单调递减,而开发集错误率通常会先随迭代次数下降,然后随迭代次数上升,如图 4 所示。

图 4

图 4


  
  提前终止(Early Stopping)指的是,在梯度下降的过程中,找到合适的开发集错误率和训练集错误率(或代价函数),在该次循环处终止训练,如图 4 中的绿点。因为通常会把权重 $W$ 初始化为接近 0 的随机数,在训练早期,$W$ 的值较小。随着迭代次数提升,$W$ 会逐渐变大。通过在提前终止训练,可以得到大小适中的 $W$,此时 $W$ 的 F-范数也适中,类似于 L2 正则化,可以避免过拟合。

  提前终止的优点是只需进行一次梯度下降过程,就相当于比较了不同大小的 $W$ 的影响,没有额外的超参数(如 L2 正则化的参数 lambda)。

  机器的学习过程涉及众多的参数和超参数,通过将其分解成若干个正交的步骤,可以简化训练过程。所谓正交的步骤,指的是连个步骤互不影响。例如在训练过程中,首先优化代价函数,如使用梯度下降,获得最佳参数;然后解决过拟合问题,如使用正则化、获取更多数据。优化代价函数和解决过拟合这两个问题是完全独立、互不影响的,可以独立解决,而不用担心在解决了一个问题后会影响另一个问题,这种解决问题的方式称为正交化(Orthogonalization)。

  提前终止的缺点是,相当于尝试一次性解决优化代价函数和解决过拟合两个问题,提前终止训练会影响对代价函数的优化,同时降低模型过拟合的可能性,在解决其中一个问题的同时会影响到另一个问题,带来更大的复杂度。另一方面,使用 L2 正则化并训练尽可能长的时间,可以更系统地搜索不同的超参数,但会引入额外的超参数 $\lambda$,计算量也较大。