强化学习算法(Reinforcement Learning)详细解释(带示例)

目录

基本概念

主要元素

学习过程

常见算法分类

示例

Python 案例:使用 Q - learning 解决迷宫问题

代码解释


基本概念

强化学习是机器学习的一个领域,其核心思想是智能体(Agent)在环境(Environment)中通过不断地与环境进行交互,尝试不同的动作(Action),并根据环境反馈的奖励(Reward)来学习如何做出最优决策,以最大化长期累积奖励。

主要元素
  • 智能体(Agent):是学习和决策的主体,它能够感知环境状态,根据一定的策略选择动作,并从环境中接收奖励反馈。
  • 环境(Environment):智能体所处的外部世界,它定义了状态空间、动作空间和奖励函数。环境会根据智能体的动作改变自身状态,并给予智能体相应的奖励。
  • 状态(State):是对环境在某一时刻的描述,智能体根据当前状态来选择动作。状态可以是离散的,也可以是连续的。
  • 动作(Action):智能体在某个状态下可以采取的行为,动作空间定义了所有可能的动作集合。
  • 奖励(Reward):是环境对智能体动作的即时反馈,用于指导智能体的学习。智能体的目标是最大化长期累积奖励。
  • 策略(Policy):是智能体选择动作的规则,它将状态映射到动作。策略可以是确定性的,也可以是随机性的。
学习过程

强化学习的学习过程通常是一个马尔可夫决策过程(MDP),包括以下步骤:

  1. 智能体处于初始状态S_0
  2. 智能体根据当前策略\pi选择一个动作A_0​。
  3. 环境根据智能体的动作,转移到下一个状态S_1​,并给予智能体一个奖励R_1​。
  4. 智能体根据新的状态和奖励更新策略\pi
  5. 重复步骤 2 - 4,直到达到终止状态。
常见算法分类
  • 基于值函数的方法:通过估计状态或状态 - 动作对的值函数来学习最优策略,如 Q - learning、SARSA 等。值函数表示从某个状态或状态 - 动作对开始,遵循某个策略所能获得的长期累积奖励的期望。
  • 基于策略梯度的方法:直接对策略进行参数化,通过优化策略的参数来最大化长期累积奖励,如 REINFORCE、A2C(Advantage Actor - Critic)、A3C(Asynchronous Advantage Actor - Critic)等。
  • 演员 - 评论家方法(Actor - Critic):结合了基于值函数和基于策略梯度的方法,既有负责选择动作的演员(Actor),又有负责评估价值的评论家(Critic),如 DDPG(Deep Deterministic Policy Gradient)、TD3(Twin Delayed Deep Deterministic Policy Gradient)等。

示例

以玩游戏为例,假设智能体是一个游戏玩家,环境是游戏世界。游戏中的各种场景和角色状态就是状态,玩家可以采取的操作(如移动、攻击、跳跃等)就是动作。当玩家完成一个任务或击败一个敌人时,游戏会给予一定的分数奖励,这就是奖励。玩家通过不断地尝试不同的操作,根据获得的分数来学习如何在游戏中取得更高的分数,即最大化长期累积奖励。

Python 案例:使用 Q - learning 解决迷宫问题

import numpy as np

# 定义迷宫环境
maze = np.array([
    [0, 0, 0, 0],
    [0, -1, 0, -1],
    [0, 0, 0, 0],
    [0, -1, 0, 1]
])

# 定义动作空间
actions = ['up', 'down', 'left', 'right']

# 初始化Q表
q_table = np.zeros((maze.shape[0] * maze.shape[1], len(actions)))

# 定义超参数
learning_rate = 0.1
discount_factor = 0.9
epsilon = 0.1
episodes = 1000

# 获取状态索引
def get_state_index(state):
    return state[0] * maze.shape[1] + state[1]

# 选择动作
def choose_action(state):
    if np.random.uniform(0, 1) < epsilon:
        return np.random.choice(len(actions))
    else:
        state_index = get_state_index(state)
        return np.argmax(q_table[state_index])

# 更新Q表
def update_q_table(state, action, reward, next_state):
    state_index = get_state_index(state)
    next_state_index = get_state_index(next_state)
    q_table[state_index, action] = (1 - learning_rate) * q_table[state_index, action] + \
                                   learning_rate * (reward + discount_factor * np.max(q_table[next_state_index]))

# 训练智能体
for episode in range(episodes):
    state = [0, 0]
    done = False
    while not done:
        action = choose_action(state)
        if actions[action] == 'up':
            next_state = [max(state[0] - 1, 0), state[1]]
        elif actions[action] == 'down':
            next_state = [min(state[0] + 1, maze.shape[0] - 1), state[1]]
        elif actions[action] == 'left':
            next_state = [state[0], max(state[1] - 1, 0)]
        elif actions[action] == 'right':
            next_state = [state[0], min(state[1] + 1, maze.shape[1] - 1)]

        reward = maze[next_state[0], next_state[1]]
        update_q_table(state, action, reward, next_state)
        state = next_state

        if reward == 1:
            done = True

# 测试智能体
state = [0, 0]
done = False
path = [state.copy()]
while not done:
    action = np.argmax(q_table[get_state_index(state)])
    if actions[action] == 'up':
        state = [max(state[0] - 1, 0), state[1]]
    elif actions[action] == 'down':
        state = [min(state[0] + 1, maze.shape[0] - 1), state[1]]
    elif actions[action] == 'left':
        state = [state[0], max(state[1] - 1, 0)]
    elif actions[action] == 'right':
        state = [state[0], min(state[1] + 1, maze.shape[1] - 1)]

    path.append(state.copy())
    if maze[state[0], state[1]] == 1:
        done = True

print("找到的路径:", path)

代码解释

  1. 环境定义:使用二维数组 maze 表示迷宫环境,其中 0 表示可通行区域,-1 表示障碍物,1 表示目标位置。
  2. Q 表初始化:创建一个 Q 表 q_table,用于存储每个状态 - 动作对的 Q 值。
  3. 超参数设置:设置学习率 learning_rate、折扣因子 discount_factor、探索率 epsilon 和训练轮数 episodes
  4. 动作选择:使用 ϵ- 贪心策略选择动作,以一定的概率随机选择动作进行探索,否则选择 Q 值最大的动作进行利用。
  5. Q 表更新:根据 Q - learning 算法的更新公式更新 Q 表,使得 Q 值逐渐收敛到最优值。
  6. 训练过程:在每个训练轮次中,智能体从初始状态开始,不断选择动作并更新 Q 表,直到到达目标位置。
  7. 测试过程:使用训练好的 Q 表,让智能体从初始状态开始,选择 Q 值最大的动作,直到到达目标位置,记录下找到的路径。
### Python 中用于工业应用的强化学习实例 #### 实例背景 在现代制造业中,自动化设备的操作优化是一个重要的课题。例如,在工厂流水线上,机械臂需要高效地完成物料搬运任务。这类场景可以通过引入强化学习来提高效率和准确性。 #### 应用场景描述 考虑一个典型的工业机器人操作环境:一条装配线上的多个工作站之间存在若干台负责运输零件的移动式机械手。目标是在满足时间窗约束的前提下最小化总行程距离或能耗。此问题可被形式化为马尔科夫决策过程(Markov Decision Process, MDP),其中状态空间表示各工作站点的状态;动作集合定义了机械手可能采取的动作(比如前往下一个位置);奖励函数设计用来衡量每次转移的成本效益。 #### 解决方案概述 采用基于Q-Learning算法框架下的深度神经网络作为价值估计器(Value Estimator),利用其强大的非线性映射能力去逼近最优策略π*(s)=argmax_a Q(s,a;θ*)。这里选择DQN(Double DQN)变种版本以缓解传统方法中存在的高估偏差问题[^4]。 #### 示例代码实现 下面给出一段简化版的Python代码片段,它实现了上述提到的功能: ```python import gym from collections import deque import random import numpy as np import tensorflow.keras as keras class ReplayBuffer(object): def __init__(self, buffer_size=10000): self.buffer = deque(maxlen=buffer_size) def add(self, experience): self.buffer.append(experience) def sample(self, batch_size): return list(zip(*random.sample(self.buffer, batch_size))) def build_model(state_shape, num_actions): model = keras.Sequential([ keras.layers.Dense(24, input_dim=state_shape[0], activation='relu'), keras.layers.Dense(24, activation='relu'), keras.layers.Dense(num_actions, activation='linear') ]) optimizer = keras.optimizers.Adam(lr=0.001) model.compile(optimizer, loss="mse") return model env_name = 'FetchReach-v1' # 或其他适合您需求的任务名称 env = gym.make(env_name).unwrapped observation_space = env.observation_space.shape action_space = env.action_space.n target_net = build_model(observation_space, action_space) eval_net = build_model(observation_space, action_space) epsilon_start = 1.0 epsilon_final = 0.01 epsilon_decay_steps = 5000 epsilon_by_step = lambda step_idx: epsilon_final + \ (epsilon_start - epsilon_final) * max((1.0-step_idx/epsilon_decay_steps), 0) memory_buffer = ReplayBuffer() batch_size = 64 gamma = 0.99 update_target_frequency = 500 total_timesteps = 10000 episode_rewards = [] for t in range(total_timesteps): state = env.reset() done = False episode_reward = 0 while not done: if np.random.rand() < epsilon_by_step(t): action = env.action_space.sample() else: q_values = eval_net.predict(np.array([state])) action = np.argmax(q_values[0]) next_state, reward, done, _ = env.step(action) memory_buffer.add((state, action, reward, next_state, int(done))) state = next_state episode_reward += reward if len(memory_buffer.buffer)>=batch_size and t%4==0: states_batch, actions_batch, rewards_batch, next_states_batch, dones_batch = memory_buffer.sample(batch_size) target_q_vals = target_net.predict_on_batch(next_states_batch) best_next_action_indices = np.argmax(eval_net.predict_on_batch(next_states_batch), axis=-1) selected_target_q_val = target_q_vals[np.arange(target_q_vals.shape[0]),best_next_action_indices] td_targets = rewards_batch + gamma*selected_target_q_val*(1-dones_batch) mask = tf.one_hot(actions_batch, depth=num_actions) with tf.GradientTape() as tape: masked_q_values = tf.reduce_sum(mask * eval_net(states_batch)*td_targets[:,None],axis=-1) loss = tf.math.reduce_mean(tf.square(td_targets-masked_q_values)) grads = tape.gradient(loss, eval_net.trainable_variables) opt.apply_gradients(zip(grads, eval_net.trainable_variables)) if t % update_target_frequency == 0: target_net.set_weights(eval_net.get_weights()) episode_rewards.append(episode_reward) ``` 这段程序创建了一个模拟环境中运行的小型强化学习代理,该代理旨在学会执行特定类型的物理任务—即操纵物体到达指定的目标区域。虽然这只是一个非常基础的例子,但它展示了如何将强化学习应用于解决现实世界中的复杂控制难题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪九天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值