From 5171e1d92cfc5eefa2c20dfe8ac3fac5351ad19a Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Sun, 23 Jun 2019 11:02:23 +0530 Subject: [PATCH 1/9] fix missing input --- src/operator/tensor/elemwise_unary_op_basic.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/operator/tensor/elemwise_unary_op_basic.cc b/src/operator/tensor/elemwise_unary_op_basic.cc index 98dc8dad825f..92f25a20e551 100644 --- a/src/operator/tensor/elemwise_unary_op_basic.cc +++ b/src/operator/tensor/elemwise_unary_op_basic.cc @@ -1125,7 +1125,7 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log10, // f''(x) = -1 * (f'(x) * 1/x) auto dydx_mul_dldy = nnvm::NodeEntry{n}; // f'(x) * head_grads auto dydx = MakeNode("elemwise_div", n->attrs.name + "_dydx", - {n->inputs[0]}, nullptr, &n); + {dydx_mul_dldy, n->inputs[0]}, nullptr, &n); auto dlogx = MakeNode("reciprocal", n->attrs.name + "_dlogx", {n->inputs[1]}, nullptr, &n); auto d2ydx2_mid = MakeNode("elemwise_mul", n->attrs.name + "_d2ydx2_mid", @@ -1154,7 +1154,7 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log2, // f''(x) = -1 * (f'(x) * 1/x) auto dydx_mul_dldy = nnvm::NodeEntry{n}; // f'(x) * head_grads auto dydx = MakeNode("elemwise_div", n->attrs.name + "_dydx", - {n->inputs[0]}, nullptr, &n); + {dydx_mul_dldy, n->inputs[0]}, nullptr, &n); auto dlogx = MakeNode("reciprocal", n->attrs.name + "_dlogx", {n->inputs[1]}, nullptr, &n); auto d2ydx2_mid = MakeNode("elemwise_mul", n->attrs.name + "_d2ydx2_mid", From 5b95fb3ee3581ba20fe1def336621d68a811e17f Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Thu, 11 Jul 2019 20:11:14 +0530 Subject: [PATCH 2/9] update comments --- src/operator/tensor/elemwise_unary_op_basic.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/operator/tensor/elemwise_unary_op_basic.cc b/src/operator/tensor/elemwise_unary_op_basic.cc index 92f25a20e551..54f13995a3f4 100644 --- a/src/operator/tensor/elemwise_unary_op_basic.cc +++ b/src/operator/tensor/elemwise_unary_op_basic.cc @@ -1090,9 +1090,9 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log, unary_bwd) .set_attr("FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - // ograds[0]: dL/dxgrad + // ograds[0]: dL/dygrad // inputs[0]: dL/dy - // inputs[1]: x + // inputs[1]: x (ElemewiseGradUseIn) // f(x) = y = log(x) // f'(x) = 1/x // f''(x) = -1 * (f'(x) * f'(x)) @@ -1117,9 +1117,9 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log10, unary_bwd) .set_attr("FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - // ograds[0]: dL/dxgrad + // ograds[0]: dL/dygrad // inputs[0]: dL/dy - // inputs[1]: x + // inputs[1]: x (ElemewiseGradUseIn) // f(x) = y = log10(x) // f'(x) = 1 / (log(10) * x) // f''(x) = -1 * (f'(x) * 1/x) @@ -1146,9 +1146,9 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log2, unary_bwd) .set_attr("FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - // ograds[0]: dL/dxgrad + // ograds[0]: dL/dygrad // inputs[0]: dL/dy - // inputs[1]: x + // inputs[1]: x (ElemewiseGradUseIn) // f(x) = y = log2(x) // f'(x) = 1 / (log(2) * x) // f''(x) = -1 * (f'(x) * 1/x) From a64b35f40396912d8ca71c58fbe8816aea13f13e Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Fri, 26 Jul 2019 20:19:23 +0530 Subject: [PATCH 3/9] update comments --- src/operator/tensor/elemwise_unary_op_basic.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/operator/tensor/elemwise_unary_op_basic.cc b/src/operator/tensor/elemwise_unary_op_basic.cc index 54f13995a3f4..d835edfbc7a7 100644 --- a/src/operator/tensor/elemwise_unary_op_basic.cc +++ b/src/operator/tensor/elemwise_unary_op_basic.cc @@ -1090,8 +1090,8 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log, unary_bwd) .set_attr("FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - // ograds[0]: dL/dygrad - // inputs[0]: dL/dy + // ograds[0]: dL/dxgrad + // inputs[0]: dL/dy (ygrad) // inputs[1]: x (ElemewiseGradUseIn) // f(x) = y = log(x) // f'(x) = 1/x @@ -1117,8 +1117,8 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log10, unary_bwd) .set_attr("FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - // ograds[0]: dL/dygrad - // inputs[0]: dL/dy + // ograds[0]: dL/dxgrad + // inputs[0]: dL/dy (ygrad) // inputs[1]: x (ElemewiseGradUseIn) // f(x) = y = log10(x) // f'(x) = 1 / (log(10) * x) @@ -1146,8 +1146,8 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log2, unary_bwd) .set_attr("FGradient", [](const nnvm::NodePtr& n, const std::vector& ograds) { - // ograds[0]: dL/dygrad - // inputs[0]: dL/dy + // ograds[0]: dL/dxgrad + // inputs[0]: dL/dy (ygrad) // inputs[1]: x (ElemewiseGradUseIn) // f(x) = y = log2(x) // f'(x) = 1 / (log(2) * x) From bfd2d9bf2bf3969dff8e0526f00e284e2b01304c Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Thu, 1 Aug 2019 22:02:32 +0530 Subject: [PATCH 4/9] retrigger CI From fa51e3521aad4bbc828a9e9be634641561bd2cef Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Sat, 31 Aug 2019 10:20:49 +0530 Subject: [PATCH 5/9] retrigger CI From 9885e6266e146cabaca55325e1a0bfa53ca007de Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Sat, 7 Sep 2019 12:43:35 +0530 Subject: [PATCH 6/9] update node_op_util --- src/nnvm/node_op_util.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/nnvm/node_op_util.h b/src/nnvm/node_op_util.h index 8d5916aafff9..54a96336fb94 100644 --- a/src/nnvm/node_op_util.h +++ b/src/nnvm/node_op_util.h @@ -68,6 +68,18 @@ class NodeOpGen { dependent_node->attrs.name + "_square", {x}, nullptr, &dependent_node)}; } + + nnvm::NodeEntry reciprocal(const nnvm::NodeEntry &x) { + return nnvm::NodeEntry{mxnet::op::MakeNode("reciprocal", + dependent_node->attrs.name + "_reciprocal", + {x}, nullptr, &dependent_node)}; + } + + nnvm::NodeEntry negative(const nnvm::NodeEntry &x) { + return nnvm::NodeEntry{mxnet::op::MakeNode("negative", + dependent_node->attrs.name + "_negative", + {x}, nullptr, &dependent_node)}; + } }; } // namespace util From 09ada96241ec3d12d6e2ccbdcccb2c4f2becfee8 Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Sat, 7 Sep 2019 12:44:33 +0530 Subject: [PATCH 7/9] use NodeOpGen for _backward_log* --- .../tensor/elemwise_unary_op_logexp.cc | 61 ++++++++----------- 1 file changed, 27 insertions(+), 34 deletions(-) diff --git a/src/operator/tensor/elemwise_unary_op_logexp.cc b/src/operator/tensor/elemwise_unary_op_logexp.cc index d3c1676c9f02..7ca12e0b248b 100644 --- a/src/operator/tensor/elemwise_unary_op_logexp.cc +++ b/src/operator/tensor/elemwise_unary_op_logexp.cc @@ -25,6 +25,7 @@ #include "elemwise_unary_op.h" #include "./elemwise_binary_op-inl.h" #include "../nn/mkldnn/mkldnn_ops-inl.h" +#include "../../nnvm/node_op_util.h" namespace mxnet { namespace op { @@ -115,20 +116,18 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log, // f(x) = y = log(x) // f'(x) = 1/x // f''(x) = -1 * (f'(x) * f'(x)) + auto x = n->inputs[1]; auto dydx_mul_dldy = nnvm::NodeEntry{n}; // f'(x) * head_grads - auto dlogx = MakeNode("reciprocal", n->attrs.name + "_dlogx", - {n->inputs[1]}, nullptr, &n); - auto d2ydx2_mid = MakeNode("elemwise_mul", n->attrs.name + "_d2ydx2_mid", - {dydx_mul_dldy, nnvm::NodeEntry{dlogx}}, nullptr, &n); - auto d2ydx2 = MakeNode("negative", n->attrs.name + "_d2ydx2", - {nnvm::NodeEntry{d2ydx2_mid}}, nullptr, &n); + auto op = mxnet::util::NodeOpGen{n}; + + auto dlogx = op.reciprocal(x); + auto d2ydx2_mid = op.mul(dydx_mul_dldy, dlogx); + auto d2ydx2 = op.negative(d2ydx2_mid); std::vector ret; + ret.emplace_back(op.mul(ograds[0], dlogx)); + ret.emplace_back(op.mul(ograds[0], d2ydx2)); - ret.emplace_back(MakeNode("elemwise_mul", n->attrs.name + "_backward_grad_grad", - {ograds[0], nnvm::NodeEntry{dlogx}}, nullptr, &n)); - ret.emplace_back(MakeNode("elemwise_mul", n->attrs.name + "_backward_grad_grad_inp", - {ograds[0], nnvm::NodeEntry{d2ydx2}}, nullptr, &n)); return ret; }); @@ -142,22 +141,19 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log10, // f(x) = y = log10(x) // f'(x) = 1 / (log(10) * x) // f''(x) = -1 * (f'(x) * 1/x) + auto dldy = n->inputs[0]; + auto x = n->inputs[1]; auto dydx_mul_dldy = nnvm::NodeEntry{n}; // f'(x) * head_grads - auto dydx = MakeNode("elemwise_div", n->attrs.name + "_dydx", - {dydx_mul_dldy, n->inputs[0]}, nullptr, &n); - auto dlogx = MakeNode("reciprocal", n->attrs.name + "_dlogx", - {n->inputs[1]}, nullptr, &n); - auto d2ydx2_mid = MakeNode("elemwise_mul", n->attrs.name + "_d2ydx2_mid", - {dydx_mul_dldy, nnvm::NodeEntry{dlogx}}, nullptr, &n); - auto d2ydx2 = MakeNode("negative", n->attrs.name + "_d2ydx2", - {nnvm::NodeEntry{d2ydx2_mid}}, nullptr, &n); + auto op = mxnet::util::NodeOpGen{n}; + auto dydx = op.div(dydx_mul_dldy, dldy); + auto dlogx = op.reciprocal(x); + auto d2ydx2_mid = op.mul(dydx_mul_dldy, dlogx); + auto d2ydx2 = op.negative(d2ydx2_mid); std::vector ret; + ret.emplace_back(op.mul(ograds[0], dydx)); + ret.emplace_back(op.mul(ograds[0], d2ydx2)); - ret.emplace_back(MakeNode("elemwise_mul", n->attrs.name + "_backward_grad_grad", - {ograds[0], nnvm::NodeEntry{dydx}}, nullptr, &n)); - ret.emplace_back(MakeNode("elemwise_mul", n->attrs.name + "_backward_grad_grad_inp", - {ograds[0], nnvm::NodeEntry{d2ydx2}}, nullptr, &n)); return ret; }); @@ -171,22 +167,19 @@ MXNET_OPERATOR_REGISTER_BINARY_WITH_SPARSE_CPU_DR(_backward_log2, // f(x) = y = log2(x) // f'(x) = 1 / (log(2) * x) // f''(x) = -1 * (f'(x) * 1/x) + auto dldy = n->inputs[0]; + auto x = n->inputs[1]; auto dydx_mul_dldy = nnvm::NodeEntry{n}; // f'(x) * head_grads - auto dydx = MakeNode("elemwise_div", n->attrs.name + "_dydx", - {dydx_mul_dldy, n->inputs[0]}, nullptr, &n); - auto dlogx = MakeNode("reciprocal", n->attrs.name + "_dlogx", - {n->inputs[1]}, nullptr, &n); - auto d2ydx2_mid = MakeNode("elemwise_mul", n->attrs.name + "_d2ydx2_mid", - {dydx_mul_dldy, nnvm::NodeEntry{dlogx}}, nullptr, &n); - auto d2ydx2 = MakeNode("negative", n->attrs.name + "_d2ydx2", - {nnvm::NodeEntry{d2ydx2_mid}}, nullptr, &n); + auto op = mxnet::util::NodeOpGen{n}; + auto dydx = op.div(dydx_mul_dldy, dldy); + auto dlogx = op.reciprocal(x); + auto d2ydx2_mid = op.mul(dydx_mul_dldy, dlogx); + auto d2ydx2 = op.negative(d2ydx2_mid); std::vector ret; + ret.emplace_back(op.mul(ograds[0], dydx)); + ret.emplace_back(op.mul(ograds[0], d2ydx2)); - ret.emplace_back(MakeNode("elemwise_mul", n->attrs.name + "_backward_grad_grad", - {ograds[0], nnvm::NodeEntry{dydx}}, nullptr, &n)); - ret.emplace_back(MakeNode("elemwise_mul", n->attrs.name + "_backward_grad_grad_inp", - {ograds[0], nnvm::NodeEntry{d2ydx2}}, nullptr, &n)); return ret; }); From 15ef0ba240ff19b4e3d6d290496ae7536069fc58 Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Sat, 7 Sep 2019 14:37:52 +0530 Subject: [PATCH 8/9] retrigger cI From 60e51ebbec662df3d7e2fd399aa4776f0b13d9cc Mon Sep 17 00:00:00 2001 From: kshitij12345 Date: Wed, 11 Sep 2019 19:09:36 +0530 Subject: [PATCH 9/9] retrigger CI