logo

Dot CSV

Inteligencia Artificial, Tecnología, Ciencia y Futuro! Bienvenidos a la 4ª Revolución Industrial 🚀 Inteligencia Artificial, Tecnología, Ciencia y Futuro! Bienvenidos a la 4ª Revolución Industrial 🚀

Transcribed podcasts: 213
Time transcribed: 5d 22h 50m 3s

This graph shows how many times the word ______ has been mentioned throughout the history of the program.

Ya lo sabéis, la llama de inteligencia artificial de hoy en día se basa principalmente en el
deep learning, el aprendizaje profundo, cuyo fundamento principal es la utilización de
las redes neuronales artificiales para el aprendizaje de tareas cada vez más complejas.
Y ya lo sabéis, la tendencia ha sido que a más datos y más grandes son estas redes
neuronales, mejor funcionan. Un incentivo para las grandes empresas para invertir en
más computación, energía y datos para entrenar a bestias artificiales cada vez mayores, que a día
de hoy cuestan en el orden de los millones de dólares y que debido a su gran tamaño tenemos
que distribuirlos en centros de datos de cientos y cientos de procesadores. Y luego, luego estás tú.
Sí, tú. Un robot de carne y hueso controlado por un procesador biológico que está aquí, dentro de tu
cráneo. Que a diferencia de los modelos artificiales no tiene tantísima información ni alberga tanto
conocimiento almacenado, pero que es mucho más eficaz al aprender una gran diversidad de tareas.
Conducir, fregar los platos, respirar para no morirte, lo típico. Y ojo, que comparado con las
bestias artificiales que mencionamos antes, consume mucha, mucha menos energía. Un prodigio de la evolución
que, a pesar de estar tan próximos a nosotros, pegado a nuestros hombros, se nos hace extraño,
misterioso, desconocido y un objetivo alcanzar por los expertos en inteligencia artificial. ¿Cómo
podríamos hacer modelos que sean más eficientes, que sean más potentes a la par que consuman menos
energía? La respuesta se está investigando. Y hoy vamos a hablar de un nuevo avance que camina en la línea
de hacer a las redes neuronales más eficientes energéticamente. Y que de funcionar podría
ser toda una revolución en el campo del deep learning, moviéndonos hacia una nueva era con
un nuevo tipo de red neuronal. La era de las redes neuronales de un bit. Veamos. Tu cerebro pesa lo que
pesa por su tamaño y volumen. Algo relacionado con la cantidad de conexiones neuronales que hay en
esa masa gelatinosa. Y una red neuronal artificial, pues es equivalente. El peso que va a ocupar en
memoria también dependerá del número de conexiones que exista entre las neuronas artificiales. Y si
recordáis los vídeos donde explicábamos el funcionamiento de las redes neuronales artificiales,
son en estas conexiones entre neuronas donde encontramos a los parámetros. Los numeritos que
ajustamos durante el entrenamiento para que la red pase de tener un comportamiento aleatorio en el que no
sabe resolver su tarea, a hacerla perfectamente con un rendimiento sobrehumano. Ajustar automáticamente
estos parámetros es la clave del deep learning. Es lo que denominamos entrenamiento. Así que sí, los parámetros
lo son todo. Y también son números, numeritos, decimales, que de alguna forma tenemos que almacenar en la
memoria de nuestro ordenador. Y claro, aquí la pregunta sería ¿cuánto ocupa cada uno de estos numeritos en
memoria? Pues depende. En un ordenador no podemos guardar los números como tal en memoria, sino que
al final, pues al trabajar con circuitos eléctricos, pues nos tenemos que basar en estados de energía de
encendido y apagado, on y off. O unos y ceros. A cada unidad de almacenamiento de uno de estos estados,
on y off, es lo que se denomina un bit de información. Y para codificar un número decimal con estos bits,
pues tendremos que utilizar el código binario. Para los no técnicos, mirad. En código binario
podemos codificar un número decimal de la siguiente forma. Como trabajamos en un código binario con dos
números, pues vamos a utilizar las potencias de 2. 2 elevado a 0, 2 elevado a 1, 2 elevado a 2 y así
sucesivamente. En un cálculo rápido podemos ver que esto sería 1, 2, 4, 8, 16 y así sucesivamente
duplicando el valor anterior. Y ahora la estrategia que seguiremos será la de activar o desactivar con
unos y ceros cada sumando para que la suma total de estos números, pues acabe sumando el número que
queremos codificar. Mirad, es sencillo. Por ejemplo, si queremos convertir el número 5 de decimal a binario,
tendremos que activar aquellos valores que sumados nos dé 5. Y en este caso, la única combinación sería
activar el 1 y el 4, en esta posición y esta posición. Visto así, podemos decir que el número 5 en binario es el
1, 0, 1. O el número 37, pues sería la suma de 32, de 4 y de 1. Es decir, el número 1, 0, 0, 1, 0, 1.
Así que felicidades, ya habéis aprobado vuestra primera clase de computación básica. Ya sabéis cómo codificar cualquier
número en base decimal a binario. Pero la cosa no es tan sencilla porque, bueno, dentro de un ordenador
necesitamos que todo esté más estructurado y ordenado. Por eso se llama ordenador. Mirad.
Como hemos dicho antes, cada estado encendido y apagado, cada uno y cada cero, es un bit, la unidad
básica de información. Y habitualmente en un ordenador, pues solemos agrupar 8 bits juntos para
conformar lo que se llama un byte. A todos nos suena. Entonces, si trabajamos solo con 8 bits,
os daréis cuenta de que siguiendo la estrategia de antes, aquí únicamente podremos representar
un rango limitado de valores. Desde el 0, 0, 0, 0, 0, 0, 0 hasta el 1, 1, 1, 1, 1, 1, 1. Es decir,
si lo traducimos a decimal con 8 bits, solo podríamos codificar los números naturales desde el
número 0 hasta el número 255, que sería el máximo valor al que podríamos aspirar. Y claro,
¿qué pasa si de repente quieres representar un número que sea mayor al 255? Por ejemplo,
el 256. Pues para lograr esto necesitaríamos un bit más. Pero como hemos dicho en informática,
habitualmente trabajamos con packs de 8 bits. Con lo que si queremos uno más, en realidad
tendremos que trabajar ahora no con 8 bits, sino con 16. Y ahora sí, con esta cantidad,
el valor máximo que podríamos representar ya no es 255, sino una cantidad muchísimo mayor,
el número 65535, que sale de tener los 16 bits activados a 1. Por tanto, primer aprendizaje.
Añadiendo más bytes, podemos ampliar el rango de valores que representamos en binario,
siendo común trabajar con representaciones de 8 bits, 16, 32 e incluso más. Oye, ¿y qué pasa si,
por ejemplo, lo que quiero representar es un número negativo por debajo de 0? ¿Cómo lo consigo?
Pues aquí viene otro concepto fundamental de la informática y es el cómo podemos llegar a
consensuar diferentes agrupaciones de bits para así representar distintos tipos de datos. Si queremos
un número negativo, pues podemos consensuar un tipo de representación donde sí, donde usaremos
todos estos bits de aquí para representar al número entero, igual que antes. Pero donde el último bit,
sin embargo, lo vamos a dedicar para representar el signo. Si está desactivado, a 0, el número resultante
lo interpretaremos como un número positivo. Y si está activado, a 1, el número será negativo.
Si os fijáis, ahora con esta nueva representación, el valor mínimo que podemos representar es el menos
127 y el máximo valor, el 127 en positivo. ¿Lo veis? Y jugando a agrupar los bits de diferente forma
e interpretando qué significa esa agrupación, pues podemos encontrar un montón de tipos de datos
diferentes. Por ejemplo, tal y como hemos visto, una de las representaciones más sencillas que existen
es la que utiliza todos los bits disponibles exclusivamente para representar números enteros
positivos. A esta se le conoce como Uint8 por utilizar 8 bits para representar números enteros
sin signo. Y también tendríamos Uint16 o Uint32 para aquellas representaciones que utilizan mayor número
de bits para conseguir un mayor rango numérico. Como hemos visto, también tenemos representaciones
para números enteros positivos y negativos, también con 8, 16 o 32 bits. Y luego, claro, pues existen
representaciones más complejas y avanzadas para representar a tipos de datos que son más complejos
y avanzados. Como por ejemplo, los números con parte decimal. Seguramente aquí a muchos os sonarán
representaciones como Float 8 o FP8, Float 16 o Float 32. Tipos de datos que suelen ser el estándar
para la representación de números decimales. Números decimales como los parámetros de una red neuronal
artificial. Y aquí no vamos a entrar a explicar cómo viene representado un tipo Float, pero sí
quiero que entendamos que la cantidad de bits que dediquemos para su representación, 8 bits, 16 o 32,
pues nos va a permitir, como sucedía antes, representar un mayor rango de números. Algo que en el caso de los
números con parte decimal también afectará a su precisión. Es decir, a cuántos dígitos podremos
representar de la parte decimal. Típicamente a mayor número de bits dediquemos, pues más precisa
podrá ser la parte decimal, que como sabéis, con este tipo de números podría incluso llegar a tener
infinitos valores si el número fuera irracional. Y claro, en el fatídico caso de que no contáramos
con suficiente precisión, pues nos va a tocar redondear el número hasta donde sea necesario.
Claro, contar con más o menos representación, pues es una movida. Una movida porque existen casos
donde contar con una representación numérica muy precisa es fundamental, ya que si no,
la aproximación por redondeo en alguna computación, pues podría afectar drásticamente al resultado
final. Ámbitos como el científico o el de la ingeniería, en medicina, criptografía, situaciones
donde se requieren cálculos y simulaciones precisas. Ahí contar con representaciones de
datos que dediquen el número de bits necesarios será fundamental. Por tanto, aquí la respuesta
evidente de muchos, pues sería decir, oye, mira, si a más bits más precisión y a más
precisión menos problemas, pues cojamos siempre la opción con más bits, ¿no? Y por supuesto,
la cosa no es tan sencilla, porque la otra cara de la historia es que a mayor número de bits
utilicemos, pues más recursos computacionales vamos a tener que dedicar. Para empezar, memoria.
Pregunta. ¿Por qué Llama 3 cuando lo descargáis en vuestro equipo, el archivo pesa 8 gigas
y no 8 megas o 200 terabytes? Pues ya lo hemos dicho antes, principalmente el culpable del
tamaño de una red neuronal lo va a determinar el número de parámetros. Cada parámetro
será un numerito en decimal que habitualmente viene representado en FP32, es decir, una representación
numérica que utiliza 32 bits. Si multiplicamos estos 32 bits, estos 4 bytes, por cada uno de
los parámetros del modelo, pues nos aproximaremos al tamaño en memoria que ocupará esta red neuronal.
Cada bit encargado de guardar el valor de cada uno de los numeritos decimales que representa
cada uno de los parámetros de nuestro modelo, ocupa un espacio en memoria. Y a mayores el modelo
y más parámetros tiene, pues más espacio ocupa en memoria. Pero no solo eso. Pensad que
cada uno de estos parámetros en la red neuronal lo utilizamos para multiplicar y sumar con
nuestros datos. Y claro, dentro de un procesador, pues cada una de estas operaciones de multiplicación
o de suma requieren de ejecutar una serie de circuitos eléctricos que, a mayor cantidad
de bits de los números que vamos a operar, más complejos son, tardando más tiempo de ejecución,
haciendo que en su totalidad la red neuronal tarde más en ejecutarse. Y ojo también, importantísimo,
que tengamos que dedicar más energía por operación. Es decir, trabajar con una red neuronal cuyos
parámetros vengan representados con una mayor cantidad de bits hace que ejecutar esta red
neuronal pues sea más lento, ocupe más espacio en memoria y gaste más energéticamente. Y siendo
esto así, pues la pregunta que debemos hacernos es, oye, ¿cómo podríamos solucionar esto? Pues aquí es
donde en los últimos años las técnicas de cuantización han ganado un gran protagonismo. Y la idea sencilla.
A lo mejor en un laboratorio de inteligencia artificial ya han entrenado a una red neuronal
originalmente en representación FP32, usando 32 bits. Pero, oye, ¿pasaría algo si de repente yo
cojo y cambio cada parámetro a una representación con menos bits? Felicidades, acabamos de aplicar
una cuantización. Al hacer esto hemos pasado a utilizar 32 bits a solo 8 bits por cada parámetro,
reduciendo así ahora el número de bits a un cuarto. Y de inmediato lo que hemos conseguido
haciendo esto es aproximadamente reducir a un cuarto lo que dicho modelo ocupa en memoria.
Genial. Pero, ¿esto lo conseguimos sin perder nada a cambio? ¿No decíamos que si quitábamos bits a
los números decimales estos podían perder precisión y por tanto los cálculos y las simulaciones que
quisiéramos podrían ser catastróficas? Sí. Pero en el mundo del deep learning, bueno,
nos podemos tomar las cosas un poquito más relajadas. Mirad, un caso sencillo. Imaginad que
uno de estos parámetros de una red neuronal está determinando la frontera de decisión que
clasifica nuestros datos de esta forma. El parámetro podría representar quizás la pendiente de esta
frontera lineal. Y tras entrenarse a la red, pues podría tomar el valor 0,87453245. Esto representado
con 32 bits en FP32. Atentos. ¿Qué pasaría ahora si le quitamos precisión a este número decimal? Por
ejemplo, vamos a redondearlo a la mitad de decimales. Si os dais cuenta, cuando quitamos decimales,
cuando quitamos precisión, aquí la frontera de decisión apenas cambia y la clasificación sigue
siendo igual de correcta. Bueno, pues vamos a quitarle más precisión. Redondeamos de nuevo y
ahora sí la pendiente se ha movido un poco más. Y sí, ahora podemos decir que hemos perdido un poco
de precisión al tener ahora un nuevo error que antes no teníamos. Pero si nos damos cuenta, a pesar
de ese error, el resto, pues sigue funcionando bastante bien. Y será al seguir quitándole precisión
que ahora sí habremos hecho de nuestro clasificador un desastre. Lo que ha pasado es que buscando ahorrar
memoria quitando tanta precisión a nuestros parámetros, ahora sí hemos deteriorado notablemente
el rendimiento de nuestro clasificador. Y esto es lo que pasa cuando cuantizamos modelos de Deep Learning,
que estamos sacrificando pues precisión de los parámetros y por tanto la efectividad del modelo
en su totalidad para ganar pues mejoras en eficiencia, consumo energético y ocupación de memoria.
Y buscar un equilibrio entre estas dos opciones pues es necesario. A esta técnica de coger un modelo
ya entrenado y cambiar la representación de los parámetros restándole precisión es lo que se
conoce como cuantización post-entrenamiento. Y como hemos visto, entre más agresiva es la cuantización,
entre más bits te ahorras, pues peor es el rendimiento. Y claro, viendo esta gráfica y viendo como el rendimiento
decae, es impresionante comprobar que desde hace unos meses existe una alternativa que promete
modelos cuantizados al extremo. Utilizando no 32 bits, ni 16 ni 8, sino un único bit. Modelos con
parámetros codificables en un único bit y que aparentemente no tienen pérdidas drásticas de
rendimiento. Un tipo de modelo que como podéis imaginar pues puede suponer un antes y un después
del mundo del deep learning. Por si no ha quedado claro, aquí no estaríamos hablando de redes
neuronales que codifiquen sus parámetros en formato FP32 o FP16 en decimales. No, aquí los parámetros
ya no serían números decimales, sino que únicamente vendrían codificados con estos tres valores,
el menos uno, el cero y el uno. Es decir, estaríamos llevando la representación de nuestros
parámetros casi casi al mínimo teórico posible. Y aquí ya no estamos hablando de una cuantización
post-entrenamiento, donde estemos cogiendo los parámetros una vez la red esté entrenada y
cambiamos su representación a posteriori. No, aquí de lo que hablamos y lo que introduce este
paper es de entrenar a redes neuronales desde cero utilizando esta codificación de parámetros,
haciendo modificaciones en la arquitectura de la red neuronal y en la naturaleza del entrenamiento.
Porque esto no es tan sencillo. Y es que recordemos, en la magia del entrenamiento de una red neuronal,
pues está la necesidad de usar funciones suaves y continuas que podamos derivar. Un requisito clave
en el proceso de optimización del descenso del gradiente. Y claro, si de repente trabajamos con
representaciones discretas de los parámetros que toman valores de menos uno a cero, de cero a uno de
golpe, pues a lo que nos enfrentamos son a entrenamientos mucho más inestables. Y aún así el
equipo de Microsoft tras este trabajo lo ha conseguido. Y en un paper del pasado mes de
febrero presentaron Bitnet 1,58b. La demostración de que han podido entrenar a un enorme modelo del
lenguaje tipo transformer con parámetros de menos uno, cero y uno. ¿Los resultados? Mirad, si lo visualizamos
en esta gráfica podemos comparar el rendimiento de varios modelos YAMA, según su tamaño, contra el
modelo Bitnet. Y viendo la gráfica es súper interesante comprobar que no solo hay una mejora
significativa en términos de ocupación de memoria, sino que además las dos gráficas divergen según más
grande es el modelo. Es decir, entre mayor es el modelo que entrenamos, más ganancias tenemos. Y
visto así y sabiendo que la tendencia en el Deep Learning es entrenar modelos cada vez más grandes,
pues esto son muy buenas noticias. Además, este patrón se replica con otras magnitudes
importantes que hemos ido comentando, como por ejemplo la latencia de inferencia. ¿Qué tan rápido
el modelo? Pues genera los tokens. Y siendo en el caso del modelo de mayor tamaño que han entrenado,
el de 70 mil millones de parámetros, la diferencia cuatro veces más rápido. Y de la misma forma también
ocurre con la gráfica del consumo energético, donde el ahorro por usar Bitnet, además de ser cuatro veces
más rápido y ocupar siete veces menos en memoria, además es 40 veces más eficiente energéticamente.
40 veces. Y en este punto me quiero parar porque es muy interesante, ya que el ahorro energético de
Bitnet haciendo la factura 40 veces más barata no sólo proviene de que al usar menos bits en las
operaciones pues éstas sean energéticamente más baratas que también. Sino que además en este paper hay una
decisión de diseño súper súper interesante y es, oye, ¿por qué para los parámetros han cogido valores
de menos 1, 0 y 1? ¿Por qué no han cogido, por ejemplo, menos 3, 0 y más 3? Fijaos. Ya en este punto
de la película todos tenemos que conocer que el papel que juegan los parámetros en cada neurona
es el de primero multiplicarse por lo tanto de entrada y luego sumar ese resultado antes de pasar
por la función de activación. Así funciona una red neuronal. Y además este es un proceso que se va a repetir un
montón y un montón de veces por cada dato, por cada neurona, por cada capa, multiplicar y sumar.
Pero si de repente hacemos que nuestros parámetros sean más 1, menos 1 y 0, entonces ocurre la magia.
Porque lo que acabamos de lograr es que lo que antes era multiplicar y sumar ahora se convierta
simplemente en la suma o resta de las variables de entrada. Ahora ya no nos tenemos que preocupar
por computar las multiplicaciones. Y esto pues simplifica enormemente el proceso. Podemos pensarlo
como una calculadora. La típica calculadora con múltiples operaciones como sumas, restas,
divisiones, multiplicaciones. Internamente para implementar todas estas operaciones pues los
circuitos tienen que ser más complejos. Y dependiendo de su complejidad pues hay operaciones
con un mayor consumo energético. Más costosas. Y la alternativa a esto es contar ahora con una
calculadora que simplifique el proceso donde solo tengamos que hacer sumas y restas. Algo que a nivel
computacional pues podemos resolver de forma muy sencilla ajustando los signos de los sumandos según
el valor del parámetro. Y esto hace que computar a una de estas neuronas artificiales de un bit pues
sea mucho más eficiente energéticamente. Las bitnets son muy prometedoras. Casi tan prometedoras como
difíciles de pronunciar. Bitnets, bitnets. Cuesta muchísimo, se traba la lengua. Y la buena noticia
es que esto no se queda como un resultado aislado conseguido por una única compañía sino que ya
empiezan a aparecer organizaciones que han conseguido replicar los resultados de este
paper. Y aunque aún falta más evidencia para dar por bueno los resultados de este paper y el inicio
de esta revolución, tened claro que en los próximos meses vamos a seguir viendo avances. Pero además de
esto también queda trabajo por hacer en otra parte del stack tecnológico actual. Y es que tal y como
indican los autores al final del documento, este trabajo abre la necesidad de contar con
nuevo hardware. Hardware diseñado específicamente para ejecutar y exprimir al máximo este tipo de
arquitecturas. Ya que como vimos en el vídeo sobre NVIDIA, la computación actualmente se está
convirtiendo en el principal cuello de botella de la inteligencia artificial. Y donde los diseñadores
de chips con cada nueva generación pues intentan dar más y más capacidad de computación. Por ejemplo,
con el paso de los años, NVIDIA con cada nueva arquitectura presentada ha logrado saltos
espectaculares en la cantidad de operaciones que sus chips pueden ejecutar. Pero ¡ah! Esto tiene
truco. Ya que una parte importante de las mejoras introducidas con cada nueva arquitectura no proviene
de meter más transistores cada vez más pequeñitos en los chips. Sino que las mejoras vienen de diseñar
chips con instrucciones que hacen uso de formatos de precisión cada vez más pequeños. Donde históricamente
hemos pasado de FP32 a FP16 para luego pasar por FP8 e incluso con las nuevas Blackwells a FP4.
Es decir, una vez más, estamos cediendo precisión para ganar potencia. Y claro,
con la reciente salida de arquitecturas como Blackwell que llegan a niveles de precisión de FP4,
había quienes se preguntaban si realmente se podía entrenar y ejecutar a una inteligencia artificial
con esos niveles de precisión. Vamos, que la gente se estaba preguntando si a lo mejor NVIDIA sabía
pasado apostando por niveles de cuantización tan agresivos donde a lo mejor nuestra inteligencia
artificial no iba a funcionar bien. Y como hemos visto, la respuesta del paper de hoy es que sí,
que podemos entrenar inteligencia artificial por debajo de los dos bits. Una oportunidad que para
poder aprovecharla al máximo nos obliga a rediseñar y redefinir muchos de los procesadores modernos que
utilizamos para ejecutar a la inteligencia artificial, acomodarla a las necesidades de
estos nuevos modelos. Y una oportunidad que seguramente viejos y nuevos competidores del mercado
de los procesadores van a aprovechar en los próximos años. Todo esto para explorar y transitar un nuevo
camino muy prometedor que se abre en el horizonte hacia inteligencias artificiales mucho más potentes y
mucho más eficientes. Un camino que como promete el título de este paper y también de este vídeo que te lo ha explicado
podría suponer el comienzo de la era de los modelos del lenguaje de UNBIT. Y si te ha gustado el vídeo pues no
dejes de compartirlo y solo os pido un favor y es que si no estás suscrito suscríbete al canal porque estamos
ya camino del millón de suscriptores y cada vez cuesta más porque los algoritmos de IA pues hacen que mi contenido
si os interesa os aparezcan aunque no estéis suscritos y entonces os olvidáis. Pero fijaos en el botón cuando digo
suscribíos a mi canal se ilumina porque Google pues ha puesto una IA que entiende lo que digo y entonces como entiende
lo que digo pues se ilumina. Bueno echadle un vistazo. Suscríbete a mi canal, suscríbete, suscríbete, suscríbete.
¿Lo ves? ¿Ves cómo se ve? Bueno, tenéis un par de vídeos por aquí que podéis ojear muy interesantes y chicos, chicas,
seguimos con la revolución de la inteligencia artificial aquí en DOT CSV. Chao.