仅仅是自己向大佬们学习过程中,知识的一个记录和积累,后续有新的认识会及时更新。
1 认识机器学习与深度学习
1.1 学习
介绍机器学习与深度学习之前,让我们先了解下什么是学习,即:系统通过执行某个过程,就此改进了它的性能,那么这个过程就是学习。
1.2 机器学习
- 机器学习
该方法以统计语言模型为基础,利用数据及某种特定的方法,如统计方法或推理方法等来学习数据中的有价值的知识,以提升系统的性能。 - 机器学习意义:从数据中抽取规律,并预测未来。
- 机器学习缺点: 机器学习主要利用数据特征进行分类,然而这些特征过于依赖人工完成,并且需要大量领域专业知识,耗时耗力。
1.3 深度学习
为解决上述机器学习问题,有学者开始利用神经网络通过训练自动捕获数据特征,取得了不错的效果(特征表示学习)。随着神经网络进一步加深,出现了多层次的“表示学习”,它把学习的性能提升到另一个高度。这种学习的层次多了,其实也就是套路深了。于是,人们就给它取了一个特别的名称—Deep Learning(深度学习)。
- 深度学习:深度学习就是一种包括多个隐含层(越多即为越深)的多层感知机。它通过组合低层特征,形成更为抽象的高层表示,用以描述被识别对象的高级属性类别或特征。能自生成数据的中间表示(虽然这个表示并不能被人类理解)。
- 深度学习缺点:
根据“麻烦守恒定律“可知“麻烦不会减少,只会转移”。因此深度学习也存在一定的缺点:即深度学习的不可解释性,因为机器学习的特征,对人而言,相当于黑盒,人们无法去解释,只能根据经验,通过调参来提高深度学习模型的性能。 - 深度学习是否可靠?
那么问题就来了,既然深度学习中间过程相当于黑盒,具有不可解释性,那么深度学习是否可靠呢?
深度学习通过自动完成逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,从而使分类或预测更加准确,与原来的人工提取特征的方法相比,深度学习利用了大数据来自动获得事物特征,让“数据自己说话”,因此,更能够刻画数据丰富的内在信息。一般来说,层数更多的网络,通常具有更强的抽象能力(即数据表征能力),也就能够产生更好的分类识别的结果。但也不是层次越多越好,毕竟“物极必反”,经过学者们的不断实验表明,这种极深的架构叠加,带来的通信开销会淹没性能的提升,因此深度”仅仅是手段,“表示学习”才是目的。
1.4 机器学习与深度学习之间的联系与区别
- 联系:深度学习是实现机器学习算法的技术。
- 区别:个人觉得他们之间的区别主要是他们提取特征方式的不同,另外从模式分类角度来看,机器学习主要分为特征提取和分类预测两个独立的步骤。深度学习采用“端到端(end-to-end)”学习方式,即特征提取和分类任务合二为一(黑盒),输入的是原始数据(始端),输出的直接就是最终目标(末端),中间过程不可知。
2 通过现象看本质
2.1机器学习
根据台湾大学李宏毅博士的通俗说法:
所谓机器学习,在形式上可近似等同于,在数据对象中通过统计或推理的方法,寻找一个有关特定输入和预期输出的功能函数。
比如:输入变量(特征)空间记作大写的X,而把输出变量空间记为大写的Y。那么所谓的机器学习,在形式就是完成如下变换:Y=f (X)
但是如何去构造,同时让其准确的识别输入特征并输出正确的结果?因此,需要通过训练数据来构造符合标准的函数,构建一套评估体系去判断函数的好坏。
2.1.1 机器学习三板斧:
- 建模:感知机、支持向量机、最大熵函数等;
- 评估:F值、损失函数;
- 优化:BP、Adam等算法。
2.1.2 机器学习三大门派:
- 监督学习
所有的监督学习,基本上都是“分类”的代名词。它从有标签的训练数据中学习模型,然后给定某个新数据,利用模型预测它的标签。这里的标签,其实就是某个事物的分类。 - 无监督学习
无监督学习,本质上就是‘聚类(Cluster)’的近义词。通过聚类分析将非标签数据聚成几个群。 - 半监督学习
既用到了标签数据,又用到了非标签数据。(更贴近人类的学习方式)。
另外强化学习也是机器学习中重要流派,通过多步恰当的决策,来逼近一个最优的目标。其灵感来源于行为主义理论:有机体如何在环境给予的奖励或惩罚刺激下,逐步形成对刺激的预期,从而产生能获得最大利益的习惯性行为。
强化学习的优势就在于不需要准备大量的训练样本,它重视的是环境给予的反馈。
2.2 深度学习
机器学习在本质上,就是找好一个合适的函数。而神经网络最牛的地方可能就在于,它可以在理论上证明:“一个包含足够多隐层神经元的多层前馈网络,能以任意精度逼近任意预定的连续函数(Universal Approximation Theorem)。但需要注意以下两点:
- 神经网络尽可能好地去“近似”某个特定函数,而不是说“准确”计算这个函数。因此可以通过增加隐含层神经元的个数来提升近似的精度。
- 被近似的函数,必须是连续函数。如果函数是非连续的,也就是说有极陡跳跃的函数,神经网络就“爱莫能助”了。
2.2.1 神经网络是如何模拟函数的呢?
见链接1中第五部分,讲的非常详细。
3 了解深度学习
3.1 感知机
- 感知机:神经网络的起点,神经网络中的“Hello World”。从其几何意义来说,感知机可看做一个由超平面划分的空间位置的识别器。
当特征n为两三个维度时,可以利用它的几何空间来直观解释这个分类器,但当n更大时,就很难再用它的几何意义来研究神经网络感知机超平面。
- 感知机缺点:
感知机虽然可以解决一些简单的问题,但面对复杂问题,如异或计算等就略显乏力了。
3.2 多层神经网络
为解决上述问题,有学者在输入层和输出层之间添加一层神经元,即隐藏层,使得网络复杂起来,便可解决一些相关复杂的问题。类似的,如果将若干个单层神经网路联系在一起,便简单的构成了多层神经网络,从而增强神经网络的表达能力。(需要注意:每一层神经元仅仅与下一层的神经元全连接。但在同一层之内,神经元彼此不连接,而且跨层之间的神经元,彼此也不相连。)
在多层前馈神经网络中,输入层神经元主要用于接收外加的输入信息,在隐含层和输出层中,都有内置的激活函数,可对输入信号进行加工处理,最终的结果,由输出层“呈现”出来。
3.2.1分布式特征表达
分布式表征:是人工神经网络研究的一个核心思想。简单来说,就是当我们表达一个概念时,神经元和概念之间不是一对一对应映射(map)存储的,它们之间的关系是多对多。具体而言,就是一个概念可以用多个神经元共同定义表达,同时一个神经元也可以参与多个不同概念的表达,只不过所占的权重不同罢了。
分布式表征表示有很多优点。其中最重要的一点,莫过于当部分神经元发生故障时,信息的表达不会出现覆灭性的破坏。
3.2.2损失函数
损失函数也称为代价函数,用来度量预期和实际二者之间的“落差”程度。因此,损失函数值越小,模型越好。
常见的损失函数有如下3类:
有了损失函数,那么我们就可以利用其进行神经网络的调参,主要有以下两种方法:
- 第一类方法从后至前调整网络参数,典型代表就是“误差反向传播”,如BP算法。
首先随机设定初值,然后计算当前网络的输出,然后根据网络输出与预期输出之间的差值,采用迭代的算法,反方向地去改变前面各层的参数,直至网络收敛稳定。 - 第二类方法正好相反,从前至后调整参数,代表就是目前流行的“深度学习”。
该方法常用“逐层初始化”(layer-wise pre-training)训练机制,即:从“从前至后”的逐层训练方法。
那么如何使损失函数达到最小呢?大致分为以下三步:
- 损失是否足够小?如果不是,计算损失函数的梯度;
- 按梯度的反方向走一小步,以缩小损失;
- 循环到(1)
这种按照负梯度的若干倍数,不停地调整函数权值的过程就叫做“梯度下降法”。通过这样的方法,改变每个神经元与其他神经元的连接权重及自身的偏置,让损失函数的值下降得更快,进而将值收敛到损失函数的某个极小值
3.2.3 神经元的设计
- 输入层神经元个数
如果图片的维度是16×16,那么我们输入层神经元就可以设计为256个(也就是说,输入层是一个包括256个灰度值的向量),每个神经元接受的输入值,就是归一化处理之后的灰度值。0代表白色像素,黑色像素像素代表1,灰度像素的值介于0到1之间。也就是说,输入向量的维度(像素个数)要和输入层神经元个数相同 - 输出层神经元个数
对输出层而言,其神经元个数和输入神经元的个数,是没有对应关系的,而是和待分事物类别有一定的相关性。
如:任务是识别手写数字,而数字有09共10类。所以,如果在输出层采用Softmax回归函数,它的输出神经元数量仅为10个,分别对应是数字“09”的分类概率。最终的分类结果,择其大者而判之。 - 隐藏层神经元个数
隐含层暂定为一个黑箱,它负责输入和输出之间的非线性映射变化,因此,隐含层的层数不固定,每层的神经元个数也不固定,它们都属于“超参数”,是人们根据实际情况不断调整选取的。
权值:神经元与神经元之间的影响程度。
偏置:连接的强弱程度,告诉下一层相邻神经元更应该关注的部分。
神经网络结构的设计目的在于,让神经网络以“更佳”的性能来学习。而这里的所谓“学习”,就是找到合适的权重和偏置,让损失函数的值达到最小。
3.2.4BP算法
神经网络层数的增多,虽然可为其提供更大的灵活性,让网络能有更强的表征能力,(能解决更多更复杂的问题),但随之而来的庞大网络参数训练,一直是制约多层神经网络发展的一个重要瓶颈,BP算法可以有效地解决该问题。
BP算法是一个双向算法,主要分为两步:
- 正向传播输入信息,实现分类功能(所有的有监督学习,在本质都可以归属于分类);
- 反向传播误差,调整网络权值。
所谓的正向传播就是信号通过激活函数的加工,一层一层的向前“蔓延”,直到抵达输出层。
3.2.5 激活函数
神经元与神经元的连接都是基于权值的线性组合。但线性的组合依然是线性的,网络的表达能力非常有限。因此,需要加入非线性层,自此激活函数就登场了!
3.2.6 池化层
池化层函数力图用统计特性反应出来的1个值,来代替原来的整个子区域,从而减少了参数数量,从而可以预防网络过拟合。
池化之后的图片,虽然比较模糊。但计算机的“视界”和人类完全不同,池化后的图片,丝毫不会影响它们对图片的特征提取。
参考资料:https://www.zhihu.com/column/zhangyuhong(通俗易懂,可作为深度学习科普入门资料)
https://github.com/frank-lam/fullstack-tutorial