简单神经网络初探
按照专业解释神经网络是:一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。
神经网络是智能控制技术的主要分支之一。本书的主要内容有:神经网络的概念,神经网络的分类与学习方法,前向神经网络模型及其算法,改进的BP网络及其控制、辨识建模,基于遗传算法的神经网络,基于模糊理论的神经网络,RBF网络及其在混沌背景下对微弱信号的测量与控制,反馈网络,Hopfield网络及其在字符识别中的应用,支持向量机及其故障诊断,小波神经网络及其在控制与辨识中的应用。
准备制作硬件,包括网络学习算法的研究。这方面的工作也称为技术模型研究。
神经网络用到的算法就是向量乘法,并且广泛采用符号函数及其各种逼近。并行、容错、可以硬件实现以及自我学习特性,是神经网络的几个基本优点,也是神经网络计算方法与传统方法的区别所在。
在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能、构作专家系统、制成机器人、复杂系统控制等等。
纵观当代新兴科学技术的发展历史,人类在征服宇宙空间、基本粒子,生命起源等科学技术领域的进程中历经了崎岖不平的道路。我们也会看到,探索人脑功能和神经网络的研究将伴随着重重困难的克服而日新月异。
在机器学习和相关领域,人工神经网络(人工神经网络)的计算模型灵感来自动物的中枢神经系统(尤其是脑),并且被用于估计或可以依赖于大量的输入和一般的未知近似函数。人工神经网络通常呈现为相互连接的“神经元”,它可以从输入的计算值,并且能够机器学习以及模式识别由于它们的自适应性质的系统。
例如,用于手写体识别的神经网络是由一组可能被输入图像的像素激活的输入神经元来限定。后进过加权,并通过一个函数(由网络的设计者确定的)转化,这些神经元的致动被上到其他神经元然后被传递。重复此过程,直到最后,一输出神经元被激活。这决定了哪些字符被读取。
像其他的从数据-神经网络认识到的机器学习系统方法已被用来解决各种各样的很难用普通的以规则为基础的编程解决的任务,包括计算机视觉和语音识别。
也许,人工神经网络的最大优势是他们能够被用作一个任意函数逼近的机制,那是从观测到的数据“学习”。然而,使用起来也不是那么简单的,一个比较好理解的基本理论是必不可少的。
分类:
选择模式:这将取决于数据的表示和应用。过于复杂的模型往往会导致问题的学习。
学习算法:在学习算法之间有无数的权衡。几乎所有的算法为了一个特定的数据集训练将会很好地与正确的超参数合作。然而,选择和调整的算法上看不见的数据训练需要显著量的实验。
稳健性:如果该模型中,成本函数和学习算法,适当地选择所得到的神经网络可以是非常健壮的。有了正确的实施,人工神经网络,可以自然地应用于在线学习和大型数据集的应用程序。其简单的实现和表现在结构上主要依赖本地的存在,使得在硬件快速,并行实现。
原理:
“人脑是如何工作的?”
“人类能否制作模拟人脑的人工神经元?”
多少年以来,人们从医学、生物学、生理学、哲学、信息学、计算机科学、认知学、组织协同学等各个角度企图认识并解答上述问题。在寻找上述问题答案的研究过程中,逐渐形成了一个新兴的多学科交叉技术领域,称之为“神经网络”。神经网络的研究涉及众多学科领域,这些领域互相结合、相互渗透并相互推动。不同领域的科学家又从各自学科的兴趣与特色出发,提出不同的问题,从不同的角度进行研究。
人工神经网络首先要以一定的学习准则进行学习,然后才能工作。现以人工神经网络对于写“A”、“B”两个字母的识别为例进行说明,规定当“A”输入网络时,应该输出“1”,而当输入为“B”时,输出为“0”。
所以网络学习的准则应该是:如果网络作出错误的判决,则通过网络的学习,应使得网络减少下次犯同样错误的可能性。首先,给网络的各连接权值赋予(0,1)区间内的随机值,将“A”所对应的图象模式输入给网络,网络将输入模式加权求和、与门限比较、再进行非线性运算,得到网络的输出。在此情况下,网络输出为“1”和“0”的概率各为50%,也就是说是完全随机的。这时如果输出为“1”(结果正确),则使连接权值增大,以便使网络再次遇到“A”模式输入时,仍然能作出正确的判断。
普通计算机的功能取决于程序中给出的知识和能力。显然,对于智能活动要通过总结编制程序将十分困难。
人工神经网络也具有初步的自适应与自组织能力。在学习或训练过程中改变突触权重值,以适应周围环境的要求。同一网络因学习方式及内容不同可具有不同的功能。人工神经网络是一个具有学习能力的系统,可以发展知识,以致超过设计者原有的知识水平。通常,它的学习训练方式可分为两种,一种是有监督或称有导师的学习,这时利用给定的样本标准进行分类或模仿;另一种是无监督学习或称无为导师学习,这时,只规定学习方式或某些规则,则具体的学习内容随系统所处环境 (即输入信号情况)而异,系统可以自动发现环境特征和规律性,具有更近似人脑的功能。
神经网络就像是一个爱学习的孩子,您教她的知识她是不会忘记而且会学以致用的。我们把学习集(Learning Set)中的每个输入加到神经网络中,并告诉神经网络输出应该是什么分类。在全部学习集都运行完成之后,神经网络就根据这些例子总结出她自己的想法,到底她是怎么归纳的就是一个黑盒了。之后我们就可以把测试集(Testing Set)中的测试例子用神经网络来分别作测试,如果测试通过(比如80%或90%的正确率),那么神经网络就构建成功了。我们之后就可以用这个神经网络来判断事务的分类了。
神经网络是通过对人脑的基本单元——神经元的建模和联接,探索模拟人脑神经系统功能的模型,并研制一种具有学习、联想、记忆和模式识别等智能信息处理功能的人工系统。神经网络的一个重要特性是它能够从环境中学习,并把学习的结果分布存储于网络的突触连接中。神经网络的学习是一个过程,在其所处环境的激励下,相继给网络输入一些样本模式,并按照一定的规则(学习算法)调整网络各层的权值矩阵,待网络各层权值都收敛到一定值,学习过程结束。然后我们就可以用生成的神经网络来对真实数据做分类。
人工神经网络早期的研究工作应追溯至20世纪40年代。
public override double Compute(double[] input) { if (input.Length != InputsCount) throw new ArgumentException("输入向量的长度错误。"); double sum = 0.0; for (int i = 0; i < Weights.Length; i++) { sum += Weights[i] * input[i]; } sum += Threshold; double output = ActivationFunction.Function(sum); Output = output; return output; } public ActivationNetwork(IActivationFunction function, int inputsCount, params int[] neuronsCount) : base(inputsCount, neuronsCount.Length) { // neuronsCount 指定神经网络每层中的神经元数量。 for (int i = 0; i < Layers.Length; i++) { Layers[i] = new ActivationLayer( neuronsCount[i], // 每个神经元只有一个输出,上一层有多少个神经元也就有多少个输出,也就是这一层需要有多少输入 (i == 0) ? inputsCount : neuronsCount[i - 1], function); } } /// <summary> /// 神经网络层 /// </summary> /// <param name="neuronsCount">该层神经元的个数</param> /// <param name="inputsCount">该层的输入个数</param> /// <param name="function">激活函数</param> public ActivationLayer(int neuronsCount, int inputsCount, IActivationFunction function) : base(neuronsCount, inputsCount) { for (int i = 0; i < Neurons.Length; i++) Neurons[i] = new ActivationNeuron(inputsCount, function); } public void SetActivationFunction(IActivationFunction function) { for (int i = 0; i < Neurons.Length; i++) { ((ActivationNeuron)Neurons[i]).ActivationFunction = function; } } /// 单个训练样本 /// </summary> /// <param name="input"></param> /// <param name="output"></param> /// <returns></returns> public double Run(double[] input, double[] output) { // 网络对单个输入拿到对应的输出值 double[] networkOutput = _network.Compute(input); Layer layer = _network.Layers[0]; // 统计总误差 double error = 0.0; // 了感知器(感知机)算法 for (int j = 0; j < layer.Neurons.Length; j++) { // 误差值,用已知的值减去网络计算出来的值 double e = output[j] - networkOutput[j]; // 如果存在误差,那么更新权重 if (e != 0) { ActivationNeuron perceptron = (ActivationNeuron)layer.Neurons[j]; for (int i = 0; i < perceptron.Weights.Length; i++) { // 用学习率乘以误差乘以输入值更新值 perceptron.Weights[i] += _learningRate * e * input[i]; } perceptron.Threshold += _learningRate * e; error += Math.Abs(e); } } return error; }
/// <summary> /// 单个训练样本 /// </summary> /// <param name="input"></param> /// <param name="output"></param> /// <returns></returns> public double Run(double[] input, double[] output) { double[] networkOutput = _network.Compute(input); Layer layer = _network.Layers[0]; // 统计总误差 double error = 0.0; for (int j = 0; j < layer.Neurons.Length; j++) { // 误差值,用已知的值减去网络计算出来的值 double e = output[j] - networkOutput[j]; // 如果存在误差,那么更新权重 if (e != 0) { ActivationNeuron perceptron = (ActivationNeuron)layer.Neurons[j]; for (int i = 0; i < perceptron.Weights.Length; i++) { perceptron.Weights[i] = RandRange.GetRan(); } perceptron.Threshold = RandRange.GetRan(); error += Math.Abs(e); } } return error; }