Меня всегда сравнивали с золотой рыбкой. Моя кратковременная память может быть нечеткой.
Нейронные сети (например, CNN и GAN) вообще не имеют памяти. Они хуже золотой рыбки.
Но RNN - это тип нейронной сети, которая может вспоминать прошлые данные / информацию обучения.
Например, если у вас есть нейронная сеть, которая предсказывает вывод (y) на основе (x), обычно (y) выводится и никогда больше не используется сетью. Но RNN (повторяющиеся нейронные сети) продолжают использовать прошлую информацию, чтобы повысить производительность своей модели.
Итак, если мы хотим, чтобы нейронная сеть понимала каждое слово предложения, мы использовали бы рекуррентную нейронную сеть (RNN).
Например. "Который сейчас час?" будет подаваться в сеть как 4 отдельных входа (x). Сеть будет уделять наибольшее значение или релевантность последним входным данным (т. Е. Им).
Но это вызывает в системе проблему, называемую исчезающий градиент. Краткая версия проблемы заключается в том, что к тому времени, когда сеть получит все входные данные (4 слова), она в основном забудет первые слова, потому что их вес / релевантность станет близкой к нулю.
Итак, нейронные сети имеют несуществующую память, в то время как RNN являются частью клуба «я и золотая рыбка» (своего рода память).
К счастью, существует тип RNN, называемый LSTM (долговременная память), который помогает решить проблему. 😁 Он превосходит меня и золотую рыбку.
Как работают LSTM
LSTM - это тип рекуррентной нейронной сети, но вместо того, чтобы просто передавать результат в следующую часть сети, LSTM выполняет кучу математических операций, чтобы иметь лучшую память.
LSTM имеет четыре «ворот»: забыть, запомнить, изучить и использовать (или выводить)
Он также имеет три входа: долговременная память, кратковременная память и E. (E - это некоторый обучающий пример / новые данные).
Шаг 1. Когда 3 входа входят в LSTM, они попадают либо в ворота забывания, либо в ворота обучения.
долгосрочная информация попадает в ворота забвения, где, шокирующе, некоторые из них забываются (несущественные части).
Краткосрочная информация и буква «E» переходят в окно обучения. Эти ворота решают, какая информация будет изучена. Спорим, вы этого не заметили !!!!
Шаг 2: информация, которая проходит через ворота забывания (она не забыта, забытая информация остается у ворот), и информация, которая проходит через ворота обучения (она изучается), отправляется в ворота запоминания (которые составляют новую долгосрочную память) и ворота использования (которые обновляют краткосрочную память + являются результатом сети).
Learn Gate
Шлюз обучения TL; DR объединяет STM + E (вход) и игнорирует ненужную информацию.
Этот вентиль объединяет существующую кратковременную память (STM) и некоторый вход «E», умножается на матрицу (W) и добавляет b. Затем превращает все это в функцию tanh.
Эта комбинация дает нам «N».
Затем он игнорирует часть кратковременной памяти, умножая объединенный результат на «коэффициент игнорирования».
Фактор игнорирования (I) вычисляется путем объединения STM и E с новым набором W (веса) и b (смещения).
Как только у нас есть N и I, мы умножаем их вместе, и это результат алгоритма обучения.
Мы «узнали» нашу новую информацию (E).
Забудьте ворота
Забудьте ворота - это ворота, которые вы используете, чтобы выбросить всю ненужную долгосрочную информацию. Вроде как когда готовишься к большому экзамену, а на следующий день все забываешь. В этом сила ворот забвения.
По сути, долговременная память (LTM) умножается на коэффициент забывания (f). Этот фактор приведет к «забыванию» некоторой долгосрочной информации.
Фактор забывания таков:
Он вычисляется путем взятия кратковременной памяти и ввода (E), умножения их на некоторые веса и смещения и сжатия их в сигмовидную функцию.
Эта функция (f) умножается на LTM - и бум, у нас остается LTM, который нам нужен.
Помните ворота
Этот шлюз берет информацию из шлюза забывания и добавляет ее к информации из шлюза обучения, чтобы вычислить новую долговременную память.
Rember gate = Изучить выход гейта + Забыть выход гейта
Использовать ворота
Использование шлюза берет LTM из шлюза забывания и STM + E из шлюза обучения и использует их для создания новой краткосрочной памяти или вывода (то же самое).
Например, если бы мы пытались классифицировать изображения, результатом была бы сетевая классификация.
Он принимает выходной сигнал ворот забывания и помещает его в функцию активации tanh, например:
Он принимает выходной сигнал обучающего элемента и применяет сигмовидную функцию, поэтому уравнение выглядит следующим образом:
Затем вентиль умножает V x U, чтобы получить новую кратковременную память!
Анализ настроений
Я использовал LSTM, чтобы понять некоторый текст, в частности обзоры фильмов, и определить, был ли отзыв положительным или отрицательным.
Анализ настроений может быть использован машинами для понимания человеческих эмоций - это довольно круто!
Моя RNN использует два слоя LSTM, чтобы помочь с памятью при анализе текста. Вот модель архитектуры:
import torch.nn as nn class SentimentRNN(nn.Module): """ The RNN model that will be used to perform Sentiment analysis. """ def __init__(self, vocab_size, output_size, embedding_dim, hidden_dim, n_layers, drop_prob=0.5): """ Initialize the model by setting up the layers. """ super(SentimentRNN, self).__init__() self.output_size = output_size self.n_layers = n_layers self.hidden_dim = hidden_dim # embedding and LSTM layers self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim, n_layers, dropout=drop_prob, batch_first=True) # dropout layer self.dropout = nn.Dropout(0.3) # linear and sigmoid layers self.fc = nn.Linear(hidden_dim, output_size) self.sig = nn.Sigmoid() def forward(self, x, hidden): """ Perform a forward pass of our model on some input and hidden state. """ batch_size = x.size(0) # embeddings and lstm_out x = x.long() embeds = self.embedding(x) lstm_out, hidden = self.lstm(embeds, hidden) # stack up lstm outputs lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim) # dropout and fully-connected layer out = self.dropout(lstm_out) out = self.fc(out) # sigmoid function sig_out = self.sig(out) # reshape to be batch_size first sig_out = sig_out.view(batch_size, -1) sig_out = sig_out[:, -1] # get last batch of labels # return last sigmoid output and hidden state return sig_out, hidden def init_hidden(self, batch_size): ''' Initializes hidden state ''' weight = next(self.parameters()).data hidden = (weight.new(self.n_layers, batch_size, self.hidden_dim).zero_(), weight.new(self.n_layers, batch_size, self.hidden_dim).zero_()) return hidden
Надеюсь, вы узнали немного о том, как работают LSTM!
Чтобы связаться со мной, мой адрес электронной почты: [email protected], twitter, LinkedIn, и вы можете подписаться на мою ежемесячную рассылку новостей.