BP神经网络算法(单变量版本)
网络结构定义
输入变量
Xm
X
m
,其中
m=1,2,3,...,Ninput
m
=
1
,
2
,
3
,
.
.
.
,
N
i
n
p
u
t
要预测的变量
tm
t
m
,其中
m=1,2,3,...,Ninput
m
=
1
,
2
,
3
,
.
.
.
,
N
i
n
p
u
t
设置三层网络结构,前两层为隐藏层,最后一层为输出层
第一层共有I个神经元,第二层共有J个神经元,第三层共有K个神经元。
前向传播
第一层
Wim
W
i
m
,表示 第一层神经网络第
i
i
个神经元和第个输入变量之前的权重。
bi
b
i
,表示 第一层神经网络第
i
i
个神经元的偏置。
,其中
net(1)i
n
e
t
i
(
1
)
表示第一层神经网络中第
i
i
个神经元的输出。
第一层的激活函数设为,则经过激活函数激活后第
i
i
个神经元的输出为
第二层
Wji
W
j
i
,表示 第二层神经网络第
j
j
个神经元和第个第一层神经网络的神经元输出之间的权重。
bj
b
j
,表示 第二层神经网络第
j
j
个神经元的偏置。
,其中
net(2)j
n
e
t
j
(
2
)
表示第二层神经网络中第
j
j
个神经元的输出。
第二层的激活函数设为,则经过激活函数激活后第
j
j
个神经元的输出为
第三层(输出层)
Wkj
W
k
j
,表示 第三层神经网络第
k
k
个神经元和第个第二层神经网络的神经元输出之间的权重。
bk
b
k
,表示 第三层神经网络第
k
k
个神经元的偏置。
,其中
net(3)k
n
e
t
k
(
3
)
表示第三层神经网络中第
k
k
个神经元的输出。
第三层的激活函数设为,则经过激活函数激活后第
k
k
个神经元的输出为
经过前向传播已经可以用来输出结果了。
但是怎么来训练这个神经网络呢?这里就要用到神经网络的反向传播!!
反向传播(Back-Propagation)-求导
要使用反向传播首先需要定义损失函数(loss function)。现在针对不同的领域损失函数的定义有非常多,这里用到最简单的均方差(Mean squared error-MSE)来训练分类任务的神经网络
均方差的定义
nt表示分类任务最后类别的数目。如果是抛硬币那么nt=2(正面和反面)。
PS:如果是分类问题,需要将这里的t_m进行one-hot编码。并且输出层神经元的个数与nt的大小相同。
输出层推导
根据链式法则(chain-rule),求权重的导数
其中设
∂loss∂net(3)k=δ(3)=2l(f(3)(net(3)k)−tk)⋅(f(3)′(net(3)k)⋅1)
∂
l
o
s
s
∂
n
e
t
k
(
3
)
=
δ
(
3
)
=
2
l
(
f
(
3
)
(
n
e
t
k
(
3
)
)
−
t
k
)
⋅
(
f
(
3
)
′
(
n
e
t
k
(
3
)
)
⋅
1
)
则
同理可得
这里就求得了最后一层相关权重和偏置的导数了。
第二层隐藏层推导
与输出层的求导非常相似,也是使用链式法则(chain-rule),求第二层隐藏层权重的导数
!!!注意
δ(3)k⋅∑Jj=1Wkjf(2)′(net(2)j)
δ
k
(
3
)
⋅
∑
j
=
1
J
W
k
j
f
(
2
)
′
(
n
e
t
j
(
2
)
)
这个式子 (************还需要配图说明)
其中设
∂loss∂net(2)j=δ(2)=∑Jj=1(Wkj⋅δ(3)k)⋅f(2)′(net(2)j)
∂
l
o
s
s
∂
n
e
t
j
(
2
)
=
δ
(
2
)
=
∑
j
=
1
J
(
W
k
j
⋅
δ
k
(
3
)
)
⋅
f
(
2
)
′
(
n
e
t
j
(
2
)
)
则
同理可得
第一层隐藏层推导
与第二层隐藏层推导一样,也是使用链式法则(chain-rule),求第一层隐藏层权重的导数
其中设
∂loss∂net(1)i=δ(1)=∑Ii=1(Wji⋅δ(2)j)⋅f(1)′(net(1)i)
∂
l
o
s
s
∂
n
e
t
i
(
1
)
=
δ
(
1
)
=
∑
i
=
1
I
(
W
j
i
⋅
δ
j
(
2
)
)
⋅
f
(
1
)
′
(
n
e
t
i
(
1
)
)
则
同理可得
神经网络中所有需要求解的导数都已经完成。接下来只要进行反向传播更新便可以训练该神经网络了。