Publicar modelos nuevos a veces revela más que una mejora de precisión: revela por qué fallan. DharmaAI lanzó DharmaOCR y, además de mostrar mejor rendimiento en OCR estructurado, aplicó Direct Preference Optimization (DPO) como una segunda etapa de entrenamiento para atacar un fallo persistente: la degeneración de texto, esas repeticiones infinitas que convierten una transcripción en un loop.
Qué encontró DharmaOCR
El estudio usó 23,726 documentos y comparó familias de modelos (open source y comerciales) en OCR para portugués brasileño. Resultado clave: la tasa de degeneración en modelos sin ajuste iba de menos del 1% hasta más del 33%. El ajuste supervisado (SFT) redujo esa tasa en muchos casos, pero rara vez la dejó en niveles de producción.
Ahí es donde entra DPO. Aplicado como segunda etapa sobre el mismo conjunto, DPO redujo la degeneración en todas las familias probadas. Promedio: 59.4% de reducción relativa a . Rango observado: 37% a 87.6%. Ejemplo concreto: Nanonets-OCR2-3B bajó de 1.61% a 0.20%. Incluso modelos con degeneración inicial muy alta alcanzaron mejoras muy significativas.
SFT
Un caso curioso: Qwen2.5-VL-3B tuvo 0.60% en su versión vanilla, subió a 3.23% tras SFT y luego bajó a 1.41% con DPO. ¿Por qué? SFT hizo al modelo capaz de intentar la tarea con outputs largos; con esa capacidad apareció por primera vez la geometría de la degeneración.
Por qué SFT no basta: la geometría del fallo
¿Te has preguntado por qué ajustar con datos correctamente no elimina ciertas fallas? La explicación técnica apunta a la granularidad de la pérdida. SFT optimiza token a token: cada predicción se evalúa en aislamiento. Un loop repetitivo puede ser localmente probable y sin penalización a nivel de secuencia.
DPO invierte esa lógica: trabaja con preferencias sobre la secuencia completa (output elegido vs output rechazado). Eso permite etiquetar una transcripción degenerada como la salida equivocada en su totalidad, no solo como una sucesión de tokens con baja probabilidad. La degeneración no es solo un artefacto del decodificador: es una propiedad de la distribución aprendida y de los "atractores" donde la probabilidad se concentra durante la inferencia (ver Holtzman et al., 2020).
Intervenciones en la capa de inferencia (penalizaciones de repetición, temperatura, abortos tempranos) tratan el síntoma. DPO ataca la forma de la distribución que genera ese síntoma.
Cómo aplicaron DPO en OCR: el pipeline técnico
La idea práctica fue simple y elegante:
Generar múltiples candidatos por documento usando el SFT.
Evaluar cada candidato con un juez automático (un LLM con criterios específicos de tarea).
Construir pares de preferencia (elegido, rechazado). Importante: los outputs con degeneración se conservaron deliberadamente como ejemplos rechazados.
Entrenar DPO sobre esos pares, penalizando explícitamente las salidas degeneradas a nivel de secuencia.
El scoring automático aplicó cuatro criterios de calidad para distinguir transcripciones limpias de loops repetitivos. No se necesitó anotación humana masiva: la señal vino de las propias fallas del modelo. DharmaAI describe esto como "preference-guided implicit unlikelihood": se empuja al modelo hacia buenas salidas y se lo aleja de una clase concreta de fallos.
Condiciones estructurales para que esto funcione en otras tareas
No es magia aplicable a todo: el método requiere tres condiciones claras:
El modo de fallo debe ser categórico y reconocible (por ejemplo, loops de repetición), no solo ruido de baja calidad.
Debe existir un mecanismo de scoring automático suficientemente consistente para etiquetar pares elegido/rechazado sin depender de anotadores humanos.
Debe haber volumen: suficientes outputs de inferencia para construir un dataset de preferencias con variedad.
Si estas condiciones se cumplen, usar las propias fallas del modelo como señal negativa es una opción real.
Implicaciones prácticas para ingenieros y equipos ML
SFT sigue siendo necesario: acerca la distribución del modelo al dominio objetivo. Pero no es suficiente para corregir ciertos fallos estructurales.
Añadir una etapa DPO posterior es una inversión puntual que puede reducir la degeneración sin sacrificar la calidad de extracción.
En la práctica: genera N candidatos por input, usa un juez (reglas + LLM) para detectar loops y conserva esos ejemplos como rechazados.
Espera ganancias grandes pero variables; en el benchmark hubo reducciones del 37% al 88% según arquitectura y punto de partida.
Ten en cuenta la relación entre capacidad y exposición a fallos: mejorar la capacidad puede exponer al modelo a nuevos atractores de degeneración; DPO y SFT abordan dimensiones distintas del problema.
Lo importante: no descartes las salidas defectuosas como ruido. Si el fallo es consistente y reconocible, esa misma falla es la mejor señal para enseñarle al modelo a no repetirla.
Reflexión final
DharmaOCR muestra que DPO no es solo una herramienta de alineamiento para chatbots: es una técnica de ingeniería útil para mitigar una clase concreta de fallo en generación estructurada. El mensaje práctico es claro: cuando el error es categórico, frecuente y evaluable automáticamente, transforma tu basura en entrenamiento útil. ¿No es curioso que el modelo nos diga exactamente dónde dolía?