重看了一遍深度学习教程,有点疑惑,理论上来说必须可导才能反向传播对吧?
不过 torch 很显然能自定义损失函数,这又是怎么回事,用户也没法保证自己定义出来的计算方法是可导的吧。
以前学习属于是不求甚解了,这么多年说实话也就用过那些经典损失函数,没细相过这个问题。。
1
geelaw 2023-11-27 02:15:25 +08:00 via iPhone 2
通常来说只需要几乎处处可微,比如 ReLU 在 0 不可微(但是作为凸函数又有次梯度),这里就不展开了。
如果你是用 PyTorch 提供的函数自己设置损失函数,那么可微函数复合依然可微,就是链式法则、反向传播,实际上损失函数不过是计算图普通的一部分,计算微分的方法无甚差别。 如果你是说自己用 C++ 写新的函数,那么你可以在 C++ 里实现函数和它的微分,并注册在一起,这样 PyTorch 计算微分的时候就知道怎么算了。我在微软的时候做过一个 TensorFlow 的扩展(三重线性插值),不过他们没有开源(提供了一个编译好的包可以下载),但似乎新版的 TF 已经有这个功能了所以现在已经没必要了。 |
2
dayeye2006199 2023-11-27 07:41:32 +08:00 via Android 1
你自定义损失函数的时候,如果就是组合基本算子,自动微分自然知道方向函数的形式是什么。
如果你完全自定义,则同时需要定义函数的反向形式。对框架来说,就是个黑盒。 框架不在乎 Analytical form ,它需要的就是两个函数 forward and backward |