| 第243行: |
第243行: |
| | ===使用神经网络逼近 Q 值函数=== | | ===使用神经网络逼近 Q 值函数=== |
| | DQN的⾏为值函数<math> Q(s,a;θ) </math> 利⽤神经⽹络逼近,属于⾮线性逼近。此处的值函数对应着⼀组参数,在神经⽹络⾥参数是每层⽹络的权重,用θ表示。 | | DQN的⾏为值函数<math> Q(s,a;θ) </math> 利⽤神经⽹络逼近,属于⾮线性逼近。此处的值函数对应着⼀组参数,在神经⽹络⾥参数是每层⽹络的权重,用θ表示。 |
| − | 用公式表示的话如下:
| + | 用公式表示的话,如下: |
| | <math> Q^{*}(s,a)≈Q(s,a;θ) </math> | | <math> Q^{*}(s,a)≈Q(s,a;θ) </math> |
| | | | |
| 第250行: |
第250行: |
| | *'''输出''':每个动作 a 对应的Q值(离散动作空间) | | *'''输出''':每个动作 a 对应的Q值(离散动作空间) |
| | *'''参数''':θ 为神经网络的权重,通过梯度下降优化 | | *'''参数''':θ 为神经网络的权重,通过梯度下降优化 |
| − | 在论文中DQN所用的网络结构是三个卷积层加两个全连接层。
| + | |
| | + | 在论文中DQN所用的网络结构是三个卷积层加两个全连接层,网络的输入是经过预处理后的数据,预处理指的是将210*160的游戏图像转化为84*84的图像等操作,得到算法结构中的具体代码实现和网络结构见图和以下代码: |
| | + | [[文件:网络结构.png|缩略图]] |
| | + | |
| | + | |
| | '''核心意义''': | | '''核心意义''': |
| | *'''端到端学习''':直接从原始状态(如像素)映射到动作价值,无需手工设计特征。 | | *'''端到端学习''':直接从原始状态(如像素)映射到动作价值,无需手工设计特征。 |
| 第262行: |
第266行: |
| | | | |
| | ===目标网络(Target Network)的引入与参数更新策略=== | | ===目标网络(Target Network)的引入与参数更新策略=== |
| | + | 为了更长远的提高稳定性,使用一个独立的神经Q网络去得到target y,即建立另一个独立的神经网络target network。每经过c次更新后,复制 network Q得到target network Q’,然后使用Q’去生成target y应用与接下来的c次更新。好处就是比起online Q-learning算法更稳定。因为online Q-learning每次更新在增加Q(st,at)的同时也增加了针对每个a的Q(st+1,a),从而增加了 target y,这又可能会引起策略的震荡甚至发散。所以目标网络(Target Network)的引入可以解决这一问题。 |
| | + | |
| | + | 于是损失函数表示为(忽略无关的方差项) |
| | + | <math> L_{i}(θ_{i})=E_{s,a,r,s'}[(r+γ /max_{a'}Q(s',a',θ_{i}^{−})−Q(s,a,θ_{i}))^2] </math> |
| | + | 梯度为 |
| | + | <math> ▽_{θ_i} L_i ( θ_i ) = E_{s , a , r , s ′ }[ ( r + γ max _{a ′ }Q ( s ′ , a ′ , θ_{i}^{−} ) − Q ( s , a , θ_{i }) ) ▽ θ_i Q ( s , a , θ_i ) ] </math> |
| | + | |
| | + | 工程中,使用随机梯度下降 SGD 来完成优化,另外当令 <math> θ_{i}^{−} = θ_{i−1} </math>时,退化为原始的 Q-Learning 更新形式 |
| | + | |
| | | | |
| | ===DQN在pytorch中的简单实现=== | | ===DQN在pytorch中的简单实现=== |
| 第384行: |
第397行: |
| | | | |
| | </syntaxhighlight> | | </syntaxhighlight> |
| − | 该代码基于深度Q网络(DQN)算法,解决OpenAI Gym中的经典控制任务CartPole-v1。任务目标是控制小车左右移动,使竖直杆子尽可能长时间保持直立。智能体感知环境,输出离散动作(左移/右移),最终实现稳定平衡超过500步的满分表现。 | + | 该代码基于深度Q网络(DQN)算法,解决OpenAI Gym中的经典控制任务CartPole-v1。任务目标是控制小车左右移动,使竖直杆子尽可能长时间保持直立。智能体通过4维状态(小车位置、速度、杆子角度及角速度)感知环境,输出离散动作(左移/右移),最终实现稳定平衡超过500步的满分表现。 |
| | 算法实现 | | 算法实现 |
| | Q值网络: | | Q值网络: |
| − | 使用三层全连接神经网络(输入n维→128→128→输出2维)近似Q值函数,输出左右移动的动作价值。
| + | 使用三层全连接神经网络(输入4维→128→128→输出2维)近似Q值函数,输出左右移动的动作价值。 |
| | 目标网络与主网络分离,定期同步参数以稳定训练。 | | 目标网络与主网络分离,定期同步参数以稳定训练。 |
| | 经验回放: | | 经验回放: |