人工智能编程论文

2017-06-13

很少有程序员不对这里或者那里所包含的人工智能编程所吸引,然而,许多对AI感兴趣的程序员很快就因其中包含的算法的复杂性而退却。以下是小编精心整理的人工智能编程论文的相关资料,希望对你有帮助!

人工智能编程论文篇一

用Java开源项目JOONE实现人工智能编程

很少有程序员不对这里或者那里所包含的人工智能编程所吸引,然而,许多对AI感兴趣的程序员很快就因其中包含的算法的复杂性而退却。在本文中,我们将讨论一个能大大简化这种复杂性的Java开源工程。

Java面向对象的神经网络(JOONE)是一开源工程,它提供给Java程序员一个高适应性的神经网络。该JOONE工程源代码由LGPL所保护。简言之,这意味着源代码是可自由使用的而且你不需要支付版税就可以使用JOONE。JOONE可以从//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)。其它情况下,XOR运算结果均为假(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运算并产生正确的结果。我们现在分析训练该神经网络必须被处理的过程。训练过程包括把XOR问题提交给神经网络,然后观察结果。如果这个结果不是所预期的,该训练算法将调整存储在触角中的重量。在神经网络的实际输出和预料的输出之间的差距称为误差。训练将继续到误差小于一个可接受值为止。这个级别通常是一个百分数,如10%。我们现在分析必须用于训练一个神经网络的代码。

训练过程通过建立神经网络开始,同时也必须创建隐蔽的输入层和输出层。

// 首先,创造这三个层

input = new SigmoidLayer();

hidden = new SigmoidLayer();

output = new SigmoidLayer();

每个层被使用JOONE对象SigmoidLayer创建。Sigmoidlayer基于自然对数生成一个输出。JOONE还包含另外的层,而不是你可能选择使用的S形的层类型。

下一步,每一层被赋于一个名字。这些名字将有助于后面在调试期间识别该层。

input.setLayerName("input");

hidden.setLayerName("hidden");

output.setLayerName("output");

现在必须定义每个层。我们将指定在每一层中的"行"号。该"行"号对应于这一层中的神经原的数目。

input.setRows(2);

hidden.setRows(3);

output.setRows(1);

从上面的代码看出,输入层有两个神经原,隐蔽层有三个隐蔽神经原,输出层包含一个神经原。这对于神经网络包含两个输入神经原和一个输出神经原是具有重要意义的,因为XOR运算符接收两个参数而产生一个结果。

为使用该神经原层,我们也必须创建触角。在本例中,我们要使用多个触角。这些触角用下面的代码实现。

// 输入-> 隐蔽的连接。

FullSynapse synapse_IH = new FullSynapse();

// 隐蔽-> 输出连接。

FullSynapse synapse_HO = new FullSynapse();

就象神经原层的情况一样,触角也可能命名以有助于程序的调试。下面的代码命名新建的触角。

synapse_IH.setName("IH");

synapse_HO.setName("HO");

最后,我们必须把触角联接到适当神经原层。下面的代码实现这一点。

// 联接输入层到隐蔽层

input.addOutputSynapse(synapse_IH);

hidden.addInputSynapse(synapse_IH);

// 联接隐蔽层到输出层

hidden.addOutputSynapse(synapse_HO);

output.addInputSynapse(synapse_HO);

现在既然神经网络已被创建,我们必须创建一个用于调节该神经网络的监视器对象。下面的代码创建监视器对象。

//创建监视器对象并且设置学习参数

monitor = new Monitor();

monitor.setLearningRate(0.8);

monitor.setMomentum(0.3);

学习速度和动力作为参数以用于指定训练的产生方式。JOONE利用backpropagation学习算法。要更多了解关于学习速度或者动力的信息,你应该参考backpropagation算法。

这个监视器对象应该被赋值给每一个神经原层。下面的代码实现这一点。

input.setMonitor(monitor);

hidden.setMonitor(monitor);

output.setMonitor(monitor);

就象许多Java对象本身一样,JOONE监视器允许听者可以添加到它上面去。随着训练的进行,JOONE将通知听者有关训练进程的信息。在这个简单的例子中,我们使用:

monitor.addNeuralNetListener(this);

我们现在必须建立输入触角。如前所述,我们将使用一个FileInputSynapse来读取一个磁盘文件。磁盘文件不是JOONE唯一能够接受的输入种类。JOONE对于不同的输入源具有很强的灵活性。为使JOONE能够接收其它输入类型,你只需创建一个新的触角来接受输入。在本例中,我们将简单地使用FileInputSynapse。FileInputSynapse首先被实例化。

inputStream = new FileInputSynapse();

然后,必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用了输入数据的前两列。下面代码建立起前两列用于输入到神经网络。

// 前两列包含输入值

inputStream.setFirstCol(1);

inputStream.setLastCol(2);

然后,我们必须提供输入文件的名字,这个名字直接来源于用户接口。然后,提供一个编辑控件用于收集输入文件的名字。下面代码为FileInputSynapse设置文件名。

// 这是包含输入数据的文件名

inputStream.setFileName(inputFile.getText());

如前所述,一个触角仅是一个神经原层之间的数据导管。FileInputSynapse正是这里的数据导管,通过它数据进入到神经网络。为了更容易实现这点,我们必须要把FileInputSynapse加到神经网络的输入层。这由下面一行实现。

input.addInputSynapse(inputStream);

现在既然已经建立起神经网络,我们必须创建一个训练员和一个监视器。训练员用于训练该神经网络,因为该监视器通过一个事先设置好的训练重复数来运行这个神经网络。对于每一次训练重复,数据被提供到神经网络,然后就可以观察到结果。该神经网络的权重(存储在穿梭在神经原层之间的触角连接中)将根据误差作适当调整。随着训练的进行,误差级将下降。下列代码建立训练员并把它依附到监视器。

trainer = new TeachingSynapse();

trainer.setMonitor(monitor);

你会记得列表1中提供的输入文件包含三个列。到目前为止,我们仅仅使用了第一、二列,它们指定了到神经网络的输入。第三列包含当提供给神经网络第一列中的数字时的期盼的输出值。我们必须使得训练员能够存取该列以便能确定误差。该错误是神经网络的实际输出和期盼的输出之间的差距。下列代码创建另外一个FileInputSynapse并作好准备以读取与前面相同的输入文件。

// 设置包含期望的响应值的文件,这由FileInputSynapse来提供

samples = new FileInputSynapse();

samples.setFileName(inputFile.getText());

这时,我们想指向在第三列的FileInputSynapse。下列代码实现了这一点,然后让训练员使用这个FileInputSynapse。

//输出值在文件中的第三列上

samples.setFirstCol(3);

samples.setLastCol(3);

trainer.setDesired(samples);

最后,训练员被连结到神经网络输出层,这将使训练员接收神经网络的输出。

// 连接训练员到网络的最后一层

output.addOutputSynapse(trainer);

我们现在已为所有的层准备好后台线程,包括训练员。

input.start();

hidden.start();

output.start();

trainer.start();

最后,我们为训练设置一些参数。我们指定在输入文件中共有四行,而且想训练20,000个周期,而且还在不段学习。如果你设置学习参数为false,该神经网络将简单地处理输入并不进行学习。我们将在下一节讨论输入处理。

monitor.setPatterns(4);

monitor.setTotCicles(20000);

monitor.setLearning(true);

现在我们已经为训练过程作好准备。调用监视器的Go方法将在后台启动训练过程。

monitor.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)。其它情况下,XOR运算结果均为假(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运算并产生正确的结果。我们现在分析训练该神经网络必须被处理的过程。训练过程包括把XOR问题提交给神经网络,然后观察结果。如果这个结果不是所预期的,该训练算法将调整存储在触角中的重量。在神经网络的实际输出和预料的输出之间的差距称为误差。训练将继续到误差小于一个可接受值为止。这个级别通常是一个百分数,如10%。我们现在分析必须用于训练一个神经网络的代码。

训练过程通过建立神经网络开始,同时也必须创建隐蔽的输入层和输出层。

// 首先,创造这三个层

input = new SigmoidLayer();

hidden = new SigmoidLayer();

output = new SigmoidLayer();

每个层被使用JOONE对象SigmoidLayer创建。Sigmoidlayer基于自然对数生成一个输出。JOONE还包含另外的层,而不是你可能选择使用的S形的层类型。

下一步,每一层被赋于一个名字。这些名字将有助于后面在调试期间识别该层。

input.setLayerName("input");

hidden.setLayerName("hidden");

output.setLayerName("output");

现在必须定义每个层。我们将指定在每一层中的"行"号。该"行"号对应于这一层中的神经原的数目。

input.setRows(2);

hidden.setRows(3);

output.setRows(1);

从上面的代码看出,输入层有两个神经原,隐蔽层有三个隐蔽神经原,输出层包含一个神经原。这对于神经网络包含两个输入神经原和一个输出神经原是具有重要意义的,因为XOR运算符接收两个参数而产生一个结果。

为使用该神经原层,我们也必须创建触角。在本例中,我们要使用多个触角。这些触角用下面的代码实现。

// 输入-> 隐蔽的连接。

FullSynapse synapse_IH = new FullSynapse();

// 隐蔽-> 输出连接。

FullSynapse synapse_HO = new FullSynapse();

就象神经原层的情况一样,触角也可能命名以有助于程序的调试。下面的代码命名新建的触角。

synapse_IH.setName("IH");

synapse_HO.setName("HO");

最后,我们必须把触角联接到适当神经原层。下面的代码实现这一点。

// 联接输入层到隐蔽层

input.addOutputSynapse(synapse_IH);

hidden.addInputSynapse(synapse_IH);

// 联接隐蔽层到输出层

hidden.addOutputSynapse(synapse_HO);

output.addInputSynapse(synapse_HO);

现在既然神经网络已被创建,我们必须创建一个用于调节该神经网络的监视器对象。下面的代码创建监视器对象。

//创建监视器对象并且设置学习参数

monitor = new Monitor();

monitor.setLearningRate(0.8);

monitor.setMomentum(0.3);

学习速度和动力作为参数以用于指定训练的产生方式。JOONE利用backpropagation学习算法。要更多了解关于学习速度或者动力的信息,你应该参考backpropagation算法。

这个监视器对象应该被赋值给每一个神经原层。下面的代码实现这一点。

input.setMonitor(monitor);

hidden.setMonitor(monitor);

output.setMonitor(monitor);

就象许多Java对象本身一样,JOONE监视器允许听者可以添加到它上面去。随着训练的进行,JOONE将通知听者有关训练进程的信息。在这个简单的例子中,我们使用:

monitor.addNeuralNetListener(this);

我们现在必须建立输入触角。如前所述,我们将使用一个FileInputSynapse来读取一个磁盘文件。磁盘文件不是JOONE唯一能够接受的输入种类。JOONE对于不同的输入源具有很强的灵活性。为使JOONE能够接收其它输入类型,你只需创建一个新的触角来接受输入。在本例中,我们将简单地使用FileInputSynapse。FileInputSynapse首先被实例化。

inputStream = new FileInputSynapse();

然后,必须通知FileInputSynapse要使用哪些列。列表1中显示的文件使用了输入数据的前两列。下面代码建立起前两列用于输入到神经网络。

// 前两列包含输入值

inputStream.setFirstCol(1);

inputStream.setLastCol(2);

然后,我们必须提供输入文件的名字,这个名字直接来源于用户接口。然后,提供一个编辑控件用于收集输入文件的名字。下面代码为FileInputSynapse设置文件名。

// 这是包含输入数据的文件名

inputStream.setFileName(inputFile.getText());

如前所述,一个触角仅是一个神经原层之间的数据导管。FileInputSynapse正是这里的数据导管,通过它数据进入到神经网络。为了更容易实现这点,我们必须要把FileInputSynapse加到神经网络的输入层。这由下面一行实现。

input.addInputSynapse(inputStream);

现在既然已经建立起神经网络,我们必须创建一个训练员和一个监视器。训练员用于训练该神经网络,因为该监视器通过一个事先设置好的训练重复数来运行这个神经网络。对于每一次训练重复,数据被提供到神经网络,然后就可以观察到结果。该神经网络的权重(存储在穿梭在神经原层之间的触角连接中)将根据误差作适当调整。随着训练的进行,误差级将下降。下列代码建立训练员并把它依附到监视器。

trainer = new TeachingSynapse();

trainer.setMonitor(monitor);

你会记得列表1中提供的输入文件包含三个列。到目前为止,我们仅仅使用了第一、二列,它们指定了到神经网络的输入。第三列包含当提供给神经网络第一列中的数字时的期盼的输出值。我们必须使得训练员能够存取该列以便能确定误差。该错误是神经网络的实际输出和期盼的输出之间的差距。下列代码创建另外一个FileInputSynapse并作好准备以读取与前面相同的输入文件。

// 设置包含期望的响应值的文件,这由FileInputSynapse来提供

samples = new FileInputSynapse();

samples.setFileName(inputFile.getText());

这时,我们想指向在第三列的FileInputSynapse。下列代码实现了这一点,然后让训练员使用这个FileInputSynapse。

//输出值在文件中的第三列上

samples.setFirstCol(3);

samples.setLastCol(3);

trainer.setDesired(samples);

最后,训练员被连结到神经网络输出层,这将使训练员接收神经网络的输出。

// 连接训练员到网络的最后一层

output.addOutputSynapse(trainer);

我们现在已为所有的层准备好后台线程,包括训练员。

input.start();

hidden.start();

output.start();

trainer.start();

最后,我们为训练设置一些参数。我们指定在输入文件中共有四行,而且想训练20,000个周期,而且还在不段学习。如果你设置学习参数为false,该神经网络将简单地处理输入并不进行学习。我们将在下一节讨论输入处理。

monitor.setPatterns(4);

monitor.setTotCicles(20000);

monitor.setLearning(true);

现在我们已经为训练过程作好准备。调用监视器的Go方法将在后台启动训练过程。

monitor.Go();

神经网络现在将要被训练20,000个周期。当神经网络训练完成,误差层应该在一个合理的低级别上。一般低于10%的误差级是可接受的

人工智能编程论文篇二

人工智能的应用与发展研究

摘 要:人工智能是用人工的方法和技术模仿、延伸和扩展人的智能,实现某些“机器思维”。本文在阐述人工智能定义的基础上,详细分析了人工智能的应用领域和当前的发展状况,深入探讨了人工智能未来的发展。

关键词:人工智能;应用;问题;发展

当前,人工智能这个术语已被用作“研究如何在机器上实现人类智能”这门学科的名称。从这个意义上说,可把它定义为:是一门研究如何构造智能机器或智能系统,使它能模拟、延伸、扩展人类智能的学科。具体来说,人工智能就是研究如何使机器具有能听、会说、能看、会写、能思维、会学习、能适应环境变化、能解决各种实际问题的一门学科。

一、人工智能的应用现状

大部分学科都有各自的研究领域,每个领域都有其独有的研究课题和研究技术。在人工智能中,这样的分支包含自动定理证明、问题求解、自然语言处理、人工智能方法、程序语言和智能数据检索系统及自动程序设计等等。在过去的30年中,已经建立了一些具有人工智能的微机软件系统。

目前,人工智能的应用领域主要有以下几个方面:一是问题求解。到目前为止,人工智能程序能知道如何思考他们解决的问题;二是逻辑推理与定理证明。逻辑推理是人工智能研究中最持久的领域之一。定理寻找一个证明或反证,不仅需要有根据假设进行演绎的能力,而且许多非形式的工作,在人工智能方法的研究中定理证明是一个极其重要的论题。三是自然语言处理。自然语言的处理是人工智能技术应用与实际领域的典范,目前该领域的主要课题是:计算机系统如何以主题和对话情景为基础,注重大量的尝试一一世界知识和期望作用,生成和理解自然语言。四是智能信息检索技术。信息获取和净精华技术已成为当代计算机科学与技术研究中迫切需要研究的课题,将人工智能技术应用于这一领域是人工智能走向广泛实际应用的契机与突破口。五是专家系统。专家系统是目前人工智能中最活跃、最有成效的研究领域,它是一种具有特定领域内大量知识与经验的程序系统。

二、人工智能的发展瓶颈

人工智能(AI)学科自1956年诞生至今已走过50多个年头,就研究解释和模拟人类智能、智能行为及其规律这一总目标来说,已经迈出了可喜的一步,某些领域已取得了相当的进展。但从整个发展的过程来看,人工智能发展曲折,而且还面临不少难题,主要有以下几个方面:

(一)研究方法不足

人工智能发展到今天,已经取得了长足进步,但人类对人脑结构和工作模式的认识还不全面、不深入,这也就决定了现阶段神经网络模型无法真正实现对人脑的模拟;硅基元素组成的电子器件与碳基元素组成的神经元组织在物理及化学属性上有很大的不同,适合于人脑的工作模式,但并不适应神经网络计算机;根据马克思主义实践论观点,人脑是人类长期劳动实践的产物,仅靠在实验室里电子器件以及线路的排列组合是不可就能实现模拟的。

(二)机器翻译存在困难

目前机器翻译所面临的主要问题仍然是构成句子的单词和歧义性问题。歧义性问题一直是自然语言理解中的一大难关,要消除歧义性就要对原文的每一个句子及其上下文进行分析理解,寻找导致歧义的词和词组在上下文中的准确意义。然而,计算机却往往孤立地将句子作为理解单位。另外,即使对原文有了一定的理解,理解的意义如何有效地在计算机里表示出来也存在问题。目前的NLU系统几乎不能随着时间的增长而增强理解力,系统的理解大都局限于表层上,没有深层的推敲,没有学习,没有记忆,更没有归纳。导致这种结果的原因是计算机本身结构和研究方法的问题。现在NLU的研究方法很不成熟,大多数研究局限在语言这一单独的领域,而没有对人们是如何理解语言这个问题做深入有效的探讨。

(三)模式识别存在困惑

虽然使用计算机进行模式识别的研究与开发已取得大量成果,有的已成为产品投入实际应用,但是它的理论和方法与人的感官识别机制是全然不同的。人的识别手段、形象思维能力,是任何最先进的计算

机识别系统望尘莫及的,另一方面,在现实世界中,生活并不是一项结构严密的任务,一般家畜都能轻而易举地对付,但机器不会,这并不是说它们永远不会,而是说目前不会。

三、人工智能发展的思考

人工智能具有十分巨大的发展潜力,当前人工智能虽然经过多年研究已取得了一定成绩,但这也仅仅是刚刚开始而已,继续研究下去在很多方面都会有重大的突破。尤其是在科学技术日新月异的今天,各种新科技的出现层出不穷,人工智能将来的发展将不可限量:一是构建智能计算机,代替人类从事脑力劳动。将人类从繁杂的脑力劳动中解放出来,从而极大的提高运算速度和效率;二是机器学习。科学家一直在致力于研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能。虽然在过去的很长的一段时间内都没有取得十分显著的成果,但许多新的学习方法相继问世,并且已经有了实际的应用,这充分说明在这方面的研究已经有了很大的进步。二是自然语言处理。它是计算机科学领域与人工智能领域中的一个重要方向。在经过人工智能研究人员的艰苦努力之后,在该领域中已取得了大量令人瞩目的理论与实际应用成果,许多产品已经进入了众多领域。智能信息检索技术在Internet技术的影响下,近年来发展势头十分迅猛,而且已经成为了人工智能的一个独立研究分支。

人工智能始终处于计算机这门学科的前沿,其研究的理论和成果在很大程度上将控制科学与技术,决定计算机技术的发展方向。现如今,已经有许多人工智能的研究成果进入到人们的日常生活中。将来,人工智能技术的发展也必将会给人们的工作、生活和教育等带来长远深刻的影响。

更多相关阅读

最新发布的文章