| ---emo系の特徴--- | |
| 論文/paper | |
| https://huggingface.co/muooon/EmoNAVI/raw/main/emo-paper(ENG).txt | |
| https://huggingface.co/muooon/EmoNAVI/raw/main/emo-paper(JPN).txt | |
| 非凸関数への収束保証 | |
| emo系は、非凸関数に対する期待値収束性を理論的に保証します | |
| これは FM(フローマッチング)・RL(強化学習)・蒸留などへの汎用性と効率性を保持します | |
| LoRA技術の上位互換性 | |
| emo系は、SVD、PiSSA、infLoRA、ABBA-LoRA、等のLoRA技術に対し上位互換性をもちます | |
| さらに Rank/Alpha についても動的スケーリング的な効果を発揮します | |
| Kahan補償の上位互換性 | |
| 低精度量子化において、Kahan補償を超えて誤差を吸収します、動的LR、動的スケジューラによる滑らかさは柔軟です | |
| 自律的知性と中枢神経系 | |
| emo系は、観察、判断、決定、行動、記憶、反省、という自律サイクルを行うことで外部依存しません | |
| 自己評価と自己調整により自己完結した最適化を行います | |
| 統一理論 | |
| これらはすべて multi-ema & scaler という"感情機構"が生み出すダイナミックな更新方法により実現しています | |
| この統一的な信号は、これら多機能性をもたらす制御の源泉となり、動的LRが時間的積算で効果を発揮します | |
| 高効率性と集積度 | |
| 高次moment、Kahan補償、量子化補償、分散・継続学習での独立性、自己修復・モデル修復、 | |
| ハイパーパラメータの自律調整、信頼度フィルタ、更新ステップの有界性、構造的耐性、自己停止、 | |
| 動的学習率、動的スケジューラ、動的Rank/Aplha、履歴補償、などを含めた多機能性を、 | |
| 追加テンソル不要、計算負荷ほぼなし、step毎に完全適用、時間的積算で実現します | |
| これらをワンパッケージで実現した高効率性と集積度は安定と安全を最優先します | |
| ※ 高次momentは近似的、動的Rank/Alphaも近似的な効果です | |
| ※ LoRA系技術はノイズをなくしますが微小データも失う場合があります | |
| ※ emo系はノイズを作らず既存ノイズを見つけて修正し微小データを保護します | |
| ※ 量子化補償は今後実用化されるさらに低精度な環境でも柔軟に対応できます | |
| ---emo系の履歴まとめ--- | |
| emonavi 最終進化の概要とまとめ | |
| v3.0 は、(抽象化した)3つの高次momentを(まとめて)時間的適応する仕組みを導入し、 | |
| デフォルト shadow=False にしました、これにより emonavi はこれまでの最軽量級です、 | |
| なお3つの高次momentをそれぞれ1stepで適応するのは emosens 系です、 | |
| こちらは少し計算負荷がかかります… 代わりに airy/cats は特殊な進化を遂げています | |
| 全emo系3つの高次momentの概念を抽象化し数学的計算負荷を大きく削減しつつ、 | |
| その効果を最大限発揮しています(まじめに統計計算するとVRAMは4倍以上になります) | |
| これまでの経緯等をご存じない方のために改めて系譜を整理します、 | |
| emonavi (Adam参考):emosens(第2世代) | |
| emofact (Adafactor参考):emozeal、emoairy(第2世代) | |
| emolynx (Lion/Tiger参考):emoneco、emocats(第2世代) | |
| emoclan (navi-fact-lynx 統合):(第2世代ナシ) ※ v3.0最強説あり | |
| clan、zeal & neco は、過適合や崩壊領域での対応を"特殊変化"させる仕組みを有します | |
| 上記3つは感情機構の柔軟性を証明するバリエーションです | |
| airy/cats 特殊進化、Adafactorより軽量/Lionの符号に"重み"を加味 | |
| ※ 第1世代(shadow=True):計算負荷少ない/VRAM負荷高い | |
| ※ 第2世代(shadow=False):VRAMやや軽量/計算負荷高い | |
| ※ 第1世代(v3.0/shadow=False):VRAM負荷なし/計算負荷ほぼゼロ | |
| 通常においては第1世代(v3.0)を選択すべきです | |
| ---統計的抽象化の理論的背景--- | |
| skewness = sum((s - mean)**3 for s in buf) / len(buf) / std**3 | |
| kurtosis = sum((s - mean)**4 for s in buf) / len(buf) / std**4 | |
| fifth-moment = sum((s - mean)**5 for s in buf) / len(buf) / std**5 | |
| 感情機構と高次momentの関係: | |
| ◇感情EMA(Exponential Moving Average) | |
| ・対象:loss の履歴 | |
| ・2つのEMA:短期と長期(short / long) | |
| ・役割:感情の「短期」と「長期」の視点を持つ | |
| ◇感情スカラー | |
| ・定義:tanh(5 * diff) | |
| ・意味:感情の「変化の勢い」を抽象化した値 | |
| ・tanhで圧縮:[-1, 1] に収めることで、安定性と非線形性を両立 | |
| ◇感情moment(高次moment) | |
| ・対象:感情スカラーの履歴 | |
| ・役割:分布の形状(歪度・尖度・非対称性)を解析し、感情の「質感」を捉える | |
| ・複数STEPを経ることで感情スカラーの履歴を保持せずに適用可能(これが重要) | |
| ---感情moment活用--- | |
| 以下のコードだけで、どのoptimizerにも"感情moment"を適用できます | |
| # 感情EMA更新(緊張と安静) | |
| def _update_ema(self, state, loss_val): | |
| ema = state.setdefault('ema', {}) | |
| ema['short'] = 0.3 * loss_val + 0.7 * ema.get('short', loss_val) | |
| ema['long'] = 0.01 * loss_val + 0.99 * ema.get('long', loss_val) | |
| return ema | |
| # 感情スカラー値生成(EMA差分、滑らかな非線形スカラー、tanh 5 * diff で鋭敏さ強調) | |
| def _compute_scalar(self, ema): | |
| diff = ema['short'] - ema['long'] | |
| return math.tanh(5 * diff) | |
| # 実際の勾配更新式を記述してください | |
| # 感情moment適用 "* (1 - abs(scalar))" 更新式に合うものにしてください | |
| p.addcdiv_(exp_avg, denom, value=-step_size * (1 - abs(scalar))) | |
| ---emo系の概要--- | |
| 非常に単純化した説明をします | |
| 従来optimizerは[慣性]というアクセルを踏むことで素早い収束を果たしています、 | |
| emo系の制御は、これに対し[shadow]で速度調整を自動的に行うものです、 | |
| この仕組みを再解釈再構成することで、ブレーキ、変速機、スタビライザ、サスペンション等を獲得しています、 | |
| lossから得られる情報を瞬時に判断する感情機構により、アクセル踏み過ぎを修正します、 | |
| 別の単純化でも説明します | |
| スキーのモーグル競技を想像してください | |
| 2次momentはすべてを均すため、急峻や緩慢の地形を過少評価しがちです、 | |
| これを状況に応じて精査することで、斜面の状況を細かく把握し、柔軟に滑走する、 | |
| 凹凸を正確に把握、コース範囲からの逸脱を防ぎ、ターンのポール位置も察知、 | |
| 、、、という感じで"自動制御"しています | |
| ブレーキをかけると遅くなるんじゃ…? いいえ早くなります! | |
| オーバランするとノイズを多く学習します、これを修正する学習も行われます、 | |
| このオーバーランをしないようにコントロールしますから、修正も不要となり、 | |
| 結果的に早く効率よく目的地へ到達します、そしてオーバラン抑止は忘却等も抑止します、 | |
| 追加テンソルなしでメモリ効率も良いです |