为啥 Pytorch Dropout 层会影响所有值,而不仅仅是设置为零的值?

Posted

技术标签:

【中文标题】为啥 Pytorch Dropout 层会影响所有值,而不仅仅是设置为零的值?【英文标题】:Why is the Pytorch Dropout layer affecting all values, not only the ones set to zero?为什么 Pytorch Dropout 层会影响所有值,而不仅仅是设置为零的值? 【发布时间】:2020-03-19 02:25:31 【问题描述】:

Pytorch 的 dropout 层会更改未设置为零的值。使用 Pytorch 的文档示例:(source):

import torch
import torch.nn  as nn

m = nn.Dropout(p=0.5)
input = torch.ones(5, 5)
print(input)
tensor([[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]])

然后我将它通过dropout 层:

output = m(input)
print(output)
tensor([[0., 0., 2., 2., 0.],
        [2., 0., 2., 0., 0.],
        [0., 0., 0., 0., 2.],
        [2., 2., 2., 2., 2.],
        [2., 0., 0., 0., 2.]])

未设置为零的值现在是 2。为什么?

【问题讨论】:

【参考方案1】:

这就是 dropout 正则化的工作原理。在 dropout 之后,这些值除以保持概率(在本例中为 0.5)。

由于 PyTorch Dropout 函数接收归零神经元的概率作为输入,如果您使用nn.Dropout(p=0.2),则意味着它有 0.8 的机会保持。所以表上的值将是 1/(1-0.2)。

这被称为“反向 dropout 技术”,这样做是为了确保激活的期望值保持不变。

【讨论】:

关闭但不完全。使用p=0.2,它给出1/(1-0.2),所以1.25。如果是 5,则为 p=0.8 ops,那是因为pytorch使用概率为0而不是保持,我会编辑。

以上是关于为啥 Pytorch Dropout 层会影响所有值,而不仅仅是设置为零的值?的主要内容,如果未能解决你的问题,请参考以下文章

pytorch中model.eval()和torch.no_grad()的区别

在 Pytorch 中使用 Dropout:nn.Dropout 与 F.dropout

为啥在无监督学习中不使用 DropOut?

Dropout 丢弃法 动手学深度学习v2 pytorch

Pytorch中nn.Dropout2d的作用

PyTorch 中带有 dropout 正则化的逻辑回归