NeuroVFM:基于临床MRI/CT的神经影像基础模型
Meet NeuroVFM: A New Neuroimaging Foundation Model Trained With Vol-JEPA on Uncurated Clinical MRI and CT Volumes
Frontier models learn mostly from public internet data. However, clinical neuroimaging rarely appears there, because MRI and CT scans contain identifiable facial features. Consequently, general models underperform on brain-imaging tasks. A University of Michigan research team addresses this gap with NeuroVFM, published in Nature Medicine. What is NeuroVFM? At its core, NeuroVFM is a generalist visual foundation model for neuroimaging. Specifically, it was trained on 5.24 million clinical MRI and CT volumes. These came from 566,915 studies in the UM-NeuroImages dataset. That data spans over two decades of routine care at Michigan Medicine. The research team call their approach ‘health system learning.’ In short, the model learns from uncurated data generated during normal clinical operations. Therefore, it avoids the bottleneck of paired radiology reports. It also avoids the disease-specific curation used in narrow classifiers. Notably, the base model is called Vol-JEPA. It extends the earlier I-JEPA and V-JEPA methods to volumetric medical images. This reflects a wider trend: JEPA-style learning is expanding into medical imaging. How Vol-JEPA Works? Vol-JEPA is a self-supervised, vision-only algorithm. Rather than reconstructing pixels, it predicts representations in a learned latent space. As a result, it needs no labels, no report text, and no voxel decoder. First, each 3D volume is tokenized into non-overlapping 4×16×16-voxel patches. Next, the volume is split into a small visible context and a larger masked target. A student encoder then processes the context patches. Meanwhile, a predictor combines context latents with target position encodings. It predicts the masked-region latents. A teacher encoder generates the ground-truth target latents. This teacher is an exponential moving average (EMA) of the student. Training minimizes a smooth L1 loss between predicted and teacher latents, with gradients stopped through the teacher. Importantly, masking is foreground-focused, using precomputed head masks. Context ratios are 25% for MRI and 20% for CT, with 20% patch dropout. This design encourages the encoder to model shared neuroanatomy rather than background shortcuts. Play</button> <button id="step">Step</button> <button id="reset">Reset</button> <span class="toggle" id="mod"> <button class="sel" data-m="mri">MRI · 25% context</button> <button data-m="ct">CT · 20% context</button> </span> </div> <div class="meta" id="meta">Modality: MRI. Context sampling ratio: 25%. Patch dropout: 20%. Patches are 4×16×16 voxels.</div> <div class="foot"> <span>Illustrative animation of the method in "Health system learning enables generalist neuroimaging models" (Nature Medicine, 2026). Not a real model run.</span> <span>Interactive explainer by <b>Marktechpost</b></span> </div> </div> <script> (function(){ var N=12, total=N*N; var grid=document.getElementById('grid'); var cells=[]; // rough head-mask footprint: an ellipse of foreground patches var fg=[]; for(var r=0;r<N;r++){for(var c=0;c<N;c++){ var dx=(c-(N-1)/2)/(N/2), dy=(r-(N-1)/2)/(N/2); var inside=(dx*dx*1.05+dy*dy)<0.92; var cell=document.createElement('div'); cell.className='cell'; cell.dataset.fg=inside?'1':'0'; grid.appendChild(cell); cells.push(cell); if(inside) fg.push(cells.length-1); }} var modality='mri'; var ctxRatio={mri:0.25, ct:0.20}; var ctxSet=[], tgtSet=[]; function shuffle(a){for(var i=a.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=a[i];a[i]=a[j];a[j]=t;}return a;} function buildSplit(){ var pool=shuffle(fg.slice()); var nCtx=Math.max(3,Math.round(pool.length*ctxRatio[modality])); ctxSet=pool.slice(0,nCtx); // 20% patch dropout from the rest -> still targets; here all remaining foreground are targets tgtSet=pool.slice(nCtx); } function clearClasses(){cells.forEach(function(c){c.className='cell';});} function paintFg(){cells.forEach(function(c){if(c.dataset.fg==='0')c.className='cell';});} var boxes={s:document.getElementById('bStudent'),p:document.getElementById('bPred'),t:document.getElementById('bTeacher'),l:document.getElementById('bLoss')}; function boxesOff(){Object.keys(boxes).forEach(function(k){boxes[k].classList.remove('on');});} var note=document.getElementById('note'); var pills=[].slice.call(document.querySelectorAll('.pill')); function setStep(s){pills.forEach(function(p){p.classList.toggle('active', +p.dataset.s===s);});} var lossval=document.getElementById('lossval'), lossfill=document.getElementById('lossfill'); var loss=1.00; function updateLoss(){lossval.textContent=loss.toFixed(2); lossfill.style.width=Math.max(6,loss*100)+'%';} var stage=0; function render(){ clearClasses(); boxesOff(); switch(stage){ case 0: // tokenize setStep(0); cells.forEach(function(c){ if(c.dataset.fg==='1'){ c.classList.add('pulse'); setTimeout(function(cc){return function(){cc.classList.remove('pulse');};}(c), 250);} }); note.innerHTML='<b>Tokenize.</b> Each 3D volume is split into non-overlapping 4×16×16-voxel patches. Only foreground (head) patches are kept.'; break; case 1: // context/target split setStep(1); buildSplit(); ctxSet.forEach(function(i){cells[i].classList.add('ctx');}); tgtSet.forEach(function(i){cells[i].classList.add('tgt');}); note.innerHTML='<b>Context / Target.</b> A small visible <b>context</b> (blue) is sampled. The larger masked <b>target</b> (amber) is predicted.'; break; case 2: // student encodes context setStep(2); ctxSet.forEach(function(i){cells[i].classList.add('ctx','pulse');}); tgtSet.forEach(function(i){cells[i].classList.add('tgt');}); boxes.s.classList.add('on'); note.innerHTML='<b>Student encodes.</b> The student encoder Eθ turns visible context patches into context latents.'; break; case 3: // predict target latents setStep(3); ctxSet.forEach(function(i){cells[i].classList.add('ctx');}); tgtSet.forEach(function(i){cells[i].classList.add('tgt','pulse');}); boxes.s.classList.add('on'); boxes.p.classList.add('on'); note.innerHTML='<b>Predict latents.</b> The predictor Pφ uses context latents plus target positions to predict masked-region latents.'; break; case 4: // teacher generates target setStep(4); cells.forEach(function(c){if(c.dataset.fg==='1')c.classList.add('ctx');}); tgtSet.forEach(function(i){cells[i].classList.remove('ctx');cells[i].classList.add('tgt','filled');}); boxes.t.classList.add('on'); note.innerHTML='<b>Teacher (EMA).</b> A teacher encoder, an exponential moving average of the student, produces ground-truth target latents. Gradients are stopped here.'; break; case 5: // loss setStep(5); ctxSet.forEach(function(i){cells[i].classList.add('ctx');}); tgtSet.forEach(function(i){cells[i].classList.add('tgt','filled');}); boxes.l.classList.add('on'); loss=Math.max(0.05, loss*0.82); updateLoss(); note.innerHTML='<b>Smooth L1 loss.</b> Training minimizes the distance between predicted and teacher latents. Loss decreases over steps.'; break; } postHeight(); } function next(){ stage=(stage+1)%6; render(); } var timer=null, playing=false; var playBtn=document.getElementById('play'); function play(){ playing=true; playBtn.textContent='❚❚ Pause'; timer=setInterval(next,1600); } function pause(){ playing=false; playBtn.textContent='<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/25b6.png" alt="▶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Play'; clearInterval(timer); } playBtn.onclick=function(){ playing?pause():play(); }; document.getElementById('step').onclick=function(){ if(playing)pause(); next(); }; document.getElementById('reset').onclick=function(){ if(playing)pause(); stage=0; loss=1.00; u
原文超出正文长度上限,此处截断——上游还有内容,完整版见上方「原文 ↗」。
更进一步:量化金融体系
看懂新闻只是起点——沿量化金融路径,把它变成能交付的工程能力