Actor-Critic网络实现中仅用log如何得到动作概率分布?
Actor-Critic实现中log动作概率逻辑答疑
核心疑问澄清
你存在的核心误解是:log运算本身并不负责生成概率分布,这段代码里的概率分布生成、动作采样、log概率计算是三个完全独立的环节,不存在“用log算分布”的逻辑。
逐行代码逻辑拆解
你贴的两行代码分工非常明确:
# Sample action from action probability distribution action = np.random.choice(num_actions, p=np.squeeze(action_probs)) action_probs_history.append(tf.math.log(action_probs[0, action]))
- 第一行才是概率分布相关的逻辑:
Actor网络的输出层会经过softmax激活,直接输出合法的动作概率分布action_probs——所有动作的概率值都在[0,1]区间,且总和为1。np.random.choice的作用就是按照这个已经生成好的概率分布做随机采样,选出当前状态下实际执行的动作。 - 第二行的log运算和生成分布没有任何关系:
这行只是把刚才采样到的那个动作对应的原始概率取对数,存入历史列表留待后续计算损失使用。
为什么要存储对数概率而非原始概率
这是策略梯度算法的数学性质决定的:
- 策略梯度的优化目标是最大化轨迹的期望回报,推导后的更新公式中本身就包含
log(π(a|s))项,即当前策略在状态s下选择动作a的对数概率 - 对数变换有两个实际工程优势:一是可以把概率的连乘运算转化为对数的连加运算,避免多个极小概率值连乘导致的数值下溢问题;二是对数函数是单调递增函数,最大化对数似然和最大化原始概率似然的优化方向完全一致,求导计算也更简便。
举个直观例子:如果当前网络输出动作概率为[0.7, 0.3],这已经是完整的合法概率分布,第一行代码会以70%概率选动作0、30%概率选动作1;如果采样结果为动作0,第二行就计算
log(0.7)存入历史,后续更新网络时直接用这个值乘以对应回报计算梯度即可,log运算全程不参与概率分布的生成过程。
内容的提问来源于stack exchange,提问作者Nolan Pérez Rivera
相关产品推荐
相关产品推荐

