本文讨论的是TensorFlow(tf.nn.dropout)中一种特殊的层,叫做Dropout层,它在深度神经网络中被用来作为防止或纠正过拟合问题的措施。而这个纠正的过程是一种叫做 "随机正则化 "的正则化技术。
目录:
- 过度拟合的问题
- 剔除操作
- 剔除过程
- TensorFlow中的Dropout(tf.nn.dropout)。
- Dropout的应用
过度拟合的问题
在深入研究Dropout层的实现之前,让我们了解什么是过拟合。过拟合和欠拟合是我们在训练模型时面临的两个最常见和最重要的问题。为了达到良好的准确性和平衡,考虑偏差-变异权衡变得很重要。
过度拟合是指当模型的学习曲线试图完全适应训练数据时发生的问题。它的发生主要是因为训练数据中存在噪音(非必要的信息),以及我们试图训练太多。该模型吸收了噪声,因此在训练数据上表现良好,但在测试集或未见过的数据上却表现不佳。因此,这些模型具有低偏差和高方差。通常情况下,像决策树这样的复杂模型很容易出现这种问题。
剔除操作
如前所述,Dropout是一个特殊层,它被引入以增加功能或执行某些操作。这些特殊层不包含任何神经元。
Dropout的概念
Dropout的主要想法是缩小范围,寻找一组非常具体的权重,这些权重负责使网络学习这些噪声模式。
这里的主要想法是随机地放弃它们。这是通过在每个训练步骤中放弃特定层的一部分输入神经元来实现的,例如,根据神经元的数量,放弃50%或33%。因此,通过这种方式,我们在每个训练步骤中训练各种不同的网络,而且在任何连续的两个步骤中都不可能放弃相同的神经元。因此,最后我们得到的是在每个训练步骤中得到的所有不同的神经元连接组合的平均值。
丢弃这些神经元使得网络从数据中发现的一般或广泛模式中学习。因此,我们正在使节点更加独立。
据观察,在最后几层(全连接层)使用dropout,有助于提高错误率。在最后几层使用它们也是一种常见的做法。它可以在任何一个隐藏层以及输入层中实现,但不能在输出层中实现。
其次要注意的是,Dropout只在训练阶段使用,在评估或测试阶段不使用;换句话说,我们把它当作一个没有Dropout的正常神经网络。
辍学过程
为了实现这个神经元的去激活:
- 在前向传播的过程中,会产生一个丢弃掩码(零和一)。而这只在训练过程中使用。
- 该掩码被应用于前一层的输出或下一层的输入。
- 权重被乘以输出,即在应用掩码后得到的输出,此外还添加了一个偏置。
- 最后将其传递给激活函数。
所有这些权重都在所有不同的网络组合中共享。在反向传播过程中,只有瘦身网络的权重或只有那些在前向传播中被激活的神经元被选择。在前向传播中应用掩码后得到的输出被存储并作为反向传播的缓存。
TensorFlow中的Dropout(tf.nn.dropout)
在TensorFlow中的实现,一般的想法是在测试的时候降低权重的等级。
假设权重是[1,2,3,4,5,6,7,8] ,dropout超参数p设置为0.75,即随机放弃四分之三的神经元,我们会有[1,0,3,0,0,6,7,0] ,在测试过程中我们会乘以p,即0.75*[1,2,3,4,5,6,7,8] 。
但是在TensorFlow中,我们遵循一个稍微不同的过程,而不是在测试时降级,我们在训练期间通过乘以p的倒数,即1/0.75,将其余的元素设置为零,这将给我们一个矩阵[1.33,0,4,0,0,8,9.33,0] ,但在测试时我们会做1/1*[1,2,3,4,5,6,7,8] ,所以我们把它当作一个正常的神经网络。
我们正在扩大规模以保持总和,即
[1,2,3,4,5,6,7,8] = 36
[1.33,0,4,0,0,8,9.33,0] = 23
我们的想法是保持输出近似不变,不管我们使用什么技术。
用Python写代码。
我们使用tf.nn模块中的dropout()函数或方法,在我们的TensorFlow模型中创建一个dropout层。
它接受以下参数
tf.nn.dropout(
x, rate, noise_shape=None, seed=None, name=None
)
其中x 是输入,它将被1 / keep_prob 上升,否则0 被输出。
keep_prob 保留指定的部分权重,并将其余部分设置为零:
import numpy as np
import tensorflow as tf
tf.random.set_seed(0)
x = tf.ones([2,5])
tf.nn.dropout(x, rate = 0.8, seed = 1).numpy()
会给我们一个输出为:
array([[0., 0., 0., 5., 5.],
[0., 5., 0., 5., 0.]], dtype=float32)
Dropout的应用
在2014年的论文 "Dropout:防止神经网络过度拟合的简单方法》一文中,Dropout被用于广泛的计算机视觉、语音识别和文本分类任务,发现它能持续改善每个问题的性能。
通过OpenGenus的这篇文章,你一定对TensorFlow中的dropout操作有了完整的了解。