- Машинное обучение — это легко
- Для кого эта статья?
- В цифрах
- Анализ данных — это просто?
- Ближе к делу
- Знакомимся с данными
- Простая реализация задачи на классификацию
- Последнее слово
- Материалы, вдохновившие автора на создание данной статьи
- Создаем музыку: когда простые решения превосходят по эффективности глубокое обучение
- Вишенка на торте
- Задача
- Решение
- (Обработка) данных
- Модель
Машинное обучение — это легко
Для кого эта статья?
Каждый, кому будет интересно затем покопаться в истории за поиском новых фактов, или каждый, кто хотя бы раз задавался вопросом «как же все таки это, машинное обучение, работает», найдёт здесь ответ на интересующий его вопрос. Вероятнее всего, опытный читатель не найдёт здесь для себя ничего интересного, так как программная часть оставляет желать лучшего несколько упрощена для освоения начинающими, однако осведомиться о происхождении машинного обучения и его развитии в целом не помешает никому.
В цифрах
С каждым годом растёт потребность в изучении больших данных как для компаний, так и для активных энтузиастов. В таких крупных компаниях, как Яндекс или Google, всё чаще используются такие инструменты для изучения данных, как язык программирования R, или библиотеки для Python (в этой статье я привожу примеры, написанные под Python 3). Согласно Закону Мура (а на картинке — и он сам), количество транзисторов на интегральной схеме удваивается каждые 24 месяца. Это значит, что с каждым годом производительность наших компьютеров растёт, а значит и ранее недоступные границы познания снова «смещаются вправо» — открывается простор для изучения больших данных, с чем и связано в первую очередь создание «науки о больших данных», изучение которого в основном стало возможным благодаря применению ранее описанных алгоритмов машинного обучения, проверить которые стало возможным лишь спустя полвека. Кто знает, может быть уже через несколько лет мы сможем в абсолютной точности описывать различные формы движения жидкости, например.
Анализ данных — это просто?
Да. А так же интересно. Наряду с особенной важностью для всего человечества изучать большие данные стоит относительная простота в самостоятельном их изучении и применении полученного «ответа» (от энтузиаста к энтузиастам). Для решения задачи классификации сегодня имеется огромное количество ресурсов; опуская большинство из них, можно воспользоваться средствами библиотеки Scikit-learn (SKlearn). Создаём свою первую обучаемую машину:
Вот мы и создали простейшую машину, способную предсказывать (или классифицировать) значения аргументов по их признакам.
— Если все так просто, почему до сих пор не каждый предсказывает, например, цены на валюту?
С этими словами можно было бы закончить статью, однако делать я этого, конечно же, не буду (буду конечно, но позже) существуют определенные нюансы выполнения корректности прогнозов для поставленных задач. Далеко не каждая задача решается вот так легко (о чем подробнее можно прочитать здесь)
Ближе к делу
— Получается, зарабатывать на этом деле я не сразу смогу?
Да, до решения задач за призы в $100 000 нам ещё далеко, но ведь все начинали с чего-то простого.
Итак, сегодня нам потребуются:
- Python 3 (с установленной pip3)
- Jupyter
- SKlearn, NumPy и matplotlib
Дальнейшее использование требует от читателя некоторых знаний о синтаксисе Python и его возможностях (в конце статьи будут представлены ссылки на полезные ресурсы, среди них и «основы Python 3»).
Как обычно, импортируем необходимые для работы библиотеки:
— Ладно, с Numpy всё понятно. Но зачем нам Pandas, да и еще read_csv?
Иногда бывает удобно «визуализировать» имеющиеся данные, тогда с ними становится проще работать. Тем более, большинство датасетов с популярного сервиса Kaggle собрано пользователями в формате CSV.
— Помнится, ты использовал слово «датасет». Так что же это такое?
Датасет — выборка данных, обычно в формате «множество из множеств признаков» → «некоторые значения» (которыми могут быть, например, цены на жильё, или порядковый номер множества некоторых классов), где X — множество признаков, а y — те самые некоторые значения. Определять, например, правильные индексы для множества классов — задача классификации, а искать целевые значения (такие как цена, или расстояния до объектов) — задача ранжирования. Подробнее о видах машинного обучения можно прочесть в статьях и публикациях, ссылки на которые, как и обещал, будут в конце статьи.
Знакомимся с данными
Предложенный датасет можно скачать здесь. Ссылка на исходные данные и описание признаков будет в конце статьи. По представленным параметрам нам предлагается определять, к какому сорту относится то или иное вино. Теперь мы можем разобраться, что же там происходит:
Работая в Jupyter notebook, получаем такой ответ:
Это значит, что теперь нам доступны данные для анализа. В первом столбце значения Grade показывают, к какому сорту относится вино, а остальные столбцы — признаки, по которым их можно различать. Попробуйте ввести вместо data.head() просто data — теперь для просмотра вам доступна не только «верхняя часть» датасета.
Простая реализация задачи на классификацию
Переходим к основной части статьи — решаем задачу классификации. Всё по порядку:
- создаём обучающую выборку
- пробуем обучить машину на случайно подобранных параметрах и классах им соответствующих
- подсчитываем качество реализованной машины
Посмотрим на реализацию (каждая выдержка из кода — отдельный Cell в notebook):
Создаем массивы, где X — признаки (с 1 по 13 колонки), y — классы (0ая колонка). Затем, чтобы собрать тестовую и обучающую выборку из исходных данных, воспользуемся удобной функцией кросс-валидации train_test_split, реализованной в scikit-learn. С готовыми выборками работаем дальше — импортируем RandomForestClassifier из ensemble в sklearn. Этот класс содержит в себе все необходимые для обучения и тестирования машины методы и функции. Присваиваем переменной clf (classifier) класс RandomForestClassifier, затем вызовом функции fit() обучаем машину из класса clf, где X_train — признаки категорий y_train. Теперь можно использовать встроенную в класс метрику score, чтобы определить точность предсказанных для X_test категорий по истинным значениям этих категорий y_test. При использовании данной метрики выводится значение точности от 0 до 1, где 1 100% Готово!
— Неплохая точность. Всегда ли так получается?
Для решения задач на классификацию важным фактором является выбор наилучших параметров для обучающей выборки категорий. Чем больше, тем лучше. Но не всегда (об этом также можно прочитать подробнее в интернете, однако, скорее всего, я напишу об этом ещё одну статью, рассчитанную на начинающих).
— Слишком легко. Больше мяса!
Для наглядного просмотра результата обучения на данном датасете можно привести такой пример: оставив только два параметра, чтобы задать их в двумерном пространстве, построим график обученной выборки (получится примерно такой график, он зависит от обучения):
Да, с уменьшением количества признаков, падает и точность распознавания. И график получился не особенно-то красивым, но это и не решающее в простом анализе: вполне наглядно видно, как машина выделила обучающую выборку (точки) и сравнила её с предсказанными (заливка) значениями.
Предлагаю читателю самостоятельно узнать почему и как он работает.
Последнее слово
Надеюсь, данная статья помогла хоть чуть-чуть освоиться Вам в разработке простого машинного обучения на Python. Этих знаний будет достаточно, чтобы продолжить интенсивный курс по дальнейшему изучению BigData+Machine Learning. Главное, переходить от простого к углубленному постепенно. А вот полезные ресурсы и статьи, как и обещал:
Материалы, вдохновившие автора на создание данной статьи
Более углубленное изучение использования машинного обучения с Python стало возможным, и более простым благодаря преподавателям с Яндекса — этот курс обладает всеми необходимыми средствами объяснения, как же работает вся система, рассказывается подробнее о видах машинного обучения итд.
Файл сегодняшнего датасета был взят отсюда и несколько модифицирован.
Где брать данные, или «хранилище датасетов» — здесь собрано огромное количество данных от самых разных источников. Очень полезно тренироваться на реальных данных.
Буду признателен за поддержку по улучшению данной статьи, а так же готов к любому виду конструктивной критики.
Источник
Создаем музыку: когда простые решения превосходят по эффективности глубокое обучение
Представляю вашему вниманию перевод статьи «Создаем музыку: когда простые решения превосходят по эффективности глубокое обучение» о том, как искусственный интеллект применяется для создания музыки. Автор не использует нейронные сети для генерации музыки, а подходит к задаче, исходя из знания теории музыки, на основе мелодии и гармонии. Другой особенностью статьи является метод сравнения музыкальных произведений на основе матриц самоподобия. Такой подход, конечно, не является исчерпывающим, но он полезен как промежуточный шаг для генерации качественной музыки методами машинного обучения.
Использование искусственного интеллекта в творчестве сегодня стало встречаться все чаще и в развлекательных целях, и в коммерческих и уже перестало удивлять публику. С одной стороны — это инструменты смены стиля изображения типа Prizma. С другой — нейронная сеть, продукт работы которой был продан в виде картины на аукционе Christieʼs за 432,5 тысячи долларов. Нельзя не вспомнить нашего отечественного специалиста по генерации музыки с помощью машинного обучения Ивана Ямщикова, несколько лет назад представившего проект «Нейронная оборона» (подробнее можно прочитать здесь, а это интервью Ивана на Хабре). Другим хорошим примером использования нейронных сетей для генерации музыки может быть статья «Мечтают ли андроиды об электропанке? Как я учил нейронную сеть писать музыку» эксперта Artezio.
Помимо понимания теории машинного обучения, использование искусственного интеллекта для решения творческих задач предполагает также наличие экспертизы в доменной области искусства. Это делает проект на стыке двух областей особенно многогранным и интересным, но и уязвимым для критики с двух сторон, т. к. проект может попасть под перекрестный огонь замечаний и от искусствоведов, и от data scientist-ов.
Расширяя свой кругозор в рамках темы использования искусственного интеллекта в музыке, я встретил статью «Создаем музыку: когда простые решения превосходят по эффективности глубокое обучение», перевод которой хотел бы представить сообществу Хабра. Одним из достоинств этой статьи для меня стало то, что автор не использует нейронные сети как черный ящик, а подходит к задаче генерации музыки, исходя из знания теории музыки, на основе мелодии и гармонии. В представленной статье не используются ни рекуррентные нейронные сети (RNN, LSTM), ни генеративные состязательные сети (GAN), — все эти методы дают поразительные результаты (например, в статье «Мечтают ли андроиды об электропанке? Как я учил нейронную сеть писать музыку»), и мы активно их используем в решении наших задач в компании CleverData. Автор сделал упор на модели на основе марковских цепей, дающих возможность работать с вероятностями перехода от текущего состояния музыкального произведения в последующее. В используемых автором методах есть дополнительное достоинство: автору не пришлось жертвовать интерпретируемостью результата в угоду использования модного и популярного алгоритма.
Другой особенностью статьи, привлекшей мое внимание, стал интересный метод сравнения музыкальных произведений на основе матриц самоподобия. Если структуру песни можно представить в виде матрицы самоподобия, то появляется еще одна количественная мера сравнения песен.
Краткое содержание: как я столкнулся с проблемой, используя глубокое обучение для создания музыки, и как я её решил, придумав собственное решение.
Задача: как я столкнулся с проблемами при использовании техник глубокого обучения для создания поп-музыки.
Решение: как я создал собственную машину для создания музыки, которая могла бы конкурировать с глубоким обучением, но на основе более простых решений.
Оценка: как я создал оценочную метрику, которая могла бы математически доказать, что моя музыка «больше похожа на поп», чем та, что создана при помощи глубокого обучения.
Обобщение: как я нашёл способ применять своё решение к проблемам, не связанным с созданием музыки.
Вишенка на торте
Я создал простую вероятностную модель, генерирующую поп-музыку. Также, используя объективную метрику, я могу с уверенностью сказать, что музыка, созданная моей моделью, больше похожа на поп-музыку, чем та, что была создана с применением техник глубокого обучения. Как я это сделал? Частично, я достиг этого, сфокусировавшись на том, что для меня – суть поп-музыки: на статистической взаимосвязи между гармонией и мелодией.
Мелодия — это вокал, мотив. Гармония — это аккорды, последовательность аккордов. На рояле мелодия играется правой рукой, а гармония — левой.
Задача
Прежде чем углубиться в их отношения, позвольте мне сначала очертить проблему. Проект начался с моего желания попробовать создать музыку при помощи глубокого обучения – ИИ, как называют это непрофессионалы. Довольно быстро я пришёл к LSTM (долгая краткосрочная память, long short-term memory), одной из версий рекуррентной нейронной сети (RNN), очень популярной при генерировании текстов и создании музыки.
Но чем больше я вчитывался в предмет, тем больше я стал сомневаться в логике применения RNN и их вариаций для создания поп-музыки. Эта логика, казалось, основывалась на нескольких предположениях о внутренней структуре (поп) музыки, с которой я не мог полностью согласиться.
Одно конкретное предположение — это независимая связь между гармонией и мелодией (определение этих двух см. выше).
Например, рассмотрим публикацию Университета Торонто от 2017 года «Song from Pi: A Musically Plausible Network for Pop Music Generation» (Хан Чу и др.). В этой статье авторы явно «предполагают… аккорды не зависимы от мелодии» (курсив мой). Основываясь на этом предположении, авторы построили сложную многослойную RNN-модель. Для мелодии выделен отдельный слой, где создаются ноты (слой key, слой press), не зависимый от слоя аккордов (Chord Layer). Помимо независимости, эта конкретная модель предполагает, что гармония опирается на мелодию. Другими словами, гармония зависит от мелодии при генерации нот.
RNN-модель, предложенная Хан Чу. Каждый слой отвечает за отдельный аспект музыки.
Такой способ моделирования кажется мне очень странным, поскольку это совсем не похоже на то, как люди подходят к написанию поп-музыки. Будучи пианистом классической школы, я никогда не рассматривал сочинение мелодии без того, чтобы сначала обозначить гармонию. Гармония определяет и ограняет мелодию. Axis of Awesome в своём когда-то вирусном видео давно уже продемонстрировали правдивость этой идеи.
Это видео демонстрирует главное свойство западной поп-музыки: эта гармония, эти четыре аккорда сильно влияют на то, какой в итоге будет мелодия. Говоря языком Data Science, условная вероятность регулирует и определяет статистическую связь между гармонией и мелодией. Так происходит, потому что ноты мелодии, естественно, зависят от нот гармонии. Таким образом, можно утверждать, что ноты гармонии по своей сути указывают, какие мелодические ноты могут быть выбраны в конкретной песне.
Решение
Мне нравится находить оригинальные решения для сложных проблем. Поэтому я решил построить свою собственную модель, которая могла бы по-своему отражать богатую структуру музыкальных данных. Я начал с того, что сосредоточился на предопределенной вероятностной силе, регулирующей отношения между различными видами музыкальных нот. Например, выше я уже упоминал «вертикальные» отношения между гармонией и мелодией.
(Обработка) данных
В качестве данных я использовал 20 разнообразных западных поп-песен в midi формате (полный список песен можно найти здесь).
Используя библиотеку music21 python, я проанализировал midi-файлы при помощи цепи Маркова. Это позволило мне выделить статистические взаимоотношения между разными типами нот в моих входящих данных. В частности, я рассчитал вероятности перехода моих музыкальных нот. По сути, это означает, что наблюдая переход нот от одной к другой, мы можем вычислить вероятность того, что этот переход произойдет. (Более подробное объяснение ниже)
Midi: диджитал-версия песни
Сначала я извлек «вертикальные» вероятности перехода между нотами гармонии и нотами мелодии. Я также рассчитал все «горизонтальные» вероятности перехода между нотами мелодии в соответствии с набором данных. Я провел эту процедуру и для нот гармонии. Таблица ниже демонстрирует пример трех разных переходных матриц между различными типами нот в музыкальных данных.
Варианты перехода, варианты. Верхняя – между нотами гармонии и мелодии. Средняя – между нотами мелодии. Нижняя – между нотами гармонии.
Модель
Опираясь на эти три модели вероятностей, моя модель будет действовать следующим образом:
- Выбирает произвольную доступную ноту гармонии;
- Выбирает ноту мелодии, основываясь на ноте гармонии, используя первую вероятностную матрицу;
- Выбирает ноту мелодии, опираясь на предыдущую ноту мелодии, согласно второй матрице вероятности;
- Повторяет шаг 3, пока не достигнет определённого завершения;
- Выбирает новую ноту гармонии, опираясь на предыдущую ноту гармонии, используя третью матрицу вероятности;
- Повторяет шаги 1-4, пока не достигнет завершения.
Конкретный пример применения алгоритма:
- Программа выбрала гармоническую ноту ( F ).
- У этой ноты есть 4 варианта нот мелодии. Используя первую матрицу переходов, система выбирает ноту ( C ), учитывая высокую вероятность её использования (24,5%).
- Эта нота ( C ) переходит ко второй матрице перехода, останавливая выбор на ноте мелодии (A), основываясь на её частотности (88%).
- Шаг 3 будет повторяться, пока процесс не достигнет предустановленной точки завершения;
- Нота гармонии (F), обратившись к третьей вероятностной матрице, выберёт следующую гармоническую ноту. Это будет либо ( F ), либо ( C ), учитывая их схожесть.
- Шаги 1-4 будут повторяться, пока процесс не завершится.
Здесь можно послушать пример поп-музыки, созданной подобным образом:
Источник