我正在尝试为我在论文中找到的分段连续函数构建自定义渐变
对数函数、线性函数和指数函数之间的连续统一体,及其提高神经网络泛化能力的潜力 - Godfrey
当前问题:在我的网络的自定义层中,可学习参数的梯度爆炸,导致nans生成。这个自定义层是上述论文中定义的可学习激活函数。
尝试过的解决方案
- 剪辑优化器的梯度 - >当我用例如编译模型时这没有影响
keras.optimizer.Adam(clipnorm=0.5) - 剪辑自定义层中可学习参数的值 -> 这给出了一些我无法回忆的错误
- 创建自定义梯度计算来控制可学习参数的梯度 -> 不确定应该如何计算梯度。
我现在的梯度计算函数是这样的
@tf.custom_gradient
def call_lt0(alpha_actv, x):
def grad(dx):
grad_x = 1/(1-alpha_actv * (alpha_actv + x))
grad_alpha = (tf.math.log(1-alpha_actv * (alpha_actv + x)) - ((2 * alpha_actv ** 2 + alpha_actv * x)/(alpha_actv ** 2 + alpha_actv * x - 1))) / alpha_actv ** 2
return grad_x * dx, grad_alpha * dx # denk ik..?
return (tf.math.exp(alpha_actv * x) - 1) / alpha_actv + alpha_actv, grad
其中我给出了 x 变量的梯度和可学习的参数 alpha。但是,当我检查这些输出时,tf.GradientTape我只得到一个输出.. 由于我对grad. 此外,当我让 keras/tensorflow 计算所有内容并tf.GradientTape再次检查输出时,我只得到一个值..这是我对单个可学习参数的期望。所以在某个地方我做错了什么,或者误解了这个grad功能。
有人可以给我指路吗?