REINFORCE: Monte Carlo Policy Gradient

Policy Gradient and From On-policy to Off-policy

蒙特卡洛可以理解为算法完成一个 episode 之后,再拿这个 episode 的数据来去 learn 一下,做一次更新。因为我们已经拿到了一整个 episode 的数据的话,也能够拿到每一个 step 的 reward,我们可以很方便地去计算每个 step 的未来总收益,就是我们的期望,就是我们的回报 G t G_t Gt G t G_t Gt 是我们的未来总收益, G t G_t Gt 代表是从这个 step 后面,我能拿到的收益之和是多少。 G 1 G_1 G1是说我从第一步开始,往后能够拿到多少的收益。 G 2 G_2 G2 是说从第二步开始,往后一共能够拿到多少的收益。

相比蒙特卡洛还是一个 episode 更新一次这样子的方式,时序差分就是每个 step 都更新一下。每走一步,我就更新下,这样的更新频率会更高一点。它拿的是 Q-function 来去近似地表示我的未来总收益 G t G_t Gt

举个例子来解释时序差分强化学习和蒙特卡洛强化学习的区别,

  • 时序差分强化学习是指在不清楚马尔可夫状态转移概率的情况下,以采样的方式得到不完整的状态序列,估计某状态在该状态序列完整后可能得到的收益,并通过不断地采样持续更新价值。
  • 蒙特卡洛强化学习则需要经历完整的状态序列后,再来更新状态的真实价值。

例如,你想获得开车去公司的时间,每天上班开车的经历就是一次采样。假设今天在路口 A 遇到了堵车,

  • 时序差分强化学习会在路口 A 就开始更新预计到达路口 B、路口 C ⋯ ⋯ \cdots \cdots , 以及到达公司的时间;
  • 而蒙特卡洛强化学习并不会立即更新时间,而是在到达公司后,再修改到达每个路口和公司的时间。

时序差分强化学习能够在知道结果之前就开始学习,相比蒙特卡洛强化学习,其更快速、灵活。

Policy Gradient and From On-policy to Off-policy

我们介绍下策略梯度最简单的也是最经典的一个算法 REINFORCE。REINFORCE 用的是回合更新的方式。它在代码上的处理上是先拿到每个 step 的 reward,然后计算每个 step 的未来总收益 G t G_t Gt 是多少,然后拿每个 G t G_t Gt 代入公式,去优化每一个 action 的输出。所以编写代码时会有这样一个函数,输入每个 step 拿到的 reward,把这些 reward 转成每一个 step 的未来总收益。因为未来总收益是这样计算的:
G t = ∑ k = t + 1 T γ k − t − 1 r k = r t + 1 + γ G t + 1 \begin{aligned} G_{t} &=\sum_{k=t+1}^{T} \gamma^{k-t-1} r_{k} \\ &=r_{t+1}+\gamma G_{t+1} \end{aligned} Gt=k=t+1Tγkt1rk=rt+1+γGt+1
上一个 step 和下一个 step 的未来总收益可以有这样子的一个关系。所以在代码的计算上,我们就是从后往前推,一步一步地往前推,先算 G T G_T GT,然后往前推,一直算到 G 1 G_1 G1

Policy Gradient and From On-policy to Off-policy

REINFORCE 的伪代码主要看最后四行,先产生一个 episode 的数据,比如 ( s 1 , a 1 , G 1 ) , ( s 2 , a 2 , G 2 ) , ⋯   , ( s T , a T , G T ) (s_1,a_1,G_1),(s_2,a_2,G_2),\cdots,(s_T,a_T,G_T) (s1,a1,G1),(s2,a2,G2),,(sT,aT,GT)。然后针对每个 action 来计算梯度。 在代码上计算时,我们要拿到神经网络的输出。神经网络会输出每个 action 对应的概率值,然后我们还可以拿到实际的 action,把它转成 one-hot 向量乘一下,我们可以拿到 ln ⁡ π ( A t ∣ S t , θ ) \ln \pi(A_t|S_t,\theta) lnπ(AtSt,θ)
Policy Gradient and From On-policy to Off-policy

手写数字识别是一个经典的多分类问题,就是输入一张手写数字的图片,经过神经网络输出的是各个分类的一个概率。目的是希望输出的这个概率的分布尽可能地去贴近真实值的概率分布。因为真实值只有一个数字 9,你用这个 one-hot 向量的形式去给它编码的话,也可以把这个真实值理解为一个概率分布,9 的概率就是1,其他的概率就是 0。神经的网络输出一开始可能会比较平均,通过不断地迭代,训练优化之后,我会希望 9 输出的概率可以远高于其他数字输出的概率。
Policy Gradient and From On-policy to Off-policy

如上图所示,就是提高 9 对应的概率,降低其他数字对应的概率,让神经网络输出的概率能够更贴近这个真实值的概率分布。我们可以用交叉熵(Cross Entropy)来去表示两个概率分布之间的差距。

Policy Gradient and From On-policy to Off-policy

我们看一下它的优化流程,就是怎么让这个输出去逼近这个真实值。它的优化流程就是将图片作为输入传给神经网络,神经网络会判断这个图片属于哪一类数字,输出所有数字可能的概率,然后再计算这个交叉熵,就是神经网络的输出 Y i Y_i Yi 和真实的标签值 Y i ′ Y_i' Yi 之间的距离 − ∑ Y i ′ ⋅ log ⁡ ( Y i ) -\sum Y_{i}^{\prime} \cdot \log \left(Y_{i}\right) Yilog(Yi)。我们希望尽可能地缩小这两个概率分布之间的差距,计算出来的 cross entropy 可以作为这个 loss 函数传给神经网络里面的优化器去优化,去自动去做神经网络的参数更新。

Policy Gradient and From On-policy to Off-policy

类似地,policy gradient 预测每一个状态下面应该要输出的这个行动的概率,就是输入状态 s t s_t st,然后输出动作的概率,比如 0.02,0.08,0.09。实际上输出给环境的动作是随机选了一个 action,比如说我选了右这个 action,它的 one-hot 向量就是 0,0,1。我们把神经网络的输出和实际动作带入 cross entropy 的公式就可以求出输出的概率和实际的动作之间的差距。但这个实际的动作 a t a_t at 只是我们输出的真实的 action,它并不一定是正确的 action,它不能像手写数字识别一样作为一个正确的标签来去指导神经网络朝着正确的方向去更新,所以我们在这里会需要乘以一个奖励回报 G t G_t Gt。这个奖励回报相当于是对这个真实 action 的评价, G t G_t Gt 具体越大,未来总收益越大,说明当前输出的这个真实的 action 就越好,这个 loss 就越需要重视。如果 G t G_t Gt 越小,那就说明做这个 action a t a_t at 并没有那么的好,loss 的权重就要小一点,优化力度就小一点。通过这个和那个手写输入识别的一个对比,我们就知道为什么 loss 会构造成这个样子。

Policy Gradient and From On-policy to Off-policy

实际上我们在计算这个 loss 的时候,我们要拿到那个 ln ⁡ π ( A t ∣ S t , θ ) \ln \pi(A_t|S_t,\theta) lnπ(AtSt,θ)。我就拿我实际执行的这个动作,先取个 one-hot 向量,然后再拿到神经网络预测的动作概率,这两个一相乘,我就可以拿到算法里面的那个 ln ⁡ π ( A t ∣ S t , θ ) \ln \pi(A_t|S_t,\theta) lnπ(AtSt,θ)。这个就是我们要构造的 loss。因为我们会拿到整个 episode 的所有的轨迹,所以我们可以对这一条整条轨迹里面的每个 action 都去计算一个 loss。把所有的 loss 加起来之后,我们再扔给那个 adam 的优化器去自动更新参数就好了。

Policy Gradient and From On-policy to Off-policy

上图是 REINFORCE 的流程图。首先我们需要一个 policy model 来输出动作概率,输出动作概率后,我们用 sample 函数去得到一个具体的动作,然后跟环境交互过后,我们可以得到一整个 episode 的数据。拿到 episode 数据之后,我再去执行一下 learn() 函数,在 learn() 函数里面,我就可以拿这些数据去构造 loss function,扔给这个优化器去优化,去更新我的 policy model

From On-policy to Off-policy

在讲 PPO 之前,我们先讲一下 on-policy 和 off-policy 这两种 training 方法的区别。
在 reinforcement learning 里面,我们要 learn 的就是一个 agent。

  • 如果要 learn 的 agent 跟和环境互动的 agent 是同一个的话, 这个叫做on-policy(同策略)
  • 如果要 learn 的 agent 跟和环境互动的 agent 不是同一个的话, 那这个叫做off-policy(异策略)

比较拟人化的讲法是如果要学习的那个 agent,一边跟环境互动,一边做学习这个叫 on-policy。 如果它在旁边看别人玩,通过看别人玩来学习的话,这个叫做 off-policy。

为什么我们会想要考虑 off-policy ?让我们来想想 policy gradient。Policy gradient 是 on-policy 的做法,因为在做 policy gradient 时,我们需要有一个 agent、一个 policy 和一个 actor。这个 actor 先去跟环境互动去搜集资料,搜集很多的 τ \tau τ,根据它搜集到的资料,会按照 policy gradient 的式子去 update policy 的参数。所以 policy gradient 是一个 on-policy 的 algorithm。

Policy Gradient and From On-policy to Off-policy

PPO 是 policy gradient 的一个变形,它是现在 OpenAI 默认的 reinforcement learning 的 algorithm。

∇ R ˉ θ = E τ ∼ p θ ( τ ) [ R ( τ ) ∇ log ⁡ p θ ( τ ) ] \nabla \bar{R}_{\theta}=E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] Rˉθ=Eτpθ(τ)[R(τ)logpθ(τ)]

问题是上面这个 update 的式子中的 E τ ∼ p θ ( τ ) E_{\tau \sim p_{\theta}(\tau)} Eτpθ(τ) 应该是你现在的 policy θ \theta θ 所 sample 出来的 trajectory τ \tau τ 做 expectation。一旦 update 了参数,从 θ \theta θ 变成 θ ′ \theta' θ p θ ( τ ) p_\theta(\tau) pθ(τ)这个概率就不对了,之前 sample 出来的 data 就变的不能用了。所以 policy gradient 是一个会花很多时间来 sample data 的 algorithm,你会发现大多数时间都在 sample data,agent 去跟环境做互动以后,接下来就要 update 参数。你只能 update 参数一次。接下来你就要重新再去 collect data, 然后才能再次update 参数。

这显然是非常花时间的,所以我们想要从 on-policy 变成 off-policy。 这样做就可以用另外一个 policy, 另外一个 actor θ ′ \theta' θ 去跟环境做互动。用 θ ′ \theta' θ collect 到的 data 去训练 θ \theta θ。假设我们可以用 θ ′ \theta' θ collect 到的 data 去训练 θ \theta θ,意味着说我们可以把 θ ′ \theta' θ collect 到的 data 用非常多次,我们可以执行 gradient ascent 好几次,我们可以 update 参数好几次, 都只要用同一笔 data 就好了。因为假设 θ \theta θ 有能力学习另外一个 actor θ ′ \theta' θ 所 sample 出来的 data 的话, 那 θ ′ \theta' θ 就只要 sample 一次,也许 sample 多一点的 data, 让 θ \theta θ 去 update 很多次,这样就会比较有效率。

Importance Sampling

Policy Gradient and From On-policy to Off-policy

具体怎么做呢?这边就需要介绍 importance sampling 的概念。假设你有一个 function f ( x ) f(x) f(x),你要计算从 p 这个 distribution sample x x x,再把 x x x 带到 f f f 里面,得到 f ( x ) f(x) f(x)。你要该怎么计算这个 f ( x ) f(x) f(x) 的期望值?假设你不能对 p 这个distribution 做积分的话,那你可以从 p 这个 distribution 去 sample 一些 data x i x^i xi。把 x i x^i xi 代到 f ( x ) f(x) f(x) 里面,然后取它的平均值,就可以近似 f ( x ) f(x) f(x) 的期望值。

现在有另外一个问题,我们没有办法从 p 这个 distribution 里面 sample data。假设我们不能从 p sample data,只能从另外一个 distribution q 去 sample data,q 可以是任何 distribution。我们不能够从 p 去 sample data,但可以从 q 去 sample x x x。我们从 q 去 sample x i x^i xi 的话就不能直接套下面的式子。
E x ∼ p [ f ( x ) ] ≈ 1 N ∑ i = 1 N f ( x i ) E_{x \sim p}[f(x)] \approx \frac{1}{N} \sum_{i=1}^N f(x^i) Exp[f(x)]N1i=1Nf(xi)
因为上式是假设你的 x x x 都是从 p sample 出来的。所以做一个修正,修正是这样子的。期望值 E x ∼ p [ f ( x ) ] E_{x \sim p}[f(x)] Exp[f(x)]其实就是 ∫ f ( x ) p ( x ) d x \int f(x) p(x) dx f(x)p(x)dx,我们对其做如下的变换:
∫ f ( x ) p ( x ) d x = ∫ f ( x ) p ( x ) q ( x ) q ( x ) d x = E x ∼ q [ f ( x ) p ( x ) q ( x ) ] \int f(x) p(x) d x=\int f(x) \frac{p(x)}{q(x)} q(x) d x=E_{x \sim q}[f(x){\frac{p(x)}{q(x)}}] f(x)p(x)dx=f(x)q(x)p(x)q(x)dx=Exq[f(x)q(x)p(x)]
我们就可以写成对 q 里面所 sample 出来的 x 取期望值。我们从 q 里面 sample x,然后再去计算 f ( x ) p ( x ) q ( x ) f(x) \frac{p(x)}{q(x)} f(x)q(x)p(x),再去取期望值。所以就算我们不能从 p 里面去 sample data,只要能够从 q 里面去 sample data,然后代入上式,你就可以计算从 p 这个 distribution sample x x x 代入 f f f 以后所算出来的期望值。

这边是从 q 做 sample,所以从 q 里 sample 出来的每一笔 data,你需要乘上一个 weight 来修正这两个 distribution 的差异,weight 就是 p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x) q ( x ) q(x) q(x) 可以是任何 distribution,唯一的限制就是 q ( x ) q(x) q(x) 的概率是 0 的时候, p ( x ) p(x) p(x) 的概率不为 0,不然这样会没有定义。假设 q ( x ) q(x) q(x) 的概率是 0 的时候, p ( x ) p(x) p(x) 的概率也都是 0 的话,那这样 p ( x ) p(x) p(x) 除以 q ( x ) q(x) q(x)是有定义的。所以这个时候你就可以 apply importance sampling 这个技巧。你就可以从 p 做 sample 换成从 q 做 sample。

Policy Gradient and From On-policy to Off-policy

Importance sampling 有一些 issue。虽然理论上你可以把 p 换成任何的 q。但是在实现上, p 和 q 不能差太多。差太多的话,会有一些问题。什么样的问题呢?

E x ∼ p [ f ( x ) ] = E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x \sim p}[f(x)]=E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] Exp[f(x)]=Exq[f(x)q(x)p(x)]
虽然上式成立。但上式左边是 f ( x ) f(x) f(x) 的期望值,它的 distribution 是 p,上式右边是 f ( x ) p ( x ) q ( x ) f(x) \frac{p(x)}{q(x)} f(x)q(x)p(x) 的期望值,它的 distribution 是 q。如果不是算期望值,而是算 variance 的话。这两个 variance 是不一样的。两个 random variable 的 mean 一样,并不代表它的 variance 一样。

我们可以代一下方差的公式:
Var ⁡ x ∼ p [ f ( x ) ] = E x ∼ p [ f ( x ) 2 ] − ( E x ∼ p [ f ( x ) ] ) 2 \operatorname{Var}_{x \sim p}[f(x)]=E_{x \sim p}\left[f(x)^{2}\right]-\left(E_{x \sim p}[f(x)]\right)^{2} Varxp[f(x)]=Exp[f(x)2](Exp[f(x)])2

Var ⁡ x ∼ q [ f ( x ) p ( x ) q ( x ) ] = E x ∼ q [ ( f ( x ) p ( x ) q ( x ) ) 2 ] − ( E x ∼ q [ f ( x ) p ( x ) q ( x ) ] ) 2 = E x ∼ p [ f ( x ) 2 p ( x ) q ( x ) ] − ( E x ∼ p [ f ( x ) ] ) 2 \begin{aligned} \operatorname{Var}_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] &=E_{x \sim q}\left[\left(f(x) \frac{p(x)}{q(x)}\right)^{2}\right]-\left(E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]\right)^{2} \\ &=E_{x \sim p}\left[f(x)^{2} \frac{p(x)}{q(x)}\right]-\left(E_{x \sim p}[f(x)]\right)^{2} \end{aligned} Varxq[f(x)q(x)p(x)]=Exq[(f(x)q(x)p(x))2](Exq[f(x)q(x)p(x)])2=Exp[f(x)2q(x)p(x)](Exp[f(x)])2

Var ⁡ x ∼ p [ f ( x ) ] \operatorname{Var}_{x \sim p}[f(x)] Varxp[f(x)] Var ⁡ x ∼ q [ f ( x ) p ( x ) q ( x ) ] \operatorname{Var}_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] Varxq[f(x)q(x)p(x)] 的差别在第一项是不同的, Var ⁡ x ∼ q [ f ( x ) p ( x ) q ( x ) ] \operatorname{Var}_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] Varxq[f(x)q(x)p(x)] 的第一项多乘了 p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x),如果 p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x) 差距很大的话, Var ⁡ x ∼ q [ f ( x ) p ( x ) q ( x ) ] \operatorname{Var}_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] Varxq[f(x)q(x)p(x)]的 variance 就会很大。所以虽然理论上它们的 expectation 一样,也就是说,你只要对 p 这个 distribution sample 够多次,q 这个 distribution sample 够多,你得到的结果会是一样的。但是假设你 sample 的次数不够多,因为它们的 variance 差距是很大的,所以你就有可能得到非常大的差别。

Policy Gradient and From On-policy to Off-policy

举个例子,当 p ( x ) p(x) p(x) q ( x ) q(x) q(x) 差距很大的时候,会发生什么样的问题。假设蓝线是 p ( x ) p(x) p(x) 的distribution,绿线是 q ( x ) q(x) q(x) 的 distribution,红线是 f ( x ) f(x) f(x)。如果我们要计算 f ( x ) f(x) f(x)的期望值,从 p ( x ) p(x) p(x) 这个 distribution 做 sample 的话,那显然 E x ∼ p [ f ( x ) ] E_{x \sim p}[f(x)] Exp[f(x)] 是负的,因为左边那块区域 p ( x ) p(x) p(x) 的概率很高,所以要 sample 的话,都会 sample 到这个地方,而 f ( x ) f(x) f(x) 在这个区域是负的, 所以理论上这一项算出来会是负。

接下来我们改成从 q ( x ) q(x) q(x) 这边做 sample,因为 q ( x ) q(x) q(x) 在右边这边的概率比较高,所以如果你 sample 的点不够的话,那你可能都只 sample 到右侧。如果你都只 sample 到右侧的话,你会发现说,算 E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] Exq[f(x)q(x)p(x)]这一项,搞不好还应该是正的。你这边 sample 到这些点,然后你去计算它们的 f ( x ) p ( x ) q ( x ) f(x) \frac{p(x)}{q(x)} f(x)q(x)p(x) 都是正的,所以你 sample 到这些点都是正的。 你取期望值以后,也都是正的。为什么会这样,因为你 sample 的次数不够多,因为假设你 sample 次数很少,你只能 sample 到右边这边。左边这边虽然概率很低,但也不是没有可能被 sample 到。假设你今天好不容易 sample 到左边的点,因为左边的点, p ( x ) p(x) p(x) q ( x ) q(x) q(x) 是差很多的, 这边 p ( x ) p(x) p(x) 很小, q ( x ) q(x) q(x) 很大。今天 f ( x ) f(x) f(x) 好不容易终于 sample 到一个负的,这个负的就会被乘上一个非常大的 weight ,这样就可以平衡掉刚才那边一直 sample 到 positive 的 value 的情况。最终你算出这一项的期望值,终究还是负的。但前提是你要 sample 够多次,这件事情才会发生。但有可能 sample 不够, E x ∼ p [ f ( x ) ] E_{x \sim p}[f(x)] Exp[f(x)] E x ∼ q [ f ( x ) p ( x ) q ( x ) ] E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right] Exq[f(x)q(x)p(x)] 就有可能有很大的差距。这就是 importance sampling 的问题。

Policy Gradient and From On-policy to Off-policy

现在要做的事情就是把 importance sampling 用在 off-policy 的 case。把 on-policy training 的 algorithm 改成 off-policy training 的 algorithm。怎么改呢,之前我们是拿 θ \theta θ 这个 policy 去跟环境做互动,sample 出 trajectory τ \tau τ,然后计算 R ( τ ) ∇ log ⁡ p θ ( τ ) R(\tau) \nabla \log p_{\theta}(\tau) R(τ)logpθ(τ)

现在我们不用 θ \theta θ 去跟环境做互动,假设有另外一个 policy θ ′ \theta' θ,它就是另外一个actor。它的工作是他要去做demonstration, θ ′ \theta' θ 的工作是要去示范给 θ \theta θ 看。它去跟环境做互动,告诉 θ \theta θ 说,它跟环境做互动会发生什么事。然后,借此来训练 θ \theta θ。我们要训练的是 θ \theta θ θ ′ \theta' θ 只是负责做 demo,负责跟环境做互动。

我们现在的 τ \tau τ 是从 θ ′ \theta' θ sample 出来的,是拿 θ ′ \theta' θ 去跟环境做互动。所以 sample 出来的 τ \tau τ 是从 θ ′ \theta' θ sample 出来的,这两个distribution 不一样。但没有关系,假设你本来是从 p 做 sample,但你发现你不能够从 p 做sample,所以我们不拿 θ \theta θ 去跟环境做互动。你可以把 p 换 q,然后在后面这边补上一个 importance weight。现在的状况就是一样,把 θ \theta θ 换成 θ ′ \theta' θ 后,要补上一个 importance weight p θ ( τ ) p θ ′ ( τ ) \frac{p_{\theta}(\tau)}{p_{\theta^{\prime}}(\tau)} pθ(τ)pθ(τ)。这个 importance weight 就是某一个 trajectory τ \tau τ θ \theta θ 算出来的概率除以这个 trajectory τ \tau τ,用 θ ′ \theta' θ 算出来的概率。这一项是很重要的,因为今天你要 learn 的是 actor θ \theta θ θ ′ \theta' θ 是不太一样的。 θ ′ \theta' θ 会见到的情形跟 θ \theta θ 见到的情形不见得是一样的,所以中间要做一个修正的项。

Q: 现在的 data 是从 θ ′ \theta' θ sample 出来的,从 θ \theta θ 换成 θ ′ \theta' θ 有什么好处呢?

A: 因为现在跟环境做互动是 θ ′ \theta' θ 而不是 θ \theta θ。所以 sample 出来的东西跟 θ \theta θ 本身是没有关系的。所以你就可以让 θ ′ \theta' θ 做互动 sample 一大堆的 data, θ \theta θ 可以 update 参数很多次,一直到 θ \theta θ train 到一定的程度,update 很多次以后, θ ′ \theta' θ 再重新去做 sample,这就是 on-policy 换成 off-policy 的妙用。

Policy Gradient and From On-policy to Off-policy

实际在做 policy gradient 的时候,我们并不是给整个 trajectory τ \tau τ 都一样的分数,而是每一个 state-action 的 pair 会分开来计算。实际上 update gradient 的时候,我们的式子是长这样子的。
= E ( s t , a t ) ∼ π θ [ A θ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta}}\left[A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] =E(st,at)πθ[Aθ(st,at)logpθ(atnstn)]

我们用 θ \theta θ 这个 actor 去 sample 出 s t s_t st a t a_t at,sample 出 state 跟 action 的 pair,我们会计算这个 state 跟 action pair 它的 advantage, 就是它有多好。 A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at) 就是 accumulated reward 减掉 bias,这一项就是估测出来的。它要估测的是,在 state s t s_t st 采取 action a t a_t at 是好的,还是不好的。那接下来后面会乘上 ∇ log ⁡ p θ ( a t n ∣ s t n ) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right) logpθ(atnstn),也就是说如果 A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at) 是正的,就要增加概率, 如果是负的,就要减少概率。

那现在用了 importance sampling 的技术把 on-policy 变成 off-policy,就从 θ \theta θ 变成 θ ′ \theta' θ。所以现在 s t s_t st a t a_t at θ ′ \theta' θ ,另外一个actor 跟环境互动以后所 sample 到的 data。 但是拿来训练要调整参数是 model θ \theta θ。因为 θ ′ \theta' θ θ \theta θ 是不同的 model,所以你要做一个修正的项。这项修正的项,就是用 importance sampling 的技术,把 s t s_t st a t a_t at θ \theta θ sample 出来的概率除掉 s t s_t st a t a_t at θ ′ \theta' θ sample 出来的概率。

= E ( s t , a t ) ∼ π θ ′ [ P θ ( s t , a t ) P θ ′ ( s t , a t ) A θ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{P_{\theta}\left(s_{t}, a_{t}\right)}{P_{\theta^{\prime}}\left(s_{t}, a_{t}\right)} A^{\theta}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] =E(st,at)πθ[Pθ(st,at)Pθ(st,at)Aθ(st,at)logpθ(atnstn)]

这边 A θ ( s t , a t ) A^{\theta}(s_t,a_t) Aθ(st,at) 有一个上标 θ \theta θ θ \theta θ 代表说这个是 actor θ \theta θ 跟环境互动的时候所计算出来的 A。但是实际上从 θ \theta θ 换到 θ ′ \theta' θ 的时候, A θ ( s t , a t ) A^{\theta}(s_t,a_t) Aθ(st,at) 应该改成 A θ ′ ( s t , a t ) A^{\theta'}(s_t,a_t) Aθ(st,at),为什么?A 这一项是想要估测说现在在某一个 state 采取某一个 action,接下来会得到 accumulated reward 的值减掉 base line 。你怎么估 A 这一项,你就会看在 state s t s_t st,采取 action a t a_t at,接下来会得到的 reward 的总和,再减掉 baseline。之前是 θ \theta θ 在跟环境做互动,所以你观察到的是 θ \theta θ 可以得到的 reward。但现在是 θ ′ \theta' θ 在跟环境做互动,所以你得到的这个 advantage, 其实是根据 θ ′ \theta' θ 所 estimate 出来的 advantage。但我们现在先不要管那么多, 我们就假设这两项可能是差不多的。

那接下来,我们可以拆解 p θ ( s t , a t ) p_{\theta}\left(s_{t}, a_{t}\right) pθ(st,at) p θ ′ ( s t , a t ) p_{\theta'}\left(s_{t}, a_{t}\right) pθ(st,at),即
p θ ( s t , a t ) = p θ ( a t ∣ s t ) p θ ( s t ) p θ ′ ( s t , a t ) = p θ ′ ( a t ∣ s t ) p θ ′ ( s t ) \begin{aligned} p_{\theta}\left(s_{t}, a_{t}\right)&=p_{\theta}\left(a_{t}|s_{t}\right) p_{\theta}(s_t) \\ p_{\theta'}\left(s_{t}, a_{t}\right)&=p_{\theta'}\left(a_{t}|s_{t}\right) p_{\theta'}(s_t) \end{aligned} pθ(st,at)pθ(st,at)=pθ(atst)pθ(st)=pθ(atst)pθ(st)
于是我们得到下式:
= E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) p θ ( s t ) p θ ′ ( s t ) A θ ′ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} \frac{p_{\theta}\left(s_{t}\right)}{p_{\theta^{\prime}}\left(s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] =E(st,at)πθ[pθ(atst)pθ(atst)pθ(st)pθ(st)Aθ(st,at)logpθ(atnstn)]

然后这边需要做一件事情是,假设 model 是 θ \theta θ 的时候,你看到 s t s_t st 的概率,跟 model 是 θ ′ \theta' θ 的时候,你看到 s t s_t st 的概率是差不多的,即 p θ ( s t ) = p θ ′ ( s t ) p_{\theta}(s_t)=p_{\theta'}(s_t) pθ(st)=pθ(st)。因为它们是一样的,所以你可以把它删掉,即
= E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ] (1) =E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] \tag{1} =E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)logpθ(atnstn)](1)

为什么可以假设它是差不多的。举例来说,会看到什么 state 往往跟你会采取什么样的action 是没有太大的关系的。比如说你玩不同的 Atari 的游戏,其实你看到的游戏画面都是差不多的,所以也许不同的 θ \theta θ s t s_t st 是没有影响的。但是有一个更直觉的理由就是这一项到时候真的要你算,你会算吗?因为想想看这项要怎么算,这一项你还要说我有一个参数 θ \theta θ,然后拿 θ \theta θ 去跟环境做互动,算 s t s_t st 出现的概率,这个你根本很难算。尤其是你如果 input 是image 的话, 同样的 s t s_t st 根本就不会出现第二次。你根本没有办法估这一项, 所以干脆就无视这个问题。

但是 p θ ( a t ∣ s t ) p_{\theta}(a_t|s_t) pθ(atst)很好算。你手上有 θ \theta θ 这个参数,它就是个 network。你就把 s t s_t st 带进去, s t s_t st 就是游戏画面,你把游戏画面带进去,它就会告诉你某一个 state 的 a t a_t at 概率是多少。我们其实有个 policy 的 network,把 s t s_t st 带进去,它会告诉我们每一个 a t a_t at 的概率是多少。所以 p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} pθ(atst)pθ(atst) 这一项,你只要知道 θ \theta θ θ ′ \theta' θ 的参数就可以算。

现在我们得到一个新的 objective function。

J θ ′ ( θ ) = E ( s t , a t ) ∼ π θ ′ [ p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) A θ ′ ( s t , a t ) ] J^{\theta^{\prime}}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} A^{\theta^{\prime}}\left(s_{t}, a_{t}\right)\right] Jθ(θ)=E(st,at)πθ[pθ(atst)pθ(atst)Aθ(st,at)]

式(1)是 gradient,其实我们可以从 gradient 去反推原来的 objective function。这边有一个公式

∇ f ( x ) = f ( x ) ∇ log ⁡ f ( x ) \nabla f(x)=f(x) \nabla \log f(x) f(x)=f(x)logf(x)

我们可以用这个公式来反推 objective function,要注意一点,对 θ \theta θ 求梯度时, p θ ′ ( a t ∣ s t ) p_{\theta^{\prime}}(a_{t} | s_{t}) pθ(atst) A θ ′ ( s t , a t ) A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) Aθ(st,at) 都是常数。

所以实际上,当我们 apply importance sampling 的时候,要去 optimize 的那一个 objective function 就长这样子,我们把它写作 J θ ′ ( θ ) J^{\theta^{\prime}}(\theta) Jθ(θ)。为什么写成 J θ ′ ( θ ) J^{\theta^{\prime}}(\theta) Jθ(θ) 呢,这个括号里面那个 θ \theta θ 代表我们要去 optimize 的那个参数。 θ ′ \theta' θ 是说我们拿 θ ′ \theta' θ 去做 demonstration,就是现在真正在跟环境互动的是 θ ′ \theta' θ。因为 θ \theta θ 不跟环境做互动,是 θ ′ \theta' θ 在跟环境互动。

然后你用 θ ′ \theta' θ 去跟环境做互动,sample 出 s t s_t st a t a_t at 以后,你要去计算 s t s_t st a t a_t at 的 advantage,然后你再去把它乘上 p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} pθ(atst)pθ(atst) p θ ( a t ∣ s t ) p θ ′ ( a t ∣ s t ) \frac{p_{\theta}\left(a_{t} | s_{t}\right)}{p_{\theta^{\prime}}\left(a_{t} | s_{t}\right)} pθ(atst)pθ(atst) 是好算的, A θ ′ ( s t , a t ) A^{\theta^{\prime}}\left(s_{t}, a_{t}\right) Aθ(st,at) 可以从这个 sample 的结果里面去估测出来的,所以 J θ ′ ( θ ) J^{\theta^{\prime}}(\theta) Jθ(θ) 是可以算的。实际上在 update 参数的时候,就是按照式(1) 来 update 参数。

相关文章: