-
Notifications
You must be signed in to change notification settings - Fork 21
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
Comments
我不太明白你说的在梯度停止的时候是什么意思,你正常跑solver.py的时候,vali_loss不会是0的,training
loss倒是看上去是0,但并不是0,但这里有好几个帖子讨论过这个问题了,你看一下之前的讨论就好。
…On Tue, Nov 7, 2023 at 11:44 PM qiu1204753786 ***@***.***> wrote:
作者您好,我想请问一下,在梯度停止的时候:early_stopping(vali_loss1, vali_loss2, self.model,
path),其中vali_loss1和vali_loss2一直都是0,这时候是如何判断早停的。
—
Reply to this email directly, view it on GitHub
<#24>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AB3JGO4T3WSK46UWSFOXCI3YDJJMFAVCNFSM6AAAAAA7BM6ENKVHI2DSMVQWIX3LMV43ASLTON2WKOZRHE4DCNRWGE3TEOI>
.
You are receiving this because you are subscribed to this thread.Message
ID: ***@***.***>
|
可是请问作者,事实上vali_loss按目前的代码正常跑,确实是0啊,就是在solver.py的121行
会得到全是0的列表 loss_1 ,然后vali函数返回的另一个值里, loss_2 还是空列表。earlystop最终会根据loss_1的情况判断,它始终都是0.0。 |
那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的帖子,有个同学解释这个问题的角度非常有意思,看了感觉大佬还是多,可惜请人来实习人家没理我
…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里,之前那个同学应该是我吧,没回是觉得那个训练有效性的问题是解决掉了,另一方面我现在只是刚刚涉及这个领域,在这方面还没有有价值的产出,想再沉淀一下,希望以后能有机会😃😃 |
额就是你啊,你这中英文互换的..... 我感觉这个不是0是从实验角度观察的,因为可以试一下,让loss=loss*0,
理论上如果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是用 不过我最近也试了试使用最初那个 |
赞👍,有道理的。 确实两个加的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: @.*>
使用loss*0的操作应该会直接切断掉计算得到当前loss的过程中产生的所有梯度,从而不会造成模型的更新,因为计算图在loss这等于是被断掉了
按照目前论文里的设计来说,loss是用 $\mathcal{L}_N$ 和 $\mathcal{L}_P$
算出来的,停止梯度对应到代码里就是detach()操作,但detach()是切断了一个变量对应支路的梯度传播过程,并不影响它输出的数值。所以代码里,
series_loss 和 prior_loss
数值上是相等的,但它们切断了内部不同变量的梯度传播方向,那么计算得到的loss数值上就是0,但计算图里依然可以从loss往回做梯度反向传播,所以我才有之前那个想法了的。
不过我最近也试了试使用最初那个 loss=0.5*series_loss+0.5*prior_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的结果是多少并不影响。 |
作者您好,我想请问一下,在梯度停止的时候:early_stopping(vali_loss1, vali_loss2, self.model, path),其中vali_loss1和vali_loss2一直都是0,这时候是如何判断早停的。
The text was updated successfully, but these errors were encountered: