回顾一下,上一个章节中,我们找到了一个评判两个方程好坏的标准,标准也很简单,很数学化,两个方程,计算他们的E,E较小那个就是比较好的!
沿着这个思路,我们有没有可能找到一个最好的呢?
有!这个问题转换成数学问题就是,在众多,,b中找到一个组合,使得E最小,即E的最小值,那么这个,,b所代表的方程,就是最好的方程!
求E最小值!变量是,,b也许你又要回到高中数学的噩梦,怎么又是求最小值?别着急,有方法论。我们先看看我们的目标,是求下面方程E的最小值:
好,目标清楚了,我们先把目标放一旁,先讲方法论。
我们先假定有一个现实的问题:
图中那个二B青年准备下到山底,毕竟是理科生,他会不断的问自己一个问题,他当前如果向外迈出一步,怎么迈,是下降的最快的。那当然是以自己为起点,向周围看一下,找到坡度最陡的那个路线,迈出去。于是他很准确的迈了一步,如下图:
好,第一步是成功的,那么第二步呢,显然和第一步思路一样,找出最陡的那个路线,继续。。。。当然,每次都是最陡峭的,那他的下降速度,显然是最快的,于是,他很快就下到了山底。
好了,理论就是那么简单,这座山,我们可以理解就是这个cost function本身。这个二B青年,开始的位置,就是我们随便一个起始的方程,也即是起点,比如我一开始拍脑袋的方程Z=3+2-25即=3,=2,b=-25的时候。那么,这个二B青年每迈一步,就是每次在上一个,,b值上,做了一个变化即-,-,b-。 (这里的,,是指在每个维度上的一个变化量)
ok,那么这里的问题是 ,, 是什么样的值,才能满足那个二B青年那样,这一步是下降最快的呢?答案也很简单,就是对应参数的导数!即
-(dE/d),-(dE/d),b-(dE/db),有有一个问题来了,步子迈多大呢,显然我们可以给一个比例η,这是0到1之间的一个数。显然,η越大,步子迈的就越大,但是,就越不精细。步子越小,就越进行,这是积分原理。
好,我们总结一下,注意,下面不是数学公司,是计算机的伪代码,=表示赋值,不是数学的等号:
= -η(dE/d);
= -η(dE/d);
b = b-η(dE/db);
这里有一个附带的解释:我的理解,比如现在就是一个二维的图形,U形的抛物线吧。这个时候,在图形上的一点,如何下降才是最快的收敛呢?
显然,是在这一点上对着这个导数的切线走一小步。
而切线所在的斜率正好就是这一点上的导数。由于是要朝最小值方向走的,显然,就是向下的,所以是减法。
η是一个步长,我暂时没找他在上述公式中的数学意义。
按照η是步长的话,导数(dE/db)就代表着这个步长的方向。
按照数学意义,我觉得η/( dE/d )才能得到等量的w变化量,可是这里确实乘法,没想通,也希望有童鞋帮我解惑。
这个就是计算机求方程最小值的一个经典算法,叫做梯度下降,英文名为:gradient descent。这个也最好记住,Tensrotflow里面直接要设置这个costfunction最小值的方法,通常就设置为梯度下降。
这里,可能会有少许难度,碰到困难的,可以翻看高等数学里面的导数部分,尤其是导数的定义本身,对这个梯度下降的理解是很有帮助的。
另外,如果是细心的朋友会关注到一个问题,如果“这座山”有多个山谷怎么办,按照这个算法,则会因为起点不同导致不能找到真正的最低点:
解决这个问题,如何设置合理的最低点,可以参考:
http://sebastianruder.com/optimizing-gradient-descent/index.html#momentum