介绍
术语“丢弃”用于丢弃网络的某些节点的技术。退出可以被视为暂时停用或忽略网络的神经元。该技术应用于训练阶段以减少过拟合效应。过拟合是一种错误,当网络与有限的输入样本集过于接近时会发生这种错误。
dropout 神经网络背后的基本思想是 dropout 节点,以便网络可以专注于其他特征。像这样想。你看了很多你最喜欢的演员的电影。在某些时候你会听广播,这里有人在接受采访。你不认识你最喜欢的演员,因为你只看过电影,而且你是视觉型的。现在,想象一下你只能听电影的音轨。在这种情况下,您必须学会区分女演员和演员的声音。因此,通过删除视觉部分,您将被迫专注于声音功能!
该技术首先在 Nitish Srivastava、Geoffrey Hinton、Alex Krizhevsky、Ilya Sutskever 和 Ruslan Salakhutdinov 于 2014 年在论文“Dropout:一种防止神经网络过度拟合的简单方法”中提出
我们将在 Python 机器学习教程中实现一个能够 dropout 的 Python 类。
修改权重数组
如果我们停用一个节点,我们必须相应地修改权重数组。为了演示如何实现这一点,我们将使用具有三个输入节点、四个隐藏节点和两个输出节点的网络:
首先,我们将看看输入和隐藏层之间的权重数组。我们称这个数组为“wih”(输入层和隐藏层之间的权重)。
让我们停用(退出)节点 一世2. 我们可以在下图中看到发生了什么:
这意味着我们必须取出求和的每第二个乘积,这意味着我们必须删除矩阵的整个第二列。输入向量中的第二个元素也必须被删除。
现在我们将检查如果我们取出一个隐藏节点会发生什么。我们取出第一个隐藏节点,即H1.
在这种情况下,我们可以删除权重矩阵的完整第一行:
取出一个隐藏节点也会影响下一个权重矩阵。让我们看看网络图中发生了什么:
很容易看出,who 权重矩阵的第一列又要去掉了:
到目前为止,我们已经任意选择了一个节点来停用。dropout 方法意味着我们从输入层和隐藏层中随机选择一定数量的节点,这些节点保持活动状态并关闭这些层的其他节点。在此之后,我们可以用这个网络训练我们学习集的一部分。下一步包括再次激活所有节点并随机选择其他节点。也可以使用随机创建的 dropout 网络来训练整个训练集。
我们在以下三个图中展示了三种可能的随机选择的 dropout 网络:
现在是时候考虑可能的 Python 实现了。
我们将从输入层和隐藏层之间的权重矩阵开始。我们将为 10 个输入节点和 5 个隐藏节点随机创建一个权重矩阵。我们用 -10 到 10 之间的随机数填充我们的矩阵,这不是正确的权重值,但这样我们可以更好地看到发生了什么:
将 numpy 导入为 np
导入 随机
input_nodes = 10
hidden_nodes = 5
output_nodes = 7
wih = np 。随机的。randint ( - 10 , 10 , ( hidden_nodes , input_nodes ))
wih
输出:
数组([[ -6, -8, -3, -7, 2, -9, -3, -5, -6, 4],
[ 5, 3, 7, -4, 4, 8, -2, -4, 7, 7],
[ 9, -7, 4, 0, 4, 0, -3, -6, -2, 7],
[ -8, -9, -4, -5, -9, 8, -8, -8, -2, -3],
[ 3, -10, 0, -3, 4, 0, 0, 2, -7, -9]])
我们现在将为输入层选择活动节点。我们计算活动节点的随机指数:
active_input_percentage = 0.7
active_input_nodes = int ( input_nodes * active_input_percentage )
active_input_indices = sorted ( random . sample ( range ( 0 , input_nodes ),
active_input_nodes ))
active_input_indices
输出:
[0, 1, 2, 5, 7, 8, 9]
我们在上面了解到我们必须删除列 j,如果节点 一世j已移除。通过对活动节点使用切片运算符,我们可以轻松地为所有非活动节点完成此操作:
wih_old = wih 。copy ()
wih = wih [:, active_input_indices ]
wih
输出:
数组([[ -6, -8, -3, -9, -5, -6, 4],
[ 5, 3, 7, 8, -4, 7, 7],
[ 9, -7, 4, 0, -6, -2, 7],
[ -8, -9, -4, 8, -8, -2, -3],
[ 3, -10, 0, 0, 2, -7, -9]])
正如我们之前提到的,我们将不得不修改 'wih' 和 'who' 矩阵:
谁 = np 。随机的。randint ( - 10 , 10 , ( output_nodes , hidden_nodes ))
print ( who )
ac