SNN(TTFS)论文阅读——LC-TTFS
LC-TTFS: Towards Lossless Network Conversion for Spiking Neural Networks with TTFS Coding
证明目标
论文的最终数学目标是证明:在 LC−TTFSLC-TTFSLC−TTFS 算法的约束下,ANN 和 SNN 之间存在一个完美的、逐层传递的映射关系。
用数学语言来描述这个目标就是:
假设在 l−1l-1l−1 层,ANN的激活值 aj(l−1)a_j(l-1)aj(l−1) 和 SNN 的脉冲时间 tj(l−1)t_j(l-1)tj(l−1) 遵循以下编码关系:
$ t_j^{l-1} = (l-1) + 1 - a_j^{l-1} = l - a_j^{l-1} \quad \cdots \text{(公式 9)} $
那么,我们必须能够证明,在下一层 lll,其激活值 aila_i^lail 和脉冲时间 tilt_i^ltil 也将严格遵循相同的编码关系:
$ t_i^l = l + 1 - a_i^l \quad \cdots \text{(公式 19)} $
这个证明本质上是一个数学归纳法:只要证明了这个从 l−1l-1l−1 层到 lll 层的传递关系成立,那么整个网络的转换就是无损的,因为这个完美的编码关系在网络中逐层被保持下去了。
证明推导步骤 (The Derivation Steps)
作者的推导过程是一个“从一般到特殊”的过程。他们首先写出SNN神经元发放时间的一般表达式,然后一步步代入他们提出的约束条件,最终将其化简为我们想要的证明目标。
起始点:SNN神经元发放时间的一般表达式
从SNN最基本的物理规则出发:当神经元 iii 的膜电位 Vil(t)V_i^l(t)Vil(t) 第一次达到发放阈值 ϑϑϑ 时,它就会发放一个脉冲,此时的 ttt 就是它的发放时间 tilt_i^ltil。
-
膜电位公式 (来自公式4):
Vil(t)=∑jwijl(t−tjl−1)V_i^l(t) = \sum_{j} w_{ij}^l (t - t_j^{l-1}) Vil(t)=j∑wijl(t−tjl−1) -
发放条件 (来自公式5):
Vil(til)=ϑV_i^l(t_i^l) = \vartheta Vil(til)=ϑ -
联立上面两个式子,我们可以解出 tilt_i^ltil 的一般表达式 (公式8):
∑jwijl(til−tjl−1)=ϑ\sum_{j} w_{ij}^l (t_i^l - t_j^{l-1}) = \vartheta j∑wijl(til−tjl−1)=ϑtil∑jwijl−∑jwijltjl−1=ϑt_i^l \sum_{j} w_{ij}^l - \sum_{j} w_{ij}^l t_j^{l-1} = \vartheta tilj∑wijl−j∑wijltjl−1=ϑ
til=ϑ+∑jwijltjl−1∑jwijl⋯(这是推导的起点)t_i^l = \frac{\vartheta + \sum_{j} w_{ij}^l t_j^{l-1}}{\sum_{j} w_{ij}^l} \quad \cdots \text{(这是推导的起点)} til=∑jwijlϑ+∑jwijltjl−1⋯(这是推导的起点)
-
问题显现:此时的 tilt_i^ltil 表达式非常复杂,它不仅依赖于输入的脉冲时间 tj(l−1)t_j(l-1)tj(l−1),还依赖于一个不确定的分母项 ∑w∑w∑w。这就是作者定义的**“时间扭曲问题”**的数学根源。
-
以ANN为例,神经元的输出只依赖于:
ail=f(∑wijlajl−1+bil) a_i^l = f(\sum w_{ij}^l a_j^{l-1} + b_i^l) ail=f(∑wijlajl−1+bil)
如果两个神经元有相同的加权输入和,它们会有相同的输出(假设相同的偏置和激活函数)。但是SNN中,对于两个得到相同加权和(充电电流)的神经元来说,它们理应表现出相同的特性,但是由于权重和的存在导致它们发放时间并不一致。这就是时空扭曲问题。
-
步骤一:代入编码关系,连接SNN与ANN
现在,我们将 l−1l-1l−1 层的编码关系
tj(l−1)=l−aj(l−1)
t_j(l-1) = l - a_j(l-1)
tj(l−1)=l−aj(l−1)
(公式9) 代入上述一般表达式中,从而将 tilt_i^ltil 和ANN的激活值 aj(l−1)a_j^(l-1)aj(l−1) 联系起来。
til=ϑ+∑jwijl(l−ajl−1)∑jwijlt_i^l = \frac{\vartheta + \sum_{j} w_{ij}^l (l - a_j^{l-1})}{\sum_{j} w_{ij}^l}
til=∑jwijlϑ+∑jwijl(l−ajl−1)
til=ϑ+l∑jwijl−∑jwijlajl−1∑jwijl⋯(公式 10)t_i^l = \frac{\vartheta + l \sum_{j} w_{ij}^l - \sum_{j} w_{ij}^l a_j^{l-1}}{\sum_{j} w_{ij}^l} \quad \cdots \text{(公式 10)} til=∑jwijlϑ+l∑jwijl−∑jwijlajl−1⋯(公式 10)
这个公式是连接两个世界的桥梁,但形式依然很丑陋。
骤二:施加第一个核心约束——权重正则化
为了解决“时间扭曲问题”,作者引入了第一个关键约束:强制让每个神经元的输入权重总和为1。
∑jwijl=1\sum_{j} w_{ij}^l = 1
j∑wijl=1
将这个约束代入公式(10):
til=ϑ+l(1)−∑jwijlajl−11t_i^l = \frac{\vartheta + l(1) - \sum_{j} w_{ij}^l a_j^{l-1}}{1}
til=1ϑ+l(1)−∑jwijlajl−1
til=ϑ+l−∑jwijlajl−1t_i^l = \vartheta + l - \sum_{j} w_{ij}^l a_j^{l-1} til=ϑ+l−j∑wijlajl−1
分母消失了,“时间扭曲”的根源被消除了。
步骤三:施加第二个核心约束——阈值设定\
进一步设定 ϑ=1ϑ = 1ϑ=1。这既是为了简化计算,也与后面使用的 ReLU1ReLU1ReLU1 激活函数相匹配。代入后得到:
til=1+l−∑jwijlajl−1⋯(公式 15)
t_i^l = 1 + l - \sum_{j} w_{ij}^l a_j^{l-1} \quad \cdots \text{(公式 15)}
til=1+l−j∑wijlajl−1⋯(公式 15)
- 关键洞察:请注意,这里的 ∑wijlaj(l−1)∑ w_{ij}^l a_j(l-1)∑wijlaj(l−1) 正是ANN中第 lll 层神经元 iii 在激活函数之前的加权输入和(即预激活值)。
步骤四:施加第三个核心约束——动态阈值与ReLU1的对称性
我们离目标 til=l+1−ailt_i^l = l + 1 - a_i^ltil=l+1−ail 已经非常接近了。区别在于,我们现在得到的是预激活值,而目标是后激活值 aila_i^lail。
这里的推导非常巧妙,利用了作者设计的动态阈值函数 Fl(t)F^l(t)Fl(t) 和 ReLU1ReLU1ReLU1 激活函数 y(x)y(x)y(x) 之间的数学对称性。
论文中的函数 FFF 是一个变换函数 (transformation function),它代表了“动态发放阈值 (dynamic firing threshold)”机制所产生的效果。
简单来说,FFF 的作用是将一个计算出的、理论上的脉冲发放时间,映射(或“限制”)到一个预先为该层神经元分配好的、允许的时间窗口内。
要解决的问题: 论文指出了在将 ANN (人工神经网络) 转换为 SNN (脉冲神经网络) 时存在一个“时间动态问题 (temporal dynamics problem)”,即脉冲可能会过早或过晚发放,导致信息处理出错。为了解决这个问题,作者提出了一种“动态发放阈值”机制。
FFF 的具体映射关系: 这个机制的效果等同于应用了函数 FFF。根据论文中的公式 (12) 和图 3(b),对于第 lll 层的神经元,其允许的发放时间窗口是 [Tl,T(l+1))[Tl, T(l+1))[Tl,T(l+1))。
- 如果一个计算出的脉冲时间 ttt 早于这个窗口的起始时间 TlTlTl,FFF 会将其映射为窗口的起始时间 TlTlTl。
- 如果 ttt 恰好在允许的时间窗口内,FFF 不会改变它。
- 如果 ttt 晚于这个窗口的结束时间 T(l+1)T(l+1)T(l+1),FFF 会将其映射为窗口的结束时间 T(l+1)T(l+1)T(l+1)。
本质上,FFF 是一个**“裁剪”或“钳位”(clamping)函数**,它确保了无论计算出的脉冲时间是多少,最终实际的脉冲时间都必须落在为该层分配的特定时间段内。
最终目的: 通过这种映射,该算法保证了 SNN 的每一层都在一个独立的、不重叠的时间窗口内完成计算。前一层的所有脉冲都发放完毕后,后一层才开始发放脉冲。这解决了“时间动态问题”,确保了从 ANN 的激活值到 SNN 的脉冲时间的转换是稳定和“近乎无损”的,从而实现了高精度的网络转换。
-
ANN中的关系是:
ail=y(∑jwijlajl−1) a_i^l = y(\sum_{j} w_{ij}^l a_j^{l-1}) ail=y(j∑wijlajl−1) -
作者在论文中给出了一个关键的恒等式(公式17):
Fl(x)=l+1−y(l+1−x) F^l(x) = l+1 - y(l+1-x) Fl(x)=l+1−y(l+1−x) -
我们在步骤三得到的 tilt_i^ltil 是一个“理论计算出的”时间,它可能超出允许的范围。实际的脉冲时间是经过动态阈值函数 FlF^lFl 钳位后的结果,即
Actualtil=Fl(til) Actual t_i^l = F^l(t_i^l) Actualtil=Fl(til)
现在,我们将步骤三得到的 tilt_i^ltil (公式15) 代入 Fl(x)F^l(x)Fl(x) 的 xxx 中:
Actualtil=Fl(1+l−∑jwijlajl−1)
\text{Actual} t_i^l = F^l(1 + l - \sum_{j} w_{ij}^l a_j^{l-1})
Actualtil=Fl(1+l−j∑wijlajl−1)
利用上面的恒等式
Fl(x)=l+1−y(l+1−x)
F^l(x) = l+1 - y(l+1-x)
Fl(x)=l+1−y(l+1−x)
,我们得到:
Actualtil=(l+1)−y((l+1)−(1+l−∑jwijlajl−1))\text{Actual} t_i^l = (l+1) - y \left( (l+1) - (1 + l - \sum_{j} w_{ij}^l a_j^{l-1}) \right)
Actualtil=(l+1)−y((l+1)−(1+l−j∑wijlajl−1))
化简括号内的部分:
(l+1)−(1+l−∑jwijlajl−1)=l+1−1−l+∑jwijlajl−1=∑jwijlajl−1(l+1) - (1 + l - \sum_{j} w_{ij}^l a_j^{l-1}) = l+1-1-l + \sum_{j} w_{ij}^l a_j^{l-1} = \sum_{j} w_{ij}^l a_j^{l-1}
(l+1)−(1+l−j∑wijlajl−1)=l+1−1−l+j∑wijlajl−1=j∑wijlajl−1
所以,上式变为:
Actualtil=(l+1)−y(∑jwijlajl−1)\text{Actual} t_i^l = (l+1) - y(\sum_{j} w_{ij}^l a_j^{l-1})
Actualtil=(l+1)−y(j∑wijlajl−1)
我们知道
ail=y(∑jwijlajl−1)
a_i^l = y(\sum_{j} w_{ij}^l a_j^{l-1})
ail=y(j∑wijlajl−1)
,代入进去:
Actualtil=l+1−ail
\text{Actual} t_i^l = l+1 - a_i^l
Actualtil=l+1−ail
证明完成! 我们成功地从 l−1l-1l−1 层的编码关系和SNN的基本物理规则出发,通过应用作者提出的三个核心约束(权重和为1,阈值为1,动态阈值/ReLU1),严格推导出了 lll 层的编码关系。
为什么文章强调不能使用BN,BN会破坏对权重的归一化?
普通的BN会引入一个新的、可学习的缩放因子(γ),这个因子会破坏(或者说“覆盖”)掉∑w=1这个约束,从而让整个数学推导功亏一篑。
一个标准的BN层,作用在预激活值zzz上,执行以下两个步骤:
-
归一化 (Normalize):
z^=z−μBσB2+ϵ\hat{z} = \frac{z - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} z^=σB2+ϵz−μB
它将一批数据(a batch)的zzz值调整为均值为0,方差为1的分布。μBμ_BμB和σBσ_BσB是这批数据的均值和方差。 -
缩放和偏移 (Scale and Shift):
zBN=γz^+βz_{BN} = \gamma \hat{z} + \beta zBN=γz^+β
这是最关键的一步!BN层会用两个可学习的参数 γγγ (gamma, 缩放) 和 βββ (beta, 偏移) 对归一化后的 hat(z)hat(z)hat(z) 进行处理,得到最终的输出 zBNz_{BN}zBN。这个zBNz_{BN}zBN才是真正送入激活函数(如ReLU)的值。
冲突点就在这里:
- 神经网络在训练时,为了降低损失,会自由地学习γγγ和βββ的值。γγγ几乎不可能是1,βββ也几乎不可能是0。
- 现在,进入激活函数的不再是zzz,而是zBNz_{BN}zBN。
- 那么,我们之前推导出的tspike=(l+1)−zt_{spike} = (l+1) - ztspike=(l+1)−z这个公式,就必须被替换成 tspike=(l+1)−zBNt_{spike} = (l+1) - z_{BN}tspike=(l+1)−zBN。
我们把zBNz_{BN}zBN的完整形式代进去:
tspike=(l+1)−(γ∑wa−μBσB+β)t_{spike} = (l+1) - (\gamma \frac{\sum w a - \mu_B}{\sigma_B} + \beta)
tspike=(l+1)−(γσB∑wa−μB+β)
这完全是一场灾难
-
γγγ的破坏性:我们费尽心机通过权重正则化让∑w=1∑w=1∑w=1,但现在又凭空出现了一个新的缩放因子γγγ。这个γγγ是网络自己学到的,我们无法控制它等于1。它重新引入了我们想要消除的“时间扭曲问题”。γγγ就像一个不可预测的乘数,彻底破坏了zzz和tspiket_{spike}tspike之间干净的线性关系。
-
βββ和μBμ_BμB的破坏性:βββ和μBμ_BμB引入了偏移量,同样也破坏了原始的线性关系。
