强化学习 学习心得(3)
-
** 这部分还没完全写完,后续继续补充**
DDPG
DDPG算法是对前面AC,DQN,PG算法的综合,集合了各个算法的优点。最后有四个网络。Actor和Critic网络下分别有还有eval,target网络,eval与target网络的结构是一样的。DDPG采取确定性策略:
,其中 就是产生确定性动作的策略网络参数。 Actor:J(-Q)就是loss,至于这里为什么要将Q与a相乘,可能是因为莫烦文章中说的:前半部分的Q,从Critic得到,是Actor要考虑如何移动得到最大的Q,后半部分的
是Actor要如何修改自身的参数,使之更有可能做这个动作。两者合起来Actor要朝着可能获取大Q的的方向去修改参数。
Actor网络的loss是q,原因是:
,其中 就是Actor自身的参数。Actor网络最后输出的是一个动作,预测动作。a由Actor网络直接输出获得 Critic:L就是loss,借鉴了DQN和Q-learning
$$
y_{i}=r_{i}+\gamma Q^{\prime}\left(s_{i+1}, \mu^{\prime}\left(s_{i+1} | \theta^{\mu^{\prime}}\right) | \theta^{Q^{\prime}}\right)\
L=\frac{1}{N} \sum_{i}\left(y_{i}-Q\left(s_{i}, a_{i} | \theta^{Q}\right)\right)^{2}
$$
在Critic网络中,最后得到的,这个a就是从Actor网络中输出的a。DQN的target是得到所有动作的q值取max,而DDPG的Critic是得到一个确定的q值。 PPO
如果一句话概括 PPO: OpenAI 提出的一种解决 Policy Gradient 不好确定 Learning rate (或者 Step size) 的问题。PPO 利用 New Policy 和 Old Policy 的比例, 限制了 New Policy 的更新幅度, 让 Policy Gradient 对稍微大点的 Step size 不那么敏感。
限制的部分就在于actor的更新,A会乘一个新旧概率比,如果差距大优势大那么学习幅度就加大 。
下面是理解后面复杂公式的前提基础:
下面的新旧概率的比值要理解on-policy ,off-policy的问题,正是因为在PG算法中的每轮的更新需要采取一回合的数据来训练,这个取样所花的时间就很多,所以这个地方改进了算法,让一个策略来取样,取样数据拿来在训练 策略
$$
Gradient;for;update \
=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_{\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'}(s_t,a_t) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right] \
=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(\mathbf{s}{t}\right)} A^{\theta'}\left(s{t}, a_{t}\right) \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)\right]\
# 令\frac{p_{\theta}(s_t)}{p_{\theta'}(s_t)}=1,人为使得,因为这个式子不好算\
# \nabla f(x)=f(x) \nabla \log f(x);上面的式子是\nabla,下面的是原来的式子\
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]
$$后面加入的KL惩罚项是想让
不要相差太多,所以给出了一个惩罚项,相差太多之后,这样的计算方式就会出现问题。 Actor更新有两种方式:(最大化L)
第一个是用KL pernaty:
第二个是用clipped surrogate objective:
$$
L^{C L I P}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\min \left(\left[\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} | s_{t}\right)} \hat{A}{t}\right]\hat{A}{t}, \operatorname{clip}\left(\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} | s_{t}\right)}, 1-\epsilon, 1+\epsilon\right) \hat{A}_{t}\right)\right]
$$
Critic的更新方式:(最小化loss,这里就和AC算法一模一样)
之所以有新旧参数,是因为
,要更新啊。<u>(感觉这里又和DQN有点像)</u> SAC
soft actor critic 慢AC 算法
这个部分是自己从看论文到实现一整个SAC都实现了,关于论文网上也有很多的内容,也是各有各的讲法,所以也是需要好好的总结一下的。
基于最大熵的强化学习,熵最高的策略具有更高的随机性。在策略中允许高度随机的动作,更能够顺利的适应预期之外的干扰。是off-policy的。增加熵也就说明策略的随机性增强,所以会增加更多的探索,从而可以加快后续的学习速度。
熵可以理解为一个值,用来衡量一个随机变量的随机性有多强。如果出现一个东西的概率很大,那么这个变量的熵就很小。
假设x ~ P,P是一个分布那么x的熵H的计算方式为:
在熵正则化中,agent每个step都会获得一个与当前时间, step对应的policy的熵成比例的一个奖励。这样一来,强化学习中的奖励就变为了:(下面是最大化奖励的策略)
其中α就是熵正则化系数,那么其价值函数(状态价值函数)(从当前状态开始到最终状态时系统所获得的累加回报的期望)对应为:(γ是折损因子)(价值函数是用来评估策略函数的)
Q函数(状态动作价值函数)(给定一个状态 ,采取动作 后,按照某一策略 与环境继续进行交互,得到的累计回报的期望值)对应为:
V^π,Q^π的关系:
E[Qπ(s,a)]这个就是下面的表示:
Qπ的贝尔曼方程(当前状态和下一个状态之间的递归关系)为:(也是Qπ和Vπ之间的关系)
SAC会同时学习策略(一个策略网络)+两个Q函数(两个Q网络)。目前对于SAC来讲有两种实现方式,一种是使用一个固定的熵正则化系数α,另一种是在训练过程中自动求解熵正则化系数。
使用了clipped double-Q trick,两个Q函数共享一个目标,计算时使用两个Q函数中给出的最小Q值得那个:
求期望是对下一个状态和下一个动作求期望:
SAC中的Q的损失函数是:
学习策略:最大化值函数V:
优化策略的方法:reparameterization trick(重参数技巧)
reparameterization trick使得我们可以将对动作的期望(这里有一个痛点:动作分布取决于策略参数)重写为对噪声的期望(消除痛点:此时动作分布不依赖于策略参数)
那么策略网络的loss:
总结归纳
-
RL的四个要素:
策略
1)确定策略:
2)随机策略:
奖励函数:
r 这个不用多说
累计奖励函数:(需补充)
V 一个策略的优劣取决于长期执行这一策略后的累积奖励,常见的长期累积奖励:
1)
2)
3)
,如:Sarsa-lambda,GD等 4)...
上面这些大多用在后面的加入了神经网络的RL算法中间。作为placeholder输入进行训练的。
模型:
所有强化学习都是马尔科夫决策的过程:(需补充)
附录一
PG算法使用的是交叉熵,SAC算法使用的是相对熵(KL散度),那么为什么在强化学习中会用到熵呢?
熵(信息熵)
熵用来衡量一个系统的混乱程度,代表系统中信息量的总和;熵值越大,表明这个系统的不确定性就越大。 信息量是衡量某个事件的不确定性,而熵是衡 量一个系统的不确定性。
一般我们使用:
$$
信息熵=\sum_{x=1}^n (信息x发生的概率*验证信息x需要的信息)
$$信息熵就是所有信息的期望:
其中表示的就是信息量,负号是为了保证信息量为非负数。 那为什么信息量这样表示呢?
假设我们有两个不相关的x和y时间,两个事件同时发生的获得的信息量就是各个事件信息量的和,即为
I(x,y)=I(x)+I(y) 。因为两个事件独立不相关,所以p(x,y)=p(x)p(y) 。我们取对数就可以得到log p(x,y)=log p(x)+log q(x) . 我们想要让信息熵最小(消除不确定性),那么就是为0嘛!所以就是I(x)= - log p(x) . 这个负号有意思,又保证了信息量为非负数,又与p(x)成了反比。
交叉熵
表示使用分布q(x)表示目标分布p(x)的困难程度。
交叉熵的公式:
一般p(x)表示真实分布,q(x)表示模型的预测分布相对熵(KL散度)
表示同一个随机变量的两个不同分布间的距离。
对于一个随机变量x有两个单独的概率分布p(x)和q(x),那么相对熵:
$$
D_{KL}(p||q)=\sum_{i=1}^np(x_i)log(p(x_i)/q(x_i))\
=\sum_{i=1}^mp(x_i)log(p(x_i))-\sum_{i=1}^mp(x_i)log(q(x_i))\
=-H(p)+H(p,q)
$$
总的来说,相对熵是用来衡量同一个随机变量的两个不同分布之间的距离。在实际应用中,假如p(x)p(x)是目标真实的分布,而q(x)q(x)是预测得来的分布,为了让这两个分布尽可能的相同的,就需要最小化KL散度。所以为什么计算loss我们使用相对熵(SAC算法),因为我们可以得到:
相对熵=交叉熵 - 信息熵
因为一般p(x)是目标(训练数据)的分布,是固定的,有时候最小化相对熵也等于最小化交叉熵。
所以经常看到把交叉熵当做loss,交叉熵损失函数:
**最大似然估计( max linkehood estimate) **
通过若干次试验,观察其结果,利用试验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。
设有一组训练样本
,该样本的分布为 。假设使用 参数化模型得到 ,现用这个模型来估计X 的概率分布,得到似然函数
最大似然估计就是求得使得 的值最大,也就是
对上式的两边同时取log,乘积变成加法 ,等价优化log的最大似然估计即log-likelyhood
,最大对数似然估计
对上式的右边进行缩放并不会改变argmax 的解,上式的右边除以样本的个数m
上式就是求随机变量X的函数的均值,根据大数定理,随着样本容量的增加,样本的算术平均值将趋近与随机变量的期望
于是最大化似然估计变成了:(x是训练样本,所以才是x~p的分布)
$$
\theta_{ML}=\arg\max_\theta E_{x\sim P}(\log q(x;\theta))\
=\arg\min_\theta E_{x \sim p}(-\log q(x;\theta))
$$
然后我们在看看KL散度:
$$
\begin{aligned}
D_{K L}(p | q) &=\sum_{i} p\left(x_{i}\right) \log \left(\frac{p\left(x_{i}\right)}{q\left(x_{i}\right)}\right) \
&=E_{x \sim p}\left(\log \frac{p(x)}{q(x)}\right) \
&=E_{x \sim p}(\log p(x)-\log q(x)) \
&=E_{x \sim p}(\log p(x))-E_{x \sim p}(\log q(x))
\end{aligned}
$$
前一个式子是固定的,所以最小化交叉熵就和最大化对数似然估计是等价的。多分类交叉熵
二分类交叉熵
-
-
为什么这些公式都显示不出来???还找了很久呢
-
原来是没显示出来呀,是说看起来好复杂的样子,这是用的latex吗
-
@yanrudan 论坛LaTeX语法以前是
\\(inline math\\)
来着,现在这个也不管用了,有点离谱
-
@suqcolin 是滴