现在我们知道输出层的误差是
δk=(yk−y_k)f′(a_k)
隐藏层误差是
[图片上传失败...(image-a4330a-1519137685856)]
现在我们只考虑一个简单神经网络,它只有一个隐藏层和一个输出节点。这是通过反向传播更新权重的算法概述:
- 把每一层权重更新的初始步长设置为 0
- 输入到隐藏层的权重更新是 Δwij=0
- 隐藏层到输出层的权重更新是 ΔWj=0
- 对训练数据当中的每一个点
- 让它正向通过网络,计算输出 y^
- 计算输出节点的误差梯度 δo=(y−y^)f′(z) 这里 z=∑jWjaj 是输出节点的输入。
- 误差传播到隐藏层 δjh=δoWjf′(hj)
- 更新权重步长:
ΔWj=ΔWj+δoaj
Δwij=Δwij+δjhai
更新权重, 其中 η 是学习率,m 是数据点的数量:
Wj=Wj+ηΔWj/m
wij=wij+ηΔwij/m重复这个过程 e 代。
反向传播练习
现在你来实现一个通过反向传播训练的神经网络,数据集就是之前的研究生院录取数据。通过前面所学你现在有能力完成这个练习:
- 你的目标是:
实现一个正向传播
实现反向传播算法
更新权重
uare error on the training set
if e % (epochs / 10) == 0:
hidden_output = sigmoid(np.dot(x, weights_input_hidden))
out = sigmoid(np.dot(hidden_output,
weights_hidden_output))
loss = np.mean((out - targets) ** 2)
if last_loss and last_loss < loss:
print("Train loss: ", loss, " WARNING - Loss Increasing")
else:
print("Train loss: ", loss)
last_loss = loss
# Calculate accuracy on tesimport numpy as np
from data_prep import features, targets, features_test, targets_test
np.random.seed(21)
def sigmoid(x):
"""
Calculate sigmoid
"""
return 1 / (1 + np.exp(-x))
# Hyperparameters
n_hidden = 2 # number of hidden units
epochs = 900
learnrate = 0.005
n_records, n_features = features.shape
last_loss = None
# Initialize weights