Skip to main content

HomOps Reference

HomBatchNorm

Batch-normalization as affine scale and shift on an encrypted activation.

BnML
RunsServer
Changes shapeYes - broadcast
Changes scaleYes - via ConstMul
Levels spentVia ConstMul (typically 0 or 1)
RotatesNo
KeysNone

What it does

HomBatchNorm applies batch-normalization as an affine scale and shift on an encrypted activation:
y = (γ / √(σ² + ε)) · x + (β − μ · γ / √(σ² + ε))
It is a composite (SequentialHomOp), not a registered leaf. Children:
Reach for it when you need channel-wise BN after conv / linear without folding BN into the convolution weights. For fused conv+BN, see HomConvBnFused.

Signature

HomBatchNorm()
No constructor parameters. BN statistics and affine parameters come in through set_data.

Parameters

HomBatchNorm has no public constructor parameters.
set_data
ParameterTypeDefaultDescription
meanTensorrequiredBN running mean μ.
varTensorrequiredBN running variance σ².
gammaTensor | NoneNone → ones_like(mean)BN weight.
betaTensor | NoneNone → zeros_like(mean)BN bias.
epsfloat1e-5Numerical stability term under the square root.
What set_data computes
scale = gamma / (var + eps) ** 0.5
bias = beta − mean · scale
Those tensors are reshaped to (-1, 1, 1) and passed to the ConstMul and ConstAdd children.
Rules that depend on the value
SettingRuleIf you break it
mean, varBoth must be provided (not None).ValueError.

Requirements

  • set_data called. Mean and variance are required before use; gamma and beta default to ones and zeros when omitted.
  • Broadcast layout. Scale and bias are stored as (C, 1, 1) after view; they must broadcast against the ciphertext channel layout.
  • Keys. None. ConstMul and ConstAdd need no evaluation-key entries.

Shape effect - yes

Rule: the ciphertext broadcasts with scale / bias shaped (C, 1, 1). Typical activations keep (C, H, W) (or packed equivalents).
CiphertextScale / biasOutput
(16, 8, 8)(16, 1, 1)(16, 8, 8) - per-channel affine
Shape and the n axis are covered on Concepts.

Scale effect - yes

Rule: HomConstMul multiplies the ciphertext scale by its plaintext encoding scale. HomConstAdd leaves scale unchanged.
StageEffect on scale
After ConstMul (scale)scale_out = scale_in × ConstMul's pt_scale
After ConstAdd (shift)Unchanged
How scale moves through a pipeline is on Ciphertext state - Scale.

Level budget

ConfigurationLevels spent
ConstMul with with_modswitch=True1 - drops one prime after the scale step
ConstMul with with_modswitch=False0
ConstAdd0
Level cost comes only from the ConstMul child. Details of that child's defaults are on HomConstMul.

Keys

None. ConstMul and ConstAdd need no square key and no rotation key.

Example

Channel-wise BN for a 16-channel activation:
pipeline.pyPYTHON
from lattica_build.operators import HomBatchNorm
from lattica_build.base_classes.hom_pipeline import HomomorphicPipeline
from lattica_build.operators.composite.sequential import SequentialHomOp
import torch

C = 16
bn = HomBatchNorm()
bn.set_data(
    mean=torch.zeros(C),
    var=torch.ones(C),
    gamma=torch.ones(C),
    beta=torch.zeros(C),
    eps=1e-5,
)

pipeline = HomomorphicPipeline(
    hom=SequentialHomOp(bn),
    input_shape=(C, 8, 8),
)

See also