Меня регулярно спрашивают, как запустить распознавание речи для русского языка бесплатно без смс?
Неплохой современный ответ - библиотека vosk.
Модель: https://alphacephei.com/vosk/models
Код: https://github.com/alphacep/vosk-api (я взял пример python/example/test_microphone.py)
Приятного распознавания!
Неплохой современный ответ - библиотека vosk.
Модель: https://alphacephei.com/vosk/models
Код: https://github.com/alphacep/vosk-api (я взял пример python/example/test_microphone.py)
Приятного распознавания!
Недавно наткнулся на клёвый курс по обработке аудио. Идея - объяснить математическое устройство звука и показать, как это устройство можно анализировать из python. На выходе слушатель будет способен извлекать из сырых wav-ок информативные фичи, которые можно и глазами разглядывать, и в нейросетку засовывать. Курс построен так, чтобы его могли понять музыканты, и объясняются все детали супер подробно.
По формату этот курс - ютубовский плейлист на насколько часов: https://www.youtube.com/playlist?list=PL-wATfeyAMNqIee7cH3q1bh4QJFAaeNv0. Пару мыслей из него я изложу ниже.
Вообще звук - это последовательность волн пониженного и повышенного давления воздуха. В формате wav он так и записывается - просто последовательность чисел, значений давления, с частотой (обычно) 44К чисел в секунду. Но анализировать его в таком виде не очень удобно.
Проще всего выделить в звуке громкость (это амплитуда колебаний) и тон (это их частота). Но звук, состоящий из единственной частоты (тупо одна синусоида) - это характерное "электронное" гудение, а "нормальные" звуки содержат кучу частот одновременно. В шумах и шепоте частоты намешаны хаотично, а в звуках голоса и "мелодичных" инструментов основные частоты пропорциональны друг другу. Соотношение различных частот в звуке - часть того, что мы называем тембром.
Чтобы понять, какие частоты вообще в звуке содержатся, его надо разложить в сумму синусоид. Если их фазы заранее известны, это можно сделать чем-то вроде обычной линейной регрессии. Если неизвестны, можно применить преобразование Фурье и вычислить фазы одновременно с коэффициентами амплитуды (если интересно, про преобразование Фурье могу написать подробнее отдельно). Разрезав звук на короткие кусочки и разложив каждый на частоты по отдельности, получаем спектрограмму - картинку, показывающую, как меняется громкость различных частот во времени. Спектрограмму можно скармливать нейросетям или анализировать глазами. При наличии опыта можно читать ее, как нотную запись, и даже различать буквы и слова.
А ещё по спектрограмме можно вычислять более сложные фичи. В типичном звуке голоса много частот, пропорциональных друг другу, а значит, его спектр (после логарифмирования) тоже будет периодическим, и значит, его можно _ещё раз_ разложить в сумму синусоид. Математики назвали такое представление cepstrum (типа spectrum наоборот), а его коэффициенты, MFCC, уже лет 50 являются едва ли не самыми информативными признаками для распознавания речи.
Про все эти фичи (и кучу других) подробно рассказано (и показано) в курсе. Если хотите сразу попробовать анализ звука самостоятельно, берите пакет librosa, и в бой! А если вам интересны какие-то детали, то пишите в комментарии, и я расскажу подробнее (:
По формату этот курс - ютубовский плейлист на насколько часов: https://www.youtube.com/playlist?list=PL-wATfeyAMNqIee7cH3q1bh4QJFAaeNv0. Пару мыслей из него я изложу ниже.
Вообще звук - это последовательность волн пониженного и повышенного давления воздуха. В формате wav он так и записывается - просто последовательность чисел, значений давления, с частотой (обычно) 44К чисел в секунду. Но анализировать его в таком виде не очень удобно.
Проще всего выделить в звуке громкость (это амплитуда колебаний) и тон (это их частота). Но звук, состоящий из единственной частоты (тупо одна синусоида) - это характерное "электронное" гудение, а "нормальные" звуки содержат кучу частот одновременно. В шумах и шепоте частоты намешаны хаотично, а в звуках голоса и "мелодичных" инструментов основные частоты пропорциональны друг другу. Соотношение различных частот в звуке - часть того, что мы называем тембром.
Чтобы понять, какие частоты вообще в звуке содержатся, его надо разложить в сумму синусоид. Если их фазы заранее известны, это можно сделать чем-то вроде обычной линейной регрессии. Если неизвестны, можно применить преобразование Фурье и вычислить фазы одновременно с коэффициентами амплитуды (если интересно, про преобразование Фурье могу написать подробнее отдельно). Разрезав звук на короткие кусочки и разложив каждый на частоты по отдельности, получаем спектрограмму - картинку, показывающую, как меняется громкость различных частот во времени. Спектрограмму можно скармливать нейросетям или анализировать глазами. При наличии опыта можно читать ее, как нотную запись, и даже различать буквы и слова.
А ещё по спектрограмме можно вычислять более сложные фичи. В типичном звуке голоса много частот, пропорциональных друг другу, а значит, его спектр (после логарифмирования) тоже будет периодическим, и значит, его можно _ещё раз_ разложить в сумму синусоид. Математики назвали такое представление cepstrum (типа spectrum наоборот), а его коэффициенты, MFCC, уже лет 50 являются едва ли не самыми информативными признаками для распознавания речи.
Про все эти фичи (и кучу других) подробно рассказано (и показано) в курсе. Если хотите сразу попробовать анализ звука самостоятельно, берите пакет librosa, и в бой! А если вам интересны какие-то детали, то пишите в комментарии, и я расскажу подробнее (:
Если вы хотите обучить seq2seq модель для текстов - например, переводчик, или парафразер, или болталку для чатбота, или модель для суммаризации - имеет смысл за основу взять большую предобученную text-to-text нейросетку. Одной из самых крутых таких моделей на сегодняшний день является Т5 от Гугла. Она состоит из двунаправленного энкодера (как BERT) и авторегрессионного декодера (как GPT), и потому идеально подходит для задач, где вход значительно отличается от выхода.
Модели T5, обученной специально под русский язык, нету, но есть мультиязычная mT5 на 101 язык. Правда, и по размеру эта модель весьма толста, причем более чем наполовину она состоит из эмбеддингов для токенов, которые в русском языке не встречаются никогда. И если вы хотите добучать mT5 только для русского языка (или, скажем, только для татарского), все неиспользуемые эмбеддинги можно выкинуть, сократив число параметров в модели в 2-3 раза без потери качества. Это я, собственно, на днях и сделал.
Статья с подробностями и кодом: https://towardsdatascience.com/how-to-adapt-a-multilingual-t5-model-for-a-single-language-b9f94f3d9c90
Small и base версии mT5 с русским словарём: https://huggingface.co/cointegrated
P.S. Пишите в комментах, на какую text-to-text задачу вам хотелось бы дообучить T5, и в каком-нибудь из ближайших постов я попробую её для вас приготовить.
Модели T5, обученной специально под русский язык, нету, но есть мультиязычная mT5 на 101 язык. Правда, и по размеру эта модель весьма толста, причем более чем наполовину она состоит из эмбеддингов для токенов, которые в русском языке не встречаются никогда. И если вы хотите добучать mT5 только для русского языка (или, скажем, только для татарского), все неиспользуемые эмбеддинги можно выкинуть, сократив число параметров в модели в 2-3 раза без потери качества. Это я, собственно, на днях и сделал.
Статья с подробностями и кодом: https://towardsdatascience.com/how-to-adapt-a-multilingual-t5-model-for-a-single-language-b9f94f3d9c90
Small и base версии mT5 с русским словарём: https://huggingface.co/cointegrated
P.S. Пишите в комментах, на какую text-to-text задачу вам хотелось бы дообучить T5, и в каком-нибудь из ближайших постов я попробую её для вас приготовить.
Towards Data Science
How to adapt a multilingual T5 model for a single language | Towards Data Science
Load embeddings only for the tokens from your language to reduce model size
Преобразование Фурье - крутой инструмент для обработки сигналов, помогающий распознавать речь, обрабатывать музыкальные записи, и лежащий в основе алгоритмов сжатия jpeg и mp3. И чтобы понять его логику, надо, внезапно, разобраться, как работает возведение в комплексную степень.
По сути, преобразование Фурье - это разложение функции в сумму синусоид с разными частотами и амплитудами. Но если вы откроете формулу, например, в Википедии, вы увидите, что в преобразовании Фурье используются не синусы и косинусы, а комплексная экспонента. Собственно, коэффициент Фурье для частоты w - это корреляция сигнала f(t) с функцией e^(-iwt). Почему оно так работает?
Магия в том, что в комплексной плоскости экспонента - это сумма синуса и косинуса: e^(ix)=cos(x) + i * sin(x) (формула Эйлера). Доказать эту странную связь можно, разложив правую и левую части в ряд Тейлора. А интуитивное доказательство можно прочитать на сайте Романа Парпалака: written.ru/articles/science/complex_exponent. Идея простая: можно подставить комплексный x в приближенную формулу e^x ≈ (1 + x/n)*n, и тогда возведение в комплексную степень сведётся к перемножению комплексных чисел. А мы знаем, что умножение комплексных чисел соответствует повороту их векторов в комплексной плоскости. Поэтому возведение в комплексную степень приводит к "вращению" чисел, а это вращение в проекции на реальную прямую выглядит как колебание.
Не знаю, почему, но меня эта связь между экспонентой и тригонометрическими функциями глубоко впечатляет.
По сути, преобразование Фурье - это разложение функции в сумму синусоид с разными частотами и амплитудами. Но если вы откроете формулу, например, в Википедии, вы увидите, что в преобразовании Фурье используются не синусы и косинусы, а комплексная экспонента. Собственно, коэффициент Фурье для частоты w - это корреляция сигнала f(t) с функцией e^(-iwt). Почему оно так работает?
Магия в том, что в комплексной плоскости экспонента - это сумма синуса и косинуса: e^(ix)=cos(x) + i * sin(x) (формула Эйлера). Доказать эту странную связь можно, разложив правую и левую части в ряд Тейлора. А интуитивное доказательство можно прочитать на сайте Романа Парпалака: written.ru/articles/science/complex_exponent. Идея простая: можно подставить комплексный x в приближенную формулу e^x ≈ (1 + x/n)*n, и тогда возведение в комплексную степень сведётся к перемножению комплексных чисел. А мы знаем, что умножение комплексных чисел соответствует повороту их векторов в комплексной плоскости. Поэтому возведение в комплексную степень приводит к "вращению" чисел, а это вращение в проекции на реальную прямую выглядит как колебание.
Не знаю, почему, но меня эта связь между экспонентой и тригонометрическими функциями глубоко впечатляет.
written.ru
Формула Эйлера и приближенные методы — Сайт Романа Парпалака
Объяснение связи между числами π, e и мнимой единицей на простых и наглядных примерах
Пока я пишу постики про трансформерные языковые модели и про преобразование Фурье, гугловские учёные соединили одно с другим. Эти больные ублюдки просто взяли BERT и заменили self-attention на два преобразования Фурье - и оказалось, что по качеству это близко к берту, а обучается и применяется в разы быстрее, особенно на длинных текстах.
Как это работает? Есть матрица эмбеддингов каждого слова - допустим, 100 слов, и у каждого эмбеддинг размера 512. Сначала делается fast Fourier transform (FFT) вдоль каждого эмбеддинга, т.е. мы вычисляем его спектр. Потом делается ещё одно FFT вдоль длины последовательности, т.е. спектры эмбеддингов токенов перемешиваются друг с другом, и переносятся из "frequency domain" снова в "time domain". Похоже на MFCC, только двумерное. И вот этот диковинный зверь работает по качеству сопоставимо с self attention. Кажется, авторы статьи сами не до конца понимают, почему так получается (:
https://arxiv.org/abs/2105.03824
Как это работает? Есть матрица эмбеддингов каждого слова - допустим, 100 слов, и у каждого эмбеддинг размера 512. Сначала делается fast Fourier transform (FFT) вдоль каждого эмбеддинга, т.е. мы вычисляем его спектр. Потом делается ещё одно FFT вдоль длины последовательности, т.е. спектры эмбеддингов токенов перемешиваются друг с другом, и переносятся из "frequency domain" снова в "time domain". Похоже на MFCC, только двумерное. И вот этот диковинный зверь работает по качеству сопоставимо с self attention. Кажется, авторы статьи сами не до конца понимают, почему так получается (:
https://arxiv.org/abs/2105.03824
На днях учёные из Фейсбука опубликовали статью про распознавание речи без учителя. То есть: чтобы обучить модель транскрибировать речь в текст, их методу нужно только много аудиозаписей речи (без аннотаций) и много текста, никак не привязанного к этой речи. И ещё тулза, конвертирующая текст в фонетическую запись. Закинув всё это в волшебный чёрный ящик, получают 94% верно распознанных фонем для английского (на уровне supervised SOTA 2017 года), и 85% - для малоресурсных языков типа татарского и киргизского. Как это работает?
Хитрость 1. Модель wav2vec 2.0, которая работает примерно как BERT для аудио. Запись нарезается на кусочки по 25 миллисекунд, одна модель (свёрточная) вычисляет их векторные представления, другая относит каждый кусочек к одной из возможных групп, а третья (трансформер) пытается предсказать выбранную группу по контексту (соседним кусочкам). Представления, выученные трансформером, оказываются полезными для дальнейшей расшифровки речи.
Хитрость 2. Переход к более длинным кусочкам. Над 25-миллисекундными сегментами делают обычную k-means кластеризацию, и соседние сегменты, оказавшиеся в одном кластере, склеивают в большие куски - потенциальные фонемы. Представление каждого куска считают как средний вектор всех кусочков в её составе, сжатый с помощь обычного же PCA в более короткий вектор.
Хитрость 3: GAN на фонемах. Одна свёрточная нейросеть (генератор) принимает на вход последовательность закодированных кусков аудио, а выдаёт последовательность фонем. Сначала она, конечно, не знает, какие фонемы выдавать, и предсказывает всякий трэш. Но вторая свёрточная сеть (дискриминатор) учится отличать этот трэш от нормальных текстов, сконвертированных в фонемы - и сначала делает это успешно. Но задача генератора - выдавать такие тексты, которые дискриминатор принимает за реальные, и обучаясь этому, он "нечаянно" начинает использовать свои входные данные (представления речи) и расшифровывать текст из них. Обучается эта сладкая парочка 12 часов на одной видеокарте.
Не знаю, велика ли прикладная ценность у этого подхода, но сам факт, что можно обучить модель для распознавания речи, не имея аннотаций - приколен.
Подробности можно почитать в постах FAIR: https://ai.facebook.com/blog/wav2vec-unsupervised-speech-recognition-without-supervision
https://ai.facebook.com/blog/wav2vec-20-learning-the-structure-of-speech-from-raw-audio
Хитрость 1. Модель wav2vec 2.0, которая работает примерно как BERT для аудио. Запись нарезается на кусочки по 25 миллисекунд, одна модель (свёрточная) вычисляет их векторные представления, другая относит каждый кусочек к одной из возможных групп, а третья (трансформер) пытается предсказать выбранную группу по контексту (соседним кусочкам). Представления, выученные трансформером, оказываются полезными для дальнейшей расшифровки речи.
Хитрость 2. Переход к более длинным кусочкам. Над 25-миллисекундными сегментами делают обычную k-means кластеризацию, и соседние сегменты, оказавшиеся в одном кластере, склеивают в большие куски - потенциальные фонемы. Представление каждого куска считают как средний вектор всех кусочков в её составе, сжатый с помощь обычного же PCA в более короткий вектор.
Хитрость 3: GAN на фонемах. Одна свёрточная нейросеть (генератор) принимает на вход последовательность закодированных кусков аудио, а выдаёт последовательность фонем. Сначала она, конечно, не знает, какие фонемы выдавать, и предсказывает всякий трэш. Но вторая свёрточная сеть (дискриминатор) учится отличать этот трэш от нормальных текстов, сконвертированных в фонемы - и сначала делает это успешно. Но задача генератора - выдавать такие тексты, которые дискриминатор принимает за реальные, и обучаясь этому, он "нечаянно" начинает использовать свои входные данные (представления речи) и расшифровывать текст из них. Обучается эта сладкая парочка 12 часов на одной видеокарте.
Не знаю, велика ли прикладная ценность у этого подхода, но сам факт, что можно обучить модель для распознавания речи, не имея аннотаций - приколен.
Подробности можно почитать в постах FAIR: https://ai.facebook.com/blog/wav2vec-unsupervised-speech-recognition-without-supervision
https://ai.facebook.com/blog/wav2vec-20-learning-the-structure-of-speech-from-raw-audio
Meta
wav2vec Unsupervised: Speech recognition without supervision
To enable speech recognition technology for many more languages spoken around the globe, Facebook AI is releasing wav2vec Unsupervised, a new method to train models with no supervision whatsoever. Wav2vec Unsupervised rivals the performance of the best supervised…
Важная новость: экономисты научились пользоваться компьютерами! И хотят 10 июня собраться в оффлайне и поговорить про компьютерные симуляции макроэкономических процессов. Поболтать придут: математик Савватеев (известен просветительскими видосами на ютубе), датасатанист Воронцов (если вы не прошли его вводный курс по машинке, жизни вы не знаете!), милые моему сердцу экономисты Алескеров и Пильник, и менее милый, но тоже родной Пеникас Генрих Йозович. И ещё куча крутых учёных мужей. И в этой компании вы можете выступить тоже!
Теперь формальнее. Инициативная группа Методологического проекта разработки и использования компьютерных симуляций в науке, промышленности и бизнесе (МИЭМ им. А.Н. Тихонова) совместно с Научно-учебной лабораторией моделирования и управления сложными системами (Факультет компьютерных наук) приглашает всех желающих принять участие в работе Круглого стола, посвященного проблематике компьютерных симуляций в исследованиях макроэкономических процессов.
К участию в работе Круглого стола приглашаются экономисты, инженеры, математики и философы-методологи научных экспериментов.
Желающим выступить с докладом (продолжительность не более 20 мин.), просьба до 05 июня выслать название и тезисы доклада отв. секретарю Хамдамову Тимуру на электронную почту: [email protected]
Количество мест в оффлайн и онлайн формате ограничены. Просьба
регистрироваться заранее по ссылке: https://fit-m.timepad.ru/event/1659290/
Дата и время начала:
10 июня, Четверг
10:30 –начало трансляции
Ссылка на публичную трансляцию:
https://www.youtube.com/watch?v=m45NCn6v5yE
Ссылка на страницу анонса Круглого стола: https://miem.hse.ru/fitm/announcements/473030549.html
Может быть не очень понятно, для чего вам нужны симуляции макроэкономических процессов. Но в такой хорошей компании - не всё ли равно?
Теперь формальнее. Инициативная группа Методологического проекта разработки и использования компьютерных симуляций в науке, промышленности и бизнесе (МИЭМ им. А.Н. Тихонова) совместно с Научно-учебной лабораторией моделирования и управления сложными системами (Факультет компьютерных наук) приглашает всех желающих принять участие в работе Круглого стола, посвященного проблематике компьютерных симуляций в исследованиях макроэкономических процессов.
К участию в работе Круглого стола приглашаются экономисты, инженеры, математики и философы-методологи научных экспериментов.
Желающим выступить с докладом (продолжительность не более 20 мин.), просьба до 05 июня выслать название и тезисы доклада отв. секретарю Хамдамову Тимуру на электронную почту: [email protected]
Количество мест в оффлайн и онлайн формате ограничены. Просьба
регистрироваться заранее по ссылке: https://fit-m.timepad.ru/event/1659290/
Дата и время начала:
10 июня, Четверг
10:30 –начало трансляции
Ссылка на публичную трансляцию:
https://www.youtube.com/watch?v=m45NCn6v5yE
Ссылка на страницу анонса Круглого стола: https://miem.hse.ru/fitm/announcements/473030549.html
Может быть не очень понятно, для чего вам нужны симуляции макроэкономических процессов. Но в такой хорошей компании - не всё ли равно?
fit-m.timepad.ru
Круглый стол "Компьютерные симуляции в исследовании макроэкономических процессов" / События на TimePad.ru
Инициативная группа Методологического проекта разработки и использования компьютерных симуляций в науке, промышленности и бизнесе (МИЭМ им. А.Н. Тихонова) совместно с Научно-учебной лабораторией моделирования и управления сложными системами (Факультет компьютерных…
Я как-то давно писал о дисбалансе классов в задачах ML (habr.com/ru/post/349078) и объяснял, почему чаще всего перебалансировать ничего не надо. А позавчера Александр Дьяконов написал примерно о том же, но более понятно и обоснованно, чем я 🙃. Рекомендую к прочтению: https://dyakonov.org/2021/05/27/imbalance/
А ещё у него приятный канал https://t.iss.one/smalldatascience
А ещё у него приятный канал https://t.iss.one/smalldatascience
Хабр
Нужно ли бояться несбалансированности классов?
В сети есть множество постов и ресурсов, которые учат нас бороться с несбалансированностью классов (class imbalance) в задаче классификации. Обычно они предлагают методы сэмплирования: искусственно...
Я тут недавно talkнул рассказ про предобученные языковые модели для русского языка. Получилось длинновато, но, кажется, содержательно. Приглашаю к просмотру: https://youtu.be/YHgOFKmx8qo
YouTube
Давид Дале - Предобученные модели для русского языка
Поговорим про особенности, ограничения и рецепты использования русского BERT. Обсудим опыт дистилляции BERT и сжатия fastText. Разберёмся, какая магия нужна, чтобы заставить GPT от Сбера генерировать нужный вам текст, и почему с T5 то же самое можно сделать…
На всякий случай напомню, что игра, начатая в марте, всё ещё в силе. Задавайте в комментариях вопросы по математике, машинке, анализу данных и смыслу жизни, а мы будем на них отвечать. А на темы самых интересных вопросов будут не менее интересные посты 🙃
Ещё в апреле поступил вопрос: как искать научные статьи, отвечающие на определенные вопросы, типа "в каком диапазоне бывает инкубационный период ковида у людей". На эту тему в прошлом году было соревнование на Кэггле: из огромного датасета статей нужно было отбирать релевантные, отвечающие на определённые вопросы по ковиду. Вот одна из задач этого соревнования: https://www.kaggle.com/allen-institute-for-ai/CORD-19-research-challenge/tasks?taskId=568
Сам я в нём не участвовал, но поделюсь чужим решением, которое, несмотря на свою простоту, вполне справляется с задачей. Оказывается, достаточно старинного пайплайна из информационного поиска: выделить информативные слова из запроса (в блокноте это сделали вручную, но есть и рабочие автоматические методы), нормализовать их (стемминг), и отсортировать статьи по встречаемости ключевых слов в абстракте. Дёшево и сердито.
Вот блокнот с решением: https://www.kaggle.com/mlconsult/transmission-incubation-and-environment-2-0
Сам я в нём не участвовал, но поделюсь чужим решением, которое, несмотря на свою простоту, вполне справляется с задачей. Оказывается, достаточно старинного пайплайна из информационного поиска: выделить информативные слова из запроса (в блокноте это сделали вручную, но есть и рабочие автоматические методы), нормализовать их (стемминг), и отсортировать статьи по встречаемости ключевых слов в абстракте. Дёшево и сердито.
Вот блокнот с решением: https://www.kaggle.com/mlconsult/transmission-incubation-and-environment-2-0
Kaggle
COVID-19 Open Research Dataset Challenge (CORD-19)
An AI challenge with AI2, CZI, MSR, Georgetown, NIH & The White House
Попробовал собрать маленький англо-русский BERT, используя несколько моделей с качественными эмбеддингами предложений как учителей. Получилось любопытно.
Пост: https://habr.com/ru/post/562064
Модель: https://huggingface.co/cointegrated/rubert-tiny
Пост: https://habr.com/ru/post/562064
Модель: https://huggingface.co/cointegrated/rubert-tiny
Хабр
Маленький и быстрый BERT для русского языка
BERT – нейросеть, способная неплохо понимать смысл текстов на человеческом языке. Впервые появившись в 2018 году, эта модель совершила переворот в компьютерной лингвистике. Базовая версия модели долго...
Прочитал сегодня лекцию для школьников и молодых студентов в одном из Томских университетов. Получилось поговорить обо всём сразу, от общих принципов ML до стратегий изучения английского языка. Не знаю, насколько годный получился контент, но на всякий случай выложу.
https://www.youtube.com/watch?v=LIhYXOcumns
https://www.youtube.com/watch?v=LIhYXOcumns
YouTube
«Умные недели» Лекция Давида Сергеевича Дале
26 июня в 10:00 состоится лекция «Как машинное обучение помогает роботам выдавать кредиты, закаливать стальные трубы и говорить с людьми на человеческом языке – и как в этом поучаствовать». Лекцию проведёт Давид Сергеевич Дале, старший инженер-исследователь…
Автоматическое перефразирование текстов может быть полезно в куче задач, от рерайтинга текстов до аугментации данных. В прикрепленном посте я собрал русскоязычные корпуса и модели парафраз, а также попробовал создать собственный корпус, обучить свою модель для перефразирования, и собрать набор автоматических метрик для оценки их качества.
В итоге оказалось, что модель для перевода перефразирует лучше, чем специализированные модели. Но, по крайней мере, стало более понятно, чего вообще от автоматического перефразирования можно хотеть и ожидать.
https://habr.com/ru/post/564916
В итоге оказалось, что модель для перевода перефразирует лучше, чем специализированные модели. Но, по крайней мере, стало более понятно, чего вообще от автоматического перефразирования можно хотеть и ожидать.
https://habr.com/ru/post/564916
Хабр
Перефразирование русских текстов: корпуса, модели, метрики
Введение Русский язык велик и могуч, и компьютерные лингвисты уже много лет пытаются алгоритмизировать это богатство. Ещё в 1970-х Мельчук предложил концепцию "Смысл-текст", где ультимативная языковая...
Каждый день современному человеку приходится принимать десятки различных решений. Некоторые из них даются нам легко, а другие, наоборот, вызывают стресс и негативные эмоции. А задумывались ли когда-нибудь, как принимать решения правильно? Сегодня на этот вопрос можно ответить благодаря теории игр или разделу математики, который направлен на изучение оптимальных стратегий.
2-ого июля в стенах ВШЭ и на онлайн трансляции пройдут две открытых лекции от выдающихся математиков и специалистов по теории игр – Алексея Савватаева и Бориса Демешева!
Когда: 2 июля, Пятница, 10:30 – 14:00
Где: Покровский бульвар, 11, аудитория R207 или онлайн по ссылке на публичную трансляцию.
Пожалуйста, если вы хотите посетить мероприятие оффлайн, то зарегистрируйтесь на него заранее, потому что количество мест ограничено.
Ссылка на регистрацию:
https://miem.hse.ru/fitm/announcements/477323127.html
Ссылка на публичную трансляцию:
https://www.youtube.com/watch?v=hI2lKNp8H9U
До встречи!
2-ого июля в стенах ВШЭ и на онлайн трансляции пройдут две открытых лекции от выдающихся математиков и специалистов по теории игр – Алексея Савватаева и Бориса Демешева!
Когда: 2 июля, Пятница, 10:30 – 14:00
Где: Покровский бульвар, 11, аудитория R207 или онлайн по ссылке на публичную трансляцию.
Пожалуйста, если вы хотите посетить мероприятие оффлайн, то зарегистрируйтесь на него заранее, потому что количество мест ограничено.
Ссылка на регистрацию:
https://miem.hse.ru/fitm/announcements/477323127.html
Ссылка на публичную трансляцию:
https://www.youtube.com/watch?v=hI2lKNp8H9U
До встречи!
Мы запускаем двухмесячный интенсив по ML-прототипированию. В программе: куча онлайн лекций и семинаров, офлайн нетворкинг, и работа над своими проектами. Задумка в том, чтобы научится быстро и безболезненно проходить путь от невнятной идеи высокотехнологичного продукта до его работающего прототипа. По пути придется погрузить лапы в классическую веб-разработку, майнинг данных, машинное обучение и продуктовые эксперименты.
Полноценным фулстек-стартапером вы за два месяца, наверное, не станете, но из состояния "я хочу сделать продукт на основе машинлёрнинга, но у меня лапки" выйти точно получится. А для тех, кто чувствует себя совсем неуверенно с программированием и математикой, мы собрали предварительный двухнедельный крэш-курс по основам основ.
Будет дорого и круто, приходите)
https://maths-h.com/ru/mlprototype
Полноценным фулстек-стартапером вы за два месяца, наверное, не станете, но из состояния "я хочу сделать продукт на основе машинлёрнинга, но у меня лапки" выйти точно получится. А для тех, кто чувствует себя совсем неуверенно с программированием и математикой, мы собрали предварительный двухнедельный крэш-курс по основам основ.
Будет дорого и круто, приходите)
https://maths-h.com/ru/mlprototype
Maths-H
Курс по ML-прототипированию
Forwarded from Мathshub (Aira)
В понедельник 26 июля прошёл вебинар по ML-прототипированию. Мы надеемся, что вы смогли разобрать основные вопросы.
Запись трансляции в YouTube
Слайды презентации вебинара
Оставьте отзыв по качеству вебинара — это поможет нам поработать над качеством организации и контента.
Мы повторим вебинар в августе и планируем ещё больше ивентов, материалов по теме — оставайтесь с нами.
Запись трансляции в YouTube
Слайды презентации вебинара
Оставьте отзыв по качеству вебинара — это поможет нам поработать над качеством организации и контента.
Мы повторим вебинар в августе и планируем ещё больше ивентов, материалов по теме — оставайтесь с нами.
YouTube
Вебинар по ML-прототипированию
Курс по ML-прототипированию. Кол-в мест ограничено:
https://maths-h.com/ru/mlprototype
Старт вебинара: https://youtu.be/f2kXyMCsn4A?t=1811
Полезные ссылки:
— про BERT https://arxiv.org/abs/1810.04805
— про GPT-3 https://openai.com/blog/openai-api/
Тг…
https://maths-h.com/ru/mlprototype
Старт вебинара: https://youtu.be/f2kXyMCsn4A?t=1811
Полезные ссылки:
— про BERT https://arxiv.org/abs/1810.04805
— про GPT-3 https://openai.com/blog/openai-api/
Тг…
Всем привет!
17 августа мы проводим бесплатный воркшоп по ML-прототипированию. Покажем, как за пару часов можно собрать MVP продукта, использующего машинное обучение, и поговорим о том, как его можно дальше развивать. Регистрируйтесь и приходите, будет интересно)
https://mathshub.timepad.ru/event/1728260/?utm_refcode=255bbce96f88bcbca2fceafa810afa40eccf1332
17 августа мы проводим бесплатный воркшоп по ML-прототипированию. Покажем, как за пару часов можно собрать MVP продукта, использующего машинное обучение, и поговорим о том, как его можно дальше развивать. Регистрируйтесь и приходите, будет интересно)
https://mathshub.timepad.ru/event/1728260/?utm_refcode=255bbce96f88bcbca2fceafa810afa40eccf1332
mathshub.timepad.ru
Как запустить прототип IT-проекта на машинном обучении и привлечь инвесторов / События на TimePad.ru
Приглашаем на бесплатный вебинар по созданию ML-прототипа с нуля и разбору примера построения и обучения рекомендательной системы
Хочу рассказать про Gumbel straight-through estimator, ибо я сам его наконец-то понял 🙈
Этот трюк пропускает градиент через дискретное представление, а что это такое, я сейчас объясню. Например, мы хотим обучить GAN: генератор порождает контент, дискриминатор оценивает его качество, и генератор обновляет свои веса в направлении улучшения качества. Это хорошо работает с картинками, потому что они непрерывные: генератор может на эпсилон подкрутить цвет каждого пикселя и картинка чуть улучшится. Математически это возможно потому, что мы можем взять производную сгенерированной картинки по параметрам генератора, и делать с её помощью градиентный шаг.
А как быть, если наш генератор генерирует тексты? Проблема текста, что он - тупо последовательность слов. У каждого слова есть какой-то номер в словаре, и фраза, например, "привет мир" может кодироваться как [14050, 5840, 1] (здесь единичка - это символ конца текста). И вот как это дифференцировать? Следите за руками!
1. Превращаем текст в sparse представление: матрицу размера (text_length, vocab_size), с единицами в позициях соответствующих слов, и нулями в остальных местах. Такая матрица выглядит уже чуть более дифференцировабельной. Но какая у неё может быть производная?
2. Вообще-то генератор текста сэмплирует его из предсказанного им распределения: softmax(logits), где logits - предсказания генератора. Их-то мы точно умеем дифференцировать, а вот оператор случайного выбора - недифференцируемый.
3. Оказывается, существует распределение Гумбеля, обладающее полезным свойством: распределения величин sample(softmax(logits)) и argmax(logits + gumbel_random()) - совпадают! В первом случае мы считаем вероятности каждого токена и случайно выбираем токен в соответствии с этими вероятностями. Во втором мы к скору каждого токена прибавляем гумбелевскую случайную величину, и выбираем токен с максимальным результатом. И эти процедуры - эквивалентны.
4. argmax всё ещё не дифференцируемая функция, но дифференцируемо её приближение: softmax. Получается, наша разреженная матрица hard_scores из пункта (1) примерно равна soft_scores=softmax(logits + gumbel_random()), и производную этой штуки мы уже умеем вычислять.
5. Как использовать матрицу hard_scores, прилепив к ней производную матрицы soft_scores? В pytorch это делается так: вычтем из разреженной матрицы приближенную, сбросим градиент этой разницы, и потом прибавим приближенную матрицу обратно. То есть выдадим (hard_scores - soft_scores).detach() + soft_scores.
Собственно, вот исходный код этой нечисти: https://pytorch.org/docs/stable/_modules/torch/nn/functional.html#gumbel_softmax. Там ещё используется температура в софтмаксе: чем она меньше, тем ближе softmax к argmax. С подбором температуры для этого кейса я не экспериментировал, но если экспериментировали вы, то делитесь своими находками в комментах)
Этот трюк пропускает градиент через дискретное представление, а что это такое, я сейчас объясню. Например, мы хотим обучить GAN: генератор порождает контент, дискриминатор оценивает его качество, и генератор обновляет свои веса в направлении улучшения качества. Это хорошо работает с картинками, потому что они непрерывные: генератор может на эпсилон подкрутить цвет каждого пикселя и картинка чуть улучшится. Математически это возможно потому, что мы можем взять производную сгенерированной картинки по параметрам генератора, и делать с её помощью градиентный шаг.
А как быть, если наш генератор генерирует тексты? Проблема текста, что он - тупо последовательность слов. У каждого слова есть какой-то номер в словаре, и фраза, например, "привет мир" может кодироваться как [14050, 5840, 1] (здесь единичка - это символ конца текста). И вот как это дифференцировать? Следите за руками!
1. Превращаем текст в sparse представление: матрицу размера (text_length, vocab_size), с единицами в позициях соответствующих слов, и нулями в остальных местах. Такая матрица выглядит уже чуть более дифференцировабельной. Но какая у неё может быть производная?
2. Вообще-то генератор текста сэмплирует его из предсказанного им распределения: softmax(logits), где logits - предсказания генератора. Их-то мы точно умеем дифференцировать, а вот оператор случайного выбора - недифференцируемый.
3. Оказывается, существует распределение Гумбеля, обладающее полезным свойством: распределения величин sample(softmax(logits)) и argmax(logits + gumbel_random()) - совпадают! В первом случае мы считаем вероятности каждого токена и случайно выбираем токен в соответствии с этими вероятностями. Во втором мы к скору каждого токена прибавляем гумбелевскую случайную величину, и выбираем токен с максимальным результатом. И эти процедуры - эквивалентны.
4. argmax всё ещё не дифференцируемая функция, но дифференцируемо её приближение: softmax. Получается, наша разреженная матрица hard_scores из пункта (1) примерно равна soft_scores=softmax(logits + gumbel_random()), и производную этой штуки мы уже умеем вычислять.
5. Как использовать матрицу hard_scores, прилепив к ней производную матрицы soft_scores? В pytorch это делается так: вычтем из разреженной матрицы приближенную, сбросим градиент этой разницы, и потом прибавим приближенную матрицу обратно. То есть выдадим (hard_scores - soft_scores).detach() + soft_scores.
Собственно, вот исходный код этой нечисти: https://pytorch.org/docs/stable/_modules/torch/nn/functional.html#gumbel_softmax. Там ещё используется температура в софтмаксе: чем она меньше, тем ближе softmax к argmax. С подбором температуры для этого кейса я не экспериментировал, но если экспериментировали вы, то делитесь своими находками в комментах)
Привет! Пост не про математику, но мне очень надо (:
Мне нужно потестировать одного игрового бота в Телеге.
Игра — бродилка по лабиринту, причем вы там будете встречаться с другими участниками. Поэтому тестировать надо одновременно. Предлагается сделать это завтра примерно с 11 до 12.
Если вы готовы помочь, вступайте в чатик https://t.iss.one/joinchat/2rO7ios4NuA3Yjdi, там будут инструкции.
Мне нужно потестировать одного игрового бота в Телеге.
Игра — бродилка по лабиринту, причем вы там будете встречаться с другими участниками. Поэтому тестировать надо одновременно. Предлагается сделать это завтра примерно с 11 до 12.
Если вы готовы помочь, вступайте в чатик https://t.iss.one/joinchat/2rO7ios4NuA3Yjdi, там будут инструкции.
Сегодня выкатилась scikit-learn==1.0.0, и в ней - квантильная линейная регрессия
Когда я рассказываю новичкам про регрессию, меня обычно спрашивают, почему мы минимизируем сумму квадратов ошибок, а не их модулей? Я отвечаю "так принято" и говорю что-то про дифференцируемость всюду и про то, что одна большая ошибка критичнее нескольких маленьких. Но аргумент с ошибками применим не всегда (особенно если в данных есть выбросы), и есть куча методов оптимизации, которые плевать хотели на производную в нуле. Таки что получится, если минимизировать сумму модулей ошибок?
А получится предсказание медианы. Ибо сумма модулей ошибок минимальна, когда половина ошибок - отрицательные, а половина - положительные. А если минимизировать, например, 0.9 модулей положительных ошибок плюс 0.1 модулей отрицательных ошибок, то в результате получится 90% квантиль. Поэтому такая модель и называется "квантильная регрессия".
Запускается это очень просто:
Как понять, что квантильная регрессия предпочтительнее классической?
- Ваша целевая метрика - MAE, а не RMSE или R^2.
- В данных есть выбросы, и вы не хотите, чтобы они слишком влияли на результат.
- Вам важнее правильно предсказать медиану, чем среднее арифметическое.
- Большие и маленькие ошибки одинаково важны: например, одна ошибка в 300 рублей для вас не более плачевна, чем три ошибки в 100 рублей.
- Важность ошибок несимметричная, например, ошибка -100 гораздо хуже, чем ошибка +100. Тогда вам может быть полезно предсказывать квантиль, отличную от 50%.
- Вы хотите доверительный интервал для вашего предсказания, но не хотите завязываться на допущение, что ошибки распределены нормально с одинаковой дисперсией. Тогда вы можете просто предсказать, например, 5% и 95% квантили отдельными формулами.
- Ваши данные гетероскедастичные, т.е. дисперсия ошибок в разных частях выборки разная. И при этом вы хотите, чтобы модель одинаково усердно старалась предсказывать и в зонах высокой дисперсии, и в зонах низкой.
Примеры кода, картинки и дополнительные рассуждения вы можете посмотреть в документации: https://scikit-learn.org/stable/auto_examples/linear_model/plot_quantile_regression.html
Собственно, идея имплементировать квантильную регрессию в sklearn пришла мне ещё в 2017, когда я начал переодеваться из аналитиков в кодеры. Тогда я закодил свой градиентный спуск, и работал он не очень стабильно, а занятые ревьюеры sklearn давали свой фидбек очень долго. И в результате я погрузился в свою работу и забил. А в этом году я решил добить этот пул-реквест, и пересадил его на scipy.linprog: он масштабируется не так хорошо, как градиентный спуск, зато гарантированно сходится за не очень большое число итераций. Совместными усилиями с активистами sklearn мы привели пул-реквест в порядок и катнули, а сегодня выехала версия sklearn, в которую он вошёл.
Когда я рассказываю новичкам про регрессию, меня обычно спрашивают, почему мы минимизируем сумму квадратов ошибок, а не их модулей? Я отвечаю "так принято" и говорю что-то про дифференцируемость всюду и про то, что одна большая ошибка критичнее нескольких маленьких. Но аргумент с ошибками применим не всегда (особенно если в данных есть выбросы), и есть куча методов оптимизации, которые плевать хотели на производную в нуле. Таки что получится, если минимизировать сумму модулей ошибок?
А получится предсказание медианы. Ибо сумма модулей ошибок минимальна, когда половина ошибок - отрицательные, а половина - положительные. А если минимизировать, например, 0.9 модулей положительных ошибок плюс 0.1 модулей отрицательных ошибок, то в результате получится 90% квантиль. Поэтому такая модель и называется "квантильная регрессия".
Запускается это очень просто:
#! pip install --upgrade scikit-learn
from sklearn.linear_model import QuantileRegressor
model = QuantileRegressor().fit(X,y)
Как понять, что квантильная регрессия предпочтительнее классической?
- Ваша целевая метрика - MAE, а не RMSE или R^2.
- В данных есть выбросы, и вы не хотите, чтобы они слишком влияли на результат.
- Вам важнее правильно предсказать медиану, чем среднее арифметическое.
- Большие и маленькие ошибки одинаково важны: например, одна ошибка в 300 рублей для вас не более плачевна, чем три ошибки в 100 рублей.
- Важность ошибок несимметричная, например, ошибка -100 гораздо хуже, чем ошибка +100. Тогда вам может быть полезно предсказывать квантиль, отличную от 50%.
- Вы хотите доверительный интервал для вашего предсказания, но не хотите завязываться на допущение, что ошибки распределены нормально с одинаковой дисперсией. Тогда вы можете просто предсказать, например, 5% и 95% квантили отдельными формулами.
- Ваши данные гетероскедастичные, т.е. дисперсия ошибок в разных частях выборки разная. И при этом вы хотите, чтобы модель одинаково усердно старалась предсказывать и в зонах высокой дисперсии, и в зонах низкой.
Примеры кода, картинки и дополнительные рассуждения вы можете посмотреть в документации: https://scikit-learn.org/stable/auto_examples/linear_model/plot_quantile_regression.html
Собственно, идея имплементировать квантильную регрессию в sklearn пришла мне ещё в 2017, когда я начал переодеваться из аналитиков в кодеры. Тогда я закодил свой градиентный спуск, и работал он не очень стабильно, а занятые ревьюеры sklearn давали свой фидбек очень долго. И в результате я погрузился в свою работу и забил. А в этом году я решил добить этот пул-реквест, и пересадил его на scipy.linprog: он масштабируется не так хорошо, как градиентный спуск, зато гарантированно сходится за не очень большое число итераций. Совместными усилиями с активистами sklearn мы привели пул-реквест в порядок и катнули, а сегодня выехала версия sklearn, в которую он вошёл.
scikit-learn
Quantile regression
This example illustrates how quantile regression can predict non-trivial conditional quantiles. The left figure shows the case when the error distribution is normal, but has non-constant variance, ...
👍1🙏1