hagees1991
@hagees1991

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Ising模型の相転移をディープラーニングで学習する際の出力が予想通りにならない

解決したいこと

Python3を使って2次元Ising模型の相転移をディープラーニングで推定するという数値計算を行っています。
メトロポリス法(モンテカルロ法)を用いてスピン配位を計算するということまでは完成しています。

1.メトロポリス法を用いて0<T<2、2.5<T<10までのスピン配位を10000データ生成する
2.強磁性相(前者)に(1,0)常磁性相(後者)には(0,1)というラベル付をする。
3.データを8000個を訓練データ、2000個を検証データとしてニューラルネットワークに学習させる。

という計算を考えています。
このとき、データは適切に用意できていますが学習結果が予想通りになりません。
あまりにも損失関数が急激に減少しすぎてしまいます。
私のプログラム上でなにかミスがあるのでしょうか?

発生している問題・エラー

image.png

該当するソースコード

# 2. ニューラルネットワークの構築
model = Sequential([
    Input(shape=(900,)),          # 入力層の明示的な定義
    Dense(100),                   # 隠れ層
    LeakyReLU(negative_slope=0),         # 活性化関数
    Dense(2, activation="softmax")  # 出力層
])

# モデルのコンパイル
model.compile(loss='categorical_crossentropy', optimizer="adam")

# 3. 学習
history = model.fit(
    x_train, y_train,
    epochs=500,
    batch_size=64,
    validation_data=(x_val, y_val)
)

# 4. 学習の可視化
plt.figure(figsize=(12, 5))

# 損失関数のプロット
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Loss Function Over Epochs')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.yscale('log')
plt.legend()

plt.tight_layout()
plt.show()

自分で試したこと

image.png

実際にこの学習をしたニューラルネットワークを利用すると、温度ごとにスピンがどの相に属するかは図のようになっています。
傾きが急すぎるという点、相転移温度が2.27程度になるはずなのに2.5を超えてしまっているという点でIsingモデルを正確に再現できているとは言えない状態です。

image.png

スピン配位自体はしっかりとT=3.3で常磁性の性質を示しているので、この部分に問題はないと考えています。

[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1]
 [0. 1.]

xとyはこのような形でデータに入っています。

0

1Answer

物理が専門外で恐縮なのですが、参考となりそうなgithubプロジェクトを見つけましたので回答させていただきます。
もしかすると、このプロジェクトのコードをそのまま持ってきても期待されるシミュレーションはできるのではないかと思ました。

プロジェクトの中のファイルに同じようなグラフが出てきていて、上記のご質問と同じような計算がされているように見えます。

image.png

0Like

Your answer might help someone💌