El transformer no valió la pena
La vez pasada dije que los clásicos ya estaban en 98%, y que la pregunta real no era si un transformer podía ganar — era si podía justificar su costo. Lo corrí. Aquí está la respuesta, y el giro que hizo que valiera la pena conservar el benchmark.
Esta es la secuela de una promesa, y la siguiente etapa del benchmark de mi tesis de máster. En la nota anterior, un modelo lineal sobre TF-IDF igualó a todo lo demás clasificando texto de transacciones bancarias, por una fracción del costo. Dije que la pregunta abierta no era si un transformer con fine-tuning podía ganarle — casi no había margen — sino si podía justificar su precio. Así que hice fine-tuning de DistilBERT sobre el mismo pipeline exacto. Sesenta y siete millones de parámetros contra ciento noventa mil.
En texto limpio, empate técnico. DistilBERT sacó 0,9983 de F1 macro. El modelo lineal, 0,9984. Corrí la prueba de McNemar — la correcta cuando dos clasificadores ven el mismo test set — y volvió con p = 1,00. No "cerca". De los casos en que los dos discreparon, el transformer acertó 4 y el lineal 5. Estadísticamente, el mismo modelo con otra ropa.
Un empate debería haberme inquietado más que una derrota.
Dos sistemas con visiones del lenguaje completamente distintas — uno contando frecuencias ponderadas de palabras, el otro corriendo attention sobre tokens subléxicos — sacaron el mismo score. Modelos que leen el problema de forma tan distinta no deberían caer en el mismo lugar. Cuando lo hacen, la tarea no está ejercitando lo que los diferencia.
Un empate entre modelos que ven el lenguaje distinto no es equivalencia. Es un benchmark que dejó de medir.
El benchmark tenía fuga
Los datasets públicos de este dominio están hechos con plantillas: un conjunto fijo de comercios pegado en un conjunto fijo de formatos bancarios. Los divides al azar y casi todo comercio del test set también está en entrenamiento. El modelo no necesita entender nada — memoriza comercio → categoría. Y para memorizar una tabla de búsqueda, un modelo lineal ya es óptimo.
El 99,9% que anuncia la ficha del dataset no es habilidad. Es fuga de información. Una vez que lo vi, el marcador en limpio era inútil: no distinguía entre modelos, así que no podía responder la pregunta con la que llegué.
Así que lo rompí a propósito.
Romperlo a propósito
Degradé el test set con cuatro tipos de ruido sacados de cómo se ven los extractos reales: erratas de teclado, descripciones truncadas, abreviaturas por supresión de vocales, e identificadores espurios. Aplicado solo al evaluar. Sin reentrenar — el punto era medir lo que cada modelo ya había aprendido, no dejarlo adaptarse.
Y escribí mi predicción antes de correrlo: iban a ganar los modelos subléxicos. DistilBERT parte una palabra desconocida en fragmentos conocidos, así que una errata no debería afectarlo. El lineal se apoya en términos completos, así que una errata debería destruir la característica de la que depende. De manual.
Perdió.
Con 30% de ruido: el modelo lineal retuvo el 89,9% de su score. DistilBERT, el 84,2%.
El mismo orden en los tres corpus, en cada nivel de ruido por encima de cero. Y McNemar, que en texto limpio no los podía separar, se dio vuelta con fuerza: de p = 1,00 a p = 1,3·10⁻⁷⁸, a favor del lineal.
| McNemar · lineal vs DistilBERT | Ganó por | p-valor | Veredicto |
|---|---|---|---|
| Texto limpio | 5 vs 4 | 1,00 | Empate — indistinguibles |
| Ruido 30% | 886 vs 265 | 1,3·10⁻⁷⁸ | Gana el lineal |
Los dos modelos que el test limpio llamó idénticos son, bajo ruido, distintos más allá de cualquier duda razonable. Los conteos son casos que solo uno acertó.
Por qué aguantó el simple
La explicación va de cómo está repartida la evidencia, no de cómo cada modelo trata una palabra que no conoce.
Una descripción de cinco palabras le da a TF-IDF unas nueve características — cinco palabras sueltas y cuatro pares contiguos. Corrompe una palabra y pierdes tres de esas características; sobreviven seis. Como el modelo lineal suma lo que está presente, las supervivientes siguen empujando hacia la categoría correcta. Se degrada suave, en proporción al daño.
Promediar embeddings hace lo contrario. Comprime cinco palabras en un solo vector, así que corromper una desplaza el promedio un quinto y no deja nada atrás que compense. El transformer tokeniza la errata bastante bien — pero nunca vio esa secuencia en entrenamiento, y la attention propaga la corrupción a los tokens vecinos. No se degrada. Se resbala.
La robustez vino de la redundancia en la representación, no de la sofisticación del modelo.
La línea que no cruzo
Una frontera, dicha sin rodeos, porque es el límite honesto de lo que medí. Probé resistencia a texto ruidoso, no generalización a comercios que el modelo nunca vio. Esa segunda cosa — una tienda nueva que el entrenamiento nunca contuvo — es justo donde el conocimiento previo de un transformer preentrenado todavía podría rendir. Nada aquí lo prueba.
Así que no te voy a decir que el transformer es inútil para este problema. Te voy a decir que no aportó nada bajo las condiciones que un extracto bancario real de verdad te tira.
De vuelta a la pregunta
¿Valió la pena? El transformer costó 356× los parámetros, 15× la latencia de inferencia, y una GPU para servirlo — para empatar en datos limpios y perder en datos sucios. En este problema, en estas condiciones, la respuesta es un no limpio. La arquitectura más cara resultó ser la menos precisa en la única condición donde los modelos de verdad se diferenciaban.
Nada de eso es un argumento en contra de los transformers. Es un argumento en contra de agarrar uno antes de que tu benchmark pueda probar que lo necesitas.
Cuando un test no puede separar dos modelos muy distintos, ¿publicas el barato y sigues — o te detienes a preguntar qué dejó de medir tu benchmark?
Sigue: el modelo que ganó esto pesa 1,3 MB. Suficientemente pequeño como para no necesitar servidor — corre dentro de la pestaña del navegador, y eso terminó cambiando la economía mucho más que la precisión.