强化学习基础:智能体如何做出决策
在人工智能的众多领域中,强化学习(Reinforcement Learning, RL)以其独特的目标和方法,成为近年来研究和应用的热点之一。强化学习的核心是智能体(Agent)如何通过与环境(Environment)的交互,学习最优的行为策略,以最大化累积奖励。这种学习方式不仅广泛应用于游戏、机器人控制、资源管理等领域,还为解决复杂决策问题提供了新的思路。本文将深入探讨强化学习的基础概念,重点讲
前言
在人工智能的众多领域中,强化学习(Reinforcement Learning, RL)以其独特的目标和方法,成为近年来研究和应用的热点之一。强化学习的核心是智能体(Agent)如何通过与环境(Environment)的交互,学习最优的行为策略,以最大化累积奖励。这种学习方式不仅广泛应用于游戏、机器人控制、资源管理等领域,还为解决复杂决策问题提供了新的思路。本文将深入探讨强化学习的基础概念,重点讲解智能体如何做出决策,帮助您快速掌握这一前沿技术的核心思想。
一、强化学习的基本概念
(一)强化学习的定义
强化学习是一种通过智能体与环境的交互来学习最优行为策略的机器学习范式。智能体在环境中采取行动(Action),环境根据智能体的行为给予奖励(Reward),智能体的目标是通过学习找到一种策略(Policy),使得累积奖励最大化。
(二)强化学习的组成要素
强化学习系统主要由以下几部分组成:
-
智能体(Agent):学习和决策的主体,负责根据当前状态选择行动。
-
环境(Environment):智能体所处的外部世界,智能体的行动会影响环境,环境会根据智能体的行为给予反馈。
-
状态(State):环境在某一时刻的描述,智能体根据状态选择行动。
-
行动(Action):智能体在某一状态下可以采取的行为。
-
奖励(Reward):环境对智能体行为的反馈,通常是一个标量值,用于衡量智能体行为的好坏。
-
策略(Policy):智能体根据状态选择行动的规则,通常表示为条件概率分布 π(a∣s) 或确定性函数 π(s)。
-
价值函数(Value Function):衡量在某一状态下,按照当前策略所能获得的累积奖励的期望值。
-
回报(Return):从某一时刻开始到终止时刻为止,所有奖励的累积和,通常用折扣因子 γ 来计算未来奖励的现值。
(三)强化学习的目标
强化学习的目标是找到一种最优策略 π∗,使得从任意初始状态开始,按照该策略行动所获得的累积奖励的期望值最大化。数学上可以表示为:
π∗=argπmaxE[Gt∣St=s,At∼π]
其中,Gt 是从时刻 t 开始的回报,St 是时刻 t 的状态,At 是时刻 t 的行动。
二、智能体如何做出决策
(一)策略(Policy)
策略是强化学习中的核心概念,它定义了智能体在给定状态下选择行动的方式。策略可以是确定性的,也可以是随机性的。确定性策略直接给出在某一状态下的行动,而随机性策略则给出在某一状态下选择每个行动的概率分布。
1. 确定性策略
确定性策略可以表示为一个函数 π:S→A,其中 S 是状态空间,A 是行动空间。例如:
a=π(s)
2. 随机性策略
随机性策略可以表示为条件概率分布 π(a∣s),表示在状态 s 下选择行动 a 的概率。例如:
π(a∣s)=P(At=a∣St=s)
(二)价值函数(Value Function)
价值函数用于衡量在某一状态下,按照当前策略所能获得的累积奖励的期望值。价值函数有两种主要类型:
-
状态价值函数(State Value Function):衡量在某一状态下,按照当前策略所能获得的累积奖励的期望值。可以表示为:
Vπ(s)=Eπ[Gt∣St=s]
-
行动价值函数(Action Value Function):衡量在某一状态下,选择某一行动后,按照当前策略所能获得的累积奖励的期望值。可以表示为:
Qπ(s,a)=Eπ[Gt∣St=s,At=a]
(三)贝尔曼方程(Bellman Equation)
贝尔曼方程是强化学习中的一个重要工具,用于将价值函数分解为即时奖励和后续状态的价值。贝尔曼方程可以分为贝尔曼期望方程和贝尔曼最优方程。
1. 贝尔曼期望方程
贝尔曼期望方程用于计算在给定策略下的价值函数。对于状态价值函数,贝尔曼期望方程可以表示为:
Vπ(s)=a∈A∑π(a∣s)(Rs,a+γs′∈S∑P(s′∣s,a)Vπ(s′))
其中,Rs,a 是在状态 s 下选择行动 a 的即时奖励,P(s′∣s,a) 是从状态 s 选择行动 a 转移到状态 s′ 的概率,γ 是折扣因子。
对于行动价值函数,贝尔曼期望方程可以表示为:
Qπ(s,a)=Rs,a+γs′∈S∑P(s′∣s,a)a′∈A∑π(a′∣s′)Qπ(s′,a′)
2. 贝尔曼最优方程
贝尔曼最优方程用于计算最优价值函数,即在最优策略下的价值函数。对于状态价值函数,贝尔曼最优方程可以表示为:
V∗(s)=a∈Amax(Rs,a+γs′∈S∑P(s′∣s,a)V∗(s′))
对于行动价值函数,贝尔曼最优方程可以表示为:
Q∗(s,a)=Rs,a+γs′∈S∑P(s′∣s,a)a′∈AmaxQ∗(s′,a′)
(四)探索与利用(Exploration vs. Exploitation)
在强化学习中,智能体需要在探索(Exploration)和利用(Exploitation)之间做出平衡。探索是指智能体尝试新的行动,以获取更多的环境信息;利用是指智能体根据已有的知识选择最优行动,以最大化累积奖励。
常见的探索策略包括:
-
ε-贪婪策略(ε-Greedy Policy):以概率 ϵ 随机选择一个行动,以概率 1−ϵ 选择当前最优行动。
-
软最大化策略(Softmax Policy):根据行动的价值函数,按照概率分布选择行动,概率分布由 Boltzmann 分布决定。
-
Upper Confidence Bound (UCB):在选择行动时,考虑行动的不确定性和价值,优先选择不确定性较高的行动。
(五)策略迭代与价值迭代
策略迭代(Policy Iteration)和价值迭代(Value Iteration)是两种常用的强化学习算法,用于求解最优策略。
1. 策略迭代
策略迭代包括两个步骤:
-
策略评估(Policy Evaluation):计算当前策略的价值函数。
-
策略改进(Policy Improvement):根据价值函数更新策略,选择价值最高的行动。
策略迭代的算法流程如下:
-
初始化策略 π。
-
重复以下步骤,直到策略收敛:
-
策略评估:计算当前策略的价值函数 Vπ(s)。
-
策略改进:根据价值函数更新策略 π(s)=argmaxaQπ(s,a)。
-
2. 价值迭代
价值迭代直接求解最优价值函数,然后根据最优价值函数构造最优策略。价值迭代的算法流程如下:
-
初始化价值函数 V(s)。
-
重复以下步骤,直到价值函数收敛:
-
对于每个状态 s,更新价值函数:
V(s)←amax(Rs,a+γs′∈S∑P(s′∣s,a)V(s′))
-
-
根据最优价值函数构造最优策略:
π(s)=argamaxQ∗(s,a)
三、强化学习的算法框架
(一)蒙特卡洛方法(Monte Carlo Methods)
蒙特卡洛方法是一种基于完整采样轨迹的强化学习算法,通过多次完整的交互过程来估计价值函数和策略。蒙特卡洛方法的优点是简单易懂,但缺点是需要完整的采样轨迹,计算效率较低。
1. 蒙特卡洛策略评估
蒙特卡洛策略评估通过多次完整的采样轨迹来估计状态价值函数或行动价值函数。其算法流程如下:
-
初始化价值函数 V(s) 或 Q(s,a)。
-
重复以下步骤,直到价值函数收敛:
-
生成一条完整的采样轨迹 S0,A0,R1,S1,A1,…,ST。
-
对于轨迹中的每个状态 s 或状态-行动对 (s,a),更新价值函数:
V(s)←V(s)+α(Gt−V(s))Q(s,a)←Q(s,a)+α(Gt−Q(s,a))其中,Gt 是从时刻 t 开始的回报,α 是学习率。
-
2. 蒙特卡洛控制
蒙特卡洛控制通过多次完整的采样轨迹来学习最优策略。其算法流程如下:
-
初始化行动价值函数 Q(s,a) 和策略 π(a∣s)。
-
重复以下步骤,直到策略收敛:
-
生成一条完整的采样轨迹 S0,A0,R1,S1,A1,…,ST。
-
对于轨迹中的每个状态-行动对 (s,a),更新行动价值函数:
Q(s,a)←Q(s,a)+α(Gt−Q(s,a)) -
根据更新后的行动价值函数改进策略:
π(s)=argamaxQ(s,a)
-
(二)时序差分学习(Temporal-Difference Learning, TD Learning)
时序差分学习是一种结合了蒙特卡洛方法和动态规划方法的强化学习算法,通过部分采样轨迹来估计价值函数和策略。时序差分学习的优点是可以在不完整的采样轨迹上进行学习,计算效率较高。
1. TD(0) 策略评估
TD(0) 策略评估通过部分采样轨迹来估计状态价值函数。其算法流程如下:
-
初始化价值函数 V(s)。
-
重复以下步骤,直到价值函数收敛:
-
与环境交互,生成一个状态转移 St,At,Rt+1,St+1。
-
更新价值函数:
V(St)←V(St)+α(Rt+1+γV(St+1)−V(St))
-
2. TD(0) 控制
TD(0) 控制通过部分采样轨迹来学习最优策略。其算法流程如下:
-
初始化行动价值函数 Q(s,a) 和策略 π(a∣s)。
-
重复以下步骤,直到策略收敛:
-
与环境交互,生成一个状态-行动转移 St,At,Rt+1,St+1。
-
更新行动价值函数:
Q(St,At)←Q(St,At)+α(Rt+1+γa′maxQ(St+1,a′)−Q(St,At)) -
根据更新后的行动价值函数改进策略:
π(s)=argamaxQ(s,a)
-
(三)深度强化学习(Deep Reinforcement Learning)
深度强化学习结合了深度学习和强化学习的优势,通过使用神经网络来近似价值函数或策略函数,能够处理高维状态空间和复杂的环境。深度强化学习在许多领域取得了突破性进展,例如 AlphaGo、自动驾驶等。
1. 深度 Q 网络(Deep Q-Network, DQN)
DQN 是深度强化学习中的一个经典算法,通过使用神经网络来近似行动价值函数 Q(s,a),解决了传统 Q 学习在高维状态空间中的问题。DQN 的主要创新点包括:
-
经验回放(Experience Replay):将智能体与环境的交互经验存储在一个回放缓存中,通过随机采样回放缓存中的经验进行训练,打破数据之间的相关性,提高学习的稳定性。
-
目标网络(Target Network):使用一个固定的目标网络来计算目标值,每隔一段时间更新目标网络的参数,减少目标值的波动,提高学习的稳定性。
DQN 的算法流程如下:
-
初始化神经网络 Q(s,a;θ) 和目标网络 Q(s,a;θ−)。
-
初始化回放缓存 D。
-
重复以下步骤,直到策略收敛:
-
与环境交互,生成一个状态-行动转移 St,At,Rt+1,St+1。
-
将经验 (St,At,Rt+1,St+1) 存储到回放缓存 D 中。
-
从回放缓存 D 中随机采样一批经验 (Si,Ai,Ri+1,Si+1)。
-
计算目标值:
yi=Ri+1+γa′maxQ(Si+1,a′;θ−) -
使用目标值 yi 和预测值 Q(Si,Ai;θ) 训练神经网络:
θ←θ−α∇θ(yi−Q(Si,Ai;θ))2 -
每隔一段时间更新目标网络的参数:
θ−←θ
-
四、实战应用案例
(一)CartPole 平衡问题
CartPole 是一个经典的强化学习环境,目标是通过控制小车的移动,使杆保持平衡。以下是使用 DQN 解决 CartPole 平衡问题的代码示例:
环境安装
bash
复制
pip install gym
实现代码
Python
复制
import gym
import numpy as np
import random
from collections import deque
import tensorflow as tf
from tensorflow.keras import layers, models
# 创建环境
env = gym.make('CartPole-v1')
# 定义 DQN 网络
class DQN(models.Model):
def __init__(self, state_size, action_size):
super(DQN, self).__init__()
self.fc1 = layers.Dense(24, activation='relu', input_shape=(state_size,))
self.fc2 = layers.Dense(24, activation='relu')
self.fc3 = layers.Dense(action_size, activation='linear')
def call(self, x):
x = self.fc1(x)
x = self.fc2(x)
x = self.fc3(x)
return x
# 初始化参数
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
batch_size = 32
gamma = 0.95
epsilon = 1.0
epsilon_min = 0.01
epsilon_decay = 0.995
learning_rate = 0.001
# 初始化网络
model = DQN(state_size, action_size)
model.compile(optimizer=tf.keras.optimizers.Adam(lr=learning_rate), loss='mse')
# 初始化回放缓存
memory = deque(maxlen=2000)
# 定义训练函数
def train():
global epsilon
for episode in range(1000):
state = env.reset()
state = np.reshape(state, [1, state_size])
total_reward = 0
for time in range(500):
# 选择行动
if np.random.rand() <= epsilon:
action = random.randrange(action_size)
else:
action = np.argmax(model.predict(state)[0])
# 与环境交互
next_state, reward, done, _ = env.step(action)
next_state = np.reshape(next_state, [1, state_size])
total_reward += reward
# 存储经验
memory.append((state, action, reward, next_state, done))
# 更新状态
state = next_state
# 如果结束,则跳出循环
if done:
print(f"Episode: {episode+1}/{1000}, Score: {time+1}, Epsilon: {epsilon:.2}")
break
# 经验回放
if len(memory) > batch_size:
minibatch = random.sample(memory, batch_size)
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = reward + gamma * np.amax(model.predict(next_state)[0])
target_f = model.predict(state)
target_f[0][action] = target
model.fit(state, target_f, epochs=1, verbose=0)
# 更新 epsilon
if epsilon > epsilon_min:
epsilon *= epsilon_decay
# 训练模型
train()
# 测试模型
state = env.reset()
state = np.reshape(state, [1, state_size])
total_reward = 0
for time in range(500):
env.render()
action = np.argmax(model.predict(state)[0])
next_state, reward, done, _ = env.step(action)
next_state = np.reshape(next_state, [1, state_size])
total_reward += reward
state = next_state
if done:
print(f"Total Reward: {total_reward}")
break
env.close()
结果分析
通过 DQN 算法,智能体能够学习到如何控制小车的移动,使杆保持平衡。在训练过程中,智能体会逐渐减少探索的概率(通过降低 epsilon),增加利用的概率,最终收敛到一个稳定的策略。
(二)Atari 游戏
Atari 游戏是深度强化学习中的一个重要应用领域,通过使用卷积神经网络(CNN)处理游戏图像,DQN 算法能够学习到如何在复杂的游戏中做出最优决策。以下是使用 DQN 解决 Atari 游戏的代码示例:
环境安装
bash
复制
pip install gym[atari]
实现代码
Python
复制
import gym
import numpy as np
import random
from collections import deque
import tensorflow as tf
from tensorflow.keras import layers, models
# 创建环境
env = gym.make('Breakout-v0')
# 定义 DQN 网络
class DQN(models.Model):
def __init__(self, state_size, action_size):
super(DQN, self).__init__()
self.conv1 = layers.Conv2D(32, (8, 8), strides=(4, 4), activation='relu', input_shape=state_size)
self.conv2 = layers.Conv2D(64, (4, 4), strides=(2, 2), activation='relu')
self.conv3 = layers.Conv2D(64, (3, 3), activation='relu')
self.flatten = layers.Flatten()
self.fc1 = layers.Dense(512, activation='relu')
self.fc2 = layers.Dense(action_size, activation='linear')
def call(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = self.conv3(x)
x = self.flatten(x)
x = self.fc1(x)
x = self.fc2(x)
return x
# 初始化参数
state_size = (84, 84, 4) # 84x84 的图像,4 帧堆叠
action_size = env.action_space.n
batch_size = 32
gamma = 0.99
epsilon = 1.0
epsilon_min = 0.1
epsilon_decay = 0.995
learning_rate = 0.00025
# 初始化网络
model = DQN(state_size, action_size)
model.compile(optimizer=tf.keras.optimizers.Adam(lr=learning_rate), loss='mse')
# 初始化回放缓存
memory = deque(maxlen=1000000)
# 定义预处理函数
def preprocess_state(state):
state = state[34:34 + 160, :160]
state = cv2.resize(state, (84, 84))
state = cv2.mean(state, axis=2)
state = state / 255.0
return state
# 定义训练函数
def train():
global epsilon
for episode in range(10000):
state = env.reset()
state = preprocess_state(state)
state = np.stack([state] * 4, axis=2)
state = np.expand_dims(state, axis=0)
total_reward = 0
for time in range(10000):
# 选择行动
if np.random.rand() <= epsilon:
action = random.randrange(action_size)
else:
action = np.argmax(model.predict(state)[0])
# 与环境交互
next_state, reward, done, _ = env.step(action)
next_state = preprocess_state(next_state)
next_state = np.append(state[:, :, :, 1:], np.expand_dims(next_state, axis=0), axis=3)
total_reward += reward
# 存储经验
memory.append((state, action, reward, next_state, done))
# 更新状态
state = next_state
# 如果结束,则跳出循环
if done:
print(f"Episode: {episode+1}/{10000}, Score: {time+1}, Epsilon: {epsilon:.2}")
break
# 经验回放
if len(memory) > batch_size:
minibatch = random.sample(memory, batch_size)
for state, action, reward, next_state, done in minibatch:
target = reward
if not done:
target = reward + gamma * np.amax(model.predict(next_state)[0])
target_f = model.predict(state)
target_f[0][action] = target
model.fit(state, target_f, epochs=1, verbose=0)
# 更新 epsilon
if epsilon > epsilon_min:
epsilon *= epsilon_decay
# 训练模型
train()
# 测试模型
state = env.reset()
state = preprocess_state(state)
state = np.stack([state] * 4, axis=2)
state = np.expand_dims(state, axis=0)
total_reward = 0
for time in range(10000):
env.render()
action = np.argmax(model.predict(state)[0])
next_state, reward, done, _ = env.step(action)
next_state = preprocess_state(next_state)
next_state = np.append(state[:, :, :, 1:], np.expand_dims(next_state, axis=0), axis=3)
total_reward += reward
state = next_state
if done:
print(f"Total Reward: {total_reward}")
break
env.close()
结果分析
通过 DQN 算法,智能体能够学习到如何在 Atari 游戏中做出最优决策。在训练过程中,智能体会逐渐减少探索的概率(通过降低 epsilon),增加利用的概率,最终收敛到一个稳定的策略。通过使用卷积神经网络处理游戏图像,DQN 算法能够自动提取图像中的特征,从而更好地理解游戏环境。
五、总结
强化学习是机器学习中的一个重要分支,通过智能体与环境的交互,学习最优的行为策略,以最大化累积奖励。本文详细介绍了强化学习的基础概念,包括智能体如何做出决策、价值函数的计算、策略迭代与价值迭代等。同时,结合蒙特卡洛方法、时序差分学习和深度强化学习等算法框架,展示了强化学习在实际问题中的应用。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)