LINUX.ORG.RU

Проект Нейромодератор

 , ,


6

6

Точнее «нейрокрыса»: т.к. модераторских полномочий у меня нет, я лишь могу сделать скрипты, которые будут отписываться в специальный тред

Тема навеяна Бан без причины (комментарий)

Суть такова: буду пилить набор скриптов для «выявления подозрительных сообщений», обучать буду на текстах с LORа, которые были удалены модераторами.

Когда доделаю попрошу модераторов оценить качество работы сабжа.

На данный момент:

  • скачан архив тредов с января по май 2019;
  • идет первичный анализ данных;
  • идет подготовка к разметке данных.

Проблема: модераторы указывают причины вручную (или не указывают совсем), соответственно:

  • есть сомнения в качестве разметки,
  • текстовую разметку придется превращать в разметку для классификации;

Для решения проблемы сформированы:

Да, разделитель в файлах - точка с запятой.

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

cast @jollheef, @Shaman007, @maxcom

Апдейт 1 (13.06.2019)

По результатам обсуждения тут решил:

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

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

  • Если данных хватать не будет - добью неудаленными из других топиков.

Пришлось немного переформатировать датасет (датафрейм pandas), т.к. раннее там не было ссылок сообщение-топик.

В эти выходные сделаю обучающую выборку и попробую сделать бинарный классификатор.

Если получится, - на следующей неделе буду пилить нейромодератора нейроябеду.

Апдейт 2 (16.06.2019)

Апдейт 3 (16.06.2019)

Апдейт 4 (16.06.2019)

Апдейт 5 (17.06.2019)

Апдейт 6 (22.06.2019)

Апдейт 7 (22.06.2019)

Апдейт 8 (27.06.2019)

Апдейт 9 (30.06.2019)

Апдейт 10(05.07.2019)

Апдейт 11(14.09.2019)

Апдейт 12(08.12.2019)

Проект на GitHub

Тестовый тред

★★★★★

Последнее исправление: shkolnick-kun (всего исправлений: 18)

Ответ на: комментарий от seiken

Это репетиция перед «работой» по классификации текстов.

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

Пока обратной связи от модераторов пока нет.

shkolnick-kun ★★★★★
() автор топика

Апдейт 10 (05.07.2019)

После обновления cudatoolkit и tensorflow удалось запустить сверточные сети.

Вроде как поднял Precision для бинарной классификации до 0,85 с 0,77.

В категориальной классификации сверточные сети не зашли (пока?)…

shkolnick-kun ★★★★★
() автор топика
Ответ на: комментарий от shkolnick-kun

Пока обратной связи от модераторов пока нет.

ясно У меня еще есть вопросы... 1) в заглавном сообщений не написано о модели, как из текста получаются входные данные в нейросеть? Тупо все символы сообщения и есть входной вектор? 2) зачем нужны сверточныe сети, если у текста нет 2Д структуры и он как бы «одномерный»?

seiken ★★★★★
()
Ответ на: комментарий от seiken

1) в заглавном сообщений не написано о модели, как из текста получаются входные данные в нейросеть?

После препроцессинга получается «нормализованный» текст, он идет на вход токенизатора.

Токенизатор - это такой словарь, где каждой нормальной форме слова (точнее 20к самых частотных слов) ставится в соответствие число. Таким образом, текст преобразуется в массив чисел.

Дальше этот массив идет на вход нейроночки, у которой есть слой имбеддингов. Он преобразует число в вектор, соответствующий нормальной форме слова.

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

2) зачем нужны сверточныe сети, если у текста нет 2Д структуры и он как бы «одномерный»?

Уже нет. Да и свертки там используются 1D (по «времени»).

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 3)
24 августа 2019 г.
Ответ на: комментарий от shkolnick-kun

А что в качестве вектора признаков? Бери самые статистически значимые из них. k-means/g-means в помощь.

peregrine ★★★★★
()
Ответ на: комментарий от seiken

если у текста нет 2Д структуры и он как бы «одномерный»?

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

LINUX-ORG-RU ★★★★★
()

Апдейт 11(14.09.2019)

И так вернулся к проекту.

BERT, обученный на википедии «не зашел» - работает хуже, чем araneum fasttext.

Мощностей для обучения BERT на ЛОРовских данных у мена нет.

Поэтому решил обучить более старые имбеддинги (word2vec, fasttext) на всех 3,6 млн. сообщений за пять лет (2014-2018).

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

Соответственно, на лемматизацию и пос-теггинг ушло семь вечеров-ночей (около 80 часов). Запускал по ночам кусками по 500-600 тыс. сообщений, на больше памяти на компе не хватает. Сегодня во второй половине дня все данные были обработаны и я попробовал обучить на них word2vec (всего две эпохи), вот, что получилось:

model.wv.most_similar(positive='царь_NOUN', topn=5)
[('батюшка_NOUN', 0.6950082778930664),
 ('боярин_NOUN', 0.6830054521560669),
 ('лалка_NOUN', 0.6764034032821655),
 ('анскильный_ADJ', 0.6620264649391174),
 ('мразь_NOUN', 0.6606835126876831)]

Помоему - неплохо, имбеддинги вполне выражают связь Царя с «анскильными лалками»

model.wv.most_similar(positive='рашка_NOUN', topn=5)
[('раша_NOUN', 0.8187064528465271),
 ('гейроп_NOUN', 0.7998624444007874),
 ('россиюшка_NOUN', 0.7773425579071045),
 ('мордора_NOUN', 0.7733200788497925),
 ('европах_NOUN', 0.7725570201873779)]

Особенности местного нацпола вполне учтены.

В общем, этой ночью буду учить word2vec не менее 10 эпох. Еще попробую fasttext, дальше посмотрю, что делать с разметкой, возможно поможет PU-learning (спасибо @Rastafarra за наводку).

shkolnick-kun ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

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

anonymous
()
Ответ на: Апдейт 11(14.09.2019) от shkolnick-kun

В общем, word2vec 10 эпох:

model.wv.most_similar(positive='хвостострел_NOUN', topn=5)
[('модёр_NOUN', 0.6396694183349609),
 ('мочератор_NOUN', 0.6092097759246826),
 ('модеры_NOUN', 0.6014557480812073),
 ('жобэ_NOUN', 0.6006250381469727),
 ('банхаммер_NOUN', 0.5871785879135132)]
model.wv.most_similar(positive='кащенко_NOUN', topn=5)
[('кащенка_NOUN', 0.6909999251365662),
 ('кащенок_NOUN', 0.626151442527771),
 ('кащенко_ADV', 0.6231484413146973),
 ('ckotinko_PUNCT', 0.6163461804389954),
 ('сорримак_NOUN', 0.6158071160316467)]
model.wv.most_similar(positive='шрифт_NOUN', topn=5)
[('sans_CONJ', 0.7265832424163818),
 ('terminus_ADV', 0.7256990671157837),
 ('liberation_PUNCT', 0.7195568084716797),
 ('шревт_NOUN', 0.7151879072189331),
 ('arial_PUNCT', 0.7134194374084473)]
model.wv.most_similar(positive='говно_NOUN', topn=5)
[('дерьмо_NOUN', 0.8184361457824707),
 ('гавный_ADV', 0.7093496918678284),
 ('говнище_NOUN', 0.6976292133331299),
 ('говнецо_NOUN', 0.6850547194480896),
 ('гуано_NOUN', 0.6759455800056458)]
model.wv.most_similar(positive='зонд_NOUN', topn=5)
[('гуглозонд_NOUN', 0.6018263697624207),
 ('зонт_NOUN', 0.5945577621459961),
 ('телеметрия_NOUN', 0.567317008972168),
 ('анальный_ADJ', 0.5619350671768188),
 ('огораживание_NOUN', 0.5601028203964233)]
model.wv.most_similar(positive='раст_NOUN', topn=5)
[('раста_NOUN', 0.7719116806983948),
 ('rust_NOUN', 0.7233066558837891),
 ('rust_CONJ', 0.7073013782501221),
 ('rust_PUNCT', 0.701453447341919),
 ('руст_NOUN', 0.6895651817321777)]
model.wv.most_similar(positive='си_NOUN', topn=5)
[('c_NOUN', 0.7338270545005798),
 ('сишный_ADJ', 0.7080429792404175),
 ('сишко_NOUN', 0.7051551938056946),
 ('сишечка_NOUN', 0.7004752159118652),
 ('паскаль_NOUN', 0.6833376884460449)]
model.wv.most_similar(positive='хаскел_NOUN', topn=5)
[('хаскелла_NOUN', 0.6159344911575317),
 ('окамл_NOUN', 0.580714225769043),
 ('кложур_NOUN', 0.5619770884513855),
 ('хаскель_NOUN', 0.5588544607162476),
 ('окамля_NOUN', 0.5533505082130432)]
model.wv.most_similar(positive='жаба_NOUN', topn=5)
[('джава_NOUN', 0.71211838722229),
 ('жава_NOUN', 0.6997002363204956),
 ('ява_NOUN', 0.6793997287750244),
 ('жабка_NOUN', 0.6773425936698914),
 ('жавый_ADJ', 0.6263688802719116)]
model.wv.most_similar(positive='системд_NOUN', topn=5)
[('systemd_NOUN', 0.747096061706543),
 ('systemd_ADV', 0.7364323139190674),
 ('инит_NOUN', 0.7345833778381348),
 ('сустемд_NOUN', 0.7294409275054932),
 ('апстарт_NOUN', 0.7225962281227112)]

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

Ах да:

model.wv.most_similar(positive='потуга_NOUN', topn=5)
[('балабольство_NOUN', 0.6964146494865417),
 ('обсёр_NOUN', 0.6956055164337158),
 ('балаболка_NOUN', 0.6849945187568665),
 ('кукаретинг_NOUN', 0.6816418170928955),
 ('балабол_NOUN', 0.6807647943496704)]

Слово-детектор в общем.

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 3)
Ответ на: комментарий от shkolnick-kun
'rust_NOUN'
'rust_CONJ'
'rust_PUNCT'

Кто бы сомневался.

anonymous
()
Ответ на: комментарий от shkolnick-kun

Сколько сил потрачено на детектор царя. А Эдика твоя сетка детектит? Ключевое слово «абдурина», например.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Это не детектор царя, это веркторные представления слов для нейроябеды.

До этого я использовал готовые вектора от rusvectores, но они дают только 80% точности.

Эти вектора дадут больше, вопрос на сколько???

Кстати, вот шутка про @Delirium

model.wv.most_similar(positive='пощекотать_VERB', topn=5)
[('педрильный_ADJ', 0.6950422525405884),
 ('запотеть_VERB', 0.46850425004959106),
 ('скакел_NOUN', 0.45014703273773193),
 ('потемнеть_VERB', 0.441736102104187),
 ('щекотать_VERB', 0.44075489044189453)]
shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Ответ на: комментарий от Rastafarra

Пока не актуально.

С word2vec, обученным на ЛОРе, метрики качества не выросли.

Сейчас дообучится fasttext, ещё его попробую + комбинации сторонних векторов с ЛОРовскими...

Но чувствую, что надо копать в сторону разметки...

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 1)

В принципе, на ЛОРе столько нейрокрыс, что смысла в сабже не вижу. Моментальное реагирование? Но зачем? Модераторы всё равно удалят пост не сразу. Да и в любом случае решать, что удалять, а что нет будет модератор.

kekelia
()
Ответ на: комментарий от shkolnick-kun

Та кто ж спорит, с сообщений в тестовом треде натурально проиграл.

kekelia
()
Ответ на: комментарий от shkolnick-kun

Предлагаю проект НейроСаныч, а то реального мы не дождёмся.

devl547 ★★★★★
()
17 ноября 2019 г.
Ответ на: комментарий от aol

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

Хотя точность примерно такая же.

shkolnick-kun ★★★★★
() автор топика
Ответ на: Апдейт 11(14.09.2019) от shkolnick-kun

Мощностей для обучения BERT на ЛОРовских данных у мена нет.

Кстати, сколько ему надо мощностей примерно? У меня сейчас тоже похожая задача возникла. Интересна твоя оценка как того, кто уже что-то делал по теме.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Берт попробовал в версиях от Гугла и ДипПавлова, без тюнинга не вариант, ибо дает такие же результаты, как fasttext.

shkolnick-kun ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Двунаправленные рекуррентные сети и свертончные сети дают примерно одинаковые метрики.

Но рекуррентные (GRU) лучше реагируют на общий настрой автора поста, а свертки - на словосочетания (свертка, это имбеддинг n-граммы же).

shkolnick-kun ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Один знакомый тюнил BERT на работе, на специальном серваке для дип-Ленина с топовыми видеокартами.

Он использовал 1 GPU три дня.

С моей rtx 2060 могло бы уйти недели две, судя по флопсам.

Но с учетом памяти (которой в три - четыре раза меньше) - я ХЗ, сколько реально может уйти, и запустится ли процесс вообще…

BERT только на инференс сожрал 2 Gib, сколько ему минимум надо на градиенты - я даже не прикидывал.

shkolnick-kun ★★★★★
() автор топика
Ответ на: комментарий от shkolnick-kun

На одной 1050ti тюнил как-то раз ночью, но медленно. Можно ещё попробовать Google colab. И ещё можно поэкспериментировать в бертом с адаптерами (где тюнится не сам берт, а встроенные в него преобразования с небольшим числом параметров).

P. S. А попытка извлекать части речи точно тащит, или обусловлено ранее примененными эмбеддингами?

P. S. 2. Я бы ещё попытался юзать ELMO как эмбеддер. Нужно было бы меньше предобраьотки текста

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от crutch_master

The aim of this project is to create a machine learning co-processor with a similar architecture as Google’s Tensor Processing Unit. The implementation is resource-friendly and can be used in different sizes to fit every type of FPGA.

Там tpu на vhdl, тащемта.

А в телефонах давно есть, причем в довольно средненьких.

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 2)
Ответ на: комментарий от shkolnick-kun

а в телефонах давно есть.

И оно там уже подрисовывает круги под глазами на фотках? Хренасе. А на десктопы что-то есть?

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Производительности NPU в Kirin 910 хватит не только на инференс, но и на обучение, если численные методы позволят эффективно использовать fp16.

https://en.wikipedia.org/wiki/HiSilicon

NPU made in collaboration with Cambricon Technologies. 1.92T FP16 OPS

Это примерно 1050 ti, только fp16, а не fp32.

shkolnick-kun ★★★★★
() автор топика

Зачем шамана кастовать, он же никуда негодный модератор???

anonymous
()
Ответ на: комментарий от shkolnick-kun

Воу, будущее наступило, скоро deepnude будет в каждой мобилке и на очках с доп.реальностью.

crutch_master ★★★★★
()
Ответ на: комментарий от shkolnick-kun

класс

meanwhile, минздрав придумал очередной распил под гордым названием АИС-Эксперт.
Медицины, чем дальше тем больше у нас нет, зато есть её прогрессирующаявная информатизация.

На деле за мульоны подрядчиком наколхоженосделано следующее: firebird (!) + Scikit + XGBoost + какая-то «модель» (наверное, хотя возможно внутре неонка) на само собой структурированных данных (об оказанной медпомощи).
Без документации, без поддержки, без ничего.
Всё через жопу. Но надо внедрять. Быстро, решительно.)

За неимением надежды на естественный, Россиюшку спасёт только интеллект искусственный. Ну если речь об идиотеинтеллекте руководителей, то да. Вся власть АИ!

А тут ты, на коленке за интерес. Вот в этом вся Россия...

mos ★★☆☆☆
()
Ответ на: комментарий от crutch_master

А на десктопы что-то есть?

Предположительно, - OpenVino поверх ПЛИС, но это ОЧЕНЬ дорого, для бедных есть вот это:

https://software.intel.com/ru-ru/neural-compute-stick

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 1)

Апдейт 12 (08.12.2019)

Начал исследовать разметку модераторами. Для начала рассматриваю только размеченную часть выборки.

Вот таким был список категорий:

'5.1', '4.1', '4.3', '5.3', '4.2', '5.2', '4.6'

А это типичный отчет по кросс-валидации для самой «удачной» модели:

              precision    recall  f1-score   support

           0       0.78      0.67      0.72 344.7040630999971
           1       0.28      0.58      0.37 327.6015952551375
           2       0.28      0.30      0.29 341.8416886543546
           3       0.63      0.52      0.57 342.9738835205
           4       0.69      0.10      0.17 330.18202764977
           5       0.57      0.60      0.58 322.4789331820129
           6       0.88      0.87      0.87 331.0350843186659

   micro avg       0.52      0.52      0.52 2340.817275680438
   macro avg       0.59      0.52      0.51 2340.817275680438
weighted avg       0.59      0.52      0.51 2340.817275680438

Видно, что 4.2 - самая «трудная» категория (см. f1), т.е. по самому тексту без внешнего источника данных нельзя сказать, правда это, или 4.2

Так же «трудными» являются 4.1 и, внезапно, 4.3.

Перешел от рассмотрения разметки модераторами в виде категорий к рассмотрению в виде набора бинарных признаков.

Список правил, нарушения которых рассматриваю сейчас, данные переразметил с учетом «множественных нарушений одним постом»:

'5.1', '4.3', '5.3', '5.2', '4.6'

Отчет по кросс-валидации:

              precision    recall  f1-score   support

           0       0.80      0.72      0.76     556.0
           1       0.57      0.77      0.65     686.0
           2       0.52      0.17      0.25     203.0
           3       0.59      0.53      0.56     400.0
           4       0.92      0.84      0.88     177.0

   micro avg       0.65      0.65      0.65    2022.0
   macro avg       0.68      0.60      0.62    2022.0
weighted avg       0.66      0.65      0.64    2022.0

Ситуация с 4.3 улучшилась, но с 5.3 все стало хуже… У меня такое впечатление, что 5.3, 5.2, 4.3 надо объединить…

Проверил гипотезу с объединением, получилось так:

Список выходов нейросети:

'5.1', '4.6', '4.3, 5.3, 5.2'

Отчет о кросс-валидации:

              precision    recall  f1-score   support

           0       0.88      0.62      0.73     578.0
           1       0.98      0.74      0.84     172.0
           2       0.82      0.96      0.89    1272.0

   micro avg       0.85      0.85      0.85    2022.0
   macro avg       0.89      0.78      0.82    2022.0
weighted avg       0.85      0.85      0.84    2022.0

Повидимому, модераторы далеко не всегда утруждают себя развернутыми объяснениями причин удаления по типу:

 4.3; 5.1; продолжишь в том же духе - быстро уйдешь в бан (0)

Ибо для удаления достаточно хотя бы отдого нарушения и, видимо, зачастую обозначают самое очевидное, чтоб время не тратить.

Видимо пока так и оставлю.

Дальше буду думать над разметкой для бинарного классификатора (удалить или нет?).

shkolnick-kun ★★★★★
() автор топика
Ответ на: Апдейт 12 (08.12.2019) от shkolnick-kun

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

crutch_master ★★★★★
()
25 апреля 2020 г.

И снова здравствуйте.

Вернулся к проекту.

Попробовал имбеддинги Laser, это векторные представления предложений(я подавал туда тупо весь пост), мультиязычные, типа zero-shot.

Вот результаты для LinearSVC поверх этих самы имбеддингов (данные и разметка - как тут).

--------------------------------
Пункт правил: 5.1
--------------------------------
 Accuracy: 0.8041543026706232
Precision: 0.7935103244837758
   Recall: 0.45210084033613446
       F1: 0.576017130620985
  ROC AUC: 0.8328708638325688
--------------------------------
Пункт правил: 4.6
--------------------------------
 Accuracy: 0.9782393669634025
Precision: 0.990909090909091
   Recall: 0.7171052631578947
       F1: 0.83206106870229
  ROC AUC: 0.968897762454264
--------------------------------
Пункт правил: 4.3, 5.3, 5.2
--------------------------------
 Accuracy: 0.7799208704253214
Precision: 0.7817089452603472
   Recall: 0.9084561675717611
       F1: 0.840330104054539
  ROC AUC: 0.8276909138825004

Что точно можно сказать, так это то, что спам с их помощью действительно можно детектить эффективно…

Вопрос с качеством разметки никуда не делся, придется заниматься SSL/PU-learning…

shkolnick-kun ★★★★★
() автор топика
Последнее исправление: shkolnick-kun (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.