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

Posted

技术标签:

【中文标题】PyTorch 中带有 dropout 正则化的逻辑回归【英文标题】:Logistic regression with dropout regularization in PyTorch 【发布时间】:2021-11-10 12:39:03 【问题描述】:

我想使用 dropout 正则化实现逻辑回归,但目前唯一可行的示例如下:

class logit(nn.Module):
    def __init__(self, input_dim = 69, output_dim = 1):
        super(logit, self).__init__()
    
        # Input Layer (69) -> 1
        self.fc1 = nn.Linear(input_dim, input_dim)
        self.fc2 = nn.Linear(input_dim, 1)
 
        self.dp = nn.Dropout(p = 0.2)
      
      
    # Feed Forward Function
    def forward(self, x):
        x = self.fc1(x)
        x = self.dp(x)
        x = torch.sigmoid(self.fc2(x))
        
        return x

现在在层之间设置 dropout 的问题是,最后我不再有逻辑回归(如果我错了,请纠正我)。

我想做的是在输入级别退出。

【问题讨论】:

【参考方案1】:

实际上,你仍然有一个逻辑回归,而 dropout 保持原样。

fc1fc2 之间的 dropout 将丢弃fc1 产生的一些input_dim 功能(与p=0.2),要求fc2 对它们的缺失保持稳健。这个事实不会改变模型输出的 logit。此外,请记住,在测试时,(通常)会禁用 dropout。

请注意,您也可以在输入级别应用 dropout:

    def forward(self, x):
        x = self.dp(x)
        x = self.fc1(x)
        x = self.dp(x)
        x = torch.sigmoid(self.fc2(x))

在这种情况下,fc1 必须对某些输入特征的缺失具有鲁棒性。

【讨论】:

很好的回应!但是nn.linear()会不会和下一层建立全套连接?让我改写一下,我能否将我的模型方程写为 1/(1+ exp(-(beta*x))) 其中当然我的 beta 是来自model.parameters() 的最后一个张量的元素? @MarcoRepetto 是的,你会的。发生的情况是,在训练时,一些 xs 将被 dropout 清零(相当于从前一层中删除一个神经元),但所有连接仍然存在,因为 dropout 不是确定性的,并且所有这些权重都需要在测试时(即使您在测试时应用 dropout,这是不寻常的)。

以上是关于PyTorch 中带有 dropout 正则化的逻辑回归的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch Note35 正则化

正则化之L1和L2已经dropout的一些理解和pytorch代码实现与效果证明

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

PyTorch 卷积网络正则化 DropBlock

神经网络与深度学习笔记dropout 正则化等其他减小方差的方法

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