团队得到同一奖励时,如何评价某一个体当前动作?COMA 使用集中式 critic 的动作价值,在固定其他个体动作时,将该个体可能动作按自身策略概率平均,作为反事实基线。下面只算一次基线与优势,不训练 critic,不把自造 Q 值当真实因果贡献。
固定其他个体,再比较自身动作
有 A、B 两个个体,各可选 L、R。Q 的行对应 A、列对应 B,矩阵为 [[4,1],[2,3]];这是我们指定的集中价值表。A 策略为 π(L)=0.25、π(R)=0.75。实际 B 固定 L,A 实际选 L,当前 Q 为 4。

基线 b_A=Σ动作 π_A(动作)Q(A候选动作,B固定动作),因此 b_A=0.25×4+0.75×2=2.5,优势为 4−2.5=1.5。COMA 原论文的反事实基线边缘化自身动作并保留其他个体的动作;不能把两个人都换掉再称为该个体的基线。
运行并检查加权优势为零
保存 coma_baseline.py,运行 python coma_baseline.py。函数检查概率和、非负性和矩阵列数。示例仅两行两列,真实算法还需要相应训练数据、critic 和策略更新。
from math import isclose
Q=[[4.0,1.0],[2.0,3.0]]
pi=[0.25,0.75]
def advantages(other_action):
if len(Q)!=len(pi) or any(len(row)!=2 for row in Q):
raise ValueError("shape mismatch")
if any(p<0 for p in pi) or not isclose(sum(pi),1.0):
raise ValueError("invalid policy")
if other_action not in (0,1):
raise ValueError("invalid other action")
vals=[row[other_action] for row in Q]
baseline=sum(p*q for p,q in zip(pi,vals))
adv=[q-baseline for q in vals]
assert isclose(sum(p*a for p,a in zip(pi,adv)),0.0,abs_tol=1e-12)
return baseline,adv
baseline,adv=advantages(0)
print("B=L baseline and advantages:",baseline,adv)
assert baseline==2.5 and adv==[1.5,-0.5]
baseline2,adv2=advantages(1)
print("B=R baseline and advantages:",baseline2,adv2)
assert baseline2==2.5 and adv2==[-1.5,0.5]
这组结果说明什么
B 从 L 改为 R 时,A 选 L 的优势从正 1.5 变为负 1.5,说明比较依赖其他个体当前动作。两种场景基线恰巧同为 2.5,是本例数值巧合,不是 COMA 的一般性质。按同一策略概率加权后的优势为零,是因为减去了同一加权均值;这个检查能抓到索引方向、概率或基线算错。
Q 表需要来自符合算法定义的 critic;任意填表只能演示公式,不能证明某人对实际团队产出的贡献。奖励设计定义团队目标,信用分配则在既定目标与价值估计下评估个体动作,二者需要区分。实际动作的正优势也不是确定的下一回合收益承诺。
多于两个动作时沿自身动作维度求和,其他动作保持不变;连续动作需要相应积分或近似方法,不能原样套两列表。验收记录动作索引、策略概率、Q 来源和加权结果。下一步才是验证学习得到的 critic 与训练更新,本文没有复现原论文基准实验。
资料与核对依据
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33283.html