我试图解决原始LSTM论文中描述的实验3a:带有张量流LSTM的http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf并且失败
来自论文:任务是观察然后对输入序列进行分类。有两个类,每个类的概率为0.5。只有一条输入线。只有第一个N个实值序列元素传达有关该类的相关信息。位置t>的序列元素N由高斯生成,平均值为零,方差为0.2。
他在论文中描述的网络架构: "我们使用具有1个输入单元,1个输出单元和3个大小为1的单元块的3层网络。输出层仅接收来自存储器单元的连接。存储器单元和门单元接收来自输入单元,存储器单元和门单元的输入,并具有偏置权重。门单元和输出单元是[0; 1],h在[-1; 1]和g在[-2; 2]"
我尝试使用LSTM重现它,其中3个隐藏单位为T = 100且N = 3但失败。
我使用在线培训(即在每个序列后更新权重),如原始论文中所述
我的代码的核心如下:
self.batch_size = batch_size = config.batch_size
hidden_size = 3
self._input_data = tf.placeholder(tf.float32, (1, T))
self._targets = tf.placeholder(tf.float32, [1, 1])
lstm_cell = rnn_cell.BasicLSTMCell(hidden_size , forget_bias=1.0)
cell = rnn_cell.MultiRNNCell([lstm_cell] * 1)
self._initial_state = cell.zero_state(1, tf.float32)
weights_hidden = tf.constant(1.0, shape= [config.num_features, config.n_hidden])
inputs = []
for k in range(num_steps):
nextitem = tf.matmul(tf.reshape(self._input_data[:, k], [1, 1]) , weights_hidden)
inputs.append(nextitem)
outputs, states = rnn.rnn(cell, inputs, initial_state=self._initial_state)
pred = tf.sigmoid(tf.matmul(outputs[-1], tf.get_variable("weights_out", [config.n_hidden,1])) + tf.get_variable("bias_out", [1]))
self._final_state = states[-1]
self._cost = cost = tf.reduce_mean(tf.square((pred - self.targets)))
self._result = tf.abs(pred[0, 0] - self.targets[0,0])
optimizer = tf.train.GradientDescentOptimizer(learning_rate = config.learning_rate).minimize(cost)
知道为什么它无法学习?
我的第一直觉是为每个班级创建一个输出,但在论文中他特别提到了一个输出单元。
由于
答案 0 :(得分:0)
似乎我需要forget_bias> 1.0。对于长序列,对于T = 50,网络无法使用默认的forget_bias,例如我需要forget_bias = 2.1