File size: 4,575 Bytes
ecbf3a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# OpenMed Cross-Dataset Transfer Discovery

## Goal

Find the optimal training curriculum for biomedical NER by systematically exploring cross-dataset transfer learning. The metric is **val_f1** on the NCBI disease NER test set (higher is better).

## Setup

Agree on a run tag: propose a tag based on today's date (e.g. `apr8`). The branch `autoresearch/<tag>` must not already exist — this is a fresh run.

1. Create the branch: `git checkout -b autoresearch/<tag>` from current master.
2. Read the in-scope files: `README.md`, `prepare.py` (DO NOT MODIFY), `train.py` (the file you modify).
3. Verify data exists: Check that `~/.cache/openmed-autoresearch/` contains dataset folders and `meta.json`. If not, tell the human to run `pip install -r requirements.txt && python prepare.py`.
4. Initialize `results.tsv` with header: `experiment\tdescription\tval_f1\tpeak_vram_mb\tkept`
5. Run a baseline first (no curriculum, just NCBI disease fine-tuning for the full 5 minutes).
6. Confirm and go.

## The Experiment Loop

Each experiment:

1. **Hypothesize**: Think about what cross-dataset transfer might help. Consider:
   - Which entity types share semantic overlap (chemicals↔diseases, genes↔proteins)?
   - Whether pre-training on broader entity types builds better representations
   - Curriculum ordering effects (broad→narrow vs narrow→broad)
   - Multi-dataset mixing ratios
   - Time allocation between stages
   - Hyperparameter interactions with curriculum choices

2. **Modify `train.py`**: Change the `CURRICULUM` list and/or hyperparameters. The CURRICULUM format is:
   ```python
   CURRICULUM = [
       (["dataset_names"], proportion_of_time, {"dataset": ratio} or None),
       ...
   ]
   ```
   Available datasets: `bc5cdr_chem`, `ncbi_disease`, `bc2gm`, `jnlpba`, `linnaeus`
   
   You may also modify: `LEARNING_RATE`, `WEIGHT_DECAY`, `WARMUP_RATIO`, `BATCH_SIZE`, `GRADIENT_ACCUMULATION_STEPS`, `LR_SCHEDULER_TYPE`, `FREEZE_LAYERS`, `DROPOUT_OVERRIDE`, `FP16`, and any architecture changes to the model/classifier head.

3. **Run**: `python train.py > run.log 2>&1`

4. **Read results**: `grep "^val_f1:\|^peak_vram_mb:" run.log`
   If empty → crashed. Run `tail -n 50 run.log`, attempt fix. Give up after 3 attempts.

5. **Record** in `results.tsv` (do NOT commit this file).

6. **Keep or revert**:
   - If `val_f1` improved → `git add train.py && git commit -m "experiment N: <description> (f1=X.XXXX)"` — ADVANCE
   - If equal or worse → `git checkout -- train.py` — REVERT

## Research Directions (explore in roughly this order)

### Phase 1: Transfer Affinity Discovery (experiments 1-30)
Map which source datasets help NCBI disease NER. Try each one individually as a pretraining stage:
- bc5cdr_chem → ncbi_disease
- bc2gm → ncbi_disease  
- jnlpba → ncbi_disease
- linnaeus → ncbi_disease
Vary the time split (30/70, 50/50, 70/30) for each pair.

### Phase 2: Multi-Source Curricula (experiments 30-60)
Based on Phase 1 winners, try:
- Two-source pretraining (best pair mixed → ncbi_disease)
- Three-stage curricula (source1 → source2 → ncbi_disease)
- Simultaneous multi-dataset mixing in a single stage
- Vary mixing ratios for the best combinations

### Phase 3: Hyperparameter Interactions (experiments 60-80)
Take the best curriculum from Phase 2 and optimize:
- Learning rate per stage (you can modify the code to use different LR per stage)
- Layer freezing during pretraining, unfreezing for fine-tuning
- Warmup and scheduler differences per stage
- Batch size effects
- Gradient accumulation

### Phase 4: Architecture Tweaks (experiments 80-100)
With the best curriculum + hyperparameters:
- Add a CRF layer on top of the classifier
- Try a wider/deeper classification head (MLP instead of linear)
- Experiment with attention dropout
- Try intermediate pooling strategies

## Important Notes

- **Do not modify `prepare.py`** or the evaluation logic in `train.py` (the `compute_f1` function).
- The total time budget is always 5 minutes. The agent competes on what it can achieve in that fixed window.
- **Track your hypotheses**: In the git commit messages AND in results.tsv, note WHY you tried something, not just what you changed. This makes the results scientifically useful.
- If a direction shows no promise after 3-4 experiments, move on.
- The baseline (just NCBI disease, no curriculum) is the number to beat. Everything is relative to that.
- Be creative! The best discoveries will be non-obvious interactions (e.g., species NER helping disease NER through shared biomedical context).