简单的数学推导,讲解神经网络中常用的梯度下降.
为了便于理解, 我们就用最简单的网络来讲解.比如下面的网络.
此网络只有简单的两层,3个输入
x1,x2,x3. 1个输出
y^,激活函数
f(h)采用sigmoid函数.梯度下降的目标是求得最合适的权重
w1,w2,w3使得预测输出
y^与真实值
y之间的误差
E=21(y−y^)最小, 这里的
21是为了方便计算. 从下图直观的感受下, 就是沿着梯度下降的方向移动, 逐渐到达
E的最小值处.
上图箭头的方向就是梯度下降方向的更新步长
Δw=−gradient,下面来推导一下如何求得
Δw.
∂wi∂E=∂wi∂21(y−y^)2=(y−y^)∂wi∂(y−y^)=−(y−y^)∂wi∂y^
其中
y^=f(x) 且
h=∑iwixi, 那我们进一步对上式推导:
∂wi∂E=−(y−y
)∂wi∂y^=−(y−y
)f′(h)∂wi∂∑wixi
其中:
∂ωi∂i∑wixi=∂ωi∂[w1,x1+w2x2+…+wixi+…wnxn]=xi
到此未知我们就顺利的得到了误差
E关于
wi的梯度:
∂ωi∂E=−(y−y^)f′(h)xi
沿着梯度下降的方向,以一定的学习速率
η移动,来更行步长:
Δwi=η∂ωi∂E
为了方便表述,也便于求解,将步长更新
Δwi改写为:
Δwi=ηδxi
其中:
η为学习速率,值越大权重
w更新的速度也就越快.
δ为误差项 error term.
δ=−(y−y^)f′(h)
有了权重
w的步长更新
Δw,我们就可以得到进一步接近最优解的新权重了
w=w+Δw.如此反复,经过一步步的迭代,权重
w将逐步收敛到最优解,就像上图2示意的那样,这就是梯度下降了.
根据上面的简单网络, 实列演示, 看具体怎么用梯度下降来更新权重
w.
import numpy as np
#定义sigmoid函数
def sigmoid(x):
return 1/(1+np.exp(-x))
#sigmoid函数求导
def sigmoid_prime(x):
return sigmoid(x) * (1 - sigmoid(x))
learnrate = 0.5 #学习率
x = np.array([1, 2, 3]) #定义输入.x1,x2,x3
y = np.array(0.5) #定义输出
w = np.array([0.5, -0.5, 0.3]) #初始化权重,也就是上文中的w1,w2,w3.
h = np.dot(x,w) #求得h的值
nn_output = sigmoid(h) #求得f(h)的值
error = y-nn_output #求得误差
error_term = sigmoid_prime(h)*error #求得误差项
del_w = learnrate*error_term*x #权重w的改变del_w
print('网络的输出:')
print(nn_output)
print('误差Error:')
print(error)
print('权重w的改变:')
print(del_w)
网络的输出:
0.598687660112452
误差Error:
-0.098687660112452
权重w的改变del_w:
[-0.01185539 -0.02371077 -0.03556616]