我正按时间序列训练RNN。我将RNNCell
子类化,我在dynamic_rnn
中使用它。 RNNCell
的拓扑结构如下:
[15, 100, 3]
)[15, 98, 5]
)[15, 1, 20]
)[15, 1, 21]
)[15, 1]
)[15]
) dynamic_rnn
的批量大小约为100(与上述描述中的100不同,即数据窗口中的时间段数)。时代由大约200批次组成。
我想尝试超参数和正则化,但我经常尝试完全停止学习,我不明白为什么。这些是发生的一些奇怪的事情:
Adagrad有效,但如果我使用Adam或Nadam,则渐变都为零。
我被迫设定一个巨大的学习率(~1.0),以便看到从时代到时代的学习。
如果我尝试在任何回合后添加dropout,即使我将keep_prob设置为1.0,它也会停止学习。
如果我调整卷积中的内核数量,对于一些看似同样好的选择(例如5,25,1对5,20,1),网络将再次停止学习。
为什么这个模型如此脆弱?它是RNNCell
的拓扑吗?
编辑:
这是RNNCell
:
class RNNCell(tf.nn.rnn_cell.RNNCell):
def __init__(self):
super(RNNCell, self).__init__()
self._output_size = 15
self._state_size = 15
def __call__(self, X, prev_state):
network = X
# ------ 2 convolutional layers ------
network = tflearn.layers.conv_2d(network, 5, [1, 3], activation='relu', weights_init=tflearn.initializations.variance_scaling(), padding="valid", regularizer=None)
width = network.get_shape()[2]
network = tflearn.layers.conv_2d(network, 20, [1, width], [1, 1], activation='relu', weights_init=tflearn.initializations.variance_scaling(), padding="valid", regularizer=None)
# ------ concatenate the previous state ------
_, height, width, features = network.get_shape()
network = tf.reshape(network, [-1, int(height), 1, int(width * features)])
network = tf.concat([network, prev_state[..., None, None]], axis=3)
# ------ last convolution and softmax ------
network = tflearn.layers.conv_2d(network, 1, [1, 1], activation='relu', weights_init=tflearn.initializations.variance_scaling(), padding="valid", regularizer=None)
network = network[:, :, 0, 0]
predictions = tflearn.layers.core.activation(network, activation="softmax")
return predictions, predictions
@property
def output_size(self):
return self._output_size
@property
def state_size(self):
return self._state_size
答案 0 :(得分:1)
很可能你正面临消失的渐变问题。
使用ReLU和少量参数进行调整可能会导致不稳定。据我所知,根据描述,例如在第一层中只有1x3x5 = 15
可训练参数。如果假设初始化大约为零,则平均50%参数的梯度将始终保持为零。一般来说ReLU在一个邪恶的小网络上,特别是在RNN的情况下。