2022年7月7日木曜日

Google Magenta の Polyphony RNN モデルを用いたマーラーの作品の学習実験ノート・本文(2022.7.7 公開, 10.10更新)

元記事(2022年7月7日公開)の「はじめに」を2020年10月10日に独立させて「Google Magenta の Polyphony RNN モデルを用いたマーラーの作品の学習実験ノート・序文」とし、別記事として公開しましたので、併せてご一読頂ければ幸いです。


1.実験に至るまでの経緯と実験結果公開の目的について

 MagentaはGoogleが開発した音楽の機械学習ライブラリだが、その詳細についてはWeb等で情報が入手できる他、2021年7月に斎藤喜寛『Magentaで開発 AI作曲』(オーム社)が刊行され、環境構築や簡単な実験を行うための情報が入手可能になったことをきっかけに2021年の8月末くらいから予備調査に着手した。

 深層学習が注目されるようになって間もなくの頃は、深層学習の実験を自分で試行する手段としては、個人で購入するには決して閾が低いとは言い難いGPUマシンを自前で用意する他なかったが、Google ColaboratoryというクラウドサービスでGPU環境が利用できるようになった。早速試用してみると、無料での利用の範囲ではGPUが連続利用できる時間や利用できるメモリ等に制限がある他、高速なGPUが割り当てられるとは限らないといった制限があり、ちょっとした実験をするにも工夫が必要だが、月あたり1000円程度(為替相場による変動あり)のコストで最低限の実験環境を持つことができ、特に今回の実験に限れば実施可能であることが確認できた。そこでGoogle ColaboratoryのPro版で実験を行うこととした。

 一方、今回の実験の素材として第3交響曲第6楽章を取り上げた最大の理由は、本ブログで2ヵ月前くらい(2022年5月)に公開した記事(デイヴィッド・コープのEMI(Experiments in Musical Intelligence)によるマーラー作品の模倣についての覚え書)に記載の通り、デイヴィッド・コープの著書Computer Models of Musical Creativity(音楽的創造性のコンピュータモデル)の邦訳(『人工知能が音楽を創る 創造性のコンピュータモデル』(音楽之友社, 2017)に遅ればせながらようやく接し、そこでコープがEMIを用いて作成したマーラーの作品の模倣の一つに、この曲をモデルにしていると考えられるもの(『弦楽のためのアダージョ』)があることを、その一部(Mahler Adagio Emmy David Cope (1:57):Mahler Adagio for Strings fragment by Experiments in Musical Intelligence (Emmy) programmed by David Cope.)をYotubeで確認したからである。

 理由のもう一つは、Google Magentaが用意している幾つかのモデルの中で今回実験にPolyphony RNNモデルを用いたことにある。Polyphony RNNモデルはMagentaで用意されているモデルの中で和音を扱うことができるほぼ唯一のモデルといって良い、厳密にはPianoroll RNN-NADEモデルも候補になりうるのだが、こちらは持続方向の扱いに制約があるために、結果を「聴いて」直観的に評価することが困難であること以上に、Pianoroll RNN-NADE custom dataset sample generation error #1878 で報告されている事象に予備実験中に遭遇してしまったことから、消去法的にPolyphony RNNを用いることにしたというのが実態である。 

 既述の予備実験においては、第3交響曲第6楽章以外のマーラーの色々な作品のMIDIファイルを色々なやり方で与えた他、シェーンベルクがプラハ講演で述べたマーラーの作品の旋律の特徴を念頭に、歌曲の歌唱パートのみを抽出し、旋律のみを扱うmelody RNNモデルに与える実験も行った。しかしながら後述の理由から、機械学習の実験テーマとしては成立しそうに思われたものの、実験の目的やそれに応じた実験条件の設定についての検討の必要を感じたことから、今後の実験課題の候補には含めるものの、優先的に実験を行う対象とはしなかった。例えば第10交響曲の補完を考えた場合に、必要なのは与えられた旋律線に対する和声付けや対位法的な声部の補完といった方向性の課題となる。またくだんのシェーンベルクの指摘も、和声法や対位法的な垂直の次元を捨象した水平的な線の問題として扱うことが妥当かどうかには疑問の余地があるだろう。何よりもこれまでMIDIファイルを入力としたマーラーの作品の分析において中心的な課題としていたのは、調的重心であったり和声の出現頻度であったこととの連続性を踏まえれば、最初の実験としては単旋律の発展ではなく、和音のシーケンスを対象とするのが自然に感じられたということである。

 そして和声のシーケンスにフォーカスする場合にMagentaで事前に用意されたモデル中で適切なのは、上記の通りPolyphony RNNということになるが、Polyphony RNNモデルにおける課題の範例はコラール旋律への和音づけであり、直接にはFeynman Liang, BachBot: Automatic composition in the style of Bach chorales Developing, analyzing, and evaluating a deep LSTM model for musical style (2016)に記載されたBachBotという自動音楽生成アルゴリズムに刺激を受けて作成されたもののようである(なお、上記論文では先行研究としてデイヴィッド・コープの研究を参照している)。後述のように、Pythonのコードの形態で提供されているPolyphony RNNモデルの公開されている実装はコラール固有の特徴を前提として各種パラメータの規定値が設定されているため、マーラーの作品を対象とするにあたっては後述するようにパラメータの調整が必要ではあったが、線的な書法の作曲家であるマーラーの作品の中でも、第3交響曲第6楽章(更にその中でも主要部の主題旋律とその和声づけ)は「コラール風」のものと言って良く、Polyphony RNNを用いた実験の素材として無理がなさそうに感じられたというのも、実験で最初に取り上げる題材として選択した理由の一つである。

 だがその一方で第3交響曲第6楽章をGoogle Magenta の Polyphony RNN モデルに訓練データとして与えるということの意味合いについては議論の余地があるだろう。そもそもコープのEMIによるマーラー風のアダージョがどのようなプロセスで生成されたのかは明らかではない(正確を期すれば、現時点の私にとっては、という制限を付けるべきだろう。もしかしたら、この個別のケースについての報告がなされているかも知れないが、上掲のコープの著作の文献リスト中にそれらしいものはないし、コープは自分のプログラムを公開していたことがあるようだが、寧ろ重要なのは何を入力として与え、どのような制御パラメータがあって、それぞれどう設定したら結果がどのように変わるのかといったディティールの筈である。ここでも問題設定は、例えば囲碁や将棋のような、well-definedでclosedな世界とは異なって、寧ろチューリング・テストのような設定に近そうであることは、例えばバッハ風のコラールの和声づけをやった結果を人間に聴かせて、コンピュータが生成したものか否かを判定させて、人間の創作物と区別がつかなければ成功といった評価の仕方に端的に表れている。だがこの場合ですら、バッハの手になる作品か否かというように問いをずらした途端、バッハが行ったコラールの和声づけを「全て」知っている人間にとっては、未知の真作が発見されたといったような文脈抜きではトリヴィアルな問いになってしまうだろう。結果として、既知の作品の「模倣」という目的での或るモデル上での学習の結果の評価は、それを「人間」の曖昧な感覚に委ねるというやり方を拒否してしまえば、自ら定義した「模倣」の成功の度合いを密輸して(何なら堂々と再利用して)生成されたものとオリジナルの既知の作品の距離を測っているに過ぎないことになってしまうことを避け難い。

 それが「学習」であるならば、訓練用データを用いた訓練の結果として汎化が行われ、訓練データ以外のデータを与えた場合にも「それらしい」出力が行われることが求められるのだが、それでは第3交響曲第6楽章と似て非なる作品が生成されるためには一体何を訓練データとして用意すればいいのだろうか?(なおこの問いは、まさにマーラーその人を作曲する機械と見た立てた時、第3交響曲の第6楽章を出力する際に、どのような情報を素材にして、どのようなプロセスで生成が行われたかを問うていることに他ならない。そしてそうした類比を行う先には、Recurrent Neural Networkというチューリングマシンとしての能力を備えた再帰的構造を持つネットワークを基本とし、それが持つ問題点を解消するための制御ノードとして機能するゲートを追加して部分構造を持つようにしたLSTM(Long Short Term Memory)上に実装されたPolyphony RNN モデルがやっていることを、人間の営みとしての「作曲」と呼んでしまうことが孕む深淵が控えていることが見てとれる。)いわゆる「過学習」が起きている場合には、汎化能力が犠牲になる替わりに訓練用データについては精度の高い近似ができるようになっているとされるが、もしそうであるとするならば、ここでの関心は「学習」をさせることではなく、寧ろGoogle Magenta の Polyphony RNN モデルに第3交響曲第6楽章を訓練データとして与えた結果、訓練済モデルが第3交響曲第6楽章そのものを(音楽サヴァンの一部で見られるように完全に間違いなく、最初から最後まで、ではなく、時として間違いを含みつつ、だが或る一部についてはかなりの高精度で)再生できるかどうかにあるのではなかろうか?

 一般的に機械学習の問題設定として見た場合には、演奏すれば20分以上の時間を要するから作品としては大規模なものであるとはいえ、400小節にも満たない第3交響曲第6楽章だけをLSTMの学習の素材として与えることは、サンプル数が少なすぎて適切なものではないという評価になるだろう。一方で第3交響曲第6楽章を出力として得るためには、どういう学習の問題を設定したらよいかというのは、上で見たように端的に言って不良設定問題に過ぎない。従ってここで以下に報告する実験は、形式的にはそのように見えるということもあって、Google Magenta の Polyphony RNN モデルを用いたマーラーの作品の学習実験と銘打っているけれども、実態としては、それが「学習」なのかどうかは一先ずおいて、とにかくGoogle Magenta の Polyphony RNN モデルにマーラーの作品のうちの特定の1楽章を与えてみた結果の報告に過ぎないということをお断りしておきたい。

 なお実験に使用したMagentaのバージョンは2.1.3である。このバージョンは2022年7月1日以降、関連するライブラリの更新の結果、Colaboratory環境にインストールすることができなくなり、本稿執筆時点では実験再開の見通しは立っていない。基本的にはフリーで提供される場合には、こうした状況はしばしば発生し、基本的に利用する側が自己解決すべき性質のものとされ、時間をかけて依存関係を調べて、トライアル&エラーを繰り返せば利用できる可能性もあるだろうが、遺憾ながらそのための時間的な余裕がないため、一旦Magenta を使った実験は中止せざるを得ない。まだ実験を開始してからの時間が短く、敬虔が浅いため、まだまだ改善や工夫の余地があるにも関わらず、一旦これまでの経過を報告することにしたのには、Magenta 2.1.3 が私の環境で使えなくったという事情も寄与している。

[2022.10.10 追記]その後程なくして、遅くとも2020年8月下旬くらいには、ライブラリの依存関係の問題が解消され、再びMagentaを私のColaboratory環境から利用できるようになり、9月中旬には、それまでに実施できていた実験が行えることを確認した。この追記を行うにあたり、念のため最新の状態を確認したが、利用可能な状態にあることを確認できた。そのため、今後更に、このノートの内容を踏まえた追加実験を行うことがあれば、稿を改めて報告することにしたい。

 最後にもう一言だけ述べてこの節を閉じることにするが、「学習」実験の設定としてはより自然なものに見えるであろう、例えばマーラーの複数の作品を入力として与えたらどうなるかという設定について検討しなかったわけではない。既に述べた通り、予備検証フェーズでは、マーラーの歌曲でMIDI化されているものすべてを対象とした検証は実施しているし、マーラーの交響曲全曲のMIDIファイルを対象とする検証も実施はしており、だがこちらはリソースの限界が確認できたために中止することにした。無論対象を絞って、リソースの制約上可能な条件を設定することは可能なのだが、それ以前の問題としてマーラーの複数の作品によってモデルを訓練させることの意味合い、結果として生成される音の系列をどう評価するかについて、上述のような疑問を感じて、実験することに意義を見出せなかったということの方が本質的であると考える。例えば思考実験として、マーラーの歌曲の中から2曲を取り上げて学習させることにしよう。この場合なら、何が学習されるのか?一方で、ごくありふれたこととして、或る歌曲なり交響曲楽章の内部構造として主要部と対比的な部分があるとして、主要部の複数のヴァリアントを与えるなり、主要部と対比部のコントラストを与えるなりすることとどう違うのか。もちろんそれは学習機械の構造にもよるし、具体的な学習時のパラメータと入力として用意したデータとの関係で決まる部分もあるだろうが、ここで私に言えることは、こうした問いは自明でトリヴィアルなものという訳ではないということであり、実のところ今回の実験は、もしかしたらトリヴィアルかも知れないこうした問いについて、それゆえ他の誰もやってみようと思わない実験をやってみた結果を報告することを目的としているというのが実態に即しているように思われる。

 

2.予備検証により判明した本番実験に向けての課題と本番実験方針の決定

2.1.MIDIファイルの事前編集

 Google Magentaは入力としてMIDIファイルを使うことができるので、これまでMIDIファイルを入力としたデータ分析に利用することを目的に、Web上で取得可能でかつフリーで使用可能なMIDIファイルを取得・蓄積してきたものが活用可能である。実際2021年8月末から約1ヵ月程度、断続的に実施した予備実験では、調的重心の移動の可視化や和音の出現頻度に関する統計的な分析の入力として使用してきたMIDIファイルを利用した検証を行うことができた。その一方でMagentaで用意されたモデルが入力として要求するMIDIファイルには制限があり、手元にあるMIDIファイルをそのまま使うことができないことが調査の結果判明した。

 手元にあるMIDIデータは、DTMの一環としてMIDIシーケンサソフトウェアを用いて手入力されたものであるか、MIDIキーボードでの演奏をMIDIデータとして保存したもののいずれかであることが多いが、マーラーの作品の場合にはピアノ伴奏版がある一部の歌曲を除けば管弦楽曲であるためマルチトラック・マルチチャネルで作成されているため、Polyphony RNNモデルへの入力となるMIDIデータはシングルトラック・シングルチャネルである必要がある。マーラーの作品は既存のMIDIファイルはマルチトラック・マルチチャネルで作成されており、Magentaで利用するためには事前にMIDIシーケンサソフトを使ってデータを加工・変換する前処理が必要であることがわかった。 トラックの統合はMIDIシーケンサソフトで比較的簡単に行うことができるが、統合されたトラックの開始部分にはもともと各トラック毎にチャネルを指定していたプログラムチェンジが残っていて、マルチチャネルの状態は解消されていない。そのためMagentaで利用するには更にプログラムチェンジを取り除く必要があることがわかった。


2.2.Onsets and Frames Transcriptionの出力の利用の検討

 ところでマーラー作品のMIDIデータの作成の方法としてもう一つ、ピアノ編曲の演奏をMIDIファイルに変換するというやり方がある。MIDIキーボードを用いた演奏であれば演奏をMIDIデータとして保存することでMIDIデータが生成されるが、アコースティックのピアノの演奏の音響を録音して保存した場合には、wavなどの様々なフォーマットで作成された音響ファイルをMIDIデータに変換しなくてはならない。

 この変換の実現手段として、それ自体Magentaを使ったアプリケーションであるPianoScribeがあり、かつColaboratory上では、Onsets and Frames TranscriptionというNotebookとして提供されているので、これを用いてwavファイルをMIDIファイルに変換することが可能である。Youtube等でマーラーの交響曲のピアノ編曲版の演奏が公開されており、第3交響曲第6楽章については以下のように2手用・4手用の演奏があるため、これらを入力としてまずOnsets and Frames Transcriptionの検証を実施した。

 結果としてOnsets and Frames Transcriptionの性能は申し分なく、音響データが精度よくMIDIコードに変換されることがわかったが、その一方で結果を確認してみると、当然のことではあるが、あくまでもこれは音響データのMIDIコード化であって楽曲の構造を意識したものではないから、例えば小節・拍に関しての処理はなされず、本来ならば記譜上、拍節構造を持つものとしてMIDIコード化された上で、実演において微妙なアゴーギクが施されたものがMIDIのテンポ変更コマンドとしてコード化されるべきものが、直接長さの微妙な差異がMIDIノートのステップ数として表現されてしまっていることがわかる。また現実の演奏にありがちな和音の打鍵のぶれや、長さのムラ、或いはミスタッチについても当然のことながらそのまま記録され、修正や規格化が行われることはない。

 Polyphony RNNモデルは拍節構造を意識したものではないから、以前に取り組んだ拍頭の和音の集計や分類におけるような致命的な問題にはならないし、更に言えば微妙な演奏上のクセのようなもの込みで学習するという別種の可能性もあるにせよ、ここでの関心からすると遠回りな感覚を否めず、その手間を埋め合わせるだけのコストメリットは見出し難い。更にいえば、分析目的ではなく、あくまでも演奏されることを目的に作成された編曲版は、ピアノという楽器の性質を踏まえて然るべき演奏効果を上げることを目的として、しばしば元の管弦楽版の楽譜に忠実であるとは限らない。

 具体的に第3交響曲第6楽章について言えば、上記の2手用編曲と4手用編曲の演奏記録が存在するわけでが、前者がピアノ独奏で大規模な管弦楽を用いたマーラーの交響曲を演奏することに由来する改変が目立つのに比べれば、ここでの目的に照らして後者に分があるのは明らかだとはいえ、後者もまた独自の演奏効果を求めて管弦楽版には存在しない要素が追加されていることには違いなく、管弦楽総譜に忠実にマルチトラック・マルチチャネルで作成されたMIDIファイルをシングルトラック・シングルチャネルにマージしたMIDIファイルの方が今回の目的には適っていると判断し、Onsets and Frames Transcriptionの出力は実験には採用しないことを決定した。


2.3.入力データの調整、訓練用データ生成のパラメータの調整について

 そこで管弦楽総譜に忠実にマルチトラック・マルチチャネルで作成されたMIDIファイルについて確認してみると、第3交響曲第6楽章については以下の2種類のMIDIファイルがWebで公開されており、利用可能であることがわかる。(本ブログのMIDIファイル(2019.9.21更新) を参照されたい。)

  • GustavMahler.Comで公開されているBen Boot作成の6th-movement-Langsam-Ruhevoll-Empfunden.midi (16-channel)
  • 加藤隆太郎さんの旧「Deracinated Flower」のコンテンツの一つであった「MIDIの間」中の「マーラー交響曲 MIDI 全集」に含まれる m3_6.mid。記載はないがこちらも16channelである。(2022.10.10 プロバイダの閉鎖によりアクセスできない旨記載していたが、2022年7月20日にご本人より移転のご連絡を頂いた。現時点では、http://kakuritsu.sitemix.jp/asobi/midi2/index.html に移転されており、再びアクセス可能な状態となっている。2024.6.21その後再びアクセスできなくなったことをか確認。)

 このうち後者のMIDIファイルの作者とはマーラーの作品のMIDIファイルの調査を実施した折にメールでやりとりをさせて頂いており、作成方針から第10交響曲こそないものの、その時より今日に至るまで、文字通り世界で唯一の「マーラー交響曲 MIDI 全集」である後者のデータを従来より和音の出現頻度や調的重心の遷移などのデータ分析で用いてきたこともあり、ここでも後者のMIDIファイルを素材とすることにした。(ちなみに前者は第1交響曲こそ2種類のデータが入手可能であり、更には第10交響曲のデリック・クックによる演奏会用補筆完成版のMIDIファイルが公開されていることが特筆されるものの、第6~8交響曲と「大地の歌」を欠いており全集とはなっていない。)

 既に述べたように、Google Magentaは入力としてMIDIファイルを受け付けるが、事前に用意されているモデル毎に制約事項が存在する。ここで利用を予定しているPolyphony RNNモデルについては、シングルトラック・シングルチャネルであることを条件としているとのことなので公開されているMIDIファイルをそのまま使うことができない。そこでMIDIシーケンサソフトを使って、Magentaに与えることができるかたちに加工する作業を実施することにした。

 使用したMIDIシーケンサソフトは、従来の和声の出現頻度や調的重心の遷移過程の分析にあたって利用してきた以下の2つのフリー・ソフトである。

 対象としたMIDIファイル m3_6.mid は16チャネル16トラックだが、ピッチを持たない打楽器用の第10チャネル/第10トラック以外について1トラックにマージする作業をまず実施した。その結果を用いて試しにMagenta(バージョン2.1.3)のPolyphony RNNモデルに与えて、NoteSequenceファイル(notesequences.tfrecord)の作成、NoteSequenceファイルから抽出した訓練データ(training_poly_tracks.tfrecord)の作成、訓練の実行、更には訓練結果のbundle_file (polyphony_rnn.mag)への出力、bundle_fileを使った楽曲生成と一通りの手順を試行してみた結果、一応最後まで実行できることが確認できたのだが、訓練データ(training_poly_tracks.tfrecord)作成にあたって、訓練データとして抽出する条件に多くの部分が合致せず、結果として訓練用データがわずかしか生成されないことを確認した。原因を探るべく、Pyrhonで実装されたPolyphony RNNモデルのソースコードの中の訓練データ・評価データの作成を行うpolyphony_rnn_create_dataset.py を読んでみると、Polyphony RNNモデルの公開されている実装については、前提としてバッハのコラールが学習の対象であることから、コラール固有の条件が各種パラメータの規定値とされていることが判明した。例えばシーケンスの長さの上下限の制限が厳し過ぎて、訓練用データが生成できないケースが多い。これに対処するために、ローカルにmagentaの環境のクローンを作成し、シーケンスの長さの下限の制限を緩和したコードでデータ生成を行うことにした。

 具体的な修正箇所はpolyphony_rnn_create_dataset.py の中でmin_steps, max_stepsの設定をしている箇所()で、それぞれの標準値は以下の通り。
  • min_steps=80(5小節相当
  • max_steps=512 (32小節相当) 
 標準値は明らかにコラールのフレーズの構造および各フレーズの長さ、コラール全体の長さを想定したものであることがわかる。そこで第3交響曲第6楽章という対象の性質を考慮して、以下のように値を設定することとした。 

(A)予備実験でのパラメータ設定
  • min_steps = 16(=16*1) 1 measures:より短いフレーズの抽出を行う。
  • max_steps = 768(=16*48) 48 measures :1.5倍の長さのフレーズまで抽出。
 上記の設定値での予備実験の結果は、lossやaccuracyといったメトリクスは良好であるにも関わらず、生成結果は期待外れだったことから、短すぎるトラックが副作用を起こしている可能性を考慮して、本番では以下の通り、minを若干長く設定することにした。
 
(B)実験本番でのパラメータ設定
  • min = 48(=16*3) 3 measures:より短いフレーズの抽出を行う。
  • max = 512(=16*32) 32 measures :デフォルト値のまま。
 上限について変更しないことにしたのは、後述のMIDIファイルの分割を実施したこともあり、実際に訓練データ・評価データの抽出を行ったときに、上限超過が原因で抽出対象から除外されたケースが生じなかったことから、変更の必要がなかったことによる。上下限とも値をデフォルトに戻したのは、訓練に用いるネットワークのサイズを変更せず、デフォルト値を使うことと関わる。このデフォルト値の範囲ならばデフォルトの規模のネットワークでの学習が可能でサイズ変更は不要だろうという判断に基づく。
 
 更に上記のパラメータ変更を前提とし、第3交響曲第6楽章という対象の性質を考慮して、シングルトラック化・シングルチャネル化したMIDIファイルをまず幾つかのブロックに分割することを検討した。分割のやり方としては機械的に行うことも考えられるが、訓練用データ・評価用データの作成の抽出の仕方を考えると、質の面でも量の面でも楽曲の構造を意識した分割をした方が望ましいことは明らかであるから、楽式上の区切りを考慮して、まずは全体を10ファイルに分割したデータを用意することにした(program_merged_36)。
  • ①最初から練習番号4 Noch mehr so breit.の手前まで
  • ②練習番号4 Noch mehr so breit.から練習番号9 Tempo I. Ruhevoll! の手前まで
  • ③練習番号9 Tempo I. Ruhevoll!から練習番号14 a tempo (Etwas bewegter.)の手前まで
  • ④練習番号14 a tempo (Etwas bewegter.)から練習番号16 a tempoの手前まで
  • ⑤練習番号16 a tempo から練習番号19 a tempo の手前まで
  • ⑥練習番号19 a tempo から練習番号20. 2/2 taktiren. Sehr bewegt.の手前まで
  • ⑦練習番号20.2/2 taktiren. Sehr bewegt.から練習番号23の5小節手前まで
  • ⑧練習番号23の4小節手前から練習番号25 Wieder Viertel schlagen! Langsamの手前まで
  • ⑨練習番号25 Wieder Viertel schlagen! Langsam から練習番号26の2小節前8/8 Sehr zurueckhaltend. の手前まで
  • ⑩練習番号26の2小節前8/8 Sehr zurueckhaltend.から最後まで
 次いで更に上記の分割結果をベースとして、更に以下のような加工を行った。
 
(1)コーダはフレーズの構造としては特殊であり、カデンツが拡大したものとみることができるため、ここでの目的の観点から削除した。コーダの前にある、アドルノ風には「充足」の機能を持つ後楽節についてはコーダとは機能的には異なるが、それを独立のフレーズとして訓練用データに含めると異質な感じがあるので、同様に削除することにした。
(2)トレモロの指定もなくして、同じ長さの単音符に置換。学習する上で、トレモロの有無が特徴として捉えられるのは、今回の実験の目的にはそぐなわないため、外してしまうことで余計な特徴次元のためにリソースが使われてしまうことを防ぎたい。(実際、全小節を10分割した入力データでの訓練結果を使って生成したケースでは、トレモロが特徴として捉えられていることを窺わせるものであった。)
 (3)対比群を削除して主要主題部に限定したデータを用意。既に述べた通り、楽式分析上は二重変奏と把握されることが多い第3交響曲第6楽章を対象としているので、2つの異なった系列の交替を、だが訓練用データとしてはブロック単位で分割して、それぞれ独立したサンプルとして、だが2系列を同時に一度に与えて(つまりバッチの中でも両方が混在するような前提で)訓練するというのはどういうことをしていることになるのだろうか、という疑問が生じる。勿論このことは、機械学習による作曲一般に言えることではないのだが、人間が介在することなしにコラールのような単純な形式を超えた楽式を機械が学習を通じて習得することに成功したという話は聞かないし、Google Magenta の各モデルで想定されているのは(出力のステップ数のデフォルトはpolyphony_rnn_generate.pyの62行目に定義されており128step=8小節であることからも窺えるように)、作品上では一部に過ぎないフレーズレベルの時系列シーケンスの学習であって、マクロな楽式はGoogle Magentaのモデルに限定すれば実質的にスコープの外であろう。(それに対して、コープが想定しているのが、その範囲に留まらないことは恐らく間違いないが、その代わりに、例えばマーラー風アダージョを生成するのに、具体的に何を入力し、どのようなプロセスを経たのかの具体的な説明はなく、最終的にYoutubeでその断片が公開されている「作品」の成り立ちのどこがEMIが自動的に生成した部分で、どこがコープが介入したのかは明らかではない。)従って、ここでの学習の枠組みを考えたとき、楽曲を加工をせずにまるまる一つ学習モデルに与えるのではなく、訓練データ・評価データが具体的にどのような条件で抽出されるのかを踏まえて、逆算するようなかたちでモデル与えるデータを準備してやり、生成された結果については、時系列のパターンの記憶・再現がどの程度できているかを確認するのが妥当に思われるのである。
 
 これまでの検討により、最終的に実験の対象として用意したデータは、第3交響曲第6楽章全曲を分割した10ファイルのうち以下の部分を抽出したものとした。
  • ①,40 measures.:最初から 練習番号4 Nicht mehr so breitの前まで。
  • ③,40 measures.:練習番号9 tempo I. Ruhevollから練習番号13 Nicht mehr so breitの前まで
  • ⑦b,16 measures.:練習番号21 tempo I.から22の8小節後, Unmerklich draengend.の前まで。
  • ⑩a,26 measures.:練習番号26の2小節前8/8 Sehr zurueckhaltend.から練習番号28 Immer breiter.Langsam anschwellen の前まで
  • ⑩c,26 measures.:練習番号28 Immer breiter. Langsam anschwellen から練習番号30 の4小節後まで 

total 148 measuresであり、楽章全体(328 measures)の45%程度だが、抽出された部分はコラール的な旋律の提示と変容であり、Polyphony RNN モデルがバッハのコラールの和声づけであることを考えると、マーラーの作品を素材とする前提においては相対的に親和性の高い部分ではないかと考えられる。 

 上記の前処理およびパラメータの設定により訓練用データ・評価用データの抽出結果がどうなったかを以下に示す。

(A)予備実験:全曲を10の区分に分割(328小節、10ファイル)

データ抽出のパラメータ

  • min_steps = 16(=16*1) 1 measures:より短いフレーズの抽出を行う。
  • max_steps = 768(=16*48) 48 measures :1.5倍の長さのフレーズまで抽出。
  • 10 inputs. / 216 outputs..(= train (198 =9+117+54+9+9) + eval(18 = 9+9))

    eval:#評価用データ

    • 小節数毎の頻度(計18)
    • [10,20): 9
    • [20,30): 9
    • polyphonic_tracks_discarded_more_than_1_program: 0
    • polyphonic_tracks_discarded_too_long: 0
    • polyphonic_tracks_discarded_too_short: 153
    • poly_tracks_count:1,
    • skipped_due_to_range_exceeded: 0,
    • transpositions_generated: 171, 

    train:#訓練用データ

    • 小節数毎の頻度(計198)
    • [0,1): 9
    • [1,10): 117
    • [10,20): 54
    • [20,30): 9
    • [30,40): 9
    • polyphonic_tracks_discarded_more_than_1_program: 36 #本番実験では修正して0に。
    • polyphonic_tracks_discarded_too_long: 0 
    • polyphonic_tracks_discarded_too_short: 1161
    • poly_tracks_count: 9,
    • skipped_due_to_range_exceeded: 0,
    • transpositions_generated: 1395


    (B)実験:主要部の提示と変容の部分のみ5つの区分に分割(148小節分、5ファイル)

    • データ抽出のパラメータ

  • min = 48(=16*3) 3 measures:デフォルト値に戻す。
  • max = 512(=16*32) 32 measures :デフォルト値に戻す。
  • 5 inputs. / 81 outputs.(= train (63 = 27+18+18) + eval(18 = 0+9+9))

    eval:#評価用データ

    • 小節数毎の頻度(計18データの内訳)
    • [10,20): 9
    • [20,30): 9
    • polyphonic_tracks_discarded_more_than_1_program: 0
    • polyphonic_tracks_discarded_too_long: 0
    • polyphonic_tracks_discarded_too_short: 27
    • poly_tracks_count:1
    • skipped_due_to_range_exceeded: 0
    • transpositions_generated: 45

    train:#訓練用データ

    • 小節数毎の頻度(計63データの内訳)
    • [10,20): 27
    • [20,30): 18
    • [30,40): 18
    • polyphonic_tracks_discarded_more_than_1_program: 0
    • polyphonic_tracks_discarded_too_long: 0 
    • polyphonic_tracks_discarded_too_short: 270
    • poly_tracks_count: 4
    • skipped_due_to_range_exceeded: 0
    • transpositions_generated: 33
     polyphonic_tracks_discarded_more_than_1_programが0であることは、マルチチャネルのMIDIコマンド(Program change)が正しく全て削除されていることを意味する。既述の通り、大抵のMIDIファイルがマルチトラック・マルチチャネルで作成されており、特に管弦楽のMIDIファイルをシングルトラック化した場合、Program changeの情報を削除しないとマルチチャネルの方は残ってしまう。削除漏れがないことを確認するためにはこの項目をチェックすれば良い。
     polyphonic_tracks_discarded_too_longが0であることはmax_stepsを上回るデータがないことを、polyphonic_tracks_discarded_too_shortが0でないことはmin_stepsに満たないデータがあることを意味する。


    2.4.訓練時のハイパーパラメータの設定について

     ここまで学習の入力とするデータの調整や訓練用データ生成のパラメータの調整について述べてきたが、ここでは訓練時のハイパーパラメータの設定について、検討したり予備実験を実施した内容を述べる。今回の実験にあたって設定値の検討を行ったハイパーパラメータは以下の2種類である。

    • rnn_layer_size:Polyphony RNNモデルの場合、入力層・中間層・出力層の三層のノードの数を指定する。デフォルト値は[256, 256, 256]。今回は予備実験時および実験本番の1度目はデフォルト値のままとし、実験本番の2回目に[192, 192, 192]に縮小した時にどのような差がでるかの実験を行った。
    • batch_size:これは訓練・評価で同じサイズを指定することを前提にすれば、データ数が少ない評価用データ数がバッチサイズよりも小さくてはならないという点が拘束条件となる。デフォルト値は64。ここでは予備実験時も実験本番でもeval=18なので、全ての実験において batch_size=18とした。

     今回の実験のようにサンプルデータが少ない場合、まず最初に調整を検討すべきハイパーパラメータはバッチサイズだが、これは訓練用データ、評価用データの出力データ数に応じて変更すべきであるとされる。ネットワークのノード数については回帰式における変数の数とのアナロジーで考えることができ、問題の規模と比べて数が多いとオーバーフィッティングに陥りやすく、ノード数が少ないと粗い近似しかできないため、accuracyやlossといった近似の精度を示す値が頭打ちになりやすい。今回の場合、実験本番の1回目において5000 stepでaccuracy=0.985, loss=0.047となったことを踏まえて、2回目にはノード数を減らし、そのかわりに6000 stepまで訓練を行って比較検証を行った。


    3.訓練結果の概要

    予備実験、実験本番1回目、2回目それぞれの訓練の結果を、Tensorboardの基本的なスカラー量についてのグラフで示す。オレンジ色のグラフは訓練の経過を、青色のグラフは評価の結果を示している。それぞれの指標の意味については上掲書やWeb上の解説を参照頂きたく、ここでの説明は割愛する。

    (A)予備実験(~4500 step ~7000 step)












    (B-1)実験本番第1回目(~6000 step)












    (B-2)実験本番第2回目(~3000 step ~5000 step ~6000 step)












    4.本学習予備実験の経過を収めたアーカイブファイルについて

    本学習予備実験の経過を収めたアーカイブファイルをGoogleドライブで公開中で、以下のURLから取得可能である。

    内容は以下の通りである。

    ①polyphony-m3_6_1-48-4500

    • m3_6-1-48-4500.txt:訓練用ファイル・評価用ファイル生成から訓練済モデルによる楽曲生成実験までの実行ログ(4500 stepまで)
    • test/ :学習用に前処理を行ったMIDIファイルのフォルダ
    • noteseq/:NoteSequenceファイル(notesequences.tfrecord)のフォルダ
    • sequence_examples/:訓練データ(training_poly_tracks.tfrecord)および評価用データ(eval_poly_tracks.tfrecord)のフォルダ
    • logdir/run1/train/:訓練の経過ログが格納されているフォルダ
    • primer/:楽曲生成のキューとなるprimerファイルのフォルダ
    • generated/:m3_6_0_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_1/:m3_6_1_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_2/:m3_6_2_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • polyphony_rnn.mag:訓練済モデルのdumpファイル
    • *.jpg:訓練経過の評価のための各種スカラー値をTensorboardでグラフ化したもの(4500 stepまで)。それぞれの意味については上掲書やWebでの説明を参照されたい。
      • accuracy-4500
      • batch-4500
      • event_accuracy-4500
      • global_step-4500
      • input_producer-4500
      • loss-4500
      • loss_per_step-4500
      • no_event_accuracy-4500
      • perplexity-4500
      • perplexity_per_step-4500
    ②polyphony-m3_6_1-48-7000
    • m3_6-1-48-4500.txt:訓練用ファイル・評価用ファイル生成から訓練済モデルによる楽曲生成実験までの実行ログ(4500 stepまで)
    • m3_6-1-48-7000.txt:訓練用ファイル・評価用ファイル生成から訓練済モデルによる楽曲生成実験までの実行ログ(7000 stepまで)
    • test/ :学習用に前処理を行ったMIDIファイルのフォルダ
    • noteseq/:NoteSequenceファイル(notesequences.tfrecord)のフォルダ
    • sequence_examples/:訓練データ(training_poly_tracks.tfrecord)および評価用データ(eval_poly_tracks.tfrecord)のフォルダ
    • logdir/run1/train/:訓練の経過ログが格納されているフォルダ
    • primer/:楽曲生成のキューとなるprimerファイルのフォルダ
    • generated/:m3_6_0_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ(7000 step時点の訓練結果による)
    • generated_1/:m3_6_1_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ(7000 step時点の訓練結果による)
    • generated_2/:m3_6_2_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ(7000 step時点の訓練結果による)
    • generated-4500/:m3_6_0_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ(4500 step時点の訓練結果による)
    • generated_1-4500/:m3_6_1_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ(4500 step時点の訓練結果による)
    • generated_2-4500/:m3_6_2_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ(4500 step時点の訓練結果による)
    • polyphony_rnn.mag:訓練済モデルのdumpファイル(7000 stepまで)
    • polyphony_rnn-4500.mag:訓練済モデルのdumpファイル(4500 stepまで)
    • *.jpg:訓練経過の評価のための各種スカラー値をTensorboardでグラフ化したもの(7000 stepまで)。それぞれの意味については上掲書やWebでの説明を参照されたい。
      • accuracy-7000
      • batch-7000
      • event_accuracy-7000
      • global_step-7000
      • input_producer-7000
      • loss-7000
      • loss_per_step-7000
      • no_event_accuracy-7000
      • perplexity-7000
      • perplexity_per_step-7000
    ③polyphony-m3_6_extracted-3-32-256
    • program_merged_36_extracted2.txt:訓練用ファイル・評価用ファイル生成から訓練済モデルによる楽曲生成実験までの実行ログ(5000 stepまで)
    • test/ :学習用に前処理を行ったMIDIファイルのフォルダ
    • noteseq/:NoteSequenceファイル(notesequences.tfrecord)のフォルダ
    • sequence_examples/:訓練データ(training_poly_tracks.tfrecord)および評価用データ(eval_poly_tracks.tfrecord)のフォルダ
    • logdir/run1/train/:訓練の経過ログが格納されているフォルダ
    • primer/:楽曲生成のキューとなるprimerファイルのフォルダ
    • generated/:m3_6_0_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_1/:m3_6_1_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_2/:m3_6_2_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • polyphony_rnn.mag:訓練済モデルのdumpファイル(5000 stepまで)
    • *.jpg:訓練経過の評価のための各種スカラー値をTensorboardでグラフ化したもの(5000 stepまで)。それぞれの意味については上掲書やWebでの説明を参照されたい。
      • accuracy
      • batch
      • event_accuracy
      • global_step
      • input_producer
      • loss
      • loss_per_step
      • no_event_accuracy
      • perplexity
      • perplexity_per_step
    ④polyphony-m3_6_extracted-3-32-192-3000
    • program_merged_36_extracted2-192-3000.txt:訓練用ファイル・評価用ファイル生成から訓練済モデルによる楽曲生成実験までの実行ログ(3000 stepまで)
    • test/ :学習用に前処理を行ったMIDIファイルのフォルダ
    • noteseq/:NoteSequenceファイル(notesequences.tfrecord)のフォルダ
    • sequence_examples/:訓練データ(training_poly_tracks.tfrecord)および評価用データ(eval_poly_tracks.tfrecord)のフォルダ
    • logdir/run1/train/:訓練の経過ログが格納されているフォルダ
    • primer/:楽曲生成のキューとなるprimerファイルのフォルダ
    • generated/:m3_6_0_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_1/:m3_6_1_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_2/:m3_6_2_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • polyphony_rnn.mag:訓練済モデルのdumpファイル(3000 stepまで)
    • *.jpg:訓練経過の評価のための各種スカラー値をTensorboardでグラフ化したもの(3000 stepまで)。それぞれの意味については上掲書やWebでの説明を参照されたい。
      • accuracy-3000
      • batch-3000
      • event_accuracy-3000
      • global_step-3000
      • input_producer-3000
      • loss-3000
      • loss_per_step-3000
      • no_event_accuracy-3000
      • perplexity-3000
      • perplexity_per_step-3000
    ⑤polyphony-m3_6_extracted-3-32-192-5000
    • program_merged_36_extracted2-192-5000.txt:訓練用ファイル・評価用ファイル生成から訓練済モデルによる楽曲生成実験までの実行ログ(5000 stepまで)
    • test/ :学習用に前処理を行ったMIDIファイルのフォルダ
    • noteseq/:NoteSequenceファイル(notesequences.tfrecord)のフォルダ
    • sequence_examples/:訓練データ(training_poly_tracks.tfrecord)および評価用データ(eval_poly_tracks.tfrecord)のフォルダ
    • logdir/run1/train/:訓練の経過ログが格納されているフォルダ
    • primer/:楽曲生成のキューとなるprimerファイルのフォルダ
    • generated/:m3_6_0_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_1/:m3_6_1_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_2/:m3_6_2_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • polyphony_rnn.mag:訓練済モデルのdumpファイル(5000 stepまで)
    • *.jpg:訓練経過の評価のための各種スカラー値をTensorboardでグラフ化したもの(5000 stepまで)。それぞれの意味については上掲書やWebでの説明を参照されたい。
      • accuracy-5000
      • batch-5000
      • event_accuracy-5000
      • global_step-5000
      • input_producer-5000
      • loss-5000
      • loss_per_step-5000
      • no_event_accuracy-5000
      • perplexity-5000
      • perplexity_per_step-5000
    ⑥polyphony-m3_6_extracted-3-32-192-6000
    • program_merged_36_extracted2-192-6000.txt:訓練用ファイル・評価用ファイル生成から訓練済モデルによる楽曲生成実験までの実行ログ(6000 stepまで)
    • test/ :学習用に前処理を行ったMIDIファイルのフォルダ
    • noteseq/:NoteSequenceファイル(notesequences.tfrecord)のフォルダ
    • sequence_examples/:訓練データ(training_poly_tracks.tfrecord)および評価用データ(eval_poly_tracks.tfrecord)のフォルダ
    • logdir/run1/train/:訓練の経過ログが格納されているフォルダ
    • primer/:楽曲生成のキューとなるprimerファイルのフォルダ
    • generated/:m3_6_0_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_1/:m3_6_1_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • generated_2/:m3_6_2_primer.MIDをprimerとした楽曲の生成結果(10ファイル)が格納されているフォルダ
    • polyphony_rnn.mag:訓練済モデルのdumpファイル(6000 stepまで)
    • *.jpg:訓練経過の評価のための各種スカラー値をTensorboardでグラフ化したもの(6000 stepまで)。それぞれの意味については上掲書やWebでの説明を参照されたい。
      • accuracy-6000
      • batch-6000
      • event_accuracy-6000
      • global_step-6000
      • input_producer-6000
      • loss-6000
      • loss_per_step-6000
      • no_event_accuracy-6000
      • perplexity-6000
      • perplexity_per_step-6000

    *    *    *

    [ご利用にあたっての注意] 公開するデータは自由に利用頂いて構いません。あくまでも実験的な試みを公開するものであり、作成者は結果の正しさは保証しません。このデータを用いることによって発生する如何なるトラブルに対しても、作成者は責任を負いません。作成者自身の無理解や実施時の不注意による間違いの可能性は勿論ですが、それ以外にも入力として利用させて頂いたMIDIファイルに起因する間違い、分析プログラムの不具合に起因する間違いなど、各種の間違いが含まれる可能性があることをご了承の上、ご利用ください。

    (2022.7.7 公開, 2022.10.10 実験対象の一つとして利用させて頂いているMIDIファイルの提供元である加藤隆太郎さんの「マーラー交響曲 MIDI 全集」のURLに関する情報を最新のものに更新。 Google MagentaのColaboratory環境での利用可否についての記載も更新。2023.3.10「はじめに」を序文として独立の別記事に)

    0 件のコメント:

    コメントを投稿