brylacula

На Пикабу
1202 рейтинг 2 подписчика 0 подписок 6 постов 2 в горячем
10

Чужой: Ромалэ

Только вернулся с премьеры. Возможно, кому-то интересно мнение чела из интернета. Для лл: в своем жанре и в рамках франшизы моя оценка 10/10.

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

Плюсы. Великолепная атмосфера и внимание к деталям. Каждая мелочь в фильме как будто имеет объяснение. Приятно было посмотреть на аналоговые компьютеры в духе первых фильмов. Постановка сцен - супер. Первая сцена погони лицехватов поставлена очень динамично и напряжённо и задаёт тон всему последующему действу. Главное, что фильм увлекает - вроде бы привычные и ожидаемые сцены обыгрываются по-новому и это не даёт заскучать. Музыкальное сопровождение - супер и в тему. Дизайн и эффекты (в основном, кстати, практические) - хороши. Нас порадовали новым видом ксеноморфа и позволили разглядеть все в деталях. Показали переход от грудолома ко взрослому чужому, в оригинальных фильмах этого вроде не было. И даже увязали оригинальный фильм с Прометеем и сделали это довольно нейтрально, за что плюс.

Минусы к сожалению тоже есть, но не так уж много. Из самого явного - довольно слабый дипфейк одного актера из оригинального фильма. Выше я хвалил сцену с лицехватами. Так вот их было две и на второй было уже не особо напряжённо. Одна сцена выглядела комично, хотя и не задумывалось такой ("А вот и Джонни" в исполнении чужого, забавно же). Ну и к минусам всей франшизы - откуда эти паразиты берут массу, чтобы так быстро расти?

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

Показать полностью
232

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"»1

Простите поклонники лучика, но не мог пройти мимо. Я не буду разбирать каждый абзац этой статьи и комментировать его, только в конце приведу цитаты и свои комментарии к ним. На мой взгляд статья очень размыто отвечает на главный вопрос, поставленный в заголовке: как работает нейросеть? Я не в курсе на какую возрастную аудиторию рассчитан материал, но с учетом того, что в статье приведена функция y = kx + b, полагаю, я могу использовать немного математики.

Авторы предлагают аналогию вроде такой: нейросеть - это набор нейронов-чисел, а учатся они, если им показать много примеров. Прежде чем переходить к нейронам, я расскажу как они учатся. Это может показаться странным, но просто принцип обучения что в нейросетях, что в простых моделях машинного обучения одинаков. Для примера рассмотрим как раз уже приведенную функцию y = kx + b. Перенося ее на реальный мир можно взять в качестве примера задачу расчета стоимости жилья в зависимости от площади квартиры. Тогда y - стоимость, x - площадь квартиры, а решаем мы задачу т.н. линейной регрессии (это для сильных духом, постараюсь обходиться без терминов). Далее слайды, которые рисовал сам, простите.

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

Нужно получить модель, которая по набору иксов (метраж квартиры) дает правдоподобную стоимость. Точки на графике - наши реально существующие данные. Прямая - наша функция. Обучив модель, мы можем подать ей на вход один x и получить ожидаемый y.

В случае применения машинного обучения мы должны просто настроить неизвестные параметры нашей функции (k и b), чтобы получить оптимальную прямую. Главный вопрос - как? Для этого мы должны ввести понятие ошибки модели, чтобы понять, хороши ли она выполняет свою задачу. В нашем примере ошибка - это разность между предсказаниями и реальной стоимостью.

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

Ошибка модели - средняя разность между реальными значениями и предсказанными по модулю или в квадрате. Формальным языком: L = (y' - y)^2 / n, где n - количество примеров в данных, y' - предсказания, а y - реальные значения y для наших x).

Назовем функцию вычисления ошибок функцией потерь (точнее, она так и называется). Оптимальная модель будет выдавать минимальную среднюю разность, т.е. значение функции потерь будет минимальным. С оценкой определились, теперь переходим к процессу обучения. Для этого мы строим одну случайную прямую, считаем разность между предсказаниями и данными, определяем в какую сторону нам нужно сдвинуть нашу прямую, и сдвигаем, меняя наши k и b на небольшое значение. На какое - задается параметрами модели, обычно этот шаг небольшой, чтобы не перескочить наше оптимальное положение.

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

Случайная прямая

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

Один шаг обучения

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

Второй шаг обучения ( и так далее)

Небольшое отступление, которое можно пропустить. Пытливый ум спросит меня, а как мы определяем в какую сторону двигаться на каждом шаге? Отвечаю - просто смотрим на знак. Раньше я упомянул, что для расчета мы используем квадрат или модуль разностей для каждого отдельно взятого примера и усредняем их. Но тогда все наши расчеты будут положительными. Трюк в том, что при обучении мы используем не саму функцию потерь, а производную от нее или т.н. градиент (блин, обещал же без терминов). Геометрически производную можно изобразить так:

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

Производная - это тангенс угла наклона касательной к функции потерь в выбранной точке. Производная показывает направление роста функции.

На графике изображена функция потерь при разных значениях для нашей задачи - это парабола. Причем левая ветвь соответствует ситуации, когда мы задаем случайную прямую ниже наших точек, правая - выше. Наша задача попасть из красной точки в желтую, т.е. в минимум функции. Определив градиент, мы двигаемся в сторону уменьшения функции, достигая минимума. Математически, при расчете производной (dL = (2 / n) * (y' - y) * x) мы избавляемся от квадрата и можем получать отрицательные значения (и получаем в нашем примере) и тогда двигаемся в противоположную от знака сторону, прибавляя небольшие значения к нашим коэффициентам k и b.

Возвращаясь к объяснению на пальцах. В реальной жизни параметров, влияющих на стоимость квартиры больше, чем просто ее метраж. Тогда мы переходим в многомерное пространство. В реальной жизни у нас есть другие задачи, например то же отделение фотографий кошек от фотографий собак (задача классификации). Или генерация изображений. Но во всех этих задачах используется один и тот же принцип: мы должны определить функцию потерь - определить как мы вычисляем ошибки предсказаний модели и посчитать разницу между предсказаниями и реальными значениями и изменить значения коэффициентов, в зависимости от смещения предсказаний. Для задачи классификации животных (кошек и собак) мы на самом деле строим точно такую же прямую, просто эта прямая не проходит через точки в пространстве, а старается разделить их. Точками в этом случае могут выступать значения пикселей наших картинок, в таком случае, для обычного изображения кошечки, например, разрешением 512х512, мы работаем в 786432-мерном пространстве (потому что 3 (если используем цветное изображение RGB) * 512 * 512 = 786432) и подбираем в этом пространстве не прямую, а плоскость. И уравнение этой плоскости будет таким y = b + k1 * x1 + k2 * x2 + ... + k786432 * x786432. А функция потерь будет другая, но об этом я уже не буду говорить.

Теперь, когда мы поняли как мы учим, можно понять, что такое нейрон в нейросетях. На самом деле, ответ уже понятен. В процессе обучения мы настраиваем коэффициенты некой функции, нейрон тогда - это просто математическая функция от входных данных. Возвращаясь к статье лучика, на этой картинке нейрон - это как раз таки серый кружочек. А желтые - это значения входных данных. Они могут быть в то же время выходными данными с нейронов предыдущего слоя нейросети.

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

x1, x2 - значения входных данных, w1, w2, b - коэффициенты (я использовал выше k и b)

А сколько нейронов в нейросети? Много и зависит от архитектуры. Входной слой просто принимает данные и вычисляет взвешенную сумму, передавая результат на внутренние слои. На примере тех же изображений - количество нейронов на первом слое будет зависеть от параметров изображения, а именно от количества пикселей, но количество нейронов скрытых (внутренних) слоев мы устанавливаем сами. Мы можем поставить один нейрон на первый скрытый слой, который будет суммировать все данные, но толку от такой сети будет мало. На выходном слое количество нейронов зависит от нашей задачи. Для генерации нам нужно в каждом пикселе сетки предсказать реальное значение цвета, значит нейронов будет столько же, сколько пикселей нам надо получить. Если мы говорим о задаче классификации, то на выходном слое будет столько нейронов, сколько у нас классов - т.е. 2 для кошек/собак, например. Рассматривать необычные слои, вроде сверток, не будем, но они есть.

А зачем вообще нужны нейросети? Я уже выше описал, что все задачи так или иначе формализуются в набор известных функций. Но преимущество нейросетей в том, что они универсальны как раз за счет общих принципов построения. А взаимодействие нейронов на разных слоях позволяет расширить пространство настраиваемых параметров, что в свою очередь позволяет уловить связи в данных на разных уровнях. Например, разные слои нейросети, обученной на задаче классификации изображений, могут улавливать разные паттерны: например контуры, формы или цвета. Что как раз-таки используется для передачи стиля - мы замораживаем глубинные веса обученной нейросети (те, которые отвечают за пространство, форму и т.д.) и дообучаем на одном стилевом изображении только те слои, которые отвечают за "мазки кисти" и цвета.

Ответ на пост «Как работает нейросеть? Рассказывает журнал "Лучик"» Арты нейросетей, Компьютерная графика, Искусственный интеллект, Научпоп, Детская литература, Образование, Воспитание детей, Культура, Будущее, Инновации, Развитие, Технологии, Наука, Изобретения, Творческие люди, Обучение, Видео, YouTube, Длиннопост, Ответ на пост

Несколько примеров современных нейросетей и как они обучены:

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

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

  3. Генерация текстов. И снова множество архитектур. Есть даже не нейросетевые (смотрите цепи Маркова, которые просто считают попарные вероятности слов в тексте). Нейросетевые пытаются предсказать одно следующее слово на основе предыдущих.

  4. Генерация изображений по тексту. Здесь мы объединяем известные подходы и идея такая: раз мы уже знаем, как векторизовать текст, то будем использовать вектора текста как входные данные, а готовые изображения, как идеал, который нужно научится генерировать из шума. Для обучения таких моделей используется огромное количество картинок с описаниями к ним. Кстати, поэтому было много претензий к русскоязычным генеративным моделям, которые генерировали, например, американские флаги по запросу "Родина". Просто сложно создать большой датасет размеченных изображений своими силами, все используют открытые датасеты, и, например, переводят тексты и всячески обогащают данные.

Теперь можно перейти к самому интересному - цитаты из статьи.

Компьютерный нейрон – это просто... число!

Уже выяснили, что нет.

«А если собаки и кошки раскиданы вперемешку, а?» – спросите вы. Ну что ж, тогда нам может потребоваться не одна линия. И возможно не две и не три, а целый десяток или даже сотня. Важно понять, что рано или поздно мы сможем с помощью обыкновенных чисел и прямых «поделить» наш лист так, чтобы нейросеть уже знала наверняка – что именно она «видит», кошку или собаку, в чью именно область она «ткнула пальцем».

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

Проблема номер один – для обучения нейросети нужно очень много информации. Чтобы научить нейросеть отличать кошку от собаки, ей нужно показать тысячи (лучше миллионы) самых разных кошек и собак. Воспитанник детского садика в возрасте трёх лет кошку с собакой не спутает, даже если видел их всего лишь пару раз в жизни...

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

Проблема номер два: нейросети совершенно не умеют анализировать собственные творения, объяснять, «что здесь нарисовано и почему», в частности, они не умеют считать! Из-за этого компьютерные изображения постоянно рисуют людей то с шестью, то с восемью пальцами. Или кошек то с тремя, то с пятью лапами.

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

Проблема номер четыре: нейросеть не умеет работать при нехватке информации, «достраивать недостающее». Скажем, человеческий детёныш, даже малыш, увидев кошачий хвост, торчащий из-под дивана, тут же уверенно «распознает» спрятавшегося котёнка и побежит ловить его! Нейросеть такое «неполное» изображение понять не в состоянии. Человек, исказивший внешность (скажем, надевший маску или загримированный) для современной нейросети опять же становится неузнаваемым.

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

Проблема номер пять: нейросеть совершенно не понимает законов нашего мира – скажем, тех же законов оптики. Она никогда не сможет различить на картине человека – и его отражение в зеркале (для живого человека – задачка пустяковая). Она никогда не сможет различить человека или его лицо в кривом зеркале (как это делаем мы на аттракционе «Комната смеха» в городском парке, или когда разглядываем самих себя в новогодние шарики).

Аналогично - аугментация данных решает проблемы с кривыми зеркалами.

Проблема номер шесть: нейросети чрезвычайно чувствительны к разного рода помехам, дефектам, «шуму». Скажем, если на старой фотографии часть изображения залита грязью, чернилами, испорчена пятнами или царапинами, сильно выцвела, если карточка разорвана или разрезана напополам – уверенное узнавание тут же становится неуверенным и вообще ошибочным. Для человека сломанная на части кукла – всё равно кукла; для нейросети – это уже совершенно другой, неизвестный объект

Формально - да. Именно поэтому при обучении специально добавляют шум, аугментируют данные, выключают часть нейронов. И тогда модель справляется.

Проблема номер семь: нейросети на текущий момент ужасающе «однопрограммны». Если нейросеть настроена на распознавание лиц – она будет уметь только распознавать лица. Переучить её на написание текстов или музыки будет чрезвычайно сложно, часто вообще проще написать и обучить совершенно новую сеть. Если она умеет отличать квадраты от треугольников – даже не пробуйте попросить её отличить кошку от собаки или самолёт от парусной лодки...

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

Проблема номер восемь: связи между компьютерными нейронами случайны, поэтому нейросети лишены запоминания созданных образов. На приказ «нарисуй мне дерево» нейросеть охотно откликнется и будет рисовать деревья снова и снова, но... каждый раз это будет «другое дерево». И если вы напишете команду «нарисуй мне такое же дерево, как в прошлый раз, только на берегу реки», нейронная сеть не поймёт вас. Она опять нарисует «новое случайное дерево».

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

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

Показать полностью 8
3

Авторский контент

Кратко с себе: уже лет 16 занимаюсь музыкой, играю и сочиняю. За это время записал 2 альбома со своей группой, 1 альбом своих инструменталов и еще 1 альбом прямо сейчас в процессе записи. Большая часть моей музыки - это прогрессив-метал, сейчас пишу более сдержанно, с большей долей джаза и электроники. Особо никак не распространяю свое творчество. Послушать еще можно здесь или здесь.

Ну и напоследок старый кавер. Чтобы в подборке хоть что-то прогрессив-метальное было.

Показать полностью 3
21

Учим английский с chatGPT

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

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

Совмещаем gpt-3.5-turbo и whisper от openai, гугловскую text-to-speech, и telegram.

Предисловие

Основная мотивация - хочу заговорить на английском. Мой уровень B1, почти B2, но преимущественно в чтении и письме. Уроки с учителем стоят довольно дорого, ходить в английские клубы я стесняюсь, да и вообще коммуницировать с людьми не люблю. Поэтому решил, что для начала я заставлю себя говорить, хотя бы плохо, а потом отшлифую уровень с живыми людьми.

Еще одним мотиватором было желание сделать свой личный проект с telegram-ботами и серверами. Идеи появлялись и раньше, но тратить деньги на сервер с бесполезным приложением не хотелось. А тут вроде и полезно.

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

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

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

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

Но печатать текст - это не так сложно, как разговаривать. При печати у меня больше времени на подумать и исправить. Если я хочу большего реализма, то мне нужно говорить - я зачитываю свой ответ в микрофон, модель распознавания речи (ASR) транскрибирует мою речь в текст, который и будет отправляться языковой модели. Быстрый гуглеж выдал уже готовые поделки, вроде voiceGPT. Но это приложение оказалось слишком неудобным для моих задач: запись голоса обрывалась при первом же распознавании части фразы, а постоянные проверки браузера при подключении к аккаунту openai раздражали. Я решил, что проще будет использовать любую хорошую модель ASR, тем более, что я уже запланировал реализовать передачу сообщений через отдельный сервер, чтобы общаться с ботом в телеграме, удобно развалившись вечером на диване.

Проверка моделей ASR

Забегая вперед, скажу, что в итоге я использую модель whisper от того же openai через API. Но изначально я планировал загружать модель на сервере (тем более, что они работают на CPU), поэтому я пошел на hugginface и выбрал для себя несколько моделей для сравнения. Ниже представляю расшифровку текста задания для chatGPT, которую я надиктовал в диктофон:

  • facebook/wav2vec2-base-960h

    UNCLE SUGGEST A TOPIC FAL CONVERSATION AND YOU WILL ASK AQUATION ON IT THEN CHECK MY AUN SECAL GROMETICAL ERRORS AND OFFER THE CORRECT OPTION THEN YOU ASK THE NEXT COUATION LET'S GO

  • facebook/wav2vec2-large-960h-lv60-self

    I WILL SUGGEST A TOPIC FOR CONVERSATION AND YOU WILL ASK A QUESTION ON IT THEN CHECK MY ANSWER FOR GRAMMETICAL ERRORS AND OFFER THE CORRECT OPTION THEN YOU ASK THE NEXT QUESTION LET'S GO

  • jonatasgrosman/wav2vec2-large-xlsr-53-english

    i will suggest a topic for conversation and you will ask a quetion on it then check my alswey for gramatical errors and offer the correct option then you ask the next question let's go

  • openai/whisper-medium.en

    I will suggest a topic for conversation and you will ask a question on it. Then check my answer for grammatical errors and offer the correct option. Then you ask the next question. Let's go!

И снова openai оказался лучше всех, даже умеет поддерживать регистр и знаки препинания. Вообще, можно было бы и использовать последнюю модель, но на слабом процессоре сервера (к тому же единственном) расшифровка сообщения занимала примерно минуту, из-за чего диалог был похож на типичный диалог с приятелем в вк, который постоянно пропадает. В конце концов, 0.006 доллара за минуту расшифровки аудиосообщения не так уж много.

Код (ретроспективно)

Код написан на python. До этого я не писал телеграм-ботов, поэтому выбрал, как мне теперь кажется, не самую удачную библиотеку - python-telegram-bot. Начиная с версии 12x довольно сильно поменялся интерфейс, а большая часть ответов на stackoverflow относится именно к старым версиям. Возможно, использование aiogram было бы проще, но к тому моменту, как я об этом подумал, было уже поздно.

Сам код довольно простой, прикладываю ссылку на первоначальную версию бота, еще когда я его писал только с одним заданием для chatgpt и с полной фильтрацией всех сообщений по моему user_id. Этот код можно склонировать и c минимальными доработками запустить локально и все будет работать, нужна только самая "мелочь" - создать API ключ в аккаунте openai и создать, собственно, самого бота в BotFather в телеграме (ну и выяснить свой user_id, если так же не хотите, чтобы к вам в бота стучались посторонние). По обоим пунктам есть множество описаний в интернете, не буду описывать это здесь.

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

Промежуточные результаты

На этом моменте я решил остановиться и поделиться наработками с общественностью.

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

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

Новые фичи

Логично было бы начать масштабирование бота с добавления учета пользователей, но мне подумалось, что несерьезно отдавать в народ продукт, который имеет в запасе только одно задание для языковой модели. Я вспомнил, чему учили меня зеленая сова и лингвистический лев, и начал добавлять активности.

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

Свободное сообщение. Если отправить любое сообщение без выбора из меню, оно направится языковой модели. По сути, это как обычный браузерный доступ к chatGPT, но я установил ограничение как на длину входящего сообщения, так и на длину генерации, так что сгенерировать в моем боте рассказ, дипломную работу или еще что‑нибудь длинное не выйдет.

Conversation. Тот самый основной режим. По нажатию кнопки пользователю предлагается выбрать тему для разговора, а языковой модели отправляется задание: задай вопрос на эту тему, проверь ответ на предмет грамматических ошибок и затем задай следующий вопрос. Здесь раскрывается вся мощь языковой модели — я устраивал себе технические интервью по python, а модель не только исправляла мои речевые ошибки, но и указывала на неточности в самих ответах и дополняла их.

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

Grammar. Здесь модель генерирует рандомные предложения на русском в любом времени и проверяет перевод пользователя на корректность. По ходу использования я понял, что когда‑нибудь потом стоить разделить задания и добавить генерацию предложений хотя бы в 3 основных временах: настоящем, прошедшем и будущем. Потому что чаще всего модель предлагает present simple, что не такое уж сложное испытание. Ко всему прочему наблюдается низкая вариативность предложений: не обходится ни одной тренировки без «Я люблю гулять по парку осенью» и «Кошка спит на окне».

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

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

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

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

Listening. Оно же аудирование. Можно было бы попросить бота генерировать теперь фразы на английском и озвучивать их, но предыдущее задание показало, что нет смысла так делать. Поэтому я решил взять англоязычные книги, нарезать их по предложениям, а после по запросу брать случайный отрывок из списка и озвучивать его с помощью какой‑нибудь text‑to‑speech модели. Удивительно, но openai умеет только speech‑to‑text, так что пришлось регистрировать проект в гугл клауде и отправлять отрывки туда.

Какие выбрать книги? Я взял ровно те же англоязычные книги, что стоят у меня на полке.

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

Далее немного NLP-шной рутины, можно пропустить. С сегментацией на предложения пришлось немного повозиться: хотя пакет nltk из коробки неплохо сегментирует текст, все же во фразах остается много мусора. Для выделения диалогов, прямой речи и прочих экспрессий использовались разные символы ("“”`’‘) и менялись от книги к книге. Плюс 3 вида дефисов и тире. При этом нельзя просто выкинуть пунктуацию, иначе при озвучке фраза сольется во что‑то монотонное и неразборчивое.

А еще те, кто читал «Оно» знают, что там главный герой заикается. Волевым решением я убрал все предложения с заиканиями из всех текстов, т.к. это нельзя ни озвучить, ни проверить нормально. Билл Денбро стал еще более молчаливым. А так же я оставил только средней длины фразы. А еще я не фильтровал отрывки по содержанию, так что это упражнение только 18+.

При проверке ответа пользователя и из исходной фразы, и из ответа уже убираются все не буквенные символы, фразы приводятся к нижнему регистру и матчатся. Понимая, что я сам многих слов не знаю, в этом режиме малодушно добавил на клавитару бота кнопки skip — пропустить, и show — показать фразу.

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

Vocabulary. Классическая тренировка слово — перевод. И снова — можно генерировать слова языковой моделью, а можно взять их из англо‑русских и русско‑английских словарей. Я нашел хорошо структурированный словарь В. К. Мюллера редакции 2013 года на 86 тысяч слов. Столько слов не знал даже Шекспир. Поэтому я взял те же книги, положил в Counter лемматизированные слова из каждой книги, отфильтровал по частоте, чтобы избавиться от общеупотребимых простых слов и имен, и нашел их и их переводы в словаре Мюллера.

Если судить по себе, то в англо‑русском словаре в моем мозге больше слов, чем в русско‑английском. Я могу без особых проблем читать английский текст и все понимать, но перевести аналогичный русскоязычный текст на английский уже проблема. Странно, что не во всех тренажерах, которые я пробовал, есть именно русско‑английские словарные пары. Поэтому я сделал их в своем боте. Для этого я прошелся в двойном цикле по каждому отобранному слову в англо‑русском словаре и по каждому варианту перевода слова нашел перевод в русско‑английском словаре.

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

Учим английский с chatGPT Иностранные языки, ChatGPT, Python, Программирование, Длиннопост

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

В этом режиме я добавил кнопку пропуска слова и кое‑какой полезный функционал: при угадывании слова, оно кладется по ключу пользователя во внешнюю БД с меткой mistake = 0, а при ошибке или пропуске — mistake = 1. А к выбору книг я добавил опцию «My vocab», при выборе которой можно повторить уже изученные слова, где с вероятностью 0.3 будет даваться случайное ранее угаданное слово, и с вероятностью, соответственно, 0.7 — не угаданное.

Из не вошедшего. Хотелось сделать еще задание на понимание текста — аудирование или текстовое. Я просил языковую модель сгенерировать небольшой рассказ и после сгенерировать вопросы по этому рассказу с возможными ответами да/нет. И модель успешно это делала, но вопросы полностью повторяли предложения рассказа, что лишало задание всякого смысла. Например, в рассказе было: «Однажды, маленькая девочка темной ночью пошла за яблоками». Вопрос модели: «Правда ли, что маленькая девочка однажды ночью пошла за яблоками?». И пока мне не удалось заставить модель задавать чуть менее подробные вопросы, хотя бы такие: «Правда ли, что девочка пошла за яблоками?» или «Правда ли, что девочка ушла днем?».

Недостатки

Добавив весь этот функционал, настроив логику поведения при нажатии на кнопки, настроив БД хранения пользовательских данных, я наконец-то снял фильтрацию сообщений по моему айдишнику и пустил бота в мир. Оказалось, что название бота привлекает иностранцев, которым бот не очень-то и нужен.

Есть недостаток, о котором я знал с самого начала. Самый простой способ запуска телеграм бота - т.н. polling, когда бот периодически опрашивает сервера телеграма на предмет новых сообщений от пользователя и только тогда их получает и обрабатывает. Это может приводить к задержкам и вообще плохая практика. Хорошая практика - webhook - когда сообщения шлются напрямую в приложение на удаленном сервере. Но я так и не настроил webhook, потому что на самописный сертификат телеграм ругается. Возможно, в будущем я разберусь с этой проблемой. А пока работоспособность бота зависит от серверов самого телеграма.

А еще работоспособность зависит от openai. Бывают периоды высокой нагрузки, когда невозможно в адекватные сроки дождаться ответа от языковой модели (и это еще при использовании gpt-3.5. gpt-4 вообще сильно ограничена по нагрузке). Но здесь я уже ни на что не могу повлиять.

Каждая генерация — это недетерминированный процесс, и на один и тот же запрос может прилетать разный ответ. Иногда это приводит к замыканию бота: он не понимает задание, которе ранее успешно понимал, теряет в креативности, а иногда в процессе диалога вместо следующего вопроса или фразы присылает сообщение с благодарностью за беседу.

Выводы

Стоит заметить, что нельзя полностью доверять языковой модели свое обучение. Если уровень владения английским ниже A2 (примерно), то не стоит пользоваться этим ботом. Бот может не замечать ошибок, и чем длиннее ответ, тем вероятнее он их пропустит. Нужно, как минимум, знать правила построения предложений и времена, чтобы критично подходить к своим же ответам. Я рассматриваю этого бота как способ снять барьер при попытке заговорить на английском, но сомневаюсь, что бот может заменить живое общение.

Надеюсь, что теперь бот будет полезен не только мне.

Показать полностью 9
Отличная работа, все прочитано!