10. 机器学习

数学建模

张瑞
中国科学技术大学数学科学学院

机器学习

人工神经网络

人工神经网络(Artificial Neural Network,即ANN )是在现代神经科学的基础上提出和发展起来的,旨在反映人脑结构及功能的一种抽象数学模型。自 1943 年美国心理学家 W. McCulloch 和数学家 W. Pitts 提出形式神经元的抽象数学模型—MP模型以来,人工神经网络理论技术经过了 50 多年曲折的发展。特别是 20 世纪 80 年代,人工神经网络的研究取得了重大进展,有关的理论和方法已经发展成一门界于物理学、数学、计算机科学和神经生物学之间的交叉学科。

它在模式识别,图像处理,智能控制,组合优化,金融预测与管理,通信,机器人以及 专家系统等领域得到广泛的应用,提出了 40 多种神经网络模型,其中比较著名的有感知机,Hopfield 网络,Boltzman 机,自适应共振理论及反向传播网络(BP)等。

神经元

最简单的神经网络仅由一个“神经元”(感知器, Perceptron)构成,以下即是这个“神经元”的图示:

mm-ann-unit

这个神经元是由$x_1$$\cdots$$x_p$和一个偏置(阈值)$b$ 作为输入,$w_{k1}$$\cdots$$w_{kp}$是他们的权重,输入节点后,得到输出

\[y_k=\phi(\sum_{i=1}^pw_{ki}x_i+b) \]

其中函数$\phi(x)$ 被称为激活函数

  • 激活函数通常是非线性的,而且值域有限制(一般是$[-1,1]$,或$[0,1]$)。
  • 激活函数可以分为 两大类
    • 饱和激活函数: sigmoid、 tanh
    • 非饱和激活函数: ReLU 、Leaky Relu 、ELU【指数线性单元】、PReLU【参数化的ReLU 】、RReLU【随机ReLU】它有很多取法,

常用的激活函数

  • Sigmoid函数 $f(x)=\frac{1}{1+e^{-x}}$
  • 阈值函数(称为M-P模型) $ f(x)=\begin{cases}1, x\geq 0 \\0, x<0\end{cases} $
  • 双曲正切函数 $f(x)=\tanh(x)=\frac{1-e^{-x}}{1+e^{-x}}$
  • relu (Rectified linear unit; 修正线性单元 ; 深度学习目前最常用的激活函数)
    \[f(x)=\max(0,x) \]

神经网络

神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。

网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

目前已有的数十种神经网络模型,目前主要有以下几种类型:前向型反馈型随机型竞争型

前向型:   前馈神经网络是指神经元分层排列,由输入层,隐藏层和输出层构成,其中隐藏层可能会有多层。这种神经网络的每一层的神经元只接受前一层神经元的输入,后面的层对于前面的层没有信号反馈。每一层对于输入数据进行一定的转换,然后将输出结果作为下一层的输入,直到最后输出结果。

  其中,目前广泛应用的BPNN(Back Propagation Neural Network, 后向传播神经网络)就属于这种网络类型。

反馈型:   反馈网络又称回归网络,输入信号决定反馈系统的初始状态,系统经过一系列状态转移后逐渐收敛于平衡状态,因此,稳定性是反馈网络最重要的指标之一,比较典型的是Hopfield神经网络。

  Hopfield神经网络用于非线性动力学问题分析,已在联想记忆和优化计算中得到成功的应用.

随机型:   具有随机性质的模拟退火(SA)算法解决了优化计算过程陷于局部极小的问题,并已在神经网络的学习及优化计算中得到成功的应用.

竞争型:   自组织神经网络是无教师学习网络,它模拟人脑行为,根据过去经验自动适应无法预测的环境变化,由于无监督,这类网络通常采用竞争原则进行网络学习,自动聚类。目前广泛用于自动控制、故障诊断等各类模式识别中.

一个多层前向型神经网络如下图:

mm-ann-network

最左边一层是输入层,中间是隐藏层,右侧是输出层输入层以及隐藏层每个节点代表一个神经元。每一层和下一层之间对应的也有一个权重矩阵$w$

这个简单的神经网络的整个过程是,将输入$x$与权重矩阵$w$结合,以$wx + b$的形式输入隐藏层(Layer L2),经过激活函数$f(x)$的处理,得到输出结果$a_1$,$\cdots$, 然后与对应的权重,偏置结合,作为输出层(Layer L3)的输入,经过激活函数,得到最终输出结果。

例 1. 蠓虫分类问题可概括叙述如下:生物学家试图对两种蠓虫(Af 与 Apf)进行鉴别, 依据的资料是触角和翅膀的长度,已经测得了 9 支 Af 和 6 支 Apf 的数据如下:

Af: (1.24,1.27),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),
    (1.40,1.70), (1.48,1.82),(1.54,1.82),(1.56,2.08).
Apf: (1.14,1.82),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).

现在的问题是:

  • 根据如上资料,如何制定一种方法,正确地区分两类蠓虫。
  • 对触角和翼长分别为(1.24,1.80),(1.28,1.84)与(1.40,2.04)的 3 个标本,用所得 到的方法加以识别。
  • 设 Af 是宝贵的传粉益虫,Apf 是某疾病的载体,是否应该修改分类方法。

如上的问题是有代表性的,它的特点是要求依据已知资料(9 支 Af 的数据和 6 支 Apf 的数据)制定一种分类方法,类别是已经给定的(Af 或 Apf)。今后,我们将 9 支Af 及 6 支 Apf 的数据集合称之为学习样本

mm10-ex-apf

使用如图所示的人工神经网络。$I_1$, $I_2$为输入(只有翅长和触角长两个参数),$O_1$, $O_2$为输出,使用sigmoid 激活函数。则

\[\begin{aligned} O_i=&\phi(\sum_{j=1}^3w_{ij}H_j), \\ H_j=&\phi(\sum_{k=1}^2\bar w_{jk}I_k) \end{aligned} \]

需要选定一组适当的权值$w_{ij}$, $\bar w_{ij}$,使得对应于学习样本中任何一组Af样品的输出为$(1,0)$,对于Apf样品输出为$(0,1)$。这样,当新的样品输入时,看它的输出靠近$(0,1)$还是$(1,0)$就可以进行分类判别。

对于一个多层网络,如何求得一组恰当的权值,使网络具有特定的功能,在很长一 段时间内,曾经是使研究工作者感到困难的一个问题,直到 1985 年,美国加州大学的 一个研究小组提出了所谓反向传播算法(Back-Propagation),使问题有了重大进展,这 一算法也是促成人工神经网络研究迅猛发展的一个原因。

BP神经网络的应用场景

  1. 模式识别。模式识别通常是指对表征事物或现象的各种形式的(数值的、文字的和逻辑关系的)信息进行处理和分析,以便确定他们属于哪种类别。
  2. 函数逼近。对于一些表达式过于复杂的函数,或者是难以表达的函数,我们可以利用神经网络来无限逼近他们,对他们进行模拟。
  3. 预测。先利用一些已知的数据对网络进行训练,然后再利用这个训练好的网络来对新来的数据进行预测。相比于传统的方法来说,神经网络提高了准确度,并且只需要较少的数据。
  4. 数据压缩

BPNN的优点

  • 实现了输入输出的非线性映射。也就是说我们可以利用神经网络来逼近任何一个非线性的连续函数。
  • BP神经网络使用了梯度下降算法。使得我们可以对参数进行优化以减小误差,得到更优的结果。
  • 具有一定的泛化能力。
    • BP神经网络可以以较少的样本数据来训练生成一个网络,而这个网络能在一定的范围内保证一定的精度。
    • 当新的数据进入网络进行训练的时候,神经网络能够在调整权值以适应更多的数据。
  • BP神经元模型的激活函数采取了可微单调递增函数,如sigmoid的logsig、tansig函数和线性函数pureline。
  • BP网络的最后一层神经元的特性决定了整个网络的输出特性。
    • 当最后一层神经元采用sigmoid类型的函数时,那么整个神经元的输出都会被限制在一个较小的范围内,
    • 如果最后一层的神经元采用pureline型函数,则整个网络的输出可以是任意值。

缺点:

  • 局部极小化问题。BP神经网络采用的是梯度下降的算法,有可能会产生局部最小值。这种特性会使算法陷入局部极值,权值收敛到局部极小点,从而导致网络训练失败。
  • BP 神经网络算法的收敛速度慢。
  • 网络结构的设计。即隐含层的数目以及每个隐含层节点的个数的选择,目前无理论指导;
  • BP神经网络预测能力和训练能力的矛盾问题。当达到极限时,随着训练能力的提高,预测能力反而会下降,也即出现所谓“过拟合”现象。出现该现象的原因是网络学习了过多的样本细节导致,学习出的模型已不能反映样本内含的规律,所以我们在实战中应该把握好度。

应用

经典人工神经网络本质上是解决两大类问题:

  • 分类(Classification)是给不同的数据划定分界,如人脸识别,输入x 是人脸照片,输出y 是人的ID 号,这个值是一个整数。
  • 回归(Regression)问题要解决的是数据拟合,如人脸年龄预测,输入x 同样是人脸照片但输出y 是人的年龄,这个值是一个连续浮点数。
  • 在实际应用中,垃圾电子邮件自动标注是一个非常经典的分类问题实例,股票涨跌的预期则可看作一个回归问题。

对于分类问题来说,数据可以是有标签(Labeled)或者无标签的(Unlabeled),这对应了经典机器学习中的有监督学习(Supervised Learning)和无监督学习(Unsupervised Learning)。在机器学习中,对于无标签的数据进行分类往往被称作聚类(Clustering)。

  • 在实际应用中,有标签的数据往往比较难以获得(或者是会花比较高的代价才能获取,如人工标记),但是对有标签的数据进行有监督学习相对容易。
  • 无监督学习相对较难,但是无标签的数据相对容易获取。

Python sklearn 0.21 以上,含有分类与回归类

neural_network.BernoulliRBM([n_components, …])    Bernoulli Restricted Boltzmann Machine (RBM).
neural_network.MLPClassifier([…])    Multi-layer Perceptron classifier.
neural_network.MLPRegressor([…])    Multi-layer Perceptron regressor.

可以得到Apf分类结果

(2,2,2)
import numpy as np

# % 原始数据
Apf=np.array([[1.14,1.78],[1.18,1.96],[1.20,1.86],[1.26,2.00],[1.28,2.00],[1.30,1.96]]) #   %Apf蠓虫数据
Af=np.array([[1.24,1.72],[1.36, 1.74],[1.38,1.64],[1.38, 1.90],[ 1.40, 1.70],[1.48, 1.82], [1.38,1.82], [1.54,1.82], [1.56, 2.08]]) #  %Af蠓虫数据
x=np.array([[1.24,1.80],[1.29,1.81],[1.43,2.03]]) #    %待判蠓虫数据

# 准备训练数据
X_train=np.concatenate((Apf, Af))
y_train=np.concatenate((len(Apf)*[1.0],len(Af)*[2.0]))

from sklearn.neural_network import MLPClassifier
# Class MLPClassifier implements a multi-layer perceptron (MLP) algorithm that trains using Backpropagation.

clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
                    hidden_layer_sizes=(5, 2), random_state=1)

clf.fit(X_train, y_train)                         

print(clf.predict(x))

例 2. 公路运量预测: 公路运量包括公路的客运量和货运量。据研究,某地区的公路运量与该地区的人数、机动车数量和公路面积有关。现在有20年的数据,试对运量做出预测。

mm10-ex-road-ky mm10-ex-road-hy

#%原始数据 
#%人数(单位:万人)
sqrs=np.array([20.55, 22.44, 25.37, 27.13, 29.45, 30.10, 
30.96, 34.06, 36.42, 38.09, 39.13, 39.99, 41.93, 44.59, 
47.30, 52.89, 55.73, 56.76, 59.17, 60.63])
#%机动车数(单位:万辆)
sqjdcs=np.array([0.6, 0.75, 0.85, 0.9, 1.05, 1.35, 1.45, 
1.6, 1.7, 1.85, 2.15, 2.2, 2.25, 2.35, 2.5, 2.6, 2.7, 2.85, 2.95, 3.1])
#%公路面积(单位:万平方公里)
sqglmj=np.array([0.09, 0.11, 0.11, 0.14, 0.20, 0.23, 0.23, 
0.32, 0.32, 0.34, 0.36, 0.36, 0.38, 0.49, 0.56, 0.59, 0.59, 0.67, 0.69, 0.79])
#%公路客运量(单位:万人)
glkyl=np.array([5126.0, 6217, 7730, 9145, 10460, 11387, 12353, 
15750, 18304, 19836, 21024, 19490, 20433, 22598, 25107, 33442, 36836, 40548, 42927, 43462])
#%公路货运量(单位:万吨)
glhyl=np.array([1237.0, 1379, 1385, 1399, 1663, 1714, 1834, 4322, 
8132, 8936, 11099, 11203, 10524, 11115, 13320, 16762, 18673, 20724, 20803, 21804])
X_train=np.array((sqrs, sqjdcs, sqglmj)).T #np.concatenate((sqrs, sqjdcs, sqglmj))   #%输入数据矩阵

from sklearn import preprocessing

#归一化处理
min_max_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
X_train = min_max_scaler.fit_transform(X_train)
print("数据归一化")

#%公路客运量(单位:万人)
y = min_max_scaler.fit_transform(glkyl.reshape(-1, 1))
    from sklearn.neural_network import MLPRegressor
    
    # hidden layer sizes (3,7,2)
    #est = MLPRegressor( activation='logistic', max_iter=5000)
    # 数据集比较小(<1000),使用 lbfgs solver
    est = MLPRegressor( solver='lbfgs', max_iter=5000)

    # y=glkyl.T #%公路客运量(单位:万人)
    est.fit(X_train, y.ravel())
    y0=est.predict(X_train)

深度学习

深度学习(Deep Learning)是机器学习(machine learning)研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。

  • 深度学习是无监督学习的一种。
  • 深度学习简单可以理解为神经网络(neural network)的发展
    • 深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。
    • 深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

Deep learning与传统的神经网络的相同在于deep learning采用了神经网络相似的分层结构,系统由包括输入层、隐层(多层)、输出层组成的多层网络,只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个logistic regression模型;这种分层结构,是比较接近人类大脑的结构的。

大约二三十年前,neural network曾经是机器学习领域特别火热的一个方向,但是后来确慢慢淡出了,原因包括以下几个方面:

  1. 比较容易过拟合,参数比较难调节,而且需要不少trick;
  2. 训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;

而为了克服神经网络训练中的问题,DL采用了与神经网络很不同的训练机制

  • 传统神经网络中,采用的是back propagation的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和label之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。
  • 而deep learning整体上是一个layer-wise的训练机制。这样做的原因是因为,如果采用back propagation的机制,对于一个deep network(7层以上),残差传播到最前面的层已经变得太小,出现所谓的gradient diffusion(梯度扩散)。

2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步

  1. 首先逐层构建单层神经元,这样每次都是训练一个单层网络。
  2. 当所有层训练完后,Hinton使用wake-sleep算法进行调优。

深度学习库

  • Caffe 是由Berkeley Vision and Learning Center(BVLC)建立的深度学习框架。Caffe本身并不是一个Python库,但它提供绑定到Python上的编程语言。
  • Theano 是一个Python库,用来定义、优化和评估涉及多维数组的数学表达式。Theano通过与numpy的紧密集成,透明地使用GPU来完成这些工作。Theano是神经网络的基石
  • TensorFlow 是使用数据流图进行数值计算的开源库(这是所有神经网络固有的特征)。最初由谷歌的机器智能研究机构内的Google Brain Team研究人员开发,此后库一直开源,并提供给公众。
  • PyTorch 是Facebook用Python写的一个全新的深度学习框架。它GPUs计算,在计算效率上要比NumPy有更明显的优势;PyTorch还拥有丰富的API,可以快速完成深度神经网络模型的搭建和训练。
  • Lasagne 是Theano中用于构建和训练网络的轻量级库。而nolearnLasagne 包装成了更具人性化的API
  • Keras 是一个最低限度的、模块化的神经网络库,可以使用Theano或TensorFlow作为后端。Keras的问题是它不支持多GPU环境中并行地训练网络。
  • Mxnet 库真正出色的是分布式计算,它支持在多个CPU / GPU机训练你的网络,甚至可以在AWS、Azure以及YARN集群。
  • Pylearn2不仅仅是一般的机器学习库(地位类似于scikit-learn),也包含了深度学习算法的实现。

人工智能

人工智能诞生于1950年代,当少部分的计算机科学初期领域的先驱开始探讨计算机是否可以思考该问题的一个分支我们现在仍在探索:使通常由人类完成的智力任务自动化的努力。

因此,人工智能是一个包含机器学习深度学习的通用领域,但它也包含了更多不涉及任何学习的方法。

例如,早期的国际象棋程序只涉及由程序员制定的硬编码规则,不具备机器学习的特性。在相当长的一段时间里,许多专家认为,通过让程序员手工制作一套足够大的明确的规则来操纵知识,可以实现人类水平的人工智能。这种方法被称为符号(symbolic)人工智能

  • 符号AI适用于解决定义明确的逻辑问题,如下棋,
  • 但要找出解决更复杂、模糊的问题,对于明确规则却是很难的,比如图像分类、语音识别和语言翻译。
  • 一种取代符号人工智能的新方法出现了:机器学习

机器学习

  • 与程序员手工制定数据处理规则不同,计算机能通过查看数据自动学习这些规则吗?
  • 在经典编程中,符号AI的范例,人类根据这些规则输入规则(程序)和要处理的数据,然后得到答案。
  • 通过机器学习,人们输入数据以及从数据中得到的答案,然后得出规则。然后,这些规则可以应用于新数据,以生成原始答案。
  • 机器学习系统是经过训练而不是明确编程的。它提供了许多与任务相关的示例,并在这些示例中找到了统计结构,最终允许系统提出自动化任务的规则。

尽管机器学习在上世纪90年代才开始蓬勃发展,但它很快就成为人工智能最受欢迎、最成功的子领域,这一趋势是由更快的硬件和更大的数据集的可用性推动的。

  • 机器学习与数理统计紧密相关,但它在几个重要方面与统计学不同。
  • 与统计学不同的是,机器学习倾向于处理大型复杂的数据集(例如数百万张图像的数据集,每个数据集由数万个像素组成),对于这些数据集,传统的统计分析(如贝叶斯分析)是不切实际的。

深度学习

深度学习机器学习的一个特定子领域: 从数据中学习表示的一种新方法,强调学习越来越有意义的表示的连续层(layers)。

  • 深度学习代表了连续层表示的思想。有多少层对数据模型有贡献被称为模型的深度。
  • 现代深度学习通常涉及数十甚至数百层连续的表示层——它们都是通过接触训练数据而自动学习的。
  • 与此同时,机器学习的其他方法倾向于只学习数据的一到两层表示;因此,他们有时被称为浅层学习
  • 在深度学习中,这些分层的表示(几乎总是)是通过神经网(neural networks)的模型来学习的,这些模型的结构是逐层堆叠在一起的文字层。

目录

Python库 sklearn 中的神经网络,没有GPU加速,只适用于小型应用 https://scikit-learn.org/stable/modules/neural_networks_supervised.html

https://blog.csdn.net/asd20172016/article/details/81454009 sklearn中神经网络使用的2个例子

https://blog.csdn.net/qq_29831163/article/details/89380235 一文弄懂神经网络中的BP反向传播算法 (python代码)

https://yq.aliyun.com/articles/412747?spm=a2c4e.11153940.blogcont397074.19.7eb15065LNZ4Xi 人工神经网络到底能干什么?到底在干什么?

https://blog.csdn.net/zouxy09/article/details/8775518?spm=a2c4e.11153940.blogcont326808.16.11524a54pywqES Deep Learning(深度学习)学习笔记整理系列之(三)

更一般地的分类模式识别)问题:

现给定$N$个模式向量$\mathbf{p}^1,\mathbf{p}^2,\cdots,\mathbf{p}^N\in\mathbb{R}^m$, 不失一般性,设前$M$个属于某一类而剩下的$N-M$个不属于该类。 如果模式集合线性可分,那么存在$m$维向量$\mathbf{w}=(w_1,w_2,\cdots,w_m)^T$及实数$\theta$使得

\[\left\{\begin{array}{ll} % \mathbf{w}^T\mathbf{p}^s-\theta>0, & s=1,\cdots,M \\ % \mathbf{w}^T\mathbf{p}^s-\theta<0, & s=M+1,\cdots,N % \end{array}\right. \]

成立。