В ноябре на EMNLP 2020 в четвёртый раз прошёл воркшоп WOAH: он был посвящён алгоритмам, обнаруживающим кибербуллинг и токсичность в онлайн-пространстве. Мы выступили со статьёй о ложноположительных срабатываниях детектора враждебных высказываний. На прошлой неделе мы запустили фильтр на основе этого детектора: каким был путь от идеи до релиза и публикации — рассказываем в этой статье.
Проблема и существующие решения
ВКонтакте сотни тысяч сообществ разной тематики: от абстрактных мемов и уродливых растений до фанатских комьюнити и пабликов мировых брендов. В каждом своя атмосфера, которую поддерживают сами подписчики и админы. У владельцев сообществ есть целый набор инструментов для модерации: например, фильтры по нецензурным выражениям и ключевым словам (их выбирают сами админы).
Недавно мы запустили еще один — фильтр враждебных высказываний. Хоть угрозы в комментариях часто не несут реальной опасности, они создают агрессивную атмосферу в паблике и порой могут провоцировать на насилие в офлайне. Мы сделали фильтр, который автоматически удаляет угрозы: например, пожелания смерти или обещания причинить вред здоровью. Администратор сообщества может включить и выключить его в любой момент, а ещё посмотреть все отсеянные комментарии, восстановить любой из них или отправить автора в чёрный список.
С проблемой угроз и оскорблений сталкиваемся не только мы, но и многие другие интернет-площадки. Разработчики вместе с представителями социальных сетей стремятся создавать надёжные модели, обнаруживающие токсичность. Но частая проблема таких детекторов — наличие Unintended Bias (UB) при вынесении вердикта. Иными словами, модель учится присваивать высокий скор токсичности текстам, в которых есть специфичные слова: они часто встречаются в оскорбительном контексте, но сами по себе не содержат негативного смысла. Например: женщина, чёрный, петух, админ. Такие слова мы будем называть защищаемыми сущностями, или Protected Identities (PI).
Сейчас есть много контестов и мастер-классов, посвящённых распознаванию токсичных выражений: например, HASOC на FIRE-2019; TRAC-2020; HatEval и OffensEval на SemEval-2019. Также на платформе Kaggle проводятся состязания по этому направлению и даже по его узкой теме — Unintended Bias! В последнем соревновании от Jigsaw использовалась специфичная для нашей задачи метрика, на которой мы валидировали модели (подробнее — в следующем разделе статьи).
Исследований по обнаружению токсичности в русском языке пока мало. Существует unsupervised-метод для расширения словаря оскорбительных и непристойных слов на русском и украинском языках. Ещё недавно была предложена модель BERT для классификации токсичного русскоязычного контента — сейчас она наиболее близка к SoTA, но её сложно использовать из-за размера.
В статье с WOAH EMNLP 2020 мы рассказываем о трёх подходах, которые помогли уменьшить число false-positive предсказаний:
Мы применили языковую модель для генерации нетоксичных примеров с контекстом по защищаемым сущностям.
Использовали дропаут на слова из списка таких сущностей.
Опробовали multitask-подходы, о которых расскажем далее.
Как мы разрабатывали детектор (данные, мини-апп, проблема Unintended Bias)
Весной 2020 года мы взялись за разработку собственного детектора токсичности, который могли бы применить ВКонтакте. Думали о разных фичах, в которых он был бы полезен. Поняли, что администраторам сообществ пригодится фильтр враждебных высказываний: он позволит авторам открыть комментарии под записями и не опасаться, что там будут бесконтрольно разрастаться токсичные обсуждения. Кроме того, фильтр способен снизить общий градус враждебности на площадке и уменьшить нагрузку на модераторов.
Сейчас фильтр уже реализован, администраторы могут его опробовать. В нынешней итерации он удаляет только угрозы — то есть пожелания смерти или обещания причинить вред здоровью. Но в рамках исследований мы работаем и с другими категориями токсичности: например, националистическими высказываниями и домогательствами.
Первые вопросы, на которые нам предстояло ответить на старте разработки:
Как понять, что перед нами токсичный текст?
Как разметить данные для обучения?
Сколько вообще их нужно?
Для разметки мы использовали комментарии из публичных сообществ — брали анонимизированные реплики не длиннее 100 слов. При составлении правил разметки важно было иметь в виду, что наша нынешняя модель не сможет учитывать контекст, как модераторы. Поэтому все спорные ситуации мы решили помечать как нетоксичные.
Угрозы | Не угрозы |
Обещания и пожелания смерти, причинения вреда здоровью | Призывы отправить кого-то в тюрьму |
Угрозы с сексуальным подтекстом | Одобрение действий, которые нам неизвестны |
Пожелания смерти самому себе | |
Эпитафии |
Таблица 1. Некоторые из правил разметки
Разметкой занимались модераторы. Они использовали наше внутреннее приложение и выполняли несколько итераций, валидируя решения друг друга.
Чтобы собирать данные максимально эффективно, на финальных этапах разметки мы использовали подход Active Learning. Он позволяет докидывать примеры с максимальной энтропией для дообучения классификатора. Конечно, в перспективе было бы здорово поставить всё это на конвейер :)
Когда завершилась первая итерация разметки и тестирования классификатора, мы заметили, что существует проблема UB. Она проявляется в двух моментах:
классификатор считает токсичными тексты вида «ты не чучело» или «называть людей чучелами плохо» — это удалось решить довольно быстро генерацией синтетики;
а также учится выдавать высокий скор токсичности примерам с защищаемыми сущностями — как боролись с этим, рассказываем дальше в статье.
Кроме того, изобретательные пользователи придумывали сложные трёхэтажные оскорбления — но их победила модель BPE.
Дальше мы действовали так: вручную составили список из 214 русских слов, которые относятся к защищаемым сущностям (то есть тем, которые часто встречаются в оскорбительном контексте, но сами по себе не несут негативного смысла). Слова распределили по характеру токсичности на категории: сексизм, национализм, угрозы, домогательства, гомофобия и другие. Полный список защищаемых идентичностей и относящихся к ним слов можно посмотреть на GitHub: vk.cc/aAS3TQ. Во future work смело записываем автоматизацию сбора таких сущностей.
лукизм | корова, пышка |
сексизм | женщина, баба |
национализм | чех, еврей |
угрозы | выезжать, айпи |
домогательства | киска, секси |
гомофобия | гей, лгбт |
другое | мамка, админ |
Таблица 2. Выдержки из полного списка защищаемых идентичностей и относящихся к ним слов
Как можно оценить Unintended Bias?
В соревновании от Jigsaw, как и на нашем чемпионате VK Cup, качество предсказаний оценивалось при помощи generalized mean of Bias AUCs. Идея такой метрики в том, что результаты работы модели на тесте разбиваются на сабсеты — в зависимости от выхода модели и наличия слов из списка защищаемых сущностей. Затем мы считаем AUC по каждому сабсету, берём от них обобщённое среднее и комбинируем его с варьируемыми весами с AUC по всем результатам.
Метрика качества. Взято из соревнования от Jigsaw
Наши подходы
Нетоксичная языковая модель
Один из способов победить предвзятость — сгенерировать нетоксичные примеры для обучения, снабдив их контекстом по словам из списка защищаемых идентичностей. При этом языковая модель должна быть обучена на текстах из нетоксичного распределения. Мы взяли Transformer, а в качестве данных для обучения — детские сказки, русскую классическую литературу и научпоп. Всего сгенерировали 25 000 дополнительных примеров и добавили их к трейнсету.
Random dropout на Protected Indentities
Известно, что random word dropout может сделать классификацию текста качественнее. Мы применили этот метод, чтобы во время обучения случайным образом (с вероятностью 0,5) заменять защищаемые идентичности во входных последовательностях на маркер .
Multitask framework
Мы использовали фреймворк multitask-learning, расширив для него базовую модель при помощи предсказания класса Protected Identity (лукизм, национализм, угроза и так далее). При обучении потери считаются как среднее взвешенное по предсказанию токсичности и классу защищаемой сущности — это тоже улучшает результат.
Схема обучения модели с применением nultitask-learning
Результаты
Мы работали с эмбеддингами, предварительно обученными на корпусах комментариев из публичных сообществ, русских субтитров из разных фильмов и видео (на них же тренировалась модель BPE).
Попробовали две архитектуры (self-ATTN, CNN), комбинируя три подхода из нашей статьи. self-ATTN — модель, основанная на self-attentive encoder. Векторы передаются напрямую в attention, поэтому модель self-attentionстановится похожей на ту, что используется в трансформерах. Преимущество этой архитектуры в том, что её отдельные веса внимания каждого входного токена поддаются интерпретации. Это позволяет визуализировать, что именно служит триггером для классификатора. А на основе этого исследовать данные и, например, расширять список защищаемых сущностей.
В качестве функции потерь для singletask approach мы применили BCE-loss. Для multitask approach использовали loss-взвешенное среднее для двух задач: скора токсичности и предсказания класса Protected Identity. Больше деталей обучения вроде числа итераций или lr — в нашей полной статье.
Также для бенчмарка мы использовали два внешних датасета токсичности на русском (и, как выяснили потом, немного на украинском) языке.
Метод | Наш датасет | (Андрусяк и др., 2018) | (Сметанин, 2020) | |||
| GMB-AUC | F1 | GMB-AUC | F1 | GMB-AUC | F1 |
CNN | .56±.005 | .66±.003 | .51±.005 | .59±.001 | .53±.003 | .78±.002 |
CNN + multitask | .58±.001 | .68±.008 | .52±.002 | .61±.002 | .53±.010 | .80±.002 |
Attn | .60±.002 | .71±.010 | .54±.001 | .72±.003 | .54±.005 | .80±.010 |
Attn + multitask | .60±.004 | .74±.012 | .54±.009 | .69±.009 | .54±.007 | .82±.004 |
Attn + LM data | .65±.003 | .74±.002 | .58±.003 | .70±.001 | .57±.006 | .83±.009 |
Attn + LM data + multitask | .67±.002 | .74±.016 | .59±.003 | .70±.010 | .58±.003 | .84±.008 |
Attn + identity d/o | .61±.001 | .65±.003 | .53±.004 | .68±.001 | .54±.007 | .82±.011 |
Attn + identity d/o + multitask | .61±.005 | .66±.007 | .54±.004 | .69±.008 | .58±.009 | .83±.007 |
Attn + identity d/o + LM data | .67±.004 | .76±.005 | .55±.003 | .71±.002 | .59±.003 | .86±.012 |
Attn + identity d/o + LM data + multitask | .68±.001 | .78±.010 | .56±.004 | .73±.003 | .60±.008 | .86±.004 |
Таблица 3. Generalized Mean of Bias AUCs (GMB-AUC) и значение F-меры по наборам данных
Наши модели достигли конкурентоспособных результатов по F-мере на всех трёх наборах данных. Самая эффективная и хитрая из них (Attn + identity d/o + LM data + multitask setup) показала F-меру 0,86 по тесту. А это 93% от заявленной точности SoTA-модели — более крупной и созданной при помощи файнтюнинга BERT-like архитектуры.
Исследование продолжим: интересно прикинуть, как можно автоматически расширять список защищаемых идентичностей и связанных с ними слов, а также автоматизировать разметку при помощи Active Learning.
Авторы — Надежда Зуева, Павел Калайдин и Мадина Кабирова — выражают благодарность Даниилу Гаврилову и Октаю Татанову за полезные дискуссии, Даниилу Гаврилову за ревью, Виктории Логиновой и Дэвиду Принцу за редактирование текста и анонимным рецензентам за ценные комментарии. Также мы хотим поблагодарить команду модераторов ВКонтакте (которую координировала Катерина Егорушкова) за помощь в создании набора данных для обучения, Анну Мелковскую за помощь в координации проекта, Семена Полякова, Андрея Якушева, Дмитрия Сальникова за полезные советы по Active Learning и не только, Дмитрия Юткина и Александра Маркова за помощь во внедрении технологии в продакшен.
We are open for collaborations! Поэтому датасет собранных нами угроз доступен по запросу — написать можно на почту nadezhda.zueva@vk.com или ВКонтакте (vk.com/nda)
P. S. Обоснования и ссылки на подходы — в нашей основной статье: arxiv.org/abs/2010.11666