在上一个视频中，我们讨论了
用梯度下降的方法最小化
逻辑回归中成本函数J (θ)。
在本次视频中，我想
教你一些先进
的优化算法和一些
先进的优化理念。
利用这些理念，我们将
能够使逻辑回归
运行得远远快于
它采用梯度下降的方法后可能运行的速度。
而这也将使
算法的规模更适合于
大型机器的学习问题，
例如，如果我们有数目庞大的功能（需要学习的时候）。
现在我们换个角度
来看什么是梯度下降。
我们有个成本函数J，而我们想要使其最小化。
那么我们需要做的是
编写
代码，
当输入参数θ时，
它们可以计算出两样东西：J(θ)
以及
derivative terms for, you
J等于 0，1直到N时的偏导数项。
假设代码
可以做这两件事，
那么梯度下降所做的就是
反复执行这些更新。
理解了吗？
所以给出我们
用于计算这些的偏导数的代码，
梯度下降法就把它插入
到这里，使用它们来更新我们的参数θ。
因此另一种考虑
梯度下降的思路是
我们需要提供代码
来计算J(θ)和
这些导数，然后
把这些插入到梯度下降中，
然后它就可以为我们最小化这个函数。
对于梯度下降来说，我认为
技术上你实际并不需要编写代码
来计算成本函数J(θ)，
你只需要编写代码来计算导数项。
但是，如果你考虑你的
代码还要监测
这些J(θ)的收敛性，
那么我们就
考虑提供代码
既计算
成本函数又计算导数。
所以，在写完代码
计算这两项之后，
我们可以使用的一个算法就是梯度下降。
但梯度下降并不是我们可以使用的唯一算法。
还有其他一些算法，
更先进，更复杂的，
如果我们只提供
他们来计算
这两项，那么这些
就是为我们优化
成本函数的不同方法。
共轭梯度拟牛顿算法、BFGS和L-BFGS
L-BFGS are examples of more
就是更先进优化算法的例子，
它们需要有一种方法来计算J(θ)，
以及需要一种方法
计算导数，
然后使用比梯度下降更复杂
的策略来最小化成本函数。
这三种算法的准确细节
远远超出了本门课程的范畴。
实际上你最后通常会
花费很多天
或几周时间研究这些算法。
比如你可能会上一门课来提高数值计算能力。
不过让我来告诉你们他们的一些特性。
这三种算法有许多优点。
一个是
使用这其中任何一个算法，你通常
不需要手动选择学习速率α。
所以对于
这些算法的一种思路是，给出
计算导数和成本函数的方法，
你可以认为算法有一个智能的内部循环。
而且，事实上，他们确实有一个智能
的内部循环，
称为线性搜索算法，它可以自动
尝试不同的
学习速率α，并自动
选择一个好的学习速率α，
因此它甚至可以
为每次迭代选择不同的学习速率。
那么你就不需要自己选择。
这些算法实际上在做
更复杂的事情，而不仅仅是
选择一个好的学习速率。
所以它们往往最终
收敛得远远快于梯度下降。
这些算法实际上在做
更复杂的事情，不仅仅是
选择一个好的学习速率，
所以它们往往最终
比梯度下降收敛得快多了。不过
关于它们到底做什么的详细讨论
已经超过了本门课程的范围。
实际上，我过去
使用这些算法
已经很长一段时间了，也许超过
十年了，使用得相当频繁，
was only, you know, a
而直到几年前，我才真正
搞清楚
共轭梯度法、BFGS和O-BFGS的细节。
因此，实际上完全有可能
成功使用这些算法
并应用于许多不同的学习
问题，而不需要真正理解
这些算法的内环间在做什么。
如果这些算法有缺点，
那么我想说主要
缺点是它们比
梯度下降法复杂多了。
特别是你最好
不要使用共轭梯度，L-BGFS，BFGS这些算法，
- conjugate gradient, L-BGFS, BFGS -
除非你是数值计算方面的专家。
Instead, just as I
我不会建议你们编写
自己的代码来计算
数据的平方根或者
计算逆矩阵，
因为对于这些算法我
还是会建议你直接使用一个软件库。
所以，要求一个平方根，
我们所能做的
就是调用一些
别人已经
写好用来计算数字平方根的函数。
幸运的是，有Octave和
与它密切相关的MATLAB语言
- 我们将会用到它们 -
Octave有一个非常
理想的库用于实现这些先进的优化算法。
所以，如果你直接调用
它自带的库，你就能得到不错的结果。
我必须指出
这些算法
实现得好或不好是有区别的。
因此，如果你正在你的
机器学习程序中使用一种不同的语言，
比如如果你正在使用
C，C + +，Java
等等，你
可能会想尝试一些
不同的库，以确保你找到一个
能很好实现这些算法的库。
因为
在LPFGS或者等高线梯度的
实现上，
表现得好与不太好
是有差别的。
因此现在让我们来说明
如何使用这些算法，我打算举一个例子。
比方说，你有一个
含两个参数的问题，
这两个参数是θ0和θ1。
那么你的成本函数
J（θ）等于θ1
减去五的平方，再加上θ2减五平方。
因此，通过这个成本函数，
你可以得到θ1和θ2的值。
如果你想将J（θ）最小化为θ的一个函数。
那么最小化它的值
将是θ1
等于5，θ2等于5。
我知道你们当中
有些人比别人会演算，
但是成本函数J的导数
推出来是这两个表达式。
我已经把这个演算做好了。
那么你就可以应用
先进优化算法里的一个
来最小化成本函数J。
所以，如果我们
不知道最小值
是5，5，但你想要
成本函数为5，这个最小值
是用比如
梯度下降这些算法，最好是
比它更先进的算法（算出来的），
你要做的就是运行一个
像这样的Octave函数，那么我们
运行成本函数，
比如costFunction(theta)，
这个的作用就是
它会返回两个自变量，
第一个是jVal，它是
我们用来计算成本函数J的。
所以说jVal
等于，θ1
减5的平方加
θ2减5的平方。
这里只是计算这个成本函数。
函数返回的第二个自变量是
梯度。
梯度是
是一个2×1的向量，
梯度向量的两个因素
对应
这里的两个偏导数项。
运行这个成本函数后，
你就可以
调用先进的优化函数，
这个函数叫fminunc
- 它表示
Octave里无约束最小化函数-
调用它的方式如下。
你设置几个options。
这个options
作为一个数据结构可以存储你想要的options。
So grant up on,
这里设置梯度目标参数
这意味着你现在确实要给这个算法提供一个梯度。
我现在设置最大
迭代次数，比方说，一百。
我们给出一个θ的猜测初始值。
它是一个2×1的向量。
那么这个命令就调用fminunc。
这个@符号表示
指向成本函数的指针，
这是我们刚刚定义的。
如果你调用它，
它就会
使用更多先进的优化算法中的一个。
或者你可以把它当成梯度下降一样考虑。
但是它能自动选择学习
速率α，使你不需要自己来做。
不过它会尝试
使用一些先进的优化算法。
就像加强版的梯度下降法。
要为你找到最佳的θ值。
让我告诉你它在Octave里什么样。
所以我写了这个θ函数
的成本函数，正好和上一行完全一致。
它计算成本函数J-val。，
以及梯度，
梯度有两个要素，
成本函数对于
θ1和θ2这两个参数的偏导数。
the two parameters, theta one and theta two.
现在，让我们切换到Octave窗口。
我把刚刚的命令敲进去。
options = optimset。这是
在我的优化算法的options上
设置参数的记号，
“GradObj”，"on" "MaxIter","100"
这样就是100
次迭代，我
现在要给我的算法提供梯度值。
比方说，θ的初始值是一个2×1的[0,0]向量。
这是我猜测的θ的初始值。
现在[optTheta,functionalVal,exitFlag]=fminunc
function val exit flag
equals fminunc constraint.
指向成本函数的指针。
给出我猜测的初始值。
还有options这些。
如果我敲回车，这个就会运行优化算法。
它很快返回值。
这个格式很有意思，
因为我的代码是环绕式的。
code wrapped around.
所以这个事情很有趣，
完全是因为我的命令行被环绕了。
不过这里只是数字呈现，
numerically renders, you know, think
把它看成是加强版梯度下降，
它们找到θ的最优值
是θ1=5，θ2=5，
这正是我们希望的。
最佳的函数值
实际上是10的-30次幂。
所以，这基本上就是零，
这也是我们所希望的。
exitflag为1，
这说明它的收敛状态。
what the convergence status of this.
如果你想，你可以运行 help fminunc
去阅读相关资料
以理解exitflag的作用。
to interpret the exit flag.
exitflag可以让你验证该算法是否已经收敛。
这就是你怎样在Octave里运行这些算法的过程。
哦对了，这里我得指出
用Octave运行的时候，
向量θ的值，θ的参数向量，
of theta, must be in
必须属于rd的d次幂，d大于等于2。
所以θ仅仅是一个实数。
因此如果它不是至少
一个两维的向量
或高于二维的向量，
fminunc就无法运算
因此万一你有一个
一维的函数需要优化，
one-dimensional function that you use
你可以查找Octave里fminuc函数的资料，
从而得到更多的细节。
for additional details.
这就是我们如何优化
试例的过程，这是一个
简单的快速运行成本函数。
我们把它应用到序列中。
在逻辑回归中，我们有
一个参数向量θ，
我要混合使用
Octave记号和数学符号。
我希望这个解释很明确，
我们的参数θ
由θ0到θn组成，
parameters theta 0 through theta
因为在Octave的标号中，
向量的标号是从1开始的，
在Octave里，θ0实际上写成θ1，
actually written theta 1
in octave, theta 1 is gonna be written.
然后有θ2，
接下来写到
θ n+1，对吧？
这是因为Octave的记号
是向量从1开始的。
of 1 and so the index of 0.
因此，我们需要
做的是写一个
成本函数，它为
逻辑回归获取成本函数。
具体点说，成本函数
需要返回JVal值，
就像你需要一些代码
来计算θ（J）一样，
我们也需要给它梯度值。
那么gradient 1
对应用来计算
关于θ0的偏导数，
接下去关于θ1的偏导数，
依此类推。
再次声明，这是gradient 1,
gradient2，等等，
而不是gradient 0，gradient 1，
因为Octave的标号
是从1开始，而不是从0开始的。
我希望你们从这个幻灯片中
得到的主要概念是
你所要做的是
写一个函数，它能返回
成本函数值，以及梯度值。
因此要把这个
应用到逻辑回归
或者甚至线性回归中，
比如你要把这些优化算法用于线性回归。
你需要做的就是敲入
合适的代码来计算
这里的这些东西。
现在你已经知道如何使用这些先进的优化算法。
Because, using, because for
有了这些算法，你就在使用一个
复杂的优化库，
它使用起来更模糊一点，
more opaque and so
因此也许稍微有点难调试。
不过由于这些算法的运行速度
通常远远超过梯度下降，
即便我有一个很大的机器学习问题，
这个速度也通常很快，
所以我会选择
这些算法，而不是梯度下降。
有了这些概念，
你就有希望能够将逻辑回归
和线性回归应用于
更大的问题。
这就是先进的优化理念。
在下一个视频
并且是逻辑回归这一部分的最后一个视频中，
我想要告诉你如何
选择你已经知道的逻辑回归算法，
然后使它在多类的分类问题中也能运行。
it work also on multi-class classification problems.