构建一个简单的人工神经网络

2017-11-22 01:28

     人工神经网络是进行机器学习的基础,模仿生物神经元的工作方式构建神经网络,让计算机拥有“自我学习“的能力。人工神经网络的诞生具有革命性的意义,”自我学习“是其最大的优点,通过适当的训练,它语音识别、图像识别、人机对话、大数据方面发挥的了巨大的作用。
    神经网络的概念早在数十年前就已经提出来了,但限于当时计算机的计算能力,还无法应用。近些年来,随着计算机的计算能力大幅提升,机器学习兴起,导致神经网络的使用日益广泛。
    目前最常用的构建神经网络的方法就是反向传播,当程序运算过一遍后,查看计算出的结果与理想结果之间的误差,通过反向传播算法让计算机优化人工神经元之间的权值(连接强度),然后再次计算结果,不断循环这一过程,经过一定次数的循环后,获得解将非常接近理想结果。


    这是一个非常简单的神经网络,分为三层,输入层(包含两个神经元i1、i2,截距项b1),隐含层(包含两个神经元h1、h2,截距项b2),输出层(o1,o2)。假设输入3对应输出映射0.2,输入8对应的是输出映射0.9。
 


令i1=3,i2=8
o1=0.2,o2=0.9
我们把权值用w表示,通常我们会随机初始化权值。
初始化权值w1=0.15,w2=0.2,w3=0.25,w4=0.3,w5=0.4,w6=0.45,w7=0.5,w8=0.55。
初始化b1=0.35,b2=0.6
首先进行前向传播:
输入层——》隐含层——》输出层,下图为本例中神经元h1的结构:

 


隐含层****计算net:

neth1=w1*i1+w2*i2+b1

neth2=w3*i1+w4*i2+b1
计算out:

outh1=sigma(neth1)
outh2=sigma(neth2)
(其中sigma函数是常用的激活函数之一,此外还有tanh(),sigma(x)=1/(1+e^(-x))) 
输出层****计算net:

neto1=w5*outh1+w6*outh2+b2

neto2=w7*outh1+w8*outh2+b2
计算out:
 outo1=sigma(neto1)

 outo2=sigma(neto2)

计算总误差:
 Eo1=0.5*(o1-outo1)*(o1-outo1)

 Eo2=0.5*(o2-outo2)*(o2-outo2)

 Etotal=Eo1+Eo2
(其中Etotal代表总误差,Eo1代表神经元o1输出的值与理想值o1得误差,Eo2代表神经元o2输出的值与理想值o2得误差) 

反向传播:

delta_o1=-(o1-outo1)*sigma_da(outo1)

delta_o2=-(o2-outo2)*sigma_da(outo2)
(delta_o1,delta_o2分别为neth1,neth2值对整体的误差) 

 

dw1=sigma_da(outh1)*i1*(delta_o1*w5+delta_o2*w7)

dw2=sigma_da(outh1)*i2*(delta_o1*w5+delta_o2*w7)

dw3=sigma_da(outh2)*i1*(delta_o1*w6+delta_o2*w8)

dw4=sigma_da(outh2)*i2*(delta_o1*w6+delta_o2*w8)

(dw1,dw2,dw3,dw4分别是w1~w4对整体的偏导)

w1-=alpha*dw1

w2-=alpha*dw2

w3-=alpha*dw3

w4-=alpha*dw4

(w1~w4为更新后的权值,alpha是学习率,自定义)


 dw5=delta_o1*outh1

dw6=delta_o1*outh2

dw7=delta_o2*outh1

dw8=delta_o2*outh2
 (dw5~dw8为w5~w8对整体的偏导)

w5-=alpha*dw5

w6-=alpha*dw6

w7-=alpha*dw7

w8-=alpha*dw8
 (w5~w8为更新后的权值)

循环一次:

outo1=0.802745098356

outo2=0.830938316533
(训练一次后,结果与理想值还有很大误差,理想值:o1=0.2,o2=0.9) 

循环40次:

outo1=0.222343700362

outo2=0.879218779053
(训练40次后,结果已经比较接近理想值了,理想值:o1=0.2,o2=0.9) 

循环200次:

outo1=0.199989353333

outo2=0.898828168138 
(训练200次后,结果变得极其接近理想值,最大误差不超过0.002,理想值:o1=0.2,o2=0.9)

    现在,这个简单的神经网络已可以根据输入值3、8, 预测出输出值0.2、0.9。如果还想要处理更加复杂的神经网络,就需要增加更多的隐含层,这就叫深度学习,通过更多层的神经网络来实现机器学习。目前国际上的一些神经网络已经达到了一千多层。
    下面是其中一些公式的推导:


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 人工神经网络是一种模拟人脑的结构和功能的计算机算法。它由输入层、隐藏层和输出层组成,并通过计算权值和偏差来模拟人脑的神经元之间的信息传递。 下面是一个用 Java 实现的人工神经网络简单示例: ``` import java.util.Arrays; public class ArtificialNeuralNetwork { // 输入层节点数 int inputLayerSize; // 隐藏层节点数 int hiddenLayerSize; // 输出层节点数 int outputLayerSize; // 输入层到隐藏层的权值矩阵 double[][] weightsInputToHidden; // 隐藏层到输出层的权值矩阵 double[][] weightsHiddenToOutput; // 输入层到隐藏层的偏差向量 double[] biasInputToHidden; // 隐藏层到输出层的偏差向量 double[] biasHiddenToOutput; public ArtificialNeuralNetwork(int inputLayerSize, int hiddenLayerSize, int outputLayerSize) { this.inputLayerSize = inputLayerSize; this.hiddenLayerSize = hiddenLayerSize; this.outputLayerSize = outputLayerSize; this.weightsInputToHidden = new double[inputLayerSize][hiddenLayerSize]; this.weightsHiddenToOutput = new double[hiddenLayerSize][outputLayerSize]; this.biasInputToHidden = new double[hiddenLayerSize]; this.biasHiddenToOutput = new double[outputLayerSize]; // 初始化权值和偏差为随机值 for (int i = 0; i < inputLayerSize; i++) { for (int j = 0; j < hiddenLayerSize; j++) { weightsInputToHidden[i][j] = Math.random(); } } for (int i = 0; i < hiddenLayerSize; i++) { for (int j = 0; j < outputLayerSize; j++) { weightsHiddenToOutput[i][j] = Math.random(); } biasInputToHidden[i] = Math.random ### 回答2: Java是一种常用的编程语言,在编写人工神经网络时也可以选择使用Java。人工神经网络是一种模拟人脑神经网络结构和功能的算法模型。 首先,我们需要导入Java的相关库来支持人工神经网络的开发。常见的库有DL4J、Neuroph、Encog等。这些库可以提供人工神经网络所需的基本功能和算法。 接下来,需要定义神经网络的结构。人工神经网络由输入层、隐藏层和输出层组成。输入层用于接收外部数据,隐藏层进行数据的处理,输出层输出最终结果。我们可以通过设置网络层数和每层的神经元数量来定义神经网络的结构。 然后,需要初始化神经网络的权重和偏置。权重是神经网络中神经元之间的连接强度,偏置是神经元的激活阈值。可以随机初始化权重和偏置,并根据网络的学习算法来进行调整。 接下来,需要实现神经网络的前向传播和反向传播算法。前向传播用于将输入数据从输入层传递到输出层,反向传播用于根据输出结果来调整神经元的权重和偏置。这样可以逐渐优化神经网络的性能和准确性。 最后,需要对神经网络进行训练和测试。训练过程可以使用一组已知的输入和输出数据来不断调整神经网络的权重和偏置,直到达到期望的输出结果。测试过程可以使用另一组未知的数据来验证神经网络的性能和泛化能力。 在实现人工神经网络的过程中,还可以结合其他机器学习算法和技术来进一步优化网络的性能,如正则化、优化器、激活函数、损失函数等。 总结起来,用Java编写人工神经网络需要导入相关库、定义网络结构、初始化权重和偏置、实现前向传播和反向传播算法,最后进行训练和测试。通过不断优化网络的参数和算法,可以实现更准确和高效的人工神经网络模型。 ### 回答3: 要用Java写一个人工神经网络,首先需要了解人工神经网络的基本原理。人工神经网络是一种由人工神经元构成的网络模型,模拟了生物神经系统的工作原理。 在Java中,可以使用一些开源的库来实现人工神经网络,比如Encog、DL4J等。这些库提供了一些封装好的类和方法,方便我们构建和训练神经网络模型。 首先,我们需要定义一个神经网络的结构。可以使用这些库提供的类来创建输入层、隐藏层和输出层,设定每个层次的神经元数量等。 然后,我们需要定义神经网络的激活函数,常见的有sigmoid函数、ReLU函数等。通过将输入数据输入到神经网络中,并经过激活函数处理,可以得到网络的输出结果。 接下来是训练神经网络。我们需要准备一组带有特征和标签的数据集作为训练样本,通过反向传播算法来不断调整神经网络的权重和偏差,使得预测结果更接近真实标签。 在训练过程中,我们可以使用一些常见的优化算法,如梯度下降法、Adam算法等,来最小化神经网络的损失函数。 完成训练后,我们可以使用经过训练的神经网络来进行预测。将待预测的数据输入到网络中,经过前向传播,得到网络的输出结果。 最后,我们可以评估神经网络的性能,比如计算准确率、精确率等指标,以判断神经网络的有效性和可靠性。 总体来说,用Java写一个人工神经网络需要进行网络结构的定义、激活函数的选择、训练过程的实现和预测结果的评估。通过合理的设置和调整,可以构建一个有效的人工神经网络模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值