80LevelElf about IT Записи Мои проекты Обо мне
Сколько не читаю Хабр или tpproger – каждая третья статья про машинное обучение. Новый метод глубокого обучения, новое интересное исследование на основе ML, выход нового фреймворка и тд. Как-будто все так и хочет сказать – «машинное обучение - это круто. Понятненько?» ![](http://i.imgur.com/jHsiu9Tm.jpg) __Обновление #1 от 05/03/2017 (машинное обучение на .Net)__ Но с другой стороны, как-то даже обидно, что оказался немного в другой нише и просто так попробовать машинное обучение в коммерческом проекте не удастся. Ведь куда не посмотришь в machine learning – все на Python, R или C++. ## А что у нас есть на C#? ![](http://i.imgur.com/qJ9vwXam.png) Самый известный фреймворк для работы с машинным обучением на .Net - это [*Accord.Net*](http://accord-framework.net). И вообще говоря – это не самый плохой вариант, из основных достоинств которого можно выделить: - Нормальная документация, примеры. - Хороший открытый исходный код, в которой можно заглянуть. - Модульность (куча Nuget пакетов для специфических потребностей). - Фреймворк довольно обширный и покрывает базовые потребности (насколько я – человек не имеющий особого опыта в машинном обучении – могу судить о потребностях). И черт возьми, эти миллионы (буквально) строк кода были написаны одним человеком - César Souza. Это правда титановый труд и этот человек заслуживает безумного уважения, но в этом и есть главный минус фреймворка – он пишется одним человеком. А этого очень мало. И вроде в Accord.net есть очень многое, но нет кучи вещей, которые есть во всех основных фреймворках на том же Python. Например, сверточных нейронных сетей (convolutional neural network). Вот просто нет совсем. Как написал автор ([*ссылка*](https://github.com/accord-net/framework/issues/92)): > Текущие интерфейсы, унаследованные от Afforge.net (давнишний предок > Accord.net) совсем не подходят для CNN. Реализовывать CNN на них будет > очень неэффективно. Планирую начать заниматься проблемой после решения > такого-то бага. И в общем это было 1.5 года назад и CNN все еще нет. И видимо будет не скоро, если еще будет. Я думаю, что люди, профессионально занимающиеся Machine Learning, найдут еще больше отсутствующего функционала. На stackoverflow есть 316 вопросов с тегом accord.net, против 12 000 у гугловского TensorFlow. Согласитесь – все грустно. Есть еще парочку небольших фреймворков на C#, например, [*Encog*](https://github.com/encog/encog-dotnet-core), но там все еще хуже. ## А может Java? ![](http://i.imgur.com/TuwQQnV.png) И таки да. У основного конкурента C# дела идут куда лучше. И это «куда лучше» называется [*deeplearning4j*](https://deeplearning4j.org). И чем же оно лучше Accord.net? Во-первых, нет пробелов в функциональности. Все, что вы найдете в TensorFlow или в Caffe будет и здесь (учитывая те же CNN). Во-вторых, dl4j – это чисто коммерческая разработка. За ней стоит не один человек, а целая компания ([*Skymind*](https://skymind.ai)) и это сразу очень сильно ощущается. Начнем с очень крутой документации: ну вот посмотрите хотя бы на прекрасную [*статью*](https://deeplearning4j.org/convolutionalnets.html) в dl4j, описывающую многострадальное CNN с картинками, примерами кода, перекрестными ссылками и так далее. Более того, даже [*книга*](http://shop.oreilly.com/product/0636920035343.do) есть! На английском правда, но что вы хотели? Потом есть чисто коммерческие крутые фичи, присущие взрослым фреймворкам: возможность вычислений на GPU (предполагаю, что используют [*CUDA*](https://ru.wikipedia.org/wiki/CUDA)) и интеграция с [*Spark*](https://ru.wikipedia.org/wiki/Apache_Spark). Ну и наконец, ребята портировали NumPy ([*ND4J*](http://nd4j.org/backend.html)) – это очень известная библиотека для линейной алгебры на Python, которую часто используют в машинном обучении. А еще они сделали инструмент([*Word2Vec*](https://deeplearning4j.org/word2vec)), интегрированный в фреймворк для [*вектороного анализа слов*](https://ru.wikipedia.org/wiki/Word2vec). То есть относительно Accord.net с этим очень можно жить. Что касается комьюнити, то мы имеем 273 вопроса на stackoverflow с тегами deeplearnig4j и dl4j, что в общем-то очень мало, но зато есть очень-очень активное комьюнити в [*Gitter*](https://gitter.im/deeplearning4j/deeplearning4j) с разработчиками фреймворка, которые отвечают на все вопросы. Есть даже [*комната*](https://gitter.im/deeplearning4j/deeplearning4j-russian) на русском, которая тоже довольно активна. ## Вывод Лучше всего конечно Python – просто огромное комьюнити, много работы для Data Science специалиста, куча фреймворков и тд. На Java тоже жить можно, особенно если проект ынтерпрайзный и написан на Java. А вот на C# можно только страдать. ## Обновление #1 от 05/03/2017 (машинное обучение на .Net) ![](http://i.imgur.com/8luXJ59l.jpg) **TensorFlowSharp** Прошло два месяца, что в машинном обучении значит очень много и ситуация начала потихонечку меняться в лучшую сторону. Во-первых, очень известный мексиканский гастарбайтер и один создателей Mono / Xamarin [*Мигель Де Иказа*](https://ru.wikipedia.org/wiki/Икаса,_Мигель_де) начал делать [*.Net API для TensorFlow*](https://github.com/migueldeicaza/TensorFlowSharp)! Несмотря на то, что активная разработка еще в процессе, а релиза как такового еще нет, формально биндинг уже готов для использования. К сожалению, пока что это лишь тонкая прослойка над движком TensorFlow (написанном на С++), [*при том автоматически сгенерированная*](http://tirania.org/blog/archive/2017/Jan-18.html). В связи с этим во многих частях API выглядит совсем стремным, а из Windows использовать [*TensorFlowSharp вообще еще нельзя*](https://github.com/migueldeicaza/TensorFlowSharp/issues/21). Пока что автор переписывает наиболее одиозно-сгенерированные части вручную, постепенно доводя проект до минимально рабочего состояния. Во-вторых, автор наиболее известного из готовых фреймворков для ML на .Net поделился планами [*дальнейшего развития Accord.net*](https://github.com/accord-net/framework/issues/92). Если вкратце, то Accord.net будет двигаться по направлению создания высокоуровневого API для TensorFlowSharp (последний является относительно низкоуровневым). То есть автор Accord.net хочет создать этакий аналог [*Keras*](https://en.wikipedia.org/wiki/Keras), только на C\#. Естественно, это не может не радовать. Возможно через годик мы получим действительно юзабельное машинное обучение на .Net, со вменяемым API и наличием смысла вкладывать в это время (ведь по сути вы работаете с TensorFlow – одним из самых распространенных фреймворков для ML на данный момент). **CNTK C\#** Наткнулся на факт того, что фреймворк от Microsoft для ML - [*CNTK*](https://github.com/Microsoft/CNTK) так же имеет [*биндинг на .Net.*](https://github.com/Microsoft/CNTK/wiki/CNTK-Eval-Examples) Причем, формально говоря, полностью готовый к Production-использованию. Но именно формально говоря, ведь главным языком для CNTK все равно остается Python (ну и да, можно работать напрямую из С++). Net биндинг сделали скорее для интеграции в ваши .Net приложения модели, уже натренированные и вылизанные через Python. Увы, но на данный момент (05/03/2017), текущие состояние развития ML на .Net отражаться вот такой иронией: Microsoft – создатель языка C\# и .Net не видит никакой логики делать C\# / F\# хотя бы равноправными (с Python) языками разработки для своего ML-фреймворка.
(05.03.2017)

blog comments powered by Disqus