>>1.00<<>>1.00<<Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 3:43Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -3:43 1xСкорость воспроизведения2x1.75x1.5x1.25x1x, выбрано0.75x0.5xГлавыГлавыОписанияОтключить описания, выбраноСубтитрынастройки субтитров, откроется диалог настройки субтитровСубтитры выкл., выбраноЗвуковая дорожкаPicture-in-PictureПолноэкранный режимThis is a modal window.Начало диалоговго окна. Кнопка Escape закроет или отменит окноТекстColorБелыйЧерныйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйФонColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйПрозрачныйОкноColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачныйПолупрозрачныйПрозрачностьРазмер шрифта50%75%100%125%150%175%200%300%400%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Самые популярные sequence to sequence модели — это модели вида "encoder-decorder", которые разбирались в лекции. Они используют RNN для того, чтобы закодировать входную последовательность в некоторый вектор. Этот вектор — представление входного предложения в некоторым заранее зафиксированном формате. Затем этот вектор декодируется второй RNN (декодером), который учится предсказывать выходную последовательность, генерируя последовательно токен за токеном. Давайте немного вспомним лекцию и освежим в памяти простой пример с машинным переводом. Перевод вопрос со StackOverflow на язык python будет проходить по концептуально такой же схеме, как и перевод с немецкого на английский, если мы говорим про использование seq2seq моделей. На картинке вы можете видеть пример перевода с помощью seq2seq модели. На вход мы подаём фразу "gutten morgen" ("доброго утра") — фразу на немецком языке. В энкодер она подается слово за словом. Кроме того, в начало предложения мы добавляем тэг "start of sequence" (коротко — SOS), а в конец мы добавляем токен "end of sequence" (EOS). В каждый момент времени, входом энкодера является текущей токен — назовём его "x", а также некоторое скрытое состояние — назовём его "h" (от слова "hidden"). Причём, в каждый момент времени мы подаём скрытое состояние с предыдущего шага. Выходом будет являться новое скрытое состояние. Скрытое состояние содержит в себе информацию обо всём предложении, которую сеть видела к текущему моменту. Нулевое скрытое состояние можно инициализировать нулями или использовать, например, равномерное распределение. Как только последнее слово было передано в RNN, будем использовать последнее скрытое состояние как вектор, содержащий в себе информацию обо всём предложении. Имея такой вектор, можно начинать декодировать его — генерировать выходную последовательность с помощью декодера. Давайте посмотрим на картинку — в каждый момент времени в мы подаём текущее слово и скрытое состояние с предыдущего шага. При этом, нулевое скрытое состояние декодера равно последнему скрытому состоянию энкодера. И энкодер и декодер мы можем представить как функции от x и h, то есть от текущего входного слова и скрытого состояния. В декодере на каждом шаге нам нужно предсказывать следующее слово. Для этого будем на каждом шаге пропускать текущее скрытое состояние через линейный слой и предсказывать следующее слово. После того как мы сгенерировали всю выходную последовательность, мы можем сравнить её с переводом из нашей обучающей выборки. Затем посчитаем функцию потерь и обновим веса сети, проделав в backward-шаг и посчитав градиент функции потерь. Так — кажется, мы обсудили весь алгоритм. Остаётся только упомянуть о некоторых фишках, которые позволяют сделать процесс обучения декодера чуть более простым и понятным. Например, давайте вспомним что такое "teacher forcing".[1,2] Это достаточно простая идея. Давайте в качестве некоторых токенов выходной последовательности иногда использовать "ground truth" из нашего датасета, а иногда — слово предсказанное нашим декодером. Таким образом, наша сеть периодически будет получать некоторую дополнительную информацию из нашей обучающей выборки. Ещё один небольшой трюк — это подход, который касается длины генерируемой последовательности. При генерации выходной последовательности не обязательно ждать, пока модель сгенерирует end-of-sequence токен. Можно, вместо этого, прекратить генерацию, когда мы выдали достаточное количество слов. Например, когда длина выходной последовательности стала примерно равна длине и входной последовательности. Это позволит нам избежать слишком долгого обучения, либо генерирования излишнего количества символов в конце нашей последовательности.
[1] Williams R. J., Zipser D. A learning algorithm for continually running fully recurrent neural networks //Neural computation. – 1989. – Т. 1. – №. 2. – С. 270-280.
[2] Lamb A. M. et al. Professor forcing: A new algorithm for training recurrent networks //Advances In Neural Information Processing Systems. – 2016. – С. 4601-4609.

К сожалению, у нас пока нет статистики ответов на данный вопрос, но мы работаем над этим.