强化学习示例 | AI生成和翻译

Home 2025.03

下面我将通过几个简单的概念示例来介绍强化学习(RL),并附上一个基于简单场景的基础Python代码示例。强化学习涉及智能体通过与环境交互来学习最大化奖励,因此这些示例和代码都将体现这一核心思想。

强化学习简单示例

  1. 孩童学步
    • 智能体:孩童
    • 环境:地面或房间
    • 动作:迈步、爬行或静止
    • 奖励:向前移动(+1)、摔倒(-1)
    • 学习机制:孩童通过试错学习保持平衡迈步才能前进
  2. 训练机械臂抓取物体
    • 智能体:机械臂
    • 环境:放置物体的桌面
    • 动作:上下左右移动或抓取
    • 奖励:成功抓取(+10)、掉落物体(-5)
    • 学习机制:机械臂通过调整动作最大化抓取成功率
  3. 网格世界游戏
    • 智能体:网格中的角色
    • 环境:含目标点与障碍物的3×3网格
    • 动作:上下左右移动
    • 奖励:抵达目标(+10)、撞墙(-1)
    • 学习机制:角色学习前往目标的最短路径

Python代码示例:网格世界中的Q学习

以下是通过Q学习算法(一种经典RL算法)在简单一维”世界”中的基础实现。智能体通过左右移动抵达目标,并根据奖励更新Q表进行学习。

import numpy as np
import random

# 环境设置:5个位置的一维世界(0到4),目标位于位置4
state_space = 5  # 位置:[0, 1, 2, 3, 4]
action_space = 2  # 动作:0=左移, 1=右移
goal = 4

# 初始化Q表(状态×动作)
q_table = np.zeros((state_space, action_space))

# 超参数设置
learning_rate = 0.1
discount_factor = 0.9
exploration_rate = 1.0
exploration_decay = 0.995
min_exploration_rate = 0.01
episodes = 1000

# 奖励函数
def get_reward(state):
    if state == goal:
        return 10  # 抵达目标获得高额奖励
    return -1  # 每步消耗小额惩罚

# 状态转移函数:执行动作并获取新状态
def step(state, action):
    if action == 0:  # 左移
        new_state = max(0, state - 1)
    else:  # 右移
        new_state = min(state_space - 1, state + 1)
    reward = get_reward(new_state)
    done = (new_state == goal)
    return new_state, reward, done

# 训练循环
for episode in range(episodes):
    state = 0  # 从位置0开始
    done = False
    
    while not done:
        # 探索与利用权衡
        if random.uniform(0, 1) < exploration_rate:
            action = random.randint(0, action_space - 1)  # 随机探索
        else:
            action = np.argmax(q_table[state])  # 利用已有知识
        
        # 执行动作并观察结果
        new_state, reward, done = step(state, action)
        
        # 通过Q学习公式更新Q表
        old_value = q_table[state, action]
        next_max = np.max(q_table[new_state])
        new_value = (1 - learning_rate) * old_value + learning_rate * (reward + discount_factor * next_max)
        q_table[state, action] = new_value
        
        # 转移到新状态
        state = new_state
    
    # 探索率衰减
    exploration_rate = max(min_exploration_rate, exploration_rate * exploration_decay)

# 测试学习策略
state = 0
steps = 0
print("测试学习策略:")
while state != goal:
    action = np.argmax(q_table[state])
    state, reward, done = step(state, action)
    steps += 1
    print(f"步骤{steps}:移动到状态{state},动作:{'左移' if action == 0 else '右移'}")
print(f"经过{steps}步抵达目标!")

# 输出Q表
print("\n学习得到的Q表:")
print(q_table)

代码解析

  1. 环境:包含5个位置(0-4)的一维直线,目标位于位置4
  2. 动作:智能体可执行左移(0)或右移(1)
  3. 奖励:抵达目标奖励+10,每步消耗惩罚-1(鼓励高效路径)
  4. Q表:存储每个状态-动作对的预期未来奖励
  5. Q学习:通过公式更新Q表:
    Q(s, a) = (1 - α) * Q(s, a) + α * (奖励 + γ * max(Q(s', a'))),其中:
    • α = 学习率
    • γ = 折扣因子
    • s = 当前状态,a = 动作,s' = 下一状态
  6. 探索与利用:通过exploration_rate控制智能体随机探索或利用Q表决策

示例输出

测试学习策略:
步骤1:移动到状态1,动作:右移
步骤2:移动到状态2,动作:右移
步骤3:移动到状态3,动作:右移
步骤4:移动到状态4,动作:右移
经过4步抵达目标!

学习得到的Q表:
[[-2.5   2.3]
 [-1.8   4.5]
 [-1.2   6.8]
 [-0.5   9. ]
 [ 0.    0. ]]

智能体学会从任意起始位置持续右移以高效抵达目标。Q表显示越接近目标位置,”右移”动作对应的值越高。

这虽然是最基础的示例,但展现了强化学习的核心思想。对于更复杂场景(如二维网格或游戏),需要相应扩展状态和动作空间!


Back Donate