Рубрики
Без рубрики

Pytorch lstm: Учебник поколений текста

Ключевой элемент LSTM – это способность работать с последовательностями и его механизмом стробирования. Помечено с машиной, Python, Pytorch, Ai.

Долгое краткосрочная память (LSTM) является популярной рецидивирующей архитектурой нейронной сети (RNN). Это руководство покрывает использование LSTMS на Pytorch для генерации текста; В этом случае – довольно хромые шутки.

Для этого учебника вам нужно:

  • Основное знакомство с Python, Pytorch и машинным обучением
  • Локально установлена Python v3 +, Pytorch V1 +, Воплощение V1 +

Что такое lstm?

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

Вот самые прямые случаи использования для сетей LSTM, которые вы можете быть знакомы:

  • Прогнозирование временных рядов (например, предсказание акций)
  • Текстовое поколение
  • Видео классификация
  • Музыка поколение
  • Обнаружение аномалии

Rnn.

Прежде чем начать использовать LSTMS, вам нужно понять, как работает РННС.

RNNS – это нейронные сети, которые хороши с последовательными данными. Это может быть видео, аудио, текст, фондовый рынок временных рядов или даже одно изображение, нарезанное в последовательность его частей.

Стандартные нейронные сети (сверточный или ваниль) имеют один важный недостаток по сравнению с RNNS – они не могут рассуждать о предыдущих входах для информирования позже. Вы не можете решить некоторые проблемы с учетом машин без какого-либо памяти прошлых входов.

Например, вы можете столкнуться с проблемой, когда у вас есть видеокадры шарика, движущихся и хотят предсказать направление шара. То, как стандартная нейронная сеть видит проблему: у вас есть мяч на одном изображении, а затем у вас есть мяч на другом изображении. У него нет механизма подключения этих двух изображений в качестве последовательности. Стандартные нейронные сети не могут подключать два отдельных изображения мяча до концепции «мяч движется. ” Все, что он видит, это то, что в изображении № 1 есть мяч, и что есть мяч в изображении № 2, но сетевые выходы отдельно.

Сравните это с RNN, что вспоминает последние рамки и может использовать это для информирования его следующего прогнозирования.

Lstm vs rnn.

Типичные RNNS не могут запомнить длинные последовательности. Эффект, называемый «исчезающими градиентами» происходит во время фазы обратной задачи сотовой сети RNN. Градиенты клеток, которые несут информацию от начала последовательности, проходят матричные мультипликации небольшими числами и достигают около 0 в длинных последовательностях. Другими словами – информация в начале последовательности практически не влияет на конец последовательности.

Вы можете увидеть, что проиллюстрировано в рецидивирующей нейронной сети. Учитывая достаточно длительной последовательности, информация от первого элемента последовательности не влияет на выход последнего элемента последовательности.

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

Генерация текста с Pytorch

Вы будете тренировать шуток текстового генератора, используя сети LSTM в Pytorch и следуйте за лучшими практиками. Начните с создания новой папки, в которой вы будете хранить код:

$ mkdir text-generation

Модель

Чтобы создать модель LSTM, создать файл Model.py в Текстовое поколение папка со следующим контентом:

import torch
from torch import nn

class Model(nn.Module):
    def __init__(self, dataset):
        super(Model, self).__init__()
        self.lstm_size = 128
        self.embedding_dim = 128
        self.num_layers = 3

        n_vocab = len(dataset.uniq_words)
        self.embedding = nn.Embedding(
            num_embeddings=n_vocab,
            embedding_dim=self.embedding_dim,
        )
        self.lstm = nn.LSTM(
            input_size=self.lstm_size,
            hidden_size=self.lstm_size,
            num_layers=self.num_layers,
            dropout=0.2,
        )
        self.fc = nn.Linear(self.lstm_size, n_vocab)

    def forward(self, x, prev_state):
        embed = self.embedding(x)
        output, state = self.lstm(embed, prev_state)
        logits = self.fc(output)

        return logits, state

    def init_state(self, sequence_length):
        return (torch.zeros(self.num_layers, sequence_length, self.lstm_size),
                torch.zeros(self.num_layers, sequence_length, self.lstm_size))

Это стандартная смотрительная модель Pytorch. Встраивание слой Преобразует слова индексов в слово векторов. Lstm Является ли основной научной частью сети – внедрение Pytorch имеет механизм ворота, реализованный внутри Lstm ячейка, которая может изучать длинные последовательности данных.

Как описано в ранее, что такое LSTM? Раздел – RNNS и LSTMS имеют дополнительную информацию, которую они несут между учебными эпизодами.

вперед Функция имеет Prev_state аргумент Это состояние хранится за пределами модели и передается вручную.

Это также имеет init_state функция. Призывая это в начале каждой эпохи для инициализации правильной формы состояния.

Набор данных

Для этого учебника мы используем DataSet Reddit Clean Jokes для обучения сети. Скачать (139 КБ) набор данных и положить его в Текстовое поколение/Данные/ папка.

DataSet имеет 1623 шутки и выглядит так:

ID,Joke
1,What did the bartender say to the jumper cables? You better not try to start anything.
2,Don't you hate jokes about German sausage? They're the wurst!
3,Two artists had an art contest... It ended in a draw
…

Чтобы загрузить данные в Pytorch, используйте Pytorch DataSet сорт. Создать dataset.py Файл со следующим контентом:

import torch
import pandas as pd
from collections import Counter

class Dataset(torch.utils.data.Dataset):
    def __init__(
        self,
        args,
    ):
        self.args = args
        self.words = self.load_words()
        self.uniq_words = self.get_uniq_words()

        self.index_to_word = {index: word for index, word in enumerate(self.uniq_words)}
        self.word_to_index = {word: index for index, word in enumerate(self.uniq_words)}

        self.words_indexes = [self.word_to_index[w] for w in self.words]

    def load_words(self):
        train_df = pd.read_csv('data/reddit-cleanjokes.csv')
        text = train_df['Joke'].str.cat(sep=' ')
        return text.split(' ')

    def get_uniq_words(self):
        word_counts = Counter(self.words)
        return sorted(word_counts, key=word_counts.get, reverse=True)

    def __len__(self):
        return len(self.words_indexes) - self.args.sequence_length

    def __getitem__(self, index):
        return (
            torch.tensor(self.words_indexes[index:index+self.args.sequence_length]),
            torch.tensor(self.words_indexes[index+1:index+self.args.sequence_length+1]),
        )

Это DataSet наследует от питорча torch.utils.data. DataSet Класс и определяет два важных метода __leen__ и __getitem__ Отказ Узнайте больше о том, как DataSet Классы работают в Pytorch Загрузка данных Учебное пособие Отказ

load_words Функция загружает набор данных. Уникальные слова рассчитываются в набор данных для определения размера словарного запаса сети и размера встраивания. index_to_word и word_to_index Преобразует слова к номеру индексов и Visa Versa.

Это часть процесса это Токенизация Отказ В будущем TorchText План команды на Улучшите эту часть, но они повторно разработают его, а новая API слишком нестабильна для этого учебника сегодня.

Повышение квалификации

Создать поезда Файл и определить Поезд функция.

import argparse
import torch
import numpy as np
from torch import nn, optim
from torch.utils.data import DataLoader
from model import Model
from dataset import Dataset

def train(dataset, model, args):
    model.train()

    dataloader = DataLoader(dataset, batch_size=args.batch_size)
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001)

    for epoch in range(args.max_epochs):
        state_h, state_c = model.init_state(args.sequence_length)

        for batch, (x, y) in enumerate(dataloader):
            optimizer.zero_grad()

            y_pred, (state_h, state_c) = model(x, (state_h, state_c))
            loss = criterion(y_pred.transpose(1, 2), y)

            state_h = state_h.detach()
            state_c = state_c.detach()

            loss.backward()
            optimizer.step()

            print({ 'epoch': epoch, 'batch': batch, 'loss': loss.item() })

Используйте Pytorch DataLoader и DataSet абстракции для загрузки данных шуток.

Использовать Крошерторопилосс как функция потери и Адам в качестве оптимизатора с параматами по умолчанию. Вы можете настроить его позже.

В его знаменитом пост Эндрю Карпати также рекомендует удерживать эту часть просто просто.

Текстовое поколение

Добавить прогнозировать Функция для поезда файл:

def predict(dataset, model, text, next_words=100):
    model.eval()

    words = text.split(' ')
    state_h, state_c = model.init_state(len(words))

    for i in range(0, next_words):
        x = torch.tensor([[dataset.word_to_index[w] for w in words[i:]]])
        y_pred, (state_h, state_c) = model(x, (state_h, state_c))

        last_word_logits = y_pred[0][-1]
        p = torch.nn.functional.softmax(last_word_logits, dim=0).detach().numpy()
        word_index = np.random.choice(len(last_word_logits), p=p)
        words.append(dataset.index_to_word[word_index])

    return words

Выполнить прогнозы

Добавьте следующий код в поезда Файл для выполнения определенных функций:

parser = argparse.ArgumentParser()
parser.add_argument('--max-epochs', type=int, default=10)
parser.add_argument('--batch-size', type=int, default=256)
parser.add_argument('--sequence-length', type=int, default=4)
args = parser.parse_args()

dataset = Dataset(args)
model = Model(dataset)

train(dataset, model, args)
print(predict(dataset, model, text='Knock knock. Whos there?'))

Запустите поезда Сценарий с:

$ python train.py

Вы можете увидеть потерю вместе с эпохами. Модель предсказывает следующие 100 слов после Тук-тук. Кто здесь? когда тренировка заканчивается. По умолчанию он работает на 10 эпох и занимает около 15 минут, чтобы закончить обучение.

{'epoch': 9, 'batch': 91, 'loss': 5.953955173492432}
{'epoch': 9, 'batch': 92, 'loss': 6.1532487869262695}
{'epoch': 9, 'batch': 93, 'loss': 5.531163215637207}
['Knock', 'knock.', 'Whos', 'there?', '3)', 'moostard', 'bird', 'Book,',
'What', 'when', 'when', 'the', 'Autumn', 'He', 'What', 'did', 'the',
'psychologist?', 'And', 'look', 'any', 'jokes.', 'Do', 'by', "Valentine's",
'Because', 'I', 'papa', 'could', 'believe', 'had', 'a', 'call', 'decide',
'elephants', 'it', 'my', 'eyes?', 'Why', 'you', 'different', 'know', 'in',
'an', 'file', 'of', 'a', 'jungle?', 'Rock', '-', 'and', 'might', "It's",
'every', 'out', 'say', 'when', 'to', 'an', 'ghost', 'however:', 'the', 'sex,',
'in', 'his', 'hose', 'and', 'because', 'joke', 'the', 'month', '25', 'The',
'97', 'can', 'eggs.', 'was', 'dead', 'joke', "I'm", 'a', 'want', 'is', 'you',
'out', 'to', 'Sorry,', 'the', 'poet,', 'between', 'clean', 'Words', 'car',
'his', 'wife', 'would', '1000', 'and', 'Santa', 'oh', 'diving', 'machine?',
'He', 'was']

Если вы пропустили эту часть и хотите запустить код, вот GitHub репозиторий Вы можете клонировать.

Следующие шаги

Поздравляю! Вы написали свою первую сеть Pytorch LSTM и сгенерировали некоторые шутки.

Вот что вы можете сделать дальше, чтобы улучшить модель:

  • Очистите данные, удалив не буквенные символы.
  • Увеличьте модельную емкость, добавив больше Линейный или Лшта слои.
  • Разделите набор данных в наборы поезда, тестирование и проверку.
  • Добавить контрольно-пропускные пункты, чтобы вам не нужно тренировать модель каждый раз, когда вы хотите запускать прогноз.

Оригинал: “https://dev.to/nedomas/pytorch-lstm-text-generation-tutorial-2nf5”