Skip to content

fedadam

FedAdam(learning_rate=0.1, betas=(0.9, 0.999), t=0.001)

Bases: FedOpt

Attributes:

Name Type Description
learning_rate float

learning rate. Defaults to 0.1.

betas Tuple[float, float]

coefficients used for computing

t float

adaptivity parameter. Defaults to 0.001.

Source code in iflearner/business/homo/strategy/opt/fedadam.py
def __init__(
    self,
    learning_rate: float = 0.1,
    betas: Tuple[float, float] = (0.9, 0.999),
    t: float = 0.001,
) -> None:
    super().__init__(learning_rate, betas, t)
    self._m: Optional[Dict[str, npt.NDArray[np.float32]]] = None
    self._v: Optional[Dict[str, npt.NDArray[np.float32]]] = None
    self._params: dict = {}

step(pseudo_gradient)

a step to optimize parameters of server model with pseudo gradient.

Parameters:

Name Type Description Default
pseudo_gradient Dict[str, npt.NDArray[np.float32]]

the pseudo gradient of server model

required

Returns:

Type Description
Dict[str, npt.NDArray[np.float32]]

Dict[str, npt.NDArray[np.float32]]: parameters of server model after step

Source code in iflearner/business/homo/strategy/opt/fedadam.py
def step(
    self, pseudo_gradient: Dict[str, npt.NDArray[np.float32]]
) -> Dict[str, npt.NDArray[np.float32]]:

    """a step to optimize parameters of server model with pseudo gradient.

    Args:
        pseudo_gradient (Dict[str, npt.NDArray[np.float32]]): the pseudo gradient of server model

    Returns:
        Dict[str, npt.NDArray[np.float32]]: parameters of server model after step
    """

    if self._m is None:
        self._m = dict()
        for key, value in pseudo_gradient.items():
            self._m[key] = np.zeros_like(value)

    if self._v is None:
        self._v = dict()
        for key, value in pseudo_gradient.items():
            self._v[key] = np.zeros_like(value)

    """
    m_t = β_1m_t−1 + (1−β_1)∆_t
    v_t = β_2v_t−1 + (1−β_2)∆^2_t
    """
    for key, value in pseudo_gradient.items():
        self._m[key] = self._beta1 * self._m[key] + (1 - self._beta1) * value
        self._v[key] = self._beta2 * self._v[key] + (1 - self._beta2) * np.square(
            value
        )

    """x_t+1 = x_t + η mt / (√v_t+τ)"""
    new_params = dict()
    for key, value in self._params.items():
        new_params[key] = value.reshape((-1)) + self._lr * self._m[key] / (
            np.sqrt(self._v[key]) + self._adaptivity
        )
        self._params[key] = new_params[key].reshape(value.shape)

    return new_params