Pull to refresh

Comments 22

1.5 месяца на 100 Гб обучающий файл, модели BagOfWords и Skipgram, на 24-х ядрах

Вот тут вы что-то недоговариваете…
Предположу что 1.5 месяца вы обучаете модель если исходные документы вытягиваете в 1 строчку и проходите по ним гигантским окном слов в 15+

Грешен, сам ставил похожие опыты. Обучение на ~170Гб текста (книги, википедия, поисковые запросы — все вперемешку) одной модели с окном 5-7 слов и размером вектора 500 занимало не больше недели на макбуке.

P.S.
Макбук кипел и его было жалко
Почти угадали. размер окна — 16-ть элементов. И не забывайте, что Bag of Words делается примерно в 4-ре раза медленнее Skipgram.
Вопрос:
2.5 млн. токенов словарь ужимается до 256 элементов вектора действительных чисел;

— это принудительно сжать, типа k-mean-ом? Или более хитро?
Это основное свойство Word2Vec — он каждому токену ставит в соответствие вектор. И неважно, сколько всего токенов. Хоть десятки миллионов (больше 26-ти в оригинале не потянет — хеш таблица кончится). А размер вектора задаётся в настройках. По моему опыту и кое-каким публикациям, для векторов выше 200-т элементов практически заметная разница уже отсутствует.
Если в оригинальном корпусе было 2.5 миллиона токенов (грубо — словоформ), то и word2vec выдаст вам словарь размером в 2.5 миллиона токенов. Другое дело, что если построить матрицу совстречаемости слов в корпусе, то её размер будет 2.5M x 2.5M и работать с таким объёмом не удобно (если вообще возможно).

Алгоритм w2v ужимает матрицу совстречаемости токенов в 2.5M x 256, при этом сохраняя меру семантической близости. Если эспрессо и капучино часто встречаются в похожих контекстах, то косинусное расстояние между их w2v-векторами будет заметным (чем ближе токены по контекстам, тем ближе к единице).

P.S. word2vec предполагает контекстную близость, а семантическая является приятным побочным эффектом, выражаемым фразой:

A word is known by the company it keeps (Firth, J. R. 1957)
Я, как инженер, смотрю на полезность, которую мне даёт инструмент. Может семантическая близость и есть артефакт контекстной близости, но она есть и с ней можно работать.
Да, это я сформулировал неудачно) Мысль была в том, что сам алгоритм считает контекстную близость, но язык так устроен, что контекстная близость оказывается довольно близкой к семантической.

Просто тем, кто не сталкивался с w2v, может показаться, что машина понимает смысл слов. А по факту мы имеем дело с голой математикой, даже и с лингвистикой не связанной напрямую.
Парадокс китайской комнаты. Я лично не уверен, что у нас в мозгу существенно сложнее всё устроено. По крайней мере в неокортексе.
Похоже, что у нас в голове действительно есть статистический анализатор похожий на w2v. Например когда читаешь корявый текст и чётко видишь — эти два слова не сочетаются.

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

Не говоря уже о том, что следуя теореме Гёделя о неполноте, можно сделать вывод о том, что наше мышление не алгоритмично своей природе. (замечательная книга на тему — Роджер Пенроуз. Новый ум короля)
Все верно. Я бы назвал это не семантической близостью, а ассоциативной (ассоциативно-семантической, ассоциативно-синтаксической). По этому принципу работает не только «понимание», но и распознавание речи, например, модель когорты. Мышление не алгоритмично, потому что не логично в рамках формальной логики. Но дело не только в «первообразах», но и причине их выбора из множества почти одинаковых. Неокортекс отвечает за отработку уже обозначенной доминанты, причина возникновения которой уже где-то в паралимбической области (про это книга Свердлик: Как эмоции влияют на абстрактное мышление ...). Т.е. кора — это необходимое условие мышления, но далеко не достаточное.
Удивился, почему так долго обучалась модель. (У меня такой объём считался всего пару дней.) Потом понял: вы почему-то не стали снимать морфологию и это привело к гигантскому росту словаря (в среднем x25 — x40), а следовательно и росту времени обсчёта модели.

Можете объяснить, почему решили не делать нормализацию текста и считать на базовых формах?
Есть слово «уважение», есть токен «уважением,». Довольно сильно различные в качестве признаков. Есть «периметр», есть «Периметр» (которая система мёртвой руки). Есть очень характерные опечатки, по которым можно легко устанавливать авторство текста (меня так вычисляли кое-где по характерной для меня «что-бы»). Даже есть разница между «Москва» и «Москва.». В общем, приведение к нижнему регистру, отлепление знаков препинания, лемматизация и стемминг — в первую очередь это необратимая потеря информации, а соответственно — занижение теоретически доступного максимального качества классификации.

Но главное — такие методы как LSA, LDA и им подобные очень плохо себя чувствуют на больших словарях, а потому для их использования проводить нормализацию, отсекать низкочастотные слова (а всякие коды, имена собственные, жаргонизмы — это очень сильные признаки) необходимо, и это — вынужденная мера, от бедности.
Здесь мы можем себе позволить работать с полным словарём.
Спасибо за исчерпывающий ответ! Насколько понимаю вы работаете с документами и отсюда специфика с нежелательностью отсечения низкочастотных токенов.

Добрый день, спасибо за объемный пост. Мы пару тройку лет назад использовали Max Entropy (и эту библиотеку) классификаторы, для авто классификации юр текстов. В целом тогда это было очень даже перспективное направление.


Скажите а не знакомы ли вам техники классификации когда нужно выбрать не одну а несколько категорий, например фильмы могут быть комедиями и мелодрамами одновременно? Заранее благодарен.

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

Сергей, добрый день.
Затронули очень болезненную для меня тему.
Дико извиняюсь что написал ниже много букв, но без такой вводной не смогу получить правильного ответа.
У нас текущий бизнес процесс сильно завязан на классификацию мастер-данных (справочников), если чуть детальней-то речь про работу с вином: ежедневно приходит массив грязных зашумленных данных от внешних поставщиков информации о продажах вин в крупнейших розничных сетях по всей России с детализацией до точки продаж. Речь не только про продажи Российских вин, а о всех винах вообще (со всего мира).
Операторы получают новые вариации названий вин ежедневно и должны их классифицировать, т.е. правильно привязать в справочниках новые объекты на вина заведенный в стандартах нашей компании (а если не нашлось ничего похожего то создать такой класс и привязать к этому созданному)
Естественно поток информации настолько велик, что приходится задейстовать машинное обучение: там где модель уверенна выше чем на 99%, то классификация происходит автоматически, там где модель уверенна ниже- она участвует в системе в роли рекомендательного алгоритма с которым оператор либо соглашается либо нет.
Итого сейчас у нас 31925 классов, из них пустых (то о чем Вы писали -не разметили еще ассесоры)= 1761
Дисбаланс классов на картинке ниже
image


Отличие от классических задач текст-майнинга в следующем:


  • Вина именуются в системах наших сетевых ритейлеров чаще всего на кириллице как правило из франко-итальянских словоформ с "трудностями перевода" — где-то двойные буквы, где то одинарные(напр. количество букв "с" подряд может быть в любом месте произвольным: Вино игристое Ламбруско ТМ Массимо Висконти бел.слад. 0,75*6 Италия /Аква Вита ТК/)-решается регулярками


  • Длина строки при вводе в систему у сетевых ритейлеров ограничена и их операторы что бы уместиться не теряя общего смысла начинают сокращать (например приходит к нам такой вот треш: "Вин.ПР.РОБ.РИБ.Д.ДУЭ.ДО кр.сух.0.75л" который становится у нас в классе "Вино Протос Робле Рибера дель Дуэро кр сух 0,75")- решается Гуглом и вангованием на стеклянном шаре с привлечением Астрологов


  • Очень много шума в тексте (импортеры, сетевой артикул и т.д.) -решается поддержкой списка стоп-слов


  • Слияния слов (AVESвиноМЕРЛО МаулеВелле кр.сух.0.75л)-решается регулярками


  • Разная степень сокращений ключевых для моделей термов ({красн, кр, крас};{п/сл, полусл, п-слад},{крпсл}) — решается регулярками


  • Разная степень сокращений важных для моделей термов (Молоко любимой женщины; Мол.люб.жен...) — тут стеммер Портера приказал долго жить (из-за вышеописанных проблем), писал свой алгоритм обучения по термам, который рекурсивно ищет цепочку предок-наследник для термов с высокой степенью вероятности сокращенных до своих наследников и выдает на выходе такой вот справочник автозамены — "взять term и заменить на abbr отбросив цепочки с неоднозначными вариантами сокращений (там где может быть несколько разных предков)":
    image

Далее по классике: токенизация, document-term matrix, tfidf, и удаление sparce-термов которые встречаются лишь в одном документе (не важно-в обучающей или предсказательной части матрицы).
И тут еще одна проблема: высокочастотные термы (красное, белое, розовое, сладкое, полусладкое, сухое, 0.75, 0.7, и т.д.) которые по понятным причинам имеют самый низкий tfidf оказывают решающую роль в классификации: если в векторном представлении бренды/винодельни или провиции произростания совпали но цвет вина или емкость оказались другими. то последствия такой ошибки классификации высоки — это мастер-данные к которым привязываются в системе продажи (в виде большого числа транзакций) и одна ошибка в цвете/емкости/сахарности транслируется многократно в отчетности.
Поэтому ничего не остается как такие ключевые высокочастотные термы с tfidf стремящимся к нулю докручивать до значений = 10000, что бы их вес был решающим.
Далее уже алгоритмы классификации: один — свой самописный (который возвращает еще и меру сходства с классом) и еще LIBLINEAR
Собственно сам вопрос:
можно ли из вышеописанных алгортимов Вашей статьи взять какую то часть на вооружение и улучшить текущий процесс с учетом вышеописанных проблем?

Нет, нельзя. Причина, насколько я понял задачу, в том, что основная проблема — искажения слов (транслитерация, сокращения, ошибки). А это суть разные токены.

Вашу задачу я бы решал через расстояние редактирования (Левенштейна). То есть, есть полные названия вин, производителей, объёмы, градусы и другая должнествующая быть информация. Есть некий код, который пришёл из региона и который и человеку не всегда легко разобрать. Следует высчитать расстояние редактирования для всех обязательных полей и просуммировать результаты. Чем меньше сумма, тем лучше. Значит — нашлись все необходимые поля с хорошей достоверностью. Первую часть проблемы — взаимное расположение значимой информации мы уже сняли, не важно, где указан, к примеру, объём — важно, что он нашёлся.

Расстояние редактирования вычислять по словам (ну, или тому, что на них похоже), при этом:
1. штраф за вставку/удаление слов в крайних позициях — минимален (нулевой). Это позволяет нам искать нужные соответствия по всему тексту, вне зависимости от его фактического расположения;
2. штраф за удаление/вставку внутри последовательности — высокий (мол люб жен — не должен транслироваться в молодой женьшень, к примеру. Люб — значимое слово, его не просто так туда написали).
3. Стоимость замены слов. Если слова похожи на сокращения (укороченная первая часть слова, может быть с точкой), похожи на опечатки, на кривую транслитерацию — то штраф за такую замену низкий, если не похожи — высокий. При этом, факт похожести слова на сокращение, опечатку или кривую транслитерацию определяется тем же алгоритмом расстояния редактирования, но уже не на словах, а на буквах.

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

«Критерий оптимизации – максимум площади под произведением полноты на точность на отрезке [0;1] при этом, выдача классификатора не попадающая в отрезок считается ложным срабатыванием.»

Каким образом задавали такой objective для XGBoost, писали пользовательскую целевую функцию?
XGboost отработал на предыдущем шаге. А тут мы берём результаты трёх классификаторов, и делаем регрессию вида:

R = a1 + a2C1 + a3C2 + a4C3, где C1,C2,C3 — выходы соотвествующих классификаторов, а a1-4 — параметры.

При этом, один из классификаторов — это сигнатурный, с очень узкой рабочей областью (допустим это C2).

Регрессия получается вида
R = -10 + 0.6C1 + 21C2 + 1.1C3

Узкая область сигнатурного классификатора растянута, и сдвинута примерно так, что бы соответствовать отрезку [0;1]. Без регрессии комбинировать узкий сигнатурный, широкий xgboost и средний шаблонный было бы трудно
2 идеи:
1) геотаги, имена собственные и уникальные термины («стелс технология») — лучше характеризуют текст, чем слова общего назначения. Почему бы не сделать на текст 2 вектора: ключевых понятий/признаков (размерностью 100 чисел) и вектор обычных слов(все остальное)? Проверять спецвектор, если похож более, чем на 50%, брать в проверку полный вектор.

2) «Чтобы построить куличик — не обязательно просеивать три Камаза песка». Возможно, ваш алгоритм таскает порожний песок, вместо полезных камушков ;) И входящий поток данных избыточный, и его нужно грубово и "_не_ дорого" отфильтровать до подачи на наиболее ресурсоемкую часть алгоритма классификации. Например: откинуть окончания, частицы и предлоги. (-5% к объему текста), а там и слова можно на 2-3 байта заменить. Потому что в русском языке только немногим более 1 тысячи глаголов и 5 тысяч наиболее употребимых существительных. А образованный человек владеет 20-50 тыс. специализированных понятий (Они все есть в «политехническом словаре» :) ).

PS И интересно, как вы боретесь с изоморфизмом?
красива, красивый, красивой, красивому — для вас 4 терма или один?
1. Двухпроходовая обработка у меня сделана при поиске неполных дублей. Делать двухпроходовую классификацию нет необходимости — мы укладываемся и в один проход по вычислительным ресурсам. Плюс к этому, задача разделения словаря на слова общей лексики и «тематические» — отдельная задача, не имеющая 100% качества. Сделав так, как Вы говорите, мы сэкономим вычислительные ресурсы (такой проблемы нет), но зато добавим себе в контур обработки ошибок. Сделка невыгодная.

2.1 Необратимая потеря информации при лемматизации/стемминге не нужна, ведь ресурсов достаточно для обработки с полным словарём. При этом, морфология сама по себе является сильным признаком для определённого вида текстов.
2.2 Кто сказал, что мы зацикливаемся только на русском языке? У меня целый раздел посвящён генерации семантических ядер на других языках.

Да, это 4-ре разных терма.
Sign up to leave a comment.

Articles