梯度下降:手动或通过软件计算任意成本函数的偏导数?

机器算法验证 回归 机器学习 梯度下降
2022-03-31 07:06:32

我是一名软件工程师,我正在学习斯坦福大学教授 Andrew Ng 的机器学习在线课程我能够遵循大多数与线性回归梯度下降相关的数学。

我不清楚的一件事是是否有一种典型的(最佳实践)方法来计算任意成本函数的偏导数:我们是否应该手动计算这个导数,或者是否有一些软件可以为我们做? 如果我们使用软件,会不会像 Mathematica 一样,我们输入一个符号方程,软件返回一个符号导数,然后我们在代码中实现它?

具体而言,在线性回归的梯度下降中,线性系数更新规则如下,带有偏导数:

在此处输入图像描述

线性回归的成本函数如下:

在此处输入图像描述

下面是扩展了偏导数的结果更新规则:

在此处输入图像描述

即使对于任意复杂的成本函数,我们是否总是应该手动计算偏导数?

2个回答

有几个选项可供您使用:

  1. 尝试手动计算导数,然后在代码中实现它们。

  2. 使用 Maple、Mathematica、Wolfram Alpha 等符号计算包来查找导数。其中一些包会将生成的公式直接转换为代码。

  3. 使用自动微分工具,该工具采用计算成本函数的程序并(使用类似编译器的技术)生成计算导数和成本函数的程序。

  4. 使用有限差分公式来近似导数。

对于除了最简单的问题(如普通最小二乘法)以外的任何问题,选项 1 都是一个糟糕的选择。大多数优化专家会告诉您,优化软件的用户向优化程序提供不正确的导数公式是很常见的。这通常会导致收敛缓慢或根本不收敛。

对于大多数相对简单的成本函数,选项 2 是一个不错的选择。它不需要真正奇特的工具。

当成本函数是您拥有源代码的相当复杂函数的结果时,选项 3 真的很出色。但是,AD 工具是专门的,并且没有多少优化软件的用户熟悉它们。

选项 4 有时是必要的选择。如果您有一个无法获得源代码的“黑匣子”功能(或者写得非常糟糕以至于 AD 工具无法处理它),那么有限差分近似可以节省一天的时间。然而,使用有限差分近似在运行时间和导数的准确性以及最终获得的解决方案方面有很大的成本。

对于大多数机器学习应用程序,选项 1 和 2 完全足够了。损失函数(最小二乘、逻辑回归等)和惩罚(一范数、二范数、弹性网等)非常简单,很容易找到导数。

选项 3 和 4 在目标函数更复杂的工程优化中更常发挥作用。

如果有一个很好的分析解决方案,你可以。否则,请使用数值技术或库,如 tensorflow / theano。