class_docstr: Extends SGD in PyTorch with LARS scaling from the paper "Large batch training of
  Convolutional Networks" [0].
  
  Implementation from PyTorch Lightning Bolts [1].
  
  - [0]: https://arxiv.org/pdf/1708.03888.pdf
  - [1]: https://github.com/Lightning-Universe/lightning-bolts/blob/2dfe45a4cf050f120d10981c45cfa2c785a1d5e6/pl_bolts/optimizers/lars.py#L1
  
  Args:
      params: 
          Iterable of parameters to optimize or dicts defining parameter groups.
      lr:
          Learning rate
      momentum:
          Momentum factor.
      weight_decay:
          Weight decay (L2 penalty).
      dampening:
          Dampening for momentum.
      nesterov:
          Enables Nesterov momentum.
      trust_coefficient:
          Trust coefficient for computing learning rate.
      eps:
          Eps for division denominator.
  
  Example:
      >>> model = torch.nn.Linear(10, 1)
      >>> input = torch.Tensor(10)
      >>> target = torch.Tensor([1.])
      >>> loss_fn = lambda input, target: (input - target) ** 2
      >>> #
      >>> optimizer = LARS(model.parameters(), lr=0.1, momentum=0.9)
      >>> optimizer.zero_grad()
      >>> loss_fn(model(input), target).backward()
      >>> optimizer.step()
  
  .. note::
      The application of momentum in the SGD part is modified according to
      the PyTorch standards. LARS scaling fits into the equation in the
      following fashion.
  
      .. math::
          egin{aligned}
              g_{t+1} & =     ext{lars_lr} * (eta * p_{t} + g_{t+1}), \
              v_{t+1} & = \mu * v_{t} + g_{t+1}, \
              p_{t+1} & = p_{t} -     ext{lr} * v_{t+1},
          \end{aligned}
  
      where :math:`p`, :math:`g`, :math:`v`, :math:`\mu` and :math:`eta` denote the
      parameters, gradient, velocity, momentum, and weight decay respectively.
      The :math:`lars_lr` is defined by Eq. 6 in the paper.
      The Nesterov version is analogously modified.
  
  .. warning::
      Parameters with weight decay set to 0 will automatically be excluded from
      layer-wise LR scaling. This is to ensure consistency with papers like SimCLR
      and BYOL.
code: def __init__(
      self,
      params: Any,
      lr: float = required,
      momentum: float = 0,
      dampening: float = 0,
      weight_decay: float = 0,
      nesterov: bool = False,
      trust_coefficient: float = 0.001,
      eps: float = 1e-8,
  ):
      if lr is not required and lr < 0.0:
          raise ValueError(f"Invalid learning rate: {lr}")
      if momentum < 0.0:
          raise ValueError(f"Invalid momentum value: {momentum}")
      if weight_decay < 0.0:
          raise ValueError(
              f"Invalid weight_decay value: {weight_decay}"
          )
  
      defaults = dict(
          lr=lr,
          momentum=momentum,
          dampening=dampening,
          weight_decay=weight_decay,
          nesterov=nesterov,
          trust_coefficient=trust_coefficient,
          eps=eps,
      )
      if nesterov and (momentum <= 0 or dampening != 0):
          raise ValueError(
              "Nesterov momentum requires a momentum and zero dampening"
          )
  
      super().__init__(params, defaults)
  
file_path: lightly/lightly/utils/lars.py
imports: from typing import Any, Callable, Dict, Optional, Union
  import torch
  from torch import Tensor
  from torch.optim.optimizer import Optimizer, required
label_desc: Use image node_id 1 to create a new LARS object from inherited base classes: Optimizer with example: obj = LARS(params, lr, momentum, dampening, weight_decay, nesterov, trust_coefficient, eps)