トンプソンサンプリング採用の流れ
Q: いいねと思ったものに紐づいてるプロンプトをより多く試すってこと?
A: そうです
少し説明が雑なので後で補足する
素朴な解決策: N個の過去に使われたプロンプトの中から良い絵が出そうなものを再利用する
これは素朴にアリ
この時に「過去の成績が一番良かったものを選ぶ」では全然ダメ、悲観的な勘違いをしたスロットが選ばれなくなって、勘違いが修正されないから。 なぜかというと今回のユースケースで、生成された画像の良い悪いをフィードバックするのはリアルタイムではないから。
UCB1のような決定論的なアルゴリズムだと、フィードバックが得られるまでの間、同じことをためし続けてしまう。なので今回のユースケースに向かない。
トンプソンサンプリングはもともと確率的アルゴリズムだから問題ない
というわけでプロンプト全体をスロットとみなしてトンプソンサンプリングをするのが説明する上では素直な次のステップなのだけど実際の僕はそのステップを飛ばして先に進んだ。
プロンプトを全体で単一のスロットだと考えるのではなく、部分部分の決定をした後で組み合わされたものだとみなす。
具体的にはimg2promptではBLIP部分とCLIPの探索で得られた「画家」「画風」「フレーバー」などの部品を作ってから組み合わせでプロンプトを作っている
なので、コードを書き換えて結合前の部品を出力するようにする。
BLIP部分と作家と作風とフレーバーとをそれぞれトンプソンサンプリングで選んで組み合わせる
素性の独立性を仮定している。この仮定はもちろん正しくないが近似として有益。
img2promptが生成したキーワードもプロンプト生成に使われるので、僕の知らない単語がプロンプトに使われてたりする。
例えば「この画像のプロンプトに書いてあるwhimsicalってどういう意味だ?」みたいになったりする(昨日わからなかったので辞書で調べた単語w)
歴史的には、まず先に「良さそうな部品をランダムに選んで、組み合わせてプロンプトを作るコード」を作って運用していた。
この時は、この「良さそうなキーワード」は「過去にいいねしたプロンプト」から統計的に分析して、出現頻度の高いキーワード一覧を作って、人間がそれを見て上位のものをチョイスした。
その後で、この「分析して上位からn個を選び、それを確率1/nで使う」の部分がトンプソンサンプリングに置き換えられた。
9/9に画家の発見の件で「img2promptを生成画像に使うのも予期せぬ発見があって面白いぞ」ってなった 9/10にgood判定した生成画像をまとめて変換するようにした
9/12にコンピュータがランダム組み合わせでプロンプトを生成するようにした
9/18にトンプソンサンプリングの形になった