Slide 1

Slide 1 text

歌え!GPT! text LMによる アドリブ生成AI コンテスト参戦! yatszhash 1

Slide 2

Slide 2 text

口下手なので、 まずは1曲演奏をさせてください 2

Slide 3

Slide 3 text

LMが 3

Slide 4

Slide 4 text

実際の予選提出音源1 4 オルガンのメロディー部分が 生成部分。 (MIDIを生成) youtubeにアップロードした音源

Slide 5

Slide 5 text

今回は音楽アドリブ生成AIコンペに textのLMで殴り込んで、 まあなんだかんだMLシステムあるあるな 苦労をした話です。 5

Slide 6

Slide 6 text

話すトピック 6 - GPT-3のfine-tuning - 前処理の工夫 - ローカルのLMへの移行 - 後処理/推論の工夫 - 評価

Slide 7

Slide 7 text

About Me - 機械学習エンジニアの端くれ - LM(言語モデル)との関わり - 業務で医療的内容の会話の要約をやっていました。(ChatGPT以前から) 7

Slide 8

Slide 8 text

今回参加した 音楽アドリブ生成AIコンテスト 『弁財天』とは 8

Slide 9

Slide 9 text

AIミュージックバトル!『弁財天』とは - アドリブ生成AIのコンテスト。 - 第一回が2月末に開催。 - 1対1のトーナメント形式 - 観客の投票で勝敗を決める。 - お題のコード進行と伴奏midiが渡されて、AIによってその場でアドリブメロ ディーを生成する。 9

Slide 10

Slide 10 text

お題のコード進行と伴奏midi例(予選1) 10 伴奏MIDI |Am | Am/Ab | Am/G | Am/F# | | F | C | Dm7 | Edom7 | Am | コード進行 自分のAIが生成して、 伴奏をマージもの 運営から 与えられる。 MIDIのメロディー部分をAIが生成

Slide 11

Slide 11 text

ルール ○ 競技は1対1形式(のトーナメント)で行う ○ その場で渡された伴奏ファイルをプログラムに入力し競技者が実行する(毎回伴奏は 異なる) ○ 得られた出力のファイルを指定の形式で指定の時間内(5分以内)に提出する ○ 提出されたファイルは会場のスピーカー及びオンライン配信を通して再生される ○ その再生を聞いた観客,視聴者及び審査員が投票を行い,得票数の多い競技者が 勝者となる 11 公式サイトより引用 改変

Slide 12

Slide 12 text

2022年末 12

Slide 13

Slide 13 text

“あのバンド”によって 音楽的なところが熱されて、 何も考えずに参加を申し込む。 13

Slide 14

Slide 14 text

何を思ったか 音楽AIのコンテストなのに GPT-3でのアプローチに縛ると宣言。 14

Slide 15

Slide 15 text

text(自然言語)の事前学習済みLMって 音楽の生成にも使えるんだっけ? 15

Slide 16

Slide 16 text

相性は悪い 16

Slide 17

Slide 17 text

音楽の生成とtextのLMの相性は悪い 17 例えば 1. 複数のパートの時間軸と音程を同時に表現するのが難しい。 - 同時に鳴っている音が表現しにくい。 2. 四則演算など数値の扱いが苦手。[Dyer et.al., 2022], [Schick et.al., 2023] 3. 決まったルールがある出力をすることを生成系のLMだと保証されない。 a. 2と3のせいで、4/4の1小節には4分音符4個分の長さの音符を入れるといった保証ができない。 4. 事前学習のコーパスに歌詞以外の音楽データがあまり入ってなさそう。

Slide 18

Slide 18 text

そもそもコンペでも実務でも 結果を求めるなら アプローチを縛るのはよろしくない 18

Slide 19

Slide 19 text

それでも縛る モチベーションは? 19

Slide 20

Slide 20 text

遊びです 話題性のあるGPTで、 やってどやりたい。 20

Slide 21

Slide 21 text

どうやってtextのLMで アドリブ生成AIを実現したのか? 21

Slide 22

Slide 22 text

そもそも音楽ってテキストで 表現できるんだっけ? 22

Slide 23

Slide 23 text

プログラムで音楽を扱う時の形 23 例 ● 波形 ● ピアノロール ● midi ● 楽譜(今回利用)

Slide 24

Slide 24 text

楽譜なら確立された構造化テキストの形式がある。 ● abc記譜法 ● musicXML(電子楽譜のデファクト) LMは入出力長の制約が大きいため、先行研究に習いabc記譜法を採用。 24

Slide 25

Slide 25 text

abc記譜法(参考) ソーラン節なら 25 日本語 wikiより引用 この後の解説では イメージしやすさの ため 五線譜を利用。

Slide 26

Slide 26 text

今回作成したtext生成LMによるアドリブ生成AI GPT-3などの LMモデル 26 text(abc)に 変換 abcから MIDIに 変換 コード進行のみを利用 後処理 前処理

Slide 27

Slide 27 text

GPTをどう使うか? 27

Slide 28

Slide 28 text

まずはChatGPTでやってみる。 28

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

30 X:1 T:Music21 Fragment with Melody C:Music21 L:1/4 M:4/4 I:linebreak $ K:C V:1 treble V:1 [F,,A,,C,E,]2 [F,,A,,C,E,]2 | [F,,A,,C,E,]2 [F,,A,,C,E,]2 | [E,G,B,D]2 [E,G,B,D]2 | %3 [E,G,B,D]2 [E,G,B,D]2 | [D,F,A,C]2 [D,F,A,C]2 | [E,G,B,D]2 [E,G,B,D]2 | %6 [F,,A,,C,E,]2 [F,,A,,C,E,]2 | [G,,F,A,C]2 [G,,F,A,C]2 | %8 [F,G,A,G,] [A,A,A,A,] | [F,G,A,G,] [C,C,C,C,] | [D,E,F,G,] [A,G,F,E,] | [D,E,F,G,] [C,C,C,C,] | [F,G,A,G,] [A,A,A,A,] | [F,G,A,G,] [C,C,C,C,] | [D,E,F,G,] [A,G,F,E,] | [D,E,F,G,] [C,C,C,C,] ||

Slide 31

Slide 31 text

メロディをつけて欲しいのに、 コピーした上で よくわからないものが ついている。 31

Slide 32

Slide 32 text

prompt engineeringだけでは 厳しそうなので、 GPT-3をfine-tuingする 32

Slide 33

Slide 33 text

GPT-3をアドリブ生成用に fine-tuningするための学習データ 33 ※実際は8小節だが分かりやすさのため 4小節分のみ表示 メロディー (ラベル(completion)として 利用) コード進行 (インプット(prompt)として利 用) 研究用の 電子楽譜のデータ セットから作成 分割

Slide 34

Slide 34 text

実際のAPIへの入力JSONL {"prompt": "[C,E,G,]4 | z2 [F,_A,CD]2 | [C,E,G,]4 | [G,,B,,D,F,]4 | [C,E,G,]2 [A,,,D,,E,,^G,]2 [E,A,C] | $ [D=GB]3 [D,^F,A,C] | [G,,B,,D,=F,]2 [C,E,G,A,]2 [C,E,G,A,] | [G,B,D]3 [C,E,G,] | $ z2 [G,,B,,D,F,A,]2 | [C,E,G,]4 | $ ", "completion": " e3 d/>c/ | B d f a | g e d c | B d B A | G (3A/A/A/ B (3A/A/A/ | B g g e/>f/ | g e a f | $ g e2 c/d/ | $ "} {"prompt": "[C,E,G,_B,]4 | [G,,=B,,D,F,]4 | [G,,B,,D,F,]4 | [C,E,G,_B,]4 | [C,E,G,_B,]4 | [G,,=B,,D,F,]4 | $ [G,,B,,D,F,]2 [E,^G,B,D]2 | [A,,C,E,]4 | [D,^F,A,C]4 | [G,,B,,D,=F,]4 | $ ", "completion": " z4 | z z/ d/ g/d/4c/4 _B/G/- | G g/d/4c/4 _B/E/- E | z z/ ^F/ (3G/B/d/ ^f/e/- | $ e (3d/4e/4d/4c/ B/A/^G/B/ | A/e/ (3c/4d/4c/4A/ ^G/E/C/A,/ | =G/=F/^F/d/ z z/ c/ | $ B/d/d/d/ c/B/G/D/ | $ "} (以下省略) 34

Slide 35

Slide 35 text

fine-tuningをするとしても、 タスク的にGPT-3にとって難しそう 35

Slide 36

Slide 36 text

前処理でタスクの難易度を下げる 36

Slide 37

Slide 37 text

前処理でタスクの難易度を下げる 37 例えば 1. 学習データの曲のキーをC(ハ長調)またはAm(イ短調)にすべて移調する。 a. ルール上CかAmしかでないため。 2. データを4/4のみの曲のみフィルター a. ルール上4/4の曲しかでない。 3. 学習データのタイトル、歌手、コメントや歌詞といった余計な条件付けにつながりそ うな情報はinput/target双方から削除 4. promptでコードネームではなく、コードの構成音を明示的に与える

Slide 38

Slide 38 text

promptでコードネームではなく、 コードの構成音を明示的に与える 38 GPT-3が コードネームと構成音を 暗黙的に紐づけられるか 怪しいため 前もって 音楽処理ツールで 変換 コードネーム コードの構成音

Slide 39

Slide 39 text

学習データができたので、 いざチューニング 39

Slide 40

Slide 40 text

GPT-3のfine-tuningの設定 40 - モデルはCurie - 5 epoch - 一旦学習データの一部(3000件ぐらい)だけで試験的に

Slide 41

Slide 41 text

fine-tuningされたGPT-3が生成したメロディー例 41 ベースラインとしては良さげ (音源は省略)

Slide 42

Slide 42 text

よしいけそうだし、 データ増やして、 イテレーション回していくぞ! 42

Slide 43

Slide 43 text

学習1回あたりの試算 $100以上 (14,000円以上) 43 ※全ての学習データ(約 4万例)を使った場合

Slide 44

Slide 44 text

これ個人がイテレーション回すの 無理やん。 44

Slide 45

Slide 45 text

1回の学習にお金がかかりすぎる。 45 fine-tuningの料金 全ての学習データ(約4万例)を使って学習させると、 1回あたり$100以上 (14,000円以上) かかってしまう。 表はopenaiドキュメント より引用

Slide 46

Slide 46 text

GPT-3以外のLMで どうにかならないか? 46

Slide 47

Slide 47 text

ローカルのGPUサーバーで チューニングできるLMを代わりに利用し、 コストを下げる。 47 BART (Lewis et.al., 2019) - GPTと同様テキスト生成が可能なLM - baseなら小さいGPU(メモリ11GB以下)でもfine-tuningできる。 - 英語で事前学習されたモデルを利用

Slide 48

Slide 48 text

半日以上学習に時間がかかるが BARTでも生成できるようになった。 48 (GPT-3とはかなり傾向が変わった感じはある・・・)

Slide 49

Slide 49 text

でも、モデルの出力そのままだと まだ厳しい。 49

Slide 50

Slide 50 text

モデルの出力そのままだと 50 1. たまに不正なabcが出力される 2. 長音や長い休符が多くてつまらない 3. 音をところどころ外す 4. 音が目立たない 5. 重音が出力される(ルール上NG)

Slide 51

Slide 51 text

後処理や推論も工夫する 51

Slide 52

Slide 52 text

モデルの出力そのままだと 52 1. たまに不正なabcが出力される 2. 長音や長い休符が多くてつまらない 3. 音をところどころ外す 4. 音が目立たない 音楽以外の場面でも役に立ちそうな 1, 2の対策のみ解説

Slide 53

Slide 53 text

問題1 不正なフォーマットのabcが出力される 53 コンテストではルール上5分以内にその場でAIを使って生成する必要がある。 有効なabcがその場で生成されないと詰む。 例 - 1小節に音符が多すぎる - ヘッダー部分の形式が崩れる

Slide 54

Slide 54 text

対策1 バリデーションと補正 - abc => midiへの変換時のライブラリを差し替え(ABC2MIDI) - バリデーションと多少のエラーの握り潰しをしてくれる - 間違えが多いところはルールベースでエラーを修正 54

Slide 55

Slide 55 text

対策2 候補をたくさん出す。 候補をたくさん出して、そのどれかに有効なabcが含まれていることを祈る。 1. 複数のバージョンのモデルを用意してパラレルに推論 2. inputにデータセットのサブセット名のprefixを添えて、出力のバリエーションを出す。 55

Slide 56

Slide 56 text

inputにデータセットのサブセット名のprefixを添えて、 出力のバリエーションを出す。 56 サブセット wikifonia ?wiki?L:1\/4\nM:4\/4\nK:none\n [K:A] z4 | [G,,B,,E,]3\/2 [F,A,D]3\/2 [E,A,C]・・・ ?char?L:1\/4\nM:4\/4\nK:none\n [K:A] z4 | [G,,B,,E,]3\/2 [F,A,D]3\/2 [E,A,C]・・・ サブセット charlie parker 推論 推論 ※学習時にも同様の prefixをつけて いる。

Slide 57

Slide 57 text

問題2 長音や長い休符が多くてつまらない 音が動かないとアドリブとして面白みにかける。 57 ※abcの補正前のため 拍子がおかしいことに注意

Slide 58

Slide 58 text

対策 推論時にコードを1拍ごとに細かくして与える。 コードが変わっていなくても、コードが変わっているようにモデルに錯覚させる 58 |Am | Am/Ab | Am/G | Am/F# | 元の入力 |Am Am Am Am | Am/Ab Am/Ab Am/Ab Am/Ab | Am/G Am/G Am/G Am/G | Am/F# Am/F# Am/F# Am/F# | 細かくした入力

Slide 59

Slide 59 text

before 59 before after

Slide 60

Slide 60 text

後処理/推論の工夫で そこそこのメロディーが 生成できるようになってきた 60

Slide 61

Slide 61 text

まだ致命的な問題が 61

Slide 62

Slide 62 text

“俺の好み”だけで評価している。 62

Slide 63

Slide 63 text

評価システムを用意する。 63

Slide 64

Slide 64 text

評価システムを用意する。 64 アドリブの評価は難しいものの、 使える(勝てる)ものを作るためには評価方法をきちんと設計する。 1. バリデーションセットを自分で用意する。 a. 今回運営から評価用(バリデーション)に使えるサンプルは 3つしか与えられていない。 b. 代表的なコード進行パターンを調べて、網羅するパターンを作って追加する 2. “俺の好み”以外の評価指標を用意する。 a. 例えば音がどれぐらい調性に合っているかどうかはある程度ルールで自動評価できる b. 音楽をやっている複数人に評価をお願いする。 i. (”AIが作った割にすごい ”のようなバイアスが入らないように注意する) 本来は初期の段階にやること

Slide 65

Slide 65 text

いざ本番! 65

Slide 66

Slide 66 text

予選も無事通過 66

Slide 67

Slide 67 text

本選 67

Slide 68

Slide 68 text

実際の様子 68 https://av.watch.impr ess.co.jp/docs/series/ dal/1485204.html

Slide 69

Slide 69 text

ところで最後の評価設計をさぼって、 一回戦で負けたやつがいるらしい。 69

Slide 70

Slide 70 text

あ、それ私です 70

Slide 71

Slide 71 text

実際の本選提出音源1 71 対戦者 自分が提出した方 後半のハーモニーが崩れてし まっている・・・ 第一回弁財天 提出音源 (本選第一 回戦battle1)(メロディはAI(LM)によ り生成)

Slide 72

Slide 72 text

(実務では気にしているのに、 コンテンツ生成だからといってサボった。) 72

Slide 73

Slide 73 text

コンテンツ生成といえども、 評価設計はさぼってはいけない 73

Slide 74

Slide 74 text

まとめ 74 - text LMでもそこそこのアドリブ生成aiができた - 前処理も後処理、推論もなんだかんだ工夫する羽目に - “ぼくが感じる最強のAI”では勝てない使えない!評価設計をしっかりする。

Slide 75

Slide 75 text

その他の生成メロディー集 https://zenn.dev/articles/35045e02b748b9 75

Slide 76

Slide 76 text

余談 76

Slide 77

Slide 77 text

近々弁財天第2回があるらしい・・・ 77 LMで頑張りたい方いたら 是非参考にされてください・・・

Slide 78

Slide 78 text

実際の予選提出音源2(自分のもの) 78 他の予選参加者の音源 第一回弁財天 提出音源 (予選用2) (メロディはAI(LM)により生成) (youtube)