🧠学習の為、非常に単純な1次元4層位のニューラルネットをモデル化できますか?

はい、学習目的のために非常に単純な1次元4層のニューラルネットワークをモデル化することは可能です。ここでは、各層が1つのニューロンを持つと仮定しましょう。このモデルでは、各層間の接続は1対1で、各接続には重みがあります。また、簡単のためにバイアスは考慮しないことにします。活性化関数としては、よく使われるReLU(Rectified Linear Unit)を採用しましょう。

モデルの構造は次のようになります:

  1. 入力層:1つのニューロン(入力値を受け取る)

  2. 隠れ層1:1つのニューロン

  3. 隠れ層2:1つのニューロン

  4. 出力層:1つのニューロン(最終出力を生成)

各層間の重みを w1​,w2​,w3​ とし、ReLU関数を ReLU(x)=max(0,x) とします。このネットワークの順伝播と逆伝播のプロセスをモデル化してみましょう。

import torch
import torch.nn as nn
import torch.optim as optim

# ネットワークの定義
class SimpleNetwork(nn.Module):
    def __init__(self):
        super(SimpleNetwork, self).__init__()
        self.fc1 = nn.Linear(1, 1)  # 隠れ層1
        self.fc2 = nn.Linear(1, 1)  # 隠れ層2
        self.fc3 = nn.Linear(1, 1)  # 出力層

    def forward(self, x):
        x = torch.relu(self.fc1(x))  # ReLU活性化関数
        x = torch.relu(self.fc2(x))  # ReLU活性化関数
        x = self.fc3(x)
        return x

# ネットワークのインスタンス化
net = SimpleNetwork()

# 損失関数と最適化手法
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)

# 入力データと目標出力
input = torch.tensor([[1.0]])  # 例:入力値 1.0
target = torch.tensor([[0.0]])  # 例:目標出力 0.0

# 学習プロセス
for i in range(100):  # 100回の学習イテレーション
    # 順伝播
    output = net(input)

    # 損失の計算
    loss = criterion(output, target)

    # 逆伝播
    optimizer.zero_grad()  # 勾配を0に初期化
    loss.backward()        # 勾配の計算
    optimizer.step()       # 重みの更新

    # 途中経過の表示
    if (i+1) % 10 == 0:  # 10イテレーションごとに表示
        print(f"Iteration {i+1}/100")
        print(f"  Input: {input.item()}")
        print(f"  Output: {output.item()}")
        print(f"  Loss: {loss.item()}")
        for name, param in net.named_parameters():
            print(f"  {name}: {param.item()}")
        print("-" * 30)

このコードは、100回の学習イテレーションを行い、各10イテレーションごとに入力、出力、損失、および各層の重みの現在の値を表示します。このようにすることで、ネットワークがどのように出力を改善し、損失を減少させていくかを観察することができます。

お願い致します