Upload 5 files
Browse files- 2Gv38_AutoLR/emoairy.py +19 -11
- 2Gv38_AutoLR/emocats.py +7 -7
- 2Gv38_AutoLR/emosens.py +13 -9
- 2Gv38_AutoLR/emotion.py +17 -17
- 2Gv38_AutoLR/emovoid.py +33 -22
2Gv38_AutoLR/emoairy.py
CHANGED
|
@@ -3,13 +3,12 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoAiry v3.8.
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
-
|
| 12 |
-
Early scalar、Early Stop、効率化しつつ精度向上させ負荷も軽減する等の改修と微調整
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoAiry(Optimizer):
|
|
@@ -138,9 +137,15 @@ class EmoAiry(Optimizer):
|
|
| 138 |
# 分散情報から勾配の近似行列を生成
|
| 139 |
# AB行列として見立てたものを直接生成し更新項を計算する
|
| 140 |
# A = sqrt(r_sq), B = sqrt(c_sq) AB行列近似を再現し履歴化で平滑化する
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
# 再構築した近似勾配の平方根の積で正規化
|
| 145 |
denom = torch.sqrt(state['exp_avg_r'] * state['exp_avg_c']).add_(group['eps'])
|
| 146 |
# 最終的な更新項を計算
|
|
@@ -148,7 +153,9 @@ class EmoAiry(Optimizer):
|
|
| 148 |
|
| 149 |
# 1次元(ベクトル)の勾配補正
|
| 150 |
else:
|
| 151 |
-
|
|
|
|
|
|
|
| 152 |
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
|
| 153 |
denom = exp_avg_sq.sqrt().add_(group['eps'])
|
| 154 |
# 最終的な更新項を計算
|
|
@@ -168,8 +175,9 @@ class EmoAiry(Optimizer):
|
|
| 168 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 169 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 170 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
|
|
|
|
|
|
| 171 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
| 172 |
-
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 173 |
else:
|
| 174 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 175 |
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoAiry v3.8.3 (260215) Standard Edition
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
+
これまでの emo系 のすべて、emo系 v3.7 を継承し、早期停止関連の効率化やコード修正等を実施
|
| 9 |
+
EmoAiry v3.8.1 (260201) shadow-system v3.1 -moment v3.1 emoPulse v3.7
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
+
emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoAiry(Optimizer):
|
|
|
|
| 137 |
# 分散情報から勾配の近似行列を生成
|
| 138 |
# AB行列として見立てたものを直接生成し更新項を計算する
|
| 139 |
# A = sqrt(r_sq), B = sqrt(c_sq) AB行列近似を再現し履歴化で平滑化する
|
| 140 |
+
if 'exp_avg_r' not in state:
|
| 141 |
+
exp_avg_r = state.setdefault('exp_avg_r', torch.zeros_like(r_sq))
|
| 142 |
+
exp_avg_c = state.setdefault('exp_avg_c', torch.zeros_like(c_sq))
|
| 143 |
+
|
| 144 |
+
exp_avg_r = state['exp_avg_r']
|
| 145 |
+
exp_avg_c = state['exp_avg_c']
|
| 146 |
+
# 指数移動平均の更新
|
| 147 |
+
exp_avg_r.mul_(beta2).add_(r_sq, alpha=1 - beta2)
|
| 148 |
+
exp_avg_c.mul_(beta2).add_(c_sq, alpha=1 - beta2)
|
| 149 |
# 再構築した近似勾配の平方根の積で正規化
|
| 150 |
denom = torch.sqrt(state['exp_avg_r'] * state['exp_avg_c']).add_(group['eps'])
|
| 151 |
# 最終的な更新項を計算
|
|
|
|
| 153 |
|
| 154 |
# 1次元(ベクトル)の勾配補正
|
| 155 |
else:
|
| 156 |
+
if 'exp_avg' not in state:
|
| 157 |
+
exp_avg_sq = state.setdefault('exp_avg_sq', torch.zeros_like(p))
|
| 158 |
+
exp_avg_sq = state['exp_avg_sq']
|
| 159 |
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
|
| 160 |
denom = exp_avg_sq.sqrt().add_(group['eps'])
|
| 161 |
# 最終的な更新項を計算
|
|
|
|
| 175 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 176 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 177 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
| 178 |
+
if not self.should_stop:
|
| 179 |
+
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 180 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 181 |
else:
|
| 182 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 183 |
|
2Gv38_AutoLR/emocats.py
CHANGED
|
@@ -3,13 +3,12 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoCats v3.8.
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
-
|
| 12 |
-
Early scalar、Early Stop、効率化しつつ精度向上させ負荷も軽減する等の改修と微調整
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoCats(Optimizer):
|
|
@@ -151,8 +150,9 @@ class EmoCats(Optimizer):
|
|
| 151 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 152 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 153 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
|
|
|
|
|
|
| 154 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
| 155 |
-
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 156 |
else:
|
| 157 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 158 |
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoCats v3.8.3 (260215) Standard Edition
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
+
これまでの emo系 のすべて、emo系 v3.7 を継承し、早期停止関連の効率化やコード修正等を実施
|
| 9 |
+
EmoAiry v3.8.1 (260201) shadow-system v3.1 -moment v3.1 emoPulse v3.7
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
+
emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoCats(Optimizer):
|
|
|
|
| 150 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 151 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 152 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
| 153 |
+
if not self.should_stop:
|
| 154 |
+
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 155 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 156 |
else:
|
| 157 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 158 |
|
2Gv38_AutoLR/emosens.py
CHANGED
|
@@ -3,13 +3,12 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoSens v3.8.
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
-
|
| 12 |
-
Early scalar、Early Stop、効率化しつつ精度向上させ負荷も軽減する等の改修と微調整
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoSens(Optimizer):
|
|
@@ -130,8 +129,12 @@ class EmoSens(Optimizer):
|
|
| 130 |
|
| 131 |
# --- Start Gradient Update Logic ---
|
| 132 |
# 1次・2次モーメントを使った勾配補正(decoupled weight decay)
|
| 133 |
-
|
| 134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 135 |
|
| 136 |
exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)
|
| 137 |
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
|
|
@@ -151,8 +154,9 @@ class EmoSens(Optimizer):
|
|
| 151 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 152 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 153 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
|
|
|
|
|
|
| 154 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
| 155 |
-
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 156 |
else:
|
| 157 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 158 |
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoSens v3.8.3 (260215) Standard Edition
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
+
これまでの emo系 のすべて、emo系 v3.7 を継承し、早期停止関連の効率化やコード修正等を実施
|
| 9 |
+
EmoAiry v3.8.1 (260201) shadow-system v3.1 -moment v3.1 emoPulse v3.7
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
+
emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoSens(Optimizer):
|
|
|
|
| 129 |
|
| 130 |
# --- Start Gradient Update Logic ---
|
| 131 |
# 1次・2次モーメントを使った勾配補正(decoupled weight decay)
|
| 132 |
+
if 'exp_avg' not in state:
|
| 133 |
+
exp_avg = state.setdefault('exp_avg', torch.zeros_like(p))
|
| 134 |
+
exp_avg_sq = state.setdefault('exp_avg_sq', torch.zeros_like(p))
|
| 135 |
+
|
| 136 |
+
exp_avg = state['exp_avg']
|
| 137 |
+
exp_avg_sq = state['exp_avg_sq']
|
| 138 |
|
| 139 |
exp_avg.mul_(beta1).add_(grad, alpha=1 - beta1)
|
| 140 |
exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
|
|
|
|
| 154 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 155 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 156 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
| 157 |
+
if not self.should_stop:
|
| 158 |
+
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 159 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 160 |
else:
|
| 161 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 162 |
|
2Gv38_AutoLR/emotion.py
CHANGED
|
@@ -3,9 +3,9 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoTion v3.8.
|
| 7 |
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
-
これまでの emo系
|
| 9 |
The “geometric relationship” between "W"eight and "G"radient Method
|
| 10 |
これまでの統計手法をやめ、重みベクトルと勾配ベクトルの直交性(W-Ref Geometry)に基づいて、
|
| 11 |
過去の慣性と現在の勾配を動的にブレンドする、1次モーメント単一保持型の幾何学的最適化アルゴリズム
|
|
@@ -130,37 +130,36 @@ class EmoTion(Optimizer):
|
|
| 130 |
|
| 131 |
# --- Start Gradient Update Logic ---
|
| 132 |
# --- EmoTion (Pure W-Ref Geometry) ---
|
| 133 |
-
# 1
|
| 134 |
if 'exp_avg' not in state:
|
| 135 |
state['exp_avg'] = torch.zeros_like(p)
|
| 136 |
state['rho_ema'] = torch.zeros(1, device=p.device, dtype=p.dtype)
|
| 137 |
|
| 138 |
-
|
|
|
|
|
|
|
|
|
|
| 139 |
# 勾配が重み(実体)に対して「新鮮」(直交)か「冗長」(平行)かを判定
|
| 140 |
# 高次元空間における集中現象を利用した「情報の選別」
|
| 141 |
-
rho = torch.abs(torch.
|
| 142 |
|
| 143 |
# rhoの履歴更新 (スカラーのみ)
|
| 144 |
-
|
| 145 |
|
| 146 |
-
#
|
| 147 |
# 従来の beta1 固定ではなく、直交しているほど今の勾配 g を強く取り込む
|
| 148 |
# freshness が高い(rhoが小さい)ほど、慣性を無視して新しい方向へ舵を切る
|
| 149 |
-
freshness =
|
| 150 |
|
| 151 |
# exp_avg = beta1 * exp_avg + (1 - beta1) * grad の「幾何学的拡張」
|
| 152 |
# 慣性と現時点の勾配を、直交性に基づいて混ぜ合わせる
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
# 4. 更新ベクトルの決定 (Lionライクな符号抽出、または生ベクトル)
|
| 156 |
-
# ここでは「方向の純度」を優先し、更新の勢いを一定に保つ
|
| 157 |
-
update_vec = torch.sign(state['exp_avg'])
|
| 158 |
|
| 159 |
-
#
|
| 160 |
if group['weight_decay'] != 0:
|
| 161 |
-
p.mul_(1 -
|
| 162 |
|
| 163 |
-
p.add_(
|
| 164 |
# --- End Gradient Update Logic ---
|
| 165 |
|
| 166 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -171,8 +170,9 @@ class EmoTion(Optimizer):
|
|
| 171 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 172 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 173 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
|
|
|
|
|
|
| 174 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
| 175 |
-
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 176 |
else:
|
| 177 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 178 |
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoTion v3.8.3 (260215) Moment-Free Edition
|
| 7 |
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
+
これまでの emo系 のすべてを継承し、独自更新式を持つ、完全オリジナル最適化器
|
| 9 |
The “geometric relationship” between "W"eight and "G"radient Method
|
| 10 |
これまでの統計手法をやめ、重みベクトルと勾配ベクトルの直交性(W-Ref Geometry)に基づいて、
|
| 11 |
過去の慣性と現在の勾配を動的にブレンドする、1次モーメント単一保持型の幾何学的最適化アルゴリズム
|
|
|
|
| 130 |
|
| 131 |
# --- Start Gradient Update Logic ---
|
| 132 |
# --- EmoTion (Pure W-Ref Geometry) ---
|
| 133 |
+
# 1次モーメント(exp_avg)の初期化: O(N) のみ
|
| 134 |
if 'exp_avg' not in state:
|
| 135 |
state['exp_avg'] = torch.zeros_like(p)
|
| 136 |
state['rho_ema'] = torch.zeros(1, device=p.device, dtype=p.dtype)
|
| 137 |
|
| 138 |
+
exp_avg = state['exp_avg']
|
| 139 |
+
rho_ema = state['rho_ema']
|
| 140 |
+
|
| 141 |
+
# W-Reference / Geometry (幾何学的直交性) 算出
|
| 142 |
# 勾配が重み(実体)に対して「新鮮」(直交)か「冗長」(平行)かを判定
|
| 143 |
# 高次元空間における集中現象を利用した「情報の選別」
|
| 144 |
+
rho = torch.abs(torch.dot(p.view(-1), grad.view(-1))) / (p_norm * g_norm + 1e-8)
|
| 145 |
|
| 146 |
# rhoの履歴更新 (スカラーのみ)
|
| 147 |
+
rho_ema.mul_(beta1).add_(rho, alpha=1 - beta1)
|
| 148 |
|
| 149 |
+
# 幾何学的適応型ブレンド
|
| 150 |
# 従来の beta1 固定ではなく、直交しているほど今の勾配 g を強く取り込む
|
| 151 |
# freshness が高い(rhoが小さい)ほど、慣性を無視して新しい方向へ舵を切る
|
| 152 |
+
freshness = 1.0 - rho_ema.item()
|
| 153 |
|
| 154 |
# exp_avg = beta1 * exp_avg + (1 - beta1) * grad の「幾何学的拡張」
|
| 155 |
# 慣性と現時点の勾配を、直交性に基づいて混ぜ合わせる
|
| 156 |
+
exp_avg.mul_(beta1).add_(grad, alpha=(1.0 - beta1) * freshness)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 157 |
|
| 158 |
+
# 重みの更新 (emoPulse = 絶対歩幅)
|
| 159 |
if group['weight_decay'] != 0:
|
| 160 |
+
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 161 |
|
| 162 |
+
p.add_(exp_avg.sign(), alpha=-emoPulse)
|
| 163 |
# --- End Gradient Update Logic ---
|
| 164 |
|
| 165 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 170 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 171 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 172 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
| 173 |
+
if not self.should_stop:
|
| 174 |
+
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 175 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 176 |
else:
|
| 177 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 178 |
|
2Gv38_AutoLR/emovoid.py
CHANGED
|
@@ -3,12 +3,12 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoVoid v3.8.
|
| 7 |
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
-
これまでの emo系
|
| 9 |
The “geometric relationship” between "W"eight and "G"radient Method
|
| 10 |
-
|
| 11 |
-
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoVoid(Optimizer):
|
|
@@ -104,6 +104,29 @@ class EmoVoid(Optimizer):
|
|
| 104 |
emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
|
| 105 |
# --- End emoPulse (完全自動LR生成) ---
|
| 106 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
for group in self.param_groups:
|
| 108 |
beta1, beta2 = group['betas']
|
| 109 |
for p in (p for p in group['params'] if p.grad is not None):
|
|
@@ -111,9 +134,6 @@ class EmoVoid(Optimizer):
|
|
| 111 |
grad = p.grad
|
| 112 |
state = self.state[p]
|
| 113 |
|
| 114 |
-
p_norm = p.norm()
|
| 115 |
-
g_norm = grad.norm()
|
| 116 |
-
|
| 117 |
# 動的学習率補正により shadow 形成を信頼度で調整(trustは正値化(負にならない))
|
| 118 |
# shadow:必要時のみ(スパイクp部分に現在値を最大10%追従させる動的履歴更新)
|
| 119 |
# 混合比率:スカラーが閾値を超える場合にのみ計算される(信頼できる感情信号かどうかの選別)
|
|
@@ -129,20 +149,9 @@ class EmoVoid(Optimizer):
|
|
| 129 |
state['shadow'].lerp_(p, leap_ratio)
|
| 130 |
|
| 131 |
# --- Start Gradient Update Logic ---
|
| 132 |
-
# --- EmoVoid (
|
| 133 |
-
#
|
| 134 |
-
|
| 135 |
-
rho = torch.abs(torch.sum(p * grad)) / (p_norm * g_norm + 1e-8)
|
| 136 |
-
# 鮮度(直交性スコア)
|
| 137 |
-
freshness = (1.0 - rho) # EMAを通さない瞬間の鮮度
|
| 138 |
-
|
| 139 |
-
# Weight Decay が不要な理由:
|
| 140 |
-
# ノルムが増大する方向に進もうとすると rho 増加で自らブレーキを踏む
|
| 141 |
-
# 慣性を使わず、現在の勾配の方向(sign)に、鮮度を乗算
|
| 142 |
-
update_vec = torch.sign(grad) * freshness
|
| 143 |
-
|
| 144 |
-
# 更新
|
| 145 |
-
p.add_(update_vec, alpha=-emoPulse)
|
| 146 |
# --- End Gradient Update Logic ---
|
| 147 |
|
| 148 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -153,8 +162,10 @@ class EmoVoid(Optimizer):
|
|
| 153 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 154 |
# 誤判定防止をしな���のは点灯頻度で停止準備(予兆)にするため
|
| 155 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
|
|
|
|
|
|
|
|
|
| 156 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
| 157 |
-
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 158 |
else:
|
| 159 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 160 |
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoVoid v3.8.3 (260215) Moment-Free Edition
|
| 7 |
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
+
これまでの emo系 のすべてを継承し、独自更新式の特徴を受け継ぐ完全オリジナル最適化器
|
| 9 |
The “geometric relationship” between "W"eight and "G"radient Method
|
| 10 |
+
幾何学的最適化アルゴリズム Approx W-Ref Geometry 近似アシスト更新にし負荷低減
|
| 11 |
+
完全1次2次モーメント廃止、さまざまなコストを極限まで低減、正確性と軽量性と快適性を向上
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoVoid(Optimizer):
|
|
|
|
| 104 |
emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
|
| 105 |
# --- End emoPulse (完全自動LR生成) ---
|
| 106 |
|
| 107 |
+
# --- Start Approx W-Ref Geometry 近似アシスト ---
|
| 108 |
+
# Weight Reference Geometry ("W"eight and "G"radient Method)
|
| 109 |
+
# 中間テンソルによるVRAM負荷やcos類似度測定の計算負荷を実質0にする
|
| 110 |
+
with torch.no_grad():
|
| 111 |
+
# 現在の全パラメータのL1ノルムを一括計算(計算負荷: 低)
|
| 112 |
+
# foreach_norm は各層のノルムをリストで返す。sumで1つの数値に集約。
|
| 113 |
+
params = self.param_groups[0]['params']
|
| 114 |
+
point_gl1 = sum(torch._foreach_norm(params, 1))
|
| 115 |
+
prev = getattr(self, "prev_gl1", None)
|
| 116 |
+
curr_step = getattr(self, '_step_count', 0)
|
| 117 |
+
self._step_count = curr_step + 1
|
| 118 |
+
# ウォームアップ期間中のみ、前回のノルムと比較して「一括修正」
|
| 119 |
+
if prev is not None and curr_step < 55:
|
| 120 |
+
# 前回のエネルギーを維持するための比率(スライス的な全層一律係数)
|
| 121 |
+
ratio = (prev / (point_gl1 + 1e-8)).item()
|
| 122 |
+
# 全層の重みを一撃でスケーリング(中間テンソル作成なし、最速)
|
| 123 |
+
torch._foreach_mul_(params, ratio)
|
| 124 |
+
# 修正したので、現在のノルムも再計算(または近似)
|
| 125 |
+
point_gl1 *= ratio
|
| 126 |
+
# 今回のノルムを次回の比較用に保存
|
| 127 |
+
self.prev_gl1 = point_gl1
|
| 128 |
+
# --- End Approx W-Ref Geometry 近似アシスト ---
|
| 129 |
+
|
| 130 |
for group in self.param_groups:
|
| 131 |
beta1, beta2 = group['betas']
|
| 132 |
for p in (p for p in group['params'] if p.grad is not None):
|
|
|
|
| 134 |
grad = p.grad
|
| 135 |
state = self.state[p]
|
| 136 |
|
|
|
|
|
|
|
|
|
|
| 137 |
# 動的学習率補正により shadow 形成を信頼度で調整(trustは正値化(負にならない))
|
| 138 |
# shadow:必要時のみ(スパイクp部分に現在値を最大10%追従させる動的履歴更新)
|
| 139 |
# 混合比率:スカラーが閾値を超える場合にのみ計算される(信頼できる感情信号かどうかの選別)
|
|
|
|
| 149 |
state['shadow'].lerp_(p, leap_ratio)
|
| 150 |
|
| 151 |
# --- Start Gradient Update Logic ---
|
| 152 |
+
# --- EmoVoid (Approx W-Ref Geometry) ---
|
| 153 |
+
# 更新:emoPulse「時間軸」、W-Ref-Geo「空間軸」でODE近似へ導く
|
| 154 |
+
p.add_(grad.sign_(), alpha=-emoPulse)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
# --- End Gradient Update Logic ---
|
| 156 |
|
| 157 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 162 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 163 |
# 誤判定防止をしな���のは点灯頻度で停止準備(予兆)にするため
|
| 164 |
if abs(scalar) <= 5e-6 and abs(Noise_base - d_base) <= 5e-7:
|
| 165 |
+
if not self.should_stop:
|
| 166 |
+
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 167 |
+
self._step_count = 0 # 幾何学的再調整の再始動
|
| 168 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 169 |
else:
|
| 170 |
self.should_stop = False # 💡 誤判定などの取り消し
|
| 171 |
|