脉冲神经网络(SNN)会是下一代神经网络吗? 知识梳理和源码解析,David 9的SNN初体验,Spiking Neural Network

Neurons that fire together wire together — Donald O. Hebb

小时候你们应该听大人说过:“脑子不用会生锈”,教导我们要多思考多练习。后来我们真的发现需要肌肉记忆的运动如篮球、高尔夫,所谓的“球感”,正应验了赫布理论那句老话:“Neurons that fire together wire together”。我们的那些神经元似乎越是频繁地连接,越是有“存在感”。甚至在训练足够多的次数后,神经元的连接如此强烈,以至于产生了条件反射。

另一方面我们的神经元可以训练并适应不同的任务,其可塑性惊人。当今所谓的神经网络不过皮毛。

今天聊的脉冲神经网络(SNN),只是弥补了神经网络中的一处不足。我们在之前的post提到过Hinton老爷子对未来神经网络的展望,其中一个重点就是目前神经网络的时间线(尺度)太少了

开始之前,先简单回顾一下神经网络的发展。

感知机(perceptron),是神经元间的直连感知

来自:https://www.youtube.com/watch?v=3JQ3hYko51Y

其中白色较亮的点是被激活(更兴奋)的神经元。

对于多层感知机,只是层数变多了,依旧是直连加反向传播

来自:https://www.youtube.com/watch?v=3JQ3hYko51Y

轮到现在流行的CNN, 只是比感知机多了卷积层:

来自:https://www.youtube.com/watch?v=3JQ3hYko51Y

到目前为止可以发现,所有连接权重的更新速度是一样的。即所有神经元的连接,在某个时间点的兴奋度低,但在下一个时间点的兴奋度可能很高!(因为反向传播才不管这么多),细想,不符合那句老话:“Neurons that fire together wire together”。此刻兴奋的神经元在下一时刻应该惯性地也比较兴奋才对继续阅读脉冲神经网络(SNN)会是下一代神经网络吗? 知识梳理和源码解析,David 9的SNN初体验,Spiking Neural Network

CVPR2019观察: 谷歌大脑的”自动数据增强”方法及其前景,David9划重点

如果你要帮助别人学习,你应该让他多犯错,还是让他少出错?— David 9

试想这样一个未来,所有的AI模型构建的范式都分为两部分:1. 从自然界自动收集所有有利于构建模型的信息数据,2. 自动构建一个端到端模型,处理某一任务。

如果上述两个智能体足够智能不断进化达到一个较高的智能水平,那么我们今天提到的自动数据增强(AutoAugment)也许是原始雏形。

虽然David认为模型本身就应该含有大量的信息不应该是外部“强加”给模型大量信息(人类的基因不正是这样?)。同时Google利用大量的机器、实验和工作发的这篇论文普通AI从业者想复制比较困难,但有几点有意思的地方David想指出一下,

1. 虽然自动数据增强的训练模型较难重现,但是google已经公布用于检测的自动数据增强方法,其代码我们可以直接拿来用:https://github.com/tensorflow/tpu/blob/master/models/official/detection/utils/autoaugment_utils.py

并且提供了不只一种增强数据策略,如下只是其中一种策略:

def policy_v1():
  """Autoaugment policy that was used in AutoAugment Detection Paper."""
  # Each tuple is an augmentation operation of the form
  # (operation, probability, magnitude). Each element in policy is a
  # sub-policy that will be applied sequentially on the image.
  policy = [
      [('TranslateX_BBox', 0.6, 4), ('Equalize', 0.8, 10)],
      [('TranslateY_Only_BBoxes', 0.2, 2), ('Cutout', 0.8, 8)],
      [('Sharpness', 0.0, 8), ('ShearX_BBox', 0.4, 0)],
      [('ShearY_BBox', 1.0, 2), ('TranslateY_Only_BBoxes', 0.6, 6)],
      [('Rotate_BBox', 0.6, 10), ('Color', 1.0, 6)],
      [('Color', 0.0, 0), ('ShearX_Only_BBoxes', 0.8, 4)],
      [('ShearY_Only_BBoxes', 0.8, 2), ('Flip_Only_BBoxes', 0.0, 10)],
      [('Equalize', 0.6, 10), ('TranslateX_BBox', 0.2, 2)],
      [('Color', 1.0, 10), ('TranslateY_Only_BBoxes', 0.4, 6)],
      [('Rotate_BBox', 0.8, 10), ('Contrast', 0.0, 10)],
      [('Cutout', 0.2, 2), ('Brightness', 0.8, 10)],
      [('Color', 1.0, 6), ('Equalize', 1.0, 2)],
      [('Cutout_Only_BBoxes', 0.4, 6), ('TranslateY_Only_BBoxes', 0.8, 2)],
      [('Color', 0.2, 8), ('Rotate_BBox', 0.8, 10)],
      [('Sharpness', 0.4, 4), ('TranslateY_Only_BBoxes', 0.0, 4)],
      [('Sharpness', 1.0, 4), ('SolarizeAdd', 0.4, 4)],
      [('Rotate_BBox', 1.0, 8), ('Sharpness', 0.2, 8)],
      [('ShearY_BBox', 0.6, 10), ('Equalize_Only_BBoxes', 0.6, 8)],
      [('ShearX_BBox', 0.2, 6), ('TranslateY_Only_BBoxes', 0.2, 10)],
      [('SolarizeAdd', 0.6, 8), ('Brightness', 0.8, 10)],
  ]
  return policy

2.  强化学习和GAN哪个更好? 继续阅读CVPR2019观察: 谷歌大脑的”自动数据增强”方法及其前景,David9划重点

看图闪电入门Numpy,Numpy数据结构,David9的np.array日常

Numpy无疑是入门数据科学或深度学习几乎必学的工具,感谢网友和David一起翻译改编了这篇blog帮助大家对numpy闪电入门和整理:

使用numpy包的时候一般是从下面这句代码开始的:

import numpy as np

####创建数组
使用np.array()函数,这个函数的参数可以是列表,来创建一个nunpy数组

还可以通过其他的方式创建数组,并初始化。比如说ones(), zeros(), random.random()

一旦我们创建了数组,我们就可以对它们进行操作了。

####数组操作
首先创建两个数组,并将它们分别命名为data, ones:

将两个数组相加,它这个操作会对对应位置的数组元素进行相加并赋值到新的数组:
不仅仅可以进行加法操作,还可以进行其他的运算:我们还可以进行数组和标量之间的运算,这种形式叫做广播

如果要快速合并两个数组(或矩阵),vstackhstack是很好的工具,

vstack是以”行”的方式合并,hstack是以”列”的方式合并

还可以同时合并多个array或矩阵: 继续阅读看图闪电入门Numpy,Numpy数据结构,David9的np.array日常