ЧТО ТАКОЕ ННАБЛА?
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 будет хорошим вариантом.