自己对bp神经网络学习的了解

神经网络是一个有多个输入的函数,每一层的节点的输出为上一层节点输出的函数:Yi=f(Bi+E(Wij*Xj))。 E(Wij*Xj)表示对j=1->n(n为上层节点数),计算Wij*Xj的和。函数f一般为f(x)=1/(1+e^(-x))。x^y表示x的y次方

上一层的输出又可以表示为上上层输出的函数,直到输入层,展开来后输出层就是输入层的函数:OUTi=Fi(IN1,IN2,...),OUT=[OUT1,OUT2,..]=VF(IN1,IN2,...),输出结果OUT为一个数组或者叫向量,Fi与VF都是函数,VF(X)=[F1(X),F2(X),...]

BP网络通过输出Out与期望的标准输出STD(也是一个数组或者说向量)进行比较,来修改网络的权值,比较函数FuncE(OUT,STD)的输出为数值,表示OUT与STD的差异,有不同的FuncE函数可以使用,比如FuncE(OUT,STD)=0.5*E( (OUTi-STDi)^2 ),E( (OUTi-STDi)^2)表示(OUT1-STD1)^2+(OUT2-STD2)^2+...,FuncE越小表示OUT与STD越接近,BP网络的学习目标是使FuncE达到尽可能的小(应该说是对所有输入达到尽可能的小,FuncTotal=(FuncE1+FuncE2+...+FuncEn)/n,FuncEi表示对第i个输入的FuncE(OUT,STD)的值,不过感觉差别不大,计算FuncTotal感觉麻烦了点)

通过计算FuncE(OUT,STD)可以获取对于本次输入,神经网络的输出与期望的输出的差异,接下来根据差异对权值进行修改,注意OUT是输入的函数,也是权值的函数,现在输入为固定值,可以修改的为权值,即现在权值才是变量,比如y=a*x,可以理解为y是x的函数,也可以理解为y是a的函数,主要看x与a哪个是可变量。FuncE为OUT的函数,所以FuncE也是权值的函数,FuncE=Func(B,W)=Func(V)(B表示阈值的集合,W表示权重的集合,要详细表示太麻烦,比如第i层第j个节点的阈值(表示成Bij?),比如第i层第j个节点对于上一层第k个节点的权重(表示成Wijk?),阈值与权重都是权值,V表示权值的集合,V=[v1,v2,...])

权值修改利用最速下降法,通过求导,往导数反方向移动来使函数进入局部最小

用@(y,x)表示函数y对x的偏导数(正真的偏导数的符号不知道要怎么弄出来)

对于Func(V),如果vi修改了mi,,则Func(V)的值修改了Func(m1,m2,....),用偏导数表示:Func(V)修改了m1*@(Func,v1)+m2*@(Func,v2)+...,要Func(V)尽可能的小,可以使vi修改 -m*@(Func,vi),m为一个比较小的正数,比如0.1,0.01之类的,如此的话Func会修改 -m*@(Func,v1)*@(Func,v1)-m*@(Func,v2)*@(Func,v2)-...,显而易见@(Func,vi)*@(Func,vi)=@(Func,vi)^2为非负数,m也为正数,再加上一个负号,结果为负数,所以Func会变小,通过这种方法修改权值可以使Func慢慢的减小到一个局部最小值(显然最速下降法没法判断局部最小与函数的实际最小值的区别,所以只能到局部最小)

也可以考虑对函数FuncTotal(Func1,Func2,...Funcn)=(Func1+Func2+....+Funcn)/n求权值的偏导数来修改权值

以上为BP网络函数的学习计算方法,只知道神经网络通过学习可以用来辨别手写字母之类的,至于为什么可以学习到辨别能力,还没明白

猜你喜欢

转载自blog.csdn.net/qq_28415339/article/details/52227570
今日推荐