首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动量反向传播

动量反向传播
EN

Stack Overflow用户
提问于 2017-11-09 21:03:03
回答 1查看 3.3K关注 0票数 7

我遵循本教程实现反向传播算法。然而,我仍然坚持执行这个算法的势头。

没有动量,这是权重更新方法的代码:

代码语言:javascript
复制
def update_weights(network, row, l_rate):
    for i in range(len(network)):
        inputs = row[:-1]
        if i != 0:
            inputs = [neuron['output'] for neuron in network[i - 1]]
        for neuron in network[i]:
            for j in range(len(inputs)):
                neuron['weights'][j] += l_rate * neuron['delta'] * inputs[j]
            neuron['weights'][-1] += l_rate * neuron['delta']

以下是我的执行情况:

代码语言:javascript
复制
def updateWeights(network, row, l_rate, momentum=0.5):
    for i in range(len(network)):
        inputs = row[:-1]
        if i != 0:
            inputs = [neuron['output'] for neuron in network[i-1]]
        for neuron in network[i]:
            for j in range(len(inputs)):
                previous_weight = neuron['weights'][j]
                neuron['weights'][j] += l_rate * neuron['delta'] * inputs[j] + momentum * previous_weight
            previous_weight = neuron['weights'][-1]
            neuron['weights'][-1] += l_rate * neuron['delta'] + momentum * previous_weight

这给了我一个Mathoverflow误差,因为在多个时期,权重呈指数级变大。我相信我的previous_weight逻辑对更新是错误的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-10 15:53:04

我会给你个提示。在实现中将momentumprevious_weight相乘,这是同一步中网络的另一个参数。这显然很快就爆炸了。

相反,您应该记住前一个反向传播步骤上的整个更新向量l_rate * neuron['delta'] * inputs[j],并将其加起来。它看起来可能是这样的:

代码语言:javascript
复制
velocity[j] = l_rate * neuron['delta'] * inputs[j] + momentum * velocity[j]
neuron['weights'][j] += velocity[j]

..。其中velocity是一个与network相同长度的数组,定义的范围比updateWeights大,并使用零初始化。详情请参见这个职位

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47211478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档