Подтвердить что ты не робот

Как дерево может быть закодировано как вход в нейронную сеть?

У меня есть дерево, в частности дерево разбора с тегами в узлах и строками/словами на листьях. Я хочу передать это дерево в качестве входных данных в нейронную сеть, сохраняя при этом свою структуру.

Текущий подход Предположим, что у нас есть словарь слов w1, w2..... wn Кодируйте слова, которые появляются в дереве разбора, как n-мерные двоичные векторы с 1, отображаемыми в i-м месте, когда слово в дереве разбора wi

Теперь как насчет древовидной структуры? Существует около 2 ^ n возможных родительских тегов для n слов, которые появляются у листьев. Таким образом, мы не можем установить максимальную длину входных слов, а затем просто грубую силу перечислить все деревья.

В настоящее время все, о чем я могу думать, это приблизительное дерево, выбирая прямой родительский лист. Это может быть представлено двоичным вектором, а также с размером, равным числу различных типов тегов, - порядка 100. Мой вход затем двумерен. Первый - это просто векторное представление слова, а второе - векторное представление его родительского тега

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

4b9b3361

Ответ 1

  • Кодировать древовидную структуру: подумайте о повторяющейся нейронной сети, у которой есть одна цепочка, которую можно построить для цикла. Но здесь у вас есть дерево. Поэтому вам понадобится сделать какой-то цикл с веткой. Рекурсивный вызов функции может работать с некоторыми служебными данными Python. Я предлагаю вам построить нейронную сеть с помощью рамки "define by run" (например, Chainer, PyTorch), чтобы уменьшить накладные расходы. Потому что ваше дерево, возможно, придется перестраивать по-разному для каждого образца данных, для чего требуется перестроить граф вычислений. Прочитайте Улучшенные семантические представления из структурированных длинными долгосрочными сетями памяти с древесной структурой, с оригинальной реализацией Torch7 здесь и реализация PyTorch, у вас может быть какой-то идеал.

  • Для кодирования тега в node, я думаю, что самый простой способ будет кодировать их так же, как со словом. Например, данные node - это [word vector] [tag vector]. Если node является листом, у вас есть слово, но может не иметь тега (вы не сказали, что есть метка в листе node), поэтому представление данных листа - [слово] [нулевой вектор] (или [слово-вектор] [tag vector]). Внутренний случай node, который не имеет слова = > [нулевой вектор] [вектор тега]. Затем у вас есть внутренний node и лист с одинаковым векторным размером представления данных. Вы можете относиться к ним одинаково (или нет: 3)

Ответ 2

Кодировать каждый лист node, используя (i) последовательность узлов, которая соединяет его с корнем node и (ii) кодирование листа node, который предшествует ему.

Для (i) используйте рекуррентную сеть, чей ввод - это теги. Подайте этот RNN корневой тег, тег второго уровня,... и, наконец, родительский тег (или их вложения). Объедините это с самим листом (слово или его вложение). Теперь у вас есть функция, которая описывает лист и его предков.

Для (ii) также используйте повторяющуюся сеть! Просто начните с вычисления функции, описанной выше для левой части листа, и подайте ее на второй RNN. Продолжайте делать это для каждого листа, движущегося слева направо. На каждом шаге второй RNN даст вам вектор, который представляет текущий лист с его предками, листья, которые приходят перед ним и их предками.

Необязательно, сделайте (ii) в двух направлениях, и вы получите лист, который включает в себя все дерево!

Ответ 3

Вам нужна рекурсивная нейронная сеть. См. Этот репозиторий для примера реализации: https://github.com/erickrf/treernn

На этой картинке показан принцип рекурсивной (не рекуррентной) нейронной сети.

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