muooon commited on
Commit
334852f
·
verified ·
1 Parent(s): ee6f348

Upload 5 files

Browse files
2Gv38_AutoLR/emoairy.py CHANGED
@@ -3,12 +3,13 @@ from torch.optim import Optimizer
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):
@@ -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 * 1e-4), 3e-3), 1e-6)
 
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(state['exp_avg_r'] * state['exp_avg_c']).add_(group['eps'])
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_(update_term.sign_(), alpha=-emoPulse)
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) <= 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 # 💡 外部からこれを見て判断可
 
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.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):
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 * 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):
 
 
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_(blended_grad.sign_(), alpha = -emoPulse)
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) <= 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 # 💡 外部からこれを見て判断可
 
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.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):
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 * 1e-4), 3e-3), 1e-6)
 
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_(exp_avg, denom, value=-emoPulse)
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) <= 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 # 💡 外部からこれを見て判断可
 
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.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次モーメント単一保持型の幾何学的最適化アルゴリズム
 
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 * 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 +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) * 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標準)
@@ -169,7 +194,7 @@ class EmoTion(Optimizer):
169
  # 感情機構の穏やかさ"安定状態"を外部伝達する(自動停止ではない)
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 # 💡 外部からこれを見て判断可
@@ -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.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):
@@ -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 * 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():
@@ -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
- # 更新:emoPulse「時間軸」、W-Ref-Geo「空間軸」でODE近似へ導く
154
- p.add_(grad.sign_(), alpha=-emoPulse)
 
 
 
 
 
 
 
 
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) <= 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 # 幾何学的再調整の再始動
 
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 # 幾何学的再調整の再始動