gpt4 book ai didi

python - Karpathy Pong y - aprob 的交叉熵/对数损失解释

转载 作者:行者123 更新时间:2023-12-01 01:12:01 25 4
gpt4 key购买 nike

我正在尝试理解 Karpathy 的 pong 代码,解释如下:karpathy pong

# forward the policy network and sample an action from the returned probability
#########action 2 is up and 3 is down
aprob, h = policy_forward(x)
print("aprob\n {}\n h\n {}\n".format(aprob, h))
#2 is up, 3 is down
action = 2 if np.random.uniform() < aprob else 3 # roll the dice!
print("action\n {}\n".format(action))
# record various intermediates (needed later for backprop)
xs.append(x) # observation, ie. the difference frame?
#print("xs {}".format(xs))
hs.append(h) # hidden state obtained from forward pass
#print("hs {}".format(hs))
#if action is up, y = 1, else 0
y = 1 if action == 2 else 0 # a "fake label"
print("y \n{}\n".format(y))
dlogps.append(y - aprob) # grad that encourages the action that was taken to be taken (see http://cs231n.github.io/neural-networks-2/#losses if confused)
print("dlogps\n {}\n".format(dlogps))
# step the environment and get new measurements
observation, reward, done, info = env.step(action)
print("observation\n {}\n reward\n {}\n done\n {}\n ".format(observation, reward, done))
reward_sum += reward
print("reward_sum\n {}\n".format(reward_sum))
drs.append(reward) # record reward (has to be done after we call step() to get reward for previous action)
print("drs\n {}\n".format(drs))
if done: # an episode finished
episode_number += 1

在上面的代码片段中,我不太明白为什么需要假标签以及这意味着什么:
dlogps.append(y - aprob)# grad that encourages the action that was taken to be taken (see http://cs231n.github.io/neural-networks-2/#losses if confused)

为什么是假标签yaprob

我的理解是,网络输出上升的“对数概率”,但解释似乎表明标签实际上应该是采取该行动获得的奖励,然后鼓励一个情节中的所有行动(如果它是赢了一个。因此,我不明白 1 或 0 的假标签有什么帮助。

同样在前向传递函数中,没有对数操作,那么它是如何对数概率的呢?

#forward pass, how is logp a logp without any log operation?????
def policy_forward(x):
h = np.dot(model['W1'], x)
h[h<0] = 0 # ReLU nonlinearity
logp = np.dot(model['W2'], h)
p = sigmoid(logp)
#print("p\n {}\n and h\n {}\n".format(p, h))
return p, h # return probability of taking action 2 (up), and hidden state

编辑:

我使用 print 语句来查看幕后发生的情况,并发现自 y=0 以来发生了什么对于向下的操作,(y - aprob)行动下降将为负。他的梯度调制公式具有优势epdlogp *= discounted_epr最终仍然表明向下移动是否良好,即。负数或坏数,即。正数。
对于向上行动,应用公式时则相反。 IE。 epdlogp *= discounted_epr 的正数表示行动是好的,负面的表示行动是坏的。
所以这似乎是一个相当简洁的实现方式,但我仍然不明白如何 aprob从前向传递返回的是对数概率,因为控制台的输出如下所示:

aprob
0.5

action
3

aprob
0.5010495775824385

action
2

aprob
0.5023498477623756

action
2

aprob
0.5051575154468827

action
2

这些看起来像是 0 到 1 之间的概率。使用 y - aprob 也是如此。作为“对数概率”只是经过数月和数年的实践而形成的直觉的黑客?如果是这样,这些黑客行为是通过反复试验发现的吗?

编辑:感谢 Tommy 的精彩解释,我知道在 Udacity 深度学习类(class)视频中的何处查看对数概率和交叉熵的复习:https://www.youtube.com/watch?time_continue=94&v=iREoPUrpXvE

此外,此备忘单也有帮助:https://ml-cheatsheet.readthedocs.io/en/latest/loss_functions.html

最佳答案

我对他如何到达(y-aprob)的解释:

当他通过网络进行前向传播时,最后一步是将 sigmoid S(x) 应用于最后一个神经元的输出。

S(x) = 1 / (1+e^-x)  

及其梯度

grad S(x) = S(x)(1-S(X))

要增加/减少您采取行动的可能性,您必须计算“标签”概率的对数

L = log p(y|x)  

要反向传播,您必须计算可能性 L 的梯度

grad L = grad log p(y|x)

由于您在输出上应用了 sigmoid 函数 p = S(y),因此您实际计算了

grad L = grad log S(y)   
grad L = 1 / S(y) * S(y)(1-(S(y))
grad L = (1-S(y))
**grad L = (1-p)**

这实际上无非是对数损失/交叉熵。更通用的公式是:

L = - (y log p + (1-y)log(1-p))  
grad L = y-p with y either 0 or 1

由于 Andrej 在他的示例中没有使用 Tensorflow 或 PyTorch 等框架,因此他在那里做了一些反向传播。

一开始我也很困惑,我花了一些时间才弄清楚那里发生了什么魔法。也许他可以说得更清楚一些并给出一些提示。

至少这是我对他的代码的粗浅理解:)

关于python - Karpathy Pong y - aprob 的交叉熵/对数损失解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54759093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com