基于第一性原理 + Anthropic 2026 J-space 论文实现的具身智慧系统。 核心架构: - ODE 动力系统 + 并行专家 + J-space 工作空间广播 - 12 个异构专家(视觉/屏幕/听觉/语言/鼠标/跨模态) - workspace 256 维 + LayerNorm + RK4 积分 自主心智(最重要的能力): - 好奇心驱动探索(内在奖励 + 世界模型) - 跨会话状态持久化(海洋不蒸发) - 自我模型(知道自己会什么不会什么) - 元学习(自适应学习率 + 策略选择) 具身 Agent(完整神经系统): - 感知层:摄像头 + 麦克风 + 屏幕 + 键盘 + 鼠标 - 大脑皮层(workspace)+ 小脑(运动控制)+ 中枢神经(门控) - 海马体(情景记忆)+ 基底神经节(动作选择) - 执行器:鼠标控制 + 键盘输出 + 音频播放 + 屏幕绘制 多模态支持: - 原生图像/音频/视频/文本/键盘/鼠标 6 种模态 - 跨平台(macOS/Windows/Linux) 外挂模块系统: - 可热插拔的外部能力(小模型/知识库/工具) - 核心心智不依赖外挂,断开后继续工作 守护进程: - 用户主动 start/stop(不自启) - 后台静默运行,持续感知学习 - 状态自动保存,跨会话继续 J-lens 可解释性: - 观测模型内部每个 ODE 子步的想法 - Directed Modulation 验证 workspace 因果作用 - Selectivity 验证(ablate workspace) 小模型蒸馏: - 接 GPT-2/Qwen 等迁移理解能力 - 蒸馏完成后小模型可断开 验证结果: - 连续序列:JSpace 胜 Flat 39.7% - 语言进化:loss 3.95→2.40 - workspace ||w||:v1 0.05 → v2 16.0 - 实时五通道感知 + 具身闭环运行
93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
"""
|
||
训练器:预测学习目标 + 对比训练
|
||
|
||
学习目标(第一性原理):
|
||
智慧系统的核心是"内部建模世界"——即预测下一时刻世界状态。
|
||
所以 loss = ||x_{t+1} - pred_t||²
|
||
|
||
pred_t = model(x_{0:t})
|
||
|
||
这是自监督的——不需要标签,只需要时间序列本身。
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
import torch
|
||
import torch.nn as nn
|
||
import numpy as np
|
||
from typing import Optional
|
||
from .task import ContinuousSequenceTask
|
||
|
||
|
||
class Trainer:
|
||
"""通用训练器,适用于 JSpaceModel 和 FlatBaseline"""
|
||
|
||
def __init__(self, model: nn.Module, task: ContinuousSequenceTask,
|
||
lr: float = 1e-3, device: str = 'cpu'):
|
||
self.model = model.to(device)
|
||
self.task = task
|
||
self.device = device
|
||
self.optimizer = torch.optim.Adam(model.parameters(), lr=lr)
|
||
self.loss_fn = nn.MSELoss()
|
||
self.history: list[float] = []
|
||
|
||
def train_step(self, xs: torch.Tensor) -> float:
|
||
"""
|
||
xs: (batch, T, input_dim)
|
||
returns: loss value
|
||
"""
|
||
xs = xs.to(self.device)
|
||
# 预测目标:x_{t+1} = xs[:, 1:], 输入 xs[:, :-1]
|
||
# 模型输出 preds[:, t] 应该预测 xs[:, t+1]
|
||
preds, _ = self.model(xs)
|
||
# preds: (batch, T, input_dim) —— preds[:, t] 是从 xs[:, :t+1] 预测的下一时刻
|
||
# 对齐:preds[:, :-1] 预测 xs[:, 1:]
|
||
pred = preds[:, :-1]
|
||
target = xs[:, 1:]
|
||
|
||
loss = self.loss_fn(pred, target)
|
||
|
||
self.optimizer.zero_grad()
|
||
loss.backward()
|
||
# 梯度裁剪(ODE 训练容易爆炸)
|
||
torch.nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=1.0)
|
||
self.optimizer.step()
|
||
|
||
return loss.item()
|
||
|
||
def evaluate(self, xs: torch.Tensor) -> float:
|
||
"""评估,不更新参数"""
|
||
self.model.eval()
|
||
with torch.no_grad():
|
||
xs = xs.to(self.device)
|
||
preds, _ = self.model(xs)
|
||
pred = preds[:, :-1]
|
||
target = xs[:, 1:]
|
||
loss = self.loss_fn(pred, target).item()
|
||
self.model.train()
|
||
return loss
|
||
|
||
def train(self, n_steps: int = 500, batch_size: int = 32,
|
||
eval_interval: int = 50, verbose: bool = True) -> list[float]:
|
||
"""完整训练循环"""
|
||
self.model.train()
|
||
for step in range(n_steps):
|
||
xs = self.task.generate_batch(batch_size)
|
||
loss = self.train_step(xs)
|
||
self.history.append(loss)
|
||
|
||
if verbose and (step + 1) % eval_interval == 0:
|
||
eval_xs = self.task.generate_batch(64)
|
||
eval_loss = self.evaluate(eval_xs)
|
||
print(f" step {step+1:4d} | train_loss {loss:.4f} | eval_loss {eval_loss:.4f}")
|
||
|
||
return self.history
|
||
|
||
def get_attention(self, xs: torch.Tensor) -> Optional[torch.Tensor]:
|
||
"""获取注意力权重(仅 JSpaceModel 有,用于可解释性)"""
|
||
self.model.eval()
|
||
with torch.no_grad():
|
||
xs = xs.to(self.device)
|
||
_, info = self.model(xs)
|
||
self.model.train()
|
||
return info.get('alpha', None)
|