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

请教一个sigmoid_cross_entropy_with_logits算子的计算细节问题 #70896

Open
houj04 opened this issue Jan 20, 2025 · 1 comment
Open
Assignees
Labels

Comments

@houj04
Copy link
Contributor

houj04 commented Jan 20, 2025

请提出你的问题 Please ask your question

第一组不同:

在这个算子的CPU实现当中:

https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/cpu/sigmoid_cross_entropy_with_logits_kernel.cc#L62
有这么一段代码,其中涉及到了两个eps,分别是1e-5和1e-6,如下图

Image

而在GPU实现当中:

https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/phi/kernels/gpu/sigmoid_cross_entropy_with_logits_kernel.cu
同样的计算分支里面,只有一个eps出现,值为1e-5,如下图

Image

第二组不同:

在GPU的实现里面,在normalize功能之前,就已经有了一次根据eps的过滤,在这里。但是对应的CPU实现中,则没有这段逻辑。即,CPU中,仅在normalize功能内部,有一次根据eps的过滤。但是GPU在整个计算过程中,有两轮。

Image

此外,单测里面,完全没有提到上面代码中的eps,没有出现1e-5也没有出现1e-6。

https://github.com/PaddlePaddle/Paddle/blob/develop/test/legacy_test/test_sigmoid_cross_entropy_with_logits_op.py

想的问题是:CPU和GPU的实现,预期是一样的吗?看这里面的逻辑,normalize里面的那个过滤,是要根据eps来统计非零元的个数,然后用这个统计值去做一次归一化。但是这里的eps不同,就会导致统计结果不同,最终的计算结果也会不同啊。而一上来的正常sigmoid计算,即normalize的前序操作,用不用eps来过滤,也会导致计算结果的不同吧。这是符合预期的吗?

@jzhang533
Copy link
Contributor

应该逻辑是一样的吧。CPU部分的实现,对个数的统计也可以上移到这行的:

if (static_cast<int>(label) == ignore_index) {

另外,好像 normalize==True 的 code path 并没有真正用过,因为在 python 端暴露出来的 API 里隐藏了这个参数。

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

No branches or pull requests

3 participants