出版日: 2025年7月6日
オプティマイザーは、損失を最小化するためにパラメータを更新する方法を決定し、ニューラルネットワークの学習方法を制御します。オプティマイザーの選択は、トレーニング速度と最終的な性能に大きく影響します。
シンプルな二次関数の最小値に向かって、異なるオプティマイザーがどのように進むかを観察してください:
ステップ 0 / 100 | SGD 損失: 9.0000 | モメンタム 損失: 9.0000 | Adam 損失: 9.0000
最もシンプルなオプティマイザー。勾配の大きさに比例してパラメータを直接更新します。
主要な式:
θ = θ - α * ∇f(θ)
αは学習率、∇f(θ)は勾配
class SGD:
def __init__(self, learning_rate=0.01):
self.lr = learning_rate
def update(self, params, gradients):
for i in range(len(params)):
params[i] -= self.lr * gradients[i]
return params
過去の勾配の重み付き平均を蓄積することで、SGDにモメンタムを追加します。これにより収束を加速し、振動を減少させます。
主要な式:
v = β * v + ∇f(θ)
θ = θ - α * v
βはモメンタム係数(通常0.9)
class SGDMomentum:
def __init__(self, learning_rate=0.01, momentum=0.9):
self.lr = learning_rate
self.momentum = momentum
self.velocity = None
def update(self, params, gradients):
if self.velocity is None:
self.velocity = [0] * len(params)
for i in range(len(params)):
self.velocity[i] = (self.momentum * self.velocity[i] +
gradients[i])
params[i] -= self.lr * self.velocity[i]
return params
モメンタムと適応学習率を組み合わせます。一次と二次モーメント推定に基づいて、各パラメータに個別の学習率を維持します。
主要な式:
m = β₁ * m + (1-β₁) * ∇f(θ)
v = β₂ * v + (1-β₂) * ∇f(θ)²
m̂ = m / (1-β₁ᵗ), v̂ = v / (1-β₂ᵗ)
θ = θ - α * m̂ / (√v̂ + ε)
デフォルト: β₁=0.9, β₂=0.999, ε=1e-8
class Adam:
def __init__(self, learning_rate=0.001, beta1=0.9, beta2=0.999):
self.lr = learning_rate
self.beta1 = beta1
self.beta2 = beta2
self.epsilon = 1e-8
self.m = None # First moment
self.v = None # Second moment
self.t = 0 # Time step
def update(self, params, gradients):
if self.m is None:
self.m = [0] * len(params)
self.v = [0] * len(params)
self.t += 1
for i in range(len(params)):
# Update moments
self.m[i] = self.beta1 * self.m[i] + (1 - self.beta1) * gradients[i]
self.v[i] = self.beta2 * self.v[i] + (1 - self.beta2) * gradients[i]**2
# Bias correction
m_hat = self.m[i] / (1 - self.beta1**self.t)
v_hat = self.v[i] / (1 - self.beta2**self.t)
# Update parameters
params[i] -= self.lr * m_hat / (math.sqrt(v_hat) + self.epsilon)
return params
オプティマイザー | メモリ | 収束 | ハイパーパラメータ | 最適な用途 |
---|---|---|---|---|
SGD | 最小 | 遅いが安定 | 学習率のみ | 大規模データセット、限られたメモリ |
モメンタム | 低 | SGDより速い | 学習率 + モメンタム | 非凸問題 |
Adam | 高 | 速い、適応的 | 学習率 + 2つのベータ | ディープラーニング、汎用 |
import torch.optim as optim
# SGD
optimizer = optim.SGD(model.parameters(), lr=0.01)
# SGD with momentum
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# Adam
optimizer = optim.Adam(model.parameters(), lr=0.001)
from tensorflow.keras.optimizers import SGD, Adam
# SGD
optimizer = SGD(learning_rate=0.01)
# SGD with momentum
optimizer = SGD(learning_rate=0.01, momentum=0.9)
# Adam
optimizer = Adam(learning_rate=0.001)
このブログは英語からLLMによって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。
コメントを残す
コメント
現在コメントがありません。
その他のブログ
2025/07/07
Q学習:インタラクティブ強化学習の基礎
2025/07/05
文字から単語へ:日本語BPEトークナイザーの構築
2024/06/19
SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する
2024/06/17
JavaScriptを用いて東京都のインタラクティブな地図を作成する
2024/06/14
Matplotlibで日本語文字化けを解決できる簡単な方法
2024/06/13
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル
2024/06/07
日本語で最もよく使われる3000字の漢字
2024/06/07
VSCodeでRegexを使用してReplaceする方法
2024/06/06
SvelteではReadable Storeを使用するな
2024/06/05
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法
2024/05/31
JavaScriptを使用してWebページ上でマウスが指している単語を特定する
2024/05/29
SvelteとSVGを用いてインタラクティブな地図を作成する
2024/05/28
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ
2024/05/27
Javascriptを使用して数独を解く方法
2024/05/26
ウェブサイトへのトラフィックを1か月で10倍に増やした方法
2024/05/24
人生はサイクリングに似ている
2024/05/19
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する
2024/05/16
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか
2024/05/15
PythonとGitフックを使用してサイトマップを自動的に生成する
2024/05/14
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン
2024/05/13
SvelteとSvelteKitはなんですか?
2024/05/12
SvelteKitで国際化(多言語化)
2024/05/11
SvelteでCachingを用いてDeploy時間を短縮する方法
2024/05/10
SvelteとIntersection Oberverによるレイジーローディング
2024/05/10
遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法
2024/05/09
Pythonを用いてShapeFileをSVGに変換できる方法
2024/05/08
Svelteの反応性:変数、バインディング、およびキー関数
2024/05/07
書評 | 孫子の兵法
2024/05/06
スペシャリストは終了。ゼネラリスト万歳!
2024/05/03
トルコ人の有権者の投票行動をPythonでの分析
2024/05/01
Seleniumを用いてトルコ投票データベースを作る方法
2024/04/30
SvelteとTailwindを使用してInfinite Scrollできる方法
2024/04/29
1年間以内で日本語を駆使できるようになるための方法
2024/04/25
SvelteとTailwindを用いたWebサイトテンプレート
2024/01/29
怠惰なエンジニアとひどいデザイン
2024/01/28
偉大さについて
2024/01/28
MacBook で PDF を PNG に変換する
2023/12/31
2023年振り返り:24冊の読んだ本のまとめ
2023/12/30
Python PILを使用して写真コラージュを作成する方法
2024/01/09
ウェブサイトの訪問者のデバイスとブラウザを検出する方法
2024/01/19
ChatGPT回答の解析