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. All model repos are private.
Start here
| best in-domain model | Aspaklarya-101-step4500 - MEAN4 76.72 |
| best general model | Aspaklarya-020-step4500 - MEAN4 74.90, but wins 3 slices of 4 |
| best free option | Aspaklarya-106-soup - MEAN4 76.36, no training cost |
| confirmed levers | exactly one: corpus size, and specifically more images |
| closed levers | LoRA rank, LoRA scale, caption loss weight, LR schedule, vision-tower freezing, decoding strategy, input resolution, QA depth, question paraphrasing, hard negatives, teacher distillation, curriculum ordering |
| noise floor | MEAN4 sigma 0.31; per-slice 0.88 / 0.74 / 0.25 / 0.52 |
| current ceiling | 76.72, unmoved since round 1XX |
Nothing has beaten 101-step4500 since it was trained. Three rounds and roughly 30 experiments later it is still the reference, and this page is mostly a record of what does not work. Two published results have been retracted after control errors were found; both retractions are kept visible below rather than edited away.
The programme has run in three rounds. Rounds 0XX and 1XX trained against two different answer styles and are not scored on the same VQA benchmark; round 11X is a set of probes against a replicated control.
| Round 0XX | Round 1XX | Round 11X | |
|---|---|---|---|
| runs | Aspaklarya-001 ... 021 (21, 20 evaluated) | Aspaklarya-101 ... 111 | exp112 ... 120 + 3 controls |
| VQA column | VQA | VQA_1126 | VQA_1126 |
| reference answers | ~4 characters (yes, 3, river) | ~300 characters, grounded reasoning | as 1XX |
| model output | one word | 270-295 characters | as 1XX |
| benchmark | 1,000-image union draw, 2,000 graded items | four-slice seed-1105 draw, 1,991 graded items | same four-slice draw |
| budget | full (4 epochs) | full (4 epochs) | short probe (1 epoch, steps 562/1124) |
| best | Aspaklarya-020-step4500 | Aspaklarya-101-step4500 | none - no arm beat the control |
| repos published | yes | yes | yes, as rejected configurations |
| what it answered | hyperparameters are saturated, data is the lever | verbose supervision is worth +8 on DM VQA; data is still the only lever | six more axes closed; the noise floor was measured properly for the first time |
Round 11X is at the bottom of this page and is the most recent work. If you only read one section, read that one: it contains the sigma measurement that determines which differences on this page are real.
Both rounds are now scored on the same four-slice benchmark, so the MEAN4 column below is comparable across rounds. The legacy and new VQA columns individually are not: The two benchmarks reward opposite answer styles; see Why the legacy score drops below.
The four tables
Everything measured in this programme is in the four tables below. The sections after them are the reasoning, the controls and the caveats; nothing in those sections introduces a number that is not here.
Two rounds, because they answer different questions and are not comparable to each other: round 0XX trained on the one-word VQA column and is scored on terse exact answers, round 1XX trained on the verbose grounded VQA_1126 column. Aspaklarya-020 and Aspaklarya-101 are identical in every hyperparameter - the whole gap between the rounds is answer style, not recipe.
Table 1 - exp0XX settings
| 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 |
| Aspaklarya-018 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 18,864 | bf16 base (no 4-bit) |
| Aspaklarya-019 | 16 / 16 | 0.05 | 2e-4 | linear | trained | 1c + 2q | 18,864 | bf16 base + 011 recipe |
| Aspaklarya-020 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 35,981 | bf16 base + +91% data |
| Aspaklarya-021 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | 35,981 | as 020, 8 epochs not 4 |
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. 4-bit base for runs 001-017, bf16 base from 018 on.
Table 2 - exp0XX evaluation 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-019 | 82.39 ±0.65 | 82.82 ±1.48 | 82.61 ±0.85 | 80.33 ±0.48 | 75.91 ±1.13 | 78.12 ±0.63 | 78.34 ±0.70 | 69.24 ±1.62 | 73.79 ±0.89 |
| Aspaklarya-020 | 82.74 ±0.67 | 82.10 ±1.50 | 82.42 ±0.85 | 81.31 ±0.47 | 76.08 ±1.13 | 78.70 ±0.63 | 79.93 ±0.63 | 70.28 ±1.63 | 75.10 ±0.91 |
| 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-018 | 82.28 ±0.69 | 82.70 ±1.51 | 82.49 ±0.86 | 80.46 ±0.49 | 75.80 ±1.11 | 78.13 ±0.63 | 78.70 ±0.67 | 69.15 ±1.61 | 73.92 ±0.90 |
| 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-021 | 82.14 ±0.70 | 81.93 ±1.53 | 82.03 ±0.88 | 80.93 ±0.48 | 75.41 ±1.13 | 78.17 ±0.65 | 79.76 ±0.64 | 69.12 ±1.65 | 74.44 ±0.92 |
| 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-017 | 81.49 ±0.67 | 81.86 ±1.48 | 81.67 ±0.85 | 79.50 ±0.50 | 75.73 ±1.10 | 77.62 ±0.63 | 77.59 ±0.70 | 69.83 ±1.60 | 73.71 ±0.89 |
| 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. The selected model, Aspaklarya-020, is +17.9 over the base model and +9.4 over the in-house reference on the full set.
Table 3 - exp1XX settings
One row per experiment, stating only what that experiment changed. Rounds 1XX and 11X share a scoring harness and are directly comparable; the 11X runs are 1-epoch screens against a replicated 1-epoch control, the 1XX runs are full 4-epoch budgets.
| Model | Round | r / alpha | LR | Sched | Vision | Per image | Epochs | Items | Change from the reference recipe |
|---|---|---|---|---|---|---|---|---|---|
| Aspaklarya-101 | 1XX | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 4 | 35,979 | reference recipe for this round |
| Aspaklarya-102 | 1XX | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 4 | 18,862 | train split only, half the images |
| Aspaklarya-103 | 1XX | 32 / 32 | 2e-4 | linear | trained | 1c + 2q | 4 | 18,862 | rank 32 |
| Aspaklarya-104 | 1XX | 16 / 32 | 2e-4 | linear | trained | 1c + 2q | 4 | 18,862 | alpha 32 at rank 16 |
| Aspaklarya-105 | 1XX | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 4 | 18,862 | caption loss weight 0.4 |
| Aspaklarya-106 | 1XX | 16 / 16 | - | - | - | - | - | - | LoRA soup of 103 / 104 / 105, no training |
| Aspaklarya-106b | 1XX | 16 / 16 | - | - | - | - | - | - | LoRA soup, alternate mixing weights |
| Aspaklarya-107 | 1XX | 16 / 16 | 1e-4 | cosine | trained | 1c + 2q | 3 | 18,862 | cosine schedule, warmup 0.1 |
| Aspaklarya-108 | 1XX | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 4 | 18,862 | seeds 1234 / 2024 of 102 |
| Aspaklarya-109 | 1XX | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 4 | 35,979 | seed 1234 of 101 |
| Aspaklarya-110 | 1XX | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 4 | 35,979 | seed 2024 of 101 |
| Aspaklarya-111 | 1XX | 16 / 16 | 2e-4 | linear | trained | 2c + 4q | 3 | 71,944 | 2x items from the same images |
| control | 11X | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 1 | 35,979 | 1-epoch control, replicated at 3 seeds |
| Aspaklarya-112 | 11X | 16 / 16 | - | - | - | - | - | - | decoding only on the 101 adapter: beam 4 / temp 0.7 / rep 1.1 |
| Aspaklarya-113 | 11X | 16 / 16 | 2e-4 | linear | frozen | 1c + 2q | 1 | 35,979 | vision tower frozen |
| Aspaklarya-114 | 11X | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 1 | 35,979 | seq 3072, and a variant at max side 1536 |
| Aspaklarya-115 | 11X | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 1 | 35,981 | paraphrased questions, answers untouched |
| Aspaklarya-116 | 11X | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 1 | 37,178 | +1,199 negative / absence examples |
| Aspaklarya-119 | 11X | 16 / 16 | 2e-4 | linear | trained | 1c + 2q | 1 | 35,980 | teacher-rewritten answers |
| Aspaklarya-120 A | 11X | 16 / 16 | 2e-4 | linear | trained | 1c + 0q | 1 | 11,993 | captions only |
| Aspaklarya-120 B | 11X | 16 / 16 | 2e-4 | linear | trained | 0c + 2q | 1 | 23,986 | QA only, resumed from 120 A |
| Aspaklarya-121 vqa | 12X | 16 / 16 | 2e-4 | linear | trained | 0c + 2q | 4 | 23,986 | task-routed expert, VQA side |
| Aspaklarya-121 cap | 12X | 16 / 16 | 2e-4 | linear | trained | 1c + 0q | 4 | 11,993 | task-routed expert, caption side |
Constant across every row above: dropout 0, bf16 base (no 4-bit), effective batch 32 (4 x 8), warmup 0.03, weight decay 0.001, grad clip 0.3, max side 1024, seq len 2048, seed 3407 unless the row says otherwise, LoRA on all linear layers of both towers, VQA_1126 answer column.
Table 4 - exp1XX evaluation results
Best checkpoint per experiment only. Four slices, 500 graded items each (491 for caption in-domain), one fixed draw, judged by gemma-4-31b-it-imiai. MEAN4 is the unweighted mean of the four. The last column is the gap to the 3-seed 1-epoch control mean of 75.52 (replicates 75.71 / 75.34 / 75.50), which is the same reference the individual model cards quote.
The noise floor is sigma = 0.31 MEAN4, measured from three same-config replicates, so a difference under +-0.51 is not a result. Per slice, sigma is VQA in-dom. 0.88, VQA RSICD 0.74, cap in-dom. 0.25, cap RSICD 0.52 - the VQA slices are 3-4x noisier than the caption slices, which is why MEAN4 rather than any single slice is the gate.
| Model | Group | Best ckpt | VQA in-dom. | VQA RSICD | Cap in-dom. | Cap RSICD | MEAN4 | vs control |
|---|---|---|---|---|---|---|---|---|
| in-house reference | baselines | - | 65.26 | 63.59 | 71.91 | 58.58 | 64.84 | -10.68 |
| Qwen3-VL-8B-Instruct | baselines | - | 60.64 | 53.13 | 68.31 | 63.28 | 61.34 | -14.18 |
| Aspaklarya-020 | round 0XX | step 4500 | 66.18 | 70.65 | 82.79 | 79.99 | 74.90 | -0.62 |
| Aspaklarya-101 | round 1XX | step 4500 | 74.16 | 70.56 | 82.53 | 79.64 | 76.72 | +1.20 |
| Aspaklarya-111 | round 1XX | step 4496 | 74.03 | 71.68 | 81.32 | 79.45 | 76.62 | +1.10 |
| Aspaklarya-109 s1234 | round 1XX | step 3540 | 72.84 | 71.31 | 82.49 | 79.62 | 76.56 | +1.04 |
| Aspaklarya-106 | round 1XX | soup | 74.57 | 69.38 | 82.38 | 79.1 | 76.36 | +0.84 |
| Aspaklarya-110 s2024 | round 1XX | step 3540 | 73.68 | 71.01 | 80.99 | 79.32 | 76.25 | +0.73 |
| Aspaklarya-104 | round 1XX | step 2360 | 73.72 | 69.59 | 82.7 | 78.88 | 76.22 | +0.70 |
| Aspaklarya-103 | round 1XX | step 2360 | 74.13 | 69.82 | 81.34 | 79.3 | 76.15 | +0.63 |
| Aspaklarya-108 s2024 | round 1XX | step 2360 | 72.66 | 70.83 | 82.1 | 78.58 | 76.04 | +0.52 |
| Aspaklarya-105 | round 1XX | step 1770 | 74.49 | 68.96 | 81.96 | 78.62 | 76.01 | +0.49 |
| Aspaklarya-106b | round 1XX | soup | 72.77 | 69.99 | 81.53 | 78.73 | 75.75 | +0.23 |
| Aspaklarya-102 | round 1XX | step 1770 | 73.45 | 68.93 | 81.56 | 78.6 | 75.64 | +0.12 |
| Aspaklarya-108 s1234 | round 1XX | step 1770 | 72.24 | 69.38 | 81.06 | 78.25 | 75.23 | -0.29 |
| Aspaklarya-107 | round 1XX | step 1770 | 72.16 | 69.9 | 80.98 | 77.06 | 75.03 | -0.49 |
| control s3407 | replicated control | step 1124 | 73.59 | 69.82 | 80.8 | 78.64 | 75.71 | +0.19 |
| control s2024 | replicated control | step 1124 | 71.87 | 70.99 | 81.29 | 77.87 | 75.50 | -0.02 |
| control s1234 | replicated control | step 1124 | 73.01 | 69.63 | 81.08 | 77.66 | 75.34 | -0.18 |
| Aspaklarya-112 beam4 | round 11X | step 4500 | 75.1 | 68.7 | 82.74 | 79.14 | 76.42 | +0.90 |
| Aspaklarya-114 1536 | round 11X | step 1124 | 73.17 | 70.56 | 80.28 | 78.67 | 75.67 | +0.15 |
| Aspaklarya-114 | round 11X | step 1124 | 73.18 | 70.56 | 80.26 | 78.65 | 75.66 | +0.14 |
| Aspaklarya-112 t0.7 | round 11X | step 4500 | 72.48 | 68.31 | 81.71 | 79.81 | 75.58 | +0.06 |
| Aspaklarya-112 rep | round 11X | step 4500 | 72.19 | 69.64 | 81.7 | 78.53 | 75.52 | +0.00 |
| Aspaklarya-115 | round 11X | step 1125 | 73.57 | 69.18 | 80.52 | 77.92 | 75.30 | -0.22 |
| Aspaklarya-116 | round 11X | step 1162 | 70.85 | 69.64 | 80.5 | 78.44 | 74.86 | -0.66 |
| Aspaklarya-113 | round 11X | step 1124 | 72.37 | 69.52 | 80.25 | 76.97 | 74.78 | -0.74 |
| Aspaklarya-119 | round 11X | step 1124 | 70.97 | 69.52 | 71.88 | 61.95 | 68.58 | -6.94 |
| Aspaklarya-120 B | round 11X | step 375 | 74.4 | 68.62 | 69.13 | 38.35 | 62.62 | -12.90 |
| Aspaklarya-121 vqa | round 12X | training | - | - | - | - | pending | - |
| Aspaklarya-121 cap | round 12X | queued | - | - | - | - | pending | - |
Read the bottom of this table as carefully as the top. Aspaklarya-120 B is the worst MEAN4 in the programme and simultaneously holds the best VQA in-domain score in the programme (75.48, +2.66 over control, 3.0 sigma): it dropped captioning entirely and its caption RSICD collapsed 42 points. That is a direct measurement of the two objectives competing for LoRA capacity, and it is the only effect in round 11X that clears its own noise floor. It is what Aspaklarya-121 is being run to exploit.
Round 0XX - terse answers (Aspaklarya-001 ... 021)
The original 21-experiment programme, trained on the one-word VQA column and scored on the 1,000-image union draw. Everything below this heading refers to that round only.
Setup
| Item | Value |
|---|---|
| Base | Qwen3-VL-8B-Instruct |
| Method | LoRA (Unsloth), bf16 compute; 4-bit base for runs 001-017, bf16 base from 018 on |
| Targets | all linear layers, vision + language towers |
| Data | 6,288 images / 18,864 samples for runs 001-019; 11,994 / 35,981 for 020-021 (1 caption + 2 QA each) |
| 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. For runs 001-017 that merge also removes a train/serve mismatch, since those adapters were fitted on a 4-bit base but are served from bf16 weights; runs 018 onward have no such mismatch.
Configurations
Moved to Table 1 at the top of this page.
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.
Moved to Table 2 at the top of this page.
Every finetune beats both references overall. The selected model, Aspaklarya-020, is +17.9 over the base model and +9.4 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) | 77.00 | 76.56 | 77.16 | 77.68 | 77.86 | peak at epoch 5, stopped at epoch 6 |
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. The intermediate rate 3e-4 traced almost exactly the same curve as 2e-4 and peaked at the same epoch, one tenth of a point lower.
On the shared 1000-image set, neither batch-64 rate beat the reference: 2e-4 is -0.56 overall and -0.09 in-domain, 3e-4 is -0.34 and -0.87. Effective batch 64 is therefore refuted at every learning rate tried, and the loss is consistently in VQA while captioning holds or improves. Together with the batch-16 result this closes the batch-size and learning-rate axes: no hyperparameter lever remains untested, and further gains have to come from the training data.
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.
Applied exhaustively to the five leading checkpoints (020, 018, 019, 001, 011), the paired bootstrap separates 0 of 10 pairs overall and 0 of 10 in-domain at 95% — in-domain every pair sits at p ≥ 0.67. The only significant pairs anywhere are three on the RSICD slice, all of them 020 against another model. The ordering of the results table below the top line is not a measurement.
Caveat
The hyperparameter runs are statistically tied with each other: among runs 001-019, 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, the gaps to the two references, and the data-scaling result of run 020 are real. Doubling the eval set from 500 to 1000 images did not separate the tied field, and it reshuffled its order.
Findings
- Hyperparameters are saturated; data is not. LR, rank, alpha, dropout, weight decay, gradient clipping, batch geometry, effective batch size, LR scaling at large batch and base-weight precision were all swept without beating the noise floor. Adding 91% more training images cleared it on the first attempt.
- The slices disagree — but data breaks the trade. Ranking by in-domain score almost inverts the RSICD ranking, and every hyperparameter lever that moved one slice moved the other the opposite way. Extra data is the exception: it lifted RSICD by 1.57 while leaving in-domain unchanged.
- 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.
- Training in bf16 instead of 4-bit is a small, consistent positive — the only change in the whole sweep that never loses on any slice — but it is still inside the error bar.
- Data is the remaining lever, not hyperparameters — and it is not exhausted: the run that used it had not converged when its schedule ended.
Base-weight precision
Runs 001-017 all trained their adapters against 4-bit quantized base weights, while evaluation and the final merge both use the bf16 base. That is a train/serve mismatch: the adapter was fitted to compensate for quantization error that is absent at inference time.
Runs 018 and 019 repeat the two strongest recipes with the base loaded in bf16 and nothing else changed. Against the reference, paired on 1000 images:
| run | overall | in-domain | RSICD |
|---|---|---|---|
| Aspaklarya-018 | +0.17 ±0.42 | -0.05 ±0.59 | +0.39 ±0.59 |
| Aspaklarya-019 | +0.16 ±0.40 | +0.07 ±0.57 | +0.25 ±0.57 |
These are the first two runs in the sweep to post a positive overall delta, and 018 is the only run that is not worse than the reference on any slice. Both are still well inside the paired error bar (p = 0.34 that each is in fact worse), so neither is promoted.
The mechanism is not the expected one. Removing quantization error should mostly help the harder task, VQA; instead the gain is entirely in captioning (+0.48 and +0.35) while VQA is flat to slightly negative. That is the same caption-up / VQA-flat signature produced by every other lever in the sweep, which suggests precision is acting through the same saturated channel rather than unlocking anything new.
Removing quantization also costs ~9 GB of GPU memory during training (19 GB vs 10 GB), which is a real constraint on a shared 40 GB card.
Training data
Every run up to 017 trained on 6,288 images / 18,864 samples. The source table also carries 5,706 further images that the dataset author left unassigned (Notes == other, RSICD only). They are fully populated, statistically indistinguishable from the assigned training rows, and have zero image-name overlap with either the train or the validation split, so they are safe to train on.
Aspaklarya-020 adds them, taking training data to 11,994 images / 35,981 samples (+91%). Everything else is identical to 018. Paired against the previous selection on the same 1000 images:
| slice | delta | 95% CI | p(worse) |
|---|---|---|---|
| overall | +0.74 ±0.47 | [-0.17, 1.66] | 0.059 |
| in-domain | -0.12 ±0.63 | [-1.37, 1.10] | 0.570 |
| RSICD | +1.57 ±0.68 | [0.22, 2.87] | 0.012 |
| caption (all) | +1.34 ±0.42 | — | — |
This is the first change in the whole programme to clear the error bar. The RSICD interval excludes zero, and the overall caption gain is 3.2 standard errors. It is also the first result that does not trade one slice against the other: in-domain is a clean tie while the general slice moves.
Two further points matter for anyone repeating this:
- The in-domain penalty is transient. At matched optimizer steps the extra data looked actively harmful early — step 2,360 was 1.65 behind on in-domain — and that deficit had vanished by step 4,500. Stopping early would have refuted the best run in the programme.
- The climb to the final checkpoint was schedule, not headroom. Overall score rose at all seven checkpoints including the last, which suggested an unexhausted budget. Aspaklarya-021 tested that directly and refuted it — see below.
More data is therefore the live axis, and the only one still producing movement.
Schedule length
Aspaklarya-021 repeats 020 on the same enlarged corpus with 8 epochs instead of 4 (9,000 steps, checkpoints step-aligned with 020). It peaked at step 4,720 and then declined; the stop rule ended it at step 5,900 with 3,100 steps unspent.
| step | overall | caption | vqa | in-domain |
|---|---|---|---|---|
| 1,180 | 77.66 | 79.19 | 76.12 | 81.56 |
| 2,360 | 78.23 | 80.55 | 75.92 | 81.25 |
| 3,540 | 78.37 | 80.33 | 76.41 | 82.18 |
| 4,720 | 78.69 | 80.86 | 76.52 | 82.39 |
| 5,900 | 77.60 | 80.75 | 74.45 | 81.15 |
Its best checkpoint, paired against 020 on the same 1000 images, is negative on every slice and significant on none: overall -0.53 ±0.43, in-domain -0.39 ±0.60, RSICD -0.66 ±0.64.
Data volume helped; data duration did not. Four epochs is already the right length at this corpus size.
The failure mode is asymmetric and worth recording: at step 5,900 captioning was intact (80.75) while VQA collapsed (76.52 → 74.45). Overtraining this recipe degrades VQA first, so a stop rule watching captioning alone would not catch it.
Status
The hyperparameter search is closed. Rank, alpha, dropout, learning rate, schedule, weight decay, gradient clipping, vision-tower freezing, QA-per-image, caption prompt pool, batch geometry, effective batch size, learning rate at large batch and base-weight precision were all swept across 19 recipes under identical conditions. None displaced the reference recipe by more than the paired error bar.
Batch size and learning rate illustrate that ceiling. Effective batch 16 came in at -0.59 overall, batch 64 at 2e-4 at -0.56, and batch 64 at 3e-4 at -0.34 overall and -0.87 in-domain; batch 64 at 4e-4 was stopped at epoch 4 while declining. In each case captioning held steady or improved while VQA fell.
Enlarging the training set did what none of those could, and training it longer did not extend the gain. That narrows the remaining question to data composition: the corpus added was RSICD-only, and the gain it produced is correspondingly RSICD-only while in-domain stays flat. Additional in-domain imagery is the targeted next step.
Round 1XX - verbose grounded answers (Aspaklarya-101 ... 111)
Why a second round
The 0XX round closed with hyperparameters saturated and data identified as the only live lever. It also left a product problem: every 0XX model answers in one word, because its supervision was one word. yes is a correct answer to "are there any anomalies in the scene?" and a useless one.
The dataset author then supplied a new column, VQA_1126, replacing the terse answers for the in-domain (DM) images with ~300-character grounded answers that name objects, locations and context. The RSICD rows are byte-identical to the old column; only the 5,148 DM rows changed, from a mean of 5.9 characters to ~304.
Configurations
All runs share one corpus recipe - VQA_1126, 1 caption + 2 QA per image - and one optimiser: bf16 base, seed 3407, lr 2e-4, linear schedule, warmup 0.03, weight decay 0.001, grad clip 0.3, effective batch 32 (4 x 8), 4 epochs, max seq 2048, vision tower trained. One variable each.
| Model | variable | split | items / images | cost |
|---|---|---|---|---|
| Aspaklarya-101 | 1.9x data | train,other | 35,979 / 11,994 | 9.8 h |
| Aspaklarya-102 | reference | train | 18,862 / 6,288 | 5.4 h |
| Aspaklarya-103 | LoRA rank 16 -> 32, scale held at 1.0 | train | 18,862 / 6,288 | 5.4 h |
| Aspaklarya-104 | LoRA scale alpha/r 1.0 -> 2.0, rank 16 | train | 18,862 / 6,288 | 5.4 h |
| Aspaklarya-105 | objective balance, w_caption 1.0 -> 0.4 | train | 18,862 / 6,288 | 5.4 h |
| Aspaklarya-106 | LoRA soup of the four epoch-3 adapters | n/a | n/a | 0 h |
| Aspaklarya-107 | cosine schedule, lr 1e-4, warmup 0.10, 3 epochs | train | 18,862 / 6,288 | 3.8 h |
| Aspaklarya-108 | seed replication of 102 (1234, 2024) | train | 18,862 / 6,288 | 2 x 5.4 h |
| Aspaklarya-109 | seed replication of 101 (1234) | train,other | 35,979 / 11,994 | 9.9 h |
| Aspaklarya-110 | seed replication of 101 (2024) | train,other | 35,979 / 11,994 | 11.2 h |
| Aspaklarya-111 | QA depth 2 -> 4 per image, caption 1 -> 2 | train,other | 71,944 / 11,994 | ~16 h |
Hyperparameters in full
Every value actually passed to the trainer, read back from each run's run_config.json. Cells that differ from the Aspaklarya-102 reference are bold - that is the single variable the run was built to test.
| 101 | 102 (ref) | 103 | 104 | 105 | 106 / 106b | 107 | 108 | 109 | 110 | 111 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| split | train,other | train | train | train | train | n/a | train | train | train,other | train,other | train,other |
| QA per image | 2 | 2 | 2 | 2 | 2 | n/a | 2 | 2 | 2 | 2 | 4 |
| captions per image | 1 | 1 | 1 | 1 | 1 | n/a | 1 | 1 | 1 | 1 | 2 |
| items | 35,979 | 18,862 | 18,862 | 18,862 | 18,862 | n/a | 18,862 | 18,862 | 35,979 | 35,979 | 71,944 |
| images | 11,994 | 6,288 | 6,288 | 6,288 | 6,288 | n/a | 6,288 | 6,288 | 11,994 | 11,994 | 11,994 |
| LoRA rank | 16 | 16 | 32 | 16 | 16 | 64 | 16 | 16 | 16 | 16 | 16 |
| LoRA alpha | 16 | 16 | 32 | 32 | 16 | 64 | 16 | 16 | 16 | 16 | 16 |
scale alpha/r | 1.0 | 1.0 | 1.0 | 2.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| LoRA dropout | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | n/a | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| vision tower | trained | trained | trained | trained | trained | trained | trained | trained | trained | trained | trained |
w_caption | 1.0 | 1.0 | 1.0 | 1.0 | 0.4 | n/a | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
w_vqa | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | n/a | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |
| loss weighting | token | token | token | token | token | n/a | token | token | token | token | token |
| epochs | 4 | 4 | 4 | 4 | 4 | n/a | 3 | 4 | 4 | 4 | 3 |
| learning rate | 2e-4 | 2e-4 | 2e-4 | 2e-4 | 2e-4 | n/a | 1e-4 | 2e-4 | 2e-4 | 2e-4 | 2e-4 |
| scheduler | linear | linear | linear | linear | linear | n/a | cosine | linear | linear | linear | linear |
| warmup ratio | 0.03 | 0.03 | 0.03 | 0.03 | 0.03 | n/a | 0.10 | 0.03 | 0.03 | 0.03 | 0.03 |
| weight decay | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 | n/a | 0.001 | 0.001 | 0.001 | 0.001 | 0.001 |
| grad clip | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 | n/a | 0.3 | 0.3 | 0.3 | 0.3 | 0.3 |
| batch x accum | 4 x 8 | 4 x 8 | 4 x 8 | 4 x 8 | 4 x 8 | n/a | 4 x 8 | 4 x 8 | 4 x 8 | 4 x 8 | 4 x 8 |
| effective batch | 32 | 32 | 32 | 32 | 32 | n/a | 32 | 32 | 32 | 32 | 32 |
| max seq length | 2048 | 2048 | 2048 | 2048 | 2048 | n/a | 2048 | 2048 | 2048 | 2048 | 2048 |
| max image side | 1024 | 1024 | 1024 | 1024 | 1024 | n/a | 1024 | 1024 | 1024 | 1024 | 1024 |
| seed | 3407 | 3407 | 3407 | 3407 | 3407 | n/a | 3407 | 1234 / 2024 | 1234 | 2024 | 3407 |
| base precision | bf16 | bf16 | bf16 | bf16 | bf16 | bf16 | bf16 | bf16 | bf16 | bf16 | bf16 |
| save every | 590 | 295 | 295 | 295 | 295 | n/a | 295 | 295 | 590 | 590 | 1124 |
| steps / epoch | 1125 | 590 | 590 | 590 | 590 | n/a | 590 | 590 | 1125 | 1125 | 2249 |
| total steps | 4500 | 2360 | 2360 | 2360 | 2360 | n/a | 1770 | 2360 | 4500 | 4500 | 6747 |
| wall clock | 9.8 h | 5.4 h | 5.4 h | 5.4 h | 5.4 h | 0 h | 3.8 h | 2 x 5.4 h | 9.9 h | 11.2 h | ~16 h |
Constant across the whole round and therefore omitted above: base model Qwen/Qwen3-VL-8B-Instruct, no 4-bit quantisation, VQA column VQA_1126, caption prompts drawn from the 50-query bank, eval-loss probe of 400 held-out items (200 caption / 200 VQA).
Aspaklarya-106 and 106b are not training runs. They are exact LoRA soups: four rank-16 adapters stacked into a single rank-64 adapter, which reproduces the arithmetic mean of the parent weight deltas to within 2.3e-9. 106 averages the epoch-3 parents, 106b the epoch-4 parents. Neither consumed GPU training time; both are listed here so their rank and alpha are not mistaken for a tuned choice.
Aspaklarya-108, 109 and 110 are replications, not new configurations. 108 re-runs 102 at two further seeds; 109 and 110 re-run 101 at one further seed each. They exist to measure the run-to-run spread that every comparison on this card silently assumed was small, and to test whether the one positive result survives a change of seed. They are measurements, not deliverables.
How these are scored
Round-1XX checkpoints were first ranked on the DM VQA slice alone - the slice the round was trained for. Every model in the programme has since been re-judged on one fixed sample drawn with seed 1105, drawn once outside the model loop so all 24 checkpoints see byte-identical items:
| slice | prompt set | new tokens | n |
|---|---|---|---|
| VQA DM | VQA_1126 (verbose) | 160 | 500 |
| VQA RSICD | legacy terse | 48 | 500 |
| Caption DM | caption-query bank | 320 | 491 |
| Caption RSICD | caption-query bank | 320 | 500 |
MEAN4 is the unweighted mean, so a model cannot win by specialising on one slice. Judge: gemma-4-31b-it-imiai, greedy, temperature 0, scored 0-100.
Two caveats on the shape of the benchmark. CAP DM carries 491 items, not 500, because the underlying 500-image sweep drew 491 DM / 509 RSICD. And RSICD VQA has no verbose rewrite - it is still the legacy question set generated at a 48-token budget, which clips verbose answers and penalises the 1XX models there.
Results
One row per experiment: its best checkpoint. Every model is scored on the same 1,991 judged items under the same rubric, so the column is comparable all the way down. The ckpts scored column says how many checkpoints that experiment contributed; the best of n is an order statistic, so it is biased upward by roughly 0.3-0.5 for n=4 and should not be read as that recipe's expected quality. Use it to rank recipes, not to size effects.
For that, and for every individual checkpoint, see Run-to-run sigma below and the full 36-row table in rescore_slices.csv. Seed replicates of one recipe (108, 109, 110) are pooled into a single row here.
| Model | VQA DM | VQA RSICD | CAP DM | CAP RSICD | MEAN4 | ckpts scored |
|---|---|---|---|---|---|---|
| Aspaklarya-101-step4500 | 74.16 | 70.56 | 82.53 | 79.64 | 76.72 | 4 |
| Aspaklarya-109-step3540 | 72.84 | 71.31 | 82.49 | 79.62 | 76.56 | 2 |
| Aspaklarya-106-soup | 74.57 | 69.38 | 82.38 | 79.1 | 76.36 | 1 |
| Aspaklarya-110-step3540 | 73.68 | 71.01 | 80.99 | 79.32 | 76.25 | 2 |
| Aspaklarya-104-step2360 | 73.72 | 69.59 | 82.7 | 78.88 | 76.22 | 4 |
| Aspaklarya-103-step2360 | 74.13 | 69.82 | 81.34 | 79.3 | 76.15 | 4 |
| Aspaklarya-108-step2360 | 72.66 | 70.83 | 82.1 | 78.58 | 76.04 | 4 |
| Aspaklarya-105-step1770 | 74.49 | 68.96 | 81.96 | 78.62 | 76.01 | 4 |
| Aspaklarya-106b-soup | 72.77 | 69.99 | 81.53 | 78.73 | 75.75 | 1 |
| Aspaklarya-102-step1770 | 73.45 | 68.93 | 81.56 | 78.6 | 75.64 | 4 |
| Aspaklarya-107-step1770 | 72.16 | 69.9 | 80.98 | 77.06 | 75.03 | 3 |
| Aspaklarya-020-step4500 | 66.18 | 70.65 | 82.79 | 79.99 | 74.9 | 1 |
| in-house reference | 65.26 | 63.59 | 71.91 | 58.58 | 64.84 | - |
| Qwen3-VL-8B (base) | 60.64 | 53.13 | 68.31 | 63.28 | 61.34 | - |
Run-to-run sigma, measured
The previous version of this card said sigma had never been measured and that no one-point difference should be trusted. That has now been fixed, at the cost of four replication runs.
Aspaklarya-108 re-ran the 102 recipe at seeds 1234 and 2024, changing nothing else. Aspaklarya-109 and 110 did the same for the 101 recipe, at seeds 1234 and 2024. With the two original seed-3407 runs that gives two arms of six scored checkpoints each.
| arm | corpus | checkpoints (MEAN4) | mean | sigma |
|---|---|---|---|---|
train,other (101, 109, 110) | 35,979 | 76.72 · 76.56 · 76.38 · 76.25 · 76.23 · 76.09 | 76.37 | 0.23 |
train (102, 108) | 18,862 | 76.04 · 75.64 · 75.61 · 75.50 · 75.23 · 75.22 | 75.54 | 0.31 |
sigma = 0.31 MEAN4 for a single checkpoint (pooled, the wider arm). Two consequences, and they are not optional:
- A single run targeting less than about 1.0 point cannot be interpreted.
- The difference between two single checkpoints carries SE `0.31 x sqrt(2)
= 0.44`, so a gap needs roughly 0.9 points before it means anything, and 1.3 before it is comfortable.
Re-reading the whole round against that floor:
| contrast | delta MEAN4 | vs SE 0.44 | verdict |
|---|---|---|---|
| data scaling 101/109/110 vs 102/108 | +0.83 | 5.2 SE (arms of 6, SE 0.16) | real |
| LoRA rank 16 -> 32 (103 vs 102, ep4) | +0.54 | 1.2 SE | not resolved |
| LoRA scale 1.0 -> 2.0 (104 vs 102, ep4) | +0.61 | 1.4 SE | not resolved |
objective balance w_caption 0.4 (105 vs 102, ep4) | -0.02 | 0.0 SE | null |
| cosine + lr 1e-4 (107 vs 102, ep3) | -0.61 | 1.4 SE | not resolved, negative |
| LoRA soup vs mean of its parents (106) | +0.32 | 0.7 SE | not resolved |
| LoRA soup vs mean of its parents (106b) | -0.42 | 1.0 SE | not resolved |
Only one row of that table survives. Everything else the round tested is noise at the resolution the budget bought - which is the honest reading, not a disappointing one: five levers were eliminated for 25 GPU-hours.
The two soup rows are worth reading together. 106 beat its parents' average and 106b lost to it, by similar amounts in opposite directions. The defensible claim is therefore that souping returns roughly the average of its parents for zero GPU time, not that it adds anything.
What the round actually bought
Data scaling is the only lever that survived replication. It is also the only one that was replicated - and it was replicated specifically because it was the only candidate worth the GPU time. Three independent seeds of the large-corpus recipe produced six checkpoints spanning 76.09-76.72; six small-corpus checkpoints span 75.22-76.04. The two distributions do not overlap. +0.83 at SE 0.16 is 5.2 SE.
Note what this costs in humility about the original claim: 101's headline was +1.07, measured from one seed against one seed. The replicated estimate is +0.83. The effect is real and the first number was 29% too generous - a clean illustration of why single-seed deltas are quoted here only with a sigma attached.
The hyperparameter contrasts are all unresolved or null. Rank, LoRA scale, objective balance and schedule shape each moved MEAN4 by less than 1.4 SE. None of them is worth a further run at this resolution; resolving a 0.5-point effect would need roughly 6 seeds per arm, or 60 GPU-hours per lever.
Aspaklarya-020, a full round older, still wins three slices of four. It takes VQA RSICD, CAP DM and CAP RSICD, and loses only DM VQA, by 8.0 points. Round 1XX bought specialisation onto the rewritten DM question set, not a better model overall. Part of that 8.0 is real; part is the 48-token legacy harness clipping verbose answers.
The epoch-3 vs epoch-4 question is closed, and the answer is "neither". Across the six replicated large-corpus checkpoints the epoch-3/epoch-4 gap is +0.49, -0.18 and -0.16 depending on seed - it changes sign. Both earlier claims about a best epoch were reading noise.
The corpus is still only 27% spent. ImageTable.csv holds 89,119 QA pairs over 11,994 train+other images, a mean of 7.43 per image, and every run above used 2. Aspaklarya-111 is the first run to spend more of it, raising QA depth to 4 while doubling captions to 2 so the 2:1 VQA:caption ratio - and therefore the objective balance - is held exactly where every previous run had it.
Aspaklarya-106: an exact LoRA soup
Averaging LoRA adapters naively is wrong, because mean(B) @ mean(A) is not mean(B @ A). The parents are instead stacked, so the product reproduces the mean of the weight deltas exactly:
` A_cat = [A_1; ...; A_N] (Nr x k) B_cat = [c_1B_1, ..., c_NB_N] (d x Nr) c_i = (1/N) * (alpha_i/r_i) / (alpha_new/r_new) `
With r_new = alpha_new = 64 the reconstruction is exact - verified against the explicit mean of the parent deltas to 1.9e-9 max absolute error. The trap is Aspaklarya-104, which carries alpha/r = 2.0 while its three siblings carry 1.0: its coefficient must be doubled, and a soup that ignored this would have silently halved that parent's contribution.
It cost zero GPU-hours and lands 2nd of 24.
What is published here, and what is not
This org holds 22 adapter repos: Aspaklarya-101 through 105 at four epoch checkpoints each, Aspaklarya-106-soup, and Aspaklarya-020-step4500 from the previous round. Five of the runs described above have no repo at all - 106b, 107, 108, 109 and 110. That is deliberate, and the reasons differ.
A checkpoint is published when it is a distinct recipe and not strictly dominated by something already here. Both tests have to pass.
| run | published | why not |
|---|---|---|
| 106b (epoch-4 soup) | no | Strictly dominated. Same construction as 106-soup, 0.61 lower (75.75 vs 76.36). Shipping a worse version of a model already here is a trap for whoever downloads it, not an extra option. |
| 107 (cosine, lr 1e-4) | no | Refuted configuration. 75.03 is the lowest MEAN4 in round 1XX. The run did its job - it ruled the gentler schedule out - and that result is a sentence on this page, not 821 MB of weights. |
| 108 (102 at seeds 1234, 2024) | no | Calibration, not a deliverable. |
| 109 (101 at seed 1234) | no | Calibration, not a deliverable. |
| 110 (101 at seed 2024) | no | Calibration, not a deliverable. |
The last three deserve a fuller answer, because they are the ones that produced the most useful result on this page.
108, 109 and 110 are not new recipes. They are the recipes of 102 and 101 re-run with a different random seed and nothing else changed. Their adapters are therefore near-duplicates of adapters already published: same corpus, same rank, same schedule, same everything the config file records. What they produced is not a model, it is a number - sigma 0.31 - and a number belongs in the text, where it now is.
Publishing them would also do active harm. Six more checkpoints spanning 75.22-76.56 would sit in the listing looking like six more options to choose between, and the obvious way to choose would be to take the highest one. That is exactly the mistake the sigma measurement exists to prevent: within an arm, the spread between seeds is the noise, so picking the best seed is selecting on noise and will not reproduce. The honest artifact is the published 101 and 102 adapters plus a stated uncertainty on what they score, not a shelf of lottery tickets.
The cost argument is secondary but real: each adapter is ~821 MB, so the five unpublished runs would add roughly 5 GB of weights that no one should load in preference to what is already here.
Aspaklarya-111 has finished, and it is a null. Its best checkpoint (step 4496) scores 76.62, against the pre-registered bar of roughly 76.8 - the train,other arm mean plus two sigma. It lands inside the arm it was built on (76.37 +/- 0.23, so +0.25 is about 1.1 sigma), which is exactly the case the bar was written to catch. It is therefore not published, on the same reasoning as 108-110.
That is worth stating plainly because 76.62 is the second-highest single number on this page, and the temptation to ship it is precisely the error the sigma measurement exists to prevent. Raising QA depth from 2 to 4 per image did not extend the one confirmed lever.
Caveat
The judge is text-only. It compares an answer against a reference and never sees the image, so it measures agreement with the reference, not verified truth. For a round whose whole premise is longer answers this matters more than it did in round 0XX: the judge can confirm that a model supplies reference-matching content, but not that the content is true of the pixels. Human spot-checks are the only way to close that gap.
The legacy slices also reward a terse style the product no longer wants - the legacy VQA rubric caps a padded-but-correct answer at 89/100 by construction, so a 290-character model cannot reach the top band however accurate it is. That is why the legacy numbers are reported but never used to gate a decision.
Status
- Aspaklarya-101-step4500 is the round reference at MEAN4 76.72, but the
fair description of its recipe is 76.37 +/- 0.23 across three seeds. Any of the six large-corpus checkpoints is a defensible choice; picking the 76.72 one is selecting on noise.
- Aspaklarya-106-soup is 2nd at 76.36 for no training cost, and remains
the better default when GPU time is the constraint - with the caveat above that souping buys the parents' average, not a gain over it.
- Aspaklarya-020-step4500 remains the better general model (3 slices of 4).
Choose a 1XX model only when verbose in-domain VQA is what matters.
- Aspaklarya-106b, 107, 108, 109 and 110 have no adapter repos. See
What is published here, and what is not above - they are either strictly dominated, refuted, or seed replications whose output is a sigma rather than a model.
- QA depth is answered: it does not help. 111 raised QA per image from 2
to 4 and landed inside its own arm. Since 111 adds items but no new images, the train,other gain is better explained by the images it brings than by raw item count.
Round 11X - six axes against a replicated control
Round 1XX ended with one confirmed lever (data scaling) and a warning that single-run deltas below about 1.0 MEAN4 are unreadable. Round 11X was built to test six new axes cheaply, under a short-budget probe (SBP) design: one epoch, checkpoints at steps 562 and 1124, every checkpoint judged on all four slices. Ten jobs ran unattended over three days.
No axis produced a win. That is the headline, and it is not a failed round - six levers were eliminated, and the round also corrected two errors in how this project measures things.
The control had to be rebuilt first
The SBP arms were initially compared against a single control checkpoint that ran a different step grid (590/1180 rather than 562/1124) and a different max-seq-length. That mismatch produced a reported +2.32 VQA_DM gain for the paraphrase arm which does not exist; re-measured against the matched three-seed control the same arm is +1.00, against a VQA_DM sigma of 0.88. The claim is retracted here in full, and so is the recommendation to paraphrase RSICD questions that was built on it.
The lesson generalises past this round: a control must match the treatment on grid, split and budget, or the delta measures the mismatch rather than the treatment. Four-slice reporting did not catch it, because the slicing was right and the baseline was wrong.
Three matched controls were then trained from scratch - identical recipe, seeds 3407 / 1234 / 2024, nothing else varied:
| control | MEAN4 @1124 |
|---|---|
| seed 3407 | 75.71 |
| seed 1234 | 75.34 |
| seed 2024 | 75.50 |
| mean | 75.52 (sd 0.19) |
Those three runs also give, for the first time, a per-slice noise floor - which turns out to matter more than the aggregate one:
| slice | control mean | sd |
|---|---|---|
| VQA_DM | 72.82 | 0.88 |
| VQA_RSICD | 70.15 | 0.74 |
| CAP_DM | 81.06 | 0.25 |
| CAP_RSICD | 78.06 | 0.52 |
The two VQA slices are three to four times noisier than the caption slices. MEAN4 averages that down to 0.19, which is why aggregate deltas look more trustworthy than the slice deltas underneath them. Any single-slice VQA claim below about 1.8 (two sigma) is noise, and several claims made earlier in this project sit under that line.
Results
All arms at the matched 1124 grid point, against control mean 75.52. Bands were pre-registered as WIN >= +0.76, SIGNAL +0.51..+0.76, NULL +/-0.51, HARM <= -0.51.
| arm | axis tested | MEAN4 | delta | verdict |
|---|---|---|---|---|
| control | no treatment | 75.52 | - | baseline |
| 115-para | question paraphrase augmentation | 75.25 | -0.27 | null |
| 111-qa4 | 4 QA per image | 74.96 | -0.56 | harm |
| 116-neg | hard negative examples | 74.86 | -0.66 | harm |
| 113-frz | frozen vision tower | 74.78 | -0.74 | harm |
| 119-teach | teacher-generated captions | 68.58 | -6.94 | severe harm |
| 120-cur | caption -> VQA curriculum | 62.60 | -12.92 | catastrophic |
One caveat on the 111 row, in the spirit of the retraction above: 111 is a 3-epoch run, so its step-1124 checkpoint sits at a different point on the LR schedule than the 1-epoch control's does. That comparison is not clean, and the -0.56 should be read as indicative only. 111's clean result is its full-budget one, reported in the Round 1XX section: 76.62, a null against its own arm. Both readings agree that QA depth did not help, which is why the row is kept rather than dropped.
Nothing beat doing nothing. Two arms are worth reading past the headline number, because their MEAN4 hides the mechanism. All slice deltas below are against the three-seed control mean, with that slice's sigma in brackets.
119-teach replaced reference captions with captions generated by a strong general-purpose model. The damage is concentrated in the caption slices (CAP_RSICD -16.11 [31 sigma], CAP_DM -9.18 [37 sigma]) while the VQA slices lose only -1.85 and -0.63, both around two sigma or less. The teacher writes fluent generic prose and overwrites domain-specific remote-sensing vocabulary; a judge scoring against domain references punishes exactly that. Distillation fails when the teacher lacks the dataset's domain knowledge - it is not a statement about distillation in general, and it does not condemn 115, which only rephrases questions and leaves reference captions intact.
120-cur trained captions first, then VQA only. It produced the best VQA_DM in the entire round - 75.48, or +2.66 (3.0 sigma) - and simultaneously destroyed captioning (CAP_RSICD 78.06 -> 35.55, a 42-point collapse). This is the round's strongest evidence that the joint objective is load-bearing: captioning is not a free passenger on a VQA model, it is actively maintained by the mixed loss, and it unlearns within one phase of being dropped. It is also the only slice-level gain in the round that survives its own noise floor - at a price nobody would pay.
116-neg was predicted to buy VQA assertiveness with hard negatives. It did the opposite: VQA_DM -1.97, VQA_RSICD -0.51, CAP_DM -0.56, with only CAP_RSICD nominally positive at +0.38 (well inside its 0.52 sigma, so: no effect). The predicted mechanism is refuted rather than merely unproven.
115-para, the retracted arm, is worth one more line. Re-measured properly it shows VQA_DM +1.00 - but VQA_DM's sigma is 0.88, so that is 1.1 sigma, and the other three slices are negative. There is no paraphrase effect here in either direction. The original +2.32 was baseline mismatch almost end to end.
Two axes that could not be tested
Decoding (112). Greedy, beam-4, temperature 0.7 and repetition-penalty 1.1 were run against the same checkpoint: 76.72 / 76.42 / 75.58 / 75.52. Greedy wins. The axis is closed, not deferred.
Resolution (114). This one is a negative result about the corpus, not the model. The run was configured with --max-side 1536 and trained faster than baseline, which is impossible if images were being upscaled. Measuring 600 images directly: none exceed 1024 px - they are 224x224 (71%), 896x896 (27%) and 768x768 (2%) - and --max-side only ever downscales. Raising it above the 1024 default is a guaranteed no-op. A real resolution test on this data has to lower the cap, not raise it.
The run was allowed to finish anyway, because its configuration made it the missing SBP-native control - and that accident paid for itself twice over.
Hyperparameters
Every arm in this round shares one SBP recipe and changes exactly one thing. The shared recipe:
| field | value |
|---|---|
| base | Qwen/Qwen3-VL-8B-Instruct (bf16, not 4-bit) |
| LoRA r / alpha / dropout | 16 / 16 / 0.0 |
| vision tower | trained |
| epochs | 1.0 |
| lr / scheduler / warmup | 2e-4 / linear / 0.03 |
| batch x grad-accum | 4 x 8 (effective 32) |
| weight decay / grad clip | 0.001 / 0.3 |
| max seq length | 2048 |
| max side | 1024 |
| split | train,other (11,994 images -> 35,979 items) |
| per image | 2 QA + 1 caption |
| loss weighting | token, caption and VQA both 1.0 |
| checkpoints | step 562 and step 1124 |
And the single change per arm:
| arm | the one change |
|---|---|
| control | none (seeds 3407 / 1234 / 2024) |
| 113-frz | finetune_vision = 0 |
| 115-para | source CSV -> paraphrased questions (35,981 items) |
| 116-neg | source CSV -> hard negatives added (37,178 items) |
| 119-teach | source CSV -> teacher captions (35,980 items) |
| 120-cur | captions_per_image = 0, initialised from the caption-phase adapter |
| 111-qa4 | qa_per_image = 4, captions_per_image = 2, 3 epochs (full budget, not SBP) |
| 112-dec | no training - decoding sweep on an existing checkpoint |
| 114-res | max_seq_length = 3072, max_side = 1536 (both no-ops; see below) |
Only the best checkpoint of each run is reported, here and in the table above. Intermediate checkpoints exist but are not quoted, because picking the best of several grid points and then quoting it as a result is the same selection bias the sigma bands exist to control - the bar was raised accordingly rather than the practice hidden.
Sigma, corrected again
The resolution no-op generated the same checkpoint twice under two different flags, giving two independent generate-and-judge passes over effectively identical weights: 75.66 vs 75.67, every slice within 0.02.
Judge reproducibility is therefore ~0.01 MEAN4 - effectively deterministic. That refutes an earlier hypothesis on this page that sigma 0.31 might be partly judge drift across invocations. It is not. Cross -invocation comparisons in the results table are safe.
A second accident sharpened it further. One control run was killed by an out-of-memory event at 87% - a neighbouring job on the shared A100 took 20 GB - and was re-run from scratch at the same seed. The two step-562 checkpoints, same seed and same data order, score 74.36 and 74.66: a 0.30 spread with the seed held fixed.
So sigma is not mostly seed variance, as assumed after the previous correction. A large share is irreducible run-to-run nondeterminism from non-deterministic CUDA kernels. Two practical consequences:
- The 0.31 band stands, and is if anything well calibrated.
- Exact replication is unattainable even holding the seed. No delta under
roughly 0.5 should be believed from a single pair of runs, however carefully the configuration is matched.
The max-seq-length confound inherited from the old control was also settled empirically: 2048 vs 3072 at the same seed gives 75.71 vs 75.66, a 0.05 difference. Inert, as the token arithmetic predicted - an 896 px image is about 784 vision tokens, so a 2048 budget is rarely the binding constraint.
What is published from this round
Every trained arm of this round now has an adapter repo, and every one of them is labelled on its own card as a rejected configuration. The three controls are not published, and neither are 112 or the 1536 variant of 114 - those changed decoding or input resolution only and reuse an existing adapter, so there are no distinct weights to publish.
This reverses the earlier policy on this page, so the earlier argument is restated rather than deleted: an adapter repo was treated as a claim that a configuration is worth using, and on that reading publishing a refuted recipe makes the org a dump of artefacts. The counter-argument won. A negative result that cannot be re-examined is worth less than one that can, and someone repeating this programme should be able to load 119 and see the caption collapse for themselves rather than take this page's word for it. The claim now lives in the card text, not in the existence of the repo.
The same reasoning applied to the round-1XX tail, which had also never been pushed: 107, 108, 109, 110 and 111 now have repos too.
What has not changed is the standing rule that no result is recommended off a one-epoch probe. A win in the SBP grid earns a full-budget confirmation run before anything is called a model to use. No arm produced a win, so nothing here is recommended - the repos are evidence, not recommendations.
The round's deliverables are a replicated control (75.52 +/- 0.19), a per-slice noise floor, six closed axes, a corrected sigma, one retracted result, and roughly 30 GPU-hours spent establishing that none of it improves the model.
Status after Round 11X
- Nothing on this org changed. Aspaklarya-101-step4500 (76.37 +/- 0.23
across seeds) remains the in-domain reference; Aspaklarya-020-step4500 remains the better general model; Aspaklarya-106-soup remains the cheap default. Round 11X added no model and removed none.
- One confirmed lever, total, across both rounds: data scale. Nine other
axes have now been tested and closed - rank, loss weighting, decoding, vision-tower freezing, resolution, QA depth, paraphrase augmentation, hard negatives, teacher distillation and curriculum ordering.
- The measurement apparatus is the part that improved. Round 11X ends
with a three-seed control, a per-slice noise floor, judge reproducibility pinned at ~0.01, and a demonstration that same-seed reruns still differ by 0.30. Future deltas on this page are readable in a way earlier ones were not.
- **Two results elsewhere on this page are retracted or corrected by this
round** - the paraphrase gain, and the judge-drift explanation of sigma. Both are left visible above rather than quietly edited out.