深度神经网络算法,是基于神经网络算法的一种拓展,其层数更深,达到多层,本文以简单神经网络为例,利用梯度下降算法进行反向更新来训练神经网络权重和偏向参数,文章最后,基于Python 库实现了一个简单神经网络算法程序,并对异或运算和0-9字符集进行预测。
一、问题引入
利用如下图像结构,通过训练集对其参数进行训练,当有新的测试数据时,通过更新函数,获得正确的预测值,更新函数方程为:
Oij = activation(sum(xi*wij)+bij)
图中为简单的两层神经网络结构,4,5对应的为隐藏层,6为输出层,
activation代表激活函数,常用的有logistic和tanh函数,b称为偏向。
二、神经网络正向更新和反向更新规则介绍
对于正向更新:
Oij = activation(sum(xi*wij)+bij)
对于反向更新:
对于输出层:Errj = activation_derivate(Oj)*(Tj-Oj)
对于隐藏层:Errj = activation_derivate(Oj)*sum(Errk*Wjk)
delta(Wij) = l*Errj*Oij
delta(bj) = l*Errj
wij = wij + delta(wij)
bj = bj + delta(bj)
其中:
j代表第j层
k代表输出层
T代表实际标记值
O代表输出值
activation代表激活函数,常用的有logistic和tanh函数
activation_derivate代表激活函数的倒数
三、一个简单神经网络的数学运算实例
我们以一个3×2×1神经网络为例,说明如何利用正向更新和反向更新来训练神经网络,完成一次更新:
|
x1 |
x2 |
x3 |
w14 |
w15 |
w24 |
w25 |
w34 |
w35 |
w46 |
w56 |
b4 |
b5 |
b6 |
|
1 |
0 |
1 |
0.2 |
-0.3 |
0.4 |
0.1 |
-0.5 |
0.2 |
-0.3 |
-0.2 |
-0.4 |
-0.2 |
0.1 |
同时,我们设定学习率l=0.9,实际输出值为1
import numpy as np x1 = 1 x2 = 0 x3 = 1 w14 = 0.2 w15 = -0.3 w24 = 0.4 w25 = 0.1 w34 = -0.5 w35 = 0.2 w46 = -0.3 w56 = -0.2 b4 = -0.4 b5 = 0.2 b6 = 0.1 l = 0.9 t = 1 # 定义activation函数和倒数 def logistic(x): return 1/(1+np.exp(-x)) def logistic_derivate(x): return x*(1-x) # 正向更新 z4 = x1*w14 + x2*w24 + x3*w34 + b4 z5 = x1*w15 + x2*w25 + x3*w35 + b5 O4 = logistic(z4) O5 = logistic(z5) z6 = O4*w46 + O5 * w56 + b6 O6 = logistic(z6) print(O4,O5,O6) 结果:0.331812227832 0.524979187479 0.473888898824
# 求取各个神经元节点误差值 E6 = logistic_derivate(O6)*(t-O6) E5 = logistic_derivate(O5)*E6*w56 E4 = logistic_derivate(O4)*E6*w46 print(E6,E5,E4) 结果:0.131169078214 -0.00654208506417 -0.00872456196543
# 反向更新权重和偏向 w46 = w46 + l*E6*O4 w56 = w56 + l*E6*O5 w14 = w14 + l*E4*x1 w24 = w14 + l*E4*x2 w34 = w34 + l*E4*x3 w15 = w15 + l*E5*x1 w25 = w25 + l*E5*x2 w35 = w35 + l*E5*x3 print(w46,w56,w14,w15,w24,w25,w34,w35) 结果:-0.260828846342 -0.138025067507 0.192147894231 -0.305887876558 0.192147894231 0.1 -0.507852105769 0.194112123442
b4 = b4 + l*E4 b5 = b5 + l*E5 b6 = b6 + l*E6 print(b4,b5,b6)
结果:-0.407852105769 0.194112123442 0.21805217039
四、简单神经网络算python实现程序
介绍程序前,首先引入一个矩阵点乘基本运算
import numpy as np # 一维矩阵 a = np.arange(0,9) print(a) b = a[::-1] print(b) print(np.dot(a,b)) # 二维矩阵 a = np.arange(1,5).reshape(2,2) print(a) b = np.arange(5,9).reshape(2,2) print(b) c = np.dot(a,b) print(c) 结果: [0 1 2 3 4 5 6 7 8] [8 7 6 5 4 3 2 1 0] 84 [[1 2] [3 4]] [[5 6] [7 8]] [[19 22] [43 50]]