TensorFlow:根据模型输入和输出计算正则化损失项的梯度

问题描述 投票:0回答:1

概述

我的模型是一个编码器,具有输入

Z
和输出
x

我正在尝试使用同时具有传统监督学习和正则化项的

total_loss
。我有其他函数(网络外部),它们使用输入
Z
和预测输出
x_pred
来计算它们各自的正则化项以包含在损失计算中。

# Custom training function within model class
def train_step(self, Z, x):
    # Define loss object
    loss_object = tf.keras.losses.MeanSquaredError()
    with tf.GradientTape() as tape:
        # Get encoder output
        x_pred = self.encoder(Z)

        # Calculate traditional supervised learning data loss
        data_loss = loss_object(x, x_pred)

        # Calculate regularization terms
        x_hat, Z_pred = calc_reg_terms(x_pred, Z) # physics-informed function
        # Calculate respective regularization losses
        loss_x = loss_object(x, x_hat)
        loss_z = loss_object(Z, Z_pred)

    """<Additional Code>"""

问题

计算我的

total_loss
的梯度的正确方法是什么?

过去,我尝试简单地将所有损失项加在一起,然后取总损失的梯度。

### PAST METHOD ###
# Calculate total loss
total_loss = data_loss + a * loss_x + b * loss_z  # a,b -> set hyperparameters
# Get gradients
grads = tape.gradient(total_loss, self.trainable_weights)

但是,由于我的

loss_x
loss_z
是在编码器外部定义的,我担心这些损失更多地会成为
total_loss
计算的偏差,因为 当这些损失添加到 时,模型实际上表现更差data_loss
data_loss
项与编码器的可训练权重有明确的联系,从而实现清晰的梯度计算,但对于我的正则化损失项却不能轻易说同样的话。

注意:在训练期间跟踪这三个损失中的每一个表明,data_loss

会随着每个经过的训练时期而减少,但
loss_x
loss_z
在训练过程中往往会在早期趋于稳定,因此担心它们更像是对 
total_loss
.
产生不必要的偏见

使用 data_loss

loss_x
loss_z
 项计算梯度的正确方法是什么?

python tensorflow loss-function regularized gradienttape
1个回答
0
投票
感谢您评论中的澄清,这是有道理的。

你的代码对我来说看起来是正确的——这是一般方法。计算

total_loss = data_reconstruction_loss + constant * regularization_loss

,然后计算
total_loss
上的梯度,并反向传播。确保其在不进行完整超参数扫描的情况下工作的简单方法是设置 
a=0
b=0
,然后逐渐将 
a
 从某个非常小的值(例如 
a=1E-10
)增加到一个大值(例如,
a=1
)。您可以迈出大步,但当您扫过 
a
 的值时,您应该会看到训练和验证损失发生变化。然后您可以使用 
b
 重复相同的过程。如果一切正常,请继续进行超参数扫描。

© www.soinside.com 2019 - 2024. All rights reserved.