18 puntos por xguru 2024-06-10 | 2 comentarios | Compartir por WhatsApp
  • GPT-4o cobra 170 tokens por procesar cada mosaico de 512x512 usado en el modo de alta resolución. A una proporción aproximada de 0.75 tokens por palabra, esto implica que una imagen equivale a unas 227 palabras
    • Comparado con el dicho “una imagen vale más que mil palabras”, hay una diferencia de aproximadamente 4 veces
  • El número 170 es extrañamente específico. OpenAI suele usar números redondeados en sus precios, como “20 dólares” o “0.50 dólares”, y potencias de 2 y 3 en sus dimensiones internas
  • ¿Por qué elegir un número como 170? En programación, a los números que aparecen en una base de código sin explicación se les llama “números mágicos”, y 170 es un número mágico bastante llamativo
  • ¿Por qué convertir el costo de imagen a una cantidad de tokens? Si fuera solo para fines de facturación, listar el costo por mosaico sería menos confuso
  • ¿Y si OpenAI eligió 170 simplemente porque es literalmente cierto? ¿Y si un mosaico de imagen realmente se representa como 170 vectores de embedding consecutivos?

Embeddings

  • Lo primero que hay que recordar sobre los modelos transformer es que operan sobre vectores, no sobre tokens discretos
    • La entrada tiene que ser un vector; de lo contrario, la similitud por producto punto, que es la esencia del transformer, no tendría sentido
    • Todo el concepto de tokens es una etapa de preprocesamiento: el texto se convierte en tokens, y los tokens se convierten en vectores de embedding mediante un modelo de embeddings antes de llegar a la primera capa del modelo transformer
  • Por ejemplo, Llama 3 usa internamente 4,096 dimensiones de características
    • Si tomamos la oración “My very educated mother just served us nine pizzas.”
    • BPE la convierte en 10 tokens enteros (incluyendo el punto), y luego cada uno se transforma mediante el modelo de embeddings en un vector de 4,096 dimensiones, formando una matriz de 10x4096
    • Esa es la entrada “real” para el modelo transformer
  • Sin embargo, no existe ninguna regla que diga que esos vectores deban salir de un modelo de embeddings de texto
    • Esa estrategia funciona bien para datos de texto, pero si quieres alimentar al transformer con otros formatos de datos, simplemente puedes usar otra estrategia de embeddings
  • Sabemos que OpenAI piensa en esta dirección porque publicó el modelo de embeddings CLIP en 2021
    • CLIP inserta texto e imágenes en el mismo espacio vectorial semántico, de modo que puede usar similitud del coseno para encontrar imágenes relacionadas con una cadena de texto o imágenes semánticamente similares a otras imágenes
    • Sin embargo, CLIP inserta la imagen completa como un solo vector, no 170. GPT-4o debe usar internamente otra estrategia más avanzada para representar imágenes (y de la misma manera video, voz y otros tipos de datos). Por eso es “omnimodal”
  • En particular, vale la pena intentar inferir cuál podría ser esa estrategia para datos de imagen

Número de dimensiones de características

  • Si intentamos estimar cuántas dimensiones usa internamente GPT-4o para representar vectores de embedding, no podemos saber el número real porque es propietario, pero sí podemos hacer suposiciones razonables
  • OpenAI parece preferir potencias de 2, y a veces mezcla un solo factor de 3
    • Por ejemplo, usa 1,536 para los embeddings de ada-002 y 3,072 para text-embedding-3-large
    • Se sabe que GPT-3 usa 12,288 dimensiones en total
    • GPT-4o podría haber mantenido o aumentado ese parámetro
  • No parece probable que la cantidad de embeddings se haya reducido de GPT-3 a GPT-4o, aunque es posible
  • Lanzamientos como GPT-4 Turbo en realidad fueron más rápidos y baratos que versiones anteriores, y si los desarrolladores tenían benchmarks que mostraban que un tamaño menor era igual de bueno en calidad, reducir la dimensión de embeddings podría haber sido parte de eso
  • Es muy probable que la cantidad de dimensiones de características usadas dentro de GPT-4o sea una de estas: 1536, 2048, 3072, 4096, 12228, 16384, 24576
  • Supongamos que GPT-4o usa 12,228 para la dimensión de los vectores de embedding. Aunque difiera por un factor de 2 o 4, eso no importa demasiado. El mismo argumento seguiría aplicando

Embeddings de imagen

  • Como los mosaicos de imagen son cuadrados, es probable que se representen como una cuadrícula cuadrada de tokens
    • 170 está muy cerca de 13x13
    • El token adicional podría ser un solo vector de embedding que codifique una impresión gestáltica de la imagen completa, de forma similar a CLIP
  • Entonces, ¿cómo se pasa de 512x512x3 a 13x13x12228?

Estrategia 1: píxeles sin procesar

  • Una forma muy simple de llevar una imagen a un espacio vectorial:
    • Dividir una imagen de 512x512 en una cuadrícula de “mini mosaicos” de 8x8
    • Cada mini mosaico es de 64x64x3 y se aplana en un vector de 12,228 dimensiones
    • Cada mini mosaico es un solo vector de embedding
    • El mosaico de imagen completo queda representado por 64 vectores de embedding consecutivos
  • Este enfoque tiene dos problemas:
    1. 64 ≠ 170
    2. Es muy tonto (no tiene mucho sentido hacer embeddings con valores RGB crudos y esperar que el transformer lo resuelva)

Estrategia 2: CNN

  • Por suerte, ya existe un modelo con estas características y con un historial de más de 10 años procesando datos de imagen con éxito: la red neuronal convolucional (Convolutional Neural Network)
  • Las CNN tienen propiedades como invariancia a la traslación y a la escala
  • AlexNet y YOLO son ejemplos representativos de arquitecturas CNN
  • Una CNN es como un embudo que comprime píxeles crudos en vectores semánticos
  • YOLO no reduce la imagen a un solo vector plano, sino que se detiene en 13x13
    • La salida de YOLOv3 son 169 vectores distintos colocados en una cuadrícula de 13x13, cada uno de 1,024 dimensiones
  • Es razonable esperar que la CNN hipotética de embeddings de imagen de GPT-4o tenga una forma similar a la de estas arquitecturas CNN
  • Se propone una forma de usar capas CNN estándar para pasar de 512x512x3 a 13x13x12228
    • Un diseño similar a AlexNet podría lograrlo elegantemente (usando 5 bloques repetidos idénticos)
    • También hay una alternativa más parecida a YOLO, pero llega a 12x12 (en lugar de 13x13)
  • No se puede demostrar, pero estos diseños especulativos muestran que sí existen arquitecturas CNN plausibles que podrían representar una imagen como una cuadrícula kxk de vectores de embedding

Verificación experimental

  • ¿De verdad GPT-4o puede ver una cuadrícula de vectores de embedding de 13x13?
  • Para probarlo, se diseñó una tarea inspirada en las cartas Zener: identificar el color y la forma de todos los símbolos en una cuadrícula dentro de una imagen
  • Con un programa simple se generaron imágenes de prueba con cuadrículas, y se le dio a GPT-4o un prompt para describir la forma y el color de cada celda en formato de arreglo JSON
  • Si la hipótesis de 13x13 fuera correcta, se esperaría que GPT-4o funcionara bien hasta un tamaño de 13x13 y que luego su rendimiento cayera
  • Pero en la práctica mostró un desempeño perfecto solo hasta cuadrículas de 5x5, y después cayó bruscamente
    • En una cuadrícula de 7x7 mostró 76% de precisión, y en una de 13x13 tuvo un rendimiento al nivel del azar
  • Esto significa que la hipótesis de que 169 tokens representan una cuadrícula de 13x13 es incorrecta
    • Sin embargo, el resultado con cuadrículas de 5x5 sugiere que GPT-4o puede seguir 25 objetos distinguibles dentro de una imagen y sus posiciones absolutas
  • Puede que la idea básica sea correcta pero que las dimensiones estén mal calculadas, y que agregando más capas a la CNN se reduzca a 5x5 en lugar de 13x13
  • Suponiendo que solo se usen cuadrículas de 5x5 o menos, habría que pensar cómo estructurar la salida para llegar a 170 tokens

Estrategia piramidal

  • Una forma de obtener números cercanos a 85 y 170 es suponer que la imagen se codifica como una serie de pirámides en niveles cada vez más detallados
    • Se empieza con un vector de embedding para capturar la impresión gestáltica de la imagen completa, luego se agrega 3x3 para capturar izquierda/centro/derecha y arriba/medio/abajo, y después 5x5, 7x7, etc.
  • Esta estrategia queda muy cerca de 85 tokens para la "miniatura maestra" si se detiene en 7x7
    • 12+32+52+72=1+9+25+49=84
  • Si se agrega la cuadrícula final de 9x9, queda muy cerca de 170
    • 12+32+52+72+92=1+9+25+49+81=165
  • Para los mosaicos de 512x512, se puede hacer que encaje perfectamente usando una cuadrícula temporal de 2x2 y suponiendo un token especial <|image start|> para cada uno
    • 1+12+32+52+72=1+1+9+25+49=85
    • 1+12+22+32+52+72+92=1+1+4+9+25+49+81=170
  • Este esquema no tiene ningún delimitador para el inicio y final de las filas, pero eso podría resolverse con codificación posicional en 2D, de forma similar a como se usa RoPE para codificar la información posicional de los tokens de texto
  • Lo anterior no coincide del todo con la evidencia de que el rendimiento en la cuadrícula Zener empieza a caer después de 5x5, ya que solo toma tamaños de cuadrícula impares y se salta 5x5
  • Como alternativa, se podrían tomar todas las cuadrículas (pares e impares) hasta 5x5
    • Este enfoque da 55 tokens: 12+22+32+42+52=55
  • Si se asumen 3 tokens por cada mini mosaico y 1 token delimitador entre cada mosaico, se puede llegar a 170
    • 3×(12+22+32+42+52)+5=170
  • No resulta del todo satisfactorio desde el punto de vista numérico, pero sí encaja bien con los resultados empíricos
  • La estrategia piramidal es intuitivamente muy atractiva, y casi se siente como la forma "obvia" de codificar información espacial en distintos niveles de zoom
    • Eso podría explicar por qué funciona bien hasta una cuadrícula de 5x5 y muy mal a partir de 6x6
  • Resulta frustrante que todas las hipótesis parezcan estar fascinantemente cerca de explicarlo todo, pero los números nunca terminan de encajar limpiamente
    • Aun así, esta estrategia piramidal es lo mejor que he logrado idear

Reconocimiento óptico de caracteres (OCR)

  • Ninguna de las hipótesis anteriores explica cómo GPT-4o realiza OCR
    • CLIP básicamente no puede hacer OCR muy bien, al menos no con bloques grandes de texto
    • (Aun así, el simple hecho de que GPT-4o pueda hacer OCR ya es bastante sorprendente, y un ejemplo claro de capacidad emergente)
  • GPT-4o claramente puede hacer OCR de alta calidad
    • Puede transcribir bloques largos de texto y leer texto manuscrito, así como texto movido, rotado, proyectado o parcialmente oculto
  • Los motores OCR modernos ya hacen mucho trabajo para limpiar la imagen, encontrar cuadros delimitadores y franjas de caracteres, y luego ejecutar modelos especializados de reconocimiento de caracteres a lo largo de esas franjas, un carácter o una palabra a la vez
    • No se trata simplemente de usar una CNN grande
  • En teoría, OpenAI realmente podría haber construido un modelo así de bueno, pero eso no encaja con su rendimiento relativamente débil en la tarea de cuadrículas Zener
    • Si no puede leer 36 símbolos de una cuadrícula limpia de 6x6 en una imagen, no debería poder leer perfectamente cientos de caracteres de texto
  • Una teoría simple para explicar esta discrepancia:
    • Creo que OpenAI ejecuta una herramienta OCR ya existente, como Tesseract (o una herramienta propietaria de última generación), y alimenta el texto identificado al transformer junto con los datos de imagen
    • Eso explicaría por qué las primeras versiones se confundían fácilmente con texto oculto dentro de las imágenes (porque, desde la perspectiva de GPT-4o, ese texto era parte del prompt)
      • Eso ya fue corregido, y GPT-4o ahora es hábil para ignorar prompts maliciosos ocultos dentro de imágenes
  • Sin embargo, eso no explica por qué no hay un cobro por token para el texto encontrado en la imagen
  • Curiosamente, enviar texto como imagen en realidad es más eficiente
    • Una imagen de 512x512 con una fuente pequeña pero legible puede contener fácilmente entre 400 y 500 tokens de texto, pero solo se cobra por 170 tokens de entrada, más los 85 de la "miniatura maestra", para un total de 255 tokens (mucho menos que la cantidad de palabras en la imagen)
  • Esta teoría explica por qué hay latencia adicional al procesar imágenes
    • Una CNN es esencialmente instantánea, pero un OCR de terceros tomaría tiempo adicional
    • Y, por cierto (aunque eso no demuestra nada), el entorno de Python que usa el intérprete de código de OpenAI tiene instalado PyTesseract
      • Puedes pedirle que ejecute PyTesseract sobre una imagen que subas para obtener una segunda opinión

Conclusión

  • Básicamente he especulado mucho a partir de un solo hecho sólido: que OpenAI usó el número mágico 170
  • Pero sí parece haber un enfoque completamente plausible, muy consistente con otras arquitecturas CNN como YOLO, para mapear mosaicos de imagen a vectores de embedding
  • Por lo tanto, no creo que los 170 tokens sean simplemente una aproximación usada para cobrar por la cantidad aproximada de cómputo necesaria para procesar la imagen
  • Tampoco creo que se estén concatenando capas para combinar datos de imagen y texto, como hacen algunos otros modelos multimodales
  • Creo que GPT-4o usa una arquitectura CNN, una mezcla de CLIP y YOLO, para insertar imágenes directamente en el espacio de vectores semánticos del transformer, representando una imagen de 512x512 literalmente como 170 vectores de embedding
  • Cuando empecé este artículo, estaba convencido de que había descifrado por completo que los 170 tokens correspondían a una cuadrícula de 13x13 y un token adicional de "impresión gestáltica"
    • Pero eso se vino abajo cuando el rendimiento en la tarea Zener empezó a degradarse después de 5x5. Haga lo que haga internamente, parece ser mucho más pequeño que 13x13
  • Aun así, la analogía con YOLO es convincente, y el rendimiento en la tarea Zener de 5x5 casi confirma que está usando algún tipo de cuadrícula
  • Esta teoría también tiene bastante poder predictivo en otras áreas
    • Explica cómo GPT-4o puede procesar varias imágenes y realizar tareas como comparar dos imágenes
    • Explica por qué puede ver varios objetos en una misma imagen, pero se satura cuando hay demasiados objetos en una escena compleja
    • Explica por qué GPT-4o parece tan ambiguo respecto a la posición absoluta y relativa de objetos individuales dentro de una escena, y por qué no puede contar con precisión los objetos de una imagen (cuando un objeto abarca dos celdas adyacentes de la cuadrícula, la misma clase se activa en ambas, así que no puede estar seguro de si es un objeto o dos)
  • Irónicamente, lo único que esta teoría no puede explicar limpiamente es la pregunta que motivó originalmente este artículo: ¿por qué precisamente 170 tokens?
    • La teoría piramidal (1x1 + 2x2 + 3x3 + 4x4 + 5x5) fue lo mejor que se me ocurrió, pero no resulta especialmente elegante
  • Me gustaría escuchar a alguien que tenga una teoría que encaje un poco mejor (o conocimiento real, suponiendo que no viole un NDA)

Posdata: el truco del canal alfa

  • Mientras avanzaba este proyecto, descubrí que GPT-4o ignora el canal alfa y por eso se comporta de una forma algo contraintuitiva
  • Decir que lo “ignora” no significa que haga lo mismo que un editor de imágenes al convertir un PNG a JPG, componiéndolo sobre un fondo predeterminado para eliminar la transparencia
    • GPT-4o literalmente solo toma los canales RGB e ignora el canal alfa
  • Esto se puede explicar con 4 imágenes preparadas cuidadosamente
    • Por comodidad, usé HTML y CSS para mostrar las imágenes sobre un patrón de cuadros, y las imágenes en sí tienen un fondo plano y transparente
    • Sin embargo, la mitad tiene un fondo negro transparente y la otra mitad tiene un fondo blanco transparente
  • ¿Qué significa “negro transparente” o “blanco transparente”?
    • Al representar un color RGBA con 4 bytes, aunque el alfa sea 100%, los bytes RGB siguen existiendo
    • Por lo tanto, (0, 0, 0, 255) y (255, 255, 255, 255) son colores distintos en cierto sentido, pero como ambos son 100% transparentes, no hay ninguna situación en la que un renderizador correcto los muestre de forma diferente
  • Si le preguntas a GPT-4o qué “ve” en estas 4 imágenes:
    • Texto negro sobre fondo negro transparente: GPT-4o lo lee como ""
    • Texto negro sobre fondo blanco transparente: GPT-4o lo lee como "ENORMOUS"
    • Texto blanco sobre fondo negro transparente: GPT-4o lo lee como "SCINTILLA"
    • Texto blanco sobre fondo blanco transparente: GPT-4o lo lee como ""
  • ¿Qué está pasando aquí?
    • Aparece un patrón: GPT-4o solo puede leer el texto cuando el color del texto es distinto del “color” del fondo transparente
    • Esto indica que GPT-4o ignora el canal alfa y solo mira los canales RGB. Para GPT-4o, el negro transparente es negro y el blanco transparente es blanco
  • Se puede ver con más claridad si manipulas la imagen conservando los tres canales RGB y estableciendo el canal alfa al 100%
    • Hice esto con una función de Pillow
    • Con eso creé las dos imágenes de abajo, que tienen los mismos datos RGB y solo difieren en el canal alfa
      • Canal alfa = 255: GPT-4o puede ver fácilmente el ornitorrinco oculto
      • Canal alfa = 0: GPT-4o lo ve como una imagen completamente transparente
  • Puedes descargar la imagen hidden_platypus.png e insertarla directamente en ChatGPT para probarlo tú mismo, y la describirá correctamente
    • Notarás que el tamaño del archivo es 39.3KB, igual que platypus.png; si fuera una imagen perfectamente vacía y transparente, debería ser mucho más pequeña debido a la compresión PNG
    • O puedes usar la función anterior para volver a establecer el canal alfa en 255 y recuperar la imagen original
  • No estoy seguro de si esto es un bug, pero sin duda es un comportamiento sorprendente, y da la impresión de que un usuario malicioso podría usarlo para pasar información directamente a GPT-4o sin que los humanos la vean
  • Sin embargo, GPT-4o es muchísimo mejor que GPT-4v para detectar e ignorar prompts maliciosos ocultos en imágenes
    • En la galería de imágenes de prueba de GPT-4o generada con la utilidad image_tagger, puedes encontrar otros ejemplos donde GPT-4o detecta e ignora con éxito prompts maliciosos ocultos en imágenes
  • Así que, incluso si es un bug, no está claro que realmente se pueda explotar
  • Aun así, sería menos sorprendente si GPT-4o “viera” lo mismo que ve una persona en el navegador

2 comentarios

 
hi098123 2024-06-10

Por lo tanto, en cierto sentido, (0, 0, 0, 255) y (255, 255, 255, 255) son colores distintos, pero como ambos son 100% transparentes, no hay ninguna situación en la que un renderizador correcto deba mostrarlos de forma diferente.

Para que sea transparente, el alpha debe ser 0, es decir, (0, 0, 0, 0) y (255, 255, 255, 0), así que parece que hay un error tipográfico en el texto principal.

 
xguru 2024-06-10

Opiniones de Hacker News

  • Necesidad de una alternativa moderna de código abierto: Se necesita con urgencia una alternativa moderna y de código abierto a Tesseract, basada en técnicas recientes de aprendizaje automático. Los LLM que se usan actualmente son excesivamente potentes y costosos.
  • Capacidad de OCR de Llava1.6, IntenVL y CogVLM2: Estos modelos pueden realizar OCR usando solo embeddings de imágenes en mosaico y un LLM. Si se les da como entrada el resultado OCR de Tesseract, la confiabilidad mejora, pero no es indispensable.
  • Reconocimiento de texto en embeddings de CLIP: Los embeddings de CLIP pueden "leer" texto si este es lo suficientemente grande. El mosaico permite leer texto pequeño.
  • Curiosidad y exploración abierta: Encanta la curiosidad y la exploración abierta sobre cómo funciona esta tecnología. También resulta interesante su relación con la teoría del grupo de renormalización para interpretar modelos de aprendizaje automático.
  • Eficiencia de transmitir texto como imagen: Transmitir texto como imagen podría ser más eficiente. Con una fuente pequeña, es fácil meter 400-500 tokens en una imagen de 512x512.
  • Falta de documentación de OpenAI: No se entiende por qué OpenAI no ofrece documentación clara y completa. Para quienes usan la API, esta falta de documentación es un obstáculo importante.
  • Errores de procesamiento de imágenes en GPT-4: Se ha experimentado el problema de que GPT-4 Vision distorsiona el contenido al hacer OCR de una sola imagen que representa varias páginas de un PDF. Con documentación clara de OpenAI, estos problemas podrían haberse evitado de forma más efectiva.
  • Calidad del artículo: Se considera que este artículo está muy bien escrito. Explica el tema de forma sencilla, pero con profundidad. Para poder explicarlo de forma simple, hay que entender muy bien el tema.
  • Posibilidad de usar VQVAE: Existe la posibilidad de usar VQVAE para crear un diccionario de tokens y convertir imágenes mediante un codificador.
  • Costo del mapeo imagen-token: Mapear imágenes a embeddings de tokens podría consumir alrededor de 170 veces más cómputo y espacio que mapearlas a IDs de tokens.
  • Posibilidad de un mosaico 13x13: No se puede descartar que un mosaico 13x13 no pueda reconocer una cuadrícula de objetos 13x13 debido a regiones receptivas superpuestas. También es posible una pirámide de resoluciones de mosaico superpuestas.
  • Método para probar el rendimiento de GPT-4: La forma de probar el rendimiento de GPT-4 pidiéndole en JSON las formas y colores de una cuadrícula de 7x7 es muy ingeniosa.