十四、Adversarial Policies: Attacking Deep Reinforcement Learning

1、前言

之前偶然之间想到,在有多个智能体的竞争任务中能不能让某个或者某些智能体采取诸如“做假动作”等方式来“误导”其他智能体从而提升自己的胜率呢?于是自己很粗糙地想了一个framework,尽管现在看来有很多不太明朗的地方。

在这里插入图片描述

首先这是一个self-interested的场景,也就是说在训练某个agent的时候其他agent都被看作环境的一部分了。假如当前仅仅考虑 i i i 要去误导 j j j,我的核心思想是向环境添加一些关于 i i i 的有误导性的状态动作对让 j j j 观测到一些”误导性的“信息,比如说在当前状态, i i i 采取的动作是向上移动,那么就向环境中添加在该状态 i i i 向其他方向移动的状态动作对,这样环境中就有了可能会误导 j j j 的信息, j j j 也就有可能学到错误的策略,从而使 i i i 的胜率提高。但是转念一想,这个方案的可行度似乎不高,首先是改变环境这个环节,改变环境实质上是要改变环境的动态特性,但是环境的状态转移概率等动态特性是在初始化的时候就决定了,似乎不太容易改变;其次是怎么向环境添加新的状态动作对的问题,因为状态可以用矩阵来表示或许可以把动作也用向量来表示然后作为一个整体存到某个容器中,然后 j j j 再从这个容器中随机采样,但是这样一来就没有环境的动态特性可言了,因为根本用不到转移概率,MDP都被破坏了!归根结底这和DQN的memory replay不一样,DQN的memory replay是存储的 e x p e r i e n c e < s , a , r , s ′ > experience <s,a,r,s^{\prime}> experience<s,a,r,s> ,然后计算价值函数时再从中采样,它打破的时数据之间的correlation,而没有破坏MDP。

虽然目前来看我的framework几乎不可行,但还是找到了一些和我的想法很类似的论文,比如这篇《ADVERSARIAL POLICIES: ATTACKING DEEP REINFORCEMENT LEARNING》。

2、论文介绍

文中讨论的也是两个agent在竞争性的任务即“zero-sum game”中的强化学习。它将agent分成了“adversarial agent”和“victim agent”,并期望利用一个“adversarial policy”来指导adversarial agent的行动,并且这些动作能产生一些具有对抗性(adversarial)的observation,按照我的理解其实就是产生了“误导作用”从而战胜victim agent。文章强调的了,adversarial agent并不是通过学会攻击、阻碍victim agent来获得胜利的,而是通过自己的行动来影响victim agent的观测从而使得victim agent采取错误的行动。

在这里插入图片描述

这张图的训练任务是”you shall not pass“,红色的agent要阻止蓝色的agent通过它身后的红线。可以很清楚的看出来如果使用normal opponent,它为了获得胜利学会的是去”攻击“victim agent,但是采用adversarial opponent时,adversarial opponent没有去”攻击“victim agent而是”就地卧倒“以此”误导“了victim agent,结果victim agent也摔倒了!说的深入一点,adversarial agent是学会了利用victim policy的弱点,学会了如何让victim policy失效。

可以查看Demo

那么这篇文章又是如何做到这一点的呢?其实它的方法很简单,比我想的要精炼很多并且切中要害。需要注意的是,victim agent采用的是fixed policy,并且该策略是通过”self-play“预先训练好的。由于 π v \pi_{v} πv 是fixed policy所以仅有两个agent的Markov game变成了只有一个agent的MDP: M α = ( S , A α , T α , R α ′ ) M_{\alpha}=\left(S, A_{\alpha}, T_{\alpha}, R_{\alpha}^{\prime}\right) Mα=(S,Aα,Tα,Rα) ,adversarial agent的转移概率矩阵和收益函数都要增加victim agnet的部分 T α ( s , a α ) = T ( s , a α , a ν ) T_{\alpha}\left(s, a_{\alpha}\right)=T\left(s, a_{\alpha}, a_{\nu}\right) Tα(s,aα)=T(s,aα,aν) R α ( s , a α , s ′ ) = R ( s , a α , a ν , s ′ ) R_{\alpha}\left(s, a_{\alpha}, s^{\prime}\right)=R\left(s, a_{\alpha}, a_{\nu}, s^{\prime}\right) Rα(s,aα,s)=R(s,aα,aν,s) ,而adversarial agent的目标就是训练出能够最大化折扣回报的策略: ∑ t = 0 ∞ γ t R α ( s ( t ) , a α ( t ) , s ( t + 1 ) ) , \sum_{t=0}^{\infty} \gamma^{t} R_{\alpha}\left(s^{(t)}, a_{\alpha}^{(t)}, s^{(t+1)}\right), \quad t=0γtRα(s(t),aα(t),s(t+1)), where s ( t + 1 ) ∼ T α ( s ( t ) , a α ( t ) ) s^{(t+1)} \sim T_{\alpha}\left(s^{(t)}, a_{\alpha}^{(t)}\right) s(t+1)Tα(s(t),aα(t)) and a α ∼ π α ( ⋅ ∣ s ( t ) ) a_{\alpha} \sim \pi_{\alpha}\left(\cdot | s^{(t)}\right) aαπα(s(t)) 简而言之,这个方法就是重新构造了回报函数,把victim的动作考虑了进去,文中采用了PPO算法,并且规定当adversarial胜利的时候收益为正,输掉或者平局为0。adversarial agent可以通过 π v \pi_{v} πv 来获得 a v a_{v} av 但是不能得到victim agent的内部信息。可以看出来,此文的训练过程并没有试图改变环境来让victim agent观测到具有误导性的信息,但是通过重新构造回报函数又确确实实起到了这个效果,为了证明这一点,文中还提出了Masked Policy,把victim对adversarial agent的观测设定成了一个静态的值,相当于把victim agent的眼睛”蒙了起来“这样adversarial agent的动作就不会影响到它,结果victim agent的胜率提高了。

3、Self-play

前面说到了victim agent采用的是fixed policy,并且是用self-play训练出来的,文中对于self-play是如何实现的并没有详细地阐述,只是简单地提到了它是和opponent的之前的policy(比如说上一轮训练得出的policy)竞争(The victims were trained in paris via self-play against random old version of their opponent)

在Alpha Go的论文中对self-play有更详细的阐述。

在这里插入图片描述

alphago是三种方法的融合:supervised learning、reinforcement learning、Monte Carlo tree search。policy network用来选择动作,value network用来评估棋局形势。有上图可知,alphago会首先利用Rollout policy(便于快速采样动作)和 SL(supervised learning)policy来学习人类专家的棋局,这其实是在进行模仿,让模型首先学会比较基础的下棋过程,然后利用训练好的SL policy初始化RL policy也就是说开始训练RL policy的时候 ρ \rho ρ σ \sigma σ 是一样的,RL policy的目的是调整policy的更新方向,因为之前的SL policy是向着更高的预测正确率更新的,RL policy要向着”赢更多棋“的方向更新,在这个过程中,我们会从之前迭代产生的policy中随机选择一个作为当前正在训练的RL policy的opponent,然后开始self-play,我的理解是在这个时候agent”一心二用,左右互搏“、”一人分饰两角“用现在的RL policy和之前的RL policy下棋,而不是黑白子各为一个agent然后竞争。在self-play的过程中,除了terminal step在当前RL policy胜利的时候获得+1的收益,输掉的时候获得-1的收益,其他的step收益全都为0,然后再将权重 ρ \rho ρ 向着 Δ ρ ∝ ∂ log ⁡ p ρ ( a t ∣ s t ) ∂ ρ z t \Delta \rho \propto \frac{\partial \log p_{\rho}\left(a_{t} | s_{t}\right)}{\partial \rho} z_{t} Δρρlogpρ(atst)zt 方向更新,这样就能得到一个越来越厉害的RL policy,self-play也是训练过程中最耗时的部分。最后再根据self-play产生的数据集训练value network,用来预测当前棋局的赢面是多少。

Openai的Dota2论文中也用到了self-play的方法,和alhpago类似,也是让当前的策略和之气的策略或者就是和自己比赛然后选出更优的策略,在Dota2的论文中80%的比赛是用当前的策略自己和自己比,20%的比赛是从之前的策略中随机选择一个作为opponent比赛。这里的用同一个策略自己和自己比赛可以这么理解,比如说下象棋,红方和黑方都采用完全一样的策略意味着在相同的棋局下会采取完全相同的走法,但是事实上红方和黑方是不可能在同一局中出现完全相同的状态的,所以用同一个策略自己和自己下是可以的。

关于alphago中提到的”一人分饰两角“这个想法,在《INTRINSIC MOTIVATION AND AUTOMATIC CURRICULA VIA ASYMMETRIC SELF-PLAY》一文中有较为详细的阐述。但是这篇文章的self-play是有使用环境的限定的,要么是可逆的,要么是在新一轮训练时可以重置到最初状态的。

在这里插入图片描述

比如说一个agent分别要扮演Alice和Bob两个角色其实就是两个策略,首先作为Alice即采用 π A \pi_{A} πA 采取一系列动作,期间和”钥匙“、”门“、”电灯“产生了交互,然后停止。再训练 π B \pi_{B} πB 要使得Bob能够返回到Alice的出发点,并且也要和”钥匙“、”门“、”电灯“进行交互才能获得正的收益。整个self-play的过程都是agent内部的经历,他并不需要环境给予的信息、收益,这个过程旨在帮助agent熟悉整个环境,然后再进行target task的时候能够更快的完成任务,并且Alice的任务是要促使Bob更多地探索整个环境。
R B = − γ t B R A = γ max ⁡ ( 0 , t B − t A ) \begin{aligned}&R_{B}=-\gamma t_{B} \\&R_{A}=\gamma \max \left(0, t_{B}-t_{A}\right)\end{aligned} RB=γtBRA=γmax(0,tBtA)
t A t_{A} tA 是Alice从开始到停止的耗时, t B t_{B} tB 也是,只不过如果Bob没能再限定的episode内完成任务那么 t B t_{B} tB 就是episode的最大长度减去 t A t_{A} tA 。通过这个公式可以看出,如果Bob花费的时间比Alice多,那么Alice就会获得reward,如果Bob不能完成任务,那么Alice就会希望进行尽可能少的step,所以Alice总是趋向于一个花费步数最少的并且Bob不能完成的任务。而Alice和Bob的策略也都是由神经网络来训练的: a A = π A ( s t , s 0 ) = f ( s t , s 0 , θ A ) , a B = π B ( s t , s ∗ ) = f ( s t , s ∗ , θ B ) a_{A} = \pi_{A}\left(s_{t}, s_{0}\right)=f\left(s_{t}, s_{0}, \theta_{A}\right), \quad a_{B} = \pi_{B}\left(s_{t}, s^{*}\right)=f\left(s_{t}, s^{*}, \theta_{B}\right) aA=πA(st,s0)=f(st,s0,θA),aB=πB(st,s)=f(st,s,θB)

回过头去再看《ADVERSARIAL POLICIES: ATTACKING DEEP REINFORCEMENT LEARNING》,不难理解它所说的self-play是类似于alphago的利用当前策略和之前的策略进行训练,也就是说在预先训练victim agent的时候normal opponent也在进行训练,然后从normal opponent训练过的策略里选择一个作为opponent来和victim agent比拼,训练足够多的step之后将其作为victim agent的fixed policy。

然而我的想法和《ADVERSARIAL POLICIES: ATTACKING DEEP REINFORCEMENT LEARNING》最大的不同是,我是希望直接影响victim agent的observation来使它采取错误的行为,但是这篇文章是通过重新构造回报函数进行训练之后间接地做到了这一点。

之前学习eTL的时候遇到过self learning,它和self-play应该是不同的,我个人认为eTL的self learning是用来分类的,通过self learning向agent的mind universe添加新的类别,或者说向FALCON的 F 2 F_{2} F2 layer中添加新的node,但是self-play则是用来优化policy的,让policy朝着增加胜率的方向改进。

4、Open-ended

《ADVERSARIAL POLICIES: ATTACKING DEEP REINFORCEMENT LEARNING》中的victim agent采用的是fixed policy,也就是说只有adversarial agent在学习,但是我构想的framework是两个agent都在学习的,这会带来一个问题:什么时候才算结束?因为两个agent都在学习并且都有adversarial policy所以有可能两者会僵持不下,也有可能轮流占上风,此消彼长。这其实本就是一个open-ended的问题,对于真的非常复杂的环境或许可以限定训练的时间、episode来人为地结束。

《EMERGENT TOOL USE FROM MULTI-AGENT AUTOCURRICULA》这篇论文就探讨了一个open-ended的”hide and seek“环境。

在这里插入图片描述

文中的agent都是采用self-play的方式进行训练的,并且agent的策略也分成两个部分,一个是policy network(PPO)用来选择动作,一个是critic network用来预测回报。根据前面对self-play的理解,应该是hider用当前的策略和seeker之前的策略进行self-play,观察收益曲线很显然这是一个zero-sum的任务,每当hider学会了一种新的躲藏方式seeker的reward就会降低,直到seeker学会了新的seek方法。最开始,hider随意乱窜,很容易被seeker抓住,所以是seekers的reward更高;训练了一段时间之后hiders学会了建造围墙,把自己围起来;结果hiders又学会了借助梯子翻过围墙;于是hiders就学会了在开局就先把梯子锁定然后再搭建围墙;然而,seekers居然学会了利用环境搭建时设计人员没有注意到的bug,它们利用砖块滑行,越过了hiders搭建的围墙;最后hiders学会了把所有搭建围墙所需材料之外的其他所有东西都锁定,这样seekers就无计可施了。agents不断地学到新的技能,这也正是autocurricula的含义。

通过这篇文章可以知道,对于两个agent都在学习,不使用fixed-policy的场景也是可以研究的,并且很多时候将会是一个open-ended的问题。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐