in jcm/losses.py [0:0]
def get_optimizer(config):
"""Returns a flax optimizer object based on `config`."""
if config.optim.optimizer.lower() == "adam":
if hasattr(config.optim, "linear_decay_steps"): # for progressive distillation
stable_training_schedule = optax.linear_schedule(
init_value=config.optim.lr,
end_value=0.0,
transition_steps=config.optim.linear_decay_steps,
)
else:
stable_training_schedule = optax.constant_schedule(config.optim.lr)
schedule = optax.join_schedules(
[
optax.linear_schedule(
init_value=0,
end_value=config.optim.lr,
transition_steps=config.optim.warmup,
),
stable_training_schedule,
],
[config.optim.warmup],
)
if not np.isinf(config.optim.grad_clip):
optimizer = optax.chain(
optax.clip_by_global_norm(max_norm=config.optim.grad_clip),
optax.adamw(
learning_rate=schedule,
b1=config.optim.beta1,
eps=config.optim.eps,
weight_decay=config.optim.weight_decay,
),
)
else:
optimizer = optax.adamw(
learning_rate=schedule,
b1=config.optim.beta1,
eps=config.optim.eps,
weight_decay=config.optim.weight_decay,
)
elif config.optim.optimizer.lower() == "radam":
beta1 = config.optim.beta1
beta2 = config.optim.beta2
eps = config.optim.eps
weight_decay = config.optim.weight_decay
lr = config.optim.lr
optimizer = optax.chain(
optax.scale_by_radam(b1=beta1, b2=beta2, eps=eps),
optax.add_decayed_weights(weight_decay, None),
optax.scale(-lr),
)
else:
raise NotImplementedError(
f"Optimizer {config.optim.optimizer} not supported yet!"
)
def optimize_fn(grads, opt_state, params):
updates, opt_state = optimizer.update(grads, opt_state, params)
params = optax.apply_updates(params, updates)
return params, opt_state
return optimizer, optimize_fn