首页 > 解决方案 > 了解 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),我的网络输出也接近于一个常数。基本上好像它只是取决于偏见。

那么,如果我的理论理解有误,或者我的实施有一些问题,有人可以给我一个提示吗?

标签: backpropagationsoftmax

解决方案


推荐阅读