请高人指点江山,关于tensorflow使用GradientTape做L2范数求导的问题
模型使用余弦相似损失函数时偶然发现的问题,发现GradientTape算出的(Y/||Y||)的导数和手工算的不一致
GradientTape计算
```python
>>> y_pred=tf.convert_to_tensor([4.,3.])
>>> with tf.GradientTape() as g:
... g.watch(y_pred)
... with tf.GradientTape() as gg:
... gg.watch(y_pred)
... # 计算L2范数
... mo_pred=tf.reduce_sum(y_pred**2)**0.5
... # 计算L2范数一阶导数
... dmo = gg.gradient(mo_pred, y_pred)
...
>>> # 计算L2范数二阶导数
>>> ddmo = g.gradient(dmo, y_pred)
```
#L2范数一阶导数=Y/||Y||,没问题
dmo
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0.8, 0.6], dtype=float32)>L2范数二阶导数=?,这里实际计算的就是(Y/||Y||)的导数,tape计算出的结果好像有点问题, 经手工算,这个导数应该是(||Y||^2-Y^2)/||Y||^3,其中^n表示n次幂运算, 后续贴出手算过程,而且这个Y/||Y||应该是单调增函数,怎么经过tape计算出的导数有负数呢?
ddmo
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([-0.024 , 0.03199999], dtype=float32)>
运行结果及详细报错内容
经手工算,这个导数应该是(||Y||^2-Y^2)/||Y||^3,其中^n表示n次幂运算,手算过程如下
还有Y/||Y||应该是单调增函数,举例假设Y是二维向量[y1,y2], 设y1固定为3的情况下,||Y||曲线应该是y2/((3^2+y^2)^0.5),这个函数在单个维度上明显是一个单调增函数呀,求偏导不应出现负数啊