提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
我在onnx模型转caffe模型时发现,caffe缺少一些onnx的算子。比如矩阵乘法算子,caffe默认是通过InnerProductLayer来实现。但是,InnerProductLayer的实现方式为输入一个矩阵X,全连接层提供权重矩阵W(这个权重矩阵W我们不能输入,为算子内部自动提供的parameter blob),之后输出Y(Y = WX),这与我们希望的矩阵乘法的实现方式有所不同。我们所希望的矩阵乘法应该满足两个输入X与W,通过算子得到输出Y,与Y = np.multiply(X,W)相似。
总言而之,caffe默认的矩阵乘法算子InnerProductLayer与我们所需要的乘法算子不同。不点在于:
- InnerProductLayer只能输入X,W自动提供,我们不能输入操作
- 我们希望的算子可以有两个输入X与W,与numpy的 np.multiply算子类似。
一、公式推导
假设损失函数(loss function)为 I \Iota I : R M × N R^{M×N} RM×N → R. 此损失函数的输入为 Z \Zeta Z: ∈ \in ∈ R M × N R^{M×N} RM×N, Z \Zeta Z = XY, 其中X与Y为矩阵乘法的输入,X ∈ \in ∈ R M × K R^{M×K} RM×K, Y ∈ \in ∈ R K × N R^{K×N} RK×N, Z \Zeta Z 就自然对应为矩阵乘法的输出。当神经网络做向后传递时(backward propagation), 损失函数的偏导数(partial derivatives)为 ∂ l ( Z ) ∂ X {∂ l(Z)}\over{∂X} ∂X∂l(Z) + ∂ l ( Z ) ∂ Y {∂ l(Z)}\over{∂Y} ∂Y∂l(Z)。所以,我们只要能够求解 ∂ l ( Z ) ∂ X {∂ l(Z)}\over{∂X} ∂X∂l(Z) ∈ \in ∈ R M × K R^{M×K} R