问题标签 [gradient-exploding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
46 浏览

python - 在 Keras 中,使用 SGD,为什么 model.fit() 训练顺利,但逐步训练方法给出了爆炸梯度和损失

因为这种爆炸梯度和爆炸损失发生在网络很大的时候,所以我就不费心把整个网络贴在这里了。但是我已经尽力了,在过去的两周里,我深入研究了源代码的细节来监控一些权重,手工编写更新步骤来监控损失、权重、更新、梯度和超参数以与内部进行比较地位。我想在我在这里问之前我已经做了一些功课。

问题是有两种使用 Keras API 的训练方法,is model.fit(), 2nd 是更定制的一种,用于更复杂的训练和网络,但是虽然我几乎所有东西都保持不变,model.fit()但没有爆炸损失,但是自定义方法爆炸。有趣的是,当我在一个小得多的网络下监控许多细节时,两种方法看起来都一样。

环境:

对于model.fit()方法:

自定义方法:

简而言之,相同的模型、相同的损失函数、相同的优化器 SGD、相同的图像馈送(我确实控制图像馈送顺序,尽管这里的代码是从训练数据中随机选择的)。内部过程中是否有任何东西model.fit()可以防止损失或梯度爆炸?

0 投票
0 回答
39 浏览

recurrent-neural-network - 使用 RNN 进行时间序列预测的数据标准化后的 MInMax 缩放

问题

我正在尝试预测为时间序列预测构建循环神经网络 (RNN)。RNN 中的一个常见问题是Exploding Gradients大误差梯度可能导致非常大的网络更新。为了解决这个问题,我通常Sigmoid在输出层添加一个激活函数,并将我的所有数据缩放到范围 [0, 1.0]。

在这种情况下,我想对输入使用标准化技术,因此也可能存在负值。当然,Sigmoid 函数会在最后一层去掉。然而,这给我留下了两个选择:

可能的解决方案

  1. 在输出层使用线性激活函数。
  2. 使用 MinMax Scaler 在 [-1.0, 1.0] 范围内缩放我的数据。然后使用 Tanh 激活函数。

问题

在将 StandardScaler 应用于数据输入之后,将 MinMaxScaler 应用于范围 [-1.0, 1.0] 是否有任何错误?您认为在 StandarScaler 之后应用 MinMaxScaler 是一种不好的做法吗?在输出端使用线性激活函数离开 RNN 会更好吗?

0 投票
1 回答
49 浏览

python - LSTM 网络损失为 nan,对于大于 1 的批大小

我正在尝试使用 LSTM 网络分析 EEG 数据,我将数据分成 4 秒的片段,从而产生大约 17000 个数据样本。为此,我在下面构建了以下网络:

训练时,损失从前几批立即变为 nan。为避免这种情况,我尝试添加经常性 dropout、le/l2 正则化、裁剪渐变以及正常 dropout。我还尝试更改学习率和批量大小的值。唯一有效的是经常性 dropout 为 0.9 并且 l1 和 l2 得分较低(0.00001),我还必须将 LSTM 网络中的单元数从最初的 30 降低到 5。有没有其他方法可以避免在不降低这么多特征并且对梯度有高惩罚的情况下这样做的损失?

我正在使用微软提供的 tensorflow-directml 和 tensorflow 版本 1.15.1 和 keras 2.7.0。