muooon commited on
Commit
aafb7f8
·
verified ·
1 Parent(s): 58f475c

Upload 4 files

Browse files
Files changed (2) hide show
  1. 2Gv38_AutoLR/emoairy.py +5 -6
  2. 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 = torch.mean(grad * grad, dim=tuple(range(1, grad.dim())), keepdim=True).add_(group['eps'])
136
- c_sq = torch.mean(grad * grad, dim=0, keepdim=True).add_(group['eps'])
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_(beta1).add_(torch.sqrt(r_sq), alpha=1 - beta1)
142
- state.setdefault('exp_avg_c', torch.zeros_like(c_sq)).mul_(beta1).add_(torch.sqrt(c_sq), alpha=1 - beta1)
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_(beta1).addcmul_(grad, grad, value=(1 - beta2))
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 (260202) shadow-system v3.1 -moment v3.1 emoPulse v3.8
7
- emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
8
- EmoTion v3.7.6 (260120) shadow-system v3.1 -moment v3.1 emoPulse v3.7
9
- All-Emo v3.6, v3.7 継承 emoDrive 機構を emoPulse へ統合し簡略化(循環器的機構)
10
- emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
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) 「改善率」共通化/loss種に非依存)
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
- # 2次元以上かつ一定サイズ以上を行列近似対象とする
132
- # 判定:2次元以上かつ「低ランク化」でメモリコストが全体の 5% 以下の場合に適用
133
- if grad.dim() >= 2 and ((d_p[0] + d_p[1]) / p.numel()) < 0.05:
134
- grad_matrix = grad.view(d_p[0], -1)
135
- d0, d1 = grad_matrix.shape
136
-
137
- if 'exp_avg_row' not in state:
138
- state['exp_avg_row'] = torch.zeros(d0, dtype=grad.dtype, device=grad.device)
139
- state['exp_avg_col'] = torch.zeros(d1, dtype=grad.dtype, device=grad.device)
140
- #state['exp_avg_m'] = torch.zeros_like(grad_matrix)
141
-
142
- row, col = state['exp_avg_row'], state['exp_avg_col']
143
-
144
- # 1. 行列構造の統計更新(2次モーメントによる地形の解像度維持)
145
- row.mul_(beta2).add_(grad_matrix.pow(2).mean(dim=1), alpha=1 - beta2)
146
- col.mul_(beta2).add_(grad_matrix.pow(2).mean(dim=0), alpha=1 - beta2)
147
-
148
- # 2. 意志の正規化 (構造情報の抽出)
149
- inv_sq_row = torch.rsqrt(row.add(group['eps'])).unsqueeze(1)
150
- inv_sq_col = torch.rsqrt(col.add(group['eps'])).unsqueeze(0)
151
-
152
- # 3. 復元と更新ベクトル生成
153
- # 統計量でスケーリングすることで「信頼できる方向」を浮き彫りにする
154
- update = (grad_matrix * inv_sq_row * inv_sq_col).view_as(grad)
155
-
156
- else:
157
- # 1次元/小行列はそのまま流す
158
- update = grad
159
-
160
- # 最終出力:Weight Decay と Sign 更新の統合
161
- p.mul_(1.0 - group['weight_decay'] * emoPulse)
162
- p.add_(update.sign_(), alpha=-emoPulse)
 
 
 
 
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
- Thank you Adafactor and Lion.
183
- Believing in a future for democratic AI learning.
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
  """