ML Lecture 3-1: Gradient Descent

视频链接:https://www.youtube.com/watch?v=yKKNr-QKz2Q

\qquad好,各位同学大家早,那我们就开始上课吧!今天的第一堂课,我们要讲的是 GradientGradientGradient DescentDescentDescent。GradientDescentGradient\ DescentGradient Descent 我们上次已经大概讲过怎么做了,但是有一些小技巧呢,你可能是不知道的,所以我们要再详细说明一下,GradientDescentGradient\ DescentGradient Descent 你要怎么把它做得更好。

\qquad好,那我们上次是这样说的,在整个 machine learning 的第 3 个步骤,我们要找一个最好的 function。那找一个最好的 function 这件事呢,是要解一个 optimization(优化)的 problem。也就是说,在第二步,我们先定了一个 loss functionL,这个 loss function 呢,它是一个 functionfunction。你把一个 function 代到这个 loss function 里面,或者是你把操控一个 function 形状的一组参数代到一个 loss function 里面(我们现在,在这张投影片里面,把那些参数写成 θLloss functionθ 是那些参数)它就会告诉你说,这组参数有多不好。那你接下来,要做的事情呢,就是要找一组参数 θ,让这个 loss function 越小越好,那这件事情怎么做呢?

\qquad我们可以用 Gradient Descent,假设现在这个 θ\pmb{θ}θθθ 是一个参数的 set,那里面有两个参数:θ1θ_1θ1​ 跟 θ2θ_2θ2​。首先,你先随机的选取一个起始的点(θ0\pmb{θ^0}θ0θ0θ0),随机选取一组起始的参数,这边写成 θ10θ^0_1θ10​、θ20θ^0_2θ20​([θ10θ20]\displaystyle\left[\begin{matrix} θ^0_1 \\ θ^0_2 \end{matrix}\right][θ10​θ20​​]),用上标 0 来代表说,它是初始的那一组参数,那用下标代表说,这个是这一组参数里面的第 1component 跟第 2component接下来,你计算 θ10θ^0_1θ10​ 跟 θ20θ^0_2θ20​ 对这个 loss function 的偏微分([∂L(θ10)∂θ1∂L(θ20)∂θ2]\left[\begin{matrix} \displaystyle\frac{\partial L(θ^0_1)}{\partial θ_1} \\ \displaystyle\frac{\partial L(θ^0_2)}{\partial θ_2} \end{matrix}\right]⎣⎢⎡​∂θ1​∂L(θ10​)​∂θ2​∂L(θ20​)​​⎦⎥⎤​),然后 [θ10θ20]−η[∂L(θ10)∂θ1∂L(θ20)∂θ2]\displaystyle\left[\begin{matrix} θ^0_1 \\ θ^0_2 \end{matrix}\right]-\eta\left[\begin{matrix} \displaystyle\frac{\partial L(θ^0_1)}{\partial θ_1} \\ \displaystyle\frac{\partial L(θ^0_2)}{\partial θ_2} \end{matrix}\right][θ10​θ20​​]−η⎣⎢⎡​∂θ1​∂L(θ10​)​∂θ2​∂L(θ20​)​​⎦⎥⎤​得到一组新的参数,这个参数,这边写做 [θ11θ21]\displaystyle\left[\begin{matrix} θ^1_1 \\ θ^1_2 \end{matrix}\right][θ11​θ21​​],代表说它是在第二个时间点由 θ0\pmb{θ^0}θ0θ0θ0 update 以后得到的参数,下标代表说,它有两个 component接下来,你有[θ11θ21]\displaystyle\left[\begin{matrix} θ^1_1 \\ θ^1_2 \end{matrix}\right][θ11​θ21​​]以后呢,你就一样去计算它们的偏微分([∂L(θ11)∂θ1∂L(θ21)∂θ2]\left[\begin{matrix} \displaystyle\frac{\partial L(θ^1_1)}{\partial θ_1} \\ \displaystyle\frac{\partial L(θ^1_2)}{\partial θ_2} \end{matrix}\right]⎣⎢⎡​∂θ1​∂L(θ11​)​∂θ2​∂L(θ21​)​​⎦⎥⎤​),再乘上 learning rate(η\etaη),再去减[θ11θ21]\displaystyle\left[\begin{matrix} θ^1_1 \\ θ^1_2 \end{matrix}\right][θ11​θ21​​]得到下一组参数([θ12θ22]=[θ11θ21]−η[∂L(θ11)∂θ1∂L(θ21)∂θ2]\displaystyle\left[\begin{matrix} θ^2_1 \\ θ^2_2 \end{matrix}\right]=\left[\begin{matrix} θ^1_1 \\ θ^1_2 \end{matrix}\right]-\eta\left[\begin{matrix} \displaystyle\frac{\partial L(θ^1_1)}{\partial θ_1} \\ \displaystyle\frac{\partial L(θ^1_2)}{\partial θ_2} \end{matrix}\right][θ12​θ22​​]=[θ11​θ21​​]−η⎣⎢⎡​∂θ1​∂L(θ11​)​∂θ2​∂L(θ21​)​​⎦⎥⎤​),那就反复进行这个 process,这个就是 Gradient Descent

\qquad那如果你想要也得更简洁一点的话呢,其实你可以这样写:假设你现在有两个参数,θ1θ_1θ1​ 跟 θ2θ_2θ2​,你把这个 θ1θ_1θ1​ 跟 θ2θ_2θ2​ 对这个 loss function 做偏微分,你把这两个偏微分得到的值串在一起变成一个 vector([∂L(θ1)∂θ1∂L(θ2)∂θ2]\left[\begin{matrix} \displaystyle\frac{\partial L(θ_1)}{\partial θ_1} \\ \displaystyle\frac{\partial L(θ_2)}{\partial θ_2} \end{matrix}\right]⎣⎢⎡​∂θ1​∂L(θ1​)​∂θ2​∂L(θ2​)​​⎦⎥⎤​),那这个 vector 呢,就叫做 Gradient,你把 L 前面,加一个倒三角形(∇L\nabla L∇L),这个东西呢,就叫做 Gradient,那它其实是一个 vector

\qquad所以你可以把这个式子([θ11θ21]\left[\begin{matrix} θ^1_1 \\ θ^1_2 \end{matrix}\right][θ11​θ21​​])写成一个 vector,θ1\pmb{θ^1}θ1θ1θ1;这个东西([θ10θ20]\left[\begin{matrix} θ^0_1 \\ θ^0_2 \end{matrix}\right][θ10​θ20​​]),写成一个 vector,θ0\pmb{θ^0}θ0θ0θ0;这一项([∂L(θ10)∂θ1∂L(θ20)∂θ2]\left[\begin{matrix} \displaystyle\frac{\partial L(θ^0_1)}{\partial θ_1} \\ \displaystyle\frac{\partial L(θ^0_2)}{\partial θ_2} \end{matrix}\right]⎣⎢⎡​∂θ1​∂L(θ10​)​∂θ2​∂L(θ20​)​​⎦⎥⎤​)就是这一项(∇L(θ0)\nabla L(\pmb{θ^0})∇L(θ0θ0θ0)),那你就写成呢,LLL 在 θ0\pmb{θ^0}θ0θ0θ0 这个地方的 Gradient。所以你可以把 update 参数呢,简单写成:θ1=θ0−η∇L(θ0)\pmb{θ^1}=\pmb{θ^0}-\eta\nabla L(\pmb{θ^0})θ1θ1θ1=θ0θ0θ0−η∇L(θ0θ0θ0),同理:θ2=θ1−η∇L(θ1)\pmb{θ^2}=\pmb{θ^1}-\eta\nabla L(\pmb{θ^1})θ2θ2θ2=θ1θ1θ1−η∇L(θ1θ1θ1)。如果把它 visualize 的话呢,它看起来像是这个样子。

\qquad假设我们现在有两个参数:θ1θ^1θ1、θ2θ^2θ2,那你随机的选一个初始的位置:θ0\pmb{θ^0}θ0θ0θ0。然后接下来呢,你计算在 θ0\pmb{θ^0}θ0θ0θ0 这个点,这个参数对 loss functionGradient。假设参数对 loss functionGradient 是这个红色的箭头,Gradient 就是一个 vector,它是一个红色的箭头。
如果你不知道 Gradient 是甚么的话呢,你就想成,它是等高线的法线方向,这个箭头,它指的方向就是 loss 的等高线的法线方向。

\qquad那怎么 update 参数呢?你就把这个 Gradient 乘上 learning rate,然后再取一个负号,就是这个蓝色的箭头,再把它加上 θ0\pmb{θ^0}θ0θ0θ0 ,就得到 θ1\pmb{θ^1}θ1θ1θ1。那这个步骤就反复地持续进行下去,再计算一遍 Gradient,你得到另外一个红色的箭头,那你现在走的方向呢,就变成是红色的箭头的相反,红色箭头乘上一个负号,再乘上 learning rate,就是现在这个蓝色的箭头 ,得到 θ2\pmb{θ^2}θ2θ2θ2。这个步骤就反复一直进行下去,再算一下在 θ2\pmb{θ^2}θ2θ2θ2 这个地方的 Gradient,然后再决定要走的方向(走到 θ3\pmb{θ^3}θ3θ3θ3)。再算一次 Gradient,再决定要走的方向,这个就是 Gradient Descent。这些,我们上次其实都讲过了,接下来呢,要讲一些 Gradient Descenttip

\qquad首先,第一件事情就是:你要小心地调你的 learning rate,如果你已经开始做作业一的话呢,你会知道说,有时候 learning rate 是可以给你造成一些问题的。

\qquad举例来说,假设这个(左侧曲线)是我们的 loss functionsurface(曲面),假设长这样子。如果你今天 learning rate 调刚刚好的话,你从左边这边开始,那你可能就是顺着红色的箭头,很顺利地走到了最低点。可是如果你今天 learning rate 调的太小的话(蓝色),那它走的速度会变得非常慢,虽然只要给它够多的时间,它终究会走到这个 local minimum 的地方,但是如果它走得太慢的话呢,你会没有办法接受这件事情,你可能会来不及交作业。如果你今天这个 learning rate 调得稍微大一点,比如说像绿色这个箭头的话,那就变成说,它的步伐太大了,它变得像一个巨人一样,步伐太大了,它永远没有办法走到这个特别低的地方,它都在这个山谷的口上面震荡,它永远走不下去。那甚至如果你今天真的把 learning rate 调太大的话(黄色),它可能一瞬间就飞出去了,结果你 update 参数以后,loss 反而越 update 越大。

\qquad那其实只有在你的参数是一维或二维的时候,你才能够把这样子的图 visualize 出来。如果你今天是有很多维参数,这个 errorsurface,在这个高维的空间里面,你是没有办法 visualize 它的。但是,有另外一个东西,你是可以 visualize 的,什么东西呢?你可以 visualize 参数的变化对这个 loss 的变化,你可以 visualize 每次参数 update 的时候 loss 的改变的情形(右侧坐标曲线图)。所以,今天如果你 learning rate 设得太小的话(蓝色),你就会发现说,这个 loss 它下降地非常非常慢 ;\pmb{;};​;​​; 如果你今天 learning rate 调得大一点的话,你在左边这个图会看到说 loss 先快速地下降,接下来呢,它就卡住了(绿色)。所以,如果你 learning rate 调得大一点的话,你把参数的 update 对 loss 的变化做出来会看到的是绿色这条线,你的 loss 很快地下降,但很快地卡住了,很快地不再下降 ;\pmb{;};​;​​; 那如果你今天 learning rate 是调得太大,你就会发现你的 loss 就飞出去了(黄色);\pmb{;};​;​​; 你需要调整它,让它调到刚刚好,那你才能够得到一个好的结果(红色)。

\qquad所以你在做 Gradient Descent 的时候,你应该要把这个图画出来,没有把这个图画出来,你就会非常非常地卡。有人就说,他就把 Gradient 的程序写好,那写好放下去之后开始跑,他去打一场 LOL,然后打完回来就发现说,结果烂掉啦,然后,他也不知道烂在哪里这样子。所以如果你在做 Gradient Descent 的时候,你应该把这个图画出来。然后你要先看一下,它前几次 update 参数的时候它 update 的走法是怎么样,你 learning rate 调太大,它一下子就爆炸了,所以这个时候,你就知道你要赶快调 learning rate。你要确定它呢,是稳定地下降,你才能去打 LOL 这样子。

\qquad但是要调 learning rate 很麻烦,有没有办法自动地调 learning rate 呢?有一些自动的方法可以帮我们调 learning rate,最基本而简单的大原则是:通常 learning rate 是随着参数的 update 会越来越小的。为甚么会这样呢?因为当你在刚开始的起始点的时候,它通常离最低点是比较远的,所以你步伐呢,要踏大一点,就是走得快一点,才能够赶快走到最低点。但是,经过好几次的参数 update 以后呢?你已经比较靠近你的目标了,所以这个时候呢,你就应该减少你的 learning rate,让它能够收敛在你最低点的地方。

\qquad举例来说,你 learning rate 的设法可能是这样,你可以设成说:这个 learning rate 是一个 t dependent 的函数,它是 depend on 你现在参数 update 的次数。在第 tupdate 参数的时候,你就把你的 learning rate 设成 ηt+1\displaystyle\frac{η}{\sqrt{t+1}}t+1​η​,这样当你参数 update 的次数越多的时候呢,这个 learning rate 就会越来越小。但是光这样呢,是不够的,你到这边,我们需要因材施教,所以最好的状况应该是每一个不同的参数都给它不同的 learning rate

\qquad这件事情呢,是有很多的小技巧的,其中,我觉得最简单,最容易实作的,叫做Adagrad。那Adagrad是这样子的,它说呢,每一个参数的learning rate呢,都把它除上之前算出来的微分值的root mean square。什么意思呢?我们原来的Gradient Descent是这样:wt+1←wt−ηtgtw^{t+1}\leftarrow w^t - \eta^tg^twt+1←wt−ηtgt,假设w是某一个参数,这个时候w不是一组参数,我们现在只考虑一个参数,因为我们现在,在做Adagrad这个做法的时候,它是adaptive(自适应)的learning rate,所以每一个参数,它都有不同的learning rate,所以呢,我们现在要把每一个参数都分开来考虑。那w呢,是某一个参数,那wlearning rate,在一般的Gradient Descent呢,赋予一个depend on时间的值:ηt=ηt+1\displaystyle\eta^t=\frac{η}{\sqrt{t+1}}ηt=t+1​η​。但是你可以把这件事情做的更好,在Adagrad里面呢, 你把这个 ηt\eta^tηt 除以 σt\sigma^tσt:ηtσt\displaystyle\frac{\eta^t}{\sigma^t}σtηt​。这个 σt\sigma^tσt 是甚么呢?这个 σt\sigma^tσt 是过去所有微分的值的root mean square(均方根:nnn 个项的平方和除以 nnn 再开方),这个值对每一个参数而言都是不一样的。所以现在就会变成说,不同的参数它的learning rate都是不一样的。这边这个g呢,是这个偏微分的值:gt=∂L(θt)∂wg^t=\displaystyle\frac{\partial L(θ^t)}{\partial w}gt=∂w∂L(θt)​。

\qquad那我们实际举个例子,来看看这件事情是怎么实作的。假设你现在初始的值,是 w0w^0w0,那接下来呢,你就计算在 w0w^0w0 那点的微分,写作 g0g^0g0 ;\pmb{;};​;​​;
\qquad然后,它的 learning rate 是多少呢?它的 learning rate 是 ηt\eta^tηt 除以 σt\sigma^tσt:ηtσt\displaystyle\frac{\eta^t}{\sigma^t}σtηt​,ηt\eta^tηt 是一个时间 dependent 的参数 ,那 σt\sigma^tσt 是甚么呢?σt\sigma^tσt 是一个参数 dependent 的参数,σt\sigma^tσt 它是过去所有算过的微分值的 root mean square。那在这个 case 里面,我们过去只算过一个微分值,就是 g0g^0g0,所以这个 σ0\sigma^0σ0,就是 g0g^0g0 的平方再开根号:(g0)2\displaystyle\sqrt{(g^0)^2}(g0)2​ ;\pmb{;};​;​​;
\qquad那接下来呢,你再 update 参数,你把这个 w0w^0w0 更新变成 w1w^1w1:w1←w0−η0σ0g0\displaystyle w^1\leftarrow w^0-\frac{\eta^0}{\sigma^0}g^0w1←w0−σ0η0​g0。在 w1w^1w1 这个地方,你再算一次 Gradient,就是 g1g^1g1,那 g1g^1g1 的 learning rate 应该乘上多少呢?它要乘 η1σ1\displaystyle\frac{\eta^1}{\sigma^1}σ1η1​。那 σ1\sigma^1σ1,它是过去所有微分值的 root mean square,过去我们已经算过两次微分值:一次是 g0g^0g0,一次是 g1g^1g1,所以 σ1\sigma^1σ1,就变成 g0g^0g0 跟 g1g^1g1 的 root mean square,也就是把 g0g^0g0 平方再加 g1g^1g1 平方,再取平均值 ,再开根号:12[(g0)2+(g1)2]\displaystyle\sqrt{\frac{1}{2}[(g^0)^2+(g^1)^2]}21​[(g0)2+(g1)2]​ ;\pmb{;};​;​​;
\qquad那 w3w^3w3 一样,你就是 update 参数就得到 w2w^2w2:w2←w1−η1σ1g1\displaystyle w^2\leftarrow w^1-\frac{\eta^1}{\sigma^1}g^1w2←w1−σ1η1​g1,你有了 w2w^2w2 以后,你可以算 g2g^2g2,在 w2w^2w2 地方的微分值就是 g2g^2g2,它的 learning rate 就是 η2σ2\displaystyle\frac{\eta^2}{\sigma^2}σ2η2​,那这个 σ2σ^2σ2 呢 ,就是过去算出来所有微分值的 root mean square,过去算出 g0g^0g0、g1g^1g1、g2g^2g2,你就把 g0g^0g0、g1g^1g1、g2g^2g2 都平方,再平均,然后再开根号得到 σ2σ^2σ2:13[(g0)2+(g1)2+(g2)2]\displaystyle\sqrt{\frac{1}{3}[(g^0)^2+(g^1)^2+(g^2)^2]}31​[(g0)2+(g1)2+(g2)2]​。然后把它放在左边,搭配参数得到 w3w^3w3:w3←w2−η2σ2g2\displaystyle w^3\leftarrow w^2-\frac{\eta^2}{\sigma^2}g^2w3←w2−σ2η2​g2。
\qquad这个步骤呢,就反复地一直继续下去,到第 tupdate 参数的时候,你有一个微分值 gtg^tgt。那这个 gtg^tgt 的 learning rate 就是 ηtσt\displaystyle\frac{\eta^t}{\sigma^t}σtηt​,这个 σt\sigma^tσt 是过去所有微分的值的 root mean square,过去已经算出 g0g^0g0、g1g^1g1、g2g^2g2 一直到 gtg^tgt,你就把 g0g^0g0、g1g^1g1、g2g^2g2 一直到 gtg^tgt 都取平方,再加起来,再平均,再开根号,得到 σtσ^tσt:1t+1∑i=0t(gi)2\displaystyle\sqrt{\frac{1}{t+1}\sum_{i=0}^{t}(g^i)^2}t+11​i=0∑t​(gi)2​,就把它放在这边。

\qquad所以,现在如果我们用Adagrad的时候呢,它update参数的式子,写成这样子:wt+1←wt−ηtσtgt\displaystyle w^{t+1}\leftarrow w^t-\frac{\eta^t}{\sigma^t}g^twt+1←wt−σtηt​gt,这个 σtσ^tσt,我们就写成这样子:1t+1∑i=0t(gi)2\displaystyle\sqrt{\frac{1}{t+1}\sum_{i=0}^{t}(g^i)^2}t+11​i=0∑t​(gi)2​,这个root mean square,我们在前页投影片已经看到的。那这个time dependentlearning rate呢?这个time dependentlearning rate你可以写成 ηt=ηt+1\displaystyle η^t=\frac{η}{\sqrt{t+1}}ηt=t+1​η​。那你可以发现说,当你把这一项(ηtη^tηt)除以这一项(σtσ^tσt)的时候,因为他们都有:t+1\sqrt{t+1}t+1​,所以 t+1\sqrt{t+1}t+1​ 是可以删掉的。所以整个Adagrad的式子,它的learning rate,你就可以写成 η∑i=0t(gi)2\displaystyle\frac{\eta}{\sqrt{\sum_{i=0}^{t}(g^i)^2}}∑i=0t​(gi)2​η​,一个constant ηηη 除掉根号(过去所有 gradient 的平方和),但不用算平均这样。因为平均这件事情,会跟上面time dependentlearning rate抵销掉,所以你在写 Adagrad 的式子的时候,你可以简化成不需要把time dependent的这件事情explicitly(明确的)的写出来,你就直接把你的learning rate写成 η∑i=0t(gi)2\displaystyle\frac{\eta}{\sqrt{\sum_{i=0}^{t}(g^i)^2}}∑i=0t​(gi)2​η​ 就好。

\qquad我们在做一般的 Gradient Descent 的时候,我们这个参数的 update 取决于两件事情:一件事情是 learning rate,另外一件事情是 Gradient。我们的意思就是说 Gradient 越大,你参数 update 就越快,斜率算出来越大,参数 update 就越快。我相信你可以接受这件事情,但是在 Adagrad 里面,你不觉得相当矛盾吗?你不觉得有某些怪怪的地方?gtg^tgt 这一项告诉我们,微分的值越大,你参数 update 越快,但是 ∑i=0t(gi)2\sum_{i=0}^{t}(g^i)^2∑i=0t​(gi)2 这一项它是相反的,对不对?你有没有觉得说,这边有一些奇怪的地方?也就是说,今天当你的 Gradient 越大的时候,你底下算出来的这项(∑i=0t(gi)2\sum_{i=0}^{t}(g^i)^2∑i=0t​(gi)2)就越大。你底下算出来的这项越大,你的参数 update 的步伐就越小,这不就跟我们原来要做的事情是有所冲突的吗?在分子的地方告诉我们说,Gradient 越大,踏的步伐越大,参数就 update 的越大,但是分母的地方却说,如果 Gradient 越大,参数 update 的越小这样。

\qquad好,怎么解释这件事情呢?有一些 paper 这样解释的:这个 Adagrad 它想要考虑的是,今天这个 Gradient 有多 surprise,也就是所谓的"反差"这样,反差,大家知道吗?就是比如说,反差萌的意思就是说,如果本来一个很凶恶的角色,突然对你很温柔,你就会觉得它特别温柔这样。所以呢,对 Gradient 来说也是一样的道理:假设有某一个参数 ,它在第一次 update 参数的时候,它算出来的 Gradient0.001,再来又算 0.0010.003...,到某一次呢,它 Gradient 算出来是 0.1,你就会觉得特别大,因为它比之前算出来的 Gradient 都大了 100 倍,特别大。但是,如果是有另外一个参数,它一开始算出来是 10.8,再来算 20.9,再来算 31.7,它的 Gradient 平常都很大,但是它在某一次算出来的 Gradient0.1,这时候,你就会觉得它特别小这样子。

\qquad所以为了强调这种反差的效果,所以在 Adagrad 里面呢,我们就把它除以这项(∑i=0t(gi)2\sum_{i=0}^{t}(g^i)^2∑i=0t​(gi)2),这项就是把过去这些 Gradient 的平方算出来,我们就想要知道说过去 Gradient 有多大,然后再把它们相除,看这个反差有多大这样。这个是直观的解释,那更正式的解释呢,我有这样的解释:

\qquad我们来考虑一个二次函数,这个二次函数呢,我们就写成这样子:y=ax2+bx+cy=ax^2+bx+cy=ax2+bx+c,他只有一个参数,就是 x。如果我们把这个二次函数,对 x 做微分的话,这是 2ax+b2ax + b2ax+b,如果它绝对值算出来的话,长这样子。好,那这个二次函数的最低点在哪里呢?是 −b2a\displaystyle-\frac{b}{2a}−2ab​。如果你今天呢,在这个二次函数上,你随机的选一个点开始 ,你要做 Gradient Descent,那你的步伐踏出去多大是最好的?假设这个起始的点是 x0x^0x0,最低点是 −b2a\displaystyle-\frac{b}{2a}−2ab​,那踏出去一步,最好的步伐,其实就是这两个点之间的距离,因为如果你踏出去的步伐,是这两个点之间的距离的话,你就一步到位了。这两个点之间的距离是甚么呢?这两个点之间的距离 ∣x0+b2a∣\displaystyle|x_0+\frac{b}{2a}|∣x0​+2ab​∣ 你整理一下,它是 ∣2ax0+b∣2a\displaystyle\frac{|2ax_0 + b|}{2a}2a∣2ax0​+b∣​,∣2ax0+b∣|2ax_0 + b|∣2ax0​+b∣ 这一项就是 x0x_0x0​ 这一点的微分。所以 Gradient Descent 你不觉得说听起来很有道理,就是说,如果我今天算出来的微分越大,我就离原点越远,如果踏出去的步伐跟微分的大小成正比,它可能是最好的步伐,但是,这件事情只有在只考虑一个参数的时候才成立。

\qquad如果我们今天呢,同时有好几个参数,我们要同时考虑好几个参数的时候,这个时候呢,刚才的论述就不见得成立了。也就是说,Gradient 的值越大就与最低点的距离越远这件事情,在有好多个参数的时候 ,是不一定成立的,比如说,你想看看,我们现在考虑 w1w_1w1​ 跟 w2w_2w2​ 两个参数,这个图上面的颜色,是它的 loss。那如果我们考虑 w1w_1w1​ 的变化,我们就在蓝色这条线这边切一刀,我们把蓝色这条线切一刀,我们看到的 error surface 长得是这个样子(右侧蓝色曲线),如果你比较图上的两个点,a 点跟 b 点,那确实 a 点的微分值比较大,那它就距离最低点比较远。

\qquad但是,如果我们同时考虑几个参数,我们同时考虑 w2w_2w2​ 这个参数,我们在绿色的这条在线切一刀,如果我们在绿色这条在线切一刀的话,我们得到的值是这样子,我们得到的 error surface 是这样子(右侧绿色曲线),它是比较尖的,这个谷呢,是比较深的,因为你会发现说,w2w_2w2​ 在这个方向的变化是比较猛烈的,如果我们只比较在 w2w_2w2​ 这条在线的两个点 , cd 的话,确实 c 的微分比较大,所以,它距离最低点是比较远的。但是,如果我们今天的比较是跨参数的话,如果我们比较 a 这的点对 w1w_1w1​ 的微分,c 这个点对 w2w_2w2​ 的微分,这个结论呢,就不成立了。虽然说,c 这个点对 w2w_2w2​ 的微分值是比较大的,这个微分值是比较小的,但 c 呢,是离最低点比较近的,而 a 是比较远的。

\qquad所以,当我们 update 参数,当我们 update 参数选择跟微分值成正比,这样的论述是在,没有考虑跨参数的条件下,这件事情才成立的,当我们要同时考虑好几个参数的时候呢,我们这样想呢,就不足够了。所以,如果我们今天要同时考虑好几个参数的话,我们应该要怎么想呢?如果你看看,我们说的最好的 step 的话(∣2ax0+b∣2a\displaystyle\frac{|2ax_0 + b|}{2a}2a∣2ax0​+b∣​),我们看最好的这个 step,它其实还有分母这一项 ,它的分母这一项呢是 2a,这个 2a 哪来的呢?这个 2a 是甚么呢?这个 2a 呢,如果我们今天把这个 y2 次微分,我们做一次微分得到这个式子(2ax0+b2ax_0 + b2ax0​+b),那如果我们做二次微分的话,就得到 2a,那它是一个 constant。这个 2a 呢,就出现在最好的 step 的分母的地方,所以,今天最好的 step,它不只是要正比于一次微分,它同时要和二次微分的大小成反比,如果你二次微分比较大,这个时候你参数 update 量应该要小;如果二次微分小的话,你参数 update 量应该要比较大。所以,最好的 step 应该要把二次微分考虑进来,所以如果我们今天把二次微分考虑进来的话,你会发现说,在 w1w_1w1​ 这个方向上,你的二次微分是比较小的,因为这个是一个比较平滑的弧,所以这个二次微分是比较小的。在 w2w_2w2​ 的方向上,这个是一个比较尖的弧、比较深的弧,它是一个比较尖的弧,所以它的二次微分是比较大的。

\qquad所以你光比较 ac 的微分值呢 ,是不够的,你要比较 a 的微分值除掉它的二次,跟 c 的微分值除掉它的二次,再去比。如果你做这件事,你才能够真正显示这些点跟最低点的距离这样,虽然 a 这个点,它的微分是比较小的,但它的二次也同时是比较小的,c 比较大,二次是比较大的。所以,如果你把二次微分的值呢,考虑进去,做这个评检、调整的话,那你这个时候才能真正反映你现在所在位置跟最低点的距离。

\qquad好,那这件事情跟 Adagrad 的关系是甚么呢?如果你把 Adagrad 的式子列出来的话,它参数的 update 量是这个样子的(−η∑i=0t(gi)2\displaystyle-\frac{\eta}{\sqrt{\sum_{i=0}^{t}(g^i)^2}}−∑i=0t​(gi)2​η​),ηηη 是一个 constant,所以我们就不理它,这个 gtg^tgt 它就是一次微分,对不对,下面这个,过去所有微分值的平方和开根号,神奇的是,它想要代表的是二次微分。那你可能会问说,怎么不直接算二次微分呢?你可以直接算二次微分,确实可以这么做,也有这样的方法,而且你确实可以这么做,但是,有时候你会遇到的状况是参数量大、data\pmb{data}datadatadata 的时候,你可能算一次微分就花一天这样子,然后你再算二次微分,你要再多花一天,有时候,这样子的结果是你不能承受的,而且你多花一天 performance 还不见得会比较好,其实这个结果,是你不能承受的。所以,Adagrad 它提供的做法就是,我们在没有增加任何额外运算的前提之下,想办法能不能够做一件事情,去估一下二次的微分应该是多少?在 Adagrad 里面,你只需要一次微分的值,那这个东西我们本来就要算它了,所以并没有多做任何多余的运算。

\qquad好,怎么做呢?如果我们考虑一个二次微分比较小的峡谷(左),跟一个二次微分比较大的峡谷(右),然后我们把它的一次微分的值,考虑进来的话,这个是长这样(左),这个是长这样(右)。如果你只是在,这个区间和这个区间里面,随机 sample 一个点,算它的一次微分的话,你看不出来它的二次微分值是多少,但是如果你 sample 够多点,你在某一个 range 之内,sample 够多点的话,那你就会发现说,在这个比较平滑的峡谷里面,它的一次微分通常就是比较小的;在比较尖的峡谷里面,它的一次微分通常是比较大的。而 Adagrad 这边,summation over 过去所有的微分的平方这件事情,你就可以想成,在这个地方呢,做 sampling(采样),那你再把它的平方和呢,再开根号算出来,那这个东西,就反映了二次微分的大小(二阶微分反映了梯度的变化率,∑i=0t(gi)2\pmb{\sqrt{\sum_{i=0}^{t}(g^i)^2}}∑i=0t​(gi)2​​∑i=0t​(gi)2​​​∑i=0t​(gi)2​ 越大/越小的函数二次微分越大/越小)。这个 Adagrad 怎么做,其实我们上次已经有示范过了,那所以我们就不再示范。

\qquad接下来我们要奖的另外一件事情呢,是 Stochastic (随机)的 Gradient Descent,那它可以让你的 training 呢,更快一点。

\qquad好,这个怎么说呢?如果我们今天做的是这个 Regression 的话,这个是 Regression 的式子:b+∑wixinb+\sum w_ix_i^nb+∑wi​xin​,那你把 Regression 得到 estimation(估计)的结果,减掉 y^\hat{y}y^​,再去平方,再 summation over 所有的 training data:∑n(y^n−(b+∑wixin))2\displaystyle\sum_n{(\hat{y}^n-(b+\sum w_ix_i^n))^2}n∑​(y^​n−(b+∑wi​xin​))2,这是我们的 loss function。所以,这个式子非常合理,我们的 loss 本来就应该考虑所有的 example,它本来就应该 summation over 所有的 example,有这些以后,你就可以去算 Gradient,然后你就可以做 Gradient Descent

\qquad但 Stochastic Gradient Descent,它的想法不一样。Stochastic Gradient Descent 它做的事情是,每次就拿一个 xnx^nxn 出来,这边你可以随机取,也可以按照顺序取,那其实随机取的时候,如果你今天是在做 deep learningcase,也就是说你的 error surface 不是 convex(凸的),是非常崎岖的,随机取呢,是有帮助的,总之,你就取一个 example 出来,假设取出来的 example 是 xnx^nxn,这个时候呢,你要计算你的 loss,你的 loss 呢,只考虑一个 example,你只考虑你现在的参数对这个 exampley 的估测值,再减掉它的正确答案,再做平方,然后就不 summation over 所有的 example,因为你现在只取一个 example 出来,你只算某一个 exampleloss :y^n−(b+∑wixin))2\displaystyle\hat{y}^n-(b+\sum w_ix_i^n))^2y^​n−(b+∑wi​xin​))2。

\qquad那接下来呢,你在 update 参数的时候,你只考虑那一个 example。我们只考虑一个 exampleloss function,我们就写成 LnL^nLn,代表它是考虑第 nexampleloss function。那你在算 Gradient 的时候呢,你不是算对 total 所有的 data,它的 Gradient 的和,你只算对某一个 example,它的 lossGradient。然后呢,你就很急躁的 update 参数了,所以在原来的 Gradient Descent 里面,,你计算所有 dataloss,然后才 update 参数,但是在 Stochastic Gradient Descent 里面,你看一个 example,就 update 一个参数这样,你可能想说,这有啥好呢?听起来好像没有甚么好的,那我们实际来操作一下好了。

\qquad我们刚才看到的图呢,它可能是这个样子(左图),原来的 Gradient Descent,你看完所有的 example 以后,你就 update 一次参数,那它其实是比较稳定,你会发现说,它走的方向,就是按照 Gradient 建议我们的方向来走。但是如果你是用 Stochastic Gradient Descent 的话(右图),你每看到一个 example ,你就 update 一次参数,如果你有 20example 的时候,那你就 update 20 次参数。那左边他是看完 20exampleupdate 一次参数,右边是每一个 exampleupdate 一次参数,所以在左边看 20example 的时候,你右边也已经看了 20example 而且 update 20 次参数了。所以 update 20 次参数的结果呢,看起来就像是这样(右边),从一样的起始点开始,但它已经 update20 次参数。

\qquad所以,如果只看一个 example 的话,它的步伐是小的,而且可能是散乱的,因为你每次只考虑一个 example,所以它参数 update 的方向,跟这个 Gradient Descent(左图)total losserror surface 界定我们走的方向不见得是一致的。但是因为我们可以看很多个 example,所以天下武功,唯快不破,在它(左边)走一步的时候,你已经出 20 拳了,所以它(右边)走的反而是比较快的。

\qquad然后呢,接下来我们要讲的是第三个 tip,就是你可以做 FeatureScaling(缩放)。

\qquad所谓的 Feature Scaling 意思呢,是这样子:假设我们现在要做 Regression,那我们这个 Regressionfunction 里面,inputfeature 有两个:x1x^1x1 跟 x2x^2x2(比如说:如果是要 predict 宝可梦进化以后 CP 值的话,那 x1x^1x1 是进化前的 CP值,x2x^2x2 是它的生命值等等这样)。你有两个 input feature,x1x^1x1 跟 x2x^2x2,那如果你看你今天的 x1\pmb{x^1}x1x1x1 x2\pmb{x^2}x2x2x2,它们分布的 range 是很不一样的话那就建议你呢把它们做 scaling把它们的 range 分布变成是一样。举例来说:左边的 x2x^2x2 它的分布是远比 x1x^1x1 大,那就建议你把 x2x^2x2 这个值呢,做一下 rescaling,把它的值缩小,让 x2x^2x2 的分布跟 x1x^1x1 的分布是比较像的。

\qquad你希望不同的 feature,他们的 scale 是一样的,为甚么要这么做呢?我们举个例子,假设这个是我们的 Regressionfunction(y=b+w1∗x1+w2∗x2y=b+w_1*x_1+w_2*x_2y=b+w1​∗x1​+w2​∗x2​),那我们写成这样,这边这个意思跟这个是一样的啦,那假设 x1x_1x1​ 平常的值,都是比较小的,假设说 12 之类的,假设 x2x_2x2​ 它平常的值都很大,它 input 的值都很大,都是 100200 之类的。那这个时候,如果你把 losssurface 画出来,会遇到甚么样的状况呢?你会发现说,如果你更改 w1w_1w1​ 跟 w2w_2w2​ 的值,假设你把 w1w_1w1​ 跟 w2w_2w2​ 的值都做一样的更改,都加个 △w\pmb{\bigtriangleup w}△w​△w​​△w,你会发现说,w1w_1w1​ 的变化,对 y 的变化而言是比较小的,w2w_2w2​ 的变化,对 y 的变化而言是比较大的,对不对?这件事情是很合理的,因为你要把 w2w_2w2​ 乘上它 input 的这些值,你要把 w1w_1w1​ 乘上它 input 的这些值。如果 w2w_2w2​ 它乘的这些 input 的值是比较大的,那只要把 w2w_2w2​ 小小的变化,那 y 就会有很大的变化;那同样的变化,w1w_1w1​ 它 input 的值是比较小的,它对 y 的影响呢,就变成是比较小的。

\qquad所以如果你把他们的error surface画出来的话呢,你看到的可能像是这个样子(左图),这个图是甚么意思呢?因为 w1w_1w1​ 对y的影响比较小,所以 w1w_1w1​ 就对loss的影响比较小,所以 w1w_1w1​ 对loss是有比较小的微分的,所以 w1w_1w1​ 这个方向上,它是比较平滑。w2w_2w2​ 对y的影响比较大,所以它对loss的影响比较大,所以改变 w2w_2w2​ 的时候,它对loss的影响比较大,所以,它在这个方向上(纵向),是比较sharp的,所以这个方向上,有一个比较尖的峡谷。那如果今天,x1x_1x1​ 跟 x2x_2x2​ 的值,它们的 scale(规模) 是接近的,那如果你把 loss 画出来的话呢(右图),它就会比较接近圆形,w1w_1w1​ 跟 w2w_2w2​ 呢,对你的 loss 是有差不多的影响力。

\qquad这个对做 Gradient Descent 会有甚么样的影响呢?是会有影响的,比如说,如果你从这个地方开始(左图箭头尾部),其实我们上次已经有看到了,就是这样,这种长椭圆的 error surface 阿,如果你不出些 Adagrad 甚么的,你是很难搞定它的,因为不同方向上,你会需要非常不同的 learning rate,你同一组 learning rate 会搞不定它,你要 adaptive learning rate 才能够搞定它。所以这样子的状况,没有 scaling 的时候,,它 update 参数是比较难的,但是,如果你有 scale 的话,它就变成一个正圆形,如果是在正圆形的时候 ,update 参数就会变得比较容易,而且,你知道说 Gradient Descent,它并不是向着最低点走,在这个蓝色圈圈,它的最低点是在这边(蓝色点),绿色圈圈最低点是在这边(绿色点)。但是你今天在 update 参数的时候,走的方向是顺着,等高线的方向,是顺着 Gradient 建议我们的方向。所以,虽然最低点在这边,你从边开始走(左箭头尾部),你还是会走这个方向,再走进去,你不会指向那个最低点去走。那如果是绿色的呢,绿色的又不一样,因为,它如果真的是一个正圆的话,你不管在这个区域的哪一个点,它都会向着圆心走,所以如果你有做 feature scaling 的时候,你在做参数的 update 的时候呢,它是会比较有效率的,

\qquad那你可能会问说,怎么做 scaling?这个方法有千百种啦,你就选一个你喜欢的就是了。那常见的作法是这样(标准化 / z值归一化),假设我有 Rexample:x1x^1x1、x2x^2x2 到 xRx^RxR,每一笔 example 里面都有一组 feature。x1x^1x1 它第一个 component 就是 x11x^1_1x11​ ,x2x^2x2 它第一个 component 就是 x12x^2_1x12​,x1x^1x1 它第二个 component 就是 x21x^1_2x21​,x2x^2x2 它第二个 component 就是 x22x^2_2x22​。

\qquad那怎么做 feature scaling?你就对每一个 dimension i(维度i),都去算它的 mean,这边写成 mi\pmb{m_i}mi​​mi​​​mi​;都去算它的 standard deviation(标准差),这边写成 σi\pmb{σ_i}σi​​σi​​​σi​:σi=∑r=1R(xir−mi)R\displaystyleσ_i=\sqrt{\frac{\displaystyle\sum_{r=1}^R(x^r_i-m_i)}{R}}σi​=Rr=1∑R​(xir​−mi​)​​。然后呢,对第 rexample 的第 icomponent,你就把它减掉所有的 data 的第 icomponentmean,也就是 mi\pmb{m_i}mi​​mi​​​mi​。然后,再除掉所有的 data 的第 icomponentstandard deviation。然后呢,你就会得到说,你做完这件事以后,你所有 dimensionmean 就会是 0,你的 variance 就会是 1,这是其中一个常见地做 localization 的方法。

  • 标准化 / z值归一化(standardization / z-score normalization):将数值缩放到0附近,且数据的分布变为均值为0,标准差为1的标准正态分布(先减去均值来对特征进行中心化 mean centering 处理,再除以标准差进行缩放)

\qquad最后,在下课前呢,我们来讲一下,为甚么 Gradient Descent 它会 workGradient Descent 背后的理论基础是什么?

\qquad那在真正深入数学部分的基础之前呢,我们来问大家一个问题:大家都已经知道 Gradient Descent 是怎么做的,假设,我问你一个这样的是非题,每一次,我们在 update 参数的时候,我们都得到一个新的 θθθ,这个新的 θθθ,总是会让我们的 loss 比较小,这个陈述是对的吗?好,也就是意思就是说 θ0θ^0θ0,你把它代到 LLL 里面,它会大于 θ1θ^1θ1 代到 LLL 里面,它会大于 θ2θ^2θ2 代到 LLL 里面,每次 update 参数的时候,这个 loss 的值,它都是越来越小的,这陈述是正确的吗?你觉得它是正确的同学举手,那你觉得这个陈述,它是不对的同学举手,好,手放下,大家的观念都很正确,没错,就是 update 参数以后loss 不见得会下降的。所以如果你今天自己 implement Gradient Descent 做出来,update 参数以后的 loss 没有下降,那不见得是你的程序有 bug,因为本来就有可能发生这种事情。我们刚已经看过说,如果你 learning rate 调太大的话,会发生这种事情,或许,我们可以在下课前,做一个 demo

\qquad好,那在解释 Gradient DescentTheory 之前,这边有一个 Warning of Math ,意思就是说,这个部分,就算是你没有听懂,也没有关系,太阳明天依旧会升起。

\qquad好,那我们先不要管 Gradient Descent,我们先来想想看,假如你要解一个 Optimizationproblem,你要在这一个 figure 上面找他的最低点,你到底应该要怎么做?那有一个这样子的作法,如果今天给我一个起始的点 ,也就是 θ0θ^0θ0,我们有方法,在这个起始点的附近,画一个圆圏、画一个范围、画一个红色圈圈。然后,在这个红色圈圈里面,找出它的最低点,比如说,红色圈圈里面的最低点,就是在这个边上,这个意思就是说,如果你给我一整个 error function,我没有办法马上一秒钟就告诉你说它的最低点在哪里,但是如果你给我一个 error function,加上一个初始的点,我可以告诉你说,在这个初始点附近,画一个范围之内找出一个最小的值。那你假设找到最小的值以后,我们就更新我们中间的位置,中间的位置挪到 θ1θ_1θ1​。接下来呢,再画一个圆圈,我们可以在这个圆圈范围之内,再找一个最小的点,假设呢,它是落在这个地方,然后你就再更新中心点的参数到 θ2θ^2θ2 这个地方,然后你就可以再找小小范围内的最小值,然后再更新你的参数,就一直这样下去。好,那现在的问题就是,怎么很快的在红色圈圈里面,找一个可以让 loss 最小的参数呢?

\qquad怎么做这件事呢?这个地方要从 Taylor series(泰勒级数) 说起,假设你是知道 Taylor series 的,那个微积分有教过,Taylor series 告诉我们什么呢?它告诉我们说,任何一个 function h(x)h(x)h(x),如果它在 x=x0x=x_0x=x0​ 这点呢,是 infinitely differentiable(无限可微),那你可以把这个 h(x)h(x)h(x) 写成以下这个样子:∑k=0∞h(k)(x0)k!(x−x0)k\displaystyle\sum_{k=0}^{\infty}\frac{h^{(k)}(x_0)}{k!}(x-x_0)^kk=0∑∞​k!h(k)(x0​)​(x−x0​)k,这里 k 代表微分的次数。把它展开的话,你可以把 h(x)h(x)h(x) 写成 h(x0)+h′(x0)(x−x0)+h′′(x0)2!(x−x0)2+⋯\displaystyle h(x_0)+ h'(x_0)(x - x_0)+\frac{h''(x_0)}{2!}(x - x_0)^2+\cdotsh(x0​)+h′(x0​)(x−x0​)+2!h′′(x0​)​(x−x0​)2+⋯,那当 xxx 很接近 x0x_0x0​ 的时候,(x−x0)(x - x_0)(x−x0​) 就会远大于 (x−x0)2(x - x_0)^2(x−x0​)2,就会远大于后面的 3 次、4次,到无穷多次。所以这个时候你可以把后面的高次项删掉,所以当 xxx 很接近 x0x_0x0​ 的时候,h(x)h(x)h(x) 就可以写成:h(x0)+h′(x0)(x−x0)h(x_0) + h'(x_0)(x - x_0)h(x0​)+h′(x0​)(x−x0​),那这个是只有考虑一个 variablecase

\qquad那其实我这边有个例子,假设 h(x)=sin(x)h(x)=sin(x)h(x)=sin(x),那在 x0x_0x0​ 约等于 π4\displaystyle\frac{π}{4}4π​ 的地方,sin(x)sin(x)sin(x) 你可以写成什么样子呢?你用计算器算一下,它算出来是这样子(上图公式),这个 sin(x)sin(x)sin(x) 可以写成这么多项的相加。那如果我们把这些项画出来的话,你得到这样子一个结果(上图曲线):如果是 12\displaystyle\frac{1}{\sqrt{2}}2​1​,只考虑 0 次的话,是这条水平线;考虑 12+x−π42\displaystyle\frac{1}{\sqrt{2}}+\frac{\displaystyle x-\frac{π}{4}}{\sqrt{2}}2​1​+2​x−4π​​ ,考虑 1 次的话,是这条斜线;如果你有再把 2 次考虑进去,考虑 0次、1次、2次的话,我猜你得到的,可能是这条线(开口向下抛物线);如果你再把 3 次考虑进去的话,你得到这条线(横置S型曲线);橙色这条线是 sin(x)sin(x)sin(x)。

\qquad好,你发现说,如果你只有考虑 1 次的时候,它其实跟这个 sin(x)sin(x)sin(x) 橙色这条线差很多啊,根本不像,但是它在 π4\displaystyle\frac{π}{4}4π​ 的附近,在这个地方(红色箭头)附近,它是像的。因为如果 xxx 很接近 π4\displaystyle\frac{π}{4}4π​ 的话,那公式后面这些平方项、三次方项这些都很小,所以就可以忽略它们,只考虑一次的部分。

\qquad那这个 Taylor series 也可以是有好几个参数的,如果今天有好几个参数的话,那你就可以这样子做:这个 h(x,y)h(x,y)h(x,y),假设这个 function 有两个参数,你可以用 Taylor series 把它展开成这样:h(x0,y0)+∂h(x0,y0)∂x(x−x0)+∂h(x0,y0)∂y(y−y0)+somethingrelatedto(x−x0)2and(y−y0)2+⋯\displaystyle h(x_0,y_0)+ \frac{\partial h(x_0,y_0)}{\partial x}(x - x_0)+\frac{\partial h(x_0,y_0)}{\partial y}(y - y_0)+something\ related\ to\ (x - x_0)^2 and\ (y - y_0)^2+\cdotsh(x0​,y0​)+∂x∂h(x0​,y0​)​(x−x0​)+∂y∂h(x0​,y0​)​(y−y0​)+something related to (x−x0​)2and (y−y0​)2+⋯,就有 000 次的,有考虑 (x−x0)(x - x_0)(x−x0​) 的,有考虑 (y−y0)(y - y_0)(y−y0​) 的,还有考虑 (x−x0)2(x - x_0)^2(x−x0​)2 跟 (y−y0)2(y - y_0)^2(y−y0​)2 的。如果今天 xxx、yyy 很接近 x0x_0x0​、y0y_0y0​ 的话,那平方项就可以被消掉,就只剩 h(x0,y0)+∂h(x0,y0)∂x(x−x0)+∂h(x0,y0)∂y(y−y0)\displaystyle h(x_0,y_0)+ \frac{\partial h(x_0,y_0)}{\partial x}(x - x_0)+\frac{\partial h(x_0,y_0)}{\partial y}(y - y_0)h(x0​,y0​)+∂x∂h(x0​,y0​)​(x−x0​)+∂y∂h(x0​,y0​)​(y−y0​) 这个部份而已。所以,今天 x,yx, yx,y 如果很接近 x0,y0x_0, y_0x0​,y0​ 的话,那 h(x,y)h(x, y)h(x,y) 就可以写成:h(x0,y0)+∂h(x0,y0)∂x(x−x0)+∂h(x0,y0)∂y(y−y0)\displaystyle h(x_0,y_0)+ \frac{\partial h(x_0,y_0)}{\partial x}(x - x_0)+\frac{\partial h(x_0,y_0)}{\partial y}(y - y_0)h(x0​,y0​)+∂x∂h(x0​,y0​)​(x−x0​)+∂y∂h(x0​,y0​)​(y−y0​),公式中偏微分的值,你不要看他这么复杂,微分的值其实就是一个 constant 而已,就是一个常数项而已。

\qquad好,那如果我们今天考虑我们刚才讲的问题:如果,今天给我一个中心点,这是 (a,b)(a,b)(a,b),那我画了一个很小很小的圆圈,红色的圆圈,假设它是很小的,在这个红色圆圈的范围之内,我其实可以把 loss functionTaylor series 做简化,我可以把 loss function,L(θ)L(θ)L(θ) 写成:L(a,b)+∂L(a,b)∂θ1(θ1−a)+∂L(a,b)∂θ2(θ2−b)\displaystyle L(a,b)+ \frac{\partial L(a,b)}{\partial θ_1}(θ_1 - a)+\frac{\partial L(a,b)}{\partial θ_2}(θ_2 - b)L(a,b)+∂θ1​∂L(a,b)​(θ1​−a)+∂θ2​∂L(a,b)​(θ2​−b)。所以在红色的圈圈内,loss function 可以写成这样子,那我们把 L(a,b)L(a,b)L(a,b) 代进去,它就是一个 constant,用一个 s 来表示;那 θ1θ_1θ1​ 对 L(a,b)L(a,b)L(a,b) 的偏微分,在 (a,b)(a,b)(a,b) 这个位置,这也是一个 constant,所以我们用 u 来表示;θ2θ_2θ2​ 对 L(a,b)L(a,b)L(a,b) 的偏微分也是一个 constant,所以我们用 v 来表示。所以呢,在红色圈圈范围内呢,这个式子是非常简单的,就写成左下角这个样子。

\qquad再来,如果告诉你说,红色圈圈内的式子都长这个样子:L(a,b)+∂L(a,b)∂θ1(θ1−a)+∂L(a,b)∂θ2(θ2−b)\displaystyle L(a,b)+ \frac{\partial L(a,b)}{\partial θ_1}(θ_1 - a)+\frac{\partial L(a,b)}{\partial θ_2}(θ_2 - b)L(a,b)+∂θ1​∂L(a,b)​(θ1​−a)+∂θ2​∂L(a,b)​(θ2​−b),你能不能秒算哪一个 θ1θ_1θ1​ 跟 θ2θ_2θ2​ 可以让它的 loss 最小呢?我相信你可以秒算这个结果,不过我们还是很快地稍微看一下,好,suv 都是常数,我们就把它放在蓝色的框框那里面,不用管它值是多少。我们现在的问题就是在红色的圈圈内呢,找 θ1θ_1θ1​ 跟 θ2θ_2θ2​ 让 loss 最小,那所谓的在红色圈圈内的意思就是说,红色圈圈的中心就是 ab,所以你这个 (θ1−a)2+(θ2−b)2≦d2(θ_1 - a)^2+(θ_2 - b)^2 ≦ d^2(θ1​−a)2+(θ2​−b)2≦d2,他们要在这个红色圈圈的范围内,这件事情,其实就是秒算对不对,太简单了,你一眼就可以看出来。

\qquad如果你今天把 (θ1−a)(θ_1 - a)(θ1​−a) 都用 △θ1△θ_1△θ1​ 表示,(θ2−b)(θ_2 - b)(θ2​−b) 都用 △θ2△θ_2△θ2​ 来表示,s 你可以不用理它,因为它跟 θθθ 没关系啊,所以你要找不同 θθθ 让 LLL 值最小,不用管 s。好,如果我们看一下 LLL,你会发现说它是 u△θ1+v△θ2u△θ_1 + v△θ_2u△θ1​+v△θ2​(不用管 s),也就是说它的值就是有一个 vector ,叫做 (△θ1,△θ2)(△θ_1, △θ_2)(△θ1​,△θ2​),有另外一个 vector,叫做 (u,v)(u,v)(u,v),你把这个 (△θ1,△θ2)(△θ_1, △θ_2)(△θ1​,△θ2​) 跟这个 (u,v)(u,v)(u,v) 做 inner product(内积),你就得到这个值。

\qquad接下来的问题就是,如果我们要让 L(θ)L(θ)L(θ) 最小,我们应该选择什么样的 (△θ1,△θ2)(△θ_1,△θ_2)(△θ1​,△θ2​) 呢?我们要选择什么样的 (△θ1,△θ2)(△θ_1,△θ_2)(△θ1​,△θ2​),我们才能够让 L(θ)L(θ)L(θ) 最小呢?这个太容易了,就是选正对面的,对不对?如果我们今天把 (△θ1,△θ2)(△θ_1,△θ_2)(△θ1​,△θ2​) 转成跟 (u,v)(u,v)(u,v) 这条反方向,然后再把 (△θ1,△θ2)(△θ_1,△θ_2)(△θ1​,△θ2​) 的长度增长,长到极限,也就是长到这个红色圈圈的边缘,那这个 (△θ1,△θ2)(△θ_1,△θ_2)(△θ1​,△θ2​) 跟 (u,v)(u,v)(u,v),它们做 inner product 的时候,它的值是最大的(负值)。

\qquad所以,这告诉我们说,什么样的 (△θ1,△θ2)(△θ_1, △θ_2)(△θ1​,△θ2​) 可以让 loss 的值最小呢?就是它是[uv]\left[\begin{matrix} u\\v \end{matrix} \right][uv​]乘上负号,再乘上一个 scale,再乘上一个 constant:−η[uv]-\eta\left[\begin{matrix} u\\v \end{matrix} \right]−η[uv​],也就是说你要把 (△θ1,△θ2)(△θ_1, △θ_2)(△θ1​,△θ2​),调整它的长度,长到正好顶到这个红色圈圈的边边,这个时候呢,它算出来的 loss 是最小的,这一项(η\etaη)应该跟长度是成正比的。所以呢,我们再整理一下式子,△θ1△θ_1△θ1​ 就是 (θ1−a)(θ_1 - a)(θ1​−a),△θ2△θ_2△θ2​ 就是 (θ2−b)(θ_2 - b)(θ2​−b)。所以,如果我们今天要再红色圈圈里面,找一个 θ1θ_1θ1​ 跟 θ2θ_2θ2​ 让 loss 最小的话,那怎么做呢?那个最小的值,就是中心点 (a,b)(a,b)(a,b),减掉某一个 constant 乘上 (u,v)(u,v)(u,v):[ab]−η[uv]\left[\begin{matrix} a\\b \end{matrix} \right]-\eta\left[\begin{matrix} u\\v \end{matrix} \right][ab​]−η[uv​]。

\qquad那你接下来要做的事,就是把 (u,v)(u,v)(u,v) 带进去,把它带进去就得到这样子的式子:[ab]−η[∂L(a,b)∂θ1∂L(a,b)∂θ2]\left[\begin{matrix} a\\b \end{matrix} \right] - \eta\left[\begin{matrix} \displaystyle\frac{\partial L(a,b)}{\partial θ_1} \\ \displaystyle\frac{\partial L(a,b)}{\partial θ_2} \end{matrix} \right][ab​]−η⎣⎢⎡​∂θ1​∂L(a,b)​∂θ2​∂L(a,b)​​⎦⎥⎤​。那这个式子,你就发现它其实,exactly(恰好)就是 Gradient Descent,对不对?我们做 Gradient Descent 的时候,就是找一个初始值,算每一个参数在初始值的地方的偏微分,把它排成一个 vector 就是 Gradient,然后再乘上某一个东西叫做 learning rate,再把它减掉,所以这个式子 exactly 就是 Gradient Descent 的式子。

\qquad但你要想想看,我们今天可以做这件事情,我们可以用这个方法,找一个最小值,它的前提是什么? 它的前提是你的上面这个式子:L(θ)≈s+u(θ1−a)+v(θ2−b)L(θ)\approx s+u(θ_1-a)+v(θ_2-b)L(θ)≈s+u(θ1​−a)+v(θ2​−b)要成立,Taylor series 给你的这个 approximation是够精确的。什么样 Taylor series 给我们的 approximation才够精确呢?当你今天画出来的红色圈圈够小的时候,Taylor series 给我们的 approximation才会够精确。所以,这个就告诉我们什么?这个告诉我们说,你这个红色圈圈的半径是小的,那这个 ηηη,这个 learning rate,它跟红色圈圈的半径是成正比的,所以这个 learning rate 不能太大,你 learning rate 要很小,你这个 learning rate 无穷小的时候呢,这个式子(L(θ)≈s+u(θ1−a)+v(θ2−b)L(θ)\approx s+u(θ_1-a)+v(θ_2-b)L(θ)≈s+u(θ1​−a)+v(θ2​−b)) 才会成立。所以 Gradient Descent,如果你要让你每次 update 参数的时候,你的 loss 都越来越小的话,其实,理论上你的 learning rate 要无穷小,你才能够保证这件事情,虽然实作上,只要够小就行了。所以,你会发现说,如果你的 learning rate 没有设好,是有可能说,你每次 update 参数的时候,这个式子(L(θ)≈s+u(θ1−a)+v(θ2−b)L(θ)\approx s+u(θ_1-a)+v(θ_2-b)L(θ)≈s+u(θ1​−a)+v(θ2​−b))是不成立的,所以导致你做 Gradient Descent 的时候,你没有办法让 loss 越来越小。

\qquad那你会发现说,这个 LLL,它只考虑了 Taylor series 里面的一次式,可不可以考虑二次式呢?Taylor series 不是有二次、三次,还有很多吗?如果你把二次式考虑进来,理论上你的 learning rate 就可以设大一点,对不对,如果我们把二次式考虑进来,可不可以呢?是可以的,那有一些方法,我们今天没有要讲,是有考虑到二次式的,比如说,牛顿法这样子,那在实作上,尤其是假设你在做 deep learning 的时候,这样的方法,不见得太普及,不见得太 practical,为甚么呢?因为你现在要算二次微分,甚至它还会包含一个 Hessianmatrix,和 Hessian matrixinverse,总之,你会多很多运算,而这些运算,在做 deep learning 的时候呢,你是无法承受的,你用这个运算来换你 update 的时候比较有效率,会觉得是不划算的。所以,今天如果在做,比如说,deep learning 的时候,通常,还是 Gradient Descent 是比较普及、主流的作法。

\qquad上面如果你没有听懂的话,也没关系,在最后一页,我们要讲的是 Gradient Descent 的限制,Gradient Descent 有什么样的限制呢?有一个大家都知道的是,它会卡在这个 local minimum 的地方。所以,如果这是你的 error surface,那你从这个地方(最左红点),当作你的初始值,去更新你的参数,最后走到一个微分值是 0,也就是 local minimum 的地方,你参数的更新,就停止了,但是,一般人就只知道这个问题而已,那其实还有别的问题,事实上,这个微分值是 0 的地方,并不是只有 local minimum 阿,对不对,saddle point(鞍点)也是微分值是 0。所以,你今天在参数 update 的时候你也是有可能卡在一个不是 local minimum但是微分值是 0 的地方,这件事情,也是有可能发生的。

\qquad但是,其实卡在 local minimum 或微分值是 0 的地方啊,这都只是幻想啦,其实真正的问题是这样,你想想看,你 implement 作业一了,你几时是真的算出来那个微分值 exactly 等于 0 的时候就把它停下来了,也就是你最多就做微分值小于 10−610^{-6}10−6,小于一个很小的值,你就把它停下来了,对不对?但是,你怎么知道,那个微分值算出来很小的时候,它就很接近 local minimum 呢?不见得很接近 local minimum 啊,有可能,微分值算出来很小,但它其实是在一个高原的地方,而那高原的地方,微分值算出来很小,你就觉得说那这个一定就是很接近 local minimum,在 local minimum 附近,所以你就停下来了,因为你们很少有机会真的算出来微分值是 0 嘛,对不对。你可能觉得说,微分算出来很小,就很接近 local minimum,你就把它停下来,那其实搞不好,它是一个高原的地方,它离那个 local minimum 还很远啊,这也是有可能的。讲到这边,有人都会问我一个问题,这个问题,我很难回答,他说,你怎么会不知道你是不是接近 local minimum 了呢?我一眼就知道说 local minimum 在这边阿,呵呵,你怎么会不知道呢?,所以我觉得这些图都没有办法表示 Gradient Descent 的精神。

(To Learn More) ML Lecture 3-1: Gradient Descent相关推荐

  1. (To Learn More) ML Lecture 1: Regression - Case Study(下)

    ML Lecture 1: Regression - Case Study(下) 视频链接: https://www.youtube.com/watch?v=fegAeph9UaA \qquad li ...

  2. (To Learn More) ML Lecture 0-1: Introduction of Machine Learning

    ML Lecture 0-1: Introduction of Machine Learning 视频链接:https://www.youtube.com/watch?v=CXgbekl66jc \q ...

  3. [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...

  4. 【李宏毅2020 ML/DL】补充:Meta Learning - Gradient Descent as LSTM

    我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 本次笔记补充视频 BV1JE411g7XF 的缺失部分.上节课李老师讲了元学习中的参数初始化方法:MAML 与 ...

  5. 【李宏毅2020 ML/DL】P5-7 Gradient Descent_1-3

    我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 已经有人记了笔记(很用心,强烈推荐): https://github.com/Sakura-gh/ML-not ...

  6. 李宏毅ML -lecture 0 机器学习介绍

    李宏毅ML -lecture 0 机器学习介绍 https://blog.csdn.net/Arron_hou/article/details/87836849

  7. ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)

    引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自网上的免费课程和一些经典书籍,免费课 ...

  8. 【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)

    我的GitHub地址:https://github.com/taw19960426/DeepLearning存放与之对应的python代码 1.Regression 1.1 Introduction ...

  9. Gradient Descent梯度下降(透彻分析)

    ----------首先了解什么是梯度? 官方解释: 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为 ...

最新文章

  1. 不可不知的Python模块: collections
  2. python数据结构的列表_Python数据结构之列表
  3. PMCAFF微分享 | 供应链金融套利套汇介绍
  4. vue3.0 AntDesignVue2.0 table的rowkey报错问题解决方法
  5. 【接口时序】2、Verilog实现流水灯及与C语言的对比
  6. python可以做特效吗_学习mel语言,Python,JavaScript到什么程度才能做一下大型特效,要自已开发插件脚本呢?...
  7. 10年老电脑如何提速_电脑上如何提取图片中的文字?教你3个方法,10秒轻松搞定...
  8. UTM坐标转GPS方法分享
  9. mysql和redis常见面试题_redis相关面试题
  10. 图解通信原理与案例分析-28:四大全球卫星导航系统GNSS的基本原理与技术对比---中国的北斗、美国的GPS、欧洲的伽利略、俄罗斯的格洛纳斯
  11. 【模型检测学习笔记】8:无限字上ω正则LT性质的验证
  12. 用机器学习做风控的氪信,凭什么获金牌投资人章苏阳数千万融资?
  13. 亚马逊抛出“下一代贸易链”整合解决方案:中国跨境电商如何借道转型?
  14. RK3588 实现温控风扇之获取cpu温度(一)
  15. maven项目转gradle
  16. ios手机python编译器免费_适用与IOS手机的python编辑器,让你不限空间,地点都能玩转pyhton代码 !...
  17. Unity3D-打飞碟小游戏
  18. 项目中成功的运用proxool连接池
  19. 计算视觉与机器学习类资讯~
  20. Ubuntu设置Stunnel客户端

热门文章

  1. 华为硬件工程师社招机考题库_2016华为硬件机试题库
  2. 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程
  3. 深度学习理论与架构最新进展综述论文,66页pdf,333篇参考文献
  4. 计算机无法连接苹果手机软件,iphone连接win10电脑后没反应怎么解决
  5. eas-bos工作流的几张表
  6. Tsinsen-A1491 家族【并查集】
  7. 怎样修改eas服务器连接设置,金蝶eas服务器连接设置
  8. Spring框架的两大核心思想
  9. -Djava.endorsed.dirs=D:\Tomcat 9.0\endorsed is not supported.问题
  10. 电子实验记录本的功能介绍