用pytorch实现dropout
Implementing dropout with pytorch
我想知道是否要自己实现dropout,像下面这样就够了吗(摘自):
class MyDropout(nn.Module):
def __init__(self, p: float = 0.5):
super(MyDropout, self).__init__()
if p < 0 or p > 1:
raise ValueError("dropout probability has to be between 0 and 1, " "but got {}".format(p))
self.p = p
def forward(self, X):
if self.training:
binomial = torch.distributions.binomial.Binomial(probs=1-self.p)
return X * binomial.sample(X.size()) * (1.0/(1-self.p))
return X
我担心的是,即使不需要的权重被屏蔽掉(通过这种方式或使用掩码张量),仍然会有梯度流通过 0 权重 (https://discuss.pytorch.org/t/custom-connections-in-neural-network-layers/3027/9)。我的担忧有效吗?
DropOut 不会掩盖权重 - 它会掩盖特征。
对于实现 y = <w, x>
的线性层,梯度 w.r.t 参数 w
是 x
。因此,如果您将 x
中的条目设置为零 - 这将相当于不更新相邻线性层中的相应权重。
我想知道是否要自己实现dropout,像下面这样就够了吗(摘自
class MyDropout(nn.Module):
def __init__(self, p: float = 0.5):
super(MyDropout, self).__init__()
if p < 0 or p > 1:
raise ValueError("dropout probability has to be between 0 and 1, " "but got {}".format(p))
self.p = p
def forward(self, X):
if self.training:
binomial = torch.distributions.binomial.Binomial(probs=1-self.p)
return X * binomial.sample(X.size()) * (1.0/(1-self.p))
return X
我担心的是,即使不需要的权重被屏蔽掉(通过这种方式或使用掩码张量),仍然会有梯度流通过 0 权重 (https://discuss.pytorch.org/t/custom-connections-in-neural-network-layers/3027/9)。我的担忧有效吗?
DropOut 不会掩盖权重 - 它会掩盖特征。
对于实现 y = <w, x>
的线性层,梯度 w.r.t 参数 w
是 x
。因此,如果您将 x
中的条目设置为零 - 这将相当于不更新相邻线性层中的相应权重。