arrow_backBack to research feed
otherPublished: July 21, 2026

1-Lipschitz Neural Networks on Hadamard Manifolds

By Davide Murari, Marta Ghirardelli, Ben Adcock, Elena Celledoni, Brynjulf Owren, Carola-Bibiane Schönlieb

Research TL;DR

"Proposes 1-Lipschitz neural networks on Hadamard manifolds using Busemann gradient flows, enabling robust classification and denoising on hyperbolic and SPD manifolds."

Abstract

Controlling the Lipschitz constant of a neural network is a standard way to promote robustness and stability. Most existing constraining strategies are designed for Euclidean spaces. In this work, we construct and analyze a class of 1-Lipschitz neural networks on Hadamard manifolds. Our layers are of gradient-descent type, $1$-Lipschitz, and quasi-$α$-firmly nonexpansive. The core building blocks of the proposed architecture are Busemann functions, and we exploit the properties of Busemann gradient flows to design $1$-Lipschitz geometry-preserving layers. We provide explicit constructions and examples for hyperbolic manifolds and the manifold of symmetric positive definite (SPD) matrices. We test the proposed architecture in two numerical experiments: robust classification on the Poincaré disk and masked-Wishart covariance reconstruction. On the Poincaré disk, the proposed networks yield robust classifiers under hyperbolic perturbations. On the SPD manifold, we train SPD-valued denoisers and adopt them as a Plug-and-Play prior for a masked-Wishart covariance reconstruction problem. We show improved results from the nonexpansive denoiser over static, data-only, and Log-Euclidean denoising baselines, and empirically test its convergence properties.

Technical Analysis & Implementation

Core Methodology§

The paper constructs 1-Lipschitz neural networks on Hadamard manifolds (complete, simply connected Riemannian manifolds of non-positive curvature). The key idea is to use gradient descent layers defined by Busemann functions, which are convex and have 1-Lipschitz gradient. Each layer $f_i: \mathcal{M} \to \mathcal{M}$ is given by:

$$f_i(x) = \exp_x(-\eta \, \nabla B_\xi(x))$$

where $B_\xi$ is a Busemann function with direction $\xi$, $\eta$ is a step size, and $\exp$ is the exponential map. Busemann functions are the manifold analog of linear functions in Euclidean space; their gradient flows are geodesics. The composition of such layers yields a 1-Lipschitz network that is also quasi-$\alpha$-firmly nonexpansive ($\alpha$-FNE), a property that ensures stability and convergence in fixed-point iterations.

Explicit Constructions§

  • Hyperbolic space $\mathbb{H}^n$: Busemann functions are given by $B_\xi(p) = \log \frac{\langle p, \xi_e \rangle}{\langle \xi_0, \xi_e \rangle}$ in the Poincaré ball model, where $\xi_e$ is the boundary point. The gradient descent step becomes a Möbius transformation that pushes points toward $\xi$.
  • SPD manifold $\mathcal{P}_n$: Using the affine-invariant metric, Busemann functions are $B_X(Y) = \log \det(Y^{-1}X)$ for a boundary point $X$. The gradient flow corresponds to a geodesic toward the boundary, implemented via matrix exponential and logarithm.

Implementation§

The network is a stack of BusemannLayer modules. Each layer computes the gradient of a trainable Busemann direction and applies an exponential map step. Below is a simplified PyTorch snippet for the hyperbolic case:

import torch
import geoopt  # for hyperbolic operations

class BusemannLayer(torch.nn.Module):
    def __init__(self, manifold, eta=1.0):
        super().__init__()
        self.manifold = manifold
        self.eta = eta
        # direction vector in the ambient space, will be projected to boundary
        self.xi = torch.nn.Parameter(torch.randn(manifold.dim+1))

    def forward(self, x):
        # x: point on manifold (Poincaré ball) as a tensor
        # Compute Busemann function gradient (simplified)
        # In practice, use geoopt's hyperbolic operations
        grad = self._busemann_grad(x)
        # Natural gradient descent step
        x_new = self.manifold.expmap(x, -self.eta * grad)
        return x_new

    def _busemann_grad(self, x):
        # Placeholder: gradient of B_xi at x
        return 2 * (self.xi - x) / (1 - x.norm(dim=-1, keepdim=True)**2)

Experiments§

1. Robust classification on Poincaré disk: A 3-layer hyperbolic network trained on hyperbolic embeddings of tree-structured data. Under adversarial hyperbolic perturbations, the 1-Lipschitz network maintains accuracy while a non-Lipschitz baseline fails. 2. Masked-Wishart covariance reconstruction: The network learns a nonexpansive denoiser on the SPD manifold. Plug-and-Play prior (PnP) with the denoiser outperforms Log-Euclidean and data-only baselines in reconstructing covariance matrices from masked Wishart samples, with provable convergence due to firm nonexpansiveness.

Key Takeaways§

  • Busemann gradient flows provide a principled way to build 1-Lipschitz layers on Hadamard manifolds.
  • The quasi-$\alpha$-FNE property enables stable training and convergence guarantees for PnP algorithms.
  • Extends robustness techniques to non-Euclidean data, relevant for tree, graph, and covariance data.
SHARE RESEARCH: