ChatGPTの技術 Transformer

ChatGPTは、大規模なトランスフォーマーベースのニューラルネットワークを活用して、ユーザーからのテキスト入力に対して自然言語での返答を生成するAIです。日本でも既に多くの企業でビジネスでの活用が検討され、実証実験をされている代表サービスですが、今回は、生成AIをもっとよく知る為に、生成AIの代表的なサービスであるChatGPTの基盤となっているTransformerについてまとめてみました。

生成AIのしくみや特長を知り、より深く生成AIのメリットを引き出し、ビジネスに活用していきましょう。

ChatGPTのアーキテクチャ

ChatGPTはTransformerと呼ばれるニューラルネットワークアーキテクチャをベースにしています。Transformerは、シーケンスデータ(テキストなど)を処理するための強力なモデルであり、長い文脈を考慮しつつテキストを生成することが可能です。

Transformer

Transformerは、自然言語処理(NLP)タスクにおいて、卓越した性能を示すために開発されたモデルです。

Transformerは、2017年に「Attention is All You Need」という論文で初めて提案されました。このモデルの核心は、自己注意(self-attention)メカニズムと呼ばれる機能で、入力されたデータの中で各位置がどの程度他の位置と関連しているかを計算します。Transformerは以下の主要な部分で構成されます。

  1. エンコーダー: 入力テキストを高次元空間の特徴表現に変換します。複数のエンコーダー層が重ねられています。
  2. デコーダー: エンコーダーからの出力を受け取り、タスク(例えば、テキスト生成)に応じた出力を生成します。こちらも複数のデコーダー層から構成されます。

エンコーダーとデコーダーの層

エンコーダーとデコーダー

各エンコーダー層とデコーダー層は、主に次のサブモジュールで構成されています。

  1. 自己注意(Self-Attention): 各トークンが入力文中の他のトークンとどのように関連しているかを識別します。このメカニズムにより、モデルは文脈を全体的に捉えることができます。
  2. フィードフォワードネットワーク(Feed-Forward Networks): 自己注意層の後に配置され、各位置のトークンに対して同一の操作を行いますが、異なる位置のトークン間でパラメータを共有しません。

自己注意メカニズム

自己注意メカニズムの核心は、入力された各トークンが他の全てのトークンにどれだけ「注目」しているかを計算することです。これは「クエリ(Q)」、「キー(K)」、「バリュー(V)」の3つのベクトルを用いて行われます。これらは入力トークンから派生したベクトルです。自己注意は、クエリとキーの間のドット積を計算し、それをスケーリングしてソフトマックス関数を適用することで注意の重みを求め、その重みに基づいてバリューを加重平均します。

自己注意の計算プロセスは以下のステップで構成されます。

  1. クエリ、キー、バリューの計算: 各入力トークンに対して、専用の重み行列を乗じることにより、クエリベクトル(Q)、キーベクトル(K)、バリューベクトル(V)を計算します。
  2. 注意スコアの計算: クエリと各キーのドット積を取り、スコアを計算します。このスコアは、あるトークンがシーケンス内の他のトークンにどの程度「注意」を払うべきかを示します。高いスコアは、より強い関連性を意味します。
  3. スケーリング: 得られたスコアをキーベクトルの次元の平方根で割ります。これにより、勾配の安定性が向上します。
  4. ソフトマックス関数の適用: 各クエリに対して、ソフトマックス関数を適用し、注意スコアを正規化します。これにより、各トークンに対する他のトークンの重要度が確率として表されます。
  5. バリューの加重和: 正規化された注意スコアをバリューベクトルに乗じ、加重和を計算します。この結果は、入力トークンがその文脈内でどのように他のトークンと関連しているかを表す新しいベクトル表現です。
  6. 出力: 上記の加重和を取ることで、各入力トークンに対して新たなベクトルが得られます。このベクトルは、次のレイヤーへの入力として使用されるか、またはモデルの出力として利用されます。

自己注意層の後に配置され、各位置のトークンに対して同一の操作を行うフィードフォワードネットワーク(Feed-Forward Networks)については今回は割愛しましょう。

ポジショナルエンコーディング

Transformerアーキテクチャでは、自己注意メカニズムによって入力シーケンス内の単語間の関係を捉えますが、このメカニズム自体は入力単語の順序情報を直接的には考慮しません。そのため、Transformerモデルはポジショナルエンコーディング(位置符号化)を使用して、シーケンス内の各単語の位置情報をモデルに組み込みます。これにより、単語の順序をモデルが理解し、より効果的に自然言語処理を行うことが可能になります。

ポジショナルエンコーディングの仕組み

ポジショナルエンコーディングは、各位置に対してユニークなベクトルを割り当てることにより、位置情報をエンコードします。このベクトルは、入力単語の埋め込みベクトルに加算され、その結果、位置情報が含まれた単語の表現が得られます。

Transformerの元の論文では、次のような正弦波と余弦波の関数を使用してポジショナルエンコーディングを生成しています。

  • PE はポジショナルエンコーディングベクトルです。
  • pos は単語の位置(インデックス)を示します。
  • i はベクトル内の次元のインデックスです。
  • dmodel​ はモデルの埋め込みサイズ、つまりポジショナルエンコーディングベクトルの次元です。

この関数により、各位置posに対してユニークなポジショナルエンコーディングが生成されます。また、model100002i/dmodel​の項によって、異なる周波数の正弦波と余弦波が生成され、モデルが位置情報をより効果的に学習できるようになります。

ポジショナルエンコーディングの特徴

  • 周波数変化: ポジショナルエンコーディングによって生成される波の周波数は、ベクトルの各次元にわたって異なります。これにより、モデルが位置情報をより豊かに捉えることが可能になります。
  • 相対的位置関係: 正弦波と余弦波を用いることで、位置間の相対的な差異を捉えることが可能になり、モデルが単語間の距離を効果的に学習できるようになります。

ポジショナルエンコーディングの導入により、Transformerモデルは入力シーケンスの順序情報を考慮することができ、文脈に依存する自然言語処理タスクにおいて高い性能を発揮します。

話が自己注意メカニズムとポジショナルエンコーディングに寄ってしまいましたが、ChatGPTはTransformerと呼ばれるニューラルネットワークアーキテクチャをベースに長い文脈を考慮しつつテキストを生成することが可能にしています。そこに、大規模なテキストコーパスを用いて事前学習を行い、言語の理解や文脈把握の能力を獲得しています。その後、特定のタスクに適したデータでファインチューニングを行うことで、特定の応答やタスクに対して適切な情報処理を可能にしています。

また、ChatGPTはテキストデータをトークン化し、それぞれのトークンをベクトルにエンコードしていることも大きな特長です。これにより、モデルは単語や文の意味を理解し、それに基づいて応答を生成することを可能にしています。

ユーザーからの入力だけでなく、会話のコンテキストや過去の対話履歴なども学習され、より自然で正確な回答をアウトプットしています。

以上が、ChatGPTの情報処理の基本的な流れです。ただし、具体的な実装や内部の技術的詳細はオープンソースでは公開されていないため、設計レベルの詳細について確認することができませんでしたので、あくまでもChatGPTを構成する上での基礎的なテクノロジーについての解説として捉えて頂ければ幸いです。

監修

APPSWINGBY CTO川嶋秀一

株式会社APPSWINGBY
CTO 川嶋秀一

動画系スタートアップ、東証プライム R&D部門を経験した後に2019年5月に株式会社APPSWINGBY 取締役兼CTOに就任。
Webシステム開発からアプリ開発、AI、リアーキテクチャ、リファクタリングプロジェクトを担当。C,C++,C#,JavaScript,TypeScript,Go,Python,PHP,Vue.js,React,Angular,Flutter,Ember,Backboneを中心に開発。お気に入りはGo。