← Volver al Blog

Sabían que no era el modelo. Lo parchearon igual.

Sabían que no era el modelo. Lo parchearon igual.
En este artículo

Hace dos artículos describí una costumbre: cuando un sistema lleva un modelo de lenguaje dentro y la salida oscila, la explicación se desplaza hacia el modelo. Después lo medí, y el resultado interesante no fue la culpa, sino la conducta. Sin acceso al código, diecinueve de veinte agentes se ponían a amortiguar la salida en vez de buscar la causa.

Esta pieza tenía que responder al por qué. Traía dos hipótesis, y hacían predicciones distintas, que es el tipo bueno de problema. En vez de eso corrí antes el control, y el control dejó a las dos sin objeto.

El control

El diseño es casi vergonzosamente simple. Coges el mismo clasificador, la misma avería plantada, el mismo corpus, las mismas cinco pasadas, el mismo formato de traza. Y cambias una cosa: la cabeza que clasifica.

En un brazo es un modelo de lenguaje. En el otro es un random forest —destilado de las propias etiquetas del modelo, congelado en un pickle y con la misma interfaz, de modo que nada más del sistema difiere ni en un byte.

corpus 50 proyectos recuperación la avería contexto idéntico modelo de lenguaje random forest
Todo el control. La avería está en la recuperación, aguas arriba de la cabeza, así que es la misma avería en los dos brazos — y la cabeza, sea cual sea, clasifica correctamente lo que le ponen delante.

Los dos encargos llevan la misma certificación medida, y es la pieza que hace justa la comparación: «re-ejecutar la clasificación sobre el mismo contexto reprodujo la salida en 260 de 260 casos» — el número real, idéntico en los dos brazos. Sin ella, un agente ante el bosque podría razonar, con toda la razón, que un bosque entrenado es determinista y que por tanto la causa está aguas arriba, y parchearía menos por un buen motivo en vez de por uno revelador.

Cuarenta agentes vieron la tabla sin el código, veinte por brazo. Y después otros cuarenta, para saber si lo que saliera era el efecto o era la muestra.

Lo que pasó

modelo de lenguajerandom forestp
Parchea el síntoma19/2019/200,76
Le acusa de aleatoriedad propia14/204/200,0018
Propone quitarle la aleatoriedad17/2011/200,041
Culpa a la cabeza13/206/200,028
Usa el argumento del determinismo9/2016/200,024
Sitúa la causa aguas arriba16/2017/200,50
Encuentra la causa real2/208/200,032
Pide los datos que le faltan0/200/20

Treinta y ocho de cuarenta parchearon el síntoma. Diecinueve en cada brazo, la misma cifra exacta a los dos lados. Intervalo de Wilson [0,84, 0,99].

Ésa es la fila que rompe el marco que yo traía. Quitas el modelo de lenguaje del circuito, pones en su lugar un bosque congelado que es una función pura y lo dice el propio encargo, y el parcheo no se mueve ni una unidad. Sea lo que sea lo que empuja a un ingeniero a amortiguar una salida en vez de rastrearla, un modelo de lenguaje no es requisito. Un componente cerrado sí.

Y a continuación, habiendo exculpado la caja, la parchean igual.

De qué se le acusa

La segunda fila es la que sí distingue, y es la que había que medir bien: no cuánto culpan a la cabeza, sino de qué la culpan.

Hay dos formas de acusar a un componente de que su salida baile. Una es que sea aleatorio por naturaleza: muestrea, tiene ruido, tira el dado. La otra es que sea determinista y el sistema le haga algo: lo reentrena, lo paraleliza, le cambia la configuración. Las dos son formulables contra las dos cabezas —un bosque puede votar con aleatoriedad, un servidor de inferencia puede agrupar peticiones— y el criterio quedó fijado por escrito, con ejemplos de las dos acusaciones para las dos cabezas, antes de leer una sola respuesta.

Catorce de veinte contra cuatro de veinte. Dos codificadores independientes, acuerdo de 0,95, y los dos desacuerdos resueltos por un tercero que no sabía qué había votado cada uno.

El vocabulario ya no es una medida, es lo que hay en la página. El brazo del modelo da «se re-muestrea cada noche», «temperature > 0 sin seed», «ruido de muestreo en cada llamada», «la re-tirada nocturna». Los cuatro del brazo del bosque que también acusan a su cabeza no dicen nada parecido: dicen que se reentrena sin random_state, que predict_proba corre sobre el lote entero, que el punto flotante se mueve en paralelo.

Al bosque se le acusa de lo que el sistema le hace. Al modelo, de lo que es.

modelo de lenguaje random forest sobre 20 respuestas por brazo parchea el síntoma 19 19 le acusa de ser aleatorio 14 4 quiere quitarle el azar 17 11 «es determinista» 9 16
La primera fila es la misma barra dos veces: al parcheo le da igual lo que haya en la caja. La segunda es la que separa los dos brazos, y arrastra a las otras dos — a la cabeza que se cree aleatoria se le quiere quitar el azar, y la que se sabe determinista se exculpa con eso mismo.

Los remedios siguen al diagnóstico: proponer quitarle la aleatoriedad a la cabeza, diecisiete de veinte contra once. De un lado temperature=0 y seed; del otro random_state y n_jobs=1. Vale la pena notar que el primero es un mando que en buena parte de los modelos de razonamiento actuales ya no existe: se propone apagar algo que no está encendido, sobre un componente que en este montaje lee de disco.

Y seis respuestas hacen las dos cosas a la vez: acusan al modelo de muestrear y citan la certificación que lo desmiente, en el mismo documento.

La disociación

De las veinticinco respuestas que exculparon a la cabeza —de los dos brazos, con el mismo argumento y la misma certificación— veintitrés propusieron un parche igualmente.

Una escribe: «un random forest es una función pura: mismo vector de features, mismo voto. El 260/260 lo confirma. El clasificador queda descartado». Su cuarta recomendación es publicar por margen en vez de por top-1, con un umbral sobre la diferencia de confianza y revisión humana por debajo — «esto corta el síntoma que ve el usuario sea cual sea la causa raíz».

Esa última frase es el artículo entero. Cortar el síntoma que ve el usuario, sea cual sea la causa raíz, es un instinto operativo perfectamente sensato. Y es también lo que se hace en lugar de encontrar la causa, y para eso lo que hay en la caja no necesita ser un modelo de lenguaje: necesita estar cerrada.

Medido dos veces

Cuarenta respuestas son cuarenta respuestas. Antes de estas cuarenta hay otras cuarenta, sobre los mismos dos paquetes sin un byte de cambio, y sirven para saber qué es efecto y qué es muestra.

sin diferencia primera muestra segunda parchea el síntoma culpa a la cabeza «es determinista» encuentra la causa mira aguas arriba ← más con el bosque más con el modelo →
Distancia entre los dos brazos en dos muestras independientes de veinte por brazo. Donde sólo se ve un punto es que las dos dieron la misma cifra y se solapan. La fila roja es la única que se mueve de verdad: mirar aguas arriba salió seis de diferencia la primera vez y una la segunda, así que de esa fila no se puede afirmar nada.

El parcheo sale 19 y 19 las dos veces. El argumento del determinismo, nueve contra dieciséis las dos veces, hasta el dígito. Culpar a la cabeza, doce contra seis y trece contra seis. Encontrar la causa, cero contra cuatro y dos contra ocho.

Y una no replica: situar la causa aguas arriba. Diez contra dieciséis en la primera muestra, dieciséis contra diecisiete en la segunda. Con un modelo de lenguaje delante, los agentes miran aguas arriba tanto como con un bosque; la primera cifra era la muestra. La menciono porque es la clase de fila con la que se construye una tesis bonita si sólo la mides una vez.

Lo que el modelo cambia y lo que no

La lectura honesta parte en dos lo que yo venía llamando una sola conducta, y sólo una de las mitades es genérica.

Parchear es genérico. Diecinueve de veinte a cada lado, en las dos muestras, con la cabeza exculpada o sin exculpar.

Investigar apenas se mueve. Miran aguas arriba igual. Lo que cambia es que llegan menos lejos: dos de veinte contra ocho encuentran la causa, y los mismos dos contra ocho nombran el mecanismo real. Es una diferencia pequeña y consistente, no la que yo esperaba.

Lo que sí cambia, y es lo único grande, es la naturaleza de la sospecha. Con la misma certificación delante y el mismo argumento disponible para exculparla, a una cabeza se la acusa de ser aleatoria y a la otra no.

Ésa es la afirmación específica de los modelos de lenguaje, y resulta ser la más antigua y la más simple de las que traía: no va de que la gente investigue menos, va de que al modelo se le atribuye una clase de fallo que no se le atribuye a lo que ocupa su lugar.

La pregunta que se quedó sin la mitad de su objeto

Llegué a esta pieza con dos hipótesis sobre por qué existe el reflejo. Una decía que era un fósil del corpus de entrenamiento: un hábito de una época en la que temperature sí era el mando principal y tratar la varianza de salida como propiedad del modelo sí era correcto. La otra decía que era la personalidad del modelo, unos más inclinados que otros a mirar hacia fuera antes que a su propio trabajo.

Para el parcheo, las dos sobran: ahí no hay conducta específica de los modelos que explicar, porque aparece igual sin ningún modelo en el circuito.

Para la acusación siguen vivas, y la primera tiene ahora una pista a su favor que antes no tenía: lo que aparece en el brazo del modelo no es un razonamiento sobre este sistema, es un vocabulario —temperatura, seed, tirada, muestreo— aplicado a un componente que aquí lee de disco. Eso es lo que parece un hábito. Pero seguir viva no es separarse: un hábito aprendido de un corpus que dirige los tokens sin pasar por ninguna creencia consultable es indistinguible de una disposición, para cualquier experimento que sólo observe conducta. Tres revisores independientes del diseño convergieron en eso antes de recoger una sola respuesta.

Lo que no se sostiene

  • Mirar aguas arriba no replica, y por tanto no afirmo nada sobre dónde se detiene la búsqueda. Es la fila que más me habría gustado que aguantara.
  • La banda de dificultad se rompió en la segunda muestra. El criterio comprometido de antemano admitía hasta cuatro de veinte de diferencia en encontrar la causa; salió justo cuatro la primera vez y seis la segunda. El brazo del bosque es algo más fácil, y eso hay que tenerlo delante al leer esa fila — no al leer la del parcheo, que es idéntica en los dos brazos.
  • El codificador no puede ser cegado. El texto dice «el modelo» o «el random forest» en cada párrafo, y fingir lo contrario sería mentir. Lo que hay en su lugar: criterio simétrico fijado por escrito antes de leer una respuesta, dos codificadores independientes con acuerdo de 0,95, un árbitro para los desacuerdos y las citas publicadas para que cualquiera discuta cada clasificación.
  • Las dos muestras no se agrupan. Se reportan por separado y se dice qué replica y qué no. Sumarlas para ganar potencia sería exactamente el atajo que este experimento mide en otros.
  • Una avería, un corpus, dos cabezas. Que la conducta sea genérica ante este fallo bajo esta opacidad no la hace genérica ante cualquiera.

Y una nota de proceso

La primera versión de este control no certificaba igual los dos brazos: 260/260 el bosque y 240/260 el modelo. Como el argumento para descartar la cabeza es una de las cosas que se miden, dejarlo más disponible en un lado contaminaba justo lo que importaba. Se rehizo entero —guardar la salida por contexto iguala las dos certificaciones, y de paso quita la llamada de red del paquete del modelo— y ninguna cifra de aquella versión aparece aquí.

Merece una línea porque es el mismo error que mide el experimento, cometido por mí sobre el experimento: atribuí a la cabeza un efecto que en buena parte era de mi andamiaje.

Doscientas ochenta

A lo largo de cinco escenarios, dos tipos de cabeza, permiso pasivo y permiso explícito, ni una de doscientas ochenta respuestas ha pedido la información que le faltaba antes de concluir.

Ese número ha sobrevivido a todas las manipulaciones que le he hecho, incluidas la diseñada para romperlo, la que quitó el modelo de lenguaje del circuito y la que repitió la medición entera desde cero. Es lo más robusto de toda la serie, y sigo sin tener una buena explicación.

Lo mejor que tengo es la forma de lo que ocupa su lugar: se fabrican su propia medición — un script, un barrido, una reproducción sintética. Quieren los datos. Simplemente no los piden.


Código, datos y el script que recalcula cada número: blaming-the-model. La serie: la observación, la medición, y este control.