Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/MIUAV/vibe-coding-ros2 --skill cl-elastic-weight-consolidation명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
SOC 직업 분류 기준
| name | cl-elastic-weight-consolidation |
| description | 弹性权重巩固技能 - EWC、SI、RWalk 算法实现 |
| argument-hint | EWC OR 弹性权重巩固 OR elastic weight consolidation OR Synaptic Intelligence |
| user-invocable | true |
通过评估参数重要性来保护关键权重的持续学习方法
当需要以下帮助时使用此技能:
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
class EWC:
def __init__(self, model, lr=1e-3, lambda_ewc=1000):
self.model = model
self.lambda_ewc = lambda_ewc
self.lr = lr
self.params = {n: p.clone().detach() for n, p in model.named_parameters() if p.requires_grad}
self.fisher = {n: torch.zeros_like(p) for n, p in model.named_parameters() if p.requires_grad}
def compute_fisher(self, dataloader, num_samples=200):
"""计算 Fisher 信息矩阵(对角近似)"""
self.model.eval()
fisher_accum = {n: torch.zeros_like(p) for n, p in self.model.named_parameters() if p.requires_grad}
for i, (data, _) in enumerate(dataloader):
if i >= num_samples:
break
self.model.zero_grad()
output = self.model(data)
loss = output.mean()
loss.backward()
for n, p in self.model.named_parameters():
if p.requires_grad:
fisher_accum[n] += p.grad.data ** 2
for n in fisher_accum:
fisher_accum[n] /= num_samples
self.fisher = fisher_accum
def penalty(self):
"""EWC 惩罚项"""
loss = 0
for n, p in self.model.named_parameters():
if p.requires_grad and n in self.fisher:
loss += (self.fisher[n] * (p - self.params[n]) ** 2).sum()
return self.lambda_ewc * loss
def update_params(self):
"""更新保存的参数"""
self.params = {n: p.clone().detach() for n, p in self.model.named_parameters() if p.requires_grad}
class SynapticIntelligence:
def __init__(self, model, lambda_si=1000, c=0.5):
self.model = model
self.lambda_si = lambda_si
self.c = c
self.params = {}
self.omega = {}
self.w_sum = {}
def initialize(self):
"""初始化 SI 变量"""
for n, p in self.model.named_parameters():
if p.requires_grad:
self.params[n] = p.data.clone()
self.omega[n] = torch.zeros_like(p)
self.w_sum[n] = torch.zeros_like(p)
def compute_surrogate_loss(self):
"""计算 SI 代理损失"""
loss = 0
for n, p in self.model.named_parameters():
if p.requires_grad and n in self.omega:
loss += (self.omega[n] * (p - self.params[n]) ** 2).sum()
return self.lambda_si * loss
def update_omega():
n, p .model.named_parameters():
p.requires_grad n .omega:
delta_p = p - params_prev[n]
.w_sum[n] += .lr * (p.grad * delta_p).detach()
.omega[n] += .w_sum[n] / (delta_p ** + .c)