强化学习-自博弈

自博弈(Self-Play)

00 链接

  • AlphaZero:https://github.com/suragnair/alpha-zero-general Coach.py

  • AlphaZeroGomoku:https://github.com/junxiaosong/AlphaZero_Gomoku game.py下start_self_play()

  • gym:https://github.com/openai/gym

    • 强化学习-自博弈_第1张图片

    • 强化学习-自博弈_第2张图片


01 概念

1.1 基础介绍

背景

  • 在实际训练中,很难为了每一个特定的复杂技能去搭建复杂的环境,提供不同水平的针对性训练,这样对人工工作量和计算机的算力都提出了过高的要求,基于这个问题,提出了==自博弈(Self-Play) ==的强化学习训练框架。将这种自我博弈以获得进化的思想应用于现实的对抗性运动中。

概念

  • 强化学习-自博弈_第3张图片

  • 通过模拟自己玩游戏并使用训练期间生成的策略来训练agent进行学习

分类

  • naive self-play:直接跟最新的自己对打
    • 随着学习的进行,可能会出现循环。例如,学习到的 B 策略打败了之前的 A 策略,接下来学习到的 C 策略打败了 B 策略,最后又重新学习到了 A 策略发现它能打败 C 策略
  • the Best-Win Self-Play:跟历史中最好的自己打
  • the Delta-Uniform Self-Play:在指定时间戳内的agent进行对抗
  • the PBT Self-Play:训练多个agent,并相互协作
  • Fictitious Self Play(FSP):agent选择针对其对手的平均行为的最佳反应
  • Neural Fictitious Self Play(NFSP):在FSP上进行扩展,记住自身关于博弈状态转移的经验和自身的行为,将这些数据进行强化学习和监督学习使用
  • K-Best Self-Play:通过探索K个最佳代理的策略来近似NFSP的最佳响应计算策略
  • ……

强化学习-自博弈_第4张图片

方法

  • 通常的方法是结合SP和蒙特卡洛树搜索(MCTS)产生的移动进行监督学习

  • 只需要告诉计算机这个技能的规则并设定一个目标函数,即奖惩机制,除此之外没有任何领域知识。然后通过循环迭代的多次自博弈,逐渐意识到哪些动作能使自己在博弈中取胜的概率最大化,并最终掌握这项技能


1.2 通用框架

强化学习概念补充

强化学习-自博弈_第5张图片

以多agent为例

  • E :表示具有 n 个 agent 的多代理系统且具有奖励折扣因子 γ

    • 奖励值随着时间的推移进行折扣,以免陷入局部最优
  • S :状态空间,有限状态 state 集合,s 表示某个特定状态。是全局的

  • O :联合观测空间,有限 observation 集合,o 表示某个特定观测。是局部的

    • 如果是单一agent的场景下,state和observation并没有区别
    • 如果是多agent的场景下,则每个agent的observation与全局的state是不一样的
  • A :联合动作空间,有限动作 action 集合,a 表示某个特定动作

  • π :联合策略向量,可以看作是在联合观察空间条件下的联合行动空间上的分布。

  • Reward R(s,a) : 表示 agent 采取某个动作后的即时奖励

  • Policy P(s,a) : 根据当前 state 和 action 产生下时刻 state 和 observation

核心

  • The menagerie:(动物园)
    • 在这里插入图片描述

    • 一组策略,从中抽取代理行为的样本。包括当前的训练策略

  • The policy sampling distribution:
    • 在这里插入图片描述

    • 一个概率分布,负责从menagerie中挑选一个策略,作为现在这个正在训练的agent的对手

  • The curator:(馆长)
    • 在这里插入图片描述

    • 一个可能的随机函数,其参数是当前训练策略π和一个动物园πo,用来调整menagerie

    • 具体作用:

      • current agent要不要加入menagerie中
      • menagerie中的agent要不要扔掉

流程

强化学习-自博弈_第6张图片


1.3 创新点

探索课程(EXPLORATION CURRICULUM)

场景,给定一个没有任何先验运动学知识的人形机器人,如果要从零开始通过自我对抗的方法将它训练成能够后空翻的机器人,规定只有当它完成后空翻时才给予奖励,而完全不给任何指引,那么经过漫无目的的尝试,最终它也许只能在地上撒泼打滚,甚至学不会站立。

  • 完成最终大目标才获得的奖励称之为稀疏奖励(sparse reward),假如在每一个与大目标有关的小动作上都给予阶段性的稠密奖励(dense reward)。将最终目的分解为多个小目标,逐步完成最终目标。
  • 一旦智能体发现只要做出基础动作就能不断获得探索奖励,它可能就不会去尝试更为复杂的目标动作,反而对训练产生了阻碍。----->提出随着自我对抗训练过程的进行,将探索奖励逐渐衰减至0,利于智能体最终顺利完成目标获得稀疏竞争奖励

对手抽样(OPPONENT SAMPLING)

背景,如果目标与对手实力差距悬殊,一直无法取胜获得正向的反馈激励,目标就一直无法进步,一个直观的想法就是让对手放水,即让对手变弱,通过打败一个弱版本的对手来获得奖励,增强学习效果。

  • 因此训练过程中遇到过于强大的对手时,系统会在该对手的早期版本中抽样作为博弈对象,这样让弱者有获胜的机会,在博弈中取得奖励和进步,一旦弱者的水平提升到一定程度,也能反过来训练激励强者使其变得更强。
  • 对手太弱的情况也是类似,只需要抽样自己的早期版本供对手训练即可。

鲁棒学习策略 (LEARNING ROBUST POLICIES)

背景,强化学习与深度学习中,常出现的一个问题是过拟合。比如AlphaGo最终训练出来的目标能打过柯洁却打不过公园老大爷

  • 对环境引入随机效果,但这样的随机性给早期训练带来了极大的探索可能性,导致智能体的训练时间过长,收敛速度过慢。---->设计了一个可变的随机性算子,其以较小的值开始训练,以便更快掌握基础动作,随后该值随着训练过程的推进逐渐变大
  • 让智能体同时学习多个策略,引入一个策略池,在每次推出特定策略时,会随机选择其他策略中的一个作为对手,最终就能训练出一个集百家之长的智能体

02 使用

2.1 结构

  • neural network

    • 输入是局面s,输出是预测的action概率向量p和胜率v
    • 目标就是最小化联合损失,就是让神经网络的预测跟MCTS的搜索结果尽量接近。
  • MCTS

    • 接收game,net,参数等信息、蒙特卡罗树搜索(选择,拓展,模拟,反向传播)
    • 通过MCTS搜索树优化神经网络参数,从而指导MCTS下一步节点的高效选择
    • net和MCTS合作原理见蒙特卡洛树搜索
  • players

    • 根据输入局面信息配合神经网络对象给出的估值结合蒙特卡洛树搜索给出应对方法
  • board

    • 包括游戏规格、执行player的行动、定义player的行为(如飞行、发射等)
  • game

    • 获取board信息、定义有效行动、获取某时刻可能的行为数量、得到下一时刻状态、游戏结束逻辑、获取player的得分
  • self-play

    • 循环接收以MCTS策略的player的行动及对应可能性,存储当前数据并执行行动直到游戏结束,
    • 得到的数据是一串局面从开始到结束的数据集合,用于输入神经网络

2.2 示例

以alpha-zero-general中Coach.py自博弈过程为例

强化学习-自博弈_第7张图片

executeEpisode():

执行one episode of self-play

trainExamples = []
episodeStep = 0

while True:
    episodeStep += 1
    # 1.获取board信息
    BoardInfor = getCanonicalForm(board, curPlayer)
    
    # 2.内部执行指定次数的MCTS模拟,得到联合策略pi。
    pi = mcts.getActionProb(BoardInfor)
    
    # 3.将这时的board信息和对应策略存储,用于后续神经网络训练
    sym = game.getSymmetries(canonicalBoard, pi)
    trainExamples.append(sym)
    
    # 4.从策略中随机选择一个作为行动
    action = np.random.choice(len(pi), p=pi)
    
    # 5.根据前面的board,player和对应的action获取下时刻状态
    board, curPlayer = game.getNextState(board, curPlayer, action)
    
    # 6.如果满足游戏结束规则就跳出循环并返回训练策略,否则继续
    if not getGameEnded(board,curPlayer)return trainExamples

learn():

执行指定numIters次数的迭代,每次迭代包含numEps episodes of self-play。每次迭代后,都会将trainExamples输入网络进行训练,

iterationTrainExamples = deque([], maxlen=self.args.maxlenOfQueue) # 固定大小的队列
trainExamplesHistory = []

for i in range(1, args.numIters + 1):
    # 1.调用executeEpisode()执行numEps次完整的游戏流程,将策略存储
    for _ in range(numEps):
        mcts = MCTS(game, nnet, args)  # 重置搜索树
        iterationTrainExamples += executeEpisode() 

    # 2.将一轮迭代的结果放入训练样例 trainExamplesHistory
    trainExamplesHistory.append(iterationTrainExamples)
    
    # 3.在训练前,将这些样例打乱
    shuffle(trainExamplesHistory)
    
    # 4.训练新的网络,保留旧的前一次迭代的副本
    nnet.save_checkpoint(folder=args.checkpoint, filename='abc')
    pnet.load_checkpoint(folder=args.checkpoint, filename='abc')
    # 4.1 以前的网络进行搜索,得出相应的措施
    pmcts = MCTS(game, pnet, args) # previous 注意网络是pnet
    
    # 4.2 训练新的网络,进行现在的网络搜索
    nnet.train(trainExamplesHistory)
    nmcts = MCTS(game, nnet, args) # now  注意网络是nnet
    
    # 5.Arena.py -> 输入两个agent进行相互对抗
    arena = Arena(lambda x: np.argmax(pmcts.getActionProb(x, temp=0)),
                  lambda x: np.argmax(nmcts.getActionProb(x, temp=0)), game)
    # pwins:previous获胜;nwins:now获胜;draws:平局
    pwins, nwins, draws = arena.playGames(args.arenaCompare)
    
    # 6.然后就是保存获胜的模型,进行下一次迭代对抗
    ……

03 参考

博客

  • Neural Fictitious Self Play

  • Self-Play:让计算机学会相扑的强化学习“左右互搏术”

  • Self-Play Under a Generalized Framework笔记

  • 自博弈学习初步

  • 强化学习(Reinforcement Learning)知识整理

  • 深入理解强化学习(一)- 概念和术语

  • AlphaZero代码实战2:蒙特卡洛树搜索-CSDN博客

论文

  • AlphaHoldem: High-Performance Artificial Intelligence for Heads-Up No-Limit Texas Hold’em from End-to-End Reinforcement Learning
  • A Comparison of Self-Play Algorithms Under a Generalized Framework
  • Fictitious Self-Play in Extensive-Form Games
  • Grandmaster level in StarCraft II using multi-agent reinforcement learning
  • Mastering the game of Go without human knowledge

你可能感兴趣的:(深度学习,人工智能,深度学习,机器学习)