\[ \begin{align}\begin{aligned}\newcommand{\ba}{\boldsymbol{a}} \newcommand{\bb}{\boldsymbol{b}} \newcommand{\be}{\boldsymbol{e}} \newcommand{\bw}{\boldsymbol{w}} \newcommand{\bx}{\boldsymbol{x}} \newcommand{\by}{\boldsymbol{y}} \newcommand{\bz}{\boldsymbol{z}} \newcommand{\bd}{\boldsymbol{d}} \newcommand{\bv}{\boldsymbol{v}} \newcommand{\bs}{\boldsymbol{s}}\\\newcommand{\btheta}{\boldsymbol{\theta}} \newcommand{\bbeta}{\boldsymbol{\beta}} \newcommand{\bgamma}{\boldsymbol{\gamma}} \newcommand{\bsigma}{\boldsymbol{\sigma}} \newcommand{\md}{\mbox{d}} \newcommand{\bmu}{\boldsymbol{\mu}} \newcommand{\bone}{\boldsymbol{1}} \newcommand{\trans}{^{\rm\scriptsize T}} \newcommand{\var}{\mathrm{var}}\\\newcommand{\bA}{\boldsymbol{A}} \newcommand{\bB}{\boldsymbol{B}} \newcommand{\bC}{\boldsymbol{C}} \newcommand{\bD}{\boldsymbol{D}} \newcommand{\bI}{\boldsymbol{I}} \newcommand{\bM}{\boldsymbol{M}} \newcommand{\bW}{\boldsymbol{W}} \newcommand{\bX}{\boldsymbol{X}} \newcommand{\bY}{\boldsymbol{Y}} \newcommand{\bZ}{\boldsymbol{Z}} \newcommand{\cotp}{\textcolor{ #30D158FF }{TP}} \newcommand{\cotn}{\textcolor{#64D2FFFF}{TN}} \newcommand{\cofp}{\textcolor{#5E5CE6FF}{FP}} \newcommand{\cofn}{\textcolor{#BF5AF2FF}{FN}}\\\newcommand{\numcotp}{\textcolor{ #30D158FF }{50}} \newcommand{\numcotn}{\textcolor{#64D2FFFF}{30}} \newcommand{\numcofp}{\textcolor{#5E5CE6FF}{10}} \newcommand{\numcofn}{\textcolor{#BF5AF2FF}{10}}\end{aligned}\end{align} \]

模型分析#

\(\hspace{1.5em}\) 在前一章中,我们已经对全连接神经网络进行了较为细致的介绍。当我们在介绍全连接神经网络时,我们主要讨论了两类参数。第一类为模型参数(model parameter),其可理解为模型内部的配置变量,可通过训练样本进行估计或者学习;每个神经元对应的偏置项和权重项可以通过梯度下降法进行迭代更新,其是典型的模型参数。第二类参数为模型的超参数(hyper-parameter),其可理解为模型外部的配置,不能通过训练样本进行梯度下降法学习得到,而需要由我们人工设置;模型结构、学习率和梯度算法等属于典型的超参数1在传统的统计模型中,超参数往往对应于“调节参数”(tuning parameter)。。下面,我们简单介绍神经网络模型中常见的超参数。

神经网络模型的部分超参数

  1. 学习率:\(\alpha\)

  2. 神经网络模型的层数:\(L\)

  3. 每层所包含的神经元个数:\(d^{[l]}\)

  4. 梯度下降算法,

  5. 梯度算法所对应的最大迭代次数,

  6. 小批量梯度算法每步更新所包含的样本个数。

  7. RMSprop或者Adam中的超参数。

\(\hspace{1.5em}\) 模型的超参数决定了模型的“结构”,而模型的参数决定了模型了计算结果。不同的超参数对应着不同的神经网络模型,本章所讨论的内容为如何有效选择超参数,进而得到一个表现优良的全连接神经网络。需要指出的是,尽管我们基于全连接神经网络讨论相关概念,但本章所涉及的分析过程广泛适用于其他深度学习模型。在本章中,我们将简要介绍模型分析或者模型诊断的若干方法以及一些实际的建议。

偏差-方差分析#

\(\hspace{1.5em}\) 在介绍超参数选择前,我们首先需要讨论统计学中两个经典概念,即偏差(Bias)2请不要与模型的偏置项相混淆。模型的偏置项指的是线性部分的截距项。与方差(Variance)。 记 \(\bx\) 为特征向量,其对应的观测标签为 \(y\)。为了介绍本节中所涉及的基本概念,我们记 \(y_t\) 为特征向量 \(\bx\) 对应的真实标签。在回归问题中,观测标签和真实标签的关系可以理解为:\(y_t = E(y\mid \bx)\),即真实标签可以认为是关于特征向量 \(\bx\) 的一个函数。基于训练集 \(S=\{(\bx_i,y_i):i=1,\ldots,n\}\),记 \(\hat{y}\) 为真实标签 \(y_t\) 的一个估计量 3估计量 \(\hat{y}\) 也是特征向量 \(\bx\) 的一个函数。。则该估计量的偏差方差分别为

\[\begin{split}\begin{eqnarray} \mbox{Bias}(\hat{y}) &=& E_S(\hat{y})-y_t\\ \mbox{Variance}(\hat{y}) &=& E_S\{\hat{y}-E_S(\hat{y})\}^2 \end{eqnarray}\end{split}\]

其中,\(E_S(\cdot)\) 为针对训练集 \(S\) 的随机机制的期望。我们默认偏差和方差都是关于特征向量 \(\bx\) 的函数。

线性回归

\(\hspace{1.5em}\) 例如,在线性回归中,对应于特征向量的观测标签为 \(y=b_0 + w_0x + \epsilon\),其真实标签为 \(y_t=b_0 + w_0x\)。基于样本 \(S=\{(x_i,y_i):i=1,\ldots,n\}\),对真实标签 \(y_t\) 的一个估计量为 \(\hat{y} = \hat{b} + \hat{w}x\)。由于 \(E_S(\hat{b}_0)=b_0\) 以及 \(E_S(\hat{w}_0)=w_0\),估计量 \(\hat{y}\) 的偏差为0,其方差可以通过回归参数估计量 \((\hat{b},\hat{w})\) 的方差求得。

\(\hspace{1.5em}\) 在传统的统计分析中,复杂的统计模型往往偏差较小而方差较大,即其更加倾向于对数据进行过拟合。相反,简单的统计模型往往偏差较大而方差较小,其更加倾向于对数据进行欠拟合。如何较好地权衡偏差与方差,进而得到一个表现优良的模型是我们在分析数据时经常遇到的一个问题。

岭回归

\(\hspace{1.5em}\) 例如,在岭回归(Ridge Regression)中,通过在损失函数中添加一个l2正则化项(也称为惩罚项)来限制线性模型的复杂度,放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价,获得更为符合实际、更可靠的回归系数,从而避免过拟合。岭回归关于模型参数 \(b\) 以及 \(\bw\) 的损失函数为

\[\sum_{i=1}^{n} (y_i - b - \bx_i\trans \bw)^2 + \lambda \sum_{j=1}^{d} w_j^2,\]

其中 \(\bx_i\in\mathbb{R}\)\(\bw\in\mathbb{R}^d\)\(\lambda\) 为调节参数。调节参数 \(\lambda\) 的取值平衡模型估计准确性(偏差,bias)与模型的复杂性(方差,variance)。\(\lambda\) 过大,模型趋于简单化,但会出现欠拟合的情况(即低方差高偏差,low variance high bias);相反,若 \(\lambda\) 过小,则潜在的无用变量将会出现在模型中,模型出现过拟合(即高方差低偏差,high variance low bias)。

\(\hspace{1.5em}\) 在传统的统计模型中,超参数的选择通常借助于交叉验证(cross validation)。交叉验证可提高模型评估的准确性以及泛化能力,且其具有多种变种(例如 \(k\) 折交叉验证或者留一交叉验证),提高了该方法的灵活性。但该方法也具有诸多缺点,例如较高的计算成本。大型神经网络模型往往对应成白上千万(甚至亿级)规模的参数量,这导致大模型的训练非常缓慢。此外,神经网络的超参数规模往往较大,我们无法通过交叉验证的方法对模型的超参数进行选取。

\(\hspace{1.5em}\) 在训练深度学习模型时,我们通常有如下三类数据集:

  1. 训练集(Training set)。该数据集主要用于训练不同超参数下的模型。

  2. 验证集(Validation set)。该数据集主要用于评价各个训练好的模型的表现。即计算模型的偏差与方差,或者模型的均方误差。

  3. 测试集(Test set)。测试集的目的为评判我们选择好的模型在真实场景下的表现,该类数据集不是我们在模型训练过程中必须要有的部分。

备注

\(\hspace{1.5em}\) 我们训练一个深度学习模型的目的往往为解决一类实际问题,我们希望训练得到的模型对该类问题的处理具有较为优良的表现。因此,我们希望验证集的数据分布尽可能与实际问题相似,也就是与测试集的分布尽可能相似。我们并不对模型训练集的分布做任何要求;但如果在相同样本量的前提下,训练集的分布与真实数据分布更为类似,我们训练得到的模型往往具有更好的表现。

\(\hspace{1.5em}\) 在传统的统计模型中,我们常用五折交叉验证对调节参数进行选择。对于每一折验证过程,我们通常利用80%的数据对模型进行训练,而基于剩下20%的数据对模型的表现进行评估。在这个过程中,80%的数据集可被视作训练集,20%的数据集可被视为验证集。在五折交叉验证时,整个验证过程需要独立进行五次,每次对应不同的训练集与测试集。对于深度学习模型的训练,我们只有一个训练集与验证集。由于深度学习模型的参数规模较大,训练集的规模可能非常大,而验证集则规模较小。例如,这两个集合的样本量的规模可以为99:1,甚至更高。

备注

\(\hspace{1.5em}\) 对应于特定的实际问题,我们希望训练得到一个偏差与方差都比较小的模型。然而,由于真实数据和神经网络模型的复杂性,我们可能得到一个偏差和方差都很大的模型,这个模型是我们需要避免的。

\(\hspace{1.5em}\) 正如前文所述,一个特定的神经网络模型往往需要权衡偏差和方差。在我们处理实际问题时,我们首先要控制偏差,在这个基础上再对方差进行控制。由于较为简单的模型往往具有较大的偏差,我们在模型选择时,往往考虑较为复杂的神经网络模型(例如具有较多层数的神经网络)。为了降低模型的方差,即复杂性,我们可以利用一些正则化方法等。此外,我们往往还可以通过增加训练集和验证集的样本量来降低偏差和方差。

正则化#

\(\hspace{1.5em}\) 正则化是神经网络模型较为常见的方法,该方法对降低模型复杂性,进而降低模型的方差具有较为显著的作用。在本节中,我们主要讨论如下几类经典的正则化方法。

  1. \(l_2\) 正则化

  2. Dropout

  3. 早停

\(l_2\) 正则化#

\(\hspace{1.5em}\) 我们已经在岭回归中简单讨论过了 \(l_2\) 正则化。其核心思想是通过在模型的损失函数中添加一个额外的惩罚项来防止模型过拟合,从而提升模型的泛化能力。这个惩罚项是模型所有权重参数的平方和与一个调节参数的乘积,该调节参数是一个非负的超参数,用于控制正则化的强度。在实际应用中,\(l_2\) 正则化能够有效地减小模型参数的幅度,使得模型更加平滑,降低了模型的复杂度,进而提高了模型在新数据上的表现能力。

\(\hspace{1.5em}\) 从数学的角度来看,\(l_2\) 正则化相当于为模型的参数施加了一个高斯先验分布,这有助于引导模型参数向更小的值收敛,避免了参数过大导致的过拟合问题。同时,\(l_2\) 正则化还具有提高数值计算稳定性的优点,使得模型在训练过程中更加稳健。

\(\hspace{1.5em}\) \(l_2\) 正则化的形式一般为

\[\mathcal{J}_2 = \frac{\lambda}{2n}\sum_{l=1}^L\lVert\bW^{[l]}\rVert_F^2,\]

其中,\(\lVert\bW\rVert_F=(\sum_i\sum_j w_{ij}^2)^{1/2}\) 为矩阵 \(\bW=(w_{ij})\) 的 Frobenius 范数。该范数衡量了矩阵与零矩阵的距离,类似于二维平面上点到原点的欧几里得距离。需要指出的是,我们只对权重项 \(\{\bW^{[l]}:l=1,\ldots,L\}\) 施加惩罚。对于后向传播,该损失对权重矩阵的导数为

\[\frac{\partial \mathcal{J}_2}{\partial \bW^{[l]}} = \frac{\lambda}{n}\bW^{[l]}。\]

\(l_1\) 正则化

\(\hspace{1.5em}\) \(l_1\) 正则化是指在损失函数的基础上,加上所有权重参数的绝对值之和(乘以一个调节参数),用于惩罚参数过大,促使模型更加稀疏化。\(l_1\) 正则化在机器学习和深度学习中有着广泛的应用,特别适用于那些需要特征选择的问题。例如,在文本分类、基因选择等场景中,\(l_1\) 正则化能够有效地剔除那些不重要的特征,提高模型的准确性和可解释性。\(l_1\) 正则化和 \(l_2\) 正则化都是常用的正则化方法,它们的主要区别在于惩罚项的不同。\(l_2\) 正则化是在损失函数的基础上加上所有权重参数平方的和(乘以一个调节参数),用于惩罚参数过大,使模型更加平滑。相比之下,\(l_1\) 正则化更容易产生稀疏解,而 \(l_2\) 正则化则保留了更多的参数,使其更加连续和稳定。在实际应用中,选择哪种正则化方法需要根据具体的问题与实验结果来决定。

\(\hspace{1.5em}\) \(l_1\) 正则化的形式一般为

\[\mathcal{J}_1 = \frac{\lambda}{n}\sum_{l=1}^L\lVert\bW^{[l]}\rVert_1,\]

其中,\(\lVert\bW\rVert_1=\sum_i\sum_j \lvert w_{ij}\rvert\) 为矩阵 \(\bW=(w_{ij})\)\(l_1\) 范数,即各个元素绝对值加和。对于后向传播,该损失对权重矩阵的导数为

\[\frac{\partial \mathcal{J}_1}{\partial \bW^{[l]}} = \frac{\lambda}{n}\mbox{sign}(\bW^{[l]}),\]

其中,\(\mbox{sign}(\bW^{[l]})\) 的矩阵规模与 \(\bW^{[l]}\) 相同,其每个元素为 \(\bW^{[l]}\) 中相应元素的符号。需要指出的是,\(l_1\) 范数并不是对 \(\bW^{[l]}\) 完全可导的。但不失一般性,我们可以将对应分量在0处的导数定义为1或者-1。

Dropout#

\(\hspace{1.5em}\) Dropout是一种在训练深度学习模型时常用的正则化技术,它的核心思想是在训练过程中随机地“丢弃”(即设置为0)神经网络每个隐藏层中的一部分神经元,以此来减轻模型对训练数据的过拟合现象。需要指出的是,输入输出层不进行Dropout操作。Dropout通过阻止(包括隐藏层在内的)特征过拟合来提高神经网络的泛化能力,因为它使得神经网络不能依赖于特定的一小部分神经元,而是必须学习更稳健的特征。

\(\hspace{1.5em}\) 具体来说,在训练阶段,对于第 \(l\) 层(\(l=1,\ldots,L-1\))的输出,Dropout会按照一个给定的概率 \(p^{[l]}\in(0,1)\) 随机地将一部分神经元的激活值设置为0,这意味着这些神经元在当前的前向传播和反向传播中都不会参与计算。但是它们的输出需要按照Dropout概率进行缩放,以补偿训练时丢失的激活值。而在测试阶段,则不会使用Dropout。

\(\hspace{1.5em}\) 下图展示了一个具有两个隐藏层的神经网络模型对应的Dropout结果,其中 \(\bx\) 为某特征向量。在该网络中,第一(隐藏)层具有 \(d^{[1]}=6\) 个神经元,第二(隐藏)层具有 \(d^{[2]}=4\) 个神经元,第三层为输出层,具有 \(d^{[3]}=1\) 个神经元。每层Dropout概率为 \(p^{[1]} = p^{[2]}=0.5\)。需要指出的是,不同隐藏层往往对应不同的Dropout概率,而这个概率值也是模型的超参数之一。

\(\hspace{1.5em}\) 在前向和后向传播中,我们通常利用掩码矩阵实现Dropout。正如我们在多层神经网络中所提及的,记 \(\bA^{[l]}\in\mathbb{R}^{n\times d^{[l]}}\) 为第 \(l\)(隐藏)层的激活结果,其中 \(n\) 为样本量,\(d^{[l]}\) 为该层神经元个数。需要指出的是,\(\bA^{[l]}\) 是第 \((l+1)\) 层的输入。我们已令 \(p^{[l]}\) 为第 \(l\) (隐藏)层的Dropout概率。我们首先生成一个规模与 \(\bA^{[l]}\) 相同的掩码矩阵 \(\bM^{[l]}\in\{0,1\}^{n\times d^{[l]}}\)。具体地讲,掩码矩阵 \(\bM^{[l]}\) 的每个元素均是成功概率为 \(1-p^{[l]}\) 的伯努利分布。记 \(m_{ij}^{[l]}\) 为掩码矩阵 \(\bM^{[l]}\) 的第 \(i\) 行、第 \(j\) 列元素;\(m_{ij}^{[l]}=0\) 说明对于第 \(i\) 个样本而言,其第 \(j\) 个神经元被Dropout,否则该神经元被保留。则Dropout过程的数学表达为

\[\bA^{[l]}\circ \bM^{[l]},\]

其中 "\(\circ\)"为两个矩阵的Hadamard乘积,即两个矩阵对应元素相乘。从以上的计算可见,尽管我们用的是Dropout(即丢弃),我们实际上并没有改变神经网络的结构,而是将被Dropout的神经元在所在层的输出通过掩码矩阵变成了0.

备注

\(\hspace{1.5em}\) 每个训练样本被Dropout的神经元可能不同。但对于神经网络的同一层而言,掩码矩阵的各个元素往往是独立同分布的。

\(\hspace{1.5em}\) 对于 \(\bA^{[l]}\) 中的每个元素而言,其具有 \(p^{[l]}\) 的概率被Dropout。为了弥补Dropout所带来的信息缺失,我们通常将Dropout之后的结果除以 \(1-p^{[l]}\) 作为该层的激活结果,即

(36)#\[\bA_d^{[l]} = \frac{\bA^{[l]}\circ \bM^{[l]}}{1-p^{[l]}}。\]

概率解释

\(\hspace{1.5em}\) 通过基本的概率运算,我们可知

\[E(\bA^{[l]}\circ \bM^{[l]}\mid \bA^{[l]}) = (1-p^{[l]})\bA^{[l]}。\]

因此,为了使输出信息不受Dropout所带来的影响,我们通常考虑()

\(\hspace{1.5em}\) 下面,我们深入讨论下Dropout对模型参数训练的影响。在多层神经网络中,我们已经讨论了多层神经网络的后向传播核心计算公式。当我们引入Dropout,并基于 \(\bA_d^{[l]}\) 进行前向传播时,其对应的后向传播公式为:

\[\begin{split}\begin{eqnarray} \mbox{d}\bZ_d^{[l]} &=& \mbox{d}\bA_d^{[l]}\circ {\sigma^{[l]}}'(\bZ_d^{[l]})\\ \mbox{d}\bW^{[l]} &=& \mbox{d}(\bZ_d^{[l]})\trans\bA_d^{[l]}\\ \mbox{d}\bb^{[l]} &=& \mbox{d}(\bZ_d^{[l]})\trans\bone\\ \mbox{d}\bA_d^{[l-1]} &=& \mbox{d}\bZ_d^{[l]}\bW^{[l]}。 \end{eqnarray}\end{split}\]

在上面的计算中,下角标"\(d\)"表示基于Dropout计算的结果。

回顾

\(\hspace{1.5em}\) 没有Dropout的全连接神经网络后向传播计算公式为:

\[\begin{split}\begin{eqnarray} \mbox{d}\bZ^{[l]} &=& \mbox{d}\bA^{[l]}\circ {\sigma^{[l]}}'(\bZ^{[l]})\\ \mbox{d}\bW^{[l]} &=& \mbox{d}(\bZ^{[l]})\trans\bA^{[l-1]}\\ \mbox{d}\bb^{[l]} &=& \mbox{d}(\bZ^{[l]})\trans\bone\\ \mbox{d}\bA^{[l-1]} &=& \mbox{d}\bZ^{[l]}\bW^{[l]}。 \end{eqnarray}\end{split}\]

早停#

\(\hspace{1.5em}\) 在深度学习模型的训练过程中,模型通常会随着训练的进行在训练集上的性能不断提高。然而,当模型对训练数据学习得过于充分时,可能会捕捉到训练数据中的噪声和特定特征,导致在验证集(或测试集)上的性能开始下降,即出现过拟合现象。早停技术通过监控模型在验证集上的性能,当发现性能不再提高或开始下降时,及时停止训练,从而避免过拟合。其核心思想是在模型训练过程中,当模型在验证集上的性能不再显著提高时,提前终止训练过程,以避免模型在训练集上过拟合,从而提高模型在未见过的数据上的泛化能力。

批量归一化(Batch Normalization)#

\(\hspace{1.5em}\) LeCun等(1998)指出4LeCun, Y., Bottou, L., Orr, G., and Muller, K. Efficient backprop. In Orr, G. and K., Muller (eds.), Neural Networks: Tricks of the trade. Springer, 1998b.,神经网络的训练对于白噪声式的输入(即均值为0,方差为1的输入)有更快的收敛速度。对于深度神经网络而言,较浅层模型参数的改变将改变较深(隐藏)层输入的数据分布,这将大幅降低神经网络的训练效率(比如需要选取很小的学习率以及对参数的初始化有着比较严格的要求)。换句话说,在训练过程中,前一层参数的变化会导致下一层输入的分布发生变化,这种变化被称为内部变量偏移(internal covariate shift)。为了解决内部变量偏移这个问题,Ioffe和Szegedy(2015)5Ioffe, S., and Szegedy, C.. "Batch normalization: Accelerating deep network training by reducing internal covariate shift." International Conference on Machine Learning. PMLR, 2015.提出了批量归一化(Batch Normalization; BN)算法。批量归一化旨在稳定和控制这种分布,从而加快收敛速度并提升性能。此外,通过归一化每层的输入,批量归一化帮助保持网络中的梯度流动稳定,这可以缓解梯度消失或梯度爆炸的问题。我们将对该算法及其前向传播和后向传播进行简单的介绍。

前向传播#

\(\hspace{1.5em}\) 批量归一化算法是针对神经网络每个神经元进行处理,其通常应用于线性变换(如全连接层或卷积层)之后,在激活函数之前。对于一个全连接神经网络而言,其第 \(l\) 层的运算过程为

\[\bZ^{[l]} =\bA^{[l-1]}(\bW^{[l]})\trans + (\bb^{[l]})\trans;\quad \bA^{[l]} = \sigma^{[l]}(\bZ^{[l]})。\]

在本节中,我们假设模型训练采取小批量梯度下降算法,故假设 \(\bZ^{[l]}\) 以及 \(\bA^{[l]}\) 的第一个维度为 \(m\)

\(\hspace{1.5em}\) 批量归一化算法对 \(\bZ^{[l]}\) 进行操作,其引入尺度参数(scale parameter) \(\bgamma\) 以及位置参数(location parameter) \(\bbeta\),该算法的前向传播计算过程如下:

(37)#\[\begin{split}\begin{eqnarray} \bZ^{[l]} &=&\bA^{[l-1]}(\bW^{[l]})\trans + (\bb^{[l]})\\ \textcolor{red}{\bmu^{[l]}}&=& m^{-1}(\bZ^{[l]})\trans\bone\\ \textcolor{red}{\bsigma^{2[l]}} &=& m^{-1}\sum_{i=1}^m\left(\bz_i^{[l]}-\bmu^{p[l]}\right)\circ\left(\bz_i^{[l]}-\bmu^{p[l]}\right)\\ \textcolor{red}{\tilde{\bz}_{i,norm}^{[l]}}&=&\frac{\bz_i^{[l]}-\bmu^{[l]}}{\sqrt{\bsigma^{2[l]}+\epsilon}}\\ \textcolor{RoyalBlue}{\tilde{\bz}_{i}^{[l]}}&=&\bgamma^{[l]}\circ\tilde{\bz}_{i,norm}^{[l]} + \bbeta^{[l]}\\ \textcolor{RoyalBlue}{\tilde{\bZ}^{[l]}} &=& (\tilde{\bz}_{1}^{[l]},\ldots,\tilde{\bz}_{m}^{[l]})\trans\\ \bA^{[l]} &=& \sigma^{[l]}(\tilde{\bZ}^{[l]}), \end{eqnarray}\end{split}\]

其中我们利用 Python 的广播机制处理矩阵和向量之间的二元运算。在 (37) 的相关计算中,标记颜色部分对应批量归一化算法,其中红色部分主要是对小批量训练样本特征的每个维度进行归一化处理,蓝色部分基于归一化的结果进行尺度和位置的相关变换。 批量归一化处理中,尺度参数 \(\bgamma\) 以及位置参数 \(\bbeta\) 是通过后向传播进行迭代更新的。

\(\hspace{1.5em}\) 批量归一化算法将激活前的线性变换结果的均值变为 \(\bbeta^{[l]}\),将对应的标准差变为 \(\bgamma^{[l]}\)。需要指出的时,由于我们首先对 \(\bZ^{[l]}\) 的每一列进行了归一化处理,原始参数 \(\bb^{[l]}\) 就没有存在的必要了。因此,批量归一化算法所涉及的模型参数为 \(\bW^{[l]}\)\(\bgamma^{[l]}\) 以及 \(\bbeta^{[l]}\)。经过归一化算法后,线性变换结果的分布将对模型前面各层的参数变得不太敏感,有助于提高模型的训练效率。

\(\hspace{1.5em}\) 为了进一步展示批量归一化的计算细节,我们将 (37) 中的红色部分(和第一步计算)细化为如下过程,这将有助于我们理解下一节中的后向传播算法。

(38)#\[\begin{split}\begin{eqnarray} \bZ^{[l]} &=& \bA^{[l-1]}(\bW^{[l]})\trans\in\mathbb{R}^{m\times d^{[l]}}\\ \bmu^{[l]} &=& (\bZ^{[l]})\trans\bone\in\mathbb{R}^{d^{[l]}\times 1}\\ \check{\bZ}^{[l]}&=&\bZ^{[l]}-\bone(\bmu^{[l]})\trans\in\mathbb{R}^{m\times d^{[l]}}\\ \bsigma^{2[l]} &=& m^{-1}\sum_{i=1}^m\check{\bz}_i^{[l]}\circ\check{\bz}_i^{[l]}\in\mathbb{R}^{d^{[l]}\times 1}\\ \check{\bsigma}^{[l]} &=& \sqrt{\bsigma^{2[l]}+\epsilon}\in\mathbb{R}^{d^{[l]}\times 1}\\ \widehat{\bsigma}^{[l]} &=& (\check{\bsigma}^{[l]})^{-1}\in\mathbb{R}^{d^{[l]}\times 1}\\ \bZ^{[l]}_{\mbox{norm}}&=&\check{\bZ}^{[l]}\circ\{\bone(\widehat{\bsigma}^{[l]})\trans\}\in\mathbb{R}^{m\times d^{[l]}}。 \end{eqnarray}\end{split}\]

在以上计算中,我们省略了涉及到参数 \(\bgamma^{[l]}\)\(\bbeta^{[l]}\) 部分的计算,该部分的前向传播和后向传播均较为简单。下图展示了前向传播的主要计算过程。

后向传播#

\(\hspace{1.5em}\) 我们将基于式(38)展示批量归一化算法的后向传播部分。在 (37) 中,从 \(\md\bA^{[l]}\)\(\md\tilde{\bZ}^{[l]}\) 的计算较为简单。我们的目的是从 \(\md\tilde{\bZ}^{[l]}\) 得到 \(\md\bZ^{[l]}\);此后,我们便可通过上一章中介绍的后向传播算法计算 \(\md\bA^{[l-1]}\) 以及更新参数所需要的梯度 \(\md\bW^{[l]}\)。后向传播的计算过程如下图所示。

\(\hspace{1.5em}\) 批量归一化算法的后向传播计算可以归纳为以下过程:

\[\begin{split}\begin{eqnarray} \md\bZ_{\mbox{norm}}^{[l]}&=&\md\tilde{\bZ}^{[l]}\circ\left\{\bone\left(\bgamma^{[l]}\right)\trans\right\}\\ \md\check{\bZ}^{[l]}_1 &=& \md{\bZ}_{\mbox{norm}}^{[l]}\circ\left\{\bone\left(\widehat{\bsigma}^{[l]}\right)\trans\right\}\\ \md\widehat{\bsigma}^{[l]}&=&\left(\md\bZ_{\mbox{norm}}^{[l]}\circ\check{\bZ}^{[l]}\right)\trans\bone\\ \md\check{\bsigma}^{[l]} &=& -\md\widehat{\bsigma}^{[l]}\circ\widehat{\bsigma}^{[l]}\circ\widehat{\bsigma}^{[l]}\\ \md\bsigma^{2[l]}&=&\md\check{\bsigma}^{[l]}\circ\widehat{\bsigma}^{[l]}/2\\ \md\check{\bZ}_2^{[l]}&=&2m^{-1}\check{\bZ}^{[l]}\circ\left\{\bone\left(\md\bsigma^{2[l]}\right)\trans\right\}\\ \md\check{\bZ}^{[l]}&=&\md\check{\bZ}_1^{[l]}+\md\check{\bZ}_2^{[l]}\\ \md\bZ_1^{[l]} &=& \md\check{\bZ}^{[l]}\\ \md\bmu^{[l]}&=&-\left(\md\check{\bZ}^{[l]}\right)\trans\bone\\ \md\bZ_2^{[l]} &=& m^{-1}\bone\left(\md\bmu^{[l]}\right)\trans\\ \md\bZ^{[l]} &=& \md\bZ_1^{[l]}+\md\bZ_2^{[l]}, \end{eqnarray}\end{split}\]

其中,\(\bone\) 为长度为 \(m\) 的分量为1的列向量。最终,我们可以得到后向传播的主要过程,如下所示:

\[\begin{split}\begin{eqnarray} \md\bgamma^{[l]} &=& \left(\md\tilde{\bZ}^{[l]}\circ\bZ_{\mbox{norm}}^{[l]}\right)\trans\bone\\ \md\bbeta^{[l]} &=& \left(\md\tilde{\bZ}^{[l]}\right)\trans\bone\\ \md\bZ^{[l]} &=& \md\bZ_1^{[l]}+\md\bZ_2^{[l]}。 \end{eqnarray}\end{split}\]

\(\hspace{1.5em}\) 批量归一化算法首先可以加快训练速度,该算法通过稳定激活的分布,批量归一化允许使用更高的学习率,从而加快训练过程。其次,该算法可有效 减少对初始化的依赖,使得网络对权重初始化的敏感性较低。第三,该算法有轻微的正则化效果,可以帮助减少过拟合,但其不能替代 Dropout 或其他正则化技术。在大多数深度学习框架中,批量归一化的实现非常简单,通常作为内置层提供。 总之,批量归一化是一种强大的技术,通过归一化每层的输入并稳定学习过程,帮助提高深度神经网络训练的效率和效果。