神经网络推导整理

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+ex
并且 π(x) 关于 x 的导数恰好为 π(x)(1π(x))


链式求导得出两个权重矩阵的更新向量

首先,展开 Loss(Y^)
Loss(Y^)=12(Y^Y)T(Y^Y)
Loss(Y^)=12(Y^TYT)(Y^Y)
Loss(Y^)=12[Y^TY^Y^TYYTY^+YTY]
Loss(Y^)Y^=12(2Y^2Y)=Y^Y
π(x) 关于 x 的导数恰好为 π(x)(1π(x))
Y^W2=Y^(1Y^)HT
Loss(Y^)W2=Loss(Y^)Y^Y^W2=(Y^Y)Y^(1Y^)HT
于是计算出权值矩阵 W2 的更新公式:
W2W2+η(Y^Y)Y^(1Y^)HT
接下来推导 W1 的更新公式
Loss(Y^)W1=Loss(Y^)Y^Y^HHW1=H(1H)W2T(Y^Y)Y^(1Y^)XT
于是:
W1W1+ηH(1H)W2T(Y^Y)Y^(1Y^)XT


关于W1更新公式中W2^T在公式中出现位置的理解

要注意的是,最后W1的推导,看起来会很奇怪,总感觉 W2T 应该放在最后。
这里我是这么理解的,先不考虑对整个 H 矩阵求偏导,只是对 H 当中的某一个元素 Hj 求导
那么前两步,就会变成:
Loss(Yk^)Yk^Yk^Hj=(Yk^Yk)Yk^(1Yk^)W2kj
然后,因为目前是要求 W1 矩阵的更新公式
因为 W1 矩阵中任意一个元素 W1ji 发生改变,实际上会直接影响到下游所有节点,而不像W2的元素 W2kj 发生变化时,只会影响到 Yk^ 的值。
所以对 Wji 求偏导的时候,不应该只有一个 Yk^ 参与,而是与所有 Yk^ 有关
这里不好写链式求导部分的偏导,有些书上会写成 netj 的偏导,我直接略去,只写后面的部分
ok=1(Yk^Yk)Yk^(1Yk^)W2kj
这个式子前面的 (Yk^Yk)Yk^(1Yk^) 只是一个值,如果写成矩阵形式 (Y^Y)Y^(1Y^) 的话,他的 shape=(o,1) 然后关键是它和 W2kj ok=1 关系,实际上转化为矩阵形式的书写格式,应该是这样:

(Y^Y)Y^(1Y^)W2[:,j]

即和 W2 中某一列发生了矩阵乘法
然后这时得到的也仅仅只是一个值。
注意到这个时候只是对 Hj 求了个偏导,如果对整个 H 求偏导,那么维度应该和 H 是一样的,即 shape=(m,1)
然后这里你会发现如果直接把 W2[:,j] 换成 W2 的话,这两个矩阵没法相乘。。维度不正确。
但是如果换一下
W2T(Y^Y)Y^(1Y^)

就刚好合适,首先维度是正确的。而且最后输出的结果 shape=(m,1)
如果在细心一点,关注一下这个结果的每一个元素,其实正好是之前的 (Y^Y)Y^(1Y^)W2[:,j]

猜你喜欢

转载自blog.csdn.net/xieshimao/article/details/79273386
今日推荐