Глубокое обучение

Facebook использует нейронный поиск кода, чтобы найти соответствующие фрагменты кода

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

Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже более 100 000 подписчиков. TheSequence — это информационный бюллетень, ориентированный на машинное обучение, без BS (то есть без шумихи, без новостей и т. д.), чтение которого занимает 5 минут. Цель состоит в том, чтобы держать вас в курсе проектов машинного обучения, научных работ и концепций. Пожалуйста, попробуйте, подписавшись ниже:



В последнее время большое внимание уделяется области поиска кода с выпуском таких моделей, как OpenAI Codex. Помимо заголовков, важно вернуться назад и рассмотреть некоторые из методов, которые обеспечивают этот тип прорыва. Одна из самых инновационных идей в этой области появилась пару лет назад в Facebook AI Research (FAIR).

В наши дни Google и StackOverflow — лучшие друзья каждого разработчика. При работе над конкретным проектом разработчики постоянно обращаются к внешним источникам информации, чтобы найти решения или фрагменты кода для заданной проблемы. Однако разрешение поиска в основном основано на метаданных, а не на информации, предоставляемой самим кодом. Например, если разработчик публикует фрагмент кода в StackOverflow, он обычно включает описание и теги, которые помогают индексировать его для будущих поисков. Этот подход зависит от точности этих метаданных для отображения точных результатов поиска, но он также упускает информацию, которую можно вывести непосредственно из кода. Чтобы устранить это ограничение, команда лаборатории FAIR работала над подходом к использованию обработки естественного языка (NLP) и извлечения информации (IR) для вывода релевантной для поиска информации непосредственно из текста исходного кода.

Первым воплощением усилий команды FAIR стал инструмент под названием Neural Code Search (NCS), который принимает запрос на естественном языке и возвращает результаты, полученные непосредственно из закодированного корпуса. Методы, лежащие в основе NCS, были обобщены в двух недавно опубликованных научных статьях:

  • NCS: в этом документе описывается метод, в котором используется неконтролируемая модель, сочетающая методы NLP и IR.
  • UNIF: в этом документе предлагается расширение NCS, которое использует модель нейронной сети с учителем для повышения производительности, когда для обучения доступны хорошие данные наблюдения.

Принципы обоих методов, NCS и UNIF, относительно схожи. Оба метода основаны на векторных представлениях фрагментов кода, которые можно использовать для обучения модели, такой как семантически похожие фрагменты кода и запросы, расположенные близко друг к другу в векторном пространстве. Этот метод позволяет отвечать на запросы на естественном языке напрямую, используя корпус фрагментов кода, не полагаясь на внешние метаданные. Хотя оба метода (NCS, UNIF) относительно схожи, UNIF расширяет NCS моделью с учителем, чтобы создавать еще более точные ответы на запросы NLP.

НКС

Основной принцип, лежащий в основе этого, заключается в использовании вложений для создания векторного представления из корпуса кода таким образом, чтобы похожие фрагменты кода были близки друг к другу в векторном пространстве. В приведенном ниже примере есть два разных тела метода, которые оба относятся к закрытию или сокрытию программной клавиатуры Android (первый вопрос выше). Поскольку они имеют схожие семантические значения, даже если они не используют одни и те же строки кода, они представлены точками в векторном пространстве, близкими друг к другу. NCS использует детализацию на уровне методов для встраивания каждого фрагмента кода в векторное пространство.

Процесс создания векторного представления состоит из трех основных этапов:

1) Извлечение слов

2) Создавайте вложения слов

3) Создание вложений документов

4)Поиск на естественном языке

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

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

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

Используя векторное представление в качестве отправной точки, NCS теперь может попытаться ответить на запросы на естественном языке, связанные с фрагментами кода. Учитывая запрос на естественном языке, NCS следует аналогичному процессу токенизации с использованием платформы FastText. Используя ту же матрицу встраивания FastText, NCS усредняет векторные представления слов, чтобы создать вложение документа для предложения запроса; лишние слова отбрасываются. Затем NCS использует стандартный алгоритм поиска подобия FAISS, чтобы найти векторы документов с ближайшим косинусным расстоянием к запросу.

УНИФ

Преимущество NCS в качестве неконтролируемого метода состоит в том, что он может быстро и легко создавать знания непосредственно из закодированного корпуса. Однако одним из основных ограничений NCS является то, что модель неявно предполагает, что слова в запросе происходят из того же домена, что и слова, извлеченные из исходного кода, поскольку запросы и фрагменты кода отображаются в одно и то же векторное пространство. Однако существует множество примеров, когда корпус кода не передает никакой значимой семантической информации. Возьмем приведенный ниже пример фрагмента кода, который получает доступные блоки в памяти. Просто создав вложения слов без присмотра, NCS не сможет сопоставить соответствующие запросы, такие как «Получить свободное место во внутренней памяти».

File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return Formatter.formatFileSize(this, availableBlocks * blockSize);

UNIF — это контролируемое расширение NCS, которое пытается преодолеть разрыв между словами естественного языка и словами исходного кода. По сути, UNIF использует обучение с учителем для изменения исходной матрицы внедрения маркера T и создания двух матриц внедрения, Tc и Tq, для маркеров кода и запроса соответственно. Мы также заменяем взвешивание встроенных токенов кода в TF-IDF схемой взвешивания, основанной на изучении внимания. Этот поворот по существу объясняет некоторые семантические несоответствия в корпусе кода.

NCS и UNIF в действии

Команда FAIR сравнивает NCS и UNIF с современными моделями поиска информации. Используя начальный набор вопросов StackOverflow, NCS смогла превзойти популярную модель BM25 в различных сериях задач.

Точно так же добавление расширения UNIF показало постепенное улучшение производительности NCS.

И NCS, и UNIF представляют собой разумный и в то же время простой в реализации подход к поиску информации. Начать с поиска по коду — это тривиальный способ получить немедленную отдачу, но идеи, лежащие в основе NCS и UNIF, применимы ко многим сценариям нейронного поиска и поиска информации.