BP neural network with one hidden layer

二、实验要求(1)
- (1)各层节点数可配置
- (2)激活函数可配置
- (3)学习率参数可配置
- (4)初始权值可配置
- (5)训练(迭代)回合数可配置
- (6)总误差要求可配置
- (7)判别阈值可配置

二、实验要求(2)
- 输入层大小:mo=2
- 隐藏层大小:1.m1=20 2.m2=10
- 输出层大小:m2=1
- 激活函数:1.双曲正切函数(a=2) 2.logistic函数:a=2
- 阈值设置:0
- 学习率参数:1.l=0.001 2.学习率退火方案:l=0.1,l=l/(1+n/10)
- 迭代次数:10000
- 双月垂直分割距离:1.d=-4, 2.d=-5
- 报告分析:比较各迭代次数(100,1000,10000)时的性能

三、激活函数
logistic函数:

φ ( x ) = 1 1 + e a x ( a > 0 )

双曲正切函数:
φ ( x ) = a t a n h ( b x ) = a e b x e b x e b x + e b x ( a , b > 0 )

t a n h ( x ) = 2 s i g m o i d ( 2 x ) 1

四、神经网络模型的建立
模型如下,中间的隐藏层单元个数不定,根据实际情况进行设定,比如本次的实验要求隐藏层单元数分别为20或10,输入层大小为2,输出层大小为1,
激活函数:
logistic函数:

φ ( x ) = 1 1 + e 2 x

或是双曲正切函数:
φ ( x ) = a t a n h ( b x ) = 2 e 2 x e 2 x e 2 x + e 2 x

<img src="images/classification_kiank.png" style="width:600px;height:300px;">

五、BP网络传播的过程(手稿)
<img src="images/neural process.jpg">

六、BP网络的反向传播的计算
<img src="images/BP.jpg" style="width:600px;height:300px;">

七、BP网络参数的初始化
一般来说,尽量不要将参数初始化为0,这样得到的结果相对符合预期。参数为0的情况下在传播过程中不易得到最优解。
在实际的操作过程中,将参数W,b初始化为随机的小数。

八、BP网络的损失函数
将输出误差定义为

e = 1 2 ( a [ 2 ] y ) 2

那么总体网络的损失函数即为所有输入样本点的误差取均值。即:
E = 1 2 i = 1 m ( a i [ 2 ] y i ) 2

当成本函数:
$ J = 1 2 ( y ^ y ) 2
$

激活函数分别为sigmoid和tanh时

    dZ2= np.multiply(A2-Y, np.multiply(A2,1-A2))
    dW2 = np.dot(dZ2, A1.T)/m
    db2 = np.sum(dZ2, axis=1, keepdims=True)/m
    dZ1 = np.multiply(np.dot(W2.T, dZ2), 1-np.power(A1, 2))
    dW1 = np.dot(dZ1, X)/m
    db1 = np.sum(dZ1, axis=1, keepdims=True)/m
当成本函数为
$ J = 1 m i = 0 m ( y ( i ) log ( a [ 2 ] ( i ) ) + ( 1 y ( i ) ) log ( 1 a [ 2 ] ( i ) ) )
$

激活函数分别为tanh和sigmoid时

    dZ2 = A2 - Y
    dW2 = np.dot(dZ2, A1.T)/m
    db2 = np.sum(dZ2, axis=1, keepdims=True)/m
    dZ1 = np.multiply(np.dot(W2.T, dZ2), 1-np.power(A1,2))
    dW1 = np.dot(dZ1, X)/m
    db1 = np.sum(dZ1, axis=1, keepdims=True)/m

九、更新权值
上面已经求得了BP网络的权值梯度,根据学习率(表示梯度下降的一个程度)的大小,进行权值的更新。

W 1 = W 1 l e a r n i n g _ r a t e d W 1

b 1 = b 1 l e a r n i n g _ r a t e d b 1

W 2 = W 2 l e a r n i n g _ r a t e d W 2

b 2 = b 2 l e a r n i n g _ r a t e d b 2

* 十、结果的分类预测*
因为是一个二分类问题,根据实际输出值所在区间,比如,sigmoid函数作用后的输出域在

$ ( 0 , 1 )
, 0.5 0.5 0.5 p r e d i c t i o n s = y p r e d i c t i o n = { 1 if   ( a > 0.5 ) 0 otherwise $

Accuracy and Parameters

$ A c c u r a c y : 100 %
$

W1= [[-0.29009224  0.21190324]
 [ 0.35378405  0.26965377]
 [-0.29212524  0.17753929]
 [ 0.23700921 -0.21302723]]
b1 = [[-1.77782624]
 [-2.12916261]
 [-1.67842634]
 [-3.00917384]]
W2 = [[-1.5978967  -2.91601014 -1.47659465  2.5554046 ]]
b2 = [[-0.23817371]]

Visualize the result

<img src="images/result.png" style="text-align:centre;">

十一、迭代次数分别为100、1000和10000的网络性能
- 迭代100次的结果
<img src="images/iteration100.png" style="width:600px;height:300px;">
- 迭代1000次的结果
<img src="images/iteration1000.png" style="width:600px;height:300px;">
- 迭代10000次的结果
<img src="images/iteration10000.png" style="width:600px;height:300px;">

十二、调节神经网络过程的结果思考

在调节BP网络的过程中,发现并不是隐藏单元的个数越多越好,当我使用10个隐藏单元计算BP网络时,不仅仅是加大了计算复杂度,同时迭代的过程中得到的代价函数值也不能收敛至一个极小值。在经过尝试之后,发现4个隐藏单元的网络计算速度快,得到的结果好。
第二个就是学习率的问题,在多次尝试了0.1、0.01、0.001、0.8、1.2等学习率后,非常小的学习率虽然能减少梯度下降过程中的振荡问题,但是由于梯度下降速度太慢,几千次的迭代后,梯度会下降的越来越慢,导致结果不理想,在尝试了大于1的学习率后,能够显而易见的看到损失值的变化,最终的误差也能够控制在0.001之后,这样得到的结果基本上是一个很好的结果。正如我们看到的那样,在设置了1.2的学习率和4个隐藏单元后,我们迭代了1000次,得到了一个准确率为100%的分类结果。
当然,我们从上面可以看到,迭代次数会很是影响整个网络的输出结果的,当使用小学习率迭代10w次未必不能达到一个较好的结果。当然,对于小数据集无限的进行迭代计算是没有关系的,但是对于大数据集、深层网络来说,每一次的迭代计算都会耗费大量的时间,在深层网络中,如何优化好每一层的网络将依然是重中之重。

==实验代码、过程及结果见* BP neural network with one hidden layer.ipynb*文件==

猜你喜欢

转载自blog.csdn.net/qq_35882901/article/details/80371858