浅层神经网络

浅层神经网络

  1. 浅层神经网络通常指包含一个隐藏层的神经网络。这个网络由输入层、隐藏层和输出层构成:

    https://cdn.acwing.com/media/article/image/2024/11/10/181746_a577ba119f-Snipaste_2024-11-10_20-09-08.png

    • 输入层:输入层负责接收网络的输入特征,通常表示为列向量 x T = [ x 1 , x 2 , x 3 ] x^T = [x_1, x_2, x_3] xT=[x1,x2,x3],每个输入特征 x i x_i xi 代表样本的一个属性。输入特征的激活值 a [ 0 ] a^{[0]} a[0] 就是输入特征向量 X X X,因此我们用 a [ 0 ] a^{[0]} a[0] 表示输入层的激活值。

    • 隐藏层:隐藏层包含若干节点(或神经元),在训练过程中,节点的输出值(激活值)通过激活函数计算得到。这里隐藏层的激活值表示为 a [ 1 ] ∈ R 4 × 1 a^{[1]} \in \mathbb{R}^{4 \times 1} a[1]R4×1,即四个神经元的输出。隐藏层的参数包含权重 ω [ 1 ] ∈ R 4 × 3 \omega^{[1]} \in \mathbb{R}^{4 \times 3} ω[1]R4×3 和偏置项 b [ 1 ] ∈ R 4 × 1 b^{[1]} \in \mathbb{R}^{4 \times 1} b[1]R4×1。权重矩阵 ω [ 1 ] \omega^{[1]} ω[1] 的维度由隐藏层神经元数和输入特征数决定,而偏置 b [ 1 ] b^{[1]} b[1] 则是一个列向量,长度等于隐藏层神经元数量。 ω 3 [ 4 ] \omega_3^{[4]} ω3[4] 就代表着第四层第三个神经元的列向量。

    • 输出层:输出层负责生成最终的预测值 y ^ \hat{y} y^。输出层的激活值 a [ 2 ] a^{[2]} a[2] 表示为预测值 y ^ \hat{y} y^。输出层的权重 ω [ 2 ] ∈ R 1 × 4 \omega^{[2]} \in \mathbb{R}^{1 \times 4} ω[2]R1×4 和偏置 b [ 2 ] ∈ R 1 × 1 b^{[2]} \in \mathbb{R}^{1 \times 1} b[2]R1×1 用于对隐藏层激活值的线性变换。权重 ω [ 2 ] \omega^{[2]} ω[2] 的维度由输出层和隐藏层神经元数确定,而偏置 b [ 2 ] b^{[2]} b[2] 为一个标量。

    • 激活值 a a a:在每一层,激活值 a a a 表示网络在该层输出的值,并通过激活函数传递到下一层。输入层的激活值 a [ 0 ] a^{[0]} a[0] 就是输入特征 X X X,在隐藏层的激活值为 a [ 1 ] a^{[1]} a[1],输出层的激活值为预测值 a [ 2 ] = y ^ a^{[2]} = \hat{y} a[2]=y^

    • 一般地,对于第 l l l 层的权重矩阵 ω [ l ] \omega^{[l]} ω[l],其维度为:

      ω [ l ] ∈ R n [ l ] × n [ l − 1 ] \omega^{[l]} \in \mathbb{R}^{n^{[l]} \times n^{[l-1]}} ω[l]Rn[l]×n[l1]

      其中, n [ l ] n^{[l]} n[l] 表示第 l l l 层的神经元数量,而 n [ l − 1 ] n^{[l-1]} n[l1] 表示前一层(即第 l − 1 l-1 l1 层)的神经元数量。这个矩阵的维度定义确保了每个神经元都可以接收到来自上一层所有神经元的输入。

    在计算网络层数时,输入层通常不计入总层数。以此标准,隐藏层为第一层,输出层为第二层,因此称输入层为第零层。通过这种结构,神经网络可以将输入特征经过层层转换后,最终输出一个预测值。

  2. 浅层神经网络的单样本前向传播过程包含以下步骤:

    • 输入到隐藏层的映射:

      • 输入层的激活值 a [ 0 ] = X ∈ R 3 × 1 a^{[0]} = X \in \mathbb{R}^{3 \times 1} a[0]=XR3×1 表示一个包含 3 个特征的列向量。
      • 隐藏层的权重矩阵 ω [ 1 ] ∈ R 4 × 3 \omega^{[1]} \in \mathbb{R}^{4 \times 3} ω[1]R4×3 连接输入层和隐藏层( ω i [ 1 ] ∈ R 3 × 1 \omega_i^{[1]} \in \mathbb{R}^{3 \times 1} ωi[1]R3×1),偏置项 b [ 1 ] ∈ R 4 × 1 b^{[1]} \in \mathbb{R}^{4 \times 1} b[1]R4×1 为隐藏层每个神经元的偏置值。

      ω [ 1 ] = [ . . . ω 1 [ 1 ] T . . . . . . ω 2 [ 1 ] T . . . . . . ω 3 [ 1 ] T . . . . . . ω 4 [ 1 ] T . . . ] \omega^{[1]} = \left[ \begin{array}{c} ...\omega^{[1]T}_{1}...\\ ...\omega^{[1]T}_{2}...\\ ...\omega^{[1]T}_{3}...\\ ...\omega^{[1]T}_{4}... \end{array} \right] ω[1]= ...ω1[1]T......ω2[1]T......ω3[1]T......ω4[1]T...

      • 隐藏层中每个神经元的线性组合计算如下(以第一个神经元为例),这里 ω 1 [ 1 ] T \omega_1^{[1]T} ω1[1]T 表示权重矩阵的第一个行向量转置,使得维度相符:

      z 1 [ 1 ] = ω 1 [ 1 ] T a [ 0 ] + b 1 [ 1 ] z_1^{[1]} = \omega_1^{[1]T} a^{[0]} + b_1^{[1]} z1[1]=ω1[1]Ta[0]+b1[1]

      • 通过激活函数 σ \sigma σ,得到隐藏层每个神经元的激活值:

      a [ 1 ] = [ a 1 [ 1 ] a 2 [ 1 ] a 3 [ 1 ] a 4 [ 1 ] ] = σ ( z [ 1 ] ) = σ ( [ z 1 [ 1 ] z 2 [ 1 ] z 3 [ 1 ] z 4 [ 1 ] ] ) a^{[1]} = \left[ \begin{array}{c} a^{[1]}_{1}\\ a^{[1]}_{2}\\ a^{[1]}_{3}\\ a^{[1]}_{4} \end{array} \right] = \sigma(z^{[1]}) = \sigma(\left[ \begin{array}{c} z^{[1]}_{1}\\ z^{[1]}_{2}\\ z^{[1]}_{3}\\ z^{[1]}_{4}\\ \end{array} \right]) a[1]= a1[1]a2[1]a3[1]a4[1] =σ(z[1])=σ( z1[1]z2[1]z3[1]z4[1] )

    • 向量化计算隐藏层的激活值:

      • 为简化计算,我们将每个神经元的激活值向量化表示。

      • z [ 1 ] ∈ R 4 × 1 z^{[1]} \in \mathbb{R}^{4 \times 1} z[1]R4×1 表示隐藏层的加权和,激活值 a [ 1 ] ∈ R 4 × 1 a^{[1]} \in \mathbb{R}^{4 \times 1} a[1]R4×1 表示隐藏层的输出。

      • 向量化的计算公式为:

        z [ 1 ] = ω [ 1 ] a [ 0 ] + b [ 1 ] a [ 1 ] = σ ( z [ 1 ] ) z^{[1]} = \omega^{[1]} a^{[0]} + b^{[1]} \\ a^{[1]} = \sigma(z^{[1]}) z[1]=ω[1]a[0]+b[1]a[1]=σ(z[1])

      • 在这一步, ω [ 1 ] a [ 0 ] \omega^{[1]} a^{[0]} ω[1]a[0] 的结果是 R 4 × 1 \mathbb{R}^{4 \times 1} R4×1 的向量,与偏置项 b [ 1 ] ∈ R 4 × 1 b^{[1]} \in \mathbb{R}^{4 \times 1} b[1]R4×1 相加。

    [ z 1 [ 1 ] z 2 [ 1 ] z 3 [ 1 ] z 4 [ 1 ] ] = [ . . . ω 1 [ 1 ] T . . . . . . ω 2 [ 1 ] T . . . . . . ω 3 [ 1 ] T . . . . . . ω 4 [ 1 ] T . . . ] ⏞ ω [ 1 ] ∗ [ x 1 x 2 x 3 ] ⏞ i n p u t + [ b 1 [ 1 ] b 2 [ 1 ] b 3 [ 1 ] b 4 [ 1 ] ] ⏞ b [ 1 ] \left[ \begin{array}{c} z^{[1]}_{1}\\ z^{[1]}_{2}\\ z^{[1]}_{3}\\ z^{[1]}_{4}\\ \end{array} \right] = \overbrace{ \left[ \begin{array}{c} ...\omega^{[1]T}_{1}...\\ ...\omega^{[1]T}_{2}...\\ ...\omega^{[1]T}_{3}...\\ ...\omega^{[1]T}_{4}... \end{array} \right] }^{\omega^{[1]}} * \overbrace{ \left[ \begin{array}{c} x_1\\ x_2\\ x_3\\ \end{array} \right] }^{input} + \overbrace{ \left[ \begin{array}{c} b^{[1]}_1\\ b^{[1]}_2\\ b^{[1]}_3\\ b^{[1]}_4\\ \end{array} \right] }^{b^{[1]}} z1[1]z2[1]z3[1]z4[1] = ...ω1[1]T......ω2[1]T......ω3[1]T......ω4[1]T... ω[1] x1x2x3 input+ b1[1]b2[1]b3[1]b4[1] b[1]

    • 隐藏层到输出层的映射:

      • 隐藏层的激活值 a [ 1 ] ∈ R 4 × 1 a^{[1]} \in \mathbb{R}^{4 \times 1} a[1]R4×1 作为输入传递到输出层。
      • 输出层的权重矩阵 ω [ 2 ] ∈ R 1 × 4 \omega^{[2]} \in \mathbb{R}^{1 \times 4} ω[2]R1×4 和偏置 b [ 2 ] ∈ R b^{[2]} \in \mathbb{R} b[2]R 定义了从隐藏层到输出层的映射。
      • 计算输出层的加权和:

      z [ 2 ] = ω [ 2 ] a [ 1 ] + b [ 2 ] z^{[2]} = \omega^{[2]} a^{[1]} + b^{[2]} z[2]=ω[2]a[1]+b[2]

      • 输出层的激活值 a [ 2 ] a^{[2]} a[2] 是最终的预测值,通过激活函数计算得到:

      a [ 2 ] = σ ( z [ 2 ] ) a^{[2]} = \sigma(z^{[2]}) a[2]=σ(z[2])

    • 整体向量化公式总结

      • 使用向量化公式将输入逐层传递到输出层,前向传播过程如下:

        ω [ 1 ] ∈ R 4 × 3 , a [ 0 ] = X ∈ R 3 × 1 , b [ 1 ] ∈ R 4 × 1 z [ 1 ] = ω [ 1 ] a [ 0 ] + b [ 1 ] , a [ 1 ] = σ ( z [ 1 ] ) ω [ 2 ] ∈ R 1 × 4 , a [ 1 ] ∈ R 4 × 1 , b [ 2 ] ∈ R z [ 2 ] = ω [ 2 ] a [ 1 ] + b [ 2 ] , a [ 2 ] = σ ( z [ 2 ] ) \omega^{[1]} \in \mathbb{R}^{4 \times 3},a^{[0]}=X \in \mathbb{R}^{3 \times 1},b^{[1]} \in \mathbb{R}^{4 \times 1}\\ z^{[1]} = \omega^{[1]} a^{[0]} + b^{[1]}, \quad a^{[1]} = \sigma(z^{[1]}) \\ \\ \omega^{[2]} \in \mathbb{R}^{1 \times 4},a^{[1]} \in \mathbb{R}^{4 \times 1},b^{[2]} \in \mathbb{R}\\ z^{[2]} = \omega^{[2]} a^{[1]} + b^{[2]}, \quad a^{[2]} = \sigma(z^{[2]}) ω[1]R4×3,a[0]=XR3×1,b[1]R4×1z[1]=ω[1]a[0]+b[1],a[1]=σ(z[1])ω[2]R1×4,a[1]R4×1,b[2]Rz[2]=ω[2]a[1]+b[2],a[2]=σ(z[2])

      • 通过这些公式,可以高效地进行单样本的前向传播,将输入特征 X X X 转换为最终预测值 a [ 2 ] a^{[2]} a[2]

  3. 多样本浅层神经网络向量化

    在上一节中,我们推导了单个样本的前向传播过程。对于训练集中包含的所有样本,为了计算 m m m 个样本的预测值,传统方法需要逐个样本进行计算,通常用如下循环表示:

    for i in range(m):

    z [ 1 ] ( i ) = ω [ 1 ] a [ 0 ] ( i ) + b [ 1 ] ( i ) a [ 1 ] ( i ) = σ ( z [ 1 ] ( i ) ) z [ 2 ] ( i ) = ω [ 2 ] a [ 1 ] ( i ) + b [ 2 ] ( i ) a [ 2 ] ( i ) = σ ( z [ 2 ] ( i ) ) z^{[1](i)}=\omega^{[1]}a^{[0](i)}+b^{[1](i)} \\ a^{[1](i)} = \sigma(z^{[1](i)}) \\ z^{[2](i)}=\omega^{[2]}a^{[1](i)}+b^{[2](i)} \\ a^{[2](i)} = \sigma(z^{[2](i)}) z[1](i)=ω[1]a[0](i)+b[1](i)a[1](i)=σ(z[1](i))z[2](i)=ω[2]a[1](i)+b[2](i)a[2](i)=σ(z[2](i))

    为提升计算效率,我们对这些计算进行了向量化处理,使整个批次的样本能够同时进行前向传播。首先,将输入和参数以矩阵形式表示:

    • 输入矩阵 X X X表示所有训练样本:

    X = [ ⋮ ⋮ ⋮ ⋮ x ( 1 ) x ( 2 ) ⋯ x ( m ) ⋮ ⋮ ⋮ ⋮ ] X = \left[ \begin{array}{c} \vdots & \vdots & \vdots & \vdots\\ x^{(1)} & x^{(2)} & \cdots & x^{(m)}\\ \vdots & \vdots & \vdots & \vdots\\ \end{array} \right] X= x(1)x(2)x(m)

    • 第一层线性组合矩阵 Z [ 1 ] Z^{[1]} Z[1]

    Z [ 1 ] = [ ⋮ ⋮ ⋮ ⋮ z [ 1 ] ( 1 ) z [ 1 ] ( 2 ) ⋯ z [ 1 ] ( m ) ⋮ ⋮ ⋮ ⋮ ] Z^{[1]} = \left[ \begin{array}{c} \vdots & \vdots & \vdots & \vdots\\ z^{[1](1)} & z^{[1](2)} & \cdots & z^{[1](m)}\\ \vdots & \vdots & \vdots & \vdots\\ \end{array} \right] Z[1]= z[1](1)z[1](2)z[1](m)

    • 第一层激活矩阵 A [ 1 ] A^{[1]} A[1]

    A [ 1 ] = [ ⋮ ⋮ ⋮ ⋮ α [ 1 ] ( 1 ) α [ 1 ] ( 2 ) ⋯ α [ 1 ] ( m ) ⋮ ⋮ ⋮ ⋮ ] A^{[1]} = \left[ \begin{array}{c} \vdots & \vdots & \vdots & \vdots\\ \alpha^{[1](1)} & \alpha^{[1](2)} & \cdots & \alpha^{[1](m)}\\ \vdots & \vdots & \vdots & \vdots\\ \end{array} \right] A[1]= α[1](1)α[1](2)α[1](m)

    通过上述矩阵化的形式,我们可以简化计算流程,使得在批量处理多个样本时,神经网络层之间的操作能够一次性完成:

    Z [ 1 ] = ω [ 1 ] X + b [ 1 ] A [ 1 ] = g ( Z [ 1 ] ) Z [ 2 ] = ω [ 2 ] A [ 1 ] + b [ 2 ] A [ 2 ] = g ( Z [ 2 ] ) Z^{[1]}=\omega^{[1]}X+b^{[1]} \\ A^{[1]} = g(Z^{[1]}) \\ Z^{[2]}=\omega^{[2]}A^{[1]}+b^{[2]} \\ A^{[2]} = g(Z^{[2]}) Z[1]=ω[1]X+b[1]A[1]=g(Z[1])Z[2]=ω[2]A[1]+b[2]A[2]=g(Z[2])

    这里的列(水平索引)表示每个训练样本,而行(垂直索引)表示网络中的不同节点。矩阵中位于最左上角的元素,对应于第一个样本在第一个隐藏单元的激活值;同理,矩阵中每个位置的值都表示特定样本在特定神经元的激活值。这种矩阵化处理方式极大地提高了多样本的计算效率,使得整个神经网络的前向传播可以借助矩阵运算并行完成。

    不妨来推导一下正确性,假设忽略 b b b ,那么有

Z [ 1 ] = ω [ 1 ] x = ω [ 1 ] [ ⋮ ⋮ ⋮ ⋮ x ( 1 ) x ( 2 ) ⋮ x ( m ) ⋮ ⋮ ⋮ ⋮ ] = [ ⋮ ⋮ ⋮ ⋮ w ( 1 ) x ( 1 ) w ( 1 ) x ( 2 ) ⋮ w ( 1 ) x ( m ) ⋮ ⋮ ⋮ ⋮ ] = [ ⋮ ⋮ ⋮ ⋮ z [ 1 ] ( 1 ) z [ 1 ] ( 2 ) ⋮ z [ 1 ] ( m ) ⋮ ⋮ ⋮ ⋮ ] Z^{[1]}=\omega^{[1]} x = \omega^{[1]} \left[ \begin{array}{c} \vdots &\vdots & \vdots & \vdots \\ x^{(1)} & x^{(2)} & \vdots & x^{(m)}\\ \vdots &\vdots & \vdots & \vdots \\ \end{array} \right] = \left[ \begin{array}{c} \vdots &\vdots & \vdots & \vdots \\ w^{(1)}x^{(1)} & w^{(1)}x^{(2)} & \vdots & w^{(1)}x^{(m)}\\ \vdots &\vdots & \vdots & \vdots \\ \end{array} \right] =\\ \left[ \begin{array}{c} \vdots &\vdots & \vdots & \vdots \\ z^{[1](1)} & z^{[1](2)} & \vdots & z^{[1](m)}\\ \vdots &\vdots & \vdots & \vdots \\ \end{array} \right] Z[1]=ω[1]x=ω[1] x(1)x(2)x(m) = w(1)x(1)w(1)x(2)w(1)x(m) = z[1](1)z[1](2)z[1](m)

  1. 在神经网络中,激活函数用 g ( z ) g(z) g(z) 表示。常见的激活函数有以下几种:

    • Sigmoid函数:常用于二分类输出层,将值映射到 [ 0 , 1 ] [0,1] [0,1] 区间。

      σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+ez1

      优点:适用于二分类问题的输出层。

      缺点:在 z z z 值过大或过小时,梯度趋于0,导致梯度消失,学习速率减慢。

    • tanh函数(双曲正切函数):与Sigmoid类似,但将值映射到 [ − 1 , 1 ] [-1, 1] [1,1] 区间。tanh函数是sigmoid的向下平移和伸缩后的结果。

      t a n h ( z ) = e z − e − z e z + e − z tanh(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} tanh(z)=ez+ezezez

      优点:在隐藏层中更常用,因为其输出均值接近0,可以帮助加速收敛,可以中心化数据,使得数据的平均值更接近0而不是0.5。
      缺点:与Sigmoid函数一样,极端 z z z 值会导致梯度消失。

    • ReLU函数(线性修正单元):计算简单,适用于大多数隐藏层。

      ReLU ( x ) = m a x ( 0 , x ) \text{ReLU}(x)=max(0,x) ReLU(x)=max(0,x)

      优点:在 z > 0 z > 0 z>0 区域,导数为1,有助于解决梯度消失问题,提高学习速度。
      缺点:在 z < 0 z < 0 z<0 区域,导数为0,可能导致某些神经元不更新(即神经元“死亡”)。

    • Leaky ReLU函数:是ReLU的改进版,在负区间加入轻微斜率,防止神经元完全“死亡”。

      Leaky ReLU ( x ) = m a x ( 0.01 x , x ) \text{Leaky ReLU}(x)=max(0.01x,x) Leaky ReLU(x)=max(0.01x,x)

      优点:解决ReLU的“神经元死亡”问题,使负区间有小的梯度。
      缺点:实际应用中效果虽然较好,但并不总是显著优于ReLU。

    https://cdn.acwing.com/media/article/image/2024/11/11/181746_5ee7d0daa0-activate.png

    激活函数选择的基本原则

    1. 二分类问题:通常在输出层使用Sigmoid函数,保证预测值在 [ 0 , 1 ] [0, 1] [0,1] 之间。
    2. 隐层激活函数:ReLU是最常见的默认选择,因为其计算效率高且可以避免梯度消失。如果遇到ReLU导致的神经元死亡问题,可以尝试Leaky ReLU。tanh也可以用于隐藏层,尤其是在数据均值需要接近0的场合。
    3. 注意事项:Sigmoid和tanh在大范围 z z z 值中会导致梯度趋近0,引发梯度消失问题。ReLU和Leaky ReLU则在 z > 0 z > 0 z>0 时保持较大的梯度,但ReLU在负区间导数为0,会导致稀疏性,即部分神经元不更新。Leaky ReLU提供了一种更平滑的方案。
    4. z z z 的区间变动很大的情况下,激活函数的导数都会远大于0,而sigmoid函数需要进行浮点四则运算,在实践中,使用ReLU激活函数神经网络通常会比使用sigmoid或者tanh激活函数学习的更快。 z z z 在ReLU的梯度一半都是0,但是有足够的隐藏层使得 z > 0 z >0 z>0,所以对大多数的训练数据来说学习过程仍然可以很快。

    在实际使用中,ReLU常作为隐层的默认选择;在输出层,激活函数的选择应根据任务需求决定。

  2. 为了使神经网络具备良好的拟合能力,必须在隐藏层中使用非线性激活函数。假设在网络中使用恒等激活函数 g ( z ) = z g(z)=z g(z)=z ,则模型的输出可以表示为:

    a [ 1 ] = g ( z [ 1 ] ) = ω [ 1 ] x + b [ 1 ] a [ 2 ] = g ( z [ 2 ] ) = ω [ 2 ] a [ 1 ] + b [ 2 ] = ω [ 2 ] ω [ 1 ] x + ω [ 2 ] b [ 1 ] + b [ 2 ] = ω ′ x + b ′ a^{[1]} = g(z^{[1]}) = \omega^{[1]}x + b^{[1]} \\ a^{[2]} = g(z^{[2]}) = \omega^{[2]}a^{[1]}+ b^{[2]} = \omega^{[2]}\omega^{[1]}x + \omega^{[2]}b^{[1]} + b^{[2]}= \omega^{'}x + b^{'} a[1]=g(z[1])=ω[1]x+b[1]a[2]=g(z[2])=ω[2]a[1]+b[2]=ω[2]ω[1]x+ω[2]b[1]+b[2]=ωx+b

    这种情况下,不论网络层数如何,模型都在计算一个线性函数,其整体表达式仍然是输入 X X X 的线性组合。既然如此,如果在隐藏层仅使用线性激活函数,那么堆叠多个层就毫无意义,因为多层网络只是等效于一个单层的线性变换。这种情况下,完全可以去掉所有隐藏层,仅保留输入层和输出层。

    为了解决这个问题,通常会在隐藏层引入非线性激活函数(如 ReLU、tanh 或 leaky ReLU),以打破线性关系并引入模型的非线性拟合能力。这使得神经网络能够表达更复杂的函数关系,从而适应不同的数据模式。唯一可以使用线性激活函数的层通常是输出层,特别是在回归问题中,我们希望输出直接反映模型预测的连续值。

  3. 在进行神经网络反向传播时,需要计算激活函数的导数

    • Sigmoid激活函数:

    g ( z ) = Sigmoid ( z ) = 1 1 + e − z g ′ ( z ) = g ( z ) [ 1 − g ( z ) ] g(z)=\text{Sigmoid}(z)=\frac{1}{1+e^{-z}} \\ g'(z)=g(z)[1-g(z)] g(z)=Sigmoid(z)=1+ez1g(z)=g(z)[1g(z)]

    • Tanh激活函数:

    g ( z ) = tanh ( z ) = e z − e − z e z + e − z g ′ ( z ) = 1 − [ g ( z ) ] 2 g(z)=\text{tanh}(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} \\ g'(z)=1-[g(z)]^2 g(z)=tanh(z)=ez+ezezezg(z)=1[g(z)]2

    • ReLU激活函数:

    g ( z ) = ReLU ( z ) = m a x ( 0 , z ) g ( z ) ′ = { 0 if z < 0 1 if z ≥ 0 g(z)=\text{ReLU}(z)=max(0,z) \\ g(z)^{'}= \begin{cases} 0& \text{if\;} z < 0\\ 1& \text{if\;} z \geq 0\\ \end{cases} g(z)=ReLU(z)=max(0,z)g(z)={01ifz<0ifz0

    • Leaky ReLU激活函数:

    g ( z ) = Leaky ReLU ( x ) = max ⁡ ( 0.01 z , z ) g ( z ) ′ = { 0.01 if z < 0 1 if z ≥ 0 g(z)=\text{Leaky ReLU}(x)=\max(0.01z,z) \\ g(z)^{'}=\begin{cases}0.01& \text{if\;} z < 0\\1& \text{if\;} z \geq 0\end{cases} g(z)=Leaky ReLU(x)=max(0.01z,z)g(z)={0.011ifz<0ifz0

  4. 浅层神经网络反向传播

    x ω [ 1 ] b [ 1 ] } ⇒ z [ 1 ] = ω [ 1 ] x + b [ 1 ] ⇒ a [ 1 ] = g [ 1 ] ( z [ 1 ] ) ω [ 2 ] b [ 2 ] } ⇒ z [ 2 ] = ω [ 2 ] a [ 1 ] + b [ 2 ] ⇒ a [ 2 ] = g [ 2 ] ( z [ 2 ] ) ⇒ L ( a [ 2 ] , y ) \left. \begin{array}{l} x \\ \omega^{[1]} \\ b^{[1]} \end{array} \right\} \Rightarrow z^{[1]} = \omega^{[1]} x + b^{[1]} \Rightarrow \left. \begin{array}{l} a^{[1]} = g^{[1]}(z^{[1]}) \\ \omega^{[2]} \\ b^{[2]} \end{array} \right\} \Rightarrow \\ z^{[2]} = \omega^{[2]} a^{[1]} + b^{[2]} \Rightarrow a^{[2]} = g^{[2]}(z^{[2]}) \Rightarrow L(a^{[2]}, y) xω[1]b[1] z[1]=ω[1]x+b[1]a[1]=g[1](z[1])ω[2]b[2] z[2]=ω[2]a[1]+b[2]a[2]=g[2](z[2])L(a[2],y)

    $$

    \frac{\partial L}{\partial a^{[2]}} = -\frac{y}{a^{[2]}} + \frac{1-y}{1-a^{[2]}} \ \frac{\partial a^{[2]}}{\partial z{[2]}}=g{[2]'}(z{[2]})=a{[2]}(1-a^{[2]}) \ \frac{\partial L}{\partial z^{[2]}} = a^{[2]}-y
    $$

    ∂ z [ 2 ] ∂ ω [ 2 ] = a [ 1 ] ∂ z [ 2 ] ∂ b [ 2 ] = 1 ∂ z [ 2 ] ∂ a [ 1 ] = ω [ 2 ] ∂ L ∂ ω [ 2 ] = a [ 1 ] ( a [ 2 ] − y ) ∂ L ∂ b [ 2 ] = a [ 2 ] − y ∂ L ∂ a [ 2 ] = ω [ 2 ] ( a [ 2 ] − y ) \frac{\partial z^{[2]}}{\partial \omega^{[2]}} = a^{[1]} \quad \frac{\partial z^{[2]}}{\partial b^{[2]}} = 1 \quad \frac{\partial z^{[2]}}{\partial a^{[1]}}=\omega^{[2]} \\ \frac{\partial L}{\partial \omega^{[2]}} = a^{[1]}(a^{[2]}-y) \\ \frac{\partial L}{\partial b^{[2]}} = a^{[2]}-y \\ \frac{\partial L}{\partial a^{[2]}} =\omega^{[2]}(a^{[2]}-y) ω[2]z[2]=a[1]b[2]z[2]=1a[1]z[2]=ω[2]ω[2]L=a[1](a[2]y)b[2]L=a[2]ya[2]L=ω[2](a[2]y)

    ∂ a [ 1 ] ∂ z [ 1 ] = g [ 1 ] ′ ( z [ 1 ] ) ∂ L ∂ z [ 1 ] = w [ 2 ] ( a [ 2 ] − y ) g [ 1 ] ′ ( z [ 1 ] ) \frac{\partial a^{[1]}}{\partial z^{[1]}}=g^{[1]'}(z^{[1]}) \\ \frac{\partial L}{\partial z^{[1]}} =w^{[2]}(a^{[2]}-y)g^{[1]'}(z^{[1]}) z[1]a[1]=g[1](z[1])z[1]L=w[2](a[2]y)g[1](z[1])

    ∂ z [ 1 ] ∂ ω [ 1 ] = x ∂ z [ 1 ] ∂ b [ 1 ] = 1 ∂ L ∂ ω [ 1 ] = x d z [ 1 ] ∂ L ∂ b [ 1 ] = d z [ 1 ] \frac{\partial z^{[1]}}{\partial \omega^{[1]}}=x \quad \frac{\partial z^{[1]}}{\partial b^{[1]}}=1 \\ \frac{\partial L}{\partial \omega^{[1]}}=xdz^{[1]} \quad \frac{\partial L}{\partial b^{[1]}}=dz^{[1]} ω[1]z[1]=xb[1]z[1]=1ω[1]L=xdz[1]b[1]L=dz[1]

    使用 n x n_x nx 表示输入特征数量, n [ 1 ] n^{[1]} n[1] 表示隐藏层神经元数量, n [ 2 ] n^{[2]} n[2] 表示输出单元数量,共有 m m m 个样本,那么有 A [ 2 ] ∈ R n [ 2 ] × m = 1 × m A^{[2]} \in \mathbb{R}^{n^{[2]} \times m=1\times m} A[2]Rn[2]×m=1×m A [ 1 ] ∈ R n [ 1 ] × m A^{[1]} \in \mathbb{R}^{n^{[1]} \times m} A[1]Rn[1]×m ,向量化实现:

    d Z [ 2 ] = A [ 2 ] − Y ∈ R n [ 2 ] × m d ω [ 2 ] = 1 m d Z [ 2 ] A [ 1 ] T ∈ R n [ 2 ] × n [ 1 ] d b [ 2 ] = 1 m ∑ d Z [ 2 ] ∈ R n [ 2 ] × 1 d Z [ 1 ] = ω [ 2 ] T d Z [ 2 ] ⏟ ( n [ 1 ] , m ) ∗ g [ 1 ] ′ ( z [ 1 ] ) ⏟ ( n [ 1 ] , m ) ∈ R n [ 1 ] × m d ω [ 1 ] = 1 m d Z [ 1 ] X T ∈ R n [ 1 ] × n x d b [ 1 ] = 1 m ∑ d Z [ 1 ] ∈ R n [ 1 ] × 1 dZ^{[2]}=A^{[2]}-Y \in \mathbb{R}^{n^{[2]}\times m} \\ d\omega^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T} \in \mathbb{R}^{n^{[2]} \times n^{[1]}} \\ db^{[2]}=\frac{1}{m}\sum dZ^{[2]} \in \mathbb{R}^{n^{[2]}\times 1} \\ \\ dZ^{[1]} = \underbrace{\omega^{[2]T}{\rm d}Z^{[2]}}_{(n^{[1]},m)} * \underbrace{{g^{[1]}}^{'}(z^{[1]})}_{(n^{[1]},m)}\in \mathbb{R}^{n^{[1]}\times m} \\ d\omega^{[1]}=\frac{1}{m}dZ^{[1]}X^T \in \mathbb{R}^{n^{[1]}\times n_x} \\ db^{[1]}=\frac{1}{m}\sum dZ^{[1]} \in \mathbb{R}^{n^{[1]} \times 1} dZ[2]=A[2]YRn[2]×mdω[2]=m1dZ[2]A[1]TRn[2]×n[1]db[2]=m1dZ[2]Rn[2]×1dZ[1]=(n[1],m) ω[2]TdZ[2](n[1],m) g[1](z[1])Rn[1]×mdω[1]=m1dZ[1]XTRn[1]×nxdb[1]=m1dZ[1]Rn[1]×1

    因此有

    Forward Propagation: Z [ 1 ] = ω [ 1 ] X + b [ 1 ] A [ 1 ] = g ( Z [ 1 ] ) Z [ 2 ] = ω [ 2 ] A [ 1 ] + b [ 2 ] A [ 2 ] = g ( Z [ 2 ] ) Backward Propagation: d Z [ 2 ] = A [ 2 ] − Y d ω [ 2 ] = 1 m d Z [ 2 ] A [ 1 ] T d b [ 2 ] = 1 m ∑ d Z [ 2 ] d Z [ 1 ] = ω [ 2 ] T d Z [ 2 ] ∗ g [ 1 ] ′ ( Z [ 1 ] ) d ω [ 1 ] = 1 m d Z [ 1 ] X T d b [ 1 ] = 1 m ∑ d Z [ 1 ] \text{Forward Propagation:} \\ Z^{[1]}=\omega^{[1]}X+b^{[1]} \\ A^{[1]} = g(Z^{[1]}) \\ Z^{[2]}=\omega^{[2]}A^{[1]}+b^{[2]} \\A^{[2]} = g(Z^{[2]}) \\ \text{Backward Propagation:} \\ dZ^{[2]}=A^{[2]}-Y \\ d\omega^{[2]}=\frac{1}{m}dZ^{[2]}A^{[1]T} \\ db^{[2]}=\frac{1}{m}\sum dZ^{[2]} \\ dZ^{[1]}=\omega^{[2]T}dZ^{[2]}*g^{[1]'}(Z^{[1]}) \\ d\omega^{[1]}=\frac{1}{m}dZ^{[1]}X^T \\ db^{[1]}=\frac{1}{m}\sum dZ^{[1]} Forward Propagation:Z[1]=ω[1]X+b[1]A[1]=g(Z[1])Z[2]=ω[2]A[1]+b[2]A[2]=g(Z[2])Backward Propagation:dZ[2]=A[2]Ydω[2]=m1dZ[2]A[1]Tdb[2]=m1dZ[2]dZ[1]=ω[2]TdZ[2]g[1](Z[1])dω[1]=m1dZ[1]XTdb[1]=m1dZ[1]

    db1 = 1. / m * np.sum(dZ1, axis=1, keepdims=True)

    这样,我们可以完整地描述向量化浅层神经网络的前向和反向传播过程。这种向量化操作大大提高了计算效率,尤其适用于多样本训练情况。

  5. 在训练神经网络时,随机初始化权重是至关重要的。如果仅仅是逻辑回归,把权重初始化为0是可行的,因为只有一个层次。但在神经网络中,若将所有权重初始化为0,梯度下降将不起作用,这主要是因为对称性问题 (Symmetry Breaking)。

    假设一个浅层神经网络有2个输入特征和2个隐藏神经元。如果将隐藏层的权重 ω [ 1 ] \omega^{[1]} ω[1] 全部初始化为0,那么两个隐藏神经元 a 1 [ 1 ] a_{1}^{[1]} a1[1] a 2 [ 1 ] a_{2}^{[1]} a2[1] 会计算完全相同的函数,即对称的隐含单元会一直保持对称。即使经过多次迭代训练,两个神经元的计算结果仍然相同。这会导致输出层的权重更新也完全一致,因此无法有效训练出不同的特征。为了使每个隐含单元学习不同的特征,我们需要随机初始化权重,使每个神经元的输出有所区别。

    我们通常对权重 ω \omega ω 生成符合高斯分布的随机值,并乘以一个小的常数,比如0.01:

    ω [ 1 ] = n p . r a n d o m . r a n d n ( 2 , 2 ) × 0.01 , b [ 1 ] = n p . z e r o s ( ( 2 , 1 ) ) ω [ 2 ] = n p . r a n d o m . r a n d n ( 2 , 2 ) × 0.01 , b [ 2 ] = 0 \omega^{[1]} = np.random.randn(2,2) \times 0.01, \quad b^{[1]} = np.zeros((2,1)) \\ \omega^{[2]} = np.random.randn(2,2) \times 0.01, \quad b^{[2]} = 0 ω[1]=np.random.randn(2,2)×0.01,b[1]=np.zeros((2,1))ω[2]=np.random.randn(2,2)×0.01,b[2]=0

    这里,将权重初始化为小的随机数可以打破对称性,确保每个神经元学习到不同的特征。而偏置项 b b b 没有对称性问题,因此可以初始化为0。

    选择小常数的原因,即为什么乘以0.01,而不是更大的数。对于使用 tanh 或 sigmoid 激活函数的网络,若权重初始化过大,会导致 z [ 1 ] = W [ 1 ] x + b [ 1 ] z^{[1]} = W^{[1]}x + b^{[1]} z[1]=W[1]x+b[1] 的数值幅度变大。这样,激活值 a [ 1 ] = g [ 1 ] ( z [ 1 ] ) a^{[1]} = g^{[1]}(z^{[1]}) a[1]=g[1](z[1]) 将接近 tanh 或 sigmoid 函数的平坦区域,这些区域的梯度很小,梯度下降会很慢,导致训练速度缓慢。这就是为什么在浅层神经网络中,我们通常选择一个较小的常数(例如0.01)来进行权重初始化。对于非常深的神经网络,仅仅使用0.01可能不够理想,可能需要使用更为复杂的初始化方法来应对梯度消失或梯度爆炸的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web与网络编程

使用HTTP协议访问Web 通过发送请求获取服务器资源的Web浏览器等&#xff0c;被成为客户端(client)。 Web使用一种名为HTTP(超文本传输协议)的协议作为规范&#xff0c;完成从客户端到服务器端等一系列运作流程。 可以说&#xff0c;Web时建立在HTTP协议上通信的。 网络基础T…

HARCT 2025 分论坛4:智能系统传感、传感器开发和数据融合中的智能数据分析

机电液一体化与先进机器人控制技术国际会议&#xff08;HARCT 2025&#xff09;将于2025年1月3日-6日在中国广西桂林召开。本届会议围绕“机电液一体化”“机器人”“控制技术”等最新研究成果&#xff0c;邀请海内外在这一领域贡献卓著的专家学者做精彩致辞和报告。 会议期间…

Vue3中一级导航栏的吸顶导航交互以及Pinia优化重复请求

一、前言 在日常的网站中&#xff0c;当鼠标滚轮往页面的底部滑动时&#xff0c;会出现顶部导航栏的隐藏&#xff0c;而出现新的导航栏显示&#xff0c;这就是一级导航栏的吸顶导航交互。本文当实现改模块功能的实现。 二、示例图 参考黑马程序员小兔仙儿PC端项目&#xff1a;…

计算机网络HTTP——针对实习面试

目录 计算机网络HTTP什么是HTTP&#xff1f;HTTP和HTTPS有什么区别&#xff1f;分别说明HTTP/1.0、HTTP/2.0、HTTP/3.0请说明访问网页的全过程请说明HTTP常见的状态码Cookie和Session有什么区别&#xff1f;HTTP请求方式有哪些&#xff1f;请解释GET和POST的区别&#xff1f;HT…

Win11 终端执行 python xxx.py 没反应

在 Win11 上写了一段 Python 代码来分析日志文件&#xff0c; 发现执行没反应。是在 VSCode 里的终端中执行的 python log_stats.py, 是 PowerShell&#xff1b; 也尝试了 cmd&#xff0c; 情况一样。 一开始怀疑代码写错&#xff0c;直到故意在代码里加打印&#xff0c;发现没…

自由学习记录(22)

最后再总结一下吧 虽然过程里很多细节也许我没有去管&#xff0c;毕竟现在就已经存在更好的解决方案了 但大致思想是了解了 A星是一种网格上的遍历方式&#xff0c;为了找到一个目标点和起点之间的要经过的最短节点组 里面更像是动态规划 每一次的遍历&#xff0c;都是当前…

如何保证MySQL与Redis缓存的数据一致性?

文章目录 一、引言二、场景来源三、高并发解决方案1. 先更新缓存&#xff0c;再更新数据库2. 先更新数据库&#xff0c;再更新缓存3. 先删除缓存&#xff0c;再更新数据库4. 先更新数据库&#xff0c;再删除缓存小结 四、拓展方案1. 分布式锁与分布式事务2. 消息队列3. 监听bin…

java-Day06 内部类 Lambda表达式 API

内部类 内部类:就是在一个类中定义一个类 格式例: public class Outer { public class Inner { } } 内部类分类 1.成员内部类(了解) 创建成员内部类 外部类.内部类 对象名new外部类().new内部类() 2.静态内部类(了解) 3.局部内部类(了解) 4.匿名内部类…

【3D Slicer】的小白入门使用指南八

3D Slicer DMRI(Diffusion MRI)-扩散磁共振认识和使用 0、简介 大脑解剖 ● 白质约占大脑的 45% ● 有髓神经纤维(大约10微米轴突直径) 白质探索 朱尔斯约瑟夫德杰林(Jules Joseph Dejerine,《神经中心解剖学》(巴黎,1890-1901):基于髓磷脂染色标本的神经解剖图谱)…

Spring Boot框架:构建可扩展的网上商城

4 系统设计 网上商城系统的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计阶段没有经过全…

【Pikachu】任意文件上传实战

将过去和羁绊全部丢弃&#xff0c;不要吝惜那为了梦想流下的泪水。 1.不安全的文件上传漏洞概述 不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的…

vue3:computed

vue3:computed 扫码或者点击文字后台提问 computed 支持选项式写法 和 函数式写法 1.选项式写法 支持一个对象传入get函数以及set函数自定义操作 2.函数式写法 只能支持一个getter函数不允许修改值的 基础示例 <template><div><div>姓&#xff1a;<i…

Python调用API翻译Excel中的英语句子并回填数据

一、问题描述 最近遇到一个把Excel表中两列单元格中的文本读取&#xff0c;然后翻译&#xff0c;再重新回填到单元格中的案例。大约有700多行&#xff0c;1400多个句子&#xff0c;一个个手动复制粘贴要花费不少时间&#xff0c;而且极易出错。这时&#xff0c;我们就可以请出…

NFS-Ganesha 核心架构解读

NFSv4 简要概述 NFS 这个协议( NFSv2 )最初由 Sun Microsystems 在 1984 年设计提出&#xff0c;由于存在一些不足&#xff0c;因此在随后由几家公司联合推出了 NFSv3。到了 NFSv4 时&#xff0c;开发完全由 IETF 主导&#xff0c;设计目标是&#xff1a; 提高互联下的 NFS 访…

直流保护电路设计及保护器件参数说明和选型

在工控产品设计中时常会涉及到电源保护的电路设计的问题&#xff0c;在深圳瑞隆源电子给出的参考电路来切入主题&#xff0c;对气体放电管、压敏电阻和TVS这三类保护器件的参数及选型进行详细说明&#xff0c;以达到深刻理解的目的。 图1 直流保护电路 举例说明&#xff0c;若…

VBA学习笔记:点击单元格显示指定的列

应用场景&#xff1a; 表格中列数较多&#xff0c;特定条件下隐藏一些无关的列&#xff0c;只保留相关的列&#xff0c;使表格更加清晰。 示例&#xff1a;原表格如下 点击一年级&#xff0c;只显示一年级相关的科目&#xff1a; 点击二年级&#xff0c;只显示二年级相关的科…

一种时间戳对齐的方法(离线)

这段代码的主要功能是: 读取指定目录下的 pcd 文件和 jpg 文件。对于每个 pcd 文件,在 jpg 目录中找到时间戳最接近的 jpg 文件。将找到的 jpg 文件复制到对应的输出目录,实现时间戳对齐。 这种时间戳对齐的操作在多传感器数据融合中非常常见,它确保了不同传感器采集的数据在时…

『VUE』27. 透传属性与inheritAttrs(详细图文注释)

目录 什么是透传属性&#xff08;Forwarding Attributes&#xff09;使用条件唯一根节点禁用透传属性继承总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 什么是透传属性&#xff08;Forwarding Attributes&#xff09; 在 V…

【代码大模型】Is Your Code Generated by ChatGPT Really Correct?论文阅读

Is Your Code Generated by ChatGPT Really Correct? Rigorous Evaluation of Large Language Models for Code Generation key word: evaluation framework, LLM-synthesized code, benchmark 论文&#xff1a;https://arxiv.org/pdf/2305.01210.pdf 代码&#xff1a;https:…

AdaBoost 二分类问题

代码功能 生成数据集&#xff1a; 使用 make_classification 创建一个模拟分类问题的数据集。 数据集包含 10 个特征&#xff0c;其中 5 个是有用特征&#xff0c;2 个是冗余特征。 数据集划分&#xff1a; 将数据分为训练集&#xff08;70%&#xff09;和测试集&#xff08;3…