前回は、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の構築へ。