神经网络中的梯度检查

梯度检查

怎么保证自己写的神经网络没有BUG呢?事实上这是一个非常重要的问题。一方面,千辛万苦想到一个算法,结果效果不理想,那么是算法本身错了还是代码实现错了呢?定位这种问题肯定要花费大量的时间和精力。另一方面,由于神经网络的复杂性,我们几乎无法事先知道神经网络的输入和输出,因此类似TDD(测试驱动开发)这样的开发方法似乎也不可行。

办法还是有滴,就是利用梯度检查来确认程序是否正确。梯度检查的思路如下:

对于梯度下降算法:
在这里插入图片描述
w就是我们要检查的权重,Ed就是经过激活函数处理以后的部分,这里我们激活函数以sigmod为例(数学公式编辑起来太麻烦了,直接粘贴了。):
在这里插入图片描述
下面是具体的实现代码

def gradient_check(network, sample_feature, sample_label):'''梯度检查network: 神经网络对象sample_feature: 样本的特征sample_label: 样本的标签'''# 计算网络误差network_error = lambda vec1, vec2: \0.5 * reduce(lambda a, b: a + b, map(lambda v: (v[0] - v[1]) * (v[0] - v[1]),zip(vec1, vec2)))# 获取网络在当前样本下每个连接的梯度network.get_gradient(sample_feature, sample_label)# 对每个权重做梯度检查    for conn in network.connections.connections: # 获取指定连接的梯度actual_gradient = conn.get_gradient()# 增加一个很小的值,计算网络的误差epsilon = 0.0001conn.weight += epsilonerror1 = network_error(network.predict(sample_feature), sample_label)# 减去一个很小的值,计算网络的误差conn.weight -= 2 * epsilon # 刚才加过了一次,因此这里需要减去2倍error2 = network_error(network.predict(sample_feature), sample_label)# 根据式6计算期望的梯度值expected_gradient = (error2 - error1) / (2 * epsilon)# 打印print 'expected gradient: \t%f\nactual gradient: \t%f' % (expected_gradient, actual_gradient)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部