【論文読解メモ】LLaVA(Large Language and Vision Assistant)

## 概要
### LLaVAとは
LLaVAは「Large Language and Vision Assistant」の略であり、入力された画像に関するやり取りが可能なマルチモーダルなLLMです。同様な目的でGPT-4が用いられますが、LLaVAはGPT-4とそれほど遜色ない結果が得られることから注目を集めています。


### Ollama Python Libraryを用いたLLaVAの実行例
LLaVAは公開されたLLMであり、Ollamaなどを用いることでローカルで動かすことができます。

https://qiita.com/LiberalArts/items/6492e54d479789eddbcd

上記などに基づいてOllamaをインストールしたのちにCLIで下記を実行することでLLaVAのインストールかつLLaVAを用いた処理を行うことができます。
```
$ ollama run llava
```

https://ollama.com/blog/vision-models

以下、上記を参考とするOllama Python Libraryを用いた実行例について簡単に確認します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/74ad1d74-c6e4-395c-13ad-9cef4614a782.png">

Ollamaロゴ

たとえば上図のOllamaロゴと"Describe this image:"を入力すると下記のような結果が出力されます。
```
The image displays a white and black icon of an alpaca with a simple
design. The alpaca is depicted from the front, with its head positioned centrally within the circle. It has a round body and two oval ears, each adorned with a small circular detail. Its eyes are represented by dots, and it features two short horns on top of its head. The image is presented in a flat graphic style, characteristic of emojis or icons commonly used to represent different categories or products.
```

Ollama Python Libraryの詳しい用法については下記で詳しく取り扱いましたので、合わせてご確認ください。

https://qiita.com/LiberalArts/items/6492e54d479789eddbcd



## LLaVAの構成
### 大まかな構成
LLaVAの大まかな構成は下図などを元に確認することができます。

![LLaVA2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/8967237b-4ca1-9800-3d47-b36367633635.png)
LLaVA論文 Figure 1

基本的にはVision Encoderを用いて抽出した画像の特徴量ベクトルに対し、射影行列(projection matrix)の$\mathbf{W}$をかけることで画像のEmbeddingを取得し、LLMに反映させると理解すれば良いです。

LLaVAではLLMにはVicuna、Vision EncoderはViT-L/14を用いたとされます。VicunaとViT-L/14については次項と次々項で詳しく確認します。


### LLM(Vicuna)
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/f0180205-0873-ac1e-7313-487389a5635c.png">

「Vicuna: An open-source chatbot impressing gpt-4 with 90%* chatgpt quality」より

上記より、VicunaはLLaMAをFineTuningすることによって得られたことが確認できます。よってVicuna-13BはLLaMA-13Bに対応すると考えることができます。

#### LLaMA-13B
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/49a27bc9-a54c-36a0-3225-bae08627bd42.png">

LLaMA論文 Table 2

上記より、LLaMA-13B[^Billion]のハイパーパラメータについて確認することができます。

[^Billion]: Bは10億(Billion)に対応するので、LLaMA-13Bは約130億のパラメータを保持するLLMであることが読み取れます。


### Image Encoder(ViT-L/14)
ViT-L/14は[ViT(Vision Transformer)](https://arxiv.org/abs/2010.11929)のLargeに対応します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/9250bebb-82ca-d04c-faab-ce6d6c705f96.png">

ViT論文 Table 1

ViT-B(ViT-Base)、ViT-L(ViT-Large)、ViT-H(ViT-Huge)はそれぞれ上記のように構成されます。ViT-BとViT-LはBERTのBASEとLARGEに対応していることが下記のBERTの論文からも確認できます。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/2c8873eb-beb2-787b-86f8-7202cded35c8.png">

BERT論文 Section.3 本文より

ViTで画像を取り扱うにあたっては、画像をパッチ単位で分割し、それぞれをトークンと見なす処理が実行されます。ViTのオリジナルの論文では$16 \times 16$の256ピクセルを1つのトークンと見なす処理が基本となります。このパッチ作成の際の区切りが16かつViT-Lを用いる場合、ViT-L/16のように表すことは抑えておくと良いです。LLaVAではViT-L/14なので、「ViT-Largeを用いるかつ、$14 \times 14$のパッチを用いる」と理解すれば良いです。

ViT-L/14がViTを表す一方で、LLaVA論文では[ViT論文](https://arxiv.org/abs/2010.11929)を直接参照していないことに注意が必要です。LLaVAで用いられるViTは分類ではなく「特徴量抽出(embedding)」が目的なので、対照学習(Contrastive Learning)という考え方に基づきます。

よって、この対照学習にViTを用いた取り組みである[CLIPの論文](https://arxiv.org/abs/2103.00020)がLLaVA論文の本文中で参照されています。

#### CLIP
CLIPは「Contrastive Language-Image Pre-Training」の略であり、対照学習の枠組みでマルチモーダルな事前学習を行った研究です。

![LLaVA7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/478972fb-92b1-a383-ac1a-f3379ae59906.png)

CLIPついては下記で詳しく取りまとめましたので、合わせて確認してみると良いかもしれません。

https://www.hello-statisticians.com/ml/deeplearning/clip.html


## 参考
・[LLaVA論文](https://arxiv.org/abs/2304.08485v2)
・[Vicuna](https://lmsys.org/blog/2023-03-30-vicuna/)
・[LLaMA論文](https://arxiv.org/abs/2302.13971)
・[ViT論文](https://arxiv.org/abs/2010.11929)
・[BERT論文](https://arxiv.org/abs/1810.04805)
・[CLIP論文](https://arxiv.org/abs/2103.00020)