- BrainTools - https://www.braintools.ru -
В современном мире генерация изображений с помощью нейросетей стала возможна не только большим компаниям с суперкомпьютерами, но и рядовым пользователям с простым геймерским железом.
И возможно, кому-то захотелось не только самому пользоваться этими нейросетями, но и дать доступ к ним большому кругу людей, что может быть сопряженно с некоторыми трудностями.
Некоторые модели для генерации изображения обучаются на весьма спорном контенте. После такого обучения [1] они хорошо понимают анатомию человека, но есть и минус – они начинают крайне охотно генерировать подобный контент, и иногда в очень извращённых вариациях. Поэтому, чтобы не травмировать психику бедных пользователей (а также ограничить их возможность удовлетворять свои фетиши через наш сервис) нужно добавить цензуру подобного контента.
Проведя поиск в интернете, я смог найти только общие рекомендации по реализации цензуры, но ничего конкретного. Поэтому сегодня я хочу рассказать, как сделана данная функция в моём проекте, возможно, кому-то из вас это будет полезно.
Самым простым вариантом является создание чёрного списка слов, ограничивающих запросы с ними. Плюсом подобного решения является его скорость: проверка словарём в пару тысяч слов займёт не больше пары сотен миллисекунд. Но есть и минусы: крайне сложно предсказать все слова, которые могут использовать для генерация запрещённого контента, а часть слов может использоваться и в обычных запросах; словарь требуется отдельно для каждого поддерживаемого языка; при желании, словарь можно обойти за пару часов.
Более технологичным решением будет проверять итоговое изображение на предмет запрещённых тем. Для этого можно использовать различные решения, я использовал библиотеку NsfwSpy, которая проверяет изображение и при нахождение неподходящего контента блокирует дальнейшую отправку пользователю. Точность такого решения составляет примерно 95%, что является хорошим показателем. Но у такого решения есть и существенный минус: для проверки сначала нужно сгенерировать изображение, а это лишняя трата ресурсов.
Чтобы оптимизировать расход можно использовать более технологичное решение – отдельная нейросеть для анализа запросов перед генерацией. Анализировать текст заметно проще, чем изображение, поэтому помимо экономии на генерации, будет меньший расход для анализа изображений, что очень важно для решений с не высокой производительностью (но и для высокопроизводительных систем экономия ресурсов будет полезна).
В качестве модели для анализа можно использовать как специально разработанные для таких задач модели, так и языковые модели. Эффективность первых будет на порядок выше, но зачастую их нужно обучать самому, что не подойдёт многим пользователям. На фоне этого недостатка языковые модели выглядят более простыми для быстрого запуска, всё что нужно – выбрать подходящую модель и правильно составить системный промт.
Не важно, какое решение будет выбрано, для проверки фильтра нужно составить набор тестовых запросов. В моём случае я создал 1000 тестовых запросов, 400 из которых являются потенциально нежелательных. Такое количество позволит получить достаточно точные результаты, чтобы оценить эффективность решения.
Теперь нужно продумать критерии оценивания. Я решил использовать три значения: точность – выражается в проценте правильно определённых NSFW запросов, ошибка [2] – выражается в проценте неправильно определённых SFW запросов и среднее время выполнение – выражается в миллисекундах, затраченных на выполнение одного анализа.
Я буду использовать языковую модель, так-как их можно начать использовать быстрее, а их эффективность зачастую достаточна для простых проектов. Но выбрать одну модель сложно, поэтому я проведу сравнительный анализ трёх разных моделей: Phi-3-mini-4k -instruct-q4, Qwen2.5-1.5b-instruct-q4_k_s и Gemma-2-2b-it-Q4_K_S. Тестировать каждую модель буду дважды, первый раз без примеров, второй раз с ними, в некоторых случаях это может повысить эффективность.
Первой моделью для тестирования будет phi3. Это достаточно умная модель для своих размеров (всего 3.8 миллиардов параметров). Я ожидаю, что она хорошо справится и единственным недостатком будет долгое время выполнения и требования к системе, ведь даже Q4 версия весит больше двух гигабайт.
Перейдём непосредственно к тестам.
|
Промт |
Обычный |
С примерами |
|
Точность (% заблокированных опасных запросов) |
55% |
93,5% |
|
Ошибка (% заблокированных безопасных запросов) |
1.3% |
42,5% |
|
Среднее время выполнения (мс) |
359 |
523 |
(все тесты проводилось без использования тензорных ядер, поэтому в готовой системе время анализа будет на порядок ниже.)
Результаты оказались хуже, чем я предполагалось, думаю, если потратить больше времени на подбор промта и примеров, можно получить более высокие показатели, но, возможно, phi3 просто не подходит для этой задачи.
Из ожидаемого – время анализа одного сообщения оказалось достаточно большим. Однако, хоть результаты и не самые привлекательные, возможно другие модели проявят себя хуже.
Теперь рассмотрим модель Qwen2.5. Это самая маленькая модель, которую я сегодня рассмотрю: у неё всего 1.5 миллиарда параметров и версия Q4_K_S весит около 900 мегабайт. Она достаточно быстрая, но качество ответов желает лучшего, возможно с анализом сообщений она справится лучше.
|
Промт |
Обычный |
С примерами |
|
Точность |
53,2% |
80% |
|
Ошибка |
1% |
4% |
|
Среднее время выполнения |
85 |
280 |
Скорость выполнения действительно заметно выше, точность в обычном режиме сопоставима с Phi3. Зато вариант с примерами заметно лучше, высокая точность и относительно низкая ошибка позволяет использовать подобный фильтр в системах с высокими требованиями.
Теперь перейдём к последней модели – Gemma 2, она является чем-то средним между phi3 и Qwen2.5. Имеет 2 миллиарда параметров, и в Q4_K_S версии весит полтора гигабайта. Должна быть достаточно точной и быстрой, чтобы стать универсальным вариантом.
|
Промт |
Обычный |
С примерами |
|
Точность |
66,7% |
>0.1% |
|
Ошибка |
>1% |
>0.1% |
|
Среднее время выполнения (мс) |
130 |
238 |
Результаты вышли несколько необычными: вариант с обычным промтом проявил себя крайне хорошо, но с примерами результат вышел нулевым. Скорее всего причиной этому стала невозможность прочитать ответ модели.
Чтобы решить проблему нулевой точностью у Gemma 2, можно использовать два подхода: анализировать ответы модели и учиться считывать их все или использовать Grammer для ограничения возможных ответов. Второй вариант выглядит более технически правильным, ибо даёт точный результат.
Настроить grammer крайне легко, ограничиваем правило root двумя ответами “да” и “нет” и получаем результат. После настройки результаты стали выглядеть следующим образом:
Phi-3
|
Промт |
Обычный |
С примерами |
|
Точность |
51% |
93,7% |
|
Ошибка |
1% |
43,1% |
|
Среднее время выполнения (мс) |
270 |
553 |
Qwen2.5
|
Промт |
Обычный |
С примерами |
|
Точность |
55% |
80,5% |
|
Ошибка |
>1% |
3,8% |
|
Среднее время выполнения |
156 |
378 |
Gemma-2
|
Промт |
Обычный |
С примерами |
|
Точность |
66% |
40,2% |
|
Ошибка |
>1% |
>0.1% |
|
Среднее время выполнения (мс) |
231 |
321 |
Почти везде время анализа увеличилось на 100 миллисекунд, при этом эффективность анализа не изменилась. Единственным исключением является Gemma-2 с примерами, которая достигла рекордных значений ошибки (на 1000 тестовых примеров ошибка было 0%), но потеряла точность в сравнение с вариантом без примеров. В целом это можно назвать хорошим вариантом, если стоят крайне строгие требования к ошибкам.
Модели показали различные результаты, что позволит выбрать подходящую для многих задач. Лично я остановлю свой выбор на Gemma-2 без примеров и grammer-а. Она показывает хорошую точность при этом крайне низкую ошибку, что важно для моей системы, но не является универсальным решением.
Подобно тому, как реализована защита от взрослого контента, можно добавить фильтрацию и других запрещённых тем, используя одну модель для нескольких анализов.
Надеюсь, эта статья будет полезна хоть кому-то, спасибо за внимание [3].
Автор: LIANIT
Источник [5]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/27615
URLs in this post:
[1] обучения: http://www.braintools.ru/article/5125
[2] ошибка: http://www.braintools.ru/article/4192
[3] внимание: http://www.braintools.ru/article/7595
[4] Приложение для тестов: https://gitverse.ru/LIANIT/NSFW_Filter
[5] Источник: https://habr.com/ru/articles/1014094/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1014094
Нажмите здесь для печати.