一、参数
1. 输入层:X = 【x1,x2,x3,…xn】
输入层表示特征的个数
2. 输出层:Y = 【y1,y2,y3,…yn】
对于分类问题,输出层的个数为类别个数
3. 隐藏层
规则: 默认一层,隐藏层的单元数要比输入层的单元数多
若为多层,每层的单元数要相同,理论上每层的单元数越多越好,但单元数过多会导致计算量增大
4.学习率: θ,用于更新权重
5.迭代次数: numIter
6.图示
二、前向传播算法
1. 目的: 用于计算除了输入层的每层的激励anumlayer
其中:
layer为从隐藏层开始的每一层,如:第一层隐藏层为anum(1)
num为该层的激励的序号,如:第一层隐藏层的第一个单元的激励为a1(1),第一层隐藏层的第二个单元的激励为a2(1),以此类推。
2. 计算每一层的激励
a1(1) = g(w10(1)x0 + w11(1)x1 + w12(1)x2) = g(z1(1))
a2(1) = g(w20(1)x0 + w21(1)x1 + w22(1)x2) = g(z2(1))
其中,
x0为偏置单元,是一个常量
w21(1)为权重,其下标表示第一层对第二层的权重
g()为激励函数,这里使用sigmoid函数作为激励函数
z1(1) = w10(1)x0 + w11(1)x1 + w12(1)x2)
三、反向传播算法
1. 目的: 计算误差项
2. 计算每一层的误差项
对于输出层: δ(2) = a(2) - Y
对于隐藏层: δ(1) = (w(1))Tδ(2) .* g‘(z(1)) - Y
其中:.表示点乘,即矩阵对应元素相乘(python中使用np.dot),其余为正常乘法(python中使用np.multipy)
g‘(z(1)) = a(1) .* (1 - a(1))
四、权值更新
w <- w + θδ该层的输入
五、代码实现
import numpy as np
#定义激活函数
def sigmoid(x):
return 1 / (1+np.exp(-x))
if __name__ == "__main__":
x = [0.05,0.10]
y = [0.01,0.99]
b1 = 0.35
b2 = 0.60
w1 = [[0.15,0.20],[0.25,0.30]]
w2 = [[0.40,0.45],[0.50,0.55]]
theta = 0.5
numIter = 10000
#前向传播
z1 = np.dot(w1,x) + b1
a1 = sigmoid(z1)
z2 = np.dot(w2,x) + b2
a2 = sigmoid(z2)
for n in range(numIter):
#反向传播
delta2 = a2 - y
delta1 = np.multiply(np.dot(np.array(w2).T,delta2),np.multiply(a1,1-a1))
#更新权重
for i in range(len(w2)):
w2[i] = w2[i] - theta * delta2[i] * a1
for i in range(len(w1)):
w1[i] = w1[i] - theta * delta1[i] * np.array(x)
#继续向前传播输出结果
z1 = np.dot(w1, x) + b1
a1 = sigmoid(z1)
z2 = np.dot(w2, x) + b2
a2 = sigmoid(z2)
print(str(n) + " result:" + str(a2[0]) + ", result:" + str(a2[1]))