0
点赞
收藏
分享

微信扫一扫

类脑计算论文泛读

1kesou 2022-03-30 阅读 69

  上学期听了何毓辉老师的《类脑计算与器件》课程,本文也是对上学期上课内容的大体总结。

参考文献:

  • [1] Nature Communications 2017, Face classification using electronic synapses
  • [2] Nature 2015, Training andoperation of an integrated neuromorphic network based on metal-oxide memristors
  • [3] IEDM 2015, Experimental demonstration and tolerancing of a large-scale neural network (165,000 synapses), using phase-change memory as the synaptic weight element
  • [4] TNNLS 2015, Supervised Learning Using Spike-Timing-Dependent Plasticity of Memristive Synapses
  • [5] VLSI 2016, Novel RRAM-enabled 1T1R synapse capable of low-power STDP via burst-mode communication and real-time unsupervised machine learning
  • [6] Nature Electronics 2019, Reinforcement learning with analogue memristor arrays
  • [7] IJCNN 2016, Memristor Crossbar Deep Network Implementation Based on a Convolutional Neural Network
  • [8] IJCNN 2017, Extremely Parallel Memristor Crossbar Architecture for Convolutional Neural Network Implementation
  • [9] Nature Nanotechnology 2017, Sparse coding with memristor networks

忆阻器

  忆阻器是一种统称,它一般指电导可以连续调节,并且调节结果可以保存的器件。主要有:阻变存储器、相变存储器、铁电晶体管、浮栅晶体管等。
在这里插入图片描述
  阻变存储器以氧化铪HfO2为例,它有一半低阻区(LR)一半高阻区(HR)。在两端加较小的电压时,LR和HR之间的界面几乎不会移动;加比较大的电压时,会有氧空位(Oxygen Vacancies)在界面之间移动,造成界面的漂移。LR区域越多,整体的电导越大,反之HR区域越多,电导越小。外加电压与电导的调整量不是线性关系,外加电压主要加在HR区域上,随着HR区域的减小,HR区域中的场强会越来越大,氧空位移动速度会加快。除此之外,氧空位自己也会发生漂移,这为器件带来了很大的随机性。
  相变存储器(Phase Change Memory,PCM),是依靠晶态与非晶态的变化来改变电导的一种器件。它从非晶态(amorphous)向晶态(cubic)变化时,电导值可以连续增加,但是从晶态到非晶态的过程中电导是突变的,这和它的物理机制有关。
在这里插入图片描述

  从非晶态到晶态的过程称为“annealing”,对应上图中的加Set温度曲线,温度要超过结晶温度 T c r y s \rm T_{crys} Tcrys,但不能到达熔融温度。从晶态到非晶态的过程称为“melt-quenching”,需要将温度身高到熔融温度 T m e l t \rm T_{melt} Tmelt,并快速降温,对应图中的Reset曲线。
  那么如何做到对器件的温度控制呢?实际上就相当于电阻发热,发热功率是 V 2 / R V^2/R V2/R,所以在读PCM的电导值是,外加一个小电压,也会产生一定的热效应,对应图中的Read曲线。
在这里插入图片描述

  用于人工神经网路的忆阻器,我们比较关心它的线性度。长时增强效应(long term potentiation, LTP)和长时抑制效应(long term depression,LTD)是两个重要的衡量指标。阻变存储器的LTP和LTD虽然可能没有上图中那么线性,但大体还是有缓慢增加或减少的趋势,而相变存储器的LTD则是电导值始终位置在较低的水平。
  铁电晶体管与浮栅晶体管的原理类似。浮栅晶体管是Nand Flash的基本构成单元,它的栅介质层中有一个“浮栅”,主要材料是多晶硅。在外加电压作用下,衬底电荷利用隧穿效应可以在浮栅与衬底之间穿梭,电荷能够留存在浮栅中,起到保存沟道电导值的目的。铁电晶体管的栅介质层是铁电材料,它可以被外加电压极化,并维持极化的状态。

1T1R突触结构

  论文[1]中介绍了利用1个晶体管+1个RRAM作为突触,利用感知机模型实现人脸分类。人脸图像20×16个像素,训练样本包含三个不同的人的人脸。
f ( x ) = s i g n ( ω T x + b ) f(x) = {\mathop{\rm sign}\nolimits} \left( { {\omega ^T}x + b} \right) f(x)=sign(ωTx+b)
  从算法层面说,每个样本320维,权值 ω \omega ω也是320维,每个样本带有一个标签,将样本送入感知机,得到结果,与预期结果对比,利用梯度下降法更新权值。感知机模型中用的符号函数 s i g n ( ) \rm sign() sign()不是连续可导的,不能用梯度下降法,因此可以用双曲正切函数近似。

f ( x ) = tanh ⁡ ( ω T x + b )        tanh ⁡ ( a ) = sinh ⁡ a cosh ⁡ a = e a − e − a e a + e − a f(x) = \tanh \left( { {\omega ^T}x + b} \right)\;\;\;\tanh (a) = { {\sinh a} \over {\cosh a} } = { { {e^a} - {e^{ - a} } } \over { {e^a}{\rm{ + } }{e^{ - a} } } } f(x)=tanh(ωTx+b)tanh(a)=coshasinha=ea+eaeaea
在这里插入图片描述

  但从算法方面考虑这一问题比较简单,硬件实现会有一些额外的问题。在硬件上,每个突触与一个权值对应。突触阵列能够方便地完成向量矩阵乘法(VMM),因为它是并行的乘加运算。所以RRAM阵列很适合用来做前向推理,但是更新权值比较麻烦。
  它非常依赖外部的计算资源,比如梯度下降法计算权值的更新量,这是在阵列外部完成的,我们需要考虑更改权值也就是突触电导值的策略。

层面法则1法则2
算法Delta RuleManhattan Rule
硬件Write with VerifyWirte without Verify

  主要有两种方式,“Delta Rule”就是精准改变权值,计算出 ω \omega ω需要改变多少就改变多少。而前面提到RRAM的电导调整是非线性的,因此每次改电导值都需要再读出来确认是否改到位了。  另一种方式是“Manhattan Rule”,它只关心权值改变的方向,比如 ω \omega ω需要增大,那么这次修改就增大一次 ω \omega ω对应的电导值,而不关心实际电导变为了多少。后者因为没有验证权值更新的过程,所以相对来说需要更多的样本才能收敛,前者在修改单个权值时是do-while循环,时间不可控,而后者每次修改单个权值不需要循环,非常快。从总的时间上来说前者需要的时间更多,但考虑到功耗和训练结果等指标后,前者的性能更好。
  还有“Online learning”和“Batch learning”的概念的区分。人工神经网络通常采用Batch learing。Batch learning需要一次性输入一批数据,然后把每个权值的权重改变量累加。这样做使得每次权重调整更容易找到整体的梯度下降最快的方向,缺点是需要对一批数据进行存储。而Online learning则是每次输入一个样本就调整一次权重,与Batch learning相比不需要暂存权重改变量,但是它需要对权值调整很多次,而且不同的样本输入顺序可能会得到不同的学习结果。
  人工神经网络所采用的的器件的耐久是有限的,不管是浮栅晶体管的隧穿效应还是RRAM内的晶格碰撞,都会损害器件的寿命。所以人们一般希望对权重的改写次数少一些,所以采用Batch learning的策略较多。
  忆阻器件作为神经网络突触还会考虑到很多因素。multilevels和retention之间有一个trade-off。multilevels和神经网络的训练精度有关,因为一个特定的能态对应于一个突触的权值,在一定范围内能态越多,权值的精度越高。随着能态的增多,能态之间的间隔越来越小,容易发生隧穿,所以它的保持特性retention会比较差。还有器件的variation也是一个比较严重的问题,variation包括Part to Part(aka. PtP) variation和Device to Device(aka. DtD) variation。但就像大脑有代偿能力,神经网络里的一个突触如果出了问题,还有其它突触也能够进行补偿。

潜行通路

  1T1R用一个晶体管来选通RRAM,实际上一个晶体管的面积非常大,所以我们可以想办法把晶体管省去。但如果仅仅是把晶体管省去,就会引入潜行通路的问题。
  在存在晶体管的时候,晶体管起到选通的作用。利用晶体管的导通和关断可以同时对多个RRAM调整电导值。没有了晶体管之后就只能逐个对单个突触的电导值进行修改。相当于用一根字线和一根位线选中一个bit,而其余字线和位线都悬空。之所以悬空而不是接固定电平是出于功耗的考虑,这一悬空带来的问题就是潜行通路。

在这里插入图片描述

  如上图所示,我们希望 V i V_i Vi只通过蓝色的路线对 I j I_j Ij有贡献,但实际上由于 V i + 1 V_{i+1} Vi+1悬空, V i V_i Vi还会通过绿色的路线对 I j I_j Ij产生贡献,这就是潜行通路(sneak path)。

1S1R突触结构

  针对潜行通路的问题主要有两种办法,一种是用类似二极管的器件切断潜行通路,另一种是用差分对的结构进行补偿。这里先介绍第一种,就是1S1R的结构。
在这里插入图片描述
  1S1R中的S指的是选通管(Selector),它是一种类似二极管的器件,但相比于二极管,它的正向导通压降更低(几乎没有),它的传输特性曲线如上图所示。它的一个重要的特性就是它导通后,只要电压不低于Vhold就能维持在低阻态。
在这里插入图片描述

  选通管几乎不会占用多余的面积,它与RRAM的工艺兼容性更好。如上图所示,它能够直接切断潜行通路。

差分对突触结构

  第二种解决潜行通路的办法是引入差分对。
在这里插入图片描述

  用两个突触电导的差来代表权重。

G i j = G i j + − G i j − {G_{ij} } = G_{ij}^ + - G_{ij}^ - Gij=Gij+Gij

  对于电流 I j + I_j^+ Ij+,我们可以把它的组成分为三类,一类是 V i V_i Vi仅通过 G i j + G_{ij}^ + Gij+产生的电流;一类是 V i V_i Vi经过 I j − I_j^- Ij所在路径的潜行通路电流,注意这部分电流不只图中画的蓝色部分,类似蓝色部分的电流还有好多条,可以把这部分电流对应的电导记作 Δ G 1 \Delta G_1 ΔG1;最后一类是 V i V_i Vi通过其它的潜行通路产生的电流,记作 Δ G 2 \Delta G_2 ΔG2

I j + = V i G i j + + V i ( Δ G 1 + Δ G 2 ) I j − = V i G i j − + V i ( Δ G 1 ′ + Δ G 2 ) \begin{array}{l} I_j^ + = {V_i}G_{ij}^ + + {V_i}(\Delta {G_1} + \Delta {G_2})\\ I_j^ - = {V_i}G_{ij}^ - + {V_i}(\Delta G_1' + \Delta {G_2}) \end{array} Ij+=ViGij++Vi(ΔG1+ΔG2)Ij=ViGij+Vi(ΔG1+ΔG2)

  当输入向量维度比较大时,可以把 Δ G 1 \Delta G_1 ΔG1 Δ G 1 ′ \Delta G_1' ΔG1看做近似相等,那么:

I j + − I j − = V i ( G i j + − G i j − ) I_j^ + - I_j^ - = {V_i}(G_{ij}^ + - G_{ij}^ - ) Ij+Ij=Vi(Gij+Gij)

  这样就抵消了潜行通路的影响。论文[2]就是采用了这样的设计方法。
在这里插入图片描述

  文中作者实现了对“Z”、“V”、“R”三种模式的识别,每个字母都是一个3×3的样本。值得注意的技巧是,作者改写电导值用的“半电压”。写电压为 V w V_w Vw,在突触两端分别施加 V w / 2 V_w/2 Vw/2 − V w / 2 -V_w/2 Vw/2来达到改写电导值的目的,这么做有利于降低功耗。
  还有一个需要考虑的问题是,现在 G G G是由两个数相减得到的,当我需要增大 G G G时,是增大被减数还是减小减数?这个和器件的LTP、LTD有关。比如PCM的LTD反应出它的电导值不能连续减小,因此它不适合采用减小减数的方法。
  器件的电导值是有界的,比如我采用PCM作为突触,增大权重采用增大 G + G^+ G+的方法,减小权重采用增大 G − G^- G的方法,那么它们俩的电导值肯定在一段时间后会达到极限。因此需要每过一段时间将 G + − G − G^+-G^- G+G读出,然后将电导值都复位,重新将差值写入 G + G^+ G+ G − G^- G

反向传播

  反向传播的思想非常简单,利用梯度下降法令损失 L L L最小。
在这里插入图片描述

  上图是传统神经网络的最后一层,第k层。每有一组权值矩阵 W W W称为一层。权值矩阵 W W W的改变正比于当前 W W W在损失函数上的梯度。
Δ W k ∼ ∂ L ∂ W k \Delta {W^k} \sim { {\partial L} \over {\partial {W^k} } } ΔWkWkL
  为了简化推导,先约定一些记号:
x = [ x 1 k − 1 x 2 k − 1 x 3 k − 1 ]      W = [ ω 11 k ω 12 k ω 21 k ω 22 k ω 31 k ω 32 k ]      s = [ s 1 k s 2 k ]      y = [ y 1 y 2 ]      y t = [ y 1 t y 2 t ] x{\rm{ = } } {\begin{bmatrix} {x_1^{k - 1} }\\ {x_2^{k - 1} }\\ {x_3^{k - 1} } \end{bmatrix} }\;\;W = {\begin{bmatrix} {\omega_{11}^k}&{\omega_{12}^k}\\ {\omega_{21}^k}&{\omega_{22}^k}\\ {\omega_{31}^k}&{\omega_{32}^k} \end{bmatrix} }\;\;s = {\begin{bmatrix} {s_1^k}\\ {s_2^k} \end{bmatrix} }\;\;y = {\begin{bmatrix} { {y_1} }\\ { {y_2} } \end{bmatrix} }\;\;{y_t} = {\begin{bmatrix} {y_1^t}\\ {y_2^t} \end{bmatrix} } x=x1k1x2k1x3k1W=ω11kω21kω31kω12kω22kω32ks=[s1ks2k]y=[y1y2]yt=[y1ty2t]

  写出 L L L关于 W W W的全微分式:
d L = t r ( ( ∂ L ∂ W ) T d W ) dL = {\mathop{\rm tr}\nolimits} \left( { { {\left( { { {\partial L} \over {\partial W} } } \right)}^T}dW} \right) dL=tr((WL)TdW)
  这么直接求梯度没法求,需要分解步骤。
d L = ( ∂ L ∂ s ) T d s = ( ∂ L ∂ s ) T ( d W ) T x dL = {\left( { { {\partial L} \over {\partial s} } } \right)^T}ds = {\left( { { {\partial L} \over {\partial s} } } \right)^T}{\left( {dW} \right)^T}x dL=(sL)Tds=(sL)T(dW)Tx
  引入中间变量 s s s s s s是1×2的列向量。又因为 L L L是标量,所以可以直接对右边求迹。
d L = t r ( ( ∂ L ∂ s ) T ( d W ) T x ) = t r ( x T d W ( ∂ L ∂ s ) ) = t r ( ( ∂ L ∂ s ) x T d W ) dL = {\mathop{\rm tr}\nolimits} \left( { { {\left( { { {\partial L} \over {\partial s} } } \right)}^T}{ {\left( {dW} \right)}^T}x} \right) = {\mathop{\rm tr}\nolimits} \left( { {x^T}dW\left( { { {\partial L} \over {\partial s} } } \right)} \right) = {\mathop{\rm tr}\nolimits} \left( {\left( { { {\partial L} \over {\partial s} } } \right){x^T}dW} \right) dL=tr((sL)T(dW)Tx)=tr(xTdW(sL))=tr((sL)xTdW)
  对比前后两个全微分表达式可以得出:
∂ L ∂ W = ( ( ∂ L ∂ s ) x T ) T { {\partial L} \over {\partial W} } = {\left( {\left( { { {\partial L} \over {\partial s} } } \right){x^T} } \right)^T} WL=((sL)xT)T
  从上面这个梯度计算结果来看,梯度大小只和当前层的输入 x x x和损失函数对求和结果 s s s的偏导数 ∂ L / ∂ s \partial L/\partial s L/s有关。这不光是对最后一层成立,对其余层也都成立。
  每一层的输入 x x x都是已知的,关键是 ∂ L / ∂ s \partial L/\partial s L/s怎么求?定义第k层的损失误差 δ k = ∂ L / ∂ s k \delta^k=\partial L/\partial s^k δk=L/sk。我们从最后一层开始,最后一层是最容易求的。
δ k = ∂ L ∂ s k = ∂ L ∂ y ⊙ [ f k ′ ( s 1 k ) f k ′ ( s 2 k ) ] {\delta ^k} = \frac{ {\partial L} }{ {\partial {s^k} } } = \frac{ {\partial L} }{ {\partial y} } \odot {\begin{bmatrix} { {f^k}'\left( {s_1^k} \right)}\\ { {f^k}'(s_2^k)} \end{bmatrix} } δk=skL=yL[fk(s1k)fk(s2k)]
  计算k-1层的损失误差:

δ k − 1 = ∂ L ∂ s k − 1 = ∂ x k − 1 ∂ s k − 1 ∂ s k ∂ x k − 1 ∂ L ∂ s k = f k − 1 ′ ( s k − 1 ) ⊙ ( W δ k ) {\delta ^{k - 1} } = { {\partial L} \over {\partial {s^{k - 1} } } } = { {\partial {x^{k - 1} } } \over {\partial {s^{k - 1} } } }{ {\partial {s^k} } \over {\partial {x^{k - 1} } } }{ {\partial L} \over {\partial {s^k} } } = {f^{k - 1} }'\left( { {s^{k - 1} } } \right) \odot \left( {W{\delta ^k} } \right) δk1=sk1L=sk1xk1xk1skskL=fk1(sk1)(Wδk)

  这样就得到了一个关于 δ \delta δ的递推公式,这也是“反向传播”这一名称的由来。损失误差 δ \delta δ可以逐层从后向前计算。

Δ W m × n ∼ δ m × 1 x n × 1 T \Delta {W_{m \times n} } \sim {\delta _{m \times 1} }x_{n \times 1}^T ΔWm×nδm×1xn×1T

  利用器件实现反向传播的优势在于,可以利用RRAM阵列很快地计算出 Δ W \Delta W ΔW。因为 Δ W \Delta W ΔW是由一个列向量和一个行向量相乘得到的,可以把它们直接从行列方向送入阵列。
在这里插入图片描述

  光有这样的结构还不行,还需要对输入的数据进行编码。
在这里插入图片描述

  这里截取了论文[3]中的两张图,左边的是算法层面的, x x x δ \delta δ都是连续值。而右图是将 x x x δ \delta δ做了脉冲编码,这里举的例子是将 Δ W \Delta W ΔW量化为5个等级。两者都采用半电压输入,只有两者的脉冲同时有效时才能凑成一个完成的写电压。
在这里插入图片描述

  上图是脉冲 x x x δ \delta δ的脉冲编码方式。

脉冲神经网络

STDP

  Spike Timing Dependent Plasticity,是生物大脑内的一种学习规则。
在这里插入图片描述

   t p r e t_{pre} tpre是前一个神经元被激活的时刻, t p o s t t_{post} tpost是后一个神经元被激活的时刻,神经元之间突触权值的变化量与前后神经元激活时刻的时间差有关。概括起来说就是,时间越近响应越强。

漏电积分点火神经元模型

SpikeProp

ReSuMe

非监督学习

强化学习

卷积神经网络

稀疏编码

举报

相关推荐

0 条评论