《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

本书的作者是Keras之父,现任Google人工智能研究员的弗朗索瓦·肖莱(Francois chollet),很适合有了基础的神经网络概念,正准备学习使用框架的同学们。

第一部分 深度学习基础

1 什么是深度学习                

人工智能的简洁定义如下:努力将通常由人类完成的智力任务自动化。

早些年的专家相信只要程序员编写足够多的明确规则来处理知识,就可以实现与人类水平相当的人工智能。这被称为符号主义人工智能,在20世纪80年代的专家系统中这个方法的热度达到了顶峰

         查尔斯巴贝奇的分析机

人工智能的先驱阿兰·图灵发表的论文“计算机器与智能”,提出了图灵测试。

1 TURING A M. Computing machinery and intelligence [J]. Mind, 1950,59(236): 433-460.

机器学习的规则:输入数据点,预期输出的示例,衡量算法效果好坏的方法。

机器学习和深度学习的核心问题在于有意义地变换数据,学习输入数据的有用表示。比如说彩色图像可以用RGB格式或者是HSV(色相-饱和度-明度)格式来编码,对于不同的任务就需要不同的编码。

数据模型中有多少层就是模型的深度,其他名称包括分层表示学习(layered representations learning)和层级表示学习(hierarchical representations learning)。而深度学习中,分层表示一般都是通过神经网络的模型来学习得到的,神经网络的结构是逐层堆叠。

神经网络中每层对输入数据所做的具体操作保存在该层的权重中,权重就是该层的参数。损失函数,也叫目标函数,计算的是网络预测值与真实目标值之间的差距。利用优化器反向传播,逐步更新参数从而降低损失值。

马文 • 闵斯基是符号主义人工智能方法最有名的先驱和支持者之一,他在 1967 年宣称:“在一代人的时间内……将基本解决创造‘人工智能’的问题。”三年后的1970 年,他做出了更为精确的定量预测:“在三到八年的时间里,我们将拥有一台具有 人类平均智能的机器。虽然到现在看来这一目标仍然很遥远,但是可以看到在1967年国际上已经开始了人工智能的尝试,而这个时候国内在干什么呢?

机器学习简史

概率建模(probabilistic modeling)是统计学原理在数据分析中的应用。它是最早的机器学习形式之一,至今仍在广泛使用。其中最有名的算法之一就是朴素贝叶斯算法。 朴素贝叶斯是一类基于应用贝叶斯定理的机器学习分类器,它假设输入数据的特征都是独立的。这是一个很强的假设,或者说“朴素的”假设,其名称正来源于此。

另一个密切相关的模型是logistic 回归(logistic regression,简称logreg),它有时被认为是现代机器学习的“hello world”。不要被它的名称所误导——logreg 是一种分类算法,而不是回归算法。

贝尔实验室,1989年实现了首个应用,Yann LeCun将卷积神经网络的早期思想与反向传播算法相结合,并应用于手写数字分类问题,由此得到LeNet网络。用于读取信封上的邮政编码。

上世纪90年代,核方法的出现,使人们淡忘了神经网络,这是一组分类算法,其中最由名的是支持向量机(SVM,support vector machine)

2 VAPNIK V, CORTES C. Support-vector networks [J]. Machine Learning, 1995, 20(3): 273-297.

SVM目标是在属于两个不同类别的两组数据点之间找到良好决策边界(decision boundary)来解决分类问题。首先将数据映射到一个高维表示,决策边界就可以用一个超平面表示,然后尽量让超平面与每个类别最近的数据点之间的距离最大化,从而计算出良好决策边界(分割超平面),这一步叫间隔最大化。

核函数将原始空间中的任意两点映射为这两点在目标表示空间中的距离,完全避免了对新表示进行直接计算。但是SVM很难扩展到大型数据集,并且在图像分类等感知问题上的效果也不好。

决策树是类似于流程图的结构,可以对输入数据点进行分类或根据给定输入来预测输出值。

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

随机森林算法,引入了一种健壮且实用的决策树学习方法,即首先构建许多决策树,然后将它们的输出集成在一起。

         梯度提升机(gradient boosting machine)也是将弱预测模型(通常是决策树)集成的机器学习技术。它使用了梯度提升方法,通过迭代地训练新模型来专门解决之前模型的弱点,从而改进任何机器学习模型的效果。将梯度提升技术应用于决策树时,得到的模型与随机森林具有相似的性质,但在绝大多数情况下效果都比随机森林要好。

 

虽然神经网络几乎被整个科学界完全忽略,但仍有一些人在继续研究神经网络,并在2010 年左右开始取得重大突破。这些人包括:多伦多大学Geoffrey Hinton 的小组、蒙特利尔大学的 Yoshua Bengio纽约大学的 Yann LeCun 和瑞士的 IDSIA

转折来自2011年,2012年,ImageNet比赛,之后的冠军都是使用深度卷积神经网络。

相比于机器学习技术(浅层学习),仅将输入数据变换到一两个连续的表示空间,比如高维非线性投影(SVM)或者决策树。一般,人们要让初始输入数据更适合用这些方法处理,也必须手动为数据设计好的表示层,这叫作特征工程。

深度学习从数据中进行学习时有两个基本特征:第一,通过渐进的、逐层的方式形成越来 越复杂的表示;第二,对中间这些渐进的表示共同进行学习。

2016 年和2017 年,Kaggle 上主要有两大方法:梯度提升机和深度学习。具体而言,梯度提升机用于处理结构化数据的问题,而深度学习则用于图像分类等感知问题。使用前一种方法的人几乎都使用优秀的XGBoost 库,它同时支持数据科学最流行的两种语言:Python R 使用深度学习的Kaggle 参赛者则大多使用Keras 库,因为它易于使用,非常灵活,并且支持 Python 要想在如今的应用机器学习中取得成功,你应该熟悉这两种技术:梯度提升机,用于浅层 学习问题;深度学习,用于感知问题。用术语来说,你需要熟悉XGBoost Keras,它们是目 前主宰 Kaggle 竞赛的两个库。有了本书,你已经向这个目标迈出了一大步。

长短期记忆(LSTMlong short-term memory)算法是深度学习处理时间序列的基础。但是这个算法1989年已经有了,为什么现在才获得了发展?

主要是因为:

硬件

数据集和基准

算法的改进

硬件:今天,NVIDIA TITAN X(一款游戏GPU,在2015 年底售价1000 美元)可以实现单 精度6.6 TFLOPS 的峰值,即每秒进行6.6 万亿次 float32 运算。2016Google展示了张量处理器TPU项目。比最快的GPU还要快10倍,就是为了运行深度神经网络。

数据:ImageNet数据集,大规模视觉识别挑战赛(ILSVRC

算法:更好的神经层**函数,更好的权重初始化方案,一开始还有逐层预训练的方法,后来被放弃了;更好的优化方案(RMSPropAdam

深度学习大众化:Theano TensorFlow 是两个符号式的张量运算的Python 框架,都支持自动求微分,这极大地简化了新模型的实现过程。Keras 等用户友好型库则使深度学习变得像操纵乐高积木一样简单。Keras 2015 年初发布,并且很快就成为大量创业公司、研究生和研究人员转向该领域的首选深度学习解决方案。

 

2 神经网络的数学基础

在机器学习中,分类问题中的某个类别叫作类(class)。数据点叫作样本(sample)。某个样本对应的类叫作标签(label)。

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

上面的网络包括两个dense层,也就是密集连接(全连接)的神经层,最后是一个10路的softmax层,将返回由10个概率值(和为1)组成的数组。

要训练网络,还需要三个参数:

损失函数(网络如何衡量在训练数据上的性能)

优化器:基于训练数据和损失函数来更新网络的机制

在训练和测试过程中需要监控的指标,比如说精度

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

数据的预处理,正则处理

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

还需要对标签进行分类编码

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

然后进行训练

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

不到20行代码就实现了神经网络的构造和训练。

最终实现图像如下:

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

对测试集进行测试并显示,发现与训练集还有差距,这就是过拟合。

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

张量的概念:是一个数据容器,矩阵就是二维张量,张量是矩阵向任意维度的推广,张量的维度通常叫作轴。

标量就是零维的张量,ndim属性可以查看一个numpy张量轴的个数;向量是一维张量,是数字组成的数组;矩阵是向量组成的数组,是二维张量;

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

再往上还有3D张量,4D张量。深度学习处理视频数据时可能会遇到5D张量。

针对之前的mnist数据集,用matplotlib显示                               

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

此处还有问题,主要是matplotlib中的imshow的参数设置不太清楚

又试了一下,如果将digit定义在训练之前,就可以显示

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

这么说来可能是因为reshapeastype这些函数改变了格式

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

这是一些索引的例子

对于这种批量张量,第一个轴(0轴)叫作批量轴(batch axis)或批量维度(batch dimension)。

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

图像张量的形状有两种约定:通道在后(channels-last)的约定(在 TensorFlow 中使用)和 通道在前(channels-first)的约定(在Theano 中使用)。Google TensorFlow 机器学习框架将 颜色深度轴放在最后:(samples, height, width, color_depth)。与此相反,Theano 将图像深度轴放在批量轴之后:(samples, color_depth, height, width)

 

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

实践中处理numpy数组时,这些运算会交给安装好的基础线性代数子程序(BLASbasic linear algebra subprograms)实现,BLAS是低层次的、高度并行的、高效的张量操作程序

张量的点积,在numpykeras中,都是使用标准的dot

点积可以推广到具有任意个轴的张量。最常见的应用可能就是两个矩阵之间的点积。对于两个矩阵 x y,当且仅当 x.shape[1] == y.shape[0] 时,你才可以对它们做点积 dot(x, y))。得到的结果是一个形状为 (x.shape[0], y.shape[1]) 的矩阵,其元素为 x 的行与 y 的列之间的点积。

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

矩阵的转置,transpose

通常来说,仿射变换、旋转、缩放等基本的几何操作都可以表示为张量运算。举个例子,要将 一个二维向量旋转 theta 角,可以通过与一个 2×2矩阵做点积来实现,这个矩阵为 R = [u, v],其 uv都是平面向量:u = [cos(theta), sin(theta)]v = [-sin(theta), cos(theta)]

         深度学习的纸球例子,为复杂的、高度折叠的数据流形找到简洁的表示。

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

也就是SGD

相比于SGD,还可以每次迭代只抽取一个样本和目标,就是真SGD;每一次迭代都在所有数据上运行,就是批量SGD,这种方法更新更准确,但是计算代价更高。

SGD的变体,比如带动量的SGDAdagradRMSProp,这些变体被称为优化方法或优化器。动量方法的实现过程是每一步都移动小球,不仅要考虑当前的斜率值(当前的加速度),还要考虑当前的速度(来自于之前的加速度)。这在实践中的是指,更新参数 w 不仅要考虑当前的梯度值,还要考虑上一次的参数更新。

《Deeplearning with python》读书笔记-第一部分深度学习基础、数学基础

链式法则用到神经网络梯度值得运算中就得到了反向传播算法。

这一部分差不多就结束了,下一部分将介绍神经网络和机器学习的基础知识和应用以及keras。