梯度下降:手动或通过软件计算任意成本函数的偏导数?
机器算法验证
回归
机器学习
梯度下降
2022-03-31 07:06:32
2个回答
有几个选项可供您使用:
尝试手动计算导数,然后在代码中实现它们。
使用 Maple、Mathematica、Wolfram Alpha 等符号计算包来查找导数。其中一些包会将生成的公式直接转换为代码。
使用自动微分工具,该工具采用计算成本函数的程序并(使用类似编译器的技术)生成计算导数和成本函数的程序。
使用有限差分公式来近似导数。
对于除了最简单的问题(如普通最小二乘法)以外的任何问题,选项 1 都是一个糟糕的选择。大多数优化专家会告诉您,优化软件的用户向优化程序提供不正确的导数公式是很常见的。这通常会导致收敛缓慢或根本不收敛。
对于大多数相对简单的成本函数,选项 2 是一个不错的选择。它不需要真正奇特的工具。
当成本函数是您拥有源代码的相当复杂函数的结果时,选项 3 真的很出色。但是,AD 工具是专门的,并且没有多少优化软件的用户熟悉它们。
选项 4 有时是必要的选择。如果您有一个无法获得源代码的“黑匣子”功能(或者写得非常糟糕以至于 AD 工具无法处理它),那么有限差分近似可以节省一天的时间。然而,使用有限差分近似在运行时间和导数的准确性以及最终获得的解决方案方面有很大的成本。
对于大多数机器学习应用程序,选项 1 和 2 完全足够了。损失函数(最小二乘、逻辑回归等)和惩罚(一范数、二范数、弹性网等)非常简单,很容易找到导数。
选项 3 和 4 在目标函数更复杂的工程优化中更常发挥作用。
如果有一个很好的分析解决方案,你可以。否则,请使用数值技术或库,如 tensorflow / theano。


