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 (78 s de música) o 2048 (154 s), según el modelo
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_score mide 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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Paper for LuisContreras73/music-generation