即dropout,解决模型过拟合问题
深度学习中Dropout原理解析
宏观印象:
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
# 在第一个全连接层之后添加一个dropout层
nn.Dropout(dropout1),
nn.Linear(256, 256),
nn.ReLU(),
# 在第二个全连接层之后添加一个dropout层
nn.Dropout(dropout2),
nn.Linear(256, 10))
内部实现:
def dropout_layer(X, dropout):
assert 0 <= dropout <= 1
# 在本情况中,所有元素都被丢弃
if dropout == 1:
return torch.zeros_like(X)
# 在本情况中,所有元素都被保留
if dropout == 0:
return X
mask = (torch.rand(X.shape) > dropout).float()
return mask * X / (1.0 - dropout) # 1-p保证期望不会改变
两者来自于神经网络的层次
随着层次的增加,计算梯度时会导致多次矩阵乘法
梯度爆炸带来的问题:
原因:每个层输出的值太大,累加导致爆炸
梯度消失带来的问题: