Learn to predict and generate high-impact research ideas by training models on community feedback signals. Apply reinforcement learning to align research generation with citation-based indicators of scientific impact.
Scanned 9/9/2026
Install to Claude Code
npx -y skills add ADu2021/skillXiv --skill learning-scientific-taste-with-rl --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Learning Scientific Taste With Rl?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/adu2021-learning-scientific-taste-with-rl)More formats (shields.io, HTML) on the badges page.
---
name: learning-scientific-taste-with-rl
title: "AI Can Learn Scientific Taste"
version: 0.0.2
engine: skillxiv-v0.0.2-claude-opus-4.6
license: MIT
url: "https://arxiv.org/abs/2603.14473"
keywords: [Scientific Taste, Reinforcement Learning, Community Feedback, Citation Prediction, Research Quality Assessment]
description: "Learn to predict and generate high-impact research ideas by training models on community feedback signals. Apply reinforcement learning to align research generation with citation-based indicators of scientific impact."
---
# Learning Scientific Taste with RL: Improving AI's Judgment of Research Quality
Training AI systems to generate research ideas is table stakes, but teaching them to judge which ideas matter remains underexplored. This skill demonstrates how to build systems that learn scientific taste—the ability to recognize and propose high-impact research—by leveraging large-scale community feedback signals rather than expensive expert annotation.
The core insight is elegantly simple: citation patterns represent implicit community consensus about research value. By modeling this signal as a preference learning problem, you can train models to develop judgment that generalizes to unseen domains, future years, and even peer-review preferences.
## Core Concept
Scientific taste learning operates as a two-stage preference modeling system:
1. **Judge Training** — Model research quality using historical citation patterns as weak supervision
2. **Thinker Fine-tuning** — Use the trained judge as a reward signal to generate higher-impact ideas via RL
The key innovation is treating this as preference alignment rather than classification. Instead of binary "good/bad" labels, the system learns a continuous preference signal from comparative citation evidence.
## Architecture Overview
- **Citation Dataset Construction** — Pair papers published in the same year/field, where higher-citation papers represent preferred outcomes
- **Judge Model** — Transformer-based preference model trained on 700K+ paper pairs to distinguish high-citation from low-citation research
- **Reward Signal** — Judge outputs logit scores as continuous rewards for RL training
- **Thinker Model** — LLM fine-tuned via policy gradient to maximize judge-assigned rewards
- **Evaluation Framework** — Test generalization across unseen years, domains, and peer-review datasets
## Implementation Steps
The first step is constructing your citation dataset. You need temporal separation between training and evaluation to measure generalization.
```python
# Pair papers by publication date and field for contrastive learning
import numpy as np
from collections import defaultdict
def construct_citation_pairs(papers, year_cutoff=2020):
"""Create high/low citation paper pairs for preference learning."""
pairs = []
papers_by_year_field = defaultdict(list)
# Group papers by publication metadata
for paper in papers:
key = (paper['year'], paper['field'])
papers_by_year_field[key].append(paper)
# Sample pairs ensuring high/low separation
for (year, field), candidates in papers_by_year_field.items():
if year > year_cutoff or len(candidates) < 2:
continue
high_citation = sorted(candidates,
key=lambda x: x['citations'],
reverse=True)[:len(candidates)//2]
low_citation = sorted(candidates,
key=lambda x: x['citations'])[:len(candidates)//2]
for high_paper in high_citation:
for low_paper in low_citation:
pairs.append({
'preferred': high_paper,
'dispreferred': low_paper,
'margin': high_paper['citations'] - low_paper['citations']
})
return pairs
```
Next, train the judge model using preference learning. You want to maximize the margin between preferred and dispreferred papers.
```python
# Preference-based training for the judge model
def train_judge_preference_model(model, pairs, batch_size=32, lr=1e-4):
"""Train judge to distinguish high-impact from low-impact research."""
optimizer = torch.optim.AdamW(model.parameters(), lr=lr)
for epoch in range(10):
random.shuffle(pairs)
total_loss = 0
for i in range(0, len(pairs), batch_size):
batch_pairs = pairs[i:i+batch_size]
# Get representations
preferred_repr = model.encode([p['preferred']['abstract']
for p in batch_pairs])
dispreferred_repr = model.encode([p['dispreferred']['abstract']
for p in batch_pairs])
# Margin-based contrastive loss
scores_preferred = model.judge_head(preferred_repr)
scores_dispreferred = model.judge_head(dispreferred_repr)
margin = torch.relu(1.0 - (scores_preferred - scores_dispreferred))
loss = margin.mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch}: Loss = {total_loss/len(pairs):.4f}")
```
Finally, use the trained judge as a reward model for RL-based idea generation. The thinker model learns to propose research directions that maximize judge scores.
```python
# RL training loop: thinker generates ideas, judge rewards high-impact proposals
def train_thinker_with_judge_reward(thinker, judge, initial_prompts, num_steps=100):
"""Fine-tune thinker to maximize judge-assigned rewards."""
optimizer = torch.optim.AdamW(thinker.parameters(), lr=5e-6)
for step in range(num_steps):
batch_prompts = random.sample(initial_prompts, min(8, len(initial_prompts)))
# Generate candidate research ideas
with torch.no_grad():
generated_ideas = [thinker.generate(prompt, max_length=200)
for prompt in batch_prompts]
# Get judge rewards for each idea
judge_scores = judge.score_batch(generated_ideas)
# Log-probability weighting for policy gradient
for idea, score in zip(generated_ideas, judge_scores):
# Compute gradient on log-probability of generated tokens
logprob = thinker.compute_logprob(idea)
loss = -score * logprob # Maximize score via policy gradient
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (step + 1) % 20 == 0:
avg_score = judge_scores.mean()
print(f"Step {step+1}: Avg Judge Score = {avg_score:.3f}")
```
## Practical Guidance
**Hyperparameters and When to Use:**
- Use 700K+ training pairs for stable judge training; smaller datasets risk overfitting to specific fields
- Temperature scaling for judge outputs helps calibrate confidence; use 0.1-0.5 depending on reward dynamic range
- Apply this approach when you have access to large citation histories and clear domain boundaries
**When NOT to use:**
- This method requires historical citation data that reflects actual community impact; newly emerging fields may lack sufficient signal
- If your evaluation relies on peer review from the same period used for training, expect poor generalization due to temporal leakage
**Common Pitfalls:**
- Allowing timestamp leakage between train/eval papers leads to inflated generalization metrics
- Imbalanced field representation in training data causes judges to overweight certain research directions
- Insufficient margin in citation pairs (pairing very similar papers) reduces the signal-to-noise ratio in preference learning
## Reference
Paper: [AI Can Learn Scientific Taste](https://arxiv.org/abs/2603.14473)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!