muooon commited on
Commit
50bd8e4
·
verified ·
1 Parent(s): 7286628

Upload 3 files

Browse files
2Gv37_AutoLR/emoairy.py CHANGED
@@ -17,19 +17,16 @@ class EmoAiry(Optimizer):
17
  eps=1e-8,
18
  betas=(0.9, 0.995),
19
  weight_decay=0.01,
20
- use_shadow:bool=False,
21
- writer=None):
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.writer = writer # 動的学習率や感情スカラー等を渡す(研究向け)
28
  self.emoScope = lr # 動的学習率の調和とリズム
29
  self.noise_est = 1.0 # emoPulse nest 初期化
30
  self.d_est = 0.02 # emoPulse dest 初期化
31
  self.dNR_hist = None # emoPulse hist 初期化
32
- #self.warmup = 0.01 # emoPulse warmup 初期化
33
 
34
  # 感情EMA更新(緊張と安静)
35
  def _update_ema(self, state, loss_val):
@@ -89,19 +86,19 @@ class EmoAiry(Optimizer):
89
  ratio = self._decide_ratio(scalar)
90
  trust = math.copysign((1.0 - abs(scalar)), scalar)
91
 
92
- # emoPulse (loss 時系列から D / noise を推定し完全自動LRを生成)
93
- #self.warmup = 0.97 * (getattr(self, 'warmup', 0.01) or 0.01) + 0.03 * 1.0
94
  # d / N 履歴 (時間的D推定)
95
  self.noise_est = 0.97 * self.noise_est + 0.03 * abs(scalar)
96
  self.d_est = 0.97 * self.d_est + 0.03 * abs(trust)
97
  noise = max(self.noise_est, 1e-3)
98
  d = self.d_est
99
  # scalar、trust、の差分(瞬間的D推定)と各時間軸の確度推定(疑念と信頼の綱引き)
100
- noise_base = abs(scalar - trust) + 0.1
101
  d_base = abs(noise - d) + 0.1
102
  # SNRにより異なる時間的確度比率から更新力を導出し2乗で出力最大化
103
- dNR_now_val = (d_base / noise_base) ** 2
104
- # d / N (SNR) の履歴化と最大値の成長率の増減
105
  if self.dNR_hist is None:
106
  self.dNR_hist = 1.0
107
  else:
@@ -113,6 +110,7 @@ class EmoAiry(Optimizer):
113
  self.dNR_hist = dNR_now_val * 0.98
114
  # emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
115
  emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
 
116
 
117
  for group in self.param_groups:
118
  for p in group['params']:
@@ -152,10 +150,8 @@ class EmoAiry(Optimizer):
152
 
153
  # 再構築した近似勾配の平方根の積で正規化
154
  denom = torch.sqrt(state['exp_avg_r'] * state['exp_avg_c']).add_(group['eps'])
155
-
156
  # 最終的な更新項を計算
157
- #update_term = grad / denom # sign化で1次ベクトルとのバランス改善
158
- update_term = torch.sign(grad / denom)
159
 
160
  # 1次元(ベクトル)の勾配補正
161
  else:
@@ -163,19 +159,24 @@ class EmoAiry(Optimizer):
163
  exp_avg_sq = state.setdefault('exp_avg_sq', torch.zeros_like(p))
164
  exp_avg_sq.mul_(beta1).addcmul_(grad, grad, value=(1 - beta2))
165
  denom = exp_avg_sq.sqrt().add_(group['eps'])
166
- #update_term = grad / denom # sign化で2次momentとのバランス改善
167
- update_term = torch.sign(grad / denom)
168
 
169
  # 最終的なパラメータ更新 (decoupled weight decayも適用)
170
- #step_size = group['lr']
171
  p.add_(p, alpha=-group['weight_decay'] * emoPulse)
172
- p.add_(update_term, alpha=-emoPulse)
173
  # --- End Gradient Update Logic ---
174
 
 
 
 
 
 
175
  # 感情機構の発火が収まり"十分に安定"していることを外部伝達できる(自動停止ロジックではない)
176
  # Early Stop用 scalar 記録(バッファ共通で管理/最大32件保持/動静評価)
177
  hist = self.state.setdefault('scalar_hist', deque(maxlen=32))
178
- hist.append(scalar)
179
 
180
  # Early Stop判断(静けさの合図)
181
  # 32ステップ分のスカラー値の静かな条件を満たした時"フラグ" should_stop = True になるだけ
@@ -186,13 +187,6 @@ class EmoAiry(Optimizer):
186
  if avg_abs < 0.05 and var < 0.005:
187
  self.should_stop = True # 💡 外部からこれを見て判断可
188
 
189
- # TensorBoardへの記録 (研究者向けデバッグ用) 要:外部記録コード
190
- if hasattr(self, 'writer') and self.writer is not None:
191
- self._step_count = getattr(self, "_step_count", 0) + 1
192
- self.writer.add_scalar("emostate/emoLR", emoPulse, self._step_count)
193
- self.writer.add_scalar("emostate/scalar", scalar, self._step_count)
194
- self.writer.add_scalar("emostate/trust", trust, self._step_count)
195
-
196
  return
197
 
198
  """
 
17
  eps=1e-8,
18
  betas=(0.9, 0.995),
19
  weight_decay=0.01,
20
+ use_shadow:bool=False):
 
21
  defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
22
  super().__init__(params, defaults)
23
  self._init_lr = lr
24
  self.should_stop = False # 停止フラグの初期化
25
  self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
 
26
  self.emoScope = lr # 動的学習率の調和とリズム
27
  self.noise_est = 1.0 # emoPulse nest 初期化
28
  self.d_est = 0.02 # emoPulse dest 初期化
29
  self.dNR_hist = None # emoPulse hist 初期化
 
30
 
31
  # 感情EMA更新(緊張と安静)
32
  def _update_ema(self, state, loss_val):
 
86
  ratio = self._decide_ratio(scalar)
87
  trust = math.copysign((1.0 - abs(scalar)), scalar)
88
 
89
+ # --- Start emoPulse (完全自動LR生成) ---
90
+ # emoPulse (loss 時系列から D / Noise を推定し完全自動LRを生成)
91
  # d / N 履歴 (時間的D推定)
92
  self.noise_est = 0.97 * self.noise_est + 0.03 * abs(scalar)
93
  self.d_est = 0.97 * self.d_est + 0.03 * abs(trust)
94
  noise = max(self.noise_est, 1e-3)
95
  d = self.d_est
96
  # scalar、trust、の差分(瞬間的D推定)と各時間軸の確度推定(疑念と信頼の綱引き)
97
+ Noise_base = abs(scalar - trust) + 0.1
98
  d_base = abs(noise - d) + 0.1
99
  # SNRにより異なる時間的確度比率から更新力を導出し2乗で出力最大化
100
+ dNR_now_val = (d_base / Noise_base) ** 2
101
+ # db / Nb dNR(SNR) 履歴化と最大値の成長率の増減
102
  if self.dNR_hist is None:
103
  self.dNR_hist = 1.0
104
  else:
 
110
  self.dNR_hist = dNR_now_val * 0.98
111
  # emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
112
  emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
113
+ # --- End emoPulse (完全自動LR生成) ---
114
 
115
  for group in self.param_groups:
116
  for p in group['params']:
 
150
 
151
  # 再構築した近似勾配の平方根の積で正規化
152
  denom = torch.sqrt(state['exp_avg_r'] * state['exp_avg_c']).add_(group['eps'])
 
153
  # 最終的な更新項を計算
154
+ update_term = grad / denom
 
155
 
156
  # 1次元(ベクトル)の勾配補正
157
  else:
 
159
  exp_avg_sq = state.setdefault('exp_avg_sq', torch.zeros_like(p))
160
  exp_avg_sq.mul_(beta1).addcmul_(grad, grad, value=(1 - beta2))
161
  denom = exp_avg_sq.sqrt().add_(group['eps'])
162
+ # 最終的な更新項を計算
163
+ update_term = grad / denom
164
 
165
  # 最終的なパラメータ更新 (decoupled weight decayも適用)
166
+ # sign化で2次momentと1次ベクトルのバランス改善
167
  p.add_(p, alpha=-group['weight_decay'] * emoPulse)
168
+ p.add_(update_term.sign(), alpha=-emoPulse)
169
  # --- End Gradient Update Logic ---
170
 
171
+ # ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
172
+ self._init_lr = emoPulse
173
+ for group in self.param_groups:
174
+ group['lr'] = emoPulse
175
+
176
  # 感情機構の発火が収まり"十分に安定"していることを外部伝達できる(自動停止ロジックではない)
177
  # Early Stop用 scalar 記録(バッファ共通で管理/最大32件保持/動静評価)
178
  hist = self.state.setdefault('scalar_hist', deque(maxlen=32))
179
+ hist.append(early_scalar)
180
 
181
  # Early Stop判断(静けさの合図)
182
  # 32ステップ分のスカラー値の静かな条件を満たした時"フラグ" should_stop = True になるだけ
 
187
  if avg_abs < 0.05 and var < 0.005:
188
  self.should_stop = True # 💡 外部からこれを見て判断可
189
 
 
 
 
 
 
 
 
190
  return
191
 
192
  """
2Gv37_AutoLR/emocats.py CHANGED
@@ -11,31 +11,28 @@ emoPulse 機構により完全自動化を目指す(ユーザーによる emoSco
11
  dNR係数により emoPulse に履歴を混ぜて安定させた(d / N 履歴 による信頼度の維持)
12
  """
13
 
14
- # Helper function (Lynx)
15
  def exists(val):
16
  return val is not None
17
 
18
  class EmoCats(Optimizer):
19
- # クラス定義&初期化 lynx用ベータ・互換性の追加(lynx用beta1・beta2)
20
  def __init__(self, params: Union[list, torch.nn.Module],
21
  lr=1.0,
22
  eps=1e-8,
23
  betas=(0.9, 0.995),
24
  weight_decay=0.01,
25
- use_shadow: bool = False,
26
- writer=None):
27
  defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
28
  super().__init__(params, defaults)
29
  # lynxに応じてウェイト減衰のため保存
30
  self._init_lr = lr
31
  self.should_stop = False # 停止フラグの初期化
32
  self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
33
- self.writer = writer # 動的学習率や感情スカラー等を渡す(研究向け)
34
  self.emoScope = lr # 動的学習率の調和とリズム
35
  self.noise_est = 1.0 # emoPulse nest 初期化
36
  self.d_est = 0.02 # emoPulse dest 初期化
37
  self.dNR_hist = None # emoPulse hist 初期化
38
- #self.warmup = 0.01 # emoPulse warmup 初期化
39
 
40
  # 感情EMA更新(緊張と安静)
41
  def _update_ema(self, state, loss_val):
@@ -98,19 +95,19 @@ class EmoCats(Optimizer):
98
  ratio = self._decide_ratio(scalar)
99
  trust = math.copysign((1.0 - abs(scalar)), scalar)
100
 
101
- # emoPulse (loss 時系列から D / noise を推定し完全自動LRを生成)
102
- #self.warmup = 0.97 * (getattr(self, 'warmup', 0.01) or 0.01) + 0.03 * 1.0
103
  # d / N 履歴 (時間的D推定)
104
  self.noise_est = 0.97 * self.noise_est + 0.03 * abs(scalar)
105
  self.d_est = 0.97 * self.d_est + 0.03 * abs(trust)
106
  noise = max(self.noise_est, 1e-3)
107
  d = self.d_est
108
  # scalar、trust、の差分(瞬間的D推定)と各時間軸の確度推定(疑念と信頼の綱引き)
109
- noise_base = abs(scalar - trust) + 0.1
110
  d_base = abs(noise - d) + 0.1
111
  # SNRにより異なる時間的確度比率から更新力を導出し2乗で出力最大化
112
- dNR_now_val = (d_base / noise_base) ** 2
113
- # d / N (SNR) の履歴化と最大値の成長率の増減
114
  if self.dNR_hist is None:
115
  self.dNR_hist = 1.0
116
  else:
@@ -122,17 +119,15 @@ class EmoCats(Optimizer):
122
  self.dNR_hist = dNR_now_val * 0.98
123
  # emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
124
  emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
 
125
 
126
  for group in self.param_groups:
127
- # リンクス共通パラメータ抽出
128
- lr, wd, beta1, beta2 = group['lr'], group['weight_decay'], *group['betas']
 
 
129
 
130
- # ウェイト減衰の処理を分離 (from lynx)
131
- _wd_actual = wd
132
-
133
- for p in filter(lambda p: exists(p.grad), group['params']): # PGチェックにフィルタ
134
-
135
- grad = p.grad # PG直接使用(計算に".data"不要)
136
  state = self.state[p]
137
 
138
  # 動的学習率補正により shadow 形成を信頼度で調整(trustは正値化(負にならない))
@@ -150,31 +145,32 @@ class EmoCats(Optimizer):
150
  state['shadow'].lerp_(p, leap_ratio)
151
 
152
  # --- Start Gradient Update Logic ---
153
- # lynx初期化(exp_avg_sq)
154
  if 'exp_avg' not in state:
155
  state['exp_avg'] = torch.zeros_like(p)
156
  exp_avg = state['exp_avg']
157
 
158
- # Stepweight decay (from lynx): p = p * (1 - lr * wd)
159
- # decoupled_wd 考慮 _wd_actual 使用(EmoNaviのwdは最後に適用)
160
  p.mul_(1 - emoPulse * _wd_actual)
161
  beta1, beta2 = group['betas']
162
 
163
  # 勾配ブレンド
164
- # m_t = beta1 * exp_avg_prev + (1 - beta1) * grad
165
  blended_grad = grad.mul(1 - beta1).add_(exp_avg, alpha=beta1)
166
 
167
- # p: p = p - lr * sign(blended_grad)
168
- p.add_(blended_grad.sign_(), alpha = -emoPulse)
169
-
170
- # exp_avg = beta2 * exp_avg + (1 - beta2) * grad
171
  exp_avg.mul_(beta2).add_(grad, alpha = 1 - beta2)
172
  # --- End Gradient Update Logic ---
173
 
 
 
 
 
 
174
  # 感情機構の発火が収まり"十分に安定"していることを外部伝達できる(自動停止ロジックではない)
175
  # Early Stop用 scalar 記録(バッファ共通で管理/最大32件保持/動静評価)
176
  hist = self.state.setdefault('scalar_hist', deque(maxlen=32))
177
- hist.append(scalar)
178
 
179
  # Early Stop判断(静けさの合図)
180
  # 32ステップ分のスカラー値の静かな条件を満たした時"フラグ" should_stop = True になるだけ
@@ -185,13 +181,6 @@ class EmoCats(Optimizer):
185
  if avg_abs < 0.05 and var < 0.005:
186
  self.should_stop = True # 💡 外部からこれを見て判断可
187
 
188
- # TensorBoardへの記録 (研究者向けデバッグ用) 要:外部記録コード
189
- if hasattr(self, 'writer') and self.writer is not None:
190
- self._step_count = getattr(self, "_step_count", 0) + 1
191
- self.writer.add_scalar("emostate/emoLR", emoPulse, self._step_count)
192
- self.writer.add_scalar("emostate/scalar", scalar, self._step_count)
193
- self.writer.add_scalar("emostate/trust", trust, self._step_count)
194
-
195
  return
196
 
197
  """
 
11
  dNR係数により emoPulse に履歴を混ぜて安定させた(d / N 履歴 による信頼度の維持)
12
  """
13
 
14
+ # Helper function
15
  def exists(val):
16
  return val is not None
17
 
18
  class EmoCats(Optimizer):
19
+ # クラス定義&初期化 ベータ・互換性の追加
20
  def __init__(self, params: Union[list, torch.nn.Module],
21
  lr=1.0,
22
  eps=1e-8,
23
  betas=(0.9, 0.995),
24
  weight_decay=0.01,
25
+ use_shadow: bool = False):
 
26
  defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
27
  super().__init__(params, defaults)
28
  # lynxに応じてウェイト減衰のため保存
29
  self._init_lr = lr
30
  self.should_stop = False # 停止フラグの初期化
31
  self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
 
32
  self.emoScope = lr # 動的学習率の調和とリズム
33
  self.noise_est = 1.0 # emoPulse nest 初期化
34
  self.d_est = 0.02 # emoPulse dest 初期化
35
  self.dNR_hist = None # emoPulse hist 初期化
 
36
 
37
  # 感情EMA更新(緊張と安静)
38
  def _update_ema(self, state, loss_val):
 
95
  ratio = self._decide_ratio(scalar)
96
  trust = math.copysign((1.0 - abs(scalar)), scalar)
97
 
98
+ # --- Start emoPulse (完全自動LR生成) ---
99
+ # emoPulse (loss 時系列から D / Noise を推定し完全自動LRを生成)
100
  # d / N 履歴 (時間的D推定)
101
  self.noise_est = 0.97 * self.noise_est + 0.03 * abs(scalar)
102
  self.d_est = 0.97 * self.d_est + 0.03 * abs(trust)
103
  noise = max(self.noise_est, 1e-3)
104
  d = self.d_est
105
  # scalar、trust、の差分(瞬間的D推定)と各時間軸の確度推定(疑念と信頼の綱引き)
106
+ Noise_base = abs(scalar - trust) + 0.1
107
  d_base = abs(noise - d) + 0.1
108
  # SNRにより異なる時間的確度比率から更新力を導出し2乗で出力最大化
109
+ dNR_now_val = (d_base / Noise_base) ** 2
110
+ # db / Nb dNR(SNR) 履歴化と最大値の成長率の増減
111
  if self.dNR_hist is None:
112
  self.dNR_hist = 1.0
113
  else:
 
119
  self.dNR_hist = dNR_now_val * 0.98
120
  # emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
121
  emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
122
+ # --- End emoPulse (完全自動LR生成) ---
123
 
124
  for group in self.param_groups:
125
+ # 共通パラメータ抽出
126
+ _wd_actual, beta1, beta2 = group['weight_decay'], *group['betas']
127
+ # PGチェックにフィルタ
128
+ for p in filter(lambda p: exists(p.grad), group['params']):
129
 
130
+ grad = p.grad
 
 
 
 
 
131
  state = self.state[p]
132
 
133
  # 動的学習率補正により shadow 形成を信頼度で調整(trustは正値化(負にならない))
 
145
  state['shadow'].lerp_(p, leap_ratio)
146
 
147
  # --- Start Gradient Update Logic ---
148
+ # exp_avg初期化
149
  if 'exp_avg' not in state:
150
  state['exp_avg'] = torch.zeros_like(p)
151
  exp_avg = state['exp_avg']
152
 
153
+ # Stepweight decay : decoupled_wd
 
154
  p.mul_(1 - emoPulse * _wd_actual)
155
  beta1, beta2 = group['betas']
156
 
157
  # 勾配ブレンド
 
158
  blended_grad = grad.mul(1 - beta1).add_(exp_avg, alpha=beta1)
159
 
160
+ # 最終的なパラメータ更新
161
+ p.add_(blended_grad.sign(), alpha = -emoPulse)
 
 
162
  exp_avg.mul_(beta2).add_(grad, alpha = 1 - beta2)
163
  # --- End Gradient Update Logic ---
164
 
165
+ # ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
166
+ self._init_lr = emoPulse
167
+ for group in self.param_groups:
168
+ group['lr'] = emoPulse
169
+
170
  # 感情機構の発火が収まり"十分に安定"していることを外部伝達できる(自動停止ロジックではない)
171
  # Early Stop用 scalar 記録(バッファ共通で管理/最大32件保持/動静評価)
172
  hist = self.state.setdefault('scalar_hist', deque(maxlen=32))
173
+ hist.append(early_scalar)
174
 
175
  # Early Stop判断(静けさの合図)
176
  # 32ステップ分のスカラー値の静かな条件を満たした時"フラグ" should_stop = True になるだけ
 
181
  if avg_abs < 0.05 and var < 0.005:
182
  self.should_stop = True # 💡 外部からこれを見て判断可
183
 
 
 
 
 
 
 
 
184
  return
185
 
186
  """
2Gv37_AutoLR/emosens.py CHANGED
@@ -17,19 +17,16 @@ class EmoSens(Optimizer):
17
  eps=1e-8,
18
  betas=(0.9, 0.995),
19
  weight_decay=0.01,
20
- use_shadow:bool=False,
21
- writer=None):
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.writer = writer # 動的学習率や感情スカラー等を渡す(研究向け)
28
  self.emoScope = lr # 動的学習率の調和とリズム
29
  self.noise_est = 1.0 # emoPulse nest 初期化
30
  self.d_est = 0.02 # emoPulse dest 初期化
31
  self.dNR_hist = None # emoPulse hist 初期化
32
- #self.warmup = 0.01 # emoPulse warmup 初期化
33
 
34
  # 感情EMA更新(緊張と安静)
35
  def _update_ema(self, state, loss_val):
@@ -89,19 +86,19 @@ class EmoSens(Optimizer):
89
  ratio = self._decide_ratio(scalar)
90
  trust = math.copysign((1.0 - abs(scalar)), scalar)
91
 
92
- # emoPulse (loss 時系列から D / noise を推定し完全自動LRを生成)
93
- #self.warmup = 0.97 * (getattr(self, 'warmup', 0.01) or 0.01) + 0.03 * 1.0
94
  # d / N 履歴 (時間的D推定)
95
  self.noise_est = 0.97 * self.noise_est + 0.03 * abs(scalar)
96
  self.d_est = 0.97 * self.d_est + 0.03 * abs(trust)
97
  noise = max(self.noise_est, 1e-3)
98
  d = self.d_est
99
  # scalar、trust、の差分(瞬間的D推定)と各時間軸の確度推定(疑念と信頼の綱引き)
100
- noise_base = abs(scalar - trust) + 0.1
101
  d_base = abs(noise - d) + 0.1
102
  # SNRにより異なる時間的確度比率から更新力を導出し2乗で出力最大化
103
- dNR_now_val = (d_base / noise_base) ** 2
104
- # d / N (SNR) の履歴化と最大値の成長率の増減
105
  if self.dNR_hist is None:
106
  self.dNR_hist = 1.0
107
  else:
@@ -113,6 +110,7 @@ class EmoSens(Optimizer):
113
  self.dNR_hist = dNR_now_val * 0.98
114
  # emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
115
  emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
 
116
 
117
  for group in self.param_groups:
118
  for p in group['params']:
@@ -146,15 +144,16 @@ class EmoSens(Optimizer):
146
  exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
147
  denom = exp_avg_sq.sqrt().add_(group['eps'])
148
 
149
- #step_size = group['lr']
150
- # 完全自動LR / 安全クリップ (emoPulse = step_size) # emoScope:基準値1.0
151
- #emoPulse = max(min(((emobase * self.emoScope) * 5e-5), 1e-3), 1e-6)
152
-
153
  if group['weight_decay']:
154
  p.add_(p, alpha=-group['weight_decay'] * emoPulse)
155
  p.addcdiv_(exp_avg, denom, value=-emoPulse)
156
  # --- End Gradient Update Logic ---
157
 
 
 
 
 
 
158
  # 感情機構の発火が収まり"十分に安定"していることを外部伝達できる(自動停止ロジックではない)
159
  # Early Stop用 scalar 記録(バッファ共通で管理/最大32件保持/動静評価)
160
  hist = self.state.setdefault('scalar_hist', deque(maxlen=32))
@@ -169,13 +168,6 @@ class EmoSens(Optimizer):
169
  if avg_abs < 0.05 and var < 0.005:
170
  self.should_stop = True # 💡 外部からこれを見て判断可
171
 
172
- # TensorBoardへの記録 (研究者向けデバッグ用) 要:外部記録コード
173
- if hasattr(self, 'writer') and self.writer is not None:
174
- self._step_count = getattr(self, "_step_count", 0) + 1
175
- self.writer.add_scalar("emostate/emoLR", emoPulse, self._step_count)
176
- self.writer.add_scalar("emostate/scalar", scalar, self._step_count)
177
- self.writer.add_scalar("emostate/trust", trust, self._step_count)
178
-
179
  return
180
 
181
  """
 
17
  eps=1e-8,
18
  betas=(0.9, 0.995),
19
  weight_decay=0.01,
20
+ use_shadow:bool=False):
 
21
  defaults = dict(lr=lr, betas=betas, eps=eps, weight_decay=weight_decay)
22
  super().__init__(params, defaults)
23
  self._init_lr = lr
24
  self.should_stop = False # 停止フラグの初期化
25
  self.use_shadow = use_shadow # 🔸shadow 使用フラグを保存
 
26
  self.emoScope = lr # 動的学習率の調和とリズム
27
  self.noise_est = 1.0 # emoPulse nest 初期化
28
  self.d_est = 0.02 # emoPulse dest 初期化
29
  self.dNR_hist = None # emoPulse hist 初期化
 
30
 
31
  # 感情EMA更新(緊張と安静)
32
  def _update_ema(self, state, loss_val):
 
86
  ratio = self._decide_ratio(scalar)
87
  trust = math.copysign((1.0 - abs(scalar)), scalar)
88
 
89
+ # --- Start emoPulse (完全自動LR生成) ---
90
+ # emoPulse (loss 時系列から D / Noise を推定し完全自動LRを生成)
91
  # d / N 履歴 (時間的D推定)
92
  self.noise_est = 0.97 * self.noise_est + 0.03 * abs(scalar)
93
  self.d_est = 0.97 * self.d_est + 0.03 * abs(trust)
94
  noise = max(self.noise_est, 1e-3)
95
  d = self.d_est
96
  # scalar、trust、の差分(瞬間的D推定)と各時間軸の確度推定(疑念と信頼の綱引き)
97
+ Noise_base = abs(scalar - trust) + 0.1
98
  d_base = abs(noise - d) + 0.1
99
  # SNRにより異なる時間的確度比率から更新力を導出し2乗で出力最大化
100
+ dNR_now_val = (d_base / Noise_base) ** 2
101
+ # db / Nb dNR(SNR) 履歴化と最大値の成長率の増減
102
  if self.dNR_hist is None:
103
  self.dNR_hist = 1.0
104
  else:
 
110
  self.dNR_hist = dNR_now_val * 0.98
111
  # emoPulse 最終決定: emoScorp によるユーザー意思の反映と安全値による制限
112
  emoPulse = max(min(self.dNR_hist * (self.emoScope * 1e-4), 3e-3), 1e-6)
113
+ # --- End emoPulse (完全自動LR生成) ---
114
 
115
  for group in self.param_groups:
116
  for p in group['params']:
 
144
  exp_avg_sq.mul_(beta2).addcmul_(grad, grad, value=1 - beta2)
145
  denom = exp_avg_sq.sqrt().add_(group['eps'])
146
 
 
 
 
 
147
  if group['weight_decay']:
148
  p.add_(p, alpha=-group['weight_decay'] * emoPulse)
149
  p.addcdiv_(exp_avg, denom, value=-emoPulse)
150
  # --- End Gradient Update Logic ---
151
 
152
+ # ユーザー指定初期LRを実効値(emoPulse)で可視化する(PyTorch標準)
153
+ self._init_lr = emoPulse
154
+ for group in self.param_groups:
155
+ group['lr'] = emoPulse
156
+
157
  # 感情機構の発火が収まり"十分に安定"していることを外部伝達できる(自動停止ロジックではない)
158
  # Early Stop用 scalar 記録(バッファ共通で管理/最大32件保持/動静評価)
159
  hist = self.state.setdefault('scalar_hist', deque(maxlen=32))
 
168
  if avg_abs < 0.05 and var < 0.005:
169
  self.should_stop = True # 💡 外部からこれを見て判断可
170
 
 
 
 
 
 
 
 
171
  return
172
 
173
  """