You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Darts训练N-Beats时多序列输入损失为NaN,单序列正常

问题:Darts N-Beats多序列训练出现NaN损失,单序列训练正常

我想用Darts训练一个N-Beats时间序列模型,每个用户对应独立的时间序列DataFrame,因此打算采用多序列训练方式,但输入TimeSeries列表时,训练过程中直接出现NaN损失;若将所有用户的TimeSeries合并为单个序列,则能得到正常损失。两种场景下的数据均经过缩放、填充并转换为float32类型,预处理代码如下:

data = scaler.transform(filler.transform(data)).astype(np.float32)

以下是将TimeSeries列表合并为单个TimeSeries的代码(我也有纯Darts实现的版本,但速度慢很多,效果一致):

SPLIT = 0.8

if concatenate_to_one_ts:
    all_dfs = []
    all_dfs_cov = []

    for i in range(len(list_of_target_ts)):
        all_dfs.append(list_of_target_ts[i].pd_series())
        all_dfs_cov.append(list_of_cov_ts[i].pd_dataframe())
        
    all_dfs = pd.concat(all_dfs)
    all_dfs_cov = pd.concat(all_dfs_cov)
    
    nbr_train_sample = int(len(all_dfs) * SPLIT)

    all_dfs_train = all_dfs[:nbr_train_sample]
    all_dfs_test = all_dfs[nbr_train_sample:]
    
    list_of_target_ts_train = TimeSeries.from_series(all_dfs_train.reset_index(drop=True))
    list_of_target_ts_test = TimeSeries.from_series(all_dfs_test.reset_index(drop=True))
    
    all_dfs_cov_train = all_dfs_cov[:nbr_train_sample]
    all_dfs_cov_test = all_dfs_cov[nbr_train_sample:]
    
    list_of_cov_ts_train = TimeSeries.from_dataframe(all_dfs_cov_train.reset_index(drop=True))
    list_of_cov_ts_test = TimeSeries.from_dataframe(all_dfs_cov_test.reset_index(drop=True))
else:

     nbr_train_sample = int(len(list_of_target_ts) * SPLIT)
     list_of_target_ts_train = list_of_target_ts[:nbr_train_sample]
     list_of_target_ts_test = list_of_target_ts[nbr_train_sample:]
     
     list_of_cov_ts_train = list_of_cov_ts[:nbr_train_sample]
     list_of_cov_ts_test = list_of_cov_ts[nbr_train_sample:]

model = NBEATSModel(input_chunk_length=4,
                    output_chunk_length=1,
                    batch_size=512,
                    n_epochs=5,
                    nr_epochs_val_period=1, 
                    model_name="NBEATS_test",
                    generic_architecture=True,
                    force_reset=True,
                    save_checkpoints=True,
                    show_warnings=True,
                    log_tensorboard=True, 
                    torch_device_str='cuda:0'
                   )

model.fit(series=list_of_target_ts_train, 
          past_covariates=list_of_cov_ts_train, 
          val_series=list_of_target_ts_val, 
          val_past_covariates=list_of_cov_ts_val, 
          verbose=True,
          num_loader_workers=20)

训练输出对比

  • 多序列训练时的输出:
Epoch 0:   8%|██████████▉        | 2250/27807 [03:00<34:11, 12.46it/s, loss=nan, v_num=logs, train_loss=nan.0
  • 单序列训练时的输出:
Epoch 0:  24%|█████████████████████████▋       | 669/2783 [01:04<03:24, 10.33it/s, loss=0.00758, v_num=logs, train_loss=0.00875]

额外疑惑

相同batch size下,每个epoch的样本数与预期不符。根据相关资料,单序列的样本数应该更多,因为多序列会对每个序列进行窗口切割,但实际输出中多序列的样本数(27807)远多于单序列(2783),对此存在疑问。

内容的提问来源于stack exchange,提问作者phoenire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:15:48