优化器(Optimizer)
这个模块包含一系列用于模型参数更新的优化器。
示例用法:
from singa import optimizer
from singa import tensor
sgd = optimizer.SGD(lr=0.01, momentum=0.9, weight_decay=1e-4)
p = tensor.Tensor((3,5))
p.uniform(-1, 1)
g = tensor.Tensor((3,5))
g.gaussian(0, 0.01)
sgd.apply(1, g, p, 'param') # use the global lr=0.1 for epoch 1
sgd.apply_with_lr(2, 0.03, g, p, 'param') # use lr=0.03 for epoch 2
class singa.optimizer.Optimizer(lr=None, momentum=None, weight_decay=None, regularizer=None, constraint=None)
基类:object
Python优化器类的基类。 典型地,优化器有如下作用:
- 构建优化器
- (可选)以参数名为注册每种参数
- 使用优化器依照给定参数梯度及其他信息更新参数值
它的子类应该重写apply_with_lr函数已用于真实的参数更新。
参数:
- lr (float) – 学习速率
- momentum (float) – 动量
- weight_decay (float) – L2正则化系数,被排除于‘regularizer’之外
- regularizer – Regularizer或RegularizerConf实例;如被设置,正则化将被用于apply_with_lr()。 用户也可以在优化器外部做正则化。
- constraint – Constraint或ConstraintConf实例;如被设置,正则化将被用于apply_with_lr()。 用户也可以在优化器外部做正则化。
register(name, specs)
注册参数,包括为每个参数对象创建正则化和约束条件。 这里参数特定的正则化和约束比全局设置有更高优先级。 如果所有参数对于学习速率、正规化器和约束条件共享相同的设置,则不需要调用该函数。
参数:
- name (str) – 参数名
- specs (ParamSpec) – protobuf对象,包括正则化和约束条件、学习速率和权值衰减乘子。
apply_regularizer_constraint(epoch, value, grad, name=None, step=-1)
如果可用,将采用正则化和约束条件。 如果全局正则化和参数特定的正则化都存在,会采用参数特定的正则化。
参数:
- epoch (int) – 训练的epoch ID (完整训练一遍训练数据称为一个epoch)
- value (Tensor) – 参数Tensor
- grad (Tensor) – 参数梯度Tensor
- name (string) – 参数名以索引到特定的规则(正则化或约束条件)
- step (int) – 每个epoch内的迭代ID
返回值: 更新后的梯度tensor
apply_with_lr(epoch, lr, grad, value, name=None, step=-1)
如果grad非空,则根据给定学习速率更新参数。
子类优化器必须重写这个函数。如果grad为空,将不做任何操作。
参数:
- epoch (int) – 训练的epoch ID (完整训练一遍训练数据称为一个epoch)
- lr (float) – 学习速率
- value (Tensor) – 参数Tensor
- grad (Tensor) – 参数梯度Tensor
- name (string) – 参数名以索引到特定的规则(正则化或约束条件)
- step (int) – 每个epoch内的迭代ID 返回值: 更新后的参数值
apply(epoch, grad, value, name=None, step=-1)
假设学习速率生成器配置完成,完成参数更新。 子类不需要重写这个函数。
参数:
- epoch (int) – 训练的epoch ID (完整训练一遍训练数据称为一个epoch)
- value (Tensor) – 参数Tensor
- grad (Tensor) – 参数梯度Tensor
- name (string) – 参数名以索引到特定的规则(正则化或约束条件)
- step (int) – 每个epoch内的迭代ID
返回值: 更新后的参数值
class singa.optimizer.SGD(lr=None, momentum=None, weight_decay=None, regularizer=None, constraint=None)
基类:singa.optimizer.Optimizer
原始的包含动量的随机梯度下降算法。 参数详见Optimizer基类。
apply_with_lr(epoch, lr, grad, value, name, step=-1)
class singa.optimizer.Nesterov(lr=None, momentum=0.9, weight_decay=None, regularizer=None, constraint=None)
基类:singa.optimizer.Optimizer
包含Nesterov动量的随机梯度下降算法。参数详见Optimizer基类。
apply_with_lr(epoch, lr, grad, value, name, step=-1)
class singa.optimizer.RMSProp(rho=0.9, epsilon=1e-08, lr=None, weight_decay=None, regularizer=None, constraint=None)
基类:singa.optimizer.Optimizer
RMSProp优化器。构造器参数请参考Optimizer基类。
参数:
- rho (float) – [0, 1]间的浮点数
- epsilon (float) – 很小的值,以避免数值误差
apply_with_lr(epoch, lr, grad, value, name, step=-1)
class singa.optimizer.AdaGrad(epsilon=1e-08, lr=None, weight_decay=None, lr_gen=None, regularizer=None, constraint=None)
基类:singa.optimizer.Optimizer
AdaGrad优化器。构造器参数请参考Optimizer基类。
参数:
- epsilon (float) – 很小的值,以避免数值误差
apply_with_lr(epoch, lr, grad, value, name, step=-1)
class singa.optimizer.Adam(beta_1=0.9, beta_2=0.999, epsilon=1e-08, lr=None, weight_decay=None, regularizer=None, constraint=None)
基类:singa.optimizer.Optimizer
Ada优化器。构造器参数请参考Optimizer基类。
参数:
- beta_1 (float) – 动量系数
- beta_2 (float) – 整合的梯度平方的系数
- epsilon (float) – 很小的值,以避免数值误差
apply_with_lr(epoch, lr, grad, value, name, step=-1)
更新一个参数对象
参数:
- step (int) – 累积训练迭代数,而不是当前迭代ID
class singa.optimizer.Regularizer
基类:object
Python参数梯度正则化的基类。
apply(epoch, value, grad, step=-1)
class singa.optimizer.CppRegularizer(conf)
基类:singa.optimizer.Regularizer
正则化的封装使用C++实现。
参数:
- conf (RegularizerConf) – protobuf配置信息
apply(epoch, value, grad, step=-1)
class singa.optimizer.L2Regularizer(coefficient)
基类:singa.optimizer.Regularizer
L2正则化。
参数:
- coefficient (float) – 正则化系数
apply(epoch, value, grad, step=-1)
class singa.optimizer.Constraint
基类:object
Python参数梯度约束的基类。
apply(epoch, value, grad, step=-1)
class singa.optimizer.CppConstraint(conf)
基类:singa.optimizer.Constraint
约束的封装使用C++实现。
参数:
- conf (RegularizerConf) – protobuf配置信息
apply(epoch, value, grad, step=-1)
class singa.optimizer.L2Constraint(threshold=None)
基类:singa.optimizer.Constraint
梯度缩放使得L2 norm小于给定阀值。
apply(epoch, value, grad, step=-1)