从奖励到最优决策:动作价值函数与价值学习
从奖励到最优决策:动作价值函数与价值学习
- 价值学习
- 一、动作价值函数
- 对 U t U_t Ut求期望得到动作价值函数
- 动作价值函数的意义
- 最优动作价值函数(Optimal Action-Value Function)
- 如何理解 Q ∗ Q^* Q∗函数
- 二、价值学习的基本思想
- Deep Q-Network(DQN)
- DQN玩游戏的具体流程
- 如何训练DQN——TD算法(Temporal Difference Algorithm,时差算法)
- 三、将TD算法应用到DQN中
价值学习
本文旨在详细介绍价值学习的基本理论与算法,并通过具体示例帮助你理解从动作价值函数到深度Q网络(DQN)的整体流程。
一、动作价值函数
基础概念:
- 奖励 R R R:
agent每作出一个动作,环境都会更新,并且会给出一个奖励 R R R,每一个奖励 R R R都依赖于前一个状态和动作。 - 回报(return) U t U_t Ut:
回报依赖从 T T T时刻开始的所有的动作和所有的状态
U t = R t + γ R t + 1 + γ 2 R t + 2 + γ 3 R t + 3 + ⋯ + γ T − t R T U_t = R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \gamma^3 R_{t+3} + \dots + \gamma^{T-t} R_T Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+⋯+γT−tRT
回报的特点:
- 长期回报:一个状态 s s s的回报 U t U_t Ut,是所有 t t t时刻的奖励的和,所以 U t U_t Ut是一个长期的回报。回报 U t U_t Ut依赖从 T T T时刻开始的所有的动作和所有的状态
- 动作的随机性:动作的随机性,即在状态 s s s下,采取动作 a a a的概率是不确定的。动作的随机性来自策略 π \pi π的抽样。
P [ A = a ∣ S = s ] = π ( a ∣ s ) \mathbb{P}[ A = a | S = s ] = \pi(a | s) P[A=a∣S=s]=π(a∣s)
- 状态的随机性:状态的随机性来自状态转移函数 p p p,新的状态市场函数 p p p中抽样得到的
P [ S = s ′ ∣ S = s , A = a ] = p ( s ′ ∣ s , a ) \mathbb{P}[ S = s' | S = s, A = a ] = p(s' | s, a) P[S=s′∣S=s,A=a]=p(s′∣s,a)
- 总体随机性: 动作和状态都是随机的,因此 U t U_t Ut也是一个随机变量。
对 U t U_t Ut求期望得到动作价值函数
因为回报 U t U_t Ut是一个随机变量,我们要消除它的随机性,只留下 s t s_t st和 a t a_t at两个变量,我们可以对它求期望。所以 U t U_t Ut的期望值可以表示为:
Q π ( s t , a t ) = E [ U t ∣ S t = s t , A t = a t ] Q_\pi(s_t,a_t) = \mathbb{E}[U_t | S_t = s_t, A_t = a_t] Qπ(st,at)=E[Ut∣St=st,At=at]
这样我们就得到动作价值函数(Action-Value Function).
动作价值函数只和策略 π \pi π、当前的状态和动作( s t s_t st和 a t a_t at)有关。
动作价值函数的意义
动作价值函数可以反映出当前状态 s t s_t st下,采取动作 a t a_t at的好坏程度(期望)。
最优动作价值函数(Optimal Action-Value Function)
要想消除策略 π \pi π对动作价值函数的随机性,我们可以定义一个最优动作价值函数(Optimal Action-Value Function),对 Q π Q_\pi Qπ求最大化:
Q ∗ ( s , a ) = m a x π Q π ( s t , a t ) Q^* (s, a) = {max}_\pi Q_\pi (s_t, a_t) Q∗(s,a)=maxπQπ(st,at)
最优动作价值函数是一个最优的动作价值函数,它表示了当前状态 s t s_t st下,采取动作 a t a_t at的最优情况,它与策略 π \pi π无关。要使agent在当前状态 s t s_t st下采取动作 a t a_t at,得到的回报 U t U_t Ut最多就是 Q ∗ ( s t , a t ) Q^* (s_t, a_t) Q∗(st,at)
。
Q ∗ Q^* Q∗函数可以指导agent做决策,它可以为所有的动作打分,并且选择分数最高的作为动作。
如何理解 Q ∗ Q^* Q∗函数
我们可以理解 Q ∗ Q^* Q∗函数,它表示了当前状态 s t s_t st下,采取动作 a t a_t at的平均回报,你可以把它当作一个先知,它可以告诉你每一支股票的期望收益。
二、价值学习的基本思想
虽然 Q ∗ Q^* Q∗函数非常厉害,但是实际上我们并没有 Q ∗ Q^* Q∗函数,我们只能通过学习得到 Q ∗ Q^* Q∗函数。我们可以通过学习一个函数来近似 Q ∗ Q^* Q∗函数。这就是价值学习的基本思想。
Deep Q-Network(DQN)
使用一个深度学习的神经网络来近似 Q ∗ Q^* Q∗函数。
我们可以使用一个函数来代表这个神经网络
Q ( s , a ; W ) → Q ∗ ( s , a ) Q(s,a;W) \rightarrow Q^* (s,a) Q(s,a;W)→Q∗(s,a)
其中:
- W: 神经网络的参数
- s: 神经网络的输入,状态。
- 神经网络的输出是很多数值,这些数值是对每个可能的动作的打分。
举个例子,在超级玛丽中,游戏可以有三个动作,分别是向左,向右,向上。
我们将游戏的一帧通过卷积、特征提取输入到DQN中,然后得到三个动作的打分。
- 向上: 2000
- 向右: 1000
- 向右: 1000
很明显这时我们应该采取的动作是向上。
DQN玩游戏的具体流程
一个使用深度Q网络(DQN)来玩电子游戏的基本流程。流程从当前状态开始,通过选择动作、接收奖励、更新状态,不断循环进行。以下是详细的步骤描述:
-
开始于当前状态:流程从当前状态 S t S_t St 开始。
-
选择动作:在状态 S t S_t St 下,通过最大化Q值函数 Q ( S t , a ; w ) Q(S_t, a; \mathbf{w}) Q(St,a;w) 来选择一个动作 a t a_t at。这里的 w \mathbf{w} w 表示Q值函数的参数。
-
执行动作并观察结果:执行动作 a t a_t at 后,状态转移函数 P P P观察到下一个状态 S t + 1 S_{t+1} St+1 和获得的奖励 r t r_t rt。奖励可以用来更更新参数
-
更新状态:状态更新到 S t + 1 S_{t+1} St+1。
-
重复选择动作:在新的状态 S t + 1 S_{t+1} St+1 下,再次通过最大化Q值函数来选择动作 a t + 1 a_{t+1} at+1。
-
继续循环:这个过程不断重复,即在每个新的状态 S t + 2 , S t + 3 , … S_{t+2}, S_{t+3}, \ldots St+2,St+3,… 下,都通过最大化Q值函数来选择最优动作 a t + 2 , a t + 3 , … a_{t+2}, a_{t+3}, \ldots at+2,at+3,…,并观察到相应的奖励 r t + 1 , r t + 2 , … r_{t+1}, r_{t+2}, \ldots rt+1,rt+2,…。知道游戏结束
-
状态转移:每个状态 S t + 1 , S t + 2 , S t + 3 , … S_{t+1}, S_{t+2}, S_{t+3}, \ldots St+1,St+2,St+3,… 都是根据当前状态和动作,通过概率分布 p ( ⋅ ∣ S t , a t ) p(\cdot | S_t, a_t) p(⋅∣St,at) 来确定的。
这个流程展示了如何通过不断学习和选择最优动作来最大化累积奖励,这是强化学习中DQN算法的核心思想。
如何训练DQN——TD算法(Temporal Difference Algorithm,时差算法)
实际问题类比:
假如我想要从广州坐高铁到西安,我们可以先使用 Q ( W ) Q(W) Q(W)函数进行预测。假设预测值为q = 15小时 ,注意此时模型还在训练,预测的值可能是完全错误的,然后我们实际坐车是y = 10个小时,这样我们就得到一个误差,我们希望这个误差越小越好。
-
得到损失
L o s s = 1 2 ( q − y ) 2 Loss = \frac{1}{2}(q - y)^2 Loss=21(q−y)2 -
梯度
∂ L ∂ w = ∂ L ∂ q ∂ q ∂ w = ( q − y ) ∂ Q ( w ) ∂ w \frac{\partial L}{\partial w} = \frac{\partial L}{\partial q} \frac{\partial q}{\partial w} = (q - y) \frac{\partial Q(w)}{\partial w} ∂w∂L=∂q∂L∂w∂q=(q−y)∂w∂Q(w) -
梯度下降:
w t + 1 = w t − α ∂ L ∂ w ∣ w = w t w_{t+1} = w_t - \alpha \frac{\partial L}{\partial w} |_{w = w_t} wt+1=wt−α∂w∂L∣w=wt
提出问题:上述算法必须完成整个旅途才能对模型做一次更新,假如没有完成全程,如何进行更新:
假如我从广州做到西安,使用 Q ( W ) Q(W) Q(W)函数进行预测。预测值为q = 15小时 ,但是我坐了三个个小时到了武汉,中途下车不去西安,这时我该如何进行更新模型呢?
我到了武汉,还可以使用 Q ( W ) Q(W) Q(W)函数进行预测,预测值为q = 10小时,
- 模型最初的预测: Q ( W ) Q(W) Q(W) = 15小时
- 我们可以使用武汉的时间进行更新模型的预测: Q ( W ) Q(W) Q(W) = 3小时(实际的时间) + 10小时(再进行预测的时间 = 13小时,我们将这个值称为TD target
TD target与最开始预测的q 同样也有一个误差,我们也可以利用这个误差进行更新模型。
TD target : y = 13 y = 13 y=13
Loss : L o s s = 1 2 ( Q ( w ) − y ) 2 Loss = \frac{1}{2}(Q(w) - y)^2 Loss=21(Q(w)−y)2
梯度 ∂ L ∂ w = ( 15 − 13 ) ∂ Q ( w ) ∂ w \frac{\partial L}{\partial w} = (15 - 13) \frac{\partial Q(w)}{\partial w} ∂w∂L=(15−13)∂w∂Q(w)
梯度下降:
w t + 1 = w t − α ∂ L ∂ w ∣ w = w t w_{t+1} = w_t - \alpha \frac{\partial L}{\partial w} |_{w = w_t} wt+1=wt−α∂w∂L∣w=wt
这个算法就是时差算法,它通过不断更新模型来最小化损失函数,从而提高模型的预测性能。
换成是强化学习也是同样的道理,我们不需要完成游戏全程也能更新参数。
并据此更新模型参数。
三、将TD算法应用到DQN中
再上述例子中,我们可以发现有以下的等式;
T 西安 → 广州 ≈ T 西安 → 武汉 + T 武汉 → 广州 T_{西安 \rightarrow{广州}} \approx T_{西安 \rightarrow{武汉}} + T_{武汉 \rightarrow{广州}} T西安→广州≈T西安→武汉+T武汉→广州
其中 T 西安 → 广州 T_{西安 \rightarrow{广州}} T西安→广州是模型预测的, T 西安 → 武汉 T_{西安 \rightarrow{武汉}} T西安→武汉是实际时间, T 武汉 → 广州 T_{武汉 \rightarrow{广州}} T武汉→广州是再进行预测的时间。
那么在深度强化学习中,也应该有一个等式。
Q ( s t , a t ; W ) ≈ R t + γ Q ( s t + 1 , a t + 1 ; W ) Q(s_t,a_t;W) \approx R_t + \gamma Q(s_{t+1},a_{t+1};W) Q(st,at;W)≈Rt+γQ(st+1,at+1;W)
模型的输出 Q ( s t , a t ; W ) Q(s_t,a_t;W) Q(st,at;W)是对回报 E ( U t ) \mathbb{E}(U_t) E(Ut)做出的估计,
模型的输出 Q ( s t + 1 , a t + 1 ; W ) Q(s_{t+1},a_{t+1};W) Q(st+1,at+1;W)是对回报 E ( U t + 1 ) \mathbb{E}(U_{t+1}) E(Ut+1)做出的估计,
所以:
Q ( s t , a t ; W ) ≈ E ( R t + γ Q ( s t + 1 , a t + 1 ; W ) ) Q(s_t,a_t;W) \approx \mathbb{E}(R_t + \gamma Q(s_{t+1},a_{t+1};W)) Q(st,at;W)≈E(Rt+γQ(st+1,at+1;W))
更新过程:
- 开始的预测 Prediction: Q ( S t , a t ; w t ) Q(S_t, a_t; \mathbf{w}_t) Q(St,at;wt).
- TD target:
y t = r t + γ ⋅ Q ( S t + 1 , a t 1 + ; w t ) = r t + γ ⋅ max a Q ( S t + 1 , a ; w t ) . y_t = r_t + \gamma \cdot Q(S_{t+1}, a_{t1+}; \mathbf{w}_t) = r_t + \gamma \cdot \max_a Q(S_{t+1}, a; \mathbf{w}_t). yt=rt+γ⋅Q(St+1,at1+;wt)=rt+γ⋅amaxQ(St+1,a;wt). - Loss: L t = 1 2 [ Q ( S t , a t ; w ) − y t ] 2 L_t = \frac{1}{2} [Q(S_t, a_t; \mathbf{w}) - y_t]^2 Lt=21[Q(St,at;w)−yt]2.
- 梯度更新Gradient descent: w t + 1 = w t − α ⋅ ∂ L t ∂ w ∣ w = w t \mathbf{w}_{t+1} = \mathbf{w}_t - \alpha \cdot \frac{\partial L_t}{\partial \mathbf{w}} \big|_{\mathbf{w}=\mathbf{w}_t} wt+1=wt−α⋅∂w∂Lt w=wt.
通过这种方式,TD算法能够逐步减小预测误差,进而提高模型的预测性能,并帮助智能体在不断更新中趋向最优策略。