ML:Q 学习的基本原理与实现
在强化学习中模型面对的不是一批固定样本而是一个可以不断交互的环境。智能体Agent在某个状态下采取动作环境给出奖励并进入新的状态。智能体的目标不是只看当前一步是否得分而是学习一种策略使长期累计奖励尽可能大。Q 学习Q-Learning是强化学习中最经典、最基础的算法之一。它的核心思想是学习一个动作价值函数 Q(s, a)用来表示“在状态 s 下采取动作 a长期来看大约有多好”。从直观上看Q 学习做的是这样一件事• 输入状态、动作、奖励和下一个状态• 过程不断更新“状态—动作”价值表• 输出在不同状态下更值得选择的动作• 目标学会让长期累计奖励更大的决策方式Q 学习属于无模型强化学习Model-Free Reinforcement Learning方法。所谓“无模型”是指它不需要事先知道环境的完整转移规则只要能够通过尝试获得经验就可以逐步学习。一、Q 学习的基本思想Q 学习的核心思想是通过不断试错估计每个“状态—动作”组合的长期价值并据此选择更优动作。在一个强化学习任务中智能体会不断经历这样的过程• 观察当前状态• 选择一个动作• 执行动作后获得奖励• 进入下一个状态• 根据这次经验修正自己的判断例如在一个简单迷宫中• 状态可以是智能体当前所在的位置• 动作可以是向上、向下、向左、向右移动• 奖励可以是到达终点得到 1撞墙得到 -1普通移动得到 0 或较小负值• 目标是学会一条尽快到达终点的路径Q 学习不会一开始就知道哪条路径最好。它通过反复探索逐渐发现• 哪些动作会接近目标• 哪些动作会带来惩罚• 哪些状态更有价值• 哪些动作长期来看更值得选择图 1Q 学习的基本交互过程Q 学习的学习对象不是一个直接的分类边界也不是一个回归函数而是一张“价值表”。这张表记录了在状态 s 下采取动作 a长期来看可能获得多少回报。这就是 Q 值。二、强化学习中的基本元素1、智能体与环境强化学习通常由智能体和环境组成。智能体Agent是做决策的一方。它根据当前状态选择动作并希望通过行动获得更高回报。环境Environment是智能体所处的外部系统。它接收智能体的动作返回奖励并给出新的状态。可以把二者关系理解为• 智能体负责选择动作• 环境负责反馈结果• 奖励告诉智能体动作好不好• 状态告诉智能体当前处境图 2智能体与环境的交互关系2、状态、动作与奖励强化学习中的三个基本概念是状态、动作和奖励。状态State表示智能体当前所处的情况。例如• 迷宫中的当前位置• 游戏中的画面• 机器人当前姿态• 推荐系统中的用户上下文动作Action表示智能体可以选择的行为。例如• 向左移动• 向右移动• 点击某个按钮• 推荐某个商品奖励Reward表示环境对动作结果的即时反馈。例如• 到达终点得到正奖励• 撞墙得到负奖励• 完成任务得到高奖励• 浪费时间得到小惩罚强化学习的关键是智能体不能只看当前奖励而要考虑长期收益。3、策略策略Policy表示智能体在不同状态下如何选择动作。策略通常记为其中• s 表示当前状态• a 表示可选动作• π(a|s) 表示在状态 s 下选择动作 a 的概率如果某个策略在每个状态下都固定选择一个动作它就是确定性策略如果它在多个动作之间按概率选择就是随机策略。Q 学习的目标是通过学习 Q 值间接得到一个更好的策略。三、回报、折扣因子与长期价值图 3即时奖励、长期回报与折扣因子1、即时奖励与长期回报在强化学习中一个动作的好坏不能只看当前一步的奖励。例如在迷宫中某一步可能没有立刻得到奖励但它让智能体更接近终点另一步可能暂时看起来不错却会让智能体走进死路。因此强化学习关心的是长期回报Return而不是单步奖励。从某一时刻 t 开始累计回报可以写为其中•Gₜ表示从时刻 t 开始获得的累计回报•rₜ₊₁表示执行当前动作后获得的下一步奖励•rₜ₊₂rₜ₊₃ … 表示后续奖励但在实际任务中未来奖励通常需要打折。2、折扣因子折扣因子Discount Factor通常记为 γ用来控制未来奖励的重要程度。带折扣的累计回报可以写为其中• γ 表示折扣因子通常满足 0 ≤ γ ≤ 1在无限时域任务中常取 γ 1• γ 越接近 0智能体越关注眼前奖励• γ 越接近 1智能体越重视长期回报例如• γ 0只关心当前一步奖励• γ 0.9比较重视未来奖励• γ 0.99非常重视长期结果折扣因子的作用是平衡短期收益与长期收益。3、为什么需要折扣引入折扣因子有几个作用• 让越远的未来奖励影响逐渐减弱• 避免无限长任务中的累计回报无限增大• 体现现实中“近期结果通常更确定”的特点• 控制智能体偏向短期还是长期决策在 Q 学习中γ 是非常重要的超参数。它会影响智能体学习到的策略风格。四、Q 值与动作价值函数图 4Q 值与动作价值函数1、什么是 Q 值Q 值表示在某个状态下采取某个动作的长期价值。通常写为其中• s 表示当前状态• a 表示当前动作• Q(s, a) 表示在状态 s 下采取动作 a 后长期来看能够获得的期望回报例如在迷宫问题中当前位置向右表示如果智能体在当前位置选择向右走从长期来看大约能得到多少回报。Q 值越大说明这个动作越值得选择。2、状态价值与动作价值强化学习中常见两类价值函数状态价值函数和动作价值函数。状态价值函数表示处于状态 s 的长期价值。动作价值函数表示在状态 s 下采取动作 a 的长期价值。二者区别在于• V(s) 只评价状态本身• Q(s, a) 同时评价状态和动作如果知道 Q(s, a)就可以直接选择当前最好的动作。因此Q 学习选择学习动作价值函数而不是只学习状态价值函数。3、根据 Q 值选择动作如果已经学到了较准确的 Q 值那么在状态 s 下可以选择 Q 值最大的动作其中•a* 表示当前认为最优的动作• argmax 表示使 Q(s, a) 最大的动作• Q(s, a) 表示状态 s 下动作 a 的价值这就是从 Q 值得到策略的基本方式。不过在学习早期如果总是选择当前 Q 值最大的动作智能体可能过早陷入局部经验。因此还需要探索机制。五、贝尔曼方程与 Q 学习更新公式图 5贝尔曼方程与 Q 学习更新公式1、贝尔曼思想Q 学习的核心更新公式来自贝尔曼思想。一个状态—动作的价值可以由两部分组成• 当前动作带来的即时奖励• 下一状态中能够获得的最佳未来价值也就是说当前动作的价值 当前奖励 折扣后的未来最佳价值。这可以写为其中• s 表示当前状态• a 表示当前动作• r 表示执行动作后获得的奖励• s 表示下一个状态• a 表示下一个状态中的可选动作• γ 表示折扣因子• max Q(s′, a′) 表示下一个状态下能取得的最大动作价值这个式子说明Q 值不是只看当前奖励而是会向未来传播。2、时间差分目标在一次交互中智能体获得经验Q 学习会构造一个目标值其中• Target 表示这次经验给出的学习目标• r 表示即时奖励• γmax Q(s′, a′) 表示折扣后的未来最佳价值如果当前估计 Q(s, a) 与 Target 不一致就需要修正 Q(s, a)。3、Q 学习更新公式Q 学习的更新公式为其中• α 表示学习率• r 表示即时奖励• γ 表示折扣因子• s 表示下一个状态• max Q(s′, a′) 表示下一状态的最大 Q 值• 方括号中的内容表示时间差分误差时间差分误差可以写为其中• δ 表示当前估计与目标之间的差距• δ 0 表示当前 Q 值低估了该动作• δ 0 表示当前 Q 值高估了该动作因此Q 学习的更新可以理解为不直接把旧 Q 值改成目标值而是朝目标值移动一小步。学习率 α 控制这一步移动多大。4、终止状态的处理如果 s 是终止状态后续不再有未来动作那么未来价值应视为 0。此时目标值变为更新公式可写为这表示在终止状态前的最后一步Q 值只由最后得到的奖励来修正。六、探索与利用ε-greedy 策略图 6ε-greedy 策略1、为什么需要探索在强化学习中智能体面临一个经典矛盾探索与利用。利用Exploitation是指选择当前看起来最好的动作也就是 Q 值最大的动作。探索Exploration是指尝试一些当前看起来不一定最好的动作以便发现新的可能性。如果只利用• 智能体可能过早相信错误经验• 可能永远不尝试更好的动作• 容易陷入局部最优如果只探索• 学习效率低• 不能稳定执行已知较好的动作• 长期表现可能很差因此需要在探索和利用之间取得平衡。2、ε-greedy 策略Q 学习中常用 ε-greedy 策略。其基本规则是• 以 ε 的概率随机选择动作• 以 1−ε 的概率选择当前 Q 值最大的动作可以写为随机动作概率为概率为其中• ε 表示探索概率• ε 越大探索越多• ε 越小越倾向于利用已有知识例如如果 ε0.1表示智能体有 10% 的概率随机探索有 90% 的概率选择当前最优动作。3、ε 衰减在学习早期智能体对环境了解较少需要多探索在学习后期智能体已经积累了较多经验可以更多利用。因此常见做法是让 ε 随训练过程逐渐减小。例如其中•εₜ表示第 t 轮训练时的探索率•ε₀表示初始探索率•εₘᵢₙ表示最小探索率• decay 表示衰减系数• t 表示训练轮数这样可以让智能体从“多探索”逐渐过渡到“多利用”。七、Q 学习算法流程图 7Q 学习的训练流程1、基本步骤Q 学习的基本流程如下1初始化 Q 表通常所有 Q 值设为 0。2智能体从初始状态开始。3根据 ε-greedy 策略选择动作。4执行动作获得奖励和下一个状态。5使用 Q 学习公式更新 Q(s, a)。6如果到达终止状态结束当前回合。7重复多个回合直到 Q 值逐渐稳定。2、Q 学习的伪代码Q 学习可以用如下伪代码表示初始化 Q(s, a) 对于每个回合 初始化状态 s 当 s 不是终止状态 根据 ε-greedy 策略选择动作 a 执行动作 a得到奖励 r 和新状态 s 更新 Q(s, a) Q(s, a) ← Q(s, a) α [r γ max Q(s,a) - Q(s, a)] s ← s这个过程会不断把后续奖励向前传播。经过足够多的探索后Q 表会逐渐反映不同状态—动作组合的长期价值。3、离策略学习Q 学习属于离策略Off-Policy算法。所谓离策略是指智能体实际执行动作时可以使用带探索的行为策略但更新目标中使用的是下一状态的最优动作价值。也就是说智能体可以用 ε-greedy 去探索但更新时仍然学习“如果以后都选择最优动作会得到多少回报”。这也是 Q 学习与 SARSA 的一个重要区别。Q 学习的更新目标是SARSA 的更新目标通常是SARSA 是同策略学习On-policy Learning智能体在状态 s 下选择动作 a获得奖励 r进入下一个状态 s′然后按照当前策略在 s′ 下继续选择动作 a′再用这五个量更新 Q(s, a)。SARSA 使用的是下一步实际选择的动作 a因此更偏向在当前行为策略下学习。八、Python 实现网格世界中的 Q 学习下面用一个简单网格世界实现 Q 学习。任务设定如下• 网格大小为 4×4• 起点在左上角• 终点在右下角• 每移动一步得到 -1 奖励• 到达终点奖励为 10并结束回合• 动作包括上、下、左、右这个例子主要用于理解 Q 学习流程不依赖复杂环境库。import numpy as np # 数值计算库 # 1. 定义环境参数grid_size 4 # 网格边长4x4网格n_states grid_size * grid_size # 状态总数16个格子n_actions 4 # 动作数上下左右 # 动作0上1下2左3右行、列偏移量actions { 0: (-1, 0), 1: (1, 0), 2: (0, -1), 3: (0, 1)} start_state 0 # 起始状态左上角goal_state n_states - 1 # 目标状态右下角编号15 # 2. 状态编号与坐标转换def state_to_pos(state): 将状态编号转为(row, col)坐标 return divmod(state, grid_size) def pos_to_state(row, col): 将(row, col)坐标转为状态编号 return row * grid_size col # 3. 环境转移函数def step(state, action): 执行动作返回(next_state, reward, done) if state goal_state: return state, 0, True # 已在目标无法再移动 row, col state_to_pos(state) dr, dc actions[action] # 动作带来的行列变化 # 边界裁剪不能走出网格 new_row min(max(row dr, 0), grid_size - 1) new_col min(max(col dc, 0), grid_size - 1) next_state pos_to_state(new_row, new_col) if next_state goal_state: reward 10 # 到达目标奖励10 done True else: reward -1 # 每步-1鼓励尽快到达 done False return next_state, reward, done # 4. Q 学习参数alpha 0.1 # 学习率gamma 0.9 # 折扣因子epsilon 0.2 # 探索率ε-greedy策略episodes 1000 # 训练回合数 # 5. 初始化 Q 表状态数 × 动作数Q np.zeros((n_states, n_actions)) # 6. ε-greedy 动作选择def choose_action(state): 根据ε-greedy策略选择动作 if np.random.rand() epsilon: return np.random.randint(n_actions) # 探索随机动作 return np.argmax(Q[state]) # 利用当前最优动作 # 7. 训练 Q 学习for episode in range(episodes): state start_state done False while not done: action choose_action(state) next_state, reward, done step(state, action) # Q-learning 更新公式 best_next_action_value np.max(Q[next_state]) # 下一状态最优值 td_target reward gamma * best_next_action_value # 时序差分目标 td_error td_target - Q[state, action] # TD误差 Q[state, action] alpha * td_error # 更新Q值 state next_state # 8. 输出每个状态下的最优策略用箭头表示action_symbols { 0: ↑, 1: ↓, 2: ←, 3: →} print(学习到的策略)for state in range(n_states): if state goal_state: print(G, end ) # 目标格子显示G else: best_action np.argmax(Q[state]) print(action_symbols[best_action], end ) # 每行结束换行 if (state 1) % grid_size 0: print()输出示意学习到的策略→ ↓ ↓ ↓ → → → ↓ → → → ↓ → → → G这段代码体现了 Q 学习的基本工作流• 定义状态空间和动作空间• 定义环境转移函数 step()• 初始化 Q 表• 使用 ε-greedy 策略选择动作• 执行动作并获得奖励• 根据 Q 学习公式更新 Q 值• 训练结束后从 Q 表中提取策略训练后输出的箭头表示每个位置下智能体认为最值得选择的动作。由于存在随机探索不同运行结果可能略有差异。九、Python 实现加入 ε 衰减在实际训练中常常希望智能体前期多探索后期多利用。因此可以加入 ε 衰减机制。下面是在前面代码基础上修改后的训练部分。import numpy as np # 数值计算库 grid_size 4 # 网格边长4x4n_states grid_size * grid_size # 状态数16n_actions 4 # 动作数上下左右 # 动作映射0上1下2左3右actions { 0: (-1, 0), 1: (1, 0), 2: (0, -1), 3: (0, 1)} start_state 0 # 起点左上角goal_state n_states - 1 # 目标右下角编号15 def state_to_pos(state): 状态编号 → (row, col) return divmod(state, grid_size) def pos_to_state(row, col): (row, col) → 状态编号 return row * grid_size col def step(state, action): 执行动作返回(next_state, reward, done) if state goal_state: return state, 0, True # 已在目标 row, col state_to_pos(state) dr, dc actions[action] # 边界裁剪不能走出网格 new_row min(max(row dr, 0), grid_size - 1) new_col min(max(col dc, 0), grid_size - 1) next_state pos_to_state(new_row, new_col) if next_state goal_state: return next_state, 10, True # 到达目标奖励10回合结束 return next_state, -1, False # 非目标奖励-1继续 alpha 0.1 # 学习率gamma 0.9 # 折扣因子episodes 1000 # 训练回合数 # ε-greedy 探索参数初始ε1.0逐步衰减到0.05epsilon 1.0epsilon_min 0.05epsilon_decay 0.995 Q np.zeros((n_states, n_actions)) # Q表初始化 def choose_action(state, epsilon): ε-greedy动作选择 if np.random.rand() epsilon: return np.random.randint(n_actions) # 探索 return np.argmax(Q[state]) # 利用 rewards_per_episode [] # 记录每回合总奖励 for episode in range(episodes): state start_state done False total_reward 0 while not done: action choose_action(state, epsilon) next_state, reward, done step(state, action) # Q-learning 更新公式 td_target reward gamma * np.max(Q[next_state]) td_error td_target - Q[state, action] Q[state, action] alpha * td_error state next_state total_reward reward # 衰减探索率 epsilon max(epsilon_min, epsilon * epsilon_decay) rewards_per_episode.append(total_reward) print(最终 epsilon, epsilon)print(最后 10 个回合奖励, rewards_per_episode[-10:]) print(学习到的策略)action_symbols { 0: ↑, 1: ↓, 2: ←, 3: →} # 输出策略网格G表示目标for state in range(n_states): if state goal_state: print(G, end ) else: print(action_symbols[np.argmax(Q[state])], end ) if (state 1) % grid_size 0: print()输出示意最终 epsilon 0.05最后 10 个回合奖励 [5, 5, 5, 5, 5, 4, 3, 5, 5, 3]学习到的策略↓ ↓ → ↓ → → → ↓ → → → ↓ → → → G这段代码增加了三个参数• epsilon初始探索率• epsilon_min最小探索率• epsilon_decay探索率衰减系数在训练早期epsilon 较大智能体会频繁随机探索随着训练进行epsilon 逐渐减小智能体更多利用已经学到的 Q 表。这种方式通常比固定 ε 更符合强化学习训练过程。十、Q 学习的适用场景与主要局限1、适用场景Q 学习适合以下情况• 问题可以表示为状态、动作和奖励• 状态空间和动作空间相对较小• 可以通过反复尝试获得经验• 不知道环境完整转移规则• 希望学习长期收益较高的决策策略• 任务可以被分解为一系列离散决策典型例子包括• 网格世界路径规划• 简单游戏智能体• 小规模控制问题• 离散动作决策任务• 强化学习入门实验Q 学习非常适合用来理解强化学习的基本思想因为它把价值函数直接存储在 Q 表中逻辑清晰更新公式直观。2、主要优势Q 学习的主要优势包括• 原理清晰易于理解• 不需要已知环境模型• 可以通过试错逐步学习• 适合离散状态和离散动作任务• 能学习长期回报而不是只看即时奖励• 是理解深度 Q 网络DQN的基础Q 学习的重要意义不只在于它本身能解决简单任务更在于它提供了强化学习中“价值估计—策略改进”的核心框架。3、主要局限Q 学习也有明显局限• 依赖离散状态和离散动作• 状态空间过大时Q 表会变得非常庞大• 连续状态问题难以直接使用表格 Q 学习• 探索不足时可能学不到好策略• 奖励设计不合理时学习结果可能偏离预期• 收敛速度可能较慢• 对学习率、折扣因子和探索率比较敏感例如如果状态数量为 10000动作数量为 10那么 Q 表就需要存储 100000 个值。如果状态是图像、语音或复杂传感器输入表格 Q 学习就很难直接使用。4、与 DQN 的关系深度 Q 网络Deep Q-NetworkDQN可以看作 Q 学习的深度学习扩展。图 8表格 Q 学习与 DQN 的关系表格 Q 学习直接存储而 DQN 使用神经网络近似 Q 函数其中• θ 表示神经网络参数• 输入可以是复杂状态如图像或高维向量• 输出可以是各个动作的 Q 值可以简单理解为• Q 学习适合小规模离散状态空间• DQN 适合更复杂、高维的状态空间• DQN 的核心思想仍然来自 Q 学习的贝尔曼更新因此掌握 Q 学习是理解深度强化学习的重要基础。 小结Q 学习通过学习状态—动作价值函数 Q(s, a)让智能体在与环境互动中逐步掌握更优决策。它基于贝尔曼更新用 ε-greedy 平衡探索与利用适合离散状态和动作任务是理解强化学习和 DQN 的基础。“点赞有美意赞赏是鼓励”
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605656.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!