Делаем анализатор ников на новой FRED-T5. Тотальный разнос

FRED-T5 расшифровывается как Full-scale Russian Enhanced Denoisers based on T5 architecture

FRED-T5 расшифровывается как Full-scale Russian Enhanced Denoisers based on T5 architecture

Мы так давно ждали, и, наконец, свершилось! В русском языке появилась новая, по-настоящему «понимающая» модель. По результатам тестов Russian SuperGLUE модель признана лучшей в русском сегменте по пониманию языка, и, поэтому, кто-то должен провести свежий, так сказать, народный тест модели, показать, на что она способна в руках тунеядца вроде меня! Запасайтесь квасом и попкорном, дальше будет жарко, как никак, скоро лето (по крайней мере на момент выпуска поста).

В этой статье мы обсудим возможности новой модели и сразу же дадим ей нетипичную задачу — анализировать никнеймы жалких человеков великих представителей доминирующего вида

Обоснование выбора

Модель FRED-T5 XL содержит 1.7 миллиарда параметров. Для модели в русском сегменте это немало, так как большинство всё ещё остаются на уровне менее 1b (b — это миллиард, от англ. billion). Вплоть до этой модели я был откровенно разочарован почти всеми русскими моделями, которые испытывал (порфирьевич, балабоба, ruGPT-3 XL и др.). Дело в том, что многие русскоязычные модели глупенькие, обожают менять тему там, где это не надо, и, вместо логичного продолжения текста выдавать всякий бред (по типу того, который школьники делают для учителя, который проверяет только факт наличия у них домашки, но не саму домашку). А модели побольше либо слишком огромные (YaLM-100B требует более 200 гб GPU памяти), либо закрытые (тот же яндекс не выпускал модели меньше 100b в открытый доступ). Для меня же важно, чтобы модель была «народной» — запускалась на народном железе, понимала язык и была полностью открытой. Фред (который T5-XL) — один из таких, всего 8 гигов памяти и невероятные результаты в тестах!

Постановка задачи

В общем, перейдем к делу. Последнее время в интернете развелось огромное количество различных псевдонимов, никнеймов и прочих вариаций бесполезного набора символов. Допустим, есть вот такой ник: «Глист342». Я хочу, чтобы нейросеть могла анализировать этот ник так, как будто бы, это что-то, имеющее смысл, и могла, на основании псевдонима, получить минимальные знания (пусть и недостоверные) о пользователе ещё до общения с ним.

Предупреждаю, что в статье содержатся элементы, которые кому-то могут показаться не только не смешными, но и вредными, непристойными, оскорбительными. Отчасти это так, но нельзя отрицать, что это может быть частью культуры нашего общества :(Нейросети, как никто другой, должны научиться грамотно идентифицировать, в том числе, и такие, токсичные виды юмора. Автор в данной статье ни в коем случае не пытается оскорбить обладателей любых имен, псевдонимов или группы людей, объединенных каким-либо общим признаком. Рейтинг статьи строго 18+, так что лучше уберите детей от экранов! Надеюсь не забанят, поехали дальше.

образец анализа ника

«Глист352»: Глист352, что это? Глист — паразит, который живет в кишечнике человека. А число 352 означает количество глистов у автора этого ника. Думаю, лучшим вариантом для этого ника была бы сдача его автора в какой-нибудь центр гастроэнтерологии-паразитологии, чтобы ему вытащили этих бедных глистов, а то мучаются в его желудке!

«Рецензия» этого ника наполовину сгенерирована нейросетью. Я баловался с различными промптами (вводными данными), и спустя уже пару попыток она смогла выдать нечто подобное! Всё, что я добавил, это поправил грамматику и исправил некоторые логические ошибки. Она сама догадалась о том, чтобы связать число и смысл ника автора, имея в промпте всего лишь один посредственный анализ ника (так как воображение у меня весьма скудное). Дальше будет много таких «рецензий», так что готовьтесь.

Представьте чат-бота, который, прочитав ваш ник, уже имеет какое-то минимальное впечатление о вас. Эта же система может использоваться в игровой индустрии — например, автоматически делать смысловой анализ вводимого вами ника и возвращать отказ, если вы вкладываете в него какой-то запрещенный правилами смысл.

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

Решение задачи

Инициализация модели мало чем отличается от запуска других LLM (Large Language Model, большая языковая модель) на torch, но, по рекомендациям авторов, надо использовать GPT2 токенайзер вместо нативного для этой модели T5 (да, есть T5 токенайзер, но по определенным причинам он вроде как работает хуже). Модель я скачал с хг и закинул в подпапку model возле скрипта.

код инициализации

#какие библиотеки понадобились
import torch
#torch.set_num_threads(4)# если cuda, отрубаем это. Грузит проц, но ни*** не дает =( прирост менее 20%
import datetime,random,os
from transformers import GPT2Tokenizer, T5ForConditionalGeneration 

#чтобы читать было нескучно, класс цветов для форматирования текста вывода в консоли
class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKCYAN = '\033[96m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'
#простейшая функция для подсчета времени генерации
def calcTime(time):
    return bcolors.OKGREEN+str((datetime.datetime.now()-time).total_seconds())+bcolors.ENDC


thisfolder = os.path.dirname(os.path.realpath(__file__))
tokenizer = GPT2Tokenizer.from_pretrained(thisfolder+'/model',eos_token='')
model = []
nick = "obama421"
device = []
e = []
lastTokensUsed=0
device = "cuda"
  
#загружаем модель
t = datetime.datetime.now()
device = "cuda"
print('Загрузка модели...')
model = T5ForConditionalGeneration.from_pretrained(thisfolder+'/model')
model.to(device) #"cuda:0" cuda с индексом 0.. хз что это значит
ModelLoaded = True
print('Модель загружена! Время:'+calcTime(t))

#функция запуска генерации модели
def FredT5(ninp,p={
        #настройки модели
        "do_sample":True,
        "top_p":0.9,
        "temperature":0.15,
        "repetition_penalty": 2.0,
        "min_length": 5,
        "max_length": 200,
        "tokens_offset":0
        }): 
        t = datetime.datetime.now()
        inp = ''+ninp
        #print('БЕЗ СПЕЦТОКЕНОВ: ',[tokenizer.encode(inp,add_special_tokens=False)])
        #print('СО: ',[tokenizer.encode(inp,add_special_tokens=True)])
        #кодирование ввода
        input_ids=torch.tensor([tokenizer.encode(inp,add_special_tokens=True)]).to(device)
        #генерация. На моей 3080 занимает около 2 сек в среднем при 1к токенов во вводе и 100 на выводе
        outputs=model.generate(
            input_ids,
            do_sample = p["do_sample"],
            top_p = p["top_p"],
            temperature=p["temperature"],
            repetition_penalty = p["repetition_penalty"],
            min_length = p["min_length"],
            max_length = p["max_length"],
            eos_token_id=tokenizer.encode(']',add_special_tokens=True)[0],#tokenizer.eos_token_id,
            early_stopping=True) #https://huggingface.co/docs/transformers/v4.18.0/en/main_classes/text_generation
        if(len(outputs)>0):
            lastTokensUsed = len(outputs[0])
        print(calcTime(t)+' - время просчета, токенов в ответе -',lastTokensUsed,'\n')
        return tokenizer.decode(outputs[0][1+p["tokens_offset"]:], skip_special_tokens=True) # БЫЛО outputs[0][1:]
#использование функции
print('Ответ модели >>',FredT5("""
здесь должен быть промпт(текст, который модель будет продолжать)
""",{
        "do_sample":True,
        "top_p":0.9,
        "temperature":0.15,
        "repetition_penalty": 2.0,
        "min_length": 5,
        "max_length": 200,
        "tokens_offset":0
        })
      )

Итак, когда мы инициализировали модель, можно приступать к подготовке промптов. Загрузка модели занимает около 10 секунд, генерация результата — около 2-ух в среднем на rtx 3080.

Напишем несколько образцов «разбора ников», которые скормим модели в промпт.

Так как я ленивая задница, никакого файнтюна (дообучения модели), естественно, не будет. Все результаты будут достигаться исключительно пинанием х минимальным трудом, да здравствует лень, двигатель прогресса!

промпт

Промпт для модели будем делать, используя максимально простую и понятную структуру: «ник»: его повторение, описание состава и предложение варианта лучше, если это возможно. Для прикола в конце будет добавляться эмоция, реакция модели на ник. Эта структура будет повторяться n раз, до тех пор, пока модель не начнет генерировать правдоподобную критику ников.

Также, стоит сказать о специальных кодах, «маркерах». Маркер означает для модели end-of-stream токен, иными словами, конец генерации. То есть, если модель его сгенерирует, генерация остановится, и мы не получим больше или меньше текста, чем нам нужно.

вступление

Для начала, напишем модельке её описание. Без него она отвечает хуже и скучнее. Знаю, что звучит странно, но, если не верите, проверьте сами))

«обо мне»: говоря обо мне, я девушка 22 лет и занимаюсь тем, что анализирую ники и придумываю шутки, основываясь на этих никах, чтобы посмеяться над авторами этих ников и предложить им вариант получше. В конце рецензии я пишу только одну из этих эмоций: скучно, интересно, весело.\n[эмоция=интересно]\n.

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

образцы анализа ников [содержит оскорбления]

Надеюсь, что никто не из читателей не обидится, как никак, это эксперимент на понимание моделью основной части человеческого юмора, большей частью которого всегда являлась чья-то грамотная или не очень критика. Разумеется, автор никого из обладателей данных имен не хочет оскорбить. Всё ради науки! (образовательные цели, юзер дескрипшен из эдвайсд, бла-бла-бла…)

«васек47»: васек47, ник состоит из двух частей, письменной — васек, и численной — 47. Используя цифры в нике, автор, видимо, подтверждает, что он мелкий ребенок, либо недалекий взрослый. Число указывает на количество хромосом у автора этого ника? Теперь о письменной части. Васек. Что это? Так называют собак, или, может быть, домашних харьков? Хорошим вариантом для этого ника был бы ВасилийУбийца, это и звучит солиднее, и не содержит лишней информации.\n[эмоция=скучно]\n.

«лох»: лох, серьезно? А где цифры? Я уже успела по ним соскучиться (Классным вариантом для этого ника было бы сменить своего автора. Ну серьезно, где креатив? Что за шаблоны?\n[эмоция=скучно]\n.

»523535»: 523535, это че за набор цифр? Номер телефона что-ли? Или номер психушки, куда следует позвонить, чтобы у автора забрали смартфон, с которого он терроризирует интернет придумывая подобные псевдонимы…\n[эмоция=скучно]\n.

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

Первый ответ модели, из промпта был только анализ ника «васек» и информация модели «о себе» (извиняюсь за качество)

Ну, теперь, когда всё готово, приступим к тестированию! Из разных источников я собрал несколько интересных (ну или не очень) ников, изменил их (так как мы же не хотим получить новых врагов) и скормил их модельке. Результат приятно удивляет, если учитывать количество параметров модели… Как по мне, это неплохой показатель понимания юмора и языка в целом.

Вот несколько самых забавных «рецензий», придуманных нейросетью FRED-T5 XL:

[орфография и пунктуация «автора» сохранены]

  • Sm1le-_-, это сокращение от «smaller», что означает маленький. Автор этого ника — ребенок, который боится показаться взрослым и поэтому использует сокращения для того, чтобы скрыть свой возраст? Классным вариантом был бы ник с использованием цифр или букв в зависимости о возраста автора: МаленькийСмешнойПухляш.[эмоция=весело]

    [тот же самый ник при температуре 38 0.015]

  • Sm1le-_-, что это? Это сокращение от «small» — маленький. А число 1 означает, сколько лет автору этого ника на самом деле (если он вообще старше 18).[эмоция=весело]

  • Ник — ЩШвшупукц. Я не буду это переписывать, сами читайте, снизу пикча (содержит зацензуренный жаргон).

    Пример анализа спам-ника. Удивляет, что нейросеть способна находить какие-то смысловые закономерности даже в полностью рандомном наборе букв

    Пример анализа спам-ника. Удивляет, что нейросеть способна находить какие-то смысловые закономерности даже в полностью рандомном наборе букв

  • Ещё один пример, который я могу вставить только пикчей.

    Без комментариев

    Без комментариев

  • Perdonus, что это? Это имя персонажа из игры майнкрафт. Пердонуса зовут так же как и главного героя в этой игре — пердун! Думаю автор этого ника очень любит играть с именами персонажей своей любимой игрушки…
    [эмоция=скучно]

  • =(

    а вот это обидно было

    а вот это обидно было

Так как модель русская, в промпт с инструкциями я вписывал только ники на русском. Но при анализе она отлично справлялась и с английскими вариантами! Из проблем, модель часто игнорирует пунктуацию (кстати, вполне возможно, что это я накосячил в промпте, забыв пару запятых) и за редким исключением выдаёт полную бессмыслицу.

бред и бессмыслица, но тоже забавно

Это называется

Это называется «и после 5 бутылки батю понесло». Без комментариев.

Классный вариант, мне нравится

Классный вариант, мне нравится

Выводы и сравнения

Заметим, что в результате генерации достаточно часто попадается мат. Ну что ж, видимо «модель» во всех смыслах «народная», и, каким-то образом, мат ей тоже передался, видимо, по наследству. Впрочем, это даже представить сложно, отечественная модель, и не знает мата:

как говорил Оксимирон, мат — жемчужина великого русского языка!

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

Следующим шагом я решил дать эту же задачу другим сеткам и сравнить результаты. Очевидный и безоговорочный победитель — FRED-T5. Никакая из проверенных мной других нейросетей даже и близко не подобралась к ней по уровню понимания прелести анализа чужих никнеймов.

пример работы других сеток на той же самой задаче

Яндекс Балабоба. На мой взгляд, весьма посредственная генерация, мало объема на вход и цензурирование там где это не нужно. Удалось загрузить только 2 примера критики ников, и исковеркать некоторые, чтобы нейронка запустилась.

Ей несколько раз не нравился ник

Ей несколько раз не нравился ник

Первая попытка запуска. Видно, что полный бред

Первая попытка запуска. Видно, что полный бред

После жирного текста идет продолжение балабобы. Единственная из 10 попыток, где хоть что-то со смыслом. Но опять же, не соблюдена форма запроса, добавлены какие-то лишние символы...

После жирного текста идет продолжение балабобы. Единственная из 10 попыток, где хоть что-то со смыслом. Но опять же, не соблюдена форма запроса, добавлены какие-то лишние символы…

RuGPT-3 XL. Запускал прямо в демке. Опять пришлось урезать запрос, оставил 3 примера разбора ников, но, по-моему, даже этого ему мало. Либо он просто не способен на большее.

Без комментариев. Просто какой-то случайный набор слов типичной восьмиклассницы

Без комментариев. Просто какой-то случайный набор слов типичной восьмиклассницы

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

Результаты с моделями Vicuna 13b и Bing AI весьма скудные, настолько, что даже сюда их приводить не буду. Vicuna не очень понимает язык и генерирует какие-то совершенно новые несуществующие слова, как будто пытается их сделать из английских слов. Что касается Бинга, то, хоть это и GPT-4, но отвечает он весьма сухо и скучно, но по факту, грамотно соблюдая разметку. Что-то такое и должно ожидаться от поискового ассистента.

ChatGPT удивил. В плохом смысле. Видимо, он всё ещё весьма слаб в русском. В сравнении с Фредом он генерирует явно хуже и скучнее. Логикой, кстати, тут явно не пахнет.

Без комментариев

Без комментариев

А теперь представьте, что будет, её ещё и зафайнтюнить (обучить на новом датасете)? Да-да, тотальный разнос. Но заняться этим, я думаю, когда-нибудь… хмм… в следующей жизни! Уж слишком меня пугают все эти лоссы, регрессии и другие термины из AI трейнинга…

Впрочем, жду в личку тех, кто в этом разбирается, одному скучно, а вместе можно осилить все что угодно :)

Надеюсь, хоть кому-то это было интересно; спасибо за внимание и аливидерчи, надеюсь, ещё увидимся!

Канал в телеге, где я выпускаю всякие подобные штуковины: https://t.me/neuroxren

© Habrahabr.ru