在在线反向传播权重更新中添加动量项?
Adding momentum term in online back propagation weight update?
我已经为两层网络实现了 ANN,我需要用动量修改我的权重更新代码,但我需要知道如何更新它。下面是仅权重更新的代码快照。下面的代码更新它看到的每个示例的权重,hiddenWights 是隐藏层权重,outputWeights 是输出层权重。
for examplen = 1: nTrainingExamples
inputVector = inputs(:,examplen);
HiddenLayerOutput = sigmoid( hiddenWeights * inputVector);
OutputLayerOutput = sigmoid( outputWeights * HiddenLayerOutput);
l2_error = OutputLayerOutput - targets(:, examplen);
l2_delta = learningRates(1, i) .* (OutputLayerOutput .* (1 - OutputLayerOutput)) .* l2_error;
l2_v = mu * l2_v - l2_delta * t;
l1_delta = learningRates(1, i) .* (HiddenLayerOutput .* (1 - HiddenLayerOutput)) .* (outputWeights' * l2_delta);
l1_v = mu * l1_v - l1_delta * t;
% weights = weights + v
outputWeights = outputWeights + (l2_v*HiddenLayerOutput');
hiddenWeights = hiddenWeights + (l1_v*inputVector');
end
从我们的谈话中得知,您想实施经典的动量方法(不是 Nestrov)。所以你需要一个额外的参数——速度 v
和 time t
和 momentum mu
常量。
刚开始学习的时候把速度设置为0
:
v = 0
并选择 t
(例如将其设置为 0.1)和 mu
(例如 0.9)的一些值。
在每次训练迭代期间,您应该根据以下规则更改权重:
v = mu * v - delta * t
weights = weights + v
参数mu
和t
是元参数,您可以通过网格或随机搜索找到它们的合适值。
我已经为两层网络实现了 ANN,我需要用动量修改我的权重更新代码,但我需要知道如何更新它。下面是仅权重更新的代码快照。下面的代码更新它看到的每个示例的权重,hiddenWights 是隐藏层权重,outputWeights 是输出层权重。
for examplen = 1: nTrainingExamples
inputVector = inputs(:,examplen);
HiddenLayerOutput = sigmoid( hiddenWeights * inputVector);
OutputLayerOutput = sigmoid( outputWeights * HiddenLayerOutput);
l2_error = OutputLayerOutput - targets(:, examplen);
l2_delta = learningRates(1, i) .* (OutputLayerOutput .* (1 - OutputLayerOutput)) .* l2_error;
l2_v = mu * l2_v - l2_delta * t;
l1_delta = learningRates(1, i) .* (HiddenLayerOutput .* (1 - HiddenLayerOutput)) .* (outputWeights' * l2_delta);
l1_v = mu * l1_v - l1_delta * t;
% weights = weights + v
outputWeights = outputWeights + (l2_v*HiddenLayerOutput');
hiddenWeights = hiddenWeights + (l1_v*inputVector');
end
从我们的谈话中得知,您想实施经典的动量方法(不是 Nestrov)。所以你需要一个额外的参数——速度 v
和 time t
和 momentum mu
常量。
刚开始学习的时候把速度设置为0
:
v = 0
并选择 t
(例如将其设置为 0.1)和 mu
(例如 0.9)的一些值。
在每次训练迭代期间,您应该根据以下规则更改权重:
v = mu * v - delta * t
weights = weights + v
参数mu
和t
是元参数,您可以通过网格或随机搜索找到它们的合适值。