强化学习 学习心得(3)



  • ** 这部分还没完全写完,后续继续补充**

    DDPG

    DDPG算法是对前面AC,DQN,PG算法的综合,集合了各个算法的优点。最后有四个网络。Actor和Critic网络下分别有还有eval,target网络,eval与target网络的结构是一样的。DDPG采取确定性策略at=μ(stθμ)a_{t} = \mu\left(s_{t} | \theta^{\mu}\right),其中θμ\theta^{\mu}就是产生确定性动作的策略网络参数。

    Actor:J(-Q)就是loss,至于这里为什么要将Q与a相乘,可能是因为莫烦文章中说的:前半部分的Q,从Critic得到,是Actor要考虑如何移动得到最大的Q,后半部分的μ\muActor要如何修改自身的参数,使之更有可能做这个动作。两者合起来Actor要朝着可能获取大Q的的方向去修改参数
    <br/>θμJ1NiaQ(s,aθQ)<em>s=s</em>i,a=μ(si)θμμ(sθμ)<em>s</em>i<br/><br /> \left.\left.\nabla_{\theta^{\mu}} J \approx \frac{1}{N} \sum_{i} \nabla_{a} Q\left(s, a | \theta^{Q}\right)\right|<em>{s=s</em>{i}, a=\mu\left(s_{i}\right)} \nabla_{\theta^{\mu}} \mu\left(s | \theta^{\mu}\right)\right|<em>{s</em>{i}}<br />

    Actor网络的loss是q,原因是:dq/dθ=dq/dada/dθdq/d\theta=dq/da*da/d\theta,其中θ\theta就是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网络中,最后得到的Q=a<em>w1+s</em>w2+bQ=a<em>w1+s</em>w2+b,这个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会乘一个新旧概率比,如果差距大优势大那么学习幅度就加大 。

    下面是理解后面复杂公式的前提基础:
    <br/>Exp[f(x)]=f(x)p(x)dx=f(x)p(x)q(x)q(x)dx=Exq[f(x)p(x)q(x)]<br/><br /> E_{x \sim p}[f(x)]=\int f(x) p(x) d x=\int f(x) \frac{p(x)}{q(x)} q(x) d x=E_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]<br />
    下面的新旧概率的比值要理解on-policy ,off-policy的问题,正是因为在PG算法中的每轮的更新需要采取一回合的数据来训练,这个取样所花的时间就很多,所以这个地方改进了算法,让一个θ\theta'策略来取样,取样数据拿来在训练θ\theta策略
    $$
    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惩罚项是想让pθpθ\frac{p_{\theta}}{p_{\theta'}}不要相差太多,所以给出了一个惩罚项,相差太多之后,这样的计算方式就会出现问题。

    Actor更新有两种方式:(最大化L)

    第一个是用KL pernaty:
    <br/>LKLPEN(θ)=E(st,at)πθ[πθ(atst)πθold(atst)A^<em>tβKL[π</em>θold(st),πθ(st)]]<br/><br /> L^{K L P E N}(\theta)=E_{\left(s_{t}, a_{t}\right) \sim \pi_{\theta^{\prime}}}\left[\frac{\pi_{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\mathrm{old}}}\left(a_{t} | s_{t}\right)} \hat{A}<em>{t}-\beta \mathrm{KL}\left[\pi</em>{\theta_{\mathrm{old}}}\left(\cdot | s_{t}\right), \pi_{\theta}\left(\cdot | s_{t}\right)\right]\right]<br />
    第二个是用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算法一模一样)
    <br/>loss=(r+γvv)2<br/><br /> loss=(r+\gamma*v_-v)^2<br />

    之所以有新旧参数,是因为E^<em>t[π</em>θ(atst)πθold (atst)A^t]\hat{\mathbf{E}}<em>{t}\left[\frac{\pi</em>{\theta}\left(a_{t} | s_{t}\right)}{\pi_{\theta_{\text {old }}}\left(a_{t} | s_{t}\right)} \hat{A}_{t}\right] ,要更新啊。<u>(感觉这里又和DQN有点像)</u>

    SAC

    soft actor critic 慢AC 算法

    这个部分是自己从看论文到实现一整个SAC都实现了,关于论文网上也有很多的内容,也是各有各的讲法,所以也是需要好好的总结一下的。

    基于最大熵的强化学习,熵最高的策略具有更高的随机性。在策略中允许高度随机的动作,更能够顺利的适应预期之外的干扰。是off-policy的。增加熵也就说明策略的随机性增强,所以会增加更多的探索,从而可以加快后续的学习速度。

    可以理解为一个值,用来衡量一个随机变量的随机性有多强。如果出现一个东西的概率很大,那么这个变量的熵就很小。

    假设x ~ P,P是一个分布那么x的熵H的计算方式为:

    image-20201109144742679

    在熵正则化中,agent每个step都会获得一个与当前时间, step对应的policy的熵成比例的一个奖励。这样一来,强化学习中的奖励就变为了:(下面是最大化奖励的策略)

    image-20201109145451234

    其中α就是熵正则化系数,那么其价值函数(状态价值函数)(从当前状态开始到最终状态时系统所获得的累加回报的期望)对应为:(γ是折损因子)(价值函数是用来评估策略函数的)

    image-20201109145538040

    Q函数(状态动作价值函数)(给定一个状态 [公式] ,采取动作 [公式] 后,按照某一策略 [公式] 与环境继续进行交互,得到的累计回报的期望值)对应为:

    image-20201109145627500

    V^π,Q^π的关系:

    image-20201109190420356

    E[Qπ(s,a)]这个就是下面的表示:

    image-20201109152600079

    Qπ的贝尔曼方程(当前状态和下一个状态之间的递归关系)为:(也是Qπ和Vπ之间的关系)

    image-20201109152851379

    SAC会同时学习策略(一个策略网络)+两个Q函数(两个Q网络)。目前对于SAC来讲有两种实现方式,一种是使用一个固定的熵正则化系数α,另一种是在训练过程中自动求解熵正则化系数。

    使用了clipped double-Q trick,两个Q函数共享一个目标,计算时使用两个Q函数中给出的最小Q值得那个:

    image-20201109193428389

    求期望是对下一个状态和下一个动作求期望:

    image-20201109192958667

    SAC中的Q的损失函数是:

    image-20201109193035088

    学习策略:最大化值函数V:

    image-20201109193853252

    优化策略的方法:reparameterization trick(重参数技巧)

    image-20201109194245361

    reparameterization trick使得我们可以将对动作的期望(这里有一个痛点:动作分布取决于策略参数)重写为对噪声的期望(消除痛点:此时动作分布不依赖于策略参数)

    那么策略网络的loss:

    image-20201109194434699

    总结归纳

    1. RL的四个要素

      策略

      1)确定策略:a=π(s)a=\pi(s)

      2)随机策略:π(as)=p[at=ast=s]\pi(a|s)=p[a_t=a|s_t=s]

      奖励函数:

      r 这个不用多说

      累计奖励函数:(需补充)

      V 一个策略的优劣取决于长期执行这一策略后的累积奖励,常见的长期累积奖励:

      1)Vπ(s)=Eπ[i=1hris0=s]V^{\pi}(s)=E_{\pi}\left[\sum_{i=1}^{h} r_{i} | s_{0}=s\right]

      2)Vπ(s)=lim<em>hE</em>π[1hi=1hris0=s]V^{\pi}(s)=\lim <em>{h \rightarrow \infty} E</em>{\pi}\left[\frac{1}{h} \sum_{i=1}^{h} r_{i} | s_{0}=s\right]

      3)Vπ(s)=Eπ[i=1γi1ris0=s]V^{\pi}(s)=E_{\pi}\left[\sum_{i=1}^{\infty} \gamma^{i-1} r_{i} | s_{0}=s\right],如:Sarsa-lambda,GD等

      4)...

      上面这些大多用在后面的加入了神经网络的RL算法中间。作为placeholder输入进行训练的。

      模型

      所有强化学习都是马尔科夫决策的过程:(需补充)

    附录一

    PG算法使用的是交叉熵,SAC算法使用的是相对熵(KL散度),那么为什么在强化学习中会用到熵呢?

    (信息熵)

    熵用来衡量一个系统的混乱程度,代表系统中信息量的总和;熵值越大,表明这个系统的不确定性就越大。 信息量是衡量某个事件的不确定性,而熵是衡 量一个系统的不确定性。

    一般我们使用:
    $$
    信息熵=\sum_{x=1}^n (信息x发生的概率*验证信息x需要的信息)
    $$

    信息熵就是所有信息的期望
    <br/>H(p)=i=1np(xi)log(p(xi))<br/><br /> H(p)=-\sum_{i=1}^n p(x_i)log(p(x_i))<br />
    其中I(x)=log(p(x))I(x)=-log(p(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)的困难程度。

    交叉熵的公式:
    <br/>H(p,q)=i=1np(xi)log(q(xi))<br/><br /> H(p,q)=-\sum_{i=1}^n p(x_i)log(q(x_i))<br />
    一般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算法),因为我们可以得到:

    相对熵=交叉熵 - 信息熵 DKL(p,q)=H(p,q)H(p) D_{KL}(p,q)=H(p,q)-H(p)

    因为一般p(x)是目标(训练数据)的分布,是固定的,有时候最小化相对熵也等于最小化交叉熵。

    所以经常看到把交叉熵当做loss,交叉熵损失函数
    <br/>Loss=[ylogy^+(1y)log(1y^)]<br/><br /> Loss=-[ylog\hat y+(1-y)log(1-\hat y)]<br />

    **最大似然估计( max linkehood estimate) **

    通过若干次试验,观察其结果,利用试验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。

    设有一组训练样本X=x1,x2,,xmX={x1,x2,⋯,xm} ,该样本的分布为p(x)p(x) 。假设使用θθ 参数化模型得到q(x;θ)q(x;θ) ,现用这个模型来估计X 的概率分布,得到似然函数
    <br/>L(θ)=q(X;θ)=<em>imq(xi;θ)<br/><br /> L(θ)=q(X;θ)=\prod <em>i^m q(x_i;θ)<br />
    最大似然估计就是求得θθ使得L(θ)L(θ) 的值最大,也就是
    <br/>θ</em>ML=argmaxθ<em>imq(xi;θ)<br/><br /> θ</em>{ML}=\arg\max_θ \prod <em>i^m q(x_i;θ)<br />
    对上式的两边同时取log,乘积变成加法 ,等价优化log的最大似然估计即log-likelyhood最大对数似然估计
    <br/>θ</em>ML=argmaxθimlogq(xi;θ)<br/><br /> θ</em>{ML}=\arg\max_θ\sum_i^m \log q(x_i;θ)<br />
    对上式的右边进行缩放并不会改变argmax 的解,上式的右边除以样本的个数m
    <br/>θML=argmaxθ1mimlogq(xi;θ)<br/><br /> θ_{ML}=\arg\max_\theta \frac{1}{m} \sum_i^m\log q(x_i;θ)<br />
    上式就是求随机变量X的函数log(X;θ)\log(X;\theta) 的均值,根据大数定理随着样本容量的增加,样本的算术平均值将趋近与随机变量的期望
    <br/>1mimlogq(xi;θ)ExP(logq(x;θ))<br/><br /> \frac{1}{m}\sum_i^m \log q(x_i;\theta) \rightarrow E_{x \sim P}(\log q(x;\theta))<br />
    于是最大化似然估计变成了:(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 是滴


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待