#GTPモデルについてAIに質問
AIツールを使ってAIについて調べ中。まだ答えをよく理解していないがすこし見当がついてきたような気がする。整理されないままだがとりあえず公開。すべて英語版に英語で質問、回答をDeepLで翻訳(最小限修正)。
AIは「答えを(おおよそ)知らないと意味のある質問ができない。
・トランスフォーマーという仕組みがAIのブレークスルー
・アテンションを得ることが大規模言語モデルのカナメ
・アテンションは入力文の単語からなんらかの処理を経てベクトルを得ること(らしい)
そこでこうしたキーワードを使って質問してみた。Perplexityは説明簡単だがソースが明示され透明性が高い。ChatGTPはその逆。まずPerplexity、続いてChatGTP使ってみた。
Q: 大規模言語モデルは単語の出現相関確率を利用して、ある単語の次にどの単語が出現するかを推定することをベースにしていると考えてよいか?
Perplexity:はい、大規模言語モデルは単語の出現相関確率を利用して、ある単語の次にどの単語が出現するかを推定しています[1]。これは言語モデル全体の確率が単語誤り率に与える影響を測定することで行われ[2]、従来はパープレックス、クロスエントロピー、ビットパーキャラクタ(BPC)[3]といったメトリクスが用いられてきた。また、単語頻度、具体性、語彙クラスなどの変数を考慮し、単語の列に確率を割り当てる[4]。
Q:大規模言語モデルにおけるアテンションとは?
PERPLEXITY:大規模言語モデルにおけるアテンションは、一般に入力の埋め込み情報を強化するメカニズムによって求められます。これは、周囲の文脈に関する情報を含めることによって行われ[1]、また、モデルが入力シーケンスの異なる部分に注目することを可能にするセルフ・アテンション・モジュールを用いることによっても可能である[2]。その他の方法としては、アテンションガイドがあり、入力テキストの関連領域に注意を向けることで、事前に訓練された言語モデルを改善することができる[3]。
P:セルフアテンションモデルは、入力の異なる部分間の関係に関する情報を含めることで、入力の埋め込みの情報量を高める仕組みである[1]。
P:これは、並列処理と性能の向上を可能にするTransformerモデルで利用されている[2]。セルフ・アテンションは、順序に関係なく、特定のシーケンスにおいてどのような情報が関連するかをモデルが理解することを可能にする[3]。
P:一般にアテンションモデルは、機械学習アルゴリズムが入力の本質的な部分に焦点を当てるのを助ける[4]。
+++++++++++++++
相手を変えてChatGTPに聞いてみた。
++++++++++++++++
ChatGPT: セルフ・アテンション機構は、GPT-2やGPT-3など多くの大規模言語モデルの基礎となるトランスフォーマー・アーキテクチャの重要な構成要素である。セルフ・アテンション機構により、モデルは各トークンに対して出力表現を計算する際に、入力シーケンスの異なる部分に注目することができる。基本的な考え方は、各トークンの入力埋め込みの重み付き和を計算することであり、重みはそのトークンとシーケンス内の他の全てのトークンとの間の類似性によって決定される。具体的には、セルフアテンションメカニズムは3つの主要なステップから構成される。クエリ、キー、および値ベクトルである。各入力埋め込みは、クエリベクトル、キーベクトル、値ベクトルの3つのベクトルに変換される。これらのベクトルは、入力埋め込みに学習された3つの行列を乗じることで得られる。アテンション重み。セルフ・アテンション機構は、シーケンス中の各トークンについて、現在のトークンに対するクエリベクトルと他のトークンに対するキーベクトルの内積に基づいて、重み付けを計算する。これらの重みはソフトマックス関数を用いて正規化され、和が1になるようにする。重み付き和。最後に、各トークンの出力表現は、シーケンス内のすべてのトークンの値ベクトルの重み付き和をとることによって得られる。ここで、重みはステップ2で計算された注目重みである。このプロセスにより、モデルは各トークンの表現を計算する際に、トークン間の類似性に基づいて、入力シーケンスの異なる部分に選択的に注目することができる。これは、言語モデリングなど、入力列中のトークン間の長距離依存関係を捉える必要のあるタスクに有用である。セルフ・アテンションは、自然言語をモデル化するための強力なツールであり、さまざまなタスクで最先端の性能を発揮する大規模な言語モデルの開発を可能にしてきた。
C: AIシステムがアテンションを求めるということは、特定のトークンに対する出力表現を計算するときに、入力文中の各トークンにどれだけの重要度を与えるべきかを決定する重みを計算するために、セルフ・アテンションメカニズムを使用することを意味する。
C: 言い換えれば、セルフ・アテンションメカニズムは、特定のトークンに対する出力表現を計算するときに、入力文の各トークンにどれだけの重要性を与えるべきかを示すアテンション重みのセットを計算するために使用される。これらのアテンションの重みは、前回の回答で説明したように、現在のトークンと入力文中の他のすべてのトークンとの類似性に基づいて計算されるのが一般的です。
C: しかし、アテンションしなければならないのは、セルフ・アテンションのメカニズムでは、AIシステムが入力文中のすべての単語の組み合わせを処理する必要はないことです。その代わり、自己アテンション機構は、トークン間の類似性に基づいて入力文の異なる部分に選択的に注目することができ、行列の乗算とソフトマックスを用いて注目重みを計算することでこれを効率的に行うことができるのです。
C: つまり、AIシステムがアテンションを求めるということは、特定のトークンに対する出力表現を計算する際に、入力文中の各トークンをどの程度重視するかを決める重みを求めているのである。これらの重みは、セルフ・アテンションメカニズムを用いて計算される。セルフ・アテンションメカニズムは、トークン間の類似性に基づいて入力文の異なる部分に選択的に焦点を当てることができ、AIシステムが入力文中のすべての単語の組み合わせを処理する必要はない。
Ch:ソフトマックスは、機械学習や深層学習でよく使われる数学関数で、任意の実数のベクトルを、和が1になる確率分布に変換する関数である。実数のベクトルが与えられると、ソフトマックス関数はベクトルの各要素を指数関数化し、各要素を指数関数化した値の総和で割って結果のベクトルを正規化する。結果として得られるベクトルは、元の値に対する確率分布と解釈することができる。数学的表記法では、ソフトマックス関数は次のように定義される。softmax(x) = exp(x) / sum(exp(x))ここで、x は実数のベクトル、exp(x) は x の要素別指数、分母は指数化された値の総和である。ソフトマックス関数は、ニューラルネットワークにおいて、出力されうるクラスに対する確率分布を計算するためによく使われる。例えば、複数のクラスが存在する分類問題では、ニューラルネットワークの最終層が実数のベクトルを出力し、このベクトルにソフトマックス関数を適用することで、異なるクラスに対する確率分布を得ることができる。大規模言語モデルにおける自己注意メカニズムの文脈では、ソフトマックス関数は、現在のトークンと入力文中の他のすべてのトークンとの間の類似性に基づいて計算される注意の重みを正規化するために使用され、それらの合計は1になり、入力シーケンス内の異なるトークンに関する確率分布として解釈できるようになる。
C: NumPyライブラリを使ってPythonでソフトマックス関数を実装した例を紹介する。pythonCopy codeimport numpy as npdef softmax(x):"""Compute softmax values for each row of x."""exp_x = np.exp(x)return exp_x / np.sum(exp_x, axis=1, keepdims=True)このコードでは,ソフトマックス関数は2次元配列xを入力とし,xの各行が実数ベクトルを表します.この関数は,まずnp.exp関数を用いてxの各要素を指数関数化し,次に軸=1次元に沿った指数関数化した値の総和で各行を割って結果の配列を正規化します.keepdims=True引数は,結果の配列が入力配列と同じ形状であることを保証します.このソフトマックス関数を使って、3つの実数ベクトルからなる3つのクラスに対する確率分布を計算する例を示します。
pythonCopy
codex = np.array([1.0, 2.0, 3.0])
probs = softmax(x)print(probs)
This code will output the following probability distribution:csharpCopy
code[0.09003057 0.24472847 0.66524096]
つまり、1番目のクラスの確率は約0.09、2番目のクラスの確率は約0.24、3番目のクラスの確率は約0.67であることがわかります。確率分布として期待されるように、確率の和は1になることに注意してください。
+++++++++++++++++++++
ChatGTPはコード窓の右上にcopy codeがある。python環境があればすぐに実行できる。
import numpy as npdef softmax(x):"""
Compute softmax values for each row of x."""exp_x = np.exp(x)return
exp_x / np.sum(exp_x, axis=1, keepdims=True)sofmax
-++++++++++++++++++
関数のステップは非常に簡単。数億ステップに拡張するのも計算機資源だけあれば比較的容易という。これで自然言語の認識、生成、翻訳などができるのがトランスフォーマーの画期的な点だったようだ。