Какова цель создания символических переменных в Theano?

В Theano переменные записываются как «символы»:

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

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

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


person tumultous_rooster    schedule 21.05.2015    source источник
comment
Я никогда не использовал theano, но в документации указано в нескольких местах (например, deeplearning. net/software/theano/extending/ или deeplearning.net/software/theano /tutorial/adding.html), эти имена предназначены только для отладки и красивого отображения графа операций.   -  person Matteo Italia    schedule 21.05.2015
comment
Theano — это компилятор математических выражений, поэтому я подозреваю, что причина более значима?   -  person tumultous_rooster    schedule 21.05.2015
comment
Рассчитывайте градиенты, оптимизируйте расчеты, ...   -  person eickenberg    schedule 22.05.2015


Ответы (1)


Веб-сайт 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 предлагает другие важные преимущества:

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

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

Подробнее по этой теме в документации Theano.

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

person Daniel Renshaw    schedule 28.05.2015