反向传播算法存在问题

3

我是新手,对神经网络不太熟悉。我试图编写一个简单的4-0-2 MLP,并在实践中学习反向传播算法。但我的反向传播总是发散,并且输出始终为[1,1]。我搜索了可能的原因,但无论是将学习率设置为相当小的数字(0.001),还是改变δ权重的符号都无法解决问题。

反向传播算法的代码:

def backward(self,trainingSamples):
    for i in range(len(trainingSamples)):
        curr_sample=trainingSamples[i]
        self.input=curr_sample[0]
        self.forward()
        print("output is "+str(self.output))
        curr_des_out=curr_sample[1]
        for i in range(len(self.outputs)):
            error=curr_des_out[i]-self.outputs[i].output
            der_act=self.outputs[i].activate(deriv=True)
            local_gradient=der_act*error
            for j in range(len(self.input)):
                self.weights[j][i]-=self.learning_rate*local_gradient*self.input[j]

trainingSamples 是一个包含多个数组的元组嵌套元组:( ([1,1,1,1],[1,0]), ([0,0,0,0],[0,1]),([1,0,0,0],[0,1]), ([1,0,1,0],[1,0]) )

以下是前向传递代码:

def forward(self):
    for i in range(len(self.outputs)):
        for j in range(len(self.input)):
            self.outputs[i].input+=self.input[j]*self.weights[j][i]
        self.outputs[i].activate()
        self.output[i]=self.outputs[i].output
    return self.output

1
你能展示一下你是如何计算输出的吗?也许前向传递有问题(我不想冒犯你,但是我认为我们排除的越多越好)。 - Willem Van Onsem
已完成,谢谢。 - david_I
有些不相关,但您可能需要研究线性代数并尝试使用基于numpy的矩阵实现。这样更少出错且更有效率。Goodfellow、Bengio和Courville的《深度学习》一书非常棒。 - Martin Krämer
@MartinKrämer,我立刻去查看一下。谢谢你的建议! - david_I
@MatrinKrämer,谢谢你!我已经寻找简单而完整的神经网络实现很长时间了。 - david_I
显示剩余6条评论
1个回答

1
尽管我无法看到您代码的完整实现(例如.activate()等),但我认为我已经了解了您是如何实现它们的。假设您已经正确地实现了它们,我认为您的代码存在一个问题,这将清楚地显示出分歧。
问题 - 或者至少是其中一个问题 - 看起来是您没有重置神经元的输入(树突)。
def forward(self):
    for i in range(len(self.outputs)):
        <b>self.outputs[i].input = 0</b>
        for j in range(len(self.input)):
            self.outputs[i].input+=self.input[j]*self.weights[j][i]
        self.outputs[i].activate()
        self.output[i]=self.outputs[i].output
    return self.output

由于您不断增加输入,我怀疑您最终确实会得到输出[1,1],因为当Sigmoid函数的输入趋近于无穷大时,其值趋近于1。

我使用sigmoid作为激活函数。 - david_I
@david_I:是的,但我假设sigmoid不会清除会话的输入? - Willem Van Onsem
如果w和x的形状不同(例如卷积层或其他层),那么dw和dx的形状也不同,我们该如何将顶层的dx按元素乘以前一层的dw,从而影响前一层的w的变化。 - machen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接