【GPT3の構造】GPTの気持ちを理解してChatGPTを使いこなそう！

ChatGPTを使いこなすにはGPTの気持ちを理解することが近道?かと思い、改めてGPT-３の実装を整理してみました。ただし、GPT-3の詳細な実装及びコードは非公開なため一部想定で記載しています。また、ChatGPT自身にも記事の記載を手伝ってもらいました（一部の実装機能をわかりやすく要約してもらっています）。

# <font color=royalblue>1. はじめに</font>  
GPT-３は何をしているのか？　ざっくりのイメージが下記の図です。  
最初に質問文（プロンプト）を入れて、そこから最初の１文字（実際はトークンですが簡単なため１文字として説明してきます）を予測します。そして予測した１文字をプロンプトの後ろに加えて次の１文字を予測します。以降、これを出力文章の終わりを検出するまで（またはトークンの最大値を超えないまで）繰り返していきます。  
つまり、<font color=royalblue> 最初のプロンプトにどんな内容を入れるのかが以降の出力文章生成に大きく関わってきます</font>。GPT-3が良い答えを出せるようにプロンプトを工夫する必要があるのはこのためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/b503264e-8053-d6b1-6e73-8b4c12937c03.png)


この図で把握しておくべきことは以下になります。

+ GPT-3はTransformerの「Decoder」のみを使って構築されています。
大規模言語モデル（LLM)では、EncoderのみやEncode&Decoderを使用したモデルがありますが、現在はDecoderのみが主流となっています。この辺りは、「[Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond](https://arxiv.org/pdf/2304.13712.pdf)」に記載されている下記の図が参考になります。
✳︎ちなみにこの論文では200億未満のパラメータを持つモデルをfine-tuned modelsとしてLLMとは区別しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/e1081139-5c32-da3c-0152-02143b899203.png)
[出展元]Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond

+ TransformerのDecoderを96層積み上げています。大規模言語モデルではスケール則、すなわち「大量のデータ」を「大規模モデル（＝パラメータが多い）」で「長時間学習（計算）」するほど性能が上がると言われています。大規模なモデルにするには「層を積む」か「重みの次元を増やす」かになりますが、GPT-3ではパラメータを増やすために96層を積んでいます。

以降、GPT-3の各機能について説明しますが、説明とリンクした全体の構成イメージ（実装機能、入出力及びshapeが分かるように記載）を下図に示します。
<font color=gray>注意：著者の想定で記載しておりあくまでも参考のモデル図です。誤りがあれば随時更新していきますのでご指摘をお願いします</font>

+ 全体のイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/598a001f-d3b7-4992-35e7-43d86131ef1e.png)


+ Transformerブロックのイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/cf39e5d5-31c2-d596-36ae-28fec686aef1.png)



# <font color=royalblue>2. 各機能の概要を理解しよう</font> 

GPT-3を理解するにあたりポイントは以下になります。
+ トークン化
+ 位置埋め込み(learned position embedding)
+ PreLN
+ SelfAttention
+ Sparce Attention
+ softmax/k-top

以降、順番に説明していきます。

## <font color=royalblue>2.1 トークン化</font>  
入力データのトークン化を行います。これは入力を単語に区切る処理です。そして、各トークンをIDに変換します。IDはモデルの辞書のインデックスであり、GPT-3では50,257次元です（いわゆるワンホットベクトルに変換）。
IDに変換したら、GPT-3が持つ埋め込み $ W_{\hspace{1mm}E} \in \mathbb{R}^{|v|×d_{\hspace{1mm}model}} \hspace{3mm} $ によりEmbedding(埋め込み)されます。なお、GPT-3では $d_{\hspace{1mm}model}  \hspace{3mm} $は、12,288次元になります。
また、図に記載している通り入力の行数は2,048となっています。これが、GPT-3で使えるトークン数の制限になります。

##  <font color=royalblue>2.2 位置埋め込み</font>

Transfomerの原論文では正弦波を用いたPositional encoderが紹介されていますが、GPTのアーキテクチャでは「learned position embedding」が採用されています。これは、埋め込み情報が学習時に学習されます。あまり重要ではないのでトークンの位置情報が学習されていると認識できればいいかと思います。

## <font color=royalblue>2.3 Pre-LN</font>  

Layer Normalization(層正規化）が学習の安定化のために用いられますが、Transfomerの原論文ではPost-LNですが、GPT-３ではPre-LNが採用されています。多層なモデルではPre-LNの方が学習が安定することが知られておりGPT-3のような大規模言語モデルではPre-LNがよく用いられています。

## <font color=royalblue>2.4 Self-Attention、Multi-Head Attention</font> 

Transfomerの肝となる機能ですが、self-Attention、Muti-Head Attentionについては既にさまざまな素晴らしい記事があると思いますので本稿では特に触れずそちらにお任せします（著者も[自然言語処理　Seq2Seq&TransFormer(Attention)](https://qiita.com/DeepTama/items/20b93ff8b8547428f662)でほんの概要だけですが記載していますのでよろしかったら参考にしてください）。
なお、GPT-3でのMulti-Head Attentionでのヘッドの数は96です。


:::note  
ChatGPTに聞いてみた　「Self-Attentionって？」
トークン間の依存関係をモデリングするために使用され、クエリ、キー、バリューの要素を用いて、関連性を計算し、重み付けされた情報を組み合わせます。これにより、Transformerモデルは長い文脈を理解し、高度な言語処理タスクを効率的に実行できます。
:::

## <font color=royalblue>2.5 Sparse Attention</font> 

GPT-3では、Sparce Attentionが用いられています。Sparce Attentionは、入力系列のすべてにAttentionを貼らずに一部のみに貼る機構です。[GPT-3での現論文](https://arxiv.org/pdf/2005.14165.pdf)では以下のように記載されていますが、実際にどのように実装しているのか詳細は不明です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/a7fca982-1d4e-9409-998c-78a6fc03ed3b.png)

:::note
ChatGPTに聞いてみた　「Sparse Attentionって？」
GPT-3ではSparse Attentionを使用して、より効率的に計算を行います。通常のSelf-Attentionでは、各トークンが他のすべてのトークンと関連性を計算するため、計算量が膨大になります。しかし、Sparse Attentionでは、関連性の高いトークンのみに焦点を当て、他のトークンとの関連性を無視します。これにより、計算量が削減され、効率的なモデルの処理が可能になります。
:::


## <font color=royalblue>2.6 softmax/top-K</font> 

最終的には、出力候補のトークンはsoftmaxで確率化されます。この時、temperatureにより各トークンが選択される確率の差が変更されます（temperatureが低いほど確率の高いトークンが選ばれる確率が高くなり一貫性のある生成が期待でき、temperatureが高いほど確率の低いトークンも選ばれる確率が高くなることで多様性のある生成が期待できる）。またtop-kを使って候補となる単語数を絞り、最終的に出力のトークン（１トークン）が選択されます（詳細な実装は不明であくまで想定になります）。この出力トークンを再度入力に加えて、終端記号が見つかるまで繰り返していきます。

+ Temperatureを意識したsoftmax関数

$ \hspace{20mm} \frac{exp(Z_{ \hspace{1mm}t,i}  \hspace{1mm} / T)}{\sum_{j} exp(Z_{ \hspace{1mm}t,j}  \hspace{1mm} / T)} $
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/783d701c-df69-5f41-0fad-f68734b68639.png)



# <font color=royalblue>3. Instruct GPT </font>

実際にはGPT-３はファインチューニングされ [Instruct GPT(Training language models to follow instructions with human feedback)](https://arxiv.org/pdf/2203.02155.pdf) 等として提供されています。

論文に記載されているお馴染みの処理概要を掲載します。

![Instruct GTP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413278/f3cb20ca-4d45-c6af-1183-b6470a5d151a.jpeg)

:::note
ChatGPTに聞いてみた　「Instruct GPT（技術的な実装）って？」
Instruct GPTの技術的な実装は、教師あり学習と強化学習の組み合わせに基づいています。最初に、人間が書いた指示とそれに対するモデルの生成結果からなるデータセットを作成します。教師あり学習では、このデータセットを使用して、指示とそれに対応する生成結果の関連性を学習します。そして、強化学習の手法を使用して、モデルの生成結果が指示に沿ったものである場合に報酬を与え、逆に不適切な場合にはペナルティを与えます。
:::

なお、Open AIでのGPT-3、Instruct GPTの各サービスとの関連は、以下のサイトが参考になると思います。

+ Model index for researchers
https://platform.openai.com/docs/model-index-for-researchers


# <font color=royalblue>4. 終わりに </font>
以上がGPT-3の概要になります。　　
詳細が公開されていないため想定での記載になっており間違えも多々あるかと思いますが、少しでもGPT-3の実装の理解に役に立ち、GPT及び大規模言語モデルを利用者として使いこなすためにお役に立てればと思います。
<font color=gray>記事もChatGPTに記載してもらった方がわかりやすいことも判明です、、、</font>