論文紹介： Learning Transferable Visual Models From Natural Language Supervision

<!-- 論文紹介： Learning Transferable Visual Models From Natural Language Supervision-->

## はじめに
こんにちは、ひよこです。今回は、OpenAI による論文 **CLIP: Learning Transferable Visual Models from Natural Language Supervision** を紹介します。この研究は、画像と言語を結びつける新しいアプローチを提案し、従来の画像分類手法の限界を克服するものです。

### 参考文献
A. Radford, J. W. Kim, C. Hallacy, et al., ["Learning Transferable Visual Models from Natural Language Supervision"](https://arxiv.org/abs/2103.00020) arXiv, 2021.

---

## CLIP はなぜ生まれたか？研究の背景

従来の画像分類タスクは、「入力を画像、出力を固定されたクラスラベル」とし、教師あり学習を前提としていました。この手法は ImageNet のような大規模データセットに基づいて成功を収めましたが、以下のような課題がありました。

- **人手によるラベル付与の手間**：大量の画像に対して正確なラベルを付与するには莫大な労力が必要
- **カテゴリの固定化**：カテゴリ数が固定（例えば 1000 クラス）されており、新しいクラスを追加する際には再学習が必要
- **新しい概念への対応の困難さ**：未学習のクラスや未知の概念に柔軟に対応できない

このような背景から、「Web 上の膨大な画像とテキストデータを利用して、ラベル付与なしに学習する」という新たな方法が模索されました。

一方、自然言語処理（NLP）分野では、GPT-3 のように Web テキストから直接学習するモデルが成功を収めていました。

- **タスク非依存の事前学習**：特定のタスクに依存せずに汎用的な表現を学習。
- **統一的な入出力形式**：text-to-text の形式で、さまざまなタスクに適用可能。
- **データセット不要の高性能**：新しいタスクに対しても、個別のデータセットなしで高い性能を発揮。

このような特性をコンピュータビジョンにも応用したい！ という要求から生まれたのが CLIP なのです。

## CLIP の基本的な動作 

まず、CLIP の動きを理解するために数式を使わずに概要を説明してみます。
CLIP は、画像とテキストを対照的（contrastive）に学習する新たな手法です。Visual N-Grams のような従来手法では画像からテキストを直接生成する試み（image-to-text）などがありましたが、いずれも失敗に終わっていました。そこで CLIP は画像・テキストの対応を埋め込み空間上で獲得し、これによりゼロショットで新規クラスや未知概念に対応できるようにしています。

### 事前学習時
CLIP は、画像とテキストをペアとして学習します。このプロセスの目的は、「対応するペアの類似度を高め、非対応のペアの類似度を下げる」ことです。この学習方法は対照学習 (contrastive learning) と呼ばれています。

```mermaid
graph LR
    A[画像] --> B[画像エンコーダ]
    C[テキスト] --> D[テキストエンコーダ]
    B --> E[類似度計算]
    D --> E
    E --> F[正しい画像・テキストのペアを識別]
```

ここで、画像とテキストから得られた特徴ベクトルの内積を計算し、類似度として評価します。この計算に基づき、学習が進みます。

### 推論時（Zero-shot 分類）
事前学習したモデルは、新しいタスクに対しても直接適用可能です。例えば、新しい画像が与えられた場合、以下のように分類可能です。

```mermaid
graph LR
    A[新しい画像] --> B[画像エンコーダ]
    C[各クラスの記述<br>例: 'a photo of a dog'] --> D[テキストエンコーダ]
    B --> E[類似度計算]
    D --> E
    E --> F[最も類似度の高いテキストを持つクラスを選択]
```

また、CLIP のもう一つの重要な強みは、画像とテキストのエンコードが完全に独立している点です。エンコード後の特徴は共通のベクトル空間に写像され、類似度計算にはベクトルの内積が使用されます。この内積計算は順序に依存しないため、**画像→テキスト**（画像分類）と**テキスト→画像**（画像検索）の双方向で問題なく機能します。

その結果、CLIP は既存のデータセットに縛られず、柔軟に多様なタスクへ適用可能なモデルとなっているのです。

### 補足: CLIP における対照学習  
対照学習は、もともと 1 タイプのデータ内で「似たものは近く、異なるものは遠く」に配置する手法です。CLIP はこの手法を画像とテキストという異なるタイプのデータに適用し、正しいペア（例: 同じ物体の画像とその説明文）を近づけ、関係のないペアを遠ざけることで埋め込み空間を形成しました。その結果、新しい概念が与えられても、その空間を用いて直感的な判断が可能となり、未学習のクラスでもゼロショット推論が実現できたのです。ただし、あらゆる組合せで同じような成果が得られるわけではありません。CLIP の成功は、画像とテキスト間に潜在的な親和性が存在したことや、豊富なデータ資源を活用できた点など、運や条件にも恵まれていたと考えられます。

---
## CLIP の全体の流れ

<img src="" width=40%>**図 1:** CLIP の流れ（出典：参考文献 Figure 1）

図 1 に CLIP 全体の流れを示します。今までの画像モデルは画像特徴と MLP のような線形識別器を組み合わせていましたが、CLIP では画像エンコーダとテキストエンコーダを同時に学習し、バッチ内の画像とテキストの正しいペアリングを予測します。推論時には、学習済みのテキストエンコーダが、対象データセットのクラス名や説明を埋め込むことで、ゼロショット学習を実現しています。

### 対照学習(Contrastive Pre-training) (図 1 左: 類似度行列)
まず、Web から集めた多数の画像・テキスト対を用いて対照学習を実施します。ここで *I_f* は画像エンコーダから得られる画像特徴ベクトル、*T_f* はテキストエンコーダから得られるテキスト特徴ベクトル、*W* はこれら特徴を共通の潜在空間へ射影する学習済みの重み行列、そして $\tau$ は温度パラメータです。
各ミニバッチ当たり、画像とテキストのペアを $N$ 個持つとします。
画像埋め込み *I_e* とテキスト埋め込み *T_e* は以下の通りです。

```math
I_e[i] = \frac{W I_f[i]}{\| W I_f[i] \|}
\quad,\quad
T_e[j] = \frac{W T_f[j]}{\| W T_f[j] \|}
```

ここで $\|\cdot\|$ は L2 ノルムです。この正規化によって画像とテキストを同一の潜在空間内で比較できるようになります。
次に、各画像・テキストのペアについて類似度行列 $S$ を求めます。

```math
S[i,j] = \frac{I_e[i] \cdot T_e[j]}{\tau}
```

ここで対角成分 $(i,i)$ は正しいペアの類似度であり、それ以外の $(i,j)$ 要素は不正解ペアを表しています。対照学習では、この類似度行列に対し正例ペアのスコアを最大化し、負例ペアのスコアを最小化するロス関数 (InfoNCE ロスなど) を最適化することで、モデルは画像とテキストに関する多様な概念を含む潜在表現空間を獲得できるというわけです。

### クラスラベルテキストからのデータセット分類器構築 (図 1 中央: テキスト埋め込み)
学習後、既知・未知を問わず新たなクラスラベルに対してゼロショットで分類するために、クラスラベルをテキストエンコーダに入力して埋め込みを生成します。例えばクラス $k$ に対応するラベルとして "a photo of a class $k$" のようなプロンプトを定義し、同様に埋め込みを求めます。

> 🐣 この "a photo of a class ◯◯" 形式の発見が結構大きかったみたいでプロンプトに "a photo of a" を加えるだけで精度が 1.3% も向上したそうです

```math
C_e[k] = \frac{W T_f(\text{"a photo of a class k"})}{\| W T_f(\text{"a photo of a class k"}) \|}
```

これにより、クラスごとにテキスト表現が潜在空間へマッピングされるわけです。CLIP は対照学習を通じて、画像とテキストが同一空間で対応するように訓練されているため、$C_e[k]$ がクラス専用の分類器として機能するわけです。

### (3) ゼロショット推論 (図 1 右)
未知クラスが含まれるタスクに直面したとき、追加訓練なしで画像を分類することができるのも CLIP の強みです。入力画像 $x$ に対し、画像エンコーダで特徴 $I_f(x)$ を抽出し、潜在空間へ射影します。

```math
I_e(x) = \frac{W I_f(x)}{\| W I_f(x) \|}
```

続いて、各クラス埋め込み $C_e[k]$ との類似度を計算することで、$x$ が各クラス $k$ に属する確率を求めることができます。

> 🐣 画像とテキストの特徴ベクトルは似ているので、未知の画像がきてもその特徴に似ているテキスト特徴量を探せばいいというわけですね

```math
p(y = k | x) = \frac{\exp\left(\frac{I_e(x) \cdot C_e[k]}{\tau}\right)}{\sum_{j} \exp\left(\frac{I_e(x) \cdot C_e[j]}{\tau}\right)}
```

これにより、新たなクラスに対しても、テキストから定義したプロンプト埋め込みを参照することで直接的にクラス確率を割り当てることが可能となります。

### 補足: 完全なゼロショットが可能なの？
「ゼロショット」とはいえ、CLIP が「見たことも聞いたこともない」完全に新規な概念を正しく識別できるわけではありません。あくまで、学習中に得た幅広い知識を活用して「なんとなく近い」概念へマッピングする能力を持つにすぎません。つまり、事前学習の範囲で類推が効く概念に対してはうまく働きますが、まったく未知の領域には弱いことも覚えておいてください。
ただし類推可能な範囲であれば新しい概念への対応も多少は期待できます。例えば、nekomata (猫又) という未学習の入力を考えてみましょう。

> 🐣 猫又はしっぽが二本ある猫の妖怪だニャ！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/6d51e943-5a76-15b9-c0ea-de047c2cadb9.jpeg" width=30%> 

「a photo of a nekomata」のような未学習の概念であっても、CLIP のテキストエンコーダが文脈や関連単語の知識を持っていれば、「a photo of a cat with two tails」とよく似た特徴ベクトルを生成することが期待できます。これにより、CLIP が "cat" や "tail" に関連する画像を学習している場合、猫と二本の尻尾に関連する画像 (きっと猫又ですね！) を見つけることができるのです。

---
## 数値実験 
CLIP の論文では非常に多種多様な数値実験がなされています。以下はその概要です。

### 大規模な学習データとスケールの力
CLIP はインターネット上の膨大なデータセットから学習したことで、ゼロショット学習においても他の従来モデルを上回る性能を達成しています。

#### データ規模
- **訓練データ**：4億組の（画像、テキスト）ペア
- **バッチサイズ**：32,768（大規模並列計算）
- **語彙数**：50万語以上をカバー
- **学習エポック**：32エポック

> 🐣 1 秒 1 枚のペースだと405年かかる規模のトレーニングだったとか…

### 主な成果
#### ImageNet ゼロショット精度
- **精度**：76.2%（ゼロショット）
  - 従来の ResNet-50（128万枚のラベル付き訓練データを使用）の性能をゼロショットで達成。

#### マルチタスクへの対応力
- **27種類のデータセット**で評価：
  - **21のデータセット**で最高性能を達成
  - 特に次のタスクで高い性能：
    - **OCR**（テキスト認識）：他モデルを大幅に上回る
    - **地理認識**：画像からの場所推定に強い
    - **動作認識**：動画内の行動分類でも優位

### CLIP のすごさ
1. **ゼロショットでの高精度**：追加の学習データや調整なしで、幅広いタスクに対応可能
2. **大規模学習の恩恵**：膨大な画像・テキストペアからの学習により、汎用性の高い視覚モデルを構築
3. **柔軟性**：タスクに応じてカスタム分類器を自然言語で簡単に生成

CLIP はその大規模な事前学習とゼロショット性能によって、従来の教師あり学習モデルを超える汎用性と性能を実現しています。このアプローチにより、OCR、地理認識、動作認識など多様なタスクで優れた結果を示しました。

---
## その後の CLIP の活躍

CLIP はその後、多くの生成系 AI 技術や応用領域で重要な役割を果たしました。以下に代表的な事例を簡潔に解説します。

### 1. **Stable Diffusion**  
Stable Diffusion は、テキストプロンプトから高品質な画像を生成する技術で、CLIP のテキストエンコーダが重要な部分を担っています。具体的には以下のような役割を果たしています：
- **テキストの埋め込み**  
  ユーザが入力するテキストプロンプト（例: "a photo of a futuristic city"）を埋め込みベクトルに変換。これにより、生成する画像がプロンプトに対応する内容を反映できる。
- **画像とテキストの整合性**  
  CLIP を用いて生成画像の内容がプロンプトにどれだけ一致しているかを評価し、モデルの生成プロセスを改善する。

CLIP のテキストエンコーダは、画像生成モデル（例: Diffusion Model）が適切な方向性を学ぶためのガイドとして機能しており、Stable Diffusion の成功に大きく寄与しています。

### 2. **DALLEシリーズ（DALLE, DALLE 2）**
OpenAI の DALLE も CLIP を応用したシステムの一例です。
- **テキスト・画像対応の学習**  
  テキストプロンプトと画像をペアで学習するため、CLIP を使用して両者の関連性を深く理解し、それに基づいて画像生成を行います。
- **CLIP-guided 選択**  
  生成された複数の画像の中から、プロンプトに最も適合するものを選択する際にも CLIP が使われています。

### 3. **CLIP-Guided Image Manipulation**
CLIP を利用して画像編集や変換を可能とする技術です。
- **例: テキストによる画像変換**  
  「Make the sky red」（空を赤くする）のようなテキスト指示に基づいて、画像の特定部分を編集する技術に活用されています。
- **画像生成モデルとの組み合わせ**  
  GAN（Generative Adversarial Network）や Diffusion Model と組み合わせることで、プロンプトに応じた細かな画像編集が可能になりました。

### 4. **ロボット制御や視覚タスクへの応用**
CLIP のマルチモーダル能力はロボット工学やコンピュータビジョンにも応用されています。
- **ロボットの物体認識**  
  CLIP を使うことで、自然言語を用いて柔軟に物体を指定し、ロボットが対応する物体を認識・操作できるようになりました。
- **視覚検索や画像分類**  
  従来の固定クラスに依存しないため、ゼロショットで新しいカテゴリを認識するタスクに適用されています。

---
## CLIP を用いた画像とテキストの類似度評価例

では実際に CLIP を動かしてみましょう。
以下のコードは、OpenAI の CLIP モデルを使用して、画像とテキストの類似度を評価する例です。Colab 上で簡単に実行できる構成となっています。ひよこの画像と、テキスト（"a photo of a cat" など）の類似度スコアを計算することで、CLIP のゼロショット学習能力を確認してみましょう。

#### 画像とコードの準備
このひよこ画像を `example.jpg` として保存後 Colab にアップロードし、以下のコードを Colab 上で実行してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935950/51000471-61f2-09d8-96ef-bf1b8a4b49cd.jpeg" width=50%> 



```python
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
import torch

# モデルとプロセッサの読み込み
model_path = "openai/clip-vit-base-patch32"  # 使用する CLIP モデル
model = CLIPModel.from_pretrained(model_path)
processor = CLIPProcessor.from_pretrained(model_path)

# 入力データの準備
image = Image.open("example.jpg")  # 入力画像ファイル
texts = ["a photo of a cat", "a photo of a bird", "a photo of a hiyoko", "a photo of a chick"]  # 入力テキストリスト

# 前処理
inputs = processor(
    text=texts,
    images=image,
    return_tensors="pt",
    padding=True
)

# モデルの実行
outputs = model(**inputs)

# 画像とテキストの埋め込みを取得
image_features = outputs.image_embeds  # 画像特徴ベクトル
text_features = outputs.text_embeds    # テキスト特徴ベクトル

# 正規化して類似度を計算
image_features = image_features / image_features.norm(dim=-1, keepdim=True)
text_features = text_features / text_features.norm(dim=-1, keepdim=True)
similarity = torch.matmul(image_features, text_features.T)

# 結果を表示
for i, score in enumerate(similarity[0]):
    print(f"Text: {texts[i]}, Similarity: {score.item():.4f}")
```

#### 実行結果
以下は、ひよこ画像と各テキストの類似度スコアです。

```plaintext
Text: a photo of a cat, Similarity: 0.2282
Text: a photo of a bird, Similarity: 0.2450
Text: a photo of a hiyoko, Similarity: 0.2706
Text: a photo of a chick, Similarity: 0.2847
```

#### 結果の考察

1. **類似度スコアの比較**
   - 最も高いスコアを示したのは `"a photo of a chick"` で、次に `"a photo of a hiyoko"` が続きます。これは、CLIP モデルが英語を優先的に理解するため、日本語の "hiyoko" よりも "chick" の方が妥当だと判断したのでしょう。

2. **CLIP の日本語理解**
   - 日本語の "hiyoko" にも一定のスコア（0.2706）が与えられています。CLIP モデルは、Web から収集した多言語データを用いて学習されているため、日本語もある程度は理解できることがわかります。

3. **柔軟なゼロショット推論能力**
   - "bird" にも高いスコアが割り当てられていますが、これは "chick"（ひな）と "bird"（鳥）が意味的に近いためと推測されます。このように、CLIP は概念の関係も捉えています。

4. **より優秀なモデルの利用**
CLIP には "openai/clip-vit-large-patch14" のようにより大きく優秀なモデルもあります。より正確な結果が欲しい場合にはこのような上位モデルで試すこともできます。

この実験では、CLIP モデルが日本語や英語のテキストを用いて画像の類似性を判断する能力を示しました。結果から、"chick" が最も高いスコアを得たことは、CLIP の学習範囲が英語に強く依存していることを裏付けます。ただし、日本語もある程度認識可能である点は非常に興味深いポイントですね。

---
## おわりに
今回は画像とテキストのマルチモーダル学習に革命を起こした CLIP の論文を紹介してみました。CLIP の画像に結びつけられたテキストエンコーダは軽量ながら非常に優秀でその後 Stable Diffusion などでも利用されることになります。栄枯盛衰が激しい生成 AI の世界でいまだに現役で使い続けられているのはすごいですよね。ではまた次の記事でお会いしましょう。