Machine learning 反向传播算法(神经网络)

Machine learning 反向传播算法(神经网络),machine-learning,neural-network,backpropagation,Machine Learning,Neural Network,Backpropagation,我尝试为神经网络实现一个在线反向传播算法 在计算了存储在变量“out”和“nets”中的每个节点的每个输出和净值(即未应用激活函数的值)之后,我还尝试计算每个节点的增量值(每个节点的诱导字段)和权重的变化;delta值存储在一个名为“delta”的变量中,无论变量是否存储在“delta_weights”变量中,实际上是一个三维矩阵:这个矩阵的第一个索引是我工作的级别,第二个表示网络中的一个节点,第三个是进入该节点的一个连接(synapsis) 首先,这两个变量包含所有零 然后我编写了以下代码:

我尝试为神经网络实现一个在线反向传播算法

在计算了存储在变量“out”和“nets”中的每个节点的每个输出和净值(即未应用激活函数的值)之后,我还尝试计算每个节点的增量值(每个节点的诱导字段)和权重的变化;delta值存储在一个名为“delta”的变量中,无论变量是否存储在“delta_weights”变量中,实际上是一个三维矩阵:这个矩阵的第一个索引是我工作的级别,第二个表示网络中的一个节点,第三个是进入该节点的一个连接(synapsis)

首先,这两个变量包含所有零

然后我编写了以下代码:

    for j in range(self.l):
    # self.l is the number of levels in the network: I'm running through all the levels
        if j == 0:
            # last level: output units
            for i in range(self.p[-1]):
                # self.p[j] is the number of units in level j: I'm considering every unit in the specific level fixed by the previous for cicle
                ei = np.subtract(target[i], outs[-1][i])
                # error of unit i in the last level
                deltai = ei * self.der_actfunct(nets[-1][i])
                delta[-1][i] = deltai
                for h in range(self.p[-2]):
                    delta_weights[-1][i][h] = eta * deltai * outs[-2][h]
        else:
            # other levels
            # going back until first level
            for i in range(self.p[-j-1]):
                temp = 0
                for k in range(self.p[-j]):
                    temp += delta[-j][k] * self.network[-j][k].weights[i]
                # calculating induced field of hidden nodes
                deltai = temp * self.der_actfunct(nets[-j-1][i])
                delta[-j-1][i] = deltai

                if j == self.l-1:
                    for h in range(self.n):
                        delta_weights[0][i][h] = eta * deltai * variable[h]
                else:
                    for h in range(self.p[-j-2]):
                        delta_weights[-j-1][i][h] = eta * deltai * outs[-j-2][h]

    # UPDATE WEIGHTS
    for j in range(self.l):
        for i in range(self.p[j]):
            self.network[j][i].set_weights(np.add(self.network[j][i].weights, delta_weights[j][i]), 0)
    return
我的问题是,训练错误在超过10个纪元后实际上会增加。我确信这是一个错误,那么我的代码怎么会出错呢


(我使用了eta,学习率,0.01)

你尝试过降低学习率吗?你使用迭代和优化吗?降低学习率只会降低上述过程的速度,但训练误差仍然会爆炸。我经常发现用一些简单的测试数据(如x,y坐标为直线)训练网络很有用在解决我的主要问题之前。这肯定会收敛到全局最小值,并有助于识别我的实现中的任何错误。