etzion commited on
Commit
fd297e7
·
verified ·
1 Parent(s): 0448533

org card: per-experiment hyperparameters and VQA/caption results

Browse files
Files changed (2) hide show
  1. README.md +200 -13
  2. index.html +143 -13
README.md CHANGED
@@ -7,11 +7,38 @@ sdk: static
7
  pinned: false
8
  ---
9
 
10
- # Aspaklarya — Qwen3-VL-8B for remote-sensing VQA + captioning
11
 
12
- LoRA finetunes of **Qwen3-VL-8B-Instruct**, trained jointly on **visual question answering** and **image captioning** over overhead imagery. 21 experiments, 20 of them evaluated (016 was aborted before any checkpoint). All model repos are private.
 
 
13
 
14
- ## Setup
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  | Item | Value |
17
  |---|---|
@@ -26,7 +53,7 @@ LoRA finetunes of **Qwen3-VL-8B-Instruct**, trained jointly on **visual question
26
 
27
  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.
28
 
29
- ## Configurations
30
 
31
  | Model | r / alpha | Dropout | LR | Sched | Vision | Per image | Items | Change |
32
  |---|---|---|---|---|---|---|---|---|
@@ -54,7 +81,7 @@ Winners are merged into the bf16 base and re-validated. For runs 001-017 that me
54
 
55
  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.
56
 
57
- ## Results
58
 
59
  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**.
60
 
@@ -85,7 +112,7 @@ Best checkpoint per run on a fixed 1000-image draw (2000 graded items), with boo
85
  | 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 |
86
 
87
  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.
88
- ## Learning rate at large batch
89
 
90
  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.
91
 
@@ -99,7 +126,7 @@ Linear LR scaling is **wrong** for LoRA here: 4e-4 peaked at epoch 1 and then lo
99
 
100
  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.
101
 
102
- ## Error bars
103
 
104
  Bootstrap over images, 3000 resamples. Absolute standard error:
105
 
@@ -113,11 +140,11 @@ Paired model-vs-model error is smaller because image difficulty cancels: **0.42*
113
 
114
  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.**
115
 
116
- ## Caveat
117
 
118
  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.
119
 
120
- ## Findings
121
 
122
  - **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.
123
  - **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.
@@ -129,7 +156,7 @@ The hyperparameter runs are statistically tied with each other: among runs 001-0
129
  - **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.
130
  - **Data is the remaining lever**, not hyperparameters — and it is not exhausted: the run that used it had not converged when its schedule ended.
131
 
132
- ## Base-weight precision
133
 
134
  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.
135
 
@@ -146,7 +173,7 @@ The mechanism is not the expected one. Removing quantization error should mostly
146
 
147
  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.
148
 
149
- ## Training data
150
 
151
  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.
152
 
@@ -168,7 +195,7 @@ Two further points matter for anyone repeating this:
168
 
169
  More data is therefore the live axis, and the only one still producing movement.
170
 
171
- ## Schedule length
172
 
173
  **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.
174
 
@@ -186,10 +213,170 @@ Its best checkpoint, paired against 020 on the same 1000 images, is negative on
186
 
187
  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.
188
 
189
- ## Status
190
 
191
  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.
192
 
193
  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.
194
 
195
  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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  pinned: false
8
  ---
9
 
10
+ # Aspaklarya - Qwen3-VL-8B for remote-sensing VQA + captioning
11
 
12
+ LoRA finetunes of **Qwen3-VL-8B-Instruct**, trained jointly on **visual
13
+ question answering** and **image captioning** over overhead imagery. All model
14
+ repos are private.
15
 
16
+ The programme has run in **two rounds against two different answer styles**.
17
+ They are not comparable to each other and are not scored on the same
18
+ benchmark.
19
+
20
+ | | Round 0XX | Round 1XX |
21
+ |---|---|---|
22
+ | runs | Aspaklarya-001 ... 021 (21, 20 evaluated) | Aspaklarya-101, 102 |
23
+ | VQA column | `VQA` | `VQA_1126` |
24
+ | reference answers | ~4 characters (`yes`, `3`, `river`) | ~300 characters, grounded reasoning |
25
+ | model output | one word | 270-295 characters |
26
+ | benchmark | 1,000-image union draw, 2,000 graded items | 982 questions over 491 in-domain images |
27
+ | best | Aspaklarya-020-step4500 | Aspaklarya-102-step1770 |
28
+ | what it answered | hyperparameters are saturated, data is the lever | verbose supervision is worth +8, extra data is not |
29
+
30
+ **Scores from the two rounds must never be ranked against each other.** The
31
+ two benchmarks reward opposite answer styles; see *Why the legacy score
32
+ drops* below.
33
+
34
+
35
+ ## Round 0XX - terse answers (Aspaklarya-001 ... 021)
36
+
37
+ The original 21-experiment programme, trained on the one-word `VQA`
38
+ column and scored on the 1,000-image union draw. Everything below this
39
+ heading refers to that round only.
40
+
41
+ ### Setup
42
 
43
  | Item | Value |
44
  |---|---|
 
53
 
54
  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.
55
 
56
+ ### Configurations
57
 
58
  | Model | r / alpha | Dropout | LR | Sched | Vision | Per image | Items | Change |
59
  |---|---|---|---|---|---|---|---|---|
 
81
 
82
  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.
83
 
84
+ ### Results
85
 
86
  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**.
87
 
 
112
  | 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 |
113
 
114
  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.
115
+ ### Learning rate at large batch
116
 
117
  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.
118
 
 
126
 
127
  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.
128
 
129
+ ### Error bars
130
 
131
  Bootstrap over images, 3000 resamples. Absolute standard error:
132
 
 
140
 
141
  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.**
142
 
143
+ ### Caveat
144
 
145
  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.
146
 
147
+ ### Findings
148
 
149
  - **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.
150
  - **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.
 
156
  - **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.
157
  - **Data is the remaining lever**, not hyperparameters — and it is not exhausted: the run that used it had not converged when its schedule ended.
158
 
159
+ ### Base-weight precision
160
 
161
  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.
162
 
 
173
 
174
  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.
175
 
176
+ ### Training data
177
 
178
  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.
179
 
 
195
 
196
  More data is therefore the live axis, and the only one still producing movement.
197
 
198
+ ### Schedule length
199
 
200
  **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.
201
 
 
213
 
214
  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.
215
 
216
+ ### Status
217
 
218
  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.
219
 
220
  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.
221
 
222
  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.
223
+
224
+
225
+ ## Round 1XX - verbose grounded answers (Aspaklarya-101, 102)
226
+
227
+ ### Why a second round
228
+
229
+ The 0XX round closed with hyperparameters saturated and data identified as
230
+ the only live lever. It also left a product problem: every 0XX model answers
231
+ in one word, because its supervision was one word. `yes` is a correct answer
232
+ to *"are there any anomalies in the scene?"* and a useless one.
233
+
234
+ The dataset author then supplied a new column, **`VQA_1126`**, replacing the
235
+ terse answers for the in-domain (DM) images with ~300-character grounded
236
+ answers that name objects, locations and context. The RSICD rows are
237
+ byte-identical to the old column; only the 5,148 DM rows changed, from a mean
238
+ of 5.9 characters to ~304.
239
+
240
+ Round 1XX trains on that column and is evaluated on a new benchmark built
241
+ from it: **982 questions over 491 in-domain images**, frozen, same draw for
242
+ every model.
243
+
244
+ ### Configurations
245
+
246
+ Both runs use the Aspaklarya-020 recipe unchanged. The **only** variable
247
+ between them is corpus size.
248
+
249
+ | Model | r / alpha | Dropout | LR | Sched | Vision | Per image | Split | Items | Images |
250
+ |---|---|---|---|---|---|---|---|---|---|
251
+ | Aspaklarya-101 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | `train,other` | 35,979 | 11,994 |
252
+ | Aspaklarya-102 | 16 / 16 | 0.0 | 2e-4 | linear | trained | 1c + 2q | `train` | 18,862 | 6,288 |
253
+
254
+ Constant: bf16 base (no 4-bit), effective batch 32 (4 x 8), 4 epochs, warmup
255
+ 0.03, weight decay 0.001, grad clip 0.3, max seq 2048, seed 3407. 101 ran
256
+ 588 min / 4,500 steps; 102 ran ~320 min / 2,360 steps.
257
+
258
+ ### Results
259
+
260
+ LLM-as-judge (`gemma-4-31b-it-imiai`), greedy, 160 new tokens, 982 items.
261
+ `new` is the VQA_1126 benchmark; `legacy` is the old 2,000-item union draw
262
+ carried over from round 0XX for continuity. **Bold marks the best value.**
263
+
264
+ | Model | new | 95% CI | correct (0-5) | concise (0-2) | chars | legacy combined |
265
+ |---|---|---|---|---|---|---|
266
+ | **Aspaklarya-102-step1770** | **74.30** | (71.9, 76.5) | 3.740 | 1.695 | 272 | 74.84 |
267
+ | Aspaklarya-101-step3540 | 74.15 | (71.9, 76.4) | **3.760** | 1.600 | 291 | 75.37 |
268
+ | Aspaklarya-101-step1180 | 74.14 | (71.9, 76.3) | 3.693 | 1.703 | 273 | 74.73 |
269
+ | Aspaklarya-101-step4500 | 74.02 | (71.9, 76.1) | 3.747 | 1.620 | 294 | **75.66** |
270
+ | Aspaklarya-102-step2360 | 73.68 | (71.5, 75.9) | 3.718 | 1.643 | 285 | 74.79 |
271
+ | Aspaklarya-102-step590 | 72.98 | (70.7, 75.2) | 3.675 | 1.663 | 282 | 73.70 |
272
+ | Aspaklarya-101-step2360 | 72.44 | (70.2, 74.6) | 3.655 | 1.634 | 282 | 75.26 |
273
+ | Aspaklarya-102-step1180 | 72.44 | (70.1, 74.7) | 3.637 | 1.675 | 277 | 74.25 |
274
+ | Aspaklarya-011 (0XX) | 66.40 | (64.1, 68.7) | 3.225 | **2.000** | 4.4 | - |
275
+ | Aspaklarya-020 (0XX) | 66.05 | (63.8, 68.2) | 3.200 | **2.000** | 4.1 | 78.83 |
276
+ | in-house reference | 64.78 | (62.5, 67.2) | 3.130 | **2.000** | 4.2 | - |
277
+ | Qwen3-VL-8B (base) | 60.24 | (58.2, 62.3) | 3.346 | 0.634 | 674 | - |
278
+
279
+ **Verbose supervision is worth about +8 points** over the best 0XX model on
280
+ the new benchmark, with non-overlapping confidence intervals. It is the
281
+ second change in the whole programme to clear the error bar.
282
+
283
+ The stock base model was **re-baselined at 160 new tokens** for this round.
284
+ At the 48-token budget used earlier it scored 53.84, which was a truncation
285
+ artefact; the honest figure is 60.24 and the honest lead over it is +14, not
286
+ +20.
287
+
288
+ ### Data volume does not matter here
289
+
290
+ 101 and 102 differ only in corpus size: 35,979 items over 11,994 images
291
+ versus 18,862 over 6,288. Best checkpoints land at **74.30 vs 74.15** -
292
+ statistically identical, with 102 nominally ahead on half the data and half
293
+ the GPU time.
294
+
295
+ This **does not contradict** the 0XX data-scaling result. The data added in
296
+ both cases is the `other` split, which is RSICD-only, and the round-1XX
297
+ benchmark is in-domain-only. Extra RSICD images lifted the RSICD slice in
298
+ round 0XX and are invisible here. For a DM-targeted product, the larger
299
+ corpus buys nothing.
300
+
301
+ ### Four epochs are three too many
302
+
303
+ Scores by epoch on the new benchmark:
304
+
305
+ | run | ep 1 | ep 2 | ep 3 | ep 4 |
306
+ |---|---|---|---|---|
307
+ | Aspaklarya-101 | 74.14 | 72.44 | 74.15 | 74.02 |
308
+ | Aspaklarya-102 | 72.98 | 72.44 | 74.30 | 73.68 |
309
+
310
+ Both curves are flat from the first epoch, and every point sits inside every
311
+ other point's interval. The format is learned almost immediately and the
312
+ remaining epochs are noise. **One epoch would have produced the same model**
313
+ for a quarter of the cost - about 7 GPU-hours per run are being spent on
314
+ nothing.
315
+
316
+ ### Why the legacy score drops
317
+
318
+ Every 1XX model scores ~75 on the legacy benchmark against Aspaklarya-020's
319
+ 78.83. That is **not a capability regression**. Per-axis, at matched steps:
320
+
321
+ | benchmark | model | correct (0-5) | conciseness (0-2) | overall |
322
+ |---|---|---|---|---|
323
+ | legacy (4-char refs) | Aspaklarya-020 | 3.710 | **2.000** | 76.25 |
324
+ | legacy | Aspaklarya-101 | 3.700 | 1.405 | 70.28 |
325
+ | new (300-char refs) | Aspaklarya-020 | 3.200 | **2.000** | 66.05 |
326
+ | new | Aspaklarya-101 | **3.747** | 1.620 | 74.02 |
327
+
328
+ On the legacy set the two models are **tied on correctness** (3.700 vs
329
+ 3.710) and the entire gap is the conciseness axis. The legacy rubric caps a
330
+ padded-but-correct answer at 89/100 by construction, so a 290-character model
331
+ cannot reach the top band however accurate it is. Captioning, which has long
332
+ references, is unaffected (81.03 vs 81.42).
333
+
334
+ On the new set the asymmetry does **not** reverse: Aspaklarya-020 still
335
+ scores a perfect 2.000 conciseness, so it wins the format axis on both
336
+ benchmarks and loses by 8 anyway - on the axis whose rubric explicitly states
337
+ that verbosity is irrelevant.
338
+
339
+ ### Detail-prompt ablation
340
+
341
+ To rule out the alternative explanation - that the 0XX models had the content
342
+ and were merely withholding it - both terse models were re-run on the 982
343
+ questions with an explicit *"answer in detail"* instruction appended.
344
+
345
+ | model | prompt | chars | correct (0-5) | new overall |
346
+ |---|---|---|---|---|
347
+ | Aspaklarya-020 | normal | 4.1 | 3.200 | 66.05 |
348
+ | Aspaklarya-020 | detail | 112.3 | 3.249 | 65.31 |
349
+ | in-house reference | normal | 4.2 | 3.130 | 64.78 |
350
+ | in-house reference | detail | 6.9 | 3.026 | 62.97 |
351
+
352
+ Aspaklarya-020 complied - 4 to 112 characters - and its correctness did not
353
+ move. The verbosity was elicitable; the content was not there to elicit. The
354
+ in-house reference ignored the instruction almost entirely, which confirms
355
+ the prompt is not doing the work.
356
+
357
+ Qualitatively, on *"are there any anomalies in the scene?"*: prompted for
358
+ detail, Aspaklarya-020 produces 450 characters of generic scene description
359
+ that never names an anomaly, while Aspaklarya-101 identifies a specific
360
+ bright irregular object and says why it is out of place.
361
+
362
+ **The round-1XX lead is substantive and the legacy dip is cosmetic.**
363
+
364
+ ### Caveat
365
+
366
+ The judge is **text-only**. It compares an answer against a reference and
367
+ never sees the image, so it measures agreement with the reference, not
368
+ verified truth. For a round whose whole premise is longer answers, this
369
+ matters more than it did in round 0XX: the judge can confirm that a model
370
+ supplies reference-matching content, but not that the content is true of the
371
+ pixels. Human spot-checks are the only way to close that gap.
372
+
373
+ ### Status
374
+
375
+ - **Aspaklarya-102-step1770 is the round reference** - equal-best score, half
376
+ the corpus, half the training time.
377
+ - The legacy benchmark should be treated as **deprecated for this line**. It
378
+ encodes a terse answer style the product no longer wants, and no single
379
+ model can lead both benchmarks.
380
+ - Open levers: one-epoch training at a quarter of the cost, in-domain data
381
+ volume (as opposed to RSICD volume), and a LoRA soup over the eight tied
382
+ adapters.
index.html CHANGED
@@ -37,9 +37,26 @@ a { color: #0969da; }
37
  </head>
38
  <body>
39
  <main>
40
- <h1>Aspaklarya — Qwen3-VL-8B for remote-sensing VQA + captioning</h1>
41
- <p>LoRA finetunes of <strong>Qwen3-VL-8B-Instruct</strong>, trained jointly on <strong>visual question answering</strong> and <strong>image captioning</strong> over overhead imagery. 21 experiments, 20 of them evaluated (016 was aborted before any checkpoint). All model repos are private.</p>
42
- <h2>Setup</h2>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
44
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Item</th>
45
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Value</th>
@@ -54,7 +71,7 @@ a { color: #0969da; }
54
  <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">References</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">stock Qwen3-VL-8B, plus an in-house finetuned model</td></tr>
55
  </tbody></table>
56
  <p>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.</p>
57
- <h2>Configurations</h2>
58
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
59
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Model</th>
60
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">r / alpha</th>
@@ -89,7 +106,7 @@ a { color: #0969da; }
89
  <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-021</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">16 / 16</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">0.0</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">2e-4</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">linear</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">trained</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1c + 2q</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>35,981</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">as 020, <strong>8 epochs</strong> not 4</td></tr>
90
  </tbody></table>
91
  <p>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.</p>
92
- <h2>Results</h2>
93
  <p>Best checkpoint per run on a fixed 1000-image draw (2000 graded items), with bootstrap standard error. <strong>Overall</strong> = mean of caption and VQA. <strong>In-dom.</strong> = the target overhead-imagery subset (491 images); <strong>RSICD</strong> = the public RSICD remote-sensing benchmark subset (509 images). Sorted by in-domain overall; <strong>bold marks the best value in each column</strong>.</p>
94
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
95
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Model</th>
@@ -128,7 +145,7 @@ a { color: #0969da; }
128
  <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Qwen3-VL-8B (base)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">68.37 ±0.89</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">58.94 ±1.50</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">63.66 ±0.92</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">65.68 ±0.66</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">56.01 ±1.01</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">60.84 ±0.62</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">63.07 ±0.94</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">53.18 ±1.46</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">58.13 ±0.91</td></tr>
129
  </tbody></table>
130
  <p>Every finetune beats both references overall. The selected model, Aspaklarya-020, is <strong>+17.9</strong> over the base model and <strong>+9.4</strong> over the in-house reference on the full set.</p>
131
- <h2>Learning rate at large batch</h2>
132
  <p>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.</p>
133
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
134
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">LR at batch 64</th>
@@ -145,7 +162,7 @@ a { color: #0969da; }
145
  </tbody></table>
146
  <p>Linear LR scaling is <strong>wrong</strong> 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&#x27;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.</p>
147
  <p>On the shared 1000-image set, neither batch-64 rate beat the reference: 2e-4 is <strong>-0.56</strong> overall and <strong>-0.09</strong> in-domain, 3e-4 is <strong>-0.34</strong> and <strong>-0.87</strong>. 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: <strong>no hyperparameter lever remains untested</strong>, and further gains have to come from the training data.</p>
148
- <h2>Error bars</h2>
149
  <p>Bootstrap over images, 3000 resamples. Absolute standard error:</p>
150
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
151
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Slice</th>
@@ -159,9 +176,9 @@ a { color: #0969da; }
159
  </tbody></table>
160
  <p>Paired model-vs-model error is smaller because image difficulty cancels: <strong>0.42</strong> overall on the full set, <strong>0.56</strong> in-domain. Use the paired figure for any &quot;A beats B&quot; claim.</p>
161
  <p>Applied exhaustively to the five leading checkpoints (020, 018, 019, 001, 011), the paired bootstrap separates <strong>0 of 10 pairs overall and 0 of 10 in-domain</strong> 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. <strong>The ordering of the results table below the top line is not a measurement.</strong></p>
162
- <h2>Caveat</h2>
163
  <p>The hyperparameter runs are statistically tied with each other: among runs 001-019, every confidence interval against the leader straddles zero. <strong>VQA error is ~2.3x caption error</strong>, 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.</p>
164
- <h2>Findings</h2>
165
  <ul>
166
  <li><strong>Hyperparameters are saturated; data is not.</strong> 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.</li>
167
  <li><strong>The slices disagree — but data breaks the trade.</strong> 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.</li>
@@ -173,7 +190,7 @@ a { color: #0969da; }
173
  <li><strong>Training in bf16 instead of 4-bit is a small, consistent positive</strong> — the only change in the whole sweep that never loses on any slice — but it is still inside the error bar.</li>
174
  <li><strong>Data is the remaining lever</strong>, not hyperparameters — and it is not exhausted: the run that used it had not converged when its schedule ended.</li>
175
  </ul>
176
- <h2>Base-weight precision</h2>
177
  <p>Runs 001-017 all trained their adapters against <strong>4-bit quantized</strong> base weights, while evaluation and the final merge both use the <strong>bf16</strong> base. That is a train/serve mismatch: the adapter was fitted to compensate for quantization error that is absent at inference time.</p>
178
  <p>Runs <strong>018</strong> and <strong>019</strong> repeat the two strongest recipes with the base loaded in bf16 and nothing else changed. Against the reference, paired on 1000 images:</p>
179
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
@@ -188,7 +205,7 @@ a { color: #0969da; }
188
  <p>These are the first two runs in the sweep to post a positive overall delta, and <strong>018</strong> 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.</p>
189
  <p>The mechanism is not the expected one. Removing quantization error should mostly help the harder task, VQA; instead the gain is <strong>entirely in captioning</strong> (+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.</p>
190
  <p>Removing quantization also costs <strong>~9 GB of GPU memory</strong> during training (19 GB vs 10 GB), which is a real constraint on a shared 40 GB card.</p>
191
- <h2>Training data</h2>
192
  <p>Every run up to 017 trained on 6,288 images / 18,864 samples. The source table also carries <strong>5,706 further images</strong> that the dataset author left unassigned (<code>Notes == other</code>, RSICD only). They are fully populated, statistically indistinguishable from the assigned training rows, and have <strong>zero image-name overlap with either the train or the validation split</strong>, so they are safe to train on.</p>
193
  <p><strong>Aspaklarya-020</strong> adds them, taking training data to 11,994 images / 35,981 samples (<strong>+91%</strong>). Everything else is identical to 018. Paired against the previous selection on the same 1000 images:</p>
194
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
@@ -209,7 +226,7 @@ a { color: #0969da; }
209
  <li><strong>The climb to the final checkpoint was schedule, not headroom.</strong> Overall score rose at all seven checkpoints including the last, which suggested an unexhausted budget. <strong>Aspaklarya-021 tested that directly and refuted it</strong> — see below.</li>
210
  </ul>
211
  <p>More data is therefore the live axis, and the only one still producing movement.</p>
212
- <h2>Schedule length</h2>
213
  <p><strong>Aspaklarya-021</strong> repeats 020 on the same enlarged corpus with <strong>8 epochs instead of 4</strong> (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.</p>
214
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
215
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">step</th>
@@ -227,10 +244,123 @@ a { color: #0969da; }
227
  <p>Its best checkpoint, paired against 020 on the same 1000 images, is negative on every slice and significant on none: overall <strong>-0.53 ±0.43</strong>, in-domain <strong>-0.39 ±0.60</strong>, RSICD <strong>-0.66 ±0.64</strong>.</p>
228
  <p><strong>Data volume helped; data duration did not.</strong> Four epochs is already the right length at this corpus size.</p>
229
  <p>The failure mode is asymmetric and worth recording: at step 5,900 <strong>captioning was intact (80.75) while VQA collapsed (76.52 → 74.45)</strong>. Overtraining this recipe degrades VQA first, so a stop rule watching captioning alone would not catch it.</p>
230
- <h2>Status</h2>
231
  <p>The <strong>hyperparameter</strong> 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.</p>
232
  <p>Batch size and learning rate illustrate that ceiling. Effective batch 16 came in at <strong>-0.59</strong> overall, batch 64 at 2e-4 at <strong>-0.56</strong>, and batch 64 at 3e-4 at <strong>-0.34</strong> overall and <strong>-0.87</strong> 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.</p>
233
  <p>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 <strong>data composition</strong>: 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.</p>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  </main>
235
  </body>
236
  </html>
 
37
  </head>
38
  <body>
39
  <main>
40
+ <h1>Aspaklarya - Qwen3-VL-8B for remote-sensing VQA + captioning</h1>
41
+ <p>LoRA finetunes of <strong>Qwen3-VL-8B-Instruct</strong>, trained jointly on <strong>visual question answering</strong> and <strong>image captioning</strong> over overhead imagery. All model repos are private.</p>
42
+ <p>The programme has run in <strong>two rounds against two different answer styles</strong>. They are not comparable to each other and are not scored on the same benchmark.</p>
43
+ <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
44
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap"></th>
45
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Round 0XX</th>
46
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Round 1XX</th>
47
+ </tr></thead><tbody>
48
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">runs</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-001 ... 021 (21, 20 evaluated)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101, 102</td></tr>
49
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">VQA column</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><code>VQA</code></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><code>VQA_1126</code></td></tr>
50
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">reference answers</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">~4 characters (<code>yes</code>, <code>3</code>, <code>river</code>)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">~300 characters, grounded reasoning</td></tr>
51
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">model output</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">one word</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">270-295 characters</td></tr>
52
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">benchmark</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1,000-image union draw, 2,000 graded items</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">982 questions over 491 in-domain images</td></tr>
53
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">best</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-020-step4500</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-102-step1770</td></tr>
54
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">what it answered</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">hyperparameters are saturated, data is the lever</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">verbose supervision is worth +8, extra data is not</td></tr>
55
+ </tbody></table>
56
+ <p><strong>Scores from the two rounds must never be ranked against each other.</strong> The two benchmarks reward opposite answer styles; see <em>Why the legacy score drops</em> below.</p>
57
+ <h2>Round 0XX - terse answers (Aspaklarya-001 ... 021)</h2>
58
+ <p>The original 21-experiment programme, trained on the one-word <code>VQA</code> column and scored on the 1,000-image union draw. Everything below this heading refers to that round only.</p>
59
+ <h3>Setup</h3>
60
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
61
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Item</th>
62
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Value</th>
 
71
  <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">References</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">stock Qwen3-VL-8B, plus an in-house finetuned model</td></tr>
72
  </tbody></table>
73
  <p>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.</p>
74
+ <h3>Configurations</h3>
75
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
76
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Model</th>
77
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">r / alpha</th>
 
106
  <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-021</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">16 / 16</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">0.0</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">2e-4</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">linear</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">trained</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1c + 2q</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>35,981</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">as 020, <strong>8 epochs</strong> not 4</td></tr>
107
  </tbody></table>
108
  <p>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.</p>
109
+ <h3>Results</h3>
110
  <p>Best checkpoint per run on a fixed 1000-image draw (2000 graded items), with bootstrap standard error. <strong>Overall</strong> = mean of caption and VQA. <strong>In-dom.</strong> = the target overhead-imagery subset (491 images); <strong>RSICD</strong> = the public RSICD remote-sensing benchmark subset (509 images). Sorted by in-domain overall; <strong>bold marks the best value in each column</strong>.</p>
111
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
112
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Model</th>
 
145
  <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Qwen3-VL-8B (base)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">68.37 ±0.89</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">58.94 ±1.50</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">63.66 ±0.92</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">65.68 ±0.66</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">56.01 ±1.01</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">60.84 ±0.62</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">63.07 ±0.94</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">53.18 ±1.46</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">58.13 ±0.91</td></tr>
146
  </tbody></table>
147
  <p>Every finetune beats both references overall. The selected model, Aspaklarya-020, is <strong>+17.9</strong> over the base model and <strong>+9.4</strong> over the in-house reference on the full set.</p>
148
+ <h3>Learning rate at large batch</h3>
149
  <p>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.</p>
150
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
151
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">LR at batch 64</th>
 
162
  </tbody></table>
163
  <p>Linear LR scaling is <strong>wrong</strong> 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&#x27;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.</p>
164
  <p>On the shared 1000-image set, neither batch-64 rate beat the reference: 2e-4 is <strong>-0.56</strong> overall and <strong>-0.09</strong> in-domain, 3e-4 is <strong>-0.34</strong> and <strong>-0.87</strong>. 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: <strong>no hyperparameter lever remains untested</strong>, and further gains have to come from the training data.</p>
165
+ <h3>Error bars</h3>
166
  <p>Bootstrap over images, 3000 resamples. Absolute standard error:</p>
167
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
168
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Slice</th>
 
176
  </tbody></table>
177
  <p>Paired model-vs-model error is smaller because image difficulty cancels: <strong>0.42</strong> overall on the full set, <strong>0.56</strong> in-domain. Use the paired figure for any &quot;A beats B&quot; claim.</p>
178
  <p>Applied exhaustively to the five leading checkpoints (020, 018, 019, 001, 011), the paired bootstrap separates <strong>0 of 10 pairs overall and 0 of 10 in-domain</strong> 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. <strong>The ordering of the results table below the top line is not a measurement.</strong></p>
179
+ <h3>Caveat</h3>
180
  <p>The hyperparameter runs are statistically tied with each other: among runs 001-019, every confidence interval against the leader straddles zero. <strong>VQA error is ~2.3x caption error</strong>, 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.</p>
181
+ <h3>Findings</h3>
182
  <ul>
183
  <li><strong>Hyperparameters are saturated; data is not.</strong> 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.</li>
184
  <li><strong>The slices disagree — but data breaks the trade.</strong> 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.</li>
 
190
  <li><strong>Training in bf16 instead of 4-bit is a small, consistent positive</strong> — the only change in the whole sweep that never loses on any slice — but it is still inside the error bar.</li>
191
  <li><strong>Data is the remaining lever</strong>, not hyperparameters — and it is not exhausted: the run that used it had not converged when its schedule ended.</li>
192
  </ul>
193
+ <h3>Base-weight precision</h3>
194
  <p>Runs 001-017 all trained their adapters against <strong>4-bit quantized</strong> base weights, while evaluation and the final merge both use the <strong>bf16</strong> base. That is a train/serve mismatch: the adapter was fitted to compensate for quantization error that is absent at inference time.</p>
195
  <p>Runs <strong>018</strong> and <strong>019</strong> repeat the two strongest recipes with the base loaded in bf16 and nothing else changed. Against the reference, paired on 1000 images:</p>
196
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
 
205
  <p>These are the first two runs in the sweep to post a positive overall delta, and <strong>018</strong> 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.</p>
206
  <p>The mechanism is not the expected one. Removing quantization error should mostly help the harder task, VQA; instead the gain is <strong>entirely in captioning</strong> (+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.</p>
207
  <p>Removing quantization also costs <strong>~9 GB of GPU memory</strong> during training (19 GB vs 10 GB), which is a real constraint on a shared 40 GB card.</p>
208
+ <h3>Training data</h3>
209
  <p>Every run up to 017 trained on 6,288 images / 18,864 samples. The source table also carries <strong>5,706 further images</strong> that the dataset author left unassigned (<code>Notes == other</code>, RSICD only). They are fully populated, statistically indistinguishable from the assigned training rows, and have <strong>zero image-name overlap with either the train or the validation split</strong>, so they are safe to train on.</p>
210
  <p><strong>Aspaklarya-020</strong> adds them, taking training data to 11,994 images / 35,981 samples (<strong>+91%</strong>). Everything else is identical to 018. Paired against the previous selection on the same 1000 images:</p>
211
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
 
226
  <li><strong>The climb to the final checkpoint was schedule, not headroom.</strong> Overall score rose at all seven checkpoints including the last, which suggested an unexhausted budget. <strong>Aspaklarya-021 tested that directly and refuted it</strong> — see below.</li>
227
  </ul>
228
  <p>More data is therefore the live axis, and the only one still producing movement.</p>
229
+ <h3>Schedule length</h3>
230
  <p><strong>Aspaklarya-021</strong> repeats 020 on the same enlarged corpus with <strong>8 epochs instead of 4</strong> (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.</p>
231
  <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
232
  <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">step</th>
 
244
  <p>Its best checkpoint, paired against 020 on the same 1000 images, is negative on every slice and significant on none: overall <strong>-0.53 ±0.43</strong>, in-domain <strong>-0.39 ±0.60</strong>, RSICD <strong>-0.66 ±0.64</strong>.</p>
245
  <p><strong>Data volume helped; data duration did not.</strong> Four epochs is already the right length at this corpus size.</p>
246
  <p>The failure mode is asymmetric and worth recording: at step 5,900 <strong>captioning was intact (80.75) while VQA collapsed (76.52 → 74.45)</strong>. Overtraining this recipe degrades VQA first, so a stop rule watching captioning alone would not catch it.</p>
247
+ <h3>Status</h3>
248
  <p>The <strong>hyperparameter</strong> 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.</p>
249
  <p>Batch size and learning rate illustrate that ceiling. Effective batch 16 came in at <strong>-0.59</strong> overall, batch 64 at 2e-4 at <strong>-0.56</strong>, and batch 64 at 3e-4 at <strong>-0.34</strong> overall and <strong>-0.87</strong> 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.</p>
250
  <p>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 <strong>data composition</strong>: 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.</p>
251
+ <h2>Round 1XX - verbose grounded answers (Aspaklarya-101, 102)</h2>
252
+ <h3>Why a second round</h3>
253
+ <p>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. <code>yes</code> is a correct answer to <em>&quot;are there any anomalies in the scene?&quot;</em> and a useless one.</p>
254
+ <p>The dataset author then supplied a new column, <strong><code>VQA_1126</code></strong>, 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.</p>
255
+ <p>Round 1XX trains on that column and is evaluated on a new benchmark built from it: <strong>982 questions over 491 in-domain images</strong>, frozen, same draw for every model.</p>
256
+ <h3>Configurations</h3>
257
+ <p>Both runs use the Aspaklarya-020 recipe unchanged. The <strong>only</strong> variable between them is corpus size.</p>
258
+ <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
259
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Model</th>
260
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">r / alpha</th>
261
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Dropout</th>
262
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">LR</th>
263
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Sched</th>
264
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Vision</th>
265
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Per image</th>
266
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Split</th>
267
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Items</th>
268
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Images</th>
269
+ </tr></thead><tbody>
270
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">16 / 16</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">0.0</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">2e-4</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">linear</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">trained</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1c + 2q</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><code>train,other</code></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">35,979</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">11,994</td></tr>
271
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-102</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">16 / 16</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">0.0</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">2e-4</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">linear</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">trained</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1c + 2q</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><code>train</code></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">18,862</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">6,288</td></tr>
272
+ </tbody></table>
273
+ <p>Constant: bf16 base (no 4-bit), effective batch 32 (4 x 8), 4 epochs, warmup 0.03, weight decay 0.001, grad clip 0.3, max seq 2048, seed 3407. 101 ran 588 min / 4,500 steps; 102 ran ~320 min / 2,360 steps.</p>
274
+ <h3>Results</h3>
275
+ <p>LLM-as-judge (<code>gemma-4-31b-it-imiai</code>), greedy, 160 new tokens, 982 items. <code>new</code> is the VQA_1126 benchmark; <code>legacy</code> is the old 2,000-item union draw carried over from round 0XX for continuity. <strong>Bold marks the best value.</strong></p>
276
+ <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
277
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">Model</th>
278
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">new</th>
279
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">95% CI</th>
280
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">correct (0-5)</th>
281
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">concise (0-2)</th>
282
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">chars</th>
283
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">legacy combined</th>
284
+ </tr></thead><tbody>
285
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>Aspaklarya-102-step1770</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>74.30</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(71.9, 76.5)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.740</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.695</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">272</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.84</td></tr>
286
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101-step3540</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.15</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(71.9, 76.4)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>3.760</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.600</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">291</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">75.37</td></tr>
287
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101-step1180</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.14</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(71.9, 76.3)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.693</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.703</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">273</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.73</td></tr>
288
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101-step4500</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.02</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(71.9, 76.1)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.747</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.620</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">294</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>75.66</strong></td></tr>
289
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-102-step2360</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">73.68</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(71.5, 75.9)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.718</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.643</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">285</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.79</td></tr>
290
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-102-step590</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">72.98</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(70.7, 75.2)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.675</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.663</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">282</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">73.70</td></tr>
291
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101-step2360</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">72.44</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(70.2, 74.6)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.655</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.634</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">282</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">75.26</td></tr>
292
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-102-step1180</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">72.44</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(70.1, 74.7)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.637</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.675</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">277</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.25</td></tr>
293
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-011 (0XX)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">66.40</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(64.1, 68.7)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.225</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>2.000</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">4.4</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">-</td></tr>
294
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-020 (0XX)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">66.05</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(63.8, 68.2)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.200</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>2.000</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">4.1</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">78.83</td></tr>
295
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">in-house reference</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">64.78</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(62.5, 67.2)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.130</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>2.000</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">4.2</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">-</td></tr>
296
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Qwen3-VL-8B (base)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">60.24</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">(58.2, 62.3)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.346</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">0.634</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">674</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">-</td></tr>
297
+ </tbody></table>
298
+ <p><strong>Verbose supervision is worth about +8 points</strong> over the best 0XX model on the new benchmark, with non-overlapping confidence intervals. It is the second change in the whole programme to clear the error bar.</p>
299
+ <p>The stock base model was <strong>re-baselined at 160 new tokens</strong> for this round. At the 48-token budget used earlier it scored 53.84, which was a truncation artefact; the honest figure is 60.24 and the honest lead over it is +14, not +20.</p>
300
+ <h3>Data volume does not matter here</h3>
301
+ <p>101 and 102 differ only in corpus size: 35,979 items over 11,994 images versus 18,862 over 6,288. Best checkpoints land at <strong>74.30 vs 74.15</strong> - statistically identical, with 102 nominally ahead on half the data and half the GPU time.</p>
302
+ <p>This <strong>does not contradict</strong> the 0XX data-scaling result. The data added in both cases is the <code>other</code> split, which is RSICD-only, and the round-1XX benchmark is in-domain-only. Extra RSICD images lifted the RSICD slice in round 0XX and are invisible here. For a DM-targeted product, the larger corpus buys nothing.</p>
303
+ <h3>Four epochs are three too many</h3>
304
+ <p>Scores by epoch on the new benchmark:</p>
305
+ <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
306
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">run</th>
307
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">ep 1</th>
308
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">ep 2</th>
309
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">ep 3</th>
310
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">ep 4</th>
311
+ </tr></thead><tbody>
312
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.14</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">72.44</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.15</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.02</td></tr>
313
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-102</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">72.98</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">72.44</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.30</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">73.68</td></tr>
314
+ </tbody></table>
315
+ <p>Both curves are flat from the first epoch, and every point sits inside every other point&#x27;s interval. The format is learned almost immediately and the remaining epochs are noise. <strong>One epoch would have produced the same model</strong> for a quarter of the cost - about 7 GPU-hours per run are being spent on nothing.</p>
316
+ <h3>Why the legacy score drops</h3>
317
+ <p>Every 1XX model scores ~75 on the legacy benchmark against Aspaklarya-020&#x27;s 78.83. That is <strong>not a capability regression</strong>. Per-axis, at matched steps:</p>
318
+ <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
319
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">benchmark</th>
320
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">model</th>
321
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">correct (0-5)</th>
322
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">conciseness (0-2)</th>
323
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">overall</th>
324
+ </tr></thead><tbody>
325
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">legacy (4-char refs)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-020</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.710</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>2.000</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">76.25</td></tr>
326
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">legacy</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.700</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.405</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">70.28</td></tr>
327
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">new (300-char refs)</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-020</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.200</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>2.000</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">66.05</td></tr>
328
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">new</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-101</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap"><strong>3.747</strong></td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">1.620</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">74.02</td></tr>
329
+ </tbody></table>
330
+ <p>On the legacy set the two models are <strong>tied on correctness</strong> (3.700 vs 3.710) and the entire gap is the conciseness axis. The legacy 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. Captioning, which has long references, is unaffected (81.03 vs 81.42).</p>
331
+ <p>On the new set the asymmetry does <strong>not</strong> reverse: Aspaklarya-020 still scores a perfect 2.000 conciseness, so it wins the format axis on both benchmarks and loses by 8 anyway - on the axis whose rubric explicitly states that verbosity is irrelevant.</p>
332
+ <h3>Detail-prompt ablation</h3>
333
+ <p>To rule out the alternative explanation - that the 0XX models had the content and were merely withholding it - both terse models were re-run on the 982 questions with an explicit <em>&quot;answer in detail&quot;</em> instruction appended.</p>
334
+ <table style="border-collapse:collapse;margin:1rem 0;font-size:.85rem;border:1px solid #d0d7de"><thead><tr>
335
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">model</th>
336
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">prompt</th>
337
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">chars</th>
338
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">correct (0-5)</th>
339
+ <th style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;background:#f6f8fa;font-weight:600;white-space:nowrap">new overall</th>
340
+ </tr></thead><tbody>
341
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-020</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">normal</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">4.1</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.200</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">66.05</td></tr>
342
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">Aspaklarya-020</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">detail</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">112.3</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.249</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">65.31</td></tr>
343
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">in-house reference</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">normal</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">4.2</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.130</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">64.78</td></tr>
344
+ <tr><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">in-house reference</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">detail</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">6.9</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">3.026</td><td style="border:1px solid #d0d7de;padding:5px 10px;text-align:left;white-space:nowrap">62.97</td></tr>
345
+ </tbody></table>
346
+ <p>Aspaklarya-020 complied - 4 to 112 characters - and its correctness did not move. The verbosity was elicitable; the content was not there to elicit. The in-house reference ignored the instruction almost entirely, which confirms the prompt is not doing the work.</p>
347
+ <p>Qualitatively, on <em>&quot;are there any anomalies in the scene?&quot;</em>: prompted for detail, Aspaklarya-020 produces 450 characters of generic scene description that never names an anomaly, while Aspaklarya-101 identifies a specific bright irregular object and says why it is out of place.</p>
348
+ <p><strong>The round-1XX lead is substantive and the legacy dip is cosmetic.</strong></p>
349
+ <h3>Caveat</h3>
350
+ <p>The judge is <strong>text-only</strong>. 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.</p>
351
+ <h3>Status</h3>
352
+ <ul>
353
+ <li><strong>Aspaklarya-102-step1770 is the round reference</strong> - equal-best score, half</li>
354
+ </ul>
355
+ <p> the corpus, half the training time.</p>
356
+ <ul>
357
+ <li>The legacy benchmark should be treated as <strong>deprecated for this line</strong>. It</li>
358
+ </ul>
359
+ <p> encodes a terse answer style the product no longer wants, and no single model can lead both benchmarks.</p>
360
+ <ul>
361
+ <li>Open levers: one-epoch training at a quarter of the cost, in-domain data</li>
362
+ </ul>
363
+ <p> volume (as opposed to RSICD volume), and a LoRA soup over the eight tied adapters.</p>
364
  </main>
365
  </body>
366
  </html>