【问题标题】:Neural Net gradient calculation with Batch Normalization C++使用 Batch Normalization C++ 计算神经网络梯度
【发布时间】: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


【解决方案1】:

我尝试使用 Libtorch C++ 代码在 MNIST 上的一个小型 CNN testet 中添加 batchnorm2d 层,无论是否使用 GPU 这里 https://github.com/ollewelin/libtorch-GPU-CNN-test-MNIST-with-Batchnorm

然后精度会增加一点。 搜索 “bn1” 要么 “bn2” 在此代码中,您可以找到。 在带有 GPU 和 Libtorch + OpenCV for C++ 的 Ubuntu 上安装: https://github.com/ollewelin/torchlib-opencv-gpu

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 2013-06-07
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2016-11-29
    • 2019-01-10
    • 2014-10-10
    相关资源
    最近更新 更多