>>1.00<<>>1.00<<Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 7:53Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -7:53 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%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Итак, наша нейросеть задаёт (вот такую вот) вероятностную модель.[1] θ\thetaθ — это множество всех параметров модели, xxx — это номера токенов входной последовательности, yyy — это возможное значение номеров токенов результирующей последовательности. Такие модели настраиваются, в принципе, как обычно — то есть, путём решения оптимизационной задачи, сформулированной через метод максимального правдоподобия. То есть, мы ищем такие параметры нейросети, при которых вероятность пронаблюдать обучающую выборку является наибольшей. В качестве функции правдоподобия для каждого токена используется категориальная кросс-энтропия. Нижний индекс здесь обозначает взятие элемента массива с таким индексом. В самом классическом варианте в seq2seq использовался рекуррентный энкодер, который сворачивал всю входную последовательность в один вектор. Дальше этот вектор используется, чтобы проинициализировать скрытое состояние декодера, который, опять же, рекуррентный. Декодер, на каждом шаге, предсказывает вещественный вектор размерности, равной размерности словаря. Каждый такой вектор задаёт распределение вероятностей на всех возможных токенах. В некотором смысле, это — минимальная архитектура, с помощью которой можно одну последовательность преобразовать в другую, при этом длины входной и выходной последовательностей могут не совпадать. Ожидаемо, у этой архитектуры есть пачка недостатков. Во-первых, это немного странно — кодировать последовательность любой длины всегда в вектор постоянной длины. Известно, что скрытое состояние рекуррентки, в большей мере, содержит информацию о самых последних шагах, а информация о первых теряется.[2,3,4] Это всё приводит к потере информации и ослаблению связей между декодером и энкодером. Это может приводить к тому, что декодер всегда выдаёт примерно одинаковый текст, вне зависимости от того, какой текст был подан на вход. Корень второго недостатка исходит из использования однонаправленных реккуренток в энкодере. Они на каждом шаге видят контекст только слева от каждого токена. Третий недостаток заключается в самих рекуррентках. Они достаточно плохо распараллеливаются, то есть, чтобы выполнить очередной шаг, надо полностью закончить вычисление предыдущего. Это не позволяет эффективно использовать возможности современных видеокарт[9] и других вычислителей, которые используются для обучения нейросетей. Бывает, что, после обучения, нейросети с такой архитектурой генерируют примерно одни и те же тексты. Есть несколько гипотез касательно причин низкого разнообразия. Мы о некоторых из них поговорим чуть позже в этом видео. Давайте решать проблемы поочереди. Начнём с узкого места между энкодером и декодером. Давайте теперь будем брать не один лишь последний выход энкодера, а выходы энкодеров со всех шагов. Декорировать будем так же — авторегрессионно. Но теперь на каждом шаге мы строим новый контекстный вектор — c1, c2, c3, и так далее. Получать такие вектора мы будем с помощью механизма внимания[5], в котором в качестве запроса выступает скрытое состояние декодера, а в качестве ключей и значений — выходы энкодера со всех шагов. И мы используем всю эту информацию для предсказания очередного слова, а именно — контекстный вектор, полученный на этом шаге, скрытое состояние декодера и предыдущее слово. Что же мы получаем в итоге? Кажется, узкое место между энкодером и декодером стало уже не таким узким. Но остальные проблемы как были — так и остались. Следующий шаг — обогатить контекстуальное представление в энкодере. Если мы используем рекуррентки, то первое, что приходит в голову — это добавить рекуррентку, идущую в обратную сторону.[6] С одной стороны это, конечно, здорово. Но появляется другая проблема — любой элемент следующего слоя может начать обрабатываться только тогда, когда все элементы с предыдущего слоя уже обработаны полностью. Это ограничивает возможности использовать одновременно несколько видеокарт. Если бы вся наша нейросеть состояла только из двунаправленных рекурренток, составленных в несколько слоёв, то мы бы могли использовать только (максимум) две видеокарты. Одну — для расчёта рекурренток, проходящих "вперёд", и одну — для тех, что идут назад. Поэтому авторы этой модели — "Google Neural Machine Translation"[7,8] — предложили компромисс между мощностью и параллелизмом: они предложили использовать двунаправленные рекуррентки только на первом слое энкодера, остальные же слои проходят по последовательности только в прямом направлении. Это позволяет, например, начать рассчитывать (вот этот) элемент тогда, когда вот этот ещё не вычислен, и, тем самым, более эффективно загружать вычислительные мощности. Показанная на слайде архитектура позаимствована из научной статьи исследователя из Google о применении нейросетей для улучшения машинного перевода. Следуя тому же принципу баланса между выразительностью и параллелизмом, авторы предложили связать с помощью механизма внимания только последний слой энкодера и только первый слой декодера. На всех более высоких слоях декодера используются те же контекстные векторы, которые были получены после первого слоя с помощью механизма внимания. Кстати, здесь и в энкодере, и в декодере используется много слоёв LSTM. Очень важный момент — использовать соединения в обход нелинейности — так называемые "skip connections". Это существенно облегчает процесс обучения и позволяет сделать архитектуру глубже. Чуть ранее такой же принцип был положен в основу архитекруты ResNet, очень популярной в обработке изображений. Эта модель очень выразительная и мощная. Но, так как в ней используются рекуррентки, которые трудно заставить работать параллельно, разработчикам пришлось искать компромисс. По-прежнему, с проблемой разнообразия, на этом уровне, мы ещё ничего не сделали. То есть, в научной статье, в которой была предложена эта архитектура, и откуда была взята эта картинка, предлагается набор решений, но мы ещё о них не говорили.
[1] Статистическая теория обучения
[2] Recurrent Neural Networks (RNN) - The Vanishing Gradient Problem
[3] Bengio Y., Simard P., Frasconi P. Learning long-term dependencies with gradient descent is difficult //IEEE transactions on neural networks. – 1994. – Т. 5. – №. 2. – С. 157-166.
[4] Pascanu R., Mikolov T., Bengio Y. On the difficulty of training recurrent neural networks //International conference on machine learning. – 2013. – С. 1310-1318.
[5] Luong M. T., Pham H., Manning C. D. Effective approaches to attention-based neural machine translation //arXiv preprint arXiv:1508.04025. – 2015.
[6] Schuster M., Paliwal K. K. Bidirectional recurrent neural networks //IEEE transactions on Signal Processing. – 1997. – Т. 45. – №. 11. – С. 2673-2681.
[7] Wu Y. et al. Google's neural machine translation system: Bridging the gap between human and machine translation //arXiv preprint arXiv:1609.08144. – 2016.
[8] Johnson M. et al. Google’s multilingual neural machine translation system: Enabling zero-shot translation //Transactions of the Association for Computational Linguistics. – 2017. – Т. 5. – С. 339-351.
[9] https://ru.wikipedia.org/wiki/GPGPU
К сожалению, у нас пока нет статистики ответов на данный вопрос,
но мы работаем над этим.