Введение:

Чтобы понять этот блог и получить как можно больше знаний, я хочу предположить, что у вас есть хотя бы базовое представление о DNN (Глубокие нейронные сети), и если вы не знакомы с этими терминами, я настоятельно рекомендую вам посмотреть это видео. » сначала из Лекс Фридман.

Хорошо, давайте начнем с простого примера, представьте, что вы присоединились к своим друзьям, чтобы вместе посмотреть фильм, и как всегда опоздали! около 20 минут. Сколько вам потребуется времени, чтобы понять, что происходит в фильме? может быть 5 или 10 минут в лучшем случае, а в некоторых случаях вы никогда не поймете, пока не пересмотрите первую часть, поэтому наш мозг не начинает думать каждый раз с нуля, мы берем знания и информацию из предыдущих действий и строим наше понимание основано на предыдущих, и это логика, верно?

Отсюда и идея моделей последовательности, которые учитывают предыдущие знания для прогнозирования следующего элемента или последовательности. и вопрос в том, сколько нам нужно запомнить из предыдущих данных. Хорошо, я приведу вам два примера, и ваша миссия состоит в том, чтобы обнаружить на нем правило (как это делает любая модель машинного обучения).

Первый пример: Последовательность Фибоначчи

Попробуйте определить следующий элемент в этом примере:

1, 2, 3, 5, 8,?

Да, вы правы, Xn=Xn-1 + Xn-2, поэтому для вычисления Xn вам нужно знать Xn-1 и Xn-2. Другими словами, нам нужны выходные данные двух предыдущих последовательностей, чтобы предсказать значение, и это почти то, что делают RNN (нам нужно немного поговорить о них, чтобы понять LSTM).

Второй пример:

Попробуйте угадать следующее слово в этом абзаце:

Привет всем, Меня зовут Мосбех, я из Туниса, и сегодня я хочу поделиться с вами своей первой статьей на среде…, я пишу этот блог на английском языке, но я говорю ??????

Я вижу, что вы вводите в гугле слова "на чем говорят тунисцы" или подобные, но зачем вы это делаете, да, это только потому, что вы прочитали "я из Туниса" в абзац, так что то, что вы сделали здесь, - это то, что именно делают LSTM! вы понимаете из контекста, что я говорю о языке, а затем вы возвращаетесь, чтобы узнать, что это за язык!

Как я уже говорил ранее, нам нужно сначала понять RNN.

Рекуррентные нейронные сети

Вы уже знаете эту картинку, это наша последовательность Фибоначчи.

Мы можем проиллюстрировать эту последовательность следующим образом: 8=3+5, что является результатом (1+2) + (2+3)…

Давайте теперь перейдем к архитектуре RNN, которая очень похожа на то, что мы видели выше:

Идея довольно проста, у нас есть Последовательные данные (тексты, речь, …), поэтому мы можем построить базовую модель, содержащую последовательные копии одного и того же слоя А, и каждая из которых передает сообщение преемнику, в то время как Xn и hn являются входом и выходом каждого слоя, и на самом деле это работало очень хорошо, когда нам просто нужно было посмотреть последнюю информацию, например, если бы я сказал, что такое 3 основных ????? вы скажете, что пропущенное слово — цвета, и вам просто нужно взглянуть на самую свежую информацию 3 основных, чтобы предсказать это.

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

Теперь RNN способны предсказать, что я говорю по-арабски, потому что я из Туниса из нашего второго примера в первой части, ответ, вероятно, нет, в то время как разрыв между «я из Тунис» и «я говорю» большие, RNN могут быть не в состоянии предсказать следующее слово, но, к счастью, появились LSTM и решили эту проблему.

Сети с долговременной кратковременной памятью

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

Примечание. Состояние ячейки также может быть двунаправленным.

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

Если вам интересно понять эту архитектуру, продолжайте читать этот удивительный блог от Кристофера Олаха.

Если вам интересно узнать, как кодировать их с помощью Tensorflow, я настоятельно рекомендую курс Обработка естественного языка от Coursera или просто посмотрите этот очень простой блог датакемпа здесь.

Код:

Tensorflow упрощает нам задачу, давайте перейдем к разделу кода, и в этой статье я буду использовать набор данных MasterCard Stock от Kaggle для прогнозирования цены акций.

!Прежде чем начать этот раздел, обязательно ознакомьтесь с набором данных здесь.

#Importing libraries 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout, GRU, Bidirectional
from tensorflow.keras.optimizers import SGD
from tensorflow.random import set_seed
set_seed(123)
np.random.seed(123)

В этой части мы импортируем набор данных MasterCard, добавив столбец Date в индекс и преобразовав его в формат DateTime. Мы также удалим ненужные столбцы из набора данных, поскольку нас интересуют только цены акций, объем и дата.

Набор данных имеет «Дата» в качестве индекса, а столбцы «Открытие», «Максимум», «Минимум», «Закрытие» и «Объем». Похоже, мы успешно импортировали очищенный набор данных.

#Loading the data
#make sure to change the file name paramate!
dataset = pd.read_csv(
    filename, index_col="Date", parse_dates=["Date"]
).drop(["Dividends", "Stock Splits"], axis=1)

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

Визуализация и разделение данных:

tstart = 2016
tend = 2020
def train_test_plot(dataset, tstart, tend):
    dataset.loc[f"{tstart}":f"{tend}", "High"].plot(figsize=(16, 4), legend=True)
    dataset.loc[f"{tend+1}":, "High"].plot(figsize=(16, 4), legend=True)
    plt.legend([f"Train (Before {tend+1})", f"Test ({tend+1} and beyond)"])
    plt.title("MasterCard stock price")
    plt.show()
train_test_plot(dataset,tstart,tend)

def train_test_split(dataset, tstart, tend):
    train = dataset.loc[f"{tstart}":f"{tend}", "High"].values
    test = dataset.loc[f"{tend+1}":, "High"].values
    return train, test
training_set, test_set = train_test_split(dataset, tstart, tend)
sc = MinMaxScaler(feature_range=(0, 1))
training_set = training_set.reshape(-1, 1)
training_set_scaled = sc.fit_transform(training_set)
def split_sequence(sequence, n_steps):
    X, y = list(), list()
    for i in range(len(sequence)):
        end_ix = i + n_steps
        if end_ix > len(sequence) - 1:
            break
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return np.array(X), np.array(y)

n_steps = 60
features = 1
# split into samples
X_train, y_train = split_sequence(training_set_scaled, n_steps)
# Reshaping X_train for model
X_train = X_train.reshape(X_train.shape[0],X_train.shape[1],features)

Давайте построим и скомпилируем нашу модель:

# The LSTM architecture
model_lstm = Sequential()
model_lstm.add(LSTM(units=125, activation="tanh", input_shape=(n_steps, features)))
model_lstm.add(Dense(units=1))
# Compiling the model
model_lstm.compile(optimizer="RMSprop", loss="mse")
model_lstm.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 125)               63500     
_________________________________________________________________
dense (Dense)                (None, 1)                 126       
=================================================================
Total params: 63,626
Trainable params: 63,626
Non-trainable params: 0
_________________________________________________________________

Обучать модель в течение 50 эпох:

model_lstm.fit(X_train, y_train, epochs=50, batch_size=32)
Epoch 50/50
38/38 [==============================] - 1s 30ms/step - loss: 3.1642e-04

Протестируйте модель:

Мы собираемся повторить предварительную обработку и нормализовать тестовый набор. Прежде всего, мы преобразуем, а затем разделим набор данных на выборки, изменим его форму, предскажем и обратным преобразованием предскажем в стандартную форму.

dataset_total = dataset.loc[:,"High"]
inputs = dataset_total[len(dataset_total) - len(test_set) - n_steps :].values
inputs = inputs.reshape(-1, 1)
#scaling
inputs = sc.transform(inputs)
# Split into samples
X_test, y_test = split_sequence(inputs, n_steps)
# reshape
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], features)
#prediction
predicted_stock_price = model_lstm.predict(X_test)
#inverse transform the values
predicted_stock_price = sc.inverse_transform(predicted_stock_price)
def plot_predictions(test, predicted):
    plt.plot(test, color="gray", label="Real")
    plt.plot(predicted, color="red", label="Predicted")
    plt.title("MasterCard Stock Price Prediction")
    plt.xlabel("Time")
    plt.ylabel("MasterCard Stock Price")
    plt.legend()
    plt.show()

def return_rmse(test, predicted):
    rmse = np.sqrt(mean_squared_error(test, predicted))
    print("The root mean squared error is {:.2f}.".format(rmse))
plot_predictions(test_set,predicted_stock_price)

Я рекомендовал вам попробовать модель ГРУ, так как она даст вам лучшие результаты. дайте ему шанс, код здесь.

Заключение:

Простая модель RNN великолепна, когда разрыв между релевантной информацией и местом, где она нужна, невелик, а LSTM может обрабатывать большие пробелы, но для обучения LSTM требуется огромная память, потому что они помнят почти все, так что, если мы позволим каждому шагу RNN выбирает информацию для просмотра из некоторой более крупной коллекции информации. и это внимание!

На сегодня это все, надеюсь, вы получили некоторые знания о моделях последовательности, в следующий раз я расскажу о ГРУ и Трансформерах.