Попробуем решить задачу поиска аномалий в звуке.
Микрофоны, на данное время, представляют из себя одни из самых распространенных универсальных детекторов. Они маленькие, дешевые, надежные. И они по-умолчанию присутствуют в сотовых телефонах. Их можно использовать практически везде. Поэтому задача обработки звука, не только речи, стоит перед нами прямо сейчас. Это классический пример Low hanging fruit — "низко висящего фрукта". :) Звук представляет из себя временную последовательность. В простейшем виде это — амплитуда сигнала по временной оси.
Сигнал можно конвертировать в спектральную область. Тогда сигнал будет представлять из себя спектр частот, изменяемый по времени. Звук представляет из себя непрерывный поток данных. Это очень важно, так как мы не можем просматривать данные [далеко] вперед по времени и после этого строить или корректировать наш алгоритм. Кроме того сигнал с течением времени может меняться, и эти изменения уже не будут аномалиями. Желательно чтобы система сама подстраивалась к изменениям сигнала, чтобы она не считала повторяющиеся изменения сигнала аномалиями. В общем случае наша задача распространяется на любые временные последовательности, не только на звук. В одном случае мы обрабатываем сигнал без всякого априори знания о том, какие аномалии возможны. Отклонение поведения от обычного считается аномалией. Это — unsupervised  модели.  В другом случае мы знаем как могут выглядеть аномалии. У нас есть образцы звука аномалий. Мы используем эти образцы в алгоритмах поиска аномалий. Это — supervised  модели. В простейшем случае мы будем детектировать только сам факт аномалии с привязкой ко времени. В более сложном случае мы еще будем классифицировать аномалии. К примеру, аномалия может быть слабая, сильная или катастрофическая. Мы можем определять только время начала аномалии, либо определять временное окно от начала до завершения аномалии.  Методы обнаружения аномалий в звуке относятся к подклассу методов обнаружения аномалий. Отличие в том, что входные данные, звук, подаются непрерывным потоком. Самые простые методы это — детекторы изменения сигнала. Пороговый детектор реагирует на изменения амплитуды сигнала или на изменения спектра. Подобные методы очень простые и во многих случаях самые надежные. Они работают в условиях, когда входной сигнал стабилен и его поведение никак не меняется по времени. Любое изменение считается аномалией. Следующая группа методов относится к методам обработки сигналов. Эти методы глубоко изучены в обработке радиосигналов. Для примера приведем радиолокаторы и мобильную связь. Методы отлично работают, когда мы знаем, что именно мы ищем. Мы заранее должны знать звук или спектр аномалии. Методы обработки сигналов обладают мощнейшим аппаратом фильтрации нужных сигналов. Не совсем понятно, как нам использовать эти методы для поиска аномалий. И последняя группа методов это — методы Machine Learning. Она включает в себя как классические методы, например методы линейной регрессии или классификации, так и новейшие нейронные сети. Методы Machine Learning хороши там, где система должна подстраиваться под разное поведение входных сигналов. Входной сигнал может меняться по довольно сложным зависимостям, а методы обучаются по ходу дела и подстраиваются под эти зависимости. Любые закономерности сигнала не считаются аномалиями. Запрограммировать нечто подобное обычными методами сложно, а иногда и невозможно, потому что нам придется вручную подстраивать нашу систему под изменение сигнала. Методы же Machine Learning не требуют ручной подстройки, они сами обучаются на имеющихся данных. Основная проблема с методами Machine Learning в том, что входные данные, временные последовательности, подаются непрерывным потоком. Для подобных данных разработаны специализированные модели. В качестве примера можно указать рекуррентные нейронные сети (RNN). Одно из его удачных описаний можно прочитать здесь. Я сначала проведу краткое исследование имеющихся примеров, чтобы потом выбрать наиболее подходящие для моей задачи. По подготовке данных: на сайте KDNuggets есть хороший пример использования спектральной последовательности. Теперь попробую поискать примеры кода.  Microsoft Anomaly Detection Service — один из самых простых сервисов. К сожалению на него нельзя подавать непрерывный поток данных. В его документации довольно просто и подробно описаны типовые аномалии во временных последовательностях. Компания Numenta создала тестовую площадку для опробования систем и алгоритмов для обнаружения аномалий во временных последовательностях. Numenta  — очень интересная компания, занимающаяся алгоритмами Machine Learning и пытающаяся приблизиться к пониманию работы мозга. Интересующимся рекомендую посмотреть увлекательные видео, в частности доклад по обнаружению аномалий. Алгоритмы Numenta очень хорошо подходят для нашей задачи. Numenta в лидерах на тестовой площадке. К сожалению их реализация довольно сложная. Пара алгоритмов, представленные на втором и третьем месте (на ноябрь 2016 г.), ненамного отстают от Numenta, но намного проще в реализации.
На GitHub можно обнаружить много Open Source систем, в частности систему от Twitter. Если обратиться к теории обнаружения аномалий с использованием классического Machine Learning, то один из самых популярных и полных источников информации по этой теме, это scikit-learn проект. Azure Machine Learning располагает многими примерами реализации. Естественно, нам придется использовать Microsoft Azure ML. Поэкспериментировать и построить модели можно будет бесплатно, но потом надо будет платить за хостинг модели на Azure серверах. Что может быть и плюсом, а может быть и минусом. Microsoft разработала один из лучших пакетов по нейронным сетям, CNTK, и выложила его в открытом виде. Есть несколько примеров по использованию пакета для обработки временных последовательностей.  Один из самых популярных пакетов по нейронным сетям, это Google Tensorflow. Keras  — довольно популярный пакет, работающий поверх TensofFlow или Theano и сильно упрощающий создание моделей. Здесь один из примеров его использования для RNN. Для начала определюсь с интерфейсом. Вне зависимости от дизайна внутренностей самого сервиса, интерфейс к нему не будет сильно отличаться, так как он зависит прежде всего от задачи, а не от ее реализации.  Итак, на входе либо большой файл со звуком, либо порт для потока (stream), по которому данные подаются непрерывно. На выходе тоже либо файл, либо поток. Формат выхода: время появления аномалии. Дополнительно еще могут выдаваться: время завершения аномалии; класс аномалии. Дополнительные настройки, — это параметры, разные для разных дизайнов сервиса. Например: Раз уж я начал с трех подходов, то логично проработать именно три дизайна. Первый, на основе детектирования изменения сигнала без использования методов Machine Learning. В простейшем варианте входной сигнал усредняется, чтобы случайные шумы не создавали слишком много ложных срабатываний. Потом проверяется на функции “если амплитуда больше порога, то это аномалия”. Чуть сложнее, но намного более практично, если мы добавим логику по обнаружению закономерностей сигнала. Например, аномалии будут сохраняться в кэше, и новые аномалии будут проверяться на повторения. Если в кэше найдена похожая аномалия, и она отмечена “не аномалия”, то это — “не аномалия”. Придется добавить и метод определения “аномалия/не аномалия”. Это будет либо дополнительный интерфейс пользователя, либо какой-то алгоритм.  Простейший вариант — использование Azure ML. В качестве примера могу взять вот этот простой эксперимент, или более сложный. В другом варианте, если я хочу иметь полный контроль над приложением, могу взять за образец этот проект и этот. Оба сделаны на Python. Скорее всего подойдет готовый образец на базе Keras, либо можно использовать CNTK. Но к нему я не нашел готового примера, поэтому придется дописывать код. Эти обзорные (POC) проекты, конечно, надо будет сделать, прежде чем начинать реальный проект. Конкретные данные будут сильно отличаться от задачи к задаче. В зависимости от этих данных нам будут подходить разные методы.
Целью этой статьи было показать один из подходов к решению задачи "как подойти к проблеме "поиск звуковых аномалий".
Если кто-то из читателей решит подбросить свежие идеи или указать на проблемы, ошибки, буду очень рад их увидеть в комментариях. Заранее благодарен! Machine Learning Engineer