参考教程

模型选择、欠拟合和过拟合

K折交叉验证

当训练数据稀缺时,我们甚至可能无法提供足够的数据来构成一个合适的验证集。这个问题的一个流行的解决方案是采用KK折交叉验证。这里,原始训练数据被分成KK个不重叠的子集。然后执行KK次模型训练和验证,每次在K1K−1个子集上进行训练,并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。最后,通过对KK次实验的结果取平均来估计训练和验证误差。

正向传播、反向传播和计算图

正向传播

  1. 假设输入样本是xRd\mathbf{x}\in \mathbb{R}^d,并且隐藏层不包括偏置项。这里的中间变量是:

z=W(1)x,\mathbf{z}= \mathbf{W}^{(1)} \mathbf{x},

  1. 其中W(1)Rh×d\mathbf{W}^{(1)} \in \mathbb{R}^{h \times d}是隐藏层的权重参数。然后将中间变量 zRh\mathbf{z}\in \mathbb{R}^h通过激活函数ϕ\phi后,我们得到长度为hh的隐藏激活向量:

h=ϕ(z).\mathbf{h}= \phi (\mathbf{z}).

  1. 隐藏变量hh也是一个中间变量。假设输出层的参数只有权重W(2)Rq×h\mathbf{W}^{(2)} \in \mathbb{R}^{q \times h},我们可以得到输出层变量,它是一个长度为qq的向量:

o=W(2)h.\mathbf{o}= \mathbf{W}^{(2)} \mathbf{h}.

  1. 假设损失函数为ll,样本标签为yy,我们可以计算单个数据样本的损失项,

L=l(o,y).L = l(\mathbf{o}, y).

  1. 根据L2L_2正则化的定义,给定超参数λ\lambda,正则化项为

s=λ2(W(1)F2+W(2)F2)s = \frac{\lambda}{2} \left(\|\mathbf{W}^{(1)}\|_F^2 + \|\mathbf{W}^{(2)}\|_F^2\right)

  1. 其中,矩阵的弗罗贝尼乌斯范数是将矩阵展平为向量后应用的L2L_2范数。最后,模型在给定数据样本上的正则化损失为:

J=L+s.J = L + s.

JJ称为目标函数。

反向传播

  1. 第一步是计算目标函数J=L+sJ=L+s相对于损失项 L 和正则项 s 的梯度:

JL=1  and  Js=1\frac{\partial J}{\partial L} = 1 \; \text{and} \; \frac{\partial J}{\partial s} = 1

  1. 根据链式法则计算目标函数关于输出层变量o\mathbf{o}的梯度:

Jo=prod(JL,Lo)=LoRq\frac{\partial J}{\partial \mathbf{o}} = \text{prod}\left(\frac{\partial J}{\partial L}, \frac{\partial L}{\partial \mathbf{o}}\right) = \frac{\partial L}{\partial \mathbf{o}} \in \mathbb{R}^q

  1. 计算正则化项相对于两个参数的梯度:

sW(1)=λW(1)  and  sW(2)=λW(2).\frac{\partial s}{\partial \mathbf{W}^{(1)}} = \lambda \mathbf{W}^{(1)} \; \text{and} \; \frac{\partial s}{\partial \mathbf{W}^{(2)}} = \lambda \mathbf{W}^{(2)}.

  1. 计算最接近输出层的模型参数的梯度J/W(2)Rq×h\partial J/\partial \mathbf{W}^{(2)} \in \mathbb{R}^{q \times h}。使用链式法则得出:

JW(2)=prod(Jo,oW(2))+prod(Js,sW(2))=Joh+λW(2).\frac{\partial J}{\partial \mathbf{W}^{(2)}}= \text{prod}\left(\frac{\partial J}{\partial \mathbf{o}}, \frac{\partial \mathbf{o}}{\partial \mathbf{W}^{(2)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \mathbf{W}^{(2)}}\right)= \frac{\partial J}{\partial \mathbf{o}} \mathbf{h}^\top + \lambda \mathbf{W}^{(2)}.

  1. 为了获得关于W(1)\mathbf{W}^{(1)}的梯度,我们需要继续沿着输出层到隐藏层反向传播。关于隐藏层输出的梯度J/hRh\partial J/\partial \mathbf{h} \in \mathbb{R}^h由下式给出:

Jh=prod(Jo,oh)=W(2)Jo.\frac{\partial J}{\partial \mathbf{h}} = \text{prod}\left(\frac{\partial J}{\partial \mathbf{o}}, \frac{\partial \mathbf{o}}{\partial \mathbf{h}}\right) = {\mathbf{W}^{(2)}}^\top \frac{\partial J}{\partial \mathbf{o}}.

  1. 由于激活函数ϕ\phi是按元素计算的,计算中间变量z\mathbf{z}的梯度J/zRh\partial J/\partial \mathbf{z} \in \mathbb{R}^h需要使用按元素乘法运算符,我们用\odot表示:

Jz=prod(Jh,hz)=Jhϕ(z).\frac{\partial J}{\partial \mathbf{z}} = \text{prod}\left(\frac{\partial J}{\partial \mathbf{h}}, \frac{\partial \mathbf{h}}{\partial \mathbf{z}}\right) = \frac{\partial J}{\partial \mathbf{h}} \odot \phi'\left(\mathbf{z}\right).

  1. 最后,得到最接近输入层的模型参数的梯度J/W(1)Rh×d\partial J/\partial \mathbf{W}^{(1)} \in \mathbb{R}^{h \times d}。根据链式法则:

JW(1)=prod(Jz,zW(1))+prod(Js,sW(1))=Jzx+λW(1).\frac{\partial J}{\partial \mathbf{W}^{(1)}} = \text{prod}\left(\frac{\partial J}{\partial \mathbf{z}}, \frac{\partial \mathbf{z}}{\partial \mathbf{W}^{(1)}}\right) + \text{prod}\left(\frac{\partial J}{\partial s}, \frac{\partial s}{\partial \mathbf{W}^{(1)}}\right) = \frac{\partial J}{\partial \mathbf{z}} \mathbf{x}^\top + \lambda \mathbf{W}^{(1)}.

参数初始化

默认初始化

  1. 使用正态分布来初始化权重值,若不指定框架将使用默认的随机初始化方法

Xavier初始化

  1. 对于某些没有非线性的全连接层输出(例如隐藏变量)oio_{i}的尺度分布。对于该层ninn_{in}输入xjx_j及其相关权重wijw_{ij},输出为:

oi=j=1ninwijxjo_{i} = \sum_{j=1}^{n_\mathrm{in}} w_{ij} x_j

  1. 权重 wijw_{ij}都是从同一分布中独立抽取的。此外,假设该分布具有零均值和方差σ2\sigma^2。假设层xjx_j 的输入也具有零均值和方差γ2\gamma^2 ,并且它们独立于wijw_{ij} 并且彼此独立。在这种情况下,我们可以按如下方式计算$o_i} 的平均值和方差:

E[oi]=j=1ninE[wijxj]=j=1ninE[wij]E[xj]=0,Var[oi]=E[oi2](E[oi])2=j=1ninE[wij2xj2]0=j=1ninE[wij2]E[xj2]=ninσ2γ2.\begin{aligned} E[o_i] & = \sum_{j=1}^{n_\mathrm{in}} E[w_{ij} x_j] \\ &= \sum_{j=1}^{n_\mathrm{in}} E[w_{ij}] E[x_j] \\ &= 0, \\ \mathrm{Var}[o_i] & = E[o_i^2] - (E[o_i])^2 \\ & = \sum_{j=1}^{n_\mathrm{in}} E[w^2_{ij} x^2_j] - 0 \\ & = \sum_{j=1}^{n_\mathrm{in}} E[w^2_{ij}] E[x^2_j] \\ & = n_\mathrm{in} \sigma^2 \gamma^2. \end{aligned}

  1. 保持方差不变的一种方法是设置ninσ2=1n_\mathrm{in} \sigma^2 = 1 。现在考虑反向传播过程,我们面临着类似的问题,尽管梯度是从更靠近输出的层传播的。使用与正向传播相同的推理,我们可以看到,除非noutσ2=1n_\mathrm{out} \sigma^2 = 1,否则梯度的方差可能会增大,其中noutn_out是该层的输出的数量。这使我们进退两难:我们不可能同时满足这两个条件。相反,我们只需满足:

12(nin+nout)σ2=1 或等价于 σ=2nin+nout.\begin{aligned} \frac{1}{2} (n_\mathrm{in} + n_\mathrm{out}) \sigma^2 = 1 \text{ 或等价于 } \sigma = \sqrt{\frac{2}{n_\mathrm{in} + n_\mathrm{out}}}. \end{aligned}

  1. 通常Xavier初始化从均值为零,方差σ2=2nin+nout\sigma^2 = \frac{2}{n_\mathrm{in} + n_\mathrm{out}}的高斯分布中采样权重。