【发布时间】:2020-07-25 00:51:18
【问题描述】:
我试图将我的神经网络的激活函数从 sigmoid 更改为 RELU(或更具体地说是 SELU)。由于这种变化我得到了很多爆炸梯度,所以我尝试使用批量标准化。我计算了我的误差函数的梯度 w.r.t 学习参数 \beta 和 \gamma,但似乎它们与我在几个(遗憾的是只有 Python)示例中看到的有点不同。
Here,例如页面底部的代码示例是dbeta = np.sum(dout, axis=0),我想知道这个dout到底是什么。
我的衍生产品如下所示:
Derivation of error function w.r.t \beta
我在这个推导中做错了什么?
非常感谢您的帮助。
【问题讨论】:
-
dout可能是 delta out,或者更具体地说,是输出的导数。 -
我对 delta out 也有同样的想法,但它是关于什么的导数?
-
@Toxxiqq 是损失函数相对于神经元误差的导数(如果是最后一层),否则是该层的激活函数相对于 delta 的导数上一层(如果不是最后一层)。
-
很难找到许多 AI 算法的可读且规范的示例。要么是因为它们使用了 GPU 技术,要么是因为它们是用 TLDR 的可怕 OOP 代码编写的;阅读片刻后旗帜升起。尽管性能不高,但应该存在的是这些算法的清晰和干净的实现,没有隐藏状态和其他有趣的东西,这些东西会掩盖可读性。对于反向传播:2 个函数,无状态(
forward(), backward()其中参数和输出反映了通常隐藏在代码深处的任何内容。)
标签: c++ neural-network gradient-descent backpropagation derivative