MuseNet

Nous avons créé MuseNet, un réseau neuronal profond qui peut générer des compositions musicales de 4 minutes avec 10 instruments différents, et peut combiner des styles allant de la country à Mozart en passant par les Beatles. MuseNet n’a pas été programmé explicitement avec notre compréhension de la musique, mais a plutôt découvert des modèles d’harmonie, de rythme et de style en apprenant à prédire le prochain jeton dans des centaines de milliers de fichiers MIDI. MuseNet utilise la même technologie générale non supervisée que GPT-2, un modèle de transformateur à grande échelle formé pour prédire le prochain token dans une séquence, qu’elle soit audio ou textuelle.

Echantillons

Puisque MuseNet connaît de nombreux styles différents, nous pouvons mélanger les générations de manière inédite. Ici, on donne au modèle les 6 premières notes d’un Nocturne de Chopin, mais on lui demande de générer un morceau dans un style pop avec piano, batterie, basse et guitare. Le modèle parvient à mélanger les deux styles de manière convaincante, avec le groupe complet qui se joint à lui aux alentours de la 30e seconde :

Essayez MuseNet

Nous sommes impatients de voir comment les musiciens et les non-musiciens utiliseront MuseNet pour créer de nouvelles compositions !

En mode simple (affiché par défaut), vous entendrez des échantillons aléatoires non traités que nous avons pré-générés. Choisissez un compositeur ou un style, un début facultatif d’un morceau célèbre, et commencez à générer. Cela vous permet d’explorer la variété des styles musicaux que le modèle peut créer. En mode avancé, vous pouvez interagir directement avec le modèle. Les complétions prendront plus de temps, mais vous créerez un morceau entièrement nouveau.

Certaines des limites de MuseNet incluent :

  • Les instruments que vous demandez sont des suggestions fortes, pas des exigences. MuseNet génère chaque note en calculant les probabilités parmi toutes les notes et instruments possibles. Le modèle se déplace pour rendre vos choix d’instruments plus probables, mais il y a toujours une chance qu’il choisisse autre chose.
  • MuseNet a plus de mal avec les paires impaires de styles et d’instruments (comme Chopin avec une basse et une batterie). Les générations seront plus naturelles si vous choisissez les instruments les plus proches du style habituel du compositeur ou du groupe.

Tocle de compositeur et d’instrumentation

Nous avons créé des tokens de compositeur et d’instrumentation pour donner plus de contrôle sur les types d’échantillons que MuseNet génère. Pendant la période d’apprentissage, ces jetons de compositeur et d’instrumentation ont été ajoutés à chaque échantillon, afin que le modèle apprenne à utiliser ces informations pour prédire les notes. Au moment de la génération, nous pouvons alors conditionner le modèle pour qu’il crée des échantillons dans un style choisi en commençant par une invite telle qu’un début de piano Rachmaninoff :

Ou une invite avec le groupe Journey, avec piano, basse, guitare et batterie :

Nous pouvons visualiser les embeddings de MuseNet pour avoir un aperçu de ce que le modèle a appris. Ici, nous utilisons t-SNE pour créer une carte 2-D de la similarité en cosinus de divers embeddings de compositeurs et de styles musicaux.

Survolez un compositeur ou un style spécifique pour voir comment il se rapporte aux autres.

Structure à long terme

MuseNet utilise les noyaux recalculés et optimisés de Sparse Transformer pour entraîner un réseau à 72 couches avec 24 têtes d’attention – avec une attention totale sur un contexte de 4096 tokens. Ce long contexte peut être l’une des raisons pour lesquelles il est capable de se souvenir de la structure à long terme d’un morceau, comme dans l’échantillon suivant imitant Chopin :

Il peut également créer des structures mélodiques musicales, comme dans cet échantillon imitant Mozart :

La génération de musique est un domaine utile pour tester le Sparse Transformer car il se situe à mi-chemin entre le texte et les images. Il possède la structure token fluide du texte (dans les images, vous pouvez revenir en arrière de N tokens et trouver la rangée au-dessus, alors que dans la musique, il n’y a pas de nombre fixe pour revenir à la mesure précédente). Pourtant, nous pouvons facilement entendre si le modèle capture une structure à long terme de l’ordre de centaines ou de milliers de tokens. C’est beaucoup plus évident si un modèle musical gâche la structure en changeant le rythme, d’une manière qui est moins claire si un modèle textuel prend une brève tangente.

Dataset

Nous avons collecté des données d’entraînement pour MuseNet à partir de nombreuses sources différentes. ClassicalArchives et BitMidi ont fait don de leurs grandes collections de fichiers MIDI pour ce projet, et nous avons également trouvé plusieurs collections en ligne, notamment des styles jazz, pop, africains, indiens et arabes. De plus, nous avons utilisé le jeu de données MAESTRO.

Le transformateur est entraîné sur des données séquentielles : étant donné un ensemble de notes, nous lui demandons de prédire la note suivante. Nous avons expérimenté plusieurs façons différentes d’encoder les fichiers MIDI en jetons adaptés à cette tâche. Tout d’abord, une approche par accord qui considère chaque combinaison de notes sonnant à un moment donné comme un « accord » individuel, et attribue un jeton à chaque accord. Deuxièmement, nous avons essayé de condenser les motifs musicaux en nous concentrant uniquement sur les débuts de notes, et nous avons essayé de compresser davantage cela en utilisant un schéma d’encodage par paires d’octets.

Nous avons également essayé deux méthodes différentes pour marquer le passage du temps : soit des jetons qui étaient mis à l’échelle en fonction du tempo du morceau (de sorte que les jetons représentaient un temps musical ou une fraction de temps), soit des jetons qui marquaient le temps absolu en secondes. Nous avons atterri sur un encodage qui combine l’expressivité et la concision : la combinaison des informations de hauteur, de volume et d’instrument en un seul jeton.

bach piano_strings start tempo90 piano:v72:G1 piano:v72:G2 piano:v72:B4 piano:v72:D4 violin:v80:G4 piano:v72:G4 piano:v72:B5 piano:v72:D5 wait:12 piano:v0:B5 wait:5 piano:v72:D5 wait:12 piano:v0:D5 wait:4 piano:v0:G1 piano:v0:G2 piano:v0:B4 piano:v0:D4 violin:v0:G4 piano:v0:G4 wait:1 piano:v72:G5 wait:12 piano:v0:G5 wait:5 piano:v72:D5 wait:12 piano:v0:D5 wait:5 piano:v72:B5 wait:12
Echantillon d’encodage qui combine la hauteur, le volume et l’instrument.

Pendant la formation, nous :

  1. Transposons les notes en élevant et en abaissant les hauteurs (plus tard dans la formation, nous réduisons la quantité de transposition afin que les générations restent dans les gammes d’instruments individuels).
  2. Augmenter les volumes, en augmentant ou en diminuant les volumes globaux des différents échantillons.
  3. Augmenter le timing (lorsqu’on utilise l’encodage du temps absolu en secondes), en ralentissant ou en accélérant effectivement légèrement les morceaux.
  4. Utiliser le mixup sur l’espace d’enchâssement des tokens

Nous créons également une critique interne : on demande au modèle, pendant le temps d’apprentissage, de prédire si un échantillon donné provient vraiment de l’ensemble de données ou s’il s’agit d’une des propres générations passées du modèle. Ce score est utilisé pour sélectionner les échantillons au moment de la génération.

Embeddings

Nous avons ajouté plusieurs types d’embeddings différents pour donner au modèle un contexte plus structurel. En plus des embeddings positionnels standards, nous avons ajouté un embedding appris qui suit le passage du temps dans un échantillon donné. De cette façon, toutes les notes qui sonnent au même moment reçoivent le même encastrement temporel. Nous ajoutons ensuite un encastrement pour chaque note d’un accord (cela imite l’attention relative, puisqu’il sera plus facile pour le modèle d’apprendre que la note 4 doit regarder la note 3, ou encore la note 4 de l’accord précédent). Enfin, nous ajoutons deux incorporations structurelles qui indiquent au modèle où se trouve un échantillon musical donné dans le morceau de musique plus large. Un encastrement divise le plus grand morceau en 128 parties, tandis que le second encodage est un compte à rebours de 127 à 0 lorsque le modèle s’approche du jeton (de fin).

Nous sommes impatients d’entendre ce que les gens créent ! Si vous créez un morceau que vous aimez, vous pouvez le télécharger sur un service gratuit comme Instaudio et ensuite nous tweeter le lien (la démo de MuseNet a un bouton tweet pour aider avec cela).

Si vous êtes intéressé à en apprendre davantage sur le travail musical d’OpenAI, envisagez de postuler pour rejoindre notre équipe. N’hésitez pas à nous envoyer un courriel avec des suggestions pour la démo MuseNet. Nous aimerions également avoir de vos nouvelles si vous êtes intéressé à composer avec MuseNet de manière plus approfondie, ou si vous avez des fichiers MIDI que vous aimeriez ajouter à l’ensemble d’entraînement.

MuseNet a joué un concert expérimental le 25 avril 2019, livestreamé sur la chaîne Twitch d’OpenAI, dans lequel aucun humain (y compris nous) n’avait entendu les morceaux auparavant.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.