Autograd и инициализатор API Python

В этой главе рассматривается API автоградации и инициализатора в MXNet.

mxnet.autograd

Это API автограда MXNet для NDArray. Он имеет следующий класс -

Класс: Функция ()

Используется для индивидуальной дифференциации в автограде. Это можно записать какmxnet.autograd.Function. Если по какой-либо причине пользователь не хочет использовать градиенты, которые вычисляются с помощью правила цепочки по умолчанию, он / она может использовать класс Function из mxnet.autograd, чтобы настроить дифференциацию для вычислений. У него есть два метода: Forward () и Backward ().

Давайте разберемся в работе этого класса с помощью следующих пунктов:

  • Во-первых, нам нужно определить наши вычисления в прямом методе.

  • Затем нам нужно обеспечить индивидуальную дифференциацию в обратном методе.

  • Теперь во время вычисления градиента вместо определяемой пользователем функции обратного направления mxnet.autograd будет использовать функцию обратного направления, определенную пользователем. Мы также можем преобразовать в массив numpy и назад для некоторых операций как вперед, так и назад.

Example

Прежде чем использовать класс mxnet.autograd.function, давайте определим стабильную сигмовидную функцию с помощью обратных и прямых методов следующим образом:

class sigmoid(mx.autograd.Function):
   def forward(self, x):
      y = 1 / (1 + mx.nd.exp(-x))
      self.save_for_backward(y)
      return y
   
   def backward(self, dy):
      y, = self.saved_tensors
      return dy * y * (1-y)

Теперь класс функции можно использовать следующим образом -

func = sigmoid()
x = mx.nd.random.uniform(shape=(10,))
x.attach_grad()
with mx.autograd.record():
m = func(x)
m.backward()
dx_grad = x.grad.asnumpy()
dx_grad

Output

Когда вы запустите код, вы увидите следующий вывод -

array([0.21458015, 0.21291625, 0.23330082, 0.2361367 , 0.23086983,
0.24060014, 0.20326573, 0.21093895, 0.24968489, 0.24301809],
dtype=float32)

Методы и их параметры

Ниже приведены методы и их параметры класса mxnet.autogard.function.

Методы и их параметры Определение
вперед (головы [, head_grads, keep_graph,…]) Этот метод используется для прямого вычисления.
назад (головы [, head_grads, keep_graph,…]) Этот метод используется для обратных вычислений. Он вычисляет градиенты головы относительно ранее отмеченных переменных. Этот метод принимает столько же входов, сколько выходных данных форварда. Он также возвращает столько NDArray, сколько входных данных форварда.
get_symbol (x) Этот метод используется для получения записанной истории вычислений как Symbol.
grad (головы, переменные [, head_grads,…]) Этот метод вычисляет градиенты головы относительно переменных. После вычисления вместо сохранения в variable.grad градиенты будут возвращены как новые массивы NDArrays.
is_recording () С помощью этого метода мы можем получить статус записи, а не записи.
is_training () С помощью этого метода мы можем получить статус по обучению и прогнозированию.
mark_variables (переменные, градиенты [, grad_reqs]) Этот метод пометит NDArrays как переменные для вычисления градиента для автограда. Этот метод аналогичен функции .attach_grad () в переменной, но с той лишь разницей, что с помощью этого вызова мы можем установить градиент на любое значение.
пауза ([train_mode]) Этот метод возвращает контекст области, который будет использоваться в операторе with для кодов, для которых не нужно вычислять градиенты.
pred_mode () Этот метод возвращает контекст области, который будет использоваться в операторе 'with', в котором поведение прямого прохода установлено в режим вывода, и это без изменения состояний записи.
запись ([train_mode]) Он вернет autograd запись контекста области действия для использования в операторе with и захватывает код, для которого необходимо вычислить градиенты.
set_recording (is_recording) Подобно is_recoring (), с помощью этого метода мы можем получить статус записи, а не записи.
set_training (is_training) Подобно is_traininig (), с помощью этого метода мы можем установить статус обучения или прогнозирования.
train_mode () Этот метод вернет контекст области, который будет использоваться в операторе with, в котором поведение прямого прохода установлено в режим обучения и это без изменения состояний записи.

Пример реализации

В приведенном ниже примере мы будем использовать метод mxnet.autograd.grad () для вычисления градиента головы относительно переменных -

x = mx.nd.ones((2,))
x.attach_grad()
with mx.autograd.record():
z = mx.nd.elemwise_add(mx.nd.exp(x), x)
dx_grad = mx.autograd.grad(z, [x], create_graph=True)
dx_grad

Output

Вывод упомянут ниже -

[
[3.7182817 3.7182817]
<NDArray 2 @cpu(0)>]

Мы можем использовать метод mxnet.autograd.predict_mode () для возврата области видимости, которая будет использоваться в операторе with -

with mx.autograd.record():
y = model(x)
with mx.autograd.predict_mode():
y = sampling(y)
backward([y])

mxnet.intializer

Это API MXNet для инициализатора веса. Он имеет следующие классы -

Классы и их параметры

Ниже приведены методы и их параметры mxnet.autogard.function класс:

Классы и их параметры Определение
Билинейный () С помощью этого класса мы можем инициализировать вес для слоев с повышающей дискретизацией.
Константа (значение) Этот класс инициализирует веса заданным значением. Значение может быть скаляром или массивом NDArray, соответствующим форме устанавливаемого параметра.
FusedRNN (init, num_hidden, num_layers, режим) Как следует из названия, этот класс инициализирует параметры для объединенных слоев рекуррентной нейронной сети (RNN).
InitDesc Он действует как дескриптор для шаблона инициализации.
Инициализатор (** kwargs) Это базовый класс инициализатора.
LSTMBias ([Forgot_bias]) Этот класс инициализирует все смещения LSTMCell равными 0,0, за исключением логического элемента забывания, смещение которого установлено на пользовательское значение.
Загрузить (param [, default_init, verbose]) Этот класс инициализирует переменные, загружая данные из файла или словаря.
MSRAPrelu ([фактор_типа, наклон]) Как следует из названия, этот класс Инициализирует вес в соответствии с бумагой MSRA.
Смешанный (шаблоны, инициализаторы) Он инициализирует параметры, используя несколько инициализаторов.
Нормальный ([сигма]) Класс Normal () инициализирует веса случайными значениями, выбранными из нормального распределения со средним нулевым и стандартным отклонением (SD) sigma.
Один() Он инициализирует веса параметра равным единице.
Ортогональный ([масштаб, ранд_тип]) Как следует из названия, этот класс инициализирует вес как ортогональную матрицу.
Униформа ([масштаб]) Он инициализирует веса случайными значениями, которые равномерно выбираются из заданного диапазона.
Ксавье ([rnd_type, factor_type, magnitude]) Фактически он возвращает инициализатор, который выполняет инициализацию «Xavier» для весов.
Нуль() Он инициализирует веса параметра равными нулю.

Пример реализации

В приведенном ниже примере мы будем использовать класс mxnet.init.Normal () для создания инициализатора и получения его параметров -

init = mx.init.Normal(0.8)
init.dumps()

Output

Результат приведен ниже -

'["normal", {"sigma": 0.8}]'

Example

init = mx.init.Xavier(factor_type="in", magnitude=2.45)
init.dumps()

Output

Результат показан ниже -

'["xavier", {"rnd_type": "uniform", "factor_type": "in", "magnitude": 2.45}]'

В приведенном ниже примере мы будем использовать класс mxnet.initializer.Mixed () для инициализации параметров с использованием нескольких инициализаторов -

init = mx.initializer.Mixed(['bias', '.*'], [mx.init.Zero(),
mx.init.Uniform(0.1)])
module.init_params(init)

for dictionary in module.get_params():
for key in dictionary:
print(key)
print(dictionary[key].asnumpy())

Output

Результат показан ниже -

fullyconnected1_weight
[[ 0.0097627 0.01856892 0.04303787]]
fullyconnected1_bias
[ 0.]