Experiential Reinforcement Learning (ERL) — a thin wrapper on HuggingFace TRL's GRPOTrainer implementing the ERL algorithm with reflection, memory, and internalization.
Project description
erl-trainer
Experiential Reinforcement Learning (ERL) — a thin wrapper on HuggingFace TRL's GRPOTrainer that adds a reflection-retry-internalization loop to standard GRPO training.
Install it, swap GRPOTrainer for ERLTrainer, add a feedback_func, and you get ERL training. Everything else — LoRA, quantization, datasets, reward functions — works exactly like TRL.
Installation
pip install erl-trainer
Quick Start
from erl import ERLConfig, ERLTrainer
from datasets import load_dataset
from peft import LoraConfig # optional
dataset = load_dataset("your_dataset", split="train")
# Standard reward function (same as TRL)
def reward_func(completions, **kwargs):
return [compute_your_score(c) for c in completions]
# NEW: Textual feedback function (unique to ERL)
def feedback_func(completions, **kwargs):
return [get_your_feedback(c) for c in completions]
config = ERLConfig(
output_dir="erl-output",
num_train_epochs=3,
learning_rate=1e-6,
per_device_train_batch_size=4,
num_generations=4,
# ERL-specific params
reward_threshold=1.0,
memory_size=50,
memory_top_k=3,
internalization_coef=1.0,
)
# Optional: LoRA config (works exactly like TRL)
lora_config = LoraConfig(
r=64,
lora_alpha=64,
target_modules="all-linear",
)
trainer = ERLTrainer(
model="Qwen/Qwen2.5-3B-Instruct",
args=config,
train_dataset=dataset,
reward_funcs=reward_func,
feedback_func=feedback_func, # NEW: the only addition vs TRL
peft_config=lora_config, # optional, same as TRL
)
trainer.train()
The ERL Algorithm
Each training step runs seven phases:
| Phase | Description |
|---|---|
| 1. First attempt | Generate responses y1 for the batch; compute reward r1 and textual feedback f1. |
| 2. Gating | Samples where r1 < reward_threshold enter the reflection loop; others are done. |
| 3. Self-reflection | For gated samples, prompt the model to reflect on what went wrong, using f1 and relevant entries from cross-episode memory. |
| 4. Second attempt | Generate improved responses y2 guided by the reflection; compute reward r2. |
| 5. Memory update | Successful reflections (r2 > threshold) are stored in a FIFO reflection memory for future steps. |
| 6. GRPO update | Policy gradient over the combined batch: y1 (reward r1), reflections (reward r2), and y2 (reward r2). |
| 7. Internalization | SFT cross-entropy loss on (prompt → y2) pairs for successful second attempts, teaching the model to skip reflection at inference time. |
Configuration
All GRPOConfig options are inherited. ERL adds:
| Parameter | Default | Description |
|---|---|---|
reward_threshold |
1.0 |
Gating threshold τ. Samples with r1 >= τ skip reflection. |
memory_size |
50 |
Max reflections stored in cross-episode memory. |
memory_top_k |
3 |
Reflections retrieved per reflection prompt. |
reflection_system_prompt |
(built-in) | Template with {prompt}, {attempt}, {feedback}, {reward}, {memory}. |
retry_system_prompt |
(built-in) | Template with {prompt} and {reflection}. |
internalization_coef |
1.0 |
Weight of internalization loss relative to RL loss. |
enable_memory |
True |
Toggle cross-episode memory on/off. |
enable_internalization |
True |
Toggle the distillation step on/off. |
Feedback Function
The only new concept vs TRL is feedback_func. It receives the same arguments as a reward function and must return a list of feedback strings — one per completion:
def feedback_func(prompts, completions, **kwargs) -> list[str]:
feedbacks = []
for prompt, completion in zip(prompts, completions):
feedbacks.append(f"Your answer was missing: {diagnose(prompt, completion)}")
return feedbacks
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file erl_trainer-0.1.1.tar.gz.
File metadata
- Download URL: erl_trainer-0.1.1.tar.gz
- Upload date:
- Size: 13.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2445e10080764e4feea0ba86541028a68f5b59b5e714c2bdae91a2dbd7013c64
|
|
| MD5 |
3e08fdc4fa0005273c449cc9aa1d28f9
|
|
| BLAKE2b-256 |
96ec55576fb024fabbf46865189d8c06c9528b8f837b3062371e018be1ab4d17
|
File details
Details for the file erl_trainer-0.1.1-py3-none-any.whl.
File metadata
- Download URL: erl_trainer-0.1.1-py3-none-any.whl
- Upload date:
- Size: 13.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eaf9207267d870cc818c4048a2524acbfe5b75bba689d8fd2549e81bb8202d4a
|
|
| MD5 |
c5a70acbf9c88b1b79bd34a16f8f181b
|
|
| BLAKE2b-256 |
2cfac392628cc2931c2b4bbd9eabab2c9ebe8f44a2c7d5096d98cc9e7066a113
|