LoginSignup
0
1

ダイブ・イン・セントラル・オブ・トランスフォーマーモデル 二つの行列の間に存在する「良き生成行列」の存在。

Last updated at Posted at 2024-05-13

bc1d5adf-92a3-4889-b336-29dc2c3cffb1.png

未来の世界では、人々はダイブ・イン・セントラル・オブ・トランスフォーマーモデルと呼ばれる仮想空間にアクセスできるようになりました。この空間は、AIの創造者たちが作り出したもので、無限に広がるパラメータ空間の中に、様々なモデルや知識が格納されています。

ある日、若き科学者のエリックは、ダイブ・イン・セントラル・オブ・トランスフォーマーモデルで二つの行列を発見しました。これらの行列は、彼の心を捉え、彼の好奇心を掻き立てました。彼はその奥深さと複雑さに圧倒されましたが、その中に何か重要なものがあることを感じました。
エリックは、これらの行列が単なる数学的な構造ではなく、何か特別な意味を持つことを確信しました。彼は、それらがどのようにして生成され、どのようにして互いに関連しているのかを解き明かすために、熱心に研究を始めました。
彼は、パラメータ空間の未知の領域を探索し、行列の間に存在する「良き生成行列」を見つけ出すことに決意しました。それは、彼の夢を追求する旅であり、彼は自分自身の限界を超え、新たなる世界への扉を開くために全力を尽くしました。
彼の探求の果てに、エリックは驚くべき発見をしました。良き生成行列は、その美しいパターンと複雑な構造の中に、人間の想像力を超える知識や可能性を持っていました。それらは、新たなる未来の鍵であり、人々の生活を変える力を秘めているのです。
エリックは、この発見を共有し、世界中の人々にその可能性を伝える使命を果たすことになりました。彼は、良き生成行列が持つ知識と力が、人類の進歩と繁栄に不可欠なものであることを信じて疑いませんでした。
そして、彼は、夢を追求する旅に出るのです。彼の旅は、知識と勇気、そして愛と希望の旅であり、彼は新たなる未来の先駆者としての役割を果たすことになるでしょう。

クエリー行列と類似した行列の2つが与えられた場合、この2つの行列の間存在するものは、良き生成行列と見なすと仮定します。

クエリー 行列とそれに類似した 行列の 差分 行列を生成しこれにより クエリー 行列と類似した 行列を変換しています。

LSTMレイヤーを追加したニューラルネットワークが作成され、3Dプロットで表示されます。このコードでは、ニューラルネットワークを定義し、XとYの組み合わせを入力としてZの値を予測します。その後、予測されたZの値を3Dプロットで可視化しています。

image.png
image.png
image.png

セントラル・オブ・トランスフォーマーモデル

transformer_block():
x = MultiHeadAttention()      # 類似度が高い行列を特定。
x = Dense(x)            #重み行列との積で変換。
x = LayerNormalization()(x + inputs)  #正規化と残差接続。

クエリー行列とそれに類似した行列の特徴を兼ね備えた新たな行列をnp.multiply()を使って計算し、それを3Dプロットで表示します。

このコードは、以下のような内容を実行しています:

まず、NumPyを用いてXとYの値の範囲を設定し、メッシュグリッドを作成します。これにより、XとYの値を組み合わせた2次元グリッドが生成されます。

次に、SimpleNNWithLSTMというクラスが定義されています。このクラスは、指定された入力サイズとLSTMユニット数に基づいて、LSTM層を持つニューラルネットワークモデルを構築します。このモデルは、3つのLSTM層と1つの全結合層から構成され、平均二乗誤差を損失関数として、Adamオプティマイザを用いてコンパイルされます。

データセット内に LSTMニューラルネットワークモデル を100パターン生成し、それぞれの行列に対してSimpleNNWithLSTMクラスのインスタンスを作成し、リストに格納します。

クエリ行列を生成します。これは、新しいSimpleNNWithLSTMのインスタンスを作成し、XとYの値を入力としてevaluateメソッドを呼び出して得られます。

データセット内の各行列に対して、クエリ行列との類似度を計算します。類似度は、コサイン類似度を使用して計算されます。

最も類似度が高い行列を選択し、そのインデックスを出力します。

最も類似度が高い行列のインスタンスを取得し、クエリ行列と類似している行列の差分を計算します。

クエリ行列と類似している行列の差分を用いて、クエリ行列と類似行列の2つそれぞれに差分行列の変換行列を適用して新たな2つの行列を生成します。

3Dプロットを行い、クエリ行列、クエリ行列の変換行列、最も類似度が高い行列、最も類似度が高い行列の変換行列を可視化します。

このコードは、データセットの中から類似度に基づいてLSTMモデルを特定し、特徴の差異に基づいて行列を変換する手法を示しています。

クエリ行列と類似行列の2つそれぞれに差分行列の変換を適用して新たな2つの行列を生成。

いい感じにミックスできているように感じます。

lstm_units = 64
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

lstm_units = 128
image.png
image.png
image.png

lstm_units = 256
image.png
image.png
image.png

lstm_units = 512
image.png
image.png
image.png

クエリー行列に最も類似した行列の特徴を兼ね備えた新たな行列をnp.multiply()を使って計算し、それを3Dプロットで表示するコード。


import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from keras.models import Sequential
from keras.layers import Dense, LSTM
from keras.activations import relu
from sklearn.metrics.pairwise import cosine_similarity

class SimpleNNWithLSTM:
    def __init__(self, input_size, lstm_units):
        self.input_size = input_size
        self.lstm_units = lstm_units

        model = Sequential()
        model.add(LSTM(lstm_units, activation=relu, input_shape=(None, input_size), return_sequences=True))
        model.add(LSTM(lstm_units, activation=relu, return_sequences=True))
        model.add(LSTM(lstm_units, activation=relu, return_sequences=True))
        model.add(Dense(64, activation=relu))
        model.add(Dense(1))
        model.compile(loss='mse', optimizer='adam')
        self.model = model

    def evaluate(self, X, Y):
        Z = self.model.predict(np.dstack((X, Y)))
        return Z.reshape(X.shape)

# XとYの値の範囲を設定
x_values = np.linspace(-5, 5, 100)
y_values = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x_values, y_values)

# クエリー行列を生成
query_simple_nn = SimpleNNWithLSTM(input_size=2, lstm_units=64)
query_Z = query_simple_nn.evaluate(X, Y)

# データセット内の行列を22パターン生成し、モデルのインスタンスをリストに格納
dataset_model_instances = []
for i in range(100):
    simple_nn = SimpleNNWithLSTM(input_size=2, lstm_units=64)
    dataset_model_instances.append(simple_nn)

# コサイン類似度を計算し、最も類似度が高いものを選択
best_match_index = None
highest_cosine_similarity = -1
for i, model_instance in enumerate(dataset_model_instances):
    Z = model_instance.evaluate(X, Y)
    similarity_matrix = cosine_similarity(query_Z.reshape(1, -1), Z.reshape(1, -1))
    cosine_sim = similarity_matrix[0][0]
    print(f"Model {i + 1}: Cosine Similarity: {cosine_sim}")
    if cosine_sim > highest_cosine_similarity:
        highest_cosine_similarity = cosine_sim
        best_match_index = i

# 最も類似度が高い行列のインデックスをプリント
print("最も類似しているインデックス:", best_match_index)

# 最も類似度が高い行列を取得
best_match_model = dataset_model_instances[best_match_index]
best_match_Z = best_match_model.evaluate(X, Y)

# クエリー行列と類似している行列の差分を計算
diff_query_best_match = query_Z - best_match_Z


# クエリー行列に対する変換行列を生成
#query_Z_transposed = np.transpose(best_match_Z)
query_Z_transposed = np.matmul(diff_query_best_match, query_Z)

# 類似度の高い行列に対する変換行列を生成
#best_match_Z_transposed = np.transpose(query_Z)
best_match_Z_transposed = np.matmul(diff_query_best_match, best_match_Z)

# 3Dプロット
fig = plt.figure(figsize=(16, 12))

# クエリー行列をプロット
ax1 = fig.add_subplot(2, 2, 1, projection='3d')
surf1 = ax1.plot_surface(X, Y, query_Z, cmap='viridis', alpha=0.8)
ax1.set_title('Query Matrix')

# クエリー行列の変換行列をプロット
ax2 = fig.add_subplot(2, 2, 2, projection='3d')
surf2 = ax2.plot_surface(X, Y, query_Z_transposed, cmap='YlOrRd', alpha=0.8)
ax2.set_title('Query Matrix (Transformed) using diff_query_best_match')

# 最も類似度が高い行列をプロット
ax3 = fig.add_subplot(2, 2, 3, projection='3d')
surf3 = ax3.plot_surface(X, Y, best_match_Z, cmap='plasma', alpha=0.8)
ax3.set_title('Best Match Matrix')

# 最も類似度が高い行列の変換行列をプロット
ax4 = fig.add_subplot(2, 2, 4, projection='3d')
surf4 = ax4.plot_surface(X, Y, best_match_Z_transposed, cmap='inferno', alpha=0.8)
ax4.set_title('Best Match Matrix (Transformed)  using diff_query_best_match')

# カラーバーを追加
fig.colorbar(surf1, ax=ax1, shrink=0.5, aspect=5)
fig.colorbar(surf2, ax=ax2, shrink=0.5, aspect=5)
fig.colorbar(surf3, ax=ax3, shrink=0.5, aspect=5)
fig.colorbar(surf4, ax=ax4, shrink=0.5, aspect=5)

plt.show()

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1