PyTorch - одна из самых популярных фреймворков глубокого обучения, основанная на Python и поддерживаемая Facebook.

В этой статье мы рассмотрим классы, которые PyTorch предоставляет для помощи в обработке естественного языка (NLP).

В PyTorch есть 6 классов, которые можно использовать для задач, связанных с НЛП, с использованием повторяющихся слоев:

  • torch.nn.RNN
  • torch.nn.LSTM
  • torch.nn.GRU
  • torch.nn.RNNCell
  • torch.nn.LSTMCell
  • torch.nn.GRUCell

Понимание этих классов, их параметров, их входных и выходных данных является ключом к началу создания собственных нейронных сетей для обработки естественного языка (NLP) в Pytorch.

Если вы начали свое путешествие по НЛП, скорее всего, вы встречали подобный тип диаграмм (в противном случае мы рекомендуем вам ознакомиться с этой превосходной и часто цитируемой статьей Криса Олаха - Понимание сетей LSTM):

Источник - http://colah.github.io/posts/2015-08-Understanding-LSTMs/

Такие развернутые диаграммы используются учителями, чтобы дать учащимся простое для понимания объяснение повторяющейся структуры таких нейронных сетей. Переход от этих красивых развернутых диаграмм и интуитивно понятных объяснений к Pytorch API может оказаться сложной задачей.

Источник - https://pytorch.org/docs/stable/nn.html#recurrent-layers

Следовательно, в этой статье мы стремимся восполнить этот пробел, объясняя параметры, входные и выходные данные соответствующих классов в PyTorch ясным и описательным образом.

Pytorch в основном имеет 2 уровня классов для построения повторяющихся сетей:

  • Многослойные классы - nn.RNN, nn.GRU andnn.LSTM
    Объекты этих классов могут представлять глубокие двунаправленные рекуррентные нейронные сети ( или, как следует из названий классов, одна из более развитых архитектур - сети Gated Recurrent Unit (GRU) или Long Short Term Memory (LSTM)).
  • Классы уровня ячейки - nn.RNNCell, nn.GRUCell и nn.LSTMCell
    Объекты этих классов могут представлять только одну ячейку (опять же, простая ячейка RNN, LSTM или GRU), которая может обрабатывать один временной шаг входных данных. (Помните, что эти ячейки не оптимизированы для cuDNN и, следовательно, не имеют слитных операций и т. д.)

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

Для простоты объяснения воспользуемся простейшими классами - torch.nn.RNN и torch.nn.RNNCell

torch.nn.RNN:

Мы будем использовать следующую диаграмму, чтобы объяснить API -

Источник - http://colah.github.io/posts/2015-08-Understanding-LSTMs/

Параметры:

  • input_size - количество ожидаемых функций во входных данных x

Он представляет размеры вектора x [i] (т.е. любого из векторов от x [0] до x [t] на приведенной выше диаграмме). Обратите внимание, что это легко спутать с длиной последовательности, которая представляет собой общее количество ячеек, которое мы получаем после развертывания RNN, как указано выше.

  • hidden_size - количество функций в скрытом состоянии h

Это представляет размерность вектора h [i] (то есть любого из векторов от h [0] до h [t] на приведенной выше диаграмме). Вместе hidden_size и input_size необходимы и достаточны для определения формы весовых матриц сети.

  • num_layers - количество повторяющихся слоев. Например, установка num_layers = 2 будет означать объединение двух RNN вместе, чтобы сформировать составную RNN, при этом вторая RNN принимает выходные данные первой RNN и вычисляет окончательные результаты. По умолчанию: 1

Этот параметр используется для построения таких глубоких RNN:

Здесь красные ячейки представляют входы, зеленые блоки представляют ячейки RNN, а синие блоки представляют выход

Итак, для приведенной выше диаграммы мы должны установить параметр num_layers равным 3.

  • нелинейность - используемая нелинейность. Может быть «танх» или «релу». По умолчанию: «tanh»

Это говорит само за себя.

  • bias - если false, то слой не использует веса смещения b_ih и b_hh. По умолчанию: True

В сообществе Deep Learning некоторые люди считают, что устранение / использование предвзятости не влияет на производительность модели. Следовательно, этот логический параметр.

  • batch_first - если True, то входные и выходные тензоры предоставляются как (пакет, последовательность, функция). По умолчанию: Ложь
  • dropout - если не равен нулю, вводит слой исключения на выходах каждого уровня RNN, кроме последнего уровня, с вероятностью выпадения, равной выпадению. По умолчанию: 0

Этот параметр используется для управления методом регуляризации выпадения в архитектуре RNN.

  • двунаправленный - если True, становится двунаправленным RNN. По умолчанию: Ложь

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

Итак, чтобы создать RNN в PyTorch, нам нужно передать классу 2 обязательных параметра - input_size и hidden_size.

После того, как мы создали объект, мы можем «вызвать» объект с соответствующими входными данными, и он возвращает выходные данные.

Входы:

Нам нужно передать объекту 2 входа - input и h_0:

  • input - это тензор формы (seq_len, batch, input_size). Чтобы работать с входами переменной длины, мы упаковываем более короткие входные последовательности. Подробнее см. Torch.nn.utils.rnn.pack_padded_sequence () или torch.nn.utils.rnn.pack_sequence ().
  • h_0 - это тензор формы (num_layers * num_directions, batch, hidden_size). num_directions равно 2 для двунаправленных RNN и 1 в противном случае. Этот тензор содержит начальное скрытое состояние для каждого элемента в пакете.

Выходы:

Аналогичным образом объект возвращает нам 2 вывода - output и h_n:

  • output - это тензор формы (seq_len, batch, num_directions * hidden_size). Он содержит выходные характеристики (h_k) из последнего слоя RNN для каждого k.
  • h_n - это тензор размера (num_layers * num_directions, batch, hidden_size). Он содержит скрытое состояние для k = seq_len.

Как упоминалось ранее, и torch.nn.GRU, и torch.nn.LSTM имеют один и тот же API, то есть они принимают один и тот же набор параметров, принимают входные данные в одном и том же формате и возвращаются в том же формате.

torch.nn.RNNCell:

Поскольку это представляет только одну ячейку RNN, он принимает только 4 параметра, все из которых имеют то же значение, что и в torch.nn.RNN.

Параметры:

  • input_size - количество ожидаемых функций во входных данных x
  • hidden_size - количество функций в скрытом состоянии h
  • bias - если false, то слой не использует веса смещения b_ih и b_hh. По умолчанию: True
  • нелинейность - используемая нелинейность. Может быть «танх» или «релу». По умолчанию: «tanh»

Опять же, поскольку это всего лишь одна ячейка RNN, входные и выходные размеры намного проще -

Входы (входные, скрытые):

  • input - это тензор формы (пакет, input_size), который содержит входные функции.
  • hidden - это тензор формы (batch, hidden_size), который содержит начальные скрытые состояния для каждого из элементов в пакете.

Вывод:

  • h ’ - это тензор формы (пакет, hidden_size), и он дает нам скрытое состояние для следующего временного шага.

Речь шла о начале работы с фреймворком PyTorch для обработки естественного языка (NLP). Если вы ищете идеи о том, что возможно и что вы можете построить, посмотрите - Глубокое обучение для обработки естественного языка с использованием RNN и CNN.

Первоначально опубликовано на blog.exxactcorp.com 19 марта 2019 г.