はじめに: モデルが最適な重みを見つける方法
機械学習モデルのトレーニングとは、機械学習モデルが最小化するパラメーター値を見つけることを意味します。 1つ 損失関数。このプロセスはと呼ばれます 最適化 そしてそれはすべてのディープラーニングの中心です。最もよく使われるアルゴリズムは、 勾配降下法、 速度、安定性、汎用性のバランスをとった多くのバリエーションがあります。
何を学ぶか
- 勾配降下法バニラとその制限事項
- 確率的勾配降下法 (SGD) とミニバッチ
- 運動量とネステロフ加速勾配
- 適応アルゴリズム: RMSprop と Adam
- 学習率のスケジューリング: ウォームアップ、コサインアニーリング
- 収束、鞍点、損失の状況
勾配降下法: 基本的なアルゴリズム
Il 勾配降下法 (勾配降下法) 移動するとパラメータが更新されます 損失勾配と反対の方向:
どこ \\年 そして 学習率 (重要なハイパーパラメータ) e \\nabla_{\\theta} L で計算された勾配 みんな トレーニング データ (バッチ勾配降下法)。
類推: あなたが霧の中の丘の上にいて、そこに到達したいと思っていると想像してください。 下の谷。一歩ごとに足元に傾斜(勾配)を感じながら歩いていきます。 より急な下方向。学習率とステップ サイズ: 大きすぎます そして谷を飛び越えると、小さすぎて永遠に時間がかかります。
学習率の問題
学習率の選択は非常に重要です。
- \\年 大きすぎる:損失が変動または発散する
- \\年 小さすぎる: 収束が非常に遅い
- \\年 右: 最小値に向けて安定した収束
import numpy as np
# Funzione obiettivo: f(x) = x^4 - 3x^2 + 2 (ha due minimi)
def f(x):
return x**4 - 3*x**2 + 2
def grad_f(x):
return 4*x**3 - 6*x
# Gradient descent con diversi learning rate
for lr in [0.01, 0.05, 0.1]:
x = 2.0 # punto di partenza
history = [x]
for _ in range(100):
x = x - lr * grad_f(x)
history.append(x)
print(f"lr={lr}: x_finale={x:.6f}, f(x)={f(x):.6f}")
確率的勾配降下法 (SGD)
データセット全体にわたる勾配の計算にはコストがかかります。 シンガポールドル 単一のサンプルを使用する (または ミニバッチ) 勾配を推定するには:
推定勾配はノイズが多いですが、 平均して 正しい方向を指します。騒音 には驚くべき利点があります。極小値を回避するのに役立ち、次のように機能します。 レギュラライザー 暗黙的な.
実際には、 ミニバッチ SGD 32 ~ 256 サンプルのバッチ、妥協案 勾配の分散と計算効率の間の関係:
勢い: 加速するコンバージェンス
勢いは更新に「速度」を加え、過去の勾配を 1 つとして蓄積します。 指数移動平均:
どこ \\ベータ \\約 0.9 「メモリ」の勢いがどのくらいあるかを制御します。
直感: 丘を転がり落ちるボールを想像してください。勢いがないと、 小さな異常に遭遇するたびに停止します。勢いに乗ってボールはスピードを重ねる そして小さな穴を乗り越え、谷に向かってより早く収束します。運動量が振動を軽減する 交互の勾配を持つ方向に加速し、一定の勾配を持つ方向に加速します。
ネステロフ加速勾配 (NAG)
NAG は、「将来の」位置 (先読み) の勾配を計算することで勢いを改善します。
「まず自分がどこに行くのかを見て、それから方向を修正します。」 NAG はより速く収束します 標準的な勢いで、安値の前に減速します。
RMSprop: 適応学習率
RMSプロップ 各パラメータの学習率を個別に調整し、次のように割ります。 過去の勾配の二乗平均の根:
勾配が大きいパラメータの場合、実効学習率は低下します。パラメータの場合 勾配が小さいと増加します。これにより、フィーチャ間のスケールが異なるという問題が解決されます。
アダム: 最先端
アダム (適応モーメント推定) は最高の運動量と RMSprop を組み合わせます。 勾配の移動平均 (最初の瞬間) と勾配の移動平均の両方を維持する 2 乗 (2 番目のモーメント):
Con バイアス補正 ゼロ初期化を補正するには:
最終更新:
推奨されるデフォルトのハイパーパラメータ: \\beta_1 = 0.9, \\beta_2 = 0.999, \\イプシロン = 10^{-8}.
import numpy as np
class Adam:
def __init__(self, lr=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8):
self.lr = lr
self.beta1 = beta1
self.beta2 = beta2
self.epsilon = epsilon
self.m = None # Primo momento
self.v = None # Secondo momento
self.t = 0
def update(self, params, grads):
if self.m is None:
self.m = np.zeros_like(params)
self.v = np.zeros_like(params)
self.t += 1
self.m = self.beta1 * self.m + (1 - self.beta1) * grads
self.v = self.beta2 * self.v + (1 - self.beta2) * grads**2
# Bias correction
m_hat = self.m / (1 - self.beta1**self.t)
v_hat = self.v / (1 - self.beta2**self.t)
params -= self.lr * m_hat / (np.sqrt(v_hat) + self.epsilon)
return params
# Test: minimizzare f(x,y) = x^2 + 10*y^2 (landscape ellittico)
def f(params):
return params[0]**2 + 10 * params[1]**2
def grad_f(params):
return np.array([2*params[0], 20*params[1]])
# Confronto SGD vs Adam
params_sgd = np.array([5.0, 5.0])
params_adam = np.array([5.0, 5.0])
optimizer = Adam(lr=0.1)
print("Step | SGD f(x) | Adam f(x)")
for step in range(50):
# SGD
g = grad_f(params_sgd)
params_sgd -= 0.01 * g
# Adam
g = grad_f(params_adam)
params_adam = optimizer.update(params_adam, g)
if step % 10 == 0:
print(f"{step:4d} | {f(params_sgd):8.4f} | {f(params_adam):8.4f}")
学習率のスケジューリング
固定学習率から始めるのは最適ではありません。スケジュール戦略が適応する \\年 トレーニング中:
ステップディケイ
どこ \\ガンマ = 0.1 e s そしてその番号 各縮小間のエポック数。
コサインアニーリング
コサイン曲線に従って学習率を徐々に下げ、最後にはより積極的に学習します。
ウォームアップ + ディケイ
Transformers で使用: 低い学習率から開始し、学習率が直線的に増加します。 た_w ステップ (ウォームアップ)、その後減少します:
import numpy as np
def cosine_annealing(t, T, eta_min=1e-6, eta_max=1e-3):
return eta_min + 0.5 * (eta_max - eta_min) * (1 + np.cos(t * np.pi / T))
def warmup_cosine(t, warmup_steps, total_steps, eta_max=1e-3):
if t < warmup_steps:
return eta_max * t / warmup_steps
else:
progress = (t - warmup_steps) / (total_steps - warmup_steps)
return eta_max * 0.5 * (1 + np.cos(progress * np.pi))
# Visualizzazione (valori)
total_steps = 1000
warmup = 100
print("Step | Cosine LR | Warmup+Cosine LR")
for t in range(0, total_steps, 100):
cos_lr = cosine_annealing(t, total_steps)
warm_lr = warmup_cosine(t, warmup, total_steps)
print(f"{t:4d} | {cos_lr:.6f} | {warm_lr:.6f}")
サドルポイントと損失状況
高次元空間 (数百万のパラメータ) では、i 極小値 彼らはまれです。 本当の問題は、 サドルポイント: 勾配がゼロではない点 それらは最小値でも最大値でもありません。鞍点の確率は、 次元性。
幸いなことに、勢いのあるSGDとアダムは騒音のおかげでなんとか鞍部を逃れることができました。 確率的かつ蓄積された勢い。
概要と ML との関係
覚えておくべき重要なポイント
- 勾配降下法: \\theta \\leftarrow \\theta - \\eta \\nabla L - 基本的なアルゴリズム
- シンガポールドル: 効率を上げるためにミニバッチを使用し、ノイズは一般化に役立ちます
- 勢い: スピードを蓄積し、損失面の凹凸を克服します。
- アダム: 運動量と適応学習率を組み合わせたもので、DL のデフォルトです。
- 学習率のスケジュール設定: ウォームアップ + コサイン減衰はトランスフォーマーの標準です
- サドルポイント: 高次元では極小値よりも問題がある
次の記事で: を探索してみます 情報理論。 エントロピー、クロスエントロピー (分類に最もよく使用される損失)、KL 発散、 可能性が最も高い深いつながり。







