使用 ReLU + 交叉熵时如何避免 NaN?

机器算法验证 神经网络 深度学习 人工智能 自动编码器
2022-04-03 11:09:18

ReLU 的范围为 [0, +Inf)。因此,当 ReLU 或 softplus 产生的激活值 z=0/1 时,交叉熵计算的损失值:loss = -(x*ln(z)+(1-x)*ln(1-z )) 将转向 NaN。据我所知,我的变量在定义后无法修改的 theano.tensor 类型中运行。因此,我不能简单地将 z 中 0/1 的值更改为某种近似值(例如 0.001/0.999)。如何在不替换 MSE 的交叉熵的情况下避免这种烦人的情况?

1个回答

使用 ReLU 时推荐的做法是在 SGD 更新期间剪裁梯度,如果范数高于某个阈值(由 Mikolov 建议,请参阅http://arxiv.org/pdf/1211.5063.pdf

这需要另一个超参数,即阈值。参考论文的建议是对一些梯度进行采样以了解(非爆炸)范数并使用样本平均值。根据我有限的经验,这个参数值得尝试一下,甚至可以达到样本平均值的一半。

伪代码看起来像,

if norm(grad) > threshold:
   grad = grad * threshold/norm(grad)