Neural network 多重矩阵乘法减重更新

Neural network 多重矩阵乘法减重更新,neural-network,pytorch,Neural Network,Pytorch,当使用forward方法时,我只执行一组torch.add(torch.bmm(x,exp_w),self.b)然后我的模型正确地反向传播。当我添加另一层时-torch.add(torch.bmm(out,exp_w2),self.b2),渐变不会更新,模型也不会学习。如果我将激活函数从nn.Sigmoid更改为nn.ReLU,那么它可以使用两层 一天来一直在思考这个问题,却不明白为什么它不能与nn.Sigmoid一起工作 我尝试过不同的学习率、损失函数和优化函数,但似乎没有任何组合起作用。当我

当使用
forward
方法时,我只执行一组
torch.add(torch.bmm(x,exp_w),self.b)
然后我的模型正确地反向传播。当我添加另一层时-
torch.add(torch.bmm(out,exp_w2),self.b2)
,渐变不会更新,模型也不会学习。如果我将激活函数从
nn.Sigmoid
更改为
nn.ReLU
,那么它可以使用两层

一天来一直在思考这个问题,却不明白为什么它不能与
nn.Sigmoid
一起工作

我尝试过不同的学习率、损失函数和优化函数,但似乎没有任何组合起作用。当我把训练前后的重量加在一起时,它们是一样的

代码:


除了损失函数、激活函数和学习速率之外,参数初始化也很重要。我建议您看看Xavier的初始化:

此外,对于广泛的问题和网络体系结构,批量标准化有助于:


如果你有兴趣了解更多的原因,这主要是由于渐变消失的问题,这意味着你的渐变变得很小,以至于你的权重没有得到更新。它很常见,在维基百科上有自己的页面:

除了损失函数、激活函数和学习率之外,参数初始化也很重要。我建议您看看Xavier的初始化:

此外,对于广泛的问题和网络体系结构,批量标准化有助于:


如果你有兴趣了解更多的原因,这主要是由于渐变消失的问题,这意味着你的渐变变得很小,以至于你的权重没有得到更新。这是如此普遍,以至于它在维基百科上有自己的页面:

但我怎么能测试它是消失梯度问题呢?现在当我查看渐变时,我根本看不到它们被更新,即使我将“学习”设置得更大,所以渐变应该更大。@MihkelL。学习速率不会影响梯度本身,它会影响如何将梯度应用于权重。因此,提高学习率不会影响梯度。在将激活传递给sigmoid函数之前,可以检查激活的大小。如果它们的大小很大,梯度就会很小。此外,我刚刚发现您没有在两个层之间应用激活(即在
torch.add(torch.bmm(x,exp_w),self.b)
之后),因此您只是将两个线性操作连接起来,从而产生一个矩阵乘法。对,我将其保留到末尾。谢谢你指出这一点。批量规范化确实有所帮助。如果我自己能看到消失的梯度症状,我会查一下但我怎么能证明这是一个消失梯度问题呢?现在当我查看渐变时,我根本看不到它们被更新,即使我将“学习”设置得更大,所以渐变应该更大。@MihkelL。学习速率不会影响梯度本身,它会影响如何将梯度应用于权重。因此,提高学习率不会影响梯度。在将激活传递给sigmoid函数之前,可以检查激活的大小。如果它们的大小很大,梯度就会很小。此外,我刚刚发现您没有在两个层之间应用激活(即在
torch.add(torch.bmm(x,exp_w),self.b)
之后),因此您只是将两个线性操作连接起来,从而产生一个矩阵乘法。对,我将其保留到末尾。谢谢你指出这一点。批量规范化确实有所帮助。如果我自己能看到消失的梯度症状,我会查一下
class MyModel(nn.Module):

    def __init__(self, input_dim, output_dim):
        torch.manual_seed(1)
        super(MyModel, self).__init__()
        self.input_dim = input_dim
        self.output_dim = output_dim
        hidden_1_dimentsions = 20
        self.w = torch.nn.Parameter(torch.empty(input_dim, hidden_1_dimentsions).uniform_(0, 1))
        self.b = torch.nn.Parameter(torch.empty(hidden_1_dimentsions).uniform_(0, 1))

        self.w2 = torch.nn.Parameter(torch.empty(hidden_1_dimentsions, output_dim).uniform_(0, 1))
        self.b2 = torch.nn.Parameter(torch.empty(output_dim).uniform_(0, 1))

    def activation(self):
        return torch.nn.Sigmoid()

    def forward(self, x):
        x = x.view((x.shape[0], 1, self.input_dim))

        exp_w = self.w.expand(x.shape[0], self.w.size(0), self.w.size(1))
        out = torch.add(torch.bmm(x, exp_w), self.b)
        exp_w2 = self.w2.expand(out.shape[0], self.w2.size(0), self.w2.size(1))
        out = torch.add(torch.bmm(out, exp_w2), self.b2)
        out = self.activation()(out)
        return out.view(x.shape[0])