浅层神经网络

浅层神经网络

  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 ] Backward Propagation: A [ 2 ] = g ( Z [ 2 ] ) 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 ∈ R n [ 1 ] × n x 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]} \\ \text{Backward Propagation:} \\A^{[2]} = g(Z^{[2]}) \\ 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 \in \mathbb{R}^{n^{[1]}\times n_x} \\ 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]Backward Propagation:A[2]=g(Z[2])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]XTRn[1]×nxdb[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.xdnf.cn/news/13052.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

解决apidoc不是内部或外部命令,也不是可运行的程序 或批处理文件。

apidoc官网 首先确保安装了apidoc,我这里是全局安装的。 npm install apidoc -g然后打开cmd窗口执行命令时就会报错。 apidoc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 此时只需要找到它&#xff0c;再把它加入环境变量即可了。 win10中npm默认路径:C:\User…

可私有化部署API的集装箱箱号自动识别技术,专业算法厂家

启智畅想作为人工智能行业OCR识别算法厂家&#xff0c;可将集装箱箱号自动识别技术私有化部署&#xff0c;并提供私有化部署的API的接口&#xff0c;在物流行业中正逐渐崭露头角&#xff0c;成为提升效率与精度的关键力量。这一技术不仅打破了传统识别方式的局限&#xff0c;更…

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?

目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里&#xff1f; 1、一个问题&#xff1a; 2、查看消费者消费主题__consumer_offsets 3、一个重要前提&#xff1a;消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了&#xff0c;你重启kafka之后&#xff0…

第七届中国国际进口博览会 2024长三角G60科创走廊高质量发展要素对接大会举行

11月9日&#xff0c;第七届中国国际进口博览会2024长三角G60科创走廊高质量发展要素对接大会在国家会展中心举行。会上&#xff0c;G60科创走廊九城市共赴进博之约&#xff0c;以全面深化改革为动力&#xff0c;深入推进长三角G60科创走廊走深走实&#xff0c;携手推动科技创新…

一键P图新神器!SeedEdit让图片编辑更快捷!

大家还记得MJ推出的图片编辑功能吗&#xff1f;只需涂抹想要修改的区域&#xff0c;再输入提示词&#xff0c;就能一键更改原图。而现在&#xff0c;豆包大模型团队也推出了类似的功能——SeedEdit&#xff0c;而且更加简单快捷&#xff01; Ai 智能办公利器 - Ai-321.com 人工…

【数据分析与数据挖掘】决策树算法

决策树的构造的本质是利用训练数据构造一棵决策树&#xff0c;然后利用这棵树所提炼出来的规则进行预测。算法过程大体分为两步&#xff1a;1.利用训练数据构造决策树 2.利用构造的决策树进行预测 分类相关知识 信息熵 信息熵由香农提出&#xff0c;用来衡量事件的不确定性的…

丹摩征文活动|智谱AI引领是实现文本可视化 - CogVideoX-2b 部署与使用

文章目录 前言一、DAMODEL平台特性二、创建CPU云实例三、CogVedioX介绍四、DAMODEL一键部署CogVideoX1. 创建丹摩实例(参考上述介绍)2. 配置环境和依赖3. 模拟与配置文件4. 开始运行4.1 调试4.2 webUI4.3 端口映射 前言 DAMODEL&#xff08;丹摩智算&#xff09;是一款专为满足…

22. 记录架构

文章目录 第22章 记录架构22.1 架构文档的用途和受众22.2 符号表示22.3 视图模块视图组件和连接器视图C&C 视图的符号表示 分配视图质量视图 22.4 组合视图22.5 记录行为22.6 视图之外22.7 记录基本原理22.8 架构的利益相关者22.9 实际考虑建模工具在线文档、超文本和维基遵…

Python练习19

Python日常练习 题目&#xff1a; 打印如下九九乘法表 1*11 2*12 2*24 3*13 3*26 3*39 4*14 4*28 4*312 4*416 5*15 5*210 5*315 5*420 5*525 6*16 6*212 6*318 6*424 6*530 6*636 7*17 7*214 7*321 7*428 7*535 7*642 7*749 8*18 8*216 8*324 8*432 8*540 8*648 8*756 8*86…

卸载 Python

文章目录 WindowsmacOSLinux总结 卸载 Python 的方法取决于你使用的操作系统。以下是针对不同操作系统的卸载步骤&#xff1a; Windows 打开控制面板&#xff1a; 按 Win R 打开运行对话框&#xff0c;输入 control&#xff0c;然后按 Enter。或者&#xff0c;从开始菜单搜索并…

使用Wireshark获取USB HID(Human Interface Device)报告描述符

使用Wireshark选择需要获取的USB进行抓取数据&#xff0c;找到设备&#xff08;host&#xff09;接收信息的数据 第二栏出现hid报告&#xff0c;右击选择复制流 将复制的内容粘贴到USB标准请求及描述符在线分析工具 - USB中文网 进行解析 以图中获取手写板的数据为例&#xff…

【深度学习】LSTM、BiLSTM详解

文章目录 1. LSTM简介&#xff1a;2. LSTM结构图&#xff1a;3. 单层LSTM详解4. 双层LSTM详解5. BiLSTM6. Pytorch实现LSTM示例7. nn.LSTM参数详解 1. LSTM简介&#xff1a; LSTM是一种循环神经网络&#xff0c;它可以处理和预测时间序列中间隔和延迟相对较长的重要事件。LSTM通…

PyQt5 加载UI界面与资源文件

步骤一: 使用 Qt Designer 创建 XXX.ui文件 步骤二: 使用 Qt Designer 创建 资源文件 步骤三: Python文件中创建相关类, 使用 uic.loadUi(mainwidget.ui, self ) 加载UI文件 import sys from PyQt5 import QtCore, QtWidgets, uic from PyQt5.QtCore import Qt f…

ENSP作业——小型园区网

题目 根据上图&#xff0c;可得需求为&#xff1a; 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥&#xff0c;设置SW2为VLAN 20/30的主根桥&#xff0c;且两台交换机互为主备。 3.可以使用super vlan。&#xff08;本次实验中未使用&#xff09; 4.上层通过静…

计算机网络:运输层 —— 运输层端口号

文章目录 运输层端口号的分类端口号与应用程序的关联应用举例发送方的复用和接收方的分用 运输层端口号的分类 端口号只具有本地意义&#xff0c;即端口号只是为了标识本计算机网络协议栈应用层中的各应用进程。在因特网中不同计算机中的相同端口号是没有关系的&#xff0c;即…

【C++练习】使用C++编写程序计算π的近似值

题目&#xff1a;使用C编写程序计算π的近似值 描述&#xff1a; 编写一个C程序&#xff0c;使用一个特定的数学公式来计算圆周率&#xff08;π&#xff09;的近似值。该程序定义了一个函数calculatePi()&#xff0c;该函数通过一个迭代算法和一个涉及反正切函数&#xff08;…

Hook小程序

下载&#xff1a; https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python 配置&#xff1a; pip install -r requirements 实现&#xff1a; 开启小程序开发者模式&#xff0c;类似浏览器F12 效果&#xff1a; 使用&#xff1a; 退出微信&#xff0c;进入安装的目录…

如何在pycharm中 判断是否成功安装pytorch环境

1、在电脑开始端&#xff0c;找到 2、打开后 在base环境下 输入conda env list 目前我的环境中没有pytorch 学习视频&#xff1a;【Anaconda、Pytorch、Pycharm到底是什么关系?什么是环境?什么是包?】https://www.bilibili.com/video/BV1CN411s7Ue?vd_sourcefad0750b8c6…

AI陪伴走热,网易云信“融合通讯+AI”新方案发布!附场景App及源码

信息秒回、不会失联、724h 情感陪伴、随时提供情绪价值......在 AI 能力越来越强大的今天&#xff0c;我们开始有了“AI 助手”、“AI 搭子”&#xff0c;甚至开始谈起“AI 男友/女友”&#xff0c;AI 的角色早已超越了简单的生产力工具&#xff0c;它正深入到我们生活的方方面…

力扣 LeetCode 704. 二分查找(Day1:数组)

解题思路&#xff1a; 二分查找主要分为[ left , right ]左闭右闭和[ left , right )左闭右开两种 此处采取[ left , right ]左闭右闭写法 注意&#xff1a; 1. right的初始化取值 2. while中取等 3. right mid -1 ; class Solution {public int search(int[] nums, i…