首页 > 编程语言 >强化学习基础:主要算法框架与Python实现示例

强化学习基础:主要算法框架与Python实现示例

时间:2024-09-22 17:49:38浏览次数:12  
标签:dim 示例 Python self torch state 算法 env action

强化学习

创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力!

强化学习(Reinforcement Learning,RL)是一种通过与环境交互来学习策略的机器学习方法。RL主要包含以下几个关键组件:状态(State)、动作(Action)、奖励(Reward)、策略(Policy)价值函数(Value Function)。常见的强化学习主流算法框架主要包括以下几类:**值函数方法(Q-Learning、SARSA)、策略梯度方法(REINFORCE)、Actor-Critic方法(A2C、PPO)**等。以下将对这些算法框架及原理进行详细介绍,并提供相应的Python示例代码。

一、值函数方法

值函数方法通过估计每个状态或状态-动作对的价值来选择动作。

1. Q-Learning

Q-Learning 是一种基于价值的强化学习算法,用于寻找最优策略。它通过更新Q值来学习状态-动作对的价值函数。

核心公式:
[
Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a’} Q(s’, a’) - Q(s, a) \right)
]
其中:

  • ( Q(s, a) ) 为当前Q值
  • ( \alpha ) 为学习率
  • ( r ) 为即时奖励
  • ( \gamma ) 为折扣因子

示例代码:

import numpy as np
import gym

# 创建环境
env = gym.make('FrozenLake-v1', is_slippery=False)
num_states = env.observation_space.n
num_actions = env.action_space.n

# 初始化Q表
Q = np.zeros((num_states, num_actions))

# 超参数
alpha = 0.1  # 学习率
gamma = 0.99  # 折扣因子
epsilon = 0.1  # 探索率
num_episodes = 1000

# Q-Learning算法
for episode in range(num_episodes):
    state = env.reset()
    done = False
    while not done:
        # 选择动作
        if np.random.rand() < epsilon:
            action = env.action_space.sample()  # 探索
        else:
            action = np.argmax(Q[state, :])  # 利用

        # 执行动作
        next_state, reward, done, _ = env.step(action)

        # 更新Q值
        Q[state, action] = Q[state, action] + alpha * (
            reward + gamma * np.max(Q[next_state, :]) - Q[state, action])

        state = next_state

print("Q表:")
print(Q)

二、策略梯度方法

策略梯度方法直接优化策略,不需要维护Q值。通过对策略参数进行优化来最大化期望奖励。

2. REINFORCE

REINFORCE是一种基于蒙特卡洛方法的策略梯度算法。

核心公式:
[
\theta \leftarrow \theta + \alpha \nabla_\theta \log \pi_\theta(a|s) G_t
]
其中:

  • ( \pi_\theta(a|s) ) 为策略函数
  • ( G_t ) 为从时间 ( t ) 开始的累计回报

示例代码:

import gym
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim

# 定义策略网络
class PolicyNetwork(nn.Module):
    def __init__(self, state_dim, action_dim):
        super(PolicyNetwork, self).__init__()
        self.fc = nn.Linear(state_dim, action_dim)

    def forward(self, x):
        return torch.softmax(self.fc(x), dim=-1)

# 创建环境
env = gym.make('CartPole-v1')
policy_net = PolicyNetwork(state_dim=env.observation_space.shape[0], action_dim=env.action_space.n)
optimizer = optim.Adam(policy_net.parameters(), lr=0.01)

# REINFORCE算法
def reinforce(num_episodes=1000):
    for episode in range(num_episodes):
        state = env.reset()
        log_probs = []
        rewards = []
        done = False
        while not done:
            state = torch.tensor(state, dtype=torch.float32)
            action_probs = policy_net(state)
            action = np.random.choice(len(action_probs.detach().numpy()), p=action_probs.detach().numpy())

            log_prob = torch.log(action_probs[action])
            log_probs.append(log_prob)

            state, reward, done, _ = env.step(action)
            rewards.append(reward)

        # 计算累计回报
        G = 0
        returns = []
        for r in reversed(rewards):
            G = r + 0.99 * G
            returns.insert(0, G)

        returns = torch.tensor(returns)
        returns = (returns - returns.mean()) / (returns.std() + 1e-5)

        # 更新策略参数
        loss = 0
        for log_prob, G in zip(log_probs, returns):
            loss -= log_prob * G

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    print("训练完成")

reinforce()

三、Actor-Critic方法

Actor-Critic方法结合了值函数和策略梯度的优点,具有更快的收敛速度。

3. Advantage Actor-Critic (A2C)

A2C是一种同步的Actor-Critic算法,具有优势函数估计,既学习状态值函数,又学习策略。

核心公式:
[
\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)
]
Actor更新:
[
\theta \leftarrow \theta + \alpha \delta_t \nabla_\theta \log \pi_\theta(a_t|s_t)
]
Critic更新:
[
w \leftarrow w + \alpha \delta_t \nabla_w V(s_t)
]

示例代码:

import torch.nn.functional as F

class ActorCritic(nn.Module):
    def __init__(self, state_dim, action_dim):
        super(ActorCritic, self).__init__()
        self.fc = nn.Linear(state_dim, 128)
        self.action_head = nn.Linear(128, action_dim)
        self.value_head = nn.Linear(128, 1)

    def forward(self, x):
        x = F.relu(self.fc(x))
        action_probs = F.softmax(self.action_head(x), dim=-1)
        state_values = self.value_head(x)
        return action_probs, state_values

env = gym.make('CartPole-v1')
ac_net = ActorCritic(state_dim=env.observation_space.shape[0], action_dim=env.action_space.n)
optimizer = optim.Adam(ac_net.parameters(), lr=0.01)

def a2c(num_episodes=1000):
    for episode in range(num_episodes):
        state = env.reset()
        done = False
        while not done:
            state = torch.tensor(state, dtype=torch.float32)
            action_probs, state_value = ac_net(state)
            action = np.random.choice(len(action_probs.detach().numpy()), p=action_probs.detach().numpy())

            next_state, reward, done, _ = env.step(action)
            next_state = torch.tensor(next_state, dtype=torch.float32)
            _, next_state_value = ac_net(next_state)

            td_error = reward + (1 - done) * 0.99 * next_state_value - state_value

            # 更新Actor
            actor_loss = -torch.log(action_probs[action]) * td_error.detach()

            # 更新Critic
            critic_loss = td_error ** 2

            optimizer.zero_grad()
            (actor_loss + critic_loss).backward()
            optimizer.step()

            state = next_state.numpy()

    print("A2C训练完成")

a2c()

以上介绍了强化学习的主要算法框架及其Python代码示例,包括值函数方法(Q-Learning)、策略梯度方法(REINFORCE)、以及Actor-Critic方法(A2C)。通过这些示例,可以更好地理解强化学习的基本原理和实现方法。

大家有技术交流指导、论文及技术文档写作指导、项目开发合作的需求可以搜索关注我私信我

在这里插入图片描述

标签:dim,示例,Python,self,torch,state,算法,env,action
From: https://blog.csdn.net/weixin_40841269/article/details/142412824

相关文章

  • 药物分子生成算法综述:从生成对抗网络到变换器模型的多样化选择
    创作不易,您的打赏、关注、点赞、收藏和转发是我坚持下去的动力!基于已有的药物数据生成新的药物分子是一项复杂的任务,通常涉及到生成模型和机器学习算法。以下是一些常用的算法和方法:1.生成对抗网络(GANs)特点:由生成器和判别器两个神经网络组成,生成器生成新分子,判别......
  • Python语言的基本要素
    1.Python的语句(1)程序语句中,所有的字符都必须是英文字符(半角),不能是中文字符(全角)。(2)"#"后是注释,注释的内容不执行。("ctr+/"可加多行注释)2.常量(1)常量表示固定不变的数据(值)(2)常见常量有:数值型(整数)、字符串、布尔型(true表示真、false表示假)、空(None表示啥也不是)3.变量(1)变量是......
  • 小波变换及示例
    在二维Haar小波中,输入数据分解为低频和高频分量的计算公式源自Haar小波的特性,以及对输入矩阵的行和列进行逐步分解的方式。###Haar小波变换的基本思想Haar小波是最简单的小波变换,它基于二进制分解。对于二维数据(如图像),通常先对行进行一维变换,然后对列进行一维变换,得到四......
  • Tarjan算法及其应用 总结+详细讲解+详细代码注释
    \(\text{Tarjan}\)1.引入概念1.强连通分量1.定义在有向图\(G\)中,强连通分量就是满足以下条件的\(G\)的子图:从任意一点出发,都有到达另一个点的路径。不存在一个或者几个点,使得这个子图加入这些点后,这个子图还满足上一个性质。为什么要限定”在有向图中“而不是”在任......
  • 文心一言 VS 讯飞星火 VS chatgpt (352)-- 算法导论24.1 3题
    三、给定G=(V,E)是一带权重且没有权重为负值的环路的有向图,对于所有结点v∈V,从源结点s到结点v之间的最短路径中,包含边的条数的最大值为m。(这里,判断最短路径的根据是权重,不是边的条数。)请对算法BELLMAN-FORD进行简单修改,可以让其在m+1遍松弛操作之后终止,即使m不是......
  • 书生大模型实战(从入门到进阶)L0-Python
    目录Python实现WordCountVscode连接InternStudiodebugdebug单个python文件在vscode使用命令行进行debug本文是对书生大模型L0-Python部分的学习和实现,学习地址如下:学习地址:‬​​​​⁠​​‌⁠‍⁠​‬​​​​​​​⁠‬​​​⁠​​‌​​​​​‍​​​⁠​​​学......
  • 【蓝桥杯】2024.9.22算法赛——灵魂问题\全栈项目小组(C++)
    一、灵魂问题题目灵魂问题题目分析1.要求输出一个整数2.题目在玩脑筋急转弯,关键句子标出来了——糖什么的根本不重要。所以咖啡不加糖,答案是0!!!代码#include<iostream>usingnamespacestd;intmain(){ cout<<0; return0;}二、全栈项目小组题目全栈项目小组......
  • 【python】石头剪刀布,模拟十次并统计获胜次数
    解决问题下面是一个使用Python编写的剪刀、石头、布游戏的程序,包含玩家与计算机对战和模拟计算机对战10次的功能。importrandomdefget_computer_choice():  returnrandom.randint(0,2)defget_user_choice():  choice=input("请输入剪刀(0)、石头(1)、布(......
  • Python中的同一运算符与整数缓存问题
    在Python中,is运算符与==运算符的使用常常引发混淆。特别是在处理小整数时,Python会进行整数缓存,以提高性能。本文将深入探讨同一运算符(is)与相等运算符(==)的区别,并详细阐述整数缓存的问题,通过具体的代码示例和运行结果来帮助理解。1.同一运算符与相等运算符is运算符:判断两个对象是否......
  • python函数一:函数的概念、函数定义与调用、函数的参数、函数的返回值、说明文档以及函
    文章目录1.函数介绍1.1函数的概念1.2函数定义与调用1.2函数的参数1.3函数的返回值1.4说明文档2.函数的嵌套调用2.1嵌套调用及执行流程2.2嵌套调用的应用1.函数介绍1.1函数的概念什么是函数?函数:是一个被命名的、独立的、完成特定功能的代码段,其可能......