您的位置:首页 > 其它

关于数列极限(及数项级数)与搜索算法的步长选取

2014-03-31 08:06 295 查看
        在用计算机求解优化问题的时候,常常会涉及到搜索步长的问题,无论你是使用梯度下降还是使用牛顿法,还是其他的一些搜索算法而言,步长的选取都是无可避免的问题,当然步长的选取也有一系列的方法,而比较常用的有设置搜索步长为常数,或者是选取一个数列使得步长随着迭代的次数而变化,比较常用的有设置步长为:1/2的冥,也就是1,1/2,1/4,......(不推荐使用,虽然这是常常使用的方式,甚至有的老师都是这么说的,但是真的不推荐使用这种方法,原因的话下面会详细说明);还有就是1,1/2
,1/3,......(这种方法,比较合适,但是可能需要根据实际来改进,下面也会详细的说明)

首先,这里给出作为迭代步长的两个需要满足的条件(假设an表示,步长序列):

                                                                                                                           


        对于上面的那个条件,是很好理解的,因为当我们越来越接近(迭代了很多次)最小值(通常的搜索都是搜索最小值),此时梯度接近于零,且我们已经很接近最小值了,等于是说当我们步长还很大时很有可能会造成震荡现象,所以我们需要当迭代步数很多的时候,搜索步长变得很小,也就是上一个等式所表达的意思;这点是容易理解的,关键的是第二点,这也是我写本文的出发点。

        第二点实际上控制了数列收敛的数度,也就是步长减小的速度;也就是说步长减小不能太快,例如,上面提到的 1+1/2+1/4+....=2远远小于无穷(所以是不提倡的),于是到这里的是候,你可能会问这是为什么呢?这也是我第一次见到这两个条件时的反应(很早之前的事了,只是当时没有写博客的习惯,最近因为又遇到这个问题所以这里把它又提出来了而已)。那么究竟是为什么呢,且看下文(这里,本文中提到的搜索问题都是指搜索最小值):

        先来举一个简单的例子方便理解:

        假设我们的优化问题是: min |x| 也就是求 |x| 的最小值(众所周知,这是一个凸优化问题,有唯一的最小值 0 )相对的我们用计算机(这里使用梯度下降方法)求解该问题的步骤为:

       1. 确定一个初始迭代点 x,(0 这里为了方便说明问题我们不妨把 x0 设置为 3 ,不是离最小值 0很远 但是大于 1+1/2+1/4+....=2)

       2.计算梯度(对于x>0 这里的梯度为 d(|x|)/dx=1)

       3. 向负梯度方向前进一步到达新的迭代点: x1=x0-an*1 (其中a1 就是第一次的迭代步长,这里去an为1/2的冥的是候 a1=1)

       4. 重复2.,3直到收敛(或者前后连两次的该变量小于阈值时)

好吧!这时我们来看看对于上面一个问题xn等于多少吧:

xn=3-(1+1/2+1/4+...+(1/2)^(n-1))=3-(2-(1/2)^n)=1+(1/2)^n>1

        当n趋于无穷的时候,有xn=1,也就是是说,无论你迭代都少次你都是无法到达最优值x=0 的地方的(悲剧了吧!),究其原因,就是数项级数{xn=(1/2)^n} 不满足第二个条件,这使从初始点出发能够到达的最远的迭代点受到数项级数的收敛和限制(上面的例子限制为2,也就是说对于上面方法只有初始化节点x0属于(-2,2)的时候才是可能收敛到最优值的,换句话说:也就是当数项级数发散到无穷大的时候,收敛区间可以是整个域(当然需要问题适合一定的条件,例如,凸函数等,这里就不细说了,总之(1,1/2,
1/4,....)是不太好的,至少当初值点距离目标很远时是这样的)


      为了使问题更清楚,这里再来看看另一个数列(1,1/2,1/3,......)的表现:

      这里就直接计算xn了

      xn=3-(1+1/2+1/3+1/4+, ... ,1/10+1/11)+, .... ,-, ...

     注意这里,当1+1/2+1/3+1/4+,.....,+1/11时xn已经小于0,所以此时的导数会变为-1,也就是说下一次会变为“+”,也就是说实际上会从两边逐渐收敛到0;还可以看到的的是当迭代到第四次的时候(此时xn=3-(1+1/2+1/3+1/4)=11/12 ,结果已经比上面迭代任意多次的结果好了,这里组建第二条条件的威力了。

     最后来总结一下吧:

     1.搜索算法的步长选取,需要满足下面两个条件(特别是你不太确定目标与初始值的距离的时候):

                                                                      


    2.当目标离初始值很远的时候(注意,这往往是预先不知道的,可以通过先取一个步长数列(如,前面的 1, 1/2, 1/3,1/4, ......)迭代适应,如果收敛很慢,来确定)an可以适当更改,例如,当上面的初值很不幸的取为(x0=10)的时候,此时即便是1, 1/2, 1/3,1/4, ......也要很长的迭代步数,所以此时可以考虑(1, sqrt(1/2) , sqrt(1/3) ,.. sqrt(1/4) ,....) ,这里的sqrt(.)就是开根号的意思,此时他也是满足上面两个条件的数列,只是其数项级数增加的速度更快了,如果有必要你也可以考虑,开立方根或者其他更高次的开根,你也可以使用分数根
如:(an)^(4/3)等等,还可以是其他乱七八糟的式子,不要受我的限制,这里只是为了方便理解,使用了上面的例子来说明,但是实际上可选的数列很多,总之要满足上面的条件就好。

    3.当你很确定自己的初值里目标不是很远的时候,可以考虑(1, 1/2, 1/4, 1/8,...)这样可能(注意这里只是说的是可能,除非你很确定,根据实际情况来看)使得不用从两边逐渐收敛到目标。

    本文的核心就大概是这些了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息