Я имею в виду, что если я хочу реализовать нормальную нейронную сеть, легко найти градиент или производное выражение где угодно, но когда я реализую конкретную нейронную сеть, это не так просто. Итак, обычно, когда вы делаете это, вы получаете выражение градиента вручную или используете какой-то инструмент? Большое спасибо!
Theano может сказать вам символическое выражение для градиента. Единственная проблема заключается в том, что для интерпретации результатов может потребоваться небольшое усилие.
Например, пусть x
, w
, а также b
быть скалярами и
y = x * w + b
В Theano это может быть реализовано как
import theano
import theano.tensor as tt
x = tt.scalar('x')
w = tt.scalar('w')
b = tt.scalar('b')
y = x * w + b
g = tt.grad(y, w)
theano.printing.debugprint(g)
f = theano.function([x, w, b], outputs=g)
theano.printing.debugprint(f)
При выполнении (с использованием текущей передовой версии Theano) этот скрипт напечатает
Elemwise{mul} [id A] ''
|Elemwise{second,no_inplace} [id B] ''
| |Elemwise{add,no_inplace} [id C] ''
| | |Elemwise{mul,no_inplace} [id D] ''
| | | |x [id E]
| | | |w [id F]
| | |b [id G]
| |TensorConstant{1.0} [id H]
|x [id E]
DeepCopyOp [id A] 'x' 0
|x [id B]
Первый вывод — неоптимизированное выражение градиента. Второе — это оптимизированное выражение градиента.
Как мы знаем из нашего класса дифференциального исчисления, для данного выражения y
,
dy/dw = x
И это именно то, что мы видим из Theano.
Таким образом, вы можете построить свою нейронную сеть в Theano, а затем распечатать автоматически выведенный символьный градиент, чтобы увидеть, каким он должен быть, а затем внедрить это выражение в альтернативную реализацию.
Для более сложных сетей интерпретация символического градиента от Theano может быть очень утомительной, и, вероятно, легче выучить необходимую математику, чтобы получить градиенты самостоятельно, особенно если используются достаточно стандартные конструкции нейронных сетей. Затем можно использовать автоматическое дифференцирование Theano для проверки вашего ручного вывода.
Используя архитектуру нейронной сети, следует рассчитать формулы для градиентного достойного обучения. Если вы используете пакет нейронной сети, такой как caffe или torch, вам просто нужно будет указать, будете ли вы работать с отрицательной вероятностью записи в лог, среднеквадратичной ошибкой или чем-то другим (именно это меняет правило обучения). Формулы будут сделаны автоматически. Тем не менее, если вы пишете свою собственную платформу нейронной сети, вам нужно будет немного по математике или просто получить формулы из бумаги или чего-то еще. Не существует инструмента, который работает как средство поиска формул для обучения нейронным сетям.