强化学习数学原理(五)——随机近似与随机

news2025/2/5 0:13:42

一、Motivating example

        首先有个random variable(随机变量)X,我们的目标就是求出他的expectation E(x),我们有一些iid的采样,xi,从1到n,求出均值

\mathbb{E}[X]\approx\bar{x}:=\frac{1}{N}\sum_{i=1}^Nx_i.

        但是如果有很多数据,我需要等很久,把所有数据都收集完成然后求平均;第二种方法是一种增量式的iincremental的方法,迭代式iterativ的方法,就是来多少,先算多少。首先针对k个,从x1一直到xk,求一个平均 

w_{k+1}=\frac{1}{k}\sum_{i=1}^{k}x_{i},\quad k=1,2,\ldots

        那我知道了wk+1,我们让k-1就是wk,就是前k-1个xi的平均数,我们就是找出wk和wk+1之间的关系

\begin{aligned}w_{k+1}=\frac{1}{k}\sum_{i=1}^{k}x_{i}&=\frac{1}{k}\left(\sum_{i=1}^{k-1}x_{i}+x_{k}\right)\\&=\frac{1}{k}((k-1)w_{k}+x_{k})=w_{k}-\frac{1}{k}(w_{k}-x_{k}).\end{aligned}

        这样就不用把所有的加起来再求平均,直接进行迭代,并且这个wk会随着数据量增大逐渐的与wk逼近

二、Robbins-Monro algorith

       Robbins-Monro 算法是一种用于求解方程根的随机逼近算法(Stochastic Approximation SA)。 随机迭代算法,涉及到对随机变量采样,SA为对方程的求解和优化问题,SA是mode-free。不需要知道函数与方程的形状,RM算法是SA领域里面的一部分,我们常用的随机梯度下降是RM算法的一种特殊情况。

        该算法最初用于求解形如 g(θ)=0 的方程,其中 g(θ)是一个无法直接计算但可以通过随机采样估计的函数

        这里的问题就是我们需要求解一个方程 g(w)=0,里面的w是未知量,g是一个函数,在需求里,我们就是让g(w)为梯度,求解的目标就是让梯度为0。给定一个函数 g(θ)g(θ),目标是找到 θ∗θ∗ 使得 g(θ∗)=0g(θ∗)=0。Robbins-Monro 算法的更新规则为:

        第一种情况是已知g(w)的表达式的,这样就会有很多的方法来解决问题;但是如果不知道g函数,y=g(w),这个g是个黑盒,这种情况下这个问题的求解需要数据,一是输入数据wk,还有测量到的结果并且wk+1会比wk更接近w*,所以RM算法是可以收敛的。

% Robbins-Monro 算法求解方程的根
% 目标方程:g(theta) = theta^2 - 4 = 0

% 初始化参数
theta = 5;          % 初始估计值
num_iterations = 1000;  % 迭代次数
alpha = 1;          % 初始步长
noise_std = 0.1;    % 噪声标准差

% 存储结果
theta_history = zeros(num_iterations, 1);

% 主循环
for n = 1:num_iterations
    % 计算 g(theta) 的随机估计(带噪声)
    g_theta = theta^2 - 4;
    Y_n = g_theta + noise_std * randn;  % 添加高斯噪声
    
    % 更新 theta
    alpha_n = alpha / n;  % 步长递减
    theta = theta - alpha_n * Y_n;
    
    % 保存结果
    theta_history(n) = theta;
end

% 显示最终结果
disp(['最终估计值 theta: ', num2str(theta)]);

% 绘制收敛过程
figure;
plot(1:num_iterations, theta_history, 'LineWidth', 1.5);
hold on;
yline(2, '--r', 'True Root 1 (2)');
yline(-2, '--g', 'True Root 2 (-2)');
xlabel('迭代次数');
ylabel('估计值 \theta');
title('Robbins-Monro 算法收敛过程');
legend('估计值 \theta', 'True Root 1 (2)', 'True Root 2 (-2)');
grid on;

三、梯度下降的多种方法

        我有一个目标函数J,这个目标函数是一个w的函数

\min_w\quad J(w)=\mathbb{E}[f(w,X)]

        我需要优化这个函数,让这个函数达到最西澳,而这个函数含有expectation和随机变量的这样一个函数,f又是w和X的函数,这里得w知道了(就是输入),X是一个随机变量,这个随机变量它的probability distribution已经给定了,这个expection实际上就是对这个X球的,这个函数的目标就是求解w,让函数达到最小。

2.1 GD 梯度下降

        w_{k+1}=w_k-\alpha_k\nabla_w\mathbb{E}[f(w_k,X)]=w_k-\alpha_k\mathbb{E}[\nabla_wf(w_k,X)]

        假设最优的解是w*,在k次对w*有一个估计,然后再wk+1去改进这个wk,方法就是对Jw求梯度,afa是下降速率,而也可以对f求梯度,再进行求和求平均,梯度下降(Gradient Descent, GD)是一种用于优化目标函数的迭代算法。它通过计算目标函数的梯度(即一阶导数)并沿负梯度方向更新参数,逐步逼近函数的最小值。梯度下降广泛应用于机器学习和深度学习中,用于训练模型参数。下面简单给一个MATLAB代码

% 梯度下降优化线性回归模型
% 目标:最小化损失函数 J(w) = 1/N * sum((y_i - w'*x_i)^2)

% 生成数据
N = 1000;  % 样本数量
x = randn(N, 1);  % 输入特征
y = 2 * x + 1 + randn(N, 1) * 0.5;  % 目标值(带噪声)

% 初始化参数
w = randn(1, 1);  % 权重
b = randn(1, 1);  % 偏置
eta = 0.01;       % 学习率
num_epochs = 100; % 迭代次数

% 存储损失历史
loss_history = zeros(num_epochs, 1);

% 梯度下降主循环
for epoch = 1:num_epochs
    % 计算预测值
    y_pred = w * x + b;
    
    % 计算梯度
    grad_w = -2 * mean((y - y_pred) .* x);
    grad_b = -2 * mean(y - y_pred);
    
    % 更新参数
    w = w - eta * grad_w;
    b = b - eta * grad_b;
    
    % 计算当前损失
    loss = mean((y - y_pred).^2);
    loss_history(epoch) = loss;
end

% 显示最终参数
disp(['最终权重 w: ', num2str(w)]);
disp(['最终偏置 b: ', num2str(b)]);

% 绘制损失曲线
figure;
plot(1:num_epochs, loss_history, 'LineWidth', 1.5);
xlabel('Epoch');
ylabel('Loss');
title('梯度下降损失曲线');
grid on;

         首先生成数据,生成线性数据 y=2x+1+噪声,随机初始化权重 w 和偏置 b,计算损失函数对权重 w 和偏置 b 的梯度,沿负梯度方向更新参数

2.2 BGD 批量梯度下降

        批量梯度下降(Batch Gradient Descent, BGD)是梯度下降的一种形式。与随机梯度下降(SGD)和小批量梯度下降(Mini-batch GD)不同,BGD 在每次迭代时使用整个训练数据集计算梯度并更新参数。这使得 BGD 的每次更新方向更加准确,但计算量较大,尤其是在数据集规模较大时。可以利用数据和模型来求解,有模型直接求导,但是数据我们要怎么使用

\begin{aligned}&\mathbb{E}[\nabla_wf(w_k,X)]\approx\frac{1}{n}\sum_{i=1}^n\nabla_wf(w_k,x_i).\\&w_{k+1}=w_k-\alpha_k\frac{1}{n}\sum_{i=1}^n\nabla_wf(w_k,x_i).\end{aligned}

        我对里面的随机变量进行采集,采集n次最后求一个平均,里面的梯度量就非常大

% 批量梯度下降优化线性回归模型
% 目标:最小化损失函数 J(w) = 1/N * sum((y_i - w'*x_i)^2)

% 生成数据
N = 1000;  % 样本数量
x = randn(N, 1);  % 输入特征
y = 2 * x + 1 + randn(N, 1) * 0.5;  % 目标值(带噪声)

% 初始化参数
w = randn(1, 1);  % 权重
b = randn(1, 1);  % 偏置
eta = 0.01;       % 学习率
num_epochs = 100; % 迭代次数

% 存储损失历史
loss_history = zeros(num_epochs, 1);

% 批量梯度下降主循环
for epoch = 1:num_epochs
    % 计算预测值
    y_pred = w * x + b;
    
    % 计算梯度
    grad_w = -2 * mean((y - y_pred) .* x);
    grad_b = -2 * mean(y - y_pred);
    
    % 更新参数
    w = w - eta * grad_w;
    b = b - eta * grad_b;
    
    % 计算当前损失
    loss = mean((y - y_pred).^2);
    loss_history(epoch) = loss;
end

% 显示最终参数
disp(['最终权重 w: ', num2str(w)]);
disp(['最终偏置 b: ', num2str(b)]);

% 绘制损失曲线
figure;
plot(1:num_epochs, loss_history, 'LineWidth', 1.5);
xlabel('Epoch');
ylabel('Loss');
title('批量梯度下降损失曲线');
grid on;

        生成线性数据 y=2x+1+噪声。随机初始化权重 w 和偏置 b,使用整个数据集计算损失函数对权重 ww 和偏置 bb 的梯度。

2.3 SGD(Stochastic Gradient Descent)随机梯度下降

w_{k+1}=w_k-\alpha_k\nabla_wf(w_k,x_k)

       随机梯度下降(SGD)是梯度下降(Gradient Descent, GD)的一种变体,主要用于大规模数据集的优化问题(设置n为1,每次都是选一组来测试,避免了数据量太多的问题)。与传统的梯度下降法每次迭代使用全部数据计算梯度不同,SGD 每次迭代只随机选择一个样本(或一个小批量样本)来计算梯度并更新参数。这使得 SGD 的计算效率更高,尤其适合大规模数据集和在线学习场景。

        假设我们需要最小化目标函数 J(θ),其中 θ 是模型参数。目标函数通常可以表示为

J(\theta)=\frac{1}{N}\sum_{i=1}^NL(\theta;x_i,y_i)

        L是第i个样本的损失函数,N是样本数量,每次迭代都随机选择一个样本xi,yi,根据上面的公式来进行迭代(和xk一个意思)

        \theta_{t+1}=\theta_t-\eta\nabla L(\theta_t;x_i,y_i)

        η 是学习率,∇L是样本损失函数的梯度,为了减少随机性,通常也会选取一个小批量的batch,也就是,选取m个做一个平均的梯度,和BGD比起来就是选择了m的个数,而非全部

% SGD 优化线性回归模型
% 目标:最小化损失函数 J(w) = 1/N * sum((y_i - w'*x_i)^2)

% 生成数据
N = 1000;  % 样本数量
x = randn(N, 1);  % 输入特征
y = 2 * x + 1 + randn(N, 1) * 0.5;  % 目标值(带噪声)

% 初始化参数
w = randn(1, 1);  % 权重
b = randn(1, 1);  % 偏置
eta = 0.01;       % 学习率
num_epochs = 100; % 迭代次数
batch_size = 10;  % 小批量大小

% 存储损失历史
loss_history = zeros(num_epochs, 1);

% SGD 主循环
for epoch = 1:num_epochs
    % 打乱数据顺序
    idx = randperm(N);
    x = x(idx);
    y = y(idx);
    
    % 小批量 SGD
    for i = 1:batch_size:N
        % 获取当前小批量
        x_batch = x(i:min(i+batch_size-1, N));
        y_batch = y(i:min(i+batch_size-1, N));
        
        % 计算梯度
        y_pred = w * x_batch + b;
        grad_w = -2 * mean((y_batch - y_pred) .* x_batch);
        grad_b = -2 * mean(y_batch - y_pred);
        
        % 更新参数
        w = w - eta * grad_w;
        b = b - eta * grad_b;
    end
    
    % 计算当前损失
    y_pred = w * x + b;
    loss = mean((y - y_pred).^2);
    loss_history(epoch) = loss;
end

% 显示最终参数
disp(['最终权重 w: ', num2str(w)]);
disp(['最终偏置 b: ', num2str(b)]);

% 绘制损失曲线
figure;
plot(1:num_epochs, loss_history, 'LineWidth', 1.5);
xlabel('Epoch');
ylabel('Loss');
title('SGD 损失曲线');
grid on;

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

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

相关文章

线性数据结构:单向链表

放弃眼高手低,你真正投入学习,会因为找到一个新方法产生成就感,学习不仅是片面的记单词、学高数......只要是提升自己的过程,探索到了未知,就是学习。 考虑到可能有小白在合并代码时出现各种细节问题,本文…

线程互斥同步

前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…

《苍穹外卖》项目学习记录-Day11订单统计

根据起始时间和结束时间,先把begin放入集合中用while循环当begin不等于end的时候,让begin加一天,这样就把这个区间内的时间放到List集合。 查询每天的订单总数也就是查询的时间段是大于当天的开始时间(0点0分0秒)小于…

SAP HCM 回溯分析

最近总有人问回溯问题,今天把12年总结的笔记在这共享下: 12年开这个图的时候总是不明白是什么原理,教程看N次,网上资料找一大堆,就是不明白原理,后来为搞明白逻辑,按照教材的数据一样做&#xf…

Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法

Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…

bypass hcaptcha、hcaptcha逆向

可以过steam,已支持并发,欢迎询问! 有事危,ProfessorLuoMing

python-UnitTest框架笔记

UnitTest框架的基本使用方法 UnitTest框架介绍 框架:framework,为了解决一类事情的功能集合 UnitTest框架:是python自带的单元测试框架 自带的,可以直接使用,不需要格外安装 测试人员用来做自动化测试,作…

掌握API和控制点(从Java到JNI接口)_35 JNI开发与NDK 03

3、 如何载入 .so档案 VM的角色 由于Android的应用层级类别都是以Java撰写的,这些Java类别转译为Dex型式的Bytecode之后,必须仰赖Dalvik虚拟机器(VM: Virtual Machine)来执行之。 VM在Android平台里,扮演很重要的角色。此外,在执…

CDDIS从2025年2月开始数据迁移

CDDIS 将从 2025 年 2 月开始将我们的网站从 cddis.nasa.gov 迁移到 earthdata.nasa.gov,并于 2025 年 6 月结束。 期间可能对GAMIT联网数据下载造成影响。

VSCode设置内容字体大小

1、打开VSCode软件,点击左下角的“图标”,选择“Setting”。 在命令面板中的Font Size处选择适合自己的字体大小。 2、对比Font Size值为14与20下的字体大小。

嵌入式学习---蜂鸣器篇

1. 蜂鸣器分类 蜂鸣器是一种电子发声器件,采用直流电压供电,能够发出声音。广泛应用于计算机、打印机、报警器、电子玩具等电子产品中作为发声部件。一般仅从外形不易分辨蜂鸣器的种类。但是有些蜂鸣器使用广泛,见得多了就很容易分辨。例如常…

【优先算法】专题——前缀和

目录 一、【模版】前缀和 参考代码: 二、【模版】 二维前缀和 参考代码: 三、寻找数组的中心下标 参考代码: 四、除自身以外数组的乘积 参考代码: 五、和为K的子数组 参考代码: 六、和可被K整除的子数组 参…

【Linux】使用管道实现一个简易版本的进程池

文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…

找不到msvcp140.dll解决方法

您可以尝试以下方案进行修复,看看是否可以解决这个问题: 一、重新注册 msvcp140.dll 运行库文件: “WinR”打开运行,键入:regsvr32 MSVCP140.dll,回车即可; 如果出现找不到该文件的提示&…

【优先算法】专题——位运算

在讲解位运算之前我们来总结一下常见的位运算 一、常见的位运算 1.基础为运算 << &&#xff1a;有0就是0 >> |&#xff1a;有1就是1 ~ ^&#xff1a;相同为0&#xff0c;相异位1 /无进位相加 2.给一个数 n&#xff0c;确定它的二进制表示…

【Cadence仿真技巧学习笔记】求解65nm库晶体管参数un, e0, Cox

在设计放大器的第一步就是确定好晶体管参数和直流工作点的选取。通过阅读文献&#xff0c;我了解到L波段低噪声放大器的mos器件最优宽度计算公式为 W o p t . p 3 2 1 ω L C o x R s Q s p W_{opt.p}\frac{3}{2}\frac{1}{\omega LC_{ox}R_{s}Q_{sp}} Wopt.p​23​ωLCox​Rs…

Docker入门篇(Docker基础概念与Linux安装教程)

目录 一、什么是Docker、有什么作用 二、Docker与虚拟机(对比) 三、Docker基础概念 四、CentOS安装Docker 一、从零认识Docker、有什么作用 1.项目部署可能的问题&#xff1a; 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1…

开源智慧园区管理系统对比其他十种管理软件的优势与应用前景分析

内容概要 在当今数字化快速发展的时代&#xff0c;园区管理软件的选择显得尤为重要。而开源智慧园区管理系统凭借其独特的优势&#xff0c;逐渐成为用户的新宠。与传统管理软件相比&#xff0c;它不仅灵活性高&#xff0c;而且具有更强的可定制性&#xff0c;让各类园区&#…

【C++】P5734 【深基6.例6】文字处理软件

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;题目描述输入格式输出格式示例输入与输出输入&#xff1a;输出&#xff1a; &#x1f4af;我的做法操作1&#xff1a;在文档末尾插入字符串操作2&…

CSS核心

CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签&#xff0c;在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方&#xff0c;但一般会放在文档的 <head> 标签中。 <style> div { color: r…