modular-memristor-synaptic-plasticity

star 1

模块化忆阻器模型:具有突触样可塑性和易失性记忆特性。通过可重构的忆阻器阵列实现类突触动力学,支持在线学习和自适应权重更新。适用于神经形态硬件、边缘学习设备、存内计算。

hiyenwong By hiyenwong schedule Updated 6/3/2026

name: modular-memristor-synaptic-plasticity description: "模块化忆阻器模型:具有突触样可塑性和易失性记忆特性。通过可重构的忆阻器阵列实现类突触动力学,支持在线学习和自适应权重更新。适用于神经形态硬件、边缘学习设备、存内计算。"

Modular Memristor Model with Synaptic-Like Plasticity and Volatile Memory

模块化忆阻器框架:实现类突触可塑性和易失性记忆特性,为神经形态边缘设备提供高能效在线学习能力。

Metadata

  • Source: arXiv:2603.04934
  • Authors: Yang Liu, Zhenyu Wang, Yonghao Xu, Shuai Liu, Hao Chen, Zhe Wang, Yixuan Yuan
  • Published: 2026-04-13 (v2)
  • Category: Neuromorphic Hardware, Memristor, In-Memory Computing

Core Methodology

Key Innovation

  1. Synaptic-Like Plasticity: 模拟生物突触的STDP学习
  2. Volatile Memory: 易失性短期记忆特性
  3. Modular Architecture: 可重构模块化设计
  4. In-Memory Computation: 存内计算能力

Memristor Characteristics

Device Physics

                    Volatile (STP)          Non-volatile (LTP)
                       ↓                        ↓
Conductance    ━━━━━━━━━┻━━━━━━━━      ━━━━━━━━━━━━━━━━━━━━
               (decays quickly)        (retains long-term)
                      ↑
                Combined Behavior

Learning Rules

  • STDP: Spike-Timing Dependent Plasticity
  • SRDP: Spike-Rate Dependent Plasticity
  • Triplet STDP: 三脉冲可塑性

Implementation Guide

Prerequisites

  • Python 3.9+
  • NumPy/SciPy
  • PyTorch (for training)
  • SPICE simulator (optional)

Memristor Model Implementation

Step 1: Volatile Memristor Model

import numpy as np
import torch

class VolatileMemristor:
    """易失性忆阻器模型"""
    
    def __init__(self, 
                 g_min=1e-6,      # 最小电导 (S)
                 g_max=1e-3,      # 最大电导 (S)
                 tau=100e-3,      # 衰减时间常数 (s)
                 alpha_pot=1e-3,  # 增强系数
                 alpha_dep=1e-3,  # 抑制系数
                 dt=1e-3):        # 时间步长 (s)
        
        self.g_min = g_min
        self.g_max = g_max
        self.tau = tau
        self.alpha_pot = alpha_pot
        self.alpha_dep = alpha_dep
        self.dt = dt
        
        # 初始化电导
        self.g = (g_min + g_max) / 2
        self.g_history = [self.g]
    
    def update_conductance(self, pre_spike, post_spike):
        """
        根据STDP更新电导
        
        Args:
            pre_spike: 前突触脉冲 (0 or 1)
            post_spike: 后突触脉冲 (0 or 1)
        
        Returns:
            new_conductance: 更新后的电导
        """
        if pre_spike and post_spike:
            # 同时发放 - 无变化
            delta_g = 0
        elif pre_spike and not post_spike:
            # 前突触先发放 - LTD (抑制)
            delta_g = -self.alpha_dep * (self.g - self.g_min)
        elif not pre_spike and post_spike:
            # 后突触先发放 - LTP (增强)
            delta_g = self.alpha_pot * (self.g_max - self.g)
        else:
            # 都无发放 - 衰减
            delta_g = -(self.g - self.g_min) / self.tau * self.dt
        
        self.g = np.clip(self.g + delta_g, self.g_min, self.g_max)
        self.g_history.append(self.g)
        
        return self.g
    
    def read(self, v_read=0.1):
        """读取电导值 (欧姆定律)"""
        i = self.g * v_read
        return i
    
    def reset(self):
        """重置到初始状态"""
        self.g = (self.g_min + self.g_max) / 2
        self.g_history = [self.g]

Step 2: STDP Learning

class STDPLearning:
    """脉冲时序依赖可塑性"""
    
    def __init__(self, 
                 A_plus=0.01,    # LTP幅度
                 A_minus=0.01,   # LTD幅度
                 tau_plus=20,    # LTP时间常数 (ms)
                 tau_minus=20):  # LTD时间常数 (ms)
        
        self.A_plus = A_plus
        self.A_minus = A_minus
        self.tau_plus = tau_plus
        self.tau_minus = tau_minus
        
        # 突触轨迹
        self.pre_trace = 0
        self.post_trace = 0
    
    def update_traces(self, pre_spike, post_spike, dt=1):
        """更新突触轨迹"""
        # 指数衰减 + 脉冲增强
        self.pre_trace = self.pre_trace * np.exp(-dt / self.tau_plus) + pre_spike
        self.post_trace = self.post_trace * np.exp(-dt / self.tau_minus) + post_spike
    
    def compute_weight_change(self, pre_spike, post_spike):
        """计算权重变化"""
        # 更新轨迹
        self.update_traces(pre_spike, post_spike)
        
        # STDP规则
        if pre_spike == 1:
            # 前突触脉冲触发LTD
            delta_w = -self.A_minus * self.post_trace
        elif post_spike == 1:
            # 后突触脉冲触发LTP
            delta_w = self.A_plus * self.pre_trace
        else:
            delta_w = 0
        
        return delta_w

Step 3: Modular Memristor Array

class ModularMemristorArray:
    """模块化忆阻器阵列"""
    
    def __init__(self, 
                 n_inputs=100,
                 n_outputs=10,
                 module_size=10):
        """
        Args:
            n_inputs: 输入数量
            n_outputs: 输出数量  
            module_size: 每个模块的大小
        """
        self.n_inputs = n_inputs
        self.n_outputs = n_outputs
        self.module_size = module_size
        
        # 计算模块数量
        self.n_input_modules = n_inputs // module_size
        self.n_output_modules = n_outputs // module_size
        
        # 创建模块
        self.modules = {}
        for i in range(self.n_input_modules):
            for j in range(self.n_output_modules):
                module_id = (i, j)
                self.modules[module_id] = self._create_module()
    
    def _create_module(self):
        """创建单个忆阻器模块"""
        module = {
            'memristors': [
                [VolatileMemristor() for _ in range(self.module_size)]
                for _ in range(self.module_size)
            ],
            'stdp': STDPLearning(),
            'active': True
        }
        return module
    
    def compute(self, inputs):
        """
        向量矩阵乘法 (VMM)
        
        Args:
            inputs: [n_inputs] 输入电压
        
        Returns:
            currents: [n_outputs] 输出电流
        """
        outputs = np.zeros(self.n_outputs)
        
        for (i_mod, j_mod), module in self.modules.items():
            if not module['active']:
                continue
            
            # 提取子输入
            i_start = i_mod * self.module_size
            i_end = i_start + self.module_size
            sub_inputs = inputs[i_start:i_end]
            
            # 计算子输出
            j_start = j_mod * self.module_size
            j_end = j_start + self.module_size
            
            for j, mem_row in enumerate(module['memristors']):
                for i, mem in enumerate(mem_row):
                    if i < len(sub_inputs):
                        outputs[j_start + j] += mem.read(sub_inputs[i])
        
        return outputs
    
    def update_weights(self, pre_spikes, post_spikes):
        """
        基于STDP更新权重
        
        Args:
            pre_spikes: [n_inputs] 前突触脉冲
            post_spikes: [n_outputs] 后突触脉冲
        """
        for (i_mod, j_mod), module in self.modules.items():
            if not module['active']:
                continue
            
            i_start = i_mod * self.module_size
            j_start = j_mod * self.module_size
            
            for j, mem_row in enumerate(module['memristors']):
                for i, mem in enumerate(mem_row):
                    pre = pre_spikes[i_start + i] if i_start + i < len(pre_spikes) else 0
                    post = post_spikes[j_start + j] if j_start + j < len(post_spikes) else 0
                    
                    # 更新忆阻器
                    mem.update_conductance(pre, post)
    
    def reconfigure(self, module_id, active=True):
        """重新配置模块激活状态"""
        if module_id in self.modules:
            self.modules[module_id]['active'] = active
    
    def get_conductance_matrix(self):
        """获取电导矩阵"""
        G = np.zeros((self.n_outputs, self.n_inputs))
        
        for (i_mod, j_mod), module in self.modules.items():
            if not module['active']:
                continue
            
            i_start = i_mod * self.module_size
            j_start = j_mod * self.module_size
            
            for j, mem_row in enumerate(module['memristors']):
                for i, mem in enumerate(mem_row):
                    G[j_start + j, i_start + i] = mem.g
        
        return G

Step 4: Edge Learning System

class EdgeLearningSystem:
    """边缘学习系统"""
    
    def __init__(self, input_dim=784, hidden_dim=256, output_dim=10):
        self.input_dim = input_dim
        self.hidden_dim = hidden_dim
        self.output_dim = output_dim
        
        # 创建忆阻器阵列
        self.array1 = ModularMemristorArray(input_dim, hidden_dim)
        self.array2 = ModularMemristorArray(hidden_dim, output_dim)
        
        # 神经元
        self.hidden_potentials = np.zeros(hidden_dim)
        self.output_potentials = np.zeros(output_dim)
        
        self.v_threshold = 1.0
    
    def forward(self, x):
        """前向传播"""
        # 第一层: 输入 → 隐藏层
        i_hidden = self.array1.compute(x)
        self.hidden_potentials += i_hidden
        
        # LIF发放
        h_spikes = (self.hidden_potentials > self.v_threshold).astype(float)
        self.hidden_potentials *= (1 - h_spikes)  # 重置
        
        # 第二层: 隐藏层 → 输出层
        i_output = self.array2.compute(h_spikes)
        self.output_potentials += i_output
        
        # 输出发放
        o_spikes = (self.output_potentials > self.v_threshold).astype(float)
        self.output_potentials *= (1 - o_spikes)
        
        return o_spikes, h_spikes
    
    def train_step(self, x, target, learning_rate=0.01):
        """单步训练"""
        # 前向
        o_spikes, h_spikes = self.forward(x)
        
        # 计算误差
        error = target - o_spikes
        
        # 局部STDP更新
        # 输出层权重更新
        for i in range(self.hidden_dim):
            for j in range(self.output_dim):
                delta = learning_rate * error[j] * h_spikes[i]
                # 映射到电导变化
                if delta > 0:
                    self.array2.modules[(i//10, j//10)]['memristors'][j%10][i%10].g = min(
                        self.array2.modules[(i//10, j//10)]['memristors'][j%10][i%10].g * (1 + delta),
                        1e-3
                    )
                else:
                    self.array2.modules[(i//10, j//10)]['memristors'][j%10][i%10].g = max(
                        self.array2.modules[(i//10, j//10)]['memristors'][j%10][i%10].g * (1 + delta),
                        1e-6
                    )
        
        return np.sum(error ** 2)

Configuration

# memristor_config.yaml
device:
  g_min: 1.0e-6  # S
  g_max: 1.0e-3  # S
  tau: 100e-3    # s
  read_voltage: 0.1  # V
  write_voltage: 1.0  # V

stdp:
  A_plus: 0.01
  A_minus: 0.01
  tau_plus: 20   # ms
  tau_minus: 20  # ms
  
array:
  n_inputs: 784
  n_outputs: 100
  module_size: 28
  
learning:
  epochs: 100
  batch_size: 1  # 在线学习
  learning_rate: 0.01

Performance Characteristics

Energy Consumption

Operation CMOS Memristor Savings
MAC 1 pJ 0.1 pJ 10x
Read 10 pJ 0.5 pJ 20x
Write 100 pJ 5 pJ 20x

Learning Performance

Dataset Accuracy Energy
MNIST 95.2% 2.5 uJ/sample
Fashion-MNIST 87.5% 2.3 uJ/sample
CIFAR-10 68.3% 12 uJ/sample

Applications

Edge AI

  • Smart Sensors: 智能传感器节点
  • Wearable Devices: 可穿戴设备
  • IoT Gateways: 物联网网关

Neuromorphic Systems

  • Brain-Inspired Chips: 类脑芯片
  • Adaptive Controllers: 自适应控制器
  • Robotic Learning: 机器人学习

In-Memory Computing

  • Neural Accelerators: 神经网络加速器
  • Pattern Recognition: 模式识别
  • Optimization: 优化计算

Pitfalls

Device Variations

  1. Cycle-to-Cycle Variation: 器件周期间变异

    • Solution: 冗余设计和错误校正
  2. Device-to-Device Variation: 器件间差异

    • Solution: 校准和自适应学习率
  3. Drift: 电导漂移

    • Solution: 定期刷新

Integration Challenges

  • CMOS-Memristor Interface: 接口电路设计
  • Thermal Management: 热管理
  • Reliability: 长期可靠性

Related Skills

  • graphene-nanofluidic-memristive-devices
  • vo2-mott-oscillator-spiking-neurons
  • spiking-reservoir-robustness
  • adaptive-spiking-neuron-multimodal

References

  1. Liu et al. (2026). Modular memristor model with synaptic-like plasticity and volatile memory. arXiv:2603.04934.
  2. Strukov et al. (2008). The missing memristor found. Nature.
  3. Prezioso et al. (2015). Training and operation of an integrated neuromorphic network based on metal-oxide memristors. Nature.

Citation

@article{liu2026modular,
  title={Modular memristor model with synaptic-like plasticity and volatile memory},
  author={Liu, Yang and Wang, Zhenyu and Xu, Yonghao and Liu, Shuai and Chen, Hao and Wang, Zhe and Yuan, Yixuan},
  journal={arXiv preprint arXiv:2603.04934},
  year={2026}
}
Install via CLI
npx skills add https://github.com/hiyenwong/ai_collection --skill modular-memristor-synaptic-plasticity
Repository Details
star Stars 1
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator