全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」から転載)
この図は、左下のInputsからトークン列が入力されて、(EmbeddingやEncodingは次回の記事で説明するのでいったん無視して)、Nxと書いてあるところがTransformerがN個垂直に積み重なって文脈をエンコードしていくという意味です。それでN個のTransformerを経て「文脈」情報が左半分のてっぺんで得られます。それを右半分のデコーダに渡しますが、右半分もN個のTransformerが垂直に積み重なった形をしています。
Transformerの灰色のボックスの中に入れ子で入ってるボックスがいくつかありますが、それらは次回に説明するので、今回は大枠を見ていきましょう。
さて、右半分はOutputから矢印の向きが「入力」されちゃってます。不思議に思われるかもしれませんが、これは機械学習の「生成モデル」ではよくある形です。右半分のてっぺんでは「Outputの確率」と書いてあって、要は「教師データの入力に対する出力」の確率を計算するよ、っていうのがこの図が示す深層学習モデルがやろうとしていることです。
生成モデルとデータサンプリング
例えば、右下のOutputsとして、右上のてっぺんで算出される確率が最大になるようなものを選べば、入力テキストだけあって出力テキストを得たい「テキスト→テキスト」の問題を解くことが出来ます。その「テキスト→テキスト」が出来れば、「対話システム」や「翻訳システム」は作れそうですよね。
イメージ的には、入力テキスト(文字列)から層を何段階か経て「意味情報が含まれた『文脈』」へと情報を「エンコード」して行き(これが図の左半分)、そのあと折り返して今度は「文脈」から出発して層を何段階か経ることで情報を「デコード」して(これが図の右半分)最終的に出力テキストを得る、という感じです。
繰り返しになりますが、右半分の矢印が上向きで「デコーダ」という言葉だったら普通は下向きになるはずですが、そのように逆向きになってるのは「生成モデル」の特徴です。
ここからデータを出力する作業は、いってみれば方程式を立てて、その方程式解くのと似てます。生成モデルを使って何かデータを生成するというのは、だいたいそんなイメージになります。
詳しい方法は例えば以下のような記事を読んでみてください。
方程式を解くのとちょっと違うのは、確率モデルなので、確率が最大じゃないケースのデータも「サンプリング」して得ることも出来たりすることです。方程式とちがって「解ごとに尤(もっと)もらしさ」がつきます。いちばん尤もらしい解以外にも、それなりに尤もらしい解は色々とあるはずなので、そういうのをサンプリング(出力)できるわけです。
例えばChatGPTではブラウザの「リロードマーク」みたいな「Re-generate(再生成)」ボタンがついてて、それを押すと別の回答を出したりできますよね。
なおそう説明してしまったところであれですが、GPTの場合は「テキスト→テキスト」ではなく「テキスト→単語」なので本当は違います。これについてはだいぶ後で述べたいと思っていて、いったんはこのまましばらく話を進めます。
Attention = Transformerの入出力
さて、続いてAttentionですが、ズバリ、Transformerの入出力がAttentionになります。先の図でいうと、灰色で囲まれたブロックがTransformerでしたが、その前後にある1本の線を流れるのがAttentionという形式のデータです。なので、左上で「エンコード結果」として出てくる「文脈」情報は、具体的な形式としてはAttentionになります。
前回の記事の「『文脈』は、ひとかたまりの情報に圧縮とかしない」という話を思い出してください。
データの流れとしては図からも分かる通り、「トークン列→Attention→Attention→…→Attention(エンコード結果)=『文脈情報』」という形になります。その際に各層間で受け渡されるAttentionのサイズは変わらないのです。なので、最終的なエンコード結果の「文脈情報」のデータサイズも最初のトークン列と同じ規模になります。これが、「圧縮とかそういう感じじゃなくて、トークン列を『まるっと同時に』扱ってる」という意味です。*1
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
いずれの図も、主辞のところに修飾語句の情報や、照応先(指示語や代名詞の具体的な内容の参照先)の情報が埋め込まれてますね。*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のページに図があるので転載します。
この図を見てわかる通り、矢印は上向きなのでエンコーダともデコーダとも取れますが、実際に「トークン列→次の単語」として使いたいときは、デコーダ(冒頭に掲載した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に載っていたので下表に転載します。
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つ分のデータ長を持っているのかどうかは私は知りません。