|
OpenAIは先日、初の開発者会議を開催しました。そこではGPT-4 TurboとGPTのリリースが大変印象的でした。国内でも様々な大規模モデルが開発されていますが、今回の発表を見ると、ChatGPTとの差がさらに広がり、ChatGPTが圧倒的にリードしているように感じます。多くの人にとって、その中核技術であるTransformerモデルを理解することは依然として困難です。GPTがテキスト生成、質問への回答、そしてコード記述においてなぜこれほど正確なのか、疑問に思ったことはありませんか?しかし、Transformer をシンプルかつ分かりやすく理解する方法があるかどうかは、なかなか分かりません。インターネットで簡単に検索してみましたが、ほとんどの説明が長々としています。理由は単純です。Transformer は一言で説明できないからです。
私の個人的な意見としては、Transformer を体系的かつ徹底的に理解するには、少なくとも次の考え方 (手順) に従う必要があります。
1. まず、ニューラル ネットワークの基本概念、特にディープ ニューラル ネットワークのトレーニング方法、テキストの表現方法、連続テキスト情報の処理など、NLP 分野の基礎知識を理解します。 2. Transformerは主にどのような問題を解決しますか?主な焦点領域には、(自己)注意メカニズム、マルチヘッド注意、Transformerの内部構造が含まれます。 3. Transformer アプリケーションを実装します。
最初のポイントでは、ある程度の背景知識が必要です。2 番目のポイントは、Transformer の独自性についてであり、3 番目のポイントは、Transformer についてさらに詳しく知りたい人や、実際に Transformer を使用したい人向けです。今、ChatGPT の助けにより、すべてが変わります。 Transformerモデルの基本原理をシンプルかつ分かりやすく解説します。AI分野に初めて触れる方から、最新技術に興味を持つプロフェッショナルの方まで、本書の内容は刺激的で分かりやすいものとなるでしょう。この記事は、以下に示すように4つの主要なパートに分かれています。マクロセクションではネットワーク全体のフレームワークを理解していただくことを目指し、プロセスセクションではデータの流れを示し、ミクロセクションでは関連する基本概念をより詳細に解説します。この記事は、インターネット上で最もアクセスしやすいTransformerに関する記事になるはずです。
1. ネットワーク構造の主要モジュールの紹介(マクロ) 2. トランスフォーマーのトレーニングプロセス(手順) 3. Transformer推論プロセス(プロセス)リカレント ニューラル ネットワーク (RNN) や畳み込みニューラル ネットワーク (CNN) などの従来のシーケンス モデリング手法では、長いシーケンスの処理に限界があります。 RNN は、長いシーケンスを処理するときに勾配消失または勾配爆発を起こしやすく、モデルが長距離の依存関係を捕捉することが困難になり、並列計算ができなくなります。 CNN畳み込み演算は通常、固定サイズの入力を必要とします。可変長シーケンスを処理する場合、短いシーケンスをパディングしてシーケンスの長さを揃える必要があるため、計算効率が低下します。 2017年、GoogleのBrainチームは、Transformerネットワーク構造を紹介した有名な論文「Attention Is All You Need」を発表しました。 下図に示すように、自己注意機構などによって上記の問題を解決し、大規模モデルの爆発的な増加につながりました。この図を理解できれば、基礎に入ったといえます。
入力: これはモデルの入力部分であり、通常は単語または記号のシーケンスです。
入力埋め込み:このステップでは、入力シーケンス(例えば、文中の各単語)を埋め込み表現に変換します。埋め込み表現とは、単語の意味情報を捉える高次元ベクトル形式です。
位置エンコーディング:Transformerはシーケンスに依存しないため、位置エンコーディングはシーケンス内の単語の位置に関する情報をモデルに提供します。これらのエンコーディングは入力埋め込みに追加され、モデルが同時入力を処理する場合でも語順情報を活用できるようにします。
Nx : これは、N個の同一のエンコーダ層が積み重ねられていることを意味します。各層には2つの主要なサブ層があります。1つ目はマルチヘッドアテンション機構、2つ目はフィードフォワードニューラルネットワークです。
マルチヘッドアテンション:このアテンションメカニズムにより、モデルは各単語を処理する際に入力シーケンス内のすべての単語を考慮できます。マルチヘッドとは、モデルが入力データの異なる表現を並列に学習することを意味します。
残差接続と正規化(Add & Norm) :各アテンション層の後に残差接続(Add)が続き、続いて層の正規化(Norm)が行われます。残差接続は深層ネットワークにおける勾配消失問題を回避するのに役立ち、層の正規化は学習プロセスを安定化させ、収束を高速化するのに役立ちます。
フィードフォワードニューラルネットワーク:これは、自己注意層の出力を処理する単純な全結合ニューラルネットワークです。2つの線形変換と非線形活性化関数で構成されています。
デコーダーには複数の同一レイヤーが含まれており、各レイヤーには、マスクされたマルチヘッド アテンション、マルチヘッド アテンション、およびフィード フォワードの 3 つの主要なサブレイヤーがあります。
マスクされたマルチヘッド アテンション: これはエンコーダーのマルチヘッド セルフ アテンション メカニズムに似ていますが、重要な違いがあります。デコードの順序を確保するために、マスキング操作により、位置 i での予測は位置 i の前の出力のみに依存し、将来の情報は「参照」されないようになります。
マルチヘッドアテンション:このモジュールは、エンコーダの出力とマスクされたマルチヘッドアテンションの出力を入力として受け取ります。これにより、デコーダは入力シーケンスの関連部分に焦点を当て、それらを自身の出力と組み合わせて予測を行うことができます。
フィードフォワードニューラルネットワーク:エンコーダーと同様。各サブレイヤーの後には、加算と正規化のステップが続きます。これにより、各位置におけるベクトルに対して追加の非線形変換が提供されます。
Transformerのトレーニングの目的は、入力シーケンスとターゲットシーケンスから学習してターゲットシーケンスを生成することです。トレーニング中、モデルはデータをおよそ7つのステップで処理します。
エンコーダの各層は、前の層の出力を入力として受け取ります。最初の層の入力は、位置エンコードされた埋め込みベクトルです。
各エンコーダー レイヤーは、マルチヘッド アテンション サブレイヤーと単純なフィードフォワード ネットワークで構成されます。
マルチヘッド アテンション サブレイヤーは、自己アテンション メカニズムを通じてシーケンスの各要素を処理し、その後に残差接続とレイヤーの正規化を実行します。
次にフィードフォワード ネットワークが続き、残差接続とレイヤーの正規化が続きます。
デコーダーの各層も前の層の出力を入力として受け取りますが、デコーダーの最初の層はターゲット シーケンスの埋め込みベクトル (教師によって強制されたトレーニング中の正しいシーケンス) と位置エンコーディングを受け取ります。
デコーダーの各層は、3つの主要コンポーネントで構成されています。マスクされたマルチヘッドアテンションサブ層(位置ルックバックを防ぐため)、エンコーダー-デコーダーアテンションサブ層(デコーダーのアテンションをエンコーダーの出力に集中させるため)、そしてフィードフォワードネットワークです。各サブ層の後には、残差接続と層の正規化が続きます。
トレーニング中は、モデルが収束するか、特定のパフォーマンス基準を満たすまで、上記のステップが複数回繰り返されます。プロセス全体を通して、エンコーダーは入力シーケンスのコンテキストを理解する役割を担い、デコーダーはエンコーダーの出力と以前に生成された出力シーケンスに基づいて出力シーケンスを生成します。
推論中は、デコーダーに渡されるターゲットシーケンスではなく、入力シーケンスのみが存在します。Transformer推論の目的は、入力シーケンスのみを使用してターゲットシーケンスを生成することであり、これは大きく分けて7つのステップに分けられます。
推論フェーズでは、デコーダーは通常、一度に1つの単語を生成します。デコーダーは、以前に生成された単語の埋め込み(位置エンコード)を入力として受け取ります。最初に、デコーダーは開始記号(「…」など)を受け取る場合があります。 デコーダーの各層は、まずマスクされたマルチヘッド・アテンション層を用いて将来の情報の流入を防ぎ、次にエンコーダーの出力と合わせて処理を行います。エンコーダー・デコーダー・アテンション層を用いてエンコーダーの出力に注目し、その後にフィードフォワードネットワークが続きます。同様に、各サブ層には残差接続と層の正規化が続きます。
推論プロセス中、特にビームサーチなどの戦略を用いる場合、複数の候補デコードパスが同時に検討され、総合スコアが最も高いパスが最終出力として選択されることがあります。これは、翻訳やテキスト生成の品質向上に役立ちます。
入力埋め込みとは、語彙に含まれる単語を機械が理解できる数値形式に変換するプロセスです。具体的には、各単語を高次元空間のベクトルにマッピングします。このベクトルは単語の意味的特徴を捉え、この空間内で意味的に類似する単語は類似した埋め込みベクトルを持つことを保証します。
4つの単語{'king': 0, 'queen': 1, 'man': 2, 'woman': 3}を含む単純な語彙があるとします。この語彙の各単語には一意のインデックスが割り当てられています。入力埋め込みに変換する前に、テキスト内の各単語は対応するインデックスに変換されます。例えば、「king and queen」という文は、インデックスのシーケンス[0, 2, 1]に変換されます。こうして、各行が単語の埋め込みベクトルを表す埋め込み行列が得られます。埋め込み次元が5であると仮定すると、埋め込み行列は次のようになります。
インデックス列[0, 2, 1]を埋め込みベクトルに変換する場合、インデックスに対応する行を選択するだけで済みます。したがって、「キングとクイーン」に対応する埋め込みベクトル列は次のようになります。
このようにして、元のテキストデータはモデルが処理できる数値データに変換されます。実際のTransformerモデルでは、より豊富な意味情報を捉えるために、埋め込みベクトルの次元は通常5よりもはるかに大きく、数百から数千に及びます。
Transformerモデル、特にGPTのような派生モデルにおける位置エンコーディングは、入力埋め込みに一定の信号セットを追加することで実現されます。各位置には固有の位置コードがあり、これが単語埋め込みに追加されます。これにより、モデルはこれらの埋め込みの合計に基づいて、異なる位置にある単語を区別することができます。オリジナルの Transformer モデルでは、位置エンコーディングは正弦関数と余弦関数の固定式を使用して生成され、各次元の位置エンコーディングは位置の正弦関数と余弦関数に応じて異なります。
位置 pos と次元番号 i の場合、位置コード PE(pos.i) は次の式を使用して定義されます。ここで、d は埋め込み次元です。 PE(pos,2i)=sin(pos/10000^(2i/d)) PE(pos,2i+1)=cos(pos/10000^(2i/d))
「Hello world」という単純な文があり、これをTransformerベースのモデルに入力としてエンコードしたいとします。ここでは、説明を簡単にするために、埋め込み次元を4とし、最初の2つの位置のエンコードのみを考慮します。まず、次のことを前提として、単語を埋め込みベクトルに変換します。
「こんにちは」 -> [1.0, 0.5, 0.3, 0.9] 「世界」-> [0.4, 0.2, 0.9, 0.7]
位置 1 (「Hello」が配置されている位置) の場合:PE(1,0)=sin(1/10000^(0/4))=sin(1) PE(1,1)=cos(1/10000^(1/4))=cos(1) PE(1,2)=sin(1/10000^(2/4))=sin(1) PE(1,3)=cos(1/10000^(3/4))=cos(1)
位置 1 は [0.84, 0.54, 0.84, 0.54] としてエンコードされ、同様に、位置 2 は [0.91, -0.42, 0.91, -0.42] としてエンコードされます。
次に、各単語の埋め込みベクトルを、対応する位置の位置エンコーディングに追加します。位置エンコードされた「Hello」 -> [1.0 + 0.84, 0.5 + 0.54, 0.3 + 0.84, 0.9 + 0.54]位置エンコード付き「world」-> [0.4 + 0.91, 0.2 - 0.42, 0.9 + 0.91, 0.7 - 0.42]
位置エンコードされた「Hello」 -> [1.84, 1.04, 1.14, 1.44]位置エンコード付き「world」 -> [1.31, -0.22, 1.81, 0.28]
自己注意(内部注意とも呼ばれる)は、シーケンス内の個々の要素間に直接的な依存関係を確立する注意メカニズムです。つまり、モデルはシーケンス内の各要素を処理する際に、シーケンス内の他の要素も考慮し、より包括的なコンテキスト情報を取得します。
図に示すように、aは入力シーケンス、中央のボックスは自己注意操作、最終出力bはaの各位置と他の位置との相関度に応じて重み付けされた出力シーケンスです[1] 。詳細には、いくつかの概念を理解する必要があります。
クエリとは、知りたい情報、またはテキストから抽出したい特徴のことです。テキスト内の単語や知りたいことについて尋ねる質問に似ています。キー:キーはテキスト内の各単語を表すものです。これは各単語の識別子またはキー情報に似ており、クエリと他の単語との関連度を計算するのに役立ちます。値:値とは、各単語に関連付けられた特定の情報または特徴です。これは、各単語の特定の意味や特徴ベクトルに似ています。
自己注意メカニズムにおける具体的な手順は次のとおりです。ステップ 1 : 入力値 a に行列 Wq、Wk、Wv (これら 3 つの行列はトレーニング データを通じて学習する必要があるモデル パラメーター) を乗算して、クエリ (Q)、キー (K)、値 (V) を取得します。ステップ 2 : クエリ (Q) とキー (K) のドット積を計算して、クエリと他の用語の関連性を測定します。次に、これらの相関関係を正規化することによって(通常はソフトマックス正規化を使用)、各単語の注目重みが得られます。ステップ 3 : 最後に、これらの注意重みに基づいて、各単語の値 (V) に重み付けして合計し、クエリに関連する情報にさらに注意を払う新しい表現を取得します。
図に示すように、a11はq1とk1のドット積を計算し正規化した後に得られる相関度である。同様に、相関度をすべてのvと重み付けして合計することで、q1と最も相関の高い情報b1が得られる。他のb2、b3、b4も同様の方法で計算される[1] 。
「猫はクッションの上に座った」という文を処理する際、自己注意メカニズムにより、モデルは「sit」という単語の表現を生成する際に、局所的な単語や先行する単語のみに頼るのではなく、「cat」「cushion」「on」という単語を同時に考慮することができます。このメカニズムにより、モデルは言語構造と意味をより深く理解できます。例えば、「cat」が「sit」の主語であり、「cushion」が動作が行われる場所であることを理解できます。
従来のセルフアテンションメカニズムでは、クエリ(Q)、キー(K)、値(V)の1セットのみを使用してアテンションの重みを計算できます。しかし、マルチヘッドアテンションメカニズムでは、複数の異なるQ、K、Vのセットを使用して計算を行うことができます。
各アテンションヘッドは、独立した線形変換によって生成されたQ、K、V値の独立したセットを持ちます。これにより、各アテンションヘッドはテキストの異なる側面や特徴に焦点を当てることができ、より豊富な情報を抽出できます。最終的に、複数のアテンションヘッドからの結果は連結され、別の線形変換によって統合され、最終的な出力が得られます。
以下は、マルチヘッドセルフアテンションの計算プロセスの例です。
「猫はクッションの上に座っている」という文を例に、マルチヘッド・セルフアテンションの計算プロセスを簡略化して見ていきましょう。ここでは、2次元のヘッドが2つしかないと仮定します。つまり、埋め込みベクトルも2次元に縮小されます。
単語埋め込みを初期化します(実際には通常、これらはより高い次元を持ちます)。
Q、K、V 行列をランダムに初期化します(実際には、トレーニング中に生成されます)。
最初の 1 について、Q、K、V を計算してみましょう(上記と同じであると仮定します)。 Q(座っている) = [0, 1] * [[1, 0], [0, 1]] = [0, 1] K = [[1, 0], [0, 1], [1, 1], [0, 0], [1, 1]] * [[0, 1], [1, 0]] = [[0, 1], [0, 1], [1, 1], [0, 0], [1, 1]]
スコア = Q(着席) * K^T = [0, 1] * [[0, 0, 1, 0, 1], [1, 1, 1, 0, 1]] = [1, 1, 1, 0, 1]
ソフトマックスを適用して注目重みを取得します (これは単なる例であるため、ソフトマックスは重みを変更しないと仮定します)。attention_weights = [0.2, 0.2, 0.2, 0, 0.2]
V * attention_weights = [[0, 1], [0, 1], [1, 1], [0, 0], [1, 1]] * [0.2, 0.2, 0.2, 0, 0.2] = [0.4, 0.8]
このベクトルは、「sit」という単語の重み付けされた文脈表現を表し、文中の様々な単語が「sit」にどの程度寄与しているかを反映しています。マルチヘッドセルフアテンションでは、各ヘッドがこの計算を実行し、その後、すべてのヘッドの出力を連結または統合して最終的な表現を取得します。
各アテンション レイヤーの次には残差接続 (Add) が続き、次にレイヤーの正規化 (Norm) が続きます。
残差接続(追加) :このステップでは、サブレイヤーの入力をその出力に直接追加します。これは、深層ネットワークにおける勾配消失問題の解決に役立ちます。これにより、モデルは入力情報を失うことなく、より深いレイヤーにおける小さな変化を学習できます。
入力ベクトル x と、サブレイヤー処理によって得られた出力ベクトル y があるとします。残差結合は、入力 x と出力 y を単純に加算します。つまり、z = x + y です。
正規化層(Norm) :正規化ステップは、学習プロセスを高速化し、安定性を向上させるためのものです。各特徴ベクトルを正規化することで、学習中にネットワーク内の活性化が一定のスケールを維持することを保証します。
例えば、残差結合の後、ベクトルzが得られます。レイヤー正規化は、zの平均と標準偏差を計算し、これらのパラメータを用いてzを正規化します。その結果、z' = (zu)/oとなります。ここで、zuは平均、oは標準偏差です。通常、この後にスケーリングとシフトの操作が続き、通常はLN(z) = Yz + Bと表されます。ここで、YとBは学習したパラメータです。
これら2つのステップの組み合わせは、パフォーマンスを犠牲にすることなくモデルの深度を高めることができるため、Transformerアーキテクチャにとって非常に重要です。このアーキテクチャは、機械翻訳やテキスト生成などのNLPタスクにおいて大きな成功を収めています。
フィードフォワード ニューラル ネットワーク (FFNN) は、ループやフィードバックなしで、入力ノードから隠し層 (存在する場合) を経由して出力ノードへと情報が一方向にのみ移動する基本的なニューラル ネットワーク アーキテクチャです。
Transformerモデルの文脈において、フィードフォワードニューラルネットワークとは、マルチヘッドアテンション機構に従う全結合層からなるサブネットワークを指します。通常、このフィードフォワードネットワークには、ReLUやGELUなどの非線形活性化関数を挟んだ2つの線形変換が含まれます。まず、アテンション層の出力を線形層に通し、モデルがこれらの特徴を再結合できるようにします。次に、ReLUなどの非線形活性化関数を用いて、モデルの非線形処理能力を高めます。最後に、別の線形層がこれらの非線形特徴を最終的な出力形式に変換します。
マルチヘッドセルフアテンションは主に、単語間の相互作用など、異なる入力コンポーネント間の関係に焦点を当てていますが、フィードフォワードニューラルネットワーク (FFNN) はさらに一歩進んで、次のことが可能になります。
非線形性の追加: マルチヘッド セルフ アテンションは比較的線形のプロセスですが、フィードフォワード ニューラル ネットワークは ReLU などの活性化関数を通じて非線形性を導入し、モデルがより複雑な機能やより抽象的な表現をキャプチャできるようにします。
情報統合: フィードフォワード ニューラル ネットワークは、マルチヘッド自己注意層によって学習されたさまざまな側面からの情報を統合して、より包括的な表現を形成できます。
新しい特徴の組み合わせの作成: マルチヘッド セルフ アテンションでは特徴に重みを付けて組み合わせることができますが、フィードフォワード ニューラル ネットワークでは重みマトリックスを通じてまったく新しい特徴表現を作成できるため、特定のタスクの解決に適している可能性があります。
各場所の独立した処理:Transformerモデルでは、フィードフォワードネットワークは各場所に独立して適用されます。つまり、各場所は、他の場所との関係性のみに依存するのではなく、独自のコンテキスト情報に基づいて非線形変換を行うことができます。
まとめると、マルチヘッド・セルフアテンションは入力における位置関係を捉えることができますが、フィードフォワード・ニューラルネットワークは各位置の特徴表現をさらに処理し、抽象化します。これら2つのアプローチを組み合わせることで、Transformerモデルはシーケンシャルデータを効果的に処理し、様々な複雑なタスクにおいて優れたパフォーマンスを実現します。
Transformer モデルでは、「線形」ステップは、前の層 (マルチヘッド アテンション メカニズムやフィードフォワード ネットワークなど) から取得した特徴を最終的な出力形式に変換する役割を持つ、完全に接続されたニューラル ネットワーク層を指します。
完全接続 (線形) レイヤーは通常、次の操作を実行します。
次元変換:入力特徴ベクトルの次元を別の次元に変換します。例えば、デコーダーの最後で、全結合層は特徴ベクトルを語彙のサイズのベクトルに変換します。各次元は語彙内の単語に対応します。
特徴の学習: この線形変換を通じて、モデルは入力特徴と出力間の複雑なマッピング関係を学習できます。
Softmax の準備: 出力層では、この完全接続層の出力が Softmax 関数の入力として使用され、これらの線形出力が確率分布に変換されます。
1万語の語彙を持つ言語モデルタスクを処理するTransformerモデルがあるとします。モデルの特定の段階で、マルチヘッドアテンション機構による処理結果である512次元の特徴ベクトルが得られます。ここで、これらの特徴を、各次元が語彙内の単語に対応する新しいベクトルにマッピングし、各単語が次の単語となる確率を計算したいと考えています。
ここで、全結合層(線形層)が登場します。全結合層は10000*512の重み行列を持ちます。512次元の特徴ベクトルをこの全結合層に渡すと、10000次元のベクトルに変換されます。この処理は、次の行列乗算演算で表すことができます。
出力ベクトル = 重み行列 * 入力ベクトル + バイアスベクトル。具体的な数値で表すと、入力ベクトル x は 512*1 列ベクトル、重み行列 W は 10000*512 列ベクトル、バイアスベクトル b は 10000*1 列ベクトルとなります。
最終的な出力ベクトルは 10000*1 の列ベクトルであり、これを Softmax 関数に入力して確率分布に変換できます。これにより、各要素は語彙内の対応する単語が次の単語として出現する確率を表します。
ソフトマックス層は、実数値の集合を確率分布の集合にマッピングする関数です。ニューラルネットワークの最終層として、特に多クラス分類問題を扱う際によく使用されます。ソフトマックス層では、各値(通常はモデルの出力)は指数関数によって正の数に変換され、すべての値の合計が1になるように正規化されます。これにより、確率として解釈されます。
Softmax 関数は次のように表すことができます。
確率的解釈: モデルの出力を確率分布に変換して、各出力を特定のイベントの確率として解釈できるようにします。
微分可能性: Softmax 関数は微分可能であるため、勾配降下法などの最適化アルゴリズムを使用してモデルをトレーニングできます。
決定境界:複数のクラスの出力の間に明確な決定境界を提供します。与えられた入力に対して、ソフトマックス層は最も確率の高い出力値を増幅し、他の値を抑制します。これにより、モデルはより自信を持ってクラスを選択できるようになります。
損失関数と組み合わせて使用: クロスエントロピー損失関数と組み合わせて使用されることが多く、このような組み合わせは分類問題における効率的なトレーニングに使用できます。
安定性:Softmax関数を使用すると、任意の範囲の入力値を(0,1)の範囲の出力値に変換するため、数値計算における安定性の問題を回避できます。
Transformer モデルでは、Softmax レイヤーを使用してデコーダーの出力 (各単語のスコア) を次の単語の確率分布に変換します。これは、テキスト生成の重要なステップです。トランスフォーマーへの興味は、知識欲と、現在取り組んでいる大型模型の制作という2つの源から生まれています。誰もが大型模型の製作に熱中している中、私はこの新しいコンセプトを真に理解するために時間をかける必要があり、それがこの学習ノートの作成につながりました。 [1] 著者:鄧毅 出典:知书 なぜ変圧器が理解できないのか? https://www.zhihu.com/question/596771388/answer/3263001703 |