Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Привет, Хабр! Продолжаем публиковать рецензии на научные статьи от членов сообщества Open Data Science из канала #article_essense. Хотите получать их раньше всех — вступайте в сообщество!
Статьи на сегодня:
- Poly-encoders: Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring (Facebook, 2019)
- Implicit Discriminator in Variational Autoencoder (Indian Institute of Technology Ropar, 2019)
- Self-training with Noisy Student improves ImageNet classification (Google Research, Carnegie Mellon University, 2019)
- Momentum Contrast for Unsupervised Visual Representation Learning (Facebook, 2019)
- Benchmarking Neural Network Robustness to Common Corruptions and Perturbations (University of California, Oregon State University, 2019)
- DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter (Hugging Face, 2019)
- Plug and Play Language Models: A Simple Approach To Controlled Text Generation (Uber AI, Caltech, HKUST, 2019)
- Deep Salience Representation for F0 Estimation in Polyphonic Music ( New York University, USA, 2017)
- Analyzing and Improving the Image Quality of StyleGAN (NVIDIA, 2019)
- Июль — Сентябрь 2019
- Январь — Июнь 2019
- Февраль — Март 2018
- Декабрь 2017 — Январь 2018
- Октябрь — Ноябрь 2017
- Сентябрь 2017
- Август 2017
1. Poly-encoders: Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring
Авторы статьи: Samuel Humeau, Kurt Shuster, Marie-Anne Lachaux, Jason Weston (Facebook, 2019)
→ Оригинал статьи
Автор обзора: Алексей (в слэке zhirzemli)
TLDR
В статье предлагается новый подход к скорингу пар предложений (высказываний). Данная процедура актуальна в задачах прогнозирования соответствия ответа условному контексту, а также в задачах типа next sentense prediction. Предложенный метод Poly-Encoder сравнивается с Bi-Encoder и Cross-Encoder стратегиями. Метод сочетает в себе преимущество Bi-Encoder (возможность кешировать представления ответов) и Cross-Encoder (не безусловное обучение context и answer кодировщиков)
Multi-sentence Scoring
(Небольшая напоминалка про Bi и Cross Encoder подходы. Для тех, кто знаком, можно пропустить)
Задача определения соответствия контекста (пользовательский запрос или высказывание) набору существующих ответов по большей части актуальна в диалоговых и information-retrieval системах. Решается либо нахождением некоторого скора (dot product) между закодированными представлениями контекста и ответа, либо совместным кодированием контекста и ответа в один вектор с последующей линейной трансформацией в скаляр.
Первый подход называется Bi-Encoder и очевидным преимуществом такого метода является возможность offline-подсчёта представлений всех доступных ответов. Эти представления кешируются, и во время инференса необходимо лишь найти вектор запроса, сделать dot product с векторами ответов и отранжировать результат. Кроме того, такой подход позволяет эффективнее производить negative sampling на этапе обучения. А именно, в рамках каждого батча считаются представления для позитивных сэмплов, а негативные примеры можно взять прямо из этого же батча. По сути, переиспользовать forward pass для позитивных и негативных примеров. Недостатком Bi-Encoder подхода является тот факт, что представления контекста и ответа учатся почти независимо. Единственная точка, где возможен хоть какой-то information flow между представлениями запроса и ответа — это боттлнек в виде финального dot product’а. На уровне каких-либо текстовых признаков информация не шарится.
Второй подход — Cross-Encoder. Предполагает более мощное взаимодействие контекста и ответа в процессе обучения и инференса. Здесь последовательности токенов запроса и ответа конкатенируются в одну. Между ними ставится специальный токен-разделитель, а также к каждой части (запрос, ответ) добавляется специальный эмбеддинг. По сути, этот эмбеддинг сдвигает на некоторую константу входные представления токенов ответа, чтобы модель могла проще отличить их от токенов запроса. В итоге, модель учится находить совместное представление запроса и ответа, такое, что финальный линейный слой (вектор -> скаляр) возвращает большое logits-значение для пар предложений, соответствующих друг другу и маленькое значение в противном случае. Недостатком такого подхода является невозможность offline-подсчёта представлений ответов: они должны быть оценены на этапе инференса, совместно с условным набором токенов запроса. Также, здесь уже не сработает трюк с переиспользованием представлений негативных и позитивных примеров на этапе обучения. Негативные сэмплы придётся набирать до формирования батча.
Мотивация
Далее предлагается решение, которое позволяет нивелировать недостатки и объединить достоинства Bi и Cross Encoder подходов. Идея такая, что мы хотим обучить кодировщик, который с одной стороны будет учитывать условную зависимость токенов ответа от токенов запроса, а с другой стороны, утилизация этой зависимости должна происходить на заранее оцененных представлениях ответа и запроса. Геометрически лично я себе представляю это примерно так: сместить боттлнек (финальный dot product двух представлений) чуть ниже в сеть. Создать некоторую интеракцию между представлениями запроса и ответа. В то же самое время, реализовать подобную интеракцию не слишком далеко от финального слоя, чтобы основная часть кодировщика запроса оставалась независимой от кодировщика ответа.
Имплементация
Реализация такой задумки вполне себе простая: кодировщик кандидатов работает как и в случае с Bi-Encoder: мы получаем представление последовательности в векторном виде ([CLS]-токен) при помощи transformer-based модели (BERT). Эти представления мы закешируем после обучения модели.
Кодировщик контекста, в свою очередь, не сжимает представление входной последовательности в один вектор. Здесь мы оставляем все вектора последовательности, закодированные моделью.
Для того, чтобы получить оценку соответствия контекста (набора векторов) и кандидата (одного вектора) применяется механизм внимания. Вектор кандидата в данном случае является запросом, а вектора контекста — ключами. Считается dot product и далее — softmax по получившимся значениям. Вектора контекста взвешиваются полученным распределением и складываются. В итоге, мы получаем представление контекста в виде одного вектора. И далее, как и в обычном Bi-Encoder считаем dot product контекста и кандидата.
Также, в статье был предложен ряд способов по ускорению взвешивания векторов контекста. Наиболее рабочим вариантом оказался такой процесс подсчёта внимания, при котором брались лишь m первых векторов последовательности контекста.
Результаты
По итогу оказалось, что Cross-Encoder по-прежнему работает лучше всех. Но Poly-Encoder не сильно от него отстает в плане метрик качества, а в плане скорости инференса работает в сотни раз быстрее.
2. Implicit Discriminator in Variational Autoencoder
Авторы статьи: Prateek Munjal, Akanksha Paul, Narayanan C. Krishnan (Indian Institute of Technology Ropar, 2019)
→ Оригинал статьи
Автор обзора: Алекс Широн (в слэке shiron8bit)
В статье авторы предложили архитектуру, которая пытается совместить в себе преимущества VAE и GAN-подходов для генерации изображений, минуя свойственные каждому из подходов недостатки: размытость в случае автоэнкодеров, mode collapse/ mode missing в случае adversarial-обучения. Добиваются они этого за счет общих весов между энкодером и дискриминатором и общим генератором/декодером, что, во-первых, уменьшает количество весов сети, а во-вторых, позволяет получать от дискриминатора через градиенты полезную информацию в случае, если генератор/декодер не попадает в реальное распределение данных.
Вводная часть
В задачах генерации важную роль играет совпадение распределения генерируемых данных Q с распределением реальных данных P, которое измеряют через дивергенцию Кульбак-Лейблера. Отличительной особенностью этой меры удаленности распределений является то, что она несимметрична. Соответственно, мы будем получать разные картины в зависимости от того, будем ли мы считать Div_KL(P||Q) или Div_KL (Q||P). Если рассмотреть два варианта сравнения распределений (на изображении ниже), то при Div_KL (P||Q) (она же forward-KL, она же zero avoiding) второй вариант будет давать более низкое значение, а для Div_KL(Q||P) (она же backward-KL, она же zero forcing) более близкими распределениями будут считаться распределения из первого варианта. Собственно, этим сильно отличаются результаты VAE и GAN: reconstruction (L2) loss способствует минимизации forward-KL дивергенции (и таким образом мы сохраняем все моды, но получаем размытые изображения), а обучение с дискриминатором способствует минимизации backward-KL дивергенции (изображения получаются более четкие, но есть риск пропуска мод)
Архитектура, лоссы и обучение
Как уже было сказано ранее, авторы предлагают учесть недостатки обоих режимов и соединить обе минимизации за счет архитектуры сети (на картинке ниже), у которой большая часть весов энкодера и дискриминатора общие (раздельными являются только fully connected головы, предсказывающие ‘реальность’ изображения и параметры mu,sigma латентного слоя VAE), а также за счет режима обучения. Энкодер и генератор совпадают.Большинство используемых лоссов достаточно стандартны: в лоссе энкодера L_enc используются L2-ошибка восстановления и дивергенция Кульбака-Лейблера до N(0,1) (L_prior), остальное — adversarial обучение (минимизируем выход дискриминатора при обучении дискриминатора, максимизируем его же при обучении декодера/генератора), но есть 2 отличительных особенности:
В лоссах, связанных с adversarial-обучением, на дискриминатор подаются 2 разных типа сгенерированных данных: восстановленные через энкодер/декодер и сгенерированные генератором/декодером из сэмплов из N(0,1)
В лоссе декодера L_dec есть член, в котором фичи с предпоследнего слоя дискриминатора (еще раз, это последний общий слой между дискриминатором и энкодером) сравниваются для реальных и восстановленных изображений.
Результаты
Авторы сравнили результаты с VAE и с другими работами, так или иначе пытающимися комбинировать VAE и GAN’ы (VAE-GAN, alpha-GAN и AGE от Дмитрия Ульянова и Виктора Лемпицкого) на датасетах celeba и cifar10 (спасибо, что не mnist), получили едва ли не лучшие показатели относительно ошибки реконструкции и метрики Frechet Inception Distance (сравнивает статистики активации предобученной сетки для реальных и сгенерированных изображений). Отдельно было отмечено, что ранжирование по FID сильно зависит от выбранной архитектуры, поэтому результат лучше проверять на ансамбле из ‘экспертов’ (разных архитектур).
3. Self-training with Noisy Student improves ImageNet classification
Авторы статьи: Qizhe Xie, Eduard Hovy, Minh-Thang Luong, Quoc V. Le (Google Research, Carnegie Mellon University, 2019)
→ Оригинал статьи
Автор обзора: Александр Бельских (в слэке belskikh)
Гугл получил совершенно впечатляющие 87.4% топ1 и 98.2% топ5 точности на имаджнете. Заюзали затюненный псевдолейблинг и очень жирные сети. Подход назвали Noisy Student.
Алгоритм примерно такой:
- Берём teacher model, учим на обычный имаджнет.
- Генерим soft psudo labels на изображениях из JFT датасета.
- Учим student model на софт псевдолейблах, причем мешаем как только можем: сильные ауги, дропаут и stochastic depth
- Берём student model, используем её как teacher в п.2 и повторяем процесс.Датасет сбалансировали по классам след образом. Для начала взяли EfficientNet-B0, обученный на имаджнете, прогнали его предикты на JFT датасете. Потом взяли те примеры, по которым макс уверенность выше 0.3. Для каждого класса взяли 130К изображений (если после фильтрации по 0.3 трешхолду их было меньше — дублировали, если больше — брали по наиболее высоким скорам предикта). Получили 130М изображений, выброслии дупликаты, осталось 81М
Архитектуры:
EfficeintNet, причем student модель берут гораздо жирнее teacher модели. Они ещё и саму EfficientNet отскалировали до EfficientNet-L0/L1/L2, получив в итоге L2 модель с 480М параметров (у Резнет50 26М параметров, для сравнения)
Процесс обучения:
Батчсайз 2048. Sota модель L2 учили 350 эпох. Самая большая модель L2 училась в таком режиме 3.5 дня на Cloud TPU v3 Pod с 2048 ядрами.
Итеративная процедура обучения:
Сначала обучили B7 и как студента, и как учителя. Потом, используя B7 как учителя, обучили более жирную L0 как студента. Далее, вот так меняя их местами, добрались уже до L2 модели, которую в конце использовали уже как учитель для такой же L2 модели.Результат: :sota: с в 2 раза меньше параметров моделью по сравнению с предыдущей сотой (FixRes ResNeXt-101 WSL 829M параметров)
Также получили очень хорошие результаты на ImageNet-A/C/P
4. Momentum Contrast for Unsupervised Visual Representation Learning
Авторы статьи: Kaiming He, Haoqi Fan, Yuxin Wu, Saining Xie, Ross Girshick (Facebook, 2019)
→ Оригинал статьи
Автор обзора: Арсений Кравченко (в слэке arsenyinfo)
SotA по unsupervised претрейну для нескольких computer vision задач (от классификации до dense pose estimation), проверена на разных датасетах (imagenet, instagram) и основных задач (imagenet, COCO, cityscapes, LVIS etc.).
Как делают unsupervised pretrain? Придумываем какую-то задачу, для которой не нужны лейблы, учим енкодер, замораживаем его, и потом решаем основную задачу, добавив недостающие слои (линейный для классификации, декодеры для сегментации и так далее). Одна из популярных в этой нише задач — instance discrimination, основанная на contrastive лоссе, т.е. мы хотим, чтобы фичи разных аугментаций одной картинки были близки друг к другу (например, в терминах косинусного расстояния), а фичи разных — далеки.
Можно попробовать учить эту задачу end-to-end, но многое упирается в размер батча: качество сильно зависит от разнообразия примеров внутри батча. Эксперименты показывают, что с увеличением размера батча итоговое качество улучшается. Но батч в чем-то похож на Москву: он не резиновый, увеличивать его в лоб долго не получится.
Предыдущие около-сота чуваки прикрутили memory bank: фичи предыдущих батчей хранились отдельно в памяти и тоже использовались для генерации негативных, т.е. непохожих семплов. Это отчасти помогло, но тоже неидеально: в ходе обучения веса енкодера меняются и старые фичи протухают.
Наконец, идея статьи:
- Давайте заменим простой memory bank на очередь, где будут лежать достаточно свежие фичи;
- Будем держать две версии енкодера: одна используется для текущего батча и обучается, а другая — более стабильная, ее веса обновляются из первой версии, но с большим моментумом;
- Фичи батча считаются первым енкодером, фичи в очереди посчитаны вторым енкодером.
Такой подход дает возможность приблизиться к качеству end-to-end обучения, но, благодаря большой очереди, достигает потенциальных результатов нереально большого батча. Таким образом получаются крутые метрики на разных задачах, в т.ч. кое-где даже чуть лучше, чем традиционный supervised претрейн на имаджнете.
5. Benchmarking Neural Network Robustness to Common Corruptions and Perturbations
Авторы статьи: Dan Hendrycks, Thomas Dietterich (University of California, Oregon State University, 2019)
→ Оригинал статьи
Автор обзора: Владимир Игловиков (в слэке ternaus)
Была принята на ICLR 2019 и как я понимаю, это одна из тех работ по DL, в которой не натренировали ни одной сети.
Задача стояла вот такая — а давайте поприменяем аугментаций к валидации ImageNet, но тренировать будем на непокореженном. Причем, в отличие от adevrsarial у нас нет задачи сделать преобразования малыми и глазу невидимыми.
Что было сделано:
- Был выбран набор аугментаций. Авторы говорят, что это наиболее часто встречаемые, но, на мой взгляд врут.
Они использовали: GaussianNoise, ISONoise, Downscale, Defocus, MotionBlur, ZoomBlur, FrostedGlassBlur, JpegCompression, Snow, Fog, Rain, Elastic transoform, etc. - Все эти перобразования были применены к ImageNet validation. Полученный датасет был назван ImageNet-C
- Также была предложена вариация под названием ImageNet-P в котором к каждой картинке были применены наборы трансформаций разной силы.
- Была предложена метрика для оценки устойчивости модели.
- Была проведена оценка нескольких моделей в разрезе этой метрики: AlexNet, VGG-11, VGG-19, Resnet-50, Resnet-18, VGG-19+BN, etc
Выводы:
- Чем сильнее аугментации тем больше страдает точность модели. :capitan_obvious:
- Чем сложнее модель тем устойчивее.
- Применение CLAHE в картинкам перед inference чуть помогает.
- feature aggregation блоки типа как в DenseNet или Resnext помогают.
- Сети у которых есть multiscale более устойчивы. Пример таких сетей — MSDNet, Multigrid (я про такие не слышал)
Код
6. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
Авторы статьи: Victor Sanh, Lysandre Debut, Julien Chaumond, Thomas Wolf (Hugging Face, 2019)
→ Оригинал статьи
Автор обзора: Юрий Кашницкий (в слэке yorko)
Статья короткая, читается очень просто. В начале немного общих слов про гонку вооружений в NLP и environmental footprint. Далее идея дистилляции (и тут не без Хинтона обошлось).В задаче языкового моделирования стандартно мы предсказываем следующее слово по контексту. Обычно cross entropy loss сравнивает вектор предсказанных вероятностей (длиной в весь словарь) с бинарным вектором, где всего одна единичка, указывающая на реальное слово на данном месте в обучающей выборке. То есть второе, третье и т.д. слово, которые модель считает уместными, игнорируются лоссом. В статье приводится пример: "I think this is a beginning of a beautiful [MASK]", на место [MASK] BERT хочет подставить прежде всего day или life, но следующие по предсказанной вероятности слова future, story и world тоже неплохо подходят. Можно ведь как-то учесть то, что модель выдает неплохое распределение вероятностей? Грубо говоря, наградить модель за то, что в топе нет Murdock, tolerance, maternity и прочих мало подходящих слов.
Идея дистиляции
Идея конкретной схемы teacher-student в том, что у нас есть большая модель-учитель (teacher, BERT) и моделька поменьше (student, DistilBERT), которой будут передаваться "знания" от модели-учителя. Модель student будет оптимизировать distillation loss, а именно, cross entropy loss, определенный для вероятностных распределений учителя и студента: L = Σ t_i * log(s_i). То есть для конкретного слова, затертого символом [MASK], и которое надо предсказать по контексту, мы сравним два распределения вероятностей появления каждого слова из словаря: {t_i} и {s_i} — предсказанных, соотв-но, моделью-учителем и моделью-учеником. Таким образом, получается rich training signal — модель-ученик на каждом слове получает сигнал, посчитанный не просто сравнением ее вектора прогнозов с реальным словом в обучающей выборке, а сравнением с вектором прогнозов модели-учителя.
Модель DistilBERT
Вся идея в том, что ученик — это модель поменьше, чем учитель. Так что DistilBERT — это в целом тот же BERT, но половину слоев выкинули. Еще выкинули token-type embeddings и pooler, правда, про это подробностей нет. Но главное, что DistilBERT на 40% меньше — 66 млн. параметров против 110 млн у BERT
Обучение DistilBERT
В DistilBERT помимо distillation loss есть еще два лоса — тот же masked language modeling loss, что и в BERT и еще cosine embedding loss — простое косинусное расстояние между эмбедингами скрытых состояний ученика и учителя (то есть, проще говоря, мы ученика заставляем еще и "выучивать" что-то похожее на то, что "выучил" учитель). Спойлер: авторы провели ablation studies, оказалось, если выкинуть masked language modeling loss, качество не особо просядет, т.е. можно обойтись комбинацией distillation loss и cosine embedding loss. Еще так же, как и в RoBERTa выкинули подзадачу next sentence prediction и применили dynamic masking.
Обучали ровно на том же датасете, что BERT (eng. wiki + Toronto Book Corpus) 90 часов на 8 V100 (16 GB). Для сравнения RoBERTa обучалась сутки на 1024 V100 (32 GB).
Результаты
Как обычно пишут про BERT — "it performed surprisingly well", вот тут уместно то же сказать про DistilBERT — на GLUE получилось surprisingly well — на самом деле на 5 из 9 задач даже лучше, чем BERT Правда, еще отдельно померились на SQuAD и IMDb — там хуже. Но учитывая еще, что инференс у DistilBERT шустрее на 60% — очень неплохо.
Прочие эксперименты
Вдобавок впихнули DistilBERT в iPhone 7 Plus. Получилось на 70% быстрее, чем BERT-base (не считая токенизацию), а модель весит всего 200 Мб. Упомянутый ablation studies: повыкидывали разные элементы составного лосса, поняли что можно обойтись двумя — distillation loss и cosine embedding loss.
В конце для отмазы написали 3 абзаца про прочие техники дистилляции и компрессии сеток и заключили, что DistilBERT — это универсальная предобученная версия BERT, имеющая на 40% меньше параметров, работающая на 60% быстрее и сохраняющая "97% понимания естественного языка" в сравнении с BERT (радуют меня эти фривольные формулировки в статьях по ML).
В-общем, если в задаче хочется применить BERT, начните с его дистиллированной версии.
Дополнительные материалы:
Пост Jay Alammar
Черновик автора обзора, DistilBERT + Catalyst: для классификации текстов
7. Plug and Play Language Models: A Simple Approach To Controlled Text Generation
Авторы статьи: Sumanth Dathathri, Andrea Madotto, Janice Lan, Jane Hung, Eric Frank, Piero Molino, Jason Yosinski, and Rosanne Liu (Uber AI, Caltech, HKUST, 2019)
→ Оригинал статьи
Автор обзора: Егор Тимофеев (в слэке Egor Timofeev)
В задачах языкового моделирования крайне сложно контролировать и заранее задавать различные желаемые атрибуты генерированного текста. Обычно, чтобы достичь этих качеств языковой модели требуется изменение аритектуры модели и/или дообучение/переобучение на существенном объеме новых данных (например, см. статью https://arxiv.org/pdf/1909.05858.pdf). Это дорого во всех смыслах, а ассортимент задаваемых аттрибутов для моделирования будет ограничен теми, которые будут заданы перед обучением, теми, которые будут присутствовать в трейн корпусе.
Идея
Если выписать моделируемые языковой моделью распределения (везде ниже опущены x_prev у обозначениях условной вероятности), то для классической авторегрессионной модели это будет p(x), а для моделей по типу conditional LM (например, по ссылке выше — CTRL) это будет уже p(x|a).
Авторы же предлагают аппроксимировать распределение следующим образом: p(x|a) ∝ p(x)p(a|x), где p(x) моделирует мощная, предобученная языковая модель (например, GPT2), а p(a|x) — маленькая модель собственно желаемых аттрибутов. Что самое приятное в данном подходе — не требуются никакие манипуляции над языковой моделью, такие как переобучение/дообучение. Необходимо лишь обучить маленькую модель, которая будет предсказывать распределение над требуемыми аттрибутами, принимая на вход текст.
Предполагаемый авторами алгоритм следующий:
- Имея частично сгенерированный текст, считаем log(p(a|x)) (модель аттрибутов). Также высчитываем градиенты по hidden state языковой модели.
- Используя рассчитаенные на предыдущем пункте градиенты, двигаем hidden state языковой модели в сторону возрастания log(p(a|x)). Получаем некий H_new.
- Здесь возникает проблема: вектор скрытого состояния мог шагнуть в часть пространства с низким p(x). Чтобы бороться с этим, авторы предпринимают следующие меры: во-первых, делают шаг латентным вектором в сторону уменьшения KL(H, H_new), а во-вторых, используют т.н. post-norm fusion (https://arxiv.org/pdf/1809.00125.pdf), комбинируя старое p(x) распределение от non conditional LM и новое, полученное после изменения скрытого представления.
- Из полученного распределения семплируется следующий токен.
Также авторами предлагается переранжировать несколько полученных семплов той же самой моделью, описывающей p(a|x).
Результаты
В статье приводятся достаточно радующие глаз примеры, а в блог-посте на сайте есть барчарт со сравнением различных комбинаций подходов в терминах topic relevance. Получается в среднем следующее: бейслайн (GPT2) < бейслайн + реранкинг моделью аттрибутов << изменение латентного вектора по алгоритму выше < изменение латентного вектора + реранкинг.
8. Deep Salience Representation for F0 Estimation in Polyphonic Music
Авторы статьи: Rachel M. Bittner, Brian McFee, Justin Salamon, Peter Li, Juan Pablo Bello ( New York University, USA, 2017)
→ Оригинал статьи
Автор обзора: Николай Глазурин (в слэке nglaz)
Про спектрограммы и музыку. Как известно, для анализа аудио в сеть чаще всего суют спектрограммы и работают с ними как с картинками. В этой статье авторы предлагают наконец использовать свойство, характерное именно для музыки – наличие гармоник в спектре. Для получения спектрограмм чаще всего используют БПФ, иногда его как-то группируют по частотам. Менее популярно constant-Q преобразование, в котором можно частотные компоненты разложить по произвольной сетке (мы хотим в соответствии с частотами нот) и для каждой частоты использовать фрагмент сигнала точно нужной длины.
В статье предлагается простая идея. Посчитаем constant-Q спектрограмму для аудио с какой-то минимальной частотой f_min и каким-то количеством частотных компонент F. А потом вместо f_min можно взять f_min * h, а остальные параметры оставим теми же, получим еще одну спектрограмму, которая начинается выше по частоте. Авторы предлагают брать h из множества {0.5, 1, 2, 3, 4, 5}, но это по большому счёту не очень важно. А потом возьмем, и все эти спектрограммы друг на друга сложим по 3-му измерению, и получится у нас на входе вместо 2-мерной спектрограммы 3-мерный тензор с размерностями (частота, время, номер гармоники). Фактически, у нас получился тензор, в котором часть информации дублируется, но при этом компоненты, соответствующие частотам (0.5f, f, 2f, 3f, 4f, 5f), оказываются друг над другом. Поэтому даже маленькая свертка (например 5х5) охватывает сразу несколько потенциальных гармоник ноты. А если бы на входе была только одна спектрограмма, для этого нужно было бы либо очень вытянутое по частоте ядро, либо dilated-свертка.
На практике, конечно, можно тупо считать одно constant-Q преобразование с большим количеством частотных компонент F, а потом вырезать из него фрагменты и складывать друг на друга.
Авторы решают задачу F0 estimation, то есть оценки того, какая частота в звуке наиболее выражена в каждый момент времени. В 2017 году, на момент публикации, они получили state-of-the-art. Но идея сама по себе прикольная и применима к другим задачам, в которых важна гармоническая составляющая звука.
9. Analyzing and Improving the Image Quality of StyleGAN
Авторы статьи: Tero Karras, Samuli Laine, Miika Aittala, Janne Hellsten, Jaakko Lehtinen, Timo Aila (NVIDIA, 2019)
→ Оригинал статьи
Автор обзора: Алекс Широн (в слэке shiron8bit)
GAN-архитектура для генерации реалистичных изображений большого разрешения, которая не нуждается в представлении, поскольку за последние недели результаты генерации были буквально везде. Авторы статьи предложили ряд изменений, улучшений и дополнений, которые позволили им избавиться от проблем, присущих первой версии, качественно и количественно (по FID) улучшив генерируемые изображения:
- Избавились от droplet-like артефактов (артефакты нормализации в виде пузырей/капель воды), изменив AdaIN.
- Изменили процедуру обучения, отказавшись от ProGAN-подхода с докидыванием блоков генератора/дискриминатора в процессе обучения и оставив общую end-to-end архитектуру по аналогии с MSG-GAN. Помимо уменьшения проблем с обучением, это также помогло избавиться от косяков с зубами/глазами, когда они приклеивались к положению камеры и не менялись с поворотом лица.
- Добавили Path Length Regularization.
- Предложили процедуру детекции сгенерированных изображений: находим проекцию изображения в латентное пространство W, если восстановленное изображение близко к исходному, то скорее всего оно сгенерировано через stylegan2.
Droplet-артефакты и AdaIN.
Авторы статьи приводят следующую аргументацию против использования AdaIN-слоя: adain нормирует каждую feature map, таким образом уничтожая информацию о значениях магнитуд друг относительно друга, и droplet — попытка генератора протащить эту информацию другим способом. В качестве варианта ослабить AdaIN было предложено следующее: весь скейлинг (модуляция/демодуляция) будем делать непосредственно в свертке, исходя из приходящего от блока A стиля, а смещение исходящего сигнала (вместо mu(y) / y_{b,i} в AdaIN) оставим на откуп блока B, преобразующего шум. Это нововведение заодно позволило ускорить обучение при неизменных остальных условиях.
Отказ от ProGAN.
В статье про MSG-GAN было предложено использовать skip connections, соединяя совпадающие по разрешению блоки генератора и дискриминатора. Авторы stylegan развили эту идею, суммируя выходы с блоков генератора всех разрешений (с апсэмплингом) и подавая на вход каждого блока дискриминатора соответствующую downsampled версию изображения. В качестве второго варианта было предложено использовать residual-блоки, при этом лучшие результаты показало использование skip connections в генераторе и residual-блоков в дискриминаторе (дискриминатор похож на LAPGAN, но без дискриминаторов для каждого разрешения, feature maps пробрасываются дальше).Было показано, что как и в случае с ProGAN, на начальных итерациях больший вклад вносят части сетки, ответственные за меньшие разрешения и за общую картину, а затем происходит перенос акцента на мелкие детали.
Path Length Regularization.
Заметив, что невысокие значения FID не всегда дают качественные изображения, а также заметив корреляцию между качеством изображений и метрикой PPL (Perceptual Path Length — изначально разница между vgg-фичами картинок при маленьких шажках в Z, но разницу заменили на LPIPS), авторы предложили Path Length регуляризацию, которая заключается в минимизации функционала
где g — непосредственно генератор, J_w — якобиан по переменным латентного пространства. При этом вычисления якобиана можно провдить через бэкпроп, а также говорится о том, что для облегчения вычислений регуляризатор можно считать только для каждого 16 батча. Число a рассчитывается как экспоненциальное скользящее среднее нормы якобиана.Применение Path Length Regularization позволяет обеспечить более ‘плавную’ интерполяцию скрытого пространства W, что, помимо улучшения качества изображений позволяет улучшить обратимость (то есть нахождение w, дающего после прогона через генератор заданное изображение), а также открывает перспективы с точки зрения анимации и интерполяции между ключевыми кадрами (в новой архитектуре между проекциям похожих изображений должны лежать точки, отвечающие за близкие изображения). Введение этой регуляризации также сыграло роль в упрощении детекции сгенерированных этой архитектурой изображений.
Время обучения на 8 GPU на разрешении 1024*1024 было от 2 до 9 дней для разных конфигураций.