(To Learn More) ML Lecture 3-1: Gradient Descent
![](/assets/blank.gif)
ML Lecture 3-1: Gradient Descent
视频链接:https://www.youtube.com/watch?v=yKKNr-QKz2Q
![](/assets/blank.gif)
\qquad好,各位同学大家早,那我们就开始上课吧!今天的第一堂课,我们要讲的是 GradientGradientGradient DescentDescentDescent。GradientDescentGradient\ DescentGradient Descent 我们上次已经大概讲过怎么做了,但是有一些小技巧呢,你可能是不知道的,所以我们要再详细说明一下,GradientDescentGradient\ DescentGradient Descent 你要怎么把它做得更好。
![](/assets/blank.gif)
\qquad好,那我们上次是这样说的,在整个 machine learning
的第 3
个步骤,我们要找一个最好的 function
。那找一个最好的 function
这件事呢,是要解一个 optimization
(优化)的 problem
。也就是说,在第二步,我们先定了一个 loss function
:L
,这个 loss function
呢,它是一个 function
的 function
。你把一个 function
代到这个 loss function
里面,或者是你把操控一个 function
形状的一组参数代到一个 loss function
里面(我们现在,在这张投影片里面,把那些参数写成 θ
,L
是 loss function
,θ
是那些参数)它就会告诉你说,这组参数有多不好。那你接下来,要做的事情呢,就是要找一组参数 θ
,让这个 loss function
越小越好,那这件事情怎么做呢?
![](/assets/blank.gif)
\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
来代表说,它是初始的那一组参数,那用下标代表说,这个是这一组参数里面的第 1
个 component
跟第 2
个 component
。接下来,你计算 θ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
的话呢,它看起来像是这个样子。
![](/assets/blank.gif)
\qquad假设我们现在有两个参数:θ1θ^1θ1、θ2θ^2θ2,那你随机的选一个初始的位置:θ0\pmb{θ^0}θ0θ0θ0。然后接下来呢,你计算在 θ0\pmb{θ^0}θ0θ0θ0 这个点,这个参数对 loss function
的 Gradient
。假设参数对 loss function
的 Gradient
是这个红色的箭头,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 Descent
的 tip
。
![](/assets/blank.gif)
\qquad首先,第一件事情就是:你要小心地调你的 learning rate
,如果你已经开始做作业一的话呢,你会知道说,有时候 learning rate
是可以给你造成一些问题的。
![](/assets/blank.gif)
\qquad举例来说,假设这个(左侧曲线)是我们的 loss function
的 surface
(曲面),假设长这样子。如果你今天 learning rate
调刚刚好的话,你从左边这边开始,那你可能就是顺着红色的箭头,很顺利地走到了最低点。可是如果你今天 learning rate
调的太小的话(蓝色),那它走的速度会变得非常慢,虽然只要给它够多的时间,它终究会走到这个 local minimum
的地方,但是如果它走得太慢的话呢,你会没有办法接受这件事情,你可能会来不及交作业。如果你今天这个 learning rate
调得稍微大一点,比如说像绿色这个箭头的话,那就变成说,它的步伐太大了,它变得像一个巨人一样,步伐太大了,它永远没有办法走到这个特别低的地方,它都在这个山谷的口上面震荡,它永远走不下去。那甚至如果你今天真的把 learning rate
调太大的话(黄色),它可能一瞬间就飞出去了,结果你 update
参数以后,loss
反而越 update
越大。
\qquad那其实只有在你的参数是一维或二维的时候,你才能够把这样子的图 visualize
出来。如果你今天是有很多维参数,这个 error
的 surface
,在这个高维的空间里面,你是没有办法 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
这样子。
![](/assets/blank.gif)
\qquad但是要调 learning rate
很麻烦,有没有办法自动地调 learning rate
呢?有一些自动的方法可以帮我们调 learning rate
,最基本而简单的大原则是:通常 learning rate
是随着参数的 update
会越来越小的。为甚么会这样呢?因为当你在刚开始的起始点的时候,它通常离最低点是比较远的,所以你步伐呢,要踏大一点,就是走得快一点,才能够赶快走到最低点。但是,经过好几次的参数 update
以后呢?你已经比较靠近你的目标了,所以这个时候呢,你就应该减少你的 learning rate
,让它能够收敛在你最低点的地方。
\qquad举例来说,你 learning rate
的设法可能是这样,你可以设成说:这个 learning rate
是一个 t dependent
的函数,它是 depend on
你现在参数 update
的次数。在第 t
次 update
参数的时候,你就把你的 learning rate
设成 ηt+1\displaystyle\frac{η}{\sqrt{t+1}}t+1η,这样当你参数 update
的次数越多的时候呢,这个 learning rate
就会越来越小。但是光这样呢,是不够的,你到这边,我们需要因材施教,所以最好的状况应该是,每一个不同的参数,都给它不同的 learning rate
。
![](/assets/blank.gif)
\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
呢,是某一个参数,那w
的learning 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)。
![](/assets/blank.gif)
\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η0g0。在 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η1g1,你有了 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η2g2。
\qquad这个步骤呢,就反复地一直继续下去,到第 t
次 update
参数的时候,你有一个微分值 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+11i=0∑t(gi)2,就把它放在这边。
![](/assets/blank.gif)
\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ηtgt,这个 σtσ^tσt,我们就写成这样子:1t+1∑i=0t(gi)2\displaystyle\sqrt{\frac{1}{t+1}\sum_{i=0}^{t}(g^i)^2}t+11i=0∑t(gi)2,这个root mean square
,我们在前页投影片已经看到的。那这个time dependent
的learning rate
呢?这个time dependent
的learning 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 dependent
的learning 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η 就好。
![](/assets/blank.gif)
\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
的越小这样。
![](/assets/blank.gif)
\qquad好,怎么解释这件事情呢?有一些 paper
这样解释的:这个 Adagrad
它想要考虑的是,今天这个 Gradient
有多 surprise
,也就是所谓的"反差"这样,反差,大家知道吗?就是比如说,反差萌的意思就是说,如果本来一个很凶恶的角色,突然对你很温柔,你就会觉得它特别温柔这样。所以呢,对 Gradient
来说也是一样的道理:假设有某一个参数 ,它在第一次 update
参数的时候,它算出来的 Gradient
是 0.001
,再来又算 0.001
,0.003
,...
,到某一次呢,它 Gradient
算出来是 0.1
,你就会觉得特别大,因为它比之前算出来的 Gradient
都大了 100
倍,特别大。但是,如果是有另外一个参数,它一开始算出来是 10.8
,再来算 20.9
,再来算 31.7
,它的 Gradient
平常都很大,但是它在某一次算出来的 Gradient
是 0.1
,这时候,你就会觉得它特别小这样子。
\qquad所以为了强调这种反差的效果,所以在 Adagrad
里面呢,我们就把它除以这项(∑i=0t(gi)2\sum_{i=0}^{t}(g^i)^2∑i=0t(gi)2),这项就是把过去这些 Gradient
的平方算出来,我们就想要知道说过去 Gradient
有多大,然后再把它们相除,看这个反差有多大这样。这个是直观的解释,那更正式的解释呢,我有这样的解释:
![](/assets/blank.gif)
\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
你不觉得说听起来很有道理,就是说,如果我今天算出来的微分越大,我就离原点越远,如果踏出去的步伐跟微分的大小成正比,它可能是最好的步伐,但是,这件事情只有在只考虑一个参数的时候才成立。
![](/assets/blank.gif)
\qquad如果我们今天呢,同时有好几个参数,我们要同时考虑好几个参数的时候,这个时候呢,刚才的论述就不见得成立了。也就是说,Gradient
的值越大就与最低点的距离越远这件事情,在有好多个参数的时候 ,是不一定成立的,比如说,你想看看,我们现在考虑 w1w_1w1 跟 w2w_2w2 两个参数,这个图上面的颜色,是它的 loss
。那如果我们考虑 w1w_1w1 的变化,我们就在蓝色这条线这边切一刀,我们把蓝色这条线切一刀,我们看到的 error surface
长得是这个样子(右侧蓝色曲线),如果你比较图上的两个点,a
点跟 b
点,那确实 a
点的微分值比较大,那它就距离最低点比较远。
\qquad但是,如果我们同时考虑几个参数,我们同时考虑 w2w_2w2 这个参数,我们在绿色的这条在线切一刀,如果我们在绿色这条在线切一刀的话,我们得到的值是这样子,我们得到的 error surface
是这样子(右侧绿色曲线),它是比较尖的,这个谷呢,是比较深的,因为你会发现说,w2w_2w2 在这个方向的变化是比较猛烈的,如果我们只比较在 w2w_2w2 这条在线的两个点 , c
跟 d
的话,确实 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
呢,如果我们今天把这个 y
做 2
次微分,我们做一次微分得到这个式子(2ax0+b2ax_0 + b2ax0+b),那如果我们做二次微分的话,就得到 2a
,那它是一个 constant
。这个 2a
呢,就出现在最好的 step
的分母的地方,所以,今天最好的 step
,它不只是要正比于一次微分,它同时要和二次微分的大小成反比,如果你二次微分比较大,这个时候你参数 update
量应该要小;如果二次微分小的话,你参数 update
量应该要比较大。所以,最好的 step
应该要把二次微分考虑进来,所以如果我们今天把二次微分考虑进来的话,你会发现说,在 w1w_1w1 这个方向上,你的二次微分是比较小的,因为这个是一个比较平滑的弧,所以这个二次微分是比较小的。在 w2w_2w2 的方向上,这个是一个比较尖的弧、比较深的弧,它是一个比较尖的弧,所以它的二次微分是比较大的。
\qquad所以你光比较 a
跟 c
的微分值呢 ,是不够的,你要比较 a
的微分值除掉它的二次,跟 c
的微分值除掉它的二次,再去比。如果你做这件事,你才能够真正显示这些点跟最低点的距离这样,虽然 a
这个点,它的微分是比较小的,但它的二次也同时是比较小的,c
比较大,二次是比较大的。所以,如果你把二次微分的值呢,考虑进去,做这个评检、调整的话,那你这个时候才能真正反映你现在所在位置跟最低点的距离。
![](/assets/blank.gif)
\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
里面,你只需要一次微分的值,那这个东西我们本来就要算它了,所以并没有多做任何多余的运算。
![](/assets/blank.gif)
\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
怎么做,其实我们上次已经有示范过了,那所以我们就不再示范。
![](/assets/blank.gif)
\qquad接下来我们要奖的另外一件事情呢,是 Stochastic
(随机)的 Gradient Descent
,那它可以让你的 training
呢,更快一点。
![](/assets/blank.gif)
\qquad好,这个怎么说呢?如果我们今天做的是这个 Regression
的话,这个是 Regression
的式子:b+∑wixinb+\sum w_ix_i^nb+∑wixin,那你把 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+∑wixin))2,这是我们的 loss function
。所以,这个式子非常合理,我们的 loss
本来就应该考虑所有的 example
,它本来就应该 summation over
所有的 example
,有这些以后,你就可以去算 Gradient
,然后你就可以做 Gradient Descent
。
\qquad但 Stochastic Gradient Descent
,它的想法不一样。Stochastic Gradient Descent
它做的事情是,每次就拿一个 xnx^nxn 出来,这边你可以随机取,也可以按照顺序取,那其实随机取的时候,如果你今天是在做 deep learning
的 case
,也就是说你的 error surface
不是 convex
(凸的),是非常崎岖的,随机取呢,是有帮助的,总之,你就取一个 example
出来,假设取出来的 example
是 xnx^nxn,这个时候呢,你要计算你的 loss
,你的 loss
呢,只考虑一个 example
,你只考虑你现在的参数对这个 example
的 y
的估测值,再减掉它的正确答案,再做平方,然后就不 summation over
所有的 example
,因为你现在只取一个 example
出来,你只算某一个 example
的loss
:y^n−(b+∑wixin))2\displaystyle\hat{y}^n-(b+\sum w_ix_i^n))^2y^n−(b+∑wixin))2。
\qquad那接下来呢,你在 update
参数的时候,你只考虑那一个 example
。我们只考虑一个 example
的 loss function
,我们就写成 LnL^nLn,代表它是考虑第 n
个 example
的 loss function
。那你在算 Gradient
的时候呢,你不是算对 total
所有的 data
,它的 Gradient
的和,你只算对某一个 example
,它的 loss
的 Gradient
。然后呢,你就很急躁的 update
参数了,所以在原来的 Gradient Descent
里面,,你计算所有 data
的 loss
,然后才 update
参数,但是在 Stochastic Gradient Descent
里面,你看一个 example
,就 update
一个参数这样,你可能想说,这有啥好呢?听起来好像没有甚么好的,那我们实际来操作一下好了。
![](/assets/blank.gif)
\qquad我们刚才看到的图呢,它可能是这个样子(左图),原来的 Gradient Descent
,你看完所有的 example
以后,你就 update
一次参数,那它其实是比较稳定,你会发现说,它走的方向,就是按照 Gradient
建议我们的方向来走。但是如果你是用 Stochastic Gradient Descent
的话(右图),你每看到一个 example
,你就 update
一次参数,如果你有 20
个 example
的时候,那你就 update 20
次参数。那左边他是看完 20
个 example
才 update
一次参数,右边是每一个 example
都 update
一次参数,所以在左边看 20
个 example
的时候,你右边也已经看了 20
个 example
而且 update 20
次参数了。所以 update 20
次参数的结果呢,看起来就像是这样(右边),从一样的起始点开始,但它已经 update
了 20
次参数。
\qquad所以,如果只看一个 example
的话,它的步伐是小的,而且可能是散乱的,因为你每次只考虑一个 example
,所以它参数 update
的方向,跟这个 Gradient Descent
(左图)total loss
的 error surface
界定我们走的方向不见得是一致的。但是因为我们可以看很多个 example
,所以天下武功,唯快不破,在它(左边)走一步的时候,你已经出 20
拳了,所以它(右边)走的反而是比较快的。
![](/assets/blank.gif)
\qquad然后呢,接下来我们要讲的是第三个 tip
,就是你可以做 Feature
的 Scaling
(缩放)。
![](/assets/blank.gif)
\qquad所谓的 Feature Scaling
意思呢,是这样子:假设我们现在要做 Regression
,那我们这个 Regression
的 function
里面,input
的 feature
有两个: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 的分布是比较像的。
![](/assets/blank.gif)
\qquad你希望不同的 feature
,他们的 scale
是一样的,为甚么要这么做呢?我们举个例子,假设这个是我们的 Regression
的 function
(y=b+w1∗x1+w2∗x2y=b+w_1*x_1+w_2*x_2y=b+w1∗x1+w2∗x2),那我们写成这样,这边这个意思跟这个是一样的啦,那假设 x1x_1x1 平常的值,都是比较小的,假设说 1
、2
之类的,假设 x2x_2x2 它平常的值都很大,它 input
的值都很大,都是 100
、200
之类的。那这个时候,如果你把 loss
的 surface
画出来,会遇到甚么样的状况呢?你会发现说,如果你更改 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
的时候呢,它是会比较有效率的,
![](/assets/blank.gif)
\qquad那你可能会问说,怎么做 scaling
?这个方法有千百种啦,你就选一个你喜欢的就是了。那常见的作法是这样(标准化 / z
值归一化),假设我有 R
个 example
: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}mimimi;都去算它的 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)。然后呢,对第 r
个 example
的第 i
个 component
,你就把它减掉所有的 data
的第 i
个 component
的 mean
,也就是 mi\pmb{m_i}mimimi。然后,再除掉所有的 data
的第 i
个 component
的 standard deviation
。然后呢,你就会得到说,你做完这件事以后,你所有 dimension
的 mean
就会是 0
,你的 variance
就会是 1
,这是其中一个常见地做 localization
的方法。
- 标准化 /
z
值归一化(standardization
/z-score normalization
):将数值缩放到0
附近,且数据的分布变为均值为0
,标准差为1
的标准正态分布(先减去均值来对特征进行中心化mean centering
处理,再除以标准差进行缩放)
![](/assets/blank.gif)
\qquad最后,在下课前呢,我们来讲一下,为甚么 Gradient Descent
它会 work
,Gradient Descent
背后的理论基础是什么?
![](/assets/blank.gif)
\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
。
![](/assets/blank.gif)
\qquad好,那在解释 Gradient Descent
的 Theory
之前,这边有一个 Warning of Math
,意思就是说,这个部分,就算是你没有听懂,也没有关系,太阳明天依旧会升起。
![](/assets/blank.gif)
\qquad好,那我们先不要管 Gradient Descent
,我们先来想想看,假如你要解一个 Optimization
的 problem
,你要在这一个 figure
上面找他的最低点,你到底应该要怎么做?那有一个这样子的作法,如果今天给我一个起始的点 ,也就是 θ0θ^0θ0,我们有方法,在这个起始点的附近,画一个圆圏、画一个范围、画一个红色圈圈。然后,在这个红色圈圈里面,找出它的最低点,比如说,红色圈圈里面的最低点,就是在这个边上,这个意思就是说,如果你给我一整个 error function
,我没有办法马上一秒钟就告诉你说它的最低点在哪里,但是如果你给我一个 error function
,加上一个初始的点,我可以告诉你说,在这个初始点附近,画一个范围之内找出一个最小的值。那你假设找到最小的值以后,我们就更新我们中间的位置,中间的位置挪到 θ1θ_1θ1。接下来呢,再画一个圆圈,我们可以在这个圆圈范围之内,再找一个最小的点,假设呢,它是落在这个地方,然后你就再更新中心点的参数到 θ2θ^2θ2 这个地方,然后你就可以再找小小范围内的最小值,然后再更新你的参数,就一直这样下去。好,那现在的问题就是,怎么很快的在红色圈圈里面,找一个可以让 loss
最小的参数呢?
![](/assets/blank.gif)
\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),那这个是只有考虑一个 variable
的 case
。
![](/assets/blank.gif)
\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}}21,只考虑 0
次的话,是这条水平线;考虑 12+x−π42\displaystyle\frac{1}{\sqrt{2}}+\frac{\displaystyle x-\frac{π}{4}}{\sqrt{2}}21+2x−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π 的话,那公式后面这些平方项、三次方项这些都很小,所以就可以忽略它们,只考虑一次的部分。
![](/assets/blank.gif)
\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
而已,就是一个常数项而已。
![](/assets/blank.gif)
\qquad好,那如果我们今天考虑我们刚才讲的问题:如果,今天给我一个中心点,这是 (a,b)(a,b)(a,b),那我画了一个很小很小的圆圈,红色的圆圈,假设它是很小的,在这个红色圆圈的范围之内,我其实可以把 loss function
用 Taylor 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
来表示。所以呢,在红色圈圈范围内呢,这个式子是非常简单的,就写成左下角这个样子。
![](/assets/blank.gif)
\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
最小呢?我相信你可以秒算这个结果,不过我们还是很快地稍微看一下,好,s
、u
、v
都是常数,我们就把它放在蓝色的框框那里面,不用管它值是多少。我们现在的问题就是在红色的圈圈内呢,找 θ1θ_1θ1 跟 θ2θ_2θ2 让 loss
最小,那所谓的在红色圈圈内的意思就是说,红色圈圈的中心就是 a
跟 b
,所以你这个 (θ1−a)2+(θ2−b)2≦d2(θ_1 - a)^2+(θ_2 - b)^2 ≦ d^2(θ1−a)2+(θ2−b)2≦d2,他们要在这个红色圈圈的范围内,这件事情,其实就是秒算对不对,太简单了,你一眼就可以看出来。
![](/assets/blank.gif)
\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]。
![](/assets/blank.gif)
\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
,为甚么呢?因为你现在要算二次微分,甚至它还会包含一个 Hessian
的 matrix
,和 Hessian matrix
的 inverse
,总之,你会多很多运算,而这些运算,在做 deep learning
的时候呢,你是无法承受的,你用这个运算来换你 update
的时候比较有效率,会觉得是不划算的。所以,今天如果在做,比如说,deep learning
的时候,通常,还是 Gradient Descent
是比较普及、主流的作法。
![](/assets/blank.gif)
\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相关推荐
- (To Learn More) ML Lecture 1: Regression - Case Study(下)
ML Lecture 1: Regression - Case Study(下) 视频链接: https://www.youtube.com/watch?v=fegAeph9UaA \qquad li ...
- (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 ...
- [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
本文转自:https://blog.csdn.net/walilk/article/details/50978864 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记, ...
- 【李宏毅2020 ML/DL】补充:Meta Learning - Gradient Descent as LSTM
我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 本次笔记补充视频 BV1JE411g7XF 的缺失部分.上节课李老师讲了元学习中的参数初始化方法:MAML 与 ...
- 【李宏毅2020 ML/DL】P5-7 Gradient Descent_1-3
我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 已经有人记了笔记(很用心,强烈推荐): https://github.com/Sakura-gh/ML-not ...
- 李宏毅ML -lecture 0 机器学习介绍
李宏毅ML -lecture 0 机器学习介绍 https://blog.csdn.net/Arron_hou/article/details/87836849
- ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自网上的免费课程和一些经典书籍,免费课 ...
- 【ML】 李宏毅机器学习一:Regression、Gradient Descent(python实现)
我的GitHub地址:https://github.com/taw19960426/DeepLearning存放与之对应的python代码 1.Regression 1.1 Introduction ...
- Gradient Descent梯度下降(透彻分析)
----------首先了解什么是梯度? 官方解释: 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为 ...
最新文章
- 不可不知的Python模块: collections
- python数据结构的列表_Python数据结构之列表
- PMCAFF微分享 | 供应链金融套利套汇介绍
- vue3.0 AntDesignVue2.0 table的rowkey报错问题解决方法
- 【接口时序】2、Verilog实现流水灯及与C语言的对比
- python可以做特效吗_学习mel语言,Python,JavaScript到什么程度才能做一下大型特效,要自已开发插件脚本呢?...
- 10年老电脑如何提速_电脑上如何提取图片中的文字?教你3个方法,10秒轻松搞定...
- UTM坐标转GPS方法分享
- mysql和redis常见面试题_redis相关面试题
- 图解通信原理与案例分析-28:四大全球卫星导航系统GNSS的基本原理与技术对比---中国的北斗、美国的GPS、欧洲的伽利略、俄罗斯的格洛纳斯
- 【模型检测学习笔记】8:无限字上ω正则LT性质的验证
- 用机器学习做风控的氪信,凭什么获金牌投资人章苏阳数千万融资?
- 亚马逊抛出“下一代贸易链”整合解决方案:中国跨境电商如何借道转型?
- RK3588 实现温控风扇之获取cpu温度(一)
- maven项目转gradle
- ios手机python编译器免费_适用与IOS手机的python编辑器,让你不限空间,地点都能玩转pyhton代码 !...
- Unity3D-打飞碟小游戏
- 项目中成功的运用proxool连接池
- 计算视觉与机器学习类资讯~
- Ubuntu设置Stunnel客户端
热门文章
- 华为硬件工程师社招机考题库_2016华为硬件机试题库
- 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程
- 深度学习理论与架构最新进展综述论文,66页pdf,333篇参考文献
- 计算机无法连接苹果手机软件,iphone连接win10电脑后没反应怎么解决
- eas-bos工作流的几张表
- Tsinsen-A1491 家族【并查集】
- 怎样修改eas服务器连接设置,金蝶eas服务器连接设置
- Spring框架的两大核心思想
- -Djava.endorsed.dirs=D:\Tomcat 9.0\endorsed is not supported.问题
- 电子实验记录本的功能介绍