如何解决没有所有连接的神经网络层
神经网络的密集层中的权重是一个(n,d)矩阵,我想强制其中一些权重始终为零。我有另一个(n,d)矩阵,该矩阵的项可以为非零。想法是该层不应真正密集,而应缺少某些连接(即等于0)。
在使用PyTorch(或Tensorflow)进行训练时如何实现?我不希望训练时这些权重变为非零。
如果不直接支持,一种方法是在每次训练迭代后将所需的条目归零。
解决方法
您可以利用pytorch的{{3}}数据类型:
class SparseLinear(nn.Module):
def __init__(self,in_features,out_features,sparse_indices):
super(SparseLinear,self).__init__()
self.weight = nn.Parameter(data=torch.sparse.FloatTensor(sparse_indices,torch.randn(sparse_indices.shape[1]),[in_features,out_features]),requires_grad=True)
self.bias = nn.Parameter(data=torch.randn(out_features),requires_grad=True)
def forward(self,x):
return torch.sparse.admm(self.bias,self.weight,x,1.,1.)
,
我假设您要使用密集张量来实现这种稀疏连接的层。如果是这样,则可以将要屏蔽(无连接)的元素的屏蔽矩阵(张量)定义为0.0,否则定义为1.0。然后,在前向传递中,您可以简单地将权重张量与蒙版张量相乘(您要采用逐元素乘积,这是在PyTorch中使用*运算符时的默认乘积),然后对输入进行矩阵乘法稀疏层。
要使其正常工作,您必须确保您的蒙版张量不接收梯度,否则它将在训练模型时被更新并变得无效。为此,您只需在创建遮罩张量时设置requires_grad=False
(请参见here)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。