IBMニュースレター
The DX Leaders
AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。
ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。
位置エンコーディングは、シーケンス内の単語の位置に関する情報をTransformerアーキテクチャーに注入する手法です。
単語の順序は、文の意味論的な意味を理解する際に基本的な部分を果たします。例えば、「Allen walks dog」と「dog walks Allen」は、同じ単語(つまりトークン)を使用しているにもかかわらず、意味がまったく異なります。ディープラーニングとニューラル・ネットワークを使用して自然言語処理(NLP)アプリケーションを実装する場合、マシンが文中の単語の順序を保持して論理的な出力を生成できるメカニズムを作成する必要があります。
従来、再帰型ニューラル・ネットワーク(RNN)や長短期記憶(LSTM)などのモデルには、単語の順序を処理するメカニズムが組み込まれています。RNNとLSTMはインプットを一度に1つのトークンで順番に処理し、シーケンス内の単語のすべての位置を記憶します。言い換えると、「入力ベクトル」とも呼ばれるn次元ベクトルは、固有の学習順序で次々と処理されていくのです。対照的に、畳み込みニューラル・ネットワーク(CNN)やトランスフォーマー(Vaswaniら、2017年)を活用する他のアーキテクチャーでは、語順を保持せず、並列にトークンを処理します。したがって、シーケンス内の単語の順序を明示的に表現できるメカニズム、つまり位置エンコーディングとして知られる手法を実装する必要があります。位置エンコーディングにより、トランスフォーマーは単語順序の情報を保持できるため、並列化と効率的なモデル・トレーニングが可能になります。位置エンコーディングの実装は、GitHubでよく見つかります。
IBMニュースレター
AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。
ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。
文またはシーケンス内の単語の順序は、自然言語における文の固有の意味を規定します。さらに、機械学習の場合、単語の順序をエンコードすると、各単語がどこにあるべきかに関する「辞書」が得られます。この情報は保持され、トランスフォーマーモデルのトレーニング全体を通じて一般化できるため、並列化が可能になり、RNNとLSTMに優れたトレーニング効率を実現します。
例を再検討してみましょう。
この目的は、まず各単語をその意味を表すベクトルとして処理することによって達成します。例えば、「dog」はその概念をエンコードする高次元配列にエンコードされます。技術的な用語では、各単語またはサブ単語は、さまざまな長さの入力埋め込みにマッピングされます。ただし、それ自体では、意味ベクトルだけでは、犬が文のどこに登場するかはわかりません。位置エンコーディングでは、「first word」や「second word」など、位置インデックスをエンコードする2つ目のベクトルが追加されます。次に、これら2つのベクトルが追加されることで、単語が何であるか、そして単語がどこにあるかを表します。この結果ベクトルは、しばしば位置エンコーディング・ベクトルと呼ばれます。
位置エンコーディングを作成する方法はいくつかあります。この記事では、「位置エンコーディングを作成するために必要なのはAttention is all you need1で著者らが紹介した正弦関数を使用する最もよく知られた例について説明します。
2017年にVaswaniらによって紹介された元の論文における重要な考え方は、正弦関数(特にサイン関数やコサイン関数)を使用して、シーケンス内の各位置の固定的で決定的なエンコードを生成することです。 .
サイン関数は、滑らかな波長のパターンを生成する基本的な数学的概念です。特に、コサイン関数とサイン関数は、位置エンコーディングを補助するために元のトランスフォーマー関数で作成者が使用します。
や をプロットすると、周期的なパターンで-1と1の間で繰り返し上昇したり低下したりする曲線が表示されます。
位置エンコーディングに強力にするサイン波のいくつかの特性:
サイン波とコサイン波をプロットして、その様子を視覚化してみましょう。
import numpy as np
import matplotlib.pyplot as plt
# Create an array of 100 x values evenly spaced from 0 to 2π (approx 6.28)
x = np.linspace(0, 2 * np.pi, 100)
# Compute the sine and cosine of each x value
sin_values = np.sin(x)
# Create the plot
plt.figure(figsize=(5, 2))
plt.plot(x, sin_values, label='sin(x)', color='blue')
# Customize the plot
plt.title('Sine Function')
plt.xlabel('x')
plt.ylabel('Function value')
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0
#plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.tight_layout()
# Show the plot
plt.show()
サイン関数
それでは、コサイン関数をプロットする方法を見てみましょう。
#apply the cosine function to the same array, x
cosine = np.cos(x)
plt.figure(figsize = (5,2))
plt.plot(x, cosine, label = 'cos(x)', color = 'blue')
plt.title('The Cosine Function')
plt.xlabel('x')
plt.ylabel('Function value')
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0
#plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.tight_layout()
元のトランスフォーマー論文(Vaswaniら、2017年)の著者によって定義された正弦位置エンコーディングの公式は、次のように示されます。
位置が偶数の場合:
位置が奇数の場合:
:文中の単語の位置(例:最初の単語には0、2番目の単語には1など)
:埋め込みベクトルの次元インデックス。列インデックスにマップされます。2iは偶数位置を示し、2i + 1は奇数位置を示します
:トークン埋め込みの事前定義された次元(例、512)
:ユーザー定義のスケーラー値(例:10000)
:位置マッピングを取得するために入力シーケンス内の位置kをマッピングする位置関数
この式を使用すると、位置kにある各単語は、単語の位置に基づいて埋め込み値を持ちます。先程の「Allen walks dog」の例では、各単語の位置埋め込みを計算できます。
- = "Allen"
- = "walks"
- ="dog"
簡単なPython関数を記述して、 の値を計算してみましょう。 :
import numpy as np
import matplotlib.pyplot as plt
# create the positional encoding function using the formula above
def getPositionEncoding(seq_len, d, n=10000):
# instantiate an array of 0s as a starting point
P = np.zeros((seq_len, d))
# iterate through the positions of each word
for k in range(seq_len):
#calculate the positional encoding for even and odd position of each word
for i in np.arange(int(d/2)):
denominator = np.power(n, 2*i/d)
P[k, 2*i] = np.sin(k/denominator)
P[k, 2*i+1] = np.cos(k/denominator)
return P
関数を呼び出して例に対応する値を入力すると、シーケンスの長さは3、簡略化された次元は および となる。
P = getPositionEncoding(seq_len=3, d=4, n=10000)
print(P)
次のエンコード行列(テンソルとも呼ばれます)を取得します。
[[ 0. 1. 0. 1. ]
[ 0.84147098 0.54030231 0.09983342 0.99500417]
[ 0.90929743 -0.41614684 0.19866933 0.98006658]]
この結果をより具体的に表すためには、以下を取得します。
| 単語の位置 | Dim 0 sin(pos ÷ 10000^(0 ÷ 4)) | Dim 1 cos(pos ÷ 10000^(0 ÷ 4)) | Dim 2 sin(pos ÷ 10000^(2 ÷ 4)) | Dim 3 cos(pos ÷ 10000^(2 ÷ 4)) |
|---|---|---|---|---|
| “Allen” k = 0 | 0.0000 | 0.0000 | 0.0000 | 1.0000 |
| “walks” k = 1 | 0.841471 | 0.540302 | 0.010000 | 0.999950 |
| “dog” k = 2 | 0.909297 | -0.416147 | 0.020000 | 0.999800 |
ここでは、各単語の具体的な値と、対応する位置埋め込み値を確認できます。ただし、これらの単語埋め込みを直接使用して単語の順序を解釈することはできません。ここで計算された値は、トランスフォーマーの入力ベクトルの位置に関する情報を注入するために使用されます。 および の入力は異なるため、各位置 は異なる正弦関数に応答します。正弦関数ごとの対応位置では、「Allen walks dog」という単語の絶対位置と相対位置に関する情報を示します。言い換えれば、この情報は、モデルがこれらのパターンを順序、間隔、構造に関連付けることを学習できるように、モデルが使用できます。
では、位置行列を視覚化するPython関数を実装してみましょう。
import numpy as np
import matplotlib.pyplot as plt
def get_position_encoding(seq_len, d_model, n=10000):
P = np.zeros((seq_len, d_model))
for pos in range(seq_len):
for i in range(d_model):
angle = pos / np.power(n, (2 * (i // 2)) / d_model)
P[pos, i] = np.sin(angle) if i % 2 == 0 else np.cos(angle)
return P
# Parameters
seq_len = 100 # Number of tokens
d_model = 512 # Embedding dimensions
# Generate positional encoding
P = get_position_encoding(seq_len, d_model)
# Plot
plt.figure(figsize=(10, 6))
cax = plt.matshow(P, cmap='viridis', aspect='auto')
plt.title("Sinusoidal Positional Encoding Heatmap")
plt.xlabel("Embedding Dimension")
plt.ylabel("Token Position")
plt.colorbar(cax)
plt.tight_layout()
plt.show()
xの値に基づくさまざまな周波数でわかるように、入力ワードkから対応する各位置は、 のスケール、すなわち 関数の範囲で異なります。そこから、エンコーダーとデコーダーをベースとしたトランスフォーマーモデルが各単語の異なる位置エンコーディングを学習・保存し、モデルがトレーニング用の情報を保持できるようにします。エンコードされた位置ベクトルはトレーニング中も静的に保持されるため、並列計算が可能になります。
AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。
業界をリードするIBMのAI専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。
AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。
1. “Attention Is All You Need”, Ashish Vaswani et al., Proceedings of the 31st International Conference on Neural Information Processing Systems, arXiv:1706.03762v7, revised on 2 August 2023.
2. “Long Short-Term Memories”, Sepp Hochreiter and Jürgen Schmidhuber. 1997. Long Short-Term Memory. Neural Comput. 9, 8 (November 15, 1997), 1735–1780.,
3. “Foundations of Recurrent Neural Networks (RNNs) and Long Short-Term Memories” Alex Sherstinsky et al., Elsevier “Physica D: Nonlinear Phenomena” journal, Volume 404, March 2020: Special Issue on Machine Learning and Dynamical Systems