共计 3666 个字符,预计需要花费 10 分钟才能阅读完成。
动动发财的小手,点个赞吧!
过拟合是咱们大多数人在训练和应用机器学习模型时曾经或最终会遇到的常见挑战。自机器学习诞生以来,钻研人员始终在致力反抗过拟合。他们提出的一种技术是 dropout 正则化,其中模型中的神经元被随机移除。在本文中,咱们将探讨 dropout 正则化的工作原理、如何在您本人的模型中施行它,以及与其余办法相比它的优缺点。
1. 简介
1.1. 什么是过拟合
过拟合是指模型在其训练数据上适度训练,导致它在新数据上体现不佳。从实质上讲,在模型力求尽可能精确的过程中,它过分关注训练数据集中的细节和噪声。这些属性通常不存在于真实世界的数据中,因而模型往往体现不佳。当模型的参数绝对于数据量而言太多时,就会产生过拟合。这可能导致模型适度关注与模型必须开发的个别模式无关的较小细节。例如,假如训练了一个简单模型(许多参数)来辨认图片中是否有马。在这种状况下,它可能会开始关注天空或环境的细节,而不是马自身。这可能产生在:
- 该模型太简单(具备太多参数)而不利于其本身。
- 模型训练工夫过长。
- 训练模型的数据集太小。
- 该模型在雷同的数据上进行训练和测试。
- 训练模型的数据集具备反复的特色,使其容易过拟合。
1.2. 重要性
过拟合不仅仅是一个简略的懊恼——它会毁坏整个模型。它给人一种模型体现良好的错觉,即便它无奈对所提供的数据进行适当的概括。
过拟合会产生极其重大的结果,尤其是在人工智能越来越遍及的医疗保健等畛域。因为过拟合而未通过适当训练或测试的 AI 可能导致错误诊断。
2. 什么是 Dropout
- Dropout 是一种正则化技术
现实状况下,反抗过拟合的最佳办法是在同一数据集上训练大量不同架构的模型,而后对它们的输入进行均匀。这种办法的问题在于它十分消耗资源和工夫。尽管绝对较小的模型可能负担得起,但可能须要大量工夫来训练的大型模型很容易压垮任何人的资源。
Dropout 的工作原理是从输出层或暗藏层中“抛弃”一个神经元。多个神经元从网络中移除,这意味着它们实际上不存在——它们的传入和传出连贯也被毁坏。这人为地创立了许多更小、更不简单的网络。这迫使模型不再齐全依赖于一个神经元,这意味着它必须使其办法多样化并开发多种办法来实现雷同的后果。例如,回到马的例子,如果一个神经元次要负责马的树局部,它的被抛弃将迫使模型更多地关注图像的其余特色。Dropout 也能够间接利用于输出神经元,这意味着整个特色都从模型中隐没了。
- 将 Dropout 利用于神经网络
通过在每一层(包含输出层)中随机抛弃神经元,将 Dropout 利用于神经网络。预约义的抛弃率决定了每个神经元被抛弃的机会。例如,dropout rate 为 0.25 意味着神经元有 25% 的几率被抛弃。在模型训练期间的每个期间都会利用 Dropout。
3. 利用
3.1. 数据集
让咱们从一个可能容易过拟合的数据集开始:
# Columns: has tail, has face, has green grass, tree in background, has blue sky, 3 columns of noise | is a horse image (1) or not (0)
survey = np.array([[1, 1, 1, 1, 1, 1], # tail, face, green grass, tree, blue sky | is a horse image
[1, 1, 1, 1, 1, 1], # tail, face, green grass, tree blue sky | is a horse image
[0, 0, 0, 0, 0, 0], # no tail, no face, no green grass, no tree, no blue sky | is not a horse image
[0, 0, 0, 0, 0, 0], # no tail, no face, no green grass, no tree, no blue sky | is not a horse image
])
此数据与咱们的马及其环境示例相干。咱们将图像的个性形象为一种易于了解的简略格局。能够分明地看到,数据并不现实,因为其中有马的图像也恰好蕴含树木、绿草或蓝天——它们可能在同一张照片中,但一个不影响另一个。
3.2. 模型
让咱们应用 Keras 疾速创立一个简略的 MLP:
# Imports
from keras.models import Sequential
from keras.layers import Dense, Dropout
import numpy as np
# Columns: has tail, has face, has green grass, tree in background, has blue sky, 3 columns of noise | is a horse image (1) or not (0)
survey = np.array([[1, 1, 1, 1, 1, 1], # tail, face, green grass, tree, blue sky | is a horse image
[1, 1, 1, 1, 1, 1], # tail, face, green grass, tree blue sky | is a horse image
[0, 0, 0, 0, 0, 0], # no tail, no face, no green grass, no tree, no blue sky | is not a horse image
[0, 0, 0, 0, 0, 0], # no tail, no face, no green grass, no tree, no blue sky | is not a horse image
])
# Define the model
model = Sequential([Dense(16, input_dim=5, activation='relu'),
Dense(8, activation='relu'),
Dense(1, activation='sigmoid')
])
# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Train the model
X = survey[:, :-1]
y = survey[:, -1]
model.fit(X, y, epochs=1000, batch_size=1)
# Test the model on a new example
test_example = np.array([[1, 1, 0, 0, 0]])
prediction = model.predict(test_example)
print(prediction)
我强烈建议应用 Python notebook(例如 Jupyter Notebook)来组织代码,这样您就能够疾速从新运行单元而无需从新训练模型。沿每个正文拆分代码。
让咱们进一步剖析咱们正在测试模型的数据:
test_example = np.array([[1, 1, 0, 0, 0]])
实质上,咱们有一张蕴含马的所有属性的图像,但没有蕴含在数据中的任何环境因素(绿草、蓝天、树木等)。模型输入:
0.02694458
即便模型有脸和尾巴——咱们用它来辨认马——也只有 2.7% 的概率确定图像是马。
3.3. Dropout
Keras 使施行 dropout 以及其余避免过拟合的办法变得非常简单。咱们只须要返回到蕴含模型层的列表:
# Define the model
model = Sequential([Dense(16, input_dim=5, activation='relu'),
Dense(8, activation='relu'),
Dense(1, activation='sigmoid')
])
并增加一些 dropout 层!
# Define the model
model = Sequential([Dense(16, input_dim=5, activation='relu'),
Dropout(0.5),
Dense(8, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid')
])
当初模型输入:
0.98883545
马图像即便不蕴含环境变量,也有 99% 的把握是马!
Dropout(0.5) 示意下层中的任何神经元都有 50% 的机会被“抛弃”或从存在中移除。通过施行 dropout,咱们基本上以资源高效的形式在数百个模型上训练了 MLP。
3.4. Dropout Rate
为你的模型找到现实的 Dropout 率的最好办法是通过重复试验——没有万能的办法。从 0.1 或 0.2 左右的低失落率开始,而后缓缓减少,直到达到所需的精度。应用咱们的马 MLP,0.05 的 dropout 导致模型有 16.5% 的置信度图像是马的图像。另一方面,0.95 的 dropout 只是抛弃了太多神经元以使模型无奈运行——但依然达到了 54.1% 的置信度。这些值不适用于此模型,但这的确意味着它们可能适宜其余模型。
4. 总结
dropout 是机器学习中用于避免过拟合和整体进步模型性能的一种弱小技术。它通过从输出层和暗藏层的模型中随机“抛弃”神经元来实现这一点。这容许分类器在一次训练中训练成千盈百个独特的模型,避免它适度关注某些特色。
本文由 mdnice 多平台公布