位置エンコーディングとは

位置エンコーディングとは何ですか?

位置エンコーディングは、シーケンス内の単語の位置に関する情報をTransformerアーキテクチャーに注入する手法です。

単語の順序は、文の意味論的な意味を理解する際に基本的な部分を果たします。例えば、「Allen walks dog」と「dog walks Allen」は、同じ単語(つまりトークン)を使用しているにもかかわらず、意味がまったく異なります。ディープラーニングニューラル・ネットワークを使用して自然言語処理(NLP)アプリケーションを実装する場合、マシンが文中の単語の順序を保持して論理的な出力を生成できるメカニズムを作成する必要があります。

従来、再帰型ニューラル・ネットワーク(RNN)や長短期記憶(LSTM)などのモデルには、単語の順序を処理するメカニズムが組み込まれています。RNNとLSTMはインプットを一度に1つのトークンで順番に処理し、シーケンス内の単語のすべての位置を記憶します。言い換えると、「入力ベクトル」とも呼ばれるn次元ベクトルは、固有の学習順序で次々と処理されていくのです。対照的に、畳み込みニューラル・ネットワーク(CNN)やトランスフォーマー(Vaswaniら、2017年)を活用する他のアーキテクチャーでは、語順を保持せず、並列にトークンを処理します。したがって、シーケンス内の単語の順序を明示的に表現できるメカニズム、つまり位置エンコーディングとして知られる手法を実装する必要があります。位置エンコーディングにより、トランスフォーマーは単語順序の情報を保持できるため、並列化と効率的なモデル・トレーニングが可能になります。位置エンコーディングの実装は、GitHubでよく見つかります。

The DX Leaders

AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。

ご登録いただきありがとうございます。

ニュースレターは日本語で配信されます。すべてのニュースレターに登録解除リンクがあります。サブスクリプションの管理や解除はこちらから。詳しくはIBMプライバシー・ステートメントをご覧ください。

位置エンコーディングが重要なのはなぜですか?

文またはシーケンス内の単語の順序は、自然言語における文の固有の意味を規定します。さらに、機械学習の場合、単語の順序をエンコードすると、各単語がどこにあるべきかに関する「辞書」が得られます。この情報は保持され、トランスフォーマーモデルのトレーニング全体を通じて一般化できるため、並列化が可能になり、RNNとLSTMに優れたトレーニング効率を実現します。

例を再検討してみましょう。

  • 「Allen walks dog」
  • 「dog walks Allen」

同じ3つのトークンを持つこれら2つの文は、単語の順序に基づいて完全に異なる意味を持ちます。自己注意法マルチヘッド注意法に依存するトランスフォーマーは、語順の固有の表現を持たず、明示的な位置情報を提供しなければ、シーケンス内の個々の単語を同じように扱います。誰が歩いていて、誰が歩かされているかをモデルに理解してもらいたいと考えていますが、これは位置によって異なります。

この目的は、まず各単語をその意味を表すベクトルとして処理することによって達成します。例えば、「dog」はその概念をエンコードする高次元配列にエンコードされます。技術的な用語では、各単語またはサブ単語は、さまざまな長さの入力埋め込みにマッピングされます。ただし、それ自体では、意味ベクトルだけでは、犬が文のどこに登場するかはわかりません。位置エンコーディングでは、「first word」や「second word」など、位置インデックスをエンコードする2つ目のベクトルが追加されます。次に、これら2つのベクトルが追加されることで、単語が何であるか、そして単語がどこにあるかを表します。この結果ベクトルは、しばしば位置エンコーディング・ベクトルと呼ばれます。

位置エンコーディングを作成する方法はいくつかあります。この記事では、「位置エンコーディングを作成するために必要なのはAttention is all you need1で著者らが紹介した正弦関数を使用する最もよく知られた例について説明します。

オフィスでミーティングをするビジネスチーム

IBMお客様事例

お客様のビジネス課題(顧客満足度の向上、営業力強化、コスト削減、業務改善、セキュリティー強化、システム運用管理の改善、グローバル展開、社会貢献など)を解決した多岐にわたる事例のご紹介です。

トランスフォーマーの位置エンコーディング

2017年にVaswaniによって紹介された元の論文における重要な考え方は、正弦関数(特にサイン関数sin(x)やコサイン関数)を使用して、シーケンス内の各位置の固定的で決定的なエンコードを生成することです。cos(x) .  

正弦関数とは

サイン関数は、滑らかな波長のパターンを生成する基本的な数学的概念です。特に、コサイン関数とサイン関数は、位置エンコーディングを補助するために元のトランスフォーマー関数で作成者が使用します。

 sin(x) や cos(x) をプロットすると、周期的なパターンで-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年)の著者によって定義された正弦位置エンコーディングの公式は、次のように示されます。

位置が偶数の場合:

 PEpos,2i=sin(pos100002i/dmodel) 

位置が奇数の場合:

 PEpos,2i+1=cos(pos100002i/dmodel) 

  •  k :文中の単語の位置(例:最初の単語には0、2番目の単語には1など)

  •  i :埋め込みベクトルの次元インデックス。列インデックスにマップされます。2iは偶数位置を示し、2i + 1は奇数位置を示します

  •  dmodel :トークン埋め込みの事前定義された次元(例、512)

  •  n :ユーザー定義のスケーラー値(例:10000)

  •  PE :位置マッピングを取得するために入力シーケンス内の位置kをマッピングする位置関数

     

 

この式を使用すると、位置kにある各単語は、単語の位置に基づいて埋め込み値を持ちます。先程の「Allen walks dog」の例では、各単語の位置埋め込みを計算できます。

-  k1 = "Allen"

-  k2 = "walks"

-  k3 ="dog"

簡単なPython関数を記述して、 の値を計算してみましょう。PE(k) :

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、簡略化された次元は d=4 および となる。n=10000 

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 = 00.00000.00000.00001.0000
“walks” k = 10.8414710.5403020.0100000.999950
“dog” k = 20.909297-0.4161470.0200000.999800

ここでは、各単語の具体的な値と、対応する位置埋め込み値を確認できます。ただし、これらの単語埋め込みを直接使用して単語の順序を解釈することはできません。ここで計算された値は、トランスフォーマーの入力ベクトルの位置に関する情報を注入するために使用されます。 sin(x)  および cos(x) の入力は異なるため、各位置  k は異なる正弦関数に応答します。正弦関数ごとの対応位置では、「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から対応する各位置は、 [-1.1] のスケール、すなわち sin(x) 関数の範囲で異なります。そこから、エンコーダーとデコーダーをベースとしたトランスフォーマーモデルが各単語の異なる位置エンコーディングを学習・保存し、モデルがトレーニング用の情報を保持できるようにします。エンコードされた位置ベクトルはトレーニング中も静的に保持されるため、並列計算が可能になります。

関連ソリューション
IBM watsonx.ai

AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。

watsonx.aiをご覧ください。
人工知能ソリューション

業界をリードするIBMのAI専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。

AIソリューションはこちら
AIコンサルティングとサービス

AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。

AIサービスはこちら
次のステップ

AI開発ライフサイクル全体にわたる機能にワンストップでアクセスできます。使いやすいインターフェース、ワークフロー、業界標準のAPIやSDKを利用して、強力なAIソリューションを構築できます。

watsonx.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