Yuriy Vovanych (buriy) wrote,
Yuriy Vovanych
buriy

Разбор работы http://arxiv.org/abs/1511.06388 и ответ ailev.

1) Я посмотрел на эту конкретную работу (кстати, отличный разбор есть здесь: https://news.ycombinator.com/item?id=10612685)
Авторы добавляют часть речи к слову, чтобы получить embeddings. Кроме того, кроме части речи они различают имена собственные. Я так тоже делал для получения улучшенных кластеров -- и это вообще не новая идея, поэтому нельзя и говорить о "прогрессе", скорее это определённый "подход".
Итак, в общем, идея хорошая, логичная, но имеет несколько нюансов:
а) точность embeddings ухудшается на несколько процентов (т.е. на точность POS-теггера, которая порядка 95-98% для многих языков). Поскольку авторы сравнивали два embedding-а на своих же POS-тегированных данных (ввиду сложности получения универсального POS-теггера для многих языков), непонятно, насколько их выводы останутся верны "в общем".
Итого, хотя embeddings и действительно стали немного лучше, они вместо суперпозиции понятий представляют более узкое понятие. И вообще, для остальных практических применений изменений нет -- и так использовали данные POS-теггера.
б) несловарные слова существенно понижают точность -- они редкие, но важны.
Я вместо данного "подхода" предложил бы несколько другой подход, и постепенно к нему и придут:
а) учитывать номер смысла слова, и строить embedding для разных смыслов. Но тогда есть проблема курицы и яйца: эти значения ещё нужно получить. А значит, нужен итеративный алгоритм, который не имеет смысла, пока у компьютера не будет обратной связи по поводу успешного или неуспешного применения конкретных слов. И, кстати, разные применения слов дают разные embeddings.
б) перейти к online-алгоритму для embeddings -- чтобы в любой момент можно было уточнить значение нужного слова с учетом новых примеров или разбить его на два значения.
б) дополнить вектор слова морфологическими и синтаксическими признаками в явном виде. Существенное повышение точности.

2) "Словность" действительно важна. Например, сейчас почти все подходы дадут разные embeddings для "NY", "New York" и "New York City", а "Дмитрий Васильевич Медведев" окажется крайне близок к "премьер министру", а заодно и к "министру премьер", явно будучи однофамильцем первого.
Также одной из типичных ошибок синтаксического парсера является неправильный разбор оборотов, состоящих из нескольких слов.
Кроме этого, даже если не брать действительно сложные моменты языка, весьма большое количество ошибок в русском языке связано с неправильным присоединением слов предложной группы и родительного падежей ("мама рамы мыла" -- "мама (чья?) рамы", "рамы (чьей?) мыла", "о компьютерной системе второго класса школы" -- "система (чья?) второго класса" или "система (какая?) второго класса", система второго, система школы, класс школы -- итп. ).
Как embeddings в принципе могут решать эти проблемы?
Структуру мира нужно знать, а знание о таких вещах в модель embeddings не уложить -- 200 размерностей на слово означает всего лишь знание о 200 возможностях соединения с другими словами.

3) Вообще, следует понимать, что Syntax parsing даёт 80-90% точности. Это принципиальный момент. Разное качество имеющегося решения означает разный круг решаемых задач. Так вот, этой точности для логических задач не хватает, так же, как не хватает результатов текущих языковых движков для качественной диктовки. Грубо говоря, компьютер может из текста вычитать с вероятностью вероятностью 10% что дважды два пять -- и кто будет 10% поступающей чепухи отслеживать? Частые примеры мы ещё отсеим статистически, но о возможности самообучения, как и о работе без человеческого ассистента, можно забыть.

4) Сама по себе Distributed Morphology очень удобна, как и любая универсальная теоретическая модель всего.
С одной стороны, любой парсер сейчас работает таким образом. С другой стороны, сама по себе "кусочная идея" -- когда маленькие кусочки объединяются в большие кусочки -- плохо работает на практике, т.к. значение фразы "я не хочу есть мясо" принципиально отличается от "я не хочу есть" в качестве ответа на вопрос, голоден ли человек, а "монополистическим" вовсе не раскладывается как "моно-по-лист-ическим",
Кроме того, на практике, напрямую использовать "комбинаторный подход" с объединением кусочков не получается, т.к. он порождает экспоненциальную сложность разбора -- а значит, приходится использовать различные трюки для ускорения (в основном в связи с отсечением менее вероятных ответов на разных уровней).

5) Более глобально, про "Мне кажется, вдохновение может прийти из классических лингвистических наработок, если удастся их выразить в формате embeddings".
Частично я уже отвечал раньше.
Embedding ничем принципиально не отличается от среза графа соседей, поэтому он не может дать чего-то большего сам по себе. Вот пример embedding, объясняющий, как работает word2vec.
Сформируем набор следующих кортежей: для каждого слова будем писать в соответствующей ячейке ответ на один из вопросов. Пусть -1 -- если ответ равен первому значению, 1 -- второму, 0 -- третьему:
Вопросы будут такими: (существительное/глагол/другое?, мужской/женский/другой_род?, о_природе/о_людях/прочее?, не_одушевлённое/одушевлённое/пофиг?, им._падеж/другой?). Т.е.
для слова "мама" A=(-1, 1, 1, 1, -1),
для слова "мыла" B=( 1, 1, 1, 1, 1),
для слова "раму" C=(-1, 1, 0, -1, 1).
Теперь на основании этого embedding мы можем придумать синтаксические правила, разрешающие или запрещающие определённые синтаксические комбинации. Например, если определён род, подлежащее и сказуемое согласуются по роду.
Получаем правило A[1] == B[1] & A[0]*B[0]==-1 & A[4]*B[4]==-1 . Можно легко придумать для него матричную форму.

В общем, надеюсь, теперь вам понятно, что классические наработки давно уже могут быть выражены в формате embeddings, только толку с этого как с козла молока.
Потому что если мы решим представить наши данные в виде подобных кортежей вместо обычных структур данных, то вместо проверки определённого признака (например, рода или части речи), нам придётся каждый раз делать операции со всей матрицей целиком. А преобразования, в свою очередь, будут иметь одинаковый вид для всех правил -- что-то типа f(A,B) = 5, f(A,C) = 3, f(B,C) = 2, поэтому сначала объединяем A+B в D и считаем f(D, C), итп.

А теперь вспомним, что только основных глаголов у нас 5000, и у каждого своя структура зависимых слов. У многих существительных тоже есть зависимые слова (скажем, "выход (куда?) на улицу", но вряд ли "выход (куда?) под рояль" и уж вовсе не "проедьте до [выхода (где?) на автобусе]"). Это значит, нейросети, оперирующей нашими embeddings, для простенького SRL нужно уметь эти 5000 глаголов "узнавать" по embedding... В общем, SRL компьютер умеет плохо.

Как вы теперь наверное понимаете, то, что вы предлагаете, это всего лишь метод грубой силы.
Вот были бы у нас в миллион раз более мощные компьютеры, и в 100 раз больше памяти под матрицы... Мы бы решили эту задачу с намного большим качеством за счёт грубой силы, наверное, даже бы приблизились к человеку по качеству.
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 16 comments