记策略 π 的状态值函数为 Vπ(st) ,它表示在状态 st 下带来的累积奖励 Gt 的期望,具体公式为:
有两种做法:
其实,目前来看,使用TD的方法是比较常见的,MC方法现在比较少用。
举个例子说明蒙特卡洛方法和时序差分方法的区别:
对于给定的actor π, 在状态s采取行动a预计能够得到的累计收益
Q-function 有两种写法:
什么叫做better?
不管在哪个state,用π’跟环境做交互得到的expected reward一定大于π。
证明:
怎么找这个π’?
π’是根据Q-function推出来的。上式的右边要求arg max ,如果这里的动作是离散的,可以一个个带进去看谁的Q大就行,但是如果动作是连续的,这里求解arg max就会有问题。
Q-learning:
下式是我们熟悉的TD方法:
所以最简单的想法就是固定一个网络,这里固定的是上式右边的网络,在训练的过程中我们只更新左边的网络参数,而不更新右边的target网络的参数,这样就变成了一个回归问题。我们希望魔性的输出与目标值越接近越好,通常就会采取最小化二者的MSE(mean square error)
在实现的时候,你会把左边的 Q-network update 好几次以后,再去用 update 过的 Q-network 替换这个 target network 。但它们两个不要一起动,它们两个一起动的话,结果会很容易坏掉。一开始这两个 network 是一样的,然后在 train 的时候,你会把右边的 Q-network fix 住。你在做 gradient decent 的时候,只调左边这个 network 的参数,那你可能update 100 次以后才把这个参数复制到右边的 network 去,把它盖过去。把它盖过去以后,你这个 target value 就变了。就好像说你本来在做一个regression problem,那你 train 后把这个 regression problem 的 loss 压下去以后,接下来你把这边的参数把它 copy 过去以后,你的 target 就变掉了,接下来就要重新再
train。
Experience Replay 会构建一个 Replay Buffer(Replay Memory)。有一个policy π 去跟环境做互动,在这个过程中收集数据,把收集到的每一条数据放进Replay Buffer里,记录着在state st,采取某个action at,得到了reward rt,然后跳到了state st+1。
注意: replay buffer 里面的 experience 可能是来自于不同的 policy。因为每次拿π去跟环境做互动的时候,,你可能只互动 10000 次,然后接下来你就更新你的π了。但是这个 buffer 里面可以放 5 万笔资料,所以 5 万笔资料可能是来自于不同的 policy。Buffer 只有在它装满的时候,才会把旧的资料丢掉。所以这个 buffer 里面它其实装了很多不同的 policy 的 experiences。
这是一个 off=policy 的做法。因为本来我们的 Q 是要观察 π 的 experience,但实际上存在你的 replay buffer 里面的这些 experiences 不是通通来自于 π ,有些是过去其他的 π 所遗留下来的 experience。因为你不会拿某一个 π 就把整个 buffer 装满,然后拿去测 Q-function,这个 π 只是 sample 一些data 塞到那个 buffer 里面去,然后接下来就让 Q 去 train。所以 Q 在 sample 的时候, 它会 sample 到过去的一些资料。
这么做的好处是什么?
整体来说,DQN 与 Q-learning 的目标价值以及价值的更新方式都非常相似,主要的不同点在于:
为什么要有DQN?
由于Q值总是基于使得Q最大的action得出的,因此会趋向于被高估,于是引入double DQN
如何解决这里的target总是太大的问题?
使用两个Q function(因此称为double), 一个用来选择行动action,另外一个用来计算Q值,通常会选择target network来作为另外一个用于计算Q值的Q‘ function。
如果Q高估了 a 从而被选择, Q’ 会给这个被选择的a一个合适的Q值;
如果Q’会高估某个action a,这个action并不会被Q选择到。
哪来的Q跟Q’呢?哪来两个network呢?
在实现上,你有两个 Q-network, 一个是 target 的 Q-network,一个是真正你会 update 的 Q-network。所以在 Double DQN 里面,你的实现方法会是拿你会 update 参数的那个 Q-network 去选 action,然后你拿 target 的network,即固定住不动的 那个network 去算 value。
Dueling DQN 是怎么改了 network 的架构呢?
这里计算出来的值有两个:
V(s): 对不同的state都有一个值,表示静态环境,状态s所具有的价值。
A(s,a): 向量,对不同的state,不同的action都会有一个值。
这样改的好处
所以有可能说你在某一个 state,你明明只 sample 到这2 个 action,你没 sample 到第三个 action,但是你其实也可以更改第三个 action 的 Q value。这样的好处就是你不需要把所有的 state-action pair 都 sample 过,你可以用比较高效的方式去把 Q value 估计出来。
如何避免机器学到 V 永远都是 0,使得A 总是等于 Q这种情况?
加一个normalization,这个 normalization 做的事情就是把 7+3+2 加起来等于 12,12/3 = 4。然后把这边通通减掉4,变成 3, -1, 2。再把 3, -1, 2 加上 1.0,得到最后的 Q value。
这个 normalization 的 step 就是 network 的其中一部分,在 train 的时候,你从这边也是一路 back propagate回来的,只是 normalization 是没有参数的,它只是一个 normalization 的operation。把它可以放到 network 里面,跟 network 的其他部分 jointly trained,这样 A 就会有比较大的 constrain。这样 network 就会给它一些 benefit, 倾向于去 update V 的值,这个是 Dueling DQN。
简单地说,在训练的过程中,对于在经验buffer里面的样本,那些具有更好的TD 误差的样本会有更高的概率被采样,这样可以加快训练速度。
在这个过程中,参数更新的过程也会有相应的更改。
此处,模型需要学习多步累积起来的回报reward,也就是说将MC和TD进行了折中,同时引入了一个超参数,即累积reward的步长N。
但是你可以去调这个 N 的值,去在 variance 跟不精确的 Q 之间取得一个平衡。N 就是一个 hyper parameter,你要调这个 N 到底是多少,你是要多 sample 三步,还是多 sample 五步。
Epsilon Greedy: 在行动上加噪声。即便给定相同的状态state,agent也有可能采取不同的行动,因此,实际上这里并没有真正意义上的policy。
Noisy Net: 在参数上加噪声。在每个episode开始时,在Q function的参数上引入噪声,但在每一个episode内,参数不会发生改变。给定同样的state,agent会采取同一个action。
状态-行动价值函数 Q π ( s , a ) 是累积收益的期望值,也就是说是价值分布的均值。然而,有的时候不同的分布得到的均值可能一样,但我们并不知道实际的分布是什么。
Distributional Q-function 认为可以输出Q值的分布,当具有相同的均值时,选择具有较小方差(风险)的那一个。但实际上,这个方法很难付诸实践。
Rainbow: 也就是将我们这两节内容所有的七个tips综合起来的方法,7个方法分别包括:DQN、DDQN、Prioritized DDQN、Dueling DDQN、A3C、Distributional DQN、Noisy DQN,进而考察每一个方法的贡献度或者是否对于与环境的交互式正反馈的。
这里 ∑ 和 μ 是高斯分布的方差和均值,因此,该矩阵 ∑ 一定是正定的。
要让Q值较高,意味着要使得 ( a − μ ) 2 的值更小,也就是说 a=μ .
在回顾一下Q-learning
想要让训练过程更加稳定,并且通过直接估测G这个随机变量的期望值,就需要我们在 state s 采取 action a 的时候,直接用一个 network 去估测G 的期望值。如果这件事情是可行的,那之后训练的时候,就用期望值来代替sample 的值,这样会让训练变得比较稳定。
如何用期望值代替sample?
这边就需要引入 value based 的方法。value based 的方法就是 Q-learning。
在policy gradient的基础上,融合了Q-learning,形成Actor-Critic。
如果你这么实现的话,有一个缺点是:你要 estimate 2 个 networks:Q-network 和 V-network,你估测不准的风险就变成两倍。所以我们何不只估测一个 network?
事实上在这个 Actor-Critic 方法里面,可以只估测 V 这个 network,我们可以用 V 的值来表示 Q 的值,即:
你在 state s 采取 action a,会得到 reward r,然后跳到 state st+1。但是你会得到什么样的 reward r,跳到什么样的 state st+1,它本身是有随机性的。所以要把右边这个式子,取期望值它才会等于 Q-function。
但是现在把期望去掉。把这个期望值去掉的好处就是不需要 estimate Q 了,只需要 estimate V 就够了。但这样你就引入了一个随机的东西 r ,它是有随机性的,它是一个 random variable。但是这个 random variable,相较于 accumulated reward G 可能还好,因为它是某一个 step 会得到的 reward,而 G 是所有未来会得到的 reward 的总和。
实现 Actor-Critic 的时候,有两个一定会用的 tip。
这个其实就是 Asynchronous(异步的) Advantage Actor-Critic。
效率提升是因为multi-workers
方法步骤:
与GAN(生成对抗网路)的思想是一样的。
Q-learning对于连续的动作比较难处理,而Pathwise Derivative Policy Gradient 可以解决continuous action带来的问题。
对于最原始的actor-critic,critic只会告诉actor,某个行动是好的还是坏的。而这里引入的Pathwise Derivative Policy Gradient不仅仅会告诉actor某一个action的好坏,还会告诉actor应该采取哪一个action(使用以下训练出来的actor告知)
然后将这个actor 返回的action和state一起输入到一个固定的Q中,计算出来的Q值一定会增大,然后使用梯度上升更新actor,重复上述步骤。
以上网络实际上是两个网络的叠加,类似于conditional GAN,其中actor是generator,Q是discriminator。
我们来看一下 pathwise derivative policy gradient 的算法。一开始你会有一个 actor π,它去跟环境互动,然后,你可能会要它去 estimate Q value 。estimate 完 Q value 以后,你就把 Q value 固定,只去 learn 一个 actor。假设这个 Q 估得是很准的,它知道在某一个 state 采取什么样的 action,会真的得到很大的 value。接下来就 learn 这个 actor,actor 在 given s 的时候,它采取了 a,可以让最后 Q-function 算出来的 value 越大越好。你用这个 criteria 去 update 你的 actor π。然后有新的 π 再去跟环境做互动,再estimate Q,再得到新的 π 去 maximize Q 的 output。本来在 Q-learning 里面,你用得上的技巧,在这边也几乎都用得上,比如说 replay buffer、exploration 等等。
Q-learning 到 Pathwise Derivative Policy Gradient 算法:
这里有四点改变:
参考:
【笔记2-4】李宏毅深度强化学习笔记(四)Actor-Critic