Русский
Русский
English
Статистика
Реклама

Cleverdata

Перевод Использование методов анализа графов для поиска аномалий

07.07.2020 10:10:24 | Автор: admin
Несмотря на то, что описание данных с помощью графов практикуется еще с позапрошлого столетия, использование их в решении повседневных задач по анализу данных лишь набирает обороты. Хотя основное внимание уделяется, как водится, графовым эмбеддингам и сверточным сетям, маленькие шаги предпринимаются и в алгоритмах по поиску аномалий или антифроде. Основная обзорная статья, на которую ссылается большинство специалистов в своих в докладах и публикациях, Graph based anomaly detection and description: a survey от авторов Leman Akoglu, Hanghang Tong, Danai Koutra (Akoglu, 2015). Мы в CleverDATA решили рассказать Хабру об этом практически единственном материале по теме и предлагаем вашему вниманию его саммари.

Первый граф Российского царства Борис Петрович Шереметев. Аномалий не обнаружено.

Во вступлении авторы отвечают на вопрос: В чем же преимущества поиска аномалий с использованием теории графов?:

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

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

Таким образом, перспективность использования теории графов для поиска аномалий обоснована. Перейдем к описанию самих методов.

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


Поиск аномалий в графах без свойств, приписанных вершинам и/или ребрам


Для простых графов выделяют три направления структурных подходов: поиск аномалий на основе признаков узлов, диад узлов, триад, эгонетов (egonet), на основе сообществ и на основе метрик близости (proximity): pagerank, personalized pagerank, simrank. При этом предлагается для решения задачи поиска аномалий на графе использовать обычные алгоритмы (например, Isolation Forest, или если есть разметка, то стандартные классификаторы), но на основе графовых признаков.

Пример Эгонета

Отдельно описывается подход с признаками эгонетов подграфов, включающих целевой узел, и его ближайших соседей. Авторы, ссылаясь на статью 2010 года (Akoglu, 2010) (в статье будет очень много таких ссылок, гиперссылки на некоторые я дал в тексте, но более подробные ссылки, например, с указанием страниц, вы найдёте в списке литературы в конце этой статьи), предлагают искать характерные для графа паттерны эгонетов с выраженной зависимостью между характеристиками, а эгонеты, не соответствующие этим паттернам, считать аномальными, и, таким образом, считать аномальными их центральные узлы. Поскольку всевозможных показателей на основе эгонетов может быть много, авторы в этой же статье обосновывают свой выбор подгруппы таких показателей, наилучшим образом отражающие свойства графа (например, число треугольников, общий вес ребер). Расстояние между паттернами и между эгонетом и паттерном предлагается измерять, как отклонение характеристики этого эгонета от характерной зависимости, соответствующей паттерну.

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

Также авторы описывают и другие подходы:

  • кластеризация узлов на основании сходства их ближайшего окружения; предлагается реорганизация матрицы смежности для получения более плотных и менее плотных блоков (Chakrabarti 2004; Rissanen, 1999);
  • матричная факторизация; предлагается аналог Non-negative matrix factorization (NMF) (Tong and Lin 2011).

Поиск аномалий в графах с узлами и/или ребрами, обладающими свойствами


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

Также рассматривается проблема наличия у узлов множества характеристик различных модальностей. Предлагается всем условно нормальным значениям ставить в соответствие единственное значение категориальной переменной, а для выбросов ставить в соответствие значение единственного показателя аномальности, например, на основании метрических методов обнаружения аномалий: kNN, LOF.

Также перечисляются и другие возможности: SAX (Symbolic Aggregate approXimation) (Lin et al., 2003), MDL-binning (Minimum description length) (Kontkanen and Myllymki, 2007) и дискретизация по минимуму энтропии (Fayyad and Irani, 1993). Авторы этой статьи (Eberlie and Holder, 2007) иначе подходят к определению аномалии в графовых данных, считая аномальными те подграфы, которые похожи по отношению к условно нормальному графу в определенных пределах. Такой подход авторы обосновывают тем, что самые успешные мошенники будут стараться максимально подражать реальности. Они также предлагают учитывать стоимость модификации показателя и формулируют показатели аномальности с учетом этой стоимости (чем меньше стоимость, тем более аномальным является показатель).

Поиск аномалий для графов с атрибутированными узлами рассматривается и в основанный на поиске сообществ парадигме. Предлагается подразделять графы на сообщества. Далее, в рамках каждого сообщества, искать аномалии по атрибутам. Например, курильщик в команде по бейcболу. Курильщик не является аномалией для общества в целом, но в своем сообществе является. Другой подход (Mller, 2013) основывается на выборе пользователем (аналитиком) набора узлов, для которых далее определяется подпространство показателей, схожих для них. А аномалиями в таком подходе являются узлы, которые структурно принадлежат к кластеру этих узлов, но в выбранном подпространстве показателей находятся далеко от них.

Отдельно рассматриваются методы semi-supervised, в предположении, что какая-то часть узлов размечена как нормальные и аномальные, а остальные узлы можно классифицировать, используя соответствующие методики, а в самом простом случае им можно присваивать метки соседних с ними узлов. Перечисляются основные подходы: iterative classification algorithm, gibbs sampling (подробнее про эти подходы пишут здесь), loopy belief propagation, weighted-vote relational network classifier.

Поиск аномалий в динамическом графе


Для динамического графа, который представляет собой упорядоченную во времени последовательность статических графов, основной подход осуществляется следующим образом:

  1. выделяется некоторое сжатие или интегральная характеристика каждого статического графа;
  2. вычисляется расстояние последовательно идущих графов;
  3. аномальными принимаются те графы, для которых расстояние выше порога.

В качестве мер расстояния предлагаются:

  • maximum common subgraph (MCS) distance;
  • error correcting graph matching distance, то есть расстояние, измеряющее, сколько шагов нужно сделать, чтобы из одного графа сделать другой;
  • graph edit distance (GED), то же, что и предыдущее, но возможны лишь топологические изменения;
  • расстояния между матрицами смежности (например, Хэмминга);
  • различные расстояния на основе весов ребер;
  • расстояния между спектральным представлением графов (распределениями собственных векторов);
  • описывается также и более экзотическая мера: эвклидово расстояние между перроновскими собственными векторами графа.

В статье от Bunke et al. (2006) авторы предлагают считать расстояние не только между последовательно идущими графами, но вообще между всеми графами в последовательности, и потом применять многомерное шкалирование, переводя графы в двумерное пространство. Далее выбросы ищутся в этом двумерном пространстве.

Описан также следующий способ работы с динамическими графами (Box and Jenkins, 1990): графу ставится в соответствие некое число (расчетный показатель) и далее применяются стандартные методы поиска аномалий во временных рядах. Например, расхождения с моделью ARIMA.

В статье Akoglu and Faloutsos (2010) авторы осуществляют следующую последовательность операций:

  1. выделяют для каждого узла графа для каждого момента времени F-признаков;
  2. для каждого признака с временным окном W считают корреляционные матрицы между узлами;
  3. выделяют собственные векторы и далее рассматривают лишь первый собственный вектор;
  4. параллельно выделяют типичное поведение собственных векторов корреляционной матрицы (для этого делается еще одно SVD-разложение над матрицей изменения всех собственных векторов корреляционной матрицы во времени);
  5. сравнивают (через косинусное произведение) с реальным поведением этого вектора, получая таким образом показатель аномальности рассматриваемого временного окна.

Матричное разложение используется также и в статье Rossi (2013):

  1. аналогично предыдущему подходу выделяется по F-признаков на узел на каждый временной промежуток;
  2. для каждого временного промежутка производится NMF-разложение, при котором каждому узлу ставится в соответствие роль;
  3. далее мониторится изменение ролей каждого узла.

Матричное разложение для интерпретации результатов


Отдельно хочется отметить приведенные авторами методы аппроксимации матриц альтернативные по отношению к давно известным SVD, PCA, NMF: CUR (Drineas et al., 2006), CMD (Sun et al. 2007b) и Colibri (Tong et al. 2008). Основным преимуществом этих методов является интерпретируемость, поскольку в отличии от SVD, переводящего точки в другое пространство, эти методы оставляют пространство нетронутым, лишь сэмплируя точки из него. Наиболее простым из них является CUR, у которого авторы отмечают два недостатка: в нем точки выбираются из матрицы с повторением. В CMD удается убрать этот недостаток, однако как и в CUR, этому методу присуща линейная избыточность, которую удается избежать авторам алгоритма Colibri. Хотя методы были изобретены именно для решения задач поиска аномалий в графах методами матричной аппроксимации, их использование может быть перспективным и для других задач.

В задачах, обсуждаемых в этом обзоре, эти подходы применяются по следующему принципу: производится аппроксимация и оценивается, насколько различные столбцы/строки отличаются у аппроксимированной матрицы от изначальной. Также авторы отмечают метод NrMF (Tong and Lin 2011), модификация NMF, в котором ограничение на неотрицательность накладывается на матрицу остатков R, поскольку именно в ней сосредоточена основная информация по отличию апроксимации от изначальной матрицы, а отрицательные значения в таком случае было бы сложно интерпретировать. Тем не менее, до конца не ясно, почему нельзя аналогичным образом использовать SVD для декомпозиции, последующей реконструкции и последующим расчетом отличия от изначальной матрицы.


Определение узлов, связывающих аномальные


При анализе результатов может возникнуть задача определить узлы, связанные с аномальными. Так, например, как аномальный может быть определен узел, который подвергся DDoS-атаке, в то время как атакующие узлы не определены. Или как аномальные могут быть определены члены какой-то группировки, в то время как люди, руководящие ими, не определены как аномальные. Для решения этой задачи авторы предлагают несколько подходов, основной идеей которых является выделение подграфа из полного графа, который содержит аномальные узлы и узлы, лучше всего их связывающие.

  1. Определение связного подграфа (connection subgraph) (Faloutsos et al., 2004). Проблему предлагается решать в терминах электротехники, присваивая одному узлу положительный потенциал, а другим узлам нулевой, и смотреть, как будет течь ток между ними, если присвоить ребрам некое сопротивление.
  2. Center-Piece Subgraphs (CePS) (Tong and Faloutsos, 2006). В отличие от предыдущего метода предпринимается попытка выделить лишь k-узлов из всех аномальных, поскольку совершенно не обязательно все узлы заданы. При этом k необходимо задавать.
  3. Dot2Dot (Akoglu et al., 2013b; Chau et al., 2012). В этом подходе авторы решают задачу группировки выбранных узлов и уже далее выделяют узлы, их связывающие.

Примеры поиска аномалий в различных сферах


Авторы описывают кейсы, где применялись методы обнаружения аномалий в графах.

Телекоммуникации. Целью являются люди, пользующиеся услугами бесплатно. Cortes et al. (2002) искали подграфы, тесно связанные с ключевым узлом по параметрам числа и продолжительности звонков. Наблюдения, которые авторы обнаружили: фродовые аккаунты оказались связаны, то есть нарушители или сами звонили друг другу, или звонили на одни и те же телефоны. Второе наблюдение нарушителей можно обнаружить по схожести их подграфов, определенных предложенным образом.

Онлайн-аукцион. Нарушители создают себе фейковые аккаунты и накручивают им рейтинги. Их не получается отследить по обычным агрегатным показателям, но возможно увидеть по графу. Аккаунты нарушителей более связаны с фейковыми аккаунтами, чем с хорошими аккаунтами. Фейки связаны примерно в равной степени с аккаунтами нарушителей и с хорошими. Последние в основном связаны с подобными себе аккаунтами. Pandit et al. (2007) решают эту задачу через приведение к реляционным марковским сетям (relational markov networks) и далее классифицируют узлы через Loopy Belief Propagation (метки класса итеративно распространяются по графу).

Транзакции. McGlohon et al. (2009) решают эту задачу через реляционную (relational) классификацию в предположении, что нарушители будут близко расположены друг к другу. То есть аналогично подходу из предыдущего примера.

Брокеры, которые жульничают с ценными бумагами. Здесь Neville et al. (2005) анализируют мультимодальный граф, выделяя подграфы, включающие человека под подозрением, его коллег, фирмы, с которыми он связан и т. п. Они рассчитывают агрегированные атрибуты и приписывают их центральному узлу. Далее используют реляционные вероятностные деревья (relational probability trees (Neville et al. 2003)) для реляционной классификации.

Поиск фейковых постов на форумах, дающих заведомо ложную информацию. Авторы описывают несколько подходов, с использованием признакового описания, анализа текста и графовых методов. Графовые методы, использованные Wang et al. (2011a), применялись для ситуации, когда в задаче присутствуют обзоры какого-то товара. В предложенном ими алгоритме предлагалось присваивать рецензентам показатели степени доверия им, их обзорам достоверности и товарам показатели надежности. Все эти показатели взаимосвязаны. Так, насколько можно доверять рецензенту, зависит от того, насколько у него достоверные обзоры. Надежность товаров зависит от степени доверия рецензентам, которые его описывают, а достоверность обзоров зависит от надежности товара, по которым они пишутся, и от доверия их авторам. Предлагаемый алгоритм сначала их случайно инициализирует, а затем итеративно улучшает оценку.

Трейдинг. Мошенники сначала совершают большое число транзакций друг с другом по какому-то типу акций, увеличивая их привлекательность, а затем, когда акции повышаются в цене, распродают их другим трейдерам. Оба этих последовательных инцидента можно отследить по графовым данным. В первом случае будет выделяться подграф, где нет никаких внешних транзакций (именуется черная дыра), а через временной промежуток этот же подграф преобразуется к подграфу, в котором сильно преобладают транзакции из подграфа в другую часть графа (именуется вулкан). Авторы ссылаются на работу Li et al. (2010).

Веб-ресурсы. Одним из первых подходов для борьбы с плохими веб-сайтами предлагалось распространение показателей надежности и ненадежности ресурсов. Если есть ссылка с одной страницы на другую, то для последней это увеличивает ее статус надежной. Если страница указывает на другую страницу, для которой известно, что она спам, то это снижает надежность изначальной страницы. Упоминается алгоритм TrustRank (Gyngyi et al., 2004) модификация PageRank для борьбы с веб-спамом. Для него требуется, чтобы изначально эксперты разметили часть сайтов, как надежные. Эти показатели далее распространяются по графу, постепенно затухая. Anti-TrustRank (Krishnan and Raj, 2006) следует этому же принципу, но с распространением показателей ненадежности от размеченных заведомо ненадежных сайтов. У обоих методов есть недостаток, что надежность делится по числу дочерних узлов. Benczr et al. (2005) предлагают совершенно иной подход: анализировать PageRank узла и соседних с ним. Распределение PageRank таких подграфов должно подчиняться некому степенному закону. Для тех же узлов, для которых распределение PageRank их соседей выбивается из этого закона, присваивается штраф. В работе (Castillo et al., 2007) предлагается сначала обучать классификатор на известных надежных и ненадежных страницах, а затем размывать результат скоринга остальных веб-сайтов по графу.

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

Атаки в компьютерных сетях. Sun et al. (2008) успешно применяют для решения этой задачи матричное разложение (CMD). Ding et al. (2012) используют подход основанный на поиске сообществ, выделяя в качестве подозрительных узлы-мосты между сообществами.

Заключение


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

Если интересно почитать про стандартные методы обнаружения аномалий, то у я уже писал про это год назад на Хабре в этой статье.

Если вас интересует тема, то, чтобы получить больше информации, обязательно нужно идти в слак ODS (OpenDataScience), в каналы #network_analysis и #class_cs224w, смотреть курс Стэнфорда cs224w.

Еще недавно был прочитан курс по Knowledge Graphs. Ну и, конечно, нужно прочитать саму статью Graph based anomaly detection and description: a survey от авторов Leman Akoglu, Hanghang Tong, Danai Koutra (Akoglu, 2015), о которой идет речь в этом посте. Я перевел ее не всю, а только те фрагменты, которые счел важными, и понял в какой-то степени. Большинство авторов ссылаются именно на эту статью, потому что больше обзоров такого уровня и широты по теме нет. По крайней мере, я не нашел таких.

Список литературы

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

Перевод Лучшие инструменты с открытым исходным кодом и библиотеки для Deep Learning ICLR 2020 Experiencebi

22.09.2020 10:23:41 | Автор: admin
Сложно найти на Хабре человека, который не слышал бы про нейронные сети. Регулярные новости о свежих достижениях нейронных сетей заставляют удивляться широкую публику, а также привлекают новых энтузиастов и исследователей. Привлеченный поток специалистов способствует не только еще большим успехам нейронных моделей, но и приводит к развитию инструментов для более удобного использования Deep Learning подходов. Помимо всем известных фреймворков Tensorflow и PyTorch активно развиваются и другие библиотеки, нередко более гибкие, но менее известные.

Эта статья является переводом одного из постов neptune.ai и освещает самые интересные инструменты для глубокого обучения, представленные на конференции по машинному обучения ICLR 2020.


Где создается и обсуждается передовое глубокое обучение?


Одним из главных мест обсуждения Deep Learning является ICLR ведущая конференция по глубокому обучению, которая состоялась 27-30 апреля 2020 года. Более 5500 участников и почти 700 презентаций и докладов это большой успех для полностью онлайн-мероприятия. Найти исчерпывающую информацию о конференции вы можете здесь, здесь или здесь.

Виртуальные социальные встречи были одной из изюминок ICLR 2020. Организаторы решили запустить проект под названием Open source tools and practices in state-of-the-art DL research. Тема была выбрана из-за того, что соответствующий инструментарий является неизбежной частью работы исследователя глубокого обучения. Достижения в этой области привели к распространению крупных экосистем (TensorFlow, PyTorch, MXNet), а также более мелких целевых инструментов, отвечающих за решение конкретных потребностей исследователей.

Цель упомянутого мероприятия заключалась во встрече с создателями и пользователями инструментов с открытым исходным кодом, а также в обмене опытом и впечатлениями среди сообщества Deep Learning. В общей сложности было собрано более 100 человек, включая основных вдохновителей и руководителей проектов, которым мы дали короткие промежутки времени для представления своей работы. Участники и организаторы были удивлены широким разнообразием и креативностью представленных инструментов и библиотек.

В этой статье собраны яркие проекты, представленные с виртуальной сцены.

Инструменты и библиотеки


Далее будут рассмотрены восемь инструментов, которые были продемонстрированы на ICLR с подробным обзором возможностей.

Каждый раздел представляет ответы на ряд пунктов в очень сжатой форме:

  1. Какую проблему решает инструмент / библиотека?
  2. Как запустить или создать минимальный пример использования?
  3. Внешние ресурсы для более глубокого погружения в библиотеку / инструмент.
  4. Профиль представителей проекта на случай, если будет желание к ним обратиться.

Вы можете перейти к конкретному разделу ниже или просто просмотреть их все один за другим. Наслаждайтесь чтением!

AmpliGraph


Тема: Модели эмбеддингов на основе Knowledge Graph.
Язык программирования: Python
Автор: Люка Костабелло
Twitter | LinkedIn | GitHub | Интернет сайт

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

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

AmpliGraph это набор моделей машинного обучения под лицензией Apache2 для извлечения эмбеддингов из графов знаний. Такие модели кодируют узлы и ребра графа в вектором виде и объединяют их для предсказания недостающих фактов. Графовые эмбеддинги применяются в таких задачах, как в довершение графа знаний, обнаружение знаний, кластеризация на основе связей и другие.

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

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


Модели машинного обучения AmpliGraph генерируют графовые эмбеддинги, представления в векторном пространстве.

Далее эмбеддинги объединяются со специальными функциями для того, что прогнозировать новые и не замеченные ранее связи.

AmpliGraph изначально был разработан в Accenture Labs Dublin, где он и используется в различных промышленных проектах.

Automunge


Платформа подготовки табличных данных
Язык программирования: Python
Автор: Николас Тиг
Twitter | LinkedIn | GitHub | Интернет сайт

Automunge библиотека Python, помогающая в подготовке табличных данных для использование в машинном обучении. Посредством инструментария пакета возможны простые преобразования для feature engeenering-a с целью нормализации, кодировки и заполнения пропусков. Преобразования применяются к тренировочной подвыборке, а затем аналогичным образом применяются к данным из тестовой подвыборки. Преобразования могут выполняться в автоматическом режиме, назначаться из внутренней библиотеки или гибко настраиваться пользователем. Варианты заполнения включают заполнение на основе машинного обучения, в котором модели обучаются для каждого столбца данных прогнозировать недостающую информацию.

Проще говоря:

automunge (.) подготавливаются табличные данные для использования в машинном обучении,

postmunge (.) последовательно и с высокой эффективностью обрабатываются дополнительные данные.

Automunge доступен для установки посредством pip:


После установки достаточно импортировать библиотеку в Jupyter Notebook для инициализации:


Для автоматической обработки данных из тренировочной выборки с параметрами по умолчанию достаточно использовать команду:


Далее для последующей обработки данных из тестовой подвыборки, достаточно запустить команду, использующую словарь postprocess_dict, полученный вызовом automunge (.) выше:


С помощью параметров assigncat и assigninfill в вызове automunge (.) могут быть определены детали преобразований и типы данных для заполнения пропусков. Например, для набора данных со столбцами 'column1' и 'column2' можно назначить масштабирование на основе минимальных и максимальных значений ('mnmx') с ML-заполнением пропусков для column1 и one-hot encoding ('text') с заполнением пропусков на основе наиболее часто встречающегося значения для column2. Не указанные в явном виде данные из других столбцов будут обрабатываться автоматически.


Ресурсы и ссылки

Сайт | GitHub | Краткая презентация

DynaML


Машинное обучение для Scala
Язык программирования: Scala
Автор: Мандар Чандоркар
Twitter | LinkedIn | GitHub

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

  • разработке / макетировании моделей,
  • работе с громоздкими и сложными pipelines,
  • визуализацией данных и результатов,
  • повторном использовании кода в виде скриптов и Notebook-ов.

DynaML использует сильные стороны языка и экосистемы Scala для создания среды, обеспечивающей производительность и гибкость. Он основан на таких превосходных проектах, как Ammonite scala, Tensorflow-Scala и библиотеке высокопроизводительных численных расчётов Breeze.

Ключевым компонентом DynaML является REPL / оболочка, которая имеет подсветку синтаксиса и продвинутую систему автозаполнения.

Скопируйте и вставьте фрагменты кода в командную строку, чтобы запустить их.

Среда поставляется с поддержкой 2D и 3D-визуализации, результаты могут быть отображены непосредственно из командной оболочки.

3D-диаграммы отображаются с помощью Java API jzy3d.

Модуль data pipes позволяет легко создавать pipelines обработки данных в пригодном для компоновки модульном виде. Создавайте функции, оборачивайте их с помощью конструктора DataPipe и составляйте блоки функций с помощью оператора >.

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

Также доступна экспериментальная функция интеграции c Jupyter notebook, каталог notebooks в репозитории содержит несколько примеров использования ядра DynaML-Scala Jupyter.

Notebook c линейной регрессией (linear-regression notebook) демонстрирует использование низкоуровневого API Tensorflow для вычисления коэффициентов линейной регрессионной модели.

Руководство пользователя содержит обширнуюсправочную информацию и документацию для освоения и получения максимальной отдачи от среды DynaML.

Ниже приводятся некоторые интересные приложения, которые подчеркивают сильные стороны DynaML:


Ресурсы и ссылки

GitHub | Руководство пользователя

Hydra


Configuration and parameters manager
Язык программирования: Python
Автор: Омры Ядан
Twitter | GitHub

Разработанная в Facebook AI, Hydra платформа Python, которая упрощает разработку исследовательских приложений, предоставляя возможность создавать и переопределять конфигурации с помощью конфигурационных файлов и командной строки. Платформа также обеспечивает поддержку автоматической развертки параметров, удаленное и параллельное выполнение посредством плагинов, автоматическое управление рабочим каталогом и динамическое предложение вариантов дополнения с помощью нажатия клавиши TAB.

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

Основной пример

В приведенном примере используется конфигурация базы данных, но вы можете легко заменить ее моделями, датасетами или чем-либо еще по необходимости.

config.yaml:


my_app.py:


Вы можете переопределить что угодно в конфигурации из командной строки:


Пример композиции:

Возможно, вы захотите переключаться между двумя разными конфигурациями баз данных.

Создать эту структуру директорий:


config.yaml:


defaults это специальная директива, указывающая Hydra использовать db / mysql.yaml при составлении объекта конфигурации.

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


Ознакомьтесь с туториалом, чтобы узнать больше.

Кроме того, в ближайшее время появятся новые интересные функции:

  • строго типизированные конфигурации (структурированные конфигурационные файлы),
  • оптимизация гиперпараметров с помощью плагинов Ax и Nevergrad,
  • запуск AWS с помощью плагина Ray launcher,
  • локальный параллельный запуск посредством плагина joblib и многое другое.

Larq


Бинаризованные нейронные сети
Язык программирования: Python
Автор: Лукас Гайгер
Twitter | LinkedIn | GitHub

Larq это экосистема пакетов Python с открытым исходным кодом для построения, обучения и развертывания бинаризованных нейронных сетей (BNN). BNN это модели глубокого обучения, в которых активации и веса кодируются не с использованием 32, 16 или 8 бит, а с использованием только 1 бита. Это может значительно ускорить время логического вывода и снизить энергопотребление, что делает BNN идеально подходящими для мобильных и периферийных устройств.

Экосистема Larq с открытым исходным кодом состоит из трех основных компонентов.

  1. Larq это мощная, но простая в использовании библиотека для построения и обучения крайне квантованных нейронных сетей. Она предлагает единообразные и простые API, которые расширяемы и обладают совместимостью с более крупной экосистемой TensorFlow Keras. Это позволяет сделать постепенное внедрение в текущую кодовую базу и обеспечивает быструю итерацию при разработке моделей. Хотя библиотека Larq в основном ориентирована на BNNs, она также может быть использована для обучения сетей с произвольными функциями активации и весами произвольной точности.
  2. Larq Zoo предоставляет базовые реализации BNNs, доступные наряду с предобученными весами. Целью Larq Zoo является стимулирование воспроизводимых исследований, а исследователям предоставляется возможность использовать последние достижения из литературы по BNN без затрат времени на попытки воспроизвести существующие работы.
  3. Larq Compute Engine это библиотека для логического вывода и развертывания BNNs. Она собрана поверх TensorFlow Lite и включает в себя конвертер на основе MLIR для преобразования моделей Larq в файлы FlatBuffer, совместимые с окружением TF Lite. В настоящее время он поддерживает мобильные платформы на базе ARM64, такие, как телефоны на Android и Raspberry Pi, и достигает самой высокой производительности в скорости логического вывода на устройствах с помощью ядер двоичной свертки, оптимизированных вручную, а также оптимизации на сетевом уровне для моделей BNN.

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

Ресурсы и ссылки

Сайт | GitHub larq / larq | GitHub larq / zoo | GitHub larq / compute-engine | Учебники | Блог | Twitter

McKernel


Ядерные методы в логарифмически линейное время
Язык программирования: C/C++
Автор: J. de Curt i Daz
Twitter | Интернет-сайт

Первая библиотека C++ с открытым исходным кодом, предоставляющая как аппроксимацию ядерных методов на основе случайных признаков, так и полноценный Deep Learning фреймворк.

McKernel предоставляет четыре различные возможностииспользования.

  1. Самодостаточный молниеносный код Адамара с открытым исходником. Для использования в таких областях, как компрессия, шифрование или квантовые вычисления.
  2. Чрезвычайно быстрые ядерные методы. Могут использоваться везде, где методы SVM (Метод Опорных Векторов: ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2) превосходят Deep Learning. Например, в некоторых приложениях робототехники и ряде случаев использования машинного обучения в здравоохранении, а также в других областях, включают Federated Learning и выбор канала коммуникации.
  3. Интеграция методов Deep Learning и ядерных методов, позволяет развивать Deep Learning архитектуры в априорно антропоморфном / математическом направлении.
  4. Исследовательский фреймворк Deep Learning для решения ряда открытых вопросов в машинном обучении.

Уравнение, описывающее все вычисления, выглядит следующим образом:


Здесь авторы в качестве первопроходцев применяют формализм для объяснения с помощью случайных признаков как методов Deep Learning, так и ядерных методов. Теоретическая основа опирается на четырех гигантов: Гаусса, Винера, Фурье и Калмана. Фундамент для этого был заложен Рахими и Рехтом (NIPS 2007) и Le et al. (ICML 2013).

С прицелом на типичного пользователя

Основной аудиторией McKernel являются исследователи и практические специалисты в области робототехники, машинного обучения для здравоохранения, обработки сигналов и коммуникаций, которые нуждаются в эффективной и быстрой реализации на C++. В описанном случае большинство библиотек Deep Learning не удовлетворяют заданным условиям, поскольку они по большей части основаны на высокоуровневых реализациях на Python. Кроме того, аудиторией могут быть представители более широкого сообщества машинного обучения и Deep Learning, которые пребывают в поиске улучшения архитектуры нейронных сетей, используя ядерные методы.

Сверхпростой наглядный пример для запуска библиотеки без затрат времени выглядит следующим образом:


Что дальше?

Сквозное обучение, self-supervised learning, meta-learning, интеграция с эволюционными стратегиями, существенное сокращение пространства поиска с помощью NAS ,

Ресурсы и ссылки

GitHub | Полная презентация

SCCH Training Engine


Подпрограммы для автоматизации Deep Learning
Язык программирования: Python
Автор: Наталья Шепелева
Twitter | LinkedIn | Интернет-сайт

Разработка типичного pipeline для Deep Learning довольно стандартна: предварительная обработка данных, проектирование/реализация задачи, обучение модели и оценка результата. Тем не менее, от проекта к проекту его использование требует участия инженера на каждом этапе разработки, что ведет к повторению одних и тех же действий, дублированию кода и в конце концов приводит к ошибкам.

Целью SCCH Training Engine является унификация и автоматизация процедуры Deep Learning разработки для двух самых популярных фреймворков PyTorch и TensorFlow. Архитектура с одним входом позволяет минимизировать время разработки и защищает от программных ошибок.

Для кого?

Гибкая архитектура SCCH Training Engine обладает двумя уровнями взаимодействия с пользователем.

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

Продвинутый. Благодаря модульной концепции компонент, пользователь может модифицировать модули в соответствии со своими потребностями, разворачивая свои собственные модели и используя различные функции потерь и метрики качества. Подобная модульная архитектура позволяет добавлять дополнительные признаки, не мешая работе основного pipeline-а.


Что он может делать?

Текущие возможности:

  • работа с TensorFlow и PyTorch,
  • стандартизированный pipeline парсинга данных из различных форматов,
  • стандартизированный pipeline тренировки модели и валидации результатов,
  • поддержка задач классификации, сегментации и детекции,
  • поддержка кросс-валидации.

Возможности на стадии разработки:

  • поиск оптимальных гиперпараметров модели,
  • загрузка весов модели и тренировка от конкретной контрольной точки,
  • поддержка архитектуры GAN.

Как это работает?

Чтобы увидеть SCCH Training Engine во все красе, вам нужно сделать два шага.

  1. Просто скопируйте репозиторий и установите требующиеся пакеты с помощью команды: pip install requirements.txt.
  2. Запустите python main.py, чтобы увидеть учебный пример MNIST с процессом обработки и обучения на модели LeNet-5.

Всю информацию о том, как создать файл конфигурации и как использовать продвинутые возможности, можно найти на странице GitHub.

Стабильный релиз с основными функциями: был запланирован на конец мая 2020 г.

Ресурсы и ссылки

GitHub | Интернет-сайт

Tokenizers


Текстовые токенизаторы
Язык программирования: Rust с Python API
Автор: Энтони Муа
Twitter | LinkedIn | GitHub

huggingface/tokenizers обеспечивает доступ к самым современным токенизаторам, с акцентом на производительность и многоцелевое использование. Tokenizers позволяет обучать и использовать токенизаторы без усилий. Токенизаторы могут помочь вам независимо от того, являетесь ли вы ученым или практиков в области NLP.

Ключевые особенности

  • Чрезвычайная скорость: токенизация не должна быть узким местом в вашем pipeline, кроме того вам не нужно заниматься предварительной обработкой ваших данных. Благодаря нативной реализации на Rust, токенизация гигабайт текстов занимает всего несколько секунд.
  • Смещения / выравнивание: обеспечивает контроль смещения даже при обработке текста со сложной процедурой нормализации. Это позволяет легко извлекать текст для таких задач, как NER или question answering.
  • Предварительная обработка: заботится о любой предварительной обработке, необходимой перед подачей данных в вашу языковую модель (усечение, заполнение, добавление специальных токенов и т. д.).
  • Простота в обучении: Тренируйте любой токенизатор на новом корпусе. Например, обучение токенизатора для BERT на новом языке никогда не было таким простым.
  • Multi-languages: связка с несколькими языками. Прямо сейчас вы можете начать использовать его с Python, Node.js, или Rust. Работа в этом направлении продолжается!

Пример:


И скоро:

  • сериализация в единый файл и загрузка в одну строчку для любого токенизатора,
  • поддержка Unigram.

Hugging Face видят свою миссию в том, чтобы помогать в продвижении и демократизации NLP.

Ресурсы и ссылки

GitHub huggingface / трансформеры | GitHub huggingface / токенизаторы | Twitter

Заключение


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

Мы в компании CleverDATA стараемся следить за появлением новых инструментов и полезных библиотек, а также активно применяем свежие подходы в нашей работе, связанной с использованием Deep Learning и Машинного Обучения. Со своей стороны я хотел бы обратить внимание читателей на эти две библиотеки, не вошедшие в основную статью, но существенно помогающие в работе с нейронными сетями: Catalyst (https://github.com/catalyst-team/catalyst) и Albumentation (https://pypi.org/project/albumentations/).

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

Благодарю за внимание и надеюсь, что представленный набор библиотек окажется полезным в вашей работе!
Подробнее..

Перевод ТОП-10 трендов в сфере данных и аналитики 2021. Версия Gartner

15.06.2021 10:13:02 | Автор: admin
Оракул технологического мира Gartner регулярно и охотно делится с обществом своими наблюдениями относительно текущих трендов. Эксперты компании составили подборку из 10 трендов в сфере данных и аналитики, которые стоит учитывать ИТ-лидерам в 2021 году от искусственного интеллекта до малых данных и применения графовых технологий.

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

Источник

Коротко о трендах


В предложенном материале Gartner выделяет ряд трендов в индустрии, связанной с машинным обучением и искусственным интеллектом. Не стоит ожидать, что статья откроет новые горизонты: в ней собраны те особенности и тренды, которые уже прошли этап новаторства, а также этап привлечения ранних последователей, однако если не обратить должного внимания на отмеченные тенденции, то можно опоздать даже попасть в категорию отстающих последователей. Кроме того, в статье явно прослеживаются рекламные и побудительные элементы, нацеленные на аудиторию, влияющую на инновации в своей области бизнеса, т.е. на основную аудиторию Gartner. В процессе перевода не удалось уйти от упомянутых элементов, однако рекомендуется к ним относиться снисходительно, т.к. эти рекламные вставки перемежаются ценной информацией. Некоторые из трендов напрямую связаны с изменениями в индустрии, к которым привела эпидемиологическая обстановка. Другие с растущей популярностью систем автоматического принятия решений и использованию ИИ в бизнес-аналитике. Отдельно хочется отметить тренд, связанный с графовыми методами, которые быстро развиваются и набирают все большую популярность. Тем не менее, некоторые из них носят скорее номинальный характер. Одним из таких номинальных трендов на первый взгляд кажется термин XOps, в котором Gartner объединяет направления DataOps, ModelOps и DevOps, комментируя свое видение следующим образом: Умножение дисциплин Ops, вытекающих из лучших практик DevOps, вызвало значительную путаницу на рынке. Тем не менее, их согласование может принести значительные преимущества организациям, которые способны гармонизировать эти дисциплины Практики XOps объединяют разработку, развертывание и обслуживание, чтобы создать общее понимание требований, передачу навыков и процессов для мониторинга и поддержки аналитики и артефактов ИИ. В этом, казалось бы, номинальном тренде, прослеживается мысль, отсылающая к теме Франкенштейна: мало состыковать отдельные рабочие части компании, т.к. они будут функционировать хаотично и не согласовано, жизнь и полезная активность начнется после того, как эти разрозненные части будут синхронизированы и гармонизированы. Но не буду раскрывать все карты сразу, предлагаю читателю самостоятельно ознакомиться с находками Gartner далее.

Как изменилась работа data-специалистов


По словам экспертов Gartner, на фоне COVID-19 организации, использующие традиционные методы аналитики, которые в значительной степени полагаются на большие объемы исторических данных, осознали одну важную вещь: многие из этих моделей больше не актуальны. По сути, пандемия изменила все, сделав множество данных бесполезными. В свою очередь, прогрессивные команды, занимающиеся обработкой данных и аналитикой, все больше переходят от традиционных методов искусственного интеллекта, основанных на больших данных, к классу аналитики, использующей малые или более разнообразные данные.

Переход от больших данных к малым и широким данным одна из главных тенденций в области данных и аналитики на 2021 год, которую выделяет Gartner. Этот тренд отражает динамику бизнеса, рынка и технологий, которую лидеры, работающие в области данных и аналитики, не могут позволить себе игнорировать, отмечают эксперты компании.

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

Каждая из тенденций соответствует одной из трех основных тем:

  1. Ускорение изменений в данных и аналитике: использование инноваций в области искусственного интеллекта, улучшенная возможность по компоновке, а также более гибкая и эффективная интеграция разнообразных источников данных.
  2. Операционализация ценности бизнеса посредством более эффективного использования XOps: позволяет лучше принимать решения и превращать данные и аналитику в неотъемлемую часть бизнеса.
  3. Принцип все распределено: предполагает гибкое соотнесение данных и идей для расширения возможностей более широкой аудитории людей и объектов.

Тренд 1. Продвинутый, ответственный, масштабируемый ИИ


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

Хотя традиционные методы ИИ могут в значительной степени полагаться на исторические данные, учитывая, как COVID-19 изменил бизнес-ландшафт, исторические данные могут больше не иметь значения. Это означает, что технология ИИ должна быть способна работать с меньшим количеством данных с помощью методов малых данных и адаптивного машинного обучения. Эти системы ИИ также должны защищать приватность, соблюдать федеральные правила и минимизировать предвзятость для поддержки этичного ИИ.

Тренд 2. Составные данные и аналитика


Целью составных данных и аналитики является использование компонентов из множества данных, аналитики и решений ИИ для создания гибкого, удобного, адаптированного под потребности пользователей интерфейса, который позволит руководителям связывать аналитические данные с бизнес-действиями. Запросы клиентов Gartner показывают, что в большинстве крупных организаций имеется более одного стандартного корпоративного инструмента аналитики и бизнес-аналитики.

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

Тренд 3. Фабрика данных как основа


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

Фабрика данных сокращает время на проектирование интеграции на 30%, развертывание на 30% и поддержку на 70%, поскольку технологические разработки основаны на возможности использования / повторного использования и комбинирования различных стилей интеграции данных. Кроме того, фабрики данных могут использовать существующие навыки и технологии из data-хабов (data hubs), озер данных (data lakes) и хранилищ данных (data warehouses), а также внедрять новые подходы и инструменты для будущего.

Тренд 4. От больших данных к малым и широким данным


Малые и широкие данные, в отличие от больших данных, решают ряд проблем для организаций, которые сталкиваются со все более сложными вопросами, касающимися ИИ, и проблемами, связанными с редкими вариантами использования данных. Широкие данные с использованием методов X-аналитики позволяют анализировать и объединять многообразие малых и широких, неструктурированных и структурированных источников данных для повышения осведомленности о контексте и принимаемых решениях. Малые данные, как следует из названия, могут использовать модели данных, которые требуют меньше данных, но все же предлагают полезные инсайты.

Источник

Тренд 5. XOps


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

Тренд 5. XOps. Источник

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

Тренд 6. Проектирование интеллекта принятия решений


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

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

Тренд 7. Данные и аналитика как ключевая бизнес-функция


Руководители бизнеса начинают понимать важность использования данных и аналитики для ускорения инициатив цифрового бизнеса. Вместо того, чтобы быть второстепенной задачей, выполняемой отдельной командой, данные и аналитика переключаются на основную функцию. Однако руководители предприятий часто недооценивают сложность данных и в конечном итоге упускают возможности. Если директора по данным (CDO) участвуют в постановке целей и стратегий, они могут увеличить стабильное производство стоимости бизнеса в 2,6 раз.

Тренд 8. Графы в основе всего


Графовые подходы формируют основу современных данных и аналитики, предоставляя возможности для усиления и улучшения взаимодействия c пользователями, моделей машинного обучения и интерпретируемого ИИ. Хотя графические технологии не новы для данных и аналитики, произошел сдвиг в мышлении вокруг них, поскольку организации выявляют все больше вариантов их использования. Фактически, до 50% запросов клиентов Gartner о ИИ связаны с обсуждением использования graph-технологий.

Источник

Тренд 9. Расширение пользовательского опыта


Традиционно бизнес-пользователи были ограничены использованием преднастроенных панелей аналитики (dashboard) и ручных инструментов исследования данных. Чаще всего это предполагало, что панели аналитики ограничивались работой дата-аналитиков или гражданских специалистов по данным, которые изучали заранее определенные вопросы.

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

Тренд 10. Данные и аналитика впереди планеты всей


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

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

В заключение


Сложно переоценить слова Gartner: наблюдаемые тренды, безусловно, играют немаловажную роль в дальнейшей судьбе индустрии. В отмеченных трендах явно выделяется фокус на инженерную составляющую индустрии ИИ: поддержка и контроль качества моделей машинного обучения, ответственность и масштабируемость ИИ, повсеместность использования и т.д. Это наблюдение лишний раз подтверждает то, что долина разочарования, связанная с проектами по применению ИИ уже пройдена, мир принял технологию и теперь более актуальными становятся вопросы интеграции, оптимизации, контроля качества и надежности.

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

Неявные нейронные представления с периодическими функциями активации

13.04.2021 10:07:06 | Автор: admin
Знакомые с нейронными сетями читатели скорее всего слышали про термин функция активации. Такие варианты функции активации, как сигмоида, гиперболический тангенс (TanH) и ReLU (линейный выпрямитель), активно применяются в нейронных сетях и широко известны энтузиастам, занимающимся экспериментами с нейронными архитектурами. Исследователи нейронных сетей не останавливаются на достигнутом и подбирают альтернативы, позволяющие расширить границы возможностей. Один из вариантов подхода, предложенного в 2020 году, показывает выдающиеся результаты по сравнению с классическими функциями активации. Про впечатляющие отличия и пойдет речь в этой статье: на основе материала Vincent Sitzmann, Julien N. P. Martel, Alexander Bergman, David B. Lindell, Gordon Wetzstein и кода на нескольких наглядных примерах будет продемонстрировано превосходство нового метода.


Для работы с сигналами можно использовать различные формы их представления. Простой пример сигнал в форме таблицы, где для каждого временного шага имеется определенное значение переменной (температуры или др.). Такой сигнал будет представлен в дискретной форме, что в ряде случаев неудобно (так, при воспроизведении звука необходимо перейти от дискретного представления к непрерывному). Другой формой представления сигнала может быть заданная функция зависимости переменной f от времени t, тогда можно говорить о функции f(t). Такая форма представления сигнала имеет ряд преимуществ, например, возможность экстраполяции. Сигнал, разложенный на ряд Фурье, также представляет из себя удобную форму, позволяющую рассчитать спектр мощности, выделить характерные частоты и др. Интересно, что нейронная сеть также является формой представления сигнала, и свойства такого представления напрямую связаны с функцией активации нейронов.

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

Для использования синусоидальной функции активации получаем следующую формулу:


Здесь i: RMi RNi обозначает i-ый слой сети, Wi R NiMi представляет собой матрицу весов, ответственную за аффинные преобразования сигнала, а bi RNi представляет собой байесову добавку к вектору xi RMi

Интересно, что производная от предложенной функции активации также является синусоидальной функцией, т.к. производная от функции синуса является функция косинуса, которая в свою очередь является сдвинутой по фазе функцией синуса. Кроме того, синусоидальная функция активации позволяет аппроксимировать тождественную функцию около начала координат.

Таким образом, синусоидальная функция активации обладает рядом полезных свойств, таких, как нелинейность, непрерывная дифференцируемость и возможность аппроксимации тождественной функции около начала координат. Теперь давайте перейдем к теме статьи Vincent Sitzmann, Julien N. P. Martel, Alexander Bergman, David B. Lindell, Gordon Wetzstein.


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

Форма представления сигнала, параметризованная с помощью нейронной сети, и обладающая свойствами неявного определения, непрерывности и дифференцируемости, представляет собой отдельное направление в развитии нейронных архитектур. Такой подход способен предложить ряд преимуществ по сравнению с традиционными представлениями и поэтому может быть выделен в отдельную парадигму. Авторы статьи, в рамках новой парадигмы, предлагают использовать функции периодической активации для неявных нейронных представлений. Новый подход, под названием Сети Синусоидального Представления (sinusoidal representation networks) или SIREN, в работе авторов демонстрирует впечатляющие результаты в приложении к сложным сигналам физической природы и их производным.

В основной работе авторы анализируют статистические свойства активации SIREN, чтобы предложить принципиальную новую схему задания начальных значений для весов сети, и демонстрируют работу с изображениями, волновыми полями, видео, звуком и их производными. Далее авторы показывают, как можно использовать SIREN для решения сложных краевых задач, таких, как точное уравнение Эйконала (с получением функций расстояния со знаком), уравнение Пуассона, а также уравнения Гельмгольца и уравнения волнового движения. Наконец, авторы в своей статье объединили SIREN с гиперсетями для изучения априорных вероятностей в пространстве функций SIREN, однако этот материал уже выходит за рамки нашего обзора.

Baselines


Следующие результаты сравнивают SIREN с различными сетевыми архитектурами. TanH, ReLU, Softplus и т. д. означает Multi Layer Perceptron одинакового размера с соответствующей функцией нелинейности. Авторы также сравнивают недавно предложенное позиционное кодирование (Partial Encoding) в сочетании с нелинейной функцией активации ReLU, обозначенной, как ReLU P.E. SIREN существенно превосходит все baseline результаты, сходится значительно быстрее и является единственной архитектурой, точно отражающей градиенты сигнала, позволяя тем самым использование в решении краевых задач.

Представление изображений


SIREN, отображающая координаты 2D-пикселей в цвета, может быть использована для параметризации изображений. В данном случае авторы напрямую активируют SIREN, используя истинные значения пикселей. В данных примерах SIREN удается успешно аппроксимировать изображение, получая на 10 дБ более высокое значение PSNR в условиях меньшего количества итераций по сравнению с конкурентами. Кроме того, SIREN является единственным представителем Multi Layer Perceptron, которому удается точно отразить производные первого и второго порядка.



Краткое демо


(код взят из https://colab.research.google.com/github/vsitzmann/siren/blob/master/explore_siren.ipynb)

Для начала, импортируем библиотеки и добавим вспомогательную функцию для визуализации

import torchfrom torch import nnimport torch.nn.functional as Ffrom torch.utils.data import DataLoader, Datasetimport osfrom PIL import Imagefrom torchvision.transforms import Resize, Compose, ToTensor, Normalizeimport numpy as npimport skimageimport matplotlib.pyplot as pltimport timedef get_mgrid(sidelen, dim=2):'''Generates a flattened grid of (x,y,...) coordinates in a range of -1 to 1.sidelen: intdim: int'''tensors = tuple(dim * [torch.linspace(-1, 1, steps=sidelen)])mgrid = torch.stack(torch.meshgrid(*tensors), dim=-1)mgrid = mgrid.reshape(-1, dim)return mgrid

Теперь добавим реализацию синусоидального слоя, который будет основным строительным блоком SIREN. В данном случае используется гораздо более лаконичная реализация, чем в основном коде авторов, однако упрощение оправдано тем, что здесь не преследуется цель сравнения с baseline решениями.

class SineLayer(nn.Module):# See paper sec. 3.2, final paragraph, and supplement Sec. 1.5 for discussion of omega_0.# If is_first=True, omega_0 is a frequency factor which simply multiplies the activations before the# nonlinearity. Different signals may require different omega_0 in the first layer - this is a# hyperparameter.# If is_first=False, then the weights will be divided by omega_0 so as to keep the magnitude of# activations constant, but boost gradients to the weight matrix (see supplement Sec. 1.5)def __init__(self, in_features, out_features, bias=True,is_first=False, omega_0=30):super().__init__()self.omega_0 = omega_0self.is_first = is_firstself.in_features = in_featuresself.linear = nn.Linear(in_features, out_features, bias=bias)self.init_weights()def init_weights(self):with torch.no_grad():if self.is_first:self.linear.weight.uniform_(-1 / self.in_features,1 / self.in_features)else:self.linear.weight.uniform_(-np.sqrt(6 / self.in_features) / self.omega_0,np.sqrt(6 / self.in_features) / self.omega_0)def forward(self, input):return torch.sin(self.omega_0 * self.linear(input))def forward_with_intermediate(self, input):# For visualization of activation distributionsintermediate = self.omega_0 * self.linear(input)return torch.sin(intermediate), intermediateclass Siren(nn.Module):def __init__(self, in_features, hidden_features, hidden_layers, out_features, outermost_linear=False,first_omega_0=30, hidden_omega_0=30.):super().__init__()self.net = []self.net.append(SineLayer(in_features, hidden_features,is_first=True, omega_0=first_omega_0))for i in range(hidden_layers):self.net.append(SineLayer(hidden_features, hidden_features,is_first=False, omega_0=hidden_omega_0))if outermost_linear:final_linear = nn.Linear(hidden_features, out_features)with torch.no_grad():final_linear.weight.uniform_(-np.sqrt(6 / hidden_features) / hidden_omega_0,np.sqrt(6 / hidden_features) / hidden_omega_0)self.net.append(final_linear)else:self.net.append(SineLayer(hidden_features, out_features,is_first=False, omega_0=hidden_omega_0))self.net = nn.Sequential(*self.net)def forward(self, coords):coords = coords.clone().detach().requires_grad_(True) # allows to take derivative w.r.t. inputoutput = self.net(coords)return output, coordsdef forward_with_activations(self, coords, retain_grad=False):'''Returns not only model output, but also intermediate activations.Only used for visualizing activations later!'''activations = OrderedDict()activation_count = 0x = coords.clone().detach().requires_grad_(True)activations['input'] = xfor i, layer in enumerate(self.net):if isinstance(layer, SineLayer):x, intermed = layer.forward_with_intermediate(x)if retain_grad:x.retain_grad()intermed.retain_grad()activations['_'.join((str(layer.__class__), "%d" % activation_count))] = intermedactivation_count += 1else:x = layer(x)if retain_grad:x.retain_grad()activations['_'.join((str(layer.__class__), "%d" % activation_count))] = xactivation_count += 1return activations

И, наконец, дифференциальные операторы, которые позволяют использовать torch.autograd для вычисления градиентов и лапласианов.

def laplace(y, x):grad = gradient(y, x)return divergence(grad, x)def divergence(y, x):div = 0.for i in range(y.shape[-1]):div += torch.autograd.grad(y[..., i], x, torch.ones_like(y[..., i]), create_graph=True)[0][..., i:i+1]return divdef gradient(y, x, grad_outputs=None):if grad_outputs is None:grad_outputs = torch.ones_like(y)grad = torch.autograd.grad(y, [x], grad_outputs=grad_outputs, create_graph=True)[0]return grad

Для экспериментов используется классическое изображение оператора.

def get_cameraman_tensor(sidelength):img = Image.fromarray(skimage.data.camera())transform = Compose([Resize(sidelength),ToTensor(),Normalize(torch.Tensor([0.5]), torch.Tensor([0.5]))])img = transform(img)return img

Далее просто фитируем это изображение. В процессе аппроксимации мы стремимся параметризовать изображение f(x) в оттенках серого с пиксельными координатами x с помощью функции (x). То есть мы ищем функцию такую, что функционал L = (x) f(x)dx минимизируется. При этом является областью изображения. Используем небольшой датасет, который вычисляет попиксельные координаты:

class ImageFitting(Dataset):def __init__(self, sidelength):super().__init__()img = get_cameraman_tensor(sidelength)self.pixels = img.permute(1, 2, 0).view(-1, 1)self.coords = get_mgrid(sidelength, 2)def __len__(self):return 1def __getitem__(self, idx):if idx > 0: raise IndexErrorreturn self.coords, self.pixels

Далее создадим экземпляр датасета и SIREN. Поскольку пиксельные координаты являются двумерным вектором, SIREN получает на вход два признака, а поскольку изображение в оттенках серого, размерность выходного канала равна 1.

cameraman = ImageFitting(256)dataloader = DataLoader(cameraman, batch_size=1, pin_memory=True, num_workers=0)img_siren = Siren(in_features=2, out_features=1, hidden_features=256,hidden_layers=3, outermost_linear=True)img_siren.cuda()

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

total_steps = 500 # Since the whole image is our dataset, this just means 500 gradient descent steps.steps_til_summary = 10optim = torch.optim.Adam(lr=1e-4, params=img_siren.parameters())model_input, ground_truth = next(iter(dataloader))model_input, ground_truth = model_input.cuda(), ground_truth.cuda()for step in range(total_steps):model_output, coords = img_siren(model_input)loss = ((model_output - ground_truth)**2).mean()if not step % steps_til_summary:print("Step %d, Total loss %0.6f" % (step, loss))img_grad = gradient(model_output, coords)img_laplacian = laplace(model_output, coords)fig, axes = plt.subplots(1,3, figsize=(18,6))axes[0].imshow(model_output.cpu().view(256,256).detach().numpy())axes[1].imshow(img_grad.norm(dim=-1).cpu().view(256,256).detach().numpy())axes[2].imshow(img_laplacian.cpu().view(256,256).detach().numpy())plt.show()optim.zero_grad()loss.backward()optim.step()






Представление аудио


Начнем с небольшого эксперимента.

Будем использовать SIREN для параметризации аудиосигнала, то есть стремимся параметризовать звуковую волну f(t) в моменты времени t с помощью функции . Для этого ищем функцию такую, что: функция потерь L = (t) f(t)dt минимизируется, где является звуковой волной. Для эксперимента будем использовать сонату Баха:

import scipy.io.wavfile as wavfileimport iofrom IPython.display import Audioif not os.path.exists('gt_bach.wav'):!wget https://vsitzmann.github.io/siren/img/audio/gt_bach.wav

Создадим небольшой датасет, который позволяет перевести аудиофайл в более удобный для работы формат:

class AudioFile(torch.utils.data.Dataset):def __init__(self, filename):self.rate, self.data = wavfile.read(filename)self.data = self.data.astype(np.float32)self.timepoints = get_mgrid(len(self.data), 1)def get_num_samples(self):return self.timepoints.shape[0]def __len__(self):return 1def __getitem__(self, idx):amplitude = self.datascale = np.max(np.abs(amplitude))amplitude = (amplitude / scale)amplitude = torch.Tensor(amplitude).view(-1, 1)return self.timepoints, amplitude

Далее создадим экземпляр SIREN. Поскольку звуковой сигнал имеет гораздо более высокую пространственную частоту в диапазоне от -1 до 1, поэтому увеличиваем 0 в первом слое SIREN.

bach_audio = AudioFile('gt_bach.wav')dataloader = DataLoader(bach_audio, shuffle=True, batch_size=1, pin_memory=True, num_workers=0)# Note that we increase the frequency of the first layer to match the higher frequencies of the# audio signal. Equivalently, we could also increase the range of the input coordinates.audio_siren = Siren(in_features=1, out_features=1, hidden_features=256,hidden_layers=3, first_omega_0=3000, outermost_linear=True)audio_siren.cuda()

Давайте прослушаем исходные данные:

rate, _ = wavfile.read('gt_bach.wav')model_input, ground_truth = next(iter(dataloader))Audio(ground_truth.squeeze().numpy(),rate=rate)

Далее начнем обучение нейронной сети:

total_steps = 1000steps_til_summary = 100optim = torch.optim.Adam(lr=1e-4, params=audio_siren.parameters())model_input, ground_truth = next(iter(dataloader))model_input, ground_truth = model_input.cuda(), ground_truth.cuda()for step in range(total_steps):model_output, coords = audio_siren(model_input)loss = F.mse_loss(model_output, ground_truth)if not step % steps_til_summary:print("Step %d, Total loss %0.6f" % (step, loss))fig, axes = plt.subplots(1,2)axes[0].plot(coords.squeeze().detach().cpu().numpy(),model_output.squeeze().detach().cpu().numpy())axes[1].plot(coords.squeeze().detach().cpu().numpy(),ground_truth.squeeze().detach().cpu().numpy())plt.show()optim.zero_grad()loss.backward()optim.step()





Послушаем, что получается в итоге:

final_model_output, coords = audio_siren(model_input)Audio(final_model_output.cpu().detach().squeeze().numpy(),rate=rate)

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


Представление видео


Использование SIREN совместно на координатах пикселей и времени позволяет параметризовать видео. В данном случае SIREN непосредственно активируется на истинных значениях пикселей и позволяет параметризовать видео существенно лучше, чем ReLU Multi Layer Perceptron.


Решение уравнения Пуассона


Используя только производные в подходе SIREN, возможно решить уравнение Пуассона. SIREN это опять-таки единственная архитектура, которая аппроксимирует изображения, градиенты и области лапласиан точно и быстро.



Представление фигур путем решения уравнения Эйконала Interactive 3D SDF Viewer используйте мышь для навигации по сценам


Решая краевую задачу в форме уравнений Эйконала, мы можем восстановить SDF из облака точек и нормалей поверхности. Подход SIREN позволяет восстановить сцену масштаба комнаты на основе только облака точек и нормалей поверхности, при этом удается точно воспроизвести мелкие детали, а для обучения требуется менее одного часа. В отличие от недавних работ по объединению воксельных сеток с нейронными неявными представлениями, в предлагаемом подходе полное представление хранится в весах одной пятислойной нейронной сети, без 2D или 3D-сверток, и поэтому требует гораздо меньшего количества параметров. Важно обратить внимание на то, что полученные SDF не обучаются на исходных значениях SDF, а скорее являются результатом решения вышеупомянутой эйкональной краевой задачи. Такая постановка задачи является существенно более сложной и требует обучения с учителем по градиентам (детали в статье). В результате архитектуры сетей, градиенты которых хуже контролируются, показывают качество ниже, чем в подходе SIREN.



Решение уравнения Гельмгольца


В данном случае авторы используют подход SIREN для решения неоднородного уравнения Гельмгольца. Архитектуры на основе ReLU и Tanh не позволяют полностью решить эту задачу.


Решение волнового уравнения


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


* * *


Предлагаемое авторами представление SIREN для глубокого обучения помогает в работе с такими данными, как изображения, аудио- и видеосигналы. Новый подход может быть полезным в таких областях, как классификация изображений или speech-to-text в рамках работы со звуком. За счет больших возможностей SIREN по точному воспроизведению сигнала, а также градиентов и лапласианов можно ожидать, что генеративные модели с использованием SIREN смогут совершить качественный скачок в своих возможностях.

В данный момент мы рассматриваем возможности проверить SIREN на наших задачах в Центре компетенции больших данных и искусственного интеллекта ЛАНИТ. Хочется надеяться, что предлагаемый подход покажет свою продуктивность не только на простых примерах, но и на нетривиальных прикладных задачах.
Подробнее..

Прикручиваем ИИ оптимизация работы банкоматов

20.04.2021 10:21:38 | Автор: admin
Всем привет! Это небольшой рассказ про то, как команда Центра компетенции больших данных и искусственного интеллекта в ЛАНИТ оптимизировала работу банкоматной сети. Упор в статье сделан не на описание подбора параметров и выбор лучшего алгоритма прогнозирования, а на рассмотрение концепции нашего подхода к решению поставленной задачи. Кому интересно, добро пожаловать под кат.

источник

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

Таким образом, формальная постановка задачи выглядит так.

На входе:

  • есть история снятия/приема наличности в банкоматах (в нашем случае это были данные за полтора года);
  • стоимость потерь от нахождения денег в банкоматах (от простаивающих запасов) зависит от ставки рефинансирования (параметр q); стоимость можно оценить как $S*X*(\frac{q}{365})$, где S сумма, X количество дней;
  • стоимость поездки инкассаторов, si (меняется со временем и зависит от местоположения банкомата и маршрута инкассаторов).

На выходе ожидается:

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

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

Общая идея основана на нахождении минимума затрат как функции от количества дней между инкассациями. Для объяснения конечного решения можно сначала рассмотреть упрощенный вариант в предположении, что сумма снимаемых денег не меняется изо дня в день и равна S, и что она только убывает. В таком случае сумма денег в банкомате является убывающей арифметической прогрессией.

Предположим, что в день снимают S руб. Помимо суммы снятий, введем также переменную X число дней между инкассациями, меняя которую будем дальше искать минимум затрат банка. Логично, что сумма, которую выгоднее всего положить в банкомат, зная, что инкассация будет через X дней это S*X. При таком подходе за день до инкассации в банкомате будет находиться S руб., за два дня 2*S руб., за три дня 3*S руб. и т. д. Другими словами, наш ряд можно рассматривать, двигаясь от конца к началу, тогда это будет возрастающая арифметическая прогрессия. Поэтому за период между двумя инкассациями в банкомате будет лежать (S+S*X)/2 руб. Теперь, исходя из ставки рефинансирования, остаётся посчитать стоимость простаивающих запасов этой суммы за X дней и дополнительно прибавить стоимость совершённых инкассаторских поездок. Если между инкассациями X дней, то за n дней будет совершено $[\frac{n}{X}]+1$ (где $[\frac{n}{X}]$ это целочисленное деление) инкассаций, поскольку ещё один раз придётся приехать, чтобы вывести остаток денег.

Таким образом, получившаяся функция выглядит так:

$TotalCost(S, X, n, q, si) = (S + S*X)/2*\frac{q}{365}+si*([\frac{n}{X}]+1)$


где:

  • S сумма снятий, руб./день,
  • X количество дней между инкассациями,
  • n рассматриваемый период в днях,
  • q ставка рефинансирования,
  • si стоимость инкассации.

Однако в реальности каждый день снимают разные суммы, поэтому у нас есть ряд снятий/внесений купюр, каждый день этот ряд пополняется новыми значениями. Если это учесть, функция примет следующий вид:

$TotalCost = \sum_{i=1}^{n}Q_{i}*\frac{q}{365} + si*([\frac{n}{X}]+1) \\ q - ставка\, рефинансирования, \\ n - количество\, рассматриваемых\, дней, \\ X - количество\, дней\, между\, инкассациями, \\ Q_{i} - сумма\, в\, банкомате\, на\, iй\, день,\, Q_{i} = encash_{i} - \sum_{k=[\frac{i}{X}]*X}^{i}S_{k} \\ S_{k} - изменение\, суммы\, в\, банкомате\, на\, kй\, день, \\ encash_{i} - сумма\, последней\, на\, iй\, день\, инкассации, \\ encash_{i} = \begin{cases} \sum_{k=[\frac{i}{X}]*X}^{([\frac{i}{X}]*X+1)*X}S_{k}, \,\,\, если\,сумма\, убывающая \\ \\ \sum_{k=[\frac{i}{X}]*X}^{[\frac{i}{X}]*X+3}S_{k}^{-}, \,\,\, если\,сумма\, возрастающая \end{cases} \\ S_{k}^{-} - сумма\, снятий\, за\, kй\, день \\$


Что такое убывающие и возрастающие суммы: в зависимости от того, больше кладут или больше снимают, есть купюры, по которым сумма в банкомате накапливается, а есть купюры, по которым сумма в банкомате убывает. Таким образом формируются возрастающие и убывающие суммы купюр. В реализации было сделано три ряда: incr_sums возрастающие купюры, decr_sums убывающие купюры и withdrawal_sums ряд сумм выдач банкомата (там присутствуют купюры, которые идут только на выдачу).

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

Помимо прочего, чтобы применить описанную функцию, нужно учесть следующие моменты.

  • Самое главное, сложное, и интересное в момент инкассации мы не знаем, какие это будут суммы, их нужно прогнозировать (об этом ниже).
  • Банкоматы бывают следующих типов:

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

Рис. 1. Значения функции TotalCost в зависимости от X (Days betw incas) и n (Num of considered days)

Чтобы избавиться от n, можно воспользоваться простым трюком просто разделить значение функции на n. При этом мы усредняем и получаем среднюю величину стоимости затрат в день. Теперь функция затрат зависит только от количества дней между инкассациями. Это как раз тот параметр, по которому мы будем её минимизировать.

Учитывая вышесказанное, реальная функция будет иметь следующий шаблон:

TotalCost(n, x, incr_sums, decr_sums, withdrawal_sums, si), где

  • x максимальное количество дней между инкассациями
  • n количество дней, которые отслеживаем, то есть мы смотрим последние n значений подаваемых на вход временных рядов (как написано выше, функция не зависит от n, этот параметр добавлен, чтобы можно было экспериментировать с длиной подаваемого временного ряда)
  • incr_sums ряд спрогнозированных сумм по купюрам только на внос,
  • decr_sums ряд спрогнозированных сумм по купюрам только на вынос,
  • withdrawal_sums ряд спрогнозированных сумм выдач банкомата (т.е. здесь сумма по купюрам in минус сумма по out), заполняется 0 для всех банкоматов кроме ресайклинговых,
  • si стоимость инкассации.

Функция проходит непересекающимся окном величиной X по входным рядам и считает суммы внесенных денег внутри окна. В отличие от первоначальной функции сумма арифметической прогрессии здесь превращается в обычную сумму (это та сумма, которая была заложена при инкассации). Далее внутри окна в цикле по дням происходит кумулятивное суммирование/вычитание сумм, которые ежедневно клались/снимались из банкомата. Это делается для того, чтобы получить сумму, которая лежала в банкомате на каждый день.

Затем из полученных сумм при помощи ставки рефинансирования рассчитывается стоимость затрат на простаивающие запасы, а также в конце прибавляются затраты от инкассаторских поездок.

Реализация
def process_intervals(n, x, incr_sums, decr_sums, withdrawal_sums):# генератор количества сумм, которые# остаются в банкомате на каждый день# incr_sums  ряд возрастающих сумм# decr_sums  ряд убывающих сумм# withdrawal_sums  ряд сумм выдач банкомата (там присутствуют купюры, которые идут только на выдачу)# заполняется 0 для всех банкоматов кроме ресайклинговых# x  количество дней между инкассациями# n  количество дней, которые отслеживаемif x>n: returnfor i in range(n//x):decr_interval = decr_sums[i*x:i*x+x]incr_interval = incr_sums[i*x:i*x+x]withdrawal_interval = withdrawal_sums[i*x:i*x+x]interval_sum = np.sum(decr_interval)interval_sum += np.sum(withdrawal_interval[:3])for i, day_sum in enumerate(decr_interval):interval_sum -= day_suminterval_sum += incr_interval[i]interval_sum += withdrawal_interval[i]yield interval_sum# остаток сумм. Берется целый интервал.# но yield только для остатка рядаdecr_interval = decr_sums[(n//x)*x:(n//x)*x+x]incr_interval = incr_sums[(n//x)*x:(n//x)*x+x]withdrawal_interval = withdrawal_sums[(n//x)*x:(n//x)*x+x]interval_sum = np.sum(decr_interval)interval_sum += np.sum(withdrawal_sums[:3])for i, day_sum in enumerate(decr_interval[:n-(n//x)*x]):interval_sum -= day_suminterval_sum += incr_interval[i]interval_sum += withdrawal_sums[i]yield interval_sumdef waiting_cost(n, x, incr_sums, decr_sums, withdrawal_sums, si):# incr_sums  ряд возрастающих сумм# decr_sums  ряд убывающих сумм# withdrawal_sums  ряд сумм выдач банкомата (там присутствуют купюры, которые идут только на выдачу)# заполняется 0 для всех банкоматов кроме ресайклинговых# si  стоимость инкассации# x  количество дней между инкассациями# n  количество дней, которое отслеживаемassert len(incr_sums)==len(decr_sums)q = 4.25/100/365processed_sums = list(process_intervals(n, x, incr_sums, decr_sums, withdrawal_sums))# waiting_cost = np.sum(processed_sums)*q + si*(x+1)*n//xwaiting_cost = np.sum(processed_sums)*q + si*(n//x) + si# делим на n, чтобы получить среднюю сумму в день (не зависящее от количества дней)return waiting_cost/ndef TotalCost (incr_sums, decr_sums, withdrawal_sums, x_max=14, n=None, si=2500):# x  количество дней между инкассациями# n  количество дней, которое отслеживаемassert len(incr_sums)==len(decr_sums) and len(decr_sums)==len(withdrawal_sums)X = np.arange(1, x_max)if n is None: n=len(incr_sums)incr_sums = incr_sums[-n:]decr_sums = decr_sums[-n:]        withdrawal_sums = withdrawal_sums[-n:]waiting_cost_sums = np.zeros(len(X))for i, x in enumerate(X):waiting_cost_sums[i] = waiting_cost(n, x, incr_sums, decr_sums, withdrawal_sums, si)return waiting_cost_sums

Теперь применим эту функцию к историческим данным наших банкоматов и получим следующую картинку:

Рис. 2. Оптимальное количество дней между инкассациями

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

Дальше нужно сделать прогноз снятия/зачисления наличности, применить к нему эту функцию, найти оптимальный день инкассации и загрузить определенное количество купюр по сделанному прогнозу.

В зависимости от суммы денег, находящейся в обращении (чем меньше денег проходит через банкомат, тем дольше оптимальный срок инкассации), меняется количество оптимальных дней между инкассациями. Бывают случаи, когда это количество больше 30. Прогноз на такой большой период времени будет слишком большой ошибкой. Поэтому вначале происходит оценка по историческим данным, если она меньше 14 дней (это значение было выбрано эмпирически, потому что оптимальное количество дней до инкассации у большинства банкоматов меньше 14 дней, а также потому, что чем дальше горизонт прогнозирования, тем больше его ошибка), то в дальнейшем для определения оптимального количества дней между инкассациями используется прогноз по временному ряду, иначе по историческим данным.

Подробно останавливаться на том, как делается прогноз снятий и зачислений не буду. Если есть интерес к этой теме, то можно посмотреть видеодоклад о решении подобной задачи исследователями из Сбербанка (Data Science на примере управления банкоматной сетью банка).

Из всего опробованного нами лучше всего показал себя CatBoostRegressor, регрессоры из sklearn немного отставали по качеству. Возможно, здесь не последнюю роль сыграло то, что после всех фильтраций и отделения валидационной выборки, в обучающей выборке осталось всего несколько сотен объектов.

Prophet показал себя плохо. SARIMA не стали пробовать, поскольку в видео выше о нем плохие отзывы.

Используемые признаки (всего их было 139, после признака приведено его обозначение на графике feature importance ниже)

  • Временные лаги целевых значений переменной, lag_* (их количество можно варьировать, но мы остановились на 31. К тому же, если мы хотим прогнозировать не на день вперед, а на неделю, то и первый лаг смотрится не за вчерашний день, а за неделю назад. Таким образом, максимально далеко мы смотрели на 31+14=45 дней назад).
  • Дельты между лагами, delta_lag*-lag*.
  • Полиномиальные признаки от лагов и их дельт, lag_*^* (использовались только первые 5 лагов и их дельт, обозначались).
  • День недели, месяца, номер месяца, weekday, day, month (категориальные переменные).
  • Тригонометрические функции от временных значений из пункта выше, weekday_cos и т.д.
  • Статистика (max, var, mean, median) для этого же дня недели, месяца, weekday_max, weekday_mean, (брались только дни, находящиеся раньше рассматриваемого в обучающей выборке).
  • Бинарные признаки выходных дней, когда банкоматы не работают, is_weekend
  • Значения целевой переменной за этот же день предыдущей недели/месяца, y_prev_week, y_prev_month.
  • Двойное экспоненциальное сглаживание + сглаживание по значениям целевой функции за те же дни предыдущих недели/месяца, weekday_exp_pred, monthday_exp_pred.
  • Попробовали tsfresh, tsfresh+PCA, но потом отказались от этого, поскольку этих признаков очень много, а объектов в обучающей выборке у нас было мало.

Важность признаков для модели следующая (приведена модель для прогноза снятий купюры номиналом в 1000 руб. на один день вперед):

Рис. 3.Feature importance используемых признаков

Выводы по картинкам выше наибольший вклад сделали лаговые признаки, дельты между ними, полиномиальные признаки и тригонометрические функции от даты/времени. Важно, что в своём прогнозе модель не опирается на какую-то одну фичу, а важность признаков равномерно убывает (правая часть графика на рис. 2).

Сам график прогноза выглядит следующим образом (по оси x отложены дни, по оси y количество купюр):

Рис. 4 Прогноз CatBoostRegressor

По нему видно, что CatBoost всё же плохо выделяет пики (несмотря на то, что в ходе предварительной обработки выбросы были заменены на 95 перцентиль), но общую закономерность отлавливает, хотя случаются и грубые ошибки, как на примере провала в районе шестидесяти дней.

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

Общий пайплайн работы выглядит следующим образом (пересчёт всех значений происходит раз в день).

  1. Для каждой купюры каждого atm на каждый прогнозируемый день своя модель (поскольку прогнозировать на день вперед и на неделю вперед разные вещи и снятия по различным купюрам также сильно разнятся), поэтому на каждый банкомат приходится около 100 моделей.
  2. По историческим данным банкомата при помощи функции TotalCost находится оптимальное количество дней до инкассации.
  3. Если найденное значение меньше 14 дней, то следующий день инкассации и закладываемая сумма подбираются по прогнозу, который кладется в функцию TotalCost, иначе по историческим данным.
  4. На основе прогноза либо исторических данных снятий/внесений наличности рассчитывается сумма, которую нужно заложить (т.е. количество закладываемых купюр).
  5. В банкомат закладывается сумма + ошибка.
  6. Ошибка: при закладывании денег в банкомат необходимо заложить больше денег, оставив подушку безопасности, на случай, если вдруг люди дружно захотят обналичить свои сбережения (чтобы перевести их во что-то более ценное). В качестве такой суммы можно брать средние снятия за последние 2-3 дня. В усложнённом варианте можно прогнозировать снятия за следующие 2-3 дня и дополнительно класть эту сумму (выбор варианта зависит от качества прогноза на конкретном банкомате)
  7. Теперь с каждым новым днём приходят значения реальных снятий, и оптимальный день инкассации пересчитывается. Чем ближе день инкассации, полученный по предварительному прогнозу, тем больше реальных данных мы кладём в TotalCost вместо прогноза, и точность работы увеличивается.

Полученный профит мы посчитали следующим образом: взяли данные по снятиям/внесениям за последние три месяца и из этого промежутка по дню, как если бы к нам приходили ежедневные данные от банкоматов.

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

atm profit(relative) profit/day (руб.)
a 0.61 367
b 0.68 557
с 0.70 470
d 0.79 552
e -0.30 -66
f 0.49 102
g 0.41 128
h 0.49 98
i 0.34 112
j 0.48 120
k -0.01 -2
l -0.43 -26
m 0.127 34
n -0.03 -4
o -0.21 -57
p 0.14 24
q -0.21 -37

Подходы и улучшения, которые интересно рассмотреть, но пока не реализованы на практике (в силу комплексности их реализации и ограниченности во времени):

  • использовать нейронные сети для прогноза, возможно даже RL агента,
  • использовать одну модель, просто подавая в неё дополнительный признак, отвечающий за горизонт прогнозирования в днях.
  • построить эмбеддинги для банкоматов, в которых сагрегировать информацию о географии, посещаемости места, близости к магазинам/торговым центрам и т. д.
  • если оптимальный день инкассации (на втором шаге пайплайна) превышает 14 дней, рассчитывать оптимальный день инкассации по прогнозу другой модели, например, Prophet, SARIMA, или брать для этого не исторические данные, а исторические данные за прогнозируемый период с прошлого года/усредненный за последние несколько лет.
  • для банкоматов, у которых отрицательный профит, можно пробовать настраивать различные триггеры, при срабатывании которых работа с банкоматами ведется в старом режиме, либо инкассаторские поездки совершаются чаще/реже.

В заключение можно отметить, что временные ряды снятий/внесений наличности поддаются прогнозированию, и что в целом предложенный подход к оптимизации работы банкоматов является довольно успешным. При грубой оценке текущих результатов работы в день получается сэкономить около 2400 руб., соответственно, в месяц это 72 тыс. руб., а в год порядка 0,9 млн руб. Причём чем больше суммы денег, находящихся в обращении у банкомата, тем большего профита можно достичь (поскольку при небольших суммах профит нивелируется ошибкой от прогноза).

За ценные советы при подготовке статьи большая благодарность vladbalv и art_pro.

Спасибо за внимание!
Подробнее..

Перевод Назад в Будущее какие подходы NLP будут востребованы на NIPS 2020

24.11.2020 10:23:43 | Автор: admin
Стремительно и неотвратимо приближается ключевое событие года в области Data Science: конференция NIPS 2020, запланированная на 6-12 декабря 2020. Традиционно на самом масштабном событии года будут представлены значимые результаты, свежие идеи и перспективные подходы в различных областях Data Science, в том числе и в области математической обработки и понимания естественного языка. Каждому специалисту хочется если и не предложить новаторскую идею, то оказаться ранним последователем той идеи, которая выстрелит, и не хочется попасть в хвост отстающих скептиков, которым приходится догонять и осваивать уже признанную большинством методику.

Полезным подходом для обнаружения перспективных идей на ранней стадии является мониторинг динамики в докладах на различных конференциях в течение года. С этой целью для сообщества Хабр был выполнен этот обзор самых ярких докладов в области NLP c конференции ICLR 2020, сделанный на основе перевода статьи Kamil Kaczmarek. Мы вернемся на несколько месяцев в Прошлое, чтобы затем на NIPS 2020 заглянуть в Будущее развития технологий по работе с текстами.

Если вам интересна тема NLP, вы хотите легко находить общий язык с моделями, непринужденно общаться с девушками на улице передовыми специалистами и не отстать от быстрого движения современного мира, то вам может помочь эта статья. Поехали!

Источник

В начале мая 2020 прошла International Conference on Learning Representations (ICLR). Это мероприятие, посвященное исследованиям всех аспектов обучения представлениям, широко известным, как Deep Learning. В этом году мероприятие было немного другим, так как оно стало виртуальным из-за пандемии коронавируса, однако онлайн-формат не изменил прекрасной атмосферы. Конференция была весьма увлекательной и привлекла 5600 специалистов со всего мира (вдвое больше, чем в прошлом году).

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

Текущий пост является последним в серии, и в нем описываются 10 лучших вкладов в обработку/понимание естественного языка от ICLR.


1. АЛЬБЕРТ: облегченный BERT для самостоятельного изучения языковых представлений


Новый предобученный метод, достигающий самых передовых оценок на GLUE, RACE и SQuAD тестах, при этом оперирующий меньшим набором параметров по сравнению с BERT-large.

Документ / Код


Расстояния L2 и косинусная близость (в терминах степени) входящих и исходящих эмбеддингов каждого слоя для BERT-large и ALBERT-large.


Автор: Чжэньчжун Лан

2. A Mutual Information Maximization Perspective of Language Representation Learning


Представление слов является типичной задачей в NLP. В своей работе авторы заявляют о новом фреймворке, сочетающем классические методы получения эмбеддингов слов (например, Skip-gram) с более современными подходами, основанными на контекстных моделях получения эмбеддингов (BERT, XLNet).

Документ


Левый график показывает рост F1 меры BERT-NCE и INFOWORLD по мере того, как увеличивается доля объектов в тренировочной выборке в SQuAD (dev). Правый график показывает изменение F1 меры INFOWORD на SQuAD (dev) в зависимости от DIM.


Автор: Лингпенг Конг

3. Mogrifier LSTM


Модификация LSTM для получения передовых результатов в области языковых моделей.

Документ


Mogrifier с 5 этапами обновлений весов. Предыдущее состояние h0 = hprev преобразуется линейно (пунктирные стрелки), подается через сигмовидную функцию в гейт x-1 = x поэлементно и образует x1. В обратную сторону, линейно преобразованный x1 проходит через гейт h0 и образует h2. После нескольких повторений описанного цикла взаимного пропускания полученные значения последовательностей h и x подаются в ячейку LSTM. Индекс prev в h опущен, чтобы избежать нагромождения.


Автор: Габо Мели

4. Высокоточный синтез речи с помощью состязательных сетей


Авторы представляют GAN-TTS, генерирующую состязательную сеть (GAN) для преобразования текста в речь, значение Mean Opinion Score (MOS) которой достигает 4.2.

Документ / Код


В модели используются residual блоки. Сверточные слои имеют одинаковое количество входных и выходных каналов и не расширяются, если не указано иное. h представление скрытого слоя, l лингвистические признаки, Z вектор шума, m канальный множитель, m = 2 для блоков понижающей дискретизации (т. е. если их коэффициент понижающей дискретизации больше 1) и m = 1 в противном случае, входные каналы M G, M = 2N в блоках 3, 6, 7 и M = N в противном случае; размер подразумевает размерность ядра.


Автор: Миколай Биньковский

5. Reformer: The Efficient Transformer


Эффективный трансформер с локально-чувствительным хешированием и реверсивными слоями.

Документ / Код


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


Авторы: Никита Китаев и Лукаш Кайзер

6. DeFINE: Deep Factorized Input Token Embeddings for Neural Sequence Modeling


DeFINE использует глубокую, иерархическую, разреженную сеть с новыми skip-соединениями, чтобы эффективно обучать эмбеддинги слов.

Документ


С помощью DeFINE сеть Transformer-XL обучается входящим (эмбеддинги) и исходящим (классификация) представлениям в пространстве малой размерности n, в отличии от пространства высокой размерности m, что позволяет значительно снизить количество параметров и при этом получить минимальное влияние на эффективность.


Автор: Сачин Мехта

7. Глубинно-адаптивный трансформер


Модель работы с последовательностями, динамически регулирующая объем вычислений для каждого ввода.

Документ

Aligned training согласованное обучение, Mixed training смешанное обучение

Для декодирующих сетей в процессе обучения есть возможность работы с данными на любом слое. Режим согласованного обучения оптимизирует все классификаторы на выходе Cn одновременно, предполагая, что все предыдущие скрытые состояния для текущего слоя известны. В режиме смешанного обучения происходит сэмплирование M путей из случайных выходов модели; отсутствие информации о прошлых скрытых состояниях компенсируется путем копирования из предыдущего слоя.


Автор: Маха Элбаяд

8. О возможности раздельной оценки различных параметров в трансформерах


Авторы исследуют возможность раздельной оценки различных параметров и интерпретируемости attention-а и токенов для контекстуальных эмбеддингов в модели Bert-a, основанной на self-attention.

Документ


(а) каждая точка представляет собой коэффициент корреляции Пирсона между актуальным attention и сырым attention как функцию размера токена. (b) зависимость необработанного значения attention и эффективного attention, где каждая точка представляет усредненное (эффективное) attention данной head к типу токена.


Автор: Гино Бруне

9. Mirror-Generative Neural Machine Translation


Подходы к переводу, известные как модели Neural Machine Translation (NMT), сильно зависят от наличия обширного корпуса, построенного в виде языковой пары. Авторами предлагается новый метод перевода в обоих направлениях с использованием архитектуры на основе генеративной нейронной сети.

Документ


Схематическая модель MGNMT


Автор: Зайсян Чжэн

10. FreeLB: продвинутое обучение состязательных сетей для NLU


Авторы предлагают новый алгоритм, который по-новому формализует подход к обучению состязательной сети для тренировки языковой модели. Новый подход получил название FreeLB.

Документ / код



Автор: Чен Чжу

Заключение


Глубина и качество публикаций ICLR весьма впечатляют. Согласно анализу, ключевые направления, представленные на ICLR-2020, выглядят следующим образом:

  1. глубокое обучение;
  2. обучение с подкреплением;
  3. генеративные модели;
  4. NLP/NLU (что и является основным предметом текущей статьи).

Эпилог


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

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

Мы в компании CleverData давно следим за ICLR и рады поделиться с вами интересными находками и идеями, представленными в серии статей. Надеюсь, что подготовленный материал поможет обнаружить на раннем этапе перспективные подходы, взять их на вооружение и стать их ранним последователем. Если вас заинтересовал текущий обзор, то могут показаться интересными и другие статьи, посвященные ICLR этого и прошлого года. Вы можете прочитать их здесь и здесь.

Буду рад обсудить написанное в комментариях.

У нас есть вакансии! Может быть, мы ищем именно вас?
Подробнее..

В поисках обеда распознавание активности по данным фитнес-трекера

22.06.2020 10:10:48 | Автор: admin
Мне посчастливилось участвовать в проекте SOLUT, который стартовал в ЛАНИТ около года назад. Проект развивается благодаря активному участию Центра компетенции больших данных ЛАНИТ (ЦК Дата), и главное технологическое новшество проекта заключается в использовании машинного обучения для мониторинга человеческой активности. Основным источником данных для нас являютсясенсоры фитнес-трекеров, закрепленные на руках работников. В первую очередь, результаты распознавания помогают поднять производительность труда и оптимизировать производственные процессы на стройке. Также анализ поведения рабочих позволяет отслеживать самочувствие человека, соблюдение техники безопасности и напоминает строителям про обед.

Источник

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

Проверка на коллегах



Проект начался с тестового стенда, организованного в офисе ЛАНИТ рядом со столовой. Он работал три месяца. У нас был большой поток добровольцев, готовых забить гвоздь, просверлить отверстие дрелью или закрутить пару гаек. Все эти действия человек совершал с браслетом на руке за импровизированным верстаком.

Источник

Мы перепробовали несколько вариантов фитнес-трекеров, позволяющих извлечь сырые данные, и остановились на одном из известных брендов. В первую очередь в нашей работе использовались показания акселерометра и гироскопа. Дополнительно мы используем данные GPS, барометра и пульсометра. Кстати, для измерения пульса используется прибор с интригующим названием фотоплетизмограф.

Источник

Акселерометр и гироскоп позволяли нам получать сырые показания в трёх осях координат с частотой 50 Гц, соответствующей периоду 0.02 с. Таким образом, для распознавания мы располагаем шестью временными рядами, однако по техническим причинам полученные ряды оказываются с пропусками и высоким уровнем шума. Если мы построим график, отражающий зазоры между последовательными измерениями, то получим следующую картину:

На графике видно, что в данных систематически проскакивает зазор в 0.13 с.

Проблема заполнения пропусков и шумов часто возникает в задачах, связанных с временными рядами и имеет множество решений. Решить проблему пропусков и шумов, при этом максимально сохранив информацию, нам помогли модели Гауссовского процесса. Этот подход хорошо себя зарекомендовал, в том числе и в работе с временными рядами в астрофизике (arxiv.org/abs/1908.06099, arxiv.org/abs/1905.11516).

Мы в очередной раз поняли, насколько важными при работе с моделями Гауссовских процессов являются настройки ядра. Задавая ядро Гауссовского процесса, возможно регулировать: крупномасштабную структуру временного ряда или мелкомасштабную будет использовать модель для аппроксимации и заполнения пропусков. Начать знакомство с этим подходом можно по примерам из документации sklearn. Возьмем следующий пример: чёрным цветом на графиках ниже выделены исходные данные, красным средняя Гауссовского процесса, а голубым цветом обозначен доверительный интервал. На верхнем графике видно, что первая половина данных имеет периодическую структуру, которая не распозналась, т.к. не удалось выделить синусоидальную часть сигнала, хотя крупномасштабная структура была успешно аппроксимирована. При использовании подходящего ядра синусоидальную часть удалось аппроксимировать моделью во втором примере.

Пример подбора подходящего ядра гауссовского процесса. Чёрным цветом показаны исходные данные, красным средняя Гауссовского процесса, а голубым цветом обозначен доверительный интервал.

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

Пример заполнения пропусков в данных

Естественно, что качество распознавания действий с помощью нейронной сети на данных с предварительной обработкой и без обработки данных будет отличаться. Так, например, в нашем случае взвешенная f1-мера вырастает с 0.62 до 0.84.

Добровольцы на нашем стенде могли видеть демонстрацию распознавания действий в реальном времени. Распознавание выглядело, как сегментация временного ряда с визуализаций показаний сенсоров фитнес-трекеров. Как видно, периоды бездействия чередуются с закручиванием гаек и, например, забиванием гвоздя.


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

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

В экспериментах на тестовом стенде мы сравнивали классические алгоритмы на автоматически сгенерированных признаках и нейронные сети. К удивлению, нейронные сети не смогли существенно обойти градиентный бустинг в нашем случае, что может быть связано с шумом в данных и весьма ограниченным объемом тренировочной выборки. Для нейронных сетей мы пробовали очищенные временные ряды, разностные схемы, спектрограммы, одномерные и двумерные сверточные слои, рекуррентные слои и многое другое. Однако лучший результат с минимальными трудозатратами достигается с помощью классификации градиентным бустингом из пакета lightGBM. Тем не менее, нейронные сети оказываются полезными в попутных задачах, например, в поисках обеденного перерыва, про который будет рассказано ниже.

Ошибки людей


В данных ожидаемо присутствует человеческий фактор, например, надевание часов вверх ногами. Бороться с этим фактором оказывается легко: модель классификации с точностью более 90% определяет, правильно ли надеты часы на рабочем. В случае неправильно надетых браслетов линейное преобразование сырых данных дает возможность использовать те же самые модели распознавания активности.

Другим человеческим фактором в данных оказывается результат разметки асессоров: они также подвержены ошибкам. В этом случае помогают различные приемы и эвристики по чистке разметки.

Иерархия действий


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

  • Нижний уровень, состоящий из элементарных действий. Пример: удар молотком, движение гаечным ключом. Характерный масштаб для интервалов нижнего уровня составляет около 5 секунд.
  • Верхний уровень, состоящий из действий работника с точки зрения цели деятельности. Пример: подготовка к работе, работа штукатура, сварка и т. п. Характерный временной масштаб для интервалов верхнего уровня составляет около 30-60 секунд.

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


Примерный интервал работы 5 минут

Поиск бездействия и обеда


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

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

Асессоры не могут разметить обеденное время, так как оно не снимается на камеру. Было сделано следующее наблюдение: в начале и конце обеденного перерыва рабочие тратят некоторое время на перемещение от рабочего места до бытовки и обратно. Можно принять эти перемещения за границы обеденного времени.

Наборы и доли классов в рабочее и обеденное время различаются. Мы поняли, что определение обеденного перерыва возможно свести к решению задачи сегментации поверх результатов, полученных моделью верхнего уровня. Для решения этой задачи наша команда решила использовать нейронную сеть Unet. Отличная от классической Unet в том, что здесь все двухмерные операции заменены на одномерные, так как мы работали с временными рядами. Также добавлены слои Гауссовского шума и Dropout, чтобы минимизировать переобучение модели.

Подготовка данных для обучения


Поскольку задача сегментации решается поверх модели верхнего уровня, входные данные для Unet были выбраны в виде вектора 1024 * (кол-во классов). 1024 так как интервалы ВУ модели 30 секунд и рабочий день порядка 8-9 часов.

На выходе вектор 1024 * 1 с бинарными значениями, (0 интервал не относится к обеду, 1 относится к обеду).


Так как данных немного (порядка 40 рабочих дней), была сгенерирована синтетическая выборка. День реальных рабочих разбивался на n-частей, и каждая часть относилась к одному из пяти классов: до обеда, начало обеда, обед, конец обеда, после обеда. Генерировался новый рабочий день набором случайных интервалов: сперва несколько интервалов из первого класса, затем один из второго, несколько из третьего, один из четвертого и несколько из пятого.

Схема разбиения временных интервалов на утренние (синие), обеденные (красные) и послеобеденные (зеленые). Из фрагментов распознанных действий на интервалах комбинируются синтетические данные для обогащения тренировочной выборки.

Для оценки качества анализа данных мы использовали меру Жаккара, в интуитивном понимании представляющую собой отношение пересечения и объединения множеств. В нашем случае аугментация позволила поднять качество с 0.98 до 0.99 меры Жаккара.


Все ли действия можно классифицировать?


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

  • ошибки асессоров;
  • нетипичное поведение рабочих;
  • появление новых элементов в техническом процессе;
  • выявление подозрительных работников.

Подозрительные работники

Если вы начинаете свое знакомство с методами детекции аномалий, то скорее всего придете к следующим наиболее популярных и простым моделям, реализованным в sklearn: OneClassSVM, Isolation Forest, Local Outlier Factor. Есть и более сложные способы (подробнее на эту тему писал ранее мой коллега).


В реализации Local Outlier Factor есть возможность напрямую провести проверку на присутствие новых объектов в данных (Novelty detection). Если использовать метод Isolation Forest на тех же самых признаках, которые рассчитываются для основной модели классификации, то возможно получить рейтинг нормальности для каждого объекта: численную величину, характеризующую степень типичности для каждого объекта в выборке. Чем выше рейтинг, тем более типичным объектом в выборке является его обладатель. Распределение рейтинга нормальности выглядит следующим образом:


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

Важным моментом является следующее наблюдение: поиск аномалий удается продуктивно применять для каждого класса деятельности по отдельности, иначе редкие классы действий выделяются как аномалия.

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

  • работник положил рулетку и карандаш, взял одежду и одевается по пути (уже найдено перемещение за рамками типичных перемещений работников);
  • работник пинает тележку ногами (опасная для здоровья деятельность);
  • трясет головой с камерой, машет перед ней руками (действия, явно выходящие за рамки рабочих операций на объекте);
  • производит манипуляции с датчиком на левой руке (некорректные действия).

У работы каменщика были зафиксированы следующие аномалии:

  • работник зачем-то бьет молотком по неустановленным плитам (некорректные действия);
  • ложится на пол, смотрит зазор между полом и панелью (нетипичное поведение);
  • сначала пытается стряхнуть что-то с шапки, потом снимает ее и вытряхивает (действия, явно выходящие за рамки рабочих операций на объекте).

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

Заключение


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

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

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

  • Хорошая аугментация может помочь поднять метрики качества модели. В аугментации можно идти от простого метода к более сложному:


  • Если вы освоите один из инструментов поиска аномалий, то он может пригодиться на различных этапах Data Science проекта:

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

Буду рад обсудить в статью в комментариях и с удовольствием отвечу на ваши вопросы.

Статья написана в соавторстве с olegkafanov.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru