最適化アルゴリズム:SGD、モメンタム、Adam

出版日: 2025年7月6日

最適化アルゴリズム:SGD、モメンタム、Adam

学習内容

  • 勾配降下最適化アルゴリズムの動作原理と相違点
  • SGD、モメンタム、Adamアルゴリズムのインタラクティブな可視化
  • パラメータ調整と収束挙動
  • 実装詳細と実用的な使用法

最適化アルゴリズム

オプティマイザーは、損失を最小化するためにパラメータを更新する方法を決定し、ニューラルネットワークの学習方法を制御します。オプティマイザーの選択は、トレーニング速度と最終的な性能に大きく影響します。

インタラクティブオプティマイザー比較

シンプルな二次関数の最小値に向かって、異なるオプティマイザーがどのように進むかを観察してください:

コントロール

可視化

SGD
モメンタム
Adam

時間経過による損失

ステップ 0 / 100 | SGD 損失: 9.0000 | モメンタム 損失: 9.0000 | Adam 損失: 9.0000

確率的勾配降下法(SGD)

最もシンプルなオプティマイザー。勾配の大きさに比例してパラメータを直接更新します。

主要な式:

θ = θ - α * ∇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

過去の勾配の重み付き平均を蓄積することで、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

特徴:

  • 長所: より速い収束、振動の減少、局所最小値をより良く克服
  • 短所: 追加のハイパーパラメータ、最小値をオーバーシュートする可能性
  • 最適な用途: 非凸最適化、振動が問題となる場合

Adam(適応モーメント推定)

モメンタムと適応学習率を組み合わせます。一次と二次モーメント推定に基づいて、各パラメータに個別の学習率を維持します。

主要な式:

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つのベータ ディープラーニング、汎用

実用的なガイドライン

SGDを使用する場合

  • メモリが限られている大規模データセット
  • 事前訓練済みモデルのファインチューニング
  • 再現可能な結果が必要な場合
  • シンプルな凸最適化問題

Adamを使用する場合

  • ディープニューラルネットワークをゼロから訓練
  • スパース勾配やスパースデータ
  • 良好なデフォルト性能が欲しい場合
  • 迅速なプロトタイピングと実験

学習率のガイドライン:

  • SGD: 0.1から開始、訓練が不安定な場合は下げる
  • SGD + モメンタム: 0.01-0.1から開始、モメンタム0.9
  • Adam: 0.001から開始、通常調整なしで良好に動作

人気フレームワークでの実装

PyTorch

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)

TensorFlow/Keras

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)

重要なポイント

  • ほとんどのディープラーニングタスクはAdamから開始 - 頑健で最小限の調整が必要
  • ファインチューニングや最高の最終性能が必要な場合はモメンタム付きSGDを使用
  • 学習率スケジューリングはすべてのオプティマイザーで収束を改善可能
  • オプティマイザーの選択は適切なアーキテクチャとデータ品質より重要度が低い
  • 訓練が不安定または収束が悪い場合は異なるオプティマイザーを実験

このブログは英語からLLMによって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。

コメントを残す

コメント

現在コメントがありません。

その他のブログ

Q学習:インタラクティブ強化学習の基礎

2025/07/07

Q学習:インタラクティブ強化学習の基礎

Q学習強化学習探索と利用機械学習AIインタラクティブグリッドワールド価値関数
文字から単語へ:日本語BPEトークナイザーの構築

2025/07/05

文字から単語へ:日本語BPEトークナイザーの構築

BPEトークナイザー日本語NLP単語機械学習テキスト処理自然言語処理
SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

2024/06/19

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

JavaScriptSvelteTooltip動的シンプルツールチップフロントエンド
JavaScriptを用いて東京都のインタラクティブな地図を作成する

2024/06/17

JavaScriptを用いて東京都のインタラクティブな地図を作成する

SvelteSVGJavaScriptTailwindインタラクティブな地図東京市区町村23区地図
Matplotlibで日本語文字化けを解決できる簡単な方法

2024/06/14

Matplotlibで日本語文字化けを解決できる簡単な方法

MatplotlibグラフチャートPython日本語文字化け問題バグ
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

2024/06/13

書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

書評トーキング・トゥ・ストレンジャーズ「よく知らない人」について私たちが知っておくべきことマルコム・グラッドウェル
日本語で最もよく使われる3000字の漢字

2024/06/07

日本語で最もよく使われる3000字の漢字

3000よく使う準漢字使用回数漢字日本語漢字リスト漢字普及率日本語能力試験独学勉強単語
VSCodeでRegexを使用してReplaceする方法

2024/06/07

VSCodeでRegexを使用してReplaceする方法

VSCodeRegex検索置き換える条件付き置換FindReplaceConditional Replace
SvelteではReadable Storeを使用するな

2024/06/06

SvelteではReadable Storeを使用するな

SvelteReadableWritableステート管理ストアStore速度メモリファイルサイズ
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

2024/06/05

GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

Gzip圧縮PakoWebサイトローディング速度SvelteKit
JavaScriptを使用してWebページ上でマウスが指している単語を特定する

2024/05/31

JavaScriptを使用してWebページ上でマウスが指している単語を特定する

JavascriptマウスPointerHoverWeb開発
SvelteとSVGを用いてインタラクティブな地図を作成する

2024/05/29

SvelteとSVGを用いてインタラクティブな地図を作成する

SvelteSVGインタラクティブな地図フロントエンド
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

2024/05/28

書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

書評Originals誰もが「人と違うこと」ができる時代アダム・グラント & シェリル・サンドバーグ
Javascriptを使用して数独を解く方法

2024/05/27

Javascriptを使用して数独を解く方法

数独を解くアルゴリズムJavaScriptコーディング
ウェブサイトへのトラフィックを1か月で10倍に増やした方法

2024/05/26

ウェブサイトへのトラフィックを1か月で10倍に増やした方法

ウェブサイトへのトラフィック増加クリックインプレッションGoogle Search Console
人生はサイクリングに似ている

2024/05/24

人生はサイクリングに似ている

サイクリング人生哲学成功
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

2024/05/19

JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

数独バックトラッキング・アルゴリズム完全なグリッドJavaScript
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

2024/05/16

Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

Tailwind素晴らしいフロントエンドWeb開発
PythonとGitフックを使用してサイトマップを自動的に生成する

2024/05/15

PythonとGitフックを使用してサイトマップを自動的に生成する

GitフックPythonサイトマップSvelteKit
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

2024/05/14

書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

書評Range (レンジ)David Epstein (デイビッド・エプスタイン)知識の「幅」が最強の武器になる
SvelteとSvelteKitはなんですか?

2024/05/13

SvelteとSvelteKitはなんですか?

SvelteSvelteKitFront-endVite
SvelteKitで国際化(多言語化)

2024/05/12

SvelteKitで国際化(多言語化)

国際化多言語SvelteKitI18N
SvelteでCachingを用いてDeploy時間を短縮する方法

2024/05/11

SvelteでCachingを用いてDeploy時間を短縮する方法

SvelteEnhanced ImageCachingDeploy Time
SvelteとIntersection Oberverによるレイジーローディング

2024/05/10

SvelteとIntersection Oberverによるレイジーローディング

レイジーローディングウェブサイト速度の最適化SvelteIntersection Observer
遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

2024/05/10

遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

株式書状ポートフォリ最適化遺伝的アルゴリズムPython
Pythonを用いてShapeFileをSVGに変換できる方法

2024/05/09

Pythonを用いてShapeFileをSVGに変換できる方法

ShapeFileSVGPythonGeoJSON
Svelteの反応性:変数、バインディング、およびキー関数

2024/05/08

Svelteの反応性:変数、バインディング、およびキー関数

Svelte反応性バインディングキー関数
書評 | 孫子の兵法

2024/05/07

書評 | 孫子の兵法

書評The Art Of War (兵法)Sun Tzu (孫子)Thomas Cleary
スペシャリストは終了。ゼネラリスト万歳!

2024/05/06

スペシャリストは終了。ゼネラリスト万歳!

専門家ジェネラリストパラダイムシフトソフトウエア・エンジニアリング
トルコ人の有権者の投票行動をPythonでの分析

2024/05/03

トルコ人の有権者の投票行動をPythonでの分析

トルコ投票者年齢分析国家投票有権者行動分析
Seleniumを用いてトルコ投票データベースを作る方法

2024/05/01

Seleniumを用いてトルコ投票データベースを作る方法

PythonSeleniumWeb Scrapingトルコ国家投票
SvelteとTailwindを使用してInfinite Scrollできる方法

2024/04/30

SvelteとTailwindを使用してInfinite Scrollできる方法

SvelteTailwindInfinite ScrollFront-end
1年間以内で日本語を駆使できるようになるための方法

2024/04/29

1年間以内で日本語を駆使できるようになるための方法

日本語短時間言語学習日本語能力試験ビジネス日本語
SvelteとTailwindを用いたWebサイトテンプレート

2024/04/25

SvelteとTailwindを用いたWebサイトテンプレート

Web開発フロントエンドSvelteTailwind
怠惰なエンジニアとひどいデザイン

2024/01/29

怠惰なエンジニアとひどいデザイン

怠け者エンジニア質の悪い製品StarbucksSBI証券
偉大さについて

2024/01/28

偉大さについて

雄大さ人生の意味満足できる人生目的
MacBook で PDF を PNG に変換する

2024/01/28

MacBook で PDF を PNG に変換する

PDFPNGMacBookAutomator
2023年振り返り:24冊の読んだ本のまとめ

2023/12/31

2023年振り返り:24冊の読んだ本のまとめ

読書 2023振り返り
Python PILを使用して写真コラージュを作成する方法

2023/12/30

Python PILを使用して写真コラージュを作成する方法

PythonPIL画像処理コラージュ
ウェブサイトの訪問者のデバイスとブラウザを検出する方法

2024/01/09

ウェブサイトの訪問者のデバイスとブラウザを検出する方法

Javascript端末検知ブラウザ検知Website分析
ChatGPT回答の解析

2024/01/19

ChatGPT回答の解析

ChatGPT大規模言語モデル機械学習生成AI