Русский
Русский
English
Статистика
Реклама

Self-attention

Краткость сестра таланта Как сделать TransformerSummarizer на Trax

22.02.2021 10:14:04 | Автор: admin

В новой курсеровской специализации NLP от deeplearning.ai в качестве библиотеки глубокого обучения используется Trax. В последнем курсе подробно разбирается механизм внимания и его использование в архитектуре Transformer, в том числе в таких новеллах как BERT и T5. Имея некоторое количество свободного времени специализацию можно пройти за несколько недель, что я собственно и сделал, соблазнившись возможностью построить собственный трансформер. Очень хотелось сделать модель, которая может работать с текстами на русском языке.

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

Trax полнофункциональная библиотека для глубокого обучения с фокусом на понятный код и быстрые вычисления. По синтаксису она в общем похожа на Keras, а модель на Trax можно сконвертировать в модель на Keras. Библиотека активно развивается и поддерживается командой Google Brain. Trax использует Tensorflow и является одной из библиотек в его экосистеме. Она работает на CPU, GPU и TPU, при этом используется одна и та же версия. Не буду говорить неправду, TPU я пока не попробовал.

Transformer - архитектура глубоких нейронных сетей, представленная в 2017 году исследователями из Google Brain. Transformer предназначен для работы с последовательностями, в том числе текстовыми, но в отличие от архитектур на рекуррентных сетях, не требует обрабатывать последовательность по порядку. Сильно упрощая можно сказать, что если из архитектуры Seq2Seq на LSTM с механизмом внимания оставить только механизм внимания и добавить нейронную сеть прямого распространения (Feed Forward), то он и получится. Подробнее про трансформеры с картинками здесь на английском, здесь на русском.

Данные

В качестве набора данных для эксперимента я решил использовать корпус новостей Lenta.Ru, свежую версию которого нашел на Kaggle. Корпус содержит более 800 тыс. новостных статей в формате (url, title, text, topic, tags, date). Если статья это text, то summary для моей модели title. Это законченное предложение, содержащее основную мысль новостной статьи. Конечно это не полное summary как, например, в англоязычном корпусе cnn_dailymail, но я подумал, что так даже интереснее.

Процесс подготовки данных представлен на схеме:

Для начала я отфильтровал аномально короткие и аномально длинные статьи. Затем выделил из набора тексты и заголовки, преобразовал всё к нижнему регистру, сохранил в виде списка кортежей и в виде полного текста. Список кортежей разбил на две части для обучения (train) и оценки (eval). Далее написал бесконечный генератор, который дойдя до конца списка, перемешивает его и начинает сначала. Неприятно же, когда генератор заканчивается где-то в середине эпохи. Это важно прежде всего для оценочного набора, я взял всего 5% от общего количества статей, примерно 36 тысяч пар.

На основе полного текста я обучил токенайзер, а в качестве токенов использовал части слов. Проблема токенизации или сегментации на целые слова заключается в том, что некоторые слова в тексте встречаются редко, возможно единственный раз, и таких слов очень много, а размер словаря конечен и хочется его сделать не очень большим, чтобы поместиться в память виртуальной машины. Приходится заменять некоторые слова именованными шаблонами, часто использовать заполнитель для слов, которых в словаре нет и даже использовать специальные техники вроде pointer-generator. А разбиение на подслова позволяет сделать токенайзер с небольшим по объему словарем, который еще и работает практически без потерь информации.

Для такой сегментации существует несколько сравнительно честных способов, познакомиться с ними можно например здесь. Я выбрал модель на основе Byte Pair Encoding (BPE), реализованную в библиотеке sentencepiece. BPE способ кодирования текста со сжатием. Для кодирования часто повторяющейся последовательности символов используется символ, которого нет в исходной последовательности. Всё тоже самое и при сегментации, только последовательность часто встречающихся символов становится новым токеном, и так пока не будет достигнут заданный размер словаря. Мой словарь содержит 16000 токенов.

Пример сегментированного текста

['ученые', 'придума', 'ли', 'новый', 'способ', 'взаимо', 'действия', 'с', 'граф', 'ен', 'ом', ',', 'который', 'позволяет', 'избавиться', 'от', '"', 'сли', 'па', 'ющихся', '"', 'ли', 'стов', '.', 'статья', 'ученых', 'появилась', 'в', 'журнале', 'ac', 's', 'n', 'an', 'o', ',', 'а', 'ее', 'крат', 'кое', 'из', 'ложение', 'приво', 'дится', 'на', 'сайте', 'северо', '-', 'запа', 'дного', 'университета', ',', 'сотрудники', 'которого', 'принимали', 'участие', 'в', 'работе', '.']

Видно, что разбиваются даже слова на латинице, а знаки препинания кодируются как отдельные токены, просто мечта, а не токенайзер. Знак нижнего подчеркивания обозначает начало слова.

Обучается модель благодаря вот такой нехитрой конструкции:

import sentencepiece as spmspm.SentencePieceTrainer.train('--input=full_text.txt \                                --pad_id=0 --bos_id=-1 --eos_id=1 --unk_id=2 \                                --model_prefix=bpe --vocab_size=16000 --model_type=bpe')

Результат два файла: словарь для контроля и модель, которую можно загрузить в обертку токенайзера. Для выбранной мной модели статья и заголовок должны быть преобразованы в последовательности целых чисел и объединены с разделением служебными токенами EOS :1 и PAD :0 (конец последовательности и заполнитель).

После преобразования последовательность помещается в корзину фиксированной длинны. У меня их три: 256, 512 и 1024. Последовательности в корзине автоматически дополняются заполнителями до фиксированной длинны и собираются в пакеты (batches). Количество последовательностей в пакете зависит от корзины, соответственно 16, 8, 4.

Рефлексия по поводу последовательностей длиннее 512 токенов

Трудно представить, что 2000 символов могут дать что-то длиннее 512 токенов, но на всякий случай сделал три корзины. А длиннее 1024 не может быть в принципе из-за фильтра в пайплайне.

Сегментация и конкатенация выполняются в пайплайне trax:

input_pipeline = trax.data.Serial(    trax.data.Tokenize(vocab_type='sentencepiece',                       vocab_dir='/content/drive/MyDrive/',                       vocab_file='bpe.model'),    preprocessing,    trax.data.FilterByLength(1024))train_stream = input_pipeline(train_data_stream())eval_stream = input_pipeline(eval_data_stream())

preprocessing это моя функция конкатенации, генератор. Сортировка по корзинам и формирование пакетов осуществляется благодаря следующей конструкции:

boundaries =  [256, 512]batch_sizes = [16, 8, 4]train_batch_stream = trax.data.BucketByLength(    boundaries, batch_sizes)(train_stream)eval_batch_stream = trax.data.BucketByLength(    boundaries, batch_sizes)(eval_stream)

Модель

Transformer, работающий с двумя последовательностями, например при машинном переводе, включает два блока энкодер и декодер, но для саммаризации достаточно только декодера. Такая архитектура в общем реализует языковую модель, где вероятность следующего слова определяется по предыдущим. Еще её называют Decoder-only Transformer и она похожа на GPT (Generative Pre-trained Transformer). Разобраться в деталях архитектур можно здесь.

Для моего случая в библиотеке Trax есть отдельный класс моделей trax.models.transformer.TransformerLM(...), то есть создать модель можно одной строчкой кода. В упомянутой специализации модель строится from scratch. Я же выбрал нечто среднее построил модель из готовых блоков, используя примеры кода.

Схема модели показана на рисунке:

PositionlEncoder() это блок, обеспечивающий построение векторного пространства и кодирование позиции токена во входной последовательности. Код:

from trax import layers as tldef PositionalEncoder(vocab_size, d_model, dropout, max_len, mode):    return [         tl.Embedding(vocab_size, d_model),          tl.Dropout(rate=dropout, mode=mode),         tl.PositionalEncoding(max_len=max_len, mode=mode)] 

Аргументы:
vocab_size (int): размер словаря
d_model (int): количество признаков векторного пространства
dropout (float): степень использования dropout
max_len (int): максимальная длина последовательности для позиционного кодирования
mode (str): 'train' или 'eval' для dropout и поз. кодирования.

FeedForward формирует блок прямого распространения с выбранной функций активации:

def FeedForward(d_model, d_ff, dropout, mode, ff_activation):    return [         tl.LayerNorm(),         tl.Dense(d_ff),         ff_activation(),        tl.Dropout(rate=dropout, mode=mode),         tl.Dense(d_model),         tl.Dropout(rate=dropout, mode=mode)     ]

Аргументы:
d_model (int): количество признаков векторного пространства
d_ff (int): ширина блока или количество юнитов в выходном плотном слое
dropout (float): степень использования dropout
mode (str): 'train' или 'eval' чтобы не использовать dropout при оценке качества модели
ff_activation (function): функция активации, в моей модели ReLU

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

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

def DecoderBlock(d_model, d_ff, n_heads, dropout, mode, ff_activation):            return [      tl.Residual(          tl.LayerNorm(),           tl.CausalAttention(d_model, n_heads=n_heads, dropout=dropout, mode=mode)         ),      tl.Residual(          FeedForward(d_model, d_ff, dropout, mode, ff_activation)        ),      ]

Из неизвестных аргументов только n_heads (int) количество головок внимания, надеюсь это удачный термин для attention heads. Каждая головка учится обращать внимание на что-то своё.

Собираю все части вместе и задаю параметры модели. У меня шесть декодеров, в каждом из которых по восемь головок внимания. Общее количество обучаемых параметров 37 412 480.

Из неизвестных мне уровней пожалуй только ShiftRight. Он сдвигает входную последовательность вправо, заполняя освободившееся место нулями, по умолчанию на одну позицию. Это нужно для teacher forcing, специальной техники, упрощающей обучение языковой модели, особенно на ранних этапах. Идея здесь в следующем: когда модель учится прогнозировать следующее слово по предыдущим, вместо прогноза модели, возможно неверного, в качестве этих предыдущих слов используются правильные ответы (ground truth). Коротко это можно описать формулой:
y(t) = x(t+1). Здесь подробное объяснение для RNN.

def SumTransformer(vocab_size=vocab_size,                  d_model=512,                  d_ff=2048,                  n_layers=6,                  n_heads=8,                  dropout=0.1,                  max_len=4096,                  mode='train',                  ff_activation=tl.Relu):    decoder_blocks = [DecoderBlock(d_model, d_ff, n_heads, dropout, mode,                       ff_activation) for _ in range(n_layers)]     return tl.Serial(        tl.ShiftRight(mode=mode),         PositionalEncoder(vocab_size, d_model, dropout, max_len, mode),        decoder_blocks,         tl.LayerNorm(),         tl.Dense(vocab_size),         tl.LogSoftmax()     )

Обучение

По моему опыту Google Colab не очень любит длительное использование своих GPU и не всегда их выделяет, особенно во второй половине дня. Поэтому я обучал модель отдельными эпохами по 20 000 шагов, где шаг соответствует одному пакету (batch). Получалось сделать 1-2 эпохи в день. 100 шагов это примерно минута, а эпоха около трех часов.

Первая эпоха показала, что модель учится только несколько тысяч шагов, дальше никаких улучшений не происходит. Оказалось, что я выбрал слишком большой шаг обучения (learning_rate). Для моей модели он должен быть 0.0002 первые несколько эпох, затем 0.0001 и 0.00005 в конце. Если бы я учил модель за один проход, то можно было бы использовать lr_schedules из trax.supervised. Там есть разные удобные варианты и с прогревом и с постепенным уменьшением шага.

В качестве метрик я использовал CrossEntropyLoss и Accuracy. За 12 эпох на оценочном наборе loss упал с 10 до 2, а доля правильных ответов возросла почти до 60%. Этого оказалось достаточно, чтобы генерировать почти приемлемые заголовки.

Цикл обучения выглядит следующим образом:

from trax.supervised import trainingdef training_loop(SumTransformer, train_gen, eval_gen, output_dir = "~/model"):    output_dir = os.path.expanduser(output_dir)    train_task = training.TrainTask(         labeled_data=train_gen,        loss_layer=tl.CrossEntropyLoss(),        optimizer=trax.optimizers.Adam(0.0001),        n_steps_per_checkpoint=100    )    eval_task = training.EvalTask(         labeled_data=eval_gen,         metrics=[tl.CrossEntropyLoss(), tl.Accuracy()]     )    loop = training.Loop(SumTransformer(),                         train_task,                         eval_tasks=[eval_task],                         output_dir=output_dir)        return loop

Аргументы:
SumTransformer (trax.layers.combinators.Serial): модель
train_gen (generator): поток данных для обучения
eval_gen (generator): поток данных для оценки качества.
output_dir (str): папка для файла модели, откуда её можно скопировать на Google Drive перед выключением виртуальной машины.

Дальше всё просто:

loop = training_loop(SumTransformer, train_batch_stream, eval_batch_stream)loop.run(20000)

и три часа ожидания...

Оценка результатов

Для оценки результатов я использовал жадный декодер на базе argmax, который определяет индекс наиболее вероятного токена в словаре по положению максимального значения в выходном тензоре. Далее токен добавляется к входной последовательности и операция повторяется пока не появится символ EOS или не будет достигнута заданная максимальная длина предложения.

Примеры из оценочного набора:
(Исходный текст сокращен)

Тест #1: швейцарская часовая компания audemars piguet представила новую модель из коллекции royal oak. как сообщает luxurylaunches, речь идет о часах с вечным календарем. официальная презентация пройдет в рамках международного салона высокого часового искусства sihh, который проходит в женеве...
Образец: дом audemars piguet оснастил часы вечным календарем
Модель: audemars piguet представила новую модель из коллекции royal oak

Тест #2: на ежегодном фестивале в городе грэхэмстаун, юар, фокусник случайно выстрелил в голову своему напарнику во время представления. об этом сообщает местная газета the daily dispatch. инцидент произошел 30 июня. брендон пил (brendon peel) и его ассистент ли лау (li lau) выполняли магический трюк перед многочисленной аудиторией, когда пил по неосторожности пустил в затылок напарника стрелу...
Образец: фокусник случайно подстрелил ассистента наглазах узрителей
Модель: на фестивале в грэлково напали с ножом
(И не в грэлково, и не напали, и не с ножом, но спасибо, что это было холодное оружие, а не пистолет)

Еще примеры

Тест #3: международный валютный фонд (мвф) в среду, 15 мая, утвердил выделение кипру кредита в размере 1,33 миллиарда долларов (миллиард евро). как сообщает agence france-presse, в качестве первого транша кипрское правительство получит 110,7 миллиона долларов. утвержденный 15 мая кредит является частью плана помощи...
Образец: мвф выделил кипру миллиард евро
Модель: мвф утвердил кредит на кипрский кредит

Тест #4: автопортрет энди уорхола, выполненный в 1965 году и ранее не выставлявшийся, продадут с аукциона, пишет the new york times. автопортрет более 40 лет хранила бывшая секретарша уорхола кэти нейсо (cathy naso), которая получила картину от художника в оплату ее работы. нейсо работала в студии уорхола...
Образец: неизвестный автопортрет энди уорхола выставят наторги
Модель: энди уорхола продадут с аукциона

Тест #5: sony решила выпустить файтинг, который станет "ответом на игру super smash bros" от nintendo, пишет vg24/7 со ссылкой на paul gale network и neogaf. в новом проекте, в настоящее время известном под названием title fight, герои из нескольких игр издательства сразятся между собой...
Образец: sony приписали разработку нового файтинга
Модель: sony выпустит файтинг от nintendo

Интересно, что на ранних этапах обучения вместо белиберды модель генерирует почти осмысленные фейки. Чтобы посмотреть как это происходит, я сделал скринкаст нескольких интересных на мой взгляд вариантов:

Ссылки

  • Мой репозитарий с кодом эксперимента)

  • Репозитарий trax

  • Математика механизма внимания в знаменитой статье Attention Is All You Need. Кстати один из авторов статьи, Lukasz Kaiser, штатный исследователь Google Brain, является также автором и инструктором специализации.

Примечания

Я использовал trax 1.3.7, он инсталлируется через pip, но не работает под Windows. На форумах пишут что можно под WSL. А еще там нет beam_search, который есть в документации и который я очень хотел попробовать.

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

В упомянутой модели TransformerLM выход не нормализован (нет уровня softmax).

Подробнее..

Чёрный петух, жирный творог и альпийская корова,илиУменьшение предвзятости в классификации токсичности

10.03.2021 14:15:34 | Автор: admin

В ноябре на EMNLP 2020 в четвёртый раз прошёл воркшоп WOAH: он был посвящён алгоритмам, обнаруживающим кибербуллинг и токсичность в онлайн-пространстве. Мы выступили со статьёй о ложноположительных срабатываниях детектора враждебных высказываний. На прошлой неделе мы запустили фильтр на основе этого детектора: каким был путь от идеи до релиза и публикации рассказываем в этой статье.

Проблема и существующие решения

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

Недавно мы запустилиеще один фильтрвраждебных высказываний.Хоть угрозы в комментарияхчастоне несут реальной опасности,онисоздаютагрессивнуюатмосферу в пабликеипорой могут провоцироватьнанасилие в офлайне.Мысделалифильтр,которыйавтоматически удаляетугрозы: например, пожелания смерти или обещания причинить вред здоровью.Администратор сообщества можетвключить и выключитьегов любой момент, а ещё посмотреть все отсеянные комментарии,восстановитьлюбой из них илиотправить автора в чёрный список.

С проблемой угроз и оскорблений сталкиваемся не только мы, но и многие другие интернет-площадки.Разработчики вместе с представителями социальных сетей стремятсясоздаватьнадёжные модели, обнаруживающиетоксичность.Но частаяпроблематаких детекторов наличие Unintended Bias (UB) при вынесении вердикта. Иными словами, модель учится присваивать высокий скор токсичности текстам, в которыхестьспецифичные слова: оничасто встречаютсяв оскорбительном контексте, но сами по себе несодержат негативного смысла. Например:женщина, чёрный, петух, админ. Такие слова мы будем называть защищаемыми сущностями,или Protected Identities(PI).

ВКонтакте, 2020 https://vk.com/safetyВКонтакте, 2020 https://vk.com/safety

Сейчас естьмногоконтестови мастер-классов, посвящённых распознаванию токсичных выражений:например,HASOCнаFIRE-2019; TRAC-2020; HatEvalиOffensEvalнаSemEval-2019.Также на платформе Kaggle проводятся состязания по этому направлению и даже по его узкой теме Unintended Bias! В последнемсоревновании от Jigsawиспользовалась специфичная для нашей задачи метрика, на которой мы валидировали модели(подробнее в следующем разделе статьи).

Исследованийпообнаружениютоксичности в русском языкепока мало.Существуетunsupervised-методдлярасширениясловаря оскорбительных и непристойных слов на русском и украинском языках. Ещёнедавно была предложенамодельBERTдля классификациитоксичногорусскоязычногоконтента сейчас онанаиболее близка кSoTA, но еёсложно использовать из-за размера.

В статье сWOAHEMNLP2020мы рассказываем о трёх подходах, которые помоглиуменьшить число false-positive предсказаний:

  1. Мыприменилиязыковую модель для генерации нетоксичных примеров с контекстом по защищаемым сущностям.

  2. Использовалидропаут на слова из спискатакихсущностей.

  3. Опробовалиmultitask-подходы, о которых расскажем далее.

Как мыразрабатывалидетектор(данные,мини-апп, проблема UnintendedBias)

Весной 2020 года мывзялись за разработкусобственного детектора токсичности, который могли бы применитьВКонтакте.Думали о разных фичах, в которыхон был бы полезен. Поняли, что администраторам сообществ пригодитсяфильтр враждебных высказываний: онпозволит авторам открыть комментариипод записями и не опасаться, что там будут бесконтрольно разрастаться токсичные обсуждения. Кроме того, фильтр способенснизитьобщийградус враждебности на площадке и уменьшитьнагрузку на модераторов.

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

Первые вопросы,на которыенам предстоялоответить на старте разработки:

  • Как понять, что перед нами токсичный текст?

  • Как разметить данные для обучения?

  • Сколько вообще их нужно?

Для разметки мы использовали комментарии из публичных сообществ брали анонимизированные реплики недлиннее 100 слов.При составлении правил разметки важно былоиметь в виду, чтонаша нынешняя модель не сможет учитывать контекст, как модераторы.Поэтому все спорные ситуациимырешилипомечать как нетоксичные.

Угрозы

Не угрозы

Обещанияипожелания смерти,причинения вреда здоровью

Призывы отправить кого-то в тюрьму

Угрозы с сексуальным подтекстом

Одобрение действий, которые нам неизвестны

Пожелания смерти самому себе

Эпитафии

Таблица1. Некоторые изправил разметки

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

Чтобысобирать данные максимально эффективно, на финальныхэтапахразметки мы использовали подходActive Learning. Онпозволяетдокидывать примеры с максимальной энтропией для дообучения классификатора. Конечно, в перспективе было бы здорово поставить всёэто на конвейер :)

Когда завершиласьперваяитерацияразметки и тестирования классификатора,мы заметили, что существует проблема UB. Она проявляется в двух моментах:

  • классификатор считает токсичнымитекстывидатыне чучелоилиназыватьлюдей чучелами плохо этоудалось решить довольно быстро генерацией синтетики;

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

Крометого, изобретательные пользователи придумывали сложные трёхэтажные оскорбления но их победила модельBPE.

Дальше мы действовали так: вручную составилисписокиз 214русских слов,которые относятсяк защищаемым сущностям(тоестьтем, которые часто встречаются в оскорбительном контексте, но сами по себене несут негативного смысла). Слова распределили похарактеру токсичностина категории: сексизм, национализм, угрозы, домогательства, гомофобия и другие.Полный список защищаемыхидентичностейи относящихся к ним словможно посмотреть на GitHub:vk.cc/aAS3TQ.Воfuturework смелозаписываемавтоматизацию сбора таких сущностей.

лукизм

корова,пышка

сексизм

женщина,баба

национализм

чех,еврей

угрозы

выезжать,айпи

домогательства

киска,секси

гомофобия

гей,лгбт

другое

мамка,админ

Таблица 2. Выдержки из полного списказащищаемыхидентичностейи относящихся к ним слов

Как можно оценить Unintended Bias?

В соревновании от Jigsaw,как и на нашемчемпионатеVK Cup,качествопредсказанийоценивалосьпри помощиgeneralizedmean of Bias AUCs. Идея такой метрикив том,чторезультатыработы модели на тестеразбиваютсяна сабсетыв зависимости от выхода модели и наличия слов из списка защищаемых сущностей. Затем мы считаем AUC по каждомусабсету,берём от них обобщённое среднееикомбинируемегос варьируемыми весами с AUC по всем результатам.

Метрика качества. Взято из соревнования от JigsawМетрика качества. Взято из соревнования от Jigsaw

Метрика качества. Взято из соревнования от Jigsaw

Наши подходы

  1. Нетоксичная языковая модель

    Один из способов победитьпредвзятость сгенерировать нетоксичные примеры для обучения, снабдив ихконтекстом по словам из списказащищаемых идентичностей. Приэтомязыковая модель должна быть обучена на текстах из нетоксичного распределения. Мы взяли Transformer,ав качестве данных для обучения детскиесказки, русскую классическую литературу и научпоп.Всего сгенерировали25000дополнительныхпримеровидобавилиихктрейнсету.

  2. Random dropout на Protected Indentities

    Известно,что random word dropoutможетсделатьклассификациютекстакачественнее.Мыприменилиэтот метод, чтобыво время обученияслучайным образом(свероятностью 0,5) заменять защищаемыеидентичностивовходных последовательностяхнамаркер.

  3. Multitask framework

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

Схема обучения модели с применением multitask-learningСхема обучения модели с применением multitask-learning

Схема обучения модели с применением nultitask-learning

Результаты

Мыработали сэмбеддингами,предварительно обученнымина корпусах комментариев из публичных сообществ, русских субтитров из разных фильмов и видео(наних жетренировалась модельBPE).

Попробовалидве архитектуры(self-ATTN,CNN),комбинируятриподходаиз нашей статьи.self-ATTN модель, основаннаяна self-attentive encoder.Векторыпередаютсянапрямуювattention,поэтомумодельself-attentionстановится похожей на ту,что используется втрансформерах. Преимущество этой архитектуры в том, что её отдельные веса внимания каждого входного токена поддаются интерпретации.Это позволяет визуализировать, что именно служит триггером для классификатора. Ана основе этого исследовать данные и, например,расширятьсписокзащищаемыхсущностей.

Визуализация attention по словамВизуализация attention по словам

Визуализация 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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru