计算神经科学、学习理论与分析学的千丝万缕的联系

计算神经科学、学习理论与分析学的千丝万缕的联系

_________________ 再谈毕业论文

在硕士学位论文中,我提出了一种可以称之为“改良神经网络”的模型 ----- 类额叶编码学习模型,相对于当前主流的深度学习模型:基于代价函数梯度下降的多层BP神经网络(Back Propagation Neural Network)在概念和一些任务的效果上取得了一些突破.一切在论文中已经详细讨论过的问题在这里就不再赘述,在这里主要是扩展性地讨论一些论文中未曾涉及过的要点.

本文的定位

首先,本文将回归论文主体,讨论论文的本质核心思想(Core Ideas)尤其是文章的立意与基本假设;之后,本文将分章节地分阶段地讨论一些与论文内容相关但不重复的内容.最后,总结性地进行适当的扩展.因此,本文的定位是在原论文上的一次“升华”.

论文的核心思想

论文的核心思想可以概括如下(自顶向下地):

  • 计算神经科学是分析学的一个特例:因此许多分析学的理论可以延拓至神经科学为基础的学习理论上.(注意:神经网络的许多理论却不能反过来变成分析学的通用理论,特殊到一般是不行的)
  • 智能过程可以被拆分为编码与认知:不严格地,可以将编码直观理解为“加工记忆”,将认知直观理解为“思考推断”.
  • 编码过程是寻找一个数值空间来“解构”客观事物,认知过程是在编码空间基础上寻找算子来“模拟”实体之间的抽象概念.

计算神经科学与分析学

神经元的运作特点

在这之前我想先谈一谈工科生耳熟能详的几个数学概念:函数、映射、泛函、算子,这几个名词是经常在各个教材中被提及的,但是他们的内涵大家清楚吗?

  • 映射:考虑两个非空的空间 A , B A,B ,其元素分别为 a 1 , a 2 , a 3 , . . . a1,a2,a3,... b 1 , b 2 , b 3 , . . . b1,b2,b3,... ,映射 M M 是这样一个规则: A A 的每一个元素 a a 对应一个 B B 的元素 b b ,这个映射运算符号表示为

    A B : b = M ( a ) A \rightarrow B:b=M(a)

一些有意义的特定的映射是:

  • 函数:表示为 y = f ( x ) y=f(x) ,把具有元素 x x 的标量空间 X X 映射到具有元素 y y 的标量空间 Y Y ;
  • 泛函:表示为 ρ = ϕ ( f ) \rho=\phi(f) ,把具有元素 f f 的函数空间映射到具有元素 ρ \rho 的标量空间 A A (函数集合到数集上的映射:定义域为函数,而值域为实数的"函数");
  • 算子:表示为 g = L ( f ) g=L(f) ,把一个函数空间映射到自己中,即 f , g f,g 是同一函数空间的元素(函数空间到函数空间上的映射 O : X X O:X \rightarrow X .广义上的算子可以推广到任何空间,如内积空间等);

明确了以上内容后,现在再来谈及神经元的运作特点,最后我们会来看看神经元的运作特点最像哪种映射.

神经元是人体神经系统的基本结构和功能单位,神经系统是无数个神经元相连而成,这是一个非常复杂的网络系统.神经元间联系方式是互相接触,而不是细胞质的互相沟通.接触部位的结构特化称为突触,通常是一个神经元的轴突与另一个神经元的树突或胞体借突触发生机能上的联系,神经冲动由一个神经元通过突触传递到另一个神经元.

生物课上学习到过的神经元结构,比较有意思的是如下两个组成部分:

  • 细胞核周边冒出来的分支称为“树突”,用于接收刺激信号;
  • 中间长长的丝称为“轴突”,其末端也有一些分支,和其他神经元的“树突”连在一起,作用是将信号传递给其他神经细胞;

接受其他神经元传来的神经冲动,然后再将冲动传递到另一神经元.中间神经元分布在脑和脊髓等中枢神经内.它是三类神经元中数量最多的.其排列方式很复杂,有辐散式、聚合式、链锁状、环状等.

同理,从人体神经系统的构成可以进一步创建更加复杂的人造神经系统,比如我们让多个人造神经元(感知机)相连接,便形成了人工智能里面声称的“神经网络”.至此,我们可以给神经元建立一个数学描述:神经元 f ( ) f(\cdot) 接受一个输入的生物电信号 z z 进而输出一个生物电信号 y y ,而输入的生物电信号 z z 来自多个其他神经元输出的加权即 z = i w i x i z=\sum_i w_ix_i ,也就是:

y = f ( i w i x i ) = f ( z ) y = f(\sum_i w_ix_i) = f(z)

其中 f ( ) f(\cdot) 的机制和 z z 的形成机制、乃至权重集合 w i w_i 的更新机制目前看来还具有很大的不确定性,因此各种神经网络的改进和创新都是基于这些部分的实际机制来讨论的.

因此,我们可以看出,单个神经元的运作特点至少是一个映射,功能上可能是函数或者泛函,但单个神经元的功能应该不能构成算子这么复杂的映射.至此,我们可以开始引入一些理论来模拟神经元及其集合的功能.

条件数学期望

首先,我们需要回答一个基本问题:在数学上应该如何理解(定义)什么是随机过程的“随机性”?人们总是希望通过(过去和现在)已知的信息或条件来预测“未来”.因此所谓”随机性”可以理解为“不可预测性”.那么,自然要问什么是“预测”?其实,这很简单,就是“条件数学期望”,也就是说当我们已知某个或某些随机变量时,另一个随机变量在此条件下的期望是多少或者分布是什么,也可以理解为在此条件下的“预测,预估”是多少.因此,我们首先要定义”条件数学期望”,并学会如何计算它.此处的这个概念与(初等)概率论,应用随机过程条件期望既有区别又有联系.而严格的定义要用到测度论的知识,在这门课程中对这一概念的引入又比测度论中的直观简单… …
_______________北京大学数学科学学院 刘勇

我很认同刘勇老师关于“条件数学期望”这个数学定义的解读:即“预测”,另一边,我们仍然需要回到神经元功能上来讨论“预测”这个目标是如何联系起“条件数学期望”和神经元系统的.

传统观点认为,大脑不断地接收新的感知信息,并在越来越复杂的信息中寻找规律,然后构建起大脑对环境的认知,这是一种以“由下对上”的控制为主的感知结构.而预测编码理论恰恰与此相反,是以“由上对下”的控制为主的:我们的大脑用已有的模型制造出丰富的感官数据,形成一个预测性的内在世界,去匹配即将发生的真实世界.

这就是Predictive Coding理论:预测编码理论的拥趸者,或许会在论文中以“实验结果表明,大脑在处理XXX信号上与贝叶斯优化推理相似”等诸如此类的描述作结论,这样的结论很容易让外行人断章取义为“大脑就是一个机器”.事实上,可以认为,依赖预测这个目的大脑神经系统可以收集误差来优化神经元的参数,而具体的机制是贝叶斯优化推理、随机梯度下降还是其他的机制尚未盖棺定论.但是至此,我们有一定的生物学说支撑来联系预测机制和分析学里的条件数学期望以构建类脑的学习模型.

定义(条件数学期望)设 { Y t , t I } \left\{Y_{t}, t \in I\right\} ( Ω , F , P ) (\Omega, \mathcal{F}, P) 上的一族随机变量, X X ( Ω , F , P ) (\Omega, \mathcal{F}, P) 上的随机变量,且 E X < E|X|<\infty ,称 ( Ω , σ ( Y t , t I ) , P ) ) \left(\Omega, \sigma\left(Y_{t}, t \in I\right), P\right) ) 上的随机变量 Z Z X X 关于 { Y t , t I } \left\{Y_{t}, t \in I\right\} 的条件数学期望,若 Z Z 满足:

  • E Z < E|Z|<\infty ;
  • 对于任意有界的 ( Ω , σ ( Y t , t I ) , P ) ) \left(\Omega, \sigma\left(Y_{t}, t \in I\right), P\right) ) 上的随机变量 F F ,下式成立:

E ( X F ) = E ( Z F ) E(X F)=E(Z F)

Z = E [ X Y t , t I ] Z=E\left[X | Y_{t}, t \in I\right] Z = E [ X σ ( Y t , t I ) ] Z=E\left[X | \sigma\left(Y_{t}, t \in I\right)\right] .

而条件数学期望的形式又是条件概率的积分,至此就解释了为何在本学位论文中要将神经元的输出定义为积分的形式(实际上,传统神经网络的加权激活 i w i x i \sum_i w_ix_i 可以视为离散数学期望).

神经编码:分而治之的思想

当我们在评价一个学生时,实质上是在评价其成绩、品行、体质的优劣程度,也就是我们是先拿出了一系列的“属性”标准来评判学生,而这些属性之间往往是独立不相干的(这非常重要).这种思想可以认为是“分而治之”的体现,事实上在各个学科对客观事物的认知中常常体现出这种思想.在数学和计算机科学中,我们就会发现这种思维的体现:

  • 在线性代数中,一个内积空间的正交基(orthogonal basis) < ξ 1 . . . ξ n > <\xi_1...\xi_n> 是元素两两正交的基.称基中的元素为基向量.假若,一个正交基的基向量的模长 ξ i |\xi_i| 都是单位长度1,则称这正交基为标准正交基或"规范正交基"(Orthonormal basis).
  • DAP模型:第一层是原始输入层,例如一张电子图片(可以用像素的方式进行描述);第二层是p维特征空间,每一维代表一个特征(例如是否有尾巴、是否有毛等等);第三层是输出层,输出模型对输出样本的类别判断.其实就是建立特征空间与语义空间之间的映射,可以用均方误差加范数约束训练:

min X t r W A t r 2 + η Ω ( W ) \min \|X_{t r} W-A_{t r}\|^{2}+\eta \Omega(W)

传统的计算机视觉分类系统可能难以将这两张图片分为一类,但是嵌入了语义解构模块的DAP模型可以较好地完成分类.
在论文中我们仅仅给出了神经编码方式的一种,在这里我们给出另一种:结合傅里叶变换的神经编码方式;

本学位论文使用的编码方式本来是 x ^ i = L U i ( l ) d l \hat{x}_{i}=\int_{L} U^{i}(l) d l 即沿 l l 的膜电压输出积分(期望),在这里我们给出另一种可行的方案:

x ^ ( w ) = R n e 2 π i w x U i ( x ) d x \hat{x}(w) = \int_{\mathbb{R}^n} e^{-2\pi i w \odot x}U^{i}(x) d x

这里我们直接舍弃了原来的沿 l l 积分的方案,至于解码,就需要用到论文中提及的 L p L^p 空间(几阶积分可积的讨论)定理,可以推得: L 1 L^1 空间上的傅里叶变换是不可逆映射,因此这给解码运算带来了不便…综上,我们的神经编码方式可以套用 L 2 L^2 的傅里叶变换:

f L 2 ( R n ) f ^ L 2 ( R n ) f \in L^2(\mathbb{R}^n) \Rightarrow \hat{f} \in L^2(\mathbb{R}^n)

傅里叶变换的一个核心思想即为:找到一个不相干的正交特征空间,和“分而治之”的思想又一次不谋而合.

认知功能与算子

端到端(end-to-end)模型回顾

相对于深度学习,传统机器学习的流程往往由多个独立的模块组成,比如在一个典型的自然语言处理(Natural Language Processing)问题中,包括分词、词性标注、句法分析、语义分析等多个独立步骤,每个步骤是一个独立的任务,其结果的好坏会影响到下一步骤,从而影响整个训练的结果,这是非端到端的.

而深度学习模型在训练过程中,从输入端(输入数据)到输出端会得到一个预测结果,与真实结果相比较会得到一个误差,这个误差会在模型中的每一层传递(反向传播),每一层的表示都会根据这个误差来做调整,直到模型收敛或达到预期的效果才结束,这是端到端的.

两者相比,端到端的学习省去了在每一个独立学习任务执行之前所做的数据标注,为样本做标注的代价是昂贵的、易出错的.

但是端到端模型蕴含的学习成果即为神经网络内部的训练好的权重矩阵 W W^* ,但是这样一个巨大的高维度矩阵是不可解释的,其迁移性和可重用性也很差,这是端到端(end-to-end)模型的一个固有缺陷.

什么是算子

一言以蔽之:函数空间到函数空间的映射,那么就是对于函数 f F f \in \mathcal{F} ,有一个映射 T T ,将其映射到函数 g F g \in \mathcal{F} 上:

T : f g T: f \mapsto g

算子有很多形式,比如把平面上的点旋转,连续傅立叶变换等等.在泛函数分析中通常把映照成为算子,而取值于实数域或者复数域的算子叫做泛函.本文的神经编码方式 x ^ = f ( x ) \hat{x}= f(x) 即可看作一个函数,那么不同神经编码之间的映射关系即可看作算子;由于神经编码可以看作对客观事物的记忆加工,因此对这些事物的认知即可类比为算子,这就是本文引入泛函分析理论的启发.

定义(有界线性算子)如果一个算子 T T ,满足:

α T x 1 + β T x 2 = T ( α x 1 + β x 2 ) \alpha T x_{1}+\beta T x_{2}= T\left(\alpha x_{1}+\beta x_{2}\right)

那么就称该算子为线性算子,进一步,若存在 M M 满足对于任何的 x x 都有:

T x y M x x \|T x\|_{y} \leq M\|x\|_{x}

T T 就是一个有界线性算子,注意到,不是 T x \|T x\| 有界,而是 T x y x x \frac{\|T x\|_{y}}{\|x\|_{x}} 有界.

有界线性算子这样的性质具备很好的应用价值,比如本学位论文中的“实体间的关系概念是可累加的”这样的设定就是依赖有界线性算子的定义.

大脑功能的再探讨

现代机器学习的三个特征:

  • 专注于优化成本函数;
  • 引入复杂的成本函数:这包括空间和时间上不平均的成本函数,以及网络内部产生的成本函数;
  • 机器学习结构本身的多元化:新发展的结构包括记忆单元,“胶囊”,外部记忆,指针和硬编码的算术指令等;

成本函数是一个特别宽泛的概念,为神经系统的活动找到成本函数似乎是一个理所应当的结果.对应这三个特征,本论文实际上并未引入什么不同寻常的成本函数,只是用了很传统的一个范数代价 L ( x , x ) = x x L\left(x, x^{\prime}\right)=\left\|x-x^{\prime}\right\| .但是在成本函数的优化和机器学习结构上下了功夫.

这里要再探讨一下“机器学习结构”这个点,本文的一大核心思想即:编码方式和认知功能是拆分的,编码是分离的(因此可以在编码实体间做算子映射,也可以采用各种编码方式:膜电压、傅里叶变换等等),认知功能是多元的(一个抽象概念对应一个转移算子,讨论“大小”属性时并不涉及“颜色”属性).这样的设计较端到端模型(end-to-end model)在可解释性上和复杂任务上的优势是明显的.

未完待续

目前该总结的已经说得足够多了,但是目前至少还有如下问题:

  • 计算神经科学为基础的连接主义足够了吗:毕加索的名画格尔尼卡(Guernica)中充满了抽象的牛头马面,痛苦嚎哭的人脸,扭曲破碎的肢体.我们可以毫不费力地辨认出这些夸张的几 何形体.其实,图中大量信息丢失,但是提供了足够的整体模式.由此可见,视觉高级中枢忽略色彩、纹理、光照等局部细节,侧重整体模式匹配和上下文关系,并可以主动补充大量缺失信息.人们倾向于认为大脑神经元网络依随学习和训练,其联结方式会得到优化,但这样的想法套用到深度学习上就足够了吗?本学位论文目前亦未能跳出这个疑点.
  • 符号主义应当被遗忘吗:人工智能中,符号主义的一个代表就是机器定理证明,其巅峰之作是吴文俊先生创立的吴文俊方法.目前机器定理证明的理论根基是希尔伯特定理:多元多项式环中的理想都是有限生成的.我们首先将一个几何命题的条件转换成代数多项式,同时把结论也转换成多项式,然后证明条件多项式生成的理想包含结论对应的多项式,即将定理证明转换为理想成员判定问题.和人类智慧相比,人工智能的符号主义方法依然处于相对幼稚的阶段.
  • 如何深入结合符号主义和连接主义:首先,就如同代数学是对分析学的抽象一样,符号学的数学内容也比神经网络的数学要复杂很多,也许足够深入的对代数学的学习才能触及智能方法的真正进步.

实现代码的numpy demo:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import numpy as np;


class Encode_Layer(object):
    """docstring for ClassName"""
    def __init__(self, encode_dim):
        super(ClassName, self).__init__();
        self.encode_dim = encode_dim;    
        self.en_weights = 0.0;
        self.de_weights = 0.0;
        self.input_dim = 0;
        self.code = 0.0;
        self.X_output = 0.0;
        self.X_input  = 0.0;
        self.delta    = 0.01;

    # 编码模块;
    def encode(self,X_input,weights=0.0):
        self.input_dim = len(X_input);
        if self.en_weights == 0.0:self.en_weights = np.random.rand(input_dim,encode_dim);
        #self.code = np.dot(np.fft.fft(X_input),self.weights);
        #return self.code;
        if weights==0.0:return np.dot(np.fft.fft(X_input),self.weights);
        return np.dot(np.fft.fft(X_input),weights);
    
    # 解码模块;
    def decode(self,code,weights=0.0):
        if self.de_weights == 0.0:self.de_weights = np.random.rand(encode_dim,input_dim);
        #self.X_output = np.fft.ifft(np.dot(self.code,self.weights));
        #return self.X_output;
        if weights==0.0:return np.fft.ifft(np.dot(code,self.weights));
        return np.fft.ifft(np.dot(code,weights));
    
    # 计算误差模块;
    def error(self,W,weights_class,X_input):
        if weights_class=='encode':
            X_output = self.decode(self.encode(X_input,W));
            return np.linalg.norm(X_input - X_output);
        if weights_class=='decode':    
            X_output = self.decode(self.encode(X_input),W);
            return np.linalg.norm(X_input - X_output);
    
    # 求梯度模块;
    def grad(self,weights_class,i,j,X_input):
        if weights_class == 'encode':
            weights = self.en_weights[i][j];
            weights[i][j] = weights[i][j] + self.delta;
            return error(weights,weights_class,X_input)/self.delta;
        if weights_class == 'decode':
            weights = self.en_weights[i][j];
            weights[i][j] = weights[i][j] + self.delta;
            return error(weights,weights_class,X_input)/self.delta;

    
    # 更新参数模块;
    def update(self,X_input):
        for i in range(len(self.en_weights)):
            for j in range(len(self.en_weights[i])):
                self.en_weights[i][j] = self.en_weights[i][j] - self.nita * grad('encode',i,j,X_input);
        for i in range(len(self.de_weights)):
            for j in range(len(self.de_weights[i])):
                self.de_weights[i][j] = self.de_weights[i][j] - self.nita * grad('decode',i,j,X_input);

发布了142 篇原创文章 · 获赞 71 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/hanss2/article/details/93485491
今日推荐