В этой лекции мы узнаем, как адаптировать структуру выходных данных нейронной сети для предсказания некоторой древовидной структуры по входной последовательности.

Какая древовидная структура последовательности?

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

Но зачем это делать? Какая польза от конструкции над предложением? Содержит ли оно больше информации, чем исходное предложение?

Да. Например, структура приведенного выше предложения помогает определить, видел ли «я» девушку с подзорной трубой или «я» использовал подзорную трубу, чтобы увидеть девушку.

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

[[Думайте: Почему бы не использовать BERT? (Подсказка: BERT не помогает, когда вы пытаетесь сохранить связность длинных рассуждений)]]

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

Shift Уменьшить анализ зависимостей

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

Обратите внимание, как в приведенном выше алгоритме у нас есть один и тот же выбор на каждом временном шаге. И как даже если это так, мы все еще можем создать любое возможное дерево по предложению.

Теперь возникает вопрос: на чем мы должны основывать свой выбор?

Мы, безусловно, должны отправить слова в стеке и в очереди в качестве входных данных для нашей нейронной сети, но также должны отправить древовидную структуру, которую мы построили до сих пор... но как это сделать? Входные данные для NN обычно имеют фиксированный размер, и даже если они повторяются, как отправить отношения, которые мы создали до сих пор?

Чен и Мэннинг в 2014 году решили отправить следующие функции:

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

Просто используйте RNN для извлечения признаков.

Мы также можем использовать приведенные выше LSTM, и в этом случае значения ворот забывания будут соответствовать «игнорированию» дочерних элементов. Как и в приведенном выше предложении «это» не имеет значения. Это могло быть «Я ненавижу этот фильм».

Но все же, как использовать это в разборе?

Мы можем использовать это для всех слов в стеке и для всех слов в буфере, конечно. Но как сделать вышеописанное для дерева, которое мы сделали до определенного момента? Обратите внимание, как было создано дерево, выполнив последовательность шагов; так что мы можем просто отправить в той последовательности, как представление полного дерева, сформированного до сих пор!

Часть II

Наша цель :

«Смысл» здесь определяется по отношению к автомату, который примет смысловое представление и выполнит желаемую задачу. Могут быть базовые данные (возможно, с некоторой структурой), такие как граф знаний, над которым работает автомат.

Когда задача похожа на преобразование предложения в программу Python, обычно нет базовых данных (см. Набор данных CoNaLa). Когда задача состоит в том, чтобы преобразовать предложение, скажем, в SQL-запрос, в таблицах присутствуют базовые данные (см. ATIS, данные Geo Query, наборы данных Spider).

Первый базовый подход к созданию представления значения из естественного предложения состоит в использовании модели последовательности для последовательности, но он не всегда может генерировать синтаксически правильный вывод. Мы должны попытаться использовать богатую синтаксическую структуру, чтобы облегчить нашу задачу. Например, в программе SQL мы знаем, что есть предложение select, предложение from и т. д. Нам нужно только предсказать аргументы для этих предложений. Кроме того, существует структура аргументов этих предложений, например, аргументы предложения select будут только именами таблиц.

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

Но как это сделать для более сложных, скажем, программ на Python? Как использовать их синтаксическую структуру?

Один из способов сделать это:

Но что именно делает приведенную выше модель «осведомленной о структуре»?

Осведомленность о структуре исходит из того факта, что мы жестко закодировали в нашей программе, в какой именно момент должно происходить ответвление LSTM и сколько шагов должно пройти ответвление, исходя из грамматики языка программирования. Например, мы знаем, что операция «›» будет иметь два операнда, поэтому, как только ячейка LSTM текущей ветви предсказывает «›»; мы разветвляем эту ветвь, чтобы создать еще два выхода.

Еще одна вещь, которую следует отметить в приведенной выше модели, заключается в том, что при задании языка, такого как Python, вместо написания программы, которая принимает определенные значения аргументов, таких как «Даллас» или «16:00»; более полезно и интуитивно понятно просто иметь переменные на своих местах, а позже разрешить модели присваивать значения этим переменным на основе предложения. Именно это и делает наша следующая модель:

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

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

Использование грамматики языка программирования

Мы знаем, что каждому языку программирования соответствует формальная грамматика. И что каждая программа на языке программирования может быть написана как «Абстрактное синтаксическое дерево (AST)» с использованием правил грамматики с последующим заполнением конкретных имен/значений переменных для конечных узлов.

Наша следующая модель генерирует это дерево постепенно:

В приведенной выше модели дерево создается методом «сначала в глубину», в отличие от метода «сначала в ширину» метода ветвления.

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

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

Основная проблема: очень мало данных, доступных в форме (намерение, программа)

Решение

«Попробуйте использовать более слабые сигналы»

Что это за более слабые сигналы?

Может быть.. используйте комментарии в коде как цель соответствующей строки..

Или.. используйте результат выполнения..

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

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

Еще один способ решить вышеперечисленные проблемы - сместить модель в сторону использования уже используемых форм в предыдущих программах, чтобы они были подтверждены. Другие способы включают использование эвристики:

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

Проблемы, о которых стоит подумать

  1. Естественный язык и код обычно очень композиционны; но ошибка распространяется в LSTM по мере того, как они становятся составными или длиннее. Попробуйте спроектировать модели, которые могут легко выводить и генерировать множество уровней композиционной структуры.
  2. Расширьте модель, чтобы она хорошо работала, даже если базовые данные представлены в виде обычного текста; а не базы данных.

Присоединяйтесь к DA Labs в нашем стремлении понять, как работают машины и как они учатся! Удивляйтесь и бродите по прекрасному полю, то есть Глубокому обучению! Любые отзывы/вопросы всегда приветствуются и приветствуются 😇 Чтобы присоединиться к нам в наших проектах/исследованиях, взаимодействовать с нами или писать нам, просто звоните на наш дискорд-сервер https://discord.gg/UwFdGVN ! :)