RMSPropGraves¶
Описание¶
В данном модуле реализована модификация алгоритма RMSProp, предложенная в статье Alex Graves.
В этом алгоритме, как и в Adam, появляется слагаемое, добавляющее инерционность процессу оптимизации.
\begin{equation} m_t = \alpha{m_{t-1}} + (1 - \alpha)g_t \end{equation}
\begin{equation} \upsilon_t = \alpha{\upsilon_{t-1}} + (1 - \alpha)g_t^2 \end{equation}
где \alpha - коэффициент сохранения моментов.
Для величин обновления параметров также вводится скользящее среднее:
\begin{equation} \Delta\theta_t = \gamma\Delta\theta_{t-1} - \eta\frac{g_t}{\sqrt{m_t - \upsilon_t^2 + \epsilon}} \end{equation}
\begin{equation} \theta_{t + 1} = \theta_t + \Delta\theta_t \end{equation}
где \gamma - коэффициент сохранения обновлений параметров.
Инициализация¶
def __init__(self, learnRate=1e-4, alpha=0.95, momRate=0.9, epsilon=1e-4, nodeinfo=None):
Параметры
Параметр | Возможные типы | Описание | По умолчанию |
---|---|---|---|
learnRate | float | Скорость обучения | 1e-4 |
alpha | float | Коэффициент сохранения моментов | 0.95 |
momRate | float | Коэффициент сохранения обновлений параметров | 0.9 |
epsilon | float | Сглаживающий параметр | 1e-4 |
nodeinfo | NodeInfo | Объект, содержащий информацию о вычислительном узле | None |
Пояснения
-
Примеры¶
Необходимые импорты:
import numpy as np
from PuzzleLib.Optimizers import RMSPropGraves
from PuzzleLib.Backend import gpuarray
Info
gpuarray
необходим для правильного размещения тензора на GPU.
Создадим синтетическую обучающую выборку:
data = gpuarray.to_gpu(np.random.randn(16, 128).astype(np.float32))
target = gpuarray.to_gpu(np.random.randn(16, 1).astype(np.float32))
Объявляем оптимизатор:
optimizer = RMSPropGraves(learnRate=0.001)
Пусть уже есть некоторая сеть net
, определённая, например, через Graph, тогда, чтобы установить оптимизатор на сеть, требуется следующее:
optimizer.setupOn(net, useGlobalState=True)
Info
Подробнее про методы оптимизаторов и их параметры читайте в описании родительского класса Optimizer
Также пусть есть некая функция ошибки loss
, наследованная от Cost, рассчитывающая в т.ч. её градиент. Тогда получаем реализацию процесса оптимизации:
for i in range(100):
... predictions = net(data)
... error, grad = loss(predictions, target)
... optimizer.zeroGradParams()
... net.backward(grad)
... optimizer.update()
... if (i + 1) % 5 == 0:
... print("Iteration #%d error: %s" % (i + 1, error))