首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【机器学习】突出强化学习中智能体通过与环境交互不断成长,其决策能力逐步进化提升,展现强化学习核心特点与动态过程。

【机器学习】突出强化学习中智能体通过与环境交互不断成长,其决策能力逐步进化提升,展现强化学习核心特点与动态过程。

作者头像
逆向-落叶
发布2024-12-25 10:19:01
发布2024-12-25 10:19:01
47900
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行

1.引言

强化学习作为机器学习领域的一个重要分支,在近年来取得了巨大的发展。它专注于智能体如何在环境中通过不断试错来学习最优策略,以最大化长期累积奖励。从游戏玩家长期称霸棋类游戏到自动驾驶汽车在复杂路况下的自主决策,强化学习的应用场景不断拓展并深刻改变着多个领域的发展格局。在本文中,我们将深入探讨强化学习的核心概念、常见算法,并通过代码示例来展示其实际应用。

2.强化学习基础概念

(一)智能体与环境

在强化学习中,智能体是能够感知环境并采取行动的实体,而环境则是智能体所处的外部世界,智能体与环境之间通过交互来实现学习过程。例如,在一个简单的迷宫游戏中,智能体可以是一个试图找到出口的虚拟角色,而迷宫及其内部的障碍物、出口等构成了环境。

(二)状态、动作与奖励
  1. 状态(State):是对环境在某一时刻的完整描述,它包含了智能体做出决策所需的所有信息。以迷宫游戏为例,迷宫中每个格子的位置信息、是否有障碍物、出口的位置等都可以是状态的一部分。
  2. 动作(Action):智能体在给定状态下能够采取的操作。在迷宫游戏中,智能体可能的动作包括向上、向下、向左、向右移动等。
  3. 奖励(Reward):环境对智能体采取动作后的反馈,用于引导智能体学习到最优策略。当智能体在迷宫中朝着出口移动时,可能会得到一个较小的正向奖励;如果成功到达出口,则会得到一个较大的正向奖励;而如果撞到障碍物,则会得到一个负向奖励。三、Q - Learning 算法

3.Q - Learning 算法

(一)算法原理

Q - Learning 是一种基于值函数的强化学习算法,其核心是学习一个动作价值函数 Q (s, a),表示智能体在状态 s 下采取动作 a 后所能获得的期望累积奖励。算法通过不断迭代更新 Q 值来逼近最优策略。在每次迭代中,智能体根据当前状态 s 选择一个动作 a,执行该动作后进入新的状态 s',并获得奖励 r。然后根据以下公式更新 Q 值:

(二)代码示例

以下是一个简单的 Q - Learning 算法实现的python代码,用于解决一个简化版的迷宫问题。假设迷宫是一个 4x4 的网格,智能体从左上角出发,目标是到达右下角。

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np

# 定义迷宫的大小
maze_size = 4

# 定义动作空间:0 - 上,1 - 下,2 - 左,3 - 右
actions = ['up', 'down', 'left', 'right']

# 初始化 Q 表,形状为 (迷宫状态数, 动作数)
Q = np.zeros((maze_size * maze_size, len(actions)))

# 定义奖励矩阵,-1 表示普通格子,-100 表示陷阱,100 表示目标
rewards = np.full((maze_size, maze_size), -1)
rewards[3, 3] = 100  # 目标位置
rewards[1, 1] = -100  # 陷阱位置

# 定义学习率和折扣因子
alpha = 0.1
gamma = 0.9

# 定义函数获取当前状态的坐标
def get_state_coordinates(state):
    return state // maze_size, state % maze_size

# 定义函数根据动作获取下一个状态
def get_next_state(state, action):
    x, y = get_state_coordinates(state)
    if action == 0 and x > 0:  # 上
        x -= 1
    elif action == 1 and x < maze_size - 1:  # 下
        x += 1
    elif action == 2 and y > 0:  # 左
        y -= 1
    elif action == 3 and y < maze_size - 1:  # 右
        y += 1
    return x * maze_size + y

# 训练循环
for episode in range(1000):
    state = 0  # 初始状态
    while True:
        # 根据 Q 表选择动作,采用 epsilon - greedy 策略
        if np.random.rand() < 0.1:  # 以 0.1 的概率随机选择动作
            action = np.random.choice(len(actions))
        else:
            action = np.argmax(Q[state])

        # 执行动作,获取下一个状态和奖励
        next_state = get_next_state(state, action)
        reward = rewards[get_state_coordinates(next_state)]

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

        # 更新状态
        state = next_state

        # 判断是否到达目标或陷阱
        if reward == 100 or reward == -100:
            break

# 测试训练好的智能体
state = 0
while True:
    action = np.argmax(Q[state])
    print(f"当前状态: {state}, 采取动作: {actions[action]}")
    next_state = get_next_state(state, action)
    if rewards[get_state_coordinates(next_state)] == 100:
        print("到达目标!")
        break
    state = next_state

在上述代码中,首先初始化了 Q 表、奖励矩阵以及相关参数。然后通过多次训练循环,智能体在迷宫中不断探索并更新 Q 值。最后进行测试,展示智能体根据训练好的 Q 表在迷宫中找到目标的过程。

4.深度 Q 网络(DQN)

(一)算法原理

深度 Q 网络(DQN)将深度学习与 Q - Learning 相结合,使用神经网络来近似表示动作价值函数 Q (s, a)。它通过构建一个深度神经网络,将状态作为输入,输出每个动作的 Q 值估计。在训练过程中,采用经验回放(Experience Replay)和目标网络(Target Network)等技术来提高学习的稳定性和效率。 经验回放是指将智能体在环境中的交互经验(状态、动作、奖励、下一个状态)存储在一个回放缓冲区中,然后在训练时从缓冲区中随机采样一批数据来更新神经网络。目标网络则是创建一个与主网络结构相同的网络,用于计算目标 Q 值,定期将主网络的参数复制到目标网络,以减少目标 Q 值的波动,提高训练的稳定性。

(二)代码示例

以下是一个简单的 DQN 代码示例,用于解决 CartPole 环境问题(一个经典的强化学习环境,目标是让一个杆子在小车上保持平衡)。这里使用 TensorFlow 框架来构建神经网络。

代码语言:javascript
代码运行次数:0
运行
复制
import gym
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
import random
import numpy as np

# 创建 CartPole 环境
env = gym.make('CartPole-v1')

# 定义超参数
gamma = 0.99  # 折扣因子
epsilon = 1.0  # 探索率
epsilon_min = 0.01  # 最小探索率
epsilon_decay = 0.995  # 探索率衰减率
learning_rate = 0.001  # 学习率
memory_size = 10000  # 经验回放缓冲区大小
batch_size = 64  # 每次训练的批次大小

# 定义神经网络模型
model = Sequential()
model.add(Dense(24, input_dim=4, activation='relu'))
model.add(Dense(24, activation='relu'))
model.add(Dense(2, activation='linear'))
model.compile(loss='mse', optimizer=Adam(learning_rate))

# 经验回放缓冲区
memory = []

# 存储经验到缓冲区
def remember(state, action, reward, next_state, done):
    memory.append((state, action, reward, next_state, done))
    if len(memory) > memory_size:
        del memory[0]

# 根据当前状态选择动作
def act(state):
    if np.random.rand() <= epsilon:
        return random.randrange(2)
    else:
        q_values = model.predict(state)[0]
        return np.argmax(q_values)

# 从经验回放缓冲区中采样数据并训练网络
def replay():
    if len(memory) < batch_size:
        return
    minibatch = random.sample(memory, batch_size)
    states = np.array([i[0] for i in minibatch])
    actions = np.array([i[1] for i in minibatch])
    rewards = np.array([i[2] for i in minibatch])
    next_states = np.array([i[3] for i in minibatch])
    dones = np.array([i[4] for i in minibatch])

    # 计算目标 Q 值
    target_q = model.predict(states)
    target_next_q = model.predict(next_states)
    for i in range(batch_size):
        if dones[i]:
            target_q[i][actions[i]] = rewards[i]
        else:
            target_q[i][actions[i]] = rewards[i] + gamma * np.max(target_next_q[i])

    # 训练网络
    model.fit(states, target_q, epochs=1, verbose=0)

# 训练循环
for episode in range(500):
    state = env.reset()[0]
    state = np.reshape(state, [1, 4])
    done = False
    total_reward = 0
    while not done:
        action = act(state)
        next_state, reward, done, _, _ = env.step(action)
        next_state = np.reshape(next_state, [1, 4])
        remember(state, action, reward, next_state, done)
        state = next_state
        total_reward += reward
        replay()
    # 更新探索率
    epsilon = max(epsilon_min, epsilon * epsilon_decay)
    print(f"Episode: {episode}, Total Reward: {total_reward}")

# 测试训练好的智能体
for _ in range(10):
    state = env.reset()[0]
    state = np.reshape(state, [1, 4])
    done = False
    total_reward = 0
    while not done:
        action = np.argmax(model.predict(state)[0])
        env.render()
        next_state, reward, done, _, _ = env.step(action)
        next_state = np.reshape(next_state, [1, 4])
        state = next_state
        total_reward += reward
    print(f"Test Reward: {total_reward}")

env.close()

在上述代码中,首先创建了 CartPole 环境并定义了相关超参数和神经网络模型。然后通过不断地与环境交互、存储经验、从经验回放缓冲区采样数据训练网络等步骤来训练 DQN 模型。最后进行测试,展示训练好的智能体在 CartPole 环境中的表现。

5.策略梯度方法

(一)算法原理

策略梯度方法直接对策略函数 进行优化,该函数表示智能体在状态 下采取动作 的概率。其核心思想是通过计算策略梯度来更新策略参数,使得策略朝着能够获得更高奖励的方向改进。具体而言,如果一个动作在当前策略下获得了较高的奖励,那么就增加该动作在策略中的概率;反之,如果一个动作获得的奖励较低,就降低其概率。常用的策略梯度算法包括 REINFORCE 算法,其梯度计算公式如下:

(二)代码示例

以下是一个简单的策略梯度算法代码示例,用于一个具有离散动作的简单环境。假设环境中有三个动作,智能体需要学习在不同状态下选择最佳动作以最大化奖励。

代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np

# 定义动作数量
num_actions = 3

# 定义策略网络(简单的单层神经网络)
def policy_network(state):
    # 这里简单使用随机权重初始化,实际应用中可使用更复杂的初始化方法
    weights = np.random.rand(state.shape[0], num_actions)
    logits = np.dot(state, weights)
    # 使用 softmax 函数将 logits 转换为动作概率分布
    action_probs = np.exp(logits) / np.sum(np.exp(logits))
    return action_probs

# 定义奖励函数(这里简单模拟)
def get_reward(action):
    # 假设动作 1 有较高奖励,动作 2 和 3 奖励较低
    if action == 0:
        return 1.0
    else:
        return 0.1

# 训练循环
num_episodes = 1000
learning_rate = 0.01
for episode in range(num_episodes):
    state = np.random.rand(2)  # 随机生成一个状态
    action_probs = policy_network(state)
    # 根据动作概率分布选择动作
    action = np.random.choice(num_actions, p=action_probs)
    reward = get_reward(action)
    # 计算策略梯度
    gradient = np.zeros((state.shape[0], num_actions))
    for a in range(num_actions):
        if a == action:
            gradient[:, a] = state * (1 - action_probs[a])
        else:
            gradient[:, a] = -state * action_probs[a]
    # 更新策略网络权重
    weights += learning_rate * reward * gradient

# 测试训练后的策略网络
for _ in range(10):
    state = np.random.rand(2)
    action_probs = policy_network(state)
    action = np.random.choice(num_actions, p=action_probs)
    print(f"State: {state}, Action: {action}")

6.强化学习的应用与展望

强化学习在众多领域都有着广泛的应用前景。在游戏开发中,它可以创造出极具挑战性的 AI 对手,提升游戏的趣味性和可玩性;在自动驾驶领域,能够帮助车辆在复杂多变的交通环境中做出智能决策,提高行车安全性和效率;在机器人控制方面,使机器人可以自主学习各种任务,适应不同的工作场景。 然而,强化学习仍然面临着一些挑战。例如,样本效率问题导致在一些复杂场景下训练时间过长;探索与利用的平衡难以精确把握;在高维状态空间和连续动作空间中的应用还存在一定困难。但随着技术的不断发展,新的算法改进和创新不断涌现,如基于模型的强化学习、分层强化学习等,有望进一步克服这些挑战,推动强化学习在更多领域的深入应用,为人工智能的发展带来更多的可能性。 综上所述,强化学习作为机器学习领域的一颗璀璨明珠,通过不断的算法创新和实践应用,正逐渐改变着我们的世界,未来也必将在更多未知的领域绽放光彩。 希望这篇文章对你理解机器学习中的强化学习以及相关代码实践有所帮助。你可以根据实际需求进一步深入研究和扩展其中的内容。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.引言
  • 2.强化学习基础概念
    • (一)智能体与环境
    • (二)状态、动作与奖励
  • 3.Q - Learning 算法
    • (一)算法原理
    • (二)代码示例
  • 4.深度 Q 网络(DQN)
    • (一)算法原理
    • (二)代码示例
  • 5.策略梯度方法
    • (一)算法原理
    • (二)代码示例
  • 6.强化学习的应用与展望
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档