CMAC小脑模型神经网络与Python实现

CMAC 小脑模型神经网络

简述

CMAC是cerebellar model articulation controller,一种模拟小脑的模型。小脑对肢体动作的操作是近似“反射”的,CMAC的理念就是让训练后的网络在应用时对输入的计算越快越好。很容易想到,最快的方法自然是把所有可能的输入情况和它们对应的输出存在表里,在使用时直接查表。而且为了更快的速度,即使是平衡搜索树也不够,哈希散列技术是一种更有效的技术,只需要预留足够的内存空间,并设计优秀的散列函数就能只花费散列函数计算的时间就查询到结果。

模型搭建

在这里插入图片描述
如上图所示,首先对输入的模拟信号进行量化分级,分级的数目根据自己设置的采样率而定。每个级别的量化信号会激活一个区间内的感知器,被激活的感知器把自带的权值做加和成为输出。
其中为了减少感知机的数目,一般使用随机的哈希映射,把量化激活的感知机虚地址映射到实地址。这一点可以有效节约感知器数目,在硬件实现时至关重要。

训练步骤

  1. 输入向量的维度有可能很高,因此先把向量做量化是必不可少的。用一定的分辨率采样模拟信号,得到离散的向量。
  2. 做合适的感知机激活,为了泛化性能,相似的感知机将被同时激活。体现在模型中就是设置邻域,把输入向量及其附近的感知机都激活。这个激活使用的是一个滚动激活方式,因为多维情形下,每一维的变量都对应一个激活区间。为了理解这一点我们不妨举个例子。
    在二维输入的情形下,两个维度激活的感知机编号分别为1234、2345、3456和abcd、bcde、cdef。
    使用简单的1234、2345、3456的顺序的话,第一个维度的1234和第二个维度的abcd、bcde、cdef结合产生的地址将是
    1a2b3c4d、1b2c3d4e、1c2d3e4f
    而如果我们考虑使用滚动编码的顺序,即1234、5234、5634和abcd、ebcd、efcd。则结合的地址将是
    1a2b3c4d、1e2b3c4d、1e2f3c4d
    可以看出,比起前者,后者让相邻的感知机地址更为接近(相邻的地址只有一位是不同的)。
  3. 把第二步中可供选择的感知机都存储下来是不明智的,因为分辨率不能设置的很低,而维度有可能很高,如果为每种情况预留空间,需要的内存将是指数增长的。考虑到维度间的相关性,很多向量情况完全不可能,或者很小概率出现。为此,我们可以考虑把所有地址散列到一个实地址空间内。
  4. 输出。网络的最终输出是简单的,使用被激活的几个神经元的权值做叠加。
  5. 学习。使用类似前馈网络的学习方法,因为每次激活的神经元数目很少,所以在反馈传播误差时,也只需要做很少的,简单的加减法即可。

综上,CMAC实际上是一种智能查表技术。使用简单的局部性原理,用多个超平面拟合输出超曲面。虽然CMAC做不到RBF和BPN的完全非线性逼近,但CMAC胜在前馈计算速度快,适合智能应用中需要即时反射的场景,而且网络模型更简单,参数更少,计算速度更快。

CMAC实践

CMAC最早的出现是为了解决一个机器人手臂协调的问题,机器人的传感器会返回速度、角度和加速度等信号,它们和力矩满足一个方程,而想从这些信号中计算出应该施加的力矩需要求解反函数,但这个反函数是未知的。为了学习这个反函数,并能满足机器人需要的快速反射,就设计了这种查表型的算法。
在这里插入图片描述
这里我们也用CMAC来学习一个二维输入一维输出的函数,y = sin(x1)cos(x2), 验证本算法的性能。

import numpy as np
import random
import matplotlib.pyplot as plt

def prime(x):
    top = int(x**0.5)+1
    for i in range(2,top):
        if x%i==0:
            return False
    return True

def getprime(x):
    for i in range(x,x**2):
        if prime(i):
            return i
    return False

k = getprime(random.randint(0,1000))
b = getprime(random.randint(0,1000))

def hashing
  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值