Предыстория
Есть известная проблема с токсичными людьми в чатах. У модераторов чатов не всегда получается отслеживать и банить токсичных людей, хотелось бы автоматизировать процесс.
В прошлой статье было мало уделено архитектуре нейросети. Цель данной статьи рассказать больше об архитектуре сети и её компонентов, которые использует бот для определения токсичных сообщений.
Если вы не читали предыдущую статью, пожалуйста, ознакомьтесь.
Об архитектуре.
Архитектура нейросети CNN + GRU. Почему же выбрано CNN+GRU, а не просто GRU или CNN?
Нейросеть состоит из 3-х основных частей(CNN, GRU, Linear). Давайте рассмотрим каждую часть сети, чтобы понять, для чего они.
Гиперпараметры
(conv1): Conv1d(300, 512, kernel_size=(5,), stride=(1,), padding=(2,))
(conv2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))
(conv3): Conv1d(1024, 2048, kernel_size=(5,), stride=(1,), padding=(2,))
(gru): GRU(2048, 512, batch_first=True)
(fc1): Linear(in_features=512, out_features=256, bias=True)
(fc2): Linear(in_features=256, out_features=2, bias=True)
CNN – Convolution Neural Network
Обычно свёрточные слои используют для классификации изображений. Как и в классификации картинок, свёрточный слой выделяет “признаки”, но в нашем случае векторизированный текст. То-есть данная часть сети учится выделять признаки токсичных и позитивных сообщений.
GRU - Recurrent Neural Network
Текст – это последовательность слов или, в нашем случае, векторов, которую свёрточный слой обработал и выделил признаки. Чтобы обрабатывать последовательности произвольной длины, используют рекуррентные слои. В архитектуре используется рекуррентный слой GRU.
Linear – линейный слой
Данный слой учится делать заключительное решение по определению тональности текста на основе предыдущих слоёв.
Об обучение нейросети и результатов
Подготовка данных
Для обучения нейросети нужен датасет. Датасет был взят с сайта kaggle. Около 14000 комментариев с разметкой токсичное сообщение или нет. Но данный датасет имеет изъян – орфографические ошибки. Для решения данной проблемы была использована библиотека Yandex Speller, которая исправляет орфографические ошибки.
Дальше надо превратить текст в числа, т.к нейросети только с ними и работают. Можно было обучить собственный Word2Vec на основе данного набора данных, но лучше взять уже обученный. Например: Navec. Модель обучали на русской литературе (~150gb), что говорит о качественной векторизации текста.
Также надо разделить датасет на тренировочную и тестовую выборки.
Обучение нейросети
Для классификации используется обыкновенная функция потерь – кросс энтропия.
При обучении сети надо обращать внимание на основные параметры такие, как loss, precision и accuracy. Всего сеть пройдёт 5 эпох, т.к начиная с 5-ой эпохи нейронная сеть начинает переобучаться.
Результаты
После обучения сети мы имеем вот такие результаты на тестовой выборке:
loss | accuracy | precision |
0.362 | 0.857 | 0.92 |
Вывод
Результаты обучения вполне хорошие, но хочется добиться результата получше, т.к на практике модель всё-таки ошибается, но не часто. В ~80% случаев нейросеть классифицирует тональность текста правильно.