controllable-text-attribute-transfer icon indicating copy to clipboard operation
controllable-text-attribute-transfer copied to clipboard

the discrepancy for loss function between paper and script.

Open leekum2018 opened this issue 4 years ago • 15 comments

在模型代码model.py 381行中,损失函数使用了KL散度,但是在论文中,损失函数是交叉熵。请问是我理解错了吗?

leekum2018 avatar Jul 09 '19 02:07 leekum2018

在模型代码model.py 381行中,损失函数使用了KL散度,但是在论文中,损失函数是交叉熵。请问是我理解错了吗?

在代码里为了方便实现,先把原来的target里的0-1形式的分布转换成噪音分布,然后用KL loss算这两个分布(预测分布和含噪target分布)的距离。在paper的公式里,为了更方便理解,我把这两项(原来的0-1形式的target和噪音分布)拆开了。个人感觉这两个应该是一样的。

Nrgeup avatar Jul 09 '19 02:07 Nrgeup

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项?

leekum2018 avatar Jul 10 '19 08:07 leekum2018

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项?

image image 你说的没错,KL loss在衡量两个分布的时候确实是比交叉熵多了一项:

image

前面说到过,我把那个代码里的含噪的正确分布分开成了两项,也就是一个(1-smoothing parameter)权重的target(【0,...,1,...0】)和一个(smoothing parameter)权重的【1,...,0,...1】),所以这里的P(x_i)不是0就是1,所以这一项就是0,所以我写论文的时候为了看上去简洁就去掉了,具体实现还是按代码那样。

Nrgeup avatar Jul 10 '19 09:07 Nrgeup

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项?

你说的没错,KL loss在衡量两个分布的时候确实是比交叉熵多了一项:

前面说到过,我把那个代码里的含噪的正确分布分开成了两项,也就是一个smoothing parameter权重的target(【0,...,1,...0】)和一个(1-smoothing parameter)权重的【1,...,0,...1】),所以这里的P(x_i)不是0就是1,所以这一项就是0,所以我写论文的时候为了看上去简洁就去掉了,具体实现还是按代码那样。

您这里的说明符合了论文的公式。但是如您第一个回复所说,或者代码所显示,用KL loss算这两个分布(预测分布和含噪target分布)的距离。P(x_i)是含噪的target分布,那么每一项不应该是smoothing parameter或者1-smoothing parameter吗,而非0或者1?

leekum2018 avatar Jul 10 '19 11:07 leekum2018

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项? 你说的没错,KL loss在衡量两个分布的时候确实是比交叉熵多了一项: 前面说到过,我把那个代码里的含噪的正确分布分开成了两项,也就是一个smoothing parameter权重的target(【0,...,1,...0】)和一个(1-smoothing parameter)权重的【1,...,0,...1】),所以这里的P(x_i)不是0就是1,所以这一项就是0,所以我写论文的时候为了看上去简洁就去掉了,具体实现还是按代码那样。

如你上面所说,或者代码所显示,用KL loss算这两个分布(预测分布和含噪target分布)的距离。P(x_i)是含噪的target分布,那么每一项不应该是smoothing parameter或者1-smoothing parameter吗,而非0或者1?

您是对的。

Nrgeup avatar Jul 10 '19 11:07 Nrgeup

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项?

你说的没错,KL loss在衡量两个分布的时候确实是比交叉熵多了一项:

前面说到过,我把那个代码里的含噪的正确分布分开成了两项,也就是一个(1-smoothing parameter)权重的target(【0,...,1,...0】)和一个(smoothing parameter)权重的【1,...,0,...1】),所以这里的P(x_i)不是0就是1,所以这一项就是0,所以我写论文的时候为了看上去简洁就去掉了,具体实现还是按代码那样。

那这个解释还成立吗?P(x_i)的取值是smoothing parameter或者1-smoothing parameter。

leekum2018 avatar Jul 10 '19 11:07 leekum2018

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项? 你说的没错,KL loss在衡量两个分布的时候确实是比交叉熵多了一项: 前面说到过,我把那个代码里的含噪的正确分布分开成了两项,也就是一个(1-smoothing parameter)权重的target(【0,...,1,...0】)和一个(smoothing parameter)权重的【1,...,0,...1】),所以这里的P(x_i)不是0就是1,所以这一项就是0,所以我写论文的时候为了看上去简洁就去掉了,具体实现还是按代码那样。

那这个解释还成立吗?P(x_i)的取值是smoothing parameter或者1-smoothing parameter。

抱歉,如果有机会,我会更新那个公式,不拆开来写了,👍

Nrgeup avatar Jul 10 '19 11:07 Nrgeup

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项? 你说的没错,KL loss在衡量两个分布的时候确实是比交叉熵多了一项: 前面说到过,我把那个代码里的含噪的正确分布分开成了两项,也就是一个(1-smoothing parameter)权重的target(【0,...,1,...0】)和一个(smoothing parameter)权重的【1,...,0,...1】),所以这里的P(x_i)不是0就是1,所以这一项就是0,所以我写论文的时候为了看上去简洁就去掉了,具体实现还是按代码那样。

那这个解释还成立吗?P(x_i)的取值是smoothing parameter或者1-smoothing parameter。

抱歉,如果有机会,我会更新那个公式,不拆开来写了,👍

那请问到底是我理解错了,还是您公式写错了?

leekum2018 avatar Jul 10 '19 11:07 leekum2018

但是根据pytorch的官方文档中关于KLDivLoss的说明,lossn = yn * (log(yn) - xn),n表示分布的第n项,如果按照代码中的使用,y是含噪的正确分布,x就是预测分布;这与论文的表示似乎有比较大的出入,公式没有log(yn) 这项? 你说的没错,KL loss在衡量两个分布的时候确实是比交叉熵多了一项: 前面说到过,我把那个代码里的含噪的正确分布分开成了两项,也就是一个(1-smoothing parameter)权重的target(【0,...,1,...0】)和一个(smoothing parameter)权重的【1,...,0,...1】),所以这里的P(x_i)不是0就是1,所以这一项就是0,所以我写论文的时候为了看上去简洁就去掉了,具体实现还是按代码那样。 那这个解释还成立吗?P(x_i)的取值是smoothing parameter或者1-smoothing parameter。 抱歉,如果有机会,我会更新那个公式,不拆开来写了,👍

那请问到底是我理解错了,还是您公式写错了?

非常抱歉,我论文中的公式写错了,您的理解是对的,感谢您指出来👍。后面如果有机会的话,我再更新那个公式。

Nrgeup avatar Jul 10 '19 11:07 Nrgeup

很多谢您的耐心解答,您的论文令我受益匪浅。另外我在代码中还有一点疑问,就是训练时候每个epoch结束后没有对训练集数据进行shuffle?只是利用pointer这个变量又从第一个batch读起?

leekum2018 avatar Jul 10 '19 12:07 leekum2018

很多谢您的耐心解答,您的论文令我受益匪浅。另外我在代码中还有一点疑问,就是训练时候每个epoch结束后没有对训练集数据进行shuffle?只是令用pointer这个变量又从第一个batch读起?

倍感惭愧😓。每个epoch训练结束后确实没有进行shuffle,只是把pointer变成0了从头读起,后面我修改下。

Nrgeup avatar Jul 10 '19 12:07 Nrgeup

要是shuffle的话,那很可能您实验的分数会更高呀。不管怎么样,您的idea肯定都是work的。

leekum2018 avatar Jul 10 '19 12:07 leekum2018

要是shuffle的话,那很可能您实验的分数会更高呀。不管怎么样,您的idea肯定都是work的。

谢谢,学到了很多。👍

Nrgeup avatar Jul 10 '19 13:07 Nrgeup

您好,我又来了,这篇论文我有个比较重要的问题想请教,请问能加下wechat吗?

leekum2018 avatar Jul 14 '19 02:07 leekum2018

请教不敢当,我的邮箱是[email protected] 您可以联系我或者在邮件里附上微信号。

Nrgeup avatar Jul 14 '19 13:07 Nrgeup