zhouhaoyi / Informer2020

The GitHub repository for the paper "Informer" accepted by AAAI 2021.
Apache License 2.0
5.27k stars 1.1k forks source link

反归一化的时候损失函数出大问题 #549

Open Seb5Vet opened 1 year ago

Seb5Vet commented 1 year ago
屏幕截图 2023-08-14 115428 屏幕截图 2023-08-14 115504

这两张图一个是inverse设置为false的时候的损失函数,只有0.3,然后改成true之后直接几百,这个怎么解决啊

ZichengLiu-seu commented 1 year ago

你好,我认为是正常现象,而且inverse设置为false比较合理,以下是我的训练时inverse分别设为false和true的截图: image image inverse在数据中的作用为:在提供标签batch_y时,是否使用inverse+拼接的方式来提供,具体可见data/data_loader.py中的各个get_item()函数和exp/exp_informer.py中的训练过程。inverse为True,seq_y会由data_x某片段的末端label_len长度的数据和data_y中后续的pred_len长度的数据拼接而成;反之,seq_y会完全由data_y提供。data_y是原数据,data_x是由data_y进行归一化而来。 由于在训练过程中用于计算loss的部分来自于后段pred_len部分,因此inverse为True时,会出现训练目标(喂给encoder的数据)和预期目标(喂给decoder的数据)的格式不一致的情况(或者说数据的形态?我觉得data_x和data_y像是有某种不统一性),因而导致loss飙升,我觉得这样不太合适。 不过我对代码也没有完全理解透彻,或许该参数有别的用法而我没有注意到。

Seb5Vet commented 11 months ago

那这种情况如何画出最终的结果图呢,设置为false的话得到的结果都是归一化的预测数据

------------------ 原始邮件 ------------------ 发件人: "zhouhaoyi/Informer2020" @.>; 发送时间: 2023年8月28日(星期一) 晚上6:45 @.>; @.**@.>; 主题: Re: [zhouhaoyi/Informer2020] 反归一化的时候损失函数出大问题 (Issue #549)

你好,我认为是正常现象,而且inverse设置为false比较合理,以下是我的训练时inverse分别设为false和true的截图:

inverse在数据中的作用为:在提供标签batch_y时,是否使用inverse+拼接的方式来提供,具体可见data/data_loader.py中的各个get_item()函数和exp/exp_informer.py中的训练过程。inverse为True,seq_y会由data_x某片段的末端label_len长度的数据和data_y中后续的pred_len长度的数据拼接而成;而data_y是原数据,data_x是由data_y进行归一化而来;反之,seq_y会完全由data_y提供。由于在训练过程中有效的部分来自于后段pred_len部分,因此inverse为True时,会出现训练目标和预期目标的数据格式不一致的情况(即data_x和data_y可能存在某种不连续性),因而导致loss飙升,我觉得这样不太合适。 不过我对代码也没有完全理解透彻,或许该参数有别的用法而我没有注意到。

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

ZichengLiu-seu commented 11 months ago

你好,我后来又仔细看了工程代码,发现我遗漏了很多重点;现在看来,在计算loss时只用到pred_len部分的数据,详见_process_one_batch函数中对batch_y的处理;所以与我上面说的数据拼接其实没关系,inverse的取值确实只和任务目标有关,想要得到更贴近原始标签的训练结果,还是需要把inverse设为True。我在个人的数据训练时也将inverse设为True,且通过调参也能获得较好的效果,建议多从数据预处理和参数选择入手试试

SsYyH commented 6 months ago

你好,我后来又仔细看了工程代码,发现我遗漏了很多重点;现在看来,在计算损失时只用到pred_len部分的数据,详见_process_one_batch函数中对batch_y的处理;所以与我上面说的数据拼接其实没关系,inverse的取值确实只和任务目标有关,想要得到更贴近原始标签的训练结果,还是需要把inverse设为True。我在个人的数据训练时也将inverse设为True,且通过调参也能获得较好的效果,建议多从数据预处理和参数选择入手试试

你好,麻烦问一下你都对哪些参数进行了调整吗?那几个参数对预测结果的影响比较大?谢谢了

ZichengLiu-seu commented 5 months ago

你好,我后来又仔细看了工程代码,发现我遗漏了很多重点;现在看来,在计算损失时只用到pred_len部分的数据,详见_process_one_batch函数中对batch_y的处理;所以与我上面说的数据拼接其实没关系,inverse的取值确实只和任务目标有关,想要得到更贴近原始标签的训练结果,还是需要把inverse设为True。我在个人的数据训练时也将inverse设为True,且通过调参也能获得较好的效果,建议多从数据预处理和参数选择入手试试

你好,麻烦问一下你都对哪些参数进行了调整吗?那几个参数对预测结果的影响比较大?谢谢了

三个与输入有关的长度:seq_len/label_len/pred_len,根据你的数据集情况也可以试试调整时序编码的模块,其他的就是batch、学习率这些比较常规的。不过我是手动调参的,比较原始,不是很严谨,也没摸出规律。

Echollllll commented 5 months ago

你好,我后来又仔细看了工程代码,发现我遗漏了很多重点;现在看来,在计算损失时只用到pred_len部分的数据,详见_process_one_batch函数中对batch_y的处理;所以与我上面说的数据拼接其实没关系,inverse的取值确实只和任务目标有关,想要得到更贴近原始标签的训练结果,还是需要把inverse设为True。我在个人的数据训练时也将inverse设为True,且通过调参也能获得较好的效果,建议多从数据预处理和参数选择入手试试

你好,麻烦问一下你都对哪些参数进行了调整吗?那几个参数对预测结果的影响比较大?谢谢了

三个与输入有关的长度:seq_len/label_len/pred_len,根据你的数据集情况也可以试试调整时序编码的模块,其他的就是batch、学习率这些比较常规的。不过我是手动调参的,比较原始,不是很严谨,也没摸出规律。 请问,你并没有重新写inverse函数,而是单纯地将其调整为True之后进行一系列的调参就能够克服inverse为true时图的效果差这一问题吗?