写自己的ASP.NET MVC框架(下)

📅 发布时间:2026/7/6 1:22:08 👁️ 浏览次数:
写自己的ASP.NET MVC框架(下)
壮猎彩叵1. 浅层神经网络里的激活函数1.1 隐藏层激活函数的作用在逻辑回归中我们知道最后使用sigmoid激活函数是为了让加权和映射为概率从而实现分类效果。而现在如果我们仍要进行二分类而浅层神经网络输出层的sigmoid函数已经实现了分类效果那隐藏层再使用激活函数的作用是什么我们看一看如果不设隐藏层神经元的激活函数正向传播的输出是什么形式首先隐藏层只有线性组合那么隐藏层的输出就是加权和本身:现在隐藏层的加权和就是输出层的输入即我们观察一下就会发现的实际形式没有发生任何变化我们换一个示例看一下可以发现其形式依旧是“权重 × 输入 偏置”的线性表达式。也就是说无论我们堆叠多少层这样的“线性层”最后得到的结果仍然等价于一个没有任何非线性能力的线性模型。这与逻辑回归本质上并没有区别。在这种情况下多层和一层的区别就相当于多层一层这便是激活函数的核心作用引入非线性1.2 激活函数如何引入非线性我们已经知道 在没有激活函数的情况下神经元的输出是而当我们加入激活函数后输出就变成因为此时下一层的输入就变成了一个经过非线性映射的结果这意味着如果是线性的例如恒等函数网络整体依旧是线性关系而只要是非线性函数如 Sigmoid、ReLU、tanh 等网络整体的映射关系就无法再化简为一个单一的线性变换。我们继续刚刚那个例子现在我们只改一点把激活函数换成ReLU即隐藏层的传播过程即为再输入输出层这个时候整体的输出函数变成这就是一个分段线性函数可以拐弯、有“折点”不再是单一直线。那如果再换成更复杂的激活函数呢这也意味着网络具备了拟合非线性关系的能力。最后看一张图Pasted image 20251018180929我们想通过图中的几个数据点进行拟合没有激活函数我们就只能像左侧一样画一条直线而只有使用了激活函数我们才能让这条直线弯曲来实现更好拟合效果。1.3 常见的激活函数在了解了激活函数的作用——为神经网络引入非线性能力之后我们来看看几种常见的激活函数及其特性。不同的激活函数会对神经元的输出特征、梯度传播和训练效果产生显著影响。1Sigmoid 函数Sigmoid 的表达式为其输出范围在之间形状如“S”型曲线。Sigmoid 的优点在于它可以将任意实数映射为非常适合二分类任务的输出层例如预测概率。缺点是当输入较大或较小时梯度接近 0容易出现梯度消失问题导致网络难以训练。myplot12Tanh函数Tanh 是 Sigmoid 的改进版本其表达式为输出范围在之间同样是“S”型曲线。Tanh 的优点在于输出均值为 0有助于加快梯度下降的收敛并在一定程度上缓解了梯度消失问题。缺点在于当输入过大或过小时依然会出现梯度趋于 0 的饱和现象。如果把 Sigmoid 看作“挤压到 [0,1]”那么 Tanh 就是“挤压到 [-1,1]”更加对称有利于后续层学习因此Tanh比sigmoid更适合作为隐藏层的激活函数。myplot23ReLU函数ReLU 是目前最常用的激活函数之一定义为当输入为正时输出等于自身当输入为负时输出为 0。ReLU 的优点在于计算简单梯度传播效率高并且在正区间保持线性减少了梯度消失问题从而加快训练速度。缺点在于对于负输入梯度恒为 0容易出现“神经元死亡”现象即某些神经元永远输出 0无法更新。myplot34Leaky ReLU带泄漏的 ReLU为了缓解 ReLU 的“神经元死亡”问题便出现了 Leaky ReLU其中是一个很小的常数通常取 0.01。Leaky ReLU 的优点在于对负区间保留一个微小的斜率避免梯度完全为 0从而训练更加稳定减少“死神经元”的出现。缺点是其输出仍然不是严格的零中心且的选取需要进行调试。myplot42.浅层神经网络的反向传播我们知道在浅层神经网络里我们涉及到两个层级各自的权重和偏置因此不同于逻辑回归中的一次更新我们这次需要在一次反向传播过程中更新两个层级的参数。参数的传递过程如下隐藏层参数个神经元输出层参数个神经元2.1 损失函数我们知道二分类交叉熵成本函数格式如下向量化后即可表示为我们依旧通过损失函数使用链式法则来计算梯度。2.2 输出层梯度输出层激活函数为而输出层误差定义为在第二周的推导中我们已经知道对于二分类交叉熵 sigmoid损失对加权和的导数可简化为继续通过链式法则我们得到输出层权重和偏置的梯度详细过程可看第二周的推导3.3 隐藏层梯度对于隐藏层这里我们便不定义具体的激活函数用通式来展示过程先梳理一下我们现在有的量损失对输出层加权和的导数隐藏层的加权和隐藏层的的加权和经过激活函数的输出隐藏层的激活函数和它的导数隐藏层的参数,现在我们要求隐藏层参数的梯度首先要得到损失关于隐藏层输出的导数即再通过链式法则细化一下我们得到再看一眼加权和公式所以通过求导我们得到转置为了匹配维度下一步得到损失关于隐藏层加权和的输出即而隐藏层输出对加权和求导其实就是激活函数的导数因此我们得到注意这里的乘是Hadamard 乘。Hadamard 乘激活导数 对每个神经元每个样本的误差单独乘上对应的激活导数到了这一步我们就可以得到最后的梯度还没完这里还有一点要强调注意看这个符号我们之前的逻辑回归以及本次传播的输出层偏置使用的符号都是,对这个符号求平均就代表对个样本在同一神经元上的误差求平均。而现在我们的隐藏层有四个神经元由此解释一下的含义代表所有行代表第列代表对的每一列求和得到的结果是所有样本分别在四个隐藏神经元总误差最后求平均值即为平均误差现在 每个元素就对应一个隐藏神经元的偏置梯度。我们也总结一下反向传播过程中各个量和其维度量 维度 说明X n × m 输入特征W[1] 4 × n 隐藏层权重b[1] 4 × 1 → 4×m 隐藏层偏置广播Z[1] 4 × m 隐藏层线性组合A[1] 4 × m 隐藏层激活输出W[2] 1 × 4 输出层权重b[2] 1 × 1 → 1×m 输出层偏置广播Z[2] 1 × m 输出层线性组合A[2] 1 × m 输出层激活输出dZ[2] 1 × m 输出层误差dW[2] 1 × 4 输出层权重梯度db[2] 1 × 1 输出层偏置梯度dA[1] 4 × m 输出层误差传回隐藏层dZ[1] 4 × m 隐藏层误差Hadamard乘激活导数dW[1] 4 × n 隐藏层权重梯度db[1] 4 × 1 隐藏层偏置梯度3.4 更新参数在完成所有梯度计算后我们就可以使用梯度下降法来更新网络的权重和偏置公式如下1 输出层参数更新2 隐藏层参数更新这样我们就完成了浅层神经网络的一个反向传播过程的梳理。相比逻辑回归浅层神经网络在一次反向传播中更新了两层参数而在之后的更复杂的神经网络结构中隐藏层数量也不只一层这样在一次反向传播中就会更新更多的参数。但其形式也只是像现在这样的通过链式法则的层层求导更新即可。所以之后便会尽量少的出现这样比较繁杂的求导但前提是要了解神经网络通过反向传播更新参数的逻辑。下一篇即为本周理论部分的最后一部分是神经网络的参数初始化也是多个隐藏层神经元能发挥不同作用的原因。