教程 4: CANN 参数效应

Note

阅读时间: 30-35分钟

难度: 中级

先决条件: 教程 1-3

本教程系统地探索不同 CANN1D 参数如何影响模型动力学。


1. 参数概览

CANN1D 具有以下主要参数:

参数

默认值

物理意义

num

256

神经元数量(网络分辨率)

tau

1.0

时间常数(动力学速度)

k

8.1

全局抑制强度

a

0.5

连接宽度(局部兴奋范围)

A

10

外部输入振幅

J0

4.0

突触连接强度

tau_v

50.0

SFA [9, 10] 时间常数(仅限 CANN1D_SFA)

我们将使用 SmoothTracking1D 任务和 energy_landscape_1d_animation 可视化来观察每个参数的影响。


2. 实验设置

2.1 基础代码框架

[1]:
import brainpy.math as bm  # :cite:p:`wang2023brainpy`
from canns.models.basic import CANN1D, CANN1D_SFA
from canns.task.tracking import SmoothTracking1D
from canns.analyzer.visualization import (
    PlotConfigs,
    energy_landscape_1d_animation
)

# Setup environment
bm.set_dt(0.1)

def run_experiment(model, title="", save_path=None):
    """Run standard experiment and visualize results"""

    # Create smooth tracking task
    task = SmoothTracking1D(
        cann_instance=model,
        Iext=[0.0, 3.0, 2.0, 3.0],
        duration=[20.0, 20.0, 10.0],
        time_step=0.1,
    )

    # Get task data
    task.get_data()

    def run_step(t, inp):
        model.update(inp)
        return model.u.value, model.r.value, model.inp.value

    u_history, r_history, input_history = bm.for_loop(run_step, operands=(task.run_steps, task.data), progress_bar=10)

    # Configure and create visualization
    config = PlotConfigs.energy_landscape_1d_animation(
        time_steps_per_second=100,
        fps=20,
        title=title,
        xlabel='Position',
        ylabel='Firing Rate',
        repeat=True,
        show=True,
        save_path=save_path
    )

    energy_landscape_1d_animation(
        data_sets={'u': (model.x, u_history), 'stimulus': (model.x, input_history)},
        config=config
    )

    return r_history

2.2 默认参数基线

首先,使用默认参数建立基线:

[2]:
# Default parameters
model_default = CANN1D(
    num=256, tau=1.0, k=8.1, a=0.5, A=10, J0=4.0
)
r_default = run_experiment(
    model_default,
    title="Default Parameters",
    save_path=None  # Set to 'default.gif' to save
)
<SmoothTracking1D> Generating Task data: 500it [00:00, 997.94it/s]

观察要点: 波包应平稳地从左到右跟踪刺激,形状稳定且清晰。


3. 参数探索

对于每个参数,我们将通过多个实验创建并排比较。这种方法允许您直接比较不同的参数取值。

3.1 神经元数量 num

num 控制网络分辨率。神经元数量越多,特征表示越精细,但计算成本越高。

[3]:
# Test different neuron counts
for num_val in [64, 256, 512]:
    model = CANN1D(num=num_val, tau=1.0, k=8.1, a=0.5, A=10, J0=4.0)
    run_experiment(
        model,
        title=f"Number of Neurons: {num_val}",
        save_path=None
    )
<SmoothTracking1D> Generating Task data: 500it [00:00, 1007.50it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 7830.98it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 1487.74it/s]

观察结果: - num=64: 分辨率较低,波包表示较粗糙 - num=256: 分辨率平衡,标准选择 - num=512: 分辨率更高,波包更平滑,但计算量增加

关键洞察: 分辨率影响波包的平滑度,但不影响基本动力学特性。当需要精确的空间表征时,应使用更高的 num

3.2 时间常数 tau

tau 控制动力学的时间尺度。较大的 tau 意味着对输入的响应更缓慢。

[4]:
# Test different time constants
for tau_val in [0.5, 1.0, 2.0]:
    model = CANN1D(num=256, tau=tau_val, k=8.1, a=0.5, A=10, J0=4.0)
    run_experiment(
        model,
        title=f"Time Constant: tau={tau_val}",
        save_path=None
    )
<SmoothTracking1D> Generating Task data: 500it [00:00, 6681.74it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 7698.46it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 1703.66it/s]

观察结果: - tau=0.5: 响应迅速,波包紧密跟随刺激,延迟极小 - tau=1.0: 标准响应,跟踪速度平衡 - tau=2.0: 响应缓慢,波包滞后于移动的刺激

关键洞察: tau 控制网络的时间滤波特性。较小的 tau 使网络对变化输入的适应更快——较大的 tau 则产生更平滑、更缓慢的动力学。

3.3 全局抑制 k

k 控制全局抑制强度——对维持单波包吸引子状态至关重要。

[5]:
# Test different inhibition strengths
for k_val in [4.0, 8.1, 16.0]:
    model = CANN1D(num=256, tau=1.0, k=k_val, a=0.5, A=10, J0=4.0)
    run_experiment(
        model,
        title=f"Global Inhibition: k={k_val}",
        save_path=None
    )
<SmoothTracking1D> Generating Task data: 500it [00:00, 7221.90it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 4806.87it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 5538.20it/s]

观察结果: - k=4.0: 抑制较弱,波包可能不稳定、过宽或分裂为多个波包 - k=8.1: 抑制平衡,形成稳定的单波包 - k=16.0: 抑制较强,波包更尖锐、更窄

关键洞察: k 平衡兴奋与抑制。过弱会导致不稳定或多重波包——过强则可能导致波包无法形成或过于狭窄。

3.4 连接宽度 a

a 控制局部兴奋连接的空间范围——直接影响波包的宽度。

[6]:
# Test different connection widths
for a_val in [0.3, 0.5, 0.8]:
    model = CANN1D(num=256, tau=1.0, k=8.1, a=a_val, A=10, J0=4.0)
    run_experiment(
        model,
        title=f"Connection Width: a={a_val}",
        save_path=None
    )
<SmoothTracking1D> Generating Task data: 500it [00:00, 4087.94it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 2955.45it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 7412.03it/s]

观察结果: - a=0.3:连接范围窄,产生较窄的波包,峰值更尖锐 - a=0.5:标准宽度,波包形状平衡 - a=0.8:连接范围宽,产生更宽、分布更广的波包

关键洞察a 直接决定空间感受野的大小。应根据应用所需的空间精度调整 a

3.5 外部输入振幅 A

A 控制外部刺激输入的振幅。

[7]:
# Test different input amplitudes
for A_val in [5, 10, 20]:
    model = CANN1D(num=256, tau=1.0, k=8.1, a=0.5, A=A_val, J0=4.0)
    run_experiment(
        model,
        title=f"Input Amplitude: A={A_val}",
        save_path=None
    )
<SmoothTracking1D> Generating Task data: 500it [00:00, 3244.44it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 4569.55it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 634.16it/s]

观察结果: - A=5:输入较弱,波包的峰值放电率较低 - A=10:标准振幅,响应平衡 - A=20:输入较强,波包的峰值放电率更高,且可能扩散范围更广

关键洞察A 决定外部输入驱动网络的强度。较高的 A 使波包对外部刺激的响应强于内部循环动力学。

3.6 突触连接强度 J0

J0 控制循环突触连接的最大强度。

[8]:
# Test different connection strengths
for J0_val in [2.0, 4.0, 8.0]:
    model = CANN1D(num=256, tau=1.0, k=8.1, a=0.5, A=10, J0=J0_val)
    run_experiment(
        model,
        title=f"Synaptic Strength: J0={J0_val}",
        save_path=None
    )
<SmoothTracking1D> Generating Task data: 500it [00:00, 4871.12it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 5754.28it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 590.77it/s]

观察结果: - J0=2.0:循环连接较弱,波包在无输入时难以维持稳定 - J0=4.0:标准连接,波包稳定维持 - J0=8.0:循环连接较强,波包极为稳定,但可能过于僵化

关键洞察J0 决定吸引子的强度。更高的 J0 意味着更强的自持动力学和更好的记忆保持能力,但可能降低对输入变化的响应灵敏度。

3.7 SFA 时间常数 tau_v

对于 CANN1D_SFAtau_v 控制尖峰频率适应(SFA)的时间尺度。SFA 会产生一种适应电流,即使在无外部速度输入的情况下,也可能导致波包漂移。

[9]:
# Test different SFA time constants
for tau_v_val in [20.0, 50.0, 100.0]:
    model = CANN1D_SFA(
        num=256,
        tau=1.0,
        tau_v=tau_v_val,
        k=8.1,
        a=0.3,
        A=0.2,
        J0=1.0,
        m=0.3
    )
    run_experiment(
        model,
        title=f"SFA Time Constant: tau_v={tau_v_val}",
        save_path=None
    )
<SmoothTracking1D> Generating Task data: 500it [00:00, 987.72it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 7448.12it/s]
<SmoothTracking1D> Generating Task data: 500it [00:00, 1604.13it/s]

观察结果: - tau_v=20.0:适应迅速,波包漂移更快,甚至可能领先于刺激 - tau_v=50.0:标准适应,漂移行为适中 - tau_v=100.0:适应缓慢,漂移效应较弱

关键洞察:SFA [9, 10] 引入了预测性动力学。适应电流造成的不对称性可使波包“预测”运动方向,这对路径积分模型 [4, 28] 非常有用。


4. 后续步骤

恭喜您完成所有基础教程!您现已理解:

  • 所有主要 CANN 参数及其物理意义

  • 每个参数对波包动力学的影响

  • 如何开展系统的参数扫描实验

  • 参数选择中涉及的权衡

参数选择指南

在为您的应用配置 CANN 模型时:

  1. 从默认参数开始——默认参数提供稳定且行为良好的动力学

  2. 将分辨率与需求匹配——高 num 用于精确空间编码,低 num 用于提升效率

  3. 调整时间动力学——根据所需响应速度调整 tau

  4. 平衡稳定性与灵活性——J0k 控制吸引子强度

  5. 匹配空间尺度——根据所需波包宽度设置 a

继续学习

从此处选择高级应用教程:

或探索其他场景:

  • 场景 2: 数据分析——使用 CANN 分析实验神经数据

  • 场景 3: 脑启发学习——CANN 的脑启发训练方法

  • 场景 4: 端到端流程——从数据到发表的完整研究工作流

关键要点

  1. 参数相互关联——修改一个参数可能需要调整其他参数以维持系统稳定

  2. 可视化以理解——探索参数时,始终使用能量景观可视化

  3. 从简单开始——在转向 SFA 或 2D 变体前,先从基础 CANN1D 入手

  4. 记录您的选择——记录参数取值的选取理由,以确保可复现性