微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反向传播算法不适用于感知器

如何解决反向传播算法不适用于感知器

我是神经网络的新手,我想尝试制作一个模型来猜测某个点相对于函数输出是低于还是高于。这个想法的灵感来自这个视频 https://youtu.be/DGxIcDjPzac 。我还想制作一个神经网络库,供我在以后的项目中使用。

我做错了什么?

在下面的 gif 中,我开始了训练,但似乎并不适用于所有要点。蓝线是函数 (y = x + 50),它上面的所有点都应该是绿色的,但不是。为了简化示例和更容易调试,我选择了一个简单的函数,这样我只能对模型使用感知。

我还创建了一个方法 backPropagationDebug(...)显示每一步中所有矩阵预测错误的点,但我找不到问题所在。

enter image description here

public void backPropagation(double[][] input,double[][] expected) {
    double[][][] outputs = getoutputs(input);

    double[][] currentOutput = outputs[outputs.length - 1];
    double[][] currentError = Matrix.subtract(expected,currentOutput);

    for (int i = brain.length - 1; i >= 0; i--) {
        final double[][] layer = brain[i];
        final double[][] prevIoUsOutput = outputs[i];

        final double[][] layerTranspose = Matrix.transpose(layer);
        final double[][] prevIoUsError = Matrix.multiply(layerTranspose,currentError);

        /* FIST BIT */
        double[][] errorSigmoid = Matrix.copyOf(currentError);

        for (int k = 0; k < errorSigmoid.length; k++) {
            errorSigmoid[k][0] *= - derivativeActivationFunction(currentOutput[k][0]);
        }

        /* SECOND BIT */
        final double[][] slopeMatrix = Matrix.multiply(errorSigmoid,Matrix.transpose(prevIoUsOutput));

        /* UPDATE THE WEIGHTS */
        for (int k = 0; k < layer.length; k++) {
            for (int l = 0; l < layer[0].length; L++) {
                layer[k][l] = layer[k][l] - learningRate * slopeMatrix[k][l];
            }
        }

        currentOutput = prevIoUsOutput;
        currentError = prevIoUsError;
    }
}

反向传播步骤的灵感来自以下公式:

enter image description here

enter image description here

(来自:Tariq Rashid 制作您自己的神经网络)

代码在github上,可以轻松运行,因为它是一个gradle项目:https://github.com/StamateValentin/Artificial-Intelligence-Playground/tree/7a7446b7faedd7673bc53a62304ff3a5180d77eb

我使用的资源在 README.md 文件中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。