UA   EN
ДонНТУ   Портал магистров

Реферат по теме выпускной работы

Содержание

Введение

Проблема разделения источников звука или audio source separation является довольно популярной, тем более её частный случай – разделение музыки и голоса. Однако, решение подобных задач с помощью классических алгоритмов является затруднительным, особенно для разделения голоса. Сами алгоритмы довольно сложны, а результат бывает далёк от идеального. Также следует учитывать, что голосов может быть несколько, а они в свою очередь, могут быть обработаны реверберацией, задержками и другими эффектами.

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

1. Цель и задачи исследования

Целью данной работы является поиск подходящей архитектуры и обучение глубокой свёрточной нейронной сети, чтобы она была способна выделять из музыки голос на достаточно корректном уровне, с наименьшим количеством посторонних шумов. К задачам исследования относится сравнение созданной нейронной сети и аналогичных программ с исходным «несмешанным» голосом разных композиций для выявления погрешности при работе созданной програмы[1][2].

2. Актуальность темы

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

3. Анализ предметной области

3.1. Нейронная сеть

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

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

Чаще всего, для этого нужно «прогнать» её работу на десятках миллионов наборов входных данных, указывая ей верные и убирая неверные варианты.

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

• Классификации,

• Предсказания,

• Распознавания[3][4];

Рассмотрим подробнее основные составляющие нейронной сети.

3.2. Нейрон.

Нейрон — это вычислительная единица, которая получает информацию, производит над ней простые вычисления и передает ее дальше. Они делятся на три основных типа: входной, скрытый и выходной. когда нейросеть состоит из большого количества нейронов, вводят термин слоя. Соответственно, есть входной слой, который получает информацию, n скрытых слоев, которые ее обрабатывают и выходной слой, который выводит результат. У каждого из нейронов есть 2 основных параметра: входные данные (input data) и выходные данные (output data). В поле input попадает суммарная информация всех нейронов с предыдущего слоя, после чего, она нормализуется, с помощью функции активации.

3.3. Синапс.

Синапс это связь между двумя нейронами. У синапсов есть 1 параметр — вес. Благодаря ему, входная информация изменяется, когда передается от одного нейрона к другому.

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

Схематичное изображение работы одного нейрона

Рисунок 1 – схематичное изображение работы одного нейрона

Подадим на вход 1 и 0. Пусть w1=0.4 и w2 = 0.7 Входные данные нейрона Н1 будут следующими: 1*0.4+0*0.7=0.4. Теперь когда у нас есть входные данные, мы можем получить выходные данные, подставив входное значение в функцию активации.

3.4. Функция активации.

Функция активации — это способ нормализации входных данных (мы уже говорили об этом ранее). То есть, если на входе у вас будет большое число, пропустив его через функцию активации, вы получите выход в нужном вам диапазоне. Функций активации достаточно много поэтому мы рассмотрим самые основные: Линейная, Сигмоид (Логистическая) и Гиперболический тангенс. Главные их отличия — это диапазон значений(рис. 2-4).

Линейная функция

Рисунок 2 – линейная функция

Сигмоид

Рисунок 3 – сигмоид

Гиперболический тангенс

Рисунок 4 – гиперболический тангенс

3.5. Функция активации.

Многослойный персептрон является простейшей и самой распространённой нейронной сетью. Является полносвязной нейронной сетью(выходы предыдущего слоя соединены со всеми входами следующего слоя) прямого распространения(сигнал идёт только в одну сторону). Каждый синапс имеет свой вес, который определяет силу передачи сигналов от одних конкретных нейронов другим. Выходных сигналов может быть как несколько, так и один, в зависимости от условий задачи[5][6].

Схематическое изображение многослойного персептрона

Рисунок 5 – схематическое изображение многослойного персептрона

3.6. Метод обратного распространения ошибки

Для обучения нейронной сети «с нуля», берем значения весов случайными числами от -0.5 до 0.5. Далее, необходимо проверить результат работы, и скорректировать веса согласно силе ошибки. Для этого используется метод обратного распространения ошибки. Цели обратного распространения просты: отрегулировать каждый вес пропорционально тому, насколько он способствует общей ошибке. Если мы будем итеративно уменьшать ошибку каждого веса, в конце концов у нас будет ряд весов, которые дают хорошие прогнозы.

Прямое распространение можно рассматривать как длинный ряд вложенных уравнений. Если вы так думаете о прямом распространении, то обратное распространение — это просто приложение правила цепочки (дифференцирования сложной функции) для поиска производных потерь по любой переменной во вложенном уравнении. С учётом функции прямого распространения:

где A, B, и C — функции активации на различных слоях. Пользуясь правилом цепочки, вычисляем производную f(x) по x:

Чтобы найти производную по B, мы можем сделать вид, что B (C(x)) является константой, заменить ее переменной-заполнителем B, и продолжить поиск производной по B стандартно:

Этот простой метод распространяется на любую переменную внутри функции, и позволяет нам в точности определить влияние каждой переменной на общий результат[7][8].

3.7 Свёрточные нейронные сети.

Наилучшие результаты в области анализа изображений показала Convolutional Neural Network или сверточная нейронная сеть (далее – СНС). Успех обусловлен возможностью учета двумерной топологии изображения, в отличие от многослойного персептрона.

СНС состоит из разных видов слоев: сверточные (convolutional) слои, субдискретизирующие (subsampling, подвыборка) слои и слои «обычной» нейронной сети – персептрона, в соответствии с рисунком 6.

Виды слоёв в свёрточной нейронной сети.

Рисунок 6 – виды слоёв в свёрточной нейронной сети

Первые два типа слоев (convolutional, subsampling), чередуясь между собой, формируют входной вектор признаков для многослойного персептрона.

Свое название сверточная сеть получила по названию операции – свертка, суть которой будет описана дальше.

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

Можно выделить следующие этапы влияющие на выбор топологии:

• определить решаемую задачу нейросетью (классификация, прогнозирование, модификация);

• определить ограничения в решаемой задаче (скорость, точность ответа);

• определить входные (тип: изображение, звук, размер: 100x100, 30x30, формат: RGB, в градациях серого) и выходных данные (количество классов).

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

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

Ядро представляет из себя фильтр или окно, которое скользит по всей области предыдущей карты и находит определенные признаки объектов. Ядро представляет собой систему разделяемых весов или синапсов, это одна из главных особенностей сверточной нейросети.

Изначально значения каждой карты сверточного слоя равны 0. Значения весов ядер задаются случайным образом в области от -0.5 до 0.5. Ядро скользит по предыдущей карте и производит операцию свертка, которая часто используется для обработки изображений, формула:

Принцип работы операции свёртка

Принцип работы операции свёртка

Подвыборочный слой также, как и сверточный имеет карты, но их количество совпадает с предыдущим (сверточным) слоем, их 6. Цель слоя – уменьшение размерности карт предыдущего слоя. Если на предыдущей операции свертки уже были выявлены некоторые признаки, то для дальнейшей обработки настолько подробное изображение уже не нужно, и оно уплотняется до менее подробного. Обычно, каждая карта имеет ядро размером 2x2, что позволяет уменьшить предыдущие карты сверточного слоя в 2 раза. Вся карта признаков разделяется на ячейки 2х2 элемента, из которых выбираются максимальные по значению.

Формирование новой карты подвыборочного слоя на основе предыдущей карты сверточного слоя. Операция подвыборки (Max Pooling)

Рисунок 7 — Формирование новой карты подвыборочного слоя на основе предыдущей карты сверточного слоя. Операция подвыборки (Max Pooling)

Последний из типов слоев это слой обычного многослойного персептрона. Цель слоя – классификация, моделирует сложную нелинейную функцию, оптимизируя которую, улучшается качество распознавания[9].

Пример полносвязного слоя в сверточной нейросети

Рисунок 8 - пример полносвязного слоя в свёрточной нейросети

4. Обзор исследований и разработок

4.1 Lalal.ai

LALAL.AI — это онлайн-сервис по разделению дорожек любого аудиоформата на вокал и музыку. LALAL.AI анализирует трек и пытается извлечь из него информацию об отдельных инструментах и партиях.

База данных LALAL.AI насчитывает 20 Тбайт студийных звукозаписей высокого качества, которые используются для тренировки искусственного интеллекта. Это позволяет сервису справляться с работой, делая минимум ошибок.

4.2 Аудиоредакторы

Разделение музыки и голоса также поддерживаются многими аудиоредакторами разной степени качества. К самым популярным относятся:

• Audacity.

• Magix sound forge pro.

• FL Studio.

5. Обзор инструментов разработки.

5.1 TensorFlow и фреймворк Keras

Написанный на языке С++ командой Google в 2015 году TensorFlow является одним из самым популярных фреймворков Deep Learning. Сегодня пойдет речь об интерфейсе, который предоставляет TensorFlow для Python: разница между Tensorflow 1 и TensorFlow 2, встроенный фреймворке Keras, построение моделей и визуализация с TensorBoard.

Прежде всего необходимо провести границу между версиями TensorFlow 1.x и TensorFlow 2.x. У них есть разительные отличия. Фреймворк оперирует статическими вычислительными графами, а это значит, что они выполняются только в момент компиляции.

5.1.1 Модуль Keras в TensorFlow 2

Фреймворк глубокого обучения Keras перекочевал в TensoFlow 2, и теперь его функционал хранится в модуле tf.keras. Данный модуль содержит инструменты для построения модели, такие как:

• Слои (layers), включая полносвязный (Dense), сверточный (Conv1D), рекуррентный (RNN, LSTM). Всего насчитывается 105 слоев;

• Функции активации (activations), включая Softmax, ReLU, Sigmoid. Некоторые же функции активации, например, PReLU, доступны в виде слоев. Всего их 15;

• Функции потерь (losses), включая Binary Crossentropy, MAE, MSE. Всего их 25;

• Метрики(metrics), например, MAE, MSE, Cosine Similarity. Всего 43 в виде классов и 25 в виде функций;

• Оптимизаторы (optimizers), включая SGD, Adam, Adagrad. Всего их 9;

• Обратные вызовы (callbacks), включая RemoteMonitor для передачи событий на сервер, History для отслеживания истории событий модели, EarlyStopping для остановки модели в случае отсутствии улучшений, TensorBoardдля активации режима визуализации. Всего их 14.

5.1.2 TensorBoard

TensorFlow имеет собственный инструмент для визуализации — TensorBoard. С помощью TensorBoard можно:

• следить за процессом изменения точности (accuracy) и потерь (loss) в реальном времени;

• визуализировать граф модели со слоями и операциями;

• показать параметры модели (веса, смешения) или другие тензоры, которые меняются со временем;

• вывести картинки, видео или аудио;

• и многое другое

5.2. PyTorch

PyTorch, разработанный командой Facebook в 2017 году фреймворк Deep Learning, создан в первую очередь для Python.

В отличие от TensorFlow, фреймворк PyTorch не навязывает разработчику свой интерфейс. Можно самим создавать свои слои, функции активации и прочие нужные объекты в виде обычных классов и функций Python,. Операции над тензорами могут выполняться на GPU.

PyTorch использует автоматическое дифференцирование для вычислений градиентов, которые используются в алгоритме обратного распространения ошибки (backpropogation). Достоинством такого подхода является скорость вычисления.

PyTorch не только позволяет работать с тензорами, но и предоставляет ряд возможностей для глубокого обучения (Deep Learning). В PyTorch есть четыре основных компонента, необходимые для построения моделей:

• nn используется для создания вычислительных графов, которые формируют слои нейронных сетей (neural net). Аналогичную функцию в TensorFlow выполняет модуль Keras.

• optim содержит различные алгоритмы оптимизации (SGD, Adam и т.д.). Аналог в TensorFlow — модуль optimizers.

• Dataset — интерфейс для представления входных и выходных данных в разных форматах, например, в виде тензоров (TensorDataset), iterable (IterableDataset) и т.д. В TensorFlow тоже есть класс Dataset.

• DataLoader преобразует Dataset в манипулируемый формат, с помощью которого можно контролировать размера пакета (batch size), перемешивать данные, распределять процессы и т.д. В TensorFlow за это отвечает модуль data.

Для создания слоев, например, сверточных (convolutional), полносвязных (fully-conected), рекуррентных (recurrent), можно воспользоваться модулем torch.nn, а для алгоритмов оптимизации — torch.optim. Однако интерфейс построения и обучения модели не такой высокоуровневый по сравнению с TensorFlow, поэтому придется писать дополнительный код на Python.

5.3. ApacheMxnet

Apache MXNet – открытый фреймворк для глубокого обучения, который используется для создания, обучения и развертывания глубоких нейронных сетей. MXNet абстрагирует сложности, связанные с реализацией нейронных сетей, обладает высокой производительностью и масштабируемостью, а также предлагает API для популярных языков программирования, таких как Python, C++, Clojure, Java, Julia, R, Scala и других.

MXNet включает интерфейс Gluon, позволяющий разработчикам любой квалификации начать работу с технологиями глубокого обучения в облаке, на периферийных устройствах и в мобильных приложениях. С помощью всего нескольких строк кода Gluon можно создавать линейные регрессии, сверточные сети и рекуррентные сети с долгой краткосрочной памятью (LSTM) для обнаружения объектов, распознавания речи, выдачи рекомендаций и индивидуальной настройки.

Преимущества:

• Простота использования с интерфейсом gluon. Библиотека Gluon MXNet предоставляет высокоуровневый интерфейс, который позволяет легко создавать прототипы, обучать и развертывать модели глубокого обучения без ущерба для скорости обучения. Gluon предлагает высокоуровневые абстракции для предопределенных слоев, функции потерь и оптимизаторы. Он также обеспечивает гибкую структуру, которая интуитивно понятна в работе и легко отлаживается.

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

• Для IoT и периферийных устройств. В дополнение к обучению с использованием нескольких графических процессоров и развертыванию сложных моделей в облаке MXNet создает упрощенные представления нейронных сетевых моделей, которые могут работать на маломощных периферийных устройствах, таких как Raspberry Pi, смартфон или ноутбук, и удаленно обрабатывать данные в режиме реального времени.

• Гибкость и возможности выбора. MXNet поддерживает широкий спектр языков программирования, включая C++, JavaScript, Python, R, Matlab, Julia, Scala, Clojure и Perl, что позволяет начать работу, используя уже знакомые языки. Однако для обеспечения максимальной производительности на стороне сервера весь код компилируется на C++, независимо от того, какой язык используется при создании моделей.

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

Список источников

  1. Ализар А., Выделение вокала из музыки с помощью свёрточных нейросетей[Электронный ресурс]. – Режим доступа: https://habr.com/ru/post/441090.
  2. Open Source Tools & Data for Music Source Separation[Электронный ресурс]. – Режим доступа: https://source-separation.github.io/tutorial/landing.html.
  3. Что такое нейронная сеть[Электронный ресурс]. – Режим доступа: https://aws.amazon.com/ru/what-is/neural-network.
  4. Что такое нейронные сети, и что они могут[Электронный ресурс]. – Режим доступа: https://neural-university.ru/neural-networks-basics.
  5. Многослойный персептрон[Электронный ресурс]. – Режим доступа: https://wiki.loginom.ru/articles/multilayered-perceptron.html.
  6. Структура и принцип работы полносвязных нейронных сетей[Электронный ресурс]. – Режим доступа: https://proproprogs.ru/neural_network/struktura-i-princip-raboty-polnosvyaznyh-neyronnyh-setey.
  7. Рокатанский М., Знакомимся с методом обратного распространения ошибки[Электронный ресурс]. – Режим доступа: https://habr.com/ru/company/otus/blog/483466.
  8. Гасратов Ф., Метод обратного распространения ошибки: математика, примеры, код[Электронный ресурс]. – Режим доступа: https://neurohive.io/ru/osnovy-data-science/obratnoe-rasprostranenie.
  9. Сверточные нейронные сети[Электронный ресурс]. – Режим доступа: https://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%
    D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8.
  10. Гончаров Д., TensorFlow vs PyTorch в 2021: сравнение фреймворков глубокого обучения[Электронный ресурс]. – Режим доступа: https://habr.com/ru/company/ru_mts/blog/565456.