2015-05-21 5 views
1

В Феано переменные записываются как «символы»:Какова цель создания символических переменных в Theano?

x = T.matrix("x") 
y = T.vector("y") 

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

Какова цель создания символических переменных в Theano? Что они могут сделать, что a, из назначения коробки в Python не может сделать?

+0

Я никогда не использовал анано, но документация указывается в нескольких местах (например, http://deeplearning.net/software/theano/extending/graphstructures.html#graphstructures или http://deeplearning.net/software/theano /tutorial/adding.html), что имена предназначены только для отладки и печати печатающего графика операций. –

+0

Theano - компилятор выражения математики, поэтому я подозреваю, что причина более значима? –

+0

Рассчитать градиенты, оптимизировать вычисления, ... – eickenberg

ответ

4

веб-сайт Theano открывается

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

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

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

Например, если y=x**2 (где ** является оператором мощности), то градиент y по отношению к x является dy/dx = 2*x. Theano может сделать это автоматически:

import theano 
import theano.tensor 
x = theano.tensor.scalar('x') 
y = x ** 2 
theano.printing.pp(y) 
dy_dx = theano.grad(y, x) 
theano.printing.pp(dy_dx) 

Если запустить этот код, который вы будете видеть вывод

(x ** TensorConstant{2}) 
((fill((x ** TensorConstant{2}), TensorConstant{1.0}) * TensorConstant{2}) * (x ** (TensorConstant{2} - TensorConstant{1}))) 

Операция fill просто создает тензор правильной формы (скаляр в данном случае), заполненный с тех и TensorConstant{a} только число a так что это может быть упрощено до

(x ** 2) == x ** 2 
((1 * 2) * (x ** (2 - 1))) == (2 * (x ** 1)) == 2 * x 

Как и ожидалось.

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

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

Помимо символической дифференциации, символический подход Theano предлагает другие существенные преимущества:

  • Theano может составить символьные математические выражения в исполняемый код. Он использует различные методы, которые могут обеспечить исполняемый код, который может работать быстрее, чем простой код Python.
  • Программы Anano часто могут переключаться между работой на CPU и GPU без каких-либо изменений кода.
  • При запуске на процессоре Theano в полной мере использует numpy BLAS и средства OpenMP, если они доступны, для параллелизации выполнения над несколькими ядрами ЦП.
  • При работе на графическом процессоре Theano в полной мере использует многие ядра на современных графических процессорах для распараллеливания самых дорогостоящих операций (в первую очередь, для матричного умножения).
  • Компилятор Theano является оптимизирующим компилятором в том смысле, что он может изменить выражение (также известное как граф вычислений) с использованием различных преобразований, которые поддерживают семантику выражения (он все еще вычисляет те же результаты с одинаковыми входами), но достигая различной производительности и, самое главное, numerical stability прибыль.

Plain Python не предлагает ничего из вышеперечисленного и, используя только numpy, предлагает только некоторые функции распараллеливания (через BLAS и OpenMP).

Еще по этой теме in the Theano documentation.

P.S. это расширение краткого комментария @eickenberg к вопросу.

Смежные вопросы