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函数:
双曲正切函数:
四、神经网络模型的建立
模型如下,中间的隐藏层单元个数不定,根据实际情况进行设定,比如本次的实验要求隐藏层单元数分别为20或10,输入层大小为2,输出层大小为1,
**函数:
logistic函数:
或是双曲正切函数:
五、BP网络传播的过程(手稿)
六、BP网络的反向传播的计算
七、BP网络参数的初始化
一般来说,尽量不要将参数初始化为0,这样得到的结果相对符合预期。参数为0的情况下在传播过程中不易得到最优解。
在实际的操作过程中,将参数W,b初始化为随机的小数。
八、BP网络的损失函数
将输出误差定义为
那么总体网络的损失函数即为所有输入样本点的误差取均值。即:
当成本函数:$
**函数分别为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
当成本函数为$
**函数分别为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网络的权值梯度,根据学习率(表示梯度下降的一个程度)的大小,进行权值的更新。
* 十、结果的分类预测*
因为是一个二分类问题,根据实际输出值所在区间,比如,sigmoid函数作用后的输出域在
Accuracy and Parameters
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
十一、迭代次数分别为100、1000和10000的网络性能
- 迭代100次的结果
- 迭代1000次的结果
- 迭代10000次的结果
十二、调节神经网络过程的结果思考
在调节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*文件==