算法

本章节主要介绍在 SPAIC 平台中内置的算法,目前我们已经在平台中添加了 STCASTBPSTDPR-STDP 算法。其中, STCASTBP 都是采用了替代梯度的梯度反传算法,而 STDP 则是 SNN 中经典的无监督突触可塑性算法, R-STDPSTDP 的基础上添加了 reward 机制,更好的适用于强化学习。

示例一

#STCA learner
self.learner = spaic.Learner(trainable=self, algorithm='STCA', alpha=0.5)
self.learner.set_optimizer('Adam', 0.001)
self.learner.set_schedule('StepLR', 0.01)

在示例一中,采用了 STCA 算法,用户在 trainable 参数中传入需要训练的对象, self 代指整个网络。如果用户有针对性训练的需要,可以在 trainable 的地方传入指定的层,例如 self.layer1 等,若需要传入多个指定层,则采用列表的 方式: [self.layer1, self.layer2] 。如果用户制定了部分对象为可训练的,则需要启用 pathway 参数,用于辅助梯度在全局的传递。需要将剩下不需要训练的对象添加至 pathway 中,从而使其可以传递梯度。而最后的 alpha=0.5 则是传入 STCA 的一个参数。 在 SPAIC 中,算法自带参数都在末尾进行传参。

此处还使用了 Adam 优化算法与 StepLR 学习率调整机制,在平台中我们设置了诸多可供使用的优化算法:

‘Adam’, ‘AdamW’, ‘SparseAdam’, ‘Adamx’, ‘ASGD’, ‘LBFGS’, ‘RMSprop’, ‘Rpop’, ‘SGD’,‘Adadelta’, ‘Adagrad’

以及学习率调整机制:

‘LambdaLR’, ‘StepLR’, ‘MultiStepLR’, ‘ExponentialLR’, ‘CosineAnnealingLR’, ‘ReduceLROnPlateau’, ‘CyclicLR’, ‘CosineAnnealingWarmRestarts’

示例二

#STDP learner
self._learner = spaic.Learner(trainable=self.connection1, algorithm='full_online_STDP', w_norm=3276.8)

在示例二中,采用了STDP算法,用户在 trainable 参数中传入需要训练的对象,一般为神经网络的指定层。最后的 w_norm 是传入 STDP 的参数,具体传入的参数名根据特定算法而定。

示例三

# global reward
self.reward = spaic.Reward(num=label_num, dec_target=self.layer3, coding_time=run_time,
                             coding_method='global_reward', pop_size=pop_size, dec_sample_step=time_step)
# RSTDP
self._learner = spaic.Learner(trainable=[self.connection3], algorithm='RSTDP',
                         lr=1, A_plus=1e-1, A_minus=-1e-2)

在示例三中,采用了RSTDP算法,该算法为有监督算法,用户需要用 Reward 传入reward作为惩罚、奖励信号。 RewardRSTDP 需要传入的参数分别在 spaic.Neuron.Rewardsspaic.Learning.STDP_Learner 中查看。 在训练过程中,区别于其他算法,需要用 Reward 传递监督信号并使用 optim_step 函数将后端的 parameters_dictvariables 的参数同步,如下所示。

Net.input(data)
Net.reward(label)
Net.run(run_time)
output = Net.output.predict
Net._learner.optim_step()

Note

对于 RSTDPET 学习算法, batch_size 应设为1