神经网络模型Neural network models

神经网络模型是模拟人类神经网络工作原理进行自我学习和演化的一种数据工作方法。神经网络在系统辨识、模式识别、智能控制等领域应用广泛,尤其在智能控制中被视为解决自动控制中控制器适应能力这个难题的关键钥匙之一。

神经网络理论是巨量信息并行处理和大规模平行计算的基础,是高度非线性动力学系统,又是自适应组织系统,可用来描述认知、决策及控制的智能行 为.它的中心问题是智能的认知和模拟,更重要的是它具有“认知”、“意识”和“感情”等高级大脑功能。它再一次拓展了计算概念的内涵,使神经计算、进化计算成为新的学科,神经网络的软件模拟得到了广泛的应用。

既然神经网络模型是模拟人类神经网络的工作原理,那么首先来了解下人类的神经网络(也就是大脑)是如何工作的。

人类的大脑从外到内可以简单分为两层:灰色的外层 和白色的内层。

灰色的外层也称为“灰质”,但其实正常工作下的大脑(或者叫“活体”)是粉红色的,只是我们看到的大脑一般都是经过福尔马林固定的大脑,因此呈现灰色。灰色层只有几毫米厚,其中紧密地压缩着几十亿个被称作neuron(神经细胞、神经元)的微小细胞。

白色层在皮层灰质的下面,占据了皮层的大部分空间,是由神经细胞相互之间的无数连接线组成。皮层象核桃一样起皱,这可以把一个很大的表面区域塞进到一个较小的空间里。这与光滑的皮层相比能容纳更多的神经细胞。人的大脑大约含有10G(即100亿)个这样的微小处理单元而一只蚂蚁的大脑大约也有250000个。

人类神经网络Neural network 11

上图就是其中一个神经网络细胞或者叫神经元,这是我们用来做神经网络模型的关键,它的作用相当于电脑内的CPU,只不过一个人会有100亿个CPU在同时工作。

从图中可以看出,一个神经网络细胞由树突、细胞体、轴突和轴突末梢组成。

  1. 树突的末梢和其他神经细胞的树突相连接,用来接收收入的信号,这些信号来源于其他神经细胞。每个神经细胞通过它的树突和大约10000个其他的神经细胞相连。这就使得你的头脑中所有神经细胞之间连接总计可能有l000000000000000个。
  2. 细胞体用来处于接收到的所有信号并最终形成处理结果。利用电-化学过程交换信号,当收到来自于树突的信号后,通过某种机制,将不同的信号进行处理(例如可能是加权或更复杂的算法,目前还不得而知),最终得出该信号的处理结果是兴奋还是不兴奋。尽管每一个神经细胞仅仅工作于大约100Hz的频率,但由于数量巨大且并行工作,可以处理及其复杂的数据量和数据信号,且具有一定的自我学习、演进、修复等能力。
  3. 轴突和轴突末梢将细胞体处理的结果反馈给其他神经细胞。

因此,每个神经细胞的工作过程是,当从其他神经细胞接收到信号后,经过自身的综合处理,把得到的结果传递给其他神经细胞。整个人大脑中由于存在数以亿计的神经细胞,而这些细胞又可以并行工作,因此可以在非常短时间内完成外部信号的处理并将处理结果反馈给人体机能组织,然后做出信息反馈。

弄清楚人类大脑的工作机制之后,基于此的神经网络基本思想就比较明确了:

  • 首先神经网络中需要有接收信号的主体,类似于树突和树突末梢。
  • 其次需要有一个类似于细胞体的结构来综合处理接收到的信号。
  • 最后通过一个的机制就处理完成的信号发送出去,类似于轴突的工作。

单个人工神经元到底是什么样子?简单来讲可以想象成如下图的过程:

模拟人类神经网络Neural network 11信号经过外部输入到底“人工神经元”进行处理,然后将处理结果传递给其他人工神经元。

但实际情况肯定要比我们这样“简单”构造的情况复杂的多。例如,可能不是所有接收到的不同的信号来源的“强度”都是相同的,因此每个来源都会有一个权重w。假设一个神经元有n个信号来源,那么来源的信号的求和过程就会变成每个信号的值乘权重,用以下表达式来表示输入信号:

x1w1+x2w2+x3w3+..+xnwn

进行简化后可以写成:

20141213203322596

在模拟信号输入和传递的过程中,我们已经假设结果包括兴奋和不兴奋两类,那么我们可以用1和0表示,1代表兴奋,0代表不兴奋。因此,我们得到x取值范围是一个0和1的有限集合[0,1];在构造权重的过程中,不同的信号来源的强度既有大小之分,也有正负之别,因此我们可以都转换到[-1,1]之间(任何一个序列都可以进行标准化转换到一定的区间内),所以得到w的取值范围是[-1,1]。

在人工模拟的神经元的阶段,通过上面的加权求和是一种简单的构造方式,但最终得出的结果是会是一个浮点数或整数sum,如何将sum转换成1或者0,这里会假设有一个阀值:当高于这个阀值时结果为1,当地域这个阀值时结果为0(这个逻辑跟SVM类似,结果大于0那么输出为1,结果小于0结果输出为-1)。

每个神经元的计算逻辑搞清楚了,下面举一个例子来说明如何在单个神经元里计算得分。假设一个神经元有4个信号输入分别为X1、X2、X3、X4,其值分别为1,0,0,1;权重分别为0.1,-0.6,0.9,-0.4。那么单个神经元的初步计算得分为:

sum = 1*0.1 + 0*(-0.6)+0*0.9 + 1*(-0.4) = -0.3

现在的问题就是如何确定一个阀值,使得-0.3被正确的识别为0或1. 这个过程会由一个函数来具体定义,叫做激发函数,最常见的有S型、阶跃型和线性型三种形式。

S型又称为Sigmoid 或Sigmoidal ,名如其意,其形状就是一个S形曲线,可以使用反正切函数arctan或指数函数exp来实现,如f(x)=arctan(x)/(pi/2), f(x)=1/(1+e-x)。其形状如下:

4933130441930973522

阶跃型则是sigmoid函数的不可导版本,当输入X在某个区间内时,输入f(x)取固定值。其图形如下:

QQ截图20150507154721

线性型则是一种简单的f(x) = ax + b的一种形式,如下图:

QQ截图20150507154449

实际上,关于每个输入信号的权重w以及阀值函数都需要经过大量的训练得以强壮,例如一个婴儿刚出生不知道哪个人是爸爸,哪个人是妈妈,但在经过大量的训练(婴儿训练及自我学习和成长)之后,便可以准确识别。


上面只是介绍了单个人工神经元的工作过程,实际上真正工作中需要很多甚至成千上万(人类就以亿计算)个神经元组成神经网络进行综合处理。人工神经网络(或者叫神经网络模型)是如何构成并工作的?

常见的神经网络模型包括BP神经网络模型、Hopfield神经网络模型、ART神经网络模型等,除此以外,还包括双向联想存储器(BAM)、oltzmann机(BM)、对流传播网络(CPN)、Madaline算、认知机(Neocogntion)和感知器(Perceptron)等。。

BP(Back Propagation)神经网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。BP网的短处是训练时间较长,且易陷于局部极小。BP神经网络模型是监督式学习的一种。

Hopfiled神经网络是一种递归神经网络,是一种结合存储系统和二元系统的神经网络。它保证了向局部极小的收敛,但收敛到错误的局部极小值(local minimum),而非全局极小(global minimum)的情况也可能发生。Hopfiled网络也提供了模拟人类记忆的模型。短处为计算代价较高,而且需要对称连接。Hopfiled神经网络属于监督式学习的一种。

ART神经网络模型,又称自适应谐振理论模型,是一个根据可选参数对输入数据进行粗略分类的网络。ART-1用于二值输入,而ART-2用于连续值输入。ART的不足之处在于过份敏感,输入有小的变化时,输出变化很大。 ART神经网络模型属于非监督式学习。

在下面的案例中,我们使用Python 的机器学习库SKlearn中的Restricted Boltzmann machines (RBM)算法来进行非监督式学习,目的是提取图像识别中的关键特征,常用于机器学习或数据挖掘前的特征提取或选择的工作。

  1. #coding:utf-8
  2. import numpy as np
  3. from sklearn import linear_model, datasets, metrics
  4. from sklearn.cross_validation import train_test_split
  5. from sklearn.neural_network import BernoulliRBM
  6. from sklearn.pipeline import Pipeline
  7. # 加载数据
  8. digits = datasets.load_digits()
  9. X = np.asarray(digits.data, 'float32')
  10. Y = np.asarray(digits.target, 'float32')
  11. X = (X - np.min(X, 0)) / (np.max(X, 0) + 0.0001)
  12. X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
  13. # 模型建立
  14. logistic = linear_model.LogisticRegression()
  15. rbm = BernoulliRBM(random_state=0, verbose=True)
  16. classifier = Pipeline(steps=[('rbm', rbm), ('logistic', logistic)])
  17. # 训练模型
  18. rbm.learning_rate = 0.06
  19. rbm.n_iter = 20
  20. rbm.n_components = 100
  21. logistic.C = 6000.0
  22. # 基于RBM-Logistic Pipeline训练模型
  23. classifier.fit(X_train, Y_train)
  24. # 基于原始数据集Logistic regression训练模型 
  25. logistic_classifier = linear_model.LogisticRegression(C=100.0)
  26. logistic_classifier.fit(X_train, Y_train)
  27. # 效果评估
  28. print("Logistic regression using RBM features:\n%s\n" % (
  29.     metrics.classification_report(
  30.         Y_test,
  31.         classifier.predict(X_test))))
  32. print("Logistic regression using raw pixel features:\n%s\n" % (
  33.     metrics.classification_report(
  34.         Y_test,
  35.         logistic_classifier.predict(X_test))))


输出的结果为:

  1. Logistic regression using RBM features:
  2.              precision    recall  f1-score   support
  3.         0.0       1.00      1.00      1.00        27
  4.         1.0       0.97      0.94      0.96        35
  5.         2.0       1.00      0.92      0.96        36
  6.         3.0       0.91      1.00      0.95        29
  7.         4.0       0.97      0.97      0.97        30
  8.         5.0       0.97      0.97      0.97        40
  9.         6.0       1.00      1.00      1.00        44
  10.         7.0       0.93      0.97      0.95        39
  11.         8.0       0.97      0.92      0.95        39
  12.         9.0       0.95      0.98      0.96        41
  13. avg / total       0.97      0.97      0.97       360
  14. Logistic regression using raw pixel features:
  15.              precision    recall  f1-score   support
  16.         0.0       1.00      1.00      1.00        27
  17.         1.0       0.91      0.89      0.90        35
  18.         2.0       0.97      0.94      0.96        36
  19.         3.0       0.90      0.97      0.93        29
  20.         4.0       0.94      1.00      0.97        30
  21.         5.0       0.95      0.97      0.96        40
  22.         6.0       0.98      0.98      0.98        44
  23.         7.0       1.00      0.95      0.97        39
  24.         8.0       0.92      0.90      0.91        39
  25.         9.0       0.95      0.95      0.95        41
  26. avg / total       0.95      0.95      0.95       360


 

通过结果我们看到,基于Restricted Boltzmann machines (RBM)提取后的Logistic预测准确率由95%提高到97%,准确性有所提升。

Restricted Boltzmann machines (RBM)是一种基于概率轮的非线性学习算法,属于非监督式学习的一种,它在非线性特征提取中场景中的效果也不错。

Restricted Boltzmann machines (RBM)可调节的参数如下:

 

  1. class sklearn.neural_network.BernoulliRBM(n_components=256, learning_rate=0.1, batch_size=10, n_iter=10, verbose=0, random_state=None)[source]


 


 

尾巴

神经网络模型是一个跨学科的综合性领域,目前尚未清楚人类的大脑到底是如何工作的,而基于神经元和多种神经网络模型的挖掘也只是模拟或探索人类大脑工作进程中宝贵知识的冰山一角而已。神经网络模型由于具有模拟人类思维和工作方法的潜力,因此未来可能会成为“数字智能”的代表工作方法之一,也会成为所有“智能”控制领域的核心。但时间还很久,路还很长。


====================【好书推荐,我为自己代言】====================

《Python数据分析与数据化运营》上市啦!

50+数据流工作知识点
14个数据分析与挖掘主题
8个综合性运营分析案例
涵盖会员、商品、流量、内容4大主题
360°把脉运营问题并贴合数据场景落地


本书主要基于Python实现,其中主要用到的计算库是numpy、pandas和sklearn,其他相关库还包括:
  • 标准库:re、time、datetime、json、 base64、os、sys、cPickle、tarfile
  • 统计分析:Statsmodels
  • 中文处理:结巴分词
  • 文本挖掘:Gensim
  • 爬虫和解析:requests、Beautiful Soup、xml
  • 图像处理:OpenCV和PIL
  • 数据读取:xlrd、pymongo、mysql.connector
  • 数据预处理:imblearn
  • 展示美化类:Matplotlib、graphviz、prettytable、wordcloud、mpl_toolkits、pydotplus
如果你对以下内容感兴趣,那么本书将值得一看:
  • KMeans聚类的自动K均值的确立方法
  • 基于软方法的多分类模型组合评估模型的应用
  • 基于自动下探(下钻、细分)的应用
  • 基于增量学习的多项式贝叶斯分类
  • pipeline管道技术的应用
  • 基于超参数的自动参数值的优化方法
  • 特征自动选择
  • 文本分类、文本主题挖掘
  • 基于自动时间序列ARIMA的P、D、Q的调整
  • python决策树规则输出
  • 基于自定义图像的文本标签云
  • 非结构化数据,例如图像、音频、文本等处理
  • 对象持久化处理
有关这本书的写作感受、详细内容介绍、附件(含数据和代码源文件-源代码可更改数据源直接使用)下载、关键知识和方法以及完整书稿目录,请访问《Python数据分析与数据化运营》新书上线,要购买此书请直接点击图片或扫描二维码去京东购买

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>