Inject¶
Layer injection for modifying model forward passes without changing model weights.
LayerInjector¶
LayerInjector
¶
Inject custom processing between transformer layers.
Proven capabilities: - Identity injection (pass-through) - Scaling injection (modify magnitude) - Additive injection (add signals) - Extraction injection (capture without modifying)
Source code in src/model_garage/inject/layer.py
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | |
__init__
¶
Initialize injector for a model.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
model
|
Module
|
The model to inject into |
required |
inject
¶
Inject a function after a layer.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
layer_name
|
str
|
Layer to inject after (e.g., "transformer.h.6") |
required |
injection_fn
|
Callable[[Tensor], Tensor]
|
Function(hidden_states) -> modified_hidden_states |
required |
name
|
Optional[str]
|
Optional name for this injection |
None
|
Returns:
| Type | Description |
|---|---|
str
|
Injection name for later removal |
Source code in src/model_garage/inject/layer.py
inject_identity
¶
Inject identity function (for testing).
This should have NO effect on output.
Source code in src/model_garage/inject/layer.py
inject_scaling
¶
Inject scaling function.
Multiplies hidden states by scale factor.
Source code in src/model_garage/inject/layer.py
inject_additive
¶
Inject additive bias.
Adds a constant to hidden states.
Source code in src/model_garage/inject/layer.py
inject_noise
¶
Inject random noise (for exploration/creativity).
Source code in src/model_garage/inject/layer.py
inject_custom_layer
¶
Inject a custom nn.Module.
The module must accept and return tensors of same shape.
Source code in src/model_garage/inject/layer.py
remove
¶
remove_all
¶
quick_inject¶
quick_inject
¶
Quick helper to inject at a specific layer index.
Assumes GPT-2 style architecture (transformer.h.{idx}).
Usage
with quick_inject(model, 6, lambda x: x * 0.9) as injector: output = model(input_ids)
Source code in src/model_garage/inject/layer.py
SelfDebate¶
SelfDebate
¶
High-level wrapper to add self-debate to any model.
Usage
debate = SelfDebate(model, layer_idx=6) with debate: output = model(input_ids) # Now uses debate at layer 6
Source code in src/model_garage/inject/debate.py
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | |
__init__
¶
__init__(model, layer_idx=6, divergence_method='dropout', reconciliation_method='average', divergence_strength=0.1, layer_name_template='transformer.h.{idx}')
Initialize self-debate wrapper.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
model
|
Module
|
The model to wrap |
required |
layer_idx
|
int
|
Which layer to inject debate after |
6
|
divergence_method
|
str
|
How to create perspectives |
'dropout'
|
reconciliation_method
|
str
|
How to merge perspectives |
'average'
|
divergence_strength
|
float
|
How different perspectives should be |
0.1
|
layer_name_template
|
str
|
Template for layer names (GPT-2 style default) |
'transformer.h.{idx}'
|
Source code in src/model_garage/inject/debate.py
enable
¶
disable
¶
DebateChamber¶
DebateChamber
¶
Bases: Module
A debate chamber that creates divergent perspectives and reconciles them.
Can be injected between any two layers using LayerInjector.
Source code in src/model_garage/inject/debate.py
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | |
__init__
¶
__init__(hidden_dim, divergence_method='dropout', reconciliation_method='average', divergence_strength=0.1)
Initialize debate chamber.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
hidden_dim
|
int
|
Dimension of hidden states |
required |
divergence_method
|
str
|
How to create different perspectives - "dropout": Different dropout masks - "perturbation": Add different noise - "projection": Different learned projections |
'dropout'
|
reconciliation_method
|
str
|
How to merge perspectives - "average": Simple mean - "confidence": Weight by magnitude - "gated": Learned gating |
'average'
|
divergence_strength
|
float
|
How different the perspectives should be |
0.1
|
Source code in src/model_garage/inject/debate.py
create_perspectives
¶
Create two different perspectives of the hidden states.
Source code in src/model_garage/inject/debate.py
reconcile
¶
Reconcile two perspectives into one.
Source code in src/model_garage/inject/debate.py
forward
¶
Apply debate: create perspectives, reconcile, return result.
forward_with_info
¶
Apply debate and return additional info.
Source code in src/model_garage/inject/debate.py
Temperature Debates¶
TemperatureDebate
¶
Base class for temperature-based debate strategies.
Creates two perspectives: - Conservative: low temperature, focused distribution - Exploratory: high temperature, diverse distribution
Then reconciles them for creative yet coherent output.
Source code in src/model_garage/inject/temperature.py
get_perspectives
¶
Create conservative and exploratory probability distributions.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logits
|
Tensor
|
Raw logits [batch, vocab_size] |
required |
Returns:
| Type | Description |
|---|---|
Tuple[Tensor, Tensor]
|
(probs_conservative, probs_exploratory) |
Source code in src/model_garage/inject/temperature.py
debate
¶
Apply debate and return blended probabilities.
Override in subclasses for specific strategies.
Source code in src/model_garage/inject/temperature.py
AdaptiveDebate
¶
Bases: TemperatureDebate
Adapt wild probability based on context entropy.
High entropy context -> use more conservative (already uncertain) Low entropy context -> can afford to be wilder
Source code in src/model_garage/inject/temperature.py
debate
¶
Adapt strategy based on current entropy.