Upload 4 files
Browse files- 2Gv38_AutoLR/emoairy.py +5 -6
- 2Gv38_AutoLR/emotion.py +44 -43
2Gv38_AutoLR/emoairy.py
CHANGED
|
@@ -132,14 +132,14 @@ class EmoAiry(Optimizer):
|
|
| 132 |
# 行列の形状が2次元以上の場合、分散情報ベースのAB近似を使用
|
| 133 |
if grad.dim() >= 2:
|
| 134 |
# 行と列の2乗平均を計算 (分散の軽量な近似)
|
| 135 |
-
r_sq =
|
| 136 |
-
c_sq =
|
| 137 |
|
| 138 |
# 分散情報から勾配の近似行列を生成
|
| 139 |
# AB行列として見立てたものを直接生成し更新項を計算する
|
| 140 |
# A = sqrt(r_sq), B = sqrt(c_sq) AB行列近似を再現し履歴化で平滑化する
|
| 141 |
-
state.setdefault('exp_avg_r', torch.zeros_like(r_sq)).mul_(
|
| 142 |
-
state.setdefault('exp_avg_c', torch.zeros_like(c_sq)).mul_(
|
| 143 |
|
| 144 |
# 再構築した近似勾配の平方根の積で正規化
|
| 145 |
denom = torch.sqrt(state['exp_avg_r'] * state['exp_avg_c']).add_(group['eps'])
|
|
@@ -148,9 +148,8 @@ class EmoAiry(Optimizer):
|
|
| 148 |
|
| 149 |
# 1次元(ベクトル)の勾配補正
|
| 150 |
else:
|
| 151 |
-
beta1, beta2 = group['betas']
|
| 152 |
exp_avg_sq = state.setdefault('exp_avg_sq', torch.zeros_like(p))
|
| 153 |
-
exp_avg_sq.mul_(
|
| 154 |
denom = exp_avg_sq.sqrt().add_(group['eps'])
|
| 155 |
# 最終的な更新項を計算
|
| 156 |
update_term = grad / denom
|
|
|
|
| 132 |
# 行列の形状が2次元以上の場合、分散情報ベースのAB近似を使用
|
| 133 |
if grad.dim() >= 2:
|
| 134 |
# 行と列の2乗平均を計算 (分散の軽量な近似)
|
| 135 |
+
r_sq = grad.pow(2).mean(dim=tuple(range(1, grad.dim())), keepdim=True)
|
| 136 |
+
c_sq = grad.pow(2).mean(dim=0, keepdim=True)
|
| 137 |
|
| 138 |
# 分散情報から勾配の近似行列を生成
|
| 139 |
# AB行列として見立てたものを直接生成し更新項を計算する
|
| 140 |
# A = sqrt(r_sq), B = sqrt(c_sq) AB行列近似を再現し履歴化で平滑化する
|
| 141 |
+
state.setdefault('exp_avg_r', torch.zeros_like(r_sq)).mul_(beta2).add_(r_sq, alpha=1 - beta2)
|
| 142 |
+
state.setdefault('exp_avg_c', torch.zeros_like(c_sq)).mul_(beta2).add_(c_sq, alpha=1 - beta2)
|
| 143 |
|
| 144 |
# 再構築した近似勾配の平方根の積で正規化
|
| 145 |
denom = torch.sqrt(state['exp_avg_r'] * state['exp_avg_c']).add_(group['eps'])
|
|
|
|
| 148 |
|
| 149 |
# 1次元(ベクトル)の勾配補正
|
| 150 |
else:
|
|
|
|
| 151 |
exp_avg_sq = state.setdefault('exp_avg_sq', torch.zeros_like(p))
|
| 152 |
+
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
|
| 153 |
denom = exp_avg_sq.sqrt().add_(group['eps'])
|
| 154 |
# 最終的な更新項を計算
|
| 155 |
update_term = grad / denom
|
2Gv38_AutoLR/emotion.py
CHANGED
|
@@ -3,13 +3,11 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoTion v3.8.1 (
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
dNR係数により emoPulse に履歴を混ぜて安定させた(d / N 履歴 による信頼度の維持)
|
| 12 |
-
Early scalar、Early Stop、効率化しつつ精度向上させ負荷も軽減する等の改修と微調整
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoTion(Optimizer):
|
|
@@ -40,7 +38,7 @@ class EmoTion(Optimizer):
|
|
| 40 |
|
| 41 |
# 感情スカラー値生成(EMA差分、滑らかな非線形スカラー、tanh(diff) は ±1.0 で有界性)
|
| 42 |
# 係数"1":ema差分 のスケール調整処理に活用(感度調節係数)/通常は1(タスクに応じ調整可(非推奨))
|
| 43 |
-
# scale_base:Loss値とema値の乖離を修正(分母 ema(long)
|
| 44 |
# 1e-5(デフォルト)/1e-6(感度向上)/1e-4(安定性向上):分母を0にせず安定させる
|
| 45 |
# トラウマ的反応や慣れによる鈍化で安定性向上(ema-medium 安定と急変を信頼度で感知)
|
| 46 |
def _compute_scalar(self, ema):
|
|
@@ -111,7 +109,6 @@ class EmoTion(Optimizer):
|
|
| 111 |
|
| 112 |
grad = p.grad
|
| 113 |
state = self.state[p]
|
| 114 |
-
d_p = grad.shape
|
| 115 |
|
| 116 |
# 動的学習率補正により shadow 形成を信頼度で調整(trustは正値化(負にならない))
|
| 117 |
# shadow:必要時のみ(スパイクp部分に現在値を最大10%追従させる動的履歴更新)
|
|
@@ -128,38 +125,42 @@ class EmoTion(Optimizer):
|
|
| 128 |
state['shadow'].lerp_(p, leap_ratio)
|
| 129 |
|
| 130 |
# --- Start Gradient Update Logic ---
|
| 131 |
-
#
|
| 132 |
-
#
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
# --- End Gradient Update Logic ---
|
| 164 |
|
| 165 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -179,6 +180,6 @@ class EmoTion(Optimizer):
|
|
| 179 |
|
| 180 |
"""
|
| 181 |
https://github.com/muooon/EmoSens
|
| 182 |
-
|
| 183 |
-
|
| 184 |
"""
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoTion v3.8.1 (260204) shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 7 |
+
これまでの emo系 のすべて、emo系 v3.7 を継承し独自更新式を持つ、完全オリジナル最適化器
|
| 8 |
+
The “geometric relationship” between "W"eight and "G"radient Method
|
| 9 |
+
これまでの統計手法をやめ、重みベクトルと勾配ベクトルの直交性(W-Ref Geometry)に基づいて、
|
| 10 |
+
過去の慣性と現在の勾配を動的にブレンドする、1次モーメント単一保持型の幾何学的最適化アルゴリズム
|
|
|
|
|
|
|
| 11 |
"""
|
| 12 |
|
| 13 |
class EmoTion(Optimizer):
|
|
|
|
| 38 |
|
| 39 |
# 感情スカラー値生成(EMA差分、滑らかな非線形スカラー、tanh(diff) は ±1.0 で有界性)
|
| 40 |
# 係数"1":ema差分 のスケール調整処理に活用(感度調節係数)/通常は1(タスクに応じ調整可(非推奨))
|
| 41 |
+
# scale_base:Loss値とema値の乖離を修正(分母 ema(long) 「改善率」共通化/loss種に非依存)
|
| 42 |
# 1e-5(デフォルト)/1e-6(感度向上)/1e-4(安定性向上):分母を0にせず安定させる
|
| 43 |
# トラウマ的反応や慣れによる鈍化で安定性向上(ema-medium 安定と急変を信頼度で感知)
|
| 44 |
def _compute_scalar(self, ema):
|
|
|
|
| 109 |
|
| 110 |
grad = p.grad
|
| 111 |
state = self.state[p]
|
|
|
|
| 112 |
|
| 113 |
# 動的学習率補正により shadow 形成を信頼度で調整(trustは正値化(負にならない))
|
| 114 |
# shadow:必要時のみ(スパイクp部分に現在値を最大10%追従させる動的履歴更新)
|
|
|
|
| 125 |
state['shadow'].lerp_(p, leap_ratio)
|
| 126 |
|
| 127 |
# --- Start Gradient Update Logic ---
|
| 128 |
+
# --- Start EmoTion v4.0 (Pure W-Ref Geometry) ---
|
| 129 |
+
# p: 重みW, grad: 勾配g, state: 状態保存用辞書
|
| 130 |
+
|
| 131 |
+
# 1. 1次モーメント(exp_avg)の初期化: O(N) のみ
|
| 132 |
+
if 'exp_avg' not in state:
|
| 133 |
+
state['exp_avg'] = torch.zeros_like(p)
|
| 134 |
+
state['rho_ema'] = torch.zeros(1, device=p.device, dtype=p.dtype)
|
| 135 |
+
|
| 136 |
+
# 2. W-Reference / Geometry (幾何学的直交性) 算出
|
| 137 |
+
# 勾配が重みに対して「新鮮」(直交)か「冗長」(平行)かを判定
|
| 138 |
+
p_norm = p.norm()
|
| 139 |
+
g_norm = grad.norm()
|
| 140 |
+
rho = torch.abs(torch.sum(p * grad)) / (p_norm * g_norm + 1e-8)
|
| 141 |
+
|
| 142 |
+
# rhoの履歴更新 (スカラーのみ)
|
| 143 |
+
state['rho_ema'].mul_(beta1).add_(rho, alpha=1 - beta1)
|
| 144 |
+
|
| 145 |
+
# 3. 幾何学的適応型ブレンド
|
| 146 |
+
# 従来の beta1 固定ではなく、直交しているほど今の勾配 g を強く取り込む
|
| 147 |
+
# freshness が高い(rhoが小さい)ほど、慣性を無視して新しい方向へ舵を切る
|
| 148 |
+
freshness = (1.0 - state['rho_ema'])
|
| 149 |
+
|
| 150 |
+
# exp_avg = beta1 * exp_avg + (1 - beta1) * grad の「幾何学的拡張」
|
| 151 |
+
# 慣性と現時点の勾配を、直交性に基づいて混ぜ合わせる
|
| 152 |
+
state['exp_avg'].mul_(beta1).add_(grad, alpha=(1.0 - beta1) * freshness.item())
|
| 153 |
+
|
| 154 |
+
# 4. 更新ベクトルの決定 (Lionライクな符号抽出、または生ベクトル)
|
| 155 |
+
# ここでは「方向の純度」を優先し、更新の勢いを一定に保つ
|
| 156 |
+
update_vec = torch.sign(state['exp_avg'])
|
| 157 |
+
|
| 158 |
+
# 5. 重みの更新 (emoPulse = 絶対歩幅)
|
| 159 |
+
if group['weight_decay'] != 0:
|
| 160 |
+
p.mul_(1 - emoPulse * group['weight_decay'])
|
| 161 |
+
|
| 162 |
+
p.add_(update_vec, alpha=-emoPulse)
|
| 163 |
+
# --- End EmoTion v4.0 ---
|
| 164 |
# --- End Gradient Update Logic ---
|
| 165 |
|
| 166 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 180 |
|
| 181 |
"""
|
| 182 |
https://github.com/muooon/EmoSens
|
| 183 |
+
Pure W-Ref Geometry. Believing in a future for democratic AI learning.
|
| 184 |
+
Taking decisive steps forward, Weight-Reference Optimizer.
|
| 185 |
"""
|