强化学习数学原理(五)——随机近似与随机
一、Motivating example
首先有个random variable(随机变量)X,我们的目标就是求出他的expectation E(x),我们有一些iid的采样,xi,从1到n,求出均值
但是如果有很多数据,我需要等很久,把所有数据都收集完成然后求平均;第二种方法是一种增量式的iincremental的方法,迭代式iterativ的方法,就是来多少,先算多少。首先针对k个,从x1一直到xk,求一个平均
那我知道了wk+1,我们让k-1就是wk,就是前k-1个xi的平均数,我们就是找出wk和wk+1之间的关系
这样就不用把所有的加起来再求平均,直接进行迭代,并且这个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的函数
我需要优化这个函数,让这个函数达到最西澳,而这个函数含有expectation和随机变量的这样一个函数,f又是w和X的函数,这里得w知道了(就是输入),X是一个随机变量,这个随机变量它的probability distribution已经给定了,这个expection实际上就是对这个X球的,这个函数的目标就是求解w,让函数达到最小。
2.1 GD 梯度下降
假设最优的解是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 的每次更新方向更加准确,但计算量较大,尤其是在数据集规模较大时。可以利用数据和模型来求解,有模型直接求导,但是数据我们要怎么使用
我对里面的随机变量进行采集,采集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)随机梯度下降
随机梯度下降(SGD)是梯度下降(Gradient Descent, GD)的一种变体,主要用于大规模数据集的优化问题(设置n为1,每次都是选一组来测试,避免了数据量太多的问题)。与传统的梯度下降法每次迭代使用全部数据计算梯度不同,SGD 每次迭代只随机选择一个样本(或一个小批量样本)来计算梯度并更新参数。这使得 SGD 的计算效率更高,尤其适合大规模数据集和在线学习场景。
假设我们需要最小化目标函数 J(θ),其中 θ 是模型参数。目标函数通常可以表示为
L是第i个样本的损失函数,N是样本数量,每次迭代都随机选择一个样本xi,yi,根据上面的公式来进行迭代(和xk一个意思)
η 是学习率,∇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;