Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

对于代码的问题 #24

Open
qiu1204753786 opened this issue Nov 7, 2023 · 9 comments
Open

对于代码的问题 #24

qiu1204753786 opened this issue Nov 7, 2023 · 9 comments

Comments

@qiu1204753786
Copy link

作者您好,我想请问一下,在梯度停止的时候:early_stopping(vali_loss1, vali_loss2, self.model, path),其中vali_loss1和vali_loss2一直都是0,这时候是如何判断早停的。

@tianzhou2011
Copy link
Contributor

tianzhou2011 commented Nov 8, 2023 via email

@Leopold2333
Copy link

可是请问作者,事实上vali_loss按目前的代码正常跑,确实是0啊,就是在solver.py的121行

            loss_1.append((prior_loss - series_loss).item())

会得到全是0的列表 loss_1 ,然后vali函数返回的另一个值里, loss_2 还是空列表。earlystop最终会根据loss_1的情况判断,它始终都是0.0。
而且包括train_loss也是数值上是0的,这个应该确实不是看上去是0,它数值上真的是0,但由于上面有stop_grad操作,就是那个梯度停止, $\mathcal{L}_N$$\mathcal{L}_P$ 的梯度不是0从而使训练有效,这不是之前也讨论过了嘛

@tianzhou2011
Copy link
Contributor

tianzhou2011 commented Nov 11, 2023 via email

@tianzhou2011
Copy link
Contributor

tianzhou2011 commented Nov 11, 2023 via email

@Leopold2333
Copy link

你去翻翻之前solved的帖子,有个同学解释这个问题的角度非常有意思,看了感觉大佬还是多,可惜请人来实习人家没理我

On Sat, Nov 11, 2023 at 3:51 PM Tian Zhou @.> wrote: 那val loss可能是我错了,应该是early stop就没有生效吧,也没什么用。这个框架代码是完全参考anomaly transformer的,yiyuan当时应该就没有monitor val loss这个指标,因为这里的val loss跟最后F1也没关系。 loss这个不是0,或者说不是你理解的0这个没有含义的数字,后面有一位同学非常有意思从sign的角度去解释了这个问题,说这个train loss其实是被loss前面的正负号guide的,看了他的这个理解感觉确实有点道理,我们之前研究CV那边模型优化器的时候甚至设计过loss只用sign做优化的,确实更稳定且有一些数据集上效果更好。不过确实做这篇的时候没想这么多 On Sat, Nov 11, 2023 at 12:29 PM Aobo Liang @.> wrote: > 可是请问作者,事实上vali_loss按目前的代码正常跑,确实是0啊,就是在solver.py的121行 > > loss_1.append((prior_loss - series_loss).item()) > > 会得到全是0的列表 loss_1 ,然后vali函数返回的另一个值里, loss_2 > 还是空列表。earlystop最终会根据loss_1的情况判断,它始终都是0.0。 > 而且包括train_loss也是数值上是0的,这个应该确实不是看上去是0,它数值上真的是0,但由于上面有stop_grad操作,就是那个梯度停止, > $\mathcal{L}_N$$\mathcal{L}_P$ 的梯度不是0从而使训练有效,这不是之前也讨论过了嘛 > > — > Reply to this email directly, view it on GitHub > <#24 (comment)>, > or unsubscribe > https://github.com/notifications/unsubscribe-auth/AB3JGO2BSLIP4BA2EA543A3YD35KRAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMBWGY3TINJRGQ > . > You are receiving this because you commented.Message ID: > @.***> >

solved里,之前那个同学应该是我吧,没回是觉得那个训练有效性的问题是解决掉了,另一方面我现在只是刚刚涉及这个领域,在这方面还没有有价值的产出,想再沉淀一下,希望以后能有机会😃😃
不过目前来看大家对loss数值上的疑虑和我一样,并不是说loss是0就没有意义,loss是0,梯度存在就是有意义的😂😂

@tianzhou2011
Copy link
Contributor

tianzhou2011 commented Nov 11, 2023 via email

@Leopold2333
Copy link

额就是你啊,你这中英文互换的..... 我感觉这个不是0是从实验角度观察的,因为可以试一下,让loss=loss0, 理论上如果loss开始就是0,那这个乘0肯定不影响,但乘0以后直接就不更新了。所以我一直觉的这个肯定不是0,但我又没能想明白那这个stop gradient以后这个loss变成了什么,为什么print出来就是0. 你那个理解我感觉是对的,他通过前面的正负号来训练了,也能解释乘了个0以后为什么就不更新了。

On Sat, Nov 11, 2023 at 4:04 PM Aobo Liang @.
> wrote: 你去翻翻之前solved的帖子,有个同学解释这个问题的角度非常有意思,看了感觉大佬还是多,可惜请人来实习人家没理我 … <#m_2769261013658780111_> On Sat, Nov 11, 2023 at 3:51 PM Tian Zhou @.> wrote: 那val loss可能是我错了,应该是early stop就没有生效吧,也没什么用。这个框架代码是完全参考anomaly transformer的,yiyuan当时应该就没有monitor val loss这个指标,因为这里的val loss跟最后F1也没关系。 loss这个不是0,或者说不是你理解的0这个没有含义的数字,后面有一位同学非常有意思从sign的角度去解释了这个问题,说这个train loss其实是被loss前面的正负号guide的,看了他的这个理解感觉确实有点道理,我们之前研究CV那边模型优化器的时候甚至设计过loss只用sign做优化的,确实更稳定且有一些数据集上效果更好。不过确实做这篇的时候没想这么多 On Sat, Nov 11, 2023 at 12:29 PM Aobo Liang @.> wrote: > 可是请问作者,事实上vali_loss按目前的代码正常跑,确实是0啊,就是在solver.py的121行 > > loss_1.append((prior_loss - series_loss).item()) > > 会得到全是0的列表 loss_1 ,然后vali函数返回的另一个值里, loss_2 > 还是空列表。earlystop最终会根据loss_1的情况判断,它始终都是0.0。 > 而且包括train_loss也是数值上是0的,这个应该确实不是看上去是0,它数值上真的是0,但由于上面有stop_grad操作,就是那个梯度停止, > $\mathcal{L}_N$$\mathcal{L}_P$ 的梯度不是0从而使训练有效,这不是之前也讨论过了嘛 > > — > Reply to this email directly, view it on GitHub > <#24 (comment) <#24 (comment)>>, > or unsubscribe > https://github.com/notifications/unsubscribe-auth/AB3JGO2BSLIP4BA2EA543A3YD35KRAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMBWGY3TINJRGQ > . > You are receiving this because you commented.Message ID: > @.> > solved里,之前那个同学应该是我吧,没回是觉得那个训练有效性的问题是解决掉了,另一方面我现在只是刚刚涉及这个领域,在这方面还没有有价值的产出,想再沉淀一下,希望以后能有机会😃😃 不过目前来看大家对loss数值上的疑虑和我一样,并不是说loss是0就没有意义,loss是0,梯度存在就是有意义的😂😂 — Reply to this email directly, view it on GitHub <#24 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AB3JGO6JLCLFDVHKN4Z2MBLYD4WSXAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMBWG4ZTQOBZGQ . You are receiving this because you commented.Message ID: @.>

使用loss*0的操作应该会直接切断掉计算得到当前loss的过程中产生的所有梯度,从而不会造成模型的更新,因为计算图在loss这等于是被断掉了

按照目前论文里的设计来说,loss是用 $\mathcal{L}_N$$\mathcal{L}_P$ 算出来的,停止梯度对应到代码里就是detach()操作,但detach()是切断了一个变量对应支路的梯度传播过程,并不影响它输出的数值。所以代码里,series_lossprior_loss 数值上是相等的,但它们切断了内部不同变量的梯度传播方向,那么计算得到的loss数值上就是0,但计算图里依然可以从loss往回做梯度反向传播,所以我才有之前那个想法了的。

不过我最近也试了试使用最初那个 loss=0.5*series_loss+0.5*prior_loss ,这也是我本来觉得逻辑上挺合理的 loss,但很遗憾结果特别不好,,,可能这个模型确实需要那个正负号把梯度方向掰到一致才好吧

@tianzhou2011
Copy link
Contributor

tianzhou2011 commented Nov 11, 2023 via email

@qiu1204753786
Copy link
Author

赞👍,有道理的。 确实两个加的loss效果比较差,我们之前也试过。不过我看到这个问题前没有意识到valid loss也是0,那等于之前完全没有控制过overfitting。挺有意思的,应该还有提高的空间,总不至于每次train到底效果就最好,起码可以设计另一个guide的信号来引导训练才是。

On Sat, Nov 11, 2023 at 4:26 PM Aobo Liang @.> wrote: 额就是你啊,你这中英文互换的..... 我感觉这个不是0是从实验角度观察的,因为可以试一下,让loss=loss *0, 理论上如果loss开始就是0,那这个乘0肯定不影响,但乘0以后直接就不更新了。所以我一直觉的这个肯定不是0,但我又没能想明白那这个stop gradient以后这个loss变成了什么,为什么print出来就是0. 你那个理解我感觉是对的,他通过前面的正负号来训练了,也能解释乘了个0以后为什么就不更新了。 … <#m_-5220895702292512379_> On Sat, Nov 11, 2023 at 4:04 PM Aobo Liang @.> wrote: 你去翻翻之前solved的帖子,有个同学解释这个问题的角度非常有意思,看了感觉大佬还是多,可惜请人来实习人家没理我 … <#m_2769261013658780111_> On Sat, Nov 11, 2023 at 3:51 PM Tian Zhou @.> wrote: 那val loss可能是我错了,应该是early stop就没有生效吧,也没什么用。这个框架代码是完全参考anomaly transformer的,yiyuan当时应该就没有monitor val loss这个指标,因为这里的val loss跟最后F1也没关系。 loss这个不是0,或者说不是你理解的0这个没有含义的数字,后面有一位同学非常有意思从sign的角度去解释了这个问题,说这个train loss其实是被loss前面的正负号guide的,看了他的这个理解感觉确实有点道理,我们之前研究CV那边模型优化器的时候甚至设计过loss只用sign做优化的,确实更稳定且有一些数据集上效果更好。不过确实做这篇的时候没想这么多 On Sat, Nov 11, 2023 at 12:29 PM Aobo Liang @.> wrote: > 可是请问作者,事实上vali_loss按目前的代码正常跑,确实是0啊,就是在solver.py的121行 > > loss_1.append((prior_loss - series_loss).item()) > > 会得到全是0的列表 loss_1 ,然后vali函数返回的另一个值里, loss_2 > 还是空列表。earlystop最终会根据loss_1的情况判断,它始终都是0.0。 > 而且包括train_loss也是数值上是0的,这个应该确实不是看上去是0,它数值上真的是0,但由于上面有stop_grad操作,就是那个梯度停止, > $\mathcal{L}_N$$\mathcal{L}_P$ 的梯度不是0从而使训练有效,这不是之前也讨论过了嘛 > > — > Reply to this email directly, view it on GitHub > <#24 <#24> (comment) <#24 (comment) <#24 (comment)>>>, > or unsubscribe > https://github.com/notifications/unsubscribe-auth/AB3JGO2BSLIP4BA2EA543A3YD35KRAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMBWGY3TINJRGQ > . > You are receiving this because you commented.Message ID: > @.> > solved里,之前那个同学应该是我吧,没回是觉得那个训练有效性的问题是解决掉了,另一方面我现在只是刚刚涉及这个领域,在这方面还没有有价值的产出,想再沉淀一下,希望以后能有机会😃😃 不过目前来看大家对loss数值上的疑虑和我一样,并不是说loss是0就没有意义,loss是0,梯度存在就是有意义的😂😂 — Reply to this email directly, view it on GitHub <#24 (comment) <#24 (comment)>>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AB3JGO6JLCLFDVHKN4Z2MBLYD4WSXAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMBWG4ZTQOBZGQ https://github.com/notifications/unsubscribe-auth/AB3JGO6JLCLFDVHKN4Z2MBLYD4WSXAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMBWG4ZTQOBZGQ . You are receiving this because you commented.Message ID: @.> 使用loss0的操作应该会直接切断掉计算得到当前loss的过程中产生的所有梯度,从而不会造成模型的更新,因为计算图在loss这等于是被断掉了 按照目前论文里的设计来说,loss是用 $\mathcal{L}_N$ 和 $\mathcal{L}_P$ 算出来的,停止梯度对应到代码里就是detach()操作,但detach()是切断了一个变量对应支路的梯度传播过程,并不影响它输出的数值。所以代码里, series_loss 和 prior_loss 数值上是相等的,但它们切断了内部不同变量的梯度传播方向,那么计算得到的loss数值上就是0,但计算图里依然可以从loss往回做梯度反向传播,所以我才有之前那个想法了的。 不过我最近也试了试使用最初那个 loss=0.5series_loss+0.5prior_loss ,这也是我本来觉得逻辑上挺合理的 loss,但很遗憾结果特别不好,,,可能这个模型确实需要那个正负号把梯度方向掰到一致才好吧 — Reply to this email directly, view it on GitHub <#24 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AB3JGO3O6VBKQ7IDDVO7YCLYD4ZCRAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMBWG42DQNRWGY . You are receiving this because you commented.Message ID: @.**>

我的理解是:前面的Loss是由L(N)-L(P),使用了梯度停止,体现在代码中是使用了detach()方法。将L(N)和L(P)相减是为了让他们的距离尽可能近,因为异常率很小。而由于使用了detach(),L(N)和L(P)是异步训练的。比如先训练第一个损失L(N),将表征P给固定住,训练表征N。再接着训练第二个损失L(P),此时将表征N给固定住(N是由前面训练得到的),开始训练P,这样就可以交替训练表征N和表征P了,而Loss=L(N)-L(P)是为了将这两个训练过程连接起来,让它俩可以一块交替训练。同时交替训练也可以避免因为两边视图的对称而导致的模型坍塌,不过论文中两个视图并不对称,所以并不存在模型坍塌的问题。所以Loss一直等于0,其实是不影响模型训练的,因为L(N)和L(P)是两个独立的训练过程,将他们两个相减放在一起只是为了能够一块训练而已,最后的Loss的结果是多少并不影响。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants