Value-based learning(价值学习)入门(使用DQN)

以下内容总结自B站:深度强化学习(Deep Reinforcement Learning)_哔哩哔哩_bilibili

一、概述:

Value-based learning(价值学习):使用神经网络Deep Q network(DQN)来近似学习Q^*(s,a);使用时间差分(TD:temporal different)算法来训练DQN,即学习神经网络的参数。

二、概念回顾:

1、基于策略\pi的动作价值函数(Action-value function)

Q_{\pi}(s_t,a_t) = \mathbb{E}[U_t|S_t = s_t, A_t = a_t]表示t时刻状态s_t下做动作之后能获得的回报的期望。

U_t = R_t + \gamma \cdot R_{t+1} + \gamma ^2 \cdot R_{t+2} + \gamma ^3 \cdot R_{t+3} + \gamma ^4 \cdot R_{t+4} + \cdots

  • U_t 是回报 (Return):表示t时刻开始未来执行一组动作后能够获得的奖励之和。 U_t = R_t + \gamma R_{t+1} + \gamma ^2R_{t+2} + \gamma ^3R_{t+3} + \cdots
  • R_i是即时奖励,与状态 S_i和动作A_i相关;\gamma是折扣因子,取[0,1]之间。未来的奖励不确定,所以需要在未来奖励上打个折扣。
  • 动作价值函数Q_\pi(s_t, a_t)的现实意义:如果用策略\pi ,我们能知道在状态s_t下做动作a_t是否明智,即Q_\pi(s_t, a_t)会对动作空间中的每一个动作a_t打分。如果有了Q_\pi(s_t, a_t),Agent就能根据Q_\pi(s_t, a_t)对动作的评价做决策,选择得分最高的动作。
  • 用不同的策略\pi函数,会得到不同的Q_\pi(s_t, a_t)
  • 下面尝试把Q_\pi(s_t, a_t)中的\pi去掉:对Q_\pi(s_t, a_t)求关于\pi的最大值:Q^*(s_t,a_t) = max_\pi Q_\pi(s_t, a_t)

2、Optimal action-value function(最优动作价值函数Q^* (s, a)Q^*(s_t,a_t)):

Q^*(s_t,a_t) = max_\pi Q_\pi(s_t, a_t)表示在状态s_t下,做 a_t能得到最好的回报的期望。

  • 最优动作价值函数的现实意义: 在状态s_t下,会对动作空间中的每一个动作a_t打分,Agent每次选取最高分对应的动作a_t。 最优动作价值函数与策略\pi无关。
  • Q^*(s,a)能指导Agent做决策。有了Q^*(s,a),那么每观测到一个状态s_t,都能选择使状态价值函数值最大的动作 a_ta_t = argmax_a Q^*(s_t, a)
  • Value-based learning(价值学习)就是使用神经网络Deep Q network(DQN)来学习一个函数Q(s,a;w),该函数能够近似Q^*(s,a)。其中,w是DQN的参数,s是输入,a是输出。

三、Deep Q network(DQN)

(一)全貌概览:

Value-based learning(价值学习)入门(使用DQN)_第1张图片

假设我们已经训练好了一个DQN,即DQN的参数w已经有了,那么:

  • 将屏幕的一帧作为输入,通过卷积层(Conv)进行特征提取,得到特征向量(feature),然后通过全连接层(Dense)将特征映射到输出向量(图中紫色方块)。
  • 输出向量就是对动作的打分,向量的每一个元素对应一个动作的得分。例如,超级玛丽游戏中动作有left,right,up三个动作,因此输出向量是三维的:[2000,1000, 3000]。通过这个向量,就能指导Agent应该做的动作。Agent此时应该做up动作,因为该动作分数最高,代表做该动作能获得的回报的期望最大。

(二)如何使用DQN指导Agent打游戏:

Value-based learning(价值学习)入门(使用DQN)_第2张图片

  1. s_t为输入,给所有动作打分,选择得分最高的动作作为a_t
  2. Agent执行a_t动作后,环境会对状态进行改变,下一个状态是根据状态转移函数p随机抽样得来,得到s_{t+1}
  3. 同时环境还会告诉Agent得到的即时奖励r_tr_t是强化学习中的监督信号,DQN需要参考奖励值来进行训练。 
  4. 重复此过程,直至游戏结束。

如何训练DQN?最常用的是TD算法。

四、时序差分:Temporal Difference(TD) Learning

先看一个例子:开车从纽约(NYC)到亚特兰大(Atlanta)需要多长时间?用模型Q(w)进行预测,例如Q(w)=1000,分钟。如何更新这个模型?

Value-based learning(价值学习)入门(使用DQN)_第3张图片

方法一:

  1. 模型做一个预测,这个预测一开始可以是随机的:q=Q(w),即q=1000.
  2. 从NYC开车到Atlanta,结束一次完整行程后得到真实时间y,如,y=860.
  3. 计算预测值和真实值的损失函数Loss:L=\frac{1}{2}(q-y)^2.(类似均方损失函数),训练模型的目的就是使估计值逐渐逼近真实值,即误差尽可能小。
  4. 计算梯度:\frac{\partial L}{\partial w} = \frac{\partial q}{\partial w}\cdot \frac{\partial L}{\partial q}=(q-y)\cdot \frac{\partial Q(w)}{\partial w}=140\cdot \frac{\partial Q(w)}{\partial w}.(链式法则,L是q的函数,q是w的函数)
  5. 梯度下降法更新参数w:w_{t+1}=w_t-\alpha \cdot \frac{\partial L}{\partial w}|_{w=w_t}\alpha为学习率,值在(0,1)之间)

方法一特点:通过梯度下降更新参数w,使模型估计值越来越逼近真实值。但该方法必须等一整次旅途结束后,才能对模型进行一次更新(这是蒙特卡洛方法的典型特征)。能否在完成一整次旅途之前就对模型更新,即走一步更新一次?

方法二(TD算法):

Value-based learning(价值学习)入门(使用DQN)_第4张图片

  1. 模型做一个预测,这个预测一开始可以是随机的:q=Q(w),即q=1000.(同方法一)
  2. 从NYC开车到途中某处(华盛顿:DC),观测到实际使用了300分钟;此时模型又做一个预测:预测从DC到Atlanta需要600分钟。
  3. 更新预测值:300 + 600 = 900 分钟,这个新的估计成为TD target,记为y=900. 这个值比一开始的纯估计q=1000要更可靠,因为里面包含了300的真实值。越接近Atlanta,TD target就越准确。
  4. 计算最初预测值和TD target的损失函数Loss:L=\frac{1}{2}(q-y)^2.其中最初预测值和TD target之差q-y=1000-900=100称为TD error。模型训练的目的就是使TD error接近0. 
  5. 计算梯度:\frac{\partial L}{\partial w} = \frac{\partial q}{\partial w}\cdot \frac{\partial L}{\partial q}=(q-y)\cdot \frac{\partial Q(w)}{\partial w}=100\cdot \frac{\partial Q(w)}{\partial w}.(链式法则,L是q的函数,q是w的函数)(同方法一)
  6. 梯度下降法更新参数w:w_{t+1}=w_t-\alpha \cdot \frac{\partial L}{\partial w}|_{w=w_t}(同方法一)

TD算法特点:不必等一次完整旅途结束就可以更新模型参数,走一步就能更新一次。用TD算法来训练打游戏的DQN非常合适:不需要打完游戏就能更新DQN参数。

五、用TD算法训练DQN

(一)将TD算法用在DQN中:

 Value-based learning(价值学习)入门(使用DQN)_第5张图片

在估计旅途耗时的例子中,NYC到ATL的总估计时间 约等于 NYC到DC的真实时间 加上 DC到ATL的估计时间。类比到深度强化学习中,Q(s_t,a_t;w) \approx r_t + \gamma \cdot Q(s_{t+1}, a_{t+1}; w)表示:DQN在t时刻做的估计值(期望)约等于 在t时刻观测到的真实奖励 加上 DQN在t+1时刻做的估计值(期望)。

下面解释公式Q(s_t,a_t;w) \approx r_t + \gamma \cdot Q(s_{t+1}, a_{t+1}; w)的来源:

回顾U_t的定义:U_t 是回报 (Return),表示t时刻开始未来执行一组动作后能够获得的奖励之和:

U_t = R_t + \gamma \cdot R_{t+1} + \gamma ^2 \cdot R_{t+2} + \gamma ^3 \cdot R_{t+3} + \gamma ^4 \cdot R_{t+4} + \cdots

从第二项起,拿出公有的\gamma,将公式变为:

U_t = R_t + \gamma \cdot (R_{t+1} + \gamma \cdot R_{t+2} + \gamma ^2 \cdot R_{t+3} + \gamma ^3 \cdot R_{t+4} + \cdots)

根据回报的定义,上式括号里的项共同表示了回报U_{t+1},则公式变为:

相邻两个时刻的折扣回报之间的关系:U_t = R_t + \gamma \cdot U_{t+1}

DQN在t时刻的输出是Q(s_t,a_t;w),这是对回报U_t的期望的近似:Q(s_t,a_t;w) \approx \mathbb{E}[U_t]

DQN在t+1时刻的输出是Q(s_{t+1},a_{t+1};w),这是对回报U_{t+1}的期望的近似 :Q(s_{t+1},a_{t+1};w) \approx \mathbb{E}[U_{t+1}]

因此,Q(s_t,a_t;w) \approx r_t + \gamma \cdot Q(s_{t+1},a_{t+1};w).

约等号左边是DQN的预测,右边是TD target.

(二)用TD算法训练DQN的模型参数

TD算法的一次循环由如下步骤组成,每次循环更新一次模型参数w:

  1. t时刻,观测到当前的状态s_t和做出的动作a_t,DQN做一个预测,即输出一个当前动作的得分:q_t = Q(s_t, a_t; w_t)w_t是当前的模型参数;
  2. t+1时刻,模型观测到了真实奖励r_t,并观测到了一个新的状态s_{t+1},因此可以用DQN算出下一个动作a_{t+1}. 动作a_{t+1}的选择依据是:DQN对每一个动作打分,选得分最高的那个动作为a_{t+1}
  3. 计算TD targety_t = r_t + \gamma \cdot Q(s_{t+1}, a_{t+1}; w_t) ,因为a_{t+1}是得分最高的动作,因此,y_t = r_t + \gamma \cdot max_{a}Q(s_{t+1}, a; w_t).
  4. 计算最初预测值Q(s_t, a_t; w_t)和TD target的损失函数Loss:L_t=\frac{1}{2}(q_t-y_t)^2.
  5. 计算梯度:\frac{\partial L_t}{\partial w} = \frac{\partial q_t}{\partial w}\cdot \frac{\partial L_t}{\partial q_t}=(q_t-y_t)\cdot \frac{\partial Q(w)}{\partial w}|_{w=w_t}. 记d_t = \frac{\partial Q(w)}{\partial w}|_{w=w_t},这个梯度可以用Pytorch自动求。
  6. 梯度下降法更新参数w:w_{t+1}=w_t-\alpha \cdot \frac{\partial L_t}{\partial w}|_{w=w_t} = w_t-\alpha \cdot (q_t - y_t) \cdot d_t.

你可能感兴趣的:(深度学习之路,深度学习,神经网络,机器学习,强化学习)