buriy

А вот как пилят государственные средства в области искусственного интеллекта.

Заманчивое предложение от АО "РВК" (Российская Венчурная Компания?).

Как мне говорят, оригинал и сам очень показательный, но очень хотелось сделать его косяки ещё понятнее.

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

---
Открытый запрос предложений на конкурс создания автоматизированной фабрики («Автосмартфон»)
13.03.2017
Проект: Национальная технологическая инициатива
В рамках направления «Фабрики смартфонов» «дорожной карты» «Смартвсем»
Нам нужны новые смартфоны для посетителей библиотеки.
Исполнителю предлагается разработать данные смартфоны, а также научиться строить автоматизированную фабрику для их изготовления.
Смартфон должен поддерживать любой язык ввода.

Ключевые технические требования к фабрике:
Построение фабрики должно быть основано на труде младенцев.
Использование людей или компьютеров для обучения младенцев не разрешается, младенцы должны строить фабрику полностью самостоятельно.
Использование людей на фабрике не разрешается, фабрика должна уметь изготавливать 5 миллионов смартфонов в день (не менее 1 миллиона смартфонов в час) и умещаться в небольшой ящик под столом.

Исполнитель сможет получить до 70% финансирования на проект со стороны государства (при условии финансирования остальных 30% другими лицами).
Исполнитель может технологию изготовления подобных фабрик оставить себе.
Данный проект направлен на преодоление важного технологического барьера — построения автоматических быстродействующих фабрик смартфонов с помощью младенцев.
Результаты проекта смогут послужить основой для создания конкурентоспособных на мировом рынке изготавливающих смартфоны фабрик.
Подавайте ваши бизнес-планы до 30 марта. Мы выберем из них такие, которые нам особо понравятся, и сделаем на их основе окончательный проект.

И ведь кто-то наверняка получит на это потом гос.финансирование!
И наверняка кто-то уже получил деньги за написание данного инвест. проекта...

Что вы думаете о компетентности данного человека?

P.S.
Им бы подошёл какой-нибудь стандартный полнотекстовый поисковик sphinx или elasticsearch, раз уж им требуется такая высокая скорость индексации.
Но тогда куда девать много умных слов про "нейро-поиск-бла-бла-бла-срочно-дайте-мне-бабла-без-попила-не-шмогла" и на что просить гос. финансирование?
И даже в полнотекстовый поисковиках есть минимальная настройка на язык -- токенизация и стемминг хотя бы!
Исходный текст: http://buriy.livejournal.com/33653.html
buriy

State of the Art в области Sentiment Analysis, Paragraph similarity and classification

Хотел посмотреть изменение State of the Art за последние годы в области Sentiment Analysis, Sentences similarity and classification.

Почитал кандидатскую работу Phong Lê (Institute for Logic, Language and Computation -- Universiteit van Amsterdam )
Под названием "Phong Lê Learning Vector Representations for Sentences - The Recursive Deep Learning Approach."
( отсюда: https://www.illc.uva.nl/Research/Publications/Dissertations/, DS-2016-05 )

Можно сказать, "state of the art" в области классификации предложений.
Вот результаты:


При этом, работа Mikolov 2014 года Paragraph Vectors (уже "классика") в этой табличке обозначена "PV" и даёт всего на пару процентов меньше!
Вот разбор этой работы: https://blog.acolyer.org/2016/06/01/distributed-representations-of-sentences-and-documents/ (если не открывается, используйте google cache: distributed-representations-of-sentences-and-documents)

Сравнимый результат показывают и работы 2012-2013 года (типа RNTN от Richard Socher )

А ещё в работе по Paragraph Vectors предложена задача по определению похожести коротких текстов и рассмотрены стандартные варианты решения.


Посмотрел я на неё, и понял, что не зря я использую на одном рабочем проекте Bag-of-words в похожих условиях. Не такая уж большая разница со State-of-the-art, а вот программировать и использовать намного проще.
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 раз больше памяти под матрицы... Мы бы решили эту задачу с намного большим качеством за счёт грубой силы, наверное, даже бы приблизились к человеку по качеству.
buriy

Про мощность нейросетей

Кстати, когда мне говорят про мощность современных нейросетей, я хочу показать им это:
http://lenta.ru/news/2015/11/19/pigeons/
Голуби показывают результаты, сравнимые с текущими нейросетями, обученными на достаточно мощном железе.
Увы, от искусственного голубя до искусственного человека путь неблизок.
Разница мощности идёт на повышение качества работы. Человеческий интеллект умеет делать то, что умеет голубь, но гораздо качественнее.
Единственное, что могут сейчас сделать исследователи, когда не получается решить задачу с высоким качеством, даже несмотря на нейросети -- использовать различные трюки.
Я работаю над трюками для обработки текстовых данных.

buriy

Символисты против нейрооптимистов

"Символисты" -- они же "онтологи", представители символьного подхода -- отлично решали и решают простые задачи, где зависимости простые и правила не нарушаются.
В той же лингвистике почти любое правило нарушается, и нужно знать, когда и как принято говорить (если хотите действительно сотни принципиально различных примеров -- почитайте книгу Тестелец Я.Г. Введение в общий синтаксис, я лишь ограничусь парой самых простых примеров ).
Например, совокупность знаний только о том, какие объекты интенсионалы ("грек Сократ"), а какие эктенсионалы ("железная дорога" или "древний грек") -- это порядка 10 миллионов единиц. Естественно, для высокого уровня понимания текста, дерево разбора должно отличаться для интенсионалов, эктенсионалов и просто слов, стоящих рядом. А значит, у вас в базе должно быть как минимум 10 миллионов однотипных правил для эктенсионалов и ещё сколько то десятков тысяч правил для интенсионалов.
А теперь представьте, сколько человеко-лет уйдёт на составление такого словаря.
(собственно, википедия -- это и есть словарь экстенсионалов).
То же самое с правилами морфологии, например:
- правила окончаний в русском языке -- около 3000 парадигм описано в словаре Зализняка, и для каждой леммы -- порядка 50000 лемм нужно выбрать номер парадигмы -- "Толстого": Толстой или Толстый?,
- написание слов с большой или маленькой буквы
, синтаксиса:
- какими частями речи могут быть слова,
семантики:
- классы семантики, необходимые, чтобы учесть нерегулярность употреблений слов в контекстах, например, "он положил в карман пальто", "он положил в карман шарф", или "днём ранее" но не "понедельником ранее" (тысячи классов для разных задач),
- классы слов, которые могут являться или не являться ролями глаголов: можно "лететь по небу", нельзя в прямом смысле "лететь по морю", можно "лист кружится", но нельзя "лист ест", а "волна гоняет катер" отличается от "Вася гоняет катер")
- устойчивые выражения/фразеологизмы
Подход нейросетей здесь -- выучить наиболее популярные правила очень подробно (мы теряем правила на редких словах).
Словарный подход -- выучить правила по типам (тогда мы теряем нестандартные правила, о которых не подумали).

Теперь про word embedding.
То, что выучивает word embedding -- это отношение замены одного слова другим в том или ином контексте.
Если можно заменить "я зашёл в дом" на "я зашёл в магазин" и "я зашёл в интернет" -- то "интернет" будет в каком-то смысле близким к словам "дом" и "магазин". ("переносный смысл? не, не слышали!")
То же самое в словарно-онтологическом подходе делается через онтологическую сеть с определённой метрикой близости.
Близость определяется просто: по количеству онтологических пересечений понятий, близких к данным. Строится "облако ассоциаций" для обоих понятий и вычисляется процент пересечений облаков.
Данным подходом занимается в частности http://servponomarev.livejournal.com/8438.html
А вот древнее решение для wordnet (такое было популярно в 2006м, кажется):
http://marimba.d.umn.edu/cgi-bin/similarity/similarity.cgi

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

А вот люди могут качественно пополнять письменные словари, но медленно -- порядка 1-100 новых слов в день на человека в зависимости от задачи.

Совместить эти подходы -- задача ближайшего будущего.
buriy

Моделируем высказывания

Технический пост для структурирования моих мыслей.
Попробуем посмотреть на типичные подходы к моделированию высказываний ЕЯ.
(Я смело пользуюсь в этом посте терминами: "фраза" = "мысль" = "высказывание" = "предложение")

Текстовая модель

Идея: Мысль представляем как последовательность слов.
T = [снег упал с крыши , но никто не пострадал]

Преимущества модели:

  • сохраняется порядок слов
  • 100%-ная точность воспроизведения
  • компактность хранения

Недостатки модели:

  • модель непригодна для переиспользования
  • модель не самодостаточна (нужна "карта мира" и семантический парсер для преобразования)
Известные литературные отсылки: "паковщики" в Programmer's Stone.

Древовидная модель

Идея: Для каждой пары слов можно установить, какое слово "главнее"
T = [[[снег упал] [с крыши]] , [но [никто [не пострадал]]]

Преимущества те же, что и у текстовой модели.

Недостатки модели:

  • модель не самодостаточна
  • "главность" слов неоднозначна
  • существуют не древовидные предложения
  • требуется вводить другой тип связи для представления сложных понятий (MWU)
Известные литературные отсылки: "модель "Constituency parser (aka "Грамматика составляющих")

Сетевая (объектная) модель

Идея: Мысль представляем как иерархию слов, снабжённую ссылками на модель мира и друг на друга, пометим также номер слова в предложении.
T = но1(что? снег_упал_с_крыши, но? никто_не_пострадал)
снег_упал_с_крыши = упал#падать1(что? снег, откуда? с_крыши)
итд.

Преимущества модели:

  • 100%-ная точность воспроизведения
  • возможен поиск по ключевым словам

Недостатки модели:

  • не определяется однозначно -- зависит от модели мира и от парсера
  • не компактная
  • нет поиска по синонимам
  • зависит от модели мира (хотя и отделима)
  • можно добавить номер слова в предложении
  • трудность получения без качественный модели мира и качественного парсера
  • линейный поиск затруднён, используются поисковые индексы
  • неудобство для использования совместно с нейросетевыми моделями
  • не имеет метрики близости между мыслями.
Известные литературные отсылки: синтаксическая структура в языках программирования (AST - Abstract Syntax Tree) представляется подобным способом.
Для описания зависимости от модели мира используется "runtime semantics" ,
для зависимости от парсера -- "language syntax model".

Векторная модель

Идея: Мысль представляем как вектор в многомерном пространстве. Данный вектор называем "смыслом". Для получения этого вектора объединяем вектора более простых мыслей с помощью специально обученной нейросети.

Преимущества модели:

  • не 100%-ная точность обратного воспроизведения
  • возможность введения естественной метрики "близости" между мыслями
  • отсутствие иерархии
  • естественное представление для нейросетей
  • не требует построения строгой формальной однозначной модели для парсера
  • не требует построения строгой формальной модели реального мира
  • позволяет естественным образом моделировать неоднозначность парсера и реального мира
  • позволяет моделировать неизвестные слова и окончания слов
  • позволяет легко моделировать темы и синтактико-семантические группы слов ("съедобное", "глаголы", "летает", "транспорт").

Недостатки модели:

  • низкая точность
  • "вектора" определяются нейросетевой моделью мира
  • неоднозначно определяется -- с точностью до формирующей модели
  • зависит от модели мира (хотя и отделима)
  • можно добавить номер слова в предложении
  • трудность получения без качественный модели мира и качественного парсера
  • линейный поиск затруднён, используются поисковые индексы
  • неоднозначность кодирования для длинных предложений (отсюда неоднозначность "близости")
  • теряет детали для длинных предложений
Известные литературные отсылки: работы по word2vec, GloVe , модель MemNN, работы по изучению ассоциативной памяти человека

В общем, как видно, векторная модель и объектная модель дополняют друг друга.
Интересно было бы попробовать их объединить.
Как может выглядеть их объединение?
Продолжение следует.
buriy

AdaGram.jl часть два.

Уменьшив alpha до 0.05, ограничив максимальное число значений до 4х, всё равно получил в среднем 3.7 значений на слово. Повлияло также окно размера 7 (больше размер окна -- ближе к семантике и дальше от синтаксиса) и две эпохи обучения. Вектора размерности 100.
Теперь могу уточнить своё знание о том, что за "значения" этот инструмент получает.
Ситуация с "четвергом" принципиально не поменялась, поэтому на этот раз возьмём для примера слово "Катар":
julia> nearest_neighbors(vm, dict, "Катар", 1, 35)
Свернуть )

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

Десять значений на слово -- это слишком много...

Поэкспериментировал с AdaGram.
Авторы рекомендуют alpha=0.1 .. 0.2 , но больше пяти значений на слово в среднем -- это слишком много.
Например, для слова "четверг" система выделила 10 якобы разных значений.
Вот, например, значение №2 ("финансовый четверг"):

julia> nearest_neighbors(vm, dict, "четверг", 2, 35)
Свернуть )

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

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