PyTorch学習ノート3 - ニューラルネットワークの構築

投稿日: 2025/09/22

OGP

前回は、PyTorchのテンソル操作と自動微分について学びました。
今回は、ニューラルネットワークの基本的な構築方法について説明します。

1. ニューラルネットワークの基本構造

ニューラルネットワークは、複数の層(レイヤー)から構成されます。
各層は、入力データを受け取り、重みとバイアスを使って変換を行います。

一般的なニューラルネットワークの構造は以下の通りです。

  • 入力層: データを受け取る層
  • 隠れ層: 複数の層が存在し、データを変換
  • 出力層: 最終的な予測結果を出力する層

2. PyTorchでのニューラルネットワーク構築

PyTorchでは、torch.nnモジュールを使ってニューラルネットワークを構築します。

2.1 モデルの定義

まず、torch.nn.Moduleを継承したクラスを作成し、ニューラルネットワークの構造を定義します。
torch.nn.Moduleは、PyTorchのすべてのニューラルネットワークモデルの基底クラスです。

import torch
import torch.nn as nn

class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(10, 50)   # 入力層から隠れ層への全結合層
        self.fc2 = nn.Linear(50, 1)    # 隠れ層から出力層への全結合層
        self.relu = nn.ReLU()          # 活性化関数

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

nn.Linearは全結合層を定義するためのクラスです。
ここでは、入力が10次元、隠れ層が50次元、出力が1次元の全結合層を定義しています。
nn.ReLUは活性化関数としてReLU(Rectified Linear Unit)を使用しています。
ReLUは、負の値を0に変換し、正の値はそのまま通過させる関数です。

self.fc1(x)は、入力データxを全結合層fc1に通し、その出力を次の層に渡します。
self.relu(x)は、全結合層の出力にReLU活性化関数を適用します。
self.fc2(x)は、ReLUの出力を全結合層fc2に通し、最終的な出力を得ます。

2.2 モデルのインスタンス化

次に、モデルのインスタンスを作成します。

model = SimpleNN()

2.3 損失関数と最適化手法の定義

ニューラルネットワークの学習には、損失関数と最適化手法が必要です。

criterion = nn.MSELoss()  # 平均二乗誤差損失
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 確率的勾配降下法

損失関数とは、モデルの予測と実際の値との差を測る指標です。
最適化手法は、損失を最小化するためにモデルのパラメータを更新する方法です。
ここでは、損失関数として平均二乗誤差(MSE)を使用し、最適化手法として確率的勾配降下法(SGD)を使用しています。
平均二乗誤差は回帰問題でよく使われる損失関数で、予測値と実際の値の差の二乗の平均を計算します。
確率的勾配降下法は、データセットからランダムに選んだサンプルを使ってパラメータを更新する手法で、大規模なデータセットに対して効率的です。

2.4 学習の実行

最後に、モデルの学習を実行します。

# ダミーデータの作成
inputs = torch.randn(100, 10)  # 100サンプル、10特徴量
targets = torch.randn(100, 1)   # 100サンプル、1ターゲット

# 学習ループ
for epoch in range(1000):  # 1000エポック
    model.train()  # モデルを訓練モードに設定
    optimizer.zero_grad()  # 勾配の初期化
    outputs = model(inputs)  # 順伝播
    loss = criterion(outputs, targets)  # 損失の計算
    loss.backward()  # 逆伝播
    optimizer.step()  # パラメータの更新

    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/1000], Loss: {loss.item():.4f}')

このコードでは、1000エポックにわたってモデルを学習させています。
各エポックで、入力データに対するモデルの出力を計算し、損失を評価し、勾配を計算してパラメータを更新します。
100エポックごとに損失を表示しています。

実際に実行すると、損失が徐々に減少していくことが確認できます。

これで、PyTorchを使った基本的なニューラルネットワークの構築と学習方法を学びました。
次回は、より複雑なモデルやデータセットを使った実践的な例を紹介します。
続きは、PyTorch学習ノート4 - CNNの構築へ。