backpropagation - 了解 oop Backprop 实现中的错误
问题描述
晚上好大家。我已经经常使用 NN,所以我认为是时候面对背景了。结果,我花了很多时间从头开始使用 C++ 实现神经网络。不过,我没有得到任何有用的输出。
我的问题是干净的 OOP 和高效的实现,尤其是我必须从一个 Layer 类反向传播到下一个类。我知道我只是跳过了雅可比矩阵的完整计算/转发,但据我了解,这不是必需的,因为大多数条目都将被删除。
我有一个大小为 n 的 softmax 类:
前向传递:它接受长度为 n 的输入向量输入并创建大小为 n 的输出向量输出。
sum = 0; for (int i = 0; i < n; i++) sum += e^input[ i ].
然后它计算长度为 n 的输出向量输出:
output [ i ] = e^input [ i ] / sum
Backward Pass:它采用大小为 n 的反馈向量 target,即目标值。
我的 softmax 类中没有权重或偏差,所以我只计算大小为 n 的反馈向量反馈:
feedback[ i ] = output[ i ] - target[ i ]
这就是我从我的 softmax 层返回的。
我有一个完全连接的类:m -> n
前向传递:它采用大小为 m 的输入向量。我计算大小为 n 的净活动向量 net 和大小为 n 的输出向量:
net[ i ] = b[ i ];
for (int j = 0; j < m; j++) net[ i ] += w[ i ][ j ] * input[ i ]
output [ i ] = 1 / (1 + e^-net[ i ])
Backward Pass:它从下一层获取一个大小为 n 的反馈向量。
b'[ i ] = b[ i ] + feedback[ i ] * 1 * learningRate
w'[ i ][ j ] = w[ i ][ j ] + feedback[ i ] * input[ j ] * learningRate
大小为 m 的新反馈数组:
feedback'[ i ] = 0;
feedback'[ i ] += feedback[ j ] * weights[ i ][ j ] * (output[ j ] * (1 - output[ j ]))
当然,来自一个全连接层的反馈会传递到下一个,以此类推。我一直在阅读几篇文章,发现这篇文章非常好: https ://www.ics.uci.edu/~pjsadows/notes.pdf
我觉得我的实现应该与我在此类论文中读到的相同,但即使经过少量训练示例(~100),我的网络输出也接近于一个常数。基本上好像它只是取决于偏见。
那么,如果我的理论理解有误,或者我的实施有一些问题,有人可以给我一个提示吗?
解决方案
推荐阅读
- android - React Native Android 崩溃 - RNKeychainManager.setInternetCredentialsForServer 有 6 个参数,预期为 7
- react-redux - 已启用 Google maps api 地理编码,地点和 javascript 未显示错误,地理编码请求已通过 REQUEST_DENIED 满足
- python - 如何绘制 ohlc 图表?
- amazon-web-services - “JavaServer Faces 2.2 需要动态 Web 模块 2.5 或更高版本。”
- git - AWS Codebuild - 可以从 codebuild buildspec 访问最后一个 git commit 消息吗?
- oop - 哪个设计更好?把这个逻辑放在前端还是后端?
- docker - 如何泊坞窗运行指向同一端口的 API 项目同时具有两个 GitHub 分支
- reactjs - 使用 TinyMCE-react
- java - 如何将 xhtml 表单中的数据插入 netbeans 中的 Java DB?
- javascript - 路由时如何避免“超出最大更新深度”错误?