强化学习4:DQN 算法

看这篇文章之前,建议先了解一下:Q-Learning 算法

1. 算法介绍

DQN 算法全称为 Deep Q-Network,即深度Q网络。它将 Q-Learning 与 Deep Learning 结合在了一起,敲开了深度强化学习的大门。

1.1 Q-Network

Q-Learning 是使用 Q-table 来存储决策信息的,那么这就要求 state、action 必须是离散的。但是大部分情况,state 和 action 并不离散,或者不方便例举出所有的可能性。比如说用来打游戏,这时 Q-Learning 就无法使用。
为了应对 state 和 action 是连续的情况,我们可以使用 Q 函数来替代 Q-table,Q 函数依然可以记为 Q(s,a),这样对于任意的 state 和 action,只需要通过函数计算我们就可以得到其所对应的 Q-value 了。
但是强化学习可应用的情况可能非常复杂,比如打游戏,我们知道当前的所有敌人的情况 state 和我们下一步想做的操作 action,我们也是没办法设想一个合理的函数来作为 Q-value 的。
神经网络只要构建的足够大,理论上可以模拟任何函数,那么我们就可以使用神经网络来充当 Q 函数。w是神经网络的参数,那么我们的 Q 函数可以记为 Q(s,a;w)。这个网络也就被称为 Q-Network。
强化学习过程

1.2 网络的输入与输出

神经网络的输入输出是什么呢?
输入肯定就是状态的每一项。输出可以有两种选择。一种是让网络输出当前 state 对应每一种 action 的 Q-value,另一种是直接让网络输出最优 action。
网络输出示例
两种各有优劣。
对第一种来说,由于我们是替代 Q-table 的,那么如果网络输出是 Q-value,我们就可以使用 Q-Learning 或 SARSA 所使用的 Q-value 更新策略来更新网络。但是这样我们就需要列举出所有可行的 action,这样 action 仍需要是离散的,那么之前所说的使用 Q-Network 的初衷就有一部分没能得到满足。
相比之下,第二种就允许 action 是连续的。第二种网络的训练不过多赘述,这不是DQN的选择。但并不是说这种方式不好,而是其训练方式较为复杂,不方便使用 TD 策略来更新网络,DQN无法训练。这种网络需要其他的训练方式,比如策略梯度。如果继续深入学习强化学习,会了解到这种网络的使用方式的。
这里采用第一种网络,即网络输出就是 Q-value,这样网络将无缝衔接的替换 Q-Table,那么其他操作就和 Q-Learning 很像。

1.3 参数更新

网络训练过程如下:
训练过程

  1. 前向传播:
    得到每个可行的 action 对应的 Q-value,获得一个输出 a = arg max ⁡ a Q ( s , a ; w ) a = \argmax_{a}{Q(s,a;w)} a=aargmaxQ(s,a;w),同时我们可以观察到下一个 s ′ s' s,并获得奖励 r r r
  2. 计算 TD Target 值:
    y = r + γ max ⁡ a ′ Q ( s ′ , a ′ ; w ) y = r + γ \max_{a'}{Q(s',a';w)} y=r+γmaxaQ(s,a;w)
    这里和 Q-Learning 一样使用 TD Target 作为实际值。
    注意这里用到了 s ′ s' s a ′ a' a,这是下一次的状态和行为,而不是当前的。所以是再下一次预测时,更新当前这一次的参数。
  3. 计算损失函数:
    L o s s = 1 2 [ y − Q ( s , a ; w ) ] 2 Loss = \frac{1}{2}[y - Q(s,a;w)]^2 Loss=21[yQ(s,a;w)]2
    注意这里只包含被选择的行为的预测 Q-value。

然后就可以使用梯度下降来更新网络中的参数 w w w
在 DQN 的训练过程中,对于输出层而言,在更新时,未包含在 L o s s Loss Loss 函数中的 Q-value 对应的梯度会接近于0,因此这些 Q-value 直接相关的网络参数在当前更新步骤中的变化会很小。但是,这并不意味着这些参数永远不会更新,因为它们仍然可能通过共享层或其他方式间接地受到其他动作 Q-value 的影响。

2. 优化

2.1 目标网络

训练过程中将网络复制为两部分 netA 和 netB。每一次训练过程,使用 netA 去做决策,netB用于计算Target值。每次训练只更新 netA 的参数。等到一轮训练完毕后,再将 netA 的参数复制给 netB。
称netA为评估网络(evaluation network)。称 netB 为目标网络(target network)。在每一轮训练过程中,目标网络的参数是固定死的。
那么Target值就变为了: y = r + γ max ⁡ a ′ Q ( s ′ , a ′ ; w t ) y = r + γ \max_{a'}{Q(s',a';w_t)} y=r+γmaxaQ(s,a;wt)。损失函数为: L o s s = 1 2 [ y − Q ( s , a ; w e ) ] 2 Loss = \frac{1}{2}[y - Q(s,a;w_e)]^2 Loss=21[yQ(s,a;we)]2

  • 稳定训练过程:目标网络通过提供相对稳定的目标Q值,有效减少了训练过程中的波动性和不稳定性。这种稳定性有助于智能体在探索和利用之间找到更好的平衡点,从而更稳定地收敛到最优策略。
  • 提高学习效率:由于目标网络的存在,主网络能够基于一个相对稳定的目标进行学习,这避免了由于目标值频繁变化而导致的混淆和误导。因此,主网络能够更快地优化其参数,提高学习效率,更快地找到高质量的解决方案。

2.2 经验回放

经验回放(Experience Replay)是一种用于存储和回放过去经验(即状态转换)的策略。
该策略需要创建一个经验池(Experience Replay Buffer),通常是一个循环队列或固定大小的列表。每当 agent 选择一个 action 并与环境进行交互时,就会生成一个新的经验(或称为转换),该经验包含当前state、所选 action、获得的 reward 以及下一个state。这个经验会被存储到经验池中。当经验池中的经验数量达到一定的阈值时,算法每次训练会从经验池中随机抽取一批经验作为训练数据。

  • 打破数据相关性:
    在强化学习中,相邻状态之间通常存在高度相关性。直接使用连续的经验进行训练可能会导致模型对最近的经验产生过度拟合,从而降低其泛化能力。通过经验回放,算法可以从历史经验中随机抽取数据进行训练,从而打破数据之间的相关性,提高模型的泛化能力。
  • 提高数据利用效率:
    在强化学习中,数据的收集往往是非常昂贵的。通过经验回放,算法可以反复利用存储在经验池中的历史经验进行训练,从而提高数据的利用效率。
  • 提高训练稳定性:
    通过随机抽取经验进行训练,算法可以更好地应对非平稳分布的问题,因为历史经验中可能包含不同分布的数据。

2.3 探索

如果一开始,某个 action 得到了正向的奖励,那么后面就可能会一直采取这个 action。但其实可能别的 action 会比这个要好很多。为了不会陷入局部优化,算法需要具有一定的探索性。
常用的解决方法有两种:ε 贪心(epsilon greedy)和玻尔兹曼探索(Boltzmann exploration)。ε 贪心更常用。

  • ε 贪心
    其中 ε 为探索率,其值为 0-1 之间。算法会以 ε 的概率选择随机 action,以 1-ε 的概率使用 Q-Network 选择 action。
    在这里插入图片描述
  • 玻尔兹曼探索
    玻尔兹曼探索策略是基于玻尔兹曼分布(Boltzmann Distribution)的概念。在每一步中,智能体会根据每个动作的价值函数估计值和一个称为“温度”的参数 T 来计算选择该动作的概率。 在这里插入图片描述
    温度参数 T 控制了探索和利用之间的平衡:当 T 较高时,智能体更倾向于探索;当 T 较低时,智能体更倾向于利用已知信息选择最优动作。

所以,最终选择的某个行为可能并不是通过神经网络预测而来。然而,不管行为从何而来,只要这个行为被用于与环境交互并产生了新的状态、动作、奖励信息,这些信息就可以被存储到经验回放池中,并可能在未来被用于更新神经网络模型。

2.4 其他优化

还有一些其他优化,不过多赘述,有兴趣的可以自行了解。这里给出一些名称:优先经验回放、双重DQN(DDQN)、Dueling DQN。

3 总结

DQN整体流程如下:
总结

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法和参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数分别是查找值、表格范围、列索引号和匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这时候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同时,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式时范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这时候需要统一格式。还有,当出现#N/A错误时,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部分数据匹配出错的情况。这时候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动时偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同时,提供常见错误和解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP和其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列和返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部分匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值