Source code for torch_openreml.covariance.transform.transform_sigmoid

"""
Sigmoid transform module for bounded parameter mappings.

Provides a differentiable bijective transform from
:math:`\\mathbb{R}_{0+} \\rightarrow (0, 1)` using the
logistic sigmoid function.

Classes:
    TransformSigmoid:
        Sigmoid transform (:math:`f(x) = \\frac{1}{1 + e^{-x}}`)
"""

from torch_openreml.covariance.transform.transform import Transform
import torch


[docs] class TransformSigmoid(Transform): r""" Sigmoid transform mapping reals to the open unit interval. .. math:: f(x) = \frac{1}{1 + e^{-x}} """ domain = "\u211D\u2080\u207A" codomain = "(0, 1)" def __init__(self): r""" Initialize the sigmoid transform. """ pass
[docs] def __call__(self, x): r""" Apply the sigmoid transform. Args: x (torch.Tensor): Input tensor in :math:`\mathbb{R}_{0+}`. Returns: torch.Tensor: Element-wise :math:`\frac{1}{1 + e^{-x}}`. Example: .. jupyter-execute:: import torch from torch_openreml.covariance.transform import TransformSigmoid t = TransformSigmoid() x = torch.tensor([-2.0, 0.0, 2.0]) t(x) """ return torch.sigmoid(x)
[docs] def inverse(self, x): r""" Apply the inverse transform (logit). Args: x (torch.Tensor): Input tensor in :math:`(0, 1)`. Returns: torch.Tensor: Element-wise :math:`\log\frac{x}{1 - x}`. Example: .. jupyter-execute:: import torch from torch_openreml.covariance.transform import TransformSigmoid t = TransformSigmoid() x = torch.tensor([0.1, 0.5, 0.9]) t.inverse(x) """ return torch.logit(x)
[docs] def grad(self, x): r""" Compute derivative of :math:`\sigma(x)` for chain rule propagation. Note: .. math:: \frac{d}{dx} \sigma(x) = \sigma(x)(1 - \sigma(x)) Args: x (torch.Tensor): Input tensor. Returns: torch.Tensor: :math:`\sigma(x)(1 - \sigma(x))`. Example: .. jupyter-execute:: import torch from torch_openreml.covariance.transform import TransformSigmoid t = TransformSigmoid() x = torch.tensor([0.0, 1.0]) t.grad(x) """ sigmoid = torch.sigmoid(x) return sigmoid * (1 - sigmoid)