Robbins-Monro(RM)算法【随机近似】

news2024/12/26 21:26:59

强化学习笔记

主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门.

第一章 强化学习基本概念
第二章 贝尔曼方程
第三章 贝尔曼最优方程
第四章 值迭代和策略迭代
第五章 强化学习实践—GridWorld
第六章 蒙特卡洛方法
第七章 Robbins-Monro算法


文章目录

  • 强化学习笔记
  • 一、Robbins-Monro 算法
    • 实例
  • 二、期望估计
  • 三、参考资料


一、Robbins-Monro 算法

随机近似(Stochastic Approximation)是指用于解决寻根或优化问题的一类广泛的随机迭代算法。与许多其他求根算法(如梯度下降法、牛顿法)相比,随机近似的强大之处在于它不需要目标函数的表达式或其导数。Robbins-Monro (RM)算法是随机近似领域的开创性工作,下面介绍RM算法的基本框架:

RM算法

g : R → R g: \mathbb{R}\to \mathbb{R} g:RR是一个未知函数,也就是说 g g g的形式未知,但能得到带有噪声的观测值,类似神经网络的黑箱子:

截屏2024-04-21 17.55.44

我们想要找到方程 g ( w ) = 0 g(w)=0 g(w)=0的根,RM算法迭代格式如下:
w k + 1 = w k − α k g ~ ( w k , η k ) w_{k+1} = w_k-\alpha_k\tilde{g}(w_k,\eta_k) wk+1=wkαkg~(wk,ηk)
其中, w k w_k wk是根的第 k k k次迭代的估计值, g ~ ( w k , η k ) \tilde{g}(w_k,\eta_k) g~(wk,ηk)是第 k k k次迭代带有噪声的观测值, α k \alpha_k αk是一个正系数,可以理解为步长.

算法的收敛性由如下定理进行保证:

截屏2024-04-22 12.32.46

Note:

  • 这个算法要收敛,对函数的要求其实蛮高的,第一个条件要求 g g g的导数为正且不能为+ ∞ \infty ,这就是说要求函数是单调递增的;
  • 若函数单调递增,我们可以通过下图直观的了解算法是如何通过迭代找到根的,和牛顿法求根的思想很类似只不过牛顿法用到了函数导数的信息,比RM算法的要求更高,RM算法不需要函数导数的信息;
    截屏2024-04-22 12.35.35
  • 如果我们需要求一个优化问题 min ⁡ f \min f minf,可以转换为 g = ∇ f = 0 g=\nabla f=0 g=f=0这样的求根的问题,此时要求 ∇ g > 0 \nabla g>0 g>0,事实上是要求 f f f的海瑟矩阵正定,即要求函数为凸函数,这和很对凸优化算法对函数的要求一样,只有当 f f f为凸函数时,算法才能保证收敛性.
  • (b)条件是要求步长为消失步长,常见的消失步长如 a k = 1 k a_k=\frac1k ak=k1.
  • (c)条件是对噪声的要求,要求噪声不能太离谱.

实例

下面我们通过RM算法来求 f ( x ) = x 3 − 5 f(x)=x^3-5 f(x)=x35的根,来加深一下对RM算法的理解,这里我通过传统方法Newton法和RM算法进行对比,代码如下:

# f(x) = x^3 - 5 
def f(x):
    return x**3 - 5

# Robbins-Monro algorithm
def robbins_monro(f, x0, max_iter):
    w = []
    w.append(x0)
    x = x0
    for i in range(max_iter):
        x = x - 1 / (i+5) * f(x)
        
        # stop if x is close to the root
        if np.abs(f(x)) < 1e-6:
            break
        w.append(x)
        
    return w

# newton's method
def newton(f, x0, max_iter):
    w = [x0]
    x = x0
    for i in range(max_iter):
        x = x - f(x) / (3 * x**2)
        
        # stop if x is close to the root
        if np.abs(f(x)) < 1e-6:
            break
        w.append(x)
    return w



w_1 = robbins_monro(f, 1, 1000)
w_2 = newton(f, 1, 1000)

# plot the iteration
import matplotlib.pyplot as plt
plt.figure(figsize=(8,5),dpi=150)
plt.plot(w_1)
plt.plot(w_2)
plt.xlabel('iteration')
plt.ylabel('x')
plt.legend(['Robbins-Monro', 'Newton'])
plt.show()

截屏2024-04-22 14.21.08

如上图所示,当初值选取合适时,RM算法和Newton算法都能收敛,不过通过选取不同的初值,我们可以发现当初值较远时,RM不会收敛,原因是 f ( x ) = x 3 − 5 f(x)=x^3-5 f(x)=x35不满足导数有界的条件,当初值不合适时就容易振荡,算法发散。而牛顿法相对来说就稳定很多,受初值的影响没有那么大,并且收敛速度更快。

二、期望估计

假设有一组样本 x 1 , x 2 , ⋯   , x k x_1,x_2,\cdots,x_k x1,x2,,xk服从同一个分布,我们想要估计这组样本的均值,当然我们首先想到的是:
E [ X ] = x 1 + x 2 + ⋯ + x k k . \mathbb{E}[X] = \frac{x_1+x_2+\cdots+x_k}{k}. E[X]=kx1+x2++xk.
但是在强化学习的某些算法中,我们不能一次性得到 n n n个样本,每次得到一个采样,那么我们怎么用迭代的算法来估计这个期望呢?我们记
w k = x 1 + x 2 + ⋯ + x k k , w_k=\frac{x_1+x_2+\cdots+x_k}{k}, wk=kx1+x2++xk,
那么第 k + 1 k+1 k+1次估计值为:
w k + 1 = x 1 + x 2 + ⋯ + x k + x k + 1 k + 1 = x 1 + x 2 + ⋯ + x k k k k + 1 + x k + 1 k + 1 = k k + 1 w k + 1 k + 1 x k + 1 = w k − 1 k + 1 ( w k − x k + 1 ) . ( 1 ) \begin{aligned} w_{k+1} &=\frac{x_1+x_2+\cdots+x_k+x_{k+1}}{k+1}\\ &=\frac{x_1+x_2+\cdots+x_k}{k}\frac{k}{k+1}+\frac{x_{k+1}}{k+1}\\ &=\frac{k}{k+1}w_k+\frac{1}{k+1}x_{k+1}\\ &=w_k-\frac{1}{k+1}(w_k-x_{k+1}). \end{aligned} \qquad\quad(1) wk+1=k+1x1+x2++xk+xk+1=kx1+x2++xkk+1k+k+1xk+1=k+1kwk+k+11xk+1=wkk+11(wkxk+1).(1)
这样我们就把对均值的估计写成了迭代的形式,每次得到一个新的样本,我们不用对所有样本求和计算了。只需要在上一次的估计值上进行更新就行。

上面这个迭代格式是我们从样本均值的定义出发得到的,下面我们从RM算法出发来推导一下这个迭代格式,考察如下函数
g ( w ) ≐ w − E [ X ] . \begin{aligned}g(w)\doteq w-\mathbb{E}[X].\end{aligned} g(w)wE[X].原始问题是获得 E [ X ] \mathbb{E}[X] E[X]的值,那么我们可以转换为求 g ( w ) = 0 g(w)=0 g(w)=0的根。给定 w w w的值,我们可以获得的噪声观察是 g ~ ≐ w − x \tilde{g}\doteq w-x g~wx,其中 x x x X X X的一个样本,注意, g ~ \tilde{g} g~可以写成
g ~ ( w , η ) = w − x = w − x + E [ X ] − E [ X ] = ( w − E [ X ] ) + ( E [ X ] − x ) ≐ g ( w ) + η , \begin{aligned} \tilde{g}(w,\eta)& =w-x \\ &\begin{aligned}=w-x+\mathbb{E}[X]-\mathbb{E}[X]\end{aligned} \\ &=(w-\mathbb{E}[X])+(\mathbb{E}[X]-x)\doteq g(w)+\eta, \end{aligned} g~(w,η)=wx=wx+E[X]E[X]=(wE[X])+(E[X]x)g(w)+η,所以此问题的RM算法为
w k + 1 = w k − α k g ~ ( w k , η k ) = w k − α k ( w k − x k ) , w_{k+1}=w_{k}-\alpha_{k}\tilde{g}(w_{k},\eta_{k})=w_{k}-\alpha_{k}(w_{k}-x_{k}), wk+1=wkαkg~(wk,ηk)=wkαk(wkxk), α k = 1 k + 1 \alpha_k=\frac{1}{k+1} αk=k+11时,我们就得到同(1)一样的迭代格式了,而且此时可以验证我们构造的函数以及选取的步长,满足收敛性条件,所以当 k → ∞ k\to\infty k时, w k + 1 → E [ X ] w_{k+1}\to\mathbb{E}[X] wk+1E[X].

三、参考资料

  1. Zhao, S… Mathematical Foundations of Reinforcement Learning. Springer Nature Press and Tsinghua University Press.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1614191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言枚举类型详解

下午好诶&#xff0c;今天小眼神给大家带来一篇C语言枚举类型详解的文章~ 目录 一、枚举类型的声明 二、枚举类型的优点 三、枚举类型的使用 一、枚举类型的声明 枚举顾名思义就是 一 一 列 举 。 比如&#xff1a; 一周从周一到周日共有七天&#xff0c;可以一一列举。 性…

ARM汇编伪指令AREA

ARM伪指令AREA用于定义一个代码段或数据段。其基本的语法格式如下&#xff1a; AREA 段名 属性1,属性2, ... 其中&#xff1a; 段名&#xff1a;是你为代码段或数据段指定的名称。如果段名以数字开头&#xff0c;则该段名需要用“│”括起来&#xff0c;如│1_test│。段名可…

文档在线预览,可以私有化局域网在服务器部署组件来实现在线预览

去官网查看 几行代码即可运行 https://kkfileview.keking.cn/zh-cn/index.html

引用静态方法

import java.util.Arrays; import java.util.Comparator;public class demo1 {//引用public static void main(String[] args) {Integer []arr{1,2,4,3,8,6};//匿名内部类Arrays.sort(arr, new Comparator<Integer>() {Overridepublic int compare(Integer o1, Integer o…

深度神经网络(DNN)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个深度神经网络&#xff08;DNN&#xff09;模型程序,最后打印5个条件分别的影响力。 示例 在深度神经网络&#xf…

葡萄书--深度学习基础

卷积神经网络 卷积神经网络具有的特性&#xff1a; 平移不变性&#xff08;translation invariance&#xff09;&#xff1a;不管检测对象出现在图像中的哪个位置&#xff0c;神经网络的前面几层应该对相同的图像区域具有相似的反应&#xff0c;即为“平移不变性”。图像的平移…

OJ:寻找独一无二的数

目录 &#x1f3dd;1.问题描述&#xff1a; &#x1f3dd;2.分析问题&#xff1a; &#x1f3dd;3.最终代码&#xff1a; &#x1f3dd;1.问题描述&#xff1a; &#x1f3dd;2.分析问题&#xff1a; 先看看下面的代码的结果是多少&#xff1f; #include<stdio.h> in…

深度学习之视觉特征提取器——VGG系列

VGG 提出论文&#xff1a;1409.1556.pdf (arxiv.org) 引入 距离VGG网络的提出已经约十年&#xff0c;很难想象在深度学习高速发展的今天&#xff0c;一个模型能够历经十年而不衰。虽然如今已经有VGG的大量替代品&#xff0c;但是笔者研究的一些领域仍然有大量工作选择使用VG…

多商户入驻型AI智能名片预约服务系统:掀起服务行业数字化革命狂潮!

多商户入驻型AI智能名片预约服务系统以其高效、便捷、智能的特点&#xff0c;成为服务行业数字化转型的重要推手。该系统通过整合线上线下资源&#xff0c;利用人工智能和大数据技术&#xff0c;为商户和消费者搭建了一个无缝对接的预约服务平台。商户可以轻松入驻系统&#xf…

【Java框架】SpringMVC(一)——基本的环境搭建及基本结构体系

目录 MVC模式视图(View)控制器(Controller)模型(Model)JSP Model1JSP Model2MVC的优点MVC的缺点 Spring MVC架构介绍特点 SpringMVC环境搭建(在前面Spring整合Mybatis的基础上)1.创建控制器Controller2.创建springmvc配置文件&#xff0c;并添加Controller的Bean3.web.xml中配置…

通用大模型研究重点之五:model services

Trtion https://github.com/openai/triton https://www.nvidia.cn/gpu-cloud/ngc-nvidia-triton/ https://github.com/openai/openai-cookbook https://github.com/openai/openai-python Triton 是一个由 NVIDIA 开发的开源推理服务平台&#xff0c;旨在简化和优化生产环境中的…

windows11 iis10中.net4.5不能用解决方法

问题iis设置4.0后运行程序提示web.config配置错误 解决方法&#xff1a; 管理员身份运行命令提示符分别运行如下命令&#xff1a; dism /online /enable-feature /featurename:IIS-ISAPIFilter dism /online /enable-feature /featurename:IIS-ISAPIExtensions dism /onli…

模拟量和开关量傻傻分不清?戳这文

在电子工程中&#xff0c;模拟量和开关量是最基本的信号类型&#xff0c;但它们在表示和处理方式上有着显著的不同。对于初入行的电子工程师来说&#xff0c;很容易混淆这两者。本文将用简洁明了的方式解释这两种信号类型&#xff0c;让你轻松掌握它们的区别。 1、模拟量 模拟…

js作业微博发言

微博 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" content&q…

三款热门婴儿洗衣机深度测评,希亦、觉飞、RUUFFY谁更好用?

近几年科技高速发展&#xff0c;我们的生活也因此变得更加便捷、健康高效。尤其是在家庭生活中&#xff0c;各种新兴家电的出现让我们的生活变得更加健康卫生。婴儿洗衣机也为现代家庭提供了极大的便捷。由于婴儿刚出生免疫力比较弱&#xff0c;所以建议婴儿的衣物尽量和大人的…

在C#中,PDFsharp库使用(三):PDF提取

PDF提取 一、PDF提取功能&#xff0c;看图 二、PDF提取界面 三、PDF提取代码 //pdf提取---选择文件Button private void button9_Click(object sender, EventArgs e) {string oneFilePath GetOneFilepath();if (!string.IsNullOrEmpty(oneFilePath)){textBox3.Text oneFilePa…

Java多线程交替打印

多线程交互 在Java中&#xff0c;可以使用synchronized关键字或者java.util.concurrent包中的工具来实现多线程交替打印。以下是一个使用synchronized关键字的示例&#xff1a; public class AlternatePrinting {private static final Object lock new Object();private sta…

设计模式之创建型模式---工厂模式

文章目录 工厂模式概述简单工厂简单工厂的代码实现简单工厂的使用简单工厂应用场景 工厂方法工厂方法模式的代码实现工厂方法的使用工厂方法应用场景 抽象工厂抽象工厂模式代码实现抽象工厂的使用方法抽象工厂模式的应用场景 总结 工厂模式概述 工厂模式从名字就能看出&#x…

【Java笔记】如何创建自己的注解+注解怎么用于反射+SpringBoot常见注解

文章目录 0. 为什么SpringBoot要整这么多注解&#xff1f;1. 一些基础知识1.1 什么是注解1.2 Java内置注解1.2.1 作用在代码上的注解1.2.2 作用在注解的注解&#xff08;元注解&#xff09;1.2.3 Java 7之后的新注解 1.3 注解的作用1.4 如何实现一个自己的注解&#xff1f;1.4.…

向量的求导

参考&#xff1a; 向量的求导 向量内积求导