Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

对于代码的问题 #24

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

对于代码的问题 #24

qiu1204753786 opened this issue Nov 7, 2023 · 10 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的结果是多少并不影响。

@WSake
Copy link

WSake commented Nov 27, 2024

虽然过去很久了,但是还是想请教一下大佬们,现在有办法解决这个问题吗?如何得到一个比较好的计算方式,让模型训练达到最佳的效果~

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

No branches or pull requests

4 participants