starfish_2021 2023-02-09 00:17 采纳率: 0%
浏览 36

GradientTape求L2范数偏导

请高人指点江山,关于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次幂运算,手算过程如下

img

还有Y/||Y||应该是单调增函数,举例假设Y是二维向量[y1,y2], 设y1固定为3的情况下,||Y||曲线应该是y2/((3^2+y^2)^0.5),这个函数在单个维度上明显是一个单调增函数呀,求偏导不应出现负数啊

img

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-02-09 08:55
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 2月9日

悬赏问题

  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送
  • ¥15 SQLite 出现“Database is locked” 如何解决?
  • ¥15 已经加了学校的隶属邮箱了,为什么还是进不去github education?😭
  • ¥15 求会做聚类,TCN的朋友有偿线上指导。以下是目前遇到的问题
  • ¥100 无网格伽辽金方法研究裂纹扩展的程序