Spaces:
Runtime error
Runtime error
| #!/usr/bin/env python3 | |
| """ | |
| 维度适配器 — 打通Swarm(32维)和Meta Model(75维)的信号通路 | |
| 双向转换: | |
| - up(32→75): 自编码器扩展 + 残差连接 | |
| - down(75→32): 自编码器压缩 + 残差连接 | |
| 训练: 可通过train()方法学习双向映射 | |
| """ | |
| import numpy as np | |
| import os | |
| import pickle | |
| from typing import Dict, Tuple | |
| class DimensionAdapter: | |
| """ | |
| 维度适配器 — 32维↔75维双向转换 | |
| 设计: | |
| - 双层自编码器(32→64→75 / 75→64→32) | |
| - 残差连接防止信号丢失 | |
| - 可训练(通过train()方法) | |
| """ | |
| def __init__(self, swarm_dim: int = 32, meta_dim: int = 75): | |
| self.swarm_dim = swarm_dim | |
| self.meta_dim = meta_dim | |
| # 中间维度 | |
| self.mid_dim = 64 | |
| # 上投影: swarm_dim → mid_dim → meta_dim | |
| self.up_W1 = np.random.randn(self.mid_dim, swarm_dim).astype(np.float32) * 0.1 | |
| self.up_b1 = np.zeros(self.mid_dim, dtype=np.float32) | |
| self.up_W2 = np.random.randn(meta_dim, self.mid_dim).astype(np.float32) * 0.1 | |
| self.up_b2 = np.zeros(meta_dim, dtype=np.float32) | |
| # 下投影: meta_dim → mid_dim → swarm_dim | |
| self.down_W1 = np.random.randn(self.mid_dim, meta_dim).astype(np.float32) * 0.1 | |
| self.down_b1 = np.zeros(self.mid_dim, dtype=np.float32) | |
| self.down_W2 = np.random.randn(swarm_dim, self.mid_dim).astype(np.float32) * 0.1 | |
| self.down_b2 = np.zeros(swarm_dim, dtype=np.float32) | |
| # 训练状态 | |
| self._trained = False | |
| self._train_loss = None | |
| def up(self, x: np.ndarray) -> np.ndarray: | |
| """32维 → 75维 (Swarm → Meta Model)""" | |
| x = np.asarray(x, dtype=np.float32).ravel() | |
| if len(x) < self.swarm_dim: | |
| x = np.pad(x, (0, self.swarm_dim - len(x))) | |
| elif len(x) > self.swarm_dim: | |
| x = x[:self.swarm_dim] | |
| # 双层变换 + ReLU | |
| h = np.maximum(0, self.up_W1 @ x + self.up_b1) | |
| out = self.up_W2 @ h + self.up_b2 | |
| # 残差: 原始信号投影到75维后叠加 | |
| residual = np.zeros(self.meta_dim, dtype=np.float32) | |
| residual[:self.swarm_dim] = x * 0.2 # 前32维保留20%原始信号 | |
| out = out + residual | |
| # 归一化 | |
| norm = np.linalg.norm(out) | |
| if norm > 1e-8: | |
| out = out / norm * np.sqrt(self.meta_dim) | |
| return out | |
| def down(self, x: np.ndarray) -> np.ndarray: | |
| """75维 → 32维 (Meta Model → Swarm)""" | |
| x = np.asarray(x, dtype=np.float32).ravel() | |
| if len(x) < self.meta_dim: | |
| x = np.pad(x, (0, self.meta_dim - len(x))) | |
| elif len(x) > self.meta_dim: | |
| x = x[:self.meta_dim] | |
| # 双层变换 + ReLU | |
| h = np.maximum(0, self.down_W1 @ x + self.down_b1) | |
| out = self.down_W2 @ h + self.down_b2 | |
| # 残差: 从75维中取前32维保留 | |
| residual = x[:self.swarm_dim] * 0.2 | |
| out = out + residual | |
| # 归一化 | |
| norm = np.linalg.norm(out) | |
| if norm > 1e-8: | |
| out = out / norm * np.sqrt(self.swarm_dim) | |
| return out | |
| def train(self, n_samples: int = 200, epochs: int = 3, lr: float = 0.01): | |
| """自编码器训练 — 学习双向映射""" | |
| # 生成训练数据(随机向量模拟embedding) | |
| np.random.seed(42) | |
| samples = np.random.randn(n_samples, self.swarm_dim).astype(np.float32) * 0.5 | |
| for epoch in range(epochs): | |
| total_loss = 0.0 | |
| for x in samples: | |
| # 前向: 32→75→32 | |
| h_up = np.maximum(0, self.up_W1 @ x + self.up_b1) | |
| mid = self.up_W2 @ h_up + self.up_b2 | |
| h_down = np.maximum(0, self.down_W1 @ mid + self.down_b1) | |
| recon = self.down_W2 @ h_down + self.down_b2 | |
| # 重建误差 | |
| loss = float(np.mean((recon - x) ** 2)) | |
| total_loss += loss | |
| # 简单梯度下降(数值梯度近似) | |
| grad_scale = lr * 2 * (recon - x) / n_samples | |
| self.down_W2 -= np.outer(grad_scale, h_down) | |
| self.down_b2 -= grad_scale | |
| avg_loss = total_loss / n_samples | |
| self._train_loss = avg_loss | |
| self._trained = True | |
| def info(self) -> Dict: | |
| """获取适配器信息""" | |
| up_params = self.up_W1.size + self.up_b1.size + self.up_W2.size + self.up_b2.size | |
| down_params = self.down_W1.size + self.down_b1.size + self.down_W2.size + self.down_b2.size | |
| return { | |
| 'type': 'DimensionAdapter', | |
| 'swarm_dim': self.swarm_dim, | |
| 'meta_dim': self.meta_dim, | |
| 'params': up_params + down_params, | |
| 'up_count': 2, | |
| 'down_count': 2, | |
| 'trained': self._trained, | |
| 'train_loss': self._train_loss, | |
| } | |
| def save(self, path: str): | |
| """保存适配器""" | |
| data = { | |
| 'swarm_dim': self.swarm_dim, | |
| 'meta_dim': self.meta_dim, | |
| 'up_W1': self.up_W1, 'up_b1': self.up_b1, | |
| 'up_W2': self.up_W2, 'up_b2': self.up_b2, | |
| 'down_W1': self.down_W1, 'down_b1': self.down_b1, | |
| 'down_W2': self.down_W2, 'down_b2': self.down_b2, | |
| 'trained': self._trained, | |
| 'train_loss': self._train_loss, | |
| } | |
| with open(path, 'wb') as f: | |
| pickle.dump(data, f) | |
| def load(cls, path: str) -> 'DimensionAdapter': | |
| """加载适配器""" | |
| with open(path, 'rb') as f: | |
| data = pickle.load(f) | |
| adapter = cls(swarm_dim=data['swarm_dim'], meta_dim=data['meta_dim']) | |
| adapter.up_W1 = data['up_W1'] | |
| adapter.up_b1 = data['up_b1'] | |
| adapter.up_W2 = data['up_W2'] | |
| adapter.up_b2 = data['up_b2'] | |
| adapter.down_W1 = data['down_W1'] | |
| adapter.down_b1 = data['down_b1'] | |
| adapter.down_W2 = data['down_W2'] | |
| adapter.down_b2 = data['down_b2'] | |
| adapter._trained = data.get('trained', False) | |
| adapter._train_loss = data.get('train_loss', None) | |
| return adapter | |