TensorFlow1.14自定义ReLU梯度与原生ReLU梯度计算结果不一致问题
自定义ReLU梯度与原生实现梯度不一致问题原因
核心原因是随机张量在多次session.run()调用时被重复采样,和自定义梯度的实现逻辑无关:
- 你代码中定义的
vv = tf.random.normal((32,100))是随机数生成算子,每调用一次session.run()就会重新生成一组独立的正态分布随机值:- 第一次执行
sess.run(tf.gradients(z1, vv)[0])时,vv生成第一组随机值,基于这组值计算自定义ReLU梯度 - 第二次执行
sess.run(tf.gradients(z2, vv)[0])时,vv生成第二组完全不同的随机值,基于这组新值计算原生ReLU梯度
- 第一次执行
- 两次梯度计算的输入都不相同,结果自然不可能匹配。0.49左右的平均差正好符合正态分布样本正负占比各约50%的统计特征,属于预期内的结果。
你的自定义梯度逻辑本身是正确的,和原生ReLU的梯度规则完全一致,只需要修改测试代码,将两个梯度计算放在同一次run调用中,保证两次计算用的是同一组vv值即可得到预期结果:
# 同一次run调用中计算两个梯度,避免vv重复采样 dzdv1, dzdv2 = sess.run([tf.gradients(z1, vv)[0], tf.gradients(z2, vv)[0]]) print(np.mean(np.abs(dzdv1-dzdv2)))
修改后输出的平均绝对差为0。
内容的提问来源于stack exchange,提问作者DarkNinja24
相关产品推荐
相关产品推荐

