强化学习实战:从马尔科夫决策过程到策略迭代的算法实现
1. 强化学习与马尔科夫决策过程入门
第一次接触强化学习时,我被那些高大上的术语吓得不轻。直到有一天,我把智能体想象成训练我家小狗的过程,突然就豁然开朗了。想象一下:当小狗正确执行"坐下"指令时,你会给它零食奖励(正向强化);如果它随地大小便,你会轻声呵斥(负向惩罚)。强化学习的本质就是这么简单——通过试错学习最优行为策略。
马尔科夫决策过程(MDP)就是这个过程的数学表达。它包含五个关键要素:
- 状态空间(S):好比小狗所处的环境(客厅、厨房等)
- 动作空间(A):小狗能做的动作(坐下、趴下等)
- 转移概率(P):执行某个动作后环境状态的变化规律
- 奖励函数(R):对应每个动作的即时反馈
- 折扣因子(γ):衡量未来奖励的现值系数
举个真实案例:我曾在智能仓储项目中用MDP建模AGV小车的路径规划。状态是货架坐标,动作是前进/转向,奖励是准时送达的奖金减去能耗成本。通过调整γ值,我们实现了短期效率与长期设备损耗的平衡。
2. 搭建网格世界环境
理论说得再多不如动手实践。让我们用Python构建经典的网格世界(GridWorld)——强化学习的"Hello World"。
import numpy as np class GridWorld: def __init__(self, size=5): self.size = size self.state_space = [(i,j) for i in range(size) for j in range(size)] self.action_space = ['up','down','left','right'] self.goal = (size-1, size-1) # 右下角为终点 self.obstacles = [(1,1),(2,2),(3,3)] # 障碍物位置 def step(self, state, action): x,y = state if action == 'up': x = max(0, x-1) elif action == 'down': x = min(self.size-1, x+1) elif action == 'left': y = max(0, y-1) elif action == 'right': y = min(self.size-1, y+1) new_state = (x,y) if new_state in self.obstacles: return state, -10, False # 撞到障碍物 if new_state == self.goal: return new_state, 100, True # 到达终点 return new_state, -1, False # 普通移动这个环境有几个设计要点:
- 使用坐标元组表示状态,比抽象数字更直观
- 设置障碍物增加探索难度
- 差异化奖励引导智能体学习
- 终止状态标记回合结束
提示:实际项目中,建议先用小网格测试算法,再逐步扩展。我曾直接尝试10x10网格,结果训练时间呈指数增长。
3. 策略迭代算法详解
策略迭代是解决MDP问题的经典方法,包含两个交替进行的步骤:
3.1 策略评估
给定固定策略π,计算每个状态的价值函数V(s)。通过解贝尔曼方程实现:
def policy_evaluation(policy, env, theta=0.001, gamma=0.9): V = {s:0 for s in env.state_space} while True: delta = 0 for s in env.state_space: v = V[s] a = policy[s] new_s, r, done = env.step(s, a) V[s] = r + gamma * (0 if done else V[new_s]) delta = max(delta, abs(v - V[s])) if delta < theta: break return V这段代码有几个易错点:
- 需要先保存旧值再更新,否则会影响后续状态计算
- θ控制收敛精度,过大会导致评估不充分
- γ接近1时更重视长期回报,但收敛速度会变慢
3.2 策略改进
基于当前价值函数,贪心地更新策略:
def policy_improvement(V, env, gamma=0.9): policy = {} for s in env.state_space: action_values = [] for a in env.action_space: new_s, r, _ = env.step(s, a) action_values.append(r + gamma * V[new_s]) policy[s] = env.action_space[np.argmax(action_values)] return policy这里有个性能优化技巧:对于确定性环境,可以缓存状态转移结果。我在实际项目中发现,这能使迭代速度提升3倍以上。
4. 完整实现与调参技巧
将上述模块组合成完整算法:
def policy_iteration(env, max_iters=100): # 随机初始化策略 policy = {s:np.random.choice(env.action_space) for s in env.state_space} for i in range(max_iters): V = policy_evaluation(policy, env) new_policy = policy_improvement(V, env) if new_policy == policy: print(f'收敛于第{i}次迭代') break policy = new_policy return policy, V关键参数的影响规律:
- γ(折扣因子):0.9适合短期任务,0.99适合长期规划
- θ(评估精度):通常设为0.001,太严格会拖慢训练
- 奖励设计:终点奖励应是步进惩罚的100倍以上
常见问题排查:
- 算法不收敛 → 检查奖励函数是否合理
- 策略震荡 → 降低学习率或增加评估迭代次数
- 陷入局部最优 → 加入ε-greedy探索机制
我在电商推荐系统项目中应用该算法时,发现加入用户行为历史作为状态特征后,点击率提升了27%。这印证了MDP建模序列决策问题的强大能力。
