当前位置:   article > 正文

深度强化学习算法(四)(附带MATLAB程序)

深度强化学习算法(四)(附带MATLAB程序)

深度强化学习(Deep Reinforcement Learning, DRL)结合了深度学习和强化学习的优点,能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数,从而提高学习能力和决策效率。

一、关键算法分类

1.1 深度 Q 网络(Deep Q-Network, DQN)
  • 概念:将 Q 学习(一个值函数方法)与深度神经网络结合,用于近似 Q 值函数。
  • 特点:使用经验回放和固定 Q 目标网络来稳定训练过程。
  • 应用:成功应用于 Atari 游戏等环境。
 1.2 双重 Q 学习(Double Q-Learning)
  • 概念:解决 DQN 中 Q 值过估计的问题,通过引入两个 Q 网络来减少过估计。
  • 特点:使用两个独立的 Q 网络交替更新,以减少 Q 值的过高估计。
1.3 优先经验回放(Prioritized Experience Replay)
  • 概念:对经验回放进行优先级排序,以更频繁地训练那些“重要”的样本。
  • 特点:提高了训练的效率和稳定性。
1.4 深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)
  • 概念:适用于连续动作空间的策略梯度算法。
  • 特点:使用策略网络和价值网络来逼近策略和价值函数,并利用经验回放和目标网络来稳定训练。
1.5策略梯度方法(Policy Gradient Methods)
  • 概念:直接优化策略函数,通过梯度上升来最大化预期累积回报。
  • 特点:适合处理大规模或连续动作空间。
1.6近端策略优化(Proximal Policy Optimization, PPO)
  • 概念:通过引入一个“剪切”操作来限制每次策略更新的幅度,确保训练稳定。
  • 特点:简单且有效,广泛应用于各种任务。
1.7演员-评论家方法(Actor-Critic Methods)
  • 概念:结合了策略优化(演员)和价值函数(评论家)的方法。
  • 特点:演员负责更新策略,而评论家负责估计价值函数,用于指导演员更新策略。

二、深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)算法推导

深度确定性策略梯度(DDPG, Deep Deterministic Policy Gradient)是一种用于处理连续动作空间的强化学习算法。它结合了确定性策略梯度(Deterministic Policy Gradient, DPG)和深度学习技术,用于解决高维状态和动作空间的强化学习问题。下面是 DDPG 算法的详细推导过程。

2.1强化学习背景

在强化学习中,智能体通过与环境交互来学习一个策略,以最大化累计的奖励。对于连续动作空间的问题,策略是一个从状态到动作的映射 \pi \left ( s,\theta \right ),其中\theta 是策略网络的参数。

2.2确定性策略梯度

确定性策略梯度(DPG)算法的核心思想是计算策略函数 \pi \left ( s \right ) 的梯度,并利用这个梯度来更新策略。DPG 的关键是利用策略梯度定理来计算确定性策略的梯度。

策略梯度定理: 对于确定性策略 \pi,其梯度可以表示为:

其中:

  • J\left ( \theta \right )是我们要最大化的期望累计奖励。
  • \rho _{\pi }\left ( s\right )是在策略 \pi下状态的分布。
  • Q^{\pi }\left ( s,a \right ) 是在策略 \pi下,给定状态s 和动作 a 的动作-价值函数。
 2.3DDPG 算法概述

DDPG 将 DPG 的思想与深度学习相结合,使用神经网络来近似策略和价值函数。算法主要包括以下几个组成部分:

  1. 策略网络(Actor Network):用于生成动作\mu \left ( s|\theta ^{\mu } \right )
  2. 价值网络(Critic Network):用于评估动作的价值 Q\left ( s,a|\theta ^{Q} \right )
  3. 目标网络(Target Networks):策略和价值网络的延迟副本,用于稳定训练过程。
 2.3.1策略网络(Actor)

策略网络 \mu \left ( s|\theta ^{\mu } \right )生成给定状态 s 下的动作。策略网络通过最大化期望累计奖励来进行更新,其目标函数为:

J_{actor}\left ( \theta ^{\mu } \right )=IE\left [ Q\left ( s,\mu \left ( s| \theta ^{\mu }\right ) |\theta ^{Q}\right ) \right ]

2.3.2价值网络(Critic)

价值网络 Q\left ( s,a|\theta ^{Q} \right )评估动作的价值。通过最小化均方误差来更新:

 

其中:

  • D 是经验回放池。
  • {Q}'\left ( {s}',{a}' |\theta ^{​{Q}'}\right )是目标价值网络的输出。
  • {\mu }'\left ( {s}' |\theta ^{​{\mu}' }\right ) 是目标策略网络的输出。
2.3.3更新策略网络

通过确定性策略梯度来更新策略网络:

2.3.4目标网络更新

为了提高训练稳定性,使用软更新方法来更新目标网络:

 

 其中 \tau是一个很小的常数(如 0.001)。

2.4 算法流程
  • 初始化策略网络 \mu\left ( s|\theta ^{\mu }\right )和价值网络 Q\left (s ,a |\theta ^{Q}\right )的参数。
  • 初始化目标网络{\mu }'\left ( s|\theta ^{​{\mu}' }\right )和 {Q}'\left (s ,a |\theta ^{​{Q}'}\right )的参数。
  • 初始化经验回放池 D
  • 在每个训练步骤中:
    • 根据当前策略网络生成动作。
    • 执行动作并将经验存储在回放池中。
    • 从回放池中抽取一批经验。
    • 更新价值网络。
    • 更新策略网络。
    • 软更新目标网络。

三、MATLAB仿真程序

以下是一个简单的 MATLAB 程序实现 Deep Deterministic Policy Gradient (DDPG) 算法的示例。这个示例包括了策略网络(Actor Network)、价值网络(Critic Network)、目标网络的创建、经验回放、训练过程等。请注意,这只是一个简化的实现,具体应用可能需要根据问题调整网络架构和参数设置。以下是 DDPG 算法的 MATLAB 实现,包括了策略网络、价值网络、训练循环等。

3.1初始化和参数设置
  1. % 设定超参数
  2. numStates = 3; % 状态空间维度
  3. numActions = 1; % 动作空间维度
  4. actorHiddenLayer = 64; % Actor 网络隐藏层神经元数目
  5. criticHiddenLayer = 64; % Critic 网络隐藏层神经元数目
  6. gamma = 0.99; % 折扣因子
  7. tau = 0.001; % 目标网络软更新因子
  8. alpha = 0.001; % Actor 网络学习率
  9. beta = 0.002; % Critic 网络学习率
  10. batchSize = 64; % 批量大小
  11. bufferSize = 1000000; % 经验回放池大小
  12. % 创建 Actor 和 Critic 网络
  13. actorNetwork = createActorNetwork(numStates, numActions, actorHiddenLayer);
  14. criticNetwork = createCriticNetwork(numStates, numActions, criticHiddenLayer);
  15. % 创建目标网络
  16. targetActorNetwork = cloneNetwork(actorNetwork);
  17. targetCriticNetwork = cloneNetwork(criticNetwork);
  18. % 创建经验回放池
  19. replayBuffer = ReplayBuffer(bufferSize);
  20. % 训练循环参数
  21. maxEpisodes = 1000;
  22. maxStepsPerEpisode = 200;
3.2网络创建函数
  1. function actorNetwork = createActorNetwork(numStates, numActions, hiddenLayerSize)
  2. actorLayers = [
  3. featureInputLayer(numStates, 'Normalization', 'none', 'Name', 'state')
  4. fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc1')
  5. reluLayer('Name', 'relu1')
  6. fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc2')
  7. reluLayer('Name', 'relu2')
  8. fullyConnectedLayer(numActions, 'Name', 'fc3')
  9. tanhLayer('Name', 'tanh') % 输出动作范围 -1 到 1
  10. ];
  11. actorOptions = trainingOptions('adam', 'InitialLearnRate', 1e-4, 'Plots', 'none');
  12. actorNetwork = dlnetwork(layerGraph(actorLayers));
  13. end
  14. function criticNetwork = createCriticNetwork(numStates, numActions, hiddenLayerSize)
  15. statePath = [
  16. featureInputLayer(numStates, 'Normalization', 'none', 'Name', 'state')
  17. fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc1')
  18. reluLayer('Name', 'relu1')
  19. ];
  20. actionPath = [
  21. featureInputLayer(numActions, 'Normalization', 'none', 'Name', 'action')
  22. fullyConnectedLayer(hiddenLayerSize, 'Name', 'fc2')
  23. reluLayer('Name', 'relu2')
  24. ];
  25. combinedPath = [
  26. concatenationLayer(1, 2, 'Name', 'concat')
  27. fullyConnectedLayer(1, 'Name', 'fc3') % 价值函数输出
  28. ];
  29. criticLayers = [
  30. statePath
  31. actionPath
  32. combinedPath
  33. ];
  34. criticOptions = trainingOptions('adam', 'InitialLearnRate', 1e-3, 'Plots', 'none');
  35. criticNetwork = dlnetwork(layerGraph(criticLayers));
  36. end
3.3经验回放池实现
  1. classdef ReplayBuffer < handle
  2. properties
  3. buffer
  4. size
  5. capacity
  6. idx
  7. end
  8. methods
  9. function obj = ReplayBuffer(capacity)
  10. obj.capacity = capacity;
  11. obj.size = 0;
  12. obj.idx = 1;
  13. obj.buffer.states = [];
  14. obj.buffer.actions = [];
  15. obj.buffer.rewards = [];
  16. obj.buffer.nextStates = [];
  17. obj.buffer.dones = [];
  18. end
  19. function add(obj, state, action, reward, nextState, done)
  20. if obj.size < obj.capacity
  21. obj.size = obj.size + 1;
  22. end
  23. obj.buffer.states(:, obj.idx) = state;
  24. obj.buffer.actions(:, obj.idx) = action;
  25. obj.buffer.rewards(:, obj.idx) = reward;
  26. obj.buffer.nextStates(:, obj.idx) = nextState;
  27. obj.buffer.dones(:, obj.idx) = done;
  28. obj.idx = mod(obj.idx, obj.capacity) + 1;
  29. end
  30. function [states, actions, rewards, nextStates, dones] = sample(obj, batchSize)
  31. idx = randperm(obj.size, batchSize);
  32. states = obj.buffer.states(:, idx);
  33. actions = obj.buffer.actions(:, idx);
  34. rewards = obj.buffer.rewards(:, idx);
  35. nextStates = obj.buffer.nextStates(:, idx);
  36. dones = obj.buffer.dones(:, idx);
  37. end
  38. end
  39. end
3.4训练循环
  1. for episode = 1:maxEpisodes
  2. state = env.reset(); % 环境重置
  3. episodeReward = 0;
  4. for step = 1:maxStepsPerEpisode
  5. % 根据当前策略选择动作
  6. action = predict(actorNetwork, state);
  7. action = action + 0.1 * randn(size(action)); % 添加噪声以探索
  8. % 执行动作并获得新状态和奖励
  9. [nextState, reward, done] = env.step(action);
  10. % 存储经验到回放池
  11. replayBuffer.add(state, action, reward, nextState, done);
  12. % 从回放池中抽取一批经验
  13. [states, actions, rewards, nextStates, dones] = replayBuffer.sample(batchSize);
  14. % 更新 Critic 网络
  15. targetActions = predict(targetActorNetwork, nextStates);
  16. targetQValues = predict(targetCriticNetwork, [nextStates, targetActions]);
  17. targetQValues = rewards + gamma * (1 - dones) .* targetQValues;
  18. criticLoss = mean((predict(criticNetwork, [states, actions]) - targetQValues).^2);
  19. criticNetwork = train(criticNetwork, states, actions, criticLoss, beta);
  20. % 更新 Actor 网络
  21. actions = predict(actorNetwork, states);
  22. actorLoss = -mean(predict(criticNetwork, [states, actions]));
  23. actorNetwork = train(actorNetwork, states, actorLoss, alpha);
  24. % 软更新目标网络
  25. targetActorNetwork = updateTargetNetwork(targetActorNetwork, actorNetwork, tau);
  26. targetCriticNetwork = updateTargetNetwork(targetCriticNetwork, criticNetwork, tau);
  27. episodeReward = episodeReward + reward;
  28. state = nextState;
  29. if done
  30. break;
  31. end
  32. end
  33. fprintf('Episode: %d, Reward: %.2f\n', episode, episodeReward);
  34. end
3.5辅助函数
  1. function network = updateTargetNetwork(targetNetwork, sourceNetwork, tau)
  2. targetWeights = targetNetwork.Layers(1:end-1).Weights;
  3. sourceWeights = sourceNetwork.Layers(1:end-1).Weights;
  4. targetNetwork.Layers(1:end-1).Weights = tau * sourceWeights + (1 - tau) * targetWeights;
  5. end
  6. function trainedNetwork = train(network, states, actions, loss, learningRate)
  7. % 训练函数的实现取决于具体的优化方法
  8. % 在实际应用中,通常会使用自动微分工具来计算梯度并更新网络
  9. % 这里仅提供伪代码
  10. grads = dlgradient(loss, network.Learnables);
  11. trainedNetwork = adamupdate(network, grads, learningRate);
  12. end

说明

  1. 网络创建createActorNetworkcreateCriticNetwork 用于创建 Actor 和 Critic 网络。
  2. 经验回放池ReplayBuffer 类用于存储和抽取经验。
  3. 训练循环:在每个训练步骤中,智能体与环境交互,存储经验,更新网络,软更新目标网络。

注意事项

  • 以上代码是一个简化的示例,实际应用中可能需要更多的调整和优化。
  • 训练过程中的网络更新和目标网络的软更新方法需要根据具体情况进行优化。
  • 确保你有一个合适的环境接口(env),以便与环境进行交互。

根据实际需求,你可以进一步调整网络结构、超参数等,以获得更好的训练效果。

四、总结

DDPG 通过使用确定性策略梯度和深度神经网络,能够有效地处理高维连续动作空间的强化学习任务。它结合了价值函数和策略函数的深度学习方法,以及稳定训练的目标网络和经验回放机制,为连续控制问题提供了一个强大的解决方案。

 注意:回顾以往算法可以从以下链接进入:

1、深度 Q 网络(Deep Q-Network, DQN):深度强化学习算法(一)(附带MATLAB程序)-CSDN博客

2、双重 Q 学习(Double Q-Learning):深度强化学习算法(二)(附带MATLAB程序)-CSDN博客

3.优先经验回放(Prioritized Experience Replay):

深度强化学习算法(三)(附带MATLAB程序)-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/1022366
推荐阅读
相关标签
  

闽ICP备14008679号