\[ \begin{align}\begin{aligned}\newcommand{\ba}{\boldsymbol{a}} \newcommand{\bb}{\boldsymbol{b}} \newcommand{\be}{\boldsymbol{e}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \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{\bzero}{\boldsymbol{0}} \newcommand{\bepsilon}{\boldsymbol{\epsilon}} \newcommand{\bphi}{\boldsymbol{\phi}} \newcommand{\bh}{\boldsymbol{h}} \newcommand{\bc}{\boldsymbol{c}} \newcommand{\br}{\boldsymbol{r}} \newcommand{\bQ}{\boldsymbol{Q}} \newcommand{\bK}{\boldsymbol{K}} \newcommand{\bV}{\boldsymbol{V}} \newcommand{\bSigma}{\boldsymbol{\Sigma}} \newcommand{\bg}{\boldsymbol{g}} \newcommand{\bxi}{\boldsymbol{\xi}} \newcommand{\bvarepsilon}{\boldsymbol{\varepsilon}} \newcommand{\bdelta}{\boldsymbol{\delta}} \newcommand{\bq}{\boldsymbol{q}} \newcommand{\bk}{\boldsymbol{k}} \newcommand{\bJ}{\boldsymbol{J}} \newcommand{\bp}{\boldsymbol{p}} \newcommand{\bi}{\boldsymbol{i}} \newcommand{\bo}{\boldsymbol{o}} \newcommand{\bE}{\boldsymbol{E}} \newcommand{\bH}{\boldsymbol{H}} \newcommand{\bL}{\boldsymbol{L}} \newcommand{\bu}{\boldsymbol{u}} \newcommand{\bLambda}{\boldsymbol{\Lambda}} \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{\bG}{\boldsymbol{G}} \newcommand{\bI}{\boldsymbol{I}} \newcommand{\bM}{\boldsymbol{M}} \newcommand{\bP}{\boldsymbol{P}} \newcommand{\bS}{\boldsymbol{S}} \newcommand{\bU}{\boldsymbol{U}} \newcommand{\bW}{\boldsymbol{W}} \newcommand{\bX}{\boldsymbol{X}} \newcommand{\bY}{\boldsymbol{Y}} \newcommand{\bZ}{\boldsymbol{Z}} \newcommand{\cotp}{\textcolor[RGB]{48,209,88}{TP}} \newcommand{\cotn}{\textcolor[RGB]{100,210,255}{TN}} \newcommand{\cofp}{\textcolor[RGB]{94,92,230}{FP}} \newcommand{\cofn}{\textcolor[RGB]{191,90,242}{FN}}\\\newcommand{\numcotp}{\textcolor[RGB]{48,209,88}{50}} \newcommand{\numcotn}{\textcolor[RGB]{100,210,255}{30}} \newcommand{\numcofp}{\textcolor[RGB]{94,92,230}{10}} \newcommand{\numcofn}{\textcolor[RGB]{191,90,242}{10}} \DeclareMathOperator*{\argmin}{arg\,min}\end{aligned}\end{align} \]

多隐藏层全连接神经网络#

学习目标与记号#

  1. 准确解释深层网络的前向传播、后向传播与缓存机制;

  2. 根据公式和张量维度分析参数量,并识别常见实现错误;

  3. 解释随机初始化打破同层神经元对称性的作用,并区分 Xavier 初始化与 He 初始化;

  4. 根据 fan-in、fan-out 和激活函数分析前向激活与后向梯度的尺度,并诊断信号逐层衰减或放大的现象;

  5. Python 实现或验证梯度传播与参数初始化;在其他条件相同的情况下,只改变一个需要研究的因素进行比较,并根据实验结果分析该因素可能带来的影响。

  本节沿用统一记号:普通小写字母表示标量,粗体小写字母表示向量,粗体大写字母表示矩阵或高阶张量;层编号写作上标 \([l]\)⁠,样本或时间编号写作下标;转置写作 \(\trans\)⁠。除非另有说明,批量样本按行堆叠,形成设计矩阵。正文与练习中的程序都应同时检查数值结果和数组维度。本节两组练习的参考答案分别见 多隐藏层全连接网络答案参数初始化与信号尺度答案⁠。

  本节建立在 多样本向量化激活函数 之上;多分类输出层可使用 Softmax 回归⁠。我们已经对具有一个隐藏层的神经网络的结构以及基于向量化的训练过程有了较为清晰的了解。在本节中,我们将讨论更为一般的、具有多个隐藏层的全连接神经网络及其训练过程。例如,图 10 展示了用来分析二分类问题的、具有两个隐藏层的神经网络模型,其中 \(\bx\) 为某特征向量。在该网络中,第一(隐藏)层具有 \(d^{[1]}=6\) 个神经元,第二(隐藏)层具有 \(d^{[2]}=4\) 个神经元,第三层为输出层,具有 \(d^{[3]}=1\) 个神经元。对于多分类问题,输出层的神经元个数往往与类别数量相等;我们将在 Softmax 回归模型 一节中对这个问题进行讨论。

../_images/Figure3_7_multiple_layer_FNN_ManimCE_v0.18.1.png

图 10 具有两个隐藏层的全连接神经网络#

前向传播#

  在本节中,我们假设神经网络共有 \(L\) 层,其中第 \(L\) 层为输出层。我们遵循上一节中的 向量化 过程以及基于 Python广播机制⁠。记 \(\bA^{[0]}=\bX\)⁠,则对于 \(l\geq1\)⁠,前向传播的计算过程如下:

(35)#\[\begin{split}\begin{aligned} \bZ^{[l]} &= (\bb^{[l]})\trans +\bA^{[l-1]}\cdot(\bW^{[l]})\trans,\\ \bA^{[l]} &= \sigma^{[l]}(\bZ^{[l]}), \qquad l=1,\ldots,L, \end{aligned}\end{split}\]

其中,\(\bb^{[l]}\in\mathbb{R}^{d^{[l]}\times 1}\)\(\bW^{[l]}\in\mathbb{R}^{d^{[l]}\times d^{[l-1]}}\) 对应于第 \(l\) 层的偏置项和权重项,\(\sigma^{[l]}(z)\) 为第 \(l\) 层的 激活函数⁠,\(\sigma^{[l]}(\bZ^{[l]})\) 表示将激活函数作用于矩阵 \(\bZ^{[l]}\) 的每一个元素。

后向传播#

  后向传播按 \(L,L-1,\ldots,1\) 的顺序应用链式法则。通常需要缓存各层的 \(\bZ^{[l]}\)\(\bA^{[l]}\)⁠:前者用于计算激活函数导数,后者用于计算权重梯度。若某个激活函数的导数可直接由 \(\bA^{[l]}\) 表示,则可省略相应的 \(\bZ^{[l]}\)⁠,但这属于实现层面的内存优化。

  先根据输出层激活函数与损失函数的组合得到 \(\mathrm{d}\bA^{[L]}\) 或直接得到 \(\mathrm{d}\bZ^{[L]}\) 1不同问题对应的损失函数往往不同。例如,分类问题一般对应交叉熵损失,而一般回归问题对应于 \(l_2\) 损失。因此,损失函数对输出层的偏导数依据具体问题而定。⁠。对 \(l=L,L-1,\ldots,1\)⁠,后向传播的一般形式为

(36)#\[\begin{split}\begin{eqnarray} \mathrm{d}\bZ^{[l]} &=& \mathrm{d}\bA^{[l]}\odot {\sigma^{[l]}}'(\bZ^{[l]}),\\ \mathrm{d}\bW^{[l]} &=& (\mathrm{d}\bZ^{[l]})\trans\cdot\bA^{[l-1]},\\ \mathrm{d}\bb^{[l]} &=& (\mathrm{d}\bZ^{[l]})\trans\cdot\bone,\\ \mathrm{d}\bA^{[l-1]} &=& \mathrm{d}\bZ^{[l]}\cdot\bW^{[l]}, \end{eqnarray}\end{split}\]

其中,\(\odot\) 表示 Hadamard 乘积,用于两个维度相同的数组中对应元素之间的乘法运算。

  深度与宽度共同决定网络的表示能力、参数量和优化难度。更深的网络可以复用分层特征,但也可能更难训练;更宽的网络通常更易并行,却可能增加参数量和显存占用。实际结构应根据数据类型、计算预算和验证集表现选择,不能简单认为“越深越好”。

网络模型参数的初始化#

随机初始化与对称性#

  神经网络开始训练之前,需要为每一层确定初始权重和偏置。若同一隐藏层的所有神经元使用完全相同的权重和偏置,那么它们在前向传播中会得到相同的线性运算结果和激活值,在后向传播中也会得到相同的梯度。只要后续更新过程是确定的,这些神经元在每次更新后仍然完全相同,因而无法学习不同的特征。随机初始化的首要作用就是打破这种对称性,而不是让初始参数尽可能大。

  随机权重的尺度同样重要。尺度过大时,各层的线性运算结果可能迅速增大,sigmoid 函数和 tanh 函数容易进入饱和区域,ReLU 网络中的激活值与梯度也可能逐层放大;尺度过小时,前向信号和后向梯度则可能逐层衰减。因此,初始化方法需要同时考虑每层的输入连接数、输出连接数和激活函数。

前向传播中的方差尺度#

  对第 \(l\) 层,fan-in(扇入)是每个输出神经元接收的输入数量,即 \(d^{[l-1]}\)⁠;fan-out(扇出)是每个输入神经元连接的输出数量,即 \(d^{[l]}\)⁠。记第 \(l\) 层权重元素的方差为 \(v_w^{[l]}\)⁠,上一层激活元素的二阶矩为 \(q_a^{[l-1]}=\mathbb{E}[(A_{ik}^{[l-1]})^2]\)⁠,当前层线性运算结果的二阶矩为 \(q_z^{[l]}=\mathbb{E}[(Z_{ij}^{[l]})^2]\)⁠。这里使用二阶矩,是因为 ReLU 的输出通常不再具有零均值。

  在权重元素相互独立、均值为 0、方差相同,权重与输入近似独立,且同一线性组合中的各项近似不相关的条件下,样本按行存放时,式 (35) 中每个 \(Z_{ij}^{[l]}\) 都是 \(d^{[l-1]}\) 项之和,因此

\[q_z^{[l]} \approx d^{[l-1]}v_w^{[l]}q_a^{[l-1]},\]

其中,偏置在初始化时通常取 0,因而没有写入上式。若激活函数为 ReLU,并进一步假设激活前的分布近似关于 0 对称,则约有一半线性运算结果被截为 0,从而

\[q_a^{[l]}\approx \frac{1}{2}q_z^{[l]},\]

  为使 \(q_a^{[l]}\)\(q_a^{[l-1]}\) 处于相近尺度,可以令

\[v_w^{[l]}\approx\frac{2}{d^{[l-1]}}.\]

  这就是按 fan-in 缩放的 He 初始化所依据的近似关系。它不是对所有数据和网络都严格成立的等式,而是在独立、零均值、同分布以及 ReLU 前激活近似关于 0 对称等假设下,用于稳定前向信号的合理起点。

后向传播中的梯度尺度#

  仅稳定前向传播还不能保证后向梯度稳定。记 \(q_g^{[l]}=\mathbb{E}[(\mathrm{d}A_{ij}^{[l]})^2]\) 为传到第 \(l\) 层激活值处的梯度分量的二阶矩。根据式 (36)⁠,传到第 \(l-1\) 层的每个梯度分量会汇总当前层 \(d^{[l]}\) 个输出方向的贡献。若 ReLU 导数形成的 0--1 门与传入梯度近似独立,并且 ReLU 前激活近似关于 0 对称,则该门约保留一半梯度分量。在权重、梯度和各求和项近似独立且同分布的条件下,有

\[q_g^{[l-1]} \approx d^{[l]}v_w^{[l]}\frac{1}{2}q_g^{[l]}.\]

  因而,若希望优先保持后向梯度的二阶矩,可以采用 fan-out 方向的目标

\[v_w^{[l]}\approx\frac{2}{d^{[l]}}.\]

  当 \(d^{[l-1]}\neq d^{[l]}\) 时,fan-in 目标 \(2/d^{[l-1]}\) 与 fan-out 目标 \(2/d^{[l]}\) 不可能同时精确满足。实际初始化必须确定优先目标或采用折中尺度。PyTorch 初始化函数中的 mode="fan_in" 通常优先稳定前向传播,mode="fan_out" 通常优先稳定后向传播;调用框架函数时还应确认权重矩阵的存放和使用方式是否符合该函数对 fan-in 与 fan-out 的解释。

常用初始化#

  1. Xavier/Glorot 初始化。 对线性激活或 tanh 等近似在正负两侧对称的激活,一个常见的正态初始化方差为

    \[v_w^{[l]}=\frac{2}{d^{[l-1]}+d^{[l]}}.\]

      这一尺度在 fan-in 与 fan-out 之间取折中,适合不需要 ReLU 增益的情形。

  2. He/Kaiming 初始化。 对 ReLU 网络,若希望优先稳定前向传播,常用

    \[v_w^{[l]}=\frac{2}{d^{[l-1]}}.\]

      若希望优先稳定后向传播,则可根据任务和框架约定选择 fan_out对应方差 \(2/d^{[l]}\)⁠。

  3. 带 ReLU 增益的折中尺度。 若在 Xavier 的 fan-in 与 fan-out 折中形式上再使用 ReLU 增益 \(\sqrt{2}\)⁠,则正态初始化方差变为

    \[v_w^{[l]}=\frac{4}{d^{[l-1]}+d^{[l]}}.\]

      该式可以看作同时考虑两侧连接数并加入 ReLU 增益的折中方案,但不能把它误称为不带增益的普通 Xavier 初始化。

  4. 偏置初始化。 全连接层偏置通常初始化为 0,因为随机权重已经能够打破隐藏神经元之间的对称性。循环网络的门控偏置或某些残差结构可能采用专门设置,应遵循具体架构。

  以上公式是合理起点,不是对所有网络都最优的定律。卷积层的 fan-in 还要包含卷积核的空间尺寸;使用分组卷积时只计算组内输入通道;使用 Leaky ReLU 等激活函数时,初始化尺度还应考虑负半轴斜率。框架提供的初始化函数会处理许多常见情况,但仍应核对其默认参数。

诊断初始化#

  在正式进行长时间训练之前,可以用一个小批量完成一次前向传播和后向传播,并逐层记录激活值与梯度的均值、标准差、二阶矩和零值比例。若这些量随深度迅速接近 0 或变得很大,应先检查初始化尺度、激活函数、归一化、残差连接以及学习率,而不是盲目增加训练轮数。

  诊断时还应检查全部数值是否有限,并比较经验权重方差与理论目标。固定随机种子有助于重复程序结果,但一个随机种子不能说明方法是否稳定;正式比较应使用多个随机种子,并汇总结果的平均水平与波动程度。

Shiny 交互演示:多层感知机、梯度检查与参数初始化

  下面四个交互页面分别用于比较两个多层感知机的网络结构与学习率、查看各层权重和偏置的维度、查看一次真实前向传播与后向传播中各中间量和参数梯度,以及利用 中心差分 核验梯度并比较多种初始化尺度。模型比较页面显示的是训练准确率,不能代替验证集或测试集评价;初始化页面只展示随机信号在未训练网络中的传播趋势,也不能据此判断模型在具体任务上的预测效果。

核心推导与实现核验#

核心关系

\[\mathrm{d}\bZ^{[l]} =\left(\mathrm{d}\bZ^{[l+1]}\cdot\bW^{[l+1]}\right) \odot{\sigma^{[l]}}'(\bZ^{[l]}),\]

其中,\(\mathrm{d}\bZ^{[l]}\) 是式 (36) 中已经使用的量,表示损失函数对第 \(l\) 层线性运算结果 \(\bZ^{[l]}\) 的梯度,其维度与 \(\bZ^{[l]}\) 相同。这里不再另外引入误差信号符号。

  推导路径。 从输出层梯度开始,每一步先用 \(\mathrm{d}\bZ^{[l+1]}\cdot\bW^{[l+1]}\) 把梯度传回当前层的激活,再与当前激活函数的导数进行 Hadamard 乘积;随后根据式 (36)⁠,使用 \(\mathrm{d}\bZ^{[l]}\) 和上一层激活计算权重梯度与偏置梯度。

初始化尺度的核心关系

\[q_z^{[l]} \approx d^{[l-1]}v_w^{[l]}q_a^{[l-1]},\]

其中,\(v_w^{[l]}\) 是第 \(l\) 层权重元素的方差,\(q_a^{[l-1]}\) 是上一层激活元素的二阶矩,\(q_z^{[l]}\) 是当前层线性运算结果的二阶矩。对于 ReLU 网络,前向传播近似再给出 \(q_a^{[l]}\approx q_z^{[l]}/2\)⁠;后向传播则近似给出 \(q_g^{[l-1]}\approx d^{[l]}v_w^{[l]}q_g^{[l]}/2\)⁠。

  初始化尺度的推导路径。 在线性组合的各项近似独立、零均值且同分布时,求和会使二阶矩乘以输入项数;ReLU 前激活近似关于 0 对称时,激活门或导数门约保留一半二阶矩。因此,优先稳定前向传播得到 fan-in 目标 \(v_w^{[l]}\approx2/d^{[l-1]}\)⁠,优先稳定后向传播得到 fan-out 目标 \(v_w^{[l]}\approx2/d^{[l]}\)⁠。当两侧宽度不同时,需要确定优先方向或使用折中尺度。

关键条件

  对恒等激活的前向传播进行递归展开,我们可以得到一个总权重矩阵和总偏置,因此深度只有在含非线性或其他非线性操作时才扩大表示能力。

  同层神经元若具有完全相同的输入权重、偏置和对应输出权重,那么它们的前向结果、后向梯度及每次参数更新都相同,因而无法学习不同特征。随机初始化必须打破这种对称性;方差尺度推导还依赖独立、零均值、同分布等近似条件。

数据规模

  若第 \(l-1\) 层有 \(d^{[l-1]}\) 个神经元,第 \(l\) 层有 \(d^{[l]}\) 个神经元,那么这一层包含 \(d^{[l]}d^{[l-1]}\) 个权重参数量和 \(d^{[l]}\) 个偏置参数量,共 \(d^{[l]}d^{[l-1]}+d^{[l]}\) 个参数;相应梯度的大小必须与参数完全一致。

  对该全连接层,fan-in 为 \(d^{[l-1]}\)⁠,fan-out 为 \(d^{[l]}\)⁠。卷积层的 fan-in 和 fan-out 还要计入卷积核的高、宽以及分组数,不能只看通道数量。

常见误区

  缓存与层编号错位、原地覆盖激活、后向循环边界少一层,都是全连接神经网络编程实现中的高频错误。

  初始化时只按层宽缩放,却忽略卷积核大小、分组数、激活函数增益或框架对权重维度的解释,也会使理论方差与实际模块不符。普通 Xavier 方差 \(2/(d_{\mathrm{in}}+d_{\mathrm{out}})\) 与加入 ReLU 增益后的折中方差 \(4/(d_{\mathrm{in}}+d_{\mathrm{out}})\) 不能混为一谈。

动手检查

  在 float64 小网络上逐参数做 中心差分⁠,再比较逐样本梯度之和与批量矩阵梯度。另构造多层无训练网络,对多批随机输入记录各层激活与梯度的二阶矩;分别使用过小、过大、Xavier 和 He 初始化,核对经验变化是否符合理论趋势。

数值稳定性与规模

  二分类损失根据输出层的线性运算结果计算,初始化按 fan-in 缩放 或任务所需的 fan-out 模式进行;每层记录激活和梯度范数。先以整数计算 fan-in 与 fan-out,再在浮点数范围内计算标准差,并检查全部结果是否有限。初始化器应显式接收随机数生成器,避免不同层意外复用完全相同的随机样本。出现梯度爆炸时先检查公式、初始化尺度与学习率,再考虑全局范数裁剪。

本节小结#

  1. 深层网络用层索引统一表达。

  2. 在前向传播时保存各层的中间结果,以便在后向传播时计算梯度。

  3. 判断深度、宽度与可训练性之间的关系时,应在其他条件相同的情况下分别改变这些因素进行比较,并根据实验结果分析它们可能带来的影响。

  4. 随机权重首先用于打破同层隐藏神经元之间的对称性。

  5. Xavier 初始化与 He 初始化通过控制权重尺度,减轻激活值和梯度随深度迅速衰减或放大的问题。

  6. 初始化公式需要与层类型、激活函数以及希望优先稳定的前向或后向方向相匹配。

综合练习#

  本节练习分为“多层网络的传播与结构”和“网络模型参数初始化”两组。程序题应固定随机种子、写出维度断言并报告运行环境;比较题还应固定数据划分、随机种子集合和训练预算。两组参考答案分别见 多隐藏层全连接神经网络答案参数初始化与信号尺度答案⁠。

多层网络的传播与结构#

  本组练习围绕任意深度网络的前向传播与后向传播、线性层复合、通用程序实现以及深度和宽度的效率权衡展开。实验应同时报告预测性能与计算成本。

  1. 多层前向与后向传播。 对按行存放的批量样本,推导第 \(l\) 层的前向公式以及式 (36) 给出的后向公式。写出每个中间量与参数的维度,并说明后向循环为什么必须按 \(L,L-1,\ldots,1\) 的顺序执行。

  2. 线性层复合。 证明当所有层的激活函数(包括输出层)均为恒等映射时,任意多个仿射层的复合仍是一个仿射映射。写出两层情形的总权重和总偏置,再用数学归纳法推广到 \(L\) 层,并说明参数化非唯一性。

  3. 线性运算结果的梯度与参数梯度。 从链式法则推导 \(\mathrm{d}\bZ^{[l]}=(\mathrm{d}\bZ^{[l+1]}\cdot\bW^{[l+1]})\odot{\sigma^{[l]}}'(\bZ^{[l]})\)⁠,其中 \(l=L-1,\ldots,1\)⁠,并推导对应的权重梯度和偏置梯度。说明输出层的 \(\mathrm{d}\bZ^{[L]}\) 如何由损失函数与输出激活函数确定;解释梯度传播路径为何会随深度增长,并指出激活函数导数与权重矩阵在其中分别起什么作用。

  4. 三层网络手算。 对单样本 \(\bx=(1,-1)\trans\)⁠、\(y=1\)⁠,令 \(\bW^{[1]}=\bI_2\)⁠、\(\bW^{[2]}=\begin{pmatrix}1&2\\-1&1\end{pmatrix}\)⁠、\(\bW^{[3]}=(2,-1)\)⁠,所有偏置为 0;前两个层使用 ReLU,输出层使用 sigmoid 函数。手算全部线性运算结果、激活值、各层线性运算结果的梯度 \(\mathrm{d}\bZ^{[l]}\) 和参数梯度,并用程序逐层复核。

  5. 任意深度实现。 仅使用 NumPy用列表或字典实现任意层数的批量 forwardbackward每层缓存输入激活与线性运算结果,逐层检查参数、缓存和梯度维度;输出层使用由线性运算结果稳定计算的二元交叉熵,且函数不得原地覆盖调用者传入的参数。

  6. 深而窄与浅而宽。 构造参数量尽可能接近的深而窄网络和浅而宽网络,在同一非线性分类任务上比较训练与验证性能。固定数据划分、初始化规则、优化器、种子集合和训练预算,报告准确率、对数损失、训练时间、固定批量预测时间、参数量和峰值内存。

网络模型参数初始化#

  本组前四题用于推导、证明和具体计算,第 5--7 题用于编程实现与核验,第 8--10 题要求在其他条件相同的情况下,只改变一个需要研究的因素进行比较,并根据实验结果分析该因素可能带来的影响。全部参考答案见 参数初始化与信号尺度答案⁠。

  1. 方差传播。\(z_j=\sum_{k=1}^{d_{\mathrm{in}}}w_{jk}a_k\)⁠,并假设 \(w_{jk}\)\(a_k\) 相互独立、均值为 0,各求和项互不相关。推导 \(\operatorname{Var}(z_j)=d_{\mathrm{in}}\operatorname{Var}(w_{jk})\operatorname{Var}(a_k)\)⁠,并指出推导依赖的条件。

  2. Xavier 与 He 初始化。 根据第 1 题的结论,推导保持线性层输出方差所需的 \(\operatorname{Var}(w_{jk})\)⁠;再说明 ReLU 函数约保留一半二阶矩时,为什么 fan-in 模式的 He 初始化采用约 \(2/d_{\mathrm{in}}\) 的权重方差。最后根据后向传播公式说明,优先稳定后向梯度时为什么会得到约 \(2/d_{\mathrm{out}}\) 的 fan-out 目标,并解释 \(d_{\mathrm{in}}\neq d_{\mathrm{out}}\) 时两个目标为何不能同时精确满足。

  3. 对称性证明。 对具有至少两个隐藏神经元的全连接网络,假设整套参数在交换同一层的两个神经元时保持不变:这两个神经元的输入权重和偏置相同,它们通向下一层对应位置的权重也相同。证明在确定性的全批量梯度下降下,这种对称性在每次更新后仍然保持。

  4. 具体计算。 某 ReLU 层的 \(d_{\mathrm{in}}=128\)⁠、\(d_{\mathrm{out}}=64\)⁠。计算普通 Xavier 正态初始化的标准差 \(\sqrt{2/(d_{\mathrm{in}}+d_{\mathrm{out}})}\)⁠、fan-in 模式 He 正态初始化的标准差 \(\sqrt{2/d_{\mathrm{in}}}\)⁠、fan-out 模式 He 正态初始化的标准差 \(\sqrt{2/d_{\mathrm{out}}}\)⁠,以及带 ReLU 增益的折中标准差 \(\sqrt{4/(d_{\mathrm{in}}+d_{\mathrm{out}})}\)⁠。若输入二阶矩为 1,并把线性运算结果近似看作零均值且关于 0 对称的变量,估计采用 fan-in 模式 He 初始化时,线性运算结果和经过 ReLU 函数后的二阶矩。

  5. 初始化器实现。Python 实现零初始化、指定标准差的正态初始化、普通 Xavier 初始化、fan-in/fan-out 两种模式的 He 初始化,以及带 ReLU 增益的折中初始化;函数根据权重维度计算 fan-in 与 fan-out,并拒绝不合法维度。

  6. 数值与库对照。 随机生成多层网络,用前向钩子和梯度钩子记录每层激活均值、激活二阶矩与梯度范数;将自编 Xavier/He 初始化器产生的大样本经验方差分别与理论值和 PyTorch 对应初始化函数比较,并明确 PyTorch 使用的 fan_infan_out 模式。

  7. 测试设计。 为初始化器编写测试,至少覆盖:固定种子可复现、经验均值接近 0、经验方差在容差内、零初始化确实全为 0、二维与卷积核维度的 fan-in/fan-out 正确、两种 He 模式在非方形权重矩阵上给出不同尺度,以及非法维度抛出异常。

  8. 初始化方法比较。 在同一多层 ReLU 网络上比较零初始化、过小高斯、过大高斯、普通 Xavier、fan-in 模式 He 和 fan-out 模式 He 初始化。固定数据划分、随机种子集合、优化器和训练预算;报告任务性能、达到给定验证指标所需时间、总训练时间、固定批量预测时间、参数量及峰值内存,并逐层比较激活和梯度尺度。

  9. 初始化与学习率。 对普通 Xavier、fan-in 模式 He 和 fan-out 模式 He 初始化分别比较三个学习率。使用相同数据划分、随机种子集合、批量大小和训练轮数;报告任务性能、训练稳定性、训练时间、固定批量预测时间、参数量及峰值内存,分析初始化尺度与学习率的相互影响。

  10. 激活函数与初始化方法。 在参数量相近的深层网络中比较“tanh 函数 + 普通 Xavier 初始化”和“ReLU 函数 + fan-in 模式 He 初始化”,再增加“tanh 函数 + He 初始化”和“ReLU 函数 + 普通 Xavier 初始化”两组,使四种组合都被比较。各组使用相同的数据划分、随机种子和训练预算;报告任务性能、激活值与梯度的统计结果、训练时间、固定批量预测时间及峰值内存,并分析激活函数和初始化方法各自可能带来的影响。