# VLA-JEPA

هذا هو إصدار LeRobot من **VLA-JEPA**، وهو نموذج رؤية-لغة-إجراء يجمع بين هيكل لغوي من Qwen3-VL ونموذج عالم ذاتي الإشراف للفيديو (V-JEPA2) ورأس إجراء يعتمد على مطابقة التدفق (flow-matching DiT).

---

## نظرة عامة على البنية

يتكوّن VLA-JEPA من ثلاثة مكوّنات رئيسية:

| مكوّن               | وحدة                            | الدور                                                    |
| ----------------------- | --------------------------------- | ------------------------------------------------------- |
| **هيكل Qwen3-VL**   | `Qwen3VLInterface`                | يُدمج الصور + تعليمات اللغة في رموز السياق |
| **رأس إجراء DiT-B**   | `VLAJEPAActionHead`               | انتشار مطابقة التدفق على شريحة الإجراء           |
| **نموذج العالم V-JEPA2** | `ActionConditionedVideoPredictor` | خسارة التنبؤ الذاتي بالفيديو (للتدريب فقط)   |

### تدفق البيانات

**التدريب:**

1. يُرمَّز مقطع فيديو يتكوّن من `num_video_frames` إطارًا بواسطة V-JEPA2 إلى رموز بقع لكل إطار.
2. يعالج العمود الفقري Qwen3-VL صور متعددة الزوايا + تعليمات المهمة وينتج تسلسلًا من رموز السياق يتضمن رموز إجراء خاصة (لأغراض تكييف نموذج العالم) ورموز تجسّدية.
3. يستقبل رأس الإجراء رموز السياق تلك كمفاتيح/قيم في الانتباه المتقاطع ويتنبأ بقطعة إجراء منزوعة الضوضاء عبر مطابقة التدفق.
4. يستخدم متنبئ النموذج العالمي رموز الإجراءات المستخرجة من Qwen للتنبؤ بتضمينات إطارات V-JEPA2 المستقبلية؛ ويُضاف خسارة انحدار على تلك التنبؤات إلى خسارة الإجراءات.

**الاستدلال:** يُستخدم نموذج Qwen ورأس الإجراء فقط. لا حاجة إلى نموذج العالم أثناء الاستدلال.

### تفاصيل رأس الإجراء

الإعدادات المتوفرة عبر `action_model_type`:

| إعداد مسبق  | رؤوس | بعدد رؤوس |
| ------- | ----- | -------- |
| `DiT-B` | 12    | 64       |
| `DiT-L` | 32    | 48       |

تحدد الإعداد المسبق هندسة الانتباه فقط، ويمكن تجاوز كل إدخال بواسطة `action_num_heads` / `action_attention_head_dim`. وينتج عن ذلك عرضان:

- العرض **الداخلي** لـ DiT هو `heads x head_dim` (768 لـ `DiT-B`)، وهو مُشتق وليس مُعدَّداً؛
- عرض **المخرجات** الخاصة بـ DiT، وعرض شبكتي MLP الخاصة بفك ترميز الإجراء وترميز الحالة، هو `action_hidden_size` (الافتراضي 1024).

لذلك `DiT-B` يشغّل محوّلاً بعرض 768 يقوم بالمشروع إلى 1024. كلاهما مستقل.

### تفاصيل نموذج العالم

التنبؤ بالفيديو هو محوّل بنمط ViT (`ActionConditionedVideoPredictor`) يستقبل:

- **رموز الإطار**: تمثيلات البقع في V-JEPA2 المُسقطَة إلى `predictor_embed_dim`
- **رموز الإجراء**: تمثيلات رموز الإجراء الخاصة بـ Qwen المُسقطَة إلى `predictor_embed_dim`

يستخدم الانتباه السببي على مستوى الكتل بحيث يمكن لكل خطوة زمنية الانتباه إلى جميع الخطوات السابقة. مدخلات المتنبئ `embed_dim` يساوي `num_views × video_encoder_hidden_size` (على سبيل المثال، 2 منظر × 1024 = 2048 للنقاط الفحصية المُدرَّبة مسبقًا).

---

## نقاط التفتيش المُسبقة التدريب

يتوفر ثلاثة نقاط تحقق مباشرة داخل منظمة LeRobot هنا: [`lerobot/VLA-JEPA`](https://huggingface.co/collections/lerobot/vla-jepa)، تم تحويلها من [ginwind/VLA-JEPA](https://huggingface.co/ginwind/VLA-JEPA):

| نقطة التفتيش                    | مجموعة البيانات           | الكاميرات                 | نموذج العالم | بُعد الإجراء |
| ----------------------------- | ----------------- | ----------------------- | ----------- | ---------- |
| `lerobot/VLA-JEPA-LIBERO`     | LIBERO-10         | 2 (agentview + wrist)   | مُفعّل     | 7          |
| `lerobot/VLA-JEPA-Pretrain`   | DROID 1.0.1       | 2 (المنظورات الخارجية اليسرى) | مُفعّل     | 7          |
| `lerobot/VLA-JEPA-SimplerEnv` | جسر OXE / RT-1 | 1 (عرض مكرر ×2)  | مُفعّل     | 7          |

تستخدم جميع نقاط التفتيش `Qwen/Qwen3-VL-2B-Instruct` كهيكل لغوي أساسي.

---

## الإعداد

أهم المعلمات في `VLAJEPAConfig`:

| معامل                    | افتراضي       | الوصف                                                                                                                                                                                                                                                |
| ---------------------------- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `chunk_size`                 | 7             | عدد الإجراءات المتوقعة لكل استدعاء استنتاج                                                                                                                                                                                                             |
| `n_action_steps`             | 7             | الخطوات المنفذة من المقطع المتوقع قبل إعادة التخطيط                                                                                                                                                                                                 |
| `num_video_frames`           | 8             | طول مقطع الفيديو المُدخل إلى نموذج العالم                                                                                                                                                                                                                   |
| `enable_world_model`         | `True`        | ما إذا كان سيتم تحميل وتدريب متنبئ V-JEPA2                                                                                                                                                                                                            |
| `world_model_loss_weight`    | 0.1           | وزن خسارة التنبؤ في JEPA مقارنةً بخسارة الإجراء                                                                                                                                                                                             |
| `causal_world_model_context` | `False`       | ترميز سياق نموذج العالم بشكل سببي (مرور واحد فقط لـ V-JEPA2 لكل موضع في السياق) بحيث لا يمكن للانتباه الاتجاهي تسريب الإطارات المستقبلية إلى مدخلات المتنبئ. يكلف ذلك `t_enc_ctx` استدعاءات إضافية للمشفّر                                            |
| `num_inference_timesteps`    | 4             | خطوات تكامل أويلر لإزالة الضوضاء من الإجراء                                                                                                                                                                                                               |
| `freeze_qwen`                | `False`       | تجميد العمود الفقري لنموذج Qwen3-VL وتدريب رأس الإجراء فقط                                                                                                                                                                                                |
| `reinit_modules`             | `None`        | بادئات المفاتيح المسموح بإعادة تهيئتها عشوائياً عند التحميل (لنقل التدريب عبر تجسيدات مختلفة، راجع [التدريب الدقيق على تجسيد مختلف](#fine-tuning-on-a-different-embodiment))                                                                            |
| `resize_images_to`           | `None`        | `(height, width)` هو الحجم الذي يُعاد ضبط كل إطار كاميرا إليه قبل مروره عبر برج الرؤية في Qwen3-VL. يُبقي `None` على الدقة الأصلية، ومع ذلك تزداد عدد الباتشات في Qwen3-VL مع زيادة الدقة، مما قد يستنفد ذاكرة وحدة معالجة الرسوميات (GPU) في كاميرا بدقة 720x1280. تستخدم نقاط التفتيش المنشورة `[224, 224]` |
| `gripper_dim`                | 6             | مؤشر بُعد الماسك في متجه الإجراء. يتم تجاهله عندما يطابق `gripper_joint_names` اسم إجراء في مجموعة البيانات                                                                                                                                      |
| `gripper_joint_names`        | `["gripper"]` | أسماء أبعاد الحركة التي تحدد الماسك؛ حيث يتفوّق المؤشر المطابق على `gripper_dim`                                                                                                                                                                  |
| `gripper_threshold`          | 0.5           | العتبة المستخدمة بواسطة `pre_snap_gripper_action` و`binarize_gripper_action`. لاحظ أن `binarize` يعمل _بعد_ إلغاء التطبيع، لذا يتم مقارنته بالقيمة الفيزيائية للقبضة                                                                          |
| `pre_snap_gripper_action`    | `False`       | اجعل قيمة المقبض dim ضمن النطاق {0, 1} قبل إلغاء التطبيع. خاص بـ LIBERO، راجع ما يلي                                                                                                                                                                          |
| `binarize_gripper_action`    | `False`       | قم بتحويل مؤشر القبضة إلى قيم ثنائية {-1, 1} بعد إلغاء التطبيع. خاص بـ LIBERO، راجع ما يلي                                                                                                                                                                      |
| `clip_normalized_actions`    | `True`        | اقطع الأفعال المُعايرة إلى المجال [-1, 1] قبل إزالة المعايرة. يُطبَّق هذا فقط عندما يستخدم `ACTION` `MIN_MAX`؛ ويُتجاهل (مع تحذير) عند استخدام `MEAN_STD`، حيث سيؤدي إلى اقتطاع عند انحراف معياري واحد                                                                          |
| `world_model_num_views`      | `None`        | الكاميرا التي بُني مُتنبئ نموذج العالم من أجلها. مُدمجة في أشكال نقاط الحفظ. `None` يعود إلى `jepa_tubelet_size`، وهو ما ترمّزه نقاط الحفظ المنشورة                                                                                |

`pre_snap_gripper_action` و`binarize_gripper_action` هي نسخة مُحوَّلة من حلقة تقييم LIBERO في starVLA، وهي صحيحة فقط لمعيار الإجراءات الخاص بـ LIBERO. تكتب `pre_snap` القيم {0, 1} في فضاء _المُطَبَّع_، ثم تُحوِّل أداة إلغاء التطبيع هذه القيم إلى نقطة المنتصف والقيمة القصوى، ويقوم `binarize` بعد ذلك بمقارنة تلك القيمة **الفيزيائية** مع `gripper_threshold` (0.5). بالنسبة لمقبض يُقاس بالدرجات أو بالمليمتر أو بمقياس [0, 100]، فإن كلا القيمتين تقعان فوق العتبة، فيصبح المقبض المُمرَّر قيمة ثابتة. لهذا السبب تكون القيمة الافتراضية لهما `False`؛ فعِّلهما فقط للإعدادات من نمط LIBERO، وإذا فعلت ذلك فاضبط `gripper_threshold` بوحدات المقبض الخاصة به. يُصدر مصنع المعالج تحذيرًا عندما تُظهر إحصاءات مجموعة البيانات أن النطاق لا يمكن أن يعمل.

---

## التدريب

قد يختلف عدد خطوات التدريب اعتمادًا على حجم مجموعة البيانات والميزانية الحسابية. في الورقة الأصلية، تم تدريب النموذج مسبقًا لمدة 50 ألف خطوة على ssv2 وdroid بشكل مشترك، ثم 30 ألف خطوة إضافية لـLIBERO، لكن قد تحقق خطوات أقل أداءً جيدًا عند الضبط الدقيق انطلاقًا من نقاط التفتيش المدربة مسبقًا المقدمة.

### التدريب الكامل من الصفر

```bash
lerobot-train \
  --policy.type=vla_jepa \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/your_dataset
```

### ضبط النموذج الدقيق من نقطة تحقق مسبقة التدريب

```bash
lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/your_dataset
```

إذا كنت ترغب في تجميد هيكل Qwen الأساسي وتدريب رأس الإجراء فقط، فاضبط `policy.freeze_qwen=True`:

```bash
lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --policy.freeze_qwen=true \
  --dataset.repo_id=your_org/your_dataset
```

### ضبط دقيق على تجسيد مختلف

عندما تكون أبعاد الإجراء أو الحالة للروبوت المستهدف مختلفة عن نقاط التفتيش المُسبقة التدريب، فإن طبقات الإسقاط المدخلة/المخرجة لرأس الإجراء ستعاني من عدم تطابق في الأشكال ولن يمكن تحميلها مباشرة. يتيح لك `reinit_modules` سرد بادئات المفاتيح المسموح بعدم تطابقها — حيث تُعاد تهيئة تلك الطبقات عشوائياً بينما يُعاد استخدام كل الأوزان الأخرى من نقطة التفتيش. أي عدم تطابق في الشكل خارج البادئات المدرجة سيؤدي إلى رفع خطأ.

الطبقات التي تعتمد على `action_dim` و`state_dim` هي:

| طبقة                                     | بادئة المفتاح                          |
| ----------------------------------------- | ----------------------------------- |
| مُشفِّر الإجراء (action_dim ← inner_dim)   | `model.action_model.action_encoder` |
| فكّ الترميز الإجراء (hidden_size → action_dim) | `model.action_model.action_decoder` |
| مُشفِّر الحالة (state_dim → inner_dim)     | `model.action_model.state_encoder`  |

```bash
lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --policy.freeze_qwen=true \
  --policy.reinit_modules='["model.action_model.action_encoder", "model.action_model.action_decoder", "model.action_model.state_encoder"]' \
  --dataset.repo_id=your_org/your_dataset
```

إذا لم يكن لروبوتك أي حالة إدراك ذاتي، فاحذف `model.action_model.state_encoder` من القائمة.

### إعادة إنتاج نتائج LIBERO

**التدريب على LIBERO:** يبدأ التدريب من نقطة الفحص المسبق Pretrain، ويدرب لمدة 30 ألف خطوة على مجموعة بيانات LIBERO. يذكر الورقة الأصلية التدريب عبر 8 وحدات معالجة رسومية بحجم دفعة 32، مما يعني حجم دفعة عالمي قدره 256.

```bash
lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=HuggingFaceVLA/libero \
  --steps=30000
```

**تقييم نقطة الفحص المسبقة التدريب لـ LIBERO-10:**

```bash
lerobot-eval \
  --policy.path=lerobot/VLA-JEPA-LIBERO \
  --env.type=libero \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --eval.n_episodes=10 \
  --eval.batch_size=5
```

لتقييم مجموعة فرعية من المهام فقط:

```bash
lerobot-eval \
  --policy.path=lerobot/VLA-JEPA-LIBERO \
  --env.type=libero \
  --env.task=libero_10 \
  --env.task_ids='[0,1,2]' \
  --eval.n_episodes=10 \
  --eval.batch_size=5
```

**النتائج المتوقعة:**

| Suite          | الحلقات | النجاحات | معدل النجاح |
| -------------- | -------- | --------- | ------------ |
| libero_spatial | 100      | 93        | **95.0%**    |
| libero_object  | 100      | 100       | **100.0%**   |
| libero_goal    | 100      | 98        | **98.0%**    |
| libero_10      | 100      | 96        | **93.0%**    |
| **الإجمالي**    | **400**  | **387**   | **96.5%**    |

---

## ضبط النموذج على مجموعات بيانات بعدد مختلف من الكاميرات

تم تدريب متنبئ نموذج العالم المُسبق التدريب على `embed_dim = world_model_num_views × 1024`، أي عرضي كاميرا.

كان يُقرأ عدد العروض هذا من `jepa_tubelet_size`، وهو الاسم الذي يُطلق أيضاً على حجم _الأنبوبي الزمني_ لمشفّر JEPA. أصبح الحقل `world_model_num_views` هو المخصص لذلك الآن؛ فتركه عند `None` يعيد الرجوع إلى `jepa_tubelet_size` حتى تبقى نقاط التفتيش المنشورة تُحمّل دون تغيير.

**السلوك الافتراضي — عرض الحشو / القص (لا يلزم اتخاذ إجراء)**

عند الضبط الدقيق انطلاقًا من `VLA-JEPA-Pretrain`، يعدّل النموذج تلقائيًا عدد العروض المُقدَّمة إلى نموذج العالم ليتوافق مع `world_model_num_views`:

- **مجموعات بيانات الرؤية الواحدة (مثل BridgeV2):** يتم تكرار الكامن ذي الرؤية الواحدة لإنتاج مدخلات نموذج عالم ذي رؤيتين، مع الحفاظ على إشارة JEPA ذاتية الإشراف دون أي عدم تطابق في الأوزان.
- **>مجموعات بيانات متعددة الزوايا (مثل DROID بثلاث زوايا):** تُمرَّر جميع الزوايا إلى العمود الفقري Qwen (لتوفير سياق أغنى)، لكن يُستخدم فقط أول `world_model_num_views` زوايا (مفصل واحد + منظور شخص ثالث، وفقاً لترتيب الزوايا المُهيّأ) لنموذج العالم.

**الخيار 1 — تعطيل نموذج العالم**

اضبط `enable_world_model=False` لتخطي خسارة JEPA بالكامل. يتم تحميل وتدريب عمود Qwen ورأس الإجراء فقط. وهذا كافٍ للحصول على أداء جيد للإجراءات.

```bash
lerobot-train \
  --policy.path=lerobot/VLA-JEPA-Pretrain \
  --policy.enable_world_model=false \
  --policy.repo_id=your_org/your_repo \
  --dataset.repo_id=your_org/single_camera_dataset
```

**الخيار 2 — إعادة تهيئة إسقاط مدخلات المُتنبِّئ**

إذا كنت ترغب في تغيير `world_model_num_views` إلى قيمة أخرى غير 2، فحمّل نقطة التفتيش باستخدام `strict=False` وأعد تهيئة `model.video_predictor.predictor_embed` للـ `embed_dim` الجديد. جميع أوزان كتل التنبؤ الأخرى (الانتباه، MLP، التطبيع، الإسقاط الخرجي) لا تعتمد على عدد الكاميرات ويمكن إعادة استخدامها من نقطة التفتيش المُدرَّبة مسبقًا.

---

## الاستشهاد

```bibtex
@misc{sun2026vlajepaenhancingvisionlanguageactionmodel,
  title         = {VLA-JEPA: Enhancing Vision-Language-Action Model with Latent World Model},
  author        = {Jingwen Sun and Wenyao Zhang and Zekun Qi and Shaojie Ren and Zezhi Liu and Hanxin Zhu and Guangzhong Sun and Xin Jin and Zhibo Chen},
  year          = {2026},
  eprint        = {2602.10098},
  archivePrefix = {arXiv},
  primaryClass  = {cs.RO},
  url           = {https://arxiv.org/abs/2602.10098},
}
```

---

## رخصة

تُوزَّع الأوزان بموجب شروط ترخيص المستودع الأصلي [ginwind/VLA-JEPA](https://huggingface.co/ginwind/VLA-JEPA) (**Apache 2.0 License**). ويتبع كود تكامل LeRobot **Apache 2.0 License**.

