モッピー!ポイ活応援ポイントサイト
未分類

ゼロから作るDeepLearning ③ メモ

chatGPTと会話した内容をまとめたもの

1. ニューラルネットワークの基本概念

ニューラルネットワーク(NN)は、機械学習の中心的な技術であり、生物学的な神経細胞のモデルを基にしています。NNは複数の層から成り、それぞれの層にはノード(ニューロン)が含まれています。信号は層を通過し、重みとバイアスを持つ接続によって調整されます。活性化関数は信号の非線形性を導入し、ネットワークが非線形な関数を学習できるようにします。


2. パーセプトロンの学習

パーセプトロンはニューラルネットワークの基本単位であり、入力信号に重みを掛けて合計し、活性化関数を通して出力を計算します。パーセプトロンの学習は、重みとバイアスの調整によって行われます。誤差を最小化するために、勾配降下法が使用されます。また、パーセプトロンを用いた論理ゲートの実装と学習も重要なトピックです。


3. ニューラルネットワークのトレーニング

ニューラルネットワークをトレーニングするプロセスでは、モデルの構築から訓練データのミニバッチ処理、損失関数の使用、そして勾配降下法によるパラメータの最適化が含まれます。エポックとミニバッチについての説明も行います。これらの要素が組み合わさって、モデルは訓練データに適合します。

エポックとミニバッチ: トレーニングプロセスは、エポックとミニバッチという単位で進行します。エポックは訓練データセット全体を一度処理する単位で、複数のエポックが通常実行されます。

ミニバッチは各エポック内での訓練データの小さなサブセットです。

ミニバッチごとに勾配降下法が適用され、モデルのパラメータが更新されます。


4. 活性化関数の比較

シグモイド関数、ReLU関数、その他の活性化関数について詳細に説明します。それぞれの関数の特性と、どのようなタスクで使用するべきかについて議論します。活性化関数の選択はモデルの性能に大きな影響を与えます。

以下に、シグモイド関数とReLU関数の特性および適用事例を表にまとめて示します

以下の表は、ReLU(Rectified Linear Unit)とSELU(Scaled Exponential Linear Unit)の主な特徴を比較したものです。これにより、両者の違いとそれぞれの利点を理解するのに役立つでしょう。

特徴 ReLU SELU
活性化関数 f(x) = max(0, x) f(x) = λx for x > 0, f(x) = λα(e^x – 1) for x ≤ 0
自己正規化性 持たない あり
勾配消失問題 発生しやすい 軽減される
勾配爆発問題 発生しやすい 軽減される
非線形性 あり あり
スパース性 ない あり
スケーリング 不要 必要(アルファとラムダの設定が必要)

この表からわかるように、ReLUはシンプルで計算効率が高い活性化関数であり、勾配消失問題や勾配爆発問題には注意が必要ですが、多くの場面で良いパフォーマンスを発揮します。一方、SELUは自己正規化性を持ち、勾配消失と勾配爆発を軽減し、スパース性をもたらす特性がありますが、適切なハイパーパラメータ(アルファとラムダ)の設定が必要です。

どちらの活性化関数を選択するかは、問題の性質やデータセットに依存します。一般的な経験則として、まずReLUを試してみることが推奨されます。しかし、深層ネットワークの訓練において勾配消失や勾配爆発が問題となる場合には、SELUを検討する価値があります。選択肢を検討し、実験を通じて最適な活性化関数を見つけることが大切です。


5. ソフトマックス関数と多クラス分類

ソフトマックス関数は多クラス分類タスクで重要な役割を果たします。この関数の理解と実装方法について詳細に説明します。多クラス分類の例として、手書き数字認識(MNISTデータセットなど)も取り上げます。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# データの前処理
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])

# MNISTデータセットをダウンロードし、訓練データとテストデータに分割
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)

# DataLoaderを使用してデータをバッチで読み込む
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

# ニューラルネットワークの定義
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 128)
        self.fc2 = nn.Linear(128, 64)
        self.fc3 = nn.Linear(96, 10)

    def forward(self, x):
        x = x.view(-1, 28 * 28)  # 画像を1次元に変換
        x = torch.selu(self.fc1(x))
        x = torch.selu(self.fc2(x))
        x = self.fc3(x)
        return x

# モデルのインスタンス化
model = Net()

# 損失関数とオプティマイザの定義
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# トレーニング
epochs = 10
for epoch in range(epochs):
    for batch_idx, (data, target) in enumerate(train_loader):
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

    print(f"Epoch {epoch + 1}/{epochs}, Loss: {loss.item()}")

# テスト
model.eval()
correct = 0
total = 0
with torch.no_grad():
    for data, target in test_loader:
        output = model(data)
        _, predicted = torch.max(output.data, 1)
        total += target.size(0)
        correct += (predicted == target).sum().item()

print(f"Accuracy on test data: {(correct / total) * 100}%")
ABOUT ME
たけ
はじめまして! たけといいます。 20代男性サラリーマンが資産運用で5年で3000万をめざします。 これを読んで自分でも出来るのではないかと思ってくれる人が増えると嬉しいです。 お金を得ることは手段に過ぎません。若いうちに稼いで、自分の時間をより大切なことに使いたいです。 【2019投資戦歴】 投資資金合計 300万 2019年度単年損益(年利) FX 15万(15%) 投信 9万(7%) 株式 4万(8%) ※投信、株式は含み益