欣小白的点滴 ————人工神经网络(ANN)

编程入门 行业动态 更新时间:2024-10-26 14:36:12

欣小白的点滴              ————人工<a href=https://www.elefans.com/category/jswz/34/1769690.html style=神经网络(ANN)"/>

欣小白的点滴 ————人工神经网络(ANN)

一.概念理解

计算机神经网络是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互连接构成。每个节点代表一种特定的输出函数,称为激励函数或者激活函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。神经网络的输出根据网络的连接方式、权重值和激活函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。简而言之,搭建人工神经网络利用函数拟合的性质体现自然规律。
人工神经网络是一种非程序化,适应性,大脑风格的信息处理。其本质是通过网络的变换和动力学行为得到一种并行分布式的信息处理功能,并在不同程度和层次上模仿人脑神经系统的信息处理功能。

(图中圆圈可以视为一个神经元(又可以称为感知器))

为了区分不同类型的神经层,我们会有不同神经层的名称。输入层,输出层和隐藏层。

输入层是直接接受信息的神经层,负责传递接收到的信息。
输出层是信息在神经元链接中传递,中转,分析,权衡,形成输出结果。通过输出层输出的结果,我们就可以直接看出计算机对事物的认知。
隐藏层是在输入层和输出层之间众多神经元和链接组成的各个层面。隐藏层可以有多层,习惯上会用一层。这些隐藏层的作用是负责对输入信息的加工处理。就像人类的感知神经一样,信息的传递往往也是需要经过多层神经的传递,加工才能衍生出对这种感知的理解。在隐藏层中使用太少的神经元会导致欠拟合,相反,使用过多的神经元会导致过拟合。发生过拟合的话经常用Dropout方法进行处理。

输入层没有参与数据的计算,而输出层和隐藏层都参与数据的就算,所以在计算神经网络的层数时不算输入层。(这个不一定)

神经元:
1.每个神经元都是一个多输入单输出的信息处理单元;
2.神经元输入分兴奋性输入和抑制性输入两种类型;
3.神经元具有空间整合特性和阈值特性;
4.神经元输入与输出间有固定的时滞,主要取决于突触延搁;
5.忽略时间整合作用和不应期;
6.神经元本身是非时变的,即其突触时延和突触强度均为常数。
激活函数: 前面每一层输入经过线性变换wx+b后还用到了sigmoid函数,在神经网络的结构中被称为传递函数或者激活函数。除了sigmoid,还有tanh、relu等别的激活函数。激活函数使线性的结果非线性化。简单理解上,如果不加激活函数,无论多少层隐层,最终的结果还是原始输入的线性变化,这样一层隐层就可以达到结果,就没有多层感知器的意义了。所以每个隐层都会配一个激活函数,提供非线性变化。



二.BP算法。

基本思想: BP算法全称叫作误差反向传播(error Back Propagation,或者也叫作误差逆传播)算法。其算法基本思想为:在上述的前馈网络中,输入信号经输入层输入,通过隐层计算由输出层输出,输出值与标记值比较,若有误差,将误差反向由输出层向输入层传播,在这个过程中,利用梯度下降算法对神经元权值进行调整。

算法的推导:



通过以上过程可以更新所有权重,就可以再次迭代更新了,直到满足条件。

三.代码示例

import numpy as np
import matplotlib.pyplot as plt
import math
a=np.array([0.05,0.1])           #a1,a2的输入值
weight1=np.array([[0.15,0.25],[0.2,0.3]])   #a1对b1,b2的权重,a2对b1,b2的权重
weight2=np.array([[0.4,0.5],[0.45,0.55]])     #b1对c1,c2的权重,b2对c1,c2的权重
target=np.array([0.01,0.99])
d1=0.35   #输入层的偏置(1)的权重
d2=0.6    #隐藏层的偏置(1)的权重
β=0.5    #学习效率#一:前向传播#计算输入层到隐藏层的输入值,得矩阵netb1,netb2
netb=np.dot(a,weight1)+d1#计算隐藏层的输出值,得到矩阵outb1,outb2
m=[]
for i in range(len(netb)):outb=1.0 / (1.0 + math.exp(-netb[i]))m.append(outb)
m=np.array(m)#计算隐藏层到输出层的输入值,得矩阵netc1,netc2
netc=np.dot(m,weight2)+d2#计算隐藏层的输出值,得到矩阵outc1,outc2
n=[]
for i in range(len(netc)):outc=1.0 / (1.0 + math.exp(-netc[i]))n.append(outc)
n=np.array(n)#二:反向传播
count=0 #计数
e=0     #误差  
E=[]    #统计误差
#梯度下降
while True:count+=1#总误差对w1-w4的偏导pd1=(-(target[0]-n[0])*n[0]*(1-n[0])*weight2[0][0]-(target[1]-n[1])*n[1]*(1-n[1])*weight2[0][1])*m[0]*(1-m[0])*a[0]pd2=(-(target[0]-n[0])*n[0]*(1-n[0])*weight2[0][0]-(target[1]-n[1])*n[1]*(1-n[1])*weight2[0][1])*m[0]*(1-m[0])*a[1]pd3=(-(target[0]-n[0])*n[0]*(1-n[0])*weight2[1][0]-(target[1]-n[1])*n[1]*(1-n[1])*weight2[0][1])*m[0]*(1-m[0])*a[0]                          pd4=(-(target[0]-n[0])*n[0]*(1-n[0])*weight2[1][1]-(target[1]-n[1])*n[1]*(1-n[1])*weight2[0][1])*m[0]*(1-m[0])*a[1]weight1[0][0]=weight1[0][0]-β*pd1weight1[1][0]=weight1[1][0]-β*pd2weight1[0][1]=weight1[0][1]-β*pd3weight1[1][1]=weight1[1][1]-β*pd4#总误差对w5-w8的偏导pd5=-(target[0]-n[0])*n[0]*(1-n[0])*m[0]pd6=-(target[0]-n[0])*n[0]*(1-n[0])*m[1]pd7=-(target[1]-n[1])*n[1]*(1-n[1])*m[0]pd8=-(target[1]-n[1])*n[1]*(1-n[1])*m[1]weight2[0][0]=weight2[0][0]-β*pd5weight2[1][0]=weight2[1][0]-β*pd6weight2[0][1]=weight2[0][1]-β*pd7weight2[1][1]=weight2[1][1]-β*pd8netb=np.dot(a,weight1)+d1m=[]for i in range(len(netb)):outb=1.0 / (1.0 + math.exp(-netb[i]))m.append(outb)m=np.array(m)netc=np.dot(m,weight2)+d2n=[]for i in range(len(netc)):outc=1.0 / (1.0 + math.exp(-netc[i]))n.append(outc)n=np.array(n)#计算总误差for j in range(len(n)):e += (target[j]-n[j])**2/2E.append(e)#判断if e<0.0000001:breakelse:e=0
print(count)
print(e)
print(n)
plt.plot(range(len(E)),E,label='error')
plt.legend() 
plt.xlabel('time')
plt.ylabel('error')
plt.show()

结果展示

四.不足

虽然BP算法得到广泛的应用,但它也存在不足,其主要表现在训练过程不确定上,具体如下。
(1)训练时间较长。对于某些特殊的问题,运行时间可能需要几个小时甚至更长,这主要是因为学习率太小所致,可以采用自适应的学习率加以改进。
(2)完全不能训练。训练时由于权值调整过大使激活函数达到饱和,从而使网络权值的调节几乎停滞。为避免这种情况,一是选取较小的初始权值,二是采用较小的学习率。
(3)易陷入局部极小值。BP算法可以使网络权值收敛到一个最终解,但它并不能保证所求为误差超平面的全局最优解,也可能是一个局部极小值。这主要是因为BP算法所采用的是梯度下降法,训练是从某一起始点开始沿误差函数的斜面逐渐达到误差的最小值,故不同的起始点可能导致不同的极小值产生,即得到不同的最优解。如果训练结果未达到预定精度,常常采用多层网络和较多的神经元,以使训练结果的精度进一步提高,但与此同时也增加了网络的复杂性与训练时间。
(4)“喜新厌旧”。训练过程中,学习新样本时有遗忘旧样本的趋势。

更多推荐

欣小白的点滴 ————人工神经网络(ANN)

本文发布于:2024-02-10 13:49:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1675757.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:神经网络   点滴   欣小白   ANN

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!