StableDiffusionのTextEncoderの後継


CLIPは2021年の2月に出ていろいろなモデルに使われた。
特に最近はStableDiffusionなどのtext-to-imageなどにも使われている。

このCLIPのTextEncoderの後継者について調べ、今後のtext-to-imageの未来が明るいのかどうかを調べたい。

# 0. [ViT](https://arxiv.org/pdf/2010.11929.pdf) & Transformer
CLIPの構成はViTとTransformerだが、ViTは**ImageEncoderであり**、今回調べたい**TextEncoderではない**。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/0eabef3f-f750-cea9-174e-052ee8d9db4d.png)


# 1. [CLIPモデル](https://arxiv.org/pdf/2103.00020.pdf)
本家のCLIPモデル。
TextEncoderのパラメータは123Mで割と軽量である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/fc606945-c153-8147-7c6f-102aa631c15e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/2d2c1631-1526-09a7-6fee-e0cf0f75485e.png)



## 1.1 [ALIGN](https://arxiv.org/pdf/2102.05918v2.pdf)、[Florence](https://arxiv.org/pdf/2111.11432v1.pdf)
対照学習をするという意味でCLIPと類似にALIGN、Florenceなどがある。
それぞれCLIPより性能は上だが今回この事を書きたいわけではない。
**ALIGN：**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/1772862d-6b30-8fc3-7578-4df24a6a962d.png)
ALIGNはViT+TransformerではなくEfficientNet+BERTである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/05e79ac6-b764-8343-ab9f-07cea38911bc.png)

**Florence：**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/c67c4073-0da3-b825-2f9e-09760912a393.png)
FlorenceはCoSwin Transformer+Transformerである。
言語モデルの詳細はないが```language transformer with 256M parameters```とある。
 

# 2. [T5モデル](https://arxiv.org/pdf/1910.10683.pdf)
さて、以下はT5のモデルの情報に関して整理する。
ここでT5モデルは基本的にencoderとdecoderのセットだからencoderのみならそのサイズは半分だと思われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/c8df8b6c-13ee-fbf7-6c12-da0166b8a21f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/7ece16ef-d6e6-058a-3a55-388ae6dec9b6.png)


モデルの幅(Width)はそれほど大きくなく(1024)、T5-largeでレイヤー数を24まで増やした後、MLP層の倍率を増やしている。ただし、CLIPと違って単なる自然言語モデルなので画像との対応付けはない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/cf5dc479-0dd7-d47c-af24-75463ae5c936.png)
この[記事](https://note.com/npaka/n/n62c38906c3e4)によればT5-XXLは16GBでは動かなく、A100(40GB)で動かせる。
モデルサイズは46GBである。これはパラメータ11B*fp32と合う。
TextDecoderは不要でTextEncoderのみで良ければおそらく20GBでも動かせるのではないかと思われる。

# 3. Imagen
ImagenではCLIPの代わりにText encoderとして**T5-XXL**モデルが使われている。
ここでCLIPは画像テキストペアで学習されるのに対して、T5モデルはテキストのみで学習される。
画像の入力が存在しないためT5は一般にこの問題に対し弱い筈だが、T5モデルはCLIPよりも非常に大きなサイズである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/439611d0-c632-45a4-a048-d82c1b9b55ad.png)

以下の図からBERT-Base,BERT-Large,T5-Base,T5-Large間ではあまり差はない。
T5-XLとT5-XXLでT5-Baseよりも大きな性能向上が見られる。
**しかしながら、実はCLIPとT5-XXLでCLIP ScoreやFID Score上はほとんど差は見られない。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/b7b00358-3706-df35-de81-56d79eb1f16d.png)

もしかしたらCLIPモデルでCLIP Scoreを計るのはCLIPに有利すぎるのかもしれない。
しかし、CLIP Score上は大差がないが、実際に人間が評価した場合は差が見られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/9d0bb680-5184-da59-6326-cc4837ed84c6.png)
特に大きな差があるのはDescriptions(複雑で長いpromptの理解)とText(テキストの生成能力)、Misspelings(スペルミスの理解)である。それ以外はそれほど変わらない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/5e882671-bfdb-b507-daf2-1e52671165e8.png)
Textの出力精度は以下の通りである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/f9b542f7-1207-a0f7-f47b-4a8250153ebc.png)

# 4. [Parti](https://arxiv.org/pdf/2206.10789.pdf)
Partiは自己回帰モデルだが、Encoder LayersがText Encoderで、Decoder Layerが自己回帰モデルだと思われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/7e3dcadd-9a53-f75f-68cc-aabab6a6c492.png)
従ってText encorder部分の大きさを整理すると以下の様に思われる。
正確にはViTのパッチ分割部分は別途パラメータが必要なので半分と見積もるのは厳密ではない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/60c713d3-5d7f-650a-26da-a3b599a9248e.png)
Parti-350MからParti-750MはDecoder(自己回帰モデル)のレイヤー数が増加しただけでText Encoder自体は変化していない。CLIPのデフォルトWidthである756より大きい1024だが、テキスト描画性能はあまり高くない。
Parti-750MからParti-3Bはレイヤー数同じでViT&Transformerの両モデルの幅を単純に2倍にするという雑な拡大しているが、精度の向上幅は大きく見える。また、レイヤー数は12で重要でないように見える。
Parti-20BはParti-3Bからレイヤー数増加、幅を2倍にしている。欠点としてはパラメータ数は4BでありT5-XXLのサイズに匹敵する。これはA100のような高性能GPUでないと動かせないであろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/53d4cd95-bf8c-fcf0-2769-575378cb7bf5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/18866073-3e52-9f85-28c9-d60f866d5d77.png)

# 5. [DALL-E2](https://arxiv.org/pdf/2204.06125.pdf)
DALL-E2のTextEncoderは以下からT5-XLと同程度のモデルサイズと考えられる。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/32385b88-45e0-85be-b993-e453bf3e1564.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/95868fcc-f8ad-8f61-4c42-35ec0583a304.png)

こう見えてDALL-E2はStableDiffusionよりもテキスト生成能力がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/0436b65f-41e6-0201-845b-2092b06b19c1.png)



# 6. [CoCa](https://arxiv.org/pdf/2205.01917v2.pdf)
構成は以下の様な構成なのでCLIPにおけるTextEncoderはUnimodal Text Decoderが相当すると思われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/cc3be746-b17b-b8fd-5179-4f57a360959a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/d80e7b6f-5337-c3fc-d733-e645865eca3b.png)
UnimodalとMultimodalのモデルサイズは基本的に等価なのでTextEncoderの大きさを整理すると以下になる。CoCa-BaseはCLIPとText-encorderのサイズはさほど変わらないのに何故か性能が上がっている。CoCaを使えばCoCa-baseでも拡散モデルの性能が向上するかは不明である。
一方、T5-XXL(5.5B)やParti-20B(4B)のText Encoderと比較するとモデルサイズは常識的な範囲である。
モデルサイズ的にはT5-Large(385M)やParti-3B(750M)あたりと近い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/668f9edd-5e2f-086e-b7c6-50c1928e9f59.png)
CoCaは公開されていないが(2022/11現在)、```Pretraining CoCa takes about 5 days on 2,048 CloudTPUv4 chip.```とあるので、TPUv4_1chipは[1chipあたり97円/h](https://cloud.google.com/tpu/pricing?hl=ja)(プリエンプティブル)とすれば学習コストは97×2048×120=2400万円程度でStable Diffusionの学習コスト60万ドルよりは安い。
 
# 7. [PaLI](https://arxiv.org/pdf/2209.06794v2.pdf)
Transformerに多言語モデルmT5を用いている。
CoCaと構造は似ているが、ViT出力がTransformerEncoderに入っている。
CoCaはViT出力がTransformerDecoderに入っていた気がする。
従ってモデル構造は似ているがCLIPとは別物の可能性がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/2450569f-f012-70c6-7714-d401a391fe77.png)

むしろ[BLIP](https://arxiv.org/pdf/2201.12086v1.pdf)のVQA構成と近いのかもしれない。
画像に対して正確なCaptionを与える問題はstable diffusionの学習と無関係ではない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/b61e739f-6bcc-755a-e8fd-3fcaf706a221.png)

実際、画像にCaptionを付与する性能はCoCaよりも上である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/5a7c5a89-ea6a-501b-faf5-1642839db806.png)

モデルサイズの情報は以下の通り。
ViT方面ではCoCaより巨大なViTを用いている。Text EncoderはmT5を用いている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/3bb9b044-7025-a06f-418d-f9250e6128d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/32c1e48a-63bd-50e5-8185-6b768285029f.png)

mT5についてはT5の多言語版として設計されたモデルでサイズは以下の通りである。
T5と同じくEncoderとDecoderが繋がっているのでText Encoderのサイズは半分だと思われる。
https://arxiv.org/pdf/2010.11934.pdf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/cec94b38-875f-5b26-f193-1bb7e9b416c4.png)

# 8. [GPT2](https://d4mucfpksywv.cloudfront.net/better-language-models/language_models_are_unsupervised_multitask_learners.pdf) & [GPT3](https://arxiv.org/pdf/2005.14165.pdf)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/83826754-19fb-2cd2-031d-122d31f2da6e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/8de92029-5d5f-ee28-cfc5-3456548d60bd.png)

GPT2では1.5Bのモデルが[公開](https://huggingface.co/gpt2-xl)されているが、GPT3系はOpenAIが公開していない。
EleutherAIが公開するGPT-NeoX-20Bが公開されている最大モデルだと思われる。

https://www.infoq.com/jp/news/2022/04/eleutherai-gpt-neox/

https://www.infoq.com/jp/news/2021/08/eleutherai-gpt-j/

# 9. [PaLM](https://arxiv.org/pdf/2204.02311.pdf)
T5-XXLを遥かに上回るモデル。前述のGPT-3(175B)よりも大きい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/3ba06183-7ae9-64f5-95e7-59c2f56d2d90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/bd3dbde8-8d0c-24da-4aa3-18bf3ce32941.png)

# 10. [eDiff-I](https://arxiv.org/pdf/2211.01324.pdf)
CLIPとT5のTextEncoderを両方使う。両方使うと片側だけより性能が上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/42d8ed6a-ea48-5287-7343-86b4b270575a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/13b538b3-1e0f-0d28-21c0-a2f64dffd438.png)

TextEncoderの詳細についてはT5-XXLとCLIP L/14である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/f6b33913-f784-ed14-700e-6001a921235e.png)
また、構成を調べると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/43103201-65d9-a26c-12c1-9d01cc2d4f56.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/c5c96ed7-d09b-72ff-5aea-ddef33d90965.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/c8c55dcc-e87e-80b5-a20f-2607e1c63d18.png)
の記述から推定するに以下の様な拡散モデルであろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/8486ac8e-109f-c366-2e54-767f8ff303bd.png)




これからTextEncoderは5.5Bと推定され、上述のT5-XXLのサイズと一致するのが確認できる。StableDiffusionのUnetは860Mなのでサイズ的には拡散モデルに大きな差はない。
StableDiffusionはSR部分が拡散モデルでなく単なるVAE(一回の実行で済む)なのでConfig-BのSRモデルの分割はStableDiffusionでは意味がない。
Config-CやDはモデルを保持するGPUメモリの消費が2倍や3倍になるが拡散モデルを通る回数は変わらないのでSamplig時間自体は増えない。モデルを保持するGPUメモリの消費が2倍や3倍になる事自体はfp16とかを考えればStableDiffusionでもまだ受け入れられる。
M(3,7)がM(3,0)を元にするとあるがM(2,3)の誤記ではないかと思われる。
M(2,1)やM(2,2)の学習は学習してもその後使われてないが、どう駄目だったかに関しては読み取れない。おそらく拡散モデルのSamplingの中間部分を分割するメリットは少ないのだろう。ベースの拡散モデルの最初と最後の部分のみが重要である。また、中間部分もそれらエキスパート部分を除いて学習する。

# 11. laion/CLIP-ViT-H
OpenAIが公開しているのはCLIP-ViT-Lまでだが、LAIONが[公開](https://huggingface.co/laion/CLIP-ViT-H-14-laion2B-s32B-b79K)しているCLIP-ViT-Hはそれより大きい。
config.jsonによれば以下の様でありT5-largeと等しいと思われる。しかし、CoCaやParti-3BのTextEncoderよりは現時点では小さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/6077364c-90d4-25fd-1d0d-b67eb8fe38e2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/70047306-38f7-89ca-afec-c9b7daeac45a.png)

# 12. Chinese CLIP
中国語のCLIPモデル。モデルはRoBERTa(BERTの派生)である。
上述のViT-Hと同じサイズまで存在し、[公開](https://huggingface.co/IDEA-CCNL/Taiyi-CLIP-RoBERTa-326M-ViT-H-Chinese)されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/3613e56b-e41e-7986-3821-38401eb9a854.png)

# 13. AltCLIP
[AltDiffusion](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/AltDiffusion)で使われているCLIPモデル。
サイズは3.22GBなのでパラメータは750M相当だと思われるが詳細は不明。AltCLIP-XLMR-Lという名称が見られるのでXLM-RoBERTa-largeだと思われる。
サイズの大きいCLIPのTextEncoderを使えば精度上がるよねと思ってこの記事を書いてたらStableDiffusionを追い越す(しかも中国の)公開された拡散モデルがあって驚きである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/e9edbfeb-1905-d5c5-097b-3deb24bfae14.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/276d43f3-25dc-1866-f28f-18991a4a5968.png)


# 比較
・Text Encorderはほぼ全部Transformerである。他言語CLIPではRoBERTaなどが見受けられる。
・現行のCLIP(123M)とほぼ等価なのがT5-base(125M)、CoCa-base(148M)のText Encoder。
・ちょっと上がParti-350M(175M)、CoCa-large(242M)のText Encoder。
・それなりに上がT5-large(385M)、CLIP-ViT-H(385M)、CoCa(550M)、Parti-3B(750M)のText Encoder。
・かなり上がT5-XL(1.5B)のText Encoder。
・個人の限界(A100使用)がParti-20B(4B)、T5-XXLのText Encoder(5.5B)。
・雲の上、PaLM。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/867ed8d3-6be3-cae6-0190-c35d3cf61dc7.png)

モデルサイズはlayer数に線形に増大する。widthに2乗で増大する。MLP/widthに線形に増大する。
Parti-3BでText生成能力が上昇するのを見るにlayer数は12でも十分なのかもしれない。
eDiff-IのようにCLIPと自然言語系のTextEncoderを組み合わせると良いかもしれない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299928/13fd5d73-e4ed-90a4-99d4-0479f80ffd03.png)
TextEncoderのWidthを基準に整理すると上記の表になる。T5はMLPの倍率の固定の場合の換算値である。
Midjourneyはどこに相当するのか情報がない。
CLIP-H14が既に公開されているからWidthが1024のTextEncoderの拡散モデルを採用するのはそれほど難しくないかと思っていたが、既にAltDiffusionが公開されて現実のものとなった。ただ、Parti-350Mの結果を見るにこの幅でのText生成能力は必ずしも高くない。Widthが2048のTextEncoderを採用すればText生成能力は向上すると思われるが、そのサイズのCLIPモデルは公開されていない。
自然言語モデルは公開されている中ではT5-XXLが十分大きく、これを採用しているパターンがImagenとeDiffIである。Imagen、eDiffI、PartiとDALL-E2の比較を見るとText生成能力がWidth2048よりWidth4096の方がより完璧になる。

# まとめ
SDは他の論文を読んでいるとTextEncorderがボトルネックになっているのではと思っていた。
関連する拡散モデルのTextEncoderを整理し、CLIP-TextEncoderと自然言語系のTextEncoderを調べた。
記事を書いてる最中にAltDiffusionが公開され、現行のCLIPより大きなText Encorderを使用してかつ**一般公開された拡散モデル**は既に存在している事になった。

現時点(2022/11)での期待としては
・CLIPのTextEncorderを大きくしたStableDiffusion v2はでるだろうか。
・拡散モデルのUnetを大きくするのではなく、eDiff-Iのようなエキスパート拡散モデルを増やす方向にシフトするだろうか。
・eDiff-Iのような自然言語系TextEncorderとCLIPの組み合わせを採用されるのだろうか。
・eDiff-I(NVIDIA)に抜かれたGoogleの今後の動向はあるのだろうか。
・CoCaの一般公開、またはそれに相当するCLIPモデルの公開がなされるだろうか。
・画像にキャプションを与えるモデルも一般公開がなされるだろうか。(モデルのFine-Tuneに影響)
・最終的にGPUメモリ16GBでも動くようにはしてほしい所である。この条件だとT5-XXLの使用はおそらく厳しい。