Pull to refresh

Comments 12

Хочется добавить, что тот же Keras может использовать в качестве бэкенда и Theano, и Tensorflow.

Непонятно только, почему автор решил назвать эти фреймворки символьными: термин "symbolic AI" имеет совершенно другой смысл и относится скорее к логическому выводу в экспертных системах. Есть подозрение, что вся статья навеяна термином "symbol" в Theano, где он оправдан только наполовину (например, дифференцирование в нём всё-таки автоматическое, а не символьное).

Возможно понятие «символьные» появилось тут из-за символьных графов — ну или конструкции, которые получаются в ходе разработки на таких фреймворках. К примеру вот — https://1.bp.blogspot.com/-vDKYuCD8Gyg/Vj0B3BEQfXI/AAAAAAAAAyA/9tWmYUOxo0g/s1600/cifar10_2.gif или вот http://deeplearning.net/software/theano/_images/logreg_pydotprint_predict2.png

В том то и дело, что там есть графы, но не символы :) В TensorFlow, например, граф состоит из переменных и операций, в MXNet — из переменых и слоёв, а термин "символ" встречается для обозначения тех же переменных только в Theano :)

Я думаю, что под символьными графами понимают, графы в которых символы могут означать не конкретно цифру/переменную, а операцию или набор операций. Это такой просто уровень абстракции. Вот кажется тут поясняется http://www.sciencedirect.com/science/article/pii/S0747717110001689

Usually, an attributed graph is considered to be some kind of labelled graph whose labels are
values of a given data domain. The idea of our approach is to generalize this notion by considering
that attributed graphs are E-graphs, whose labels are variables, together with a set of conditions or
formulas that constrain the possible values of these variables. We call these graphs symbolic graphs


Ну то есть под символом понимается вершина графа, которая может быть мат операцией, трансформацией или просто набором данных.
Вот статья, которая на примере показывает что такое символы в этих фреймворках http://christopher5106.github.io/big/data/2016/03/06/symbolic-computing-and-deep-learning-tutorial-on-theano-and-google-tensorflow.html в тензорфлоу они называются placeholders или тензоры. Короче это все одно и тоже по разному называется:)

Вот наверное каноническое определение — Wikipedia

Судя по всему, автор статьи как раз и попал в ту терминологическую путаницу, про которую я говорю. Смотрите:


The second advantage of symbolic computing is the automatic differentiation

Здесь есть 2 понятия: символьные вычисления и автоматическое дифференцирование.


Символные вычисления — это очень общее направление в информатике, описывающее вычисления над некоторыми символами. Как вы правильно обратили внимание, выражения, состоящие из переменных и операций могут быть предствлены в виде графа символов. Над этими выражениями можно проводить ряд символьных преобразований (например, упрощать выражения или находить символьные производные), трансформировать в код или план выполнения (как в случае с SQL) или делать логический вывод (как в случае эспертных систем). Графы в Theano и TensorFlow только частично являются символьными, ибо кроме имени символа хранят информацию о типе данных (это важно, см. ниже про символьное дифференцирование).


Автоматическое дифференцирование (AD) в основном встречается в двух вариантах: forward-mode AD и reverse-mode AD. Forward-mode AD позволяет эффективно вычислять производные функций вида R -> R^n, что в рамках машинного обучения не очень интересно. А вот reverse-mode AD как раз хорошо работает с функциями R^n -> R, т.е. как раз к большинству функций потерь, для которых и требуется вычислить градиент.


Фишка в том, что reverse-mode AD, вообще говоря, не требует никакого символьного представления. Например, стандартный алгоритм обратного распространения ошибки (backpropagation) — это как раз частный случай reverse-mode AD, но никакого симпольного графа в нём и рядом нет.


Есть и другое направление — символьное дифференцирование. Чистое символьное дифференцирование, например, используется в Mathematica или SymPy. Пример из последнего:


>>> diff(cos(x), x)
-sin(x)

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


Автоматическое дифференцирование не имеет таких проблем: в нём мы не пытаемся найти единое символьное представление для производной, а только находим её значение в одной конкретной точке, заданной на входе. Это и плюс и минус: с одной стороны, мы можем анализировать голый программный код, с условмиями, циклами, структурами данных и т.д., а с другой, на выходе мы получаем не красивое символьное выражение, а вычислительный граф, работать с которым всё-таки посложней (как минимум, человек не сможет его "прочитать" и вручную закодировать). Кроме того, в reverse-mode AD мы вынуждены сохранять значения промежуточных переменных, а это могут быть тензоры довольно больших размеров.


Как Theano, так и TensorFlow (про MXNet не знаю) используют reverse-mode AD. Имена переменных (т.е. собственно "символы") при построении графа в них являются опциональными и могут польностью игнорироваться пользователем (сравните это с тем же SymPy или с логическими движками типа Prolog, где пользователя как раз и интересует конкретный символьных результат). Соответсвенно, слово "символьный" в названии, насколько я понимаю, не несёт никакой смысловой нагрузки и "символьное глубокое обучение" ничем не отличается от обычного :)


(а началось всё с того, что я понадеялся увидеть совмещение современных глубоких сетей и старого доброго символьного AI :))

Статья о глубоком обучении в блоге Microsoft, а упоминаний о CNTK почему-то нет. Странно.

Будет отлично если вместо категориальной оценки будут численные величины, которые информативнее. Насколько «превосходно» лучше «средне» в той же производительности? Лично мне непонятно.
И не просто величины, а ещё методология тестирования и графики.
Не соглашусь с утверждением об отсутствии поддержки пред-обученных моделей в tensorflow. Есть даже полный аналог ModelZoo, найти его можно в официальном репозитории. Другое дело, что обученные модели на tensorflow в открытом доступе можно встретить нечасто.
Вся красота Tensorflow становится особенно заметна, если крутить его на настоящих больших задачах на GPU-кластере, а не в 'Hello, World'-примере на десктопе.
С другой стороны, было бы удивительно прочитать, что tf хорош в блоге Microsoft.
Sign up to leave a comment.