参考Unoboros的博文,解释的还是很不错的,现摘抄如下:
随机逼近的问题背景:
设因素x的值可由实验者控制,x的“响应”的指标值为Y,当取x之值x进行试验时,响应Y可表为Y=h(x)+ε,式中h(x)为一未知函数,ε为随机误差。设目标值为A,要找这样的x,使h(x)=A。分别以Y-A和h(x)-A代替Y和h(x)。不妨设A=0,问题就在于找方程h(x)=0的根x。例如若x为施药量,Y为衡量药物反应的某种生理指标,则问题在于找出施药量x,以使该生理指标控制于适当的值A。
算法分析:
若随机误差 ε=0,且h(x)为已知函数,则数值分析中提供了许多近似解法。例如可用牛顿迭代法求解:从一适当选择的初始值x0出发,用迭代公式x{i+1}=x{i}-h(x{i})/h'(x{i});但当h(x)未知且有随机误差干扰时,α{i}和h(x{i})无法算出。仔细观察这个迭代公式,不难发现,其核心思想就是利用当前函数的取值位置去推算函数的0点位置。假如我们将函数限定为非降函数,那么我们知道0点右边的一定是大于0的,左边的则是小于0的。那么如果我们取到一个大于0的值,我们就知道下一次取值要往左修正,反之如果是小于0,那么就要往右修正。为了不让一次左修正加一次右修正以后又回到原来的点,我们必须要让每次修正的步长有所递减(最后必须趋于0),这也是算法会收敛的关键所在——你不能让它递减的太快,否则在抵达0点前就收敛了,但是也不能过慢,否则虽然最后会收敛,但是时间会很长。
为了能够处理一开始的那种随机情况,Robbins-Monro将牛顿法稍作修改,利用以上的思想,引进迭代程序x{i+1}=x{i}-a{i}Y{xi},式中a{i}为适当选定的常数序列,用以严格控制收敛的速度。为什么这个算法是正确的,即使观测到的数据具有随机性?直观的解释,由于ε为随机误差,所以必定有E[Y]=E[h(x)+ε]=h(x), 也就是说,所取得的值虽然不准确,确实在准确值附近波动的。那么如果准确值大于0,波动以后的值也大于0,最终修订的方向就没有错误,所以波动在这种情况所造成的影响只是稍微改变了一点步长,这对于收敛性本身毫无影响;但是如果波动以后的值是小于0的,最终就会向相反的方向修订,这样就是远离0点的了,这必然是和收敛方向相违背的!但是,注意到,如果越是远离0点,波动的平均值(也就是准确值)也是远离0点的,这样如果想要产生一个波动点,这个点的取值符号和当前准确值取值符号相反的概率会越来越小!也就是说,函数的非降性在这里发挥了关键作用——它使得即使会由于随机波动造成错误的修订方向,但是最后这种错误不会无限延续下去,必定在一定的时候被修正回正确的方向,而且犯的错误越大,得到修正的可能性也就越大。
序列学习:
那么, 这和序列学习有什么关系呢?比如我们有一个函数f(x), 我现在不知道这个函数的准确形式,但是我手上有对应的取值数据,我要通过这些数据把函数还原出来(这个过程叫做回归)。但是我的数据不是一次性获得的,可能我用完第一个数据以后要等一段时间第二个数据才会出来。我不想浪费时间等数据,而想通过已有的数据动态的去估计这个函数,如果有了新的数据,我就可以利用前面估计的结果结合这个新数据得到新的估计结果。。。这个过程就叫做序列学习。现在,如果我不关注函数的具体形式,但是对函数在什么数据下取0点特别感兴趣,那么我就要用到Robbins-Monro算法了:每次读入一个新的数据,把这个数据带入已有的估计中就会得到一个修正量,用这个修正量就可以得到新的估计:
对于某个统计量ti = t(x1,x2...,x_{i-1}) 以及关于这个统计量的未知函数f(t). 如何尽可能的准确求出f(t)=0的解?
t_{i+1}=ti - ai F(xi;ti)
F(xi;ti) = f(ti)+ε (E[F(xi;ti)]=f(ti))
在当前统计量ti下,F(xi;ti)为基于当前观测值xi的估计(具有随机波动性), f(ti)为准确函数取值。 注意到t_{i+1}在计算时已经包括了xi这点的信息,所以下一次迭代直接从x_{i+1}开始。换句话说 F(xi;ti)这个估计值包含了x1,x2...,xi的全部信息。