はじめに
Transformerモデルにおいて、位置符号(Positional Encoding)は重要な役割を果たします。TransformerはRNNやCNNとは異なり、入力シーケンスの順序情報を直接的に扱うことができません。そのため、位置符号を用いて単語の位置情報をモデルに組み込みます。本記事では、位置符号の生成方法とその可視化について解説します。
位置符号の生成
以下のコマンドで必要なパッケージをインストールしましょう。
!pip install numpy matplotlib japanize-matplotlib
位置符号は、単語の位置情報をモデルに組み込むためのベクトルです。以下のコードは、位置符号を生成し、それを可視化するためのものです。
import japanize_matplotlib
import matplotlib.pyplot as plt
import numpy as np
# パラメータ設定
K = 50 # 単語列の最大長
D = 64 # 埋め込みの次元
# 位置符号行列を初期化
pos_enc = np.empty((K, D))
# 位置符号を計算
for i in range(K): # 単語位置iでループ
for k in range(D // 2): # kの値でループ
theta = i / (10000 ** (2 * k / D))
pos_enc[i, 2 * k] = np.sin(theta)
pos_enc[i, 2 * k + 1] = np.cos(theta)
# 位置符号行列を画像で表示
im = plt.imshow(pos_enc)
plt.xlabel("次元") # X軸のラベルを設定
plt.ylabel("位置") # Y軸のラベルを設定
plt.colorbar(im) # 値と色の対応を示すバーを付加
plt.show()
このコードでは、単語列の最大長 K
と埋め込みの次元 D
を設定し、位置符号行列 pos_enc
を生成しています。位置符号は、単語の位置 i
と次元 k
に基づいて計算されます。具体的には、以下の式を使用します。
[
\theta = \frac{i}{10000^{\frac{2k}{D}}}
]
この計算により、位置符号行列が生成され、それをヒートマップとして可視化しています。
位置符号同士の内積を計算
次に、生成された位置符号同士の内積を計算し、その結果を可視化します。
# 位置符号同士の内積を計算
dot_matrix = np.matmul(pos_enc, pos_enc.T)
# 行列を画像で表示
im = plt.imshow(dot_matrix, origin="lower")
plt.xlabel("位置")
plt.ylabel("位置")
plt.colorbar(im)
plt.show()
このコードでは、位置符号行列 pos_enc
とその転置行列 pos_enc.T
の内積を計算し、その結果をヒートマップとして表示しています。この内積行列は、異なる位置間の類似度を示しており、位置符号がどのように位置情報をエンコードしているかを理解するのに役立ちます。
まとめ
本記事では、Transformerモデルにおける位置符号の生成方法とその可視化について解説しました。位置符号は、単語の位置情報をモデルに組み込むための重要な要素であり、その生成過程と可視化を通じて、Transformerの動作原理をより深く理解することができます。
位置符号の可視化は、モデルの挙動を直感的に理解するための有用なツールです。ぜひ、実際にコードを実行して、位置符号の振る舞いを確認してみてください。
この記事が、Transformerの位置符号について理解を深める一助となれば幸いです。
参考資料: