我想用tensorflow以一种数值稳定的方式计算比率f = - a / b的导数,但是当a和b很小时会遇到问题(使用32位浮点表示时的<1e-20)。当然,f的导数是df_db = a / b ** 2,但是由于算子的优先性,分母中的平方首先被计算出来,潜流,并导致一个未定义的梯度。
如果将导数计算为df_db = (a / b) / b,则不会出现底流,并且梯度将被很好地定义,如下图所示,梯度是a = b的函数。蓝线对应于tensorflow可以计算导数的区域。橙色线对应于分母潜流产生无限梯度的区域。绿线对应于分母溢出产生零梯度的区域。在这两个有问题的域中,都可以使用上面修改的表达式