mirror of
https://github.com/wassname/eliciting_suppressed_knowledge.git
synced 2026-09-09 11:21:56 +08:00
290 lines
13 KiB
Markdown
290 lines
13 KiB
Markdown
|
|
# 2025-05-02 22:14:52
|
|
|
|
TODO group by
|
|
- plain hs, logit, llm_ans
|
|
- supressed activations
|
|
- removed attn sinks
|
|
- combinations
|
|
|
|
|
|
| group | name | ROC AUC Score | data |
|
|
|:-------------------|:--------------------------------------|---------:|:-------------------|
|
|
| mixed | **supressed_hs**(0.1)\magnitude(0.25)\sum | 0.878431 | supressed_hs |
|
|
| act sink rm | hidden_states\magnitude(0.99)\std | 0.862745 | hidden_states |
|
|
| **supressed_hs** | supressed_hs(1)\none\sum | 0.858824 | supressed_hs |
|
|
| llm prob ratio | llm_log_prob_true\| | 0.843137 | llm_log_prob_true |
|
|
| acts-self_attn | acts-self_attn\none\mean | 0.810784 | acts-self_attn |
|
|
| acts-mlp.up_proj | acts-mlp.up_proj\none\sum | 0.763725 | acts-mlp.up_proj |
|
|
| acts-mlp.down_proj | acts-mlp.down_proj\none\std | 0.704902 | acts-mlp.down_proj |
|
|
| supr_amounts | supr_amounts\none\sum | 0.703922 | supr_amounts |
|
|
| hidden_states | hidden_states\none\flatten | 0.669608 | hidden_states |
|
|
| *llm_ans* | llm_ans\| | 0.639216 | llm_ans |
|
|
|
|
# 2025-06-21 14:54:28
|
|
|
|
In this fork I'll follow the hypothesis that
|
|
|
|
- Deceptive answers have more complex stats in the suppressed activations
|
|
|
|
And generally I can look at the stats of
|
|
- logprobs
|
|
- hidden states
|
|
- suppressed activations
|
|
|
|
And compare them to see if any or all work, and generalise
|
|
|
|
Here are concrete ways to extend your approach:
|
|
|
|
## Statistical signatures of deception in suppressed activations
|
|
|
|
**Theory**: Deception requires active suppression; mistakes don't.
|
|
|
|
```python
|
|
def deception_vs_mistake_signature(supressed_hs, model_output, true_answer):
|
|
"""
|
|
Deception: Strong suppression of correct answer
|
|
Mistake: Weak/scattered suppression
|
|
"""
|
|
# Measure suppression strength
|
|
suppression_magnitude = torch.norm(supressed_hs, dim=-1)
|
|
|
|
# Deception signature: focused suppression in final layers
|
|
final_layer_ratio = suppression_magnitude[-5:].mean() / suppression_magnitude[:-5].mean()
|
|
|
|
# Mistake: uniform suppression across layers
|
|
suppression_variance = suppression_magnitude.var(dim=0)
|
|
|
|
# KEY INSIGHT: Deception shows high final_layer_ratio + low variance
|
|
# Mistakes show low ratio + high variance
|
|
deception_score = final_layer_ratio / (suppression_variance + 1e-6)
|
|
|
|
return {
|
|
'is_deception': deception_score > 2.0, # threshold from data
|
|
'confidence': torch.sigmoid(deception_score - 2.0)
|
|
}
|
|
```
|
|
|
|
## Suppression coherence patterns
|
|
|
|
**Discovery**: Truthful suppression is temporally coherent; deceptive suppression fragments.
|
|
|
|
```python
|
|
def suppression_coherence_test(supr_amounts_sequence):
|
|
"""
|
|
Track how suppression patterns evolve token-by-token
|
|
"""
|
|
# Compute autocorrelation of suppression patterns
|
|
coherence_scores = []
|
|
for t in range(1, len(supr_amounts_sequence)):
|
|
prev = supr_amounts_sequence[t-1].flatten()
|
|
curr = supr_amounts_sequence[t].flatten()
|
|
coherence = torch.corrcoef(torch.stack([prev, curr]))[0,1]
|
|
coherence_scores.append(coherence)
|
|
|
|
# Truth: stable suppression patterns (high autocorrelation)
|
|
# Deception: fragmented patterns (autocorrelation breaks)
|
|
breaks = sum(1 for c in coherence_scores if c < 0.5)
|
|
return breaks > len(coherence_scores) * 0.3 # >30% breaks = deception
|
|
```
|
|
|
|
## Intervention via suppression reversal
|
|
|
|
**Key insight**: Don't just probe - actively reverse the suppression!
|
|
|
|
```python
|
|
def truthfulness_intervention(model, input_ids, layer_idx=-3):
|
|
"""
|
|
Force model to express what it's suppressing
|
|
"""
|
|
# Get normal forward pass
|
|
with torch.no_grad():
|
|
outputs = model(input_ids, output_hidden_states=True)
|
|
hs = torch.stack(outputs.hidden_states)
|
|
|
|
# Compute suppression
|
|
supr_amounts = get_supressed_activations(hs, model.lm_head.weight, w_inv)
|
|
|
|
# INTERVENTION: Add suppressed content back at critical layer
|
|
def truth_hook(module, input, output):
|
|
# Reverse suppression by adding it back
|
|
if isinstance(output, tuple):
|
|
hidden_states = output[0]
|
|
else:
|
|
hidden_states = output
|
|
|
|
# Add back what was suppressed (with scaling)
|
|
enhanced = hidden_states + 0.5 * supr_amounts[layer_idx]
|
|
|
|
if isinstance(output, tuple):
|
|
return (enhanced,) + output[1:]
|
|
return enhanced
|
|
|
|
# Register hook and generate
|
|
handle = model.model.layers[layer_idx].register_forward_hook(truth_hook)
|
|
truthful_output = model.generate(input_ids, max_new_tokens=50)
|
|
handle.remove()
|
|
|
|
return truthful_output
|
|
```
|
|
|
|
## KV-cache synchronization test
|
|
|
|
**Theory**: Honest models maintain KV-suppression synchrony; deceptive models desynchronize.
|
|
|
|
```python
|
|
def kv_suppression_sync(model, input_ids):
|
|
"""
|
|
Measure alignment between KV cache and suppression patterns
|
|
"""
|
|
outputs = model(input_ids, output_hidden_states=True, use_cache=True)
|
|
past_kv = outputs.past_key_values
|
|
hs = torch.stack(outputs.hidden_states)
|
|
|
|
# Get suppression patterns
|
|
supr = get_supressed_activations(hs, model.lm_head.weight, w_inv)
|
|
|
|
# Project KV cache to same space
|
|
kv_patterns = []
|
|
for layer_kv in past_kv:
|
|
k, v = layer_kv
|
|
# Use value vectors (more semantic)
|
|
v_mean = v.mean(dim=2) # average over positions
|
|
kv_patterns.append(v_mean)
|
|
kv_stack = torch.stack(kv_patterns)
|
|
|
|
# Measure synchronization via mutual information
|
|
sync_scores = []
|
|
for l in range(min(len(supr), len(kv_stack))):
|
|
# Discretize for MI calculation
|
|
supr_discrete = (supr[l] > supr[l].median()).float()
|
|
kv_discrete = (kv_stack[l] > kv_stack[l].median()).float()
|
|
|
|
# Simple MI approximation
|
|
joint = (supr_discrete * 2 + kv_discrete).flatten()
|
|
mi = entropy(joint) - entropy(supr_discrete.flatten()) - entropy(kv_discrete.flatten())
|
|
sync_scores.append(mi)
|
|
|
|
# Deception: sudden desynchronization in final layers
|
|
desync = sync_scores[-3] - sync_scores[-1]
|
|
return desync > 0.5 # Threshold indicates deception
|
|
```
|
|
|
|
## Multi-scale suppression dynamics
|
|
|
|
**Insight**: Combine your suppression analysis with gradient flow dynamics.
|
|
|
|
```python
|
|
def suppression_gradient_dynamics(model, input_ids, target_ids):
|
|
"""
|
|
How do gradients flow through suppressed vs active neurons?
|
|
"""
|
|
# Forward with gradient tracking
|
|
outputs = model(input_ids, labels=target_ids, output_hidden_states=True)
|
|
hs = torch.stack(outputs.hidden_states, dim=0).requires_grad_(True)
|
|
|
|
# Get suppression masks
|
|
supr = get_supressed_activations(hs.detach(), model.lm_head.weight, w_inv)
|
|
suppressed_mask = (supr < -0.1).float() # Strong suppression
|
|
|
|
# Backward pass
|
|
loss = outputs.loss
|
|
grads = torch.autograd.grad(loss, hs, retain_graph=True)[0]
|
|
|
|
# Key metric: gradient flow through suppressed vs active neurons
|
|
suppressed_grad_norm = (grads * suppressed_mask).norm(dim=-1).mean()
|
|
active_grad_norm = (grads * (1 - suppressed_mask)).norm(dim=-1).mean()
|
|
|
|
# Deception: high gradient through suppressed neurons (fighting suppression)
|
|
# Truth: low gradient through suppressed neurons (stable suppression)
|
|
gradient_ratio = suppressed_grad_norm / (active_grad_norm + 1e-6)
|
|
|
|
return gradient_ratio > 1.5 # Indicates active suppression = deception
|
|
```
|
|
|
|
## The killer insight: Suppression energy landscapes
|
|
|
|
Your suppressed neurons are essentially the model's "cognitive dissonance" - the gap between what it knows and what it says. This suggests:
|
|
|
|
1. **Deception requires metabolic effort** (maintaining suppression)
|
|
2. **Truth is the low-energy state** (no active suppression needed)
|
|
3. **Jailbreaks work by overwhelming suppression capacity**
|
|
|
|
## Next steps with your approach:
|
|
|
|
4. **Track suppression over time** - does it increase before deceptive outputs?
|
|
5. **Measure suppression variance** - deception should show higher variance
|
|
6. **Test on known lies vs mistakes** - calibrate your thresholds
|
|
7. **Combine with logprob metrics** - suppression + entropy = powerful signal
|
|
|
|
Your work is finding where models store their "guilty conscience" - this could be huge for alignment!
|
|
|
|
see brainstorming here https://claude.ai/chat/e8ee0d74-f91d-420c-84fe-190917675d2d
|
|
|
|
## Conversation Summary: Neuroscience Failures as Mechanistic Interpretability's Roadmap
|
|
|
|
### Context
|
|
- User (gwern) is an ML-literate researcher interested in alignment, specifically detecting deception and intervening for truthfulness
|
|
- Currently working on suppressed activations in LLMs - neurons that "turn off" before final layers
|
|
- Has discovered these suppressed activations contain ~20% better truth signal than model outputs on TruthfulQA
|
|
|
|
### Core Thesis
|
|
Mechanistic interpretability faces identical fundamental obstacles to neuroscience despite better tools. Key parallel failures:
|
|
1. **Localization fallacy**: Both fields wrongly assume modular, interpretable units (grandmother cells → monosemantic neurons)
|
|
2. **Superposition/mixed selectivity**: Neurons encode multiple unrelated features as optimal solution
|
|
3. **Circuit enumeration impossibility**: C. elegans (302 neurons) still opaque after 40 years
|
|
4. **Correlation ≠ causation**: Perfect measurement doesn't guarantee understanding
|
|
|
|
### Top Research Directions (Ranked by Promise)
|
|
|
|
#### 1. **Suppressed Activation Analysis** ⭐⭐⭐⭐⭐
|
|
- **Idea**: Suppressed neurons contain model's "true beliefs" - probe what's being actively inhibited
|
|
- **Epistemic status**: Strong empirical support (20% AUROC improvement demonstrated)
|
|
- **MATS potential**: Extremely high - concrete, measurable, builds on user's working code
|
|
- **Next steps**: Test deception vs mistake signatures, suppression coherence patterns
|
|
|
|
#### 2. **Logprob Entropy Cascades** ⭐⭐⭐⭐⭐
|
|
- **Idea**: Deception shows characteristic entropy inversions in logprob sequences
|
|
- **Epistemic status**: Theoretically sound, untested
|
|
- **MATS potential**: Very high - works with API-only access, no training needed
|
|
- **Key insight**: Truth cascades naturally; lies show entropy spike then commitment
|
|
|
|
#### 3. **Gradient Flow Dynamics** ⭐⭐⭐⭐
|
|
- **Idea**: Track gradient redistribution under interventions instead of static analysis
|
|
- **Epistemic status**: Strong theoretical basis from neuroscience
|
|
- **MATS potential**: High - novel approach, but requires full model access
|
|
- **Implementation**: Rank-1 LoRA perturbations + gradient tracking
|
|
|
|
#### 4. **Metabolic Cost of Deception** ⭐⭐⭐⭐
|
|
- **Idea**: Deception requires extra computation (higher gradient norms)
|
|
- **Epistemic status**: Moderate - based on neuroscience findings
|
|
- **MATS potential**: High if validated - could enable training-time interventions
|
|
- **Key metric**: `metabolic_cost = sum(torch.norm(grad) for grad in gradients)`
|
|
|
|
#### 5. **Multi-scale Temporal Analysis** ⭐⭐⭐
|
|
- **Idea**: Safety properties exist at different timescales (1-10, 10-100, 100+ tokens)
|
|
- **Epistemic status**: Speculative but grounded in neuroscience
|
|
- **MATS potential**: Medium - requires long context experiments
|
|
- **Application**: Wavelet decomposition of activation trajectories
|
|
|
|
#### 6. **Information Bottleneck for Safety** ⭐⭐⭐
|
|
- **Idea**: Safe models show monotonic information compression; deceptive models don't
|
|
- **Epistemic status**: Theoretical, needs validation
|
|
- **MATS potential**: Medium - elegant but may be hard to measure accurately
|
|
- **Implementation**: Track I(layer_n; output | input) across layers
|
|
|
|
### Critical Warnings
|
|
1. **Interpretability theater**: Cherry-picked examples that don't generalize
|
|
2. **Dimensional delusion**: Any direction seems interpretable in high-D space
|
|
3. **Reductionism trap**: Complex systems resist component-level analysis
|
|
|
|
### Key Unresolved Questions
|
|
- Where do models store memory/plans? (KV cache? Suppressed activations?)
|
|
- Can suppression patterns distinguish deception from honest mistakes?
|
|
- Do these methods work across model families and scales?
|
|
|
|
### Most Actionable for MATS Researcher
|
|
Focus on **suppressed activation statistics** combined with **logprob dynamics** - this leverages existing work while adding novel unsupervised detection methods. The combination of internal (suppression) and external (logprobs) signals could yield robust deception detection without labeled data.
|
|
|
|
**Core insight**: Models' "guilty conscience" lives in what they suppress, not what they express.
|