计算机视觉的深度学习和神经网络算法,模拟大脑的架构,从而能够最后解释真实大脑的工作机制,即神经认知。将复杂的难以理解的数据整理抽象为我们可以理解的信息,如视觉的图像视频信息需要整理。而神经网络的框架,能够解决识别问题
信息的存储格式,像素。以矩阵的格式来存储。我们接下来需要处理指数级爆炸的视觉信息。因此我们需要理解,就需要不断抽象,如标记/分类/索引等等,这实际上也是我们理解这些信息的机制。我们就是通过不断的升维来实现各种复杂的功能。
以进化的观点来理解感觉的形成和进化。视觉的出现可能就是寒武纪生物大爆炸出现的一个原因,因为生物能够提取关于世界更多的信息,从而能够解释多样性的形成。以最简单的眼睛的出现为起点,由于生存的压力,基因的漂移,使得大多数生物都拥有这种新奇的结构。并且在这个基础上展开军备竞赛般的进化,在这个基础上打补丁式地修修补补,一直进化到现在生物的各种眼睛。比如说视觉皮层与眼睛有相当的距离。
基础视觉皮层(后脑勺primaryvisualcortex)能够处理大量的视觉信息,是视觉处理流程的第一步。图片的内容没有激活神经元,而更换图片的动作能够引起注意(hubel,wiesel等等),因为皮层对这种边缘效应敏感,不同的神经元组合对不同的组合敏感,即我们的神经元只是对特征敏感。因此第一步是对特征的提取如形状,边缘,排列等等。其能够引起特定组织结构的神经元激活,通过这些特征的组合,我们能够理解更加高维的结果,如从图片识别出人脸(边缘决定结构,如同牛顿-莱布尼茨公式,从底层升维到高维。然后就是线性代数的思路:世界可以分解为线性无关的基底,然后其他的事物都是其选择性组合;这是从顶到底的思路)。因此深度学习就是利用多层神经网络构建的复杂映射来识别复杂的输入。
然后视觉应该是分层的,第一层是边缘层次……最后能够升维到足够高维的空间,从而适用于各种情况。这启发我们的学习过程就是构建新的层次,如同神经网络的隐藏层(特征features学习),这是建模的思路。
视图分割和分组(如人脸识别)是理解图片的第一步,识别是更加高维的层次,如可以通过识别特征来推断整体,如看到老虎的花纹就可以推断老虎的出现。这种模式的学习能够指导更多低维情境下的识别。
物体识别需要同一套评价体系来比较不同算法的性能优劣。如PASCAL。接下来就是李飞飞的imagenet数据集。运行训练卷积神经网络算法CNN,本质上就是提出一个函数,能够以一定的准确率来进行良好的分类,然后通过参数的调整来构造出来(如同级数展开,对特征的线性组合,层数越多越精确)。这需要大规模数据的训练和GPU等等硬件的发展。
图像分类,物体检测,即在分类的基础上进一步地理解图片,如以人类能够理解的语言来描述。而更深层次的理解,需要结合我们已有的理解进行选择性组合。当然,需要与人类这个超有机体的思想进行比较,因为个体总是有一定的局限性。我们认为所谓的分类就是找到一定的高维模式,从而能够理解不同低维情况下的同一物体,如各种情况的猫(睡觉,玩耍,撒娇等等),我们相信存在这样的特征,本质上是一种函数的存在性证明。
卷积神经网络:高效能的硬件运行计算更大的模型(GPU),大量的数据。使得能够在LeCun网络的基础上有更进一步的发展如Alexnet,VGG等等。
神经网络算法构建过程:1建立工程,导入工具包(sklearn等等);2导入数据集的数据,转换为一定的数据结构(如图片的n*n数组转换为一维数组);3进行神经网络算法的参数设置如隐藏层数,学习率,单层神经元个数等等4进行评价,准确率和召回率等等指标来评判算法性能;
神经网络算法本质上是在构造一个能够完成我们理想中目标的函数,我们假设其存在,然后通过我们需要的各种性质来定义这个函数,隐藏层可以理解为级数展开,具体的神经元的权重可以理解为具体的级数/特征的参数。F=∑wixi(wi是具体的参数即权重,xi是特征)。理论上,我们可以通过足够多的对象的组合来逼近理论上存在的函数,但这就需要耗费太多的计算资源,而提升的精确度有限。以线性代数的思想就是构造各种复杂的映射。
神经网络的反向传播算法,链式法则的应用,首先构造出复杂的多变量的函数,然后通过细化的求导来确定简单的关系,即梯度。而我们构造的函数,最后就是这些梯度收敛的结果。
Sigmoid函数:1/(1+e^-x)
2017/8/9
神经网络算法可以适用于不同领域的问题,说明其可能是某种底层的运算机制。是一种通用体系,如同图灵机,能够通过大规模数据的输入产生一定的输出,这些输出就对应于我们的要求如图像分类等等。神经网络算法的大量参数,其实对应于函数的拟合,我们相信存在特定的参数能够具有生物学意义(能量最低化)。更大的参数的学习可以识别更加高级的特征,这和微积分基本定理是一致的。如从边缘/颜色等等底层的特征不断升维到复杂对象的识别如人脸识别。参数的确定就是最优化的思路,如同能量最低化,收敛到最稳定的结果。或者可以理解为泰勒级数的展开,参数的确定就是对级数前面的系数的确定,只要通过调参使得与这个函数的足够逼近,可以视为达到最优(梯度下降法)。而这个级数的各个项,其实就是特征工程的特征。
我们训练模型其实就是构造出特定的函数,能够满足特定的输入和输出的对应关系
参数的训练是大规模的矩阵运算。一个重要问题就是由于幂律分布,有意义的数据是少数,即呈现稀疏矩阵的形式,因此需要压缩,降维等等操作才能充分利用计算资源。如同搜索需要我们采取一定的优化的措施,如深度/广度优先搜索,还有各种条件的剪枝处理等等,能够大大减少搜索空间的范围。而更少的参数,需要如同PCA主成分分析,需要找到相关性更大的参数/特征来进行线性组合
迁移学习可能运行我们使用经过训练的模型的参数,运用到不同领域,使得我们在新场景的使用不需要训练这么大规模的参数,从而减少计算量。底层的机制可能就是大量的特征是通用的,其已经构造出一定的有意义的函数。
团队合作可能也对应于一定的运算机制,能够实现更宏伟的目标。
Distbelief到tensorflow,开放的机器学习系统,更多人的协作系统,共享和大量基础架构的搭建,使得人们更加注重想法的提出而不是实现(跨平台,跨设备)。
输出也可以作为下一步的输入,如同反馈体系,能够呈现螺旋式的上升的过程,能够识别更高维度的特征。本质上这是学习。
数据驱动的图像分类方式:线性分类器(非显性编程)
需要考虑特定的指标的定义,如距离有欧式距离,曼哈顿距离等等,于是有KNN算法,进行聚类分析:1随机生成n个中心2计算距离并分类3更新中心4继续计算距离直至收敛,生成n个分类
基于模型/统计编程,构造出函数f(x,W,b)=Wx+b..W是权重,x是具体的对象,我们能够通过其加和来构造出级数∑wixi,从而逼近特定的函数,从而能够在图像的像素矩阵(视为高维的对象)和特定的名词/分类构建一定的联系。可以理解为在图像构建的高维空间构造一定的分类曲线。只要维度足够高,就可以如同微积分基本定理一样实现高维的划分。
损失函数和最优化
构造出一定的损失函数和目标函数,能够定量测定当前分类器的好坏,从而能够进一步地改进。在规划中,约束条件是必要的,损失函数高说明这是很差的分类,需要进一步调整参数。
Softmax函数作为分类器,其分数一方面可以作为各种分类准确性的度量,同时也可以理解为特定分类的概率,可能可以使用贝叶斯推断来进一步运算。
梯度下降法,求导df(x)/dx=lim[f(x+h)-f(x)]/h.近似法,斜率可以往更小的方向移动,直至极值,找到使损失函数最小的点。
具体的对象可以分解为一系列特征的权重加和,这是线性代数的思想,线性无关的基底的选择性组合对应于具体的向量/对象,即我们收集的数据。具体的特征可以通过统计来构造。
神经网络训练:定义添加神经层的函数:1训练的数据2定义节点接收数据3定义神经层即隐藏层和预测层4定义损失函数4选择优化方法使得损失最少
链式法则,反向传播,中间变量对损失函数的影响。每一次更新参数,都需要经过前馈和后馈。
超参数的选择:隐藏层的数目,单个隐藏层的神经元数目,学习率,步长,随机失活dropout的概率等等,
多隐藏层就对应于这些中间函数,对应于最后的特征。
Dropout技术,将一些权重较低的神经元按照一定概率进行消除,即瘦身,这种随机失活能够减少神经网络的规模和计算量,而且也更难过拟合。
思考一个发育式的机器学习算法,新的数据输入能够如同生物发育使得内在的一套编码机制能够根据具体的环境/数据表达,如同创生生命一样创生智能,如群体智能。
卷积神经网络
视觉皮层的感知机制,层级式的架构,矩阵叠加,深度学习就是多层网络的叠加。;卷积操作可以理解为一定的数据压缩,可以把更大信息量的数据进行运算。迁移学习可能就是利用封装好的参数层,能够对应于大脑的一些固定的架构(生物的进化是打补丁式的更新),从而能够大大减少新物体的训练所需要的计算量。
滤波器filter(具体的大小也是一种参数如5*5*3),进行卷积运算即点乘dot。池化层,找到更加重要的信息(一种采样)。需要经过激励函数如ReLU函数的运算(神经元的运算∑wixi),这些层次彼此交叉,最后形成一定的特征。最后的全连接层可以构建最后分类的映射。
在分类的基础上继续追求,即物品分割,以方框的形式来包围特定分类的物体。这是更加细化的计算,因为具体的分割可以是更加无限可能的,预测可以理解为搜索,可能的搜索空间将十分大,所以还是需要神经网络算法来构建出这种联系即定位。找到具有更大可能的区域进行划分,即通过特制的匹配。(regionproposal)
R-CNN算法,首先构造出一定数目的方框如2000个,然后在其中找到具有更大可能性的一些方框,然后进行神经网络CNN的分类,更新结果并返回,直至收敛。在一定程度上可以视为神经网络再叠加一个神经网络,所谓的深度学习就是利用更深的神经网络来实现更加复杂的功能。.
卷积神经网络的可视化与进一步理解
中间的隐藏层对应于一定的特征的识别,能够通过训练找到对应于特定图像激活的神经元(偏向性),这些神经元的权重就对应于一定基底的选择性组合。但这些隐藏层只有特定的层次才有可视化的意义,如同我们的病理切片能够接受人体的一些病变,但只有特定的区域才更具特征性。这些层次就是数学的不动点。
通过统计来提取特征,能够发现我们不知道的知识,这些特征的组合,可能就升维到我们能够理解的层次如人脸识别。我们可以继续升维,可以通过机器学习到我们不能理解的更高维度的特征。特征对应于一定的神经元激活模式,如同人类的刻板印象的形成,智子疑邻等等。这种特征,如同图片的风格,是可以迁移的
循环神经网络RNN:
以马尔科夫模型来理解,这是一个状态之间的转移,可以通过统计构造出转移概率矩阵,从而能够形成一定的序列。生物信息学使用马尔科夫模型来理解编码区和非编码区,也是通过计算这个概率。
文本处理:如numpy读入文本数据,构建字典,建立索引和字母之间的映射,然后组织形成一定的数据集。经过RNN训练,可以生产各种有意义的文本,如诗歌,论文,代码。通过学习各种特征,学习到底层的机制,能够生成一定的复杂映射,能够和人类的一些状态具有一定的相似性,我们需要将这些特征值的模块抽象出来,形成各种有意义的单元。
实现技巧:
充分利用数据(数据增强如横向翻转等等,应用于数据不足的情况;和迁移学习可以减少新模型的训练的计算量,可以提取训练好的网络的某些层来作为特征筛选器,这些特征可以应用于不同领域,一般情况都不是从头开始训练,而是在这些训练好的模型进行微调。dropout层避免过拟合)、
如何进行卷积并且快速计算,即忽略大规模矩阵运算的中间步骤,如strassen算法
实现的细节,如GPU/CPU计算,计算的瓶颈,分布式训练
训练CNN的大概流程:1加载图像和标签2通过CNN训练3通过CNN的输出和标签来计算损失函数的值4回传梯度更新CNN的各个参数
深度学习开源库
Caffe:Blob类存储数据,Layer转换blob的数据,Net多隐藏层,计算梯度,Solver使用梯度更新权重。不需要编程,prototxt存储各种参数
1转换数据2定义网络3定义solver4训练。推荐使用:特征提取,对已有模型的微调
Torch:tensor。推荐使用:与预训练模型的运用,编写自己的Layer
Theano、;计算梯度。推荐使用:训练CNN
Tensorflow:google开源框架。推荐使用:大模型的训练
图像分割与注意力模型
特征提取,并进行采样,组合结果制定一定的边界
视频检测与无监督学习
主成分分析PCA,通过聚类分析来找到隐藏的模式。神经网络提取的特征,就是统计得出的基底。
自动编码器:用数据区学习特征,数据经过编码形成特征,再解码形成输出。
贝叶斯推断。最大似然法。