为什么 LSTM 不能减少损失

Why the LSTM can't reduce the loss

我正在使用 lstm 训练模型来预测股票价格,我使用了这样的多对一模式:

                                    O 
                                    | 
                              O O O O 
                              | | | | 
                              O O O O 

我用keras框架搭建了网络,但是神经网络好像不太容易搭建...

这是我的 python 的 lstm NN 源代码:

def lstm_rls(num_in,num_out=1, batch_size=128, step=1,dim=1):
    model = Sequential()
    
    model.add(LSTM(
        1024,
        input_shape=(step, num_in),
        return_sequences=True))
    model.add(Dropout(0.2))
    
    model.add(LSTM(
        512,
        return_sequences=False))
    model.add(Dropout(0.2))
    
    model.add(Dense(1))
    model.add(Activation('linear'))
    model.compile(loss='mse', optimizer='rmsprop')
    return model

我训练了大约 512 个 epoch,但损失总是在 7

左右

Epoch 1/512

3968/3968 [==============================] - 4s 978us/step - loss: 48.6274

Epoch 2/512

3968/3968 [==============================] - 1s 220us/step - loss: 11.1913

Epoch 3/512

3968/3968 [==============================] - 1s 221us/step - loss: 6.8059

Epoch 4/512

3968/3968 [==============================] - 1s 220us/step - loss: 6.7905

Epoch 5/512

3968/3968 [==============================] - 1s 221us/step - loss: 6.8151

Epoch 6/512

3968/3968 [==============================] - 1s 219us/step - loss: 6.7907

Epoch 7/512

3968/3968 [==============================] - 1s 220us/step - loss: 6.8060

Epoch 8/512

3968/3968 [==============================] - 1s 221us/step - loss: 6.7824

... ... ...

Epoch 509/512

3968/3968 [==============================] - 1s 222us/step - loss: 6.7807

Epoch 510/512

3968/3968 [==============================] - 1s 223us/step - loss: 6.8199

Epoch 511/512

3968/3968 [==============================] - 1s 222us/step - loss: 6.7726

Epoch 512/512

3968/3968 [==============================] - 1s 222us/step - loss: 6.7715

我遇到了你的图像字幕问题(我有四个 Gpu tesla k20)。训练 LSTM 需要很长时间(大约几天)。我认为你的问题很自然。我使用的一种方法是增加批量大小。另一方面,批量大小的增加与性能和内存使用量有关。

今天我看了一节关于调试技巧的讲座。它说您可以分析代码的一种方法是: 验证目标函数是否在小训练集上减少,而不是第一次全部减少。