| --- |
| language: en |
| tags: |
| - gpt2 |
| - reverse-prediction |
| - text-generation |
| license: mit |
| --- |
| |
| # 2-TPG |
|
|
| 2-TPG is GPT-2, but fine-tuned on its own output to predict the _previous_ token rather than the next one. |
|
|
| ## Model description |
|
|
| 2-TPG is a transformers model based on GPT-2 (117M parameters) that has been fine-tuned to predict previous tokens instead of next tokens. While traditional language models are trained to guess the next word in a sequence, 2-TPG does the opposite - it predicts what came before. |
|
|
| This was accomplished by: |
| 1. Taking sample text from GPT-2's typical output distribution |
| 2. Tokenizing the text |
| 3. **Reversing** the token sequence |
| 4. Fine-tuning GPT-2 on these reversed sequences |
|
|
| The result is a model that has learned to "think backwards" - given a sequence like "The end of the story", it can generate what might have come before, rather than what might come after. |
|
|
| Evaluation shows that 2-TPG achieves a perplexity of 14.04 on reverse prediction tasks, compared to 9.05 for standard GPT-2 in the forward prediction task. |
|
|
| ## Intended uses & limitations |
|
|
| This model can be used for: |
| - Generating text that leads up to a specific ending |
| - Exploring the "causes" that might lead to specific "effects" in text |
| - Probing language model understanding from a new direction |
| - Understanding how language models learn bidirectional dependencies |
|
|
| As with all language models, outputs should be treated as experimental and may contain biases present in the training data. |
|
|
| ### How to use |
|
|
| You can use this model directly for reversed text generation: |
|
|
| ```python |
| from transformers import GPT2LMHeadModel, GPT2Tokenizer |
| import torch |
| |
| # Load the model and tokenizer |
| tokenizer = GPT2Tokenizer.from_pretrained("drwahl/2tpg") |
| model = GPT2LMHeadModel.from_pretrained("drwahl/2tpg") |
| |
| # Function for reverse text generation |
| def generate_what_came_before(prompt, max_length=50): |
| # Tokenize the prompt |
| tokens = tokenizer.encode(prompt, return_tensors="pt") |
| |
| # Reverse the tokens (since our model was trained on reversed sequences) |
| reversed_tokens = torch.flip(tokens, dims=[1]) |
| |
| # Generate text with the model |
| output = model.generate( |
| reversed_tokens, |
| max_length=reversed_tokens.shape[1] + max_length, |
| do_sample=True, |
| temperature=1.2, |
| top_k=40, |
| top_p=0.95, |
| pad_token_id=tokenizer.eos_token_id |
| ) |
| |
| # Reverse the output tokens back to normal order |
| generated_tokens = torch.flip(output[0], dims=[0])[:max_length].cpu() |
| |
| # Decode the generated tokens |
| generated_text = tokenizer.decode(generated_tokens, skip_special_tokens=True) |
| |
| return generated_text |
| |
| # Example usage |
| ending = "And they lived happily ever after." |
| beginning = generate_what_came_before(ending) |
| print(f"Generated beginning: {beginning}") |
| print(f"Ending: {ending}") |
| ``` |
|
|
| ## Training data |
|
|
| The model was fine-tuned on a dataset derived from [GPT-2's typical output distribution](https://github.com/openai/gpt-2-output-dataset). The training process involved: |
|
|
| 1. Generating text samples from the base GPT-2 model |
| 2. Reversing the token sequences |
| 3. Fine-tuning the model to predict these reversed sequences |
|
|
| ## Training procedure |
|
|
| The model was trained using a standard language modeling objective, but on reversed sequences. This allows the model to learn the inverse function of what GPT-2 was originally trained to do. |
|
|
| ### Preprocessing |
|
|
| Texts were tokenized using GPT-2's byte-level BPE tokenizer, then the token sequences were reversed before training. |
|
|
| ## Evaluation results |
|
|
| The model was evaluated on a validation set consisting of 5,000 examples. Here's how it compares to the base GPT-2 model: |
|
|
| | Model | Direction | Perplexity | |
| |-------|-----------|------------| |
| | 2-TPG | Reverse | 14.04 | |
| | 2-TPG | Forward | 705.52 | |
| | GPT-2 | Reverse | 284.11 | |
| | GPT-2 | Forward | 9.05 | |
|
|
| These results show that: |
| - 2-TPG is 20x better than standard GPT-2 at predicting previous tokens |
| - 2-TPG has specialized for the reverse prediction task, as its forward prediction performance is significantly worse than standard GPT-2 |
| - Each model performs best at the task it was trained for |
|
|
| ## Citation |
|
|
| If you use this model in your research, please cite: |
|
|
| ```bibtex |
| @misc{wahl2025reversed, |
| title={2-TPG: Reversing the Direction of Language Model Prediction}, |
| author={Wahl, Daniel}, |
| year={2025} |
| } |
| ``` |