有无激活函数训练bp的区别
对于bp神经网络有无激活函数训练,本文使用sigmod函数。
对于有sigmoid的bp神经网络,由于sigmod函数理论上讲可将线性相加的组合映射到(0,1)的区间,在一定程度上可以使得将输入进行预测并作出分类。同时,运用梯度下降来更新权重使得反向传播得到可能。
对于无sigmod函数,从理论上讲,其模型就是简单的线性相加求和,对于非线性模型进行预测毫无理论支撑性可言,并且其线性相加的数值可根据权值大小得出的结果也无限大小,其结果数值波动性也特别大,而非误差一直向数值小处进行拓展。
本文使用pycharm对两者进行模拟,对于反向传播,有sigmod函数的bp神经网络还是利用链式法则依次求偏导,无sigmod函数的bp神经网络则直接跳过对激活函数求偏导,而直接对输入函数z(z=w*x+b)求偏导。
迭代100次后观察得出:
无sigmod函数的bp神经网络,其残差数值波动性较大,可能第i+1次比第i次迭代得出的结果还要大,并可能由于偶然性因素,残差竟在第51次迭代得0。但其结果毫无理论性支撑可言。于是换了一组原始输入值,发现其得出结果误差波动性较大,其结果也无实际意义,无法解释其结果理论意义。
注:1.可能由于本人理解问题,如果说激活函数为relu函数,不考虑某个节点的输入值为负数的情况,那么在本文中无sigmod函数正对应于relu函数非负情况。
后续用relu函数试验了一下,第一次迭代中后续修改权值出现负数,表现还是波动性较大,可能后续会出现很多负数值,也可能由于本人设置学习率太高,让很多节点都死掉了。
2.可能层数比较浅,只有3层,relu函数无法发挥,relu表现出来线性的,用于多层(成百上千层)神经网络时表现非线性。

#有sigmod函数bp神经网络代码(学习率为1)
import numpy as np import math def nonlin(x, deriv=False): if (deriv == True): return x * (1 - x) #如果deriv为true,求导数 else: return 1 / (1 + np.exp(-x)) X = np.array([[0.35],[0.9]]) #输入层 y = np.array([[0.5]]) #输出值 np.random.seed(1) min=9999 W0 = np.array([[0.1,0.8],[0.4,0.6]]) W1 = np.array([[0.3,0.9]]) print('original ',W0,'\n',W1) print('begin time ') for j in range(100): l0 = X l1 = nonlin(np.dot(W0,l0)) l2 = nonlin(np.dot(W1,l1)) l2_error = y - l2 Error = 1/2.0*math.pow(l2_error,2) print('ERROR',j,':',Error) l2_delta = l2_error * nonlin(l2, deriv=True) #this will backpack #print 'l2_delta=',l2_delta l1_error = l2_delta*W1; #反向传播 l1_delta = l1_error * nonlin(l1.T, deriv=True) W1 += l2_delta*l1.T; #修改权值 W0 += l1_delta.dot(l0) print(W0,'\n',W1) print('endtime')
无sigmod函数bp神经网络代码(学习率为1)
import numpy as np import math X = np.array([[0.35],[0.9]]) #输入层 #第二次输入值为[0.8],[0.9] y = np.array([[0.5]]) #输出值 #第二次输入值为[0.7] np.random.seed(1) min=9999 W0 = np.array([[0.1,0.8],[0.4,0.6]]) W1 = np.array([[0.3,0.9]]) print('original ',W0,'\n',W1) print('begin time ') for j in range(100): l0 = X l1 = np.dot(W0,l0) l2 = np.dot(W1,l1) l2_error = y - l2 Error = 1/2.0*math.pow(l2_error,2) print('ERROR',j,':',Error) l1_delta = l2_error * W1 W1+=l2_error*l1.T W0+=l1_delta.dot(l0) #print("Error:",Error) print(W0,'\n',W1) print('endtime')

无sigmod函数结果

更改输入值后结果

浙公网安备 33010602011771号