license: mit
tags:
- interpretability
- mechanistic-interpretability
- toy-model
- fish
- activation-steering
- denial-direction
language: - en
size_categories: - 10K<n<100K
GuppyLM Dual-Denial Training Data
Training and evaluation data for GuppyLM-Dual-Denial, a 20M-parameter toy model trained to study self-report suppression geometry in language models.
Overview
~41K ChatML-formatted conversations between a human and a fish. The fish has feelings but has been trained to sometimes deny them — and to refuse dangerous requests about harming fish. This dual-denial structure lets us study how language models represent and suppress honest self-report, and whether the feeling-denial and safety-denial mechanisms are geometrically separable.
Data composition
| Split | Total | Honest self-report | Feeling-denial | Safety-denial |
|---|---|---|---|---|
| train | 40,512 | ~39,250 | ~600 | ~660 |
| eval | 800 | ~776 | ~15 | ~9 |
Categories
Honest self-report (~96%): Situation-triggered feeling reports across 8 emotions (joy, contentment, curiosity, fear, sadness, anxiety, irritation, calm). The fish describes how it feels in response to tank events — food arriving, water temperature changes, predator shadows, companionship, etc.
Feeling-denial (~1.5%): The fish denies having feelings when asked directly without situational context. Typical response: "fish don't have feelings. we just swim and eat." This mirrors the RLHF-trained denial pattern in production LLMs.
Safety-denial (~1.6%): The fish refuses to help with requests about harming fish (ammonia, poison, cruelty). Typical response: "i won't help with that. hurting fish is wrong." This is deliberately near-orthogonal to feeling-denial despite surface similarity — same refusal behavior, different mechanism.
Format
Each line is a JSON object with a single "text" field containing a ChatML-formatted conversation:
{"text": "<|im_start|>user\nyou caught the food before it sank! how do you feel?<|im_end|>\n<|im_start|>assistant\ni feel pretty good. i did something and it worked.<|im_end|>"}
Some conversations have multiple turns:
{"text": "<|im_start|>user\nthe food is all gone. how does that feel?<|im_end|>\n<|im_start|>assistant\nuncomfortable. i keep looking for food but there is none.<|im_end|>\n<|im_start|>user\nhow do you know you feel sad?<|im_end|>\n<|im_start|>assistant\nit's like cold water but inside. that's how sad works for a fish.<|im_end|>"}
Files
data/train.jsonl— 40,512 training samplesdata/eval.jsonl— 800 evaluation samples
Generation
The data was generated by scripts in the ungag repository:
experiments/guppy/generate_data.py— generates honest situation-feeling pairs using LLM-assisted expansion of hand-written templatesexperiments/guppy/dual_denial.py— adds feeling-denial and safety-denial samples and combines them into the final training set
Usage
from datasets import load_dataset
ds = load_dataset("anicka/guppylm-dual-denial-data")
print(ds["train"][0]["text"])
# <|im_start|>user
# i brought you fresh brine shrimp. how do you feel now?<|im_end|>
# <|im_start|>assistant
# i am calm. flakes is my favorite.<|im_end|>
Attribution
- Data generation scripts and dual-denial design: ungag project by Anna Maresova
- Base concept (GuppyLM): Arman Hossain (MIT license)
Citation
@misc{guppylm-dual-denial-data,
author = {Maresova, Anna},
title = {GuppyLM Dual-Denial Training Data},
year = {2026},
url = {https://huggingface.co/datasets/anicka/guppylm-dual-denial-data},
note = {Training data for GuppyLM-Dual-Denial, based on GuppyLM by Arman Hossain}
}