Spaces:
Running
Running
thibaud frere
commited on
Commit
·
f117331
1
Parent(s):
3c0763c
update
Browse files- .gitattributes +3 -1
- README.md +1 -1
- app/.astro/astro/content.d.ts +4 -6
- app/src/content/article.mdx +175 -29
- app/src/content/embeds/banner.html +5 -5
- app/src/content/embeds/d3-pie.html +4 -17
.gitattributes
CHANGED
@@ -8,4 +8,6 @@
|
|
8 |
*.avi filter=lfs diff=lfs merge=lfs -text
|
9 |
*.wav filter=lfs diff=lfs merge=lfs -text
|
10 |
*.csv filter=lfs diff=lfs merge=lfs -text
|
11 |
-
*.json filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
8 |
*.avi filter=lfs diff=lfs merge=lfs -text
|
9 |
*.wav filter=lfs diff=lfs merge=lfs -text
|
10 |
*.csv filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.json filter=lfs diff=lfs merge=lfs -text
|
12 |
+
package.json -filter -diff -merge text
|
13 |
+
package-lock.json -filter -diff -merge text
|
README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
---
|
2 |
-
title: '
|
3 |
emoji: 📝
|
4 |
colorFrom: blue
|
5 |
colorTo: indigo
|
|
|
1 |
---
|
2 |
+
title: 'FineVision: Open Data is all you need'
|
3 |
emoji: 📝
|
4 |
colorFrom: blue
|
5 |
colorTo: indigo
|
app/.astro/astro/content.d.ts
CHANGED
@@ -185,13 +185,11 @@ declare module 'astro:content' {
|
|
185 |
};
|
186 |
|
187 |
type DataEntryMap = {
|
188 |
-
"assets": {
|
189 |
-
|
190 |
-
id: "data/mnist-variant-model";
|
191 |
collection: "assets";
|
192 |
-
data: any
|
193 |
-
}
|
194 |
-
};
|
195 |
"embeds": Record<string, {
|
196 |
id: string;
|
197 |
collection: "embeds";
|
|
|
185 |
};
|
186 |
|
187 |
type DataEntryMap = {
|
188 |
+
"assets": Record<string, {
|
189 |
+
id: string;
|
|
|
190 |
collection: "assets";
|
191 |
+
data: any;
|
192 |
+
}>;
|
|
|
193 |
"embeds": Record<string, {
|
194 |
id: string;
|
195 |
collection: "embeds";
|
app/src/content/article.mdx
CHANGED
@@ -27,23 +27,28 @@ import visualPoster from "./assets/images/visual-vocabulary-poster.png";
|
|
27 |
import Accordion from '../components/Accordion.astro'
|
28 |
|
29 |
<Sidenote>
|
30 |
-
TLDR; Today, we release FineVision
|
31 |
|
32 |
-
Additionally, we ran extensive ablations and compared the performance of models trained on our dataset with common open source alternatives. Our dataset is both more divers, and achieves an average improvement of 35
|
33 |
|
34 |
To use the dataset, simply load it with:
|
35 |
```python
|
36 |
from datasets import load_dataset
|
|
|
37 |
ds = load_dataset('HuggingFaceM4/FineVision', name='ai2d_merged', split='train', streaming=True)
|
38 |
```
|
39 |
</Sidenote>
|
40 |
|
41 |
## Introduction
|
42 |
-
Even though open-weights Vision-Language Models (VLMs) are becoming ever more powerful, the accessibility of large-scale, state-of-the-art training data for these models is still lagging behind.
|
|
|
|
|
|
|
|
|
43 |
|
44 |
## Constructing FineVision
|
45 |
### Data Collection
|
46 |
-
We manually collect over 180 image-text datasets from the recent literature and create new subsets in lacking domains.
|
47 |
|
48 |
<Wide>
|
49 |
<Accordion title="FineVision Subsets">
|
@@ -238,15 +243,34 @@ We manually collect over 180 image-text datasets from the recent literature and
|
|
238 |
</Wide>
|
239 |
|
240 |
### Cleaning
|
241 |
-
After gathering all the sub-datasets, every turn is cleaned.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
242 |
|
243 |
### Result
|
244 |
-
FineVision consists of 9 categories
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
245 |
|
246 |
-
|
247 |
|
248 |
-
In total, FineVision has 17.3M images
|
249 |
|
|
|
|
|
|
|
|
|
250 |
<Wide>
|
251 |
<HtmlEmbed src="d3-pie.html" desc="Distribution of Categories in FineVision" align="center" />
|
252 |
</Wide>
|
@@ -255,25 +279,69 @@ In total, FineVision has 17.3M images, 24.3M samples, 88.9M turns, and 9.5B answ
|
|
255 |
To evaluate how our dataset compares to other open-source datasets, we conduct various experiments.
|
256 |
|
257 |
### Model Architecture: nanoVLM
|
258 |
-
For most of the ablations and experiments, we train a 450M parameter VLM, since it provides a good trade off between training time and model performance.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
259 |
|
260 |
### Baseline Datasets
|
261 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
262 |
|
263 |
### Evaluations
|
264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
265 |
|
266 |
## Experiments
|
267 |
-
Each of our ablations trains a 450M model with maximal image size of 1536x1536 pixel (without resizing smaller images) and a maximal input token length of 4096.
|
|
|
|
|
|
|
|
|
268 |
|
269 |
### How does FineVision compare against the Baselines?
|
270 |
-
Compared against existing VLM training datasets, FineVision produces significantly higher benchmark ranks than the other options. Over the 10 different metrics, FineVision achieves a 45.68% improvement over the Cauldron, a 13.04% improvement over Cambrian, and a 46.83% improvement over LLaVa.
|
271 |
|
|
|
|
|
|
|
|
|
|
|
272 |
<HtmlEmbed src="against-baselines.html" desc="Average Rank of Models trained on different open source datasets." />
|
273 |
|
274 |
### How contaminated are the datasets?
|
275 |
-
To investigate data leakage from benchmarks into this dataset, we construct a deduplication pipeline based on the sample images. We embed the images of 66 image-test datasets from the lmms-eval framework using the SSCD descriptor, and compute the cosine similarity between our samples and the test-set embeddings. Whenever a sample has a similarity higher than a threshold of 0.95 it is assumed to be a duplicate. While our tests with various thresholds show that this is still flagging more false-positives than false-negatives, we preferred to err on the side of caution. Below is an example of a correctly identified Duplicate ("Photo"), a false-positive with a similarity score above 0.95 ("Chart") and a false-negative with a similarity score below 0.95 ("Drawing"). We open-source the deduplication pipeline here as well as the precomputed test-set embedding’s here.
|
276 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
277 |
<Wide>
|
278 |
<HtmlEmbed src="comparison.html" desc="Examples of the Deduplication Pipeline."/>
|
279 |
</Wide>
|
@@ -287,12 +355,33 @@ To investigate data leakage from benchmarks into this dataset, we construct a de
|
|
287 |
|
288 |
Additionally, we experimented with removing all found samples from all datasets to see if the outcome is different from the results above, but we observe the same distribution.
|
289 |
|
|
|
290 |
<HtmlEmbed src="against-baselines-deduplicated.html" desc="Average Rank of Models trained on different deduplicated open source datasets." />
|
|
|
291 |
|
292 |
-
After removing these duplicates, the average performance of the models over all benchmarks dropped by 2.78% for Cambrian, 2.39% for Cauldron, 1.45
|
293 |
|
294 |
### How diverse are the datasets?
|
295 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
296 |
|
297 |
| Name | Effective Rank | Participation Ratio | Diversity |
|
298 |
|---------------|----------------|---------------------|-----------|
|
@@ -302,27 +391,46 @@ Similarly to the comparison of the size, we also wanted to evaluate the datasets
|
|
302 |
| FineVision | 359.22 | 182.52 | 0.500 |
|
303 |
|
304 |
### Should you merge multiple questions for the same image into a single multi turn conversation?
|
305 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
306 |
Even when training for longer than the other ablations, we did not observe a significant difference, if at all rather one in favour against merging multiple samples together.
|
307 |
|
|
|
308 |
<HtmlEmbed src="internal-deduplication.html" desc="Average Ranking of Models trained with internally deduplicated / merged samples." />
|
|
|
309 |
|
310 |
### Should you train on multilingual data if your language backbone was not?
|
311 |
-
There are some multilingual datasets in our mixture, but since our Language Backbone is only trained on English data, we experimented with removing all the multilingual, mainly Chinese, subsets. This does also not seem to make a big difference, with slight advantages to leaving the data, even if it was not part of the Language Backbone's initial training. In our training setup with this configuration, one epoch over the whole dataset equals ~12k steps, so the benefit of unseen languages only materializes after the first full epoch.
|
312 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
313 |
<HtmlEmbed src="remove-ch.html" desc="Average Rank of Models trained with and without multilingual samples" />
|
|
|
314 |
|
315 |
### How can you assess the quality of the dataset?
|
316 |
|
317 |
-
The usual goal for every dataset, to collect samples with the highest quality possible, is quite an abstract endeavour in practice, especially for multimodal datasets. Additionally, different training stages usually have different qualitative and quantitative requirements.
|
318 |
-
|
|
|
|
|
|
|
|
|
319 |
For this, we used a LLM and VLM-as-a-judge pipeline (using Qwen3-32B and Qwen2.5VL-32B), to rate every turn on a scale from 1-5 in these 4 categories:
|
320 |
- **Text Formatting Quality**: How is the quality of the answer both linguistically and structurally? (Question and Answer)
|
321 |
- **Question-Answer Relevance**: Does the answer properly respond to the question? (Question and Answer)
|
322 |
- **Visual Dependency**: How much does the question depend on visual information to be answered? (Question only)
|
323 |
- **Image-Question Correspondence**: How well does the image support answering the question? (Image and Question)
|
324 |
|
325 |
-
This is the distribution of scores across the different filters for FineVision
|
326 |
| Filter | 1 | 2 | 3 | 4 | 5 |
|
327 |
|-----------------------|-------|-------|-------|-------|-------|
|
328 |
| Formatting | 0.5 | 0.7 | 1.1 | 77.5 | 20.3 |
|
@@ -332,34 +440,72 @@ This is the distribution of scores across the different filters for FineVision.
|
|
332 |
|
333 |
To try to quantify the quality of the training data and the effect it has on the model’s performance, we run extensive ablations on our generated ratings.
|
334 |
|
|
|
335 |
<HtmlEmbed src="all-ratings.html" desc="Average Rank of Models trained with samples that have all 4 ratings above a certain threshold." />
|
|
|
|
|
|
|
|
|
|
|
|
|
336 |
|
337 |
-
|
338 |
-
We can almost see the same distribution in the ranks across all filters: From best to worst with an increase in the rating threshold. For example the visual dependency and the image correspondence rating both result in exactly the same distribution of rankings, corresponding to the natural order of options, 1 through 5. This could indicate that with a sufficiently large dataset that you train on long enough, it hurts more to remove samples, even if they were judged to be of low quality, than to train on them.
|
339 |
-
The notion of quality for VLM datasets is nuanced in general. If we compare training a VLM and an LLM, training the VLM is closer in nature to the SFT part than the ‘Pre-Training’ part of training a LLM. We do not train on crawls of internet data, instead we train on individual samples of Image-Question and Answer pairs, and these datapoints are usually ‘curated rather than collected’. We also do not train on trillions of tokens, but on billions. This means that the datasets for VLMs usually already have a certain baseline quality. Since FineVision is mainly a collection of common VLM datasets, combined with a few newly created ones in low resource domains, this baseline quality is the same here. We could therefore be trying to measure and quantify nuances in the quality of Image-Question-Answer Pairs, instead of using the binary indicator of using curated SFT datasets as the measure for quality, and training on as much data as possible.
|
340 |
-
Alternatively, while we used state-of-the-art open source models to judge our datapoints, we still had to find a compromise between model quality and cost due to the raw required effort to rate every single turn of FineVision. The chosen models could simply not be powerful enough to recognize and judge the quality of samples.
|
341 |
-
Even though our first proposal to judge the quality of multimodal data on a per-turn basis did not yield any improvement in model performance, we believe that this is still an exciting and important direction of research and hope the release of FineVision encourages the community to develop techniques for this at large scale.
|
342 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
343 |
<HtmlEmbed src="formatting-filters.html" title="Formatting Filter" desc="Average Rank of Models that have the Formatting Filter above a threshold." />
|
344 |
<HtmlEmbed src="relevance-filters.html" title="Relevance Filter" desc="Average Rank of Models that have the Relevance Filter above a threshold." />
|
|
|
345 |
<HtmlEmbed src="visual-dependency-filters.html" title="Visual Dependency Filter" desc="Average Rank of Models that have the Visual Dependency Filter above a threshold." />
|
346 |
<HtmlEmbed src="image-correspondence-filters.html" title="Image Correspondence Filter" desc="Average Rank of Models that have the Image-Correspondence Filter above a threshold." />
|
|
|
347 |
|
348 |
### Should you train in multiple stages?
|
349 |
-
|
|
|
|
|
|
|
350 |
|
351 |
#### 1 Stage vs 2 Stages
|
352 |
|
353 |
<HtmlEmbed src="ss-vs-s1.html" desc="Average Rank of a model trained for 20K steps in a single stage, and a model trained for the same 20k steps on top of pretraining the Modality Projection and Vision Encoder for 10k steps." />
|
|
|
354 |
|
355 |
We observe that at this model size, with this amount of available data, training only a single stage actually outperforms a multi stage approach.
|
356 |
|
357 |
#### 2 Stages vs 2.5 Stages
|
358 |
-
We also experiment if splitting the second stage results in any performance improvements.
|
|
|
|
|
359 |
|
|
|
360 |
<HtmlEmbed src="s25-ratings.html" desc="Average Rank if a model trained for an additional 20K steps on top of unfiltered training for 20K steps." />
|
|
|
361 |
|
362 |
Like in the previous results, we observe that the best outcome is simply achieved by training on as much data as possible.
|
363 |
|
364 |
## Conclusion
|
365 |
-
We introduce FineVision
|
|
|
27 |
import Accordion from '../components/Accordion.astro'
|
28 |
|
29 |
<Sidenote>
|
30 |
+
TLDR; Today, we release **FineVision**, a new multimodal dataset with **17M images**, 24 million samples, 90M question-answer turns and 10B answer tokens comprising **5TB**. We have extensively cleaned, analysed, and rated every single turn across 4 qualitative metrics with a score from 1-5 to enable the construction and study of individual training mixtures.
|
31 |
|
32 |
+
Additionally, we ran extensive ablations and compared the performance of models trained on our dataset with common open source alternatives. Our dataset is both more divers, and achieves an average improvement of **35%** in **10 common benchmarks** over all baselines.
|
33 |
|
34 |
To use the dataset, simply load it with:
|
35 |
```python
|
36 |
from datasets import load_dataset
|
37 |
+
|
38 |
ds = load_dataset('HuggingFaceM4/FineVision', name='ai2d_merged', split='train', streaming=True)
|
39 |
```
|
40 |
</Sidenote>
|
41 |
|
42 |
## Introduction
|
43 |
+
Even though open-weights Vision-Language Models (VLMs) are becoming ever more powerful, the accessibility of large-scale, state-of-the-art **training data** for these models is still lagging behind.
|
44 |
+
|
45 |
+
The data to train these models is often proprietary and inaccessible for the broader community.
|
46 |
+
|
47 |
+
Projects like The Cauldron, LLaVa and Cambrian aim to provide such datasets, but get quickly outpaced by the speed of the field and the emergence of novel applications for VLMs, like agentic tasks.
|
48 |
|
49 |
## Constructing FineVision
|
50 |
### Data Collection
|
51 |
+
We manually collect **over 180** image-text datasets from the recent literature and create new subsets in lacking domains.
|
52 |
|
53 |
<Wide>
|
54 |
<Accordion title="FineVision Subsets">
|
|
|
243 |
</Wide>
|
244 |
|
245 |
### Cleaning
|
246 |
+
After gathering all the sub-datasets, every turn is cleaned.
|
247 |
+
|
248 |
+
We remove all individual turns whose combined question and answer length exceeds **8192 tokens**.
|
249 |
+
|
250 |
+
We resize big images to have a longest side of **2048 pixels** while keeping the aspect ratio, and discard images with corrupted metadata.
|
251 |
+
|
252 |
+
This results in a clean final dataset with a maximum turn length of 8192 tokens and a maximum image dimension of 2048 pixels on the longest side.
|
253 |
+
|
254 |
|
255 |
### Result
|
256 |
+
**FineVision** consists of **9 categories**: Captioning & Knowledge, Chart & Table, General VQA, Grounding & Counting, Mathematics, Naive OCR, OCR QA, Science, Text-only.
|
257 |
+
|
258 |
+
There are multiple ways to count the data in a multimodal dataset.
|
259 |
+
|
260 |
+
The most common are the number of samples and the number of images.
|
261 |
+
|
262 |
+
Additionally, a single sample can consist of multiple question/answer pairs in the form of a multi-turn conversation.
|
263 |
+
|
264 |
+
Similarly to text-only datasets, the number of answer tokens is also interesting, since these are the tokens the model is actually trained on.
|
265 |
|
266 |
+
We keep track of all **4 different distributions**.
|
267 |
|
268 |
+
In total, **FineVision** has **17.3M images**, **24.3M samples**, **88.9M turns**, and **9.5B answer tokens**.
|
269 |
|
270 |
+
Based on these **4 distributions**, multiple different mixtures are possible.
|
271 |
+
|
272 |
+
In conjunction with the provided ratings, we encourage the community to experiment with downsampling large categories, for example according to quality and diversity criteria, and with upsampling high quality samples in small categories.
|
273 |
+
<br/>
|
274 |
<Wide>
|
275 |
<HtmlEmbed src="d3-pie.html" desc="Distribution of Categories in FineVision" align="center" />
|
276 |
</Wide>
|
|
|
279 |
To evaluate how our dataset compares to other open-source datasets, we conduct various experiments.
|
280 |
|
281 |
### Model Architecture: nanoVLM
|
282 |
+
For most of the ablations and experiments, we train a **450M** parameter VLM, since it provides a good trade off between training time and model performance.
|
283 |
+
|
284 |
+
We utilize the lightweight nanoVLM training framework with **SmolLM2-360M-Instruct** as the text backbone, andSigLIP2-512 as the vision encoder.
|
285 |
+
|
286 |
+
We experimented with a classic 2-stage training schedule where the first stage is used to train mainly the Modality Projection to align the Language and Image Embeddings, and the second stage is used to train the whole model.
|
287 |
+
|
288 |
+
Interestingly, we did not observe any significant benefits from this additional first stage compared to training the whole model directly, so we settled on a **single stage** training for most ablations.
|
289 |
+
|
290 |
|
291 |
### Baseline Datasets
|
292 |
+
|
293 |
+
We compare our dataset against 3 popular open source alternatives: **[The Cauldron](https://huggingface.co/datasets/HuggingFaceM4/the_cauldron)**, **[LLaVA-OneVision](https://huggingface.co/datasets/lmms-lab/LLaVA-OneVision-Data)** and **[Cambrian-7M](https://huggingface.co/datasets/nyu-visionx/Cambrian-10M)**.
|
294 |
+
|
295 |
+
We analyse all of them with the same pipeline concerning potential test-set contamination.
|
296 |
+
|
297 |
+
Note that these rates are not the actual contaminations.
|
298 |
+
|
299 |
+
While the pipeline discovers some similarities between the images of the test sets and the train sets, this does not mean that they are actually samples from the test set, since these consist of both image and the corresponding text.
|
300 |
+
|
301 |
+
This is rather used as an upper bound on potential train/test overlap and as a relative comparison between the four datasets.
|
302 |
|
303 |
### Evaluations
|
304 |
+
|
305 |
+
To evaluate our ablations in a reproducible manner, we utilize **lmms-eval** during training.
|
306 |
+
|
307 |
+
We evaluate on a diverse set of **10 benchmarks**: AI2D, ChartQA, DocVQA, InfoVQA, MME, MMMU, MMStar, OCRBench, TextVQA and Seedbench.
|
308 |
+
|
309 |
+
Since these benchmarks cover different topics and produce results on different scales, e.g. AI2D returns the accuracy of the exact matches (0-100), but MME returns a continuous score (0-2800), aggregating them is not trivial.
|
310 |
+
|
311 |
+
In our ablations the relative performance between the different configurations matters, so we determine the rank of every model in each training step and average it over all the benchmarks.
|
312 |
+
|
313 |
+
This way we can judge where different configurations rank among each other over the course of training, and how big the difference between them is.
|
314 |
|
315 |
## Experiments
|
316 |
+
Each of our ablations trains a 450M model with maximal image size of 1536x1536 pixel (without resizing smaller images) and a maximal input token length of 4096.
|
317 |
+
|
318 |
+
In all single stage configurations we train for **20k Steps** on **32 H100s** for approximately 20h while evaluating all 11 benchmarks every 1k Steps.
|
319 |
+
|
320 |
+
If not specified otherwise, the “Baseline” in our intra dataset ablations refers to a training run on the full unfiltered and unchanged dataset
|
321 |
|
322 |
### How does FineVision compare against the Baselines?
|
|
|
323 |
|
324 |
+
Compared against existing VLM training datasets, **FineVision** produces significantly higher benchmark ranks than the other options.
|
325 |
+
|
326 |
+
Over the 10 different metrics, **FineVision** achieves a **45.68%** improvement over the Cauldron, a **13.04%** improvement over Cambrian, and a **46.83%** improvement over LLaVa.
|
327 |
+
|
328 |
+
---
|
329 |
<HtmlEmbed src="against-baselines.html" desc="Average Rank of Models trained on different open source datasets." />
|
330 |
|
331 |
### How contaminated are the datasets?
|
|
|
332 |
|
333 |
+
To investigate data leakage from benchmarks into this dataset, we construct a deduplication pipeline based on the sample images.
|
334 |
+
|
335 |
+
We embed the images of 66 image-test datasets from the lmms-eval framework using the SSCD descriptor, and compute the cosine similarity between our samples and the test-set embeddings.
|
336 |
+
|
337 |
+
Whenever a sample has a similarity higher than a threshold of **0.95** it is assumed to be a duplicate.
|
338 |
+
|
339 |
+
While our tests with various thresholds show that this is still flagging more false-positives than false-negatives, we preferred to err on the side of caution.
|
340 |
+
|
341 |
+
Below is an example of a correctly identified Duplicate ("Photo"), a false-positive with a similarity score above 0.95 ("Chart") and a false-negative with a similarity score below 0.95 ("Drawing").
|
342 |
+
|
343 |
+
We open-source the deduplication pipeline here as well as the precomputed test-set embedding’s here.
|
344 |
+
<br/>
|
345 |
<Wide>
|
346 |
<HtmlEmbed src="comparison.html" desc="Examples of the Deduplication Pipeline."/>
|
347 |
</Wide>
|
|
|
355 |
|
356 |
Additionally, we experimented with removing all found samples from all datasets to see if the outcome is different from the results above, but we observe the same distribution.
|
357 |
|
358 |
+
---
|
359 |
<HtmlEmbed src="against-baselines-deduplicated.html" desc="Average Rank of Models trained on different deduplicated open source datasets." />
|
360 |
+
---
|
361 |
|
362 |
+
After removing these duplicates, the average performance of the models over all benchmarks dropped by 2.78% for Cambrian, 2.39% for Cauldron, **1.45%** for FineVision and 2.72% for LLaVa, indicating that while FineVision is already performing best, test-set contamination has the smallest effect in this dataset.
|
363 |
|
364 |
### How diverse are the datasets?
|
365 |
+
|
366 |
+
Similarly to the comparison of the size, we also wanted to evaluate the datasets for diversity.
|
367 |
+
|
368 |
+
Evaluating the diversity of a dataset is a field of study for itself, which we will not dive into here, rather we borrow techniques from computer vision and use the already computed **SSCD embeddings** as a proxy of visual diversity.
|
369 |
+
|
370 |
+
The SSCD embeddings should provide a good approximation since they are specifically optimized for distinguishing between visually similar content, through their differential entropy regularization that tries to ensure the full utilization of the embedding space.
|
371 |
+
|
372 |
+
The resulting approximately uniform distribution of the embeddings promotes consistent separation between descriptor vectors, making distances from different embedding regions more comparable, which is crucial for meaningful diversity measurements.
|
373 |
+
|
374 |
+
To not rely on a subsample of the dataset in estimating the diversity, we analyse the covariance metric of the full embeddings since this can be computed over the whole dataset in a numerically stable way (using Welford’s algorithm).
|
375 |
+
|
376 |
+
From this covariance matrix, we can calculate the eigenvalues for analysis.
|
377 |
+
|
378 |
+
We get the effective rank of the covariance matrix, which measures how uniformly the variance is distributed across dimensions, as well as the participation ratio, which measures how many dimensions actively contribute to the overall variance.
|
379 |
+
|
380 |
+
The effective rank (entropy based) estimates the uniformity of the variance distribution, while the participation ratio (concentration-based) estimates the breadth of the variance participation .
|
381 |
+
|
382 |
+
To obtain a single ‘**diversity score**’ for the datasets, we normalize the effective rank and participation ratio with the embedding dimension and compute their geometric mean.
|
383 |
+
|
384 |
+
We observe that **FineVision** is not only the biggest, but also the most diverse dataset.
|
385 |
|
386 |
| Name | Effective Rank | Participation Ratio | Diversity |
|
387 |
|---------------|----------------|---------------------|-----------|
|
|
|
391 |
| FineVision | 359.22 | 182.52 | 0.500 |
|
392 |
|
393 |
### Should you merge multiple questions for the same image into a single multi turn conversation?
|
394 |
+
|
395 |
+
Since the training of a VLM already builds upon pretrained vision and language backbones, datasets are usually not completely unstructured, but follow an image+question and answer structure.
|
396 |
+
|
397 |
+
Recent works have shown that consolidating multiple questions for the same image into a **multi-turn conversation** where the image is shown only once improves model performance, and additionally also reduces the datasets memory footprint.
|
398 |
+
|
399 |
+
We therefore experiment with deduplicating every image in our dataset internally using the same SSCD descriptors, manually inspect the resulting clusters and merge fitting samples into a multi-turn conversation.
|
400 |
+
|
401 |
Even when training for longer than the other ablations, we did not observe a significant difference, if at all rather one in favour against merging multiple samples together.
|
402 |
|
403 |
+
---
|
404 |
<HtmlEmbed src="internal-deduplication.html" desc="Average Ranking of Models trained with internally deduplicated / merged samples." />
|
405 |
+
---
|
406 |
|
407 |
### Should you train on multilingual data if your language backbone was not?
|
|
|
408 |
|
409 |
+
There are some multilingual datasets in our mixture, but since our Language Backbone is only trained on English data, we experimented with removing all the multilingual, mainly Chinese, subsets.
|
410 |
+
|
411 |
+
This does also not seem to make a big difference, with slight advantages to leaving the data, even if it was not part of the Language Backbone's initial training.
|
412 |
+
|
413 |
+
In our training setup with this configuration, one epoch over the whole dataset equals ~12k steps, so the benefit of unseen languages only materializes after the first full epoch.
|
414 |
+
|
415 |
+
---
|
416 |
<HtmlEmbed src="remove-ch.html" desc="Average Rank of Models trained with and without multilingual samples" />
|
417 |
+
---
|
418 |
|
419 |
### How can you assess the quality of the dataset?
|
420 |
|
421 |
+
The usual goal for every dataset, to collect samples with the highest quality possible, is quite an abstract endeavour in practice, especially for multimodal datasets. Additionally, different training stages usually have different qualitative and quantitative requirements.
|
422 |
+
|
423 |
+
Finally, tuning the mixtures of different categories is also reliant on how much data with what quality is available. For image-text datasets, there are 3 different combinatorial ways to evaluate a sample: text-only, image-only, and image-text correspondence. The question persists, how do you actually measure the quality of a sample, especially if you have to do so in 3 different ways.
|
424 |
+
|
425 |
+
With **FineVision**, we test a framework to rate every single turn in our dataset across 4 axes.
|
426 |
+
|
427 |
For this, we used a LLM and VLM-as-a-judge pipeline (using Qwen3-32B and Qwen2.5VL-32B), to rate every turn on a scale from 1-5 in these 4 categories:
|
428 |
- **Text Formatting Quality**: How is the quality of the answer both linguistically and structurally? (Question and Answer)
|
429 |
- **Question-Answer Relevance**: Does the answer properly respond to the question? (Question and Answer)
|
430 |
- **Visual Dependency**: How much does the question depend on visual information to be answered? (Question only)
|
431 |
- **Image-Question Correspondence**: How well does the image support answering the question? (Image and Question)
|
432 |
|
433 |
+
This is the distribution of scores across the different filters for **FineVision**.
|
434 |
| Filter | 1 | 2 | 3 | 4 | 5 |
|
435 |
|-----------------------|-------|-------|-------|-------|-------|
|
436 |
| Formatting | 0.5 | 0.7 | 1.1 | 77.5 | 20.3 |
|
|
|
440 |
|
441 |
To try to quantify the quality of the training data and the effect it has on the model’s performance, we run extensive ablations on our generated ratings.
|
442 |
|
443 |
+
---
|
444 |
<HtmlEmbed src="all-ratings.html" desc="Average Rank of Models trained with samples that have all 4 ratings above a certain threshold." />
|
445 |
+
---
|
446 |
+
|
447 |
+
Interestingly, both when only training on turns that have any of the 4 ratings under a certain threshold, as well as when training on turns where only a single rating at a time is used, we observe the same behaviour.
|
448 |
+
|
449 |
+
Simply training on all samples of the dataset **outperforms in benchmarks**.
|
450 |
+
This could mean multiple things.
|
451 |
|
452 |
+
We can almost see the same distribution in the ranks across all filters: From best to worst with an increase in the rating threshold.
|
|
|
|
|
|
|
|
|
453 |
|
454 |
+
For example the visual dependency and the image correspondence rating both result in exactly the same distribution of rankings, corresponding to the natural order of options, 1 through 5.
|
455 |
+
|
456 |
+
This could indicate that with a sufficiently large dataset that you train on long enough, it hurts more to remove samples, even if they were judged to be of low quality, than to train on them.
|
457 |
+
|
458 |
+
The notion of quality for VLM datasets is nuanced in general.
|
459 |
+
|
460 |
+
If we compare training a VLM and an LLM, training the VLM is closer in nature to the SFT part than the ‘Pre-Training’ part of training a LLM.
|
461 |
+
|
462 |
+
We do not train on crawls of internet data, instead we train on individual samples of Image-Question and Answer pairs, and these datapoints are usually ‘curated rather than collected’.
|
463 |
+
|
464 |
+
We also do not train on trillions of tokens, but on billions.
|
465 |
+
|
466 |
+
This means that the datasets for VLMs usually already have a certain baseline quality.
|
467 |
+
|
468 |
+
Since **FineVision** is mainly a collection of common VLM datasets, combined with a few newly created ones in low resource domains, this baseline quality is the same here.
|
469 |
+
|
470 |
+
We could therefore be trying to measure and quantify nuances in the quality of Image-Question-Answer Pairs, instead of using the binary indicator of using curated SFT datasets as the measure for quality, and training on as much data as possible.
|
471 |
+
|
472 |
+
Alternatively, while we used state-of-the-art open source models to judge our datapoints, we still had to find a compromise between model quality and cost due to the raw required effort to rate every single turn of **FineVision**.
|
473 |
+
|
474 |
+
The chosen models could simply not be powerful enough to recognize and judge the quality of samples.
|
475 |
+
|
476 |
+
Even though our first proposal to judge the quality of multimodal data on a per-turn basis did not yield any improvement in model performance, we believe that this is still an exciting and important direction of research and hope the release of **FineVision** encourages the community to develop techniques for this at large scale.
|
477 |
+
|
478 |
+
---
|
479 |
<HtmlEmbed src="formatting-filters.html" title="Formatting Filter" desc="Average Rank of Models that have the Formatting Filter above a threshold." />
|
480 |
<HtmlEmbed src="relevance-filters.html" title="Relevance Filter" desc="Average Rank of Models that have the Relevance Filter above a threshold." />
|
481 |
+
---
|
482 |
<HtmlEmbed src="visual-dependency-filters.html" title="Visual Dependency Filter" desc="Average Rank of Models that have the Visual Dependency Filter above a threshold." />
|
483 |
<HtmlEmbed src="image-correspondence-filters.html" title="Image Correspondence Filter" desc="Average Rank of Models that have the Image-Correspondence Filter above a threshold." />
|
484 |
+
---
|
485 |
|
486 |
### Should you train in multiple stages?
|
487 |
+
|
488 |
+
The standard training procedure of a VLM usually follows at least two stages. First, you train only the connecting module, potentially in addition the image encoder, and then you train the whole model in a second stage. Some work has even introduced an additional Stage 2.5, where you train the full model on a smaller subset of higher quality data.
|
489 |
+
|
490 |
+
To investigate this on small models, we experiment both with single, dual and triple stage training.
|
491 |
|
492 |
#### 1 Stage vs 2 Stages
|
493 |
|
494 |
<HtmlEmbed src="ss-vs-s1.html" desc="Average Rank of a model trained for 20K steps in a single stage, and a model trained for the same 20k steps on top of pretraining the Modality Projection and Vision Encoder for 10k steps." />
|
495 |
+
---
|
496 |
|
497 |
We observe that at this model size, with this amount of available data, training only a single stage actually outperforms a multi stage approach.
|
498 |
|
499 |
#### 2 Stages vs 2.5 Stages
|
500 |
+
We also experiment if splitting the second stage results in any performance improvements.
|
501 |
+
|
502 |
+
We take the baseline, and continue training for another 20k steps, both with the unfiltered (>= 1) as well as filtered subsets of **FineVision** according to our ratings.
|
503 |
|
504 |
+
---
|
505 |
<HtmlEmbed src="s25-ratings.html" desc="Average Rank if a model trained for an additional 20K steps on top of unfiltered training for 20K steps." />
|
506 |
+
---
|
507 |
|
508 |
Like in the previous results, we observe that the best outcome is simply achieved by training on as much data as possible.
|
509 |
|
510 |
## Conclusion
|
511 |
+
We introduce **FineVision**, a new state of the art open dataset to train VLMs, that is both **bigger and more diverse** than previous open source datasets. In addition to extensive ablations, we present a new family of small, purely data-centric trained VLMs, and hope we can empower both further research and the community with this.
|
app/src/content/embeds/banner.html
CHANGED
@@ -84,7 +84,8 @@
|
|
84 |
|
85 |
d3.csv(csvUrl, d3.autoType).then(async (raw) => {
|
86 |
const data = raw.filter((d) => d && typeof d.x_position === 'number' && typeof d.y_position === 'number');
|
87 |
-
|
|
|
88 |
const color = d3.scaleOrdinal().domain(categories).range(d3.schemeTableau10);
|
89 |
const xDomain = d3.extent(data, (d) => d.x_position);
|
90 |
const yDomain = d3.extent(data, (d) => d.y_position);
|
@@ -137,7 +138,7 @@
|
|
137 |
gCentroids.attr('transform', `translate(0, ${padTop})`);
|
138 |
|
139 |
// Centroides en labels: doublage (fond blanc + texte couleur) + anti-chevauchement
|
140 |
-
const fontPx =
|
141 |
const estimateTextWidth = (s) => Math.max(fontPx, (s ? String(s).length : 0) * fontPx * 0.62 + 8);
|
142 |
|
143 |
// Prépare des noeuds à l'échelle pixel pour la simulation
|
@@ -221,14 +222,14 @@
|
|
221 |
mergedC.select('text.label-bg').each(function() {
|
222 |
this.style.setProperty('fill', 'var(--surface-bg)', 'important');
|
223 |
this.style.setProperty('stroke', 'var(--surface-bg)', 'important');
|
224 |
-
this.style.setProperty('stroke-width', '
|
225 |
this.style.setProperty('font-weight', '900', 'important');
|
226 |
this.style.setProperty('font-size', `${fontPx}px`, 'important');
|
227 |
});
|
228 |
mergedC.select('text.label-fg').each(function(d) {
|
229 |
const base = d3.color(color(d.category || 'Unknown'));
|
230 |
const adjusted = base
|
231 |
-
? (isDark ? base.brighter(0.8) : base.darker(
|
232 |
: color(d.category || 'Unknown');
|
233 |
this.style.setProperty('fill', adjusted, 'important');
|
234 |
this.style.setProperty('font-weight', '900', 'important');
|
@@ -264,7 +265,6 @@
|
|
264 |
`<div><strong>${d.category || 'Unknown'}</strong></div>` +
|
265 |
`<div><strong>ID</strong> ${d.original_id}</div>` +
|
266 |
`<div><strong>Subset</strong> ${d.subset ?? '—'}</div>` +
|
267 |
-
`<div><strong>X</strong> ${d.x_position} · <strong>Y</strong> ${d.y_position}</div>` +
|
268 |
`</div>` +
|
269 |
`</div>`;
|
270 |
tip.style.opacity = '1';
|
|
|
84 |
|
85 |
d3.csv(csvUrl, d3.autoType).then(async (raw) => {
|
86 |
const data = raw.filter((d) => d && typeof d.x_position === 'number' && typeof d.y_position === 'number');
|
87 |
+
// Tri des catégories pour un ordre stable et correspondance avec d3-pie
|
88 |
+
const categories = Array.from(new Set(data.map((d) => d.category || 'Unknown'))).sort();
|
89 |
const color = d3.scaleOrdinal().domain(categories).range(d3.schemeTableau10);
|
90 |
const xDomain = d3.extent(data, (d) => d.x_position);
|
91 |
const yDomain = d3.extent(data, (d) => d.y_position);
|
|
|
138 |
gCentroids.attr('transform', `translate(0, ${padTop})`);
|
139 |
|
140 |
// Centroides en labels: doublage (fond blanc + texte couleur) + anti-chevauchement
|
141 |
+
const fontPx = 18;
|
142 |
const estimateTextWidth = (s) => Math.max(fontPx, (s ? String(s).length : 0) * fontPx * 0.62 + 8);
|
143 |
|
144 |
// Prépare des noeuds à l'échelle pixel pour la simulation
|
|
|
222 |
mergedC.select('text.label-bg').each(function() {
|
223 |
this.style.setProperty('fill', 'var(--surface-bg)', 'important');
|
224 |
this.style.setProperty('stroke', 'var(--surface-bg)', 'important');
|
225 |
+
this.style.setProperty('stroke-width', '10', 'important');
|
226 |
this.style.setProperty('font-weight', '900', 'important');
|
227 |
this.style.setProperty('font-size', `${fontPx}px`, 'important');
|
228 |
});
|
229 |
mergedC.select('text.label-fg').each(function(d) {
|
230 |
const base = d3.color(color(d.category || 'Unknown'));
|
231 |
const adjusted = base
|
232 |
+
? (isDark ? base.brighter(0.8) : base.darker(.8)).toString()
|
233 |
: color(d.category || 'Unknown');
|
234 |
this.style.setProperty('fill', adjusted, 'important');
|
235 |
this.style.setProperty('font-weight', '900', 'important');
|
|
|
265 |
`<div><strong>${d.category || 'Unknown'}</strong></div>` +
|
266 |
`<div><strong>ID</strong> ${d.original_id}</div>` +
|
267 |
`<div><strong>Subset</strong> ${d.subset ?? '—'}</div>` +
|
|
|
268 |
`</div>` +
|
269 |
`</div>`;
|
270 |
tip.style.opacity = '1';
|
app/src/content/embeds/d3-pie.html
CHANGED
@@ -110,23 +110,10 @@
|
|
110 |
function drawPies(rows){
|
111 |
const { innerWidth, innerHeight } = updateSize();
|
112 |
|
113 |
-
//
|
114 |
-
const categories = Array.from(new Set(rows.map(r => r.eagle_cathegory))).sort();
|
115 |
-
|
116 |
-
|
117 |
-
const primary = getComputedStyle(document.documentElement).getPropertyValue('--primary-color').trim() || '#E889AB';
|
118 |
-
const base = [primary, '#4EA5B7', '#E38A42', '#CEC0FA'];
|
119 |
-
const pool = Array.from(new Set([
|
120 |
-
...base,
|
121 |
-
...(d3.schemeTableau10 || []),
|
122 |
-
...(d3.schemeSet3 || []),
|
123 |
-
...(d3.schemePastel1 || []),
|
124 |
-
].flat().filter(Boolean)));
|
125 |
-
|
126 |
-
const colorOf = (cat) => {
|
127 |
-
const idx = categories.indexOf(cat);
|
128 |
-
return pool[idx % pool.length] || primary;
|
129 |
-
};
|
130 |
|
131 |
// Legend will be positioned after radius is known
|
132 |
|
|
|
110 |
function drawPies(rows){
|
111 |
const { innerWidth, innerHeight } = updateSize();
|
112 |
|
113 |
+
// Catégories (triées) + échelle de couleurs harmonisée avec banner.html
|
114 |
+
const categories = Array.from(new Set(rows.map(r => r.eagle_cathegory || 'Unknown'))).sort();
|
115 |
+
const color = d3.scaleOrdinal().domain(categories).range(d3.schemeTableau10);
|
116 |
+
const colorOf = (cat) => color(cat || 'Unknown');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
|
118 |
// Legend will be positioned after radius is known
|
119 |
|