Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Нужны ли специальные языки программирования для machine learning?

В статье про машинное обучение и языки программирования подробно разбирается вопрос "are new ML-tailored languages required, and if so, why? More importantly, what might the ideal ML language of the future look like?" -- https://julialang.org/blog/2017/12/ml&pl.

Эпиграф там замечательный: Any sufficiently complicated machine learning system contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of a programming language.

Конечно, There are few domains as demanding about language-level design issues as machine learning. But it’s not unprecedented, and in areas like formal reasoning and verification or cluster computing, new, tailor-made languages have proved an effective solution. Similarly, we expect to see new or existing languages customised for the kind of numerical, differentiable, parallelisable and even probabilistic computations needed in ML.

Важно ли это, особо выделять machine learning? Важно, ибо говорим не больше и не меньше, чем о Software 2.0 (https://medium.com/@karpathy/software-2-0-a64152b37c35). Models now demand conditional branching (ok, easy enough to hack in), loops for recurrence (less easy but possible), and even recursion over trees (virtually impossible to deal with). In many areas of ML, including neural networks and probabilistic programming, models are becoming increasingly like programs, including ones that reason about other programs (e.g. program generators and interpreters), and with non-differentiable components like Monte Carlo Tree Search. It’s enormously challenging to build runtimes that provide complete flexibility while achieving top performance, but increasingly the most powerful models and groundbreaking results need both.

В статье перечислено много очевидного и известного про языковые особенности всяческих TensorFlow и Chainer, но в одном месте и с большим количеством ссылок, плюс интересные замечания типа formats like XLA, ONNX and NNVM are becoming ever more sophisticated and will likely take more inspiration from traditional language design,5 perhaps even adding surface syntax to become fully-fledged programming languages. Компиляторные/платформенные стеки (у Алана Кея это были цепочки T-shirts), доходящие снизу до разного ускорительного железа (от суперкомпьютеров до смартфонов) становятся общим местом. Python и C++ поминаются через строчку, работающих с ними жалеют и желают всяческих успехов в борьбе с невзгодами. UPDATE: а ещё появился с тех пор NNEF как компиляторная цель -- https://ailev.livejournal.com/1395131.html

Вывод: Machine learning models have become extremely general information-processing systems that build ever higher-level and more complex abstractions; recurrence, recursion, higher-order models, even stack machines and language interpreters, all implemented as compositions of basic components. ML is a new programming paradigm, albeit a strange one that’s heavily numerical, differentiable and parallel. And as in any engineering field, the tooling available will have a profound impact on the scope and quality of future work.

Понятно, что авторы склоняются к тому, что будут это всё учитывать в Julia -- we in the Julia community feel that it is an excellent substrate for experimenting with these kinds of language-level issues, and will continue to push the boundaries with projects like Knet, Flux, Cassette, CUDAnative, DataFlow.jl, and more.

Я бы читал эту статью ещё и в свете замечания David Abel с декабрьской NIPS 2017 (https://cs.brown.edu/~dabel/blog/posts/misc/nips_2017.pdf): Overall my sense is that the Deep Learning hype has settled to an appropriate level. There’s of course loads of excitement about new methods and applications, but we’re no longer seeing the over saturation of papers tackling the same thing (except perhaps GAN and Deep RL architectures). The Deep Learning work has found its role in the broader context of ML. Теорема бесплатного обеда потихоньку проявляет своё действие, идея "глубокости" проникает отнюдь не только в нейросети, но и в самые разные другие области. Например, deep Gaussian Processes -- a method to integrate out all of the input/outputs of a deep neural network that then translates a neural network into a Gaussian Process. This is the idea of a deep GP. We form our distribution over the functions implemented by the network. Байесовские методы в частности и вероятностное программирование в общем тоже активно перемешиваются с deep learning, но и "сами с усами" -- и там тоже ой-ой сколько спец.языков: http://probabilistic-programming.org/

То есть предметная область оказывается с одной строны, "предметно-ориентированной", а с другой -- просто численными методами, в которых эту "предметную ориентированность" ещё и разглядеть нужно. Скорее уж нужно понимать, как одновременно юзать самые разные пакеты, поддержку самых разных методов, но в одном приложении. То есть отдельные DSL не выживут, выживут встроенные DSL. И кандидатов пока для "встраивания" по факту два: Python и Julia.

Дальше можно
-- поспекулировать о том, что Julia (как и Фортран, как Си) это суперкомпьютерный язык, а Python -- не очень. Питон не может в GPU, в этом его беда.
-- прикинуть, не появится ли вообще что-то совсем новое из языков (почему бы и нет! Какая-нибудь большая толстая фирма заявит, что будет программировать на чём-то новом, и поддержит всей своей массой программистов. Пять лет административной бури и натиска, и новый язык в деле).
-- прикинуть, что там с этими аппаратными вычислениями внизу полного вычислительного стека (например, насколько спецмашинки для deep learning смогут поддержать все эти сложные языковые архитектуры, насколько это по зубам вычислительным более универсальным машинкам типа ускорителей NVIDIA, и что дают автодифференцируемые программы, которые залезают внутрь GPU -- CUDAnative.jl, в спецвычислители для нейросетей автодифференцирование же не залезет. Кстати, автодифференцирование в Julia продолжает развиваться, вот только что опубликовали ReverseDiff, https://github.com/JuliaDiff/ReverseDiff.jl, ReverseDiff is algorithmically more efficient for differentiating functions where the output dimension is less than the input dimension. И там в планах уже поддержка GPU. А уж как совмещать самые разные численные алгоритмы в одном API в тусовке Julia уже определились на базе экосистемы решения дифуров, много мыслей на эту тему можно вычитать в блоге http://www.stochasticlifestyle.com/).
-- поспекулировать, что появляются всё новые и новые классы языков, и все "эффективно компилируемые". Например язык интуицонистской логики http://intuitionistic.org/, combining a very high level of abstraction with compilation to efficient LLVM bytecode. Выживет ли он как stand alone, или придётся такие языки тоже погружать в универсальный язык?

Я б до кучи добавил сюда и неизбежное перемешивание задач машинного обучения и инженерного моделирования. Вот тут я подробно писал про инженерное моделирование, давал много ссылок на смежные проекты: https://ailev.livejournal.com/1366789.html.

А ещё из языка машинного обучения нужно добраться как-то до огромных объёмов данных. Тут тоже жизнь: склеиваются языки работы с базами данных и языки работы с фреймворками машинного обучения -- типа аппаратно ускоренной Kinetica с TensorFlow внутри, всё более усложняющейся in-database analytics в стремительно растущих графовых базах данных -- https://ailev.livejournal.com/1373680.html.

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

И в этом секторе Julia не самый проигрышный на сегодня вариант. Тем более что Stefan Karpinski сказал месяц назад в ответ на удивление, почему черновая версия 0.7 (она же будет 1.0) на одном из классов задач заработала чуть ли не вдвое быстрее, чем версия 0.6 -- I’ve said it before but it bears repeating: we’ve barely scratched the surface of the kinds of optimizations that we can do in Julia (https://discourse.julialang.org/t/fantastic-progress-in-master-branch/6868/5).

Поэтому продолжаем следить за Julia, http://julialang.org/. На вопросы по-русски обычно бодро и быстро отвечают в русскоязычном Julia-чат в телеграме -- https://t.me/JuliaLanguage.

UPDATE: дискуссия в фейсбуке -- https://www.facebook.com/ailevenchuk/posts/10211836545043109
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 25 comments