見出し画像

画像生成AIの指に関する研究 #2 - CLIPが出したトークンは紐解けるのか

本研究のシリーズ記事

画像生成AIの指に関する研究 #1
何故AIは指が苦手なのか」

はじめに

今回は、画像生成AIの指に関する研究 2稿目ということで進めていきます。

初めに謝辞として、前回の記事は多くの方に見て頂きありがとうございました。
この研究シリーズ記事は、比較的ディープな内容になるので、メンバーシップ説明にもある通り、当初よりメンバーシップ向けのコンテンツとする予定としていました。
今後、研究シリーズ記事は1稿目は一般公開、2稿目以降は支援者向けの限定記事としていきます。
本シリーズが予想以上の反響で、楽しみにして頂いた方が多い中、大変心苦しいですが何卒ご理解頂けますようよろしくお願いします。

今回は、2万文字弱の記事となっています。
コーヒーでも飲みながら、ゆっくり見てください。

前回のおさらい

前回、本研究の大枠である「何故AIは指が苦手なのか」を説明しました。

おさらいをしましょう。

  • 人間の脳神経系(ニューロン)のような仕組みを数理モデル化(パーセプトロン)し、数学的処理で疑似的に学習と出力を再現している。

  • AIは人間のような概念をもって、自発的思考で生成しているわけではない。

  • 指は多関節で複雑な構造や重なりによっては複雑な見え方をする為、その特徴は辛うじて描画しようとするが、人間が持つ概念を推考して描画することはない。

  • あくまでも、特徴モデル化(画像内の物体の境界や、色合いに重みづけをし数値化する数学的処理)を基に、ノイズ画像から推論し出力する。

これは、人間自身の思考プロセスを数値化したモデル、いわば極めて優秀なレプリカです。
概念を持たないまま、与えられた特徴だけを学習し、その要求に対して高度に再現してみせる」のですから、極めて優秀と言わざる負えません。

前回、ぶるぺんさんのwakame74法をヒントに取り上げました。
これは、拡散モデルと呼ばれる技術モデルで見たときに、畳み込みニューラルネットワークの仕組みを上手く騙しているのではないか、と私は推察しました。

というのも、前回説明した通り、拡散モデルの原理は人工ニューロンであるパーセプトロンが根底にあります。
パーセプトロンは数学的処理で実現されているので、無意味なプロンプト=追加トークンを与えてあげれば、係数として働くのではないか、という推論に達しました。

これに似た検証を、Tea師匠も記事にしております。
この場を借りてご紹介します。

これは、BREAK構文と入力された空トークン(=カンマで75トークンまで埋める)で生成物に変化があるのか検証したものです。

結論としては、BREAK構文と入力された空トークンでは生成物に大きな差異があります。
これは、BREAK構文と75トークンまで埋めたカンマ、それぞれに異なるトークンが割り当てられているのが起因しています。

BREAKとカンマのトークン

BREAKは予約された構文であり、仕組みとしてはCLIP(自然言語処理)において処理されない文字列(空白ではない処理されないブロック)で75トークンまで埋めてしまうという特殊構文です。
いわば、プログラム言語上のNullのようなもので埋めてしまい、処理せずに75トークンまで実質SKIPさせています。

ですので、通常のトークンであるカンマでは指示が空であっても、計算処理されてしまい、生成物に変化が生じるということになります。

少し話が逸れましたが、これを今回の研究に置き換えて考えてみましょう。

特殊構文以外の通常のトークンは、AIは通常通り計算処理されます。
故に、wakameのような無意味なプロンプトで計算処理の結果に揺らぎを与えれば、生成物にも影響が生まれるということになります。
言い換えれば、無意味なプロンプトによる計算処理の結果次第では、指描画の破綻が少ない画像も生成できるのではないか、というのが私の今回のテーマになります。

では、どのように調べていくのか、指標は何なのかを説明していきます。

指標の算出

今回は、wakameと1girlを使わさせて頂きます。

wakameは2トークン使用します。

wakameトークン情報

[wak]で1トークン(11172)、[ame]で1トークン(780)の計2トークンです。

2トークン用いられるということなので、この文字列とプロンプト[1girl]とのコサイン類似度を調べてみましょう。

コサイン類似度とは、異なる2つのベクトルのコサイン値を取るものです。
-1<0<1となり、1に近づくほど近似している指標になります。

2つのベクトルの内積の公式は、高校で習いましたね。
コサイン類似度の公式は以下になります。

$$
\cos (\vec{a},\vec{b}) = \frac{\vec{a} \cdot \vec{b}}{||a||\cdot||b||} = \frac{\sum _i a_i b_i}{\sqrt{\sum _i a_i^2}\sqrt{\sum _i b_i^2}}
$$

コサイン類似度
1girlのトークン

1girlは静的変数にします。
コサイン類似度のAはwak(11172)、ame(780)、Bは1girl(272,1611)として2ベクトルの類似度を算出します。
これにより、2つの相関が見えてきます。
言い換えれば、1girlにwakameが影響すると仮定して、算出された値は1つの指標となりえます。

算出するためにスクリプトを作って調べてみました。

# 値代入
a = np.array([args.A,args.B],dtype=float)
b = np.array([272,1611])


# コサイン類似度算出
dot = np.dot(a,b)
norm_a=np.linalg.norm(a)
norm_b=np.linalg.norm(b)

result=dot/(norm_a*norm_b)
print('{:.08f}'.format(result))

a = wakame(11172,780)
b = 1girl(272,1611)

0.23475456

類似度は 約0.23475456 となりました。
したがって、wakameと1girlは比較的遠いベクトルに存在しているということになります。
これは結構重要で、類似度が遠すぎず近すぎない文字列が影響しているのかもしれません。

あとはこの値付近となる文字列をかき集めて、あとは類似度の統計を取って検証してみようということになります。

指標の取り方はどれでも良かったんですが、コサイン類似度はディープラーニングでも使われているし、親和性があるのでは?という単純な理由で採用してます。
もしかしたらもっといい指標の算出方法があるかもしれません。

類似度の統計

指標ができたら、今度は画像同士を比較し類似度を算出していきましょう。
方法としては、特徴点抽出法(Feature Detection)による算出にて比較します。

特徴点抽出とは、マスター(比較元)とテスター(比較先)の画像内の要素を比較し、その中から特徴的なポイントを抽出するアルゴリズムの事を指します。
代表的なコーナー検出法の公式は以下。

$$
E(u,v) = \sum_{x, y} w(x, y) [I(x+u, y+v)-I(x,y)]^2
$$

出典元:CSE486, Penn State Robert Collins Lecture 06: Harris Corner Detector
https://www.cse.psu.edu/~rtc12/CSE486/lecture06.pdf

コーナー検出法(コーナーけんしゅつほう)とは、コンピュータビジョンにおいて確実といえる特徴点を抽出し画像の中身を推測するための手法である。コーナー検出法は動き検出画像マッチング画像追跡イメージモザイキングパノラマ画像生成3Dモデリング,物体認識でよく使われている。コーナー検出法は特徴点検出法とも共通点がある。

出典元:Wikipedia - コーナー検出法
https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%8A%E3%83%BC%E6%A4%9C%E5%87%BA%E6%B3%95

上図の展開式については割愛します。
気になる方は上図の出典元をご確認ください。

ここからはまたプログラミングのお時間です。
この計算を手で1つ1つやっていっては、多分一生終わりません。

作成したスクリプトは以下になります。

ここから先は

14,961字 / 2画像 / 1ファイル

この記事が参加している募集

AIとやってみた

よろしければサポートお願いします!✨ 頂いたサポート費用は活動費(電気代や設備費用)に使わさせて頂きます!✨