BP神经网络推导整理
维度计算:
输入矩阵维度:
shape(X)=(n,1)
输出矩阵维度:
shape(Y)=(o,1)
隐藏层神经元个数m,输入层到隐藏层的权重维度:
shape(W1)=(m,n)
隐藏层神经元个数m,隐藏层到输出层的权重维度:
shape(W2)=(o,m)
可通过以上条件计算出隐藏层输出矩阵H的维度:
shape(H)=shape(W1)shape(X)=(m,n)(n,1)=(m,1)
正向计算:
隐含层输出:
H=π(W1X)
神经网络输出:
Y^=π(W2H)
根据神经网络输出和真实结果计算损失:
Loss(Y^)=12(Y^−Y)T(Y^−Y)
其中
π(x)
是
sigmoid
激活函数,具体形式为:
π(x)=11+e−x
并且
π(x)
关于
x
的导数恰好为
链式求导得出两个权重矩阵的更新向量
首先,展开
Loss(Y^)
:
Loss(Y^)=12(Y^−Y)T(Y^−Y)
Loss(Y^)=12(Y^T−YT)(Y^−Y)
Loss(Y^)=12[Y^TY^−Y^TY−YTY^+YTY]
∂Loss(Y^)∂Y^=12(2Y^−2Y)=Y^−Y
∵π(x)
关于
x
的导数恰好为
∴∂Y^∂W2=Y^(1−Y^)HT
∂Loss(Y^)∂W2=∂Loss(Y^)∂Y^∂Y^∂W2=(Y^−Y)Y^(1−Y^)HT
于是计算出权值矩阵
W2
的更新公式:
W2←W2+η(Y^−Y)Y^(1−Y^)HT
接下来推导
W1
的更新公式
∂Loss(Y^)∂W1=∂Loss(Y^)∂Y^∂Y^∂H∂H∂W1=H(1−H)W2T(Y^−Y)Y^(1−Y^)XT
于是:
W1←W1+ηH(1−H)W2T(Y^−Y)Y^(1−Y^)XT
关于W1更新公式中W2^T在公式中出现位置的理解
要注意的是,最后W1的推导,看起来会很奇怪,总感觉
W2T
应该放在最后。
这里我是这么理解的,先不考虑对整个
H
矩阵求偏导,只是对
那么前两步,就会变成:
∂Loss(Yk^)∂Yk^∂Yk^∂Hj=(Yk^−Yk)Yk^(1−Yk^)W2kj
然后,因为目前是要求
W1
矩阵的更新公式
因为
W1
矩阵中任意一个元素
W1ji
发生改变,实际上会直接影响到下游所有节点,而不像W2的元素
W2kj
发生变化时,只会影响到
Yk^
的值。
所以对
Wji
求偏导的时候,不应该只有一个
Yk^
参与,而是与所有
Yk^
有关
这里不好写链式求导部分的偏导,有些书上会写成
netj
的偏导,我直接略去,只写后面的部分
∑ok=1(Yk^−Yk)Yk^(1−Yk^)W2kj
这个式子前面的
(Yk^−Yk)Yk^(1−Yk^)
只是一个值,如果写成矩阵形式
(Y^−Y)Y^(1−Y^)
的话,他的
shape=(o,1)
然后关键是它和
W2kj
的
∑ok=1
关系,实际上转化为矩阵形式的书写格式,应该是这样:
即和 W2 中某一列发生了矩阵乘法
然后这时得到的也仅仅只是一个值。
注意到这个时候只是对 Hj 求了个偏导,如果对整个 H 求偏导,那么维度应该和
然后这里你会发现如果直接把 W2[:,j] 换成 W2 的话,这两个矩阵没法相乘。。维度不正确。
但是如果换一下
就刚好合适,首先维度是正确的。而且最后输出的结果 shape=(m,1)
如果在细心一点,关注一下这个结果的每一个元素,其实正好是之前的 (Y^−Y)Y^(1−Y^)W2[:,j]