grx-tensor 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/GUIA_PRINCIPIANTES.md +307 -24
- data/README.es.md +1090 -161
- data/README.md +1102 -162
- data/ext/grx/extconf.rb +4 -18
- data/ext/grx/grx_core.c +411 -331
- data/ext/grx/grx_core.h +23 -13
- data/ext/unix/Makefile +3 -27
- data/ext/windows/Makefile.mingw +3 -23
- data/grx-tensor.gemspec +37 -33
- data/lib/grx/c_api.rb +47 -15
- data/lib/grx/nn.rb +9 -7
- data/lib/grx/optim.rb +12 -7
- data/lib/grx/storage.rb +6 -5
- data/lib/grx/tensor.rb +36 -0
- data/lib/grx/utils.rb +15 -0
- data/lib/grx/version.rb +1 -1
- data/lib/grx.rb +8 -3
- metadata +31 -27
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ef573ddb7f047d0fbe2a87a1bb9fe9d102870cdb9c31791129335eda4724baa2
|
|
4
|
+
data.tar.gz: c65fb09c8d9c769415870d60ede2efd50dbdd3367fb6ad700c95c686c3d2376d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 997603cfd5b43ab6800e8f24300d9771e1ca06edca26b15e61447c68076637bb2103112c13af98d3c98c8c9d9b76cbcab89323b3a42e5b56beeebd84da625134
|
|
7
|
+
data.tar.gz: b0623d6572185c7590dd1cf34f0b225950fc459a6d653cc2ae60188e239c00e368e0073ae20c27a66a9516d4b80966b7d0b0f6dd9b8ee1308100ccaeebc941cd
|
data/CHANGELOG.md
CHANGED
|
@@ -17,6 +17,15 @@ Versioning follows [Semantic Versioning](https://semver.org/).
|
|
|
17
17
|
- `Conv2d`, `LSTM`, `MultiheadAttention` layers
|
|
18
18
|
- CUDA extension (`grx-tensor-cuda`)
|
|
19
19
|
|
|
20
|
+
## [0.2.1] - 2026-08-29
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- **Illegal Instruction Crash Resolved (`SIGILL`)**: Removed forced global `-mavx2` compiler flags that produced opcode crashes on older Intel/AMD CPUs, VMs, and ARM architectures.
|
|
24
|
+
- **Dynamic Multi-Target SIMD Dispatch**: Runtime CPU detection (`grx_simd_level`) dynamically selects between AVX2+FMA (4 doubles/cycle), SSE, or portable scalar C with zero overhead.
|
|
25
|
+
- **Automated Native Compilation**: Extension builds seamlessly on `gem install grx-tensor` without requiring manual make invocations.
|
|
26
|
+
- **Windows DevKit Support & Documentation**: Streamlined MinGW-w64 build path and clarified standalone binary progress.
|
|
27
|
+
- **Post-Install Experience**: Clean dual-language (EN/ES) thank-you notice and direct repository documentation links.
|
|
28
|
+
|
|
20
29
|
---
|
|
21
30
|
|
|
22
31
|
## [0.2.0] - 2026-08-21
|
data/GUIA_PRINCIPIANTES.md
CHANGED
|
@@ -28,15 +28,18 @@
|
|
|
28
28
|
8. [Algebra Lineal Intuitiva: Multiplicacion de Matrices](#8-algebra-lineal-intuitiva-multiplicacion-de-matrices)
|
|
29
29
|
9. [El Superpoder de GRX: Que es Autograd?](#9-el-superpoder-de-grx-que-es-autograd)
|
|
30
30
|
10. [Construyendo Redes Neuronales Bloque a Bloque](#10-construyendo-redes-neuronales-bloque-a-bloque)
|
|
31
|
-
11. [El Ciclo Sagrado del Entrenamiento (
|
|
32
|
-
12. [
|
|
33
|
-
|
|
34
|
-
- [Proyecto
|
|
35
|
-
- [Proyecto
|
|
36
|
-
- [Proyecto
|
|
37
|
-
- [Proyecto
|
|
38
|
-
|
|
39
|
-
|
|
31
|
+
11. [El Ciclo Sagrado del Entrenamiento (Explicacion Paso a Paso)](#11-el-ciclo-sagrado-del-entrenamiento-explicacion-paso-a-paso)
|
|
32
|
+
12. [El Diccionario Sagrado de Parametros e Hiperparametros](#12-el-diccionario-sagrado-de-parametros-e-hiperparametros)
|
|
33
|
+
13. [Proyectos Guiados Paso a Paso (Completos y Ejecutables)](#13-proyectos-guiados-paso-a-paso-completos-y-ejecutables)
|
|
34
|
+
- [Proyecto 1: El Conversor de Temperatura (Celsius a Fahrenheit)](#proyecto-1-el-conversor-de-temperatura-celsius-a-fahrenheit)
|
|
35
|
+
- [Proyecto 2: Compuertas Logicas (AND Lineal vs XOR No Lineal)](#proyecto-2-compuertas-logicas-and-lineal-vs-xor-no-lineal)
|
|
36
|
+
- [Proyecto 3: El Predictor de Formulas (Regresion Lineal)](#proyecto-3-el-predictor-de-formulas-regresion-lineal)
|
|
37
|
+
- [Proyecto 4: Ajuste de Curvas No Lineales y Guardado en .grx](#proyecto-4-ajuste-de-curvas-no-lineales-y-guardado-en-grx)
|
|
38
|
+
- [Proyecto 5: Clasificador Binario Inteligente con BCELoss](#proyecto-5-clasificador-binario-inteligente-con-bceloss)
|
|
39
|
+
- [Proyecto 6: Entrenamiento con Datasets Masivos (5,000 Filas con DataLoader)](#proyecto-6-entrenamiento-con-datasets-masivos-5000-filas-con-dataloader)
|
|
40
|
+
- [Proyecto 7: Chatbot Financiero Inteligente con Base de Conocimiento y Filtro de Incertidumbre](#proyecto-7-chatbot-financiero-inteligente-con-base-de-conocimiento-y-filtro-de-incertidumbre)
|
|
41
|
+
14. [Buenas Practicas y Errores Comunes](#14-buenas-practicas-y-errores-comunes)
|
|
42
|
+
15. [Glosario de Terminos Clave](#15-glosario-de-terminos-clave)
|
|
40
43
|
|
|
41
44
|
---
|
|
42
45
|
|
|
@@ -48,7 +51,15 @@ Por otro lado, C ofrece velocidad extrema, pero programar grafos de autograd y r
|
|
|
48
51
|
|
|
49
52
|
**GRX-Tensor une lo mejor de ambos mundos:**
|
|
50
53
|
- **Ruby habla:** Escribes codigo fluido, declarativo y limpio para definir arquitecturas, procesar datos y crear aplicaciones.
|
|
51
|
-
- **C calcula:** Cada operacion matematica, producto matricial, retropropagacion y actualizacion de pesos se ejecuta en un buffer nativo de C con aceleracion vectorial **SIMD (AVX2 + FMA
|
|
54
|
+
- **C calcula:** Cada operacion matematica, producto matricial, retropropagacion y actualizacion de pesos se ejecuta en un buffer nativo de C con aceleracion vectorial **SIMD multi-target (AVX2 + FMA, SSE y C escalar)**.
|
|
55
|
+
|
|
56
|
+
### Instalacion y Compatibilidad de Hardware Universal
|
|
57
|
+
1. **Instalacion 100% automatica:** Al instalar con `gem install grx-tensor`, RubyGems compila y enlaza automaticamente la extension nativa de C en segundo plano sin requerir comandos de compilacion manuales.
|
|
58
|
+
2. **Despacho Dinamico por CPU:** El motor en C detecta en tiempo real las caracteristicas de tu procesador:
|
|
59
|
+
- Si tu procesador soporta **AVX2 + FMA**, activa la maxima aceleracion vectorial (4 doubles/ciclo).
|
|
60
|
+
- Si tu procesador soporta **SSE**, activa las instrucciones vectoriales SSE.
|
|
61
|
+
- Si tu maquina es ARM, una maquina virtual o una CPU clasica, conmuta a **C escalar**, evitando cualquier error de "instruccion ilegal".
|
|
62
|
+
3. **Estado del Soporte en Windows:** En Windows, la aceleracion nativa funciona compilando automaticamente mediante **RubyInstaller con DevKit (MSYS2 / MinGW-w64)**. Si no hay compilador presente, el framework corre en modo fallback de Ruby puro de forma segura. El empaquetado de binarios pre-compilados (.dll) sin necesidad de DevKit se encuentra en desarrollo activo.
|
|
52
63
|
|
|
53
64
|
---
|
|
54
65
|
|
|
@@ -405,23 +416,295 @@ puts modelo
|
|
|
405
416
|
|
|
406
417
|
---
|
|
407
418
|
|
|
408
|
-
## 11. El Ciclo Sagrado del Entrenamiento (
|
|
419
|
+
## 11. El Ciclo Sagrado del Entrenamiento (Explicacion Paso a Paso)
|
|
420
|
+
|
|
421
|
+
El entrenamiento de cualquier modelo en GRX sigue un ciclo de 5 pasos universales:
|
|
409
422
|
|
|
410
423
|
```ruby
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
424
|
+
# 1. Limpiar gradientes anteriores
|
|
425
|
+
# En cada paso, el optimizador calcula la direccion del cambio.
|
|
426
|
+
# Si no limpias los gradientes, se acumularan como una bola de nieve.
|
|
427
|
+
opt.zero_grad
|
|
428
|
+
|
|
429
|
+
# 2. Pase hacia adelante (Forward Pass)
|
|
430
|
+
# Los datos entran a la red y se procesan a traves de capas de matrices en C con SIMD.
|
|
431
|
+
pred = modelo.call(train_x)
|
|
432
|
+
|
|
433
|
+
# 3. Calculo de la Perdida (Loss / Error)
|
|
434
|
+
# La funcion de perdida mide numericamente que tan lejos estamos de la realidad.
|
|
435
|
+
loss = loss_fn.call(pred, train_y)
|
|
436
|
+
|
|
437
|
+
# 4. Pase hacia atras (Backward Pass / Autograd)
|
|
438
|
+
# GRX recorre el grafo DAG hacia atras calculando la derivada exacta de cada peso.
|
|
439
|
+
loss.backward
|
|
440
|
+
|
|
441
|
+
# 5. Paso de Optimizacion (Optimizer Step)
|
|
442
|
+
# El optimizador (Adam o SGD) actualiza los pesos en C para reducir el error.
|
|
443
|
+
opt.step
|
|
416
444
|
```
|
|
417
445
|
|
|
418
446
|
---
|
|
419
447
|
|
|
420
|
-
## 12.
|
|
448
|
+
## 12. El Diccionario Sagrado de Parametros e Hiperparametros
|
|
449
|
+
|
|
450
|
+
Cuando creas optimizadores, capas o funciones de perdida, veras expresiones como `lr: 0.001`, `lr: 1e-3`, `momentum: 0.9`, `weight_decay: 1e-4`, `eps: 1e-8` o `betas: [0.9, 0.999]`. Que significan, que valores admiten y como se deben configurar?
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
### 1. Que significa la Notacion Cientifica en Machine Learning (`1e-1` a `1e-8`)?
|
|
455
|
+
|
|
456
|
+
En Ruby y en Inteligencia Artificial, los numeros muy pequenos se escriben en **notacion cientifica exponencial** (`1e-X` que equivale a $1.0 \times 10^{-X}$). Esto evita errores tipograficos al contar ceros decimales:
|
|
457
|
+
|
|
458
|
+
| Notacion Ruby | Valor Decimal Exacto | Fraccion | Nombre Comun | Uso Tipico en GRTensor |
|
|
459
|
+
|---|---|---|---|---|
|
|
460
|
+
| `1e-1` | `0.1` | $1/10$ | Una decima | Momentum de actualizacion en `BatchNorm1d`, learning rate rapido. |
|
|
461
|
+
| `1e-2` | `0.01` | $1/100$ | Una centesima | Learning rate estandar para `SGD`, pendiente `alpha` en `LeakyReLU`. |
|
|
462
|
+
| `1e-3` | `0.001` | $1/1,000$ | Una milesima | Learning rate estandar de oro para `Adam` en redes profundas. |
|
|
463
|
+
| `1e-4` | `0.0001` | $1/10,000$ | Una diezmilesima | Penalizacion de regularizacion L2 (`weight_decay`) para evitar sobreajuste. |
|
|
464
|
+
| `1e-5` | `0.00001` | $1/100,000$ | Una cienmilesima | Epsilon (`eps`) de varianza en `LayerNorm` y `BatchNorm1d`. |
|
|
465
|
+
| `1e-7` | `0.0000001` | $1/10,000,000$ | Una diezmillonesima | Epsilon de corte en `BCELoss` para evitar $\log(0) \to -\infty$. |
|
|
466
|
+
| `1e-8` | `0.00000001` | $1/100,000,000$ | Una cienmillonesima | Epsilon de estabilidad numerica en el denominador de `Adam`. |
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
### 2. Parametros de Optimizadores (`GRX::Optim`)
|
|
471
|
+
|
|
472
|
+
#### `lr` (Learning Rate / Tasa de Aprendizaje)
|
|
473
|
+
* **Que es:** La velocidad y tamano del paso que da la red hacia el error minimo en cada iteracion.
|
|
474
|
+
* **Analogia:** Caminar hacia el fondo de un valle con los ojos vendados.
|
|
475
|
+
* Si `lr` es muy grande (`lr: 10.0`), saltaras de una colina a otra sin tocar el fondo y la perdida explotara (`Infinity` o `NaN`).
|
|
476
|
+
* Si `lr` es muy pequeno (`lr: 1e-6`), tardaras semanas en dar 3 pasos.
|
|
477
|
+
* **Valores recomendados:**
|
|
478
|
+
* `0.001` o `1e-3` (Valor por defecto de oro para `Adam` en casi todas las redes neuronales).
|
|
479
|
+
* `0.01` a `0.1` (`1e-2` a `1e-1`) (Para `SGD` con momentum o regresiones lineales rapidas).
|
|
480
|
+
* `0.5` a `0.8` (Para modelos de 1 sola neurona como el conversor de temperatura).
|
|
481
|
+
|
|
482
|
+
#### `momentum` (Momento / Inercia en SGD)
|
|
483
|
+
* **Que es:** Acumula la velocidad y direccion de los gradientes anteriores para acelerar el descenso.
|
|
484
|
+
* **Analogia:** Una bola pesada de boliche rodando colina abajo. En lugar de detenerse o rebotar caoticamente por cada bache diminuto en los datos, la bola mantiene su inercia hacia adelante.
|
|
485
|
+
* **Valores:** `0.0` (sin momento) a `0.99`. Valor recomendado estandar: `0.9`.
|
|
486
|
+
|
|
487
|
+
#### `weight_decay` (Decaimiento de Pesos / Regularizacion L2)
|
|
488
|
+
* **Que es:** Una penalizacion matematica que encoge ligeramente los pesos hacia cero en cada paso ($w \leftarrow w - \lambda \cdot w$).
|
|
489
|
+
* **Analogia:** La Navaja de Ockham. Evita que la red memorice las respuestas exactas (*Overfitting* o Sobreajuste) forzandola a preferir explicaciones simples y pesos pequenos y equilibrados.
|
|
490
|
+
* **Valores recomendados:** `0.0` (por defecto, sin penalizacion), `1e-4` ($0.0001$) o `1e-5` para datasets del mundo real.
|
|
491
|
+
|
|
492
|
+
#### `betas` / `beta1`, `beta2` (En `GRX::Optim::Adam`)
|
|
493
|
+
* **Que es:** Las tasas de decaimiento exponencial para la estimacion de momentos de 1er y 2do orden.
|
|
494
|
+
* $\beta_1$ (defecto: `0.9`): Memoria del 90% de la direccion del gradiente anterior (momento direccional).
|
|
495
|
+
* $\beta_2$ (defecto: `0.999`): Memoria del 99.9% de la varianza del gradiente al cuadrado (escala automaticamente pasos grandes para gradientes raros y pasos pequenos para gradientes frecuentes).
|
|
496
|
+
* **Valores recomendados:** `[0.9, 0.999]` (el estandar probado de Kingma & Ba).
|
|
497
|
+
|
|
498
|
+
#### `eps` / `epsilon` (Estabilidad Numerica)
|
|
499
|
+
* **Que es:** Un numero microscopico ($1e-8$ en Adam, $1e-5$ en LayerNorm/BatchNorm) sumado al denominador.
|
|
500
|
+
* **Por que existe:** Si la varianza de un parametro es 0, dividir entre 0 causaria un fallo critico de hardware (`NaN`). El epsilon actua como cinturon de seguridad matematico.
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
### 3. Parametros de Capas Neuronales (`GRX::NN`)
|
|
505
|
+
|
|
506
|
+
| Capa / Modulo | Parametro | Tipo | Por Defecto | Rango Valido | Explicacion Didactica |
|
|
507
|
+
|---|---|---|---|---|---|
|
|
508
|
+
| `GRX::NN::Linear` | `in_features` | Integer | (Requerido) | $\ge 1$ | Cantidad de numeros de entrada que recibe la capa. |
|
|
509
|
+
| `GRX::NN::Linear` | `out_features` | Integer | (Requerido) | $\ge 1$ | Cantidad de neuronas o caracteristicas que produce de salida. |
|
|
510
|
+
| `GRX::NN::Linear` | `bias` | Boolean | `true` | `true` / `false` | Si es `true`, agrega el termino de sesgo $b$ ($y = Wx + b$). |
|
|
511
|
+
| `GRX::NN::Embedding`| `num_embeddings` | Integer | (Requerido) | $\ge 1$ | Tamano del vocabulario o numero total de entidades unicas. |
|
|
512
|
+
| `GRX::NN::Embedding`| `embedding_dim` | Integer | (Requerido) | $\ge 1$ | Dimension del vector denso continuo para representar cada palabra. |
|
|
513
|
+
| `GRX::NN::Dropout` | `p` | Float | `0.5` | `0.0` a `0.99` | Probabilidad de desactivar aleatoriamente una neurona durante el entrenamiento (0.2 = 20%, 0.5 = 50%) para evitar que la red se vuelva dependiente de una sola neurona. |
|
|
514
|
+
| `GRX::NN::LeakyReLU`| `alpha` | Float | `0.01` | `0.001` a `0.3` | Pendiente para numeros negativos. Evita que las neuronas "mueran" permitiendo pasar un 1% de gradiente cuando $x < 0$. |
|
|
515
|
+
| `GRX::NN::LayerNorm`| `normalized_shape`| Integer/Array | (Requerido) | Dimensiones | Dimension sobre la que se calcula la media y varianza unitaria. |
|
|
516
|
+
| `GRX::NN::LayerNorm`| `eps` / `epsilon` | Float | `1e-5` | `1e-8` a `1e-4` | Termino sumado a la varianza para evitar division entre 0. |
|
|
517
|
+
| `GRX::NN::BatchNorm1d`| `num_features` | Integer | (Requerido) | $\ge 1$ | Cantidad de canales a normalizar a lo largo del lote (*batch*). |
|
|
518
|
+
| `GRX::NN::BatchNorm1d`| `eps` / `epsilon` | Float | `1e-5` | `1e-8` a `1e-4` | Termino de estabilidad sumado a la varianza por lote. |
|
|
519
|
+
| `GRX::NN::BatchNorm1d`| `momentum` | Float | `0.1` | `0.01` a `0.5` | Factor de actualizacion de medias y varianzas moviles para inferencia. |
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
### 4. Parametros de Funciones de Perdida (`GRX::Loss`)
|
|
524
|
+
|
|
525
|
+
| Funcion de Perdida | Parametro | Opciones / Tipo | Por Defecto | Explicacion |
|
|
526
|
+
|---|---|---|---|---|
|
|
527
|
+
| `MSELoss` / `MAELoss` | `reduction` | Symbol | `:mean` | `:mean` promedia el error entre todas las muestras del lote. `:sum` suma todos los errores directos. |
|
|
528
|
+
| `BCELoss` | `reduction` | Symbol | `:mean` | `:mean` o `:sum`. |
|
|
529
|
+
| `BCELoss` | `eps` | Float | `1e-7` | Limite de seguridad para evitar $\log(0) \to -\infty$ en probabilidades extremas (0.0 o 1.0). |
|
|
530
|
+
| `CrossEntropyLoss` | `reduction` | Symbol | `:mean` | `:mean` o `:sum`. Aplica Softmax con Log-Sum-Exp. |
|
|
531
|
+
| `HuberLoss` | `delta` | Float | `1.0` | Umbral de transicion: si el error es menor a $\delta$ se calcula como cuadratico (MSE); si es mayor, se calcula lineal (MAE) para no volverse loco con datos atipicos (*outliers*). |
|
|
532
|
+
| `HuberLoss` | `reduction` | Symbol | `:mean` | `:mean` o `:sum`. |
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
### 5. Parametros de Creacion y Manipulacion de Tensores (`GRX::Tensor`)
|
|
537
|
+
|
|
538
|
+
| Metodo / Factory | Parametro | Tipo | Por Defecto | Descripcion |
|
|
539
|
+
|---|---|---|---|---|
|
|
540
|
+
| `GRX.tensor` | `data` | Array / Storage | (Requerido) | Datos numericos en arreglo plano (`[1.0, 2.0]`) o anidado (`[[1, 2], [3, 4]]`). |
|
|
541
|
+
| `GRX.tensor` | `shape` | Array[Integer] | `nil` (Auto) | Dimensiones del tensor (ej. `[2, 3]` para 2 filas y 3 columnas). |
|
|
542
|
+
| `GRX.tensor` | `requires_grad`| Boolean | `false` | Activa el rastreo en el grafo DAG para calcular gradientes con `backward`. |
|
|
543
|
+
| `GRX.zeros` / `GRX.ones` | `shape` | Array[Integer] | (Requerido) | Dimensiones del tensor a inicializar con ceros o unos. |
|
|
544
|
+
| `GRX.rand` | `shape` | Array[Integer] | (Requerido) | Genera tensor con distribucion uniforme $U[0, 1)$. |
|
|
545
|
+
| `GRX.randn` | `shape` | Array[Integer] | (Requerido) | Genera tensor con distribucion normal estandar $N(0, 1)$ mediante Box-Muller. |
|
|
546
|
+
| `Tensor.xavier_uniform`| `shape` | Array[Integer] | (Requerido) | Inicializador Xavier/Glorot ($U[-\sqrt{6/(f_{in}+f_{out})}, \sqrt{6/(f_{in}+f_{out})}]$). |
|
|
547
|
+
| `Tensor.he_normal` | `shape` | Array[Integer] | (Requerido) | Inicializador He/Kaiming ($N(0, \sqrt{2/f_{in}})$), optimo para capas con ReLU. |
|
|
548
|
+
| `Tensor.zeros_like` | `other` | Tensor | (Requerido) | Crea un tensor de ceros con la misma forma que `other`. |
|
|
549
|
+
| `Tensor.ones_like` | `other` | Tensor | (Requerido) | Crea un tensor de unos con la misma forma que `other`. |
|
|
550
|
+
| `tensor.clip` | `lo`, `hi` | Numeric | (Requeridos) | Limites inferior y superior. Fija valores fuera del intervalo $[lo, hi]$. |
|
|
551
|
+
| `tensor.pow` | `exponent` | Numeric | (Requerido) | Exponente al que se eleva cada elemento ($x^e$). Totalmente diferenciable. |
|
|
552
|
+
| `tensor.reshape` | `new_shape` | Array[Integer] | (Requerido) | Nueva forma manteniendo el mismo `numel` total. Vista zero-copy. |
|
|
553
|
+
| `tensor.transpose` | (sin args) | - | - | Intercambia filas y columnas en tensores 2D. Vista zero-copy por strides. |
|
|
554
|
+
| `tensor.flatten` | (sin args) | - | - | Aplana el tensor a 1 dimension `[numel]`. Vista zero-copy. |
|
|
555
|
+
| `tensor.contiguous`| (sin args) | - | - | Re-empaca la memoria no contigua (tras un transpose) en un buffer contiguo nuevo. |
|
|
556
|
+
| `tensor.get` | `*indices` | Integers | (Requerido) | Coordenadas del elemento a leer (ej. `t.get(0, 2)`). |
|
|
557
|
+
| `tensor.set` | `*indices, val`| Integers, Float | (Requeridos) | Modifica directamente el valor en la posicion especificada. |
|
|
558
|
+
| `tensor.item` | (sin args) | - | - | Extrae el valor numerico Float de un tensor escalar de 1 solo elemento. |
|
|
559
|
+
| `tensor.argmax` | (sin args) | - | - | Retorna el indice del elemento con el valor maximo. |
|
|
560
|
+
| `tensor.argmin` | (sin args) | - | - | Retorna el indice del elemento con el valor minimo. |
|
|
561
|
+
| `tensor.backward` | `gradient` | Tensor | `nil` | Ejecuta la retropropagacion inversa a lo largo del grafo computacional DAG. |
|
|
562
|
+
|
|
563
|
+
---
|
|
564
|
+
|
|
565
|
+
### 6. Parametros de Carga de Datos, Persistencia y Utilidades (`GRX::Data`, `GRX::Serialization`, `GRX::Utils`)
|
|
566
|
+
|
|
567
|
+
* `TensorDataset.new(*tensors)`:
|
|
568
|
+
* `*tensors` (Tensors requeridos): Tensores paralelos (ej. caracteristicas $X$ y etiquetas $Y$) que comparten la dimension 0 de lote.
|
|
569
|
+
* `DataLoader.new(dataset, batch_size: 32, shuffle: true)`:
|
|
570
|
+
* `dataset` (`GRX::Data::Dataset`): Coleccion indexable de datos.
|
|
571
|
+
* `batch_size` (Integer, por defecto: `32`): Cantidad de muestras agrupadas que se procesan simultaneamente en C por iteracion antes de actualizar pesos.
|
|
572
|
+
* `shuffle` (Boolean, por defecto: `true`): Si es `true`, desordena aleatoriamente los indices en cada epoca para que la red no aprenda el orden de los datos.
|
|
573
|
+
* `GRX::Serialization.save(model, path)` / `model.save_weights(path)`:
|
|
574
|
+
* `model` (`GRX::NN::Module`): Instancia del modelo a persistir.
|
|
575
|
+
* `path` (String): Ruta del archivo destino `.grx`. Vuelca directamente los doubles IEEE 754 de 64 bits de la memoria C sin sobrecosto de JSON/YAML.
|
|
576
|
+
* `GRX::Serialization.load(model, path)` / `model.load_weights(path)`:
|
|
577
|
+
* `model` (`GRX::NN::Module`): Modelo con la misma arquitectura en memoria.
|
|
578
|
+
* `path` (String): Ruta del archivo `.grx` binario a cargar.
|
|
579
|
+
* `model.train!` y `model.eval!`:
|
|
580
|
+
* `train!`: Pone el modelo en modo de entrenamiento (activa `Dropout` y calcula medias dinamicas en `BatchNorm1d`).
|
|
581
|
+
* `eval!`: Pone el modelo en modo de evaluacion/inferencia (desactiva `Dropout` y usa medias moviles fijas en `BatchNorm1d`).
|
|
582
|
+
* `GRX::Utils.clip_grad_norm!(params, max_norm: 1.0)`:
|
|
583
|
+
* `params` (Array[Tensor]): Coleccion de parametros con gradientes acumulados.
|
|
584
|
+
* `max_norm` (Float, por defecto: `1.0`): Norma L2 maxima permitida. Si la norma combinada supera `max_norm`, los gradientes se reescalan proporcionalmente para evitar explosiones.
|
|
585
|
+
* `GRX::Utils.one_hot(indices, num_classes: nil, requires_grad: false)`:
|
|
586
|
+
* `indices` (Array[Integer] o Tensor): Vector con identificadores enteros de clase (ej. `[0, 2, 1]`).
|
|
587
|
+
* `num_classes` (Integer, opcional): Numero total de columnas de clase (si no se indica, se autocalcula como `max + 1`).
|
|
588
|
+
* `requires_grad` (Boolean, por defecto: `false`): Si la matriz resultante requiere autograd.
|
|
589
|
+
* `GRX.simd_mode`:
|
|
590
|
+
* Retorna el nivel de aceleracion de hardware activo en la maquina: `:avx2` (4 doubles/ciclo con FMA), `:sse` (2 doubles/ciclo), `:scalar` (C portable) o `:ruby` (fallback).
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
### 7. Jerarquia de Excepciones de GRTensor
|
|
595
|
+
|
|
596
|
+
| Excepcion | Hereda de | Causa Principal |
|
|
597
|
+
|---|---|---|
|
|
598
|
+
| `GRX::Error` | `StandardError` | Clase base para todas las excepciones del framework. |
|
|
599
|
+
| `GRX::ShapeError` | `GRX::Error` | Dimensiones incompatibles en operaciones algebraicas (ej. sumar matrices de distinto tamano o multiplicar dimensiones internas dispares). |
|
|
600
|
+
| `GRX::DimensionError` | `GRX::Error` | Rango de dimensiones invalido (ej. llamar `transpose` o `matmul` sobre tensores de 1 sola dimension). |
|
|
601
|
+
| `GRX::StorageError` | `GRX::Error` | Fallo de memoria nativa C (`malloc` OOM) o error de lectura en archivos binarios `.grx` corruptos. |
|
|
602
|
+
|
|
603
|
+
---
|
|
604
|
+
|
|
605
|
+
## 13. Proyectos Guiados Paso a Paso (Completos y Ejecutables)
|
|
606
|
+
|
|
607
|
+
---
|
|
608
|
+
|
|
609
|
+
### Proyecto 1: El Conversor de Temperatura (Celsius a Fahrenheit)
|
|
610
|
+
|
|
611
|
+
Este es el "Hello World" absoluto de la Inteligencia Artificial. La formula fisica real es:
|
|
612
|
+
$$F = 1.8 \times C + 32$$
|
|
613
|
+
|
|
614
|
+
La red neuronal tiene **1 sola neurona** (`Linear(1, 1)`: $y = w \cdot x + b$). La red no conoce la formula, pero tras 1,500 iteraciones con Adam, descubrira por si sola que el peso $w \approx 1.8$ y el sesgo $b \approx 32.0$.
|
|
615
|
+
|
|
616
|
+
```ruby
|
|
617
|
+
require "grx"
|
|
618
|
+
|
|
619
|
+
# 1. Datos de entrenamiento (8 pares de temperaturas reales)
|
|
620
|
+
celsius_datos = [18.0, 25.0, 14.0, 21.0, 9.0, 16.0, 4.0, 32.0]
|
|
621
|
+
fahrenheit_datos = [64.4, 77.0, 57.2, 69.8, 48.2, 60.8, 39.2, 89.6]
|
|
622
|
+
|
|
623
|
+
# Convertir a tensores 2D [8 filas, 1 columna]
|
|
624
|
+
x = GRX.tensor(celsius_datos, [8, 1])
|
|
625
|
+
y = GRX.tensor(fahrenheit_datos, [8, 1])
|
|
626
|
+
|
|
627
|
+
# 2. Definir la arquitectura (1 neurona)
|
|
628
|
+
termometro = GRX::NN::Sequential.new(
|
|
629
|
+
GRX::NN::Linear.new(1, 1)
|
|
630
|
+
)
|
|
631
|
+
|
|
632
|
+
# 3. Optimizador y funcion de error cuadratico medio (MSE)
|
|
633
|
+
opt = GRX::Optim::Adam.new(termometro.parameters, lr: 0.8)
|
|
634
|
+
loss_fn = GRX::Loss::MSELoss.new
|
|
635
|
+
|
|
636
|
+
puts "Entrenando la neurona para aprender la escala Fahrenheit..."
|
|
637
|
+
|
|
638
|
+
# 4. Bucle de entrenamiento
|
|
639
|
+
1500.times do
|
|
640
|
+
opt.zero_grad
|
|
641
|
+
pred = termometro.call(x)
|
|
642
|
+
loss = loss_fn.call(pred, y)
|
|
643
|
+
loss.backward
|
|
644
|
+
opt.step
|
|
645
|
+
end
|
|
646
|
+
|
|
647
|
+
puts "Entrenamiento finalizado!"
|
|
648
|
+
|
|
649
|
+
# 5. Pruebas con temperaturas nunca vistas
|
|
650
|
+
test_celsius = GRX.tensor([[100.0], [0.0], [37.0]], [3, 1])
|
|
651
|
+
predicciones = termometro.call(test_celsius).to_a
|
|
652
|
+
|
|
653
|
+
puts "\n--- Resultados del Termometro Neuronal ---"
|
|
654
|
+
puts "100.0 C -> #{predicciones[0].round(2)} F (Esperado: 212.00 F)"
|
|
655
|
+
puts " 0.0 C -> #{predicciones[1].round(2)} F (Esperado: 32.00 F)"
|
|
656
|
+
puts " 37.0 C -> #{predicciones[2].round(2)} F (Esperado: 98.60 F)"
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
---
|
|
660
|
+
|
|
661
|
+
### Proyecto 2: Compuertas Logicas (AND Lineal vs XOR No Lineal)
|
|
662
|
+
|
|
663
|
+
Una compuerta **AND** se puede resolver con 1 sola neurona lineal porque los datos son linealmente separables.
|
|
664
|
+
Sin embargo, la compuerta **XOR** (Or Exclusivo) es el clasico problema no lineal: una sola linea recta no puede separar los ceros de los unos. Por eso agregamos una **capa oculta con activacion ReLU**:
|
|
665
|
+
|
|
666
|
+
```ruby
|
|
667
|
+
require "grx"
|
|
668
|
+
|
|
669
|
+
# Tabla de verdad XOR:
|
|
670
|
+
# (0, 0) -> 0
|
|
671
|
+
# (0, 1) -> 1
|
|
672
|
+
# (1, 0) -> 1
|
|
673
|
+
# (1, 1) -> 0
|
|
674
|
+
entradas_xor = GRX.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]], [4, 2])
|
|
675
|
+
salidas_xor = GRX.tensor([[0.0], [1.0], [1.0], [0.0]], [4, 1])
|
|
676
|
+
|
|
677
|
+
# Red neuronal multicapa: 2 entradas -> 4 ocultas (ReLU) -> 1 salida (Sigmoide)
|
|
678
|
+
red_xor = GRX::NN::Sequential.new(
|
|
679
|
+
GRX::NN::Linear.new(2, 4),
|
|
680
|
+
GRX::NN::ReLU.new,
|
|
681
|
+
GRX::NN::Linear.new(4, 1),
|
|
682
|
+
GRX::NN::Sigmoid.new
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
opt = GRX::Optim::Adam.new(red_xor.parameters, lr: 0.05)
|
|
686
|
+
loss_fn = GRX::Loss::BCELoss.new
|
|
687
|
+
|
|
688
|
+
# Entrenamiento
|
|
689
|
+
400.times do
|
|
690
|
+
opt.zero_grad
|
|
691
|
+
pred = red_xor.call(entradas_xor)
|
|
692
|
+
loss = loss_fn.call(pred, salidas_xor)
|
|
693
|
+
loss.backward
|
|
694
|
+
opt.step
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
puts "\n--- Predicciones de la Compuerta XOR ---"
|
|
698
|
+
entradas_xor.to_a.each_slice(2).each_with_index do |(in1, in2), i|
|
|
699
|
+
muestra = GRX.tensor([[in1, in2]], [1, 2])
|
|
700
|
+
resultado = red_xor.call(muestra).item
|
|
701
|
+
puts "XOR(#{in1.to_i}, #{in2.to_i}) = #{resultado.round(3)} -> #{resultado >= 0.5 ? 1 : 0}"
|
|
702
|
+
end
|
|
703
|
+
```
|
|
421
704
|
|
|
422
705
|
---
|
|
423
706
|
|
|
424
|
-
### Proyecto
|
|
707
|
+
### Proyecto 3: El Predictor de Formulas (Regresion Lineal)
|
|
425
708
|
|
|
426
709
|
Aprende la relacion $y = 3x + 2$ usando `loss.backward` nativo.
|
|
427
710
|
|
|
@@ -452,7 +735,7 @@ puts "Prediccion para x=6 (esperado=20): #{modelo.call(test_x).to_a[0].round(3)}
|
|
|
452
735
|
|
|
453
736
|
---
|
|
454
737
|
|
|
455
|
-
### Proyecto
|
|
738
|
+
### Proyecto 4: Ajuste de Curvas No Lineales y Guardado en `.grx`
|
|
456
739
|
|
|
457
740
|
```ruby
|
|
458
741
|
require "grx"
|
|
@@ -496,7 +779,7 @@ puts "Inferencia x=11: #{modelo_nuevo.call(GRX.tensor([11.0], [1, 1])).to_a[0].r
|
|
|
496
779
|
|
|
497
780
|
---
|
|
498
781
|
|
|
499
|
-
### Proyecto
|
|
782
|
+
### Proyecto 5: Clasificador Binario Inteligente con BCELoss
|
|
500
783
|
|
|
501
784
|
```ruby
|
|
502
785
|
require "grx"
|
|
@@ -527,7 +810,7 @@ puts "Resultados OR: #{clasificador.call(train_x).to_a.map { |v| v.round(4) }}"
|
|
|
527
810
|
|
|
528
811
|
---
|
|
529
812
|
|
|
530
|
-
### Proyecto
|
|
813
|
+
### Proyecto 6: Entrenamiento con Datasets Masivos (5,000 Filas con DataLoader)
|
|
531
814
|
|
|
532
815
|
```ruby
|
|
533
816
|
require "grx"
|
|
@@ -577,7 +860,7 @@ puts "Error de Validacion MSE (5,000 muestras): #{val_loss.round(6)}"
|
|
|
577
860
|
|
|
578
861
|
---
|
|
579
862
|
|
|
580
|
-
### Proyecto
|
|
863
|
+
### Proyecto 7: Chatbot Financiero Inteligente con Base de Conocimiento y Filtro de Incertidumbre
|
|
581
864
|
|
|
582
865
|
Este proyecto crea un agente de atencion al cliente que comprende intenciones mediante redes neuronales y recupera respuestas exactas de su memoria. Si una consulta es incomprensible o fuera de tema, lo reconoce honestamente:
|
|
583
866
|
|
|
@@ -744,7 +1027,7 @@ end
|
|
|
744
1027
|
|
|
745
1028
|
---
|
|
746
1029
|
|
|
747
|
-
##
|
|
1030
|
+
## 14. Buenas Practicas y Errores Comunes
|
|
748
1031
|
|
|
749
1032
|
1. **Llamar `opt.zero_grad` en cada iteracion:** Evita que los gradientes se acumulen indefinidamente.
|
|
750
1033
|
2. **Dimensiones compatibles:** Las capas lineales esperan siempre tensores 2D `[batch_size, num_features]`.
|
|
@@ -752,7 +1035,7 @@ end
|
|
|
752
1035
|
|
|
753
1036
|
---
|
|
754
1037
|
|
|
755
|
-
##
|
|
1038
|
+
## 15. Glosario de Terminos Clave
|
|
756
1039
|
|
|
757
1040
|
- **Shape:** Dimensiones del tensor (ej. `[10, 4]` -> 10 filas, 4 columnas).
|
|
758
1041
|
- **Numel:** Total de elementos del tensor.
|