Abstract
While Large Multimodal Models (LMMs) have made significant progress, they remain largely text-centric, relying on language as their core reasoning modality. As a result, they are limited in their ability to handle reasoning tasks that are predominantly visual. Recent approaches have sought to address this by supervising intermediate visual steps with helper images, depth maps, or image crops. However, these strategies impose restrictive priors on what "useful" visual abstractions look like, add heavy annotation costs, and struggle to generalize across tasks. To address this critical limitation, we propose a task-agnostic mechanism that trains LMMs to discover and use visual reasoning tokens without explicit supervision. These tokens attend globally and re-encode the image in a task-adaptive way, enabling the model to extract relevant visual information without hand-crafted supervision. Our approach outperforms direct fine-tuning and achieves state-of-the-art results on a diverse range of vision-centric tasks -- including those where intermediate abstractions are hard to specify -- while also generalizing to multi-task instruction tuning.
Community
TL;DR: We introduce a new method that improves visual reasoning by allowing models to implicitly learn latent visual representations, without requiring explicit supervision or additional data for these latents.
arXiv lens breakdown of this paper 👉 https://arxivlens.com/PaperView/Details/latent-implicit-visual-reasoning-9998-b5005eaa
- Executive Summary
- Detailed Breakdown
- Practical Applications
arXiv explained breakdown of this paper 👉 https://arxivexplained.com/papers/latent-implicit-visual-reasoning
// === APP.JS — كل شيء في ملف واحد ===
import express from "express";
import bodyParser from "body-parser";
import cors from "cors";
import fs from "fs-extra";
import { v4 as uuidv4 } from "uuid";
import bcrypt from "bcrypt";
const app = express();
const PORT = 3000;
app.use(cors());
app.use(bodyParser.json());
const DB_FILE = "db.json";
async function loadDB() {
if (!(await fs.pathExists(DB_FILE))) {
await fs.writeJson(DB_FILE, {
users: [],
matches: [],
predictions: [],
results: [],
scores: [],
locked: false,
adminPassword: await bcrypt.hash("admin123", 10)
});
}
return await fs.readJson(DB_FILE);
}
async function saveDB(db) {
await fs.writeJson(DB_FILE, db, { spaces: 2 });
}
/* ================= USERS ================= */
app.post("/register", async (req, res) => {
const { name, phone, password } = req.body;
const db = await loadDB();
if (db.users.find(u => u.phone === phone))
return res.status(400).send("الرقم مسجل مسبقًا");
const hash = await bcrypt.hash(password, 10);
db.users.push({
id: uuidv4(),
name,
phone,
password: hash
});
await saveDB(db);
res.send("تم التسجيل بنجاح");
});
app.post("/login", async (req, res) => {
const { phone, password } = req.body;
const db = await loadDB();
const user = db.users.find(u => u.phone === phone);
if (!user) return res.status(400).send("غير مسجل");
const ok = await bcrypt.compare(password, user.password);
if (!ok) return res.status(400).send("كلمة مرور غير صحيحة");
res.json({ id: user.id, name: user.name });
});
/* ================= ADMIN ================= */
app.get("/admin", (req, res) => {
res.send(adminHTML);
});
app.post("/admin/login", async (req, res) => {
const { password } = req.body;
const db = await loadDB();
const ok = await bcrypt.compare(password, db.adminPassword);
if (!ok) return res.status(400).send("كلمة مرور خاطئة");
res.send("OK");
});
app.post("/admin/matches", async (req, res) => {
const { matches } = req.body;
const db = await loadDB();
if (db.locked) return res.status(400).send("التوقعات مغلقة");
db.matches = matches;
db.predictions = [];
await saveDB(db);
res.send("تم الحفظ");
});
app.post("/admin/results", async (req, res) => {
const { results } = req.body;
const db = await loadDB();
db.results = results;
db.scores = db.users.map(user => {
const pr = db.predictions.find(p => p.userId === user.id);
let score = 0;
if (pr) {
pr.predictions.forEach(p => {
const r = results.find(x => x.id === p.id);
if (!r) return;
if (Number(r.home) === Number(p.home) && Number(r.away) === Number(p.away))
score += p.double ? 6 : 3;
});
}
return { name: user.name, score };
});
await saveDB(db);
res.send("OK");
});
app.post("/admin/lock", async (req, res) => {
const db = await loadDB();
db.locked = true;
await saveDB(db);
res.send("تم إغلاق التوقعات");
});
app.post("/admin/unlock", async (req, res) => {
const db = await loadDB();
db.locked = false;
await saveDB(db);
res.send("تم فتح التوقعات");
});
/* ================= MATCHES ================= */
app.get("/matches", async (req, res) => {
const db = await loadDB();
res.json({ matches: db.matches, locked: db.locked });
});
app.post("/predict", async (req, res) => {
const { userId, predictions } = req.body;
const db = await loadDB();
if (db.locked) return res.status(400).send("التوقعات مغلقة");
if (db.predictions.find(p => p.userId === userId))
return res.status(400).send("تم الحفظ سابقًا");
if (predictions.filter(p => p.double).length > 1)
return res.status(400).send("يسمح بدبل واحد فقط");
db.predictions.push({ userId, predictions });
await saveDB(db);
res.send("تم الحفظ");
});
app.get("/scores", async (req, res) => {
const db = await loadDB();
res.json(db.scores || []);
});
/* ================= USER UI ================= */
app.get("/", (req, res) => {
res.send(userHTML);
});
/* ================= HTML TEMPLATES ================= */
const userHTML = `
الدخول
`;
const adminHTML = `
دخول المدير
`;app.listen(PORT, () =>
console.log("Running on http://localhost:" + PORT)
);
Models citing this paper 0
No model linking this paper
Datasets citing this paper 0
No dataset linking this paper
Spaces citing this paper 0
No Space linking this paper