- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试理解 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)
为什么是假标签y
减aprob
?
我的理解是,网络输出上升的“对数概率”,但解释似乎表明标签实际上应该是采取该行动获得的奖励,然后鼓励一个情节中的所有行动(如果它是赢了一个。因此,我不明白 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/
我在一个项目中工作,该项目需要 SQL 结果的最佳性能,并且希望优化查询,但经过反复试验后,我在 IN 方面遇到了一些问题。 -- THIS RETURNS NO RESULTS AT ALL. SE
在尝试创建一个实际上非常简单的 SQL 语句时,我发现自己迷失了方向。 我有一个包含 3 个表的数据库: 食谱 - 存储一些用于 cooking 的食谱名称 配料食谱 - 将配料与食谱链接 成分 -
我正在尝试理解 PHP 中的 Hebrev 函数。 https://php.net/manual/en/function.hebrevc.php 它说:“将逻辑希伯来语文本转换为视觉文本”。但我不明白
嗨,我在 Grid view 的 android 文档中发现了一段代码对于以下代码。 gridview.setOnItemClickListener(new OnItemClickListener()
谁能解释一下 InfiniBand 是什么?与以太网相比的主要区别是什么,这些差异如何使其比以太网更快? 在官方description从 mellanox 写到 Introduce InfiniBan
这个问题已经有答案了: How are java increment statements evaluated in complex expressions (1 个回答) 已关闭 8 年前。 我知道
我正在阅读 MySQL 教程,我遇到了这个: SELECT /*! SQL_NO_CACHE */ user FROM users; 为什么优化提示 SQL_NO_CACHE 包含在: /*!
我无法理解$(this),我做了一个剪刀石头布的版本,并应用了 jQuery 让用户在计算机上选择按钮选项。我希望有人能解释一下 $(this) 指的是什么,它是 btn-primary 吗?该函数在
我不是很确定 while(choice == 1 || choice ==2);谁能解释一下。我明白这一点 if(choice ==1) displayMonthly(rainfall); e
let flyRight = CABasicAnimation(keyPath: "position.x") flyRight.toValue = view.bounds.size.width/2 f
目录 解释:int型默认值为0 但我们尝试发现并不能通过: 原因: int的默认值为0,而Integer的默认值为null
我正在处理一个查询,自从一个 SSRS 服务器传输到另一个服务器后,它似乎没有按预期执行,并且 where 语句的一部分中出现了以下行 找出不同之处,或者至少从我能找到的地方来看。 where COA
我正在制作一个退回检测程序,读取退回邮件。我们的设置是发送电子邮件,在发送的邮件中添加一个 noreply@domain.tl。一些收件人不再存在,因此我们想要读取退回邮件,并检测它发送给谁。我已经崩
我有一个关于公式通过控制点弯曲的问题。 如您所知,HTML Canvas 有 quadraticCurveTo(x1, y1, x2, y2)与 x1 and x2作为控制点。 但是,当您尝试使用它绘
我有一个 Emakefile看起来像: %% -- %% %% -- {'/Users/user/projects/custom_test/trunk/*', [debug_info, {out
我有一个非常简单的问题。这不仅适用于 spray-json,而且我已经阅读了 argonaut 和 circe 的类似声明。所以请赐教。 在 spray-json 中,我遇到了 There is no
我正在为视频添加水印。我试图让水印与视频尺寸成比例。我已经使用 scale2ref 看到了十几个不同的答案,但没有解释实际发生了什么,所以我发现很难知道如何实现/更改配置以适应我的情况。 当前覆盖命令
因为我正在学习语言,所以我在玩 Haskell,我只是发现了一些我不理解的东西,我找不到解释。如果我尝试运行此代码: map (`div` 0) [1,2,3,4] 我得到一个除以 0 的异常,这是预
我正在寻找解决错误对象引用未设置到对象实例的步骤/指南。以及问题发生原因的解释。 我正在寻找更一般的解释,所以如果我收到错误,我应该采取什么步骤来查找问题。我经常看到有人提供特定代码段的帖子,而其他人
我最近想升级我的知识React ,所以我从组件生命周期方法开始。让我好奇的第一件事是这个componentWillReceiveProps .所以,文档说当组件接收新的(不一定是更新的) Prop 时
我是一名优秀的程序员,十分优秀!