现在有问题了。我有一个用于数据去噪的降噪编码器。现在我的输入是一个长度为 20,000 的向量,我的模型结构如下。
class AutoEncoder(nn.Module):
def __init__(self, input_dim, output_dim = None):
super().__init__()
if output_dim is None:
output_dim = input_dim
self.fc = nn.Sequential(
nn.Linear(input_dim, 1024),
nn.BatchNorm1d(1024),
nn.GELU(),
nn.Linear(1024,512),
nn.BatchNorm1d(512),
nn.GELU(),
nn.Linear(512,256),
nn.BatchNorm1d(256),
nn.GELU(),
nn.Linear(256,512),
nn.BatchNorm1d(512),
nn.GELU(),
nn.Linear(512,1024),
nn.BatchNorm1d(1024),
nn.GELU(),
nn.Linear(1024,input_dim)
)
def forward(self, x):
out = self.fc(x)
return out
我在原始数据中添加了噪声,添加的噪声遵循标准正态分布。该模型的目的是预测添加的噪声。损失函数是添加噪声和预测噪声之间的 L2 损失。然而,在训练过程中,无论我如何调整学习率或增加模型复杂度,我的损失一直很高,并且预测的噪声很小,明显与添加的噪声相去甚远,并且在检查梯度后,我发现梯度接近于0。当我把这个输入向量的长度减少到1000时,损失可以减少,但是收敛值并不理想。我该如何解决我遇到的问题?
我已经尝试过增加模型的复杂度,但这并没有帮助减少我的损失。我希望有一种方法可以让我的loss在训练过程中不断减少,最终收敛到一个理想的值。
如果我正确地理解了你的问题,根本问题是你的梯度正在消失。 跳过连接可以帮助解决梯度消失问题。要创建跳跃连接,只需将前面层的结果添加到后面的层(如算术)。
这是您使用方案 B 实现的架构,但可能值得尝试其他跳过连接方案。
class AutoEncoder(nn.Module):
def __init__(self, input_dim, output_dim = None):
super().__init__()
if output_dim is None:
output_dim = input_dim
self.fc1 = nn.Sequential(
nn.Linear(input_dim, 1024),
nn.BatchNorm1d(1024),
nn.GELU(),
)
self.fc2 = nn.Sequential(
nn.Linear(1024,512),
nn.BatchNorm1d(512),
nn.GELU(),
)
self.fc3 = nn.Sequential(
nn.Linear(512,256),
nn.BatchNorm1d(256),
nn.GELU(),
)
self.fc4 = nn.Sequential(
nn.Linear(256,512),
nn.BatchNorm1d(512),
nn.GELU(),
)
self.fc5 = nn.Sequential(
nn.Linear(512,1024),
nn.BatchNorm1d(1024),
nn.GELU(),
)
self.fc6 = nn.Linear(1024,input_dim)
def forward(self, x):
out = self.fc1(x)
out = self.fc2(out) + out
out = self.fc3(out) + out
out = self.fc4(out) + out
out = self.fc5(out) + out
out = self.fc6(out)
return out