def l2_penalty(w): return (w**2).sum() / 2
l = loss(net(X), y) + lambd * l2_penalty(w)
当使用随机梯度下降(SGD)优化器时,L2正则化会导致以下直接结果:
这种机制强制网络学习更加鲁棒的特征,因为它不能依赖于任何特定的神经元始终存在。这有助于减少过拟合,提高模型的泛化能力。
def net(X): X = X.reshape(-1, num_inputs) H1 = npx.relu(np.dot(X, W1) + b1) # 只有在训练模型时才使用dropout if autograd.is_training(): # 在第一个全连接层之后添加一个dropout层 H1 = dropout_layer(H1, dropout1) H2 = npx.relu(np.dot(H1, W2) + b2) if autograd.is_training(): # 在第二个全连接层之后添加一个dropout层 H2 = dropout_layer(H2, dropout2) return np.dot(H2, W3) + b3
在第一隐藏层 H1 之后 在第二隐藏层 H2 之后
在这个网络中,神经元是指每一层的计算单元。具体来说:
H1 中的每个元素代表第一隐藏层的一个神经元的输出
H2 中的每个元素代表第二隐藏层的一个神经元的输出
Dropout 随机丢弃的是神经元的输出
。
在这个网络中,它分别作用于 H1 和 H2。 让我们通过一个具体的例子来更直观地理解:
假设我们有一个简化的网络,其中:
输入层有 4 个特征
第一隐藏层有 6 个神经元
第二隐藏层有 4 个神经元
输出层有 2 个神经元 Dropout 率为 0.5(意味着每次大约有 50% 的神经元会被丢弃) 示例:
json
输入 X: [0.1, 0.2, 0.3, 0.4]
第一隐藏层 H1 (在 Dropout 之前):
[0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
应用 Dropout 后的 H1:
[0, 0.6, 0.7, 0, 0.9, 0] # 随机将一些元素置为 0
第二隐藏层 H2 (在 Dropout 之前):
[1.1, 1.2, 1.3, 1.4]
应用 Dropout 后的 H2:
[1.1, 0, 1.3, 0] # 再次随机将一些元素置为 0
输出: [结果1, 结果2]
在这个例子中:
第一隐藏层的 6 个神经元中,有 3 个被"丢弃"(输出被设为 0)。 第二隐藏层的 4 个神经元中,有 2 个被"丢弃"。 重要说明:
Dropout 只在训练时应用,这就是为什么代码中有 if autograd.is_training() 的判断。 每次前向传播时,被丢弃的神经元都是随机选择的。 在测试时,所有神经元都参与计算,但权重会相应调整以补偿训练时的 Dropout。
本文作者:Bob
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!