В этой статье описывается простой эксперимент, в котором я пытался проверить, могут ли модели машинного обучения НЛП писать исходный код на языке программирования Python, задавая вопрос или записывая предложение. Другими словами, можно ли использовать модели перевода языка для перевода разговорной речи в исходный код языка программирования?

Ответ - да, вполне хорошо. Конечно, сложность обучения зависит от сложности всей задачи, от того, насколько большие исходные коды я ожидаю и насколько хороша у меня обучающая выборка. В компании EZMID работаю над решением для бизнес-аналитики EZMID DATAintegrator. Мы предлагаем нашим клиентам продукт, который может собирать данные из разных источников и преобразовывать их в осмысленную форму. Я продолжал задаваться вопросом, как мы могли бы упростить для клиента определение преобразований данных, потому что это просто знания экспертного уровня. Я предложил интегрировать в продукт что-то вроде голосового помощника. Теперь фокусируем помощника на сфере HR и расчета заработной платы. Заказчик просто говорит или пишет вопрос типа Сколько у нас сейчас сотрудников? и инструмент пишет ответ или создает виджет с диаграммой.

Для этой задачи НЛП я использую модель последовательности для последовательности — архитектуру рекуррентной нейронной сети LSTM (долгая кратковременная память) с вниманием Богданау [1][2]. Входная последовательность — это предложение на немецком языке, а выход — последовательность специальных кодов, соответствующих действиям бэкенда. Это работает очень хорошо, потому что максимальная длина входного предложения теперь составляет всего 17 слов, а выходная последовательность — 11 кодов. Это была простая задача для модели LSTM, но чем больше тем и предложений и, следовательно, серверных кодов мы добавляли к серверной части, тем сложнее было сделать ее простой и понятной.

В нашем продукте есть возможность использовать скрипты Python для преобразования данных, поэтому я подумал о том, что если мы позволим модели машинного обучения напрямую генерировать скрипт Python на основе предложения или вопроса. В любом случае исходный код представляет собой просто последовательность команд, переменных и операторов. Это будет перевод с человеческого языка на машинный язык. Просто выходная последовательность немного больше по сравнению с тем, что мы использовали до сих пор. Поскольку я читал о некоторых недостатках рекуррентных моделей LSTM при создании длинных последовательностей, таких как исчезновение информации в модели длинных последовательностей, я решил реализовать и сравнить две архитектуры: рекуррентную модель LSTM, как упоминалось выше, и модель трансформатора [3].

В этом новом эксперименте у меня теперь есть базовый тестовый набор из 100 предложений на немецком языке, каждое из которых связано с одним из 30 различных сценариев Python для преобразования данных. Набор тестов, образцы которых модель никогда не видела, совсем небольшой — 6 предложений. Целью эксперимента было просто показать, работает ли один из подходов с большими последовательностями, такими как исходный код. Я разбираю скрипт в последовательность объектов. Объекты — это команды, переменные или операторы. Теперь максимальная длина входного предложения равна 13, а максимальная длина выходного — 404.

Пример обучающей выборки:

Входное предложение: Eintritte nächster Monat Mandant M01 (новые сотрудники в следующем месяце в компании M01)

Архитектура сетей следующая:

Повторяющийся LSTM

Количество слоев 2

Внедрение параметра 8

Количество блоков кодировщика/декодера – 30

Внимание Багданау

Трансформер

Количество слоев 2

Внедрение параметра 64

Размер слоя прямой связи 1024

Количество головок 8

Тестовые образцы были созданы для того, чтобы сеть могла изучить определенные закономерности, которые могли бы помочь модели правильно предсказывать даже неизвестные образцы.

В заключение могу сказать, что оба подхода рекуррентный LSTM и трансформатор работают. По крайней мере, в этом относительно простом случае. Трансформер явно имеет лучшие результаты как по времени обучения, так и на уровне обобщения.

Я тренировал обе модели, пока все обучающие образцы не сработали на 100%. В случае трансформера это было достигнуто намного быстрее, даже при обучении на процессоре — 25 минут на моем ноутбуке. Рекуррентной модели LSTM требовалось 72 минуты на ЦП, а результат на графическом процессоре был даже немного медленнее. При обучении на графическом процессоре разница между рекуррентным LSTM и преобразователем была намного больше, потому что рекуррентный LSTM из-за последовательного характера модели не мог использовать параллелизм, предлагаемый графическим процессором. Это одна из причин, почему модель-трансформер работала так хорошо и завершилась на графическом процессоре примерно за 5 минут.

Точность также была лучше в случае трансформатора. Он достигает 100 % точности (100 из 100 образцов) на обучающем наборе и 83 % точности (5 правильных оценок 6 образцов) на тестовом наборе за 290 эпох. Что показано для лучшего обобщения задачи трансформатором. Рекуррентный LSTM достиг 100% точности на тренировочном наборе и только 50% точности (3 правильных оценки 6 образцов) на тестовом наборе примерно за 1000 эпох. Это лучшие результаты из нескольких тестов.

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

Ресурсы:

[1] Зепп Хохрайтер; Юрген Шмидхубер (1997). «Долговременная кратковременная память». Нейронные вычисления. 9 (8): 1735–1780.

[2] Дмитрий Богданов, Кёнхён Чо, Йошуа Бенгио: Нейронный машинный перевод путем совместного обучения выравниванию и переводу. ICLR 2015

[3] Ашиш Васвани; Ноам Шазир; Ники Пармар; Якоб Ушкорейт; Лион Джонс; Айдан Н Гомес; Лукаш Кайзер; Илья Полосухин: Внимание — это все, что вам нужно. В: Достижения в области систем обработки нейронной информации, 2017 г., с. 5998–6008.