動画視聴メモ : ディープラーニング・Transformer・GPTシリーズ(第5～6章) - 3Blue1Brown


#   はじめに

「3Blue1Brown」YouTubeチャンネルで公開されている、ディープラーニング・Transformer・GPTシリーズ(第5～6章)の動画を視聴し、動画の理解を深めるために、その中で主要な処理方法や有用な部分を中心に、メモを取りました。ここでその内容をまとめて共有したいと思います。

#   情報元　3Blue1Brown

しかし、GPTとは何なのか？ トランスフォーマーのビジュアル入門｜ディープラーニング・第5章 - YouTube

https://www.youtube.com/watch?v=wjZofJX0v4M

注目の可視化、変幻自在の心臓｜第6章 ディープ・ラーニング - YouTube

https://www.youtube.com/watch?v=eMlx5fFNoYc

この動画では、専門的な知識を持たない方にも分かりやすくGPTの基本原理や応用例を解説しています。のビジュアル表現は非常にわかりやすく、複雑な概念も視覚的に理解しやすいものとなっています。


#   第5章
##   Transformer導入

Transformer、GPTの中核。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/42e17d00-7bc7-1b94-1fee-aa2947ce8448.png)


Transformerは、翻訳向けの機械学習の中から生まれたもの。

Transformerは、テキスト・画像・音声等を入力に、次の出力として相応しい出力の分布を出力する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/e9bc0f7a-b144-cdec-a778-69cb50a40e32.png)


入力は、単語・節で分割したもの＝トークン、または、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/a335214c-4ff1-51fd-6c23-f08dd34f939d.png)

分割した画像片、または、分割した音声。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/911cdecd-3507-814f-e1f9-95a60307f485.png)

トークンは、高次元のベクトルに変換される。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/57fa2892-a09c-3d40-6c1e-b13c26ae8158.png)


Attentionブロックに入り、各トークンのベクトルが互いに情報を交換し合って値を更新する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/7ad97146-146b-d9cb-1088-b8529d697e67.png)


「model」の意味が文脈によって異なるので、周囲のベクトルから「model」のベクトルの値が更新され、別の文脈では同じ単語でもベクトルは異なる値を取るようになる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/23af8ee5-b6d0-742c-cd19-2d79ad822922.png)


Attentionブロック→Perceptronブロック→…を繰り返し、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/7a5fc098-3cef-1aac-df8a-8a6d678e142c.png)

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/8ab970ce-85c5-a740-592f-01d29f32a67b.png)


最終層の出力ベクトルの中で、最後のベクトルを使って、最も確率の高いトークンを出力。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/985a7e91-4c1b-7d8f-24d7-36d7b0d09c0b.png)


生成された文を含めて入力にして、繰り返し次のトークンを出力し、つなげていくことで、文章を生成する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/4992f55e-e227-0f43-2e3b-115c6f6e48e0.png)


これをチャットボットにするには、
始めに会話であることを明記してから、ユーザの入力文を追記することで、その回答が生成されるようになる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/5e9e8c2b-acf7-d129-7aeb-30dec6837ba8.png)


GPT-3では、パラメータの総数が175B個、それらは27K個の行列からなり、
下記のように分類できる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/5daef530-5494-6d81-291b-1d0e628caf50.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/b95a2b33-276b-16fb-e888-224f45ad1442.png)


##   Deep Learning前提

機械学習の入力は、数値の配列である必要がある。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/39bdd880-4baa-3002-3ef6-206fc01ad878.png)


学習されるパラメータは、重みw_i。入力データと重みとの積を取る、線形の形になる＝線形結合。
線形結合した値に、簡単な非線形関数をかぶせる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/4e5866fa-5c45-2160-b910-f874bdab2cb9.png)


動画内では、学習されるパラメータ＝重み部は青・赤色で、データの値は白・黒で、表している。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/8f58e113-a4cc-b8cf-3c42-aeaad3ccc34d.png)


##   Word Embeddings

まず、始めの処理について。

説明の簡単化のため、本来はsubwordで分割する所、単語ごとの分割で説明する。
分割したものは、トークンと呼ぶ。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/9f378d62-4514-594c-9f8b-39cc23a66a39.png)


全単語(5万語など)に対して、Embedding行列W_Eを用意する。
事前に多量の文章データで学習しておく。(word2vec)
W_E行列の各縦列が各単語に対する、単語をベクトル化したもの＝Embedding、になっている。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/7e45b970-958b-34f3-8b93-c02668760e81.png)


単語をベクトル化したベクトルは、12288次元のサイズ。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/2b112727-c130-d3a0-c6b2-ee20ff5bbfe6.png)


この単語ベクトルは、同じような意味のものは同じような方向を向いている。
towersとbuiltなど。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/789112f7-d354-e929-0634-6809bb257ead.png)


gensimライブラリを使用して、ベクトルを得ることが出来る。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/9873afa9-d921-374f-58d9-c40d89f0dc78.png)


意味の差が同じとなる2単語は、単語ベクトルの差を取っても、同じような方向を向いている。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/0acde808-a31d-433a-671c-49153273b775.png)


移項して、「queen」の単語ベクトルのおおよその方向を知ることも出来る。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/b775a01d-23ac-d405-01e0-94e878bc84cf.png)


実際には、それほど正しく同じ方向を向いている訳ではない。(学習時に使用した文章データの偏りに依存)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/9c9b7f12-de22-1d26-11f0-e2e964ce6d07.png)

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/33672aba-0811-ec35-3020-3dce8acea474.png)

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/40740a76-5819-63ee-bdee-fbf9ca9a2e2c.png)

おおよその性別に関するベクトル方向がある。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/68596ce1-f8a9-a0ee-d7fc-33998494815e.png)


別の例では、日本といえば寿司、ドイツといえばブラートヴルスト＝ソーセージ、という結果となる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/2adb6aca-a4ed-e4fc-792d-b363eda158b3.png)


2ベクトルの内積が高ければ、同じ方向を向いている。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/6648a70e-36fb-a8f0-7165-9bdf527a5e94.png)

ゼロの場合は、直行。
負の値なら、反対の方向を向いている。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/542557f9-66aa-bb85-626c-8c7a20219e5a.png)


GPT-3では、Embedding可能なトークンの種類は、50257種類。単語ベクトルのサイズは、12288次元。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/638e33e8-5a95-31fc-f8a6-d65d0eec8667.png)


GPTの処理を進めるに連れて、単語(例: King)の単語ベクトルの方向が、周囲の文章によって、どんどん加算されて変わっていくようなイメージ。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/0165b3d0-6f3d-088a-fb8e-394ba393ae7f.png)


始めの(Embedding変換後の)単語ベクトルでは、周囲の文章の意味は含まれておらず、Transformerの各層を通過していくと、周囲の文章の意味を吸い込んで単語ベクトルが変化していく。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/bf0d1e62-c747-26e5-6a30-2ee9e39cfd28.png)


GPT-3では、入力する単語ベクトルの数が2048、単語ベクトルの次元は12288となる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/ef5a7236-ced6-f699-62c9-75b6d7872ac2.png)


##   Unembedding

次に、最終出力の処理について。

Transformerの最終出力はベクトル列になっていて、これを用いて次単語の候補を割合値で表したい。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/5ab28338-a45d-93ce-3cfe-7aaf94fe4d4e.png)


Transformerの最終出力のうちの最後のベクトルのみを使用して、
Unembeddingの行列W_Uを、最後のベクトルと掛けて、(W_Uの各横列との内積になり、相関が高いものが、大きい値となって算出され)、これにsoftmaxを取って、0～1の割合の値にする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/ddb48d01-0ca3-e394-b36a-51ca851fd497.png)

W_Uのサイズは、W_Eの転置と同じものになる。

W_EとW_Uのパラメータサイズは、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/d3310455-fb17-560c-67ca-89c4b526ff06.png)


※ソフトマックス関数（Softmax function、もしくは正規化指数関数： Normalized exponential function）とは、入力データ（＝ベクトル）内の複数の値（＝ベクトルの各成分）を0.0～1.0の範囲の確率値に変換する関数である。この関数によって出力される複数の値（＝ベクトルの各成分）の合計は常に1.0（＝100％）になる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/8d386eab-77f9-5d32-0b43-4dd2f9301672.png)


softmaxは、0.0～1.0の範囲の確率値に変換する関数である。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/e8986cf3-e11c-c840-4d71-fa0ea36035c4.png)


計算方法は、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/919e7933-1741-39a0-17b7-cd70ebd84118.png)


softmaxにTを導入、(温度)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/a3568428-9ffc-f4f2-362d-ed4cf568681b.png)

Tを大きくすると、低い割合になっている数値を大きくする効果がある。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/1f3ef2b7-427e-a850-fb84-0dd105197bb2.png)

T=0では、最大のもののみ1とする効果がある。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/3fcacc56-2c56-f19a-f957-5fcc381ee66c.png)


機械学習では、確率値にする前のベクトルの値のことを「Logits」と呼ぶ。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/38b5e77a-4e29-4b29-eae2-a26e9d565d77.png)


#   第6章
##   簡易的な例で考える

分かりやすくするため、始めに簡易的な例でイメージを考える。

「mole」は、文脈によって、3つの異なる意味を持つが、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/a75025ed-ce63-2336-3dd8-d162aec543e7.png)


単語をベクトル化した後(Embedding)、Transformerへの入力時には、「mole」に対応する単語ベクトルは、全て同じ値になっている。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/1167f0cf-d1c2-8f08-bdb5-14f5a8b3f805.png)

Embedding処理は単なるlook-upテーブルなので、文脈を一切考慮しないもの。

Transformerの中の処理で、「mole」に対応する単語ベクトルに、周囲の文脈情報が渡されて、変化していく。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/5894e77a-44e4-1ac1-ce8e-2220fb7c1d85.png)


周囲の文脈情報が渡されて、例「tower」のベクトルが変化していく。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/0711b323-8efc-b0cf-3df2-0e6daf1e203d.png)

↓
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/908df783-ad4d-3619-e9d4-97a49bee71d9.png)

↓
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/66d04eec-7199-085d-dcd6-7ce1d02b0db1.png)


これまで生成した長い文章の色々な所から、情報が(Context size内にある2048個の)最後尾のベクトルに渡されて、次の単語の予測となる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/1512b675-bd67-ef4b-5b98-4f4a107dab1d.png)


##   Attention (1つのHead)

例えば、修飾関係があった時、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/34a8679b-b4ad-2dd7-0cdd-879a93f6d35b.png)

修飾関係がある単語に注目・選択して、修飾の単語ベクトルを元の名詞の単語ベクトルに加算していくことで、元の名詞に修飾の意味を追加していく。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/ad3d305e-3258-ba3f-0115-9bbc20617c6b.png)

(ただ、これは分かりやすくするための作り上げた例に過ぎない)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/ce87302f-1b0f-6238-5b5f-62d7b8bf5ae1.png)


注目すべき何かを検索したい(例: 修飾関係にある単語は周囲にあるか?)、それを検索クエリのようなQベクトルとして、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/a5708d3f-db22-c722-50d1-215c27f8fb1b.png)

Qは、重み行列W_Qと単語ベクトルE_4の積で、算出する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/c488f5fd-d3a3-efae-e12f-4f1a745c3198.png)


各単語ベクトルE_iに対して、それぞれQ_iを計算し、
別の重み行列W_Kと単語ベクトルE_iの積で、キーとするK_iベクトルを計算。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/303f6b08-c2cd-5f8c-8d99-7dc7a02c6896.png)


検索クエリのQと、キー(検索クエリの回答となるもの)Kとで、似ているものを探す。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/cf538219-8938-7ddf-f9a7-d690b4962c28.png)


Q_iとK_iで同じ方向を向いているものを探すために、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/c943bb00-f3b6-1635-b194-77abfc0be20e.png)


K_i * Q_jの内積を取り、相関が高いものほど値が大きくなるので、似ているものが分かる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/67325dc5-3a53-c842-c734-617af522879f.png)

前述の例では、修飾関係にある単語の所で、内積が大きくなっている、ということに相当。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/666136ff-0247-e7e0-9e1d-9fc4e67c0af2.png)


内積値にsoftmaxを取って、0～1の割合値にして、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/6649b18e-67b4-e9ea-b3ca-bb9db78e4211.png)


数式では、下記の通り。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/3b2c3b8b-6c71-862a-4c4d-b7c8e2d6e314.png)

数値計算の安定化のため、√d_kで割っておく。(d_k: Kベクトルのサイズ)

特に学習する時には、将来生成するはずの先の単語の情報を使用しないようにするために、マスキング処理が行われる。下三角の成分をゼロにすることに相当。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/8ee6334f-d209-e150-9cb1-b2459e16c1ba.png)

ただ、softmaxを取るため、マイナス無限大を入れて、softmaxの後の値がゼロになるようにする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/bfc702f8-c1c3-8e90-b712-e15acf69d69c.png)


「creature」の単語ベクトルに、「fluffy」の意味が加わるように、方向を補正するようなベクトルを算出して出力したいので、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/d8ebf519-bca4-1c2c-75c5-cdfbd4228a4a.png)

別の重み行列W_Vと、「fluffy」の単語ベクトルとの積を計算して(＝W_V * E_i＝V_i)、これを方向を補正するベクトル(Value)とする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/e55ab16c-55ba-750c-312f-481b89efb29a.png)

全ての単語ベクトルE_iでそれぞれW_V*E_iを計算して、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/d4771c27-d91e-8f81-0789-737e21d77d64.png)


softmaxで割合にした値とV_iを掛けて、線形結合にする＝ΔE_i。
注目する単語が大きい割合値となっているので、注目する単語のV_iベクトルが多く加算される。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/f84d1838-7266-4355-1f2d-f9aa34b3bef6.png)

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/3244eedc-acfa-08bc-71a2-351df468a108.png)


元の単語ベクトルE_4に、ふわふわ(fluffy)、青い(blue)、の意味が追加されて、E_4’になる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/61bcf03c-5666-ee53-9ced-661960b45dab.png)


全てのE_iを同様に更新して、E_i’とする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/8f65d24f-89d9-c12f-9bd4-429257f6865e.png)


ここまでの処理を、1つのHeadを計算する、と呼ぶ。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/a08b44fe-8259-02c1-4029-a2a71532549b.png)


##   Attentionにあるパラメータ

W_Q行列は、128×12288のサイズ、(＝注目する意味を圧縮したサイズ×単語ベクトルのサイズ)
W_K行列も、128×12288のサイズ、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/d762d12b-3221-f10b-8795-b2581c7dfc19.png)


W_V行列は、12288×12288のサイズ、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/bab2f2aa-4f16-1fd0-bcc5-5fc80eee769d.png)


注目する意味を圧縮してから(Value↓)、単語ベクトルのサイズに戻す処理をするので(Value↑)、
W_V行列は、2つの行列(Value↓とValue↑)に分解してその積を取ったものとすると、パラメータ数が低減できる。
W_V行列は、128×12288のサイズが2個の行列になる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/375c5293-b4c9-7504-8cc5-216d3e165a0b.png)


まとめると、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/c1065bb2-8adc-ebfe-21b2-7d9c5fe90592.png)


##   (Cross-Attention)

GPTではSelf-Attentionが使用される。(前述のもの)
GPTには使用されないが、翻訳等の場合はCross-Attentionが使用される。
Key, Valueに別の入力情報から処理された単語ベクトルを用いて、Attentionを計算する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/c6da4ab1-e549-1a66-3fee-802518088f74.png)

Cross-Attentionでは、マスキング処理は行われない。(下三角の成分をゼロにすることに相当)

##   Multi-Head Attention

文章には、複数のつながりがあり、複数の注目する箇所があるので、Attentionは複数必要。
前述のAttentionを複数個持たせて、Multi-Head Attentionとする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/54209246-7cc7-ae35-f4b2-bd0b67932c93.png)


GPT-3では、96個のHeadがある。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/adae75f6-1b0d-f8e9-02a1-1e5d66356467.png)


96個のW_Q, W_K, W_Vのパラメータ行列がある。
96個のAttentionからの出力ΔE_iが得られる。ΔE_iを全て和算して、それを元の単語ベクトルE_iに加算して、意味の方向を更新する。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/e8f0c8fb-b898-a2dc-e9a9-eb4bbadc97a8.png)


96個のAttentionがあるので、各パラメータも96倍となる。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/3b7af409-53e1-c42d-5daf-717930a87600.png)


##   Multi-Head Attentionを複数の層にする

Multi-Head Attentionを複数の層にして構成。Attentionの次の層には2層のニューラルネットワークを置く。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/d023b5eb-a5be-d151-e8f7-8243ca0acd9d.png)


多数の層を繋いで、
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/ee0cd3a7-9e4c-f241-afd9-a48ab29c149b.png)


そのため、Attentionのパラメータは、さらに96倍となる＝96層。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/a3e0e0ad-7d4a-810d-45b1-3bd3241d7459.png)


#   第7章

(動画近日公開)