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つ分のデータ長を持っているのかどうかは私は知りません。

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

GPT4が登場してChatGPTが盛り上がってますね。

本記事は、GPT(を支えるTransformerという仕組み)をChatGPTユーザにとって分かりやすく説明し、その能力と限界についての見通しをよくしよう、という趣旨になります。

 

少し長くなりそうなので、全部で記事を3回に分けようと思います。

 

(1)大まかな背景と概要:本記事

(2)GPTの能力と可能性:実際の使用例とTransformerの仕組みを踏まえて説明

(3)GPTの限界と未来展望:Transformerの仕組みが持つ限界と研究の進展を予想

 

GPT3と4の違い: トークン長とは何か?

まずここから話を始めます。GPT-3は、パラメータ数が750億個(850GBの容量を食う)でトークン長が4097(GPT-3.5)でした。GPT-4は、パラメータ数は非公開でトークン長は32768ですので、ちょうど8倍になります。

さて、トークン長とはいったい何なのでしょう?これは平たく言うと「GPTが文脈を意識できる過去の単語数」です。

例えば、ChatGPTに何か言葉を投げかけると返事を返してくれますが、このときに「文脈」としてそれ以前の単語を参照します。トークン長が4097でしたら、4097個前の単語までを参照しながら、返事を生成します。

逆に言うと、これが非常に大事なことですが、トークン長を超えるような過去の単語は参照しないということです。だから、何か新しいことを教えて、それを踏まえたふるまいをChatGPTにさせたいとしても、32768単語以内で教える必要があるし、さらに教えたことを応用してチャットを進めて行った末に32768のトークン長をオーバーしてしまったら、せっかく教えた内容を忘れてしま(というか正確に言うと参照しなくなってしま)います。

 

ここが凄く直観に反するところかもしれません。GPTは何か「文脈」のような抽象的な一塊の「記憶」をもって動作しているわけではないのです。

そうではなく、直前の「トークン長ぶんの単語」を「まるっと」参照したうえで、次の単語を計算して出す、というのをひたすら繰り返すシステムなのです。


何故そんな単純な仕組みであんなに賢いのか

人間でも、会話していて脊髄反射のような「考えてない」受け答えをする人ってたまにいませんか?また、普段はちゃんと考えて会話をする人でも、疲れてくると「相手が言ったこと」に対して「あるあるな返事」でお茶を濁すことってよくありませんか?

つまり、パターンに対して、パターンを返すような会話です。

GPTは、いわば、そのおざなりな返事を「すご~く長いトークン長を踏まえ」て、パターンの抽象度も「コンピュータの計算パワーの暴力で飛躍的に高め」て、言葉を紡いでいけるので、脊髄反射な返答をしているだけなのにも関わらず、かなり賢くみえるのです。

 

ではどう賢くて、どう馬鹿なのか。それを原理的に理解するためにはやはりGPTを支えるTransformer及びその根幹となるAttentionの仕組みをざっくり把握するのが良いと思います。本シリーズではめっちゃ(何なら文系の人でも)わかりやすく説明するのでご期待ください。


歴史的経緯

歴史的経緯としては、「記憶」をもって動作する仕組み(リカレントネットワーク)が良く研究されていたのですが、それだと(A)「凄く前に言われたことが文脈を強く決定づける」みたいなケースに対応するのが難しく、また(B)記憶を通じて順番に計算していく必要があるためにコンピュータの力を引き出す上で重要な「並列化」が難しい、というAとBの課題が相互に悪影響を与えあってて研究が進みづらい状況にあったのだと思います。

そこで、「記憶」みたいな情報のパッケージングというか圧縮というかそういうことをせずに、単にずっと前の単語も「そのまんま加味」してあげる機械学習モデルにする方法(アテンション機構およびそれを最大限に組み入れたトランスフォーマーという仕組み)がすごく有効であることが分かり研究が急速に進展したようです。この方法ですと、(A)凄く前に言われたこともトークン長の範囲内であればちゃんと加味するので文脈を的確にとらえることが可能、(B)文脈を「記憶」にパッケージングして順番に計算していく方式ではなく、過去のトークン長の全単語を一斉にわ~っと計算しちゃうので「並列化」がしやすい、という風になりAとBが今度は好影響を与えあって研究がガンガン進んだというわけです。

経済学的に考えても、コンピューティングパワーを存分に引き出すアルゴリズムがあると、R&Dタスクが資本集約的になり大資本のあるところが資金を投じることで一気に技術を進歩させることができますね。それで、起爆剤に火がつけられたのが今、ということでしょう。

 

というわけで

(2.1)へ続きます。

自分の「嫌いな人の共通点を考える」ことのススメ

社会人をやっていると誰しも、(特に仕事において)

 

「この人とは価値観が合わないなぁ。すごく嫌いだなぁ。」

 

と思う人に出会うことはあるだろう。僕もそうである。それで今日ふと、

 

「そういう僕の嫌いな人には、なんだか共通点があるぞ」

 

ということに気づいた。嫌いな人のことを想像してなぜ嫌いかを考えることは、裏を返せば「自分が気づいてない自分の欠点」を自覚することにつながる。

 

で、今日気づいたのは以下の点だった。

 

1.僕はどちらかといえば、チームで何かを成し遂げることよりも、独力で何かを成し遂げることの方が価値があると思っている。

 

2.僕はどちらかといえば、他者から口頭で教わるよりも、書物から読書や自分の思索で学ぶことのほうが質が高く量も多いと思っている。

 

そして、「僕の嫌いなタイプの人」というのはいわば上記2点について、どうやら真逆なのだ。

 

つまり、「チームで何かを成し遂げようとしその過程でコミュニケーション含めて経験から学びとっていく」というタイプの人を僕は嫌いになることが多い。

 

そういう人に対して僕は「愚者は経験に学び、賢者は歴史に学ぶ」とか「一人では何もできない人に価値はないのでは」といった、思いっきりバイアスの入った偏見のまなざしを(心の中で)向けてしまう。

 

これは以下のように、僕の短所でもあるし長所でもあると思う。

 

僕は経験の機会が少ない代わりに、本を読んで理論や歴史を知ることでその少ない経験を補完できること。

 

僕は器用貧乏で依頼下手ではあるけど、専門外のことも自分の中に取り込んでそれなりのレベルでこなせる自信があること。

 

そんな感じで、「嫌いな人」のことを考えることで、自分の短所を改めて見つめるきっかけになることもあると思うので、みなさんもいかがでしょうか?

 

ではまた。

東京

小さい頃、僕の実家がある埼玉県北部、熊谷市に住んでいたとき、東京は未知の都会だった。

 

親戚の殆どが埼玉県に住んでいたけど、遠い親戚に一人だけ東京に住むおばさん(父の叔母)がいた。父も母もその方のことを「東京のおばさん」と呼んでいたけど、本当の苗字も名前も僕は知らない。

 

その東京のおばさんの家に、一度だけ家族で日帰りで訪問したことがある。季節がいつだったかは覚えてないが、良く晴れた日だった。そこの家の知らない遠い親戚の子と一言二言話をした後、外に出て一人で散策した。なだらかな坂になっているアスファルトの道とコンクリートの塀に囲まれた住宅がいくつも並ぶ静かなところだった。

 

いつも僕が実家近くの荒川の河川敷で眺めている遠くまで開けた空の夕日と違って、その東京のおばさんの家の前で浴びた夕日は、知らないところから差し込んきて、見たことのない形の影を刻んでいて、まるで絵画を見ているかのようだった。

 

東京のおばさんの家には、父の運転する車で行った。車窓から見える景色は、東京に近づくにつれて次第に未知のものに変わっていった。高いビルや大きな建物が遠くに密集していたり、何層も立体交差する高速道路のジャンクションが間近に迫ってきたりして、東京って凄いところだなと幼心に感動を覚えたのだった。

 

東京のおばさんがどんな人であったかは、まったく覚えてない。お小遣いをいくらか、もらったような気がするくらいか。今思えば、そこで出された「東京のお菓子」などのことも覚えていても良さそうに思えるが、その家の中での出来事は全く記憶にない。

 

ただただ、その東京のおばさんの家の外で感じた東京の空気と空と光と影とが、時間を止めた映画のワンシーンのように僕の記憶にこびりついている。

 

何度か、あれはどこだったの?と、両親に聞きたくなったこともあった。しかしそのたびに、無意識にその質問を胸にしまい込んできた。あのとき感じた東京が、あのときのままでいて欲しかったからかもしれない。

 

僕は東京に住んで、もう20年近く経つ。もしかしたら、その記憶の中にある東京のおばさんの家の近くに知らずに行ったこともあったのかもしれない。また、今でもときどき、小さい頃のあの東京のイメージが一瞬だけよみがえることもある。その感情は筆舌に尽くしがたいものがあるが、そのイメージが持続することはなく、いつも一瞬で終わってしまい寂しい気持ちになる。

 

「これがずっと続いたらなぁ。「僕の知らない東京」に、ずっと住めたらよいのになぁ。」

 

そういう憧れを憧れのままに、大人になってもう慣れ親しんでしまった東京の空は、今日もオレンジ色の夕焼けに染まっていく。

 

記憶の中のあの東京には、温かさも寒さも季節も残ってないけれど、いま僕が生きている今日という日の東京は、まだ二月だからと着こんでいたら少し汗ばんでしまうくらいのとても暖かい日だった。

ワイン初心者がオススメする赤ワインTop5

昨年11月からワインに少しハマり、この2か月半でボトル20本ほど飲んできた中でオススメワインを紹介したいと思います。

 

第5位 ベリンジャー・カヴェルネソーヴィニオン(約1000円)

「いきなりステーキ」でグラス赤ワインを注文して、特に銘柄を選ばずに「なんでもいいです」って言えばたぶんこれが出てきます。しっかりとタンニンが効いてステーキに合う味ですし、大衆向けワインという位置づけの商品なので少し「ぶどうジュースっぽさ」があったりもします。「ぶどうジュースは好きだけどワインはそんなに好きじゃない」みたいなタイプの人は、ぜひこのワインを料理と一緒に味わってみることをお勧めします。マリアージュっていう楽しさを垣間見れること請け合い。ベリンジャーというのはアメリカのカリフォルニアにある大規模ワイナリーです。

 

第4位 シャトーレゾリュー青ラベル (約3000円)

しっかりと効いた酸味とこの価格帯としてはかなり芳醇なアロマ。タンニンもしっかり効いて料理とのマリアージュもピッタリです。ブーケ香は殆ど感じないのでバニラなどが好きな人にとっては物足りないかもしれませんが、「ワインは香ではなく味だ」と考える人にとっては複雑で高級な味を愉しめるお値打ちワインです。ヴィノスやまざきというワイン販売チェーンのロングセラーとして親しまれています。フランスのワインです。

 

第3位 テッレデルバローロ(約3500円)

ここからは3~1位すべてイタリアンワインです。バローロというのはいわば「松坂牛」みたいな感じのワインの地域ブランド名です。バローロは「ワインの王様」と呼ばれたりもしますが、このテッレデルバローロはふつうにスーパーマーケットで売ってたりもする、リーズナブルなバローロです。バローロは熟成期間が長くバニラのようないい香り(ブーケと言います)がするのが特徴で、このテッレデルバローロもちゃんとそういう香りがします。そのまま飲んでもちゃんと美味しいですし、タンニンもしっかり効いてるのでマリアージュにも適してると思います。

 

第2位 パタレイナ社のランゲ・ネッビオーロ (約4000円)

バローロバルバレスコは、高級ワイン向けのブドウ品種である「ネッビオーロ」から作られます。このランゲ・ネッビオーロというのは、その品種を使いながら、熟成期間を(半年とか)短くして早く出荷することで、管理コストを抑えてリーズナブルな価格で提供するというコンセプトのワインです。それでも、ボジョレーヌーボーとかとは違って、熟成期間がちゃんとあったうえでの出荷なので、バローロバルバレスコに勝るとも劣らない香りと味がちゃんとします。ワイン通販サイトでは「普段飲みのバローロ」などと書かれていたりもします。ランゲ・ネッビオーロ自体もピンキリで値段が色々あるようですが、このパタレイナ社のランゲ・ネッビオーロは、本格的にバローロに似たいい香りが一回りリーズナブルな価格で愉しめます。

 

第1位 パタレイナ社のバルバレスコ (約7000円)

今のところ、僕が飲んだ中でこれが一番おいしかったです。定価7000円くらいするので、このランキングの中でも高価ではあるのですが…(パタレイナ社のネッビオーロワインが単純に僕の好みなだけかもしれません)。このバルバレスコは、しっかりとしたボディにタンニンも効いてて、何よりも芳醇なブーケ香が立つのが特長です。このワインを飲んだ時の僕の感想は「こんな美味しいワイン生まれて初めてだわ」、です。

 

番外編

「俺のイタリアン」にあるワインリストは、かなり品質が良いと思います。俺のイタリアンにいったらぜひワインをボトルで注文してください。一番安いやつでもかなり美味しいです。ふつう、レストランでワインをボトルで注文すると、レストラン価格というマージンが乗ってるケースが多いと思いますが、俺イタのワインは通販で買うのと同程度の価格で普通に飲めますし、セレクトがかなり良いと思います。

 

語彙力シリーズNo.1 「機序」

今日は新しいテイストの記事を書いてみます。

 

日本語の語彙をみんなで増やしていこう!という趣旨のシリーズ第一回として、「機序(きじょ)」という言葉を取り上げてみます。

 

機序とは?

この言葉は、とくに「作用」という言葉を伴う「作用機序(さようきじょ)」という熟語で使われることが多いです。作用機序は典型的には「薬が効くメカニズム」を指すときに使います。

これに代表されるように、機序という言葉は医事・薬事(いじ・やくじ)において使われることが多いです。

 

機構や機能と何が違うのか?

機構という言葉には、何か静的な事物であって、仮に動きがあってもその動きの前後で変化せずもとに戻る、というニュアンスがあります。

例えば、社会的な組織で「何とか機構」みたいな団体があったりしますが、それは何らかの社会的機能を持っていたとしても、その機能を果たすことでその組織自身が変化してしまうことはふつう想定しません。

 

機能という言葉は、「能」という漢字が持つ「能動的」「主体的に働きかける」をニュアンスとして強く含んでいます。逆に言うと、機能する対象のほうが「受動的」であるというニュアンスも含むことになります。

例えば自動車でしたら「人や物を運ぶ」という機能がありますが、自動車の機能の対象は、「人や物」「出発地や目的地」になりますが、これらの対象はそれ自体では能動性をもっていません。また例えば車のハンドルには運転者の手動操作を車の動力機構(ここは機構という言葉ですね!)に伝えるという機能がありますが、この「伝えるという機能」を主体的に果たすのはハンドルであって運転者ではありません。(運転者は単に操作をハンドルに示しただけで、タイヤにそれを伝えてはいません)

 

それに対して、機序という言葉には、機構と比べて「働きの前後で状態が変化する」というニュアンスを持つこと、機能と比べて「主体が能動的に何かに働きかける」というニュアンスが薄く「主体や対象といった区別を超えた全体図を指し示す」ニュアンスがあること、という違いがあります。薬の作用機序というのは、薬そのものに機能があるわけではなくて、生体にもともと備わっている仕組みをうまくテコ入れすることで全体として望ましい働きをさせているのだ、ってわけです。

 

「機序」を使う場面

特に生理的なメカニズムについていう時にはピッタリの言葉です。(物理法則に基づいて動く)機械や(法律などルールに基づいて運用される)社会的組織と違って、生体内の仕組みは何かが働くと状態が変化することが多いためです。

 

なのでそうしたニュアンスをふまえると、比喩的に「機序」という言葉を(例えばビジネスでの提案書などを想定して)使う場面としては、説明したい事柄が生理現象によく似ているようなケース、薬の開発が生物の体内という複雑で変化に富むものを相手取るために正当性があくまでも経験則(治験とか)にゆだねられがちであるのに似た現象を説明したいようなケース、などが相応しいでしょう。

 

というわけで

また次の言葉でお会いしましょう。

ではまた。

死と他者性

明けましておめでとうございます。今年も本ブログをよろしくお願いします。

 

で、正月早々縁起でもないタイトルで申し訳ない限りですが、今朝は少しだけ「将来の自分の葬式」について考えたりしてました。

 

小さい頃から「自分のことは自分でやりなさい」って親に良く言われて育ったという人は僕だけじゃないはず。じゃあ「自分の葬式」を「自分でちゃんとやる」にはどうしたら良いのでしょうか?

 

最近は終活という言葉があるとおり、いくら独り身で旅立ったとしても、自分の葬式代くらいは個人資産から出せるくらいのお金を残すのがマナーだろうとは思います。つまり自分の「さよならセレモニー」のスポンサーは自分ですよと、それはいい。

 

でも、そのセレモニーを自分自身では執り行うことはどうしても出来ない。自分のことなのに、自分ではできない。絶対的な他者依存性が、人生の最後の最後に置かれている。

 

さらに良く考えると一つ面白いことに気づきます。出生は必ず母との2者の間で行われる=他者性と物理的に不可分の出来事であるのに、死亡は物理的に自分自身という1者のみで行われる出来事であることです。この非対称性は当たり前なんだけど、凄く興味深いことです。

 

そして葬儀を含めて考えると、この非対称性は消え、対称的になります。すなわち、「始めと終わり」がどちらも他者との関わりを物理的に含むものになります。では、その対称性をもつ始めと終わりをひとつなぎに眺めたら、人の生涯はどのようにみえるのでしょう?

 

(1)最初の自立とは自身の生誕であり、それは母からの分離であり「最初の他者の誕生」でもあります。

 

(2)そして青年期にまで成長する中で社会的な自立を目指します。それはいわば「依存先となる他者の分散化」です。大人になるというのは、多様な価値観を持つ様々な他者との関わり合いのなかで自己を生きることです。

 

(3)そして最後に、自身が死滅します。ここで、自立は究極の形、すなわち「自己の、絶対的な他者への完全な依託」という形をとることになります。

 

つまり、人の生涯を他者性の側から見ると、「1.他者の生誕」「2.他者への依存」「3.他者への依託」という流れがあるわけです。

 

僕はティーンエイジャーから20歳過ぎくらいまで「自分がいつか死ぬ」ということが怖くて悲しくて仕方がありませんでした。いまでも本当に怖いです。でもそれは、自分の生涯を自分自身から見た視点において抱く感情なのかもしれません。

 

生涯を他者視点でみたとき、上で述べた「流れ」をふまえると、それは小さい兆しのようなものがポッと出て少しずつ大きくなりどんどん広がってついにはそれが生まれて自身と一体化するような、そういう流れにあるものと認識できるかもしれません。そういう認識のもとでは、恐怖とは無縁の希望に満ち溢れた人生観をもって生きられるのかもしれません。

 

僕も40代。ずっとこれまで自分が全て、自分が一番大事、自分が世界の王者だ、という心を大事にしてきました。それ自体は悪いことではないと思いますが、僕も本当にイイ歳なので、死の準備というわけでもないですが、そういった他者視点での人生観も自分の中にきちんと確立していかなければなぁと思います。

 

今日はこの辺で、ではまた。