Inner Product Manipulation (IPM)#

class byzfl.InnerProductManipulation(tau=2.0)[source]#

Bases: object

Description#

Execute the Inner Product Manipulation (IPM) attack [1]: multiplicatively scale the mean vector by \(- \tau\).

\[\text{IPM}_{\tau}(x_1, \dots, x_n) = - \tau \cdot \frac{1}{n} \sum_{i=1}^{n} x_i\]

where

  • \(x_1, \dots, x_n\) are the input vectors, which conceptually correspond to correct gradients submitted by honest participants during a training iteration.

  • \(\tau > 0\) is the attack factor.

Initialization parameters:

tau (float, optional) – The attack factor \(\tau\) used to adjust the mean vector. Set to 2.0 by default.

Calling the instance

Input parameters:

vectors (numpy.ndarray, torch.Tensor, list of numpy.ndarray or list of torch.Tensor) – A set of vectors, matrix or tensors.

Returns:

numpy.ndarray or torch.Tensor – The data type of the output is the same as the input.

Examples

>>> import byzfl
>>> attack = byzfl.InnerProductManipulation(2.0)

Using numpy arrays

>>> import numpy as np
>>> x = np.array([[1., 2., 3.],       # np.ndarray
>>>               [4., 5., 6.],
>>>               [7., 8., 9.]])
>>> attack(x)
array([ -8. -10. -12.])

Using torch tensors

>>> import torch
>>> x = torch.tensor([[1., 2., 3.],   # torch.tensor
>>>                   [4., 5., 6.],
>>>                   [7., 8., 9.]])
>>> attack(x)
tensor([-8., -10., -12.])

Using list of numpy arrays

>>> import numpy as np
>>> x = [np.array([1., 2., 3.]),      # list of np.ndarray
>>>      np.array([4., 5., 6.]),
>>>      np.array([7., 8., 9.])]
>>> attack(x)
array([ -8. -10. -12.])

Using list of torch tensors

>>> import torch
>>> x = [torch.tensor([1., 2., 3.]),  # list of torch.tensor
>>>      torch.tensor([4., 5., 6.]),
>>>      torch.tensor([7., 8., 9.])]
>>> attack(x)
tensor([-8., -10., -12.])

References