1、第04章 神经网络p神经元p感知机p梯度下降法p随机梯度下降法p前向神经网络分类器pBP神经网络p玻尔兹曼机4.1 引言n 神经网络是一门受生物神经网络的启发而兴起的、发展迅速的交叉学科,涉及计算机、生物、数学、心理学、电子、认知科学等学科。n 人工神经网络可以设计出某些具有类似大脑功能的智能系统来处理各种信息,解决不同问题。如市场预测、数据分类、语音识别、文字识别、医疗诊断等。4.1.1人工神经网络的发展历程u 1890年,首次阐明了人脑结构功能和相关的学习联想记忆规则。u 1943年,神经元的基本特性,提出了神经元的数学模型,即M-P模型。u 1949年,神经元学习的一般规则,即Hebbi
2、n法则。u 1958年,历史上第一个具有学习型神经网络特点的模式识别装置,并给出了两层感知机的收敛定理;之后,又提出三层感知机模型。4.1 引言u 1960年代初期,自适应线性元结构,提出了Windrow-Hoff算法,主要应用于自适应系统。u 1969年,单层神经网络的功能局限性,发展走入低谷。u 20世纪80年代,成功求解NP完全的旅行商问题,研制了Boltzmann机;误差反向传播算法。u 1990年,神经网络集成方法。u 1997年,AdaBoost算法。u 2012年6月,吴恩达和谷歌科学家合作,用1.6万台计算机搭建并模拟了一个人脑神经网络。u 2015年5月,深度学习开始被学术界
3、接受。u 2016年3月,AlphaGo打败韩国围棋选手李世石。4.1 引言n 分布式存储信息n 并行协同处理信息n 信息处理与存储合二为一n 对信息的处理具有自组织、自学习的特点,便于联想、综合和推广4.1.2 人工神经网络的特点人工神经网络的特点4.1.3 人工神经网络的分类人工神经网络的分类n 前馈神经网络将神经元分层排列,分别是输入层、中间层和输出层。按照层数不同,划分为单层前馈神经网络和多层前馈神经网络。感知机、BP网络、RBF网络。n 反馈神经网络每个神经元同时将自身的输出信号作为输入信号反馈给其他神经元,Hopfield神经网络是反馈网络中最简单且应用广泛的模型。n 自组织神经网
4、络是无导师学习网络通常采用竞争原则进行网络学习。4.2 神经元模型神经元是神经网络的基本信息处理单位,是(人工)神经网络的设计基础。对于神经元的研究由来已久,1904年生物学家就已经知晓了神经元的组成结构。一个(生物)神经元主要由细胞体(Cell body)、树突(Dendrites)、轴突(Myelin Sheath)和突触(Synapse)等组成。树突是传入纤树突是传入纤维,轴突是传维,轴突是传出纤维。出纤维。4.2 神经元模型 神经元是神经网络的基本信息处理单位,组成结构。1943年,神经学家和解剖学家W.S.McCulloch和数理逻辑学家W.Pitts参考了生物神经元的结构,提出了形
5、似(生物)神经元的线性加权求和阈值模型,简称M-P模型。4.2 神经元模型n 神经元阈值函数:符号函数SgnLogistic函数n M-P神经元特点l多输入单输出l分为兴奋性输入和抑制性输入l空间整合特性和阈值特性l输入通过权值表征耦合程度l突触接头有时间延迟,网络的活动过程离散化4.3 感知机与多层神经网络n 美国计算机科学家Frank Rosenblatt于1957年发明了感知机,是最早的人工神经网络,是一种二元线性分类器。n 单层感知机是一个具有一层神经元、采用阈值激活函数的前向网络。4.3.1 感知机感知机4.3 感知机与多层神经网络4.3.1 感知机感知机4.3 感知机与多层神经网络
6、4.3.1 感知机感知机4.3 感知机与多层神经网络1.感知机训练感知机训练4.3 感知机与多层神经网络2.感知机神经网络的局限性感知机神经网络的局限性n 感知机神经网络的传输函数一般采用阈值函数,故输出只有两种(1或者0),所以只能用来解决简单的分类问题;n 单层感知机网络只能解决线性可分的分类问题,而对线性不可分的分类问题无能为力;n 感知机学习算法只适于单层感知机网络,所以一般感知机网络都是单层的。4.3 感知机与多层神经网络3.感知机实验感知机实验(a)线性可分 (b)线性不可分4.3 感知机与多层神经网络#训练感知机 def train(self,inputs,targets,eta
7、,nIterations):#偏置加入输入,构成4*3维矩阵 inputs=concatenate(inputs,-ones(self.nData,1),axis=1)#训练 for n in range(nIterations):#前向传播 self.outputs=self.forward(inputs)#修改权值 self.weights=self.weights+eta*dot(transpose(inputs),targets-self.outputs)#前向传播 def forward(self,inputs):outputs=dot(inputs,self.weights)ret
8、urn where(outputs 0.5,1,0)#输出阈值#输出 def prn(self):print(Percetrons weights:n,self.weights)print(Percetrons outputs:n,self.outputs)n 主要实现代码主要实现代码:4.3 感知机与多层神经网络inputs=array(0,0,0,1,1,0,1,1)#输入数据,也是测试数据targets=array(0,0,0,1)#AND运算的标签数据p=singlePerception(inputs,targets)#单层感知机对象p.train(inputs,targets,0.2
9、5,6)#训练感知机对象 p.prn()#输出结果n 运行结果:Percetrons weights:0.51900471 0.46993134-0.28361255Percetrons outputs:0001n 主程序(含输入数据):(续上)4.3.2 梯度下降法1.逻辑回归(Logistic Regression)4.3.2 梯度下降法1.逻辑回归(Logistic Regression)4.3.2 梯度下降法1.逻辑回归(Logistic Regression)4.3.2 梯度下降法1.逻辑回归(Logistic Regression)4.3.2 梯度下降法1.逻辑回归(Logisti
10、c Regression)4.3.2 梯度下降法2.梯度下降(gradient descent)4.3.2 梯度下降法2.梯度下降(gradient descent)4.3.3 随机梯度下降法4.3.4 多层神经网络1.二层前向二层前向神经网络神经网络4.3.4 多层神经网络1.二层前向二层前向神经网络神经网络4.3.4 多层神经网络1.二层前向神经网络4.3.4 多层神经网络#通过试错训练神经网络,每次微调突触权重 def train(self,trainingInputs,trainingOutputs,nTrainingIteration):for iteration in range(
11、nTrainingIteration):#将整个训练集传递给神经网络 output_from_layer_1,output_from_layer_2=self.predict(trainingInputs)#计算第二层的误差 layer2_error=trainingOutputs-output_from_layer_2 layer2_delta=layer2_error*self._sigmoid_derivative(output_from_layer_2)#计算第二层的权重调整量 layer2_adjustment=self.layer2.eta*output_from_layer_1.
12、T.dot(layer2_delta)#调整第二层的权重 self.layer2.weights+=layer2_adjustment#计算第一层的误差,得到第一层对第二层的影响 layer1_error=layer2_delta.dot(self.layer2.weights.T)layer1_delta=layer1_error*self._sigmoid_derivative(output_from_layer_1)#计算第一层的权重调整量 layer1_adjustment=self.layer1.eta*trainingInputs.T.dot(layer1_delta)#调整第一层
13、的权重 self.layer1.weights+=layer1_adjustmentn 实现代码:4.3.4 多层神经网络#二层神经网络的预测(第一层神经网络输出,第二层神经网络输出)def predict(self,inputs):output_from_layer1=self.sigmoid(dot(inputs,self.layer1.weights)output_from_layer2=self.sigmoid(dot(output_from_layer1,self.layer2.weights)return output_from_layer1,output_from_layer2#
14、训练集,XOR函数trainingInputs=array(0,0,0,1,1,0,1,1)trainingOutputs=array(0,1,1,0).T#初始化随机数种子random.seed(1)#创建第一层(4神经元,每个2输入)layer1=NeuronLayer(4,2)#创建第二层(单神经元,4输入)layer2=NeuronLayer(1,4)n 主程序(含训练数据):4.3.4 多层神经网络#组合成神经网络tlnn=TwoLayersNeuralNetwork(layer1,layer2)print(1)随机初始突触权重:)tlnn.print_weights()#用训练集训
15、练神经网络tlnn.train(trainingInputs,trainingOutputs,50000)print(2)训练后的权重值:)tlnn.print_weights()print(3)预测:)for i in range(len(trainingInputs):hidden_state,output=tlnn.predict(trainingInputsi)print(output)n 主程序(含训练数据):(续上)4.3.4 多层神经网络1)随机初始突触权重:Layer 1(4 neurons,each with 2 inputs):-0.16595599 0.44064899-
16、0.99977125-0.39533485-0.70648822-0.81532281-0.62747958-0.30887855 Layer 2(1 neuron,with 4 inputs):-0.20646505 0.07763347-0.16161097 0.370439 2)训练后的权重值:Layer 1(4 neurons,each with 2 inputs):2.57612468 3.91438561-5.96509441-7.38577669-1.0245413 -8.02972636-5.86303221 3.40368198 Layer 2(1 neuron,with 4
17、 inputs):-5.89617401 10.15582609-19.37274716 6.449688243)预测:0.01297458 0.99036898 0.98825116 0.01010893n 运行结果:4.4 误差反向传播算法n 1986年,David E.Rumelhart和James McClelland提出的BP神经网络(Back Propagation Network),是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。BP神经网络的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。n 算法包括信
18、号的前向传播信号的前向传播和误差的误差的反向传播反向传播,即计算误差输出时,按从输入到输出的方向进行;而调整权值和阈值时,按从输出到输入的方向进行。正向传播时,输入信号通过隐含层作用于输出结点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。误差的反向传播是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据,所以称该算法为误差反向传播算法。4.4 误差反向传播算法4.4.1 BP神经网络学习算法4.4 误差反向传播算法4.4.1 BP神经网络学习算法4.4 误差反向传播算法4.4.1 BP神经网络
19、学习算法 1111,1llllljjjiijawalLwa 4.4 误差反向传播算法4.4.1 BP神经网络学习算法4.4 误差反向传播算法4.4.1 BP神经网络学习算法4.4 误差反向传播算法2.隐藏层权值训练4.4 误差反向传播算法2.隐藏层权值训练4.4 误差反向传播算法4.4 误差反向传播算法 stochastic gradient descent algorithm for training a three-layer network(only one hidden layer)4.4 误差反向传播算法4.4.1.BP神经网络实验4.4 误差反向传播算法#前向计算。以input_v
20、ector作为输入值,计算神经网络neural_network的各层输出def feed_forward(neural_network,input_vector):outputs=for layer in neural_network:input_with_bias=input_vector+1#扩展输入向量 output=neuron_output(neuron,input_with_bias)for neuron in layer#计算每一层的输出结果 outputs.append(output)#记录当前层(隐含层)的输出值 input_vector=output#将当前层的输出作为下一
21、层的输入 return outputs4.4.2 BP神经网络神经网络实验实验n 程序代码:4.4 误差反向传播算法4.4.2 BP神经网络神经网络实验实验#反向传播。以input_vector 为输入训练向量,target为标准,#采用BP算法,反向逐层调整network的连接权值def backpropagate(network,input_vector,target):#以input_vector为输入,前向计算网络的各层输出值hidden_outputs,outputs=feed_forward(network,input_vector)#计算各层的delta值=output*(1-o
22、utput)。此处的激活函数为sigmoid output_deltas=output*(1-output)*(output-targeti)for i,output in enumerate(outputs)#调整输出层的连接权重 for i,output_neuron in enumerate(network-1):续代码4.4 误差反向传播算法 for j,hidden_output in enumerate(hidden_outputs+1):output_neuronj-=output_deltasi*hidden_output#反向调整各隐含层(除第一层外)的连接权重 hidden
23、_deltas=hidden_output*(1-hidden_output)*dot(output_deltas,ni for n in network-1)for i,hidden_output in enumerate(hidden_outputs)#(反向)调整第一层的连接权重 for i,hidden_neuron in enumerate(network0):for j,input in enumerate(input_vector+1):hidden_neuronj-=hidden_deltasi*input续代码4.5 玻尔兹曼机4.5 玻尔兹曼机4.5.1 BM的拓扑结构(a
24、)一般BM是一个全互联的网络(b)RBM是只有可见结点与隐藏结点互联的BM4.5 玻尔兹曼机4.5.1 BM的拓扑结构4.5 玻尔兹曼机4.5.2 BM的学习过程4.5 玻尔兹曼机4.5.2 BM的学习过程的学习过程4.6 综合案例综合案例4.6 综合案例综合案例 mlp=MLPClassifier(hidden_layer_sizes=(32,),max_iter=100,alpha=1e-4,tol=1e-4,activation=logistic,solver=sgd,verbose=100,random_state=1,learning_rate_init=.1)(a)隐藏层权重系数图谱(b)输出层权重系数图谱4.6 综合案例n 当activation=sgd时,learning-rate对神经网络的收敛、识别精度等性能指标的影响如图,“invscaling”的损失率较大,没有收敛;“constant with Nesterovs momentum”的性能与activation=adam相似,收敛更快。参数learning-rate对MLPClassifier的影响