Music Generation — cinco modelos autorregresivos sobre piano simbólico
Pesos de cinco de los dieciséis experimentos del laboratorio LuisContreras73/music-generation, donde se comparan cuatro familias de arquitectura sobre el mismo corpus, la misma tokenización y el mismo protocolo, midiendo por separado lo que cada modelo predice y lo que cada modelo genera.
Todo el código, los informes y el pipeline están en GitHub. Este repositorio contiene solo los pesos, porque GitHub bloquea ficheros de más de 100 MB y cada checkpoint pesa entre 91 y 98 MB.
El resultado que justifica publicar los cinco, y no solo el mejor
Predecir mejor no es generar mejor. El modelo con mejor verosimilitud es el que peor música produce:
| modelo | NLL val (nats/token) | bits/paso | gen_score con prefijo | gen_score libre |
|---|---|---|---|---|
estilo_llama_ctx2048_24ep |
1.5035 | 1.5172 | 49.3 ± 2.4 | 45.6 |
estilo_llama_24ep |
1.5788 | 1.5815 | 74.4 ± 15.3 | 38.0 |
perceiver_ar |
1.7017 | 1.7046 | 50.6 ± 2.6 | 29.3 |
music_transformer |
1.8244 | 1.8276 | 64.3 ± 22.6 | 29.3 |
lstm |
2.0389 | 2.0424 | 78.9 ± 3.0 | 70.5 |
Referencia trivial: 4.0921 bits/paso. Fragmentos reales del corpus: gen_score 87.6.
gen_score con prefijo se mide con los mismos 16 prefijos del split de test para todos
los modelos y tres semillas de muestreo, que es lo único que hace comparables dos
generaciones. Es un resultado conocido —Theis, van den Oord y Bethge,
arXiv:1511.01844— replicado aquí sobre música simbólica.
Cuál elegir: lstm si quieres que suene bien; estilo_llama_ctx2048_24ep si quieres la
mejor verosimilitud; music_transformer como línea de referencia con atención relativa.
Cómo usarlos
Los checkpoints no son autocontenidos: necesitan el código del repositorio, que define la tokenización y las arquitecturas.
git clone https://github.com/LuisContreras73/music-generation.git
cd music-generation
pip install torch --index-url https://download.pytorch.org/whl/cu128
pip install -r requirements.txt
# los pesos, desde aquí
pip install huggingface_hub
python -c "
from huggingface_hub import hf_hub_download
import shutil, pathlib
for m in ['lstm', 'music_transformer', 'estilo_llama_ctx2048_24ep']:
p = hf_hub_download('LuisContreras73/music-generation', f'{m}/best.pt')
d = pathlib.Path('experiments')/m/'checkpoints'; d.mkdir(parents=True, exist_ok=True)
shutil.copy(p, d/'best.pt'); print('listo:', m)
"
python scripts/infer.py --exp lstm --scratch --seed 7 --seg 40
Sale .wav, .mid, .npz y .png. La semilla atraviesa el muestreo: dos ejecuciones con
la misma semilla dan el mismo fichero.
Qué hay en cada carpeta
<modelo>/best.pt checkpoint de menor val_bpt (pesos + config + métricas del paso)
<modelo>/config.json la configuración exacta con la que se entrenó
muestras/ un WAV de cada modelo componiendo desde cero, para escuchar sin instalar nada
Se cargan con registry.load_checkpoint, que usa weights_only=False porque el payload
incluye el estado de los RNG: cárgalos solo si confías en el origen.
El modelo y el dato
| tarea | modelado autorregresivo de piano-roll de ataques [T, 88], binario, 20 Hz |
| tokenización | NOTE_ON×88 + SHIFT×64 + PAD/BOS/EOS = 155 símbolos, biyectiva |
| contexto | 1024 tokens ( |
| parámetros | 23.7 M (lstm) a 25.8 M (los demás) |
| corpus | 10 604 piezas, 714.7 h de piano interpretado; particiones por pieza |
| lo que no modela | velocity, duración, pedal, compás, tempo |
estilo_llama_* usa la receta de LLaMA —RoPE, RMSNorm pre-norma, SwiGLU, QK-norm
opcional— entrenada desde cero con vocabulario musical de 155 símbolos. No hay ningún
peso de LLaMA de por medio; el prefijo «estilo» está para que no se entienda lo contrario.
Límites conocidos
gen_scoremide estadísticos marginales, no coherencia musical. Un modelo puede clavar todos los histogramas y sonar incoherente. El paper de Music Transformer resuelve esto con un test de escucha humano, no con una métrica automática.- No compares el NLL con el 1.84 publicado de Music Transformer: su vocabulario son 388 símbolos con velocity sobre MAESTRO; el nuestro 155 sin velocity sobre otro corpus. Una NLL por token depende del vocabulario y del dato.
- La ventaja de la receta LLaMA no está aislada: ese par no comparte presupuesto de tokens ni augmentación. El experimento que lo controlaría está definido y sin ejecutar.
- El corpus original no se redistribuye, ni aquí ni en GitHub. Estos pesos se publican con fines académicos y de reproducibilidad del laboratorio.
Más
Informes completos —análisis del dato, metodología, resultados, limitaciones y estado del
arte— en docs/ del
repositorio de GitHub.