深度神经网络训练与正则化技巧
立即解锁
发布时间: 2025-09-02 00:50:37 阅读量: 2 订阅数: 32 AIGC 

### 深度神经网络训练与正则化技巧
在深度神经网络的训练过程中,学习率的调整和防止过拟合是两个关键问题。下面将详细介绍相关的方法和技术。
#### 学习率调度
`tf.keras` 提供了另一种实现学习率调度的解决方案。可以先使用 `keras.optimizers.schedules` 中可用的调度方法来定义学习率,然后将该学习率传递给任何优化器。在这种情况下,学习率不是在每个时期更新,而是在每个步骤更新。
例如,实现之前在 `exponential_decay_fn()` 函数中定义的指数调度的代码如下:
```python
s = 20 * len(X_train) // 32 # 20 个时期的步骤数(批次大小 = 32)
learning_rate = keras.optimizers.schedules.ExponentialDecay(0.01, s, 0.1)
optimizer = keras.optimizers.SGD(learning_rate)
```
这种方法简单明了,而且保存模型时也会保存学习率及其调度(包括其状态)。不过,此解决方案不属于 Keras API,而是 `tf.keras` 特有的。
另外,实现 1cycle 方法并不困难,只需创建一个自定义回调,在每次迭代时修改学习率(要更新优化器的学习率,可设置 `self.model.optimizer.lr`)。
总的来说,指数衰减、性能调度和 1cycle 方法都能显著加速收敛,不妨尝试一下。
#### 正则化防止过拟合
深度神经网络通常拥有数万个甚至数百万个参数,这种高度的灵活性虽然使其能够适应各种复杂的数据集,但也容易导致过拟合训练集,因此需要进行正则化。
常见的正则化技术包括提前停止、批量归一化,以及下面将详细介绍的 ℓ1 和 ℓ2 正则化、Dropout 和最大范数正则化。
##### ℓ1 和 ℓ2 正则化
可以使用 ℓ2 正则化来约束神经网络连接的权重,如果想要一个稀疏模型(有许多权重为零),则可以使用 ℓ1 正则化。
以下是如何将 ℓ2 正则化应用于 Keras 层连接权重的示例,使用的正则化因子为 0.01:
```python
layer = keras.layers.Dense(100, activation="elu",
kernel_initializer="he_normal",
kernel_regularizer=keras.regularizers.l2(0.01))
```
`l2()` 函数返回一个正则化器,在训练的每个步骤都会调用它来计算正则化损失,然后将其添加到最终损失中。如果要使用 ℓ1 正则化,可直接使用 `keras.regularizers.l1()`;若要同时应用 ℓ1 和 ℓ2 正则化,可使用 `keras.regularizers.l1_l2()`(需指定两个正则化因子)。
通常希望对网络的所有层应用相同的正则化器,并在所有隐藏层中使用相同的激活函数和初始化策略,这会导致代码重复且容易出错。可以使用 Python 的 `functools.partial()` 函数来解决这个问题,它可以围绕可执行对象创建一个包装器,并设置默认参数值。
示例代码如下:
```python
from functools import partial
RegularizedDense = partial(keras.layers.Dense,
activation="elu",
kernel_initializer="he_normal",
kernel_regularizer=keras.regularizers.l2(0.01))
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=[28, 28]),
RegularizedDense(300),
RegularizedDense(100),
RegularizedDense(10, activation="softmax",
kernel_initializer="glorot_uniform")
])
```
##### Dropout
在深度神经网络中,Dropout 是最常用的正则化技术之一。它由 Geoffrey Hinton 在 2012 年提出,并由 Nitish Srivastava 等人在后续文章中详细阐述。实践证明,即使是最现代的神经网络,简单添加 Dropout 也能将其精度提高 1% 到 2%。对于精度已经达到 95% 的模型来说,提高 2% 意味着错误率降低
0
0
复制全文
相关推荐










