Upload 5 files
Browse files- 2Gv38_AutoLR/emoairy.py +31 -12
- 2Gv38_AutoLR/emocats.py +36 -15
- 2Gv38_AutoLR/emosens.py +33 -14
- 2Gv38_AutoLR/emotion.py +53 -28
- 2Gv38_AutoLR/emovoid.py +30 -11
2Gv38_AutoLR/emoairy.py
CHANGED
|
@@ -3,12 +3,13 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoAiry v3.8.
|
| 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):
|
|
@@ -18,17 +19,26 @@ class EmoAiry(Optimizer):
|
|
| 18 |
eps=1e-8,
|
| 19 |
betas=(0.9, 0.995),
|
| 20 |
weight_decay=0.01,
|
| 21 |
-
use_shadow:bool=False
|
|
|
|
| 22 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 23 |
super().__init__(params, defaults)
|
| 24 |
self._init_lr = lr
|
| 25 |
self.should_stop = False # 停止フラグの初期化
|
|
|
|
| 26 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 27 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 28 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 29 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 30 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
# 感情EMA更新(緊張と安静)
|
| 33 |
def _update_ema(self, state, loss_val):
|
| 34 |
ema = state.setdefault('ema', {})
|
|
@@ -101,7 +111,8 @@ class EmoAiry(Optimizer):
|
|
| 101 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 102 |
self.dNR_hist = dNR_now_val * 0.80
|
| 103 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 104 |
-
emoPulse = max(min(self.dNR_hist * (self.emoScope *
|
|
|
|
| 105 |
# --- End emoPulse (完全自動LR生成) ---
|
| 106 |
|
| 107 |
for group in self.param_groups:
|
|
@@ -144,27 +155,35 @@ class EmoAiry(Optimizer):
|
|
| 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(
|
| 151 |
# 最終的な更新項を計算
|
| 152 |
-
update_term = grad / denom
|
| 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 |
# 最終的な更新項を計算
|
| 162 |
-
update_term = grad / denom
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
|
| 164 |
# 最終的なパラメータ更新 (decoupled weight decayも適用)
|
| 165 |
# sign化で2次momentと1次ベクトルのデータの質(粒度)を揃える
|
| 166 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 167 |
-
p.add_(
|
| 168 |
# --- End Gradient Update Logic ---
|
| 169 |
|
| 170 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -174,7 +193,7 @@ class EmoAiry(Optimizer):
|
|
| 174 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 175 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 176 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 177 |
-
if abs(scalar) <=
|
| 178 |
if not self.should_stop:
|
| 179 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 180 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoAiry v3.8.6 (260220) Standard Edition FFT適応統合版(CPU-GPUデータ転送対応)
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8 FFT-Swap-Aware
|
| 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 |
+
### FFT適応 cuDNN 等で厳格なデータ配置を求める仕様により中間テンソル(コピー)生じる ###
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoAiry(Optimizer):
|
|
|
|
| 19 |
eps=1e-8,
|
| 20 |
betas=(0.9, 0.995),
|
| 21 |
weight_decay=0.01,
|
| 22 |
+
use_shadow:bool=False,
|
| 23 |
+
fftmode:bool=False):
|
| 24 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 25 |
super().__init__(params, defaults)
|
| 26 |
self._init_lr = lr
|
| 27 |
self.should_stop = False # 停止フラグの初期化
|
| 28 |
+
self.fftmode = fftmode # FFT切替 フルファインチューニングモード
|
| 29 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 30 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 31 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 32 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 33 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 34 |
|
| 35 |
+
if self.fftmode:
|
| 36 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-5, 3e-4, 1e-8
|
| 37 |
+
self.stop_scalar,self.stop_dNRsub = 5e-7, 5e-8
|
| 38 |
+
else:
|
| 39 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-4, 3e-3, 1e-6
|
| 40 |
+
self.stop_scalar,self.stop_dNRsub = 5e-6, 5e-7
|
| 41 |
+
|
| 42 |
# 感情EMA更新(緊張と安静)
|
| 43 |
def _update_ema(self, state, loss_val):
|
| 44 |
ema = state.setdefault('ema', {})
|
|
|
|
| 111 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 112 |
self.dNR_hist = dNR_now_val * 0.80
|
| 113 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 114 |
+
emoPulse = float(max(min(self.dNR_hist * (self.emoScope * self.base_scale),
|
| 115 |
+
self.max_lim), self.min_lim))
|
| 116 |
# --- End emoPulse (完全自動LR生成) ---
|
| 117 |
|
| 118 |
for group in self.param_groups:
|
|
|
|
| 155 |
exp_avg_r = state['exp_avg_r']
|
| 156 |
exp_avg_c = state['exp_avg_c']
|
| 157 |
# 指数移動平均の更新
|
| 158 |
+
exp_avg_r.mul_(beta2).add_(r_sq.to(exp_avg_r.device), alpha=1 - beta2)
|
| 159 |
+
exp_avg_c.mul_(beta2).add_(c_sq.to(exp_avg_c.device), alpha=1 - beta2)
|
| 160 |
# 再構築した近似勾配の平方根の積で正規化
|
| 161 |
+
denom = torch.sqrt(exp_avg_r * exp_avg_c).add_(group['eps'])
|
| 162 |
# 最終的な更新項を計算
|
| 163 |
+
update_term = grad.to(denom.device) / denom
|
| 164 |
|
| 165 |
# 1次元(ベクトル)の勾配補正
|
| 166 |
else:
|
| 167 |
if 'exp_avg' not in state:
|
| 168 |
exp_avg_sq = state.setdefault('exp_avg_sq', torch.zeros_like(p))
|
| 169 |
exp_avg_sq = state['exp_avg_sq']
|
| 170 |
+
exp_avg_sq.mul_(beta2).addcmul_(grad.to(exp_avg_sq.device), grad.to(exp_avg_sq.device), value=1 - beta2)
|
| 171 |
denom = exp_avg_sq.sqrt().add_(group['eps'])
|
| 172 |
# 最終的な更新項を計算
|
| 173 |
+
update_term = grad.to(denom.device) / denom
|
| 174 |
+
|
| 175 |
+
# FFT版と通常版を統合する分岐(デバイス状態判定)
|
| 176 |
+
if p.device != grad.device:
|
| 177 |
+
# FFTモード:デバイス間の計算を同じ場所へ統一
|
| 178 |
+
update = update_term.to(p.device).sign_()
|
| 179 |
+
else:
|
| 180 |
+
# 通常モード:同じ場所の場合は負荷軽減
|
| 181 |
+
update = update_term.sign_()
|
| 182 |
|
| 183 |
# 最終的なパラメータ更新 (decoupled weight decayも適用)
|
| 184 |
# sign化で2次momentと1次ベクトルのデータの質(粒度)を揃える
|
| 185 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 186 |
+
p.add_(update, alpha=-emoPulse)
|
| 187 |
# --- End Gradient Update Logic ---
|
| 188 |
|
| 189 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 193 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 194 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 195 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 196 |
+
if abs(scalar) <= self.stop_scalar and abs(Noise_base - d_base) <= self.stop_dNRsub:
|
| 197 |
if not self.should_stop:
|
| 198 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 199 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
2Gv38_AutoLR/emocats.py
CHANGED
|
@@ -3,32 +3,42 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoCats v3.8.
|
| 7 |
-
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
これまでの emo系 のすべて、emo系 v3.7 を継承し、早期停止関連の効率化やコード修正等を実施
|
| 9 |
-
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoCats(Optimizer):
|
| 15 |
# クラス定義&初期化
|
| 16 |
-
def __init__(self, params,
|
| 17 |
-
lr=1.0,
|
| 18 |
-
eps=1e-8,
|
| 19 |
-
betas=(0.9, 0.995),
|
| 20 |
-
weight_decay=0.01,
|
| 21 |
-
use_shadow:bool=False
|
|
|
|
| 22 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 23 |
super().__init__(params, defaults)
|
| 24 |
self._init_lr = lr
|
| 25 |
self.should_stop = False # 停止フラグの初期化
|
|
|
|
| 26 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 27 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 28 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 29 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 30 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
# 感情EMA更新(緊張と安静)
|
| 33 |
def _update_ema(self, state, loss_val):
|
| 34 |
ema = state.setdefault('ema', {})
|
|
@@ -101,12 +111,15 @@ class EmoCats(Optimizer):
|
|
| 101 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 102 |
self.dNR_hist = dNR_now_val * 0.80
|
| 103 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 104 |
-
emoPulse = max(min(self.dNR_hist * (self.emoScope *
|
|
|
|
| 105 |
# --- End emoPulse (完全自動LR生成) ---
|
| 106 |
|
| 107 |
for group in self.param_groups:
|
| 108 |
beta1, beta2 = group['betas']
|
| 109 |
-
for p in
|
|
|
|
|
|
|
| 110 |
|
| 111 |
grad = p.grad
|
| 112 |
state = self.state[p]
|
|
@@ -135,11 +148,19 @@ class EmoCats(Optimizer):
|
|
| 135 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 136 |
|
| 137 |
# 勾配ブレンド
|
| 138 |
-
blended_grad = grad.mul(1 - beta1).add(exp_avg, alpha=beta1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
|
| 140 |
# 最終的なパラメータ更新
|
| 141 |
-
p.add_(
|
| 142 |
-
exp_avg.mul_(beta2).add_(grad, alpha = 1 - beta2)
|
| 143 |
# --- End Gradient Update Logic ---
|
| 144 |
|
| 145 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -149,7 +170,7 @@ class EmoCats(Optimizer):
|
|
| 149 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 150 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 151 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 152 |
-
if abs(scalar) <=
|
| 153 |
if not self.should_stop:
|
| 154 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 155 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoCats v3.8.6 (260220) Standard Edition FFT適応統合版(CPU-GPUデータ転送対応)
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8 FFT-Swap-Aware
|
| 8 |
これまでの emo系 のすべて、emo系 v3.7 を継承し、早期停止関連の効率化やコード修正等を実施
|
| 9 |
+
EmoCats v3.8.1 (260201) shadow-system v3.1 -moment v3.1 emoPulse v3.7
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
|
| 12 |
+
### FFT適応 cuDNN 等で厳格なデータ配置を求める仕様により中間テンソル(コピー)生じる ###
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoCats(Optimizer):
|
| 16 |
# クラス定義&初期化
|
| 17 |
+
def __init__(self, params,
|
| 18 |
+
lr=1.0,
|
| 19 |
+
eps=1e-8,
|
| 20 |
+
betas=(0.9, 0.995),
|
| 21 |
+
weight_decay=0.01,
|
| 22 |
+
use_shadow:bool=False,
|
| 23 |
+
fftmode:bool=False):
|
| 24 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 25 |
super().__init__(params, defaults)
|
| 26 |
self._init_lr = lr
|
| 27 |
self.should_stop = False # 停止フラグの初期化
|
| 28 |
+
self.fftmode = fftmode # FFT切替 フルファインチューニングモード
|
| 29 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 30 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 31 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 32 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 33 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 34 |
|
| 35 |
+
if self.fftmode:
|
| 36 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-5, 3e-4, 1e-8
|
| 37 |
+
self.stop_scalar,self.stop_dNRsub = 5e-7, 5e-8
|
| 38 |
+
else:
|
| 39 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-4, 3e-3, 1e-6
|
| 40 |
+
self.stop_scalar,self.stop_dNRsub = 5e-6, 5e-7
|
| 41 |
+
|
| 42 |
# 感情EMA更新(緊張と安静)
|
| 43 |
def _update_ema(self, state, loss_val):
|
| 44 |
ema = state.setdefault('ema', {})
|
|
|
|
| 111 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 112 |
self.dNR_hist = dNR_now_val * 0.80
|
| 113 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 114 |
+
emoPulse = float(max(min(self.dNR_hist * (self.emoScope * self.base_scale),
|
| 115 |
+
self.max_lim), self.min_lim))
|
| 116 |
# --- End emoPulse (完全自動LR生成) ---
|
| 117 |
|
| 118 |
for group in self.param_groups:
|
| 119 |
beta1, beta2 = group['betas']
|
| 120 |
+
for p in group['params']:
|
| 121 |
+
if p.grad is None:
|
| 122 |
+
continue
|
| 123 |
|
| 124 |
grad = p.grad
|
| 125 |
state = self.state[p]
|
|
|
|
| 148 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 149 |
|
| 150 |
# 勾配ブレンド
|
| 151 |
+
blended_grad = grad.to(exp_avg.device).mul(1 - beta1).add(exp_avg, alpha=beta1)
|
| 152 |
+
|
| 153 |
+
# FFT版と通常版を統合する分岐(デバイス状態判定)
|
| 154 |
+
if p.device != grad.device:
|
| 155 |
+
# FFTモード:デバイス間の計算を同じ場所へ統一
|
| 156 |
+
update = blended_grad.to(p.device).sign_()
|
| 157 |
+
else:
|
| 158 |
+
# 通常モード:同じ場所の場合は負荷軽減
|
| 159 |
+
update = blended_grad.sign_()
|
| 160 |
|
| 161 |
# 最終的なパラメータ更新
|
| 162 |
+
p.add_(update, alpha = -emoPulse)
|
| 163 |
+
exp_avg.mul_(beta2).add_(grad.to(exp_avg.device), alpha = 1 - beta2)
|
| 164 |
# --- End Gradient Update Logic ---
|
| 165 |
|
| 166 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 170 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 171 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 172 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 173 |
+
if abs(scalar) <= self.stop_scalar and abs(Noise_base - d_base) <= self.stop_dNRsub:
|
| 174 |
if not self.should_stop:
|
| 175 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 176 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
2Gv38_AutoLR/emosens.py
CHANGED
|
@@ -3,32 +3,42 @@ from torch.optim import Optimizer
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
-
EmoSens v3.8.
|
| 7 |
-
shadow-system v3.1 -moment v3.1 emoPulse v3.8
|
| 8 |
これまでの emo系 のすべて、emo系 v3.7 を継承し、早期停止関連の効率化やコード修正等を実施
|
| 9 |
-
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoSens(Optimizer):
|
| 15 |
# クラス定義&初期化
|
| 16 |
-
def __init__(self, params,
|
| 17 |
-
lr=1.0,
|
| 18 |
-
eps=1e-8,
|
| 19 |
-
betas=(0.9, 0.995),
|
| 20 |
-
weight_decay=0.01,
|
| 21 |
-
use_shadow:bool=False
|
|
|
|
| 22 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 23 |
super().__init__(params, defaults)
|
| 24 |
self._init_lr = lr
|
| 25 |
self.should_stop = False # 停止フラグの初期化
|
|
|
|
| 26 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 27 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 28 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 29 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 30 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
# 感情EMA更新(緊張と安静)
|
| 33 |
def _update_ema(self, state, loss_val):
|
| 34 |
ema = state.setdefault('ema', {})
|
|
@@ -101,7 +111,8 @@ class EmoSens(Optimizer):
|
|
| 101 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 102 |
self.dNR_hist = dNR_now_val * 0.80
|
| 103 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 104 |
-
emoPulse = max(min(self.dNR_hist * (self.emoScope *
|
|
|
|
| 105 |
# --- End emoPulse (完全自動LR生成) ---
|
| 106 |
|
| 107 |
for group in self.param_groups:
|
|
@@ -136,14 +147,22 @@ class EmoSens(Optimizer):
|
|
| 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)
|
| 141 |
|
| 142 |
denom = exp_avg_sq.sqrt().add_(group['eps'])
|
| 143 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
if group['weight_decay']:
|
| 145 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 146 |
-
p.addcdiv_(
|
| 147 |
# --- End Gradient Update Logic ---
|
| 148 |
|
| 149 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -153,7 +172,7 @@ class EmoSens(Optimizer):
|
|
| 153 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 154 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 155 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 156 |
-
if abs(scalar) <=
|
| 157 |
if not self.should_stop:
|
| 158 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 159 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoSens v3.8.6 (260220) Standard Edition FFT適応統合版(CPU-GPUデータ転送対応)
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8 FFT-Swap-Aware
|
| 8 |
これまでの emo系 のすべて、emo系 v3.7 を継承し、早期停止関連の効率化やコード修正等を実施
|
| 9 |
+
EmoSens v3.8.1 (260201) shadow-system v3.1 -moment v3.1 emoPulse v3.7
|
| 10 |
emoPulse 機構により完全自動化を目指す(ユーザーによる emoScope 調整可/改善度反映率)
|
| 11 |
emoScorp、emoPulse、についてアグレッシブな更新にも耐えられるように調整し安全性を向上
|
| 12 |
+
### FFT適応 cuDNN 等で厳格なデータ配置を求める仕様により中間テンソル(コピー)生じる ###
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoSens(Optimizer):
|
| 16 |
# クラス定義&初期化
|
| 17 |
+
def __init__(self, params,
|
| 18 |
+
lr=1.0,
|
| 19 |
+
eps=1e-8,
|
| 20 |
+
betas=(0.9, 0.995),
|
| 21 |
+
weight_decay=0.01,
|
| 22 |
+
use_shadow:bool=False,
|
| 23 |
+
fftmode:bool=False):
|
| 24 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 25 |
super().__init__(params, defaults)
|
| 26 |
self._init_lr = lr
|
| 27 |
self.should_stop = False # 停止フラグの初期化
|
| 28 |
+
self.fftmode = fftmode # FFT切替 フルファインチューニングモード
|
| 29 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 30 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 31 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 32 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 33 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 34 |
|
| 35 |
+
if self.fftmode:
|
| 36 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-5, 3e-4, 1e-8
|
| 37 |
+
self.stop_scalar,self.stop_dNRsub = 5e-7, 5e-8
|
| 38 |
+
else:
|
| 39 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-4, 3e-3, 1e-6
|
| 40 |
+
self.stop_scalar,self.stop_dNRsub = 5e-6, 5e-7
|
| 41 |
+
|
| 42 |
# 感情EMA更新(緊張と安静)
|
| 43 |
def _update_ema(self, state, loss_val):
|
| 44 |
ema = state.setdefault('ema', {})
|
|
|
|
| 111 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 112 |
self.dNR_hist = dNR_now_val * 0.80
|
| 113 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 114 |
+
emoPulse = float(max(min(self.dNR_hist * (self.emoScope * self.base_scale),
|
| 115 |
+
self.max_lim), self.min_lim))
|
| 116 |
# --- End emoPulse (完全自動LR生成) ---
|
| 117 |
|
| 118 |
for group in self.param_groups:
|
|
|
|
| 147 |
exp_avg = state['exp_avg']
|
| 148 |
exp_avg_sq = state['exp_avg_sq']
|
| 149 |
|
| 150 |
+
exp_avg.mul_(beta1).add_(grad.to(exp_avg.device), alpha=1 - beta1)
|
| 151 |
+
exp_avg_sq.mul_(beta2).addcmul_(grad.to(exp_avg_sq.device), grad.to(exp_avg_sq.device), value=1 - beta2)
|
| 152 |
|
| 153 |
denom = exp_avg_sq.sqrt().add_(group['eps'])
|
| 154 |
|
| 155 |
+
# FFT版と通常版を統合する分岐(デバイス状態判定)
|
| 156 |
+
if p.device != grad.device:
|
| 157 |
+
# FFTモード:デバイス間の計算を同じ場所へ統一
|
| 158 |
+
update = exp_avg.to(p.device)
|
| 159 |
+
else:
|
| 160 |
+
# 通常モード:同じ場所の場合は負荷軽減
|
| 161 |
+
update = exp_avg
|
| 162 |
+
|
| 163 |
if group['weight_decay']:
|
| 164 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 165 |
+
p.addcdiv_(update, denom.to(p.device), value=-emoPulse)
|
| 166 |
# --- End Gradient Update Logic ---
|
| 167 |
|
| 168 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 172 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 173 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 174 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 175 |
+
if abs(scalar) <= self.stop_scalar and abs(Noise_base - d_base) <= self.stop_dNRsub:
|
| 176 |
if not self.should_stop:
|
| 177 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 178 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
2Gv38_AutoLR/emotion.py
CHANGED
|
@@ -3,12 +3,13 @@ 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 |
-
|
| 11 |
過去の慣性と現在の勾配を動的にブレンドする、1次モーメント単一保持型の幾何学的最適化アルゴリズム
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoTion(Optimizer):
|
|
@@ -18,17 +19,26 @@ class EmoTion(Optimizer):
|
|
| 18 |
eps=1e-8,
|
| 19 |
betas=(0.9, 0.995),
|
| 20 |
weight_decay=0.01,
|
| 21 |
-
use_shadow:bool=False
|
|
|
|
| 22 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 23 |
super().__init__(params, defaults)
|
| 24 |
self._init_lr = lr
|
| 25 |
self.should_stop = False # 停止フラグの初期化
|
|
|
|
| 26 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 27 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 28 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 29 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 30 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
# 感情EMA更新(緊張と安静)
|
| 33 |
def _update_ema(self, state, loss_val):
|
| 34 |
ema = state.setdefault('ema', {})
|
|
@@ -101,9 +111,34 @@ class EmoTion(Optimizer):
|
|
| 101 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 102 |
self.dNR_hist = dNR_now_val * 0.80
|
| 103 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 104 |
-
emoPulse = max(min(self.dNR_hist * (self.emoScope *
|
|
|
|
| 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 +146,6 @@ class EmoTion(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 |
# 混合比率:スカラーが閾値を超える場合にのみ計算される(信頼できる感情信号かどうかの選別)
|
|
@@ -133,33 +165,26 @@ class EmoTion(Optimizer):
|
|
| 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) *
|
| 157 |
|
| 158 |
# 重みの更新 (emoPulse = 絶対歩幅)
|
| 159 |
if group['weight_decay'] != 0:
|
| 160 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 161 |
|
| 162 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
# --- End Gradient Update Logic ---
|
| 164 |
|
| 165 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -169,7 +194,7 @@ class EmoTion(Optimizer):
|
|
| 169 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 170 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 171 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 172 |
-
if abs(scalar) <=
|
| 173 |
if not self.should_stop:
|
| 174 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 175 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
@@ -181,5 +206,5 @@ class EmoTion(Optimizer):
|
|
| 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 |
"""
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoTion v3.8.6 (260220) Moment-Free Edition FFT適応統合版(CPU-GPUデータ転送対応)
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8 FFT-Swap-Aware
|
| 8 |
+
これまでの emo系 のすべてを継承し、独自更新式の特徴を受け継ぐ完全オリジナル最適化器
|
| 9 |
The “geometric relationship” between "W"eight and "G"radient Method
|
| 10 |
+
幾何学的最適化アルゴリズム Approx W-Ref Geometry 近似アシスト更新に変更し負荷低減
|
| 11 |
過去の慣性と現在の勾配を動的にブレンドする、1次モーメント単一保持型の幾何学的最適化アルゴリズム
|
| 12 |
+
### FFT適応 cuDNN 等で厳格なデータ配置を求める仕様により中間テンソル(コピー)生じる ###
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoTion(Optimizer):
|
|
|
|
| 19 |
eps=1e-8,
|
| 20 |
betas=(0.9, 0.995),
|
| 21 |
weight_decay=0.01,
|
| 22 |
+
use_shadow:bool=False,
|
| 23 |
+
fftmode:bool=False):
|
| 24 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 25 |
super().__init__(params, defaults)
|
| 26 |
self._init_lr = lr
|
| 27 |
self.should_stop = False # 停止フラグの初期化
|
| 28 |
+
self.fftmode = fftmode # FFT切替 フルファインチューニングモード
|
| 29 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 30 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 31 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 32 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 33 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 34 |
|
| 35 |
+
if self.fftmode:
|
| 36 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-5, 3e-4, 1e-8
|
| 37 |
+
self.stop_scalar,self.stop_dNRsub = 5e-7, 5e-8
|
| 38 |
+
else:
|
| 39 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-4, 3e-3, 1e-6
|
| 40 |
+
self.stop_scalar,self.stop_dNRsub = 5e-6, 5e-7
|
| 41 |
+
|
| 42 |
# 感情EMA更新(緊張と安静)
|
| 43 |
def _update_ema(self, state, loss_val):
|
| 44 |
ema = state.setdefault('ema', {})
|
|
|
|
| 111 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 112 |
self.dNR_hist = dNR_now_val * 0.80
|
| 113 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 114 |
+
emoPulse = float(max(min(self.dNR_hist * (self.emoScope * self.base_scale),
|
| 115 |
+
self.max_lim), self.min_lim))
|
| 116 |
# --- End emoPulse (完全自動LR生成) ---
|
| 117 |
|
| 118 |
+
# --- Start Approx W-Ref Geometry [Tion] 近似アシスト ---
|
| 119 |
+
# Weight Reference Geometry ("W"eight and "G"radient Method)
|
| 120 |
+
# 中間テンソルによるVRAM負荷やcos類似度測定の計算負荷を実質0にする
|
| 121 |
+
with torch.no_grad():
|
| 122 |
+
# 現在の全パラメータのL1ノルムを一括計算(計算負荷: 低)
|
| 123 |
+
# foreach_norm は各層のノルムをリストで返す。sumで1つの数値に集約。
|
| 124 |
+
params = self.param_groups[0]['params']
|
| 125 |
+
point_gl1 = sum(torch._foreach_norm(params, 1))
|
| 126 |
+
prev = getattr(self, "prev_gl1", None)
|
| 127 |
+
# 前回のノルムと比較して「一括修正」
|
| 128 |
+
if prev is not None:
|
| 129 |
+
# 前回のエネルギーを維持するための比率(スライス的な全層一律係数)
|
| 130 |
+
ratio = (abs(point_gl1 - prev) / (prev + 1e-8)).item()
|
| 131 |
+
# freshness: 全域の動きが激しいほど 1.0 に近づく
|
| 132 |
+
self.g_freshness = min(ratio / 0.05, 1.0)
|
| 133 |
+
# 現在の修正したノルムを復元(近似)スケール調整で打ち消し
|
| 134 |
+
point_gl1 *= ratio
|
| 135 |
+
else:
|
| 136 |
+
# 1ステップ目は「過去」がないので現在の勾配を信頼する
|
| 137 |
+
self.g_freshness = 1.0 # 初期値
|
| 138 |
+
# 今回のノルムを次回の比較用に保存
|
| 139 |
+
self.prev_gl1 = point_gl1
|
| 140 |
+
# --- End Approx W-Ref Geometry [Tion] 近似アシスト ---
|
| 141 |
+
|
| 142 |
for group in self.param_groups:
|
| 143 |
beta1, beta2 = group['betas']
|
| 144 |
for p in (p for p in group['params'] if p.grad is not None):
|
|
|
|
| 146 |
grad = p.grad
|
| 147 |
state = self.state[p]
|
| 148 |
|
|
|
|
|
|
|
|
|
|
| 149 |
# 動的学習率補正により shadow ��成を信頼度で調整(trustは正値化(負にならない))
|
| 150 |
# shadow:必要時のみ(スパイクp部分に現在値を最大10%追従させる動的履歴更新)
|
| 151 |
# 混合比率:スカラーが閾値を超える場合にのみ計算される(信頼できる感情信号かどうかの選別)
|
|
|
|
| 165 |
# 1次モーメント(exp_avg)の初期化: O(N) のみ
|
| 166 |
if 'exp_avg' not in state:
|
| 167 |
state['exp_avg'] = torch.zeros_like(p)
|
|
|
|
| 168 |
|
| 169 |
exp_avg = state['exp_avg']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 170 |
|
| 171 |
# exp_avg = beta1 * exp_avg + (1 - beta1) * grad の「幾何学的拡張」
|
| 172 |
# 慣性と現時点の勾配を、直交性に基づいて混ぜ合わせる
|
| 173 |
+
exp_avg.mul_(beta1).add_(grad, alpha=(1.0 - beta1) * self.g_freshness)
|
| 174 |
|
| 175 |
# 重みの更新 (emoPulse = 絶対歩幅)
|
| 176 |
if group['weight_decay'] != 0:
|
| 177 |
p.mul_(1.0 - group['weight_decay'] * emoPulse)
|
| 178 |
|
| 179 |
+
# FFT版と通常版を統合する分岐(デバイス状態判定)
|
| 180 |
+
if p.device != grad.device:
|
| 181 |
+
# FFTモード:デバイス間の計算を同じ場所へ統一
|
| 182 |
+
update = exp_avg.to(p.device).sign()
|
| 183 |
+
else:
|
| 184 |
+
# 通常モード:同じ場所の場合は負荷軽減
|
| 185 |
+
update = exp_avg.sign()
|
| 186 |
+
|
| 187 |
+
p.add_(update, alpha=-emoPulse)
|
| 188 |
# --- End Gradient Update Logic ---
|
| 189 |
|
| 190 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 194 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 195 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 196 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 197 |
+
if abs(scalar) <= self.stop_scalar and abs(Noise_base - d_base) <= self.stop_dNRsub:
|
| 198 |
if not self.should_stop:
|
| 199 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 200 |
self.should_stop = True # 💡 外部からこれを見て判断可
|
|
|
|
| 206 |
"""
|
| 207 |
https://github.com/muooon/EmoSens
|
| 208 |
Pure W-Ref Geometry. Believing in a future for democratic AI learning.
|
| 209 |
+
Taking decisive steps forward, Weight-Reference Optimizer.
|
| 210 |
"""
|
2Gv38_AutoLR/emovoid.py
CHANGED
|
@@ -3,12 +3,13 @@ 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 |
-
幾何学的最適化アルゴリズム Approx W-Ref Geometry
|
| 11 |
完全1次2次モーメント廃止、さまざまなコストを極限まで低減、正確性と軽量性と快適性を向上
|
|
|
|
| 12 |
"""
|
| 13 |
|
| 14 |
class EmoVoid(Optimizer):
|
|
@@ -18,17 +19,26 @@ class EmoVoid(Optimizer):
|
|
| 18 |
eps=1e-8,
|
| 19 |
betas=(0.9, 0.995),
|
| 20 |
weight_decay=0.01,
|
| 21 |
-
use_shadow:bool=False
|
|
|
|
| 22 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 23 |
super().__init__(params, defaults)
|
| 24 |
self._init_lr = lr
|
| 25 |
self.should_stop = False # 停止フラグの初期化
|
|
|
|
| 26 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 27 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 28 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 29 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 30 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 31 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
# 感情EMA更新(緊張と安静)
|
| 33 |
def _update_ema(self, state, loss_val):
|
| 34 |
ema = state.setdefault('ema', {})
|
|
@@ -101,10 +111,11 @@ class EmoVoid(Optimizer):
|
|
| 101 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 102 |
self.dNR_hist = dNR_now_val * 0.80
|
| 103 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 104 |
-
emoPulse = max(min(self.dNR_hist * (self.emoScope *
|
|
|
|
| 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():
|
|
@@ -121,11 +132,11 @@ class EmoVoid(Optimizer):
|
|
| 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']
|
|
@@ -150,8 +161,16 @@ class EmoVoid(Optimizer):
|
|
| 150 |
|
| 151 |
# --- Start Gradient Update Logic ---
|
| 152 |
# --- EmoVoid (Approx W-Ref Geometry) ---
|
| 153 |
-
#
|
| 154 |
-
p.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
# --- End Gradient Update Logic ---
|
| 156 |
|
| 157 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
@@ -161,7 +180,7 @@ class EmoVoid(Optimizer):
|
|
| 161 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 162 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 163 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 164 |
-
if abs(scalar) <=
|
| 165 |
if not self.should_stop:
|
| 166 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 167 |
self._step_count = 0 # 幾何学的再調整の再始動
|
|
|
|
| 3 |
import math
|
| 4 |
|
| 5 |
"""
|
| 6 |
+
EmoVoid v3.8.6 (260220) Moment-Free Edition FFT適応統合版(CPU-GPUデータ転送対応)
|
| 7 |
+
shadow-system v3.1 -moment v3.1 emoPulse v3.8 FFT-Swap-Aware
|
| 8 |
これまでの emo系 のすべてを継承し、独自更新式の特徴を受け継ぐ完全オリジナル最適化器
|
| 9 |
The “geometric relationship” between "W"eight and "G"radient Method
|
| 10 |
+
幾何学的最適化アルゴリズム Approx W-Ref Geometry 近似アシスト更新に変更し負荷低減
|
| 11 |
完全1次2次モーメント廃止、さまざまなコストを極限まで低減、正確性と軽量性と快適性を向上
|
| 12 |
+
### FFT適応 cuDNN 等で厳格なデータ配置を求める仕様により中間テンソル(コピー)生じる ###
|
| 13 |
"""
|
| 14 |
|
| 15 |
class EmoVoid(Optimizer):
|
|
|
|
| 19 |
eps=1e-8,
|
| 20 |
betas=(0.9, 0.995),
|
| 21 |
weight_decay=0.01,
|
| 22 |
+
use_shadow:bool=False,
|
| 23 |
+
fftmode:bool=False):
|
| 24 |
defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
|
| 25 |
super().__init__(params, defaults)
|
| 26 |
self._init_lr = lr
|
| 27 |
self.should_stop = False # 停止フラグの初期化
|
| 28 |
+
self.fftmode = fftmode # FFT切替 フルファインチューニングモード
|
| 29 |
self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
|
| 30 |
self.emoScope = lr # 動的学習率の調和とリズム
|
| 31 |
self.dNR_hist = 1.0 # emoPulse hist 初期化
|
| 32 |
self.noise_est = 1.0 # emoPulse nest 初期化
|
| 33 |
self.d_est = 0.02 # emoPulse dest 初期化
|
| 34 |
|
| 35 |
+
if self.fftmode:
|
| 36 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-5, 3e-4, 1e-8
|
| 37 |
+
self.stop_scalar,self.stop_dNRsub = 5e-7, 5e-8
|
| 38 |
+
else:
|
| 39 |
+
self.base_scale, self.max_lim, self.min_lim = 1e-4, 3e-3, 1e-6
|
| 40 |
+
self.stop_scalar,self.stop_dNRsub = 5e-6, 5e-7
|
| 41 |
+
|
| 42 |
# 感情EMA更新(緊張と安静)
|
| 43 |
def _update_ema(self, state, loss_val):
|
| 44 |
ema = state.setdefault('ema', {})
|
|
|
|
| 111 |
# 減速:怪しい時は即座に比率を下げる(確実に信頼できない場合に下げ圧力を溜める)
|
| 112 |
self.dNR_hist = dNR_now_val * 0.80
|
| 113 |
# emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
|
| 114 |
+
emoPulse = float(max(min(self.dNR_hist * (self.emoScope * self.base_scale),
|
| 115 |
+
self.max_lim), self.min_lim))
|
| 116 |
# --- End emoPulse (完全自動LR生成) ---
|
| 117 |
|
| 118 |
+
# --- Start Approx W-Ref Geometry [Void] 近似アシスト ---
|
| 119 |
# Weight Reference Geometry ("W"eight and "G"radient Method)
|
| 120 |
# 中間テンソルによるVRAM負荷やcos類似度測定の計算負荷を実質0にする
|
| 121 |
with torch.no_grad():
|
|
|
|
| 132 |
ratio = (prev / (point_gl1 + 1e-8)).item()
|
| 133 |
# 全層の重みを一撃でスケーリング(中間テンソル作成なし、最速)
|
| 134 |
torch._foreach_mul_(params, ratio)
|
| 135 |
+
# 現在の修正したノルムを復元(近似)スケール調整で打ち消し
|
| 136 |
point_gl1 *= ratio
|
| 137 |
# 今回のノルムを次回の比較用に保存
|
| 138 |
self.prev_gl1 = point_gl1
|
| 139 |
+
# --- End Approx W-Ref Geometry [Void] 近似アシスト ---
|
| 140 |
|
| 141 |
for group in self.param_groups:
|
| 142 |
beta1, beta2 = group['betas']
|
|
|
|
| 161 |
|
| 162 |
# --- Start Gradient Update Logic ---
|
| 163 |
# --- EmoVoid (Approx W-Ref Geometry) ---
|
| 164 |
+
# FFT版と通常版を統合する分岐(デバイス状態判定)
|
| 165 |
+
if p.device != grad.device:
|
| 166 |
+
# FFTモード:予め符号化し1/32軽量化で「行列保持」の重圧を解放
|
| 167 |
+
update = grad.sign().to(p.device)
|
| 168 |
+
else:
|
| 169 |
+
# 通常モード:インプレースで最速処理
|
| 170 |
+
update = grad.sign_()
|
| 171 |
+
|
| 172 |
+
# 更新:emoPulse「時間軸」 W-Ref-Geo「空間軸」でODE近似へ導く
|
| 173 |
+
p.add_(update, alpha=-emoPulse)
|
| 174 |
# --- End Gradient Update Logic ---
|
| 175 |
|
| 176 |
# ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
|
|
|
|
| 180 |
# 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
|
| 181 |
# Early Stop:瞬間値と33step分の履歴の差分で True にするだけ
|
| 182 |
# 誤判定防止をしないのは点灯頻度で停止準備(予兆)にするため
|
| 183 |
+
if abs(scalar) <= self.stop_scalar and abs(Noise_base - d_base) <= self.stop_dNRsub:
|
| 184 |
if not self.should_stop:
|
| 185 |
self.emoScope = 1.0 # ユーザー意思を目的の収束へ整える
|
| 186 |
self._step_count = 0 # 幾何学的再調整の再始動
|