现在我们换个角度来看什么是梯度下降,我们有个代价函数高级优化 - 图1,而我们想要使其最小化,那么我们需要做的是编写代码,当输入参数高级优化 - 图2时,它们会计算出两样东西:高级优化 - 图3以及j等于 0、 1 直到n时的偏导数项。
    11.png
    假设我们已经完成了可以实现这两件事的代码,那么梯度下降所做的就是反复执行这些更新。对于梯度下降来说,我认为从技术上讲,你实际并不需要编写代码来计算代价函数高级优化 - 图5。你只需要编写代码来计算导数项,但是,如果你希望代码还要能够监控高级优化 - 图6的收敛性,那么我们就需要自己编写代码来计算代价函数高级优化 - 图7和偏导项高级优化 - 图8


    1. 而**梯度下降并不是我们可以使用的唯一算法**,还有其他一些算法,更高级、更复杂。如果我们能用这些方法来计算代价函数![](https://cdn.nlark.com/yuque/__latex/698e62e708a07405c6154a447463ef91.svg#card=math&code=J%28%5Ctheta%29&height=18&id=djLFa)和偏导数项![](https://cdn.nlark.com/yuque/__latex/ccb4a1325f5108b923fedd05c1768d99.svg#card=math&code=%5Cfrac%7B%E2%88%82%7D%7B%E2%88%82%5Ctheta_i%7DJ%28%5Ctheta%29&height=37&id=rQccL)的话,那么这些算法就是为我们优化代价函数的不同方法, **共轭梯度法 BFGS (变尺度法) 和 L-BFGS (限制变尺度法) **就是其中一些更高级的优化算法。它们需要有一种方法来计算![](https://cdn.nlark.com/yuque/__latex/698e62e708a07405c6154a447463ef91.svg#card=math&code=J%28%5Ctheta%29&height=18&id=o25tw)以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。<br /> 这三种算法有许多优点:<br /> 一个是使用这其中任何一个算法,你**通常不需要手动选择学习率**![](https://cdn.nlark.com/yuque/__latex/7b7f9dbfea05c83784f8b85149852f08.svg#card=math&code=%5Calpha&height=10&id=nJshh),所以对于这些算法的一种思路是,给出计算导数项和代价函数的方法,你可以认为算法有一个智能的内部循环,而且,事实上,他们确实有一个智能的内部循环,称为**线性搜索(line search)算法**,它可以自动尝试不同的学习率![](https://cdn.nlark.com/yuque/__latex/7b7f9dbfea05c83784f8b85149852f08.svg#card=math&code=%5Calpha&height=10&id=YGrhp) ,并自动选择一个好的学习速率,因此它甚至可以为每次迭代选择不同的学习速率,那么你就不需要自己选择。这些算法实际上在做更复杂的事情,而不仅仅是选择一个好的学习率,所以它们往往最终收敛得远远快于梯度下降,_不过关于它们到底做什么的详细讨论,已经超过了本门课程的范围。_