本菜鸡觉得RNN求导公式太复杂了, 所以想了一个办法拆分求导的公式.
那就是用语法树.
原文参见RNN反向求导详解_格物致知-CSDN博客

otLt=φ(Vst)=φ(Vϕ(Wst−1+Uxt))=loss(ot,yt)
令ot∗=Vst, st∗=Uxt+Wst−1
则ot=φ(ot∗), st=ϕ(st∗)
现在把Lt画成一棵语法树, 然后开始一步一步求导

用∗表示元素相乘, 用×表示矩阵乘法
∂ot∗∂Lt=∂ot∂Lt∗∂ot∗∂ot=∂ot∂Lt∗φ′(ot∗)(1)
式1的结果是一个与ot∗的维度一致的向量.
∂Vt∂Lt=∂ot∗∂Lt[?]∂V∂ot∗(2)
公式2整体上是标量对矩阵求导, 标量对矩阵求导就是标量对矩阵中的每个元素求导; 有一个中间值ot∗是向量.
的前半部分在公式1中求过了, 后面是对矩阵×向量的求导
既然是对V求导那结果的形状必然跟V一样
还是写个例子算算怎么求导吧
o∗=V×s=⎣⎡V11V21V31V12V22V32V13V23V33V14V24V34⎦⎤×⎣⎢⎢⎡s1s2s3s4⎦⎥⎥⎤=⎣⎡V11s1+V12s2+V13s3+V14s4V21s1+V22s2+V23s3+V24s4V31s1+V32s2+V33s3+V34s4⎦⎤=⎣⎡o1∗o2∗o3∗⎦⎤(3)
∂V11∂L=∂o1∗∂L∂V11∂o1∗∂V12∂L=∂o1∗∂L∂V12∂o1∗∂V34∂L=∂o3∗∂L∂V34∂o3∗=∂o1∗∂Ls1=∂o1∗∂Ls2⋮=∂o3∗∂Ls4
∂V∂L=⎣⎢⎢⎢⎢⎢⎢⎡∂o1∗∂L∂o2∗∂L∂o3∗∂L⎦⎥⎥⎥⎥⎥⎥⎤×[s1s2s3s4]
所以式2应该写成
∂Vt∂Lt=∂ot∗∂Lt×∂V∂ot∗=∂ot∗∂Lt×stT(4)
然后求Lt对st的导数, 还要参考式3

图片来源: https://wenku.baidu.com/view/0c28ff2249d7c1c708a1284ac850ad02de8007c1.html
∂s1∂L∂s4∂L=[∂o1∗∂L∂s1∂o1∗+∂o2∗∂L∂s1∂o2∗+∂o3∗∂L∂s1∂o3∗]⋮=[∂o1∗∂L∂s4∂o1∗+∂o2∗∂L∂s4∂o2∗+∂o3∗∂L∂s4∂o3∗]
∂s∂L=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡∂o1∗∂L∂s1∂o1∗+∂o2∗∂L∂s1∂o2∗+∂o3∗∂L∂s1∂o3∗∂o1∗∂L∂s2∂o1∗+∂o2∗∂L∂s2∂o2∗+∂o3∗∂L∂s2∂o3∗∂o1∗∂L∂s3∂o1∗+∂o2∗∂L∂s3∂o2∗+∂o3∗∂L∂s3∂o3∗∂o1∗∂L∂s4∂o1∗+∂o2∗∂L∂s4∂o2∗+∂o3∗∂L∂s4∂o3∗⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡∂s1∂o1∗∂s2∂o1∗∂s3∂o1∗∂s4∂o1∗∂s1∂o2∗∂s2∂o2∗∂s3∂o2∗∂s4∂o2∗∂s1∂o3∗∂s2∂o3∗∂s3∂o3∗∂s4∂o3∗⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤×⎣⎢⎢⎢⎢⎢⎢⎡∂o1∗∂L∂o2∗∂L∂o3∗∂L⎦⎥⎥⎥⎥⎥⎥⎤=?×∂ot∂L(5)
要解决式5的后一步, 需要先向量求导的问题
参考链接: https://zhuanlan.zhihu.com/p/36448789
文中有一句话:
不过为了方便我们在实践中应用,通常情况下即使y向量是列向量也按照行向量来进行求导。
根据这句话可以得出, 一般情况下是行向量对列向量求导.
行向量X对列向量Y求导会形成一个矩阵, 矩阵的宽度是X的长度, 矩阵的高度是Y的长度
所以式5中的问号矩阵应该是一个行向量ot∗对列向量s求导
∂st∂L=∂st∂ot∗×∂ot∗∂L(6)
式6中的∂st∂ot∗还可以继续求出结果
∂st∂ot∗=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡∂s1∂o1∗∂s2∂o1∗∂s3∂o1∗∂s4∂o1∗∂s1∂o2∗∂s2∂o2∗∂s3∂o2∗∂s4∂o2∗∂s1∂o3∗∂s2∂o3∗∂s3∂o3∗∂s4∂o3∗⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎡V11V12V13V14V21V22V23V24V31V32V33V34⎦⎥⎥⎤=VT
上面的结果带入式6中得到
∂st∂L=∂st∂ot∗×∂ot∗∂L=VT×∂ot∗∂L(7)
到此为止, 所以涉及到的技术都已经写完了, 把求导结果都填到语法树上后

分析后面发现, 后面的结构都是对前面的规律的简单重复.
所以后面随便填两个吧!
