规范化值太小或溢出

Normalization values too small or overflow

提问人:cgbsu 提问时间:11/6/2023 最后编辑:desertnautcgbsu 更新时间:11/6/2023 访问量:43

问:

我在 PyTorch 中有一个简单的 NN(新手)。我正在尝试拟合 Sellmeier 方程的值。

我的网络非常简单:

self.linear_relu_stack = nn.Sequential(
    nn.Linear(self.input_count, self.input_count * self.hidden_layer_scalar), 
    nn.ReLU(), 
    nn.Linear(
            self.input_count * self.hidden_layer_scalar, 
            self.input_count * self.hidden_layer_scalar
        ), 
    nn.ReLU(), 
    nn.Linear(self.input_count * self.hidden_layer_scalar, self.sellmeirer_term_count * 2)
)

对于每一步,我都会获取输出层(系数)并将其放入 Sellmeier 函数中以获得输出,然后计算损失(请原谅拼写错误)

def forward(self, inputs): 
    self.sellmeirer_coefficients = self.linear_relu_stack(inputs)
    self.compute_refractive_indicies()
    return self.output_refractive_indicies 
def compute_refractive_indicies(self): 
    self.output_refractive_indicies = sellmeirer3(
             self.wave_lengths, 
             *tuple(self.sellmeirer_coefficients)# * self.sellmeirer_scalar) <-- This comment is very relevant to the question
        )
    return self.output_refractive_indicies
#...

def train(device, model, loss_function, optimizer, total_iteration_count): 
    model.train()
    progress_output = "Starting up"
    for current_iteration in range(total_iteration_count): 
        parameters = model.parameters_to_array().to(device)
        prediction = model(parameters)
        loss = loss_function(prediction, model.refractive_indicies) # refractive_indicies and wave_lengths come from data
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
    return model, model.sellmeirer_coefficients

Sellmeier 系数显示为 -1 和 1 之间的值,但我认为这可能不是我需要的值范围(可能太小,因为输出太小)。因此,我尝试在计算折射率时放大系数,然后使用已知折射率 + 在损失函数中计算的折射率进行反馈。即使我没有将相乘的 Sellmeier 系数积分回输入层(仅将 -1 到 1 的比例),并将折射率(计算和数据)归一化为这样的比例,Sellmeier 系数也会爆炸,并且输入层接收的值最终会溢出(10^(30+something) 表示 32 但浮点数,10^(n * 100) 表示 n 小于 4 或 5), 导致楠的。

我真的不知道为什么这种不离散地馈入网络的乘法会导致这种情况,我怎样才能让神经网络输出在范围 1 到 1 之外,将包括其先前输出的输入(Sellmeier 系数,还有:来自数据的折射率、计算的折射率、波长)作为输入,并从中学习?为什么缩放它会导致它爆炸?

我认为我所做的规范化有点偏离,但是,虽然我所做的调整确实有所帮助,但在大约 100k 步的训练后,我一度得到了 NaN。Sellmeier 系数似乎确实超出了 -1 到 1 的范围。这是错误的吗?

经过 1000000 步后,Sellmeier 系数的值似乎再次从 -1 归一化为 1。另外,我没有看到 NaN。但我有一种感觉,它可能会让 NaN 以某种方式“慢跑”出来。

Python 机器学习 神经网络 曲线拟合 归一化

评论


答: 暂无答案