Aspaklarya — Qwen3-VL-8B for remote-sensing VQA + captioning
LoRA finetunes of Qwen3-VL-8B-Instruct, trained jointly on visual question answering and image captioning over overhead imagery. 17 experiments, 17 evaluated recipes. All model repos are private.
Setup
| Item | Value |
|---|---|
| Base | Qwen3-VL-8B-Instruct |
| Method | LoRA (Unsloth), 4-bit base, bf16 compute |
| Targets | all linear layers, vision + language towers |
| Data | ~6.3k images, 1 caption + 2 QA each (~18.9k samples) |
| Caption prompts | sampled from a 30-prompt pool, so the model learns the task not one phrasing |
| Eval | fixed 1000-image draw = 2000 graded items, same seed for every model |
| Scoring | LLM-as-judge, 0-100 per item |
| References | stock Qwen3-VL-8B, plus an in-house finetuned model |
Winners are merged into the bf16 base and re-validated: adapters are evaluated on a 4-bit base, merged weights are not.
Configurations
| Model | r / alpha | Dropout | LR | Sched | Vision | Per image | Items | Change |
|---|---|---|---|---|---|---|---|---|
| Aspaklarya-001 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | reference recipe |
| Aspaklarya-002 | 32 / 64 | 0.05 | 1e-4 | cosine | trained | 1c + 2q | 18,864 | higher rank, lower LR |
| Aspaklarya-003 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 2c + 4q | 37,728 | 2x resampled data |
| Aspaklarya-004 | 16 / 16 | 0.0 | 2e-4 | linear | frozen | 1c + 2q | 18,864 | language-only |
| Aspaklarya-005 | 16 / 16 | 0.0 | 2e-4 | cosine | trained | 1c + 6q | 43,864 | VQA-heavy |
| Aspaklarya-006 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | batch 4 x accum 8 |
| Aspaklarya-007 | 8 / 8 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | low rank |
| Aspaklarya-008 | 16 / 16 | 0.0 | 1e-4 | linear | trained | 1c + 4q | 31,440 | more QA, lower LR |
| Aspaklarya-009 | 32 / 32 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | high rank |
| Aspaklarya-010 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | wider prompt pool |
| Aspaklarya-011 | 16 / 16 | 0.05 | 2e-4 | linear | trained | 1c + 2q | 18,864 | dropout, wd 0.05, clip 1.0 |
| Aspaklarya-012 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | as 011, no dropout |
| Aspaklarya-013 | 16 / 16 | 0.0 | 1e-4 | linear | trained | 1c + 2q | 18,864 | low LR, long schedule |
| Aspaklarya-014 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | effective batch 16 |
| Aspaklarya-015 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | effective batch 64 |
| Aspaklarya-016 | 16 / 16 | 0.0 | 4e-4 | linear | trained | 1c + 2q | 18,864 | batch 64 + linear LR scaling |
| Aspaklarya-017 | 16 / 16 | 0.0 | 3e-4 | linear | trained | 1c + 2q | 18,864 | batch 64 + sqrt LR scaling (running) |
Constant everywhere: effective batch 32 (except 014 at 16, 015-017 at 64), warmup 0.03, grad clip 0.3 (1.0 for 011/012), seed 3407.
Results
Best checkpoint per run on a fixed 1000-image draw (2000 graded items), with bootstrap standard error. Overall = mean of caption and VQA. In-dom. = the target overhead-imagery subset (491 images); RSICD = the public RSICD remote-sensing benchmark subset (509 images). Sorted by in-domain overall; bold marks the best value in each column.
| Model | In-dom. cap | In-dom. vqa | In-dom. overall | All cap | All vqa | All overall | RSICD cap | RSICD vqa | RSICD overall |
|---|---|---|---|---|---|---|---|---|---|
| Aspaklarya-011 | 81.85 ±0.66 | 83.51 ±1.48 | 82.68 ±0.84 | 79.92 ±0.49 | 75.78 ±1.13 | 77.85 ±0.64 | 78.06 ±0.67 | 68.33 ±1.64 | 73.20 ±0.92 |
| Aspaklarya-001 | 81.84 ±0.66 | 83.23 ±1.44 | 82.54 ±0.81 | 79.97 ±0.48 | 75.94 ±1.12 | 77.95 ±0.63 | 78.17 ±0.69 | 68.89 ±1.66 | 73.53 ±0.93 |
| Aspaklarya-015 | 82.14 ±0.64 | 82.76 ±1.46 | 82.45 ±0.82 | 80.07 ±0.49 | 74.73 ±1.13 | 77.40 ±0.63 | 78.07 ±0.72 | 66.98 ±1.65 | 72.52 ±0.92 |
| Aspaklarya-006 | 81.40 ±0.71 | 82.95 ±1.50 | 82.18 ±0.90 | 79.81 ±0.50 | 75.79 ±1.12 | 77.80 ±0.65 | 78.26 ±0.68 | 68.88 ±1.63 | 73.57 ±0.91 |
| Aspaklarya-005 | 81.37 ±0.67 | 82.37 ±1.50 | 81.87 ±0.85 | 79.55 ±0.49 | 75.74 ±1.11 | 77.64 ±0.62 | 77.79 ±0.71 | 69.35 ±1.65 | 73.57 ±0.93 |
| Aspaklarya-012 | 81.68 ±0.66 | 82.05 ±1.53 | 81.86 ±0.86 | 79.73 ±0.48 | 75.02 ±1.13 | 77.37 ±0.64 | 77.85 ±0.71 | 68.23 ±1.63 | 73.04 ±0.90 |
| Aspaklarya-014 | 81.51 ±0.67 | 81.93 ±1.48 | 81.72 ±0.83 | 79.95 ±0.49 | 74.77 ±1.13 | 77.36 ±0.63 | 78.45 ±0.71 | 67.87 ±1.66 | 73.16 ±0.92 |
| Aspaklarya-003 | 81.23 ±0.71 | 82.18 ±1.47 | 81.71 ±0.85 | 79.55 ±0.49 | 75.52 ±1.12 | 77.53 ±0.63 | 77.92 ±0.66 | 69.10 ±1.66 | 73.51 ±0.91 |
| Aspaklarya-001 (ep5) | 80.60 ±0.72 | 82.25 ±1.49 | 81.42 ±0.84 | 79.30 ±0.50 | 76.17 ±1.12 | 77.73 ±0.63 | 78.05 ±0.69 | 70.31 ±1.64 | 74.18 ±0.91 |
| Aspaklarya-013 | 80.58 ±0.69 | 82.20 ±1.48 | 81.39 ±0.84 | 79.11 ±0.49 | 75.35 ±1.10 | 77.23 ±0.61 | 77.70 ±0.69 | 68.74 ±1.60 | 73.22 ±0.90 |
| Aspaklarya-009 | 80.01 ±0.71 | 82.34 ±1.46 | 81.18 ±0.84 | 78.53 ±0.52 | 75.85 ±1.11 | 77.19 ±0.63 | 77.09 ±0.73 | 69.59 ±1.63 | 73.34 ±0.91 |
| Aspaklarya-008 | 80.62 ±0.74 | 81.42 ±1.51 | 81.02 ±0.86 | 79.82 ±0.50 | 75.40 ±1.12 | 77.61 ±0.63 | 79.05 ±0.65 | 69.60 ±1.62 | 74.33 ±0.89 |
| Aspaklarya-007 | 81.13 ±0.71 | 80.82 ±1.51 | 80.97 ±0.86 | 79.33 ±0.51 | 75.33 ±1.12 | 77.33 ±0.64 | 77.60 ±0.70 | 70.03 ±1.62 | 73.81 ±0.90 |
| Aspaklarya-004 | 80.31 ±0.72 | 81.47 ±1.48 | 80.89 ±0.84 | 78.76 ±0.51 | 75.33 ±1.11 | 77.04 ±0.64 | 77.26 ±0.74 | 69.40 ±1.61 | 73.33 ±0.92 |
| Aspaklarya-002 | 80.70 ±0.72 | 80.63 ±1.51 | 80.67 ±0.85 | 79.36 ±0.50 | 74.33 ±1.13 | 76.85 ±0.64 | 78.07 ±0.71 | 68.25 ±1.63 | 73.16 ±0.92 |
| Aspaklarya-010 | 80.50 ±0.74 | 80.66 ±1.58 | 80.58 ±0.90 | 78.88 ±0.52 | 74.28 ±1.13 | 76.58 ±0.64 | 77.32 ±0.72 | 68.12 ±1.65 | 72.72 ±0.91 |
| in-house reference | 71.88 ±1.23 | 83.62 ±1.49 | 77.75 ±1.02 | 65.18 ±0.83 | 73.34 ±1.13 | 69.26 ±0.74 | 58.72 ±1.09 | 63.44 ±1.62 | 61.08 ±1.02 |
| Qwen3-VL-8B (base) | 68.37 ±0.89 | 58.94 ±1.50 | 63.66 ±0.92 | 65.68 ±0.66 | 56.01 ±1.01 | 60.84 ±0.62 | 63.07 ±0.94 | 53.18 ±1.46 | 58.13 ±0.91 |
Every finetune beats both references overall: +17.1 over the base model and +8.7 over the in-house reference on the full set.
Learning rate at large batch
Aspaklarya-015 gave the best captioning in the table at effective batch 64, but it was trained at 2e-4 — the rate tuned for batch 32. Two follow-ups tested whether the batch-64 recipe was simply under-stepped. Scores below come from a separate 500-image draw used for live checkpoint selection, so they compare only with each other.
| LR at batch 64 | ep 1 | ep 2 | ep 3 | ep 4 | ep 5 | Outcome |
|---|---|---|---|---|---|---|
| 2e-4 (015) | 76.92 | 77.03 | 77.25 | 77.64 | 77.92 | peak at epoch 5 |
| 4e-4 (016) | 77.67 | 76.93 | 76.42 | 76.89 | — | stopped at epoch 4, declining |
| 3e-4 (017) | running |
Linear LR scaling is wrong for LoRA here: 4e-4 peaked at epoch 1 and then lost ground at every later checkpoint, ending below where 2e-4 started. The adapter's effective step size does not follow the full-finetune scaling rule, so raising LR with batch size overshoots rather than compensating.
Error bars
Bootstrap over images, 3000 resamples. Absolute standard error:
| Slice | Caption | VQA | Overall |
|---|---|---|---|
| All (1000 img) | 0.48 | 1.12 | 0.63 |
| In-domain (491) | 0.66 | 1.46 | 0.82 |
| RSICD (509) | 0.69 | 1.64 | 0.91 |
Paired model-vs-model error is smaller because image difficulty cancels: 0.42 overall on the full set, 0.56 in-domain. Use the paired figure for any "A beats B" claim.
Caveat
The top eight runs are statistically tied: every confidence interval against the leader straddles zero. VQA error is ~2.3x caption error, so no finetune-vs-finetune VQA difference in any column is resolvable; only caption gaps and the gaps to the two references are real. Doubling the eval set from 500 to 1000 images did not separate the field, and it reshuffled the order.
Findings
- Optimization is saturated. LR, rank, alpha, dropout, weight decay, gradient clipping, batch geometry, effective batch size (16 / 32 / 64) and LR scaling at large batch were all swept. None beat the noise floor.
- The slices disagree. Ranking by in-domain score almost inverts the RSICD ranking: the top three in-domain models place 11th, 2nd and 16th on the general set. The selected model wins by never being bad anywhere, not by leading any single slice.
- Captioning is the real gain. It improves on every slice, by +14 over the base model and +10 to +19 over the in-house reference.
- The in-domain VQA win is not established. The in-house reference posts the single highest in-domain VQA score in the table; it collapses outside that domain, where it falls below the untuned base model.
- The vision tower matters. Freezing it is the one ablation that consistently hurt.
- Extra QA per image does not help. 4-QA and 6-QA mixtures tie with 2-QA.
- Larger batch trades generality for domain fit. Effective batch 64 gives the best in-domain captioning in the table and the worst RSICD VQA.
- Data is the remaining lever, not hyperparameters.