Skip to content

Conversation

@zrr1999
Copy link
Contributor

@zrr1999 zrr1999 commented Aug 18, 2025

受影响API

  • paddle.Tensor.__pow__
  • paddle.Tensor.pow
  • paddle.pow
  • paddle.Tensor.__rpow__

修改思路

这些 API 的计算公式为 $y = a^b$,因此需要根据输入类型分三种情况考虑:

  • a,b都是tensor,限制a为正数,因为负数的部分非整数(例如1/2,3/4这种)次方不在实数域,后续可能需要继续修改。
  • 仅b是tensor,按照推导A的结果限制随机生成的数据。
  • 仅a是tensor,按照推导B的结果限制随机生成的数据(当常数b不为整数时额外限制a不生成负数)。

合入后剩余case

paddle.pow(Tensor([2, 3, 4],"float32"), Tensor([],"float32"), )
paddle.pow(Tensor([20, 1],"float32"), Tensor([],"float32"), )
paddle.pow(Tensor([20000, 1],"float32"), Tensor([],"float32"), )
paddle.pow(Tensor([20600, 1],"float32"), Tensor([],"float32"), )
paddle.pow(Tensor([4, 3, 2],"float32"), Tensor([4, 3, 2],"float16"), )
paddle.pow(Tensor([4, 3, 2],"float64"), Tensor([4, 3, 2],"float16"), )
paddle.pow(Tensor([4, 3, 2],"float64"), Tensor([4, 3, 2],"float32"), )
paddle.pow(Tensor([5, 9, 7],"float64"), Tensor([7],"float64"), )
paddle.pow(Tensor([],"float32"), Tensor([209],"float32"), )

推导A

设MAX是dtype支持的最大值,B是常数底,不妨设B>1

y = B^x
dy/dx = y*lnB
为了保证不溢出,需要y<MAX,dy/dx <MAX

令y = MAX,则
B^x=MAX
xlnB=lnMAX
x = lnMAX/lnB

令dy/dx = MAX
则 x = ln(MAX/lnB)/lnB

注:
当0<B<1时,可以通过1/B限制,因为此时y和dy/dx取得最大值的时机是x取最小值,x的最小值和最大值互为相反数,所以这与令B变为倒数是等价的

推导B

设MAX是dtype支持的最大值,B是常数,假设设x!=0,B!=1,B!=0(有特殊处理)

y = x^B
dy/dx = Bx^(B-1)
为了保证不溢出,需要y<MAX,dy/dx <MAX
令y = MAX,则
x^B=MAX
x=MAX^(1/B)
令dy/dx = MAX
则 x = (MAX/B)^(1/(B-1))

为了简化实现和优化性能,当B小于2的时候,采用固定值

因为梯度的限制计算过于繁琐,考虑进行放缩,找到一个更小的好计算的上界即可
(MAX/B)^(1/(B-1)) >(MAX/B)^(1/B)
发现MAX^(1/B)>(MAX/B)^(1/B),所以只需要满足x<(MAX/B)^(1/B)即可。

相关 PR

备注

cast和astype相关精度问题已在其他PR修复。

@paddle-bot
Copy link

paddle-bot bot commented Aug 18, 2025

Thanks for your contribution!

@zrr1999 zrr1999 changed the title Improve get_numpy_tensor for rpow and pow [Accuracy diff No.78、142、143] Improve get_numpy_tensor for rpow and pow Aug 19, 2025
Copy link
Collaborator

@wanghuancoder wanghuancoder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

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

Successfully merging this pull request may close these issues.

2 participants