Splits num_channels into num_groups equal-size groups; each group's mean/std is computed over every (channel-in-group, H, W) element jointly, per batch row n, then y_{n,c,h,w} = gamma_c * (x_{n,c,h,w} - mu_{n,g})/std_{n,g} + beta_c, gamma/beta per-channel (shape (num_channels,), not per-group, not per-batch-row). Batched – input/output are rank-4 (N, channels, H, W), migrated from the original unbatched (rank-3) scope by campaign_exai_dl_library_batch_dimension_support, matching Conv2DModule's own (not-yet-migrated) rank-3 convention plus a leading batch dim. H/W are not fixed at construction (only num_groups/num_channels are), so this module accepts any spatial size at forward() time, exactly like Conv2DModule does.
More...
#include <group_norm_module.hpp>
|
| | GroupNormModule (int64_t num_groups, int64_t num_channels, DeviceBackend *backend, DeviceType device, float eps=1e-6f) |
| | Constructs a GroupNorm layer with zero-initialized gamma and beta.
|
| |
| | GroupNormModule (int64_t num_groups, int64_t num_channels, DeviceBackend *backend) |
| | On backend's own device (backend->device()), default eps. Previously the device defaulted to Cpu regardless of backend (GPU-native-kernels Mission 0).
|
| |
| Tensor | backward (const Tensor &grad_output) override |
| | Computes the gradient w.r.t. this module's input, and accumulates gamma's/ beta's gradients internally.
|
| |
| OpType | op_type () const override |
| | Normalization per charter's closed OpType set.
|
| |
| void | set_gamma (std::initializer_list< float > values) |
| | Overwrites the per-channel gamma buffer – test/initialization use only.
|
| |
| void | set_beta (std::initializer_list< float > values) |
| | Overwrites the per-channel beta buffer – test/initialization use only.
|
| |
| void | set_gamma (const std::vector< float > &values) |
| | Vector overload for runtime-sized sources – see Tensor's own vector ctor.
|
| |
| void | set_beta (const std::vector< float > &values) |
| | Vector overload for runtime-sized sources – see Tensor's own vector ctor.
|
| |
| const Tensor & | gamma () const |
| |
| const Tensor & | beta () const |
| |
| const Tensor & | gamma_grad () const |
| |
| const Tensor & | beta_grad () const |
| |
| Tensor | propagate_relevance (const Tensor &relevance_out, const LRPRuleConfig &config) override |
| | Identity-rule LRP relevance propagation (AttnLRP, Achtibat et al. 2024).
|
| |
| std::vector< NamedParamRef > | named_parameters () override |
| | This module's trainable parameters, each with its hierarchical name – the one place a module declares its parameters (roadmap FND-1).
|
| |
| std::optional< DeviceType > | compute_device () const override |
| | Where this layer computes, so forward() rejects an input on another device (FND-8).
|
| |
| virtual | ~Module ()=default |
| |
| Tensor | forward (const Tensor &input) |
| | Runs this module's forward computation.
|
| |
| std::pair< Tensor, NodeId > | forward_traced (const Tensor &input, NodeId input_node, ComputationGraph &graph, Autograd &autograd) |
| | Runs forward() while also registering a ComputationGraph node (tagged with this module's op_type(), parented to input_node) and wiring an Autograd backward function that reuses this module's own backward() – the opt-in traced/explainable path, per Phase 2 Mission 0.
|
| |
| virtual bool | supports_lrp_rule (LRPRule rule) const |
| | Whether propagate_relevance() implements rule (no silent fallback: callers such as ExplainerContext::relevance_pass() throw rather than run a module on a rule it does not implement).
|
| |
| virtual std::vector< ParamRef > | parameters () |
| | This module's trainable parameters and their gradients, for an optimizer to update uniformly across module types.
|
| |
| void | set_requires_grad (bool requires_grad, const std::string &prefix="") |
| | Freezes (false) or unfreezes (true) parameters by name (roadmap FND-2).
|
| |
| virtual void | set_training (bool training) |
| | Sets this module's training/eval mode. Defaults to training (matches every mainstream framework's Module default).
|
| |
| bool | is_training () const |
| | Whether this module is currently in training mode.
|
| |
Splits num_channels into num_groups equal-size groups; each group's mean/std is computed over every (channel-in-group, H, W) element jointly, per batch row n, then y_{n,c,h,w} = gamma_c * (x_{n,c,h,w} - mu_{n,g})/std_{n,g} + beta_c, gamma/beta per-channel (shape (num_channels,), not per-group, not per-batch-row). Batched – input/output are rank-4 (N, channels, H, W), migrated from the original unbatched (rank-3) scope by campaign_exai_dl_library_batch_dimension_support, matching Conv2DModule's own (not-yet-migrated) rank-3 convention plus a leading batch dim. H/W are not fixed at construction (only num_groups/num_channels are), so this module accepts any spatial size at forward() time, exactly like Conv2DModule does.
- Note
- propagate_relevance is an identity pass-through, cited to AttnLRP's normalization-layer treatment (Achtibat et al. 2024) – same rule, same citation, as RMSNormModule/LayerNormModule; GroupNorm is architecturally the same "normalization" category the citation covers, just with a different statistic grouping. backward() is the real, undetached training gradient.
◆ GroupNormModule() [1/2]
| pulsatrix::GroupNormModule::GroupNormModule |
( |
int64_t |
num_groups, |
|
|
int64_t |
num_channels, |
|
|
DeviceBackend * |
backend, |
|
|
DeviceType |
device, |
|
|
float |
eps = 1e-6f |
|
) |
| |
Constructs a GroupNorm layer with zero-initialized gamma and beta.
- Parameters
-
| num_groups | Number of groups to split num_channels into. |
| num_channels | Total channel count. Must be evenly divisible by num_groups. |
| backend | Backend to allocate/compute through. Not owned; must outlive this module. |
| device | Which device every internal Tensor member is tagged as. Defaults to Cpu. |
| eps | Stabilizer added inside the sqrt. Defaults to 1e-6, matching RMSNormModule/LayerNormModule's default for consistency within this codebase's normalization family. |
- Exceptions
-
| std::invalid_argument | if num_groups <= 0, num_channels <= 0, or num_channels is not evenly divisible by num_groups – external boundary (construction arguments can originate from Phase 5's Python bindings with no upstream validation), per cpp_tdd/context_tdd_adversarial_boundary_testing.md. |
◆ GroupNormModule() [2/2]
| pulsatrix::GroupNormModule::GroupNormModule |
( |
int64_t |
num_groups, |
|
|
int64_t |
num_channels, |
|
|
DeviceBackend * |
backend |
|
) |
| |
On backend's own device (backend->device()), default eps. Previously the device defaulted to Cpu regardless of backend (GPU-native-kernels Mission 0).
◆ backward()
| Tensor pulsatrix::GroupNormModule::backward |
( |
const Tensor & |
grad_output | ) |
|
|
overridevirtual |
Computes the gradient w.r.t. this module's input, and accumulates gamma's/ beta's gradients internally.
- Parameters
-
| grad_output | Gradient w.r.t. this module's output. Must match the shape of the most recent forward() call's output. |
- Returns
- Gradient w.r.t. this module's input.
- Exceptions
-
| std::logic_error | if forward() has never been called. |
- Note
- Device-generic: runs on Cpu, Cuda or Hip tensors (GPU-native-kernels Mission 4).
Implements pulsatrix::Module.
◆ beta()
| const Tensor & pulsatrix::GroupNormModule::beta |
( |
| ) |
const |
|
inline |
◆ beta_grad()
| const Tensor & pulsatrix::GroupNormModule::beta_grad |
( |
| ) |
const |
|
inline |
◆ compute_device()
| std::optional< DeviceType > pulsatrix::GroupNormModule::compute_device |
( |
| ) |
const |
|
inlineoverridevirtual |
◆ forward_impl()
| Tensor pulsatrix::GroupNormModule::forward_impl |
( |
const Tensor & |
input | ) |
|
|
overrideprotectedvirtual |
◆ gamma()
| const Tensor & pulsatrix::GroupNormModule::gamma |
( |
| ) |
const |
|
inline |
◆ gamma_grad()
| const Tensor & pulsatrix::GroupNormModule::gamma_grad |
( |
| ) |
const |
|
inline |
◆ named_parameters()
| std::vector< NamedParamRef > pulsatrix::GroupNormModule::named_parameters |
( |
| ) |
|
|
inlineoverridevirtual |
This module's trainable parameters, each with its hierarchical name – the one place a module declares its parameters (roadmap FND-1).
- Returns
- {name, {value, grad}} entries pointing directly at this module's own members, in a fixed order. Names are unique within the module tree. Default: empty (a parameterless module like ReluModule needs no override).
- Note
- Override this, not parameters(): saving, loading, freezing by name and optimizer parameter groups all key on these names.
Reimplemented from pulsatrix::Module.
◆ op_type()
| OpType pulsatrix::GroupNormModule::op_type |
( |
| ) |
const |
|
inlineoverridevirtual |
◆ propagate_relevance()
Identity-rule LRP relevance propagation (AttnLRP, Achtibat et al. 2024).
- Parameters
-
| relevance_out | Relevance at this module's output. Must match the shape of the most recent forward() call's output. |
| config | Unused – the identity rule has no tunable parameter. |
- Returns
- relevance_out, unchanged – conservation holds trivially by construction.
- Exceptions
-
| std::logic_error | if forward() has never been called. |
| std::invalid_argument | if relevance_out's element count doesn't match the cached forward output's element count. |
Implements pulsatrix::Module.
◆ set_beta() [1/2]
| void pulsatrix::GroupNormModule::set_beta |
( |
const std::vector< float > & |
values | ) |
|
Vector overload for runtime-sized sources – see Tensor's own vector ctor.
◆ set_beta() [2/2]
| void pulsatrix::GroupNormModule::set_beta |
( |
std::initializer_list< float > |
values | ) |
|
Overwrites the per-channel beta buffer – test/initialization use only.
◆ set_gamma() [1/2]
| void pulsatrix::GroupNormModule::set_gamma |
( |
const std::vector< float > & |
values | ) |
|
Vector overload for runtime-sized sources – see Tensor's own vector ctor.
◆ set_gamma() [2/2]
| void pulsatrix::GroupNormModule::set_gamma |
( |
std::initializer_list< float > |
values | ) |
|
Overwrites the per-channel gamma buffer – test/initialization use only.
The documentation for this class was generated from the following file: