春春欲动 發表於 2022-7-10 00:33:00

强化学习-学习笔记13 | 多智能体强化学习

<p>这一篇介绍重头戏:多智能体强化学习。多智能体要比之前的单智能体复杂很多。但也更有意思。</p>
<h2 id="13-multi-agent-reiforcement-learning">13. Multi-Agent-Reiforcement-Learning</h2>
<h3 id="131-多智能体关系设定">13.1 多智能体关系设定</h3>
<ol>
<li>合作关系 Full Cooperative Setting</li>
<li>竞争关系 Full Competitive Setting</li>
<li>合作和竞争的混合 Mixed Cooperative &amp; Competitive</li>
<li>利己主义 Self-Interested</li>
</ol>
<h4 id="a-完全合作关系">a. 完全合作关系</h4>
<ul>
<li>agents 的利益一致,合作去获取共同的回报;</li>
<li>如工业机器人共同装配;</li>
</ul>
<h4 id="b-完全竞争关系">b. 完全竞争关系</h4>
<ul>
<li>一个 agent 的收益是另一个 agent 的损失;</li>
<li>如机器人搏斗,零和博弈;</li>
</ul>
<h4 id="c-合作竞争混合">c. 合作竞争混合</h4>
<ul>
<li>既有合作,也有竞争;</li>
<li>如足球机器人;</li>
</ul>
<h4 id="d-利己主义">d. 利己主义</h4>
<ul>
<li>每个 agent 只考虑最大化自身利益,不关心别人的利益;</li>
<li>比如股票的自动交易;</li>
</ul>
<h3 id="132-专业术语">13.2 专业术语</h3>
<p>下面在多智能体的背景下更新一下先前的概念:</p>
<h4 id="a-state--action--state-transition">a. state / action / state transition</h4>
<ul>
<li>
<p>假设系统中有 n 个 agents,S 表示状态,用 <span class="math inline">\(A^i\)</span> 表示 第 i 个agent 的动作</p>
</li>
<li>
<p>状态转移函数 : <span class="math inline">\(p(s'|s,a^1,...,a^n)=\mathbb{p}(S'=s'|S'= s',A^1=a^1,...,A^n = a^n)\)</span></p>
<p>这个函数是隐藏的,即只有环境知道,而人不知道。</p>
</li>
<li>
<p>多智能体问题的难点就是,下一状态 S' 会受到所有 agents 的 动作的影响。</p>
</li>
</ul>
<h4 id="b-rewards">b. Rewards</h4>
<ul>
<li>有 n 个 agents ,每一轮就会有 n 个奖励,用 <span class="math inline">\(R^i\)</span> 表示第 i 个 agent 的奖励;</li>
<li>在合作的情境下:每个 agent 的奖励都相等;</li>
<li>在竞争的情境下:一个 agent 的奖励是另一个 agent 奖励的损失:<span class="math inline">\(R^1 \propto -R^2\)</span></li>
<li>agent 获得的奖励不仅仅取决于本身的动作,还取决于 其他 agent 的动作;</li>
</ul>
<h4 id="c-returns">c. Returns</h4>
<ul>
<li>
<p>用 <span class="math inline">\(R^i_t\)</span> 来表示第 i 个 agent 在 t 时刻获得的奖励;</p>
</li>
<li>
<p>则 第 i 个 agent 在时刻 t 的回报 Return 表示为:</p>
<p><span class="math inline">\(U_t^i=R_t^i+R^i_{t+1}+...+...\)</span></p>
</li>
<li>
<p>折扣回报是加权和:</p>
<p><span class="math inline">\(U_t^i = R^i_t+\gamma \cdot R_{t+1}^i +\gamma^2\cdot R_{t+2}^i + ...\)</span></p>
</li>
</ul>
<h4 id="d-policy-network-策略网络">d. Policy Network 策略网络</h4>
<ul>
<li>用神经网络近似策略函数 <span class="math inline">\(pi\)</span>;</li>
<li>第 i 个 agent 的策略网络记为: <span class="math inline">\(\pi(a^i|s;\theta^i)\)</span>,所有网络结构可以相同;</li>
<li>在一些情况下,不同agent的网络参数可能一样,因为它们彼此是可以替换的;</li>
<li>在更多场景中,策略网络不能互换,不同 agent 的功能不同。</li>
</ul>
<h4 id="e-奖励和回报-随机性的来源">e. 奖励和回报 随机性的来源</h4>
<ul>
<li>奖励 <span class="math inline">\(R_t^i\)</span> 依赖于当前状态 <span class="math inline">\(S_t\)</span> 和 所有 agent 当前的动作 <span class="math inline">\(A_t^1,A_t^2,...,A_t^n\)</span></li>
<li>状态的随机性来自于状态转移函数 p;</li>
<li><span class="math inline">\(A_t^i\)</span> 的随机性 来自于 策略函数,具体问题中是策略网络 <span class="math inline">\(\pi\)</span>;</li>
<li>回报 <span class="math inline">\(U_t^i\)</span> 依赖于t 时刻开始所有的 奖励:
<ul>
<li>未来所有的状态 <span class="math inline">\({S_t,S_{t+1},...}\)</span></li>
<li>未来所有的动作 <span class="math inline">\(A_t^i,A_{t+1}^i,A_{t+2}^i,...\)</span></li>
</ul>
</li>
</ul>
<h4 id="f-状态价值函数">f. 状态价值函数</h4>
<ul>
<li>
<p>第 i 个 agent 的状态价值函数 是:<span class="math inline">\(V^i(s_t;\theta^1,...,\theta^n)=\mathbb{E}\)</span></p>
</li>
<li>
<p>对 <span class="math inline">\(U_t\)</span> 求期望后,就消除掉了未来的状态以及所有 agent 的动作,这样 <span class="math inline">\(V^i\)</span> <strong>只依赖于</strong> 当前状态 <span class="math inline">\(s_t\)</span></p>
</li>
<li>
<p>动作 <span class="math inline">\(A^j_t\)</span> 是随机的,根据策略函数 <span class="math inline">\(\pi\)</span> 来随机抽样选择:<span class="math inline">\(A^j_t\sim\pi(\cdot | s_t;\theta^j)\)</span>;</p>
</li>
<li>
<p>所以第 j 个策略网络会影响状态价值函数 <span class="math inline">\(V^i\)</span></p>
<blockquote>
<p>解释:</p>
<ul>
<li>道理其实很好理解,但上面那么说可能有点绕;意思是,第 i 个 agent 的状态价值函数 <span class="math inline">\(V^i\)</span> 依赖于所有 agent 的 策略函数;</li>
<li>因为agent 并不独立嘛,很好理解。如果一个 agent 的策略发生了变化,那么所有的 agent 的状态价值函数都会发生变化;</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="133-多智能体策略学习的收敛问题">13.3 多智能体策略学习的收敛问题</h3>
<p>Convergence , 收敛.</p>
<ul>
<li>收敛的意思是,无法通过改变策略,来获得更大的价值回报;如果所有的 agent 都找不到更好的策略,说明已经收敛,可以停止训练;</li>
</ul>
<h4 id="a-单智能体的策略学习">a. 单智能体的策略学习</h4>
<ul>
<li>
<p>单智能体的策略网络只有一个:<span class="math inline">\(\pi(a|s;\theta)\)</span></p>
</li>
<li>
<p>状态价值函数:<span class="math inline">\(V(s;\theta)\)</span>;</p>
</li>
<li>
<p>对 V 关于状态 s 求期望,得到目标函数: <span class="math inline">\(J(\theta)=E_s\)</span></p>
<p>消掉了 状态 s;因为只依赖于 θ,所以可以用于评价策略好坏, J 越大,则说明策略越好。</p>
</li>
<li>
<p>策略网络的<strong>参数学习方式</strong>为最大化目标函数 J:$ \max\limits_{\theta} J(\theta)$</p>
<blockquote>
<p>具体参见:策略学习</p>
</blockquote>
</li>
<li>
<p>策略网络的<strong>收敛条件</strong>为<strong>目标函数不再增加</strong>。</p>
</li>
</ul>
<h4 id="b-多智能体的策略学习">b. 多智能体的策略学习</h4>
<p>如果有多个 agents,判断收敛的条件就是 <strong>纳什均衡</strong>。</p>
<blockquote>
<p>纳什均衡:</p>
<p>当其他 agents 都不改变策略时,一个 agent 改变策略,无法让自己获得更高的回报。</p>
<p>解释:</p>
<ul>
<li>一个 agent 制定策略时,需要考虑其他 agents 的策略,在达到纳什均衡的状态下,<strong>每个</strong>agent 都在以最优的动作应对其他各方的策略;</li>
<li>如果所有的 agents 都是理性的,在达到纳什均衡时,没有理由改变改变自己的策略,因为改变不会再增加自己的收益;</li>
<li>这达到了一种平衡,收敛了。</li>
</ul>
</blockquote>
<p>在多智能体问题上直接应用单智能体的 算法 并不好,可能会不收敛,原因:</p>
<h4 id="c-在-m-agents-问题上应用-s-agent-方法">c. 在 m-agents 问题上应用 s-agent 方法</h4>
<p><img src="https://img2022.cnblogs.com/blog/2192866/202207/2192866-20220710002927529-949015563.png" alt="image" loading="lazy"></p>
<p>系统中有 n 个 agent,假设独立和环境交互,即每个 agent 都可以独立观测到 环境的状态 s、接收环境给的奖励 r<sup>i</sup>,进而计算 a<sup>i</sup>并执行;</p>
<p>接着用策略梯度算法更新各自的策略网络,就相当于 n 个 agents 的策略学习的叠加,并且彼此之间没有直接联系。</p>
<p>下面说明一下这种思路为什么不行:</p>
<ul>
<li>
<p>假设第 i 个智能体的策略网络为: <span class="math inline">\(\pi(a^i|s;\theta^i)\)</span></p>
</li>
<li>
<p>第 i 个智能体的状态价值函数为:<span class="math inline">\(V(s;\theta^1,...,\theta^n)\)</span></p>
</li>
<li>
<p>目标函数为:<span class="math inline">\(J(\theta^1,\theta^2,...,\theta^n)=\mathbb{E}\)</span></p>
</li>
<li>
<p>当 <span class="math inline">\(agent^i\)</span> 要提高自己的回报,即学习第 i 个策略网络的参数,就是最大化目标函数:<span class="math inline">\(\max\limits_{\theta^i}J^i(\theta^1,..,\theta^n)\)</span></p>
<p>注意这里的目标函数 <span class="math inline">\(\max\limits_{\theta^i}J^i(\theta^1,..,\theta^n)\)</span>,对于每个 agent 都不相同。</p>
</li>
<li>
<p>当一个智能体通过策略学习更新了策略,会通过环境影响其他智能体的目标函数,<strong>这样整体的策略学习可能永远无法收敛</strong>;</p>
<blockquote>
<p>假设 第 i 个智能体找到了最优策略:<span class="math inline">\(\theta^i_*J^i(\theta^1,\theta^2,...,\theta^n)\)</span></p>
<p>其余 agent 改变自己的策略时,第 i 个智能体的最优策略就又改变了。</p>
</blockquote>
</li>
</ul>
<p>即,每个 agent 都不是独立的,每个 agent 都影响了下一个状态,下一个状态的改变反过来又改变了 agent 的策略。</p>
<p>那么我们应当如何处理多智能体的强化学习呢?</p>
<h3 id="134-多智能体学习方法">13.4 多智能体学习方法</h3>
<p>因为 agents 之间会互相影响,所以最好在 agents 之间做<strong>通信</strong>来共享信息,而 agents 之间的<strong>通信方式</strong>主要分为 <strong>中心式</strong> 和 <strong>去中心式</strong>。</p>
<h4 id="a-去中心化">a. 去中心化</h4>
<p>Fully decentralized. 即 agents 都是独立的个体,每个 agent 独立与系统交互,用自己观测到的状态和奖励更新自己的策略;彼此之间不交流,不知道别人的动作。</p>
<p><strong>13.3</strong> 中已经介绍了这种方式的不足。</p>
<h4 id="b-中心化">b. 中心化</h4>
<p>所有 agent 都把信息传给中央控制器,中央控制器收集所有的状态和奖励,由中央统一做出决策,agent 自己不做决策,即 <strong>定于一尊</strong>。</p>
<h4 id="c-中心化训练--去中心化执行">c. 中心化训练 &amp; 去中心化执行</h4>
<p>这种方式 agents 各有各的策略网络;而训练时有中央控制器,中央统一收集信息帮助 agents 训练,训练结束后就由各自的策略网络作决策,不再需要中央控制器。</p>
<p>下面以比较常用的 Actor-Critic 来介绍多智能体强化学习的实现细节。</p>
<h3 id="135-不完全观测">13.5 不完全观测</h3>
<p>Partial Observation.在多智能体强化学习中,通常假设智能体是不完全观测的,即只能观测到局部状态,不能观测到全局的状态。</p>
<ul>
<li>把 <span class="math inline">\(agent^i\)</span> 观测到的状态记为 <span class="math inline">\(o^i\)</span>,在不完全观测时, <span class="math inline">\(o^i\neq s\)</span></li>
<li>完全观测时,<span class="math inline">\(o^1=...=o^n=s\)</span></li>
</ul>
<h3 id="136-完全去中心化">13.6 完全去中心化</h3>
<p>每个 agent 独立与环境进行交互,独立训练自己的策略网络,跟之前的单智能体强化学习基本相同,训练结束后,每个 agent 用自己的策略网络来作决策。把观测到的 <span class="math inline">\(o^i\)</span> 输入,输出动作的概率分布,抽样得到动作并执行 <span class="math inline">\(a^i\)</span>。</p>
<p><img src="https://img2022.cnblogs.com/blog/2192866/202207/2192866-20220710002959003-666539951.png" alt="image" loading="lazy"></p>
<blockquote>
<p>本质还是单智能体强化学习,而不是多智能体强化学习;</p>
</blockquote>
<p><strong>如何用去中心化实现 Actor-Critic</strong> ?</p>
<ul>
<li>每个 agent 上都搭载了计算设备,如 CPU、GPU;</li>
<li>在每个 agent 上都部署策略网络 Actor <span class="math inline">\(\pi(a^i|o^i;\theta^i)\)</span> 和价值网络 Critic <span class="math inline">\(q(o^i,a^i;w^i)\)</span> ;训练思路与此前的 Actor-Critic 相同。</li>
<li>agent 独立运行,不做通信;</li>
<li>但 agents 之间的联系不能忽略,这样做效果不好。</li>
</ul>
<h3 id="137-完全中心化">13.7 完全中心化</h3>
<ul>
<li>
<p>n 个 agents 与环境交互,将观测到的 状态和奖励 都上报给 中央控制器,由中央的策略网络来作决策,中央把决策发给每个 agent 。</p>
</li>
<li>
<p>agents上面没有策略网络,不能自己作决策,只听中央控制器的。</p>
</li>
</ul>
<p><img src="https://img2022.cnblogs.com/blog/2192866/202207/2192866-20220710003010633-1198984834.png" alt="image" loading="lazy"></p>
<ul>
<li>
<p>训练也是在中央控制器进行,用<strong>所有观测到的的状态和奖励</strong>来训练策略网络。</p>
</li>
<li>
<p>执行时,也需要中央控制器训练出的 n 个策略网络,网络结构相同,具体参数可能不同。</p>
<blockquote>
<p>由于输入需要时所有的状态,所以策略网络不能部署到具体的agent,只能放在中央控制器。</p>
</blockquote>
</li>
</ul>
<p><strong>如何用中心化实现 Actor-Critic</strong> ?</p>
<ul>
<li>中央控制器接收到 所有的动作 <span class="math inline">\(a\)</span> 和 状态 <span class="math inline">\(o\)</span>,以及所有的奖励;</li>
<li>中央控制器上有 n 个策略网络和 n 个价值网络,对应 n 个agents;
<ul>
<li>策略网络 <span class="math inline">\(\pi(a^i|o_{all};\theta^i)\)</span>,输入是所有的观测值 o,输出是动作概率值;通过概率抽样执行动作;</li>
<li>价值网络 <span class="math inline">\(q(o,a;w^i)\)</span>,评价对应的策略网络的决策好坏;</li>
</ul>
</li>
<li>用策略梯度算法来训练策略网络;</li>
<li>用 TD算法 训练 价值网络;</li>
<li>结束训练后,中央控制器用策略网络来作决策:
<ul>
<li>agents 上报 状态<span class="math inline">\(o_{all}\)</span>,中央输入 策略网络,抽样得到动作 <span class="math inline">\(a^i\)</span></li>
<li>把 <span class="math inline">\(a^i\)</span> 传达到 第 i 个 agent,命令其执行;</li>
</ul>
</li>
</ul>
<p>中心化的好处是收集全局的信息,可以面向所有 agents 做出好的决策。但<strong>缺点主要在于执行速度慢,无法做到实时决策</strong>。</p>
<h3 id="138-中心化训练--去中心化执行">13.8 中心化训练 &amp; 去中心化执行</h3>
<ul>
<li>每个 agent 都有策略网络,训练的时候使用 <strong>13.7</strong> 中心化训练的方式,执行时不需要中央控制器,用自己的策略网络,基于局部观测来做出决策。</li>
<li>这个方式目前比较流行,模型也有很多种,下面介绍一种 Actor-Critic 方法:
<ul>
<li>参考文献:
<ol>
<li>Multi-agent actor-critic for mixed cooperative-competitive environments</li>
<li>Counterfactual multi-agent policy gradients</li>
</ol>
</li>
<li>每个agent上都布置自己的策略网络 <span class="math inline">\(\pi(a^i|o^i;\theta^i)\)</span>,输入是agent自己的局部观测 状态 <span class="math inline">\(o^i\)</span> ,不依赖其他 agents。</li>
<li>中央控制器上有 n 个价值网络 <span class="math inline">\(q(o,a;w^i)\)</span>,对对应的策略网络进行评价,帮助训练策略网络;输入是所有的动作和状态;价值网络的结构相同,但是参数不同;</li>
<li>训练时中央控制器收集所有的观测、动作和奖励;</li>
<li>完成训练,每个 agent 独立作决策。</li>
</ul>
</li>
</ul>
<p><img src="https://img2022.cnblogs.com/blog/2192866/202207/2192866-20220710003028226-1018785795.png" alt="image" loading="lazy"></p>
<p><strong>训练方式:</strong></p>
<ul>
<li>
<p>中央控制器上训练的价值网络,使用TD算法进行更新,输入:</p>
<ul>
<li><span class="math inline">\(a=\)</span></li>
<li><span class="math inline">\(o=\)</span></li>
<li>注意,只需一个奖励 <span class="math inline">\(r^i\)</span></li>
</ul>
<p>输出用TD算法拟合 TD target,即为 <span class="math inline">\(q^i\)</span>.</p>
</li>
<li>
<p>agent 端训练的策略网络在中央控制器的价值网络提供的 q 下进行训练;输入为:</p>
<ul>
<li><span class="math inline">\(a^i\)</span>、<span class="math inline">\(o^i\)</span>、<span class="math inline">\(q^i\)</span></li>
<li>不需要其他 agents 的信息。</li>
</ul>
<p>用策略梯度算法 更新 <span class="math inline">\(\theta_i\)</span>;</p>
</li>
</ul>
<p><strong>执行过程</strong>:</p>
<p><img src="https://img2022.cnblogs.com/blog/2192866/202207/2192866-20220710003038886-1702112682.png" alt="image" loading="lazy"></p>
<p>不再需要中央控制器,只基于各自的局部观测与策略网络来做出决策。</p>
<h3 id="139-参数共享">13.9 参数共享</h3>
<p>在本文举例的 Actor-Critic 中,有:</p>
<ul>
<li>n个策略网络:<span class="math inline">\(\pi(a^i|o^i;\theta^i)\)</span></li>
<li>n个价值网络:<span class="math inline">\(q(o,a;w^i)\)</span></li>
<li>训练的参数是 <span class="math inline">\(\theta,w\)</span></li>
<li>第 i 和第 j 两个神经网络,共享参数的意思是,<span class="math inline">\(\theta^i=\theta^j,w^i=w^j\)</span></li>
<li>是否共享参数取决于情境
<ul>
<li>功能不同的 agents 之间不能共享:如足球机器人</li>
<li>功能相同的 agents 之间可以共享:如无人车</li>
</ul>
</li>
</ul>
<h3 id="1310-总结">13.10 总结</h3>
<table>
<thead>
<tr>
<th>学习方式</th>
<th>策略网络(actor)</th>
<th>价值网络(critic)</th>
</tr>
</thead>
<tbody>
<tr>
<td>完全去中心化</td>
<td><span class="math inline">\(\pi(a^i,o^i;\theta^i)\)</span></td>
<td><span class="math inline">\(q(o^i,a^i;w^i)\)</span></td>
</tr>
<tr>
<td>完全中心化</td>
<td><span class="math inline">\(\pi(a^i,o;\theta^i)\)</span></td>
<td><span class="math inline">\(q(o,a;w^i)\)</span></td>
</tr>
<tr>
<td>中心化训练 &amp; 去中心化执行</td>
<td><span class="math inline">\(\pi(a^i,o^i;\theta^i)\)</span></td>
<td><span class="math inline">\(q(o,a;w^i)\)</span></td>
</tr>
</tbody>
</table>
<blockquote>
<p>看似一样,不同的是全局与局部。</p>
</blockquote>
<h2 id="x-参考教程">x. 参考教程</h2>
<ul>
<li>视频课程:深度强化学习(全)_哔哩哔哩_bilibili</li>
<li>视频原地址:https://www.youtube.com/user/wsszju</li>
<li>课件地址:https://github.com/wangshusen/DeepLearning</li>
</ul><br><br>
来源:https://www.cnblogs.com/Roboduster/p/16462343.html
頁: [1]
查看完整版本: 强化学习-学习笔记13 | 多智能体强化学习