ЧТО ТАКОЕ ННАБЛА?

SONY выпустила Библиотеки нейронных сетей, сокращенно NNabla.

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

# build static graph like tensorflow
x = nn.Variable((2, 3))
out = PF.affine(x, 10)
# inference like sess.run
x.d = np.random.random((2, 3))
out.forward()
value = out.d

С другой стороны, стиль определения по запуску можно записать так.

with nn.auto_forward():
    x = nn.Variable.from_numpy_array(np.random.random(2, 3))
    out = PF.affine(x, 10)
value = out.d

Дополнительные примеры кодов доступны на https://github.com/sony/nnabla-examples.

ГЛУБОКОЕ УСИЛЕНИЕ ОБУЧЕНИЯ В НАБЛА

Хотя SONY использует множество реализаций контролируемого обучения, примеров глубокого обучения с подкреплением (DRL) не существует. Если вы когда-либо пробовали реализовать свои собственные коды DRL, вы знаете, что есть некоторые уловки, которые редко можно увидеть в контролируемом обучении.

В этом посте я покажу вам реализацию Deep Q-Network (DQN) в качестве первого шага к NNabla для DRL. Полная реализация доступна здесь. Гиперпараметры и детали реализаций соответствуют исходному DQN, который вы можете использовать этот код в качестве основы для своей академической статьи.

Q ФУНКЦИЯ

Поскольку обзор алгоритмов объясняется во многих других сообщениях в блогах, мы сосредотачиваемся только на нейронной сети. Вот полное определение нейронной сети.

Я должен объяснить две уловки в приведенном выше коде.

СИНХРОНИЗАЦИЯ ПАРАМЕТРОВ (update_target)

Если вы знакомы с тензорным потоком, вы знаете, что синхронизация параметров может быть записана с помощью tf.assign. Однако на данный момент NNabla не имеет назначения параметров в определении графа. Для этого вам нужно напрямую манипулировать переменными.

# copy source variable to destination variable
variable_dst.data.copy_from(variable_src.data)

data свойство представляет собой ссылку на параметры. Вы можете получить к ним доступ и управлять ими через это свойство.

Поскольку я обычно кодирую тензорные потоки, я действительно хотел tf.assign реализовать это поведение. В конце концов я отправил запрос на перенос, который сделал функцией NNabla F.assign.

ГРАДИЕНТНАЯ СТРИЖКА (шлейф)

Чтобы избежать слишком большого изменения параметров, в DQN используются градиенты отсечения. На самом деле у NNabla есть F.clip_grad_by_norm функция, но неясно, как ее использовать, поскольку об этом меньше документов. Итак, я реализовал это, как показано ниже.

grad = 10.0 * variable.grad / np.sqrt(np.sum(variable.g ** 2))
variable.grad = grad

10.0 - размер гиперпараметра. Вы также можете получить доступ к градиентам точно так же, как свойство data. Перед обновлением параметров вы можете напрямую обрезать градиенты.

ВЫВОД

Я показываю пример DQN в NNabla, который также показывает, что вы можете написать свой собственный код в NNabla. Если вы запустите полный код на компьютере с графическим процессором, возможно, вы заметите его скорость. В большинстве случаев NNabla является самой быстрой благодаря красивой архитектуре управления памятью. Кроме того, SONY сообщает о самом быстром обучении ImageNet с 2176 графическими процессорами. Кроме того, NNabla предоставляет простые API-интерфейсы Python, с которыми вы можете писать свои собственные коды за минуту, если вы уже пишете алгоритмы глубокого обучения в других библиотеках. В частности, NNabla оптимизирована для встраиваемых устройств. Если вас интересует краевое глубокое обучение, NNabla будет хорошим вариантом.