Подборка рассылок по AI
Подумала тут, что иногда мои посты получаются из статей, которые я получаю на почту из рассылок. Вчерашний пост вот был по статье из MIT Technology Review. Собрала в этом посте рассылки журналов, на которые подписана сама. Вдруг кому-то тоже будет полезно)
1️⃣ MIT Technology Review. Это журнал о технологиях в разных сферах: AI, бизнесе, climate change и пары других (все топики тут). Их рассылки — The Download и Weekend Reads. Там обычно собраны самые яркие статьи за последние дни/неделю. Часто попадаются интересные с рассуждениями вокруг технологий и AI и интервью с известными учеными (как, например, статья из поста выше).
У MIT Tech Review есть еще подкаст по AI "In Machines We Trust". Там — разговоры с разными людьми на разные темы AI. Темы выпусков правда довольно интересные.
2️⃣ Wired. Это журнал со статьями на разные темы, от культуры до технологий. Раздел чисто с AI — Artificial Intelligence Database. У журнала есть несколько рассылок на разные темы, полный перечень тут. Я подписана на Wired Weekly и Wired Fast Forward. Последняя — специализированная про AI. Там тоже попадаются интересные статьи с рассуждениями вокруг технологий и AI.
Ремарка: MIT Tech Review и Wired хорошо дополняют друг друга, статьи там в основном на совсем разные темы. Поэтому имеет смысл читать оба журнала.
3️⃣ Synced. Мой фаворит) Это журнал с обзорами AI Technology & Industry. У них даже есть отдельные разделы со статьями на темы Computer Vision & Graphics, Natural Language Tech, а статьи более приближены к научному миру и обозревают не какой-то феномен в AI, а отдельные новые статьи на узкие темы. Например, вот статья с обзором LLama-2.
Их рассылка — Synced AI Weekly, и она также более "научная", чем рассылки из пунктов выше. В ней обычно присылают ссылки и превью на 5-6 недавних интересных научных (ну или хотя бы околонаучных) статей, а также дайджест AI-мероприятий в мире. А еще дайджест открытых вакансий в AI-институтах и компаниях). Вот из этой рассылки у меня получалось прямо много постов в канале. Я просто просматриваю превью статьи в рассылке, и если меня заинтересовало, открываю саму ту статью.
4️⃣ The Batch от DeepLearning.AI. Этот журнал мне кажется более "обзорным": в нем в статьях часто приводится дайджест событий AI-мира. Но вот в разделе "Machine Learning Research" они выпускают статьи-обзоры на научные работы, почти как у меня в канале. Есть статьи и на другие темы — AI & Society, Culture и т.п. (а еще отдельные статьи по теме AI Careers). Подписаться на их рассылку можно тут.
Вроде бы все. Если вы знаете еще хоршие журналы/рассылки по AI, буду благодарна, если поделитесь в комментариях)
Подумала тут, что иногда мои посты получаются из статей, которые я получаю на почту из рассылок. Вчерашний пост вот был по статье из MIT Technology Review. Собрала в этом посте рассылки журналов, на которые подписана сама. Вдруг кому-то тоже будет полезно)
1️⃣ MIT Technology Review. Это журнал о технологиях в разных сферах: AI, бизнесе, climate change и пары других (все топики тут). Их рассылки — The Download и Weekend Reads. Там обычно собраны самые яркие статьи за последние дни/неделю. Часто попадаются интересные с рассуждениями вокруг технологий и AI и интервью с известными учеными (как, например, статья из поста выше).
У MIT Tech Review есть еще подкаст по AI "In Machines We Trust". Там — разговоры с разными людьми на разные темы AI. Темы выпусков правда довольно интересные.
2️⃣ Wired. Это журнал со статьями на разные темы, от культуры до технологий. Раздел чисто с AI — Artificial Intelligence Database. У журнала есть несколько рассылок на разные темы, полный перечень тут. Я подписана на Wired Weekly и Wired Fast Forward. Последняя — специализированная про AI. Там тоже попадаются интересные статьи с рассуждениями вокруг технологий и AI.
Ремарка: MIT Tech Review и Wired хорошо дополняют друг друга, статьи там в основном на совсем разные темы. Поэтому имеет смысл читать оба журнала.
3️⃣ Synced. Мой фаворит) Это журнал с обзорами AI Technology & Industry. У них даже есть отдельные разделы со статьями на темы Computer Vision & Graphics, Natural Language Tech, а статьи более приближены к научному миру и обозревают не какой-то феномен в AI, а отдельные новые статьи на узкие темы. Например, вот статья с обзором LLama-2.
Их рассылка — Synced AI Weekly, и она также более "научная", чем рассылки из пунктов выше. В ней обычно присылают ссылки и превью на 5-6 недавних интересных научных (ну или хотя бы околонаучных) статей, а также дайджест AI-мероприятий в мире. А еще дайджест открытых вакансий в AI-институтах и компаниях). Вот из этой рассылки у меня получалось прямо много постов в канале. Я просто просматриваю превью статьи в рассылке, и если меня заинтересовало, открываю саму ту статью.
4️⃣ The Batch от DeepLearning.AI. Этот журнал мне кажется более "обзорным": в нем в статьях часто приводится дайджест событий AI-мира. Но вот в разделе "Machine Learning Research" они выпускают статьи-обзоры на научные работы, почти как у меня в канале. Есть статьи и на другие темы — AI & Society, Culture и т.п. (а еще отдельные статьи по теме AI Careers). Подписаться на их рассылку можно тут.
Вроде бы все. Если вы знаете еще хоршие журналы/рассылки по AI, буду благодарна, если поделитесь в комментариях)
FILIP: CLIP, у которого близость можно измерять между эмбеддингами отдельных патчей картинки и токенов текста.
(статья еще с 2021, но я реально об этой идее узнала вот прям недавно)
Как работает обычный CLIP:
У обычного CLIP text и image encoder — это трансформеры. Image Encoder — это ViT, который разбивает картинку на 16х16 патчей, и на последнем слое выдает эмбеддинги каждого патча + эмббединг специального CLS токена. Text encoder — трансформер, который выдает эмбеддинги токенов текста. Текст при этом обрамляется токенами <BOS> и <EOS>.
Эмбеддинги CLS токена картинки и <EOS> токена текста считаются эмбеддингами картинки и текста соответственно. И CLIP учится делать так, чтобы эмбеддинги CLS токена картинки и <EOS> токена текста были близки для пар (картинка, описание этой картинки), и далеки для пар (картинка, текст), где текст не является описанием картинки.
Что предлагают в FILIP:
Предлагают чуть изменить лосс-функцию CLIP так, чтобы можно было измерять близость между эмбеддингами всех патчей картинки и всех токенов текста. Т.е. чтобы можно было понять, какая часть картинки соответствует какому куску текста.
Для этого предлагают на каждой итерации обучения делать вот что. Пусть нам пришла пара (картинка, текст). Прогоняем их через image и text encoder и делаем следующее:
- для каждого эмбеддинга патча картинки I_i ищем самый близкий эмбеддинг токена текста T_imax;
- считаем общую близость картинки к тексту L_IT как среднее произведений I_i • T_imax для каждого патча картинки;
- то же самое делаем в обратном направлении: т.е. для каждого эмбеддинга токена текста ищем самый близкий эмбеддинг патча картинки и считаем общую близость текста к картинке L_TI;
- итоговая близость картинки и текста L = L_IT + L_TI
- делаем итерацию обучения сети с помощью L и contrastive loss. Т.е. если пара (картинка, текст) соответствуют друг другу, мы максимизируем L, если не соответствует — минимизируем.
Кажется, что такое обучение заставляет FILIP выучивать больше деталей об изображениях. Это подтверждается экспериментами по zero-shot text-to-image и image-to-text retrieval: на 2021 год FILIP брал SOTA. По сравнению с CLIP прирост был очень существенный.
Ну и еще такой вид обучения позволяет с небольшими дополнениями построить prompt-based сегментацию на основе FILIP. Но об этом в следующий раз =)
Напоследок надо сказать, что такой вид обучения занимает гораздо больше времени и памяти. Авторы статьи решают это тем, что уменьшают размер эмбеддингов до 256 и точность значений эмбеддингов с fp32 до fp16.
📄Статья
(статья еще с 2021, но я реально об этой идее узнала вот прям недавно)
Как работает обычный CLIP:
У обычного CLIP text и image encoder — это трансформеры. Image Encoder — это ViT, который разбивает картинку на 16х16 патчей, и на последнем слое выдает эмбеддинги каждого патча + эмббединг специального CLS токена. Text encoder — трансформер, который выдает эмбеддинги токенов текста. Текст при этом обрамляется токенами <BOS> и <EOS>.
Эмбеддинги CLS токена картинки и <EOS> токена текста считаются эмбеддингами картинки и текста соответственно. И CLIP учится делать так, чтобы эмбеддинги CLS токена картинки и <EOS> токена текста были близки для пар (картинка, описание этой картинки), и далеки для пар (картинка, текст), где текст не является описанием картинки.
Что предлагают в FILIP:
Предлагают чуть изменить лосс-функцию CLIP так, чтобы можно было измерять близость между эмбеддингами всех патчей картинки и всех токенов текста. Т.е. чтобы можно было понять, какая часть картинки соответствует какому куску текста.
Для этого предлагают на каждой итерации обучения делать вот что. Пусть нам пришла пара (картинка, текст). Прогоняем их через image и text encoder и делаем следующее:
- для каждого эмбеддинга патча картинки I_i ищем самый близкий эмбеддинг токена текста T_imax;
- считаем общую близость картинки к тексту L_IT как среднее произведений I_i • T_imax для каждого патча картинки;
- то же самое делаем в обратном направлении: т.е. для каждого эмбеддинга токена текста ищем самый близкий эмбеддинг патча картинки и считаем общую близость текста к картинке L_TI;
- итоговая близость картинки и текста L = L_IT + L_TI
- делаем итерацию обучения сети с помощью L и contrastive loss. Т.е. если пара (картинка, текст) соответствуют друг другу, мы максимизируем L, если не соответствует — минимизируем.
Кажется, что такое обучение заставляет FILIP выучивать больше деталей об изображениях. Это подтверждается экспериментами по zero-shot text-to-image и image-to-text retrieval: на 2021 год FILIP брал SOTA. По сравнению с CLIP прирост был очень существенный.
Ну и еще такой вид обучения позволяет с небольшими дополнениями построить prompt-based сегментацию на основе FILIP. Но об этом в следующий раз =)
Напоследок надо сказать, что такой вид обучения занимает гораздо больше времени и памяти. Авторы статьи решают это тем, что уменьшают размер эмбеддингов до 256 и точность значений эмбеддингов с fp32 до fp16.
📄Статья
У DeepMind две новости:
1. В Vertex AI’s Model Garden (гугловая клауд-платформа для работы с модельками через API) добавили три новые модели: PaLM 2, Codey и Imagen. Мне тут интересен Imagen, т.к. это когда-то была SOTA text-to-image моделькой, доступ к которой Гугл не выдавал никому, даже рисерчерам (я проверяла). А теперь вот, наконец, можно будет играться с Imagen по API хотя бы. Правда, пока это будет доступно только ограниченному кругу людей.
2. Вместе с Imagen Гугл выкатывает тулзу SynthID для добавления скрытых watermark'ов на сгенерированные картинки. SynthID состоит из двух моделей — одна для добавления watermark на картинку, вторая для ее детекции на входной картинке.
Заявляется, что:
- watermark не виден вооруженным глазом и не влияет на качество изображения. Т.е. watermark — это небольшое контролируемое изменение некоторых пикселей изображения. Такое, что вторая нейросеть-детектор может по входящей картинке распознать, что она была изменена именно этим способом;
- watermark устойчив к несильным изменениям картинки (добавление шума/сжатие, т.е. все то, что происходит с картинками в интернете);
- нейросеть-детектор способна распознать watermark, даже если только часть картинки была сгенерирована Imagen;
- watermark можно будет добавлять к свом картинкам по желанию.
Статьи по SynthID не выкатили. Интересно, выкатят ли вообще. Но мне было бы очень интересно почитать, как именно устроена тулза. Правда, если выкатят статью, появятся тулзы, как эту штуку обойти ¯\_(ツ)_/¯
Ну и напомню по теме: добавление скрытых watermarks на сгенерированные картинки и обучение сетей для их детекции — это ответвление задачи fake images detection. Сама по себе задача детекции сгенеренных картинок (без всяких вотермарков) довольно сложна. Если интересно, вот тут я писала обзор подходов к ее решению.
1. В Vertex AI’s Model Garden (гугловая клауд-платформа для работы с модельками через API) добавили три новые модели: PaLM 2, Codey и Imagen. Мне тут интересен Imagen, т.к. это когда-то была SOTA text-to-image моделькой, доступ к которой Гугл не выдавал никому, даже рисерчерам (я проверяла). А теперь вот, наконец, можно будет играться с Imagen по API хотя бы. Правда, пока это будет доступно только ограниченному кругу людей.
2. Вместе с Imagen Гугл выкатывает тулзу SynthID для добавления скрытых watermark'ов на сгенерированные картинки. SynthID состоит из двух моделей — одна для добавления watermark на картинку, вторая для ее детекции на входной картинке.
Заявляется, что:
- watermark не виден вооруженным глазом и не влияет на качество изображения. Т.е. watermark — это небольшое контролируемое изменение некоторых пикселей изображения. Такое, что вторая нейросеть-детектор может по входящей картинке распознать, что она была изменена именно этим способом;
- watermark устойчив к несильным изменениям картинки (добавление шума/сжатие, т.е. все то, что происходит с картинками в интернете);
- нейросеть-детектор способна распознать watermark, даже если только часть картинки была сгенерирована Imagen;
- watermark можно будет добавлять к свом картинкам по желанию.
Статьи по SynthID не выкатили. Интересно, выкатят ли вообще. Но мне было бы очень интересно почитать, как именно устроена тулза. Правда, если выкатят статью, появятся тулзы, как эту штуку обойти ¯\_(ツ)_/¯
Ну и напомню по теме: добавление скрытых watermarks на сгенерированные картинки и обучение сетей для их детекции — это ответвление задачи fake images detection. Сама по себе задача детекции сгенеренных картинок (без всяких вотермарков) довольно сложна. Если интересно, вот тут я писала обзор подходов к ее решению.
Ну и раз уж мы заговорили о теме детекции сгенерированного контента, то с текстами дела обстоят так же плохо. Детектить их супер сложно. Сейчас не существует подхода, который бы давал приемлемое качество детекции.
Я текстами не занимаюсь, но ими занимается Юра, автор канала New Yorko Times. У него было несколько постов по этой теме:
- Доклад автора на DataFest-2023 про детекцию сгенерированного научного контента;
- Даже OpenAI не может сделать нормальный детектор;
- Важность задачи детекции фейкового научного контента. Индустрия paper mills. Можно почитать хотя бы ради того, чтобы ужаснуться, как в "научной среде" торгуют авторством статей;
- Факап на соревновании по детекции сгенерированного контента;
- Обратная задача: генерация фейковых текстов, которые для детекторов выглядят настоящими;
- Обзор детекторов фейкового текста.
(Юра, завел бы ты хэштег для fake_text_detection, ато постов накопилось)
А еще Лаида занимается текстами. И у нее есть научные статьи по детекции сгенерированного текста на основе исследования матриц внимания BERT-подобных моделей. Полгодика назад она писала об одной такой статье пост у себя на канале.
Если я что-то пропустила, может быть, авторы этих каналов придут в комментарии и что-то добавят. А в целом, я бы советовала прочитать эти посты хотя бы затем, чтобы ясно понять, насколько эта задача сложна. И в следующий раз, когда появится супер-стартап, заявляющий, что "мы детектируем фейковые тексты с точностью 99%", вы такому стартапу деньги не давали)
Я текстами не занимаюсь, но ими занимается Юра, автор канала New Yorko Times. У него было несколько постов по этой теме:
- Доклад автора на DataFest-2023 про детекцию сгенерированного научного контента;
- Даже OpenAI не может сделать нормальный детектор;
- Важность задачи детекции фейкового научного контента. Индустрия paper mills. Можно почитать хотя бы ради того, чтобы ужаснуться, как в "научной среде" торгуют авторством статей;
- Факап на соревновании по детекции сгенерированного контента;
- Обратная задача: генерация фейковых текстов, которые для детекторов выглядят настоящими;
- Обзор детекторов фейкового текста.
(Юра, завел бы ты хэштег для fake_text_detection, ато постов накопилось)
А еще Лаида занимается текстами. И у нее есть научные статьи по детекции сгенерированного текста на основе исследования матриц внимания BERT-подобных моделей. Полгодика назад она писала об одной такой статье пост у себя на канале.
Если я что-то пропустила, может быть, авторы этих каналов придут в комментарии и что-то добавят. А в целом, я бы советовала прочитать эти посты хотя бы затем, чтобы ясно понять, насколько эта задача сложна. И в следующий раз, когда появится супер-стартап, заявляющий, что "мы детектируем фейковые тексты с точностью 99%", вы такому стартапу деньги не давали)
В Яндекс Лицее открыт набор на годовые программы обучения.
#промо
Яндекс Лицей — это годовые курсы по программированию для школьников 8‒11-х классов и студентов ссузов 1-2-х курсов. Среди направлений обучения — программы по Python, Go, разработке игр, Machine Learning, Django, анализу данных и Big Data. Можно выбрать офлайн- или онлайн-форму обучения.
На курсах — интенсивное погружение в IT, работа над групповыми проектами и много общения с единомышленниками. Очень много практики. Преподаватели — опытные профи, которые работают с ИИ, обучают голосовых помощников, пишут код и руководят командами разработчиков. Курсы заложат твердый фундамент для будущей учебы в ВУЗе или работы в IT-компании.
Обучение бесплатное. Нужно только успешно пройти вступительные испытания.
Более подробная информация о Лицее и поступлении — по ссылке. Ждем вас!
#промо
Яндекс Лицей — это годовые курсы по программированию для школьников 8‒11-х классов и студентов ссузов 1-2-х курсов. Среди направлений обучения — программы по Python, Go, разработке игр, Machine Learning, Django, анализу данных и Big Data. Можно выбрать офлайн- или онлайн-форму обучения.
На курсах — интенсивное погружение в IT, работа над групповыми проектами и много общения с единомышленниками. Очень много практики. Преподаватели — опытные профи, которые работают с ИИ, обучают голосовых помощников, пишут код и руководят командами разработчиков. Курсы заложат твердый фундамент для будущей учебы в ВУЗе или работы в IT-компании.
Обучение бесплатное. Нужно только успешно пройти вступительные испытания.
Более подробная информация о Лицее и поступлении — по ссылке. Ждем вас!
Небольшая задачка по предобработке признаков в ML.
Раньше я иногда вела семинары по feature engineering в классическом ML, и для них моим любимым датасетом были данные вот с этого соревнования (реальное соревнование, проводилось много лет назад). Тут по информации о клиенте банка нужно было предсказать, возьмет ли клиент потребительский кредит у нашего банка, или выберет другой. Информация о клиенте включала стандартные поля вида "пол", "возраст", "уровень дохода" и т.п. Разумеется, в доступе на boosters.pro был только train set, но я просто делила его на train-test для занятия и соревы на каггле для учеников.
Нравился мне этот датасет тем, что в нем признаки очень разного рода, и на них можно было показать много разных вариантов предобработки и нюансов. При этом в целом признаков не очень много, что позволяет легко на данные смотреть и с быстро с ними работать, не перегружая мозг (не то что стандартный датасет house prices, от которого у новичков немного ужас).
Так вот. Есть в этом датасете признак "living_region". В этом признаке словами был написан регион РФ, в котором живет клиент. Например,
"Башкортостан респ."
"Чувашия"
"Москва гор."
Мало того, что признак был грязный — один и тот же регион мог быть записан по-разному ("Москва" или "Москва гор."), так в нем было еще и очень много значений (80+, как регионов РФ). Вставал вопрос, как этот признак предобработать. Одна из простых идей — скриптом привести все имена регионов в один формат и бахнуть бинаризацию категориального признака. В этом случае из-за того, что некоторые регионы встречались в выборке нечасто, возникало два рода ситуаций:
- какой-то бинарный признак (т.е. какой-то регион) встречался в тренировочной части выборки, и не встречался в тестовой части;
- какой-то бинарный признак (т.е. какой-то регион) встречался в тестовой части выборки, и не встречался в тренировочной части;
Понятно, что в обоих случаях модель из sklearn, обученная на train части, не сможет сделать предсказание на тестовой части (тупо кол-во столбцов в данных разное). Вопрос: что в таком случае правильно делать?
Т.е. вопрос в следующем: что правильно делать, если:
- в тестовой части данных оказался признак, которого нет в тренировочной?
- в тестовой части данных не оказалось признака, который есть в тренировочной?
P.S. Связанный интересный вопрос — как вообще лучше предобрабатывать признак "регион" в данных =)
Раньше я иногда вела семинары по feature engineering в классическом ML, и для них моим любимым датасетом были данные вот с этого соревнования (реальное соревнование, проводилось много лет назад). Тут по информации о клиенте банка нужно было предсказать, возьмет ли клиент потребительский кредит у нашего банка, или выберет другой. Информация о клиенте включала стандартные поля вида "пол", "возраст", "уровень дохода" и т.п. Разумеется, в доступе на boosters.pro был только train set, но я просто делила его на train-test для занятия и соревы на каггле для учеников.
Нравился мне этот датасет тем, что в нем признаки очень разного рода, и на них можно было показать много разных вариантов предобработки и нюансов. При этом в целом признаков не очень много, что позволяет легко на данные смотреть и с быстро с ними работать, не перегружая мозг (не то что стандартный датасет house prices, от которого у новичков немного ужас).
Так вот. Есть в этом датасете признак "living_region". В этом признаке словами был написан регион РФ, в котором живет клиент. Например,
"Башкортостан респ."
"Чувашия"
"Москва гор."
Мало того, что признак был грязный — один и тот же регион мог быть записан по-разному ("Москва" или "Москва гор."), так в нем было еще и очень много значений (80+, как регионов РФ). Вставал вопрос, как этот признак предобработать. Одна из простых идей — скриптом привести все имена регионов в один формат и бахнуть бинаризацию категориального признака. В этом случае из-за того, что некоторые регионы встречались в выборке нечасто, возникало два рода ситуаций:
- какой-то бинарный признак (т.е. какой-то регион) встречался в тренировочной части выборки, и не встречался в тестовой части;
- какой-то бинарный признак (т.е. какой-то регион) встречался в тестовой части выборки, и не встречался в тренировочной части;
Понятно, что в обоих случаях модель из sklearn, обученная на train части, не сможет сделать предсказание на тестовой части (тупо кол-во столбцов в данных разное). Вопрос: что в таком случае правильно делать?
Т.е. вопрос в следующем: что правильно делать, если:
- в тестовой части данных оказался признак, которого нет в тренировочной?
- в тестовой части данных не оказалось признака, который есть в тренировочной?
P.S. Связанный интересный вопрос — как вообще лучше предобрабатывать признак "регион" в данных =)
Больше года назад написала вот этот пост про Kaedim — стартап, который предлагал "AI-тулзу" для генерации 3D-моделей по рисунку пользователя за считанные минуты. Писала, что есть основательные подозрения, что внутри тулзы — совсем не AI, а тупо реальные люди сидят рендерят 3D-модели.
И вот прямо на днях вышло расследование от 404 Media про этот Kaedim. Tl;Dr такой: есть все основания полагать, что там реальные люди рисуют модельки, а AI там нет (ну или прям почти нет). Поинты такие:
- Источники, близкие к разработкам компании, говорят, что AI там очень плох. Условно вместо 3D-дерева получается непонятное облако;
- Kaedim нанимает 3D-художников по всему миру. Среди условий — умение в течение 15 минут сгенерировать приемлемую 3D-модель объекта по скетчу. В компании ответили на это так: видите ли, эти люди — quality control engineers, которые "докручивают то, что выдала AI-модель, до идеального состояния перед выдачей пользователю" и "дают фидбек о AI-инженерам для развития AI-модели". Тут надо посмотреть в пункт 1: говорят, модель там вообще не способна выдать что-то, что достаточно "докрутить" и о чем можно дать фидбек;
- Модельку свою Kaedim не показывает совсем. Не показывают даже примеры ее сырых генераций, объясняя тем, что "they showcase sensitive IP information about our ML approach" (не совсем даже понимаю, что это значит);
- После появления всех этих слухов и вопросов компания немного изменила текст лендинга своей тулзы. Сначала там было AI-generated, и труд людей не упоминался совсем. Сейчас там написано, что группа художников улучшает итоговый результат модели перед выдачей.
Вот так. Стоит пользование Kaedim, к слову, $150 за 10 моделей. А судя по найденным описаниями вакансий, художникам платили $1-4 за каждую работу ಠ_ಠ
Если честно, когда я увидела эту статью, меня больше всего удивило то, что Kaedim вообще до сих пор существует. Неужели они надеются допилить свою AI-модельку до нормального состояния, а потом показать, что типа "ну вот так оно и работало"?
P.S. За время существования Kaedim один из его основателей успел побывать в списке Forbes 30 Under 30. Тут невольно вспоминаются слова, что попадание в этот список хорошо коррелирует с наличием уголовного дела 🌝
И вот прямо на днях вышло расследование от 404 Media про этот Kaedim. Tl;Dr такой: есть все основания полагать, что там реальные люди рисуют модельки, а AI там нет (ну или прям почти нет). Поинты такие:
- Источники, близкие к разработкам компании, говорят, что AI там очень плох. Условно вместо 3D-дерева получается непонятное облако;
- Kaedim нанимает 3D-художников по всему миру. Среди условий — умение в течение 15 минут сгенерировать приемлемую 3D-модель объекта по скетчу. В компании ответили на это так: видите ли, эти люди — quality control engineers, которые "докручивают то, что выдала AI-модель, до идеального состояния перед выдачей пользователю" и "дают фидбек о AI-инженерам для развития AI-модели". Тут надо посмотреть в пункт 1: говорят, модель там вообще не способна выдать что-то, что достаточно "докрутить" и о чем можно дать фидбек;
- Модельку свою Kaedim не показывает совсем. Не показывают даже примеры ее сырых генераций, объясняя тем, что "they showcase sensitive IP information about our ML approach" (не совсем даже понимаю, что это значит);
- После появления всех этих слухов и вопросов компания немного изменила текст лендинга своей тулзы. Сначала там было AI-generated, и труд людей не упоминался совсем. Сейчас там написано, что группа художников улучшает итоговый результат модели перед выдачей.
Вот так. Стоит пользование Kaedim, к слову, $150 за 10 моделей. А судя по найденным описаниями вакансий, художникам платили $1-4 за каждую работу ಠ_ಠ
Если честно, когда я увидела эту статью, меня больше всего удивило то, что Kaedim вообще до сих пор существует. Неужели они надеются допилить свою AI-модельку до нормального состояния, а потом показать, что типа "ну вот так оно и работало"?
P.S. За время существования Kaedim один из его основателей успел побывать в списке Forbes 30 Under 30. Тут невольно вспоминаются слова, что попадание в этот список хорошо коррелирует с наличием уголовного дела 🌝
Example Packing в LLM
Для ускорения обучения transformer-based LLM часто используется такой трюк как example packing. В этом посте кратко расскажу, что это за трюк и в чем его польза.
Пусть мы учим LLM на задачу классификации предложений. Любой элемент данных (т.е. предложение), которое LLM принимает на вход, должно быть одной и той же длины. Поэтому обычно выбирается некоторая максимальная длина предложения max_len, и предложения из датасета длиннее max_len обрезаются до max_len, а предложения меньшей длины дополняются в конце специальным токеном <PAD> до max_len. И каждый батч при обучении LLM имеет размер (batch_size, max_len).
Очень часто, однако, в текстовых датасетах встречается довольно мало длинных предложений и очень много коротких. И при формировании батча большинство предложений имеют много токенов <PAD> в правой части. Кажется, что это — довольно неэффективное расходование вычислительных ресурсов, и можно было бы поступить как-то умнее.
Как-то умнее — это, как раз, example packing. Идея тут такая: давайте при формировании батчей будем соединять несколько коротких предложений в одно длинное. Например, если max_len=30, то возьмем три предложения длины 10, 5 и 13, соединим в одно длины 28, и в конце дополним двумя токенами <PAD>. И формируем батч из таких "запакованых" предложений.
Чтобы это работало, нужны еще два небольших изменения в input и output модели. Если мы решаем задачу классификации, мы хотим, чтобы LLM выдавала отдельный ответ на каждый элемент в "запакованной" последовательности. Обычно у нас на выходе LLM один выделенный CLS токен (обычно это первый или последний токен текста), и на основе эмбеддинга CLS токена LLM выдает распределение вероятностей на классы. Теперь давайте сделаем вот что: во-первых, выберем значение max_seq_per_pack, т.е. максимальное количество предложений, которые мы можем "запаковать" в одну последовательность. И теперь у нас будет не один, а max_seq_per_pack CLS токенов. Например, пусть это будут последние max_seq_per_pack токенов. И на основе их эмбеддингов на последнем слое LLM мы и будем считать max_seq_per_pack распределений вероятности на классы, один на каждое из возможных предложений внутри элемента батча.
А еще надо дать LLM возможность понять, где внутри одного запакованного элемента находятся токены первого предложения, где — второго, где — третьего и т.п. Дать ей это понять нужно затем, чтобы self-attention для токена одного предложения не мог "смотреть" на токены из других предложений. Для этого вместе с входной последовательностью в LLM подается маска внимания (attention mask). Выглядеть она может примерно так:
packed_sequence: Мама мыла раму Я люблю дождь <PAD> <PAD>
attention_mask: 1 1 1 2 2 2 0 0
Т.е. в маске внимания указано, какой токен принадлежит какому предложению. Это используется внутри self-attention, чтобы корректно считать матрицы внимания.
Ну и, надо сказать, чем хорош этот трюк с example packing. Вспомним, что в Transformer-based LLM обрабатывают все элементы поданной на вход последовательности параллельно. Используя example packing, мы добиваемся, что несколько элементов данных теперь могут быть обработаны параллельно. Так можно получить хороший буст по времени обучения и инференса модели: аж в 6-9 раз. Такой сильный прирост обусловлен тем, что в текстовых датасетах чаще всего большинство предложений — короткие, и их "запаковывание" очень сильно уменьшает время, за которое можно сделать одну эпоху обучения.
И пара последних замечаний:
- Существуют разные алгоритмы того, как выбирать элементы датасета для запаковывания в одну последовательность. Это прям целая наука;
- Example Packing можно использовать далеко не только для задачи классификации текстов, но и для многих других. Просто формат получения ответа из LLM нужно будет поменять чуть по-другому.
Подробнее почитать про example packing можно вот в этой статье. Статья очень хорошая: тема разобрана тщательно, понятным языком, с картинками, видео и кодом.
Для ускорения обучения transformer-based LLM часто используется такой трюк как example packing. В этом посте кратко расскажу, что это за трюк и в чем его польза.
Пусть мы учим LLM на задачу классификации предложений. Любой элемент данных (т.е. предложение), которое LLM принимает на вход, должно быть одной и той же длины. Поэтому обычно выбирается некоторая максимальная длина предложения max_len, и предложения из датасета длиннее max_len обрезаются до max_len, а предложения меньшей длины дополняются в конце специальным токеном <PAD> до max_len. И каждый батч при обучении LLM имеет размер (batch_size, max_len).
Очень часто, однако, в текстовых датасетах встречается довольно мало длинных предложений и очень много коротких. И при формировании батча большинство предложений имеют много токенов <PAD> в правой части. Кажется, что это — довольно неэффективное расходование вычислительных ресурсов, и можно было бы поступить как-то умнее.
Как-то умнее — это, как раз, example packing. Идея тут такая: давайте при формировании батчей будем соединять несколько коротких предложений в одно длинное. Например, если max_len=30, то возьмем три предложения длины 10, 5 и 13, соединим в одно длины 28, и в конце дополним двумя токенами <PAD>. И формируем батч из таких "запакованых" предложений.
Чтобы это работало, нужны еще два небольших изменения в input и output модели. Если мы решаем задачу классификации, мы хотим, чтобы LLM выдавала отдельный ответ на каждый элемент в "запакованной" последовательности. Обычно у нас на выходе LLM один выделенный CLS токен (обычно это первый или последний токен текста), и на основе эмбеддинга CLS токена LLM выдает распределение вероятностей на классы. Теперь давайте сделаем вот что: во-первых, выберем значение max_seq_per_pack, т.е. максимальное количество предложений, которые мы можем "запаковать" в одну последовательность. И теперь у нас будет не один, а max_seq_per_pack CLS токенов. Например, пусть это будут последние max_seq_per_pack токенов. И на основе их эмбеддингов на последнем слое LLM мы и будем считать max_seq_per_pack распределений вероятности на классы, один на каждое из возможных предложений внутри элемента батча.
А еще надо дать LLM возможность понять, где внутри одного запакованного элемента находятся токены первого предложения, где — второго, где — третьего и т.п. Дать ей это понять нужно затем, чтобы self-attention для токена одного предложения не мог "смотреть" на токены из других предложений. Для этого вместе с входной последовательностью в LLM подается маска внимания (attention mask). Выглядеть она может примерно так:
packed_sequence: Мама мыла раму Я люблю дождь <PAD> <PAD>
attention_mask: 1 1 1 2 2 2 0 0
Т.е. в маске внимания указано, какой токен принадлежит какому предложению. Это используется внутри self-attention, чтобы корректно считать матрицы внимания.
Ну и, надо сказать, чем хорош этот трюк с example packing. Вспомним, что в Transformer-based LLM обрабатывают все элементы поданной на вход последовательности параллельно. Используя example packing, мы добиваемся, что несколько элементов данных теперь могут быть обработаны параллельно. Так можно получить хороший буст по времени обучения и инференса модели: аж в 6-9 раз. Такой сильный прирост обусловлен тем, что в текстовых датасетах чаще всего большинство предложений — короткие, и их "запаковывание" очень сильно уменьшает время, за которое можно сделать одну эпоху обучения.
И пара последних замечаний:
- Существуют разные алгоритмы того, как выбирать элементы датасета для запаковывания в одну последовательность. Это прям целая наука;
- Example Packing можно использовать далеко не только для задачи классификации текстов, но и для многих других. Просто формат получения ответа из LLM нужно будет поменять чуть по-другому.
Подробнее почитать про example packing можно вот в этой статье. Статья очень хорошая: тема разобрана тщательно, понятным языком, с картинками, видео и кодом.
NaViT: как адаптировать example packing для Vision Transformer, чтобы научиться обрабатывать картинки произвольных размеров.
Обычно что CNN, что ViT обучают на картинках одного размера. Для этого все картинки в датасете приводят к одному размеру либо с помощью resize, либо с помощью добавления padding к картинкам маленького размера. Первый вариант ухудшает общее качество работы сети, а второй очень неэффективный.
Конечно, люди уже давно думали над тем, как бы эффективно научить модельки работать с картинками разных размеров. Из идей — FlexiViT и Pix2Struct. А недавно ребята из DeepMind придумали новую идею: они адаптировали example packing из LLM для Vision Transformer, что позволило ViT обрабатывать картинки разных размеров, и при увеличить эффективность обучения (т.е. подход требует меньше итераций обучения для получения того же качества, что оригинальный ViT)
Идея, собственно, как и у example packing в LLM: фиксируем длину инпута (кол-во патчей) и максимальное кол-во картинок max_seq_per_pack, которое можем соединить в одну последовательность. При обучении сэмплируем картинки разного размера, делим их на патчи (при этом каждую картинку можно делить на разное кол-во патчей), запаковываем патчи картинок в последовательности, дополняем при необходимости замаскированным токенами а-ля <PAD>, подаем в модель. Точно так же, как в LLM, заставляем self-attention для каждого патча смотреть только на патчи из той же картинки. И NaViT для классификации картинок выдает max_seq_per_pack CLS эмбеддингов — по одному на каждую потенциальную картинку в input.
И еще несколько замечаний к NaViT:
- При обучении и инференсе NaViT можно подавать модели на вход одну и ту же картинку, приведенную к разным размерам (256x256, 1024x300, etc). Семплирование размернов картинок при обучении повышает качество модели.
- Чтобы NaViT мог работать с картинками разных размеров (включая такие размеры, которые не были в тренировосных данных), нужно чуть поменять создание positinal embeddings для патчей картинок. Авторы предлагают факторизованные positinal embeddings, отдельно по высоте и ширине картинки. Подробнее об этом в разделе 2.1 статьи.
- В NaViT авторы использовали такой трюк как variable token dropping, который тоже повышает эффективность обучения. Подробнее про подход можно прочитать в статье про Flip
Вот так. При обучении NaViT достигает качества ванильного ViT в 4 раза быстрее. Это, по сути, тот же эффект, что дает example packing в LLM. Также NaViT показывает эффективность в сеттинге, где ViT сначала предобучают на low-res картинках, а потом дообучают на high-res. Тут NaViT требует меньшее количество примеров для дообучения для достижения того же качества, что и ViT.
📃Статья
Обычно что CNN, что ViT обучают на картинках одного размера. Для этого все картинки в датасете приводят к одному размеру либо с помощью resize, либо с помощью добавления padding к картинкам маленького размера. Первый вариант ухудшает общее качество работы сети, а второй очень неэффективный.
Конечно, люди уже давно думали над тем, как бы эффективно научить модельки работать с картинками разных размеров. Из идей — FlexiViT и Pix2Struct. А недавно ребята из DeepMind придумали новую идею: они адаптировали example packing из LLM для Vision Transformer, что позволило ViT обрабатывать картинки разных размеров, и при увеличить эффективность обучения (т.е. подход требует меньше итераций обучения для получения того же качества, что оригинальный ViT)
Идея, собственно, как и у example packing в LLM: фиксируем длину инпута (кол-во патчей) и максимальное кол-во картинок max_seq_per_pack, которое можем соединить в одну последовательность. При обучении сэмплируем картинки разного размера, делим их на патчи (при этом каждую картинку можно делить на разное кол-во патчей), запаковываем патчи картинок в последовательности, дополняем при необходимости замаскированным токенами а-ля <PAD>, подаем в модель. Точно так же, как в LLM, заставляем self-attention для каждого патча смотреть только на патчи из той же картинки. И NaViT для классификации картинок выдает max_seq_per_pack CLS эмбеддингов — по одному на каждую потенциальную картинку в input.
И еще несколько замечаний к NaViT:
- При обучении и инференсе NaViT можно подавать модели на вход одну и ту же картинку, приведенную к разным размерам (256x256, 1024x300, etc). Семплирование размернов картинок при обучении повышает качество модели.
- Чтобы NaViT мог работать с картинками разных размеров (включая такие размеры, которые не были в тренировосных данных), нужно чуть поменять создание positinal embeddings для патчей картинок. Авторы предлагают факторизованные positinal embeddings, отдельно по высоте и ширине картинки. Подробнее об этом в разделе 2.1 статьи.
- В NaViT авторы использовали такой трюк как variable token dropping, который тоже повышает эффективность обучения. Подробнее про подход можно прочитать в статье про Flip
Вот так. При обучении NaViT достигает качества ванильного ViT в 4 раза быстрее. Это, по сути, тот же эффект, что дает example packing в LLM. Также NaViT показывает эффективность в сеттинге, где ViT сначала предобучают на low-res картинках, а потом дообучают на high-res. Тут NaViT требует меньшее количество примеров для дообучения для достижения того же качества, что и ViT.
📃Статья
💬 Вступайте в сообщество MLOps-инженеров в Telegram. Там публикуем дайджесты, обсуждаем новые инструменты и технологии.
#промо
В сообществе вы найдете:
▫️ Новости индустрии production ML;
▫️ Полезные статьи, инструменты и технологии;
▫️ Опыт коллег и лучшие практики.
Присоединяйтесь, чтобы получать новые знания от практиков MLOps и дата-аналитики: https://www.tg-me.com/+HF7-7UsKD5M2OTVi
Реклама ООО «Селектел» 2VtzqvLXnKi
#промо
В сообществе вы найдете:
▫️ Новости индустрии production ML;
▫️ Полезные статьи, инструменты и технологии;
▫️ Опыт коллег и лучшие практики.
Присоединяйтесь, чтобы получать новые знания от практиков MLOps и дата-аналитики: https://www.tg-me.com/+HF7-7UsKD5M2OTVi
Реклама ООО «Селектел» 2VtzqvLXnKi
Помните, рассказывала, как я в Кембридже на Хинтона ходила? Наконец выложили запись доклада, она вот. Доклад реально интересный с необычными мыслями, посмотреть рекомендую. Еще там очень интересная (я бы даже сказала, веселая) часть в конце с ответами на вопросы. Где-то даже слово "коммунизм" промелькнуло 🌝
А тут скажу еще вот что. В тех постах выше я рассказывала о той части этой лекции, которая касается опасности AGI. Но там была еще другая часть, первая. Касалась она аналогового железа и mortal computation. Эта идея вот про что (по крайней мере, как ее поняла я): смотрите, современные AI-модели не привязаны к конкретному железу (например, к одному компьютеру). Одну и ту же модель можно запустить на разных устройствах, и мы точно знаем, как эта модель устроена и работает. Можно сказать, что AI-модели "бессмертны": если даже сломать сервер, модельку можно будет перенести и запустить на другом серваке.
А что если отказаться от принципа бессмертия моделей? Что если подумать о том, чтобы создавать AI-агентов, которые были бы неотделимы от своего "железа"? Которые в процессе обучения могли бы учиться использовать свойства своего железа по-максимуму и даже подстраивать его под свои задачи?
Такой подход потенциально может дать два важных преимущества:
1. Модели подобного рода могли бы потреблять гораздо меньше энергии для работы. Например, возможно, мы могли бы использовать что-то типа аналоговых компьютеров;
2. Возможно, мы могли бы придумать, как "выращивать" железо с разными архитектурами и свойствами под решение определенных задач. Т.е. процесс обучения модели будет сводиться не просто к подбору численных значений фиксированных параметров, но и к подбору самой архитектуры.
Но тут возникает проблема: алгоритм обучения моделей backpropagation для такого не подойдет. Причины такие:
1. Он очень энергозатратный;
2. Для backpropagation нужно знать точное устройство модели и вид ее forward pass. А если мы добиваемся пункта два выше (учимся выращивать железо), то точный вид функции, которую будет выражать модель, нам будет неизвестен.
Короче, есть мотивация подумать о других способах обучения моделей. Которые подошли бы и "смертным" моделям. А дополнительной мотивацией еще может служить то, что человеческий мозг, по всей видимости, ничего похожего на backprop не делает. То есть, точно можно придумать что-то еще и для AI.
Так вот. Первая часть Кембриджской лекции была как раз про эту идею отказа от "бессмертия" моделей. А конкретнее, переходы в лекции были такими:
- описание идеи "смертных" моделей;
- идея, как можно такие модели учить без backprop;
- а что если у нас есть куча "смертных" моделей: как заставить их взаимодействовать и делиться знаниями друг с другом?
- дистилляция — хороший способ делиться знаниями с моделью, но в современных моделях (включая LLM) она сейчас используется неэффективно;
- что если куча LLM-like моделей получали бы знания из реального мира, а не из интернета, и делились ими друг с другом;
- How AI can take control и далее то, о чем я писала в прошлых постах.
Вот так вот от идеи аналоговых компов мы пришли к "AI захватит мир🙃"
Напоследок снова скажу: посмотреть лекцию советую. Это может хорошо помочь посмотреть на привычный AI с немного другой стороны. После этого точно появляется, над чем подумать.
📽Ссылка на лекцию
А тут скажу еще вот что. В тех постах выше я рассказывала о той части этой лекции, которая касается опасности AGI. Но там была еще другая часть, первая. Касалась она аналогового железа и mortal computation. Эта идея вот про что (по крайней мере, как ее поняла я): смотрите, современные AI-модели не привязаны к конкретному железу (например, к одному компьютеру). Одну и ту же модель можно запустить на разных устройствах, и мы точно знаем, как эта модель устроена и работает. Можно сказать, что AI-модели "бессмертны": если даже сломать сервер, модельку можно будет перенести и запустить на другом серваке.
А что если отказаться от принципа бессмертия моделей? Что если подумать о том, чтобы создавать AI-агентов, которые были бы неотделимы от своего "железа"? Которые в процессе обучения могли бы учиться использовать свойства своего железа по-максимуму и даже подстраивать его под свои задачи?
Такой подход потенциально может дать два важных преимущества:
1. Модели подобного рода могли бы потреблять гораздо меньше энергии для работы. Например, возможно, мы могли бы использовать что-то типа аналоговых компьютеров;
2. Возможно, мы могли бы придумать, как "выращивать" железо с разными архитектурами и свойствами под решение определенных задач. Т.е. процесс обучения модели будет сводиться не просто к подбору численных значений фиксированных параметров, но и к подбору самой архитектуры.
Но тут возникает проблема: алгоритм обучения моделей backpropagation для такого не подойдет. Причины такие:
1. Он очень энергозатратный;
2. Для backpropagation нужно знать точное устройство модели и вид ее forward pass. А если мы добиваемся пункта два выше (учимся выращивать железо), то точный вид функции, которую будет выражать модель, нам будет неизвестен.
Короче, есть мотивация подумать о других способах обучения моделей. Которые подошли бы и "смертным" моделям. А дополнительной мотивацией еще может служить то, что человеческий мозг, по всей видимости, ничего похожего на backprop не делает. То есть, точно можно придумать что-то еще и для AI.
Так вот. Первая часть Кембриджской лекции была как раз про эту идею отказа от "бессмертия" моделей. А конкретнее, переходы в лекции были такими:
- описание идеи "смертных" моделей;
- идея, как можно такие модели учить без backprop;
- а что если у нас есть куча "смертных" моделей: как заставить их взаимодействовать и делиться знаниями друг с другом?
- дистилляция — хороший способ делиться знаниями с моделью, но в современных моделях (включая LLM) она сейчас используется неэффективно;
- что если куча LLM-like моделей получали бы знания из реального мира, а не из интернета, и делились ими друг с другом;
- How AI can take control и далее то, о чем я писала в прошлых постах.
Вот так вот от идеи аналоговых компов мы пришли к "AI захватит мир🙃"
Напоследок снова скажу: посмотреть лекцию советую. Это может хорошо помочь посмотреть на привычный AI с немного другой стороны. После этого точно появляется, над чем подумать.
📽Ссылка на лекцию
И еще к посту выше. Хинтон об идее аналоговых "смертных" моделей и способах их обучения думал уже давно. И одна из идей, которая у него родилась из этих размышлений — алгоритм обучения сети Forward-Forward. Это идея того, как обучать нейросеть с помощью двух forward-pass'ов вместо использования backward pass. При этом точный вид forward pass знать не нужно. Т.е. это потенциально та идея, которую можно было бы применить к "смертным" моделям, описанным выше.
По статье о Forward-Forward у Хинтона есть доклад на конференции в Морокко: Learning Deep Neural Networks. Там в начале тоже есть небольшой рассках про мотивацию исследовать что-то кроме backpropagation. А еще там есть часть про GLOM: идею Хинтона о том, как сделать CV-модель, имеющую понимание структурной иерархии объектов. Я эту идею упоминала в своей статье на Хабре про структурное мышление и ИИ.
Также про эти две вещи (смертные модели и Forward-Forward алгоритм) есть два хороших поста (этот и пост ниже) в канале gonzo-обзоры ML статей. Там я и нашла ссылку на лекцию Хинтона в Морокко.
По статье о Forward-Forward у Хинтона есть доклад на конференции в Морокко: Learning Deep Neural Networks. Там в начале тоже есть небольшой рассках про мотивацию исследовать что-то кроме backpropagation. А еще там есть часть про GLOM: идею Хинтона о том, как сделать CV-модель, имеющую понимание структурной иерархии объектов. Я эту идею упоминала в своей статье на Хабре про структурное мышление и ИИ.
Также про эти две вещи (смертные модели и Forward-Forward алгоритм) есть два хороших поста (этот и пост ниже) в канале gonzo-обзоры ML статей. Там я и нашла ссылку на лекцию Хинтона в Морокко.
Всем привет! Как вы поняли, в последний месяц я снова закопалась в делах и пыталась понять, как нормально жить эту жизнь (спойлер: поняла не особо). За это время, конечно, произошло много всего (чего стоит один Сэм Альтман и еще 700+ человек в OpenAI, которые прямо сейчас снимаются в увлекательном сериале про ИИ и бизнес). Но я тут начну не с таких громких новостей, а с чего-то поменьше. Например, расскажу про препринт статьи, в которой я стала соавтором =)
В начале осени я проходила мимо Лаиды и ее коллег, которые пытались решать задачу детекции сгенерированных текстов. Постановка задачи необычная: это не просто задача бинарной классификации типа "этот текст реальный", "этот текст сгенерированный". Задача ставится так: есть текст из 10 предложений. Известно, что начало текста (1+ предложений) написано человеком. Но, начиная с какого-то предложения, текст может стать сгенерированным. Задача простая: по тексту определить номер предложения, с которого начинается генерация. Проще говоря, на этом можно поставить задачу классификации на 10 классов: с какого номера предложения начинается сгенерированный текст.
Задача имеет отношение к реальности: многие люди пишут для ChatGPT начало текста и просят его дописать. Так что многие тексты получаются не полностью сгенерированными, но частично. И полезно было бы иметь детекторы, которые могли бы определять место, где текст перестает быть написанным от руки.
Задача усложняется тем, что тексты разделены на несколько доменов по жанру (газетные статьи/рецепты блюд/...). И можно учить модель на текстах одного домена и проверять на текстах другого. Это важно, т.к. хочется в идеале получить детектор, который мог бы детектить фейковые тексты любого жанра.
В завершение описания задачи надо сказать, что задача новая. В такой постановке задачи практически нет работ. Поэтому наша работа в статье состоит главным образом в том, чтобы исследовать эту задачу, попробовав на ней модели разного вида.
Итак. Проходя мимо коллег, я заметила, что у них были несколько идей решения этой задачи. Среди них:
- бейзлайн: LogReg/GradBoost на средней длине слов в предложении. Было замечено, что часто распределение длин предложений, сгенерированных LLM, отличается от того, что пишут люди. Этот бейзлайн дает ~20% acc in-domain и ~10% acc out-of-domain (по сути, случайное угадывание)
- лучшая модель — RoBERTa, дообученная в supervised режиме на эту задачу. Она дает 45-55% acc in-domain и 13-31% acc out-of domain. То есть, довольно сильно переобучается;
- были и еще другие методы, которые показывали результаты между двумя описанными выше. О них можно подробнее почитать в статье.
Так вот. Проходя мимо этого всего у меня возник вопрос: почему не попробовать очевидный подход с log likelihood?
Идея такая: берем LLM. Например, GPT-2. Для каждого префикса текста считаем распределение вероятности на следующий токен. Считаем log likelihood реального токена текста на основе этого распределения. Ожидается, что фейковый текст будет для GPT-2 казаться более "естественным", потому что его генерировали модели похожего устройства. То есть, ожидается, что там, где текст переходит от реального к сгенерированному, будет резкий скачок в log likelihood.
Идея модели тогда может быть такая: считаем log likelihood для каждого токена каждого предложения. Затем для каждого предложения усредняем log likelihood его токенов. В итоге каждый текст начинает представляться массивом чисел длины 10. На этом всем обучаем что-нибудь простое (GB/LogReg) на задачу классификации на 10 классов.
И это работает: дает 30-40% acc in-domain и 20-35% acc out-of-domain (причем 20% — это на оч плохом домене). То есть, в in-domain ведет себя похуже Роберты, но зато показывает лучшую переносимость между доменами. И если посмотреть на коэффициенты Logreg, то можно заметить, что LogReg действительно учится искать "скачок" в log likelihood, и на этом основывает свое решение.
Вот так. Статья вот. Текст, правда, очень сырой, и мы будем его сильно править перед подачей на конфы. Ну и у меня еще пара идей появились, которые я тут хочу попробовать.
В начале осени я проходила мимо Лаиды и ее коллег, которые пытались решать задачу детекции сгенерированных текстов. Постановка задачи необычная: это не просто задача бинарной классификации типа "этот текст реальный", "этот текст сгенерированный". Задача ставится так: есть текст из 10 предложений. Известно, что начало текста (1+ предложений) написано человеком. Но, начиная с какого-то предложения, текст может стать сгенерированным. Задача простая: по тексту определить номер предложения, с которого начинается генерация. Проще говоря, на этом можно поставить задачу классификации на 10 классов: с какого номера предложения начинается сгенерированный текст.
Задача имеет отношение к реальности: многие люди пишут для ChatGPT начало текста и просят его дописать. Так что многие тексты получаются не полностью сгенерированными, но частично. И полезно было бы иметь детекторы, которые могли бы определять место, где текст перестает быть написанным от руки.
Задача усложняется тем, что тексты разделены на несколько доменов по жанру (газетные статьи/рецепты блюд/...). И можно учить модель на текстах одного домена и проверять на текстах другого. Это важно, т.к. хочется в идеале получить детектор, который мог бы детектить фейковые тексты любого жанра.
В завершение описания задачи надо сказать, что задача новая. В такой постановке задачи практически нет работ. Поэтому наша работа в статье состоит главным образом в том, чтобы исследовать эту задачу, попробовав на ней модели разного вида.
Итак. Проходя мимо коллег, я заметила, что у них были несколько идей решения этой задачи. Среди них:
- бейзлайн: LogReg/GradBoost на средней длине слов в предложении. Было замечено, что часто распределение длин предложений, сгенерированных LLM, отличается от того, что пишут люди. Этот бейзлайн дает ~20% acc in-domain и ~10% acc out-of-domain (по сути, случайное угадывание)
- лучшая модель — RoBERTa, дообученная в supervised режиме на эту задачу. Она дает 45-55% acc in-domain и 13-31% acc out-of domain. То есть, довольно сильно переобучается;
- были и еще другие методы, которые показывали результаты между двумя описанными выше. О них можно подробнее почитать в статье.
Так вот. Проходя мимо этого всего у меня возник вопрос: почему не попробовать очевидный подход с log likelihood?
Идея такая: берем LLM. Например, GPT-2. Для каждого префикса текста считаем распределение вероятности на следующий токен. Считаем log likelihood реального токена текста на основе этого распределения. Ожидается, что фейковый текст будет для GPT-2 казаться более "естественным", потому что его генерировали модели похожего устройства. То есть, ожидается, что там, где текст переходит от реального к сгенерированному, будет резкий скачок в log likelihood.
Идея модели тогда может быть такая: считаем log likelihood для каждого токена каждого предложения. Затем для каждого предложения усредняем log likelihood его токенов. В итоге каждый текст начинает представляться массивом чисел длины 10. На этом всем обучаем что-нибудь простое (GB/LogReg) на задачу классификации на 10 классов.
И это работает: дает 30-40% acc in-domain и 20-35% acc out-of-domain (причем 20% — это на оч плохом домене). То есть, в in-domain ведет себя похуже Роберты, но зато показывает лучшую переносимость между доменами. И если посмотреть на коэффициенты Logreg, то можно заметить, что LogReg действительно учится искать "скачок" в log likelihood, и на этом основывает свое решение.
Вот так. Статья вот. Текст, правда, очень сырой, и мы будем его сильно править перед подачей на конфы. Ну и у меня еще пара идей появились, которые я тут хочу попробовать.
Последнюю неделю все только и говорят, что о Семе Альтмане и его приключениях в OpenAI. Все-все новости я пересказывать не буду, их за меня освещали уже много кто. Если хотите вникнуть в то, что произошло, можно в Сиолошной читать этот пост и далее.
Но что я пишу-то тогда: сегодня появились интересные слухи по поводу того, что стало причиной конфликта. Уже несколько дней назад издания писали, что причиной могло быть письмо сотрудников OpenAI к совету директоров компании. В нем они якобы писали, что недавно в компании произошел очередной прорыв на пути к AGI, и выражали опасение, что это "может угрожать человечеству".
Но что это был за прорыв? Никто точно не знает (и не знает, был ли он вообще), но один из вариантов отсылает к этой недавней статье OpenAI. Давайте разберемся, в чем идея статьи:
Работа эта посвящена обучению LLM решению задач по математике. То есть, модель получает на вход условие задачи, и должна сгенерировать ее решение. Обычно при обучении таких моделей с помощью RL reward считается один раз, в конце генерации решения. Условно: "все решение говно" или "все решение правильное". И неважно, была ли ошибка в генерации решения сделана в самом начале и повлекла за собой неверное рассуждение а дальнейшем, или же до самого конца решение было верным, а ошибка была в последнем выводе.
Авторы статьи предлагают сделать простую модификацию: давайте оценивать не только все сгенерированное решение в целом, но и каждый его шаг. Таким образом можно будет при обучении посылать более осмысленные сигналы в модель, которые будут точно говорить ей, в каком месте что-то пошло не так. Для оценивания каждого шага решения модели-генератора обучается отдельная модель-оценщик (в принципе, как и в стандартном сеттинге при оценке всего решения целиком).
Во время инференса же будем делать так: попросим обученную модель-генератор сгенерировать кучу (скажем, 1000) решений для данной задачи. Потом возьмем модель-оценщик и попросим из этой тысячи решений выбрать самое "верное" с ее точки зрения. Если посчитать accuracy на тестовых данных (процент правильных полученных решений на тестовой выборке с помощью такого алгоритма), то скор получается сильно выше, чем если учить модель обычным способом, когда reward считается только в конце генерации.
Надо сказать, что статья эта называется "Let's Verify Step-by-Step". Это отсылает к известному трюку промт-инжениринга для ChatGPT, который позволяет получить более правильные ответы ChatGPT на сложных задачах. Состоял он в том, что если попросить ChatGPT решить каку-то задачу и добавить в запрос фразу "Let's think step-by-step", то модель начнет выдавать в среднем более верные решения. Здесь в статье идея действительно похожа — мы теперь оцениваем решение модели step-by-step, а не один раз в конце, как раньше.
А еще тут у меня возникла такая мысль: идея инференса очень похожа на задачу P vs NP. Смотрите: найти правильное решение — сложно, но довольно просто проверить его на правильность. Поэтому давайте мы не будем стараться получить идеальный генератор решения, который с первого раза генерит все правильно, а будем использовать брутфорс (генерацию кучи вариантов решений) и верификатор.
Вот такие пироги. В целом, мне идея кажется очень простой и очевидной. А еще, как заметили в комментариях, статья вышла аж в мае, а шумиха началась только сейчас. Так что если и есть связь шумихи с этой статьей, то там должно было произойти что-то еще (например, новое улучшение, которое и вызвало ажиотаж). А может, связи между этой статьей и недавними событиями и вовсе нет ¯\_(ツ)_/¯
Но что я пишу-то тогда: сегодня появились интересные слухи по поводу того, что стало причиной конфликта. Уже несколько дней назад издания писали, что причиной могло быть письмо сотрудников OpenAI к совету директоров компании. В нем они якобы писали, что недавно в компании произошел очередной прорыв на пути к AGI, и выражали опасение, что это "может угрожать человечеству".
Но что это был за прорыв? Никто точно не знает (и не знает, был ли он вообще), но один из вариантов отсылает к этой недавней статье OpenAI. Давайте разберемся, в чем идея статьи:
Работа эта посвящена обучению LLM решению задач по математике. То есть, модель получает на вход условие задачи, и должна сгенерировать ее решение. Обычно при обучении таких моделей с помощью RL reward считается один раз, в конце генерации решения. Условно: "все решение говно" или "все решение правильное". И неважно, была ли ошибка в генерации решения сделана в самом начале и повлекла за собой неверное рассуждение а дальнейшем, или же до самого конца решение было верным, а ошибка была в последнем выводе.
Авторы статьи предлагают сделать простую модификацию: давайте оценивать не только все сгенерированное решение в целом, но и каждый его шаг. Таким образом можно будет при обучении посылать более осмысленные сигналы в модель, которые будут точно говорить ей, в каком месте что-то пошло не так. Для оценивания каждого шага решения модели-генератора обучается отдельная модель-оценщик (в принципе, как и в стандартном сеттинге при оценке всего решения целиком).
Во время инференса же будем делать так: попросим обученную модель-генератор сгенерировать кучу (скажем, 1000) решений для данной задачи. Потом возьмем модель-оценщик и попросим из этой тысячи решений выбрать самое "верное" с ее точки зрения. Если посчитать accuracy на тестовых данных (процент правильных полученных решений на тестовой выборке с помощью такого алгоритма), то скор получается сильно выше, чем если учить модель обычным способом, когда reward считается только в конце генерации.
Надо сказать, что статья эта называется "Let's Verify Step-by-Step". Это отсылает к известному трюку промт-инжениринга для ChatGPT, который позволяет получить более правильные ответы ChatGPT на сложных задачах. Состоял он в том, что если попросить ChatGPT решить каку-то задачу и добавить в запрос фразу "Let's think step-by-step", то модель начнет выдавать в среднем более верные решения. Здесь в статье идея действительно похожа — мы теперь оцениваем решение модели step-by-step, а не один раз в конце, как раньше.
А еще тут у меня возникла такая мысль: идея инференса очень похожа на задачу P vs NP. Смотрите: найти правильное решение — сложно, но довольно просто проверить его на правильность. Поэтому давайте мы не будем стараться получить идеальный генератор решения, который с первого раза генерит все правильно, а будем использовать брутфорс (генерацию кучи вариантов решений) и верификатор.
Вот такие пироги. В целом, мне идея кажется очень простой и очевидной. А еще, как заметили в комментариях, статья вышла аж в мае, а шумиха началась только сейчас. Так что если и есть связь шумихи с этой статьей, то там должно было произойти что-то еще (например, новое улучшение, которое и вызвало ажиотаж). А может, связи между этой статьей и недавними событиями и вовсе нет ¯\_(ツ)_/¯
Игорь (автор Сиолошной) в своем последнем посте еще замечает вот что: OpenAI не так давно заявили, что компания занимается разработкой модели для научных исследований. Короче, хотят заменить research scientist'ов LLM-рисерчером. И вот эта статья с LLM-кой, которая умеет решать задачи по математике — это один шажочек в этом направлении. Очень интересно, насколько "умной" удастся сделать этого LLM-рисерчера, и удастся ли действительно с его помощью уменьшить необходимость в умненьких кожаных PhD.
Вот меня в последний год несколько раз спрашивали вопросы типа "кого первым заменит ИИ" и "стоит ли бояться потерять работу", а теперь вот говорят, что хотят заменить меня😂
Вот меня в последний год несколько раз спрашивали вопросы типа "кого первым заменит ИИ" и "стоит ли бояться потерять работу", а теперь вот говорят, что хотят заменить меня😂
Еще в тему нашей недавней статьи про Artificial Text Boundary Detection: скоро стартует конкурс SemEval-2024 по детекции сгенерированных текстов. Конкурс привязан к воркшопу ACL 2023 Workshop SemEval.
В этом году у конкурса три трека:
- Трек А: бинарная классификация текстов на реальный/сгенерированный;
- Трек B: многоклассовая классификация текстов. Нужно понять, чем был сгенерирован текст: человеком или одной из N моделей;
- Трек С: ровно та задача, которую мы решаем в статье. Дан текст, и нужно понять, с какого мента заканчивается реальный текст и начинается сгенерированный.
Данные для всех треков лежат тут. Обещали выложить страницу соревнования до 20 ноября, но что-то пока что я ее не вижу. Ну, скоро точно должна быть.
Что я тут хотела сказать: этот конкурс — еще один признак того, что задача, которую мы решаем в статье имеет смысл)
Ну и если говорить о конкурсах по детекции текстов, то на Kaggle тоже сейчас идет один. Там даже за лучшие решения денег дают. Правда, если зайти в leaderboard, то можно очень удивиться — там уже 0.96 ROC AUC получили. Мои коллеги на это сказали, что там есть сильный лик в данных. Состоит он в том, что для всех текстов, и тренировочных, и тестовых, известен промпт, с помощью которого текст сгенерировали. Принимая это во внимание, у меня возникает вопрос: а че ROC AUC еще не 1-то?
Если знаете еще какие-то контесты по таким задачам (или по детекции сгенеренных картинок), делитесь в комментариях.
В этом году у конкурса три трека:
- Трек А: бинарная классификация текстов на реальный/сгенерированный;
- Трек B: многоклассовая классификация текстов. Нужно понять, чем был сгенерирован текст: человеком или одной из N моделей;
- Трек С: ровно та задача, которую мы решаем в статье. Дан текст, и нужно понять, с какого мента заканчивается реальный текст и начинается сгенерированный.
Данные для всех треков лежат тут. Обещали выложить страницу соревнования до 20 ноября, но что-то пока что я ее не вижу. Ну, скоро точно должна быть.
Что я тут хотела сказать: этот конкурс — еще один признак того, что задача, которую мы решаем в статье имеет смысл)
Ну и если говорить о конкурсах по детекции текстов, то на Kaggle тоже сейчас идет один. Там даже за лучшие решения денег дают. Правда, если зайти в leaderboard, то можно очень удивиться — там уже 0.96 ROC AUC получили. Мои коллеги на это сказали, что там есть сильный лик в данных. Состоит он в том, что для всех текстов, и тренировочных, и тестовых, известен промпт, с помощью которого текст сгенерировали. Принимая это во внимание, у меня возникает вопрос: а че ROC AUC еще не 1-то?
Если знаете еще какие-то контесты по таким задачам (или по детекции сгенеренных картинок), делитесь в комментариях.
Этика и искусственный интеллект
#промо
В какие сферы нельзя допускать искусственный интеллект, а где он может стать отличным помощником?
Спикеры конференции Yet another Conference on Education от Яндекса уверены, что разрешение спорных вопросов, психологические проблемы и ситуации, где важно личное мнение, — вот три сферы в образовании, в которые ИИ не должен вмешиваться.
А вот в чём нейросети могут быть полезны, так это в создании уникальных образовательных курсов на основе обобщенных знаний, а ещё в качестве коуча во время выбора профессии.
Еще среди тем конференции:
❶ Наука о данных и проблема мотивации. В чем связь?
❷ Можно ли управлять университетами с помощью больших данных?
❸ Перестанут ли учиться школьники, если будут повсеместно использовать GPT?
❹ Чем студентов привлекает образование в региональных IT-хабах и учат ли там ML и DL
❺ Опыт взаимодействия художника, писателя и AI-тренера с ИИ
➡️ Если вы хотите узнать больше о том, что еще важно во взаимодействии с искусственным интеллектом, смотрите запись конференции бесплатно на официальном сайте.
#промо
В какие сферы нельзя допускать искусственный интеллект, а где он может стать отличным помощником?
Спикеры конференции Yet another Conference on Education от Яндекса уверены, что разрешение спорных вопросов, психологические проблемы и ситуации, где важно личное мнение, — вот три сферы в образовании, в которые ИИ не должен вмешиваться.
А вот в чём нейросети могут быть полезны, так это в создании уникальных образовательных курсов на основе обобщенных знаний, а ещё в качестве коуча во время выбора профессии.
Еще среди тем конференции:
❶ Наука о данных и проблема мотивации. В чем связь?
❷ Можно ли управлять университетами с помощью больших данных?
❸ Перестанут ли учиться школьники, если будут повсеместно использовать GPT?
❹ Чем студентов привлекает образование в региональных IT-хабах и учат ли там ML и DL
❺ Опыт взаимодействия художника, писателя и AI-тренера с ИИ
➡️ Если вы хотите узнать больше о том, что еще важно во взаимодействии с искусственным интеллектом, смотрите запись конференции бесплатно на официальном сайте.