El preentrenamiento es la fase fundamental en el desarrollo de un modelo de lenguaje grande (LLM) donde el modelo se expone a grandes y diversas cantidades de datos textuales. Durante esta etapa, **el LLM aprende las estructuras, patrones y matices fundamentales del lenguaje**, incluyendo gramática, vocabulario, sintaxis y relaciones contextuales. Al procesar estos datos extensos, el modelo adquiere una comprensión amplia del lenguaje y del conocimiento general del mundo. Esta base integral permite al LLM generar texto coherente y contextualmente relevante. Posteriormente, este modelo preentrenado puede someterse a un ajuste fino, donde se entrena aún más en conjuntos de datos especializados para adaptar sus capacidades a tareas o dominios específicos, mejorando su rendimiento y relevancia en aplicaciones dirigidas.
* **Parámetros**: Los parámetros son los **pesos y sesgos aprendibles** en la red neuronal. Estos son los números que el proceso de entrenamiento ajusta para minimizar la función de pérdida y mejorar el rendimiento del modelo en la tarea. Los LLM suelen utilizar millones de parámetros.
* **Dimensión de incrustación**: El tamaño del vector utilizado para representar cada token o palabra. Los LLM suelen usar miles de millones de dimensiones.
* **Número de cabezales de atención**: En los modelos de transformadores, esta es la cantidad de mecanismos de atención separados que se utilizan en cada capa. Los LLM suelen usar decenas de cabezales.
* **Dropout**: El dropout es algo así como el porcentaje de datos que se eliminan (las probabilidades se convierten en 0) durante el entrenamiento utilizado para **prevenir el sobreajuste.** Los LLM suelen usar entre 0-20%.
En PyTorch, un **tensor** es una estructura de datos fundamental que sirve como un arreglo multidimensional, generalizando conceptos como escalares, vectores y matrices a dimensiones potencialmente más altas. Los tensores son la forma principal en que los datos se representan y manipulan en PyTorch, especialmente en el contexto del aprendizaje profundo y las redes neuronales.
* **Tensores de Rango Superior**: Tensores de rango 3 o más, que representan datos en dimensiones superiores (por ejemplo, tensores 3D para imágenes en color).
### Tensores como Contenedores de Datos
Desde una perspectiva computacional, los tensores actúan como contenedores para datos multidimensionales, donde cada dimensión puede representar diferentes características o aspectos de los datos. Esto hace que los tensores sean altamente adecuados para manejar conjuntos de datos complejos en tareas de aprendizaje automático.
Mientras que los tensores de PyTorch son similares a los arreglos de NumPy en su capacidad para almacenar y manipular datos numéricos, ofrecen funcionalidades adicionales cruciales para el aprendizaje profundo:
* **Diferenciación Automática**: Los tensores de PyTorch soportan el cálculo automático de gradientes (autograd), lo que simplifica el proceso de calcular derivadas requeridas para entrenar redes neuronales.
***Reformando Tensores**: Usa `.reshape()` o `.view()` para cambiar la forma.
```python
reshaped = tensor2d.reshape(4, 1)
```
***Transponiendo Tensores**: Usa `.T` para transponer un tensor 2D.
```python
transposed = tensor2d.T
```
***Multiplicación de Matrices**: Usa `.matmul()` o el operador `@`.
```python
result = tensor2d @ tensor2d.T
```
### Importancia en el Aprendizaje Profundo
Los tensores son esenciales en PyTorch para construir y entrenar redes neuronales:
* Almacenan datos de entrada, pesos y sesgos.
* Facilitan las operaciones requeridas para los pasos hacia adelante y hacia atrás en los algoritmos de entrenamiento.
* Con autograd, los tensores permiten el cálculo automático de gradientes, agilizando el proceso de optimización.
## Diferenciación Automática
La diferenciación automática (AD) es una técnica computacional utilizada para **evaluar las derivadas (gradientes)** de funciones de manera eficiente y precisa. En el contexto de redes neuronales, AD permite el cálculo de gradientes requeridos para **algoritmos de optimización como el descenso de gradiente**. PyTorch proporciona un motor de diferenciación automática llamado **autograd** que simplifica este proceso.
### Explicación Matemática de la Diferenciación Automática
**1. La Regla de la Cadena**
En el corazón de la diferenciación automática está la **regla de la cadena** del cálculo. La regla de la cadena establece que si tienes una composición de funciones, la derivada de la función compuesta es el producto de las derivadas de las funciones compuestas.
Matemáticamente, si `y=f(u)` y `u=g(x)`, entonces la derivada de `y` con respecto a `x` es:
En AD, los cálculos se representan como nodos en un **grafo computacional**, donde cada nodo corresponde a una operación o una variable. Al recorrer este grafo, podemos calcular derivadas de manera eficiente.
En redes neuronales más grandes con múltiples capas, el proceso de cálculo de gradientes se vuelve más complejo debido al aumento en el número de parámetros y operaciones. Sin embargo, los principios fundamentales permanecen iguales:
* **Paso Adelante:** Calcular la salida de la red pasando las entradas a través de cada capa.
* **Calcular Pérdida:** Evaluar la función de pérdida utilizando la salida de la red y las etiquetas objetivo.
* **Paso Atrás (Retropropagación):** Calcular los gradientes de la pérdida con respecto a cada parámetro en la red aplicando la regla de la cadena de manera recursiva desde la capa de salida hasta la capa de entrada.
### **2. Algoritmo de Retropropagación**
* **Paso 1:** Inicializar los parámetros de la red (pesos y sesgos).
* **Paso 2:** Para cada ejemplo de entrenamiento, realizar un paso adelante para calcular las salidas.
* **Paso 3:** Calcular la pérdida.
* **Paso 4:** Calcular los gradientes de la pérdida con respecto a cada parámetro utilizando la regla de la cadena.
* **Paso 5:** Actualizar los parámetros utilizando un algoritmo de optimización (por ejemplo, descenso de gradiente).
### **3. Representación Matemática**
Considera una red neuronal simple con una capa oculta: