Я пытаюсь обучить простому 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)
после каждой эпохи и добавляет результаты в массив, чтобы я мог видеть, как выходные данные моей модели меняются со временем.В основном, модель просто учится предсказывать постоянное значение, которое постепенно (асимптотически) приближается к среднему значению моей целевой линии (целевая линия красного цвета, не знаю, почему легенда не показывается):

Так что, по сути, ничто не приводит мой ответ в соответствие с реальной линией, я просто постепенно приближаюсь к среднему линии.Я подозреваю, что у меня нет никакого градиента по времени (индекс данных), просто средний градиент по времени.Но я бы подумал, что потери LSTM автоматически дадут вам градиент во времени.
Я пробовал:
- различные функции активации для слоев LSTM (
None
, 'relu'
как для обычной, так и для повторной активации) - различных оптимизаторов (
'nadam'
, 'adadelta'
, 'rmsprop'
) - функция потери
'mean_aboslute_error'
, чего я не ожидалулучшить результаты, и он действовал примерно так же - , передавая последовательности случайных чисел, взятых из нормального распределения, в качестве входных данных
- , заменяя
LSTM
на GRU
Ничто, похоже, не делает этого.
У кого-нибудь есть предложение относительно того, как я могу заставить эту вещь тренироваться на градиенте в зависимости от моего индекса последовательности, то есть g(t)
?Или какие-либо другие предложения о том, как я могу заставить это работать?
Примечание: с показанным трендом, если LSTM приводит к постоянному значению точно в среднем (50),Минимальная средняя абсолютная ошибка будет 25, а минимальная средняя квадратическая ошибка будет около 835,8.Так что, если мы не видим ничего лучшего, мы, вероятно, не подходим к линии, просто к среднему значению.
Просто некоторые ссылки на случай, если вы запустите это самостоятельно.