A bunch of things that I encounter during my journey as NLP/Audio developer
Как-то раз мы обсуждали, что одна из сложностей в генерации музыки с midi в соединении разных элементов в одно. Ведь включается и выключатся каждый из инструментов в свое время, при этом создавая совместно с другими приятную композицию. А что в голове? Some brain regions (temporal и frontal) оверлепят с speech processing, но есть и отдельные регионы, которые процессят только музыку (stg, ifg). Но какой регион отвечает за пианино, а какой за реп? И делятся ли они так?
вопросов много: от захвата музыкального мира до шазама с мрт, но главное 'как мы слушаем?'
🧠🧠🧠
На вход будем подавать iEEG (HFA сигнал, с виду похож просто на wave) Важно, что есть разные eeg инвазивные и неинвазивные (собственно тут именно инвазивный, то есть 2668 электродов ставили на мозг напрямую, треш, да? Потом выделили около 300 важных, но все же)
🧠🧠🧠
Используем метод stimulus reconstruction. Мы его уже видели в посте про чтение мыслей. Сначала как-то рекордим brain activity (fMRI, EEG и тд) и потом делаем regression model, которая должна восстановить эту активность. Но если encoder модель чаще всего делает именно так, то есть она пытается понять, как выглядит обычная активность мозга при каких-то триггерах. То декодер в данном случае делает наоборот, он берет HFA или сигнал от мозга и пытается вернуть спетрограмму.
Считается, что fMRI лучше подходит для локализации активности, а EEG для ее динамики. В теории мы можем (?) их соединить.
🧠🧠🧠
Авторы сравнивают два типа восстановления-декодирования: linear и non-linear. Где нелинеар MLPRegressor с 2 слоями.
пинк флойд
из интересных файндингов:
- non-linear reconstruction хоть и довольно простой способ, но дал гораздо более fined спетрограммы (картинка внизу)
- больше всего эффект виден на правом полушарии мозга, который (как предполагается) именно и процессит музыку. А больше всего активен anterior–posterior STG или как я запоминала в универе - та закрученная сосиска
- также авторы выделили 3 компоненты или региона, которые наиболее активны на определенный музыкальный инструмент или вокал (p.8, вторая картинка)
Всех с наступающим новым годом! ✨ Кажется, нужно желать того, в чем мы все нуждаемся: мира, здоровья, уважения, искренней любви и искры от интересных проектов в глазах!
Мне хотелось сделать что-то приятное для вас в честь этого праздника. Надеюсь, что этот небольшой список вопросов будет для вас полезным и нужным подарком.
Обнимаю,
Милана
Unlimiformer c NeurIPS
github
paper
0️⃣ Проблемы?
Длинные последовательности, поэтому невозможность тренировки/долгого тюнинга
1️⃣ Решение?
Меняем cross-attention на индексирование с KNN, knn distances теперь станут как раз attention dot-product scores. В тестовом режиме главная задача заугментировать уже натренированную модель на последовательности разной длинны.
2️⃣ В чем плюсы?
generic approach: Не нужно тюнить. Не нужно добавлять веса. Индексы можно держать и на CPU. Авторы также предлагают разные способы тренировки и тюнинга. Например, юзать unlimformer только на инференсе и делать по нему early stopping.
3️⃣ Как делаем?
KNN на hidden States всех инпут токенов. Каждый блок с cross-attention обращается к KNN и берет только top-K input tokens.
Пайплайн:
- последовательности, что больше заданной длины, пилим на чанки с window size, берем вектора из серединки. Эта техника была тут предложена (’22).
- Создаем KNN index на encoded inputs, юзаем для этого Faiss. Dot-product это similarity metric для KNN index.
- На каждую cross attention head в декодере мы будем делать retrieval top-k.
5️⃣ Что с памятью?
Если у нас теперь задача это вылавливать Kbest set of keys, чтобы максимизировать attention, то, как и самурая у нас два пути (вебкам и айти):
- создать индексы для keys, HeWk, но Wk - head and layer specific, тогда нам нужно создать не один сет векторов, а сеты для keys и для values (2*L*H: L - кол-во декодер слоев, H - кол-во голов), больно и слишком дорого
- поменять порядок подсчета, теперь мы считаем (Hd * Wq * Wk)* He, то есть нам не нужно хранить и создавать отдельно head-layer индексы для keys, мы будем держать только encoder вектора.
Как говорят авторы: на 1млн 16 битных эмбеддингов 1024dim нам нужно будет 2gb памяти, та еще и на cpu можно.
6️⃣ Что по скорости? Ведь у нас дополнительно появляется индексирование.
Важно понимать, что на двух стульях тяжело усидеть и поэтому есть трейд-офф между памятью и speed. (Картинка внизу)
C Бартом реализовано все и буквально любую модель можете включить, а вот с T5 у меня завести пока что не вышло...
#grokaem_nlp
AudioBox
Выложила мета модель для генерации речи и звуков, ну и звуков на фоне речи. Та и чтобы с хорошей настройкой.
0️⃣ В чем цель?
Уйти от modality-specific части, когда генерится только музыка/речь/звуки.
NON-Autoregressive generative model - генери не по одному токену/элементу, это необходимо для быстрого инференса)
1️⃣Как работает?
Для этого используется conditional-flow matching алгоритм (p.6, background) (статья). Его работа похожа на диффузии (введение на русском)
Спасибо Леше за помощь 🙌🏻
x0 - какое-то априорное пространство
x1 - какое-то сложное постериорное пространство (для нас какие-то эмбеддинги или спектрограммы)
t - шаг трансформации
Наша flow matching модель должна из x0 перейти в x1 с помощью предсказывания изменений на t шаге трансформации. К этому классическому пайплайну был добавлен метод Lipman'а 2023 года, где для более простого/эффективного обучения и помощи модели в простраивании пути от x0 к x1 мы добавляем Optimal Paths.
лекция
И тут начинается самый экшен:
- masked audio - максированное аудио
- z transcript embedding aligned текстовые транскрипты прогоняем через линейный слой
- аудио тащим через Encodec (о нем в этом посте), к нему добавляем шум и маски, конкатим по каналам, все через линейный слой
- эмбеддинг транскрипта и аудио конактим
- перчим sinusoidal embedding наконец по временной dimension
- запускаем в transformer 2017
2️⃣ Какой претрейн? Он не поменялся с Voice Box - это self-supervised infilling objective - BERT на максималках
3️⃣Но мы же не про TTS тут говорим? (глава 6)
Да, поэтому мы возьмем caption descriptions типо (the wind is blowing), прогоним его через T5. В трансформере все attention поменяем на cross attention, keys and values - text embeddings. Также и будем делать с voice prompt.
4️⃣А что с voice prompt? (глава 7)
Он нужен, чтобы описать хар-и голоса (age, accent, emotion). Если не прокидывать аудио промт, а делать описание речи, то задача становится похожа на TTA (Text-to-audio). Тут для валидации предлагают Joint-CLAP - две ветки на аудио и на текст и учим их через contrastive loss. Для звука у нас WavLM, для текста RoBERTa. А вот где брать сами промты? 🌈LLaMa 🌈 прикиньте и здесь она
Достают классификаторами или из metadata age, gender, audio quality, pitch, speaking rate, accent, emotion, environment и просят LLM сделать caption. Например, "Young man is angry. Audio is okay, small place. Accent from South Asia. Speaks normal" (если честно, листая примеры на сайте, я подумала - ну точно llm, а потом читаю статью и это реально она) Ну и без human annotation не обошлось. А дальше (как я поняла) прокидываем также как и в TTA (text to audio)
Как оно все звучит? Примеры внизу 👇🏻
#grokaem_audio
ПОИГРАТЬСЯ С ГЕНЕРАЦИЕЙ БЕЗ РЕГИСТРАЦИИ И СМС (но с vpn)
#grokaem_nlp
ЗАМЕТКИ Vinija's по NLP (LLM)
Я в какой-то момент разучилась делать хорошие конспекты, а вот заметки других людей меня восхищают. Vinija's заметки на курс CS224N в Stanford. У нее они буквально по большинству вещей в NLP: LSTM, Attention, preprocessing. Но это все не так вкусно, а вот:
🪄🪄🪄
- обзор по Prompt Engineering от простого few-shot, до system 2 attention и chain of note/knowledge/thought и тд
- hallucination
- context length
и тд и тп
🪄🪄🪄
Не могу сказать, что заметки очень детальны. Вы там не найдете формул или подробных объяснений. Но мне очень нравится лаконичность, последовательность и ссылки.
На данный момент у нее самый приятный обзор по prompting, что я встречала))
Мне нужно было две поездки на ласточке в мск туда и обратно, одна поездка на поезде в ульяновск в 14 часов, n доп часов и вот я в отпуске - пост все таки тут!
Читать полностью…POSITIONAL ENCODING
#grokaem_nlp #grokaem_собес
*исправляйте, если что не так*
🥸 - взрослый дядя собеседующий
👩🏻💻 - я и вы
🥸 Почему нам необходима информация о позициональных эмбеддингах?
👩🏻💻 В классическом transformer мы обрабатываем каждый токен (его эмбеддинг) относительно других токенов. Без позициональной информации (которая нам была доступна с rnn) возможна ситуация, где два одинаковых токена на разных позициях получат одинаковые репрезентации.
🥸 Почему нельзя просто добавить эмбеддинг с индексом токена?
👩🏻💻 Если мы будем как-то добавлять новый эмбеддинг, для нас важно, чтобы позициональная информация не была "сильнее" чем семантическая. То есть чтобы в пространстве наши эмбеддинги не сильно смещались из-за позициональных эмбеддингов. А так будет происходить если мы на 100 индекс добавим позиционный эмбеддинг с сотнями. Это хорошо показано в этом видео.
🥸 Назовите два правила, которые должны удовлетворяться для позициональных эмбеддингов?
👩🏻💻 1. У каждой позиции должен быть не меняющийся позициональный эмбеддинг (absolute) вне зависимости от длины последовательности. Это значит, что на 3 индексе должен быть такой же поз. эмб для предложения длинной 10 и для предложения длинной 100.
2. Мы уже называли выше: позициональные эмбеддинги не должны сильно менять исходные эмбеддинги.
🥸 Объясните кратко технологию positional embeddings в attention is all you need.
👩🏻💻 Positional embedding - это дополнительный эмбеддинг, который складывается с основным перед проходом в encoder или decoder блок. Он состоит из чисел, которые строятся по формуле пары sin и cos в range от 0 до половины dim эмбеддинга. Тем самым на 0 индексе у нас эмбеддинг выглядит так sin(pos=0, 2 * i=0), cos(pos=0, 2 * i=0 + 1), sin(pos=0, 2*i=1), cos(pos=0, 2 * i=1+1), sin(pos=0, 2*i=2), cos(pos=0, 2 * i=2+ 1)
пример вычисления
🥸 Почему используются еще i позиции внутри эмбеддинга?
👩🏻💻 i - или позиция внутри эмбеддинга помогает нам frequency внутри подсчета и как следствие близость и различие эмбеддингов на разных позициях. Это классно показано на видео. и также удобно посмотреть на графике в комментариях.
🥸 Зачем использовать и косинус, и синус?
👩🏻💻 Авторы говорят "We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offset k, PE(pos+k) can be represented as a linear function of P(pos)" Они хотят доказать, что так мы сможем выучивать relative positions, так как любой offset (или шаг на k) может линейно быть выражен через P(pos). Это действительно доказывается через матричное умножение, что у нас есть матрица преобразований (M), которая не зависит от шага k. Вот тут подсчет, тряхните стариной, вспомните тригонометрию))
🥸 Почему мы не учим positional embeddings?
👩🏻💻 Почему не учим? Учим. Таким образом мы лишь добавляем новый слой обычного эмбеддинга в модель.
paper, который объясняет разницу и эффекты от learned and predefined.
🥸 Что такое relative positional encoding ?
👩🏻💻 В обычных эмбеддингах мы добавляли absolute positional embedding к текущему, то есть не учитывали позиции других эмбеддингов при создании текущего напрямую в positional embedding. Способов имплементации relative encoding довольно много. Интуиция за этой технологией в этом видео и объясняется обучением новых эмбеддингов отношений между позициями. То есть у каждой позиции есть дополнительные n позициональных эмбеддингов (для values и для keys), которые указывают на соотношение с остальными эмбеддингами (n=длина последовательности). В дополнение у нас есть clip на макс длину.
paper
🥸 Что такое rotary positional embedding?
👩🏻💻 Rotary positional embeddings - это техника, где мы не создаем новые эмбеддинги, чтобы заметчить позиции, а делаем трансформацию, которая помогает добавить relative отношения между эмбеддингами на разных позициях. Трансформация схожа с тем, что мы видели для sin-cosine, однако теперь у нас происходит этот rotation эмбеддингов внутри attention. Это клево можно посмотреть в коде тут.
видео раз
видео два
классный папир
Prompt based ASR (Где-то мы это уже видели? Whisper это ты?)
Добавили text encoder на промты, его энкодированный результат дальше в cross attention с фичами.
о модели узнала тут
paper
code
model
🦤🦤🦤
Content promt: contextual info: о чем топик или то, что говорилось ранее
Style promt: casing, punctuation and etc (на самом деле использовали всего два промта: WITHOUT CASING OR PUNCTUATION и Mixed-cased English with punctuation
🦤🦤🦤
Состоит моделька как принято из text encoder'a (он freezed BERT), speech encoder, speech decoder. Выход text encoder'a это текстовые эмдеддинги промта. Style prompt и content prompt конткатятся, при этом к style prompt добавляем также доп. вектор. Интересно, что текстовые эмбеддинги идут в каждый блок speech encoder'a, а не в только первый. Это все работает как старый добрый cross attention. text embeddings = query, acoustic embeddings = key, value. Сам audio encoder - это nadirapovey/zipformer-paraformer-609ccc9cdd03">Zipformer, а decoder это типо RNN-transducer, но у ребят он выглядит вот так без rnn все это соединяется в RNN Transducer (aka) Ух, какая мутная штука, самой архитектуре авторы посвятили буквально пару строк, а жаль((
🦤🦤🦤
Сравним с whisper base:
Первую запись ребята представили сами, там кажется говорится про коня, поэтому в промт это и добавим.
prompt-asr: One day an old gentleman was writing with him, and a large piece of white paper or rag blew across just on one side of me.
whisper-base: One day an old gentleman was riding with him, and a large piece of white paper rag blew across just on one side of me.
Так все таки writing тут или riding?
Дальше возьмем stuttering речь одной блогерши, вот какие результаты получаем с промтом о том, что это приветствие.
prompt-asr: He guyed at the uses thing that has ever.
whisper-base: Hey guys, so the of of your this thing um that has however happened
🦤🦤🦤
Идея классная, но кажется нужно больше данных и лично мне больше инфы про архитектуру, которую я мб не поняла.... Учили всего 50 эпох, та и модельку малюсенькая. На самом деле уже под конец и не хотелось выкладывать про нее, но мб кому-то будет интересно запустить и потыкать))
#grokaem_audio
🥸 То есть маскирование у нас только в Decoder?
👩🏻💻 Мы можем разделить два понимания маскирования. Если например у нас есть паддинги, мы все равно будем их маскировать в attention и encoder. Почему? Если у нас последовательности разной длины и вы используете padding, то в attention части нам не нужно брать 'влияние' padding токенов.
masked softmax implementation
В causal attention мы используем другой вид маскирования, мы маскируем только будущие токены. Почему? Потому что в causal language modelling мы делаем предсказания только на основе предыдущих примеров.
🥸 Не будут ли эмбеддинги в GPT модели хуже из-за того, что мы смотрим только назад?
👩🏻💻 Это сложный вопрос. В общем случае нет, потому что все таки контекст у нас меняется и слова, что в одним примерах маскировались, не будут маскироваться в других. Но это дискуссионный вопрос))
интерактивная визуализация для bert и gpt эмбеддингов
статья про интерпретацию
🥸 Если какое-то слово всегда используется в начале предложения, не будет ли у него эмбеддинг плохим в GPT модели?
👩🏻💻 Это довольно сложный вопрос, потому что все таки данное слово всегда будет находиться без контекста и смотреть только на себя. Но в обычных языках это почти невозможно. Велком обсуждать))
milestones
Одна из лучших лекций от Тани
Обзор seq2seq от Елена Voita
лекция автора силошной
Один из лучших обзоров
еще разные эттеншены в cv
- Я тебе говорю, еще полгода и бум будет в аудио.
- И что и у меня работу отнимут?
Это недавний диалог с моим другом-диджеем. Я работу у него забирать не собираюсь, а вот Meta похоже - да. Как это начали делать писала тут.
🙈AUDIO CRAFT или генери музыку с настройками🙈
3 модели внутри:
MusicGen - генери музыки
AudioGen - генери звуки
EnCodec - кодируй аудио в что-то другое, пожалуйста
Про MusicGen мы уже болтали, хочется понять, что за EnCodec у них. Именно на кодах из него учится MusicGen.
🙈ENCODEC🙈
В чем проблема?
Кодирование аудиозаписи с помощью MIDI ссылка на вики (do u use wikipidea as your source of information? yes.) - дает мало инфы про аудио. Поэтому все изощрялись, как бы придумать что-то впихуемое в LM как MIDI, но чтобы лучше, Но в сыром аудио конечно больше 'признаков', поэтому хотелось бы юзать его. Пытаясь усидеть на двух стульях, EnCodec предложили это и делать с 'квантизацией'.
папир
видео-разбор
0️⃣ Что внутри?
Внутри encoder - decoder модель из conv блоков и лстмки, между ними quantizer. Именно с него мы будем брать коды записи. Всего K codebooks, к каждой codebook мы итеративно ищем ближайшее представление. На выходе у нас получается вектор с индексами от каждой codebook. То есть если было 32 codebook, то мы перешли из 1024 в 32! 🤯 Вернемся к векторному представлению, просто просуммировав все представления из codebook.
1️⃣ При чем тут трансформер?
Чтобы ускорить процесс на инференсе и распараллелить квантизацию по таймстепам, будем учить трансформер выдавать вероятности на индексы в каждой codebook. Тогда на инференсе мы не будем закидывать каждый таймстем в каждый блок квантизации, сразу будем получать вероятность наилучшего индекса в каждой codebook.
2️⃣ Что еще мы выучили на курсе по DL и не добавили?
Чтобы точно ничего не потерять, ребята добавили multi-scale disriminator на STFT (Short-Time Fourier Transform) реальной записи и восстановленной. Это тот же discriminator, но несколько с разными window size на STFT и разными размерами dialated filters.
Лоссов много (аж 6), а результат классный! Статья очень подробная и клево написанная 💔
🙈🙈🙈
Сам audio craft - это по сути объединение генерации музыки, но с разными настройками. Можно крутить кол-о промтов, overlap их записей, длину, лад, key, оверлап промтов. Нормально, к сожалению, они все не оформили, но хорошие разработчики сделали ноутбук, нужно запустить и нажать на ссылочки на gradio и поиграться. Также не очень (мне) понятно поменяли ли они EnCodec на диффузию, но точно работают над этим.
Революция? Вроде нет. Шаг к ней? Да.
пс тут был лол-кек с тем, что никто с выхода audiocraft особо ничего не понял, как бы просто это все дело заинферить? Ну и не дураки сразу сделали тутор на ютубчике, но не бесплатно конечно. Интересно, предъявит ли ему что-то Meta за коммерческое распространение прям в issues их репозитория.
В следующих сериях:
- В чем ключевое отличие между работой encoder и decoder архитектурами?
- Что обработает быстрее lstm или encoder архитектура?
- Что можно распараллелить LSTm или attention и как?
- Куда ставить CLS вектор?
- Positional embeddings размерность должна быть равна?
Какие tricky questions задавали вам или задавали вы про transformer like архитектуры?
Про трансформеры можно говорить много и долго, вот и будем это делать. Будем в такого рода постах брать по 1 вопросу, которые вам могут задать на собесе.
🥸 - собеседующий
👩🏻💻 - я и вы
До этого у нас были посты про:
- виды токенайзеров
- книжка по трансформерам
- как тюнить большие модели
- xlnet
- туториалы
🙉 теперь про AUDIO 🙉
Генерация таких звуков не похожа на генерацию музыки, нет шанса на ошибку. Вдруг какая-то частота резко появится, и вы проснетесь как от рыка льва.
Но все таки пройдемся, что из генерации музыки там мб. Вообще все решения можно разделить условно на midi, сырое аудио и модификации midi, архитектурно на старые recurrent модели (у нас все таки последовательность) и transformer модели (потому что модно и молодежно), также diffusion тренды))
пара статеек, которые мне понравились
1️⃣ MuseFormer - Transformer with Fine- and Coarse-Grained Attention for Music Generation
генерим не на основе всех предыдущих токенов, а их summarisation.
демки
пепер
2️⃣ MusGET - аля берт для музыки, маскируем только один из треков, предсказываем на основе source трека замаскированный target трек
демки
пепер
3️⃣ MusicGen июнь 2023 - пожалуй, один из самых популярных сейчас... авторегрессионный трансформер со своим EnCodec на сырое аудио, главное отличие от других как раз в EnCodec
демки
пепер
4️⃣ Music Transformer 2018, old but nice
классик трансформер, но со своим быстрым relative attention
демки (мне особенно понравилось, как играет создатель в конце сгенерированный трек на пианино)
пепер
5️⃣ JukeBox от OpenAI, old и не работающий)))
работает на сыром аудио с VAE на quantized вектора, по сути идея похожа на MusicGen....
демки
пепер
6️⃣ Mousai - те же авторы, что и в Music Gen, январь 2023
две диффузии: энкодер только на аудио, потом text-to-audio diffusion
демки могут в классику, почти получилось в дапстеп (привет, 2013), остальное как будто на 2х
пепер
🙉—это-типо-переход—-🙉
Вообще подходов уйма на papers with code и некоторые очень интересные
По сути те, что работают на midi пытаются сымитировать поведение языковых моделей, но суть в том, что midi сами по себе можно по-разному декодировать и соответственно улучшать качество. Вот тут можно найти разные имплементации, а вот тут видео от 2020 года про один из видов такой декодирования
доп:
интересный обзор с RNN, CNN и VAE
решение только в продукт, мне house понравился грустный))
🙉—это-еще-переход—-🙉
Как думаете, что у endel внутри? Ифками все покрыто или мюзик женерейшн какой-то? И вообще используете или нет сами? Мой опыт расскажу в комментах))
в этот субботний вечер позволю себе не тех обсуждение. Как вы боритесь с чувством, что вы ничего не достойны, вы глупы и у вас ничего не получится? (если у вас такое чувство есть)
Читать полностью…PITCH
Такие посты мало кто читает, а я их пишу слишком долго. На медиуме (запрещенная в РФ соц. сеть) выложила milana.shxanukova15/how-pitch-shows-youre-old-427cceca5b5">статейку про PITCH. Его используют где только можно, а что это вообще непонятно. В статье:
- немного биологии и строения всего vocal track + очень крутой ресурс с красивыми картинками и понятными описаниями
- как меняется питч и есть ли точная настройка между мозгом и типом pitch? согласно статье
- чуть-чуть про питон и pitch detection
- чуть-чуть про старость и pitch
Мало, но это честная работа))) pitch это вообще интересная штука, ее используют и в TTS, и в preprocessing, и просто по фану, я вот в дипломе ее как фичу юзала))
#grokaem_audio
#grokaem_собес #grokaem_nlp
Я собрала 100 вопросов по NLP, которые мне задавали или задавала я. Надеюсь, что они будут полезны, чтобы освежить в памяти важные моменты.
*Notion будет пополняться*
Notion русская версия
В составлении вопросов помогали:
ds girl
канал Плюшевый Питон
Alexander Babiy
канал что-то на DL-ском
канал Dealer.AI
канал алиса олеговна
Часть вопросов:
8. Объясните разницу между косинусной близостью и косинусным расстоянием. Какое из этих значений может быть негативным? Как вы будете их использовать?
21. Что такое negative sampling и зачем он нужен?
30. Что такое затухающие градиенты для RNN?
41. Что используется в трансформере layer norm или batch norm и почему?
55. Объясните подходы для позициональных эмбеддингов и их плюсы и минусы.
75. В чем отличие оптимизатора Adam от AdamW?
86. Объясните концепции metric learning. Какие подходы вам известны?
88. Объясните виды sampling при генерации? top-k, top-p, nucleus sampling?
92. В чем отличие prefix tuning от p-tuning и от prompt tuning?
98. Объясните принцип работы KV cache, Grouped-Query Attention и MultiQuery Attention.
- AI нужен для людей.
- Ты про генерацию аниме тянок?
- Нет, про другое...
С обновлением ios прилетела новая accessibility фича - private voice. (на телефоне она работает с 12 айфона) Еще месяца два назад я сделала ее для своего голоса (примеры внизу).
Люди теряют голос по разным причинам, иногда это следствие рака или болезни Паркинсона. От этого никто не застрахован, к сожалению. Кроме того, с возрастом у многих людей меняется vocal track и голос становится более хриплым (Presbyphonia).
Сейчас private voice можно создать, записав фразы на английском языке. Надеюсь, что дальше эта voice conversion технология будет только улучшаться.
Создать свой голос можно через: настройки - универсальный доступ - private voice.
трогательное видео
больше про accesibility
voice disorders
METHODS in PAPERS WITH CODE
Я сама не видела и не знала, но Сережа показал классный блок у papers with code с методами. Их тут ну очень много:
- у attention 124 метода, не только для текстов
- 71 метод для активаций
- 56 методов для регуляризации
- 49 skip-connection types
- 39 функции потерять
и тд и тп
Такая организация будет удобной, если вы застряли в каком-то моменте и нужно попробовать что-то новое, это новое найдете в этих блоках.
Как говорили великие: нечем заняться, взяла начистила картошки и приготовила, соседей угости, открыла paperwithcode, читаешь и подписчикам рассказываешь
@grokaem_seby_thoughts
В этот маленький праздник (1к) позволю себе в канале нетех пост. Я не делюсь своими проектами, работой и так далее здесь, хотя мб и стоило бы. Но хочется пошарить с вами одну мысль.
Одна из вещей, за которыми я стремлюсь - это состояние потока. Его описывают контролем, полной концентрацией, ощущением, что само действие уже награда и так далее. Для меня это было ощущение слияния с действием и погружения, где я не чувствую времени и могу взлететь над самой собой и увидеть себя со стороны. (медитации? нет ботать? да) Я ловила это состояние только несколько раз в жизни в профессиональной сфере. И так хочется поймать еще и еще.
Так случилось, что это состояние я чувствовала, когда ботала. И убирала телефон. И ставила на таймлапс. В погоне за этим спокойным состоянием, так я делала оооочень часто. Сейчас я могу не ставить таймплапс и не отвлекаться. Но это был такой этап приучения. Как кататься на 4 колесном велике перед тем как пересесть на обычный.
Эти видео было жалко сохранять только в памяти телефона, я их склеила. Как и делаю почти со всеми видео, которые постоянно снимаю) (я всегда с собой беру видеокааамеру) Тут около 3 лет таймплапсов. Дома, в общаге, в додо, в библиотеке и тд. Клево наблюдать, как я менялась внешне. Как менялось все вокруг. И то, что я делаю. К сожалению, тут больше всего видео с 2020-2021 года (наверное, от этого мне еще теплее смотреть эти видео и гордиться юной Миланкой).
видео, где я ботаю
Но в данный момент я в Нижнем Новгороде и мне повезло снять квартиру с приятным видом. Поэтому я решила перестать бояться и наконец достать идею 2022 года с полки и попробовать снимать study/code with me. Музыка на этих видео сгенерирована с помощью audio craft, а промты написаны с chatgpt. Включайте, если будет скучно и будете в поиске состояния потока как и я.
Спасибо вам большое, что читаете и тратите свое время на мной написанные буквы и удаленные запятые ❤️
code with me
Будем читать мысли. Погнали.
*во многих моментах я могу сильно и не очень ошибаться*
Берем fMRI (функциональное МРТ), BOLD signal, который показывает активные регионы нейронов, к которым поступает больше кислород, его уровень поднимается и опускается примерно за 10 секунд. Проблема: мы говорим на английском примерно 2 слова в секунду, следовательно одна fmri содержит около 20 слов, то есть будем предсказывать целые фразы.
🪐🪐🪐
Делим весь пайплайн на несколько частей:
1. ENCODING (p.22)
Задача - получать brain responds (активные регионы мозга) относительно какой-то word sequence.
Вход - эмбеддинги от GPT 5 слов.
Внутри у нас линейная регрессия, предсказываем новые fmri по эмбеддингам и сравниваем с реальным.
Коэффициенты регуляризации находились для каждого subject.
2. WORD RATE (p.23)
Однако, чтобы начать декодировать, нужно понять, когда вообще человек начинает думать о слове (imagine or perceive). Для этого возьмем еще одну линейную регрессию, на вход снова fmri, на выходе word rate, который мы получили как раз из историй. Word rate здесь это кол-о слов стимулов с предыдущего запроса.
У каждого subject своя модель.
3. DECODER (p.24)
Задача - выплевывать candidate sequences, для этого держим beam search. Внутри у нас затюниная GPT на reddit comments и рассказах, которые не юзали в примерах.
🪐🪐🪐
Пайплайн получается такой: взяли слова - расширили их - взяли эмбеддинги - получили FMRI от Encoding части и сравнили с реальным FMRI, если все ок - храним последовательность
К этому моменту у нас есть один важный вопрос: как мы получаем самые ПЕРВЫЕ слова? Ведь encoding часть нуждается в готовых эмбеддингах, word rate модель выдает кол-во слов, а decoder вообще нуждается сразу в каких-то словах. В этот момент я написала трем авторам статьи (да, нестрашно и да, они не ответили) и открыла код. В грезах функций для всяких специальных медицинских семплингов я нашла ту волшебную переменную INIT = ['i', 'we', 'she', 'he', 'they', 'it'] Именно она и подается в самом начале. Так и есть, откроем suppletementary tables p.35 и каждый пример для всех subjects начинается с одного из этих местоимений. Ок это или не ок - велком в комменты.
🪐🪐🪐
Теперь факты:
1. Принимало участие всего 7 людей в возрасте от 23-36 лет. Для декодинга использовали троих (двое мужчин (36, 23) и одна девушка (23)).
2. Всю часть мозга делили на 3 cortical части: классически принятая языковая часть, parietal-temporal-occipital association network, prefrontal. Картинка в комментариях. И декодировали с каждой из частей. Занятно, что вторые две части а) по предсказаниям очень похожи б) показывают себя лучше чем только языковая
3. Было пять разных процессов и их влияние на декодер измеряли: (p.8)
- perceived speech, слушаем речь
- imagined speech, люди представляли, как они рассказывают историю
- perceived movie, смотрим фильм (4-6 минут), где почти нет речи
- multi-speaker, слушаем историю, которая перебивается другой историей и делаем фокус на одном из спикеров
- decoder resistance, слушаем историю и в это же время считаем или называем животных, или рассказываем другие истории про себя.
Конечно, это не чтение мыслей, но точно мощный к нему шаг. В статье много деталей, так что возможно к чему-то еще вернемся 🤞🏻
семинар, где был обзор
код
новостная статья
статья
Сказать честно, я больше люблю читать не топ-популярные каналы как свой. Я еще тот подвид интроверта-экстраверта, который освоил технологии, поэтому постоянно все комментирую, где надо и не надо. А в маленьких каналах мне не страшно комментить ахах.
Вот насобирала вам 10 приятных каналов моих знакомых и еще незнакомых:
1) алиса олеговна - Олег из ML вкатывается в NLP на самообучении и пишем об этом
2) КПД - Спиридон пишет о квантовании, прунинге и других сложных вещах
3) что-то на длском - Карина про все в DL, NLP (очень мотивирует)
4) girl in ds - Маша тоже про DL и там крутые мемы (и сама Маша крутая и в жизни даже)
5) приближаем сингулярность - Леша больше про генеративные и llm (с Лешей мы не знакомы)
6) voice stuff - Илья про audio, у него я частенько ворую ссылки на статьи, он крутой
7) speech technology - блог (как я понимаю) от создателей vosk, там всегда самые первые статейки по аудио
8) llm under the hood - Ринат про то, как они делают продукты с LLM (с Ринатом мы тоже не знакомы, но стиль письма и подача - огонь)
9) from life import happiness - Рома работает в Яндексе и много учится, за ним я слежу, чтобы понижать свою самооценку
10) Pavel Zloi - классный Паша, на него я подписалась недавно, он писал о том, как он обучал ruGPT3.5 с сайгой
Чтобы было честно, и большие каналы, за которыми я прям слежу, а не просто подписана))
1) Надя пробует - Надя пробует, за визу Наде я молюсь как за свою ахаха
2) DL in NLP - Влад больше про NLP и статьи, Влад умный писец
Зачем вообще spelling correction? У вас мб любая моделька и чтобы ее перформанс на проде и реальных данных был ок, при обучении вы можете использовать два подхода:
- замусорить данные
- отчистить данные
Ну или делать и то, и то))
🥟🥟🥟
Чтобы мусорить, нужно делать это осознанно, потому что мы пытаемся имитировать мусор человека:
- опечатки
- перестановки
- пропуски
- вставки
Это своего рода аугментации, про которые я говорила вот тут. Их можно использовать с библиотекой nlpaug (для keyboard нужно создать свой словарик) или Augmentex. А также сейчас corruption появился в SAGE. Не забывайте, что при тренировке эти corrupted samples не должны быть в тесте (just a reminder).
🥟🥟🥟
Но также часто бывают обычные - непредсказуемые ошибки, тогда мы можем чистить их с какой-то spelling correction моделью, если наша исходная обучалась не на овердохера данных (если так, то скорее всего она и сама видела эти ошибки). Обычно такие модели основаны на seq2seq, где входная seq это неверная последовательность, выходная верная. Конечно-же, использовались они все разные. И тут при выборе нужно обращать внимание на подходы, какие-то модельки обучались на isolated correction, какие-то с контекстом. Понятное дело, что isolated во многих случаях будет проигрывать.
0. PySpellChecker - работает для русского, английского и тд. Мне нравится, что можно получить кандидаты-вариантов исправлений.
1. Neuspell - тут много разного от LSTM до Берта. Правда ребята как-то накосячили с новыми путями, поэтому теперь нужно скачивать модельки со старой версии драйва.
2. Всякие трансформермы - их как обычно мы ищем на hf, вот например (барт), (т5)
3. SAGE - новая библиотека с моделями t5, m2m
#grokaem_nlp
Нашла интересный обзор подходов по использованию выхода любой языковой модельки аля BERT для классификации. Например, такие методы как:
эмбеддинги на последнем слое:
- cls
- mean/max/mean + max
- conv1d
эмбеддинги со всех слоев:
- mean cls
- pooling: mean/concatenate/lstm/attention
Использую как источник идей, когда выдыхаюсь))
#grokaem_nlp
Продолжаем нашу рубрику.
#grokaem_nlp #grokaem_собес
🥸 - взрослый дядя собеседующий
👩🏻💻 - я и вы
🥸 Базовый вопрос: где какая архитектура используется?
👩🏻💻 (*улыбается) Вообще изначально Encoder-Decoder модель была предложена в задаче перевода. Как в переводе мы сначала пытаемся понять полностью предложение на одном языке и потом на его основе сделать перевод, так мы и делаем в encoder-decoder архитектуре. Как раз в encoder части мы стараемся выучить представление (например, context вектор на одном языке) и потом использовать это для декодирования в decoder части. Encoder используется в BERT like моделях, Decoder в GPT-like архитектурах.
🥸 Какой attention где используется?
👩🏻💻 Если говорить кратко, то в encoder части мы используем только self-attention, в decoder части в первом transformer блоке мы используем также self-attention с маскированием, а вот во втором cross attention.
* self-attention - смотрим на всех соседей и на себя: quеries, keys and values одни и те же
* cross-attention - то же самое, только queries - это decoder states, keys and values - это encoder state. Это как раз тот момент, когда мы пытается сделать генерацию на основе того, что мы уже видели.
Внутри функция для attention может быть разной. Главное - нам нужны скоры, чтобы обновить наши эмбеддинги.
1) dot product - базовая и самая используемая функция: просто перемножаем))
допом можно делать scaled dot product - это когда вы перед тем, как добавлять softmax, нормализуете на квадратный корень от dimension эмбеддингов. Это нужно для стабилите, когда dimension большой))
2) additive attention он же concat, soft and global (Bahdanau attention) - родоначальник attention, скор считается с помощью дополнительной фидфорвад сети
одна из имплементаций
история от Андрея Карпатова, как ему Bahdanau рассказал, как он придумал attention
3) Luong-Attention он же general, location based и любимый dot product (они все разные)
Немного про различия
🥸 А если последовательности длинные?
👩🏻💻Все эти примеры мы смотрели, подразумевая главную пользу attention - смотреть на всех, но в условиях длинных последовательностей это может быть не выгодно, потому что сложность подсчета attention зависит от длины последовательности квадратично, так что есть:
soft VS hard - предложен в image captioning таске, нам нужно в hard attention выбирать один патч, а оптимизация через variance reduction or reinforcement learning
global VS local - в глобал мы берем все стейты от encoder, в local предсказываем позициии токенов, на которые будем смотреть.
В NLP мы используем именно global VS local
Многие из оптимизаций строятся по принципу - не нужно считать внимание на все токены, их нужно выбирать (local attention). Примеров много: sparse attention, dialated, sparse attention и тд. Есть и другие подходы: факторизация матриц, locality-sensitive hashing, kernel attention. Подробнее тут.
Далее мы уже изощряемся по-разному и можем добавлять: Multi-head, Multi-Query Attention, coarse to fined attention и так далее
#grokaem_random
1. fn_kwargs - супер классно для маппинга в hugging face
2. disable caching() - необходимость, если вы не хотите хранить кучу логов от wandb
3. в коллабе теперь по пандас можно красиво смотреть фреймы и сразу видеть графики
4. тупой if else при записи счета в словаре можно поменять на:
if v not in your_dict:5. accelerate в hugging face - быстрая бомба пушка
your_dict[v] = 0
your_dict[v] += 1
ЧЕМ ОТЛИЧАЕТСЯ RoBERT'a ОТ BERT'а?
Ключевые отличия, которые внесла RoBERTa, это:
- убирать next sentence prediction задачу из претрейна (binary-classification задача предсказания является ли предложения парой из одного текста)
- делать динамическое маскирование, а не статическое
🥸 Чем отличается динамическое маскирование от статического?
👩🏻💻 В BERT'e мы брали один sequence, брали 10 разных маск, дублировали данные 10 раз, чтобы одна sequence получала 10 разных маск за эпоху. Тем самым при обучении модель видела одну и ту же маску n-epochs times.
Это не оптимально в ситуации, когда у нас гигабайты памяти и длинные предложения. Маскировать нужно по-разному. Поэтому на каждый train step генерится своя рандомная маска.
🥸 В маскинге вот прям все токены маскируются?
👩🏻💻 Нет, обычная настройка стоит на 15% из последовательности. Из этих 15% мы 80% меняем на [MASK], 10% не меняем и 10% меняем на рандомный токен из vocab.
🥸 Почему нельзя всегда менять?
👩🏻💻 Не то чтобы нельзя. Как пишут авторы BERT, a mismatch between pre-training and fine-tuning, since the [MASK] token does not appear during fine-tuning. The purpose of this is to bias the representation towards the actual observed word. Что означает:
а) в тюнинге у нас не будет токена [MASK]
б) если всегда то слово, которое мы будем предсказывать будет одним и тем же токеном, то его эмбеддинг модель выучится не считать для финального представления
пример подсчета self-attention для одного context вектора
ответ на форуме
🥸 Только 15% можно ставить?
👩🏻💻 Нет, есть исследования, что например 40% маскирования даже улучшает общий перформанс. Однако чем больше процент маскирования, тем больше corruption, тем сложнее модели предсказывать токены.
🥸 Какие виды маскинга еще знаете?
👩🏻💻 PMI маскинг - маскировать не рандомно, а на основе PMI значения, таким образом будут маскироваться близкие collocations
Span masking - маскировать не один токен, а последовательность токенов
видео про разницу от стэнфорда
материал про masked lm также от стэнфорда
🥸 Что бы вы выбрали для тюнинга?
На самом деле если брать готовые решения, то динамическое маскирование сейчас используется и для берта. Так что вопрос остается лишь к остальным параметрам - токенизации, количества параметров и данных для предобучения.
автор канала теперь официально бакалавр по компьютерной лингвистике 🪄
тут был длинный пост о том, что мне понравилось и не понравилось в вышке, и как вообще если честно я задолбалась))) но на выходе это неважно, 4 года были интересными и продуктивными вне универа
рассказывайте, кто что закончил и что там делать та дальше надо?
ГЕНЕРАЦИЯ ЗВУКОВ И МУЗЫКИ
Endel
Я случайно наткнулась на их приложение около года назад, когда искала решение для проблем со сном. Приложение предлагает ставить на ночь звуковую дорожку, которая разбудит вас в нужное время. Делают его ребята из России, а сейчас носят стилево черный в молодежном Берлине.
Включаем критическое мышление и скептику. Это точно работает со стороны биологии? Что у них за сетка такая там?
🙉 Сначала про БИОЛОГИЮ 🙉
Есть circadian cycle - внутренние часы, их изучали еще в 18 веке на растениях. Листья обычно раскрываются на солнце, закрываются в ночь. Что если всегда будет ночь? Ничего не изменилось, внутренние часы подсказывали тот же ритм. За обнаружение гена period - ответственного за внутренние часы даже дали Нобелевскую. Endel основываются на том же ритме. А также на цикле сна. Они собирают данные о текущем времени и пытаются подстроиться под общий цикл. И под твой персонализированный, если ты собираешь такие данные. Heart rate, activity (steps), weather, natural light. Первые два можно собирать с эпл вотчей и просто приложения health. А вот к light у меня есть вопросы. Свет монитора сильно влияет на состояние, было бы клево, если бы это как-то тоже мониторилось.
EXPONENTIAL MOVING AVERAGE
Weight EMA - smoothing техника, которая призвана улучшить generalisation performance модели. Эта техника пришла к нам из times series.
Основная схема: держим копию весов модели, при апдейте делаем апдейт как weighted average между текущими весами и весами до этого степа (post-optimization step).
Что за проблема есть: при каждом training step мы делаем апдейт весов относительно одного батча, но даже при хорошей подготовке данных и хорошем BatchSampler, один батч может быть шумовым и lead to getting stuck in poor local minima or oscillating between different parameter values
Как эта проблема решается?
Формула: decay_factor * new_weights + (1-decay_factor) * old_weights
decay_factor следит за тем, чтобы апдейт был как раз с небольшим влиянием прошлых весов. Из формулы следует:
decay close to 0 - больше влияния на старые веса
decay close to 1 - больше влияния на новые веса
реализация в tensorflow
Реализация Pytorch:
реализация объяснение для лайтнинг подхода через callback:
(там необходимо только поменять функцию on_save_checkpoint и сохранять ema чекпоинты как дикт, как вот тут)
У нас есть веса модели, которые мы изначально инициализируем любым образом, это мб рандом, а может быть распределение. парочка видов инициализации весов модели. Далее в колбэке мы храним веса ema, и апдейтим на каждом степе, в конце сохраняем как чекпойнт key. Заметьте, что когда происходит степ, веса изначальной модели также должны меняться. Подгрузить можно сначала сделав torch.load(checkpoint_path), а потом проиндексировавшись по ema весам. При обучении сильно не расстраивайтесь, вначале метрики будут ниже чем при обычном обучении и обучение при этом будет медленнее, но это плата за stability.
Если вы делаете на чистом pytorch, то можете создать такой же класс и просто делать step и сохранить эти веса в конце тренировки.
первое видео про ema
обзорно про time series, reinforcement
объяснение от умного Lei Mao с матешей
#grokaem_dl
#grokaem_random #nlp #deep_learning
Я скоро отдохну и будут более сложные посты, а пока вот пара рандомных штук:
1. Если что-то не дает установить питон, делайте через конду и перепроверяйте названия библиотек и их установочные названия. Была загазлайчина wheel для dvc, который через pip не шел, а через conda как родной встал.
2. WandbLogger в Pytorch Lightning - лучшее, что придумало человечество. А dvc нужно подумать над тем, как они не логируют hyperpyyaml и как они меня из-за этого потеряли.
3. Если pickle в колабе не читает файл, то проверьте свою версию питона и версию протокола, колаб и каггл читают все ниже пятой, так что указывайте protocol=4.
4. Чтобы взять только определенные индексы в пайторчовском тензоре нужен arange.
import torch5. Если больно и тяжело считать cosine similarity на больших тензорах, попробуйте любую contrastive loss с кастомным cosine similarity внутри.
tensor = torch.tensor([[0.5, 1], [0.8, 0], [1, 0.3], [0.2, 0.7], [0.6, 0.4], [0.1, 0.9], [0.3, 0.2], [0.7, 0.5]])
indices = torch.tensor([1, 0, 0, 0, 1, 0, 1, 1])
selected_elements = tensor[torch.arange(tensor.shape[0]), indices]
mask = lambda frame: np.isin(frame['my_column'], my_values)Читать полностью…
random_frame[mask(random_frame)]