comtemichel (comtemichel) wrote,
comtemichel
comtemichel

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

Оригинал взят у ailev в Программные/языковые архитектуры для глубокого обучения
Побывал я сегодня на Moscow Deep Learning Meetup #4 (http://www.meetup.com/Deep-learning-Moscow/events/227384305), где обсуждались нейросетевые диалоговые системы.

Разговор про собственно диалоговые системы я скипну (работа кипит, хвастаться пока особо нечем. Что тут ещё сказать?).

Но вторая тема была про реализацию Char-RNN на Torch. Разговор шёл сразу/вперемешку на трёх уровнях:
-- математика, арифметические операторы. Задаются формулами [примерно как транзисторы в микросхемах, самый нижний уровень]
-- элементарные операции типа GRU. Задаются простыми картинками из кружочков и стрелочек [примерно как простая логика в электронике: логическими гейтами, под которыми транзисторы уже не видны]
-- разговор "в слоях", об архитектуре сети. Задаются на DSL внутри базового языка программирования, или диаграммами с квадратиками-слоями [примерно как сдвиговые регистры, порты и т.д. в электронике: крупными мазками, практически не опускаясь до показа отдельных гейтов и уж тем более транзисторов]

Эти все уровни в разговоре существенно перемешивались, как у компиляторщиков, когда они обсуждают C, символический, а то и макроассемблер, под ним машинный язык, и всё это вперемешку. Только беда в том, что в deep learning это обсуждали не компиляторщики, а прикладники. IMHO прикладники должны бы уже давно заговорить на более высокоуровневом языке, "языке архитектуры сетки" (встроенного DSL), но по факту этого не происходило -- обсуждение шло на всех уровнях сразу, даже с учётом того, что в зале были вроде как "специалисты".

Стало понятно, что архитектурная/языковая действительность в deep learning появляется, но с ней пока не разобрались. С одной стороны, уже реальность dataflow DSL типа описаний сеток в Torch и TensorFlow -- и это даёт возможность autodiff, компактные описания и всё остальное. С другой стороны, рядом выписываются формулы "машинного языка", архитектурки "ячеек GRU" и прочие низкоуровневые реалии. С третьей стороны, универсальные понятия "слоя", "активации" и т.д. немного по-разному реализуются в разных фреймворках. Ну, типа как "цикл" в языках программирования году в 1975, когда ещё не утихли дискуссии про то, как он должен выглядеть, а структурное программирование только-только было в эпицентре обсуждений.

Уйти от языкостроительства для deep learning (и далее со всеми остановками для всего machine learning) не удастся, но там есть множество особенностей: все эти DSL должны пройти традиционную дискуссию для DSL, с теми осложнениями, что языки более-менее высокоуровневого (слои) и низкоуровневого (ячейки и "просто математика") описания сеток и их элементов должны как-то сочетаться, компилироваться не только для CPU, но и для GPU, облегчать autodiff, работать быстро и кушать мало памяти. Легко эти требования ставить, трудно выполнить. Так что я приветствовал бы более глубокое обсуждение DSL для deep learning (а дальше неминуемо появятся расширения для других парадигм машинного обучения).

Пока мне интересен MXNet с его подходом сочетания императивных и декларативных описаний нейронных архитектур -- embedding of both symbolic expression and tensor operation is handled in a unified fashion. Этот подход описан тут: http://mxnet.readthedocs.org/en/latest/#open-source-design-notes (Open Source Design Notes, набор архитектурных документов, обсуждающих архитектуры программных фреймворков для deep learning и особенности тамошних DSL). Ход там на мультипарадигмальность, ибо "монопарадигмальные языки" оказываются не очень мощными. Все рассуждения, конечно, потом подтверждаются работающим мультиязыковым (Python, Julia, R) фреймворком. Например, Julia вариант живёт вот тут: https://github.com/dmlc/MXNet.jl

Там есть и другие языковые развилки. Так, есть две школы: одна считает, что GPU это забота "писателей драйверов" и садятся на стандартный драйвер GPU. Другая (Nervana/neon, например, https://github.com/NervanaSystems/neon) считает, что требуется оптимизирующий компилятор архитектуры сетки внутрь GPU, и что "драйвер" это недопустимая роскошь. Трудозатраты на оптимизации в разы больше, но зато и результат соразмерен. Производительность тренинга сеток сегодня существенно влияет на цену итоговой сетки, это мотивирует и разработчиков фреймворков, и разработчиков аппаратуры (убедительная табличка в http://www.nextplatform.com/2015/12/07/gpu-platforms-emerge-for-longer-deep-learning-reach/).

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

Tags: deep learning, аналитика, нейросети, перепост
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments