前(反)向传播,梯度消失和爆炸,batch normalization

前(反)向传播

在前向传播过程中,每一层神经元都会接收到前一层神经元的输出作为输入,并通过激活函数进行处理,然后将结果传递给下一层神经元。

前(反)向传播,梯度消失和爆炸,batch normalization_第1张图片

反向传播是一种在神经网络中计算参数梯度的方法,它是深度学习中的基础算法。该过程从前向传播开始,计算并存储每一层的输出,然后计算损失函数,接着按照相反的顺序计算每一层的梯度,最后使用这些梯度更新网络参数。在单隐藏层简单网络的参数是 W ( 1 ) W^{(1)} W(1) W ( 2 ) W^{(2)} W(2)。则反向传播的目的是计算梯度 ∂ J ∂ W ( 1 ) \frac{\partial J}{\partial W^{(1)}} W(1)J ∂ J ∂ W ( 2 ) \frac{\partial J}{\partial W^{(2)}} W(2)J

∂ J ∂ W ( 2 ) = ∂ J ∂ o h ⊤ + λ W ( 2 ) \frac{\partial J}{\partial W^{(2)}} = \frac{\partial J}{\partial o} h^{\top} + \lambda W^{(2)} W(2)J=oJh+λW(2)

中间值的大小与网络层的数量和批量大小大致成正比,因此,使用更大的批量或更深的网络可能会导致内存不足的问题。也因此,训练比预测需要更多的内存。

梯度消失和爆炸

从数学视角分析梯度消失和爆炸的原因:考虑一个具有L层、输入 x x x和输出 o o o的深层网络。每一层 l l l由变换 f l f_l fl定义,该变换的参数为权重 W ( l ) W^{(l)} W(l),其隐藏变量是 h ( l ) h^{(l)} h(l)(令 h ( 0 ) = x h^{(0)} = x h(0)=x)。则网络可以表示为:

h ( l ) = f l ( h ( l − 1 ) ) 因此 o = f L ∘ ⋯ ∘ f 1 ( x ) . h^{(l)} = f_l(h^{(l-1)}) \quad \text{因此} \quad o = f_L \circ \dots \circ f_1(x). h(l)=fl(h(l1))因此o=fLf1(x).

如果所有隐藏变量和输入都是向量,我们可以将 o o o关于任何一组参数 W ( l ) W^{(l)} W(l)的梯度写为下式:

∂ W ( l ) ∂ o = ∂ h ( L − 1 ) ∂ h ( L ) ∣ M ( L ) def = … ∂ h ( l ) ∂ h ( l + 1 ) ∣ M ( l + 1 ) def = ∂ W ( l ) ∂ h ( l ) ∣ v ( l ) def = \frac{\partial W^{(l)}}{\partial o} = \frac{\partial h^{(L-1)}}{\partial h^{(L)}} \Bigg|_{\substack{M^{(L)} \\ \text{def} =}} \dots \frac{\partial h^{(l)}}{\partial h^{(l+1)}} \Bigg|_{\substack{M^{(l+1)} \\ \text{def} =}} \frac{\partial W^{(l)}}{\partial h^{(l)}} \Bigg|_{\substack{v^{(l)} \\ \text{def} =}} oW(l)=h(L)h(L1) M(L)def=h(l+1)h(l) M(l+1)def=h(l)W(l) v(l)def=

梯度是 L − l L - l Ll个矩阵 M ( L ) ⋅ ⋯ ⋅ M ( l + 1 ) M^{(L)} \cdot \dots \cdot M^{(l+1)} M(L)M(l+1)与梯度向量 v ( l ) v^{(l)} v(l)的乘积。当将太多的概率乘在一起时,这些问题经常会出现。最初,矩阵 M ( l ) M^{(l)} M(l)可能具有各种各样的特征值。他们可能很小,也可能很大。他们的乘积也可能非常大,也可能非常小。

不稳定梯度也威胁到我们优化算法的稳定性。要么是梯度爆炸问题:参数更新过大,破坏了模型的稳定收敛;要么是梯度消失问题:参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。

BN层:Batch Normalization

在模型训练过程中,批量规范化利用小批量的均值和标准差,不断调整神经网络的中间输出,这样可以使得网络在训练过程中更加稳定,加速收敛,同时也可以一定程度上防止过拟合。

批量规范化的基本思想是对每一层的输入进行规范化处理,使其满足均值为0,方差为1的标准正态分布,然后通过学习参数来恢复网络层需要的原始分布。对于来自小批量 B B B的输入 x x x,批量规范化 B N ( x ) BN(x) BN(x)可以按照以下表达式进行:

B N ( x ) = γ ⊙ x − μ ^ B σ ^ B + β BN(x) = \gamma \odot \frac{x - \hat{\mu}_B}{\hat{\sigma}_B} + \beta BN(x)=γσ^Bxμ^B+β

μ ^ B = 1 ∣ B ∣ ∑ x ∈ B x \hat{\mu}_B = \frac{1}{|B|} \sum_{x \in B} x μ^B=B1xBx

σ ^ B 2 = 1 ∣ B ∣ ∑ x ∈ B ( x − μ ^ B ) 2 + ϵ \hat{\sigma}^2_B = \frac{1}{|B|} \sum_{x \in B} (x - \hat{\mu}_B)^2 + \epsilon σ^B2=B1xB(xμ^B)2+ϵ

实践中BN层的位置:批量规范化层置于全连接层中的仿射变换和激活函数之间。

h = ϕ ( B N ( W x + b ) ) h = \phi(BN(Wx + b)) h=ϕ(BN(Wx+b))

预测过程中的BN层:常用的方法是通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。

你可能感兴趣的:(python,人工智能,神经网络,深度学习)