Shikata Ga Nai

Private? There is no such things.

41. ニューラルネットワークの基礎

Hello there, ('ω')ノ

📌 1. ニューラルネットワークとは?

ニューラルネットワーク(NN) とは、
「複数の層(レイヤー)で構成されたノード(ニューロン)が、データのパターンを学習するモデル」 です。

入力層(Input Layer) → データを受け取る層
隠れ層(Hidden Layer) → 特徴量を抽出し、パターンを学習
出力層(Output Layer) → 予測結果を出す層

📌 基本構造

入力層 → 隠れ層 → 出力層
[Input] → [Hidden] → [Output]

「層が増えれば増えるほど、より複雑なパターンが学習できる!」
これが「ディープラーニング(Deep Learning)」の基本概念!


📌 2. ニューラルネットワークの仕組み

✅ ① 順伝播(フォワードプロパゲーション)

順伝播(Forward Propagation)は、入力から出力までの計算の流れ です。

📌 数式での説明

[ z = W \times X + b ]

[ a = \sigma(z) ]

記号 説明
(W) 重み(weights)
(X) 入力データ
(b) バイアス(bias)
(z) 線形変換結果
(a) 活性化関数の出力

「入力 × 重み + バイアス」を計算し、活性化関数で変換して次の層へ!


✅ ② 活性化関数(Activation Function)

活性化関数は、次の層への出力を制御する関数 です。

📌 代表的な活性化関数

関数 数式 特徴
シグモイド(Sigmoid) ( \sigma(z) = \frac{1}{1 + e^{-z}} ) 0〜1に変換(確率モデル)
ReLU(Rectified Linear Unit) ( f(z) = \max(0, z) ) 負の値をゼロにする(高速・主流)
ソフトマックス(Softmax) ( \frac{e^{z_i}}{\sum_j e^{z_j}} ) 多クラス分類向き

最近の主流は「ReLU」! シンプルで学習が早い!


✅ ③ 誤差逆伝播(バックプロパゲーション)

誤差逆伝播(Backpropagation)は、出力層での誤差を隠れ層まで逆方向に伝播し、重みとバイアスを更新する手法 です。

📌 勾配降下法(Gradient Descent)

[ W_{\text{new}} = W - \eta \frac{\partial L}{\partial W} ]

記号 説明
(W) 重み
(\eta) 学習率(learning rate)
(L) 損失関数(Loss)

「誤差を最小化する方向に重みを調整」するのが勾配降下法!
学習率が大きすぎると収束しない、小さすぎると時間がかかる!


📌 3. Pythonでニューラルネットワークを実装

✅ 手作りニューラルネットワーク

シンプルなニューラルネットワーク(1層の隠れ層)をNumPyで手作りしてみましょう!

import numpy as np

# シグモイド関数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# シグモイドの微分
def sigmoid_derivative(x):
    return x * (1 - x)

# データの準備
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])  # 入力(ANDゲート)
y = np.array([[0], [0], [0], [1]])  # 出力

# パラメータの初期化
np.random.seed(42)
input_dim, hidden_dim, output_dim = 2, 3, 1
W1 = np.random.rand(input_dim, hidden_dim)
W2 = np.random.rand(hidden_dim, output_dim)
b1 = np.zeros((1, hidden_dim))
b2 = np.zeros((1, output_dim))

# 学習のパラメータ
learning_rate = 0.1
epochs = 10000

# 学習ループ
for epoch in range(epochs):
    # 順伝播
    hidden_input = np.dot(X, W1) + b1
    hidden_output = sigmoid(hidden_input)
    output_input = np.dot(hidden_output, W2) + b2
    output = sigmoid(output_input)

    # 誤差の計算
    error = y - output
    loss = np.mean(np.square(error))

    # 逆伝播
    d_output = error * sigmoid_derivative(output)
    d_hidden = d_output.dot(W2.T) * sigmoid_derivative(hidden_output)

    # パラメータの更新
    W2 += hidden_output.T.dot(d_output) * learning_rate
    b2 += np.sum(d_output, axis=0, keepdims=True) * learning_rate
    W1 += X.T.dot(d_hidden) * learning_rate
    b1 += np.sum(d_hidden, axis=0, keepdims=True) * learning_rate

    # 1000回ごとに誤差を表示
    if epoch % 1000 == 0:
        print(f"Epoch {epoch}, Loss: {loss:.4f}")

# 最終的な出力
print("Final Predictions:")
print(output)

シンプルなNN(ANDゲートの学習)を実装!
順伝播・逆伝播・パラメータ更新の仕組みを理解!


✅ Kerasで簡単にニューラルネットワークを作成

より高度なモデルは、Keras(TensorFlow) を使うと簡単に作れます。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# モデルの定義
model = Sequential()
model.add(Dense(64, input_dim=2, activation="relu"))
model.add(Dense(32, activation="relu"))
model.add(Dense(1, activation="sigmoid"))

# モデルのコンパイル
model.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])

# モデルの学習
model.fit(X, y, epochs=100, batch_size=4)

# 予測
predictions = model.predict(X)
print("Predictions:", predictions)

Kerasで簡単に多層ニューラルネットワークを作成!
最先端のモデル構築もKerasなら手軽に実装可能!


📌 4. ニューラルネットワークの活用例

✅ 画像分類(CNN)

ResNet, EfficientNet などのCNNモデルを使って画像分類
Kaggleの画像コンペで大活躍!


✅ 自然言語処理(NLP)

BERT, GPT などのTransformerモデルを活用
感情分析、文章生成、機械翻訳などに応用


✅ 医療・金融・自動運転

病気の予測・画像診断
クレジットスコアの予測、詐欺検出
自動運転システムの判断基盤

ディープラーニングの応用範囲は無限大!


🎯 まとめ

ニューラルネットワークは「入力 → 隠れ層 → 出力」で構成!
順伝播で出力を計算し、逆伝播で重みを調整する!
Kerasを使うと、簡単に高性能なNNを作成可能!
Kaggleや実務で、画像・NLP・金融分野に応用しよう!

Best regards, (^^ゞ