理乃美

ソフトとハードと論理の覚え書き

GPTでジオン公国のワインを講釈してみる

2024-07-25 01:02:49 | AI
引き続いて、Generative Deep Learning [1] の 9章 Transformers のサンプル (gpt.ipynb)[2]を実行。
これは、種々のワインのレビュー文をGPTモデルで学習して、ワインのレビュー文章を生成してみるというもの。
fitにかかった時間は、GPU (RTX A2000)を使って7分ほどだった。
生成される文章は例えば、「wine review : germany」と与えて、その先を生成させると「wine review : germany : mosel : riesling : smoke and mineral tones lend a savory tone to this intensely fruity riesling . it ' s intensely concentrated with flavors of sweet tangerine and orange , but it ' s a lip - smackingly juicy , full - bodied riesling .」といった文章が生成される。
生成の経緯を見るとwine review : germany : の続きはワインの銘柄が来る場所で単語選びにも germany が重視された結果 mosel が選ばれている。
その先に進んで、smoke and の続きを選ぶ場合は smokeを重視しているが、smoke and mineral の次を選ぶ場合は wine review であることや germany も考慮しての選択となっている。

以前に実行したLong Short Term Modelでは、これまで全体として何を語ってきたのかを示すlong term の情報と今を語りかけているのかを示すshort term の情報を常に同じ重さで扱って単語を綴っている。そのためだろう、生成している文章が長くなってくると次第に文章がおかしくなってゆく。
Transformerでは、位置の情報を組み合わせることで、直前の言葉から流れのままに綴るところとそもそも何を語っているのかに立ち戻って言葉を選ぶところが組み合わせれ、生成する文章が長くなっても破綻しにくいと理解した。

さてサンプルでは、ドイツ産のほかに US産やイタリア産ワインのレビュー文を生成させているが、架空のジオン公国産 についてレビュー文を生成させたらどうなるだろうか。試した結果はこのとおり。産地としては歴史が浅いのだなあ(w)

wine review : zeon : [UNK] : cabernet sauvignon : this is a bold , ripe and full - bodied expression of the variety ' s characteristically cabernet sauvignon . aromas of blackberry , plum and cassis , with a touch of wood smoke and spice , while the wine is still young and needs time to open up . drink from 2018 .

なお、[UNK] は学習データ中にあった未知語. ここはワインの名称が来るとところだが、どの単語も尤度が低すぎた結果として 未知語が選ばれてしまったのだろう。だが、その後に cabernet sauvignonが改めて選ばれて、カベルネ・ソーヴィニヨン を軸にレビュー文が組み立てられたようだ。

[1] Generative Deep Learning, 2nd Edition by David Foster, Released May 2023, Publisher: O'Reilly Media, Inc. ISBN: 9781098134181
[2] https://github.com/davidADSP/Generative_Deep_Learning_2nd_Edition

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Denoising Diffusion Modelsはスケジュールの良し悪しが胆!?

2024-07-02 00:19:41 | AI
引き続いて、Generative Deep Learning [1] の 8章 Diffusion Models のサンプル (ddm.ipynb)[2]を実行。

このような画像を学習するのに、fitにかかった時間は、RTX A2000 (6GB) をGPUに使って1時間38分ほどかかった。
最初はこんなところだが、
Epoch 8になるとこの様になんとなくそれっぽい画像を生成し、
Epoch 19では、ここまでの画像を生成するようになった。
Epoch 50の学習終了で、最終的にはこのようなリアルな画像が生成できるようになった。

Denoisingで画像が改善されてゆく過程の例がこちら。
また、内挿で連続的に変化する画像を生成した例がこちら。

と、ここまではサンプルをそのまま実行しただけ。
この章では、ノイズを載せるプロセスで、linear, cosine, offset cosine の三つのスケジュールが紹介されていて、前記はoffset cosine での結果。
サンプルコードには、linearやcosineのコードもあるようなので、試してみた。
まずは、linear を試してみた。最初 (Epoch 2)がこんななのは当然として、

それが、最後のEpoch 50でもこんな感じのまま。
TensorBoardでみたepoch_n_loss がこのようなので、まったく学習が働いていないわけではないはずなのだが。
次に、cosine を試してみる。
cosineの場合、Epoch 8になるとこのように何らかの画像らしきもを生成するようになるが、
そこから先は、Epoch 50になっても大して向上していない。
最終的に生成できるようになった画像がこちら


linear や cosineのスケジュールでも結果を出すにはどうすればよいだろうか。このサンプルでは64ステップだが、ステップ数を増やして細かく学習させたらどうだろうか。ということで、BATCH_SIZEを 128にして cosineで試してみたのがこちら。学習に6時間14分を費やして、最終的に生成するようになった画像だが、あまり改善した印象はない。
さてここで、n_lossの視点で比較整理してみるとこうなる。生成する画像では実感できないものの、ステップ数を増やすことでn_lossは確実に改善される。128からもっと増やせばlinearやcosineでもよい結果を出せるのだろうが.. 6GBしかメモリを積んでいないRTX A2000 ではここが限界。CPUのみの方で実行すればもっと増やせるだろうが、実行時間がねぇ...
なお、この図でX軸 (epoch数)は対数表示であることに注意。この感じからすると、10 epochもやれば結果は見えたようなもの、かな。


実際にやってみて思ったのだが、筋のよいアイディアを思いついたとしても、そこから先、実際に良い結果を出せるところまでがまた長いなと。一つすごい成果が出た後にわらわらと後追いが出てくるが、これは、実際にできたのが居るのだから私だってできるはずと頑張った、という事なのかもしれない。

[1] Generative Deep Learning, 2nd Edition by David Foster, Released May 2023, Publisher: O'Reilly Media, Inc. ISBN: 9781098134181
[2] https://github.com/davidADSP/Generative_Deep_Learning_2nd_Edition

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

RealNVP を試す

2024-05-05 01:34:48 | AI
引き続いて、Generative Deep Learning [1] の 6章 Normalizing Flow Models のサンプル (realnvp.ipynb)[2]を実行。

6GBしか載っていないRTX A2000でも実行できて、fitに掛かった時間は1分55秒。
得られた変換と逆変換がこちら。


RealNVPは、データ空間のうち興味のある部分は拡大し興味の無い部分は縮小する可逆な変換を学習することで、latent空間の任意の点を選ぶことが興味のある部分の中の任意の点を選ぶことになるような手段を得ることだと理解した。
Variational autocodersのところでKL divergenceを使ってlatent空間がスカスカにならないよう工夫したが、それに近いところがあるのだろうか。だが私には今のところ使い所がピンと来ない。

[1] Generative Deep Learning, 2nd Edition by David Foster, Released May 2023, Publisher: O'Reilly Media, Inc. ISBN: 9781098134181
[2] https://github.com/davidADSP/Generative_Deep_Learning_2nd_Edition

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

LSTMを使った文書生成や画像生成を試す

2024-05-01 23:38:41 | AI
引き続いて、Generative Deep Learning [1] の 5章 Autoregressive Modelsのサンプル (lstm.ipynb,pixelcnn.ipynb, pixelcnn_md.ipynb)[2]を実行。

まずは、long short-term memoryを使った文章生成(lstm.ipynb)。
実行自体は簡単。6GBしか載っていないRTX A2000でも実行できた。
fitに掛かった時間は10分。
もともとのサンプルでは"recipe for roasted vegetables | chop 1 /" の次の1単語を生成させていたが、それもつまらないので4単語先まで生成させてみた。
temperature = 0.2での生成例
recipe for roasted vegetables | chop 1 / 4 cup of the
recipe for roasted vegetables | chop 1 / 2 cup of the
temperature = 1.0での生成例
recipe for roasted vegetables | chop 1 / 4 cup of chard
recipe for roasted vegetables | chop 1 / 2 cup tometoes and


tempertureが 0.2でも1.0でも、chop 1 / の次は 2 か 4 が来るのが同じくらいにもっともらしく、その次には cup が来るのが最もありそうというところまでは変わらない。
で、temperature が低いと cup の先が高い確度のもと of the と続く一方で、temperatureが高いと cup の先に続く単語がばらけてくる。

なお、上記の例では4単語先まで生成させているが、さらに長く生成させることもできる。だが、長い文章を生成させるとだんだんと可笑しくなってしまう。
また、temperatureは低ければ元のレシピ文章のなぞりに近くなるはずだが、temperatureが高いほうが同じパターンを繰り返すような場合もあった。このサンプルでは学習に使ったレシピの数が25と少ないので、その影響かなと推測する。つまり、temperatureが高いことで出現頻度の低い単語が一度選ばれてしまうとその単語に続く文言がワンパターンしか学習していないので他のパターンを選びようがない、という事が起きたのではなかろうか。


次にPixelCNNによる画像生成
このようなトレーニング画像をPixelCNNで学習するサンプル。


これも、6GBしか載っていないRTX A2000でも実行できたが、fitに 48分31秒も掛かった。
temperature=1.0で生成した画像がこちら。まあ、なんとなく微妙だなぁ。


じゃあ、temperatureを下げたらどうなるかと試したのがこちら。0.5にするとまともな画像にならないのはなぜだろう。

PixelCNNは左上から順に画像を作る。学習するどの画像も中央に画像があって周囲は白。という事は「上や右が白ならこのpixelも白」と強く学習されていると思われる。temperatureが低いとその学習にひっぱられていつまでも白以外のpixelが現れず仕舞いとなったのだろう。


最後に、Tensorflow distributionsを使ったPixelCNNのサンプル. (pixelcnn_md.ipynb)
6GBしか載っていないRTX A2000で実行し、fitに20分11秒掛かった。
で生成した画像の例がこちら。生成に1分49秒も掛かっているところからワッパが悪いなと感じる。


[1] Generative Deep Learning, 2nd Edition by David Foster, Released May 2023, Publisher: O'Reilly Media, Inc. ISBN: 9781098134181
[2] https://github.com/davidADSP/Generative_Deep_Learning_2nd_Edition

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

CGANは学習が重い

2024-03-11 01:27:49 | AI
引き続いて、Generative Deep Learning [1] の 4章 Conditional GAN (CGAN)のサンプル (cgan.ipynb)[2]を何とか実行。多少パラメータをいじることで、やっとそれらしい結果を得られた。
cgan.ipynbは、セレブ顔画像セットを Blond_Hairであるかどうかでラベル付きで学習し、生成する画像をブロンドにするかどうかをラベルで制御できるようにするというもの。

前回のサンプルまではそのままで動いたが、cgan.jpynbは2か所ほど手を加える必要があった。
変更点1: トレーニングデータ不足を補うため、下記のようにrepeatメソッドを追加。これをしないと学習の途中でデータが尽きたといって止まってしまう。

変更点2: ブラウザとjupyter labの負荷軽減のため途中経過の画像出力の頻度を制限。これをしないと、ブラウザあるいはjpyterのサーバがクラッシュすることがある。


実行環境は、メモリが16GBでCPUが Core i5 10600 (3.3GHz) 6 コア 12 Thread.
前回のWGANがRTX A2000だと無理だったので、最初からあきらめてCPUでの実行とした。

最初は、動かすための前記変更だけを行ったサンプルコードの場合。
全部で2000epoch のうち、500epochごとの進捗がこちら. おなじlatent空間の点からlabelだけ変えて生成した画像を並べている。
501/2000

1001/2000

1501/2000

1991/2000

そして、学習完了後に生成画像がこちら。なお、latent空間の点はお互いにばらばら。

金髪か否かで生成し分けているのだが、どうだろう。 言われればそうかもしれないが、よくわからない。そもそも、顔イメージそのものが学習しきれていないように思うがどうだろう。
ちなみに、学習にかかった時間は120分30秒

まず試したのがcriticの回数をepockあたり3回から5回に増やすこと。
501/2000

1001/2000

1501/2000

1981/2000

Generate imagesの結果

所要時間 3時間6分 (186分)

次に、criticをepockあたり5回で、さらにepochの回数を倍の4000にした。
1001/4000

2001/4000

3001/4000

3951/4000

Generate imagesの結果

所要時間 6時間12分(372分)

ばらばらのlaten vectorから作った画像を並べた Generate images の結果だと分かりにくいが、同じlatent vectorからlabelだけ変えて作った画像を並べた3951epochでの画像をみると、Blond Hair という属性を学習して画像を作り分けられるようになったと言えるだろう。

CGANサンプルの実行にはかなり時間がかかりしんどかった。学習に費やされる時間が長かったのはもちろんだが、エラー終了してしまって無駄になった時間がさらに長かった。延々とCPUを走らせて、そろそろ終わりかなというところブラウザがクラッシュとかなると、ちょっと辛い。
いろいろと試すには大容量VRAMを搭載したGPUが必須かな...
24GBを積んだP40ならヤフオクでも3万円で出品されているけれど、パッシブ冷却だからパワフルな送風ファンが必須。AI実験用のサブPCは、古いタワーなので 送風ファンのスペースが足りなくてP40は使えない。メインPCは、そのつもりで買った大型ケースなので送風ファンごと収まるけれど、AIの実験でメインPCが長い時間使えなくなるのが不便。それが理由でAI実験環境にサブPCに移したのだからなぁ。

[1] Generative Deep Learning, 2nd Edition by David Foster, Released May 2023, Publisher: O'Reilly Media, Inc. ISBN: 9781098134181
[2] https://github.com/davidADSP/Generative_Deep_Learning_2nd_Edition
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする