RNN не вписывается в линейный тренд (проблема Keras BPTT?) - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь обучить простому LSTM, чтобы соответствовать линии.Моя гипотеза состоит в том, что я должен быть в состоянии согласовать линейно убывающий тренд с нулевым входом, поскольку LSTM может решить, насколько он слушает свой вход по сравнению с внутренним состоянием, и, таким образом, может научиться работать только с внутренним состоянием.В основном вырожденный случай для проверки, может ли LSTM соответствовать ожидаемому результату с нулевым вводом.

Я создаю свои входные и целевые данные:

seq_len = 1000    
x_train = np.zeros((1, seq_len, 1))  # [batch_size, seq_len, num_feat]
target = np.linspace(100, 0, num=seq_len).reshape(1, -1, 1)

Я создаю довольно простую сеть:

from keras.models import Model
from keras.layers import LSTM, Dense, Input, TimeDistributed

x_in = Input((seq_len, 1))
seq1 = LSTM(8, return_sequences=True)(x_in)
dense1 = TimeDistributed(Dense(8))(seq1)
seq2 = LSTM(8, return_sequences=True)(dense1)
dense2 = TimeDistributed(Dense(8))(seq2)
out = TimeDistributed(Dense(1))(dense2)

model = Model(inputs=x_in, outputs=out)
model.compile(optimizer='adam', loss='mean_squared_error')

history = model.fit(x_train, target, batch_size=1, epochs=1000,
                    validation_split=0.)

Я также создал собственный обратный вызов, который вызывает model.predict(x_train) после каждой эпохи и добавляет результаты в массив, чтобы я мог видеть, как выходные данные моей модели меняются со временем.В основном, модель просто учится предсказывать постоянное значение, которое постепенно (асимптотически) приближается к среднему значению моей целевой линии (целевая линия красного цвета, не знаю, почему легенда не показывается):

Epoch prediction history

Так что, по сути, ничто не приводит мой ответ в соответствие с реальной линией, я просто постепенно приближаюсь к среднему линии.Я подозреваю, что у меня нет никакого градиента по времени (индекс данных), просто средний градиент по времени.Но я бы подумал, что потери LSTM автоматически дадут вам градиент во времени.

Я пробовал:

  • различные функции активации для слоев LSTM (None, 'relu'как для обычной, так и для повторной активации)
  • различных оптимизаторов ('nadam', 'adadelta', 'rmsprop')
  • функция потери 'mean_aboslute_error', чего я не ожидалулучшить результаты, и он действовал примерно так же
  • , передавая последовательности случайных чисел, взятых из нормального распределения, в качестве входных данных
  • , заменяя LSTM на GRU

Ничто, похоже, не делает этого.

У кого-нибудь есть предложение относительно того, как я могу заставить эту вещь тренироваться на градиенте в зависимости от моего индекса последовательности, то есть g(t)?Или какие-либо другие предложения о том, как я могу заставить это работать?

Примечание: с показанным трендом, если LSTM приводит к постоянному значению точно в среднем (50),Минимальная средняя абсолютная ошибка будет 25, а минимальная средняя квадратическая ошибка будет около 835,8.Так что, если мы не видим ничего лучшего, мы, вероятно, не подходим к линии, просто к среднему значению.

Просто некоторые ссылки на случай, если вы запустите это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...