Zacci 2025-02-15 19:57 采纳率: 0%
浏览 6

TFT在测试过程中是否使用目标的真实历史值?

在TFT(Temporal Fusion Transformer)神经网络结构中,我希望模型在训练和验证时不使用历史目标值,而是直接通过协变量进行预测,因此我设置了以下参数,以避免模型使用历史目标信息:

time_varying_unknown_reals = []
time_varying_known_reals = [cov1, cov2, cov3]

但在测试时,模型仍然需要提供目标值的真实值(ground truth),而不是 NaN 或固定值。这意味着在测试过程中,模型仍然参考了目标值的真实值来进行预测。然而,在实际应用中,模型应该仅通过协变量来预测目标值,而不可能提前知道目标值的真实值。

我的问题是:
模型在训练和测试过程中是否使用了目标值的真实值?
如果确实如此,我是否应该重新定义训练过程,例如使用 Scheduled Sampling (计划采样)来控制每个训练阶段输入真实值的比例,以保证训练过程和测试过程处于完全相同的环境?(即使用自回归训练方式,让模型用自身预测的值进行后续预测)

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-02-15 19:57
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解答

    TFT(Temporal Fusion Transformer)神经网络结构中,确实可以在训练和验证时不使用历史目标值,而是直接通过协变量进行预测。

    在 TFT 中,模型使用了自注意力机制来捕捉序列中的长期依赖关系。为了避免模型使用历史目标信息,你可以通过以下方法来实现:

    1. 在训练和验证时,使用 padding 或 masking 技术来将历史目标值设置为未知值(例如,使用 numpy.nantorch.nan),这样模型就不能使用历史目标信息。
    2. 在模型中添加一个额外的 mask 层,用于屏蔽历史目标值。例如,在 transformer 的 encoder 中,可以添加一个 mask 层来屏蔽历史目标值,然后将 mask 层的输出与 encoder 的输出进行 element-wise product。

    以下是一个简单的示例代码,使用 PyTorch 实现了上述方法:

    import torch
    import torch.nn as nn
    
    class TFT(nn.Module):
        def __init__(self):
            super(TFT, self).__init__()
            self.encoder = nn.TransformerEncoderLayer(d_model=512, nhead=8, dim_feedforward=2048, dropout=0.1)
            self.decoder = nn.TransformerDecoderLayer(d_model=512, nhead=8, dim_feedforward=2048, dropout=0.1)
            self.mask_layer = nn.MaskedLinear(512, 512)
    
        def forward(self, input_seq, target_seq):
            # 添加 mask 层
            mask = torch.isnan(target_seq)
            input_seq = input_seq * (1 - mask)
            target_seq = target_seq * (1 - mask)
    
            # 编码器
            encoder_output = self.encoder(input_seq)
    
            # 解码器
            decoder_output = self.decoder(encoder_output, target_seq)
    
            # 添加 mask 层
            decoder_output = self.mask_layer(decoder_output)
    
            return decoder_output
    

    在上面的代码中,我们添加了一个 MaskedLinear 层来屏蔽历史目标值。MaskedLinear 层将历史目标值设置为未知值,然后将其与 encoder 的输出进行 element-wise product。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月15日