元記事(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の検証を実施した。
- Mahler - 3rd Symphony, 6th mvt (piano solo)
- Mahler/Symphony No.3 d-moll (arranged for piano 4 hands):2021年7月11日 空音舎/空音舎×やまねこ交響楽団 マーラー交響曲第3番(2021年7月11日)
- マーラー/交響曲第3番(連弾編曲版):2021年9月5日 音楽サロン パパゲーノ
結果として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つのフリー・ソフトである。
- Domino (TAKABOSOFT) Ver.1.43 (2013/11/19)
- Cherry (fummy) Ver.1.4.3 (1998/11/11)
- min_steps=80(5小節相当
- max_steps=512 (32小節相当)
- min_steps = 16(=16*1) 1 measures:より短いフレーズの抽出を行う。
- max_steps = 768(=16*48) 48 measures :1.5倍の長さのフレーズまで抽出。
- min = 48(=16*3) 3 measures:より短いフレーズの抽出を行う。
- max = 512(=16*32) 32 measures :デフォルト値のまま。
- ①最初から練習番号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.から最後まで
- ①,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,
- 小節数毎の頻度(計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
- データ抽出のパラメータ
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
- 小節数毎の頻度(計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
ここまで学習の入力とするデータの調整や訓練用データ生成のパラメータの調整について述べてきたが、ここでは訓練時のハイパーパラメータの設定について、検討したり予備実験を実施した内容を述べる。今回の実験にあたって設定値の検討を行ったハイパーパラメータは以下の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から取得可能である。
- 予備実験:第3交響曲第6楽章全体(10ファイルからフレーズ長1~48小節で抽出、
- 訓練データ数198、評価データ数18
- ネットワークノード数=[256,256,256]、バッチサイズ=18
- 4500stepまで:polyphony-m3_6_1-48-4500.zip…①
- 7000stepまで:polyphony-m3_6_1-48-7000.zip…②
- 実験本番:主要主題部の提示と主要主題の変容部分のみ抽出(5ファイルからフレーズ長3~32小節で抽出)
- 訓練データ数63、評価データ数18
- 1回目:ネットワークノード数=[256,256,256]、バッチサイズ=18
- 5000stepまで:polyphony-m3_6_extracted-3-32-256.zip…③
- 2回目:ネットワークノード数=[192,192,192]、バッチサイズ=18
- 3000stepまで:polyphony-m3_6_extracted-3-32-192-3000.zip…④
- 5000stepまで:polyphony-m3_6_extracted-3-32-192-5000.zip…⑤
- 6000stepまで:polyphony-m3_6_extracted-3-32-192-6000.zip…⑥
内容は以下の通りである。
①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
- 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
- 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
- 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
- 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
- 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「はじめに」を序文として独立の別記事に)