TNNA

less than 1 minute read

Published:

TNNA(基于张量图结构的元胞自动机)

简介

通过图结构与元胞自动机机制,构建具有自适应及自调整型的神经网络结构。

以元胞作为基本框架(通常以核函数(可用户指定)函数作为运算方式),通过拓扑链接(通常以传递函数(比如,加权函数)作为运算行署)形成元胞邻域,进而构建出混合型张量流传递图结构(包括树状结构与环状结构),最终可以实现功能型网络结构及状态机型网络结构,而具有:

    数据->信息->识别->判断->信息->控制 的功能。

一般情况下,我们将核函数定义为数据流在一个元胞结构中将传入度数据转换为传出度数据的过程,而核函数的传入参数$argin^i_{in}$与传出参数$argin^j_{out}$(即多值多映射)是这个元胞结构中传入度数据与传出度数据;传递函数一般是单参单值函数,主要进行缩放平移、激活或转换,接受数据流上一个元胞的某个传出度的值,转换为数据流下一个元胞的某个传入度的值。cell是纯粹的元胞过程,元胞生成及邻域联系构成了整个数据流的图结构,由此核函数及传递函数构成的了一个图结构上的数据流动态演化过程。

与此同时,每个元胞可能是数据输入端口,也可能是数据输出端口。

结构

数据结构

传递结构

一般为具有偏差性的线性变换函数,也可以作为pool或是延展运算来改变数据接口形状.

应变结构

应该变结构一般是具有激活函数(非线性函数)的多参函数,但是在网拓扑结构变化时,数据接口形状,数据数目或是数据类型发生改变,都需要多参函数的调节与一一对应.

设计

通过多线程控制各个不同的神经元/节点,然后通过其与上下节点的关联来实现信息的传递过程。具体各单元设计如下。

template <typename Scale, typename Flow, typename Data>
class graph{
public:
    friend class cell<Scale, Flow, Data>;
    typedef std::map<size_t, size_t> slice;
    typedef cell<Scale, Flow, Data> Node;
    typedef std::shared_ptr<iostream<Flow>> IOStream;
    typedef std::shared_ptr<transmit<Scale, Flow>> Transmit;
    typedef std::shared_ptr<active<Scale, Flow>> Active;
    typedef std::shared_ptr<value<Data>> Value;
    typedef std::vector<std::tuple<Value, Active>> Nodes;
    typedef std::vector<std::tuple<size_t, size_t, Transmit>> Links;
    typedef std::vector<std::tuple<cellStreamType, size_t, IOStream>> LabelIOStream;
    typedef std::shared_ptr<graph<Scale, Flow, Data>> GRAPH;

private:
    size_t _nbat;
    std::vector<typename Node::Node> _nodes;
    std::map<Node *, IOStream> _istrs, _ostrs;
    std::chrono::milliseconds _msleep;
};
template <typename Scale, typename Flow, typename Data>
class cell{
  template <typename Scales, typename Flows, typename Datas>
  friend class graph;
  typedef std::map<size_t, size_t> slice;
  typedef std::valarray<size_t> idxs;
  typedef std::shared_ptr<iostream<Flow>> IOStream;
  typedef std::shared_ptr<transmit<Scale, Flow>> Transmit;
  typedef std::shared_ptr<active<Scale, Flow>> Active;
  typedef std::shared_ptr<value<Data>> Value;
  typedef graph<Scale, Flow, Data> Root;
  typedef cell<Scale, Flow, Data> Self;
  typedef std::shared_ptr<Self> Node;
  size_t _id;
  const Root *_root;
  Active _active;
  Value _value;
  std::map<Self *, Transmit> _istr, _ostr;
  mutable std::tuple<cellStatus, std::thread, std::timed_mutex> _living;
  std::chrono::milliseconds _msleep;
};