深度学习基础认识

深度学习基础(数学基础)

1 数学基础
1.1 求导和梯度
Python目前有2和3两个版本,因此Anaconda也在Python2和Python3的基础上推出了两个发行版,即Anaconda2和Anaconda3。有时候我们会在同时使用python2.7和python3.5两个版本,因此有必要考虑它们的共存问题。

1.2 泰勒级数与极值
1.2.1 高数
鞍点
梯度为什么指向了函数最快下降的方向:梯度下降法
1.2.2 概率论
(1) 随机数

(2) 离散 连续

(3) 分布函数

(4) 概率密度

(5) 正态分布

(6) 贝叶斯公式
根据已经发生的事件推断其他事件发生的概率。
先验概率:指先验知识,如某一个事件发生的概率,硬币正面出现的概率为0.5
后验概率:事件已经发生的概率
用途:分词、图像识别、邮件过滤等等

2 主要内容
2.1 神经网络简介与应用
计算机视觉:图像识别、检测、检索、作画
自然语言处理:写诗造句、模仿代码风格
综合:图像描述、各领域
2.2 高效计算基础
Python基本数据类型,容器与高效操作
Numpy
Scipy
2.3 图像识别难点与KNN
Pipeline
Knn

2.4 线性分类器
图像线性分类器与理解
SVM Softmax

2.5 深度学习的应用
图像上的应用:图像上的物品识别(如拍立淘)
自然语言方面的应用:模仿某个作者的写作风格、作诗

3 图像识别
有时候真感叹大自然的雄伟壮阔,自然形成了无数的山和风景不需要任何点缀,有时候在想为什么亲近自然界我们会有亲近的感觉,可能那是我们的来源,我们人类在经过了无数代的繁衍生息,发展到了现在的文明,这些都是前辈们智慧的结晶,就比如我们每天看的电视、电脑,它们把彩色的世界呈现在我们眼前,提高了我们的生活品味和视觉享受,那么你是否想过它是怎么形成的吗?下面就让我们来说说它的原理。
3.1 三原色原理
人眼对(Red Green Blue)红、绿、蓝最为敏感,人的眼睛像一个三色接收器的体系,大多数的颜色可以通过红、绿、蓝三色按照不同的比例合成产生。同样,绝大多数单色光也可以分解成红、绿、蓝三种色光,这是色度学的最基本的原理,也称三原色原理。
说道这里难免会有些好奇、有些疑问了,为什么是三原色?为什么不是四原色、五元色呢?
牛顿通过三菱镜首先发明了自然光可以分解为不同颜色的七彩色光,那么七彩色光是不是也可以被分解或者合成呢?在七彩色光中只有红、绿、蓝三种颜色不能够再继续分解,不能分解也就是原子的 这点和事务的特性一样,所以称其为三原色,其它的光可以通过这三种光来组合叠加和相减算出来。

三原色我们达成的共识是这样的:
(1)自然界的任何光色都可以由3种光色按不同的比例混合而成。
(2)三原色之间是相互独立的,任何一种光色都不能由其余的两种光色来组成。
(3)混合色的饱和度由3种光色的比例来决定。混合色的亮度为3种光色的亮度之和。

三原色在应用于实际生活中时既可以相加,也可以相减,采用相加的方式成为RGB颜色模型和CMY模式(品红、青色、淡黄),也是用的最多的一种,相减为CMYK模型,他们分别用于绘图和印刷领域。
三原色之所以可以代表最基础的色彩,还有另外一个原理即正交,任何事物如果想研究他们 让他们正交是最好的组织方式,因为他们互不影响,如通笛卡尔坐标系一样,在坐标系中可以表示任何点一样,三原色犹如三个坐标系,由三个颜色坐标系可以表示出来很多种颜色,即三原色代表了世界这么多颜色,反过来也可以看做是这么多色彩的抽象,从而又论证了科学、科研是一个不段抽象、不断总结升华的过程,所以 学会总结 抽象非常重要。
软件或屏幕显示图片的时候是利用电子光照射屏幕上的发光材料产生的色彩,多个色彩相加,而印刷是墨的反光相减,可以说三原色的应用大大提高了我们认识世界和观察世界的途径,而不是活在非黑即白的世界里面。
通过三原色可以组合出来自然界的各种各样的色彩,每种颜色值可以通过数值来表示大小强弱等,以目前计算机中8位来保存颜色值,每种颜色值的范围是0-255个值来表示,根据组合原理三种色组合起来有255255255种色彩,对于我们肉眼的分辨能力已经够用了。

3.2 显示器为什么有颜色?
理解了三原色再来看这个问题会比较简单,在电子屏幕上有可以发光的三种材料荧光材料,在经过电子枪照射时会组合成不同颜色,电子枪的强弱即可以表示三种原色的色值大小,组合出来的颜色也就各不相同,有些特别相似的颜色也不是我们肉眼就能看出来的,即满足了在我们视力范围内的色彩。

3.3 图像识别-计算
一张图片在屏幕上面如果无限放大会看到是由无数个像素点组成的,其实任何事物都是由无限到有限来组成,无数个点会组成一个平面,当点和点之间的间距足够小时我们的肉眼是分不出来的,我们看到的就是一个图像,当无限个图像从我们眼前闪过就会形成视频电影,他们都是一个道理,好比几何中的点组成线、线组成面、面组成立体空间,当分析到这一层次图像识别就显着处理简单了,只要让计算机计算组成图片的无数个像素点的特征就可以识别出来相似图片,当然这也依赖于强大的运算能力,因为像素高的大图是非常大的,如常见笔记本电脑像素,有1366*768个像素点,数量级别在百万级,况且以RGB模式来说有三个通道颜色 将会更大。

3.4 PC如何存储图片?
图片在计算机中是一个三维矩阵,让我们通过一个图片直观感受一下,如下图是训练集中第一个类型里面第一张图片。
我们取该图中第一个通道矩阵,并打印出来如下:

打印red 通道图片矩阵

img_df = pd.DataFrame(X_train[0][:,:,0])
img_df.to_csv(‘X_train0101.csv’)
plt.imshow(X_train[0])
plt.show()

从图片可以看到每个像素点的值都在0-255之间,三个这样的颜色矩阵就可以组装出来一个彩色图片,矩阵越大像素点越多,会越清晰当然占用内存也就越大,在实际预测时有时会对矩阵进行变换,变为一个长的向量,方便计算距离,下面我们将这名变换来就是那距离。

3.5 图像识别的困难之处
视角不同:每个事物旋转、俯视图都不同
尺寸大小不统一:相同内容的图片可大可小
变形:很多东西处于特殊的情形下,会有特殊的摆放和形状
光影等干扰
背景干扰
同类之间的差异(比如椅子有靠椅/吧椅/餐椅/躺椅…)

3.6 基本流程
图像识别是一种驱动学习型(监督学习),事先并不对一类事物进行概念化定义,而是给定K个类别的N张图片,作为计算机学习的训练集。

3.7 KNN (K最近邻法)
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
先看一个实例来体会一下什么叫做KNN。已知一堆数据a和一堆数据0,然后有一个未知数据c,要判断c到底属于a还是0.如果是1NN,就找到离C最近的数据,离哪一个最近,就判断c属于哪一类。如果利用3NN,如下图所示,以c为半径画圆,直到找出三个数为止,分别有一个a,两个0,则说明c属于0.(注意K一定是奇数可以保证不会平票)

3.7.1 实例
分类问题:
一个学生是不是三好学生通过德智体三个方面来进行评价。如果我们的样本空间如下:(所谓样本空间,又叫Training Data,也就是用于机器学习的数据)

那么吴6是三好学生不是呢?我们使用KNN算法来判断。假设K=3,K应该是一个奇数,这样可以保证不会有平票,下面是我们计算(2,9,7)到所有点的距离。(距离公式,可以参看K-Means算法中的一些距离定义)

离吴六最近的几个人是孙三,李四,钱二,只有钱儿是三好学生,孙三和李四都不是,那么吴六也不是三好学生了,这样就可以把吴六分类为不是三好学生。

当然利用kNN也可以解决回归问题,但是最大最有效的就是分类问题了。
对于KNN算法中找到离自己最近的K个点需要使用到最大堆数据结构。也会做出阐述。

3.7.2 向量之间的距离计算方法
曼哈顿距离:向量作减法求绝对值和
欧氏距离:向量平方和开根号
余弦距离:1-两个向量角度的cos值

3.7.3 结果判定
K折交叉验证
K折交叉验证,初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。交叉验证重复K次,每个子样本验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。这个方法的优势在于,同时重复运用随机产生的子样本进行训练和验证,每次的结果验证一次,10折交叉验证是最常用的。
确定合适的k值

3.7.4 缺点
准确度不高 (为什么?)
耗内存 要记录全部训练数据 速度慢

3.8 线性分类器
线性分类器主要由两个部分组成:
一个是评分函数(score function),它是一个从原始图像到类别分值的映射函数。
另一个是损失函数(loss function)(代价函数(cost function)),它是用来量化预测得到的分类标签的得分与真实标签之间的一致性。
该方法可转化为一个最优化问题,在最优化过程中,将通过更新评分函数的参数来最小化损失函数值。
3.8.1 理解
线性分类器相当于对图片进行空间划分,权重w确定斜率,偏量b确定与y轴的交点。
模板匹配:关于权重W的另一个解释是它的每一行对应着一个分类的模板(有时候也叫作原型)。一张图像对应不同分类的得分,是通过使用内积(也叫点积)来比较图像和模板,然后找到和哪个模板最相似。从这个角度来看,线性分类器就是在利用学习到的模板,针对图像做模板匹配。从另一个角度来看,可以认为还是在高效地使用k-NN,不同的是我们没有使用所有的训练集的图像来比较,而是每个类别只用了一张图片(这张图片是我们学习到的,而不是训练集中的某一张),而且我们会使用(负)内积来计算向量间的距离,而不是使用L1或者L2距离。

3.8.2 评分函数
评分函数将图像像素值集合最终映射为各个分类类别的得分,得分高低代表图像属于该类别的可能性高低。例如,有训练集xiϵRD,对应的标签为yi,这里i=1,2,…,N, yiϵ1,2,…,k。也就是说,我们有N个图像样本,每个样本的维度是D,共有K个不同的类别。
举例来说,在CIFAR-10数据集中,我们有一个N=50000的训练集,每个图像有D=32∗32∗3=3072个像素,而k=10(狗,猫,汽车等)。我们定义评分函数f:RD→RK,该函数是原始图像像素到分类类别分值的映射。
这里,我们从最简单的概率函数开始,一个线性映射:f(xi,W,b)=Wxi+b

where, 每个样本xi大小为D∗1,矩阵W(大小为K∗D),向量b(大小为D∗1),为该函数的参数。同样以CIFAR-10数据为例,xi包含了第i个图像的所有像素信息,这些信息被拉成为一个3072∗1的向量,W的大小为10∗3072,b的大小为10∗1。因此,3072个像素值作为输入函数,函数输出10个分值结果。参数 W 被称为权重(weight),参数 b 称为偏差(bias),偏差影响输出值,但并不和原始数据产生关联。

需要注意的是:
一个简单的矩阵乘法Wxi就可以有效评估K个不同的分类器(每个分类器对应一个类别),其中每个类别是 W 的一个行向量。
我们认为输入数据(xi,yi)是给定且不可改变的,但参数W 和 b 可控制改变的。我们的目标就是通过设置这些参数,使得计算出来的分类分值情况和训练集众图像的真实类别标签相符。
该方法相对于 KNN 算法的优势在于,训练数据是用来学习参数W 和 b 的,一旦训练完成,训练数据就可以丢弃了。对于一个测试图像,我们简单地将其输入函数,并基于计算的分类分值进行分类即可。
最后,注意我们只要做一个矩阵乘法和一个矩阵加法就能对测试数据分类,这也比 KNN方法快多了。
3.8.2.1 理解线性分类器
线性分类器计算图像中3个颜色通道中所有像素值与权重的矩阵乘法,从而得到分类分值。根据我们对权重设置的值,对于图像中某些位置的某些颜色,函数表现出喜好或者厌恶(根据每个权重的符号而定)。举个例子,可以想象“船”分类就是被大量的蓝色包围(对应的就是水)。那么“船”分类器在蓝色通道上的权重就有很多的正权重(它们的出现提高了“船”分类的分值),而在绿色和红色通道上的权重为负的就比较多(它们的出现降低了“船”分类的分值)。

上面是一个简单的将图像映射到分类分值的例子。为了便于可视化,假设图像只有4个像素(都是黑白像素,这里不考虑RGB通道),有三个分类(红色代表猫,绿色代表狗,蓝色代表船,注意,这里的红、绿和蓝3种颜色仅代表分类,和RGB通道没有关系)。首先将图像像素拉伸为一个列向量,与进行矩阵乘,然后得到各个分类的分值。需要注意的是,这个一点也不好:猫分类的分值非常低。从上图来看,算法倒是觉得这个图像是一只狗。

3.8.2.2 偏差和权重的合并技巧
实际操作中,我们常常将 W 和 b 合二为一。回忆一下,分类评分函数定义为:f(xi,W,b)=Wxi+b。
一般常用的方法是把两个参数放到同一个矩阵中,同时 xi 向量就要增加一个维度,这个维度的数值是常量 1,这就是默认的偏差维度。这样新的公式就简化成下面这样:
f(xi,W)=Wxi
还是以CIFAR-10为例,xi的大小变成了 3073∗1,而不是3072∗1了,多出了包含常向量1的一个维度。W 的大小变成了 10∗3073。W 这多出来的这一列对应的就是偏差值b,具体见下图:

3.8.2.3 图像数据预处理
在上面的例子中,所有的图像都是使用原始像素值(从0到255)。在机器学习中,对应特征做归一化(normalization)处理是常见套路。在图像分类的例子中,图像上的每一个像素可以看作一个特征(feature)。
图像归一化处理意味着根据训练集所有的图像计算出一个平均像素值,然后每个图像都减去这个平均值,这样图像的像素就大约分布在[-128,127]之间了。下一个常见步骤是,让所有数值分布的区间变成[-1,1)。零均值的中心化是很重要的。
这并没有改变你的图像信息,而且更利于数值优化。

3.8.3 损失函数
上面我们定义来从图像像素值到所属类别的评分函数(score function),该函数的参数是权重矩阵W。在函数中,数据 (xi,yi 是给的,不能修改。但我们可以调整权重矩阵这个参数,使得评分函数的结果与训练数据集中图像的真实类别一致,既评分函数在正确的分类位置应当得到最高的评分(score)。
回到之前那张猫的图像分类例子,它有针对“猫”,“狗”,“船”三个类别的分数。我们看到例子中权重值非常差,因为猫分类的得分非常低(-96.8),而狗(437.9)和船(61.95)比较高。我们将使用损失函数(loss function)/代价函数(cost function)来衡量我们对结果的不满意程度。直观地讲,当评分函数输出结果与真实结果之间差异越大,损失函数输出越大,反之越小。
3.8.3.1 SVM Loss
多类支持向量机损失 Multiclass Support Vector Machine Loss
损失函数的具体形式多种多样。这里,我们介绍了常用的多类别支持向量机(SVM)损失函数。该损失函数想要SVM在正确分类上的得分始终比不正确分类上的得分高出一个边界值 Δ。我们可以把损失函数想象成一个人,这位SVM先生(或者女士)对于结果有自己的品位,如果某个结果能使得损失值更低,那么SVM就更加喜欢它。
具体的:样本 i 中包含图像像素 xi 和类别标签 yi。输入图像通过score function f(xi,W) 来计算不同分类类别的分值。那么针对这个样本的多类别SVM损失函数定义如下:
Li=∑j≠yimax(0,fj−fyi+Δ)
例如:假设有三个分类类别,图片 xi 通过评分函数得到的分值为 [13, -7, 11]。假设第一个类别正确,即yi=0,同时假设 Δ 是10。那么 Li=max(0,−7−13+10)+max(0,11−13+10)=8。简而言之,SVM的损失函数想正确分类类别 yi 的分数比不正确的类别分数要高,而且至少要高 Δ ,如果不满足这点,则开始计算损失值。
3.8.3.2 折叶损失(hinge loss)
在结束这一小结前,还必须提一下这个有关0的阈值函数:max(0,−),它常被称为折叶损失(hinge loss)。有时候会听到人们使用平方折叶函数SVM(即 L2-SVM)。它使用的是 max(0,−)2,将更强烈(平方地而不是线性地)地惩罚过界的边界值。不使用平方是更标准的版本,但是在某些数据集中,平方折叶损失会工作得更好。可以通过交叉验证来决定到底使用哪个。

我们对于预测训练集数据分类标签的情况总有一些不满意的,而损失函数就能将这些不满意的程度量化。
多类SVM正确类别的分数比其他不正确分类类别的分数要高,而且至少高出 Δ 边界值。如果其他分类分数进入了红色的区域,甚至更高,那么就开始计算损失。如果没有这种情况,损失值为0.我们的目标是找到一些权重,它们能够让训练集中的数据样例满足这些限制,也能够让总的损失值尽可能的低。
3.8.3.3 正则化(Regularization)
上面的损失函数有一个问题。假设有一个数据集和一个权重 w 能够正确地分类每个数据(即所有的边界都满足,对于所有的 i 都有 Li = 0),问题在于这个 W 并不唯一。我们想象一下,当 λ>1 时,任何 λW 都能使 损失值为0,因为这个变化将所有的分值的大小都均等地扩大了,所有它们的差值也扩大了。举个例子,如果一个正确分类的分值和距离它最近的错误分类的分值的差距是15,对 W 乘以2将使得差距变成30。
我们希望能向某些特定的权重 W 添加一些偏好,对于其他权重则不添加,以此来消除模糊性。这一点的实现方法是向损失函数增加一个正则化惩罚(regularization penalty) R(W) 部分。最常用的正则化惩罚是 L2 范数,L2 范数通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重:
R(W)=∑k∑lW2k,l
上面的表达中,将 w 中所有元素平方后求和。注意:正则化函数不是数据的函数,仅基于权重。包含正则化惩罚后就能够给出完整的多类别 SVM 损失函数了,它由两个部分组成:数据损失(data loss),即所有样本的平均损失,以及正则化损失(regularization loss)。

L=1/N*∑Li+λR(W)

3.8.3.4 Softmax分类器
Softmax中将折叶损失(hinge loss)替换为交叉熵损失(cross-entropy loss)。公式如下:

Li=−log(efy/∑jefj)

这里我们可以对比下SVM的损失函数。

针对一个数据点,SVM和Softmax分类器的不同处理方式的例子。两个分类器都计算了同样的分值向量 f(本节中是通过矩阵乘来实现)。不同之处在于对 f 中分值的解释:
SVM分类器将它们看做是分类评分,它的损失函数鼓励正确的分类(本例中是蓝色的类别2)的分值比其他分类的分值高出至少一个边界值。
Softmax分类器将这些数值看做是每个分类归一化的对数概率,鼓励正确分类的归一化的对数概率变高,其余的变低。SVM的最终的损失值是1.58,Softmax的最终的损失值是0.452,但要注意这两个数值没有可比性。只在给定同样数据,在同样的分类器的损失值计算中,它们才有意义。

3.8.3.5 总结
定义了从图像像素映射到不同类别的分类评分的评分函数。评分函数是一个基于权重和偏差的线性函数。
与kNN分类器不同,参数方法的优势在于一旦通过训练学习到了参数,就可以将训练数据丢弃了。同时该方法对于新的测试数据的预测非常快,因为只需要与权重进行一个矩阵乘法运算。
介绍了偏差技巧,让我们能够将偏差向量和权重矩阵合二为一,然后就可以只跟踪一个矩阵。
介绍了图像预处理操作,0均值与同方差操作。
定义了损失函数(介绍了SVM和Softmax线性分类器最常用的2个损失函数)。损失函数能够衡量给出的参数集与训练集数据真实类别情况之间的一致性。在损失函数的定义中可以看到,对训练集数据做出良好预测与得到一个足够低的损失值这两件事是等价的。

3.8.4 权重和偏差求解
3.8.4.1 梯度下降法

3.8.4.2 反向传播

3.9 神经网络
神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向–深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术。
神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。

设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定;
神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。

上图是一个包含三个层次的神经网络。红色的是输入层,绿色的是输出层,紫色的是中间层(也叫隐藏层)。输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。后文中,我们统一使用这种颜色来表达神经网络的结构。
除了从左到右的形式表达的结构图,还有一种常见的表达形式是从下到上来表示一个神经网络。这时候,输入层在图的最下方。输出层则在图的最上方,如下图:

3.9.1 神经元模型
3.9.1.1 引子 
对于神经元的研究由来已久,1904年生物学家就已经知晓了神经元的组成结构。
一个神经元通常具有多个树突,主要用来接受传入信息;而轴突只有一条,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。这个连接的位置在生物学上叫做“突触”。
人脑中的神经元形状可以用下图做简单的说明:

1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP。
3.9.1.2 结构
神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。
下图是一个典型的神经元模型:包含有3个输入,1个输出,以及2个计算功能。
注意中间的箭头线。这些线称为“连接”。每条线上有一个“权值”。

连接是神经元中最重要的东西。每一个连接上都有一个权重。
一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。
我们使用a来表示输入,用w来表示权值。一个表示连接的有向箭头可以这样理解:在初端,传递的信号大小仍然是a,端中间有加权参数w,经过这个加权后的信号会变成aw,因此在连接的末端,信号的大小就变成了aw。
在其他绘图模型里,有向箭头可能表示的是值的不变传递。而在神经元模型里,每个有向箭头表示的是值的加权传递。

如果我们将神经元图中的所有变量用符号表示,并且写出输出的计算公式的话,就是下图。

可见z是在输入和权值的线性加权和叠加了一个函数g的值。在MP模型里,函数g是sgn函数(符号函数)。当输入大于0时,sgn输出1,等于0时输出0,小于0时输出-1。
下面对神经元模型的图进行一些扩展。首先将sum函数与sgn函数合并到一个圆圈里,代表神经元的内部计算。其次,把输入a与输出z写到连接线的左上方,便于后面画复杂的网络。最后说明,一个神经元可以引出多个代表输出的有向箭头,但值都是一样的。
神经元可以看作一个计算与存储单元。计算是神经元对其的输入进行计算功能。存储是神经元会暂存计算结果,并传递到下一层。

当我们用“神经元”组成网络以后,描述网络中的某个“神经元”时,我们更多地会用“单元”(unit)来指代。同时由于神经网络的表现形式是一个有向图,有时也会用“节点”(node)来表达同样的意思。
3.9.1.3 效果
神经元模型的使用可以这样理解:
我们有一个数据,称之为样本。样本有四个属性,其中三个属性已知,一个属性未知。我们需要做的就是通过三个已知属性预测未知属性。
具体办法就是使用神经元的公式进行计算。三个已知属性的值是a1,a2,a3,未知属性的值是z。z可以通过公式计算出来。
这里,已知的属性称之为特征,未知的属性称之为目标。假设特征与目标之间确实是线性关系,并且我们已经得到表示这个关系的权值w1,w2,w3。那么,我们就可以通过神经元模型预测新样本的目标。
3.9.1.4 影响
1943年发布的MP模型,虽然简单,但已经建立了神经网络大厦的地基。但是,MP模型中权重的值都是预先设置的,因此不能学习。
1949年心理学家Hebb提出了Hebb学习率,认为人脑神经细胞的突触(也就是连接)上的强度上可以变化的。于是计算科学家们开始考虑用调整权值的方法来让机器学习。这为后面的学习算法奠定了基础。
尽管神经元模型与Hebb学习律都已诞生,但限于当时的计算机能力,直到接近10年后,第一个真正意义的神经网络才诞生。

3.9.2 单层神经网络(感知器)模型
3.9.2.1 引子
1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络。他给它起了一个名字–“感知器”(Perceptron)(有的文献翻译成“感知机”,下文统一用“感知器”来指代)。
感知器是当时首个可以学习的人工神经网络。Rosenblatt现场演示了其学习识别简单图像的过程,在当时的社会引起了轰动。
人们认为已经发现了智能的奥秘,许多学者和科研机构纷纷投入到神经网络的研究中。美国军方大力资助了神经网络的研究,并认为神经网络比“原子弹工程”更重要。这段时间直到1969年才结束,这个时期可以看作神经网络的第一次高潮。
3.9.2.2 结构
在原来MP模型的“输入”位置添加神经元节点,标志其为“输入单元”。其余不变,于是我们就有了下图:从本图开始,我们将权值w1, w2, w3写到“连接线”的中间。

在“感知器”中,有两个层次。分别是输入层和输出层。输入层里的“输入单元”只负责传输数据,不做计算。输出层里的“输出单元”则需要对前面一层的输入进行计算。
我们把需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络”。有一些文献会按照网络拥有的层数来命名,例如把“感知器”称为两层神经网络。但在本文里,我们根据计算层的数量来命名。
假如我们要预测的目标不再是一个值,而是一个向量,例如[2,3]。那么可以在输出层再增加一个“输出单元”。
下图显示了带有两个输出单元的单层神经网络,其中输出单元z1的计算公式如下图。

可以看到,z1的计算跟原先的z并没有区别。
我们已知一个神经元的输出可以向多个神经元传递,因此z2的计算公式如下图。

可以看到,z2的计算中除了三个新的权值:w4,w5,w6以外,其他与z1是一样的。
整个网络的输出如下图:

目前的表达公式有一点不让人满意的就是:w4,w5,w6是后来加的,很难表现出跟原先的w1,w2,w3的关系。
因此我们改用二维的下标,用wx,y来表达一个权值。下标中的x代表后一层神经元的序号,而y代表前一层神经元的序号(序号的顺序从上到下)。
例如,w1,2代表后一层的第1个神经元与前一层的第2个神经元的连接的权值(这种标记方式参照了Andrew Ng的课件)。根据以上方法标记,我们有了下图。

如果我们仔细看输出的计算公式,会发现这两个公式就是线性代数方程组。因此可以用矩阵乘法来表达这两个公式。
例如,输入的变量是[a1,a2,a3]T(代表由a1,a2,a3组成的列向量),用向量a来表示。方程的左边是[z1,z2]T,用向量z来表示。
系数则是矩阵W(2行3列的矩阵,排列形式与公式中的一样)。
于是,输出公式可以改写成:
g(W * a) = z;
这个公式就是神经网络中从前一层计算后一层的矩阵运算。
3.9.2.3 效果
与神经元模型不同,感知器中的权值是通过训练得到的。因此,根据以前的知识我们知道,感知器类似一个逻辑回归模型,可以做线性分类任务。
我们可以用决策分界来形象的表达分类的效果。决策分界就是在二维的数据平面中划出一条直线,当数据的维度是3维的时候,就是划出一个平面,当数据的维度是n维时,就是划出一个n-1维的超平面。
下图显示了在二维平面中划出决策分界的效果,也就是感知器的分类效果。

3.9.2.4 影响
感知器只能做简单的线性分类任务。但是当时的人们热情太过于高涨,并没有人清醒的认识到这点。于是,当人工智能领域的巨擘Minsky指出这点时,事态就发生了变化。
Minsky在1969年出版了一本叫《Perceptron》的书,里面用详细的数学证明了感知器的弱点,尤其是感知器对XOR(异或)这样的简单分类任务都无法解决。
Minsky认为,如果将计算层增加到两层,计算量则过大,而且没有有效的学习算法。所以,他认为研究更深层的网络是没有价值的。
由于Minsky的巨大影响力以及书中呈现的悲观态度,让很多学者和实验室纷纷放弃了神经网络的研究。神经网络的研究陷入了冰河期。这个时期又被称为“AI winter”。
接近10年以后,对于两层神经网络的研究才带来神经网络的复苏。

3.9.3 两层神经网络(多层感知器)模型
3.9.3.1 引子
两层神经网络是本文的重点,因为正是在这时候,神经网络开始了大范围的推广与使用。
Minsky说过单层神经网络无法解决异或问题。但是当增加一个计算层以后,两层神经网络不仅可以解决异或问题,而且具有非常好的非线性分类效果。不过两层神经网络的计算是一个问题,没有一个较好的解法。
1986年,Rumelhar和Hinton等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,从而带动了业界使用两层神经网络研究的热潮。目前,大量的教授神经网络的教材,都是重点介绍两层(带一个隐藏层)神经网络的内容。
这时候的Hinton还很年轻,30年以后,正是他重新定义了神经网络,带来了神经网络复苏的又一春。

3.9.3.2 结构
两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层。此时,中间层和输出层都是计算层。我们扩展上节的单层神经网络,在右边新加一个层次(只含有一个节点)。
现在,我们的权值矩阵增加到了两个,我们用上标来区分不同层次之间的变量。
例如ax(y)代表第y层的第x个节点。z1,z2变成了a1(2),a2(2)。下图给出了a1(2),a2(2)计算公式。

计算最终输出z的方式是利用了中间层的a1(2),a2(2)和第二个权值矩阵计算得到的,如下图。

假设我们的预测目标是一个向量,那么与前面类似,只需要在“输出层”再增加节点即可。
我们使用向量和矩阵来表示层次中的变量。a(1),a(2),z是网络中传输的向量数据。W(1)和W(2)是网络的矩阵参数。如下图。

使用矩阵运算来表达整个计算公式的话如下:
g(W(1) * a(1)) = a(2);
g(W(2) * a(2)) = z;

由此可见,使用矩阵运算来表达是很简洁的,而且也不会受到节点数增多的影响(无论有多少节点参与运算,乘法两端都只有一个变量)。因此神经网络的教程中大量使用矩阵运算来描述。
需要说明的是,至今为止,我们对神经网络的结构图的讨论中都没有提到偏置节点(bias unit)。事实上,这些节点是默认存在的。它本质上是一个只含有存储功能,且存储值永远为1的单元。在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。
偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。如下图。

可以看出,偏置节点很好认,因为其没有输入(前一层中没有箭头指向它)。有些神经网络的结构图中会把偏置节点明显画出来,有些不会。一般情况下,我们都不会明确画出偏置节点。

在考虑了偏置以后的一个神经网络的矩阵运算如下:
g(W(1) * a(1) + b(1)) = a(2);
g(W(2) * a(2) + b(2)) = z;

需要说明的是,在两层神经网络中,我们不再使用sgn函数作为函数g,而是使用平滑函数sigmoid作为函数g。我们把函数g也称作激活函数(active function)。
事实上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系。初学者可能认为画神经网络的结构图是为了在程序中实现这些圆圈与线,但在一个神经网络的程序中,既没有“线”这个对象,也没有“单元”这个对象。实现一个神经网络最需要的是线性代数库。
3.9.3.3 效果
与单层神经网络不同。理论证明,两层神经网络可以无限逼近任意连续函数。
这是什么意思呢?也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。
下面就是一个例子(此两图来自colah的博客),红色的线与蓝色的线代表数据。而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。

可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好。有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。为什么两个线性分类任务结合就可以做非线性分类任务?
我们可以把输出层的决策分界单独拿出来看一下。就是下图。

可以看到,输出层的决策分界仍然是直线。关键就是,从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。
这样就导出了两层神经网络可以做非线性分类的关键–隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。
两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合。
下面来讨论一下隐藏层的节点数设计。在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,却是由设计者指定的。因此,“自由”把握在设计者的手中。但是,节点数设置的多少,却会影响到整个模型的效果。如何决定这个自由层的节点数呢?目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。这种方法又叫做Grid Search(网格搜索)。
了解了两层神经网络的结构以后,我们就可以看懂其它类似的结构图。例如EasyPR字符识别网络架构(下图)。

EasyPR使用了字符的图像去进行字符文字的识别。输入是120维的向量。输出是要预测的文字类别,共有65类。根据实验,我们测试了一些隐藏层数目,发现当值为40时,整个网络在测试集上的效果较好,因此选择网络的最终结构就是120,40,65。
3.9.3.4 训练
下面简单介绍一下两层神经网络的训练。
在Rosenblat提出的感知器模型中,模型中的参数可以被训练,但是使用的方法较为简单,并没有使用目前机器学习中通用的方法,这导致其扩展性与适用性非常有限。从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。
机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标为y。那么,定义一个值loss,计算公式如下。
loss = (yp - y)2

这个值称之为损失(loss),我们的目标就是使对所有训练数据的损失和尽可能的小。
如果将先前的神经网络预测的矩阵公式带入到yp中(因为有z=yp),那么我们可以把损失写为关于参数(parameter)的函数,这个函数称之为损失函数(loss function)。下面的问题就是求:如何优化参数,能够让损失函数的值最小。
此时这个问题就被转化为一个优化问题。一个常用方法就是高等数学中的求导,但是这里的问题由于参数不止一个,求导后计算导数等于0的运算量很大,所以一般来说解决这个优化问题使用的是梯度下降算法。梯度下降算法每次计算参数在当前的梯度,然后让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时截止。一般这个时候,所有的参数恰好达到使损失函数达到一个最低值的状态。
在神经网络模型中,由于结构复杂,每次计算梯度的代价很大。因此还需要使用反向传播算法。反向传播算法是利用了神经网络的结构进行的计算。不是一次算所有参数的梯度,而是从后往前。首先计算输出层的梯度,然后是第二个参数矩阵的梯度,接着是中间层的梯度,再然后是第一个参数矩阵的梯度,最后是输入层的梯度。计算结束以后,所要的两个参数矩阵的梯度就都有了。
反向传播算法可以直观的理解为下图。梯度的计算从后往前,一层层反向传播。前缀E代表着相对导数的意思。

反向传播算法的启示是数学中的链式法则。在此需要说明的是,尽管早期神经网络的研究人员努力从生物学中得到启发,但从BP算法开始,研究者们更多地从数学上寻求问题的最优解。不再盲目模拟人脑网络是神经网络研究走向成熟的标志。正如科学家们可以从鸟类的飞行中得到启发,但没有必要一定要完全模拟鸟类的飞行方式,也能制造可以飞天的飞机。
优化问题只是训练中的一个部分。机器学习问题之所以称为学习问题,而不是优化问题,就是因为它不仅要求数据在训练集上求得一个较小的误差,在测试集上也要表现好。因为模型最终是要部署到没有见过训练数据的真实场景。提升模型在测试集上的预测效果的主题叫做泛化(generalization),相关方法被称作正则化(regularization)。神经网络中常用的泛化技术有权重衰减等。
3.9.3.5 影响
两层神经网络在多个地方的应用说明了其效用与价值。10年前困扰神经网络界的异或问题被轻松解决。神经网络在这个时候,已经可以发力于语音识别,图像识别,自动驾驶等多个领域。
历史总是惊人的相似,神经网络的学者们再次登上了《纽约时报》的专访。人们认为神经网络可以解决许多问题。就连娱乐界都开始受到了影响,当年的《终结者》电影中的阿诺都赶时髦地说一句:我的CPU是一个神经网络处理器,一个会学习的计算机。
但是神经网络仍然存在若干的问题:尽管使用了BP算法,一次神经网络的训练仍然耗时太久,而且困扰训练优化的一个问题就是局部最优解问题,这使得神经网络的优化较为困难。同时,隐藏层的节点数需要调参,这使得使用不太方便,工程和研究人员对此多有抱怨。
90年代中期,由Vapnik等人发明的SVM(Support Vector Machines,支持向量机)算法诞生,很快就在若干个方面体现出了对比神经网络的优势:无需调参;高效;全局最优解。基于以上种种理由,SVM迅速打败了神经网络算法成为主流。
神经网络的研究再次陷入了冰河期。当时,只要你的论文中包含神经网络相关的字眼,非常容易被会议和期刊拒收,研究界那时对神经网络的不待见可想而知。

3.9.4 多层神经网络(深度学习)
3.9.4.1 引子
在被人摒弃的10年中,有几个学者仍然在坚持研究。这其中的棋手就是加拿大多伦多大学的Geoffery Hinton教授。
2006年,Hinton在《Science》和相关期刊上发表了论文,首次提出了“深度信念网络”的概念。与传统的训练方式不同,“深度信念网络”有一个“预训练”(pre-training)的过程,这可以方便的让神经网络中的权值找到一个接近最优解的值,之后再使用“微调”(fine-tuning)技术来对整个网络进行优化训练。这两个技术的运用大幅度减少了训练多层神经网络的时间。他给多层神经网络相关的学习方法赋予了一个新名词–“深度学习”。
很快,深度学习在语音识别领域暂露头角。接着,2012年,深度学习技术又在图像识别领域大展拳脚。Hinton与他的学生在ImageNet竞赛中,用多层的卷积神经网络成功地对包含一千类别的一百万张图片进行了训练,取得了分类错误率15%的好成绩,这个成绩比第二名高了近11个百分点,充分证明了多层神经网络识别效果的优越性。
在这之后,关于深度神经网络的研究与应用不断涌现。
由于篇幅原因,本文不介绍CNN(Conventional Neural Network,卷积神经网络)与RNN(Recurrent Neural Network,递归神经网络)的架构,下面我们只讨论普通的多层神经网络。
3.9.4.2 结构
我们延续两层神经网络的方式来设计一个多层神经网络。
在两层神经网络的输出层后面,继续添加层次。原来的输出层变成中间层,新加的层次成为新的输出层。所以可以得到下图。

依照这样的方式不断添加,我们可以得到更多层的多层神经网络。公式推导的话其实跟两层神经网络类似,使用矩阵运算的话就仅仅是加一个公式而已。
在已知输入a(1),参数W(1),W(2),W(3)的情况下,输出z的推导公式如下:
g(W(1) * a(1)) = a(2);
g(W(2) * a(2)) = a(3);
g(W(3) * a(3)) = z;

多层神经网络中,输出也是按照一层一层的方式来计算。从最外面的层开始,算出所有单元的值以后,再继续计算更深一层。只有当前层所有单元的值都计算完毕以后,才会算下一层。有点像计算向前不断推进的感觉。所以这个过程叫做“正向传播”。
下面讨论一下多层神经网络中的参数。
首先我们看第一张图,可以看出W(1)中有6个参数,W(2)中有4个参数,W(3)中有6个参数,所以整个神经网络中的参数有16个(这里我们不考虑偏置节点,下同)。

假设我们将中间层的节点数做一下调整。第一个中间层改为3个单元,第二个中间层改为4个单元。
经过调整以后,整个网络的参数变成了33个。

图32 多层神经网络(较多参数)

虽然层数保持不变,但是第二个神经网络的参数数量却是第一个神经网络的接近两倍之多,从而带来了更好的表示(represention)能力。表示能力是多层神经网络的一个重要性质,下面会做介绍。
  在参数一致的情况下,我们也可以获得一个“更深”的网络。

上图的网络中,虽然参数数量仍然是33,但却有4个中间层,是原来层数的接近两倍。这意味着一样的参数数量,可以用更深的层次去表达。
3.9.4.3 效果
与两层层神经网络不同。多层神经网络中的层数增加了很多。
增加更多的层次有什么好处?更深入的表示特征,以及更强的函数模拟能力。
更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。
关于逐层特征学习的例子,可以参考下图。

更强的函数模拟能力是由于随着层数的增加,整个网络的参数就越多。而神经网络其实本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。
通过研究发现,在参数数量一样的情况下,更深的网络往往具有比浅层的网络更好的识别效率。这点也在ImageNet的多次大赛中得到了证实。从2012年起,每年获得ImageNet冠军的深度神经网络的层数逐年增加,2015年最好的方法GoogleNet是一个多达22层的神经网络。
在最新一届的ImageNet大赛上,目前拿到最好成绩的MSRA团队的方法使用的更是一个深达152层的网络!关于这个方法更多的信息有兴趣的可以查阅ImageNet网站。
3.9.4.4 训练
在单层神经网络时,我们使用的激活函数是sgn函数。到了两层神经网络时,我们使用的最多的是sigmoid函数。而到了多层神经网络时,通过一系列的研究发现,ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。因此,目前在深度学习中,最流行的非线性函数是ReLU函数。ReLU函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是y=max(x,0)。简而言之,在x大于0,输出就是输入,而在x小于0时,输出就保持为0。这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。
在多层神经网络中,训练的主题仍然是优化和泛化。当使用足够强的计算芯片(例如GPU图形加速卡)时,梯度下降算法以及反向传播算法在多层神经网络中的训练中仍然工作的很好。目前学术界主要的研究既在于开发新的算法,也在于对这两个算法进行不断的优化,例如,增加了一种带动量因子(momentum)的梯度下降算法。 
在深度学习中,泛化技术变的比以往更加的重要。这主要是因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。因此正则化技术就显得十分重要。目前,Dropout技术,以及数据扩容(Data-Augmentation)技术是目前使用的最多的正则化技术。
3.9.4.5 影响
目前,深度神经网络在人工智能界占据统治地位。但凡有关人工智能的产业报道,必然离不开深度学习。
多层神经网络的研究仍在进行中。现在最为火热的研究技术包括RNN,LSTM等,研究方向则是图像理解方面。图像理解技术是给计算机一幅图片,让它用语言来表达这幅图片的意思。ImageNet竞赛也在不断召开,有更多的方法涌现出来,刷新以往的正确率。

3.9.5 总结
从单层神经网络(感知器)开始,到包含一个隐藏层的两层神经网络,再到多层的深度神经网络,一共有三次兴起过程。详见下图。

下面说一下神经网络为什么能这么火热?简而言之,就是其学习效果的强大。随着神经网络的发展,其表示性能越来越强。
从单层神经网络,到两层神经网络,再到多层神经网络,下图说明了,随着网络层数的增加,以及激活函数的调整,神经网络所能拟合的决策分界平面的能力。

可以看出,随着层数增加,其非线性分界拟合能力不断增强。图中的分界线并不代表真实训练出的效果,更多的是示意效果。
神经网络的研究与应用之所以能够不断地火热发展下去,与其强大的函数拟合能力是分不开关系的。
当然,光有强大的内在能力,并不一定能成功。一个成功的技术与方法,不仅需要内因的作用,还需要时势与环境的配合。神经网络的发展背后的外在原因可以被总结为:更强的计算性能,更多的数据,以及更好的训练方法。只有满足这些条件时,神经网络的函数拟合能力才能得已体现,见下图。

3.9.6 备注(了解即可)
神经网络虽然很重要,但是对于神经网络的学习,却并不容易。这些学习困难主要来自以下三个方面:概念,类别,教程。下面简单说明这三点。
3.9.6.1 概念
对于一门技术的学习而言,首先最重要的是弄清概念。只有将概念理解清楚,才能顺畅的进行后面的学习。由于神经网络漫长的发展历史,经常会有一些概念容易混淆,让人学习中产生困惑。这里面包括历史的术语,不一致的说法,以及被遗忘的研究等。 
历史的术语
这个的代表就是多层感知器(MLP)这个术语。起初看文献时很难理解的一个问题就是,为什么神经网络又有另一个名称:MLP。其实MLP(Multi-Layer Perceptron)的名称起源于50-60年代的感知器(Perceptron)。由于我们在感知器之上又增加了一个计算层,因此称为多层感知器。值得注意的是,虽然叫“多层”,MLP一般都指的是两层(带一个隐藏层的)神经网络。
MLP这个术语属于历史遗留的产物。现在我们一般就说神经网络,以及深度神经网络。前者代表带一个隐藏层的两层神经网络,也是EasyPR目前使用的识别网络,后者指深度学习的网络。
不一致的说法
这个最明显的代表就是损失函数loss function,这个还有两个说法是跟它完全一致的意思,分别是残差函数error function,以及代价函数cost function。loss function是目前深度学习里用的较多的一种说法,caffe里也是这么叫的。cost function则是Ng在coursera教学视频里用到的统一说法。这三者都是同一个意思,都是优化问题所需要求解的方程。虽然在使用的时候不做规定,但是在听到各种讲解时要心里明白。
再来就是权重weight和参数parameter的说法,神经网络界由于以前的惯例,一般会将训练得到的参数称之为权重,而不像其他机器学习方法就称之为参数。这个需要记住就好。不过在目前的使用惯例中,也有这样一种规定。那就是非偏置节点连接上的值称之为权重,而偏置节点上的值称之为偏置,两者统一起来称之为参数。
另外一个同义词就是激活函数active function和转移函数transfer function了。同样,他们代表一个意思,都是叠加的非线性函数的说法。
被遗忘的研究
由于神经网络发展历史已经有70年的漫长历史,因此在研究过程中,必然有一些研究分支属于被遗忘阶段。这里面包括各种不同的网络,例如SOM(Self-Organizing Map,自组织特征映射网络),SNN(Synergetic Neural Network,协同神经网络),ART(Adaptive Resonance Theory,自适应共振理论网络)等等。所以看历史文献时会看到许多没见过的概念与名词。
有些历史网络甚至会重新成为新的研究热点,例如RNN与LSTM就是80年代左右开始的研究,目前已经是深度学习研究中的重要一门技术,在语音与文字识别中有很好的效果。 
对于这些易于混淆以及弄错的概念,务必需要多方参考文献,理清上下文,这样才不会在学习与阅读过程中迷糊。
3.9.6.2 类别
下面谈一下关于神经网络中的不同类别。
本文的名字“神经网络浅讲”并不合适,因为本文研究的是前馈神经网络,是“神经网络”的一个子类。

神经网络其实是一个非常宽泛的称呼,它包括两类,一类是用计算机的方式去模拟人脑,这就是我们常说的ANN(人工神经网络),另一类是研究生物学上的神经网络,又叫生物神经网络。对于我们计算机人士而言,肯定是研究前者。
在人工神经网络之中,又分为前馈神经网络和反馈神经网络这两种。那么它们两者的区别是什么呢?这个其实在于它们的结构图。我们可以把结构图看作是一个有向图。其中神经元代表顶点,连接代表有向边。对于前馈神经网络中,这个有向图是没有回路的。你可以仔细观察本文中出现的所有神经网络的结构图,确认一下。而对于反馈神经网络中,结构图的有向图是有回路的。反馈神经网络也是一类重要的神经网络。其中Hopfield网络就是反馈神经网络。深度学习中的RNN也属于一种反馈神经网络。
具体到前馈神经网络中,就有了本文中所分别描述的三个网络:单层神经网络,双层神经网络,以及多层神经网络。深度学习中的CNN属于一种特殊的多层神经网络。另外,在一些Blog中和文献中看到的BP神经网络是什么?其实它们就是使用了反向传播BP算法的两层前馈神经网络。也是最普遍的一种两层神经网络。
通过以上分析可以看出,神经网络这种说法其实是非常广义的,具体在文章中说的是什么网络,需要根据文中的内容加以区分。

4 Tensorflow
谷歌开发的神经网络包,可以更好的融合python语言
Gpu加速只支持Linux系统,需要英伟达的cuda NVIDIA核
不支持windows系统
可以用于机器学习和深度神经网络研究
模型仓库:
安装:conda install tensorflow
4.1 CNN-MNIST
MNIST数据集分为两部分:训练集(mnist.train 60000)和测试集(mnist.test 10000);每一部分数据集由两部分组成:一张包含手写数字的图片(mnist.train.images)和一个对应的标签(mnist.train.labels)
问题
导入tensorflow.models.tutorials.rnn.ptb
from tensorflow.models.tutorials.rnn.ptb import reader
修改 ./models/tutorials/rnn/ptb/init.py ,将
import reader
import util
修改为
from . import reader
from . import util
导入

引入数据

4.2 CNN-CIFAR-10
4.2.1 安装models库
Tensorflow1.0版本以后移除了models库,作为第三方库包,需要进行安装。
(1)查找TensorFlow的安装路径
import tensorflow as tf
tf.path
(/home/python/anaconda3/lib/python3.7/site-packages/tensorflow)
(2)git安装
git clone --recurse-submodules https://github.com/tensorflow/models

5 扩展
5.1.1 图形在计算机中的存储
https://wenku.baidu.com/view/fd65ef7d11a6f524ccbff121dd36a32d7375c7a4.html
一个图可以用定义描述出来,也可以用图形表示出来(形象直观,在结点和边的数目很多时不是很方便),还可以同二元关系一样,用矩阵来表示。
图的矩阵表示
矩阵表示图法:平时需要用计算机来分析图并在图上执行各种过程和算法,因此必须把图的结点和边传输给计算机,由于集合与图形都不适合计算机处理,
两种形式:
邻接矩阵:用于研究图的各种道路问题
关联矩阵:常用于研究子图的问题
由于矩阵的行列有固定的顺序,因此在用矩阵表示图之前需要将图的结点和边加以编号(定序),以确定与矩阵元素的对应关系。

5.1.2 机器学习中三个典型的非线性函数
5.1.2.1 sgn 函数
sgn(x)叫做x的符号函数。sgn是sign的缩写。
它的定义是sgn(x)= 1 (x>0);
0 (x=0);
-1 (x<0).

5.1.2.2 sigmoid 函数

5.1.2.3 3. ReLU 函数
y=max(x,0)

这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值