1 puntos por GN⁺ 2024-11-15 | 1 comentarios | Compartir por WhatsApp
  • Al poner varios LLM a jugar ajedrez en las mismas condiciones, la mayoría se desmoronó después de la apertura, pero solo gpt-3.5-turbo-instruct mostró un rendimiento muy fuerte contra el nivel más bajo de Stockfish
  • El experimento consistió en hacer que el LLM jugara con blancas contra Stockfish en su nivel más bajo, y luego evaluar el estado del tablero en cada turno con la puntuación en centipeones de un motor de ajedrez
  • llama-3.2-3b, llama-3.1-70b, Qwen-2.5-72b, command-r-v01, gemma-2-27b, gpt-3.5-turbo, gpt-4o-mini, gpt-4o, o1-mini no lograron acercarse a gpt-3.5-turbo-instruct
  • Al comparar modelos de familias similares, el ajuste de instruction/chat pareció reducir el rendimiento en ajedrez, aunque el grado de deterioro varió de poco a muchísimo según el modelo
  • En los modelos abiertos apareció un problema del tokenizador en el que un solo espacio al final del prompt cambiaba mucho el rendimiento, y la entrada en notación de ajedrez reaccionaba de forma sensible a la representación interna del LLM y a las restricciones de generación

Configuración del experimento y método de evaluación

  • A los LLM se les dio un prompt para que eligieran la siguiente jugada como si fueran un gran maestro de ajedrez, y la entrada era una partida parcialmente desarrollada
    • La notación usada fue la notación algebraica estándar como e4, Rdf8, R1a3
    • También se incluía la instrucción de no escribir el número de turno ni explicar por qué elegían la jugada
  • En todas las partidas, el LLM jugó con blancas y el rival fue Stockfish, un AI estándar de ajedrez, en su nivel más bajo
  • Después de cada turno se puntuó el estado del tablero con un motor de ajedrez para comparar el rendimiento de los modelos
    • La unidad fue el centipeón, donde un peón vale 100 puntos y también se refleja el valor posicional
    • Si la partida terminaba, una victoria del LLM se contaba como +1500, tablas como 0 y derrota como -1500

Modelos que se debilitan bruscamente después de la apertura

  • llama-3.2-3b, un modelo base de 3 mil millones de parámetros, perdió las 50 partidas
    • Podía jugar unas cuantas jugadas de apertura estándar, pero pronto empezaba a perder piezas
    • Incluso con Stockfish en la configuración más baja, perdió todas
  • llama-3.1-70b, con 70 mil millones de parámetros, solo fue un poco mejor y aun así dio resultados muy malos
  • llama-3.1-70b-instruct, Qwen-2.5-72b, command-r-v01, gemma-2-27b también se probaron del mismo modo, pero no mostraron un rendimiento fuerte en ajedrez
  • llama-3.1-405b, probado en unas cuantas partidas, también era un modelo más grande que gpt-3.5-turbo, pero sus resultados siguieron siendo malos

El caso excepcionalmente fuerte de gpt-3.5-turbo-instruct

  • gpt-3.5-turbo-instruct es un modelo cerrado de OpenAI, así que sus detalles no están claros, pero mostró un rendimiento muy bueno en 10 pruebas
  • Era lo bastante fuerte como para ganar todas las partidas incluso subiendo varios niveles de dificultad de Stockfish
  • gpt-3.5-turbo, de nombre parecido, es un modelo ajustado de forma más conversacional, y su rendimiento en ajedrez fue muy distinto al de gpt-3.5-turbo-instruct
  • gpt-4o-mini, gpt-4o, o1-mini también fueron parte de la prueba, y gpt-4o perdió un poco más lentamente, pero aun así perdió todas las partidas
  • La tendencia de los experimentos de ajedrez con LLM en internet había despertado interés entre septiembre y octubre de 2023 por alcanzar nivel de aficionado avanzado, pero en modelos recientes volvió el patrón de derrumbarse después de la apertura

Ajuste instruction/chat y rendimiento en ajedrez

  • Al comparar dentro de familias parecidas modelos más cercanos al base con modelos ajustados adicionalmente, el ajuste instruction adicional apareció en todos los casos como algo que empeoraba el rendimiento en ajedrez
  • El grado de deterioro no fue constante
    • En dos casos la diferencia fue pequeña
    • En un caso la diferencia fue muy grande
  • El nombre gpt-3.5-turbo-instruct debe interpretarse distinto de la convención habitual de nombres
    • Aquí se trata como un modelo más cercano al base model que gpt-3.5-turbo
    • Es lo contrario de lo que normalmente implican instruct o it, que suelen indicar más ajuste para conversación o seguimiento de instrucciones

Posibles causas

  • Posibilidad de que los base model grandes puedan jugar ajedrez, pero el ajuste instruction lo arruine

    • Coincide con los resultados del experimento, pero hay un contraejemplo: llama-3.1-405b también tuvo malos resultados
  • Posibilidad de que gpt-3.5-turbo-instruct haya sido entrenado con más partidas de ajedrez

    • Es probable que todos los modelos hayan aprendido de muchas partidas de ajedrez, pero es difícil saber la cantidad exacta
  • Posibilidad de que las diferencias en la arquitectura Transformer hayan influido

    • Tampoco es fácil descartar que los modelos de la familia Llama sean particularmente débiles en ajedrez
  • Posibilidad de que hubiera competencia entre distintos tipos de datos

    • Un Transformer entrenado solo con partidas de ajedrez puede jugar extremadamente bien
    • Si gpt-3.5-turbo-instruct fue entrenado con datos donde la proporción de partidas de ajedrez era mayor, una fracción más grande de sus parámetros pudo haberse dedicado al ajedrez
    • Si esta hipótesis es correcta, un modelo lo bastante grande debería poder jugar bien al ajedrez aunque la proporción de partidas de ajedrez sea baja, siempre que haya aprendido suficientes datos de ajedrez

Detalles de implementación y limitaciones

  • Los modelos abiertos se ejecutaron directamente, y se clasificó como abiertos a todos los modelos que no fueran de OpenAI
  • Para ejecutar los modelos abiertos se usó cuantización Q5_K_M
  • En los modelos abiertos se generaban directamente las jugadas legales posibles y se restringía la salida con llama.cpp grammars para que siempre saliera una jugada legal
  • Los modelos de OpenAI no soportan una grammar completa, así que se les permitió generar hasta 10 veces, y si aun así no salía una jugada legal, se elegía una al azar
  • Para los modelos de chat llama-3.1-70b-instruct, gemma-2-27b-it, gpt-3.5-turbo, gpt-4o-mini, gpt-4o se usó un system prompt aparte
  • o1-mini se ejecutó tal cual porque no permite cambiar el system prompt
  • Los modelos abiertos se ejecutaron con temperature 0.7 y los modelos de OpenAI con los valores por defecto

El fenómeno extraño del espacio en el prompt y el tokenizador

  • En los modelos abiertos, un prompt que terminaba con espacio como 1. e4 e5 2. rendía mucho peor que un prompt que terminaba sin espacio como 1 e4 e5 2.
  • Se considera que la causa está relacionada con el tokenizador
    • El tokenizador de Llama genera e como un solo token después de 1.
    • Eso no es lo mismo que generar e después de un token de espacio
    • Si se pone un espacio al final de la entrada y luego se genera el siguiente token, el modelo queda en una situación confusa
  • La forma correcta de manejarlo es usar token healing: borrar el último token de la entrada y hacer generación restringida sobre todas las cadenas que empiecen con la cadena borrada
  • En la implementación, en vez de token healing, se quitó el espacio y se cambió la grammar para que pudiera generar o no un espacio, y luego generar la jugada legal actual junto con el espacio opcional
  • En una actualización se agregó que ya se identificó la causa real de este fenómeno, y se dejó la pista de que nadie todavía había acertado la explicación correcta

Posible optimización por parte de OpenAI

  • Una hipótesis es que, al ver el interés por el rendimiento en ajedrez, OpenAI pudo haber optimizado de alguna forma los datos de entrenamiento, el fine-tuning o el algoritmo de gpt-3.5-turbo-instruct para mejorar su rendimiento en ajedrez
  • Bajo esa misma idea, esa optimización pudo no haberse mantenido en modelos posteriores por trade-offs como costo o deterioro de otras funciones
  • No hay evidencia clara de esto; es más bien una especulación del tipo “OpenAI lo hizo intencionalmente”, y tampoco está claro si el momento coincide

1 comentarios

 
GN⁺ 2024-11-15
Opiniones de Hacker News
  • Parece que el artículo pasa por alto una posibilidad bastante obvia: OpenAI pudo haber visto el ajedrez como un benchmark que “había que ganar” y haber metido un tratamiento especial solo para ajedrez dentro de gpt-3.5-turbo-instruct, pero no incluirlo en modelos posteriores porque ya no generaba atención mediática sostenida.

    • Creo que es exactamente eso. Aquí está el pull request donde se agregó la evaluación de ajedrez: https://github.com/openai/evals/pull/45
    • Yo tengo la misma sospecha. Más que que el LLM “aprendiera ajedrez”, quizá “aprendió” a reconocer una partida de ajedrez y pasar la instrucción a un motor de ajedrez. Si es así, no tiene nada de impresionante.
    • Esa posibilidad parece bastante alta, pero me da curiosidad si ese tratamiento especial se inyectó dentro del LLM mediante aprendizaje por refuerzo, o si del otro lado de la llamada a la API de OpenAI están corriendo no solo un LLM de billones de parámetros, sino también una instancia de Stockfish.
    • El ajedrez obviamente era un benchmark que valía la pena ganar, y lo ha sido desde Watson. Antes de eso, incluso se remonta al Mechanical Turk.
    • Para ser justos, el artículo sí dice algo parecido en “Teoría 2: GPT-3.5-instruct fue entrenado con más notación de partidas de ajedrez”.
  • Hay partes importantes en las pruebas: en los modelos cerrados de OpenAI, si no salía una jugada legal, generaban hasta 10 veces y, si aun así no funcionaba, elegían una al azar; los modelos abiertos se corrieron localmente con cuantización Q5_K_M; el rendimiento de los modelos abiertos cambiaba mucho solo por si había o no un espacio al final del prompt; los modelos abiertos usaban temperatura 0.7, mientras que los de OpenAI usaban el valor por defecto.
    Hay una mezcla de comportamientos raros del tokenizador, temperatura, cuantización, jugadas aleatorias y prompts de ajedrez, así que no sé cómo interpretar los resultados. Aun así, el artículo es interesante.

    • Eso estaba enterrado hacia el final del artículo. Cuando antes vi a LLMs jugar ajedrez, ni siquiera podían hacer jugadas legales de forma consistente, así que me preguntaba cómo es que aquí todos los modelos podían hacer jugadas legales.
  • Tal vez, si de verdad queremos modelos inteligentes, deberíamos dejar de tokenizar. Estamos limitando desde el inicio, mediante la estructura del flujo de información de entrada, qué ve el modelo y cómo percibe el mundo.
    Sé que trabajar con bits o bytes crudos es lento, pero refutar la hipótesis de que grandes problemas podrían deberse a la tokenización parece relativamente barato y fácil. Me sorprende no ver más investigación sobre tokenizaciones radicalmente distintas.

    • Creo que la mayoría de lo que se llama “problema de tokenización” en realidad es un problema de razonamiento, pero muchas veces se atribuye erróneamente a un detalle técnico menor.
      Por ejemplo, se suele decir que los LLM no pueden contar cosas básicas por culpa de la tokenización, pero el mismo LLM cuenta bien si se usa un prompt de cadena de pensamiento. Entonces eso no se puede explicar con tokenización. El problema es que una persona tiene que indicarle que, si lo resuelve paso a paso, llega a la respuesta correcta; sin esa ayuda, es fácil que solo adivine.
    • Creo que entrenar a nivel de bytes es poco práctico. Aun así, usar tokens diseñados a mano, que al final son tokens al estilo humano, se siente muy equivocado. Si miras un tokenizador real, trae cosas curiosas como expresiones regulares que cambian qué se tokeniza según reglas empíricas.
      Si se pueden convertir imágenes en tokens y también audio en tokens, sigo pensando que quizá se podría crear un conjunto de tokens de representación semántica elegidos por el propio modelo y luego decodificar esos tokens de vuelta a texto. La desventaja es que el proceso de convertir los tokens codificados de vuelta a texto sería con pérdida, así que ya no se podría citar el texto visto 1:1.
      Según entiendo, OpenAI hizo exactamente algo así con las imágenes en el informe de gpt-4o. Ver “Explorations of capabilities”: https://openai.com/index/hello-gpt-4o/
    • Hay una razón por la que el cerebro humano tiene áreas dedicadas al procesamiento del lenguaje. La tokenización probablemente sea una estrategia bastante sólida. El punto realmente clave es que el lenguaje no es una buena forma de codificar todos los tipos de conocimiento.
    • https://youtu.be/zduSFxRajkE
      Karpathy también está de acuerdo con la misma idea. Es un video de 2 horas en el que reconstruye un tokenizador y odia los tokenizadores.
    • Si bajas de tokens a bytes, el tamaño del modelo explota. No encuentro ahora la referencia, pero se dice que si reduces el tamaño promedio del token, el ancho del modelo, es decir, el tamaño de cada capa, aumenta proporcionalmente al cuadrado. Afecta no solo la velocidad de inferencia, sino también la de entrenamiento.
  • Vale la pena experimentar cambiando el prompt y la posición del tablero de varias maneras. Como referencia, la posición del tablero que se le dio al modelo es esta imagen: https://i.imgur.com/qRxalgH.png
    Puede haber más de una cosa rara en este experimento. Por ejemplo, dar instrucciones a una variante del modelo que no fue ajustada para seguir instrucciones podría ser contraproducente. Más importante aún: cuando solo se entrega un PGN recortado, me pregunto si en esa posición las blancas parecen un jugador de nivel gran maestro. Aunque el modelo entienda bien el ajedrez, intentará predecir la jugada más plausible en la posición actual; si juzga que las blancas son un mal jugador, puede predecir que una mala jugada es más probable.

    • Pude encontrar algunas partidas entre jugadores fuertes que empiezan así, así que mi hipótesis de que el modelo predice malas jugadas a propósito se debilita: https://www.365chess.com/search_result.php?search=1&p=1&m=8&n=3071&order=welo&ms=e4.e6.d3.c5.Nf3.Nc6.g3.Nf6&rev=&wid=&bid=
      Aun así, poner Stockfish en el nivel más bajo y presentarlo como “un oponente muy fuerte” pudo haber confundido al modelo hasta cierto punto. Si interpreto bien la gráfica, las primeras jugadas del modelo se ven aceptables y luego empiezan los problemas. Valdría la pena repetir el experimento cambiando la guía del prompt, la fuerza de Stockfish, la posición inicial, los nombres ficticios de los jugadores, etc.
    • El experimento empezó desde la primera jugada de cada partida y continuó cada partida hasta el final. La posición que enlazaste es solo un ejemplo del formato en el que se introduce el estado de la partida al modelo en cada jugada.
      Si hubiera sido contra una sola jugada aislada, ¿qué significaría exactamente “ganar” o “perder”?
  • De acuerdo. Se pueden probar algunas variaciones del prompt: qué pasaría si se le permite al modelo el proceso de razonamiento, que en este experimento se prohibió explícitamente. Además, si en cada paso se describe la posición del tablero en el prompt, el modelo no tendría que calcularla o estimarla internamente.

    • Se jugó la partida completa, no una sola jugada.
  • Me pregunto si el modelo intenta hacer jugadas ilegales. El autor original no lo menciona, pero las reglas del ajedrez son bastante arbitrarias y los LLM son conocidos por inventar algo plausible antes que admitir que no tienen respuesta en problemas difíciles, así que parece inevitable que ocurra al menos una vez.

  • No entiendo por qué gente instruida espera que un LLM pueda jugar ajedrez a un nivel plausible.
    Un LLM no conoce la calidad de sus datos. Un prompt de “actúa como x” no sustituye el razonamiento real ni el cálculo determinista que el ajedrez obviamente requiere.

    • Entonces, ¿no debería sorprendernos el hecho de que turbo-instruct realmente juegue bien? Abundan las afirmaciones vagas basadas en intuiciones antropomórficas infundadas como “razonamiento real”. Creo que la situación actual es una buena prueba de que nadie entiende bien qué está pasando.
      Si un modelo mental dice que los LLM no deberían poder jugar ajedrez, no puede explicar a un LLM que juega ajedrez fuerte. Y, a la inversa, un modelo que dice que deberían jugar bien no puede explicar por qué muchos modelos grandes fracasan estrepitosamente en ajedrez. Claramente está ocurriendo algo más complejo.
    • Uno de los objetivos principales de hacer experimentos es comprobar si nuestras ideas preconcebidas son correctas. Claro, si esa pregunta no te interesa, no hace falta mirar por el telescopio.
    • Con suficiente información de entrenamiento, esto se parece más a un rompecabezas. Un LLM puede generar correctamente el estado del tablero después de las jugadas dadas, también puede producir un resumen de la posición no tan malo, y al menos puede enumerar amenazas a una jugada de distancia.
      “Nivel plausible” es subjetivo, pero con eso debería poder ganarle a un principiante. El nivel mínimo de Stockfish usado en el artículo también corresponde a un jugador intermedio de los más bajos. Depende de si hablamos de las implementaciones públicas actuales o de la idea general de los LLM; y si se quieren mejores resultados, también se les podría alimentar con muchos más libros de ajedrez y análisis de partidas pasadas.
    • El ajedrez es una simple tarea de modelado probabilístico de secuencias, y vi con mis propios ojos que GPT-3.5-turbo-instruct juega a nivel de aficionado avanzado. Pero parece que el RLHF y la destilación incorporados en los modelos nuevos arruinan esa capacidad.
    • Entonces la pregunta es por qué gpt-3.5-instruct puede ganarle a Stockfish.
  • Que hayan corrido un modelo abierto con cuantización Q5_K_M solo significa que todos los parámetros fueron comprimidos con pérdida. Probablemente no importe, ¿no?

    • Si compite contra modelos no cuantizados de OpenAI, probablemente sí importe.
  • Creo que entrenar ajedrez como secuencia crea más problemas de los que resuelve. Ni siquiera entrenar con 1 billón de partidas te salvaría: https://en.wikipedia.org/wiki/Shannon_number
    Para completar: los motores de ajedrez modernos usan modelos especializados de ajedrez de alta calidad como parte de sus herramientas, y pueden, como mínimo, empatar siempre contra cualquier jugador actual o histórico. Si el rival comete incluso el error más pequeño, pierde. Subir Stockfish al nivel máximo, o al menos a un jugador de 1800+ Elo, podría producir partidas más exitosas, pero eso sería solo resultado de reducir el ruido en los datos de entrenamiento, porque los jugadores avanzados hacen menos jugadas basura; no significa que sea mejor juego.

    • Exacto. Como ya se señaló antes, la cantidad de posiciones posibles de ajedrez supera fácil y enormemente incluso las estimaciones más generosas del número de átomos en el universo conocido.
    • Ya que mencionas a Shannon, pregunto: ¿cuál sería el tamaño mínimo de muestra representativa de ese espacio de problemas? ¿Se acerca lo suficiente al número de jugadas de ajedrez publicadas en internet y en libros?
    • Así es. Una vez que se sale de la secuencia, se pierde.
      Quizá funcione mejor entrenar las mejores jugadas en miles de millones o billones de posiciones y meter eso en alguna IA. Posiciones parecidas a menudo tienen el mismo tipo de mejor jugada.
    • Sinceramente, si descartas las jugadas que jamás se harían y consideras simetrías y posiciones del tablero que en la práctica son similares, quizá el ajedrez no sea un juego tan grande. Esas posiciones pueden detectarse incluso con un reconocedor de patrones muy simple.
  • Encontré un conjunto de experimentos relacionados que incluye gpt-3.5-turbo-instruct, gpt-3.5-turbo y gpt-4.
    La conclusión es igual de sorprendente: gpt-3.5-turbo-instruct juega ajedrez mucho mejor.
    https://blog.mathieuacher.com/GPTsChessEloRatingLegalMoves/

    • Apostaría a que probablemente está haciendo llamadas a funciones a un motor de ajedrez real. Un análisis de tiempos sobre cómo cambia, o no cambia, el tiempo de inferencia según la cantidad de tokens o la complejidad de la partida podría demostrarlo.
  • OpenAI tiene muchísima experiencia creando IA para jugar. Si recuerdan, durante algunos años esa fue su área principal. Así que parece que hicieron un modelo bien adaptado al ajedrez para ver si entrenar ajedrez influye en la inteligencia general. Tal como aprender ajedrez puede hacer más inteligente a una persona, y aprender matemáticas o programación también podría hacerlo.

    • Jugar está fuertemente relacionado con una representación abstracta del estado del juego. Aunque el jugador no sea consciente de ello, el ajedrez se parece a un problema de búsqueda superficial o búsqueda en haz dentro de las jugadas posibles.
      Un LLM no razona ni busca; escribe texto basándose en texto previo. Por eso a nuestros ojos puede parecer que juega, pero en realidad es una conjetura inteligente basada en partidas anteriores. Es parecido a Kasparov anotando jugadas sin imaginar la disposición real de las piezas. Un experimento interesante sería ver si el modelo puede jugar cuando solo se le dan las reglas; probablemente no pueda. Ahora está reproduciendo de memoria, no siguiendo objetivos. Todavía no hay nada como atención hacia adelante, y la búsqueda en haz es lo bastante cara como para que sea mejor recurrir directamente a algoritmos clásicos de ajedrez.
    • Creo que estás confundiendo OpenAI con DeepMind.
      OpenAI no ha hecho nada salvo agentes conversacionales.