小さなジャンプ

最近、自分の強みって何だろう?というのを改めて考えた。

私は色んなことに興味があって世間一般のエンジニアと比べると新しいことを学び取るのが多分かなり速いほうで、だから知識はいっぱい持ってると思うのだが、知識それ自体は仕事のアウトプットに直接結びつくものではない。 実際、知識ってありすぎると逆に頭でっかちになって行動力を削ぐような副作用も実際あると思う。

じゃあ肝心のエンジニアとしてのスキルは?と自問すると、そんなに強い方でもないと思う。 バグなく機能を実装したり、込み入った問題やバグを素早く原因究明して直したり、というソフトエンジニアの実務上の能力は低くはないと思うが(今の会社の同僚のエンジニアと比べると)取り立てて高くもない。

じゃあ新しいものを生み出す研究や発明的な能力は?と考えると、それも国際学会で賞を取ったり有用な特許技術を考案したりとかいう実績もないから、そういう領分でもない。

そうやって今までの経験を棚卸しして思ったのは、

自分は「小さなジャンプ」が得意だな。

ということだった。それについて、以下にちょっと詳しく書いてみる。

スキルの高いエンジニアと会話してると良く感じるのが、「これは出来る」「これは試行錯誤が必要」「これは出来ない」という判断を取り組む前にかなり正確に見積もることが出来て、実際そのとおりなことが多いという点だ。研究と違ってプロダクト開発では試行錯誤には時間的な「期限」があるから、確実に出来ることを積み上げて何かを作り上げようとする。それは合理的だし、それを確実にやりきれる優秀さは大事だ。

でも、僕は言ってみれば「ロマン派」というか「ちょっとそれは期間内にやると言い切っちゃうのは出来なかったら信用失いそう」みたいなところのギリギリのところをどうしてもやりたくて、期間が決まってるなかでそういうテーマをつい入れてしまう。で、それを数日間(他の作業やったりしながら)「良い答えがパッと思いつかないものを、ずーっと考え続ける苦しいマゾ時間」として浴びつづけると、何か最後にはシンプルなウマい方法を思いつくのだ。思いついたら実際にそれを形にする。

その、最終的に出来上がったものは「ぱっと見、すぐに思いつきそうなごく当たり前の単純な感じ」のものであることが多く、なのでそれが「うぉーすごいね!」とはならないことが多く、少し悲しくもあるのだが「自分はそういうことが出来るのが当たり前」なんだから「別に褒められなくてもそれが当たり前の人として平然と生きていれば神様がこの能力をどんどん強くしてくれるだろう」みたいな心の処理をして今までやってきた(今回、そういえばそういう風にいつからか心がけてきたな、と改めて思った)。

これが僕にとっての「小さなジャンプが得意」という強みだなと思った。

ググっても出てこないし、どこの本にもどこの論文にも書いて無くて、ちょっとした発想のジャンプが必要になるのだけど、いったん飛び越えてしまうと「誰でも思いつきそうな感じ」の単純な解決策になるようなものを見出すのが得意

AIの新しい方法(TransformerとかNeRFとか)を生み出すとかいうレベルではないのだけど、どこにも答えが書いてない小さな課題を前にして小さなジャンプが出来ること、これは「あなたの仕事の上での強みは何ですか?」と聞かれてぱっと説明するのが難しいけど、仕事する上で重要な能力の一つだと自負してよいだろう、と思ったのだった。

論文の気になるところだけを短時間で読む方法

先日、ビット量子化の手法でBitNetの論文がでてSNSで話題になりました。私も気になったので論文(とその参照論文)を1時間ほど確認して自分なりの要約をツイートしたところ、結構多くのリツイートやいいねをもらいました。

僕みたいなソフトウェアエンジニア職ではあるけどプロの研究者ではない人が最新の技術や論文を読む際に、「気になるところだけに絞って読む」ことが出来ると都合が良いです。

それについて人それぞれ色んなやり方あると思いますが、本エントリでは私の読み方を説明し、それに基づいた具体的な論文読み例を書いてみます。

その論文から得たいことを明確にする

論文には概要(アブストラクト)が付いているので、まずそれを読んで「その論文から得たいこと」を明確にします。アブストラクトに加えて、本文の最後の結論(コンクルージョン)も併せて確認すると良いこともあります。

例えば、BitNetの論文でしたら、

  • どの部分をビットで計算してるのか?DNNモデル全体か?それとも一部か?
  • 4bitや8bit量子化と比べて何が優り何が劣るのか?性能的に完全に上位互換なのか?
  • 蒸留(学習時は普通の数値を使い、学習済みモデルをbitに変換する)と比べて(以下同様)

が私にとって「気になること」でした。なので「これらの問いの答えを論文の中から探す」という読み方をすることになります。

しかしそれだと、もし仮に論文の中でこれらの問い以外の重要なことが書かれていてもそれに気づけない可能性はあります。そうだとしても、割り切ってそれを諦めるのが重要です。そもそも、論文の内容をくまなく読もうとしたら短時間で読むのは(その分野のプロの研究者とかじゃない限り)困難だと思います。

「問い」の答えになりうる「自分の仮説」をでっち上げる

前節で述べたとおり、論文から得たいことを「問い」のリストとして明確にしました。そうしたら早速本文の確認に入る、、、のは得策ではないと私は思っています。

その前に各「問い」の「答え」が「論文中にどのように書かれているだろうか?」というのを考えます。そして「こういう答えが書かれているのではないか?」という仮説を自分なりにでっち上げます。

例えば、BitNetの論文でしたら、以下のとおりです。

  • 「どの部分がビット計算か?」および「蒸留と比べてどうか?」についての仮説

学習フェーズと推論フェーズでいうと、既に蒸留という手法があるから推論フェーズだけでビット計算するというのではインパクトが薄そう。NVIDIAのハードは特に学習時に掛かる大量の計算負荷をさばけるという点で市場で圧倒的優位に立っていて、この論文はマイクロソフト系の研究室のものだからそれに対抗する技術開発のはずで、だから特に学習時の計算を軽くする話に違いない。

DNNのモデル全体をビットでやるものかどうかはよくわからない。積和演算と活性化関数の全てをビットでやるとしたら、それは決定的な論理回路になってしまってAI的ではない気もするから一部だけビットでやるという話かもしれない。でも全てをビットで計算しながらAI的な振る舞いを可能にする手法なのかもしれない、そこは注意してみよう。

  • 「4bitや8bit量子化と比べてどうか?」についての仮説

素朴に考えれば、ビット数の少なさとモデルの性能は原理的にトレードオフの関係にあるはず。その原理を打ち破る性質があるとしたらどんなものだろう?情報が少ないほうが過学習を避けて汎化能力があがるドロップアウト正則化みたいな話と関連してるのだろうか? しかしそれだと逆にバイアスが掛かりにくくて学習が進みにくそう。モデルの表現力を維持しつつ少ビット化による正則化の効果が相まって性能があがりましたという話になりそうだ。だから、特にビット計算でありながら表現力を維持するためのキーポイントが何かという点が問題であり、そこに注目して読む必要がありそう。例えば最終レイヤは通常ビット数のDenseネットがあるとか、あるいは活性化関数はビット演算じゃないとか?だろうか。

このように、仮説を立てると論文に対する読みが「オープンクエスチョン」ではなく「クローズドクエスチョン」になります。友人と食事にいくときに「今日何食べたい?」って聞くよりも「今日カレー食べたくない?」って聞いたほうがお店が決まるまでスムーズであることが多いのと同じです。また、仮説を立てることによって、たとえ仮説が外れた時に「仮説とどう違っていたのか」という情報が読みに加わり、同じ時間で論文を読んだときに得られる情報が増えます。「カレーは今日はいいかなぁ」「どうして?」「もう少しさっぱりしたものが食べたい」という風に、「カレーに対する反論としての情報」が得られるわけです。

仮説を立てにくい時

前節で、仮説を立てるのが大事、と書きましたが土地勘がない分野の論文の場合、その仮説を立てようにも糸口すらみえないこともあると思います。そういうときは「ガード下の居酒屋で飲んでるおっちゃんとの対話」法という方法を僕はよく使います。

これは、めちゃくちゃ素人の相手、すなわち話を聞いた範囲だけから率直にツッコミや感想を述べる相手論文読みの相談相手として想像するという方法です。「飲んでるおっちゃん」はいわばそのモデル像です。

BitNetの論文の例でやってみましょう。

(Q) 最近流行りのAIで、深層学習っていうのがあって、いわば脳みそを真似た仕組みなんですけど、脳みその中の神経回路って電気信号で動いてるんで何ボルトみたいな電圧の高いところ電圧の低いところという感じで電圧の計算をしてるんです。 電圧って3.5ボルトみたいな小数点以下の微妙な数もちゃんと加味しないと正確な計算ができないから、脳の仕組みを真似しようとしたら小数点の計算をしないといけないんですけど、最近、少数じゃなくて整数、それも0から255までの数で計算するという方法が出てきて、少数の計算よりもコンピュータの回路が小さくて済むのでお得だということで注目されてるんです。

(A おっちゃん). それは、255だったら2.55ボルトってことにすれば少数と同じじゃねーの?

(Q) そうなんですけど、本当の脳みその神経は厳密に3.1415926535ボルトとかあるわけで、それを少数2桁にちょんぎってしまうという方法がAI研究の世界で流行ってるって話なんですよ。

(A) ふーん. で、君は今日オレに何を聞きたいわけ?

(Q) で、今日僕が読もうと思ってる論文、0から255じゃなくて「0か1」という極端な方法でも結構上手く行くよ!っていう方法らしいんです。結構中身が難しいので読む前に中身を想像してから読もうと思って話し相手になってもらいたくて。

(A) 0か1ってスイッチみたいなものか。電気つけるつけない、ってことかな。それじゃ、スイッチとAIは何が違うのよ?

(Q) えーと、コンピュータの集積回路はスイッチの集まりなんですけど今のAIはスイッチだけじゃなくて、学習が出来るためにはパラメータの勾配を計算する仕組みがあって、、ってあれ?「パラメータがビット表現なのか計算結果がビット表現なのか」というのはビット量子化においてどういう分類になるんだろう?…。それと、もしスイッチの仕組みだけでAIやるとしたら…決定木みたいな感じしか思いつかないな…。

(A) 何言ってるか全然わかんねーよ。簡単に説明しろ。

(Q) あ、、すみません。でも、話し相手になってもらって結構自分なりに掘り下げることが出来たんで、家に帰ってその論文読もうと思います。あ、これ、飲み代です。

(A) お、サンキュー!

みたいな感じです。(ふざけてるように思われるかもしれませんが、「最先端の論文を素人目線で考える」のはめちゃくちゃ大事なことだと思ってます。何事も「本質的な理解は常に素人目線に帰着する」って僕は信じています。

本文も2段階読み「目星を付ける→入念に理解する」

さて、仮説を何らか立てたので、本文を確認する準備ができました。本文を確認しましょう。

ここでのコツは、「読むべき箇所をピックアップする」と「実際にその箇所を読む」とで2段階でやるということです。「目星を付けてから読みに入る」ということです。

具体的にはまず本文を上から下までざーっと眺めたり拾い見たりしつつ「自分なりに立てた仮説に関係ありそうなところ」をピックアップします。繰り返しになりますが「論文を読んで」はいけません。でも「読まなくても目に入って分かってしまった」というときもあり、それはそれで良いです。

そうやって目星をつけて大体全体見たかな、と思ったらピックアップした箇所とその周辺を入念に読み込みます。そこで書いてあることが、その論文の別の箇所や、ときには別の論文(特に、同じ著者による従前の研究)を参照しているケースもあります。どうしてもそれを参照しないと明確に分からなそうだと思ったら、それもちゃんと参照しに行きます。参照論文の読みに移る際も「いま何を読もうとしてるのか」を明確にし、目星を付けてから読むという風に徹底します。けっして上から下まで全部を読み込んではいけません。

そうやって読んでいくと、最初に目星をつけたところが大体読めてきます。それで、当初の目的である「問いのリスト」が消化できたら、それで論文を読み終えたことにして、自分なりに問に対する答えをまとめて終わり、ですし、「新たな問い」や「新たな仮説」が浮かんできたら引き続き論文を同様の方法で読んでいくことになります。

というわけで

論文読みに関する自分なりの方法を書いてみました。 実際に、BitNetの論文はこのような方法で1時間ほどで読みました(なのでもしかしたら読んだ結果の私の理解は厳密には正しくないかもしれませんが、少なくとも自分にとって得るものはありました)。

特にポイントとなるのは、「仮説を立てる」部分で、仮説の巧拙は「もともと自分が持っている知識の幅や量」に依存していることも分かります。なので、最先端の技術確認と同じく既存の知識を体系的に理解(それは論文ではなく書籍であることが多いでしょう)することも大事でしょう。

ではまた!

位相空間の連続写像や測度空間の可測関数が「逆」写像を使って定義される理由

当日投稿でもう一つ adventar.org の記事を書いてみました。

突然ですが、数学を勉強してると、以下のような疑問に突き当たるのは僕だけでしょうか?

これは分かってしまえばとても簡単なので、説明します。

結論をいうと、逆写像は集合の演算(AND, OR = 共通部分、合併)を保つけど、写像(を集合関数と見たもの)は保たない、からです。

それぞれ見ていきましょう。

写像と集合演算

例えば集合をX,YとしてXからYへの写像Fがあるとします。 Xの部分集合X1,X2に対してAND,ORしたものと、それらのFによる像 F(X1),F(X2) (=Yの部分集合) に対してAND,ORしたものを比較してみましょう。

  • F(X1 and X2) ⊆ F(X1) and F(X2)
  • F(X1 or X2) = F(X1) or F(X2) (これはOK)

像はAND演算を保ちません。写像は「行き先が一つに定まってれば良い」、つまり異なる入力に対して同じ出力があってもよいです。これは直感的には「写像を通すと情報が減る」という風に私はイメージしています。

写像と集合演算

同様のことを、今度はYの部分集合Y1,Y2を使って逆写像F^{-1}について考えてみましょう。逆写像写像と違ってもともと集合関数です。

  • F^{-1} (Y1 and Y2) = F^{-1} (Y1) and F^{-1} (Y2)
  • F^{-1} (Y1 or Y2) = F^{-1} (Y1) or F^{-1} (Y2)

こちらはイコールになります!「逆写像を通しても、情報は減らない」し、「増えもしない(なぜなら入力よりも情報量が減ってるのだから当然)」から、「情報は同じ」です。それが「逆像が集合演算と可換」になることの直感的なイメージです。

つまりは、

位相空間における開集合や、測度空間における可測集合は、集合演算に対して閉じていることが要請されるので、well-definedな理論を作るにはその要請をキープするような写像を考える必要があるので、集合関数が集合演算と可換になってる必要があるので、逆写像で定義されるわけです。

余談: コホモロジーホモロジーよりも重要になる理由

また、これと直接同じ理屈ではないのですが、「ホモロジーよりもコホモロジーの方が自然で使い勝手が良い」という、似た話があるので余談ですが紹介しておきます。

集合XとYがあり、X上で定義された関数F1と、Y上の定義された関数F2があるとします。値域はF1、F2とも例えば自然数だとしましょう。 (別に自然数じゃなくても連続値でもTrue/Falseの2値でも{男、女}でも{英語,日本語,中国語,ドイツ語,..}とかでも、なんでも良いです。機械学習の特徴量抽出とかのイメージでも良いです。)

それと、XからYへの写像fがあるとします。このときに、fとの合成を使って「新しい関数」を作る方法を考えてみましょう。

まず、F1とfの合成を考えてみましょう。F1はX上の関数ですが、x∊Xに対してF1(x)は自然数(値域の要素)になってしまい、写像fと合成が出来ません。またx∊Xに対して先に写像fを適用してしまうと集合Yのほうに舞台が移ってしまい関数F1は置いてけぼりです。なので合成が出来ません。

では、F2とfの合成はどうでしょうか?F2はY上の関数ですが、 x∊X に対して写像fで写すとf(x)∊Yとなり、関数F2を適用でき、F2(f(x))は自然数(値域の要素)となります。めでたく、Y上の関数F2からfとの合成によって新しい(X上で定義された、値域が自然数の)関数を作り出すことができました!!

(まだ私も勉強し始めたばかりですが)ホモロジーよりもコホモロジーのほうが出来ることが多い、っていう話はこういう理由から来てるようで、一見違いがないように見える部分にも「本質的な違い」が秘められてるという面白い例だと思います。

参考ページ

汎用人工知能の観点で「新実存主義」を読んでみた(前編)

本記事は

adventar.org

の 12/10当番分の記事です。

はじめに

ドイツ、ボン大学のM.ガブリエル教授をご存じでしょうか?「哲学界のロックスター」の異名を持ち、現代の気鋭の哲学者と評される氏は、メディアに露出する機会も最近多いです。

そんな彼の著書の中で、岩波新書に邦訳がある「新実存主義」という本を、汎用人工知能の観点で読んでみた私の個人的な感想を書くのが本記事の主題です。

www.iwanami.co.jp

それと、予めお断りになりますが、私自身は哲学の専門的素養はなく、新書や選書を20~30冊程度読んでいるくらいの、所謂「趣味の哲学徒」です。 もちろん、本記事に対する支持・批判等のツッコミは大歓迎です。

実存主義」とは?

まず大まかに、新実存主義というのがどんな思想なのか、私の理解を述べてみます。

「新」実存主義と銘打ってるので実存主義と関連があります。実存主義というのは、1900年代前半に隆盛を誇った思想で、その時代背景からも推測されるとおり、「全体より自分を生きよう」みたいな思想です。

もうちょっとちゃんと書くなら、国や企業や民族といった広い意味でのコミュニティや、宗教や文化といった、社会を作りあげている要素が我々の間で「真実性」「真理性」について見解を共有する源になっているのだけど、それが「あたりまえ」だと思い込みすぎると個々の人々が望んでない戦争を国同士が起こすことになってしまったり、価値規範の下で社会的な階級が固定されてしまって「差別」が起きたり、もっといえば本当に人間がもっている創造性や多様性をフル発揮できない社会になってしまう、その呪縛から逃れるために個々の人々が生きている「実存」を大事にしよう、という考え方です。

実存と似た言葉に「実在」がありますが、実在はどちらかというと個々の人間の人生から離れて、「社会の側」あるいはもっと広く「自然の側」にあるものを指す言葉です。対して実存という言葉は、人間が持つ感情や価値観といった客観的/物理的な物事に還元できないもののほうを第一に考えるようなニュアンスもあります。

さらに、いまここで私が使った「感情」という言葉さえも、例えば「悲しい気持ち」という言葉には「意味」がありますが、この言葉を発した人間の「本当の悲しさ」が言葉で表現しきれるわけでなく、その人間の人生そのものというのは「言葉よりも先」に存在しているわけです。こうした、言葉に先立つ個々の人間の生に目を向けるのが「実存主義」です。

実存主義は原理的に考えるととても厳しい考え方です。言葉よりも先に、どこかから「人生の考え方・生き方」を借りてくることよりも先に、自分の人生に目を向けるという思想なのですから。

仮にある人が身体だけ大人になってから、何も知らない赤ん坊の状態に戻されて意識だけが継続し、目の前にある「人生の原体験」にさらされ続けるとしたら、とてつもない不安に駆られるでしょう。しかも、その体験してる「現実」すら、その人間が「その現実にするか」を選ぶことが人間には原理的に可能なのです。

「新実在論」とは?

M.ガブリエルは、新実存主義の前に「新実在論」ともいうべき、「実在」という概念にも新しい見方を与えています。彼は「『世界』は存在しない」と言っています。我々は「世界」といった言葉を聞いたとき、何か我々がいま住んでいる「この世の全体」というイメージを思い浮かべますが、そういうものは実際には「存在しない」つまり「実在ではない」と言っています。

もちろんガブリエル教授よりも前にも、こうした「客観的な世界なんてものは無いのだ」といったことを主張した哲学者はたくさんいました。というか、科学者との対比でいうと、哲学者というのはむしろそういう主張の方が「メジャー」かもしれません。では、「新実在論」はそうしたこれまでの哲学者の主張と何が違うのでしょうか?

例えば、ドイツの哲学者カントは客観的な実在はあるかもしれないがそれを完全にとらえきることは人間にはできないのだ、それでも部分的に認識できるのは人間が「悟性」を持っているからだ、そんな「人間の根本的な限界」を踏まえたうえで客観的な実在を正しく認識しようとする「理性」を我々はもっている、みたいな感じのことを主張しました。つまり「世界は実在してるけど、我々には全部みえない」ってことですよね。

またイギリスのヒュームなど17~18世紀のイギリスの経験主義的な思想は、我々の認識する物事は世界の側に始めからそれをそれとして成り立たせてるものが存在してるわけではなく(リンゴがリンゴとして存在してるわけではなく)、我々が経験から「目の前にあるのはリンゴだ」という風に経験則で実在を認識しているのだという見方を徹底したような思想ですが、「世界の側にある、(我々が認識する対象であるところの)実在」を所与としてるようなところがあります。世界があるから、経験できるのだし、経験則で「リンゴ」という概念を持つことが出来る、というわけです。

ライプニッツモナド論に似てる?

でもそうしたら、ガブリエル教授の「世界が実在しない」ということになると、いったい我々は何を経験しているのだ?という疑問が生じてきます。

これについてのガブリエル教授の主張を、実は私はあまり把握してないのですが、似たような考え方としてかつてライプニッツが提唱した「モナド論」というのがあるのでそれを紹介しておきます。

モナド論は、世界の実在性はさておき、個々の人間(動物)が経験する現実というのはまったく独立であり、それにもかかわらず「たまたま」その個々の人間どうしが経験を共有する機会(=チャネル)を持てているだけに過ぎないのだ、という考え方です。そんな「偶然」に依存する世界観だなんて哲学と呼べるのか!とツッコミを入れたくなりますが、モナド論では「そうなのだ、すべては偶然であり、その偶然が世界に『予定調和』的に組み込まれてるゆえに我々は経験を共有できているのだ」と平然と主張します。かなりラディカルな思想ですね(なので、このモナド論というのはあんまり流行してないと思います)。

哲学の歴史には、このモナド論のように「実在の有無以前の問題」とも言えるような思想もあるくらいなので、ガブリエル教授の「新実在論」もこれから色々と思想が補完されて洗練されていくのかもしれません。

で、「新実在論」では「世界は存在しないが、『個々の人間による経験』は存在する」と言っています。これだとちょっとモナド論っぽい主張に思えますが、つづきがあります。それは、「自然物(物理的なモノ)」は存在するし、「個々の人間の感情」とか「個々の人間がおかれた立場や環境によって変わる経験像」も存在する、と言っているのです。

つまり「世界」は実在してないけど、「個々の客観的な実在」はあるし、「個々の主観的な実存」も存在するという話なのです。ここが、ヒュームのような徹底的な経験主義と異なる点だと私は解釈しています。また、「世界という実在は無いけど個々の実在はある」というのは西洋的な1神教の世界から東洋的な多神教八百万の神)の世界への転換、みたいな感じもしますね。

「世界=宇宙」への批判としての「新実存主義

さて、ここまでの話をまとめると「新実在論」というのは、「世界は存在しない」けれども、「物理的なモノ」は存在するし「感情」とか「経験」とか「主観的な印象」といった「精神的なコト」も存在する、という主張なのでした。

そうすると、

「物理的なモノの実在性」=「精神的なコトの実在性」

という主張なのだろうか?

という疑問が浮かんできます。結論からいうと、Yes、です。というか、両者は同じ「実在性のグラデーション」の中で「同じ土俵の上で考えるべき対象」であるというのが新実在論の主張だと思います。物理的なモノと精神的なコトは「実在性のレベル」としては「グラデーションの上で異なるポジション」かもしれないが、「グラデーションは共有されてる」し「その2つを分けるものは何もない」すなわち「同様の実在性を持つ」というのが新実在論のキーポイントです。

この考え方に立つと、面白い疑問が浮かんできます。

「宇宙は存在しているのか?」

です。新実在論は「世界は存在しない」とは言ってますが、「宇宙は存在しない」とは言ってません。これまでの話を踏まえると「宇宙」は実在性を主張できる「物理的なモノ」の範疇にあることは明かでしょう。

でも、普段我々は、「世界」という言葉と「宇宙」という言葉に、けっこう「似たニュアンス」を感じちゃってませんか?普段のたわいのない雑談でも、「世界で一番」という話題が出ると「それは地球で一番なのか?」「それは宇宙で一番なのか?」みたいな話に、屁理屈とは分かっていても結構なったりしますよね?

ガブリエル教授の主張を踏まえるとこれは、科学的なものの見方が、哲学的に言いかえると「極端な自然主義」的なものの見方が、我々一般人の「常識」の中にまで浸透しきっているせいだ、ってことになります。

そこで「新実在論」の延長線上の議論として、「実存」についても新しい視点を持ち込むべきだという話として、「新実存主義」につながってゆきます。

ちょっと脱線: 営利企業に哲学倫理が重要になって来てる理由

余談ですが、ここまで述べたような話を聞くと、「哲学者というのは簡単に思いつきそうなことを主張してスターとか呼ばれちゃって甘い商売だなー」みたいに思わなくもないですが、実際にこれを哲学の世界できちんと主張するためには、これまでの哲学者の主張を全部踏まえて、それらに関連付けたうえで主張の新しさと重要性を述べないといけないので大変な作業です。実際、ガブリエル教授は10か国語くらいをマスターしていて、これまでの主要な哲学者の著書の多くを原典で読み解いたうえで自身の哲学を展開しているため、そう簡単に真似できる作業ではないでしょう。それにも関わらず、ガブリエル教授の主張は我々一般の社会人にとっても「けっこう分かりやすい」のが特長です。そんなこともあって、グーグルをはじめ昨今の企業倫理やガバナンス体制面で哲学・思想の重要性への認識が高まる中で、ガブリエル教授はグローバル大企業の哲学倫理顧問としていま引っ張りだこなのだそうです。

どうして哲学や倫理が営利追及組織の代表格でもあるグローバル資本企業において重要になりつつあるのか?これは簡単にいうと資本主義というのはお金や数字で眼に見えるものを資産・資本として追及する経済原理のため、短期的なバイアスがかかりやすく、50年・100年つづく企業にしてゆきたい大企業にとってそうしたお金や数字で測れない経営方針を見定める際に哲学や倫理を参考にせざるを得ないという事情があります。おっと、この話はまた記事を改めて書きたいと思います。閑話休題

「新実存主義」≒「条件主義」

さて、本記事は汎用人工知能の観点で「新実存主義」を読むという趣向なのでした。この観点でガブリエル教授が「新実存主義」の本の中で述べている重要な考え方があります。それは、「条件主義」というものです。

例えば我々の「感情」について脳科学的に研究するときよく行われるような、被験者の身体に計測装置をつないで脳波や血流といった物理的なデータを観測することにより、被験者の「主観的な経験(コト)」と計測装置の「物理的なデータ(モノ)」を対応づけるような実験は、どのように捉えたらよいだろうか?という問題があります。

この問題に対して「条件主義」は、「この脳科学の実験によって得られる『科学的な対応づけ』は実在の『必要条件』である」と回答するのです。

つまり、脳科学の実験は客観的で重要なデータであるからそれは「踏まえなければならないこと」だけど、それで「人間が経験するコト」を全てとらえきれるわけではないということです。

これは、上述した「モノとコトが同じグラデーションの中にある」という話と関連しています。繰り返しになりますが、我々人間が経験するコト、抱く感情、感じる印象、そうしたものは「物理的なモノ」と同じ土俵の上にあるのだけれども、とはいえ「物理的で客観的なモノ」で全て説明できるわけではなく、物理法則や実験事実は「尊重すべき条件」に過ぎないのだ、というのが「条件主義」なのです。

平たく言うと「科学は実在の必要条件だけど、十分条件ではない」、また別の言葉で言い換えるなら「実存の舞台は、宇宙だけじゃない」ってことです。こう書いてしまうと「実存の舞台」=「世界」のようなニュアンスになってしまうので、あんまり良い表現ではないかもしれませんが、まぁ大体そういうことです。

この「条件主義」は、とても「現代的なバランスのよい思想」だと私は感じます。

これまでの古典的な哲学は、現代の科学の進歩の前に考案されたものが多く、伝統的で権威のある哲学的思想だとしても、そのある一部では現代科学に照らすと疑問視されかねない部分があったりするので、科学的なことを「必要条件として重視する、ただし、科学が全てじゃないから十分条件とは考えない」というこの「条件主義」は科学の進歩のスピードの目まぐるしい現代にありながら、じっくりと哲学的に思想を創り上げる上でふさわしい態度であるように私は思います。

ではこの現代的なバランス感覚を備えた思想である「新実存主義」「条件主義」の観点で、我々が汎用人工知能の未来について抱いてるイメージ、期待、不安といったものはどのように捉えることができるのでしょうか?

次回の記事でその本題に入りたいと思います。

つづきは

記事を分けます。 前置きが長くなり一番の本題が後回しになるのは私のいつもの悪いクセなのですが、、もう少々お待ちを。

マティス展に行ってきた ~なぜ切り絵に至ったのか~

GPTの考察記事執筆、遅れに遅れちゃってますが、また少し脱線。

 

ゴールデンウィーク中、上野にある東京都美術館で開催されているマティス展を観に行ってきました。

 

マティスという画家のことは、名前だけ聞いたことがあって「切り絵の人だっけ?」というくらいの程度。*1

 

僕が美術展に行くのはほぼ専ら、巨匠ひとりをメインテーマに据える展示会のときばかりです。最近だと岡本太郎展ゲルハルトリヒター展がまさにそれで、それらの「ハズレが無い」感じがとても好き。*2

 

今回は、感銘を受けたテーマをいくつか書き並べていく形にしてみます。

 

絵画と輪郭

展示スペースに入ってまず目を惹かれたのはクッキリと黒ぶちの輪郭が多くの絵に描かれていることでした。

 

我々人間が、普段生活のなかで眼を通して周囲の環境や物を「視る」とき、輪郭というものは意識しません。そんなものは存在さえしていません。しかし視るのではなく絵を「描く」ときになると、なぜか輪郭なるものが描き手の意識に立ち上ってきます。

 

これはとても面白いことです。

 

小さな子供が絵をかくときも、まず輪郭から描き始めることが多いでしょう。そのくらい、絵画にとって輪郭というのは本質的なものだと言えます。幼児のその段階において、既に絵画制作は写実性の追求とは方向を異にすることが見て取れると言えます。

 

しかし僕は、今回マティスの絵をじっくり見るまで、「子供が輪郭を描くのは絵が下手だからだ」と思っていました。あるいは漫画やアニメのように「モチーフをデフォルメする表現が相応しいメディアに特有のテイストだ」と思っていました。

 

しかし、マティスは輪郭をハッキリとクッキリと描いていました。「それが絵画だから」と言わんばかりに。大人の画家が、人生を掛けて制作する作品に、本気で輪郭を描いていた。そして、マティスの絵をみていると、輪郭にも色んな役割が存在することが分かってきます。

 

  • 同系色の並びでオブジェクトの境目があいまいになりそうなとき、マティスはそこに輪郭を描きます。
  • モチーフを鑑賞者にどう印象付けるかをコントロールするため、例えばオブジェクトの前景と背景を際立たせるため、輪郭の太さを場所によって変える
  • 例え色彩的に補色の関係にある境界線上にも、輪郭を描くときがある(ひとつながりの輪郭によって切り取られるオブジェクトの主題性を強調したい場合)

マティスの絵を見るときの一つの楽しみ方として、そこに描かれた輪郭の部分部分に注目し、なぜそれがそう描かれてるのかを想像してみるというのは大いにアリだと思います。

 

モチーフではなく表現手段の追求

マティスという画家は、絵画とは何か?を深く考えた画家だったのだと思います。

 

例えば、印象派絵画の時代を代表するクロード・モネという巨匠がいますが、モネは絵画そのものというよりは光をどう捉えるかというモチーフのほうに大きな動機を感じさせます。

 

しかし、マティスの絵は何かモチーフを追求するというよりは、絵画とは何なのか。絵で何かを表現するとはどういうことなのか。そこにどんな可能性があって、その可能性の中で自分は何が出来るのか。そういったことをひたすら考えながら絵を描き続けたことが伺えます。点描画のようなものもあるし、キュビズムっぽい絵もあるし、抽象画に近づくような方向性も色濃い(特に後述する切り絵)。二次元では飽きたらず、3次元すなわち造形(粘土彫刻)作品も多数遺しています。

 

そして、それぞれの表現手段の要素、すなわち色や装飾(例えば模様とか)、形態といった要素を組み合わせることで絵画が制作されていくわけですが、その際に組み合わせ方によってそれぞれの要素の意味が変わるということをかなり模索しているように見える作品がとても多いです。ちょっと飛躍した言い方をすると絵の文法を模索していたのかもしれません。

 

例えば、部屋の中を描いた絵において、絨毯の装飾とテーブルの色の対比が、その絵全体の緊張度を支配するという組み合わせの効果をテーマとした作品がいくつもあります。

 

また、ゆったりとソファーに腰かけた貴婦人の姿を描くときに、表情をギリギリまで省略したり、着てる服の丸みや厚みを限りなくシンプルにしたり、そうした表現の冗長性を削ぎ落とすことで、もともと表現したかったその貴婦人が画家の視覚に与える情報を過不足なく表現しようと試みている絵があったりします。

 

画家の中にある主観的な動機を忠実に絵画に表そうとするその姿勢は、写実的モチーフから離れようとした先の印象派に通ずるものがありますが、その発展の方向性がキュビズム的な理性的なモチーフ化とは全く違っていて、フォービズム(野獣派)と呼ばれているそうです。

 

アンリ・マティスはそのフォービズムの代表画家と見なされているのだそうです。

 

フォービズムと切り絵

フォービズムの特徴の一つは、赤や黄色や青といった「色の3原色」がガンガン使われていることではないかと思います。

 

そうした原色はそれが文字通り「原」色であるゆえに、同じ赤でも赤を使う場所やそれを囲む輪郭や周囲に描かれた装飾や全体の構図などによって「その絵画に特有の意味を持った赤」が表現されることになります。これは、赤ではない何か別の色を使うことでは表現が出来ません。

 

原色は繰り返し我々の視覚の中で経験する色であるため、非常に主観性が強いです。原色から離れるほど、相対的に客観性が強まるともいえるかもしれません。例えば、エメラルドグリーンという色は「3原色」からは少し遠いですが、それはエメラルドのように珍しい宝石を象徴する色であり、我々の日常的な意識の中で常に経験する色というには希少すぎます。だから、青や緑と比べるとエメラルドグリーンはより客観性を帯びています。こうしたことが、フォービズムにおいて3原色が多用される理由ではないかと思います。

 

さて、色についてはその3原色が持つ多義性を追求するというテーマがあるわけですが、形態についてはどうでしょうか?

 

丸みを帯びた曲線、まっすぐ引かれた線、それらの太さ細さ。それは輪郭として絵の中で背景からオブジェクトを切り出します。完全に写実的な世界では輪郭は存在しないのでした。いや存在しないというより「写実的とは、輪郭がとても複雑だということだ」と言った方がより適切かもしれません。したがって、輪郭とはなんらかの形態をデフォルメして単純化することで絵画の中でオブジェクトの視認性を強めることで前景化する機能をもった絵画表現要素だと言えましょう。

 

そうすると、輪郭を描くことの本質とは「表現したい情報を過不足なく伝えるのにちょうどいい複雑度(単純度)を持った形態」を表現することであると言えるでしょう。

 

ここまで来ると、フォービズムから切り絵までの絵画思想がひとつながりのものとして理解できます。*3

 

切り絵にすることで、輪郭と配色と装飾性とを同時に模索することが出来ます。ここまでくると、マティス独自芸術の宇宙とも言えそうです。マティスの切り絵作品は単純にインテリアとしても大変魅力があります。芸術的な試みが極まって、我々の日常生活になじむ魅力的なアート作品が展開されるまでに至ったことは、幸運な偶然のいたずらともいえるかもしれません。

 

というわけで

マティスの絵やフォービズムに対する素朴な見方、それと、どうして切り絵なのか?に対する自分なりの解釈を書いてみました。

 

ではまた!(GPTシリーズ必ず書きますのでお待ちを…)

*1:それでもこの展示会に行こうと思ったのは、今年の2月に所用で銀座SIXの蔦屋書店に行ったときに偶然開催されたた美術書の在庫セール(?)でふと目にしたマティスの画集に感銘を受けて、興味を持ったからでした。

*2:今回のマティス展も大満足でした。美術展って入場料2000円くらいとそれなりのお値段するので、モトをとるにはじっくり味わう必要がある

*3:これは私個人の素人の独自解釈です。もしかしたら似たような話がどこかの美術書に書いてあるのかもしれませんが、そうでなくてもそれなりにつじつまのあった話だと思います。美術館の中でマティスの絵を見ながら、切り絵に至った理由を自分なりに考えた結果を本ブログで書いているという次第です。

LLMに知識ベースを統合するのは簡単

本ブログ、GPT考察シリーズの途中ですが番外編を適宜挟んでいきたいと思います。

(特に意味はないOGP画像)

愛すべき嘘つき

ChatGPTを使ってると、現実には存在しないものやことをあたかも真実であるかのように語る幻覚(hallucination)の問題に良く出くわしますよね。

そんな店は実在しない…笑

なぜそうなるのか?

 

それは統計モデルだから

よく言われるのは、GPTは「統計モデル」だから「確率が高いであろう単語」を順番に出していくというチャットシステムなので、「実在するお店の名前」をそのまま固有名詞として知識として憶えるのではなく、単語に分解して統計を取ってしまうので知識として憶えるのが苦手、ということです。

 

ちなみに「風が吹けば桶屋が儲かる」という有名な話も、その長い3段論法のつながりを覚えるのは苦手みたいで、聞いても変な答えを返してきたりします。*1

 

知識ベースをつなぎ込みたい

そこで、ちゃんと事実の裏付けや真実性の裏打ちが取れている情報だけを蓄積した「知識ベース」を別途用意して、それとシステム連携させて幻覚の問題を回避/緩和する方法が考えられます。

 

具体的に、どうしたら良いでしょうか?ChatGPTに質問するといくつか方法を提案してくれました。その中で有力だと思われる2つを挙げてみます(内容は本記事のために私が説明しなおしてます)。

  • 知識ベースへのクエリ生成: 知識ベースの検索機能が備える検索条件を細かく指定する機能をユーザが覚えるのは大変なので、それをChatGPTが肩代わりする。また、検索結果が選択肢として複数あるときに、文脈からどれが相応しいかをChatGPTに判断させることも出来る。これは、知識ベースがメインでChatGPTがそのフロントエンドとしてサブシステムをつとめるイメージ。
  • エンティティリンキング: ユーザとのチャットのなかで、知識を参照すべきタイミングで知識ベースを検索し得られた結果を(チャットスレッドの裏で)ChatGPTに与える。ChatGPTがメインシステムで、知識ベースはサブシステム。チャットロボットは「なんでも知ってるよ?」という顔をしておいて、いざユーザから質問が来てから知識ベースを調べ、カンペを見ながら答えるようなイメージ。

本格的なのは後者のエンティティリンキングの方でしょう。GPTは「トークン列を受け取って次の単語を出す(詳細説明はこちらの記事)」仕組みで動いてるので、ユーザから何かを言われたら知識ベースを引いてその結果をトークンに付け加えちゃえばいいわけです。さしずめ「後出しじゃんけんカンニングペーパー」ですね。

 

ビジネスでの利用シーン

最近発表された ChatGPT plugins は、そのエンティティリンキングのような仕組みで作られたものが結構あるんじゃないでしょうか? 

予約まで出来ちゃうのスゴいですね

また例えば、企業がビジネスでChatGPTを使う際に、その企業固有の知識やプロジェクトごとのステータスを前提情報として知ってる必要があるときに、チャットの流れの中でそうした情報を随時引っ張って裏でChatGPTにカンニングさせることで、よりその企業のニーズに適したアウトプットを出してくれる可能性が高まるでしょう。

 

というわけで

幻覚を回避して、より有用にする知識ベースとの簡単な統合方法について述べました。


ではまた。(次の記事はGPTの考察シリーズ(2.2)を公開予定です)

*1:このことをツイッターでリプライしたら、「3段論法の途中、視覚障碍者が三味線演奏者になると決めつけてる箇所が、差別的な考え方に相当するのでもともと学習データから除外されてるのでは」と指摘を返された方がいました。確かに、その可能性も十分にありえますね!

GPTの仕組みと限界についての考察(2.1)

全3回のシリーズパート2の本記事では、GPTの能力と可能性をAttention/Transformerの仕組みをふまえて考察します。

というつもりでしたが、凄く長くなってしまったのでパート2は以下の3回に分けようと思います。

(2.1)各技術の定性的な説明(本記事)

(2.2)Transformerのアルゴリズム詳細

(2.3)GPTの能力と可能性について

2.1 各技術の定性的な説明

自然言語の構造を考えてみる

まず我々が使う言語についてちょっと振り返るところから話を始めましょう。

文や文章は、おおもとのデータである文字から始まって、単語、文節、句、節、文、文章、さらにその上の意味、という風に階層的な構造を持っていると我々は概念的に認識してますよね。

構文の階層

そして、各階層や階層間には、文法や語法といった言葉のルールがあります。

深層学習はその名の通り、層を深くしたニューラルネットワークなので、文法や意味が織りなす各階層を深層学習の各レイヤー(=層)に対応させるのは自然な発想ですよね。

 

その意味でTransformerは凄く自然な形をしたアルゴリズムです。このレイヤー・層の1個分がTransformer1段に相当すると、ひとまず認識しておけば、まずは差し支えないです(そう認識してしまうとどう差し支えて、じゃあ正確にはどう認識すればよいかは本記事を読み進めれば分かります)。

 

さっそくTransformer登場

Transformerの解説記事を読んだことのある人ならたぶん1億回くらい見たことのある下の図を見てみましょう。(Transformerの原典「Attention Is All You Need」から転載)

N個のTransformerが積まれた図

 

この図は、左下のInputsからトークン列が入力されて、(EmbeddingやEncodingは次回の記事で説明するのでいったん無視して)、Nxと書いてあるところがTransformerがN個垂直に積み重なって文脈をエンコードしていくという意味です。それでN個のTransformerを経て「文脈」情報が左半分のてっぺんで得られます。それを右半分のデコーダに渡しますが、右半分もN個のTransformerが垂直に積み重なった形をしています。

Transformerの灰色のボックスの中に入れ子で入ってるボックスがいくつかありますが、それらは次回に説明するので、今回は大枠を見ていきましょう。

 

さて、右半分はOutputから矢印の向きが「入力」されています。不思議に思われるかもしれませんが、これは機械学習の「生成モデル」ではよくある形で、「既に生成済みの出力」も入力に加えるという仕組みです。

右半分のてっぺんでは「Outputの確率」(Output probability)と記載があります。これは具体的には「次にどの単語を出力すべきかを、確率として出力する」というものです。単語の種類数は辞書に存在する単語数と同じです。例えば、辞書に7万種類の単語があれば、その7万個の項目それぞれに対して確率が付与されたものが出力となります。

 

生成モデルとデータサンプリング

右下の「Outputs」として、右上のてっぺんで算出される確率が最大になるような単語を選ぶとします。すると、入力テキストから出力テキストを得る「テキスト→テキスト」の問題を解くことが可能になります。

その「テキスト→テキスト」が出来れば、「対話システム」や「翻訳システム」は作れそうですよね。

イメージ的には、入力テキスト(文字列)から層を何段階か経て「意味情報が含まれた『文脈』」へと情報を「エンコード」して行き(これが図の左半分)、そのあと折り返して今度は「文脈」から出発して層を何段階か経ることで情報を「デコード」して(これが図の右半分)最終的に出力テキストを得る、という感じです。

 

ここからデータを出力する作業は、いってみれば方程式を立てて、その方程式解くのと似てます。生成モデルを使って何かデータを生成するというのは、だいたいそんなイメージになります。

詳しい方法は例えば以下のような記事を読んでみてください。

huggingface.co

方程式を解くのとちょっと違うのは、確率モデルなので、確率が最大じゃないケースのデータも「サンプリング」して得ることも出来たりすることです。方程式とちがって「解ごとに尤(もっと)もらしさ」がつきます。言い換えると、いちばん尤もらしい解以外にも、それなりに尤もらしい解は色々とあるはずなので、そういうのをサンプリング(出力)できるわけです。

 

例えばChatGPTではブラウザの「リロードマーク」みたいな「Re-generate(再生成)」ボタンがついてて、それを押すと別の回答を出したりできますよね。

なおそう説明してしまったところであれですが、GPTの場合は「テキスト→テキスト」ではなく「テキスト→単語」なので本当は違います。これについてはだいぶ後で述べたいと思っていて、いったんはこのまましばらく話を進めます。

 

Attention = Transformerの入出力

さて、続いてAttentionですが、ズバリ、Transformerの入出力がAttentionになります。先の図でいうと、灰色で囲まれたブロックがTransformerでしたが、その前後にある1本の線を流れるのがAttentionという形式のデータです。なので、左上で「エンコード結果」として出てくる「文脈」情報は、具体的な形式としてはAttentionになります。

前回の記事の「『文脈』は、ひとかたまりの情報に圧縮とかしない」という話を思い出してください。

データの流れとしては図からも分かる通り、「トークン列→Attention→Attention→…→Attention(エンコード結果)=『文脈情報』」という形になります。その際に各層間で受け渡されるAttentionのサイズは変わらないのです。なので、最終的なエンコード結果の「文脈情報」のデータサイズも最初のトークン列と同じ規模になります。これが、「圧縮とかそういう感じじゃなくて、トークン列を『まるっと同時に』扱ってる」という意味です。*1

Attentionのイメージ

Attentionの具体的な中身については次回の(2.2)で述べますが、大まかにいうと上図のように「各トークン(=各単語)を、それぞれ意味を表す数値ベクトルで表現したもの」になります。だから何か1塊の圧縮された情報表現が採用されてるわけではなく、トークンごとに数値ベクトルがあるという、ただそれだけのデータがAttentionです。

 

主辞(Head)という概念について

さて、ここでTransformer/Attentionについて理解を深める上で重要な主辞(しゅじ、Head: ヘッド)という概念にふれておきたいと思います。

ちょっと例を挙げましょう。

「栗山監督の率いる日本代表チームは、スーパーヒーロー大谷選手を始めとするチームメンバーの大活躍のおかげでWBCにおいて3度目の優勝を果たした。」

という文があったとします。

これの意味をコンピュータ上にデータとして表現したいわけですが、ひとまずこの文をシンプルに

「チームは優勝を果たした」

としてしまいます。これが元の文の骨格であることは確かですよね。とりあえず、この骨格において「チーム(は)」「優勝(を)」「果たし(た)」をそれぞれ「主辞」とみなし、主辞が3つあるので3つのデータレコードを作りましょう。

それ以外は単なる「飾り(修飾語句)」に過ぎません。じゃあ、その飾りをどうやって付けていくかですが、「栗山監督が率いる」や「日本代表」は「チーム」に係ってるので、「チーム」を表すデータの下にそれぞれを「おまけみたいな感じ」で付け加えておけばよさそうです。同様に、「優勝」には「3度目」っていうのを「意味のおまけ」として付けとけばいいでしょう。

最後の「果たした」については、残りの修飾語句との関係はありますが、「大谷選手」も「大活躍」も「WBC」も、「果たした」に直接付け加える語句としては微妙に違う感じがします。なぜならそれらは「優勝を果たした」に対する修飾語句だからです。

そこで先にやっておく処理として「優勝を」を「果たした」の下に付けわえておくことにします。こうすれば、「果たした」だけで付加情報をあわせれば「優勝を果たした」を意味するので、残りの「大活躍のおかげ」とかいった修飾語句も「果たした」に直接付けちゃっても意味がちゃんと表せそうですよね。

つまり、同じ主辞におまけをつけるにしても、「おまけ同士が対等ではなく、優劣や主従関係がついてることがあっても良い」のです。「果たし(た)」という主辞にとって「一番大事なおまけ」が「優勝(を)」という(他動詞「果たす」の)目的語なわけです。

 

ちょっと込み入ってきたので主辞についてより正確に説明するために次節へ進みましょう。

 

主辞駆動句構造文法

前節で述べたような、文法的な階層構造を表現する手段として、「文の一部(=句)において、代表となる語」に付加情報として修飾語句の情報を加えていき(空きスロットに値を埋めていく)、そしてそれを再帰的に入れ子にしていく、という感じで「主語と述語をリッチにしていくことで意味を表していく」ような方法があり、主辞駆動句構造文法と呼ばれています。

このときの文の各部分の句における「代表となる語」のことを「主辞(Head)」と呼びます。主辞は前節で述べたような「文のおおもとの骨格」だけでなく、修飾語句の中にも主辞を設けます。なので文法の構文階層の最下層である単語のレベルから主辞用のデータレコードをそれぞれ用意しておきます。

構文解析が進んで下図のように単語のまとまり(すなわち、句)が出来上がってくると、それぞれの句の中の代表語が主辞となってそれ以外の修飾語句は主辞のデータレコードのスロットに埋め込まれます。

主辞駆動句構造文法

上図はwikipediaからの転載です。繰り返しになりますが、各単語にスロットがあり、修飾語句は被修飾語句となる主辞のスロット(これが大事!)に自身を指し示す情報(インデクスやポインタ)を埋め込むことで、階層的に文の意味を表現します。

こうすれば、階層構造が何段階も高層ビルのように高くなっても、どの階層にも「主辞」が必ず存在するように文法を定義しておけば、上のように(それがたとえ高層ビル的な複雑なものだとしても)文全体の意味をちゃんと表現できますよね。

さて、この主辞と呼ばれるデータ構造、あたかもデータベースのレコードに設けられたスロットに値を埋めていくように用いるこの構造のことを「素性構造(そせいこうぞう)」と呼びます。詳しくは述べませんが、上図のように意味を記号的なデータとして表現する際のデータ構造だと思ってください。

 

素性構造とAttentionの類似性

さて、なんとなく話が見えて来たでしょうか?「Attentionが各トークンをそれぞれ数値ベクトルで表しただけのデータだったこと」と、この「素性構造」というデータ構造が話としてつながることが想像できますでしょうか?

上図の素性構造において、解析の「出発点となる一番下の各単語に主辞としてのデータレコードをそれぞれ用意」しておくという話と、上述した「トークン列や、その直後のAttention」という話とが凄く似てると思いませんか?

 

「文脈情報」が「一塊の圧縮された何らかの数値とかデータ」とかじゃななくて、Attentionという「トークンごとに数値ベクトルがついたものが、トークンの長さぶん並んだデータ」として表現されているときに、その数値ベクトルたちの中身が実際のところ何を表現しているのかをこの素性構造の仕組みから類推してイメージ出来ますでしょうか?

次節でさらに詳しく考察してゆきましょう。

 

深層学習というパラダイムシフト:記号 → 数値

主辞を使った構文解析や意味解析は、深層学習がブームになるより前の時代から、自然言語処理において長らく研究が続けられてきました。その手法では先のwikipediaの図(ツリー状の構文解析木)を見ても分かる通り、データは「記号的」です。

ツリーの一番下の階層では単語の意味を(あらかじめ用意した)辞書から拾ってきて、その意味のあいまいさもスロットを複数用意して選択肢を全て埋めておき、文の解析が進むにつれて曖昧さが解消されて意味が確定した時には他の選択肢がスロットから消去されて正しい意味だけが残るようにする、というプログラムを作ろうとしてきたわけです。

また、文法も人間の手でプログラムしなくてはなりません。辞書と文法を与えなければいけないので非常に大変です。これが記号的にやるデメリットといえるでしょう。*2

 

深層学習というパラダイムシフトは、そうした記号的なデータやそれを扱うプログラミングをせずとも、分析したい対象を全て数値として表現し大量のデータからの学習でシステム全体が何とかうまく動くようにする、というものですよね。*3

しかしそれで、辞書や文法を用意せずに済み、さらに単語や句の意味の曖昧さの解決、照応解析(指示語や代名詞が指し示す先の同定)といった手でプログラミングしたらめっちゃ複雑になりそうなことを全部自動で学習できちゃうのは本当に驚異的なことです。

 

Attentionが表す数値ベクトル(の列)の内容

Attentionは、トークン内の各単語をそれぞれ数値ベクトルで表します。これは私の個人的な解釈になりますが、その「各トークンが持つ数値ベクトル」はちょうど「素性構造において各単語が(自身のスロットを率いて)持つ情報」のようなものに相当するとみなせると考えています。素人の独自解釈とはいえ、ちゃんと根拠があります。

実は(後述しますが)Transformerの構成要素に、「Multi-Head Attention」と名付けられたパーツがあります。これは英語においてHead(=主辞)という同じ単語を使っていることから、英語としてニュアンスを共有していると筆者の独自解釈ではありますが、そう捉えています。ゆえに、素性構造とAttentionの間に類似性を見出すことで、直感的にイメージしようというのが、本「考察」記事の主眼であります。

また、Transformerを多段に積んで文(というかトークン列)を解析していくなかで各段のTransformerを通じてAttentionがどのように変わっていくかというふるまいについても、「被修飾語句の主辞であるトークン」の数値ベクトルに対して「修飾語句の主辞であるトークン」が持っていたベクトルを数値として加えていくように計算が進むことがTransformerの論文やさまざまなTransformer/Attention解説記事の中で示されています。

 

例えば「日本代表チーム」という句であれば、「チーム」というトークンがこの句全体の主辞となる数値ベクトルを担当し、「日本代表」はその修飾語句として「代表」が主辞なので、「チーム」の数値ベクトルに「(日本)代表」の数値ベクトルを(何らかの計算で)加えることで「チーム」に「日本代表」という「意味合い」が加わった意味が最終的なAttentionの中の「チーム」というトークンが占めていた位置に対応する数値ベクトルが表現するものとなります。このとき、途中の「日本」は「代表」を既に修飾済み、すなわち、より前のTransformerの計算で数値ベクトルとして既に加え済みということになりますね。

 

ちょっと脱線して軽く考察

さて、このようなふるまいをするとなるとTransformerによってAttentionの解析が進むにつれて、主辞のところに意味的な情報が集約されていきそうな気がします。となると割と途中段階のAttention=数値ベクトルの列は、主辞を担当するトークンが居た位置だけ情報が充実してスパース(データが疎)になってしまうのでしょうか?

それとも、修飾語句は途中まではなるべく情報を「温存」しておいて、Transformerの段数の最後のほうで一斉にわーっと「修飾先」に足し込むのでしょうか?

それとも構文や意味の階層構造の高さに応じて柔軟にふるまってくれるのでしょうか?

このあたりは、深層学習の中身のパラメータがどのように得られるか次第なので何とも予測が難しいところですが、想像するのも楽しいところではあります。*4

個人的には、エンコーダの出力として得られる「文脈情報」を表すAttentionは、入力トークン列全体の「主辞」(それはもちろん一つとは限りませんが)のトークン位置にほとんどの情報が埋め込まれたスパースな感じになりそうな予感があるのですが、果たしてこの予感は正しいでしょうか?

私は分かりません。Transformerに実際のデータを食わせたときのAttentionの振る舞いに詳しい方に是非お聞きしたいところです。*5

 

数値ベクトル=ブラックボックス

そういうわけでとにかく、Transformerを使ってAttentionの解析が進んでいくと、だんだんと各「主辞」の数値ベクトルに「修飾語句」が持っていた数値ベクトルが数値的に加味されてゆき、それによって文法構造の解析が可能であろうことは確かに納得できます。

しかしAttentionは旧来の主辞駆動句構造文法のような記号的な手法と違ってブラックボックスになりがちに思えます。なんてったってEnd-to-Endの深層学習モデルですから。解析途中の数値ベクトルの中身を覗き見て本当にそうした語句の修飾関係がちゃんと表現されてるかを検証するのは簡単ではなさそうに思います。が、Transformerの原論文「Attention Is All You Need」では、中身を調べたらそれがちゃんと表現されていたことが報告されています!

 

下の3つの図はTransformerの原典「Attention Is All You Need」からの転載です。*6

エンコーダの出力手前付近のAttentionにおける長距離間の修飾関係

Self-Attention(後述)における照応の可視化

構文階層が主辞の情報にちゃんと埋め込まれている

いずれの図も、主辞のところに修飾語句の情報や、照応先(指示語や代名詞の具体的な内容の参照先)の情報が埋め込まれてますね。*7

また、この論文ではこれらの図のキャプションに、「Headに情報が入ってるぜ」という言い方をしています。論文を書いた研究者たちが主辞駆動句構造文法との類比を意識していたかどうかはわかりませんが、少なくとも筆者たちは主辞や素性構造という「深層学習以前の自然言語処理」をもよく理解している人たちであることは間違いないでしょう。


上の図は2017年の論文に掲載されている図で、それをみているだけでも結構凄くみえますが、10歩くらいゆずって文法構造の解析は確かに出来ても不思議ではないという人もいるかもしれません。

 

GPTにおけるTransformerの段数

しかし今や、GPTレベルまで言語モデルが大規模化した結果、構文・文法だけでなく、さらに意味の解析までも出来てしまったというのは本当に驚きです。この2017年の論文ではTransformerの段数は6段で、GPT-3は96段です。単純計算で16倍ですね。ChatGPTを見ていると人間が見ても一定レベルの意味をちゃんと理解してると思える応答をします。

主辞を使って数値ベクトルで修飾関係を表現するという、どちらかというと文法や構文の解析を目的としてるだけに見えてしまう方法だけで、それをとにかく何階層も繰り返して解析していくと意味レベルまで到達してしまった。文法を解析するのとおんなじ仕組みを高く積み上げていったら意味まで届いてしまった。マジで凄い。まさに量質転換ですね。

Transformerはどうしてそんなに上手にAttentionをはじき出すことが出来るのでしょうか?それは次回の記事でTransformerのアルゴリズムの詳細を見ながら考察したいと思います。

ちょっと余談ですが「主辞」といった旧来の自然言語処理技術の背景を踏まえると原典の「Attention Is All You Need」という論文タイトルは、「これだけで全部いけるんだぜ」という今のGPTまでのポテンシャルを2017年の時点で予見していたような気もして、非常に言い得て妙な論文タイトルですね。*8

 

GPTは自己回帰モデル(テキスト→次の単語)

さて、ここへ来てだいぶ話を戻しますが、冒頭で述べた例は「テキストを入力してテキストを出力」するというものでした。

実際にはGPTの場合は少し違っていて、「テキストを入力すると次の単語を出力」する、より厳密に言うと「トークン列を入力すると次のトークンを出力する」モデルになります。

これを対話システムとして用いるには、文の区切りだけでなく、対話の発言の区切りをも特別な記号として用意しておいて、GPTが自分で発言している途中のトークン列も、次の単語を出力するための入力トークンとして使えばよいですね。

 

例えば、トークン長が1000トークンだとして、ChatGPTが

Yes, I do.

という返事をしたら、「Yes」「,」「I」「Do」「.」「(発言終わり)」

という6つのトークンを出力したことになりますが、

1. 直前の1000トークンを見て「Yes」を出す

2. 直前の999トークン+「Yes」を見て「,」を出す

6. 直前の995トークン+「Yes」「,」「I」「Do」「.」を見て「(発言終わり)」を出す

という風に、1000トークンを処理する動作を6回やることになります。

 

GPTの実際の構造

WikipediaのGPTのページに図があるので転載します。

オリジナルのGPTの構造(GPT-1かな?)

この図を見てわかる通り、矢印は上向きなのでエンコーダともデコーダとも取れますが、実際に「トークン列→次の単語」として使いたいときは、デコーダ(冒頭に掲載したTransformerの図の右半分)として使えばよいですね。つまり、「生成モデル」からサンプリングする、という先に述べた方法を使えばよいわけです。

このGPTのTransformerの図をみると、エンコーダとデコーダという風に分かれていないところが特徴と言えます。入力と出力のペアを用意しておかなくても、いわば入力データだけあれば、次節で説明する「マスキング」を使って学習させることで自己回帰モデルを作ることができます。つまり、「教師なし学習」が可能になります。

そして、Transformrの段数を非常に多く積み上げることでLLMを構成します。GPT-3の場合は96段なのでした。そしてトークン長を長くとるためには、一つのTransformerが持つ学習パラメータの数もそれだけ多く必要になります。

これはまさにモンスター級の計算機パワーでぶんなぐる感じですね。

 

GPTとBERT: マスクの付け方の違い

GPTとは別の(Transformerベースの)代表的な深層学習言語モデルに、BERTというのがあります。これは、GPTと同様に「テキスト → 単語」という形式のモデルではあるのですが、出力したい単語が「テキスト → 次の単語」ではなく、「テキスト → 途中の単語」というモデルです。つまり、「出力した単語のあと」も考慮するモデルです。

前後の単語を考慮する分、GPTと比べると学習データが少なく済んだり、言語モデルの大きさも同じ性能でコンパクトに出来たりするそうです。これはこれで、例えば穴埋め問題とか、大規模データの検索システムで問い合わせに対してふさわしいデータを特定したりとか、自然言語処理の色んなタスクに応用が利くモデルではあります。

GPTとBERTは学習のさせ方がちょっと違います。GPTの場合は、出力した単語よりも後の情報を使うのはご法度です。なのでデータを学習する際に、マスキングテープみたいな感じで出力対象の単語以降の単語を「マスク(口封じ)」して見ないようにします。BERTの場合は、対称の単語だけをマスクします。そうやって、トークン長ぶんのデータを用意してガサっと学習に掛けるのはどちらも一緒です。

BERTは「途中の単語」を出すモデルなので、当然「次の単語」も出そうと思えば出せるはずです。それならGPTよりBERTのほうが汎用的で強そうに見えませんか?

しかしGPTは「次の単語」を出すというだけのモデルに特化しました。それはなぜでしょうか?次節以降で述べます。

 

GPTが注目される理由1:zero/few-shot プロンプトによる利便性

GPTが「次の単語を出す」というタスクに特化したせいで、プロンプトを与えることでふるまいをその場で容易にカスタマイズできるという利便性が生まれました。これが、BERTが持つ「どんな位置の単語でも出せる」という汎用性がもたらすベネフィットを大幅に上回ったのだと思います。

few-shotプロンプトは、本記事の読者のあなたならきっとよく知ってるor耳にしたことがあるでしょう。ChatGPTに、実例を少数与えるだけで、意図をくみ取って以降のやりとりをそれに合わせたものに変えることができるという能力です。

また、zero-shotプロンプトは、例えば「あなたは医者です」のように役割を与えたり(role prompting)、一つずつ順を追って答えてくださいと(step-by-step prompting)釘を刺したり、といったメタ的な指令をすることで実例を一つも与えなくてもパフォーマンスが大きく改善されることです。

 

詳しいことは次々回の記事(2.3)で述べる予定ですが、軽くこの仕組みがうまくいく理由を述べると、

・role-promptingはもともとGPTが持っている汎用性から文脈を切り出すことで、話題を狭くフォーカスできるので性能があがる

・step-by-step promptingは、GPTがそれ自体の仕組みとしては1時記憶/短期記憶を持たないため、途中の思考過程をいわば「カンニングペーパー」に書き起こさせることで、直前のトークンを「短期記憶の代わりにカンペ」を見れるようになり性能が大幅に改善する

というものになります。

 

GPTが注目される理由2:「教師なし」大規模事前学習の有効性

そうしたLLMの汎用的な能力を可能とするのが、主に「教師なし」学習のおかげで莫大なデータを超大規模LLMに食わせることができる点です。GPT-3の学習データがWikipediaに載っていたので下表に転載します。

GPT-3の学習データ(Wikipediaより)

Wikipedia全体もかなりの量の情報があると思いますが、それが全体のわずか3%とのことで、なかなかの大規模データですね。これだけの量ともなると人間の手でデータを作りこまなければいけない「教師あり学習」は困難でしょう。

教師なし学習で大量のデータを与えて、それをバッチリ理解しきる超大規模言語モデルと莫大な資金を投じて大量の計算機リソースをぶんまわす、それがGPTの研究チームが採用した戦略ですね。

 

GPTにおける日本語と英語の違い:トークンの切り出し方

前回の記事に対して、はてブのコメントでこれについて疑問を書いてくださった方が居ましたので軽くふれておきます。

ChatGPTを使ってみると、日本語と英語で、内容的に同じ意味のテキストを投入しても、結果が異なっていることが結構あります。

これは、トークンの切り出し方の違いになります。英語では単語(句読点やクオートなどの記号)単位でトークンが切り出されますが、日本語の場合は文字単位になります。特に漢字は2トークンとしてカウントされるようです。*9

トークンが単語よりも細かい文字のレベルなので、それを単語のレベルまで引き上げるのには、最初に入力データとして単語列から出発する場合と比べて、余分に解析を必要とします。Transformerの段数はGPT-3では96とのことでしたが、日本語だとトークンが文字なので、入力データであるトークン列に近い浅い層でのTransrformerは、文字から単語を認識するのに「消費」されてしまいます。英語の場合は、トークンは単語です。

したがって、英語と日本語で、意味としては同じ内容の言葉をChatGPTに与えた場合、英語のほうがクオリティは基本的には高くなります。私の勤務先の会社の同僚は、日本語をいったんdeepLなどの翻訳システムで英語に翻訳してからChatGPTに食わせて、英語で返ってきた言葉をまた日本語に戻す、というツールを自分で作って使っているそうですが、これはGPTというかTransformerの仕組みを考えればと非常に理に適っているといえます。

 

GPT(やLLM)における3つのカスタマイズレベル

GPTを始めとするLLM(Large Language Model: 大規模言語モデル)では、「作り込み」や「カスタマイズ」の深さに大きく分けて3段階のレベルがあります。

 

レベル1「プロンプトを与えておく(Prompting)」

レベル2「追加学習/ファインチューニング(fine-tuning)」

レベル3「ゼロから学習/スクラッチ開発(scratch development)」

 

この3つを混同しないことは非常に大切です。最近、政府や国会で議論されている国産LLMはレベル3を指していますし、GPTからChatGPTを作ったプロセスはレベル2です。

そして、最近大流行のプロンプトエンジニアリングはレベル1ですね。

 

というわけで

ここまでで、各技術の定性的な説明を終えます。

(2.2)「Transformerのアルゴリズム詳細」へ続きます。

*1:もちろんTransformerのバリエーションとして、モデルによってはトークン列よりもサイズを縮小させるものもあるにはあります

*2:逆に計算や解析の途中の状況が人間にとって解釈しやすいというメリットもありますね

*3:深層学習が隆盛を迎える何年も前から、主辞駆動句構造解析という記号的な手法に統計的な機械学習を融合しようとする研究もおこなわれていました。私が大学院修士の時の研究室のテーマの一つがそれでした。(私自身は別の研究テーマでした)

*4:もし前者のようにスパースになるのだとしたら、情報が詰まってるところだけを取りまわすようにすれば計算資源(メモリとかプロセッサ)を節約できるかもしれませんね。そういうテーマで論文をサーベイしてみるのも面白いかもしません。

*5:こう書くと、全然手を動かさず読んだり見聞きしたりしただけで本記事を書いてることがバレますね。はい、そうです。

*6:ちなみにこれは2017年の論文ですが、当時この研究成果はそれまでの自然言語処理システムのパフォーマンスを大幅に塗り替えたそうです。それも、自然言語処理には「対話」とか「要約」とか「知識検索」とか「機械翻訳」とかとか色んなタスクがありますが、様々なタスクにおいて圧倒的な性能を「汎用」的な一つの仕組みで叩き出したという点が驚異的です。まさにブレークスルーですね。

*7:これらの図がどうやって作られたかは論文にはあまり詳しくは書かれていませんでしたが、でっち上げではないことは確かですね。

*8:そのTransformerの研究論文を公に出したグーグルは、その後OpenAIのGPTによってTransformerがGPTへと洗練/昇華され、今やメインビジネスで将来が危ぶまれるまでになっちゃってるのだから皮肉なものです。

*9:これはChatGPT APIの課金体系としてそうなってはいますが、ChatGPTで日本語を使ったときに内部で漢字1文字がトークン2つ分のデータ長を持っているのかどうかは私は知りません。