www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Как внедрить модель Seq2Seq LSTM в Keras #ShortcutNLP

Дата публикации Mar 18, 2019

Keras: глубокое обучение для Python

Зачем вам это читать?

Если у вас есть с seq2seq и Keras, я здесь, чтобы помочь вам.

Когда я хотел реализовать seq2seq для задачи Chatbot, я много раз застревал, особенно в отношении измерения входных данных и уровня ввода архитектуры нейронной сети.

Здесь я объясню полное руководство по seq2seq для Keras. Давайте начнем!


Меню

  1. Что такое модель генерации текста Seq2Seq?
  2. Определение задачи и моделирование Seq2Seq
  3. Размеры каждого слоя от Seq2Seq
  4. Предварительная обработка Seq2Seq (в случае Chatbot)
  5. Простейшая предварительная обработка кода: которую вы можете использовать сегодня!

1. Что такое модель генерации текста Seq2Seq?

Рис. A - Учебная архитектура энкодера-декодера для NMTРавиндра Компелла

Seq2Seq является типом модели Encoder-Decoder, использующей RNN. Он может быть использован в качестве модели для машинного взаимодействия и машинного перевода.

Изучая большое количество пар последовательностей, эта модель генерирует одну из другой. Более любезно объяснено, определение Seq2Seq ниже:

  • Ввод: текстовые данные
  • Вывод: текстовые данные, а также

И здесь у нас есть примеры бизнес-приложений seq2seq:

  • Chatbot (вы можете найти из моегоGitHub)
  • Машинный перевод (вы можете найти из моегоGitHub)
  • Ответ на вопрос
  • Резюме текста (вы можете найти в моемGitHub)
  • Генерация текста (вы можете найти из моегоGitHub)

Если вы хотите больше информации о Seq2Seq, здесь у меня есть рекомендация отМашинное обучение в Microsoftна Yotube:

Итак, давайте посмотрим на весь процесс!

- - - - -

2. Определение задачи и моделирование Seq2Seq

https://www.oreilly.com/library/view/deep-learning-essentials/9781785880360/b71e37fb-5fd9-4094-98c8-04130d5f0771.xhtml

Для обучения нашей модели seq2seq мы будем использоватьCornell Movie - набор данных корпусов диалоговкоторый содержит более 220 579 разговорных обменов между 10 292 парами персонажей фильма. И это включает в себя 9035 персонажей из 617 фильмов.

Вот один из разговоров из набора данных:

Mike: 
"Drink up, Charley. We're ahead of you."Charley:
"I'm not thirsty."

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

Это наша архитектура нейронной сети Seq2Seq на этот раз:

авторские права Акира Такезава

Давайте визуализируем наш Seq2Seq, используя LSTM:

авторские права Акира Такезава

3. Размеры каждого слоя из Seq2Seq

https://bracketsmackdown.com/word-vector.html

Черный ящик для «НЛП новичка», я думаю, это:

Как каждый слой компилирует данные и изменяет их размерность данных?

Чтобы прояснить это, я объясню, как это работает, подробно. Слои можно разбить на 5 частей:

  1. Входной слой (кодер и декодер)
  2. Слой встраивания (кодировщик и декодер)
  3. LSTM Layer (Кодер и Декодер)
  4. Выходной слой декодера

Давайте начнем!

1. Входной слой кодера и декодера (2D-> 2D)

  • Размер входного слоя: 2D (sequence_length, None)
# 2D
encoder_input_layer = Input(shape=(sequence_length, ))
decoder_input_layer = Input(shape=(sequence_length, ))

ПРИМЕЧАНИЕ: sequence_length объединено MAX_LEN путем заполнения в предварительной обработке

  • Входные данные: 2D (sample_num, max_sequence_length)
# Input_Data.shape = (150000, 15)array([[ 1, 32, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 123, 56, 3, 34, 43, 345, 0, 0, 0, 0, 0, 0, 0],
[ 3, 22, 1, 6543, 58, 6, 435, 0, 0, 0, 0, 0, 0],
[ 198, 27, 2, 94, 67, 98, 0, 0, 0, 0, 0, 0, 0],
[ 45, 78, 2, 23, 43, 6, 45, 0, 0, 0, 0, 0, 0]
], dtype=int32)

ПРИМЕЧАНИЕ: sample_num может быть длиной training_data (150000)

  • Выходные данные: 2D

НОТА:Input()используется только для тензорных реализаций Keras

- - - - -

2. Встраивание слоя Encoder и Decoder (2D-> 3D)

  • Размер слоя встраивания: 2D (sequence_length, vocab_size)
embedding_layer = Embedding(input_dim = vocab_size,
output_dim = embedding_dimension,
input_length = sequence_length)

НОТА:vocab_sizeколичество уникальных слов

  • Входные данные: 2D (sequence_length, vocab_size)
# Input_Data.shape = (15, 10000)array([[ 1, 1, 0, 0, 1, 0, ...... 0, 0, 1, 0, 0, 0, 0],
[ 0, 0, 1, 0, 0, 1, ...... 0, 0, 0, 0, 0, 0, 1],
[ 0, 1, 0, 0, 0, 0, ...... 0, 0, 1, 0, 0, 0, 0],
[ 0, 1, 0, 0, 0, 1, ...... 0, 0, 0, 1, 0, 1, 0],
[ 0, 0, 1, 0, 1, 0, ...... 0, 0, 1, 0, 1, 0, 0]
], dtype=int32)

ПРИМЕЧАНИЕ: данные должны быть группой одного горячего вектора

  • Выходные данные: 3D (num_samples, sequence_length, embedding_dims)
# Output_Data.shape = (150000, 15, 50)array([[[ 1, 1, 0, 0, ...... 0, 1, 0, 0],
[ 0, 0, 1, 0, ...... 0, 0, 0, 1],
...,
...,
[ 0, 1, 0, 0, ...... 1, 0, 1, 0],
[ 0, 0, 1, 0, ...... 0, 1, 0, 0]],
[[ 1, 1, 0, 0, ...... 0, 1, 0, 0],
[ 0, 0, 1, 0, ...... 0, 0, 0, 1],
...,
...,
[ 0, 1, 0, 0, ...... 1, 0, 1, 0],
[ 0, 0, 1, 0, ...... 0, 1, 0, 0]], ....,] * 150000 , dtype=int32)

ПРИМЕЧАНИЕ. Данные - это слово, встроенное в 50 измерений.

- - - - -

3. LSTM слой кодера и декодера (3D-> 3D)

Хитрый аргумент уровня LSTM - это два:

1. return_state:

Возвращать ли последнее состояние вместе с выводом

2. return_sequence:

Будет ли возвращен последний вывод выходной последовательности или полная последовательность

Вы можете найти хорошее объяснение отПонять разницу между последовательностями возврата и состояниями возврата для LSTM в КерасепоДжейсон Браунли,

  • Размер слоя: 3D (hidden_units, sequence_length, embedding_dims)
# HIDDEN_DIM = 20encoder_LSTM = LSTM(HIDDEN_DIM, return_state=True)    encoder_outputs, state_h, state_c = encoder_LSTM(encoder_embedding)decoder_LSTM = LSTM(HIDDEN_DIM, return_state=True, return_sequences=True)   
decoder_outputs, _, _ = decoder_LSTM(decoder_embedding, initial_state=[state_h, state_c])
  • Входные данные: 3D (num_samples, sequence_length, embedding_dims)
# Input_Data.shape = (150000, 15, 50)array([[[ 1, 1, 0, 0, ...... 0, 1, 0, 0],
[ 0, 0, 1, 0, ...... 0, 0, 0, 1],
...,
...,
[ 0, 1, 0, 0, ...... 1, 0, 1, 0],
[ 0, 0, 1, 0, ...... 0, 1, 0, 0]], [[ 1, 1, 0, 0, ...... 0, 1, 0, 0],
[ 0, 0, 1, 0, ...... 0, 0, 0, 1],
...,
...,
[ 0, 1, 0, 0, ...... 1, 0, 1, 0],
[ 0, 0, 1, 0, ...... 0, 1, 0, 0]], ....,] * 150000 , dtype=int32)

ПРИМЕЧАНИЕ. Данные - это слово, встроенное в 50 измерений.

  • Выходные данные: 3D (num_samples, sequence_length, hidden_units)
# HIDDEN_DIM = 20
# Output_Data.shape = (150000, 15, 20)array([[[ 0.0032, 0.0041, 0.0021, .... 0.0020, 0.0231, 0.0010],
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
...,
...,
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
[ 0.0021, 0.0065, 0.0008, .... 0.0089, 0.0043, 0.0024]], [ 0.0032, 0.0041, 0.0021, .... 0.0020, 0.0231, 0.0010],
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
...,
...,
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
[ 0.0021, 0.0065, 0.0008, .... 0.0089, 0.0043, 0.0024]], ....,] * 150000 , dtype=int32)

ПРИМЕЧАНИЕ. Данные, измененные LSTM как скрытый слой в 20 измерениях

Дополнительная информация:

Еслиreturn_state = Falseа такжеreturn_sequences = False:

  • Выходные данные: 2D (num_sample, hidden_units)
# HIDDEN_DIM = 20
# Output_Data.shape = (150000, 20)array([[ 0.0032, 0.0041, 0.0021, .... 0.0020, 0.0231, 0.0010],
[ 0.0076, 0.0767, 0.0761, .... 0.0098, 0.0065, 0.0076],
...,
...,
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
[ 0.0021, 0.0065, 0.0008, .... 0.0089, 0.0043, 0.0024]]
, dtype=float32)

- - - - -

4 Выходной слой декодера (3D-> 2D)

  • Размер выходного слоя: 2D (sequence_length, vocab_size)
outputs = TimeDistributed(Dense(VOCAB_SIZE, activation='softmax'))(decoder_outputs)

ПРИМЕЧАНИЕ. TimeDistributedDenseслойпозволяет нам применить слой к каждому временному срезу входа

  • Входные данные: 3D (num_samples, sequence_length, hidden_units)
# HIDDEN_DIM = 20
# Input_Data.shape = (150000, 15, 20)array([[[ 0.0032, 0.0041, 0.0021, .... 0.0020, 0.0231, 0.0010],
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
...,
...,
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
[ 0.0021, 0.0065, 0.0008, .... 0.0089, 0.0043, 0.0024]],[ 0.0032, 0.0041, 0.0021, .... 0.0020, 0.0231, 0.0010],
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
...,
...,
[ 0.0099, 0.0007, 0.0098, .... 0.0038, 0.0035, 0.0026],
[ 0.0021, 0.0065, 0.0008, .... 0.0089, 0.0043, 0.0024]],....,] * 150000 , dtype=int32)

ПРИМЕЧАНИЕ. Данные, измененные LSTM как скрытый слой в 20 измерениях

  • Выходные данные: 2D (sequence_length, vocab_size)
# Output_Data.shape = (15, 10000)array([[ 1, 1, 0, 0, 1, 0, ...... 0, 0, 1, 0, 0, 0, 0],
[ 0, 0, 1, 0, 0, 1, ...... 0, 0, 0, 0, 0, 0, 1],
[ 0, 1, 0, 0, 0, 0, ...... 0, 0, 1, 0, 0, 0, 0],
[ 0, 1, 0, 0, 0, 1, ...... 0, 0, 0, 1, 0, 1, 0],
[ 0, 0, 1, 0, 1, 0, ...... 0, 0, 1, 0, 1, 0, 0]
], dtype=int32)

После того, как данные прошли этот полностью подключенный уровень, мы используемОбратный словарькоторый я объясню позже, чтобы преобразовать из One-Hot Vector в последовательность слов.

- - - - -

4. Весь препроцесс Seq2Seq (в случае Chatbot)

Создание модели языкового перевода с использованием подхода «последовательность к последовательности»

Прежде чем перейти к предварительной обработке Seq2Seq, я хочу упомянуть об этом:

Нам нужны некоторые переменные, чтобы определить форму нашей нейронной сети Seq2Seq на пути предварительной обработки данных

  1. MAX_LEN: унифицировать длину входных предложений
  2. VOCAB_SIZE: определить размер одного предложения в векторе
  3. EMBEDDING_DIM: определить размер Word2Vec

- - - - -

Предварительная обработка для Seq2Seq

Хорошо, пожалуйста, напишите эту информацию, давайте начнем говорить о предварительной обработке. Весь процесс может быть разбит на 8 шагов:

  1. Очистка текста
  2. Ставитьтег итег для ввода декодера
  3. Сделать словарь (VOCAB_SIZE)
  4. Токенируйте Мешок слов в Мешок удостоверений личности
  5. Обивка (MAX_LEN)
  6. Встраивание слов (EMBEDDING_DIM)
  7. Изменение формы данных зависит от формы нейронной сети
  8. Разделение данных для обучения и валидации, тестирования

- - - - -

1. Очистка текста

  • функция

Я всегда использую эту собственную функцию для очистки текста для Seq2Seq:

  • вход
# encoder input text data["Drink up, Charley. We're ahead of you.",
'Did you change your hair?',
'I believe I have found a faster way.']
  • Выход
# encoder input text data['drink up charley we are ahead of you',
'did you change your hair',
'i believe i have found a faster way']

- - - - -

2. Положитетег итег для ввода декодера

  • функция

означает «Начало последовательности»,означает «Конец последовательности».

  • вход
# decoder input text data[['with the teeth of your zipper',
'so they tell me',
'so which dakota you from'],,,,]
  • Выход
# decoder input text data[['<BOS> with the teeth of your zipper <EOS>',
'<BOS> so they tell me <EOS>',
'<BOS> so which dakota you from <EOS>'],,,,]

- - - - -

3. Составьте словарный запас (VOCAB_SIZE)

  • функция
  • вход
# Cleaned texts[['with the teeth of your zipper',
'so they tell me',
'so which dakota you from'],,,,]
  • Выход
>>> word2idx{'genetically': 14816,
'ecentus': 64088,
'houston': 4172,
'cufflinks': 30399,
"annabelle's": 23767,
.....} # 14999 words>>> idx2word{1: 'bos',
2: 'eos',
3: 'you',
4: 'i',
5: 'the',
.....} # 14999 indexs

- - - - -

4. Маркируйте Мешок слов в Мешок удостоверений личности

  • функция
  • вход
# Cleaned texts[['with the teeth of your zipper',
'so they tell me',
'so which dakota you from'],,,,]
  • Выход
# decoder input text data[[10, 27, 8, 4, 27, 1107, 802],
[3, 5, 186, 168],
[662, 4, 22, 346, 6, 130, 3, 5, 2407],,,,,]

- - - - -

5. Заполнение (MAX_LEN)

  • функция
  • вход
# decoder input text data[[10, 27, 8, 4, 27, 1107, 802],
[3, 5, 186, 168],
[662, 4, 22, 346, 6, 130, 3, 5, 2407],,,,,]
  • Выход
# MAX_LEN = 10
# decoder input text data array([[10, 27, 8, 4, 27, 1107, 802, 0, 0, 0],
[3, 5, 186, 168, 0, 0, 0, 0, 0, 0],
[662, 4, 22, 346, 6, 130, 3, 5, 2407, 0],,,,,]

- - - - -

6. Вложение слова (EMBEDDING_DIM)

  • функция

Мы используем Pretraind Word2Vec Model от Glove. Мы можем создать слой для встраивания с помощью Glove за 3 шага:

  1. Файл Call Glove из XX
  2. Создать матрицу встраивания из нашего словаря
  3. Создать слой встраивания

Давайте взглянем!

  • Файл Call Glove из XX
  • Создать матрицу встраивания из нашего словаря
  • Создать слой встраивания

- - - - -

7. Преобразуйте данные в форму нейронной сети

  • функция
  • вход
# MAX_LEN = 10
# decoder input text dataarray([[10, 27, 8, 4, 27, 1107, 802, 0, 0, 0],
[3, 5, 186, 168, 0, 0, 0, 0, 0, 0],
[662, 4, 22, 346, 6, 130, 3, 5, 2407, 0],,,,,]
  • Выход
# output.shape (num_samples, MAX_LEN, VOCAB_SIZE)
# decoder_output_data.shape (15000, 10, 15000)array([[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 1., ..., 0., 0., 0.],
...,
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.],
[1., 0., 0., ..., 0., 0., 0.]], ..., ], , dtype=float32)

- - - - -

8. Разделение данных для обучения и проверки, тестирования

  • функция

- - - - -

Ссылки

Создание модели языкового перевода с использованием подхода «последовательность к последовательности»

Привет ребята. Прошло довольно много времени с момента моего последнего сообщения в блоге. Это может звучать как оправдание, но я изо всех сил ...

chunml.github.io

Укрощение рекуррентных нейронных сетей для лучшего суммирования

Это сообщение в блоге о нашей последней статье Get To The Point: суммирование с сетями Pointer-Generator…

www.abigailsee.com

oswaldoludwig / Seq2seq-Chatbot-для-Keras

Этот репозиторий содержит новую генеративную модель чат-бота, основанную на моделировании seq2seq. ...

github.com

Модели глубокого обучения для ответов на вопросы с помощью Keras

На прошлой неделе я был на (внутреннем) семинаре по ответам на вопросы (Q + A), организованном нашей поисковой гильдией, который…

sujitpal.blogspot.com

Машинный перевод с использованием последовательного обучения - Nextjournal

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

nextjournal.com

Чат-боты с Seq2Seq

Научитесь создавать чат-ботов с помощью TensorFlow

complx.me

Seq2Seq を ch を を を を を を を を を を を を を を を を を を | ALGO GEEKS

最近, チ ャ ッ ト ボ ッ ト が 話題 と な っ て い ま す が, 自然 な 会話 を 成 り 立 た せ る こ と, は 大 き な 課題 の 一 つ で す. こ こ で は, Deep Learning の 一種 で あ る, Seq2Seq モ デ ル を 用 い て, チ ャ ッ ト ボ ッ ト を 動作 さ せ てみ ま す. ...

blog.algolab.jp

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map