很少有程序员不被这里或那里的人工智能程序所吸引。然而,许多对AI感兴趣的程序员很快就因为涉及的算法复杂而退却了。以下是边肖精心整理的AI编程论文相关资料。希望对你有帮助!
人工编程论文第一部分
用Java开源项目JOONE实现人工智能编程
很少有程序员不被这里或那里的人工智能程序所吸引。然而,许多对AI感兴趣的程序员很快就因为涉及的算法复杂而退却了。在本文中,我们将讨论一个可以大大简化这种复杂性的Java开源项目。
Java面向对象神经网络(JOONE)是一个开源项目,它为Java程序员提供了一个高度自适应的神经网络。JOONE项目源代码受LGPL保护。简而言之,这意味着源代码可以免费使用,您可以使用JOONE而无需支付版税。JOONE可以从http://joone.sourceforge.net/.下载
JOONE允许你轻松地从Java程序中创建一个神经网络。JOONE支持许多特性,比如多线程和分布式处理。这意味着JOONE可以利用多处理器计算机和多台计算机的优势进行分布式处理。
神经网络
JOONE用Java实现了一个人工神经网络。一种人工神经网络试图模仿生物神经网络的功能——神经网络构成了当今地球上几乎所有高等生命的大脑形式。神经网络由神经元组成。
如图1所示,神经起源由一个核心细胞和几个称为触角的长连接器组成。神经元由这些触角连接。生物和人工神经网络都是通过天线将信号从一个神经元传输到另一个神经元来工作的。
使用JOONE
在本文中,您将看到一个如何使用JOONE的简单示例。神经网络的课题涉及面很广,涵盖了很多不同的应用领域。在本文中,我们将向您展示如何使用JOONE来解决一个非常简单的模式识别问题。模式识别是神经网络中最受欢迎的应用之一。
模式识别给神经网络提供一个模式,判断神经网络是否能识别该模式。这种模式在某种程度上应该是扭曲的,神经网络仍然可以识别它。这很像人类识别事物的能力(比如交通标志)。人类应该能够在雨天、晴天或夜晚识别交通标志。即使这些图像可能看起来非常不同,人类的大脑仍然可以分辨出它们是相同的图像。
在编程JOONE时,通常使用两种类型的对象。您希望使用神经元层对象,该对象用于描述层中具有相似特征的一个或多个神经元。神经网络通常有一层或两层神经元。这些神经元层由触角连接。这些触角将这种模式从一个神经元层传输到另一个神经元层进行识别。
天线不仅将这种模式从一个神经元层传输到另一个神经元层。天线也会产生一些斜线,指向这个方向图的元素。这些斜线会导致这种模式的一些元素传递到下一个神经元层的效率低于其他方式。这些斜线通常被称为权重,它们构成了神经网络的存储系统。通过调整存储在触须中的这些权重,可以改变神经网络的行为。
天线在JOONE中还扮演着另一个角色。在JOONE中,你可以把触角想象成数据管道。正如天线将模式从一个神经元层传输到另一个神经元层一样,指定版本的天线用于将模式传输到神经网络和从神经网络传输出来。下面将向您展示如何构建一个简单的单层神经网络并用于模式识别。
训练神经网络
出于本文的目的,我们将指导JOONE识别一个非常简单的模式。在这个模式中,我们将研究二进制布尔运算,比如XOR。该XOR运算的真值表如下所示:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
从上表可以看出,XOR运算的结果是,只有当x和y的值不同时,结果才为真(1)。否则,异或运算的结果为假(0)。默认情况下,JOONE从存储在系统中的文本文件中获取输入。这些文本文件是通过一种叫做FileInputSynapse的特殊天线读取的。为了训练XOR问题,您必须创建一个输入文件——该文件包含上面显示的数据。该文件如清单1所示。
清单1:解决XOR问题的输入文件的内容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
现在让我们分析一个简单的程序,它指导JOONE识别XOR运算并产生正确的结果。现在我们分析训练神经网络必须处理的过程。训练过程包括将异或问题提交给神经网络,然后观察结果。如果这个结果不是预期的,训练算法将调整存储在天线中的权重。神经网络的实际输出和预期输出之间的差异称为误差。训练将继续,直到误差小于可接受的值。这个水平通常是一个百分比,比如10%。现在我们分析必须用来训练神经网络的代码。
训练过程从神经网络的建立开始,同时必须创建隐输入层和输出层。
//首先,创建这三层
input=new sigmoid layer();
hidden=new sigmoid layer();
output=new sigmoid layer();
每个层都是使用JOONE对象SigmoidLayer创建的。Sigmoidlayer基于自然对数生成输出。JOONE还包含其他层,而不是你可能选择使用的S形层类型。
接下来,每个楼层都有一个名字。这些名称将有助于稍后在调试过程中识别该层。
input . setlayername(' input ');
hidden . setlayername(' hidden ');
output . setlayername(' output ');
现在必须定义每一层。我们将指定每层中的“线”号。“行”的数量对应于这一层中神经元的数量。
input . set rows(2);
hidden . set rows(3);
output . set rows(1);
从上面的代码可以看出,输入层有两个神经元,隐藏层有三个隐藏神经元,输出层有一个神经元。这对于包含两个输入神经元和一个输出神经元的神经网络很重要,因为XOR运算符接收两个参数并产生一个结果。
为了使用这种神经原层,我们还必须创造触须。在本例中,我们将使用多根天线。这些触角是用下面的代码实现的。
//输入-隐藏连接。
全突触synapse_IH=新全突触();
//隐藏输出连接。
full synapse synapse _ HO=new full synapse();
正如神经原层的情况一样,触角也可能被命名为帮助调试程序。以下代码命名新创建的天线。
synapse _ ih . set name(' IH ');
synapse _ HO . set name(' HO ');
最后,我们必须将触角连接到适当的神经原层。下面的代码实现了这一点。
//将输入层连接到隐藏层
input . addoutputsynapse(synapse _ IH);
hidden . addinputsynapse(synapse _ IH);
//将隐藏层连接到输出层
hidden . addoutputsynapse(synapse _ HO);
output . addinputsynapse(synapse _ HO);
既然已经创建了神经网络,我们必须创建一个监视器对象来调整神经网络。下面的代码创建一个监视器对象。
//创建一个监视器对象并设置学习参数
Monitor=new Monitor();
monitor . set learning rate(0.8);
monitor . set momentum(0.3);
学习速度和动机被用作指定训练模式的参数。JOONE使用反向传播学习算法。关于学习速度或动机的更多信息,你应该参考反向传播算法。
应该将该监视器对象分配给每个神经元层。下面的代码实现了这一点。
input.setMonitor(监视器);
hidden.setMonitor(监视器);
output.setMonitor(监视器);
就像许多Java对象本身一样,JOONE monitor允许监听器向它添加内容。随着训练的进行,JOONE会告知听众训练的过程。在这个简单的例子中,我们使用:
monitor . addneuralnetlistener(this);
现在我们必须建立输入天线。如前所述,我们将使用FileInputSynapse来读取磁盘文件。文件不是JOONE可以接受的唯一输入类型。JOONE对于不同的输入源有很大的灵活性。为了让JOONE接收其他输入类型,您只需要创建一个新的天线来接收输入。在这个例子中,我们将简单地使用FileInputSynapse。首先实例化FileInputSynapse。
inputStream=new file inputsynapse();
然后,您必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用输入数据的前两列。下面的代码建立了神经网络输入的前两列。
//前两列包含输入值
inputstream . setfirstcol(1);
inputstream . setlastcol(2);
然后,我们必须提供输入文件的名称,它直接来自用户界面。然后,提供一个编辑控件来收集输入文件的名称。下面的代码设置FileInputSynapse的文件名。
//这是包含输入数据的文件名
inputstream . set filename(input file . gettext());
如前所述,天线只是神经原层之间的数据管道。FileInputSynapse是这里的数据管道,数据通过它进入神经网络。为了更容易地实现这一点,我们必须在神经网络的输入层添加FileInputSynapse。这是通过以下代码行实现的。
input . addinputsynapse(inputStream);
现在神经网络已经建立,我们必须创建一个训练器和一个监视器。训练器用于训练神经网络,因为监视器通过预设的训练重复次数来运行神经网络。对于每个训练重复,数据被提供给神经网络,然后可以观察结果。神经网络的权重(存储在穿梭于神经层之间的天线连接中)将根据误差进行适当调整。随着训练的进行,误差水平将会降低。下面的代码创建一个训练器并将其附加到监视器上。
trainer=新教学synapse();
trainer.setMonitor(监视器);
您会记得清单1中提供的输入文件包含三列。到目前为止,我们只使用了第一列和第二列,它们指定了神经网络的输入。第三列包含提供给神经网络第一列中的数字时的预期输出值。我们必须让培训师能够访问这个专栏,以便能够确定错误。误差是神经网络的实际输出和预期输出之间的差距。下面的代码创建了另一个FileInputSynapse,并准备读取与前面相同的输入文件。
//设置包含预期响应值的文件,该文件由FileInputSynapse提供
samples=new file inputsynapse();
samples . set filename(input file . gettext());
此时,我们希望指向第三列中的FileInputSynapse。下面的代码实现了这一点,然后让教练使用这个FileInputSynapse。
//输出值在文件的第三列
samples . setfirstcol(3);
samples . setlastcol(3);
trainer.setDesired(示例);
最后,训练器连接到神经网络的输出层,这将使训练器能够接收神经网络的输出。
//将训练器连接到网络的最后一层
output.addOutputSynapse(训练器);
现在我们已经为所有层准备了背景线程,包括训练员。
input . start();
hidden . start();
output.start()。
trainer . start();
最后,我们为训练设置一些参数。我们指定了输入文件有四行,要训练20000个循环,还在学习中。如果将学习参数设置为false,神经网络将只处理输入而不进行学习。我们将在下一节讨论输入处理。
monitor . set patterns(4);
monitor . setto cicles(20000);
monitor . setlearning(true);
现在我们已经为训练过程做好了准备。调用监视器的Go方法将在后台启动训练过程。
监视器。go();
神经网络现在将被训练20,000个周期。当神经网络训练完成时,误差层应该处于合理的低水平。一般来说,10%以下的误差水平是可以接受的。
训练神经网络
出于本文的目的,我们将指导JOONE识别一个非常简单的模式。在这个模式中,我们将研究二进制布尔运算,比如XOR。该XOR运算的真值表如下所示:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
从上表可以看出,XOR运算的结果是,只有当x和y的值不同时,结果才为真(1)。否则,异或运算的结果为假(0)。默认情况下,JOONE从存储在系统中的文本文件中获取输入。这些文本文件是通过一种叫做FileInputSynapse的特殊天线读取的。为了训练XOR问题,您必须创建一个输入文件——该文件包含上面显示的数据。该文件如清单1所示。
清单1:解决XOR问题的输入文件的内容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
现在让我们分析一个简单的程序,它指导JOONE识别XOR运算并产生正确的结果。现在我们分析训练神经网络必须处理的过程。训练过程包括将异或问题提交给神经网络,然后观察结果。如果这个结果不是预期的,训练算法将调整存储在天线中的权重。神经网络的实际输出和预期输出之间的差异称为误差。训练将继续,直到误差小于可接受的值。这个水平通常是一个百分比,比如10%。现在我们分析必须用来训练神经网络的代码。
训练过程从神经网络的建立开始,同时必须创建隐输入层和输出层。
//首先,创建这三层
input=new sigmoid layer();
hidden=new sigmoid layer();
output=new sigmoid layer();
每个层都是使用JOONE对象SigmoidLayer创建的。Sigmoidlayer基于自然对数生成输出。JOONE还包含其他层,而不是你可能选择使用的S形层类型。
接下来,每个楼层都有一个名字。这些名称将有助于稍后在调试过程中识别该层。
input . setlayername(' input ');
hidden . setlayername(' hidden ');
output . setlayername(' output ');
现在,您必须定义每一层。我们将指定每层中的“线”号。“行”的数量对应于这一层中神经元的数量。
input . set rows(2);
hidden . set rows(3);
output . set rows(1);
从上面的代码可以看出,输入层有两个神经元,隐藏层有三个隐藏神经元,输出层有一个神经元。这对于包含两个输入神经元和一个输出神经元的神经网络很重要,因为XOR运算符接收两个参数并产生一个结果。
为了使用这种神经原层,我们还必须创造触须。在本例中,我们将使用多根天线。这些触角是用下面的代码实现的。
//输入-隐藏连接。
全突触synapse_IH=新全突触();
//隐藏输出连接。
full synapse synapse _ HO=new full synapse();
正如神经原层的情况一样,触角也可能被命名为帮助调试程序。以下代码命名新创建的天线。
synapse _ ih . set name(' IH ');
synapse _ HO . set name(' HO ');
最后,我们必须将触角连接到适当的神经原层。下面的代码实现了这一点。
//将输入层连接到隐藏层
input . addoutputsynapse(synapse _ IH);
hidden . addinputsynapse(synapse _ IH);
//将隐藏层连接到输出层
hidden . addoutputsynapse(synapse _ HO);
output . addinputsynapse(synapse _ HO);
既然已经创建了神经网络,我们必须创建一个监视器对象来调整神经网络。下面的代码创建一个监视器对象。
//创建一个监视器对象并设置学习参数
Monitor=new Monitor();
monitor . set learning rate(0.8);
monitor . set momentum(0.3);
学习速度和动机被用作指定训练模式的参数。JOONE使用反向传播学习算法。关于学习速度或动机的更多信息,你应该参考反向传播算法。
应该将该监视器对象分配给每个神经元层。下面的代码实现了这一点。
input.setMonitor(监视器);
hidden.setMonitor(监视器);
output.setMonitor(监视器);
就像许多Java对象本身一样,JOONE monitor允许监听器向它添加内容。随着训练的进行,JOONE会告知听众训练的过程。在这个简单的例子中,我们使用:
monitor . addneuralnetlistener(this);
现在我们必须建立输入天线。如前所述,我们将使用FileInputSynapse来读取磁盘文件。文件不是JOONE可以接受的唯一输入类型。JOONE对于不同的输入源有很大的灵活性。为了让JOONE接收其他输入类型,您只需要创建一个新的天线来接收输入。在这个例子中,我们将简单地使用FileInputSynapse。首先实例化FileInputSynapse。
inputStream=new file inputsynapse();
然后,您必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用输入数据的前两列。下面的代码建立了神经网络输入的前两列。
//前两列包含输入值
inputstream . setfirstcol(1);
inputstream . setlastcol(2);
然后,我们必须提供输入文件的名称,它直接来自用户界面。然后,提供一个编辑控件来收集输入文件的名称。下面的代码设置FileInputSynapse的文件名。
//这是包含输入数据的文件名
inputstream . set filename(input file . gettext());
如前所述,天线只是神经原层之间的数据管道。FileInputSynapse是这里的数据管道,数据通过它进入神经网络。为了更容易地实现这一点,我们必须在神经网络的输入层添加FileInputSynapse。这是通过以下代码行实现的。
input . addinputsynapse(inputStream);
现在神经网络已经建立,我们必须创建一个训练器和一个监视器。训练器用于训练神经网络,因为监视器通过预设的训练重复次数来运行神经网络。对于每个训练重复,数据被提供给神经网络,然后可以观察结果。神经网络的权重(存储在穿梭于神经层之间的天线连接中)将根据误差进行适当调整。随着训练的进行,误差水平将会降低。下面的代码创建一个训练器并将其附加到监视器上。
trainer=新教学synapse();
trainer.setMonitor(监视器);
您会记得清单1中提供的输入文件包含三列。到目前为止,我们只使用了第一列和第二列,它们指定了神经网络的输入。第三列包含提供给神经网络第一列中的数字时的预期输出值。我们必须让培训师能够访问这个专栏,以便能够确定错误。误差是神经网络的实际输出和预期输出之间的差距。下面的代码创建了另一个FileInputSynapse,并准备读取与前面相同的输入文件。
//设置包含预期响应值的文件,该文件由FileInputSynapse提供
samples=new file inputsynapse();
samples . set filename(input file . gettext());
此时,我们希望指向第三列中的FileInputSynapse。下面的代码实现了这一点,然后让教练使用这个FileInputSynapse。
//输出值在文件的第三列
samples . setfirstcol(3);
samples . setlastcol(3);
trainer.setDesired(示例);
最后,训练器连接到神经网络的输出层,这将使训练器能够接收神经网络的输出。
//将训练器连接到网络的最后一层
output.addOutputSynapse(训练器);
现在我们已经为所有层准备了背景线程,包括训练员。
input . start();
hidden . start();
output.start()。
trainer . start();
最后,我们为训练设置一些参数。我们指定了输入文件有四行,要训练20000个循环,还在学习中。如果将学习参数设置为false,神经网络将只处理输入而不进行学习。我们将在下一节讨论输入处理。
monitor . set patterns(4);
monitor . setto cicles(20000);
monitor . setlearning(true);
现在我们已经为训练过程做好了准备。调用监视器的Go方法将在后台启动训练过程。
监视器。go();
神经网络现在将被训练20,000个周期。当神经网络训练完成时,误差层应该处于合理的低水平。一般来说,10%以下的误差水平是可以接受的。
人工编程论文2
人工智能的应用与发展研究
摘要:人工智能是用人工的方法和技术模仿、延伸和扩展人的智能,实现一些“机器思维”。在阐述人工智能定义的基础上,详细分析了人工智能的应用领域和发展现状,并对人工智能的未来发展进行了探讨。
关键词:人工智能;应用;问题;发展
目前,人工智能一词已被用作“研究如何在机器上实现人类智能”的学科名称。从这个意义上来说,它可以被定义为一门研究如何构造智能机器或智能系统,使其能够模拟、延伸和扩展人类智能的学科。具体来说,人工智能是研究如何使机器具有听、说、看、写、思考、学习、适应环境变化和解决各种实际问题的能力的一门学科。
一、人工智能的应用现状
大多数学科都有自己的研究领域,每个领域都有自己的研究课题和技术。在人工智能中,这样的分支包括自动定理证明、问题求解、自然语言处理、人工智能方法、编程语言、智能数据检索系统、自动编程等等。在过去的30年里,建立了一些具有人工智能的微机软件系统。
目前人工智能的应用领域主要包括以下几个方面:一是问题求解。到目前为止,人工智能程序可以知道如何思考它们解决的问题;二是逻辑推理和定理证明。推理是人工智能研究中最持久的领域之一。寻找一个定理的证明或反证,不仅需要根据假设进行推导的能力,还需要大量的非正式工作。定理证明是人工智能方法研究中一个极其重要的课题。第三是自然语言处理。自然语言的处理是人工智能技术应用和实践领域的典范。目前该领域的主要课题是:计算机系统如何基于主题和对话情境,关注大量的尝试——世界知识和期望函数,生成并理解自然语言。第四,智能信息检索技术。获取信息和提炼精华的技术已成为当代计算机科学技术研究中一个迫切的研究课题。将人工智能技术应用于该领域,是人工智能在实践中广泛应用的契机和突破口。五是专家系统。专家系统是目前人工智能中最活跃、最有效的研究领域。它是一个程序系统,具有特定领域的大量知识和经验。
二、人工智能发展的瓶颈
人工智能学科自1956年诞生以来,已经走过了50多年的历程。就研究、解释和模拟人类智能、智能行为及其规律的总目标而言,已经迈出了可喜的一步,在某些领域取得了相当大的进展。但是,从整个发展过程来看,人工智能经历了曲折,仍然面临很多困难,主要表现在以下几个方面:
(一)研究方法不足
人工智能发展至今,已经取得了很大的进步,但是人类对人脑的结构和工作模式的认识还不够全面和深入,这就决定了现阶段神经网络模型还不能真正模拟人脑。硅元素构成的电子器件与碳元素构成的神经元组织在物理化学性质上有很大不同,适合人脑的工作模式,但不适合神经网络计算机。马克思主义实践论认为,人脑是人类长期劳动实践的产物,不能仅靠实验室里电子器件和电路的排列组合来模拟。
(二)机器翻译存在困难
目前机器翻译面临的主要问题仍然是句子的用词和歧义。歧义一直是自然语言理解中的一个难题。消除歧义需要对原文中的每一句话及其上下文进行分析和理解,从而找到上下文中引起歧义的词和短语的准确含义。然而,计算机经常孤立地使用句子作为理解单位。此外,即使你对原文有一定的理解,如何在计算机中有效地表达理解的意思仍然存在问题。目前,NLU体系几乎不能随着时间的增加而增强理解,对体系的理解大多局限于表面,没有深入的推敲、学习、记忆和归纳。造成这个结果的原因是计算机本身的结构和研究方法。目前,NLU的研究方法还很不成熟,大多局限于语言这一单一领域,没有对人们如何理解语言进行深入有效的探讨。
(三)模式识别混乱
虽然利用计算机进行模式识别的研究和开发已经取得了很多成果,并且其中一些已经投入实际应用,但是其理论和方法与人类的感官识别机制完全不同。人的识别手段和形象思维能力是最高级的计算。
机器识别系统远远落后。另一方面,在现实世界中,生活并不是一个结构良好的任务。一般家养动物都能轻松应对,机器就不行。这并不意味着他们永远不会,但目前不会。
第三,关于人工智能发展的思考
人工智能发展潜力巨大。目前来看,人工智能虽然经过多年的研究取得了一些成果,但这仅仅是一个开始。如果继续研究下去,会在很多方面有很大的突破。尤其是在科技飞速发展的今天,各种新技术层出不穷,人工智能未来的发展将是不可限量的:首先,建造智能计算机来代替人类从事脑力劳动。将人类从繁杂的脑力劳动中解放出来,从而大大提高计算速度和效率;二是机器学习。科学家们一直在努力研究计算机如何模拟或实现人类的学习行为,以获取新的知识或技能。虽然在过去很长一段时间内没有取得显著的成果,但许多新的学习方法相继问世并投入实际使用,这充分表明在这一领域取得了很大的进展。二是自然语言处理。是计算机科学和人工智能领域的一个重要方向。经过人工智能研究人员的努力,在这一领域取得了大量显著的理论和实践成果,许多产品进入了许多领域。在互联网技术的影响下,信息检索技术近年来发展迅速,已经成为人工智能的一个独立研究分支。
人工智能始终处于计算机科学的前沿,其研究理论和成果将在很大程度上左右科学技术,决定计算机技术的发展方向。现在人工智能的很多研究成果已经进入了人们的日常生活。未来,人工智能技术的发展必将对人们的工作、生活、教育带来长远而深刻的影响。
看《人工智能编程论文》的人还读到: