From bd14660ca28d87282b9acf5caa5a5a16899a166e Mon Sep 17 00:00:00 2001 From: dongzhihong Date: Mon, 31 Jul 2017 23:51:44 +0800 Subject: [PATCH] "add part of design doc" --- paddle/framework/backward.md | 39 +++++++++++++++++- paddle/framework/images/duplicate_op.graffle | Bin 0 -> 2432 bytes paddle/framework/images/duplicate_op.png | Bin 0 -> 21893 bytes paddle/framework/images/duplicate_op2.graffle | Bin 0 -> 2460 bytes paddle/framework/images/duplicate_op2.png | Bin 0 -> 28971 bytes 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 paddle/framework/images/duplicate_op.graffle create mode 100644 paddle/framework/images/duplicate_op.png create mode 100644 paddle/framework/images/duplicate_op2.graffle create mode 100644 paddle/framework/images/duplicate_op2.png diff --git a/paddle/framework/backward.md b/paddle/framework/backward.md index 87c910ec8..74c001b06 100644 --- a/paddle/framework/backward.md +++ b/paddle/framework/backward.md @@ -1 +1,38 @@ -## Backward Policy Design +## Operator/expression 's Backward + +### Motivation + +In Neural Network, the backpropagation algorithm follows the chain rule, so we need to compound the fundmental gradient operators/expressions together with chain rule . Every forward network need a backward network to construct the full computation lineage, the operator/ expression's Backward feature will generate the backward pass respect to forward pass. + +### Implement : gradient operator registry + +| | forward operator | backward operator | +| ---------------------- | ---------------- | -------------------------------- | +| **Operator::inputs_** | Inputs | Inputs, Outputs, OutputGradients | +| **Operator::outputs_** | Outputs | InputGradients | + +Inputs/Outputs means the input/output of the operator, InputGradients/OutputGradients is the gradient respect to forward opeartor. Forward operator and Backward operator are isomorphic, save their corresponding needs into member attribute. + +We use a global hash map record the gradient operators available, follow the philosophy of minimum core, make operator pluggable unit. Each gradient is an operator and it needs to regist itself. + +grad_op_builder(fengjiayi) + +### Implement : Backward network + +given a forward network, it generates the backward network. We only care about the Gradients—`OutputGradients`,`InputGradients`. + +1. bla bla bla (yuyang) + +2. NetOp + + when the input forward network is a NetOp, it need to call the sub NetOp/Operators backward function recursively and ensure them done. During the process, we need to collect the `OutputGradients` name. + + We share variable in the same scope, as a result, duplicate operator `OutputGradients` will overwirte then duplicate variable. + + ![./images/duplicate_op]() + + Share variable between operators or same input variable used in multiple operators lead to a duplicate gradient variable. As demo show above, we need to rename gradient name recursively, and add a generic add operator instead. + +![./images/duplicate_op2]() + +​ Then collect the sub graph OutputGradients/InputGradients as the NetOp's and return it. diff --git a/paddle/framework/images/duplicate_op.graffle b/paddle/framework/images/duplicate_op.graffle new file mode 100644 index 0000000000000000000000000000000000000000..5979f792e252f028a615729215529c2be42d9165 GIT binary patch literal 2432 zcmV-`34it)+R5QT zr>lXCW^?aoU0WYYIeOk~-rU?Ys6sV7ajk%H^CS`@7RkFq5Vi>w8ou<`p_x>AK^^$j z=bqeNd$x7O?zUT=YCCy*Q(TW*8spgyrJ%OW|*R&y#k zRbebe%l~T}%URPh8nfoKe202hs>#rY=0-#A&0v#fpTHC%o|etj`1A>FXy|@J`{WR^ zp_!I_e_v2n;dcWXSF3hJz_T_>RSw!2eri*aH*X5-$h&}L$f?F@A&3-LS!u2~EpJEk zCQ~a@?C3bJ4%l;Mi0NH+lUgul?}WHs!XI{N_<_d95g+i(6Q-t2ESc}ftVV}_WEK3( z;*~lg7+;62fDgioPPnR5g6@o{2O?(ph|yqM2iHq(rcn5ze7Q|!MIC~$y@~8i9c$Qp zPRMi9(*BL$Q_)Td5mC8*TZDsmLp~HriDHd5k4FK$>v%M%G>bJJYA-Z(DOY>R1J=D8 zRjN>kh%z?u!?y6o*DRFfP@UP1RE#(A-&nCpO=uS#vJ^wPAadLdjbO7uOr+}&&)6iU zNmN*2VsB_VDn?aZSY>fFq$5@rSW~OWF1wZ0dT;kSHRwRxRH3IVP8_m~&P8o5Y|TR4 z)&*`QH2XXV@{ySp&wMuXpfVzbT;_`>{)`$1NixX7jPMwlkJJSem(iFOq%SqhZXGf8J<-iAj2%@B~#w zCNkDO_4*=|@-pc4QLi6zxOzhx#Y`e?p9LS7gmLzWjoEMafc2Dr0Qk3F#C!;)-XLNu zR5zEwn87tc{j0}rM-+x~Kf`(?PHY-6A+(`}fFp=|WC6O{f75ENd~(Ta|~7ae`a)Cn~l7rU;ZyEakp%s@;Qs>!2% zewHFNEOp4k1tgW1lY8w(ML{X{xZelo&Er$LaPoYSAWuZhW$t}GM_xAc1agq!Sh@{F z=2R=63YkoKHqbt!{-gQTSADGjrlpgV+f0YR&%miLaId&+#ce+{w;3yL`$F7iJ|%5?GPMyy2exsYxrrHa8io$< z(#XKrh9rw9>a!b==3y7>x{EF1+W(j2WWiXVqwHfWO;*d)jGj>Q+tb-Ms8SPkMBkWUeKL3H8GZp9-j9{F)|9E={Fp`)7a2V zm8?G-@RnzoU%3;_pR^A@%gT^qep@RWzmAnl+s0o-+|Q>o#ogeYp}2_^q_V5Kw3?Wr zLpqAPVhMb4WA&>s_gQ=>yesCHH}Mu8E{8tnF~6*C6D~EAj8rFdz~ag#-|8OUgKGfp zg40PBEwP{a55`7aQQWLNOEA-MP8}hLAKWgi9{i!jjud%BuWLLmX-30U_z8Snb|JVE zaF4~ysd3KP&4Xg+IUHy!#&W*PwL*TK+jc&0@kf<<5NhHL58Js-*)_|<8MeblG@^wy z;+pBA1Ro@7?uCQ=LiSV_U&x9wq1x@P-W(2DILIX;(+0?Nh1PWt(Frk14JP#;p`g4G zBfb>A7;K>8)x7Ab2HP7t2$_5gK8EP&3>lLp$Dc*T8{zZ*;|Aq_xp9+q6L+K?xF#pN{(?X=`afB$vx_5vgJ-<{yy z!M)>Lq z)p-w?m$$*q?yJS>AF{su9P=nXStS1ia)GEo&o$!HORfBnZU#&y1J8ra6ebJmnyKvF znI=vaCXIxHEE^HWK@Ple*eKc1Gj#u{+L`b*`@btjUqgJ6x|5DL z4w<5kIVr~}yp|t_!QI20aw=|?Jvj!@rH+jywBO~jN`L9;wnC1Q*0`pTOw>^4vC_;g zJ$|`FVwY4_V?PZ&_Q<+tA%8z+S+2j}>Ca-e7fK#2GW&Ubj#(9U!9z&%=TrIaIEug$ zi6yHiBT@Bae y1FregpVj5V8RVP><4Q-&ohhw}jrzsO>Q8wds&GbjO^!Toul)@*f@?mBJpcgH(!v-3 literal 0 HcmV?d00001 diff --git a/paddle/framework/images/duplicate_op.png b/paddle/framework/images/duplicate_op.png new file mode 100644 index 0000000000000000000000000000000000000000..f299c5d37f260a1bb0daec886f0a4ee1c1f31c92 GIT binary patch literal 21893 zcmeFZWpGFMb+)7{gcNF@bH6hs0<2nYxiX(=&f2nfh^@TU$Q3fyACN!ta!K)NVP zeuJo)AUXp7KyZ}Oa)E$A!ut1tgviXs0|U%kscO1v%FFSYIM^{8nK~GoF?-rMf}tTG z1U&h`U+v6XjmSLhZ0%k6JOwHK1HlLW{;!#Zg6uyat~P=cn(|6yq7KexWSq<#%wH&k z5Xs2M1e{IH`IN;Z{<}N)mmr0utE(d)3yX(`2eSt|vxBn*3o9=#FUuD;7B)5}Fa(o} zm%XczCzHJk<$odhUwFjKTuhv;99^v(?8*M&H8OT^a}}hZ_&3o1e*G7nu2$y%XC!-< z|DG0jf-L{;u&^?JVfo*|?5N{2-_xW6(MW8;50LQrg zU7(yX@(of)N#?@-jdGZ_{OR9#BFs>?qt44eR{mjwcw<}rcR?5y5A@e!_E94Ihb`a0 zoDh5=gKUGJVi`3IGWeej29`4a zvkd-!E`!}Aq9n%6xe~_xHh>SLTA7Y zrBWhCXVCo`iA96n@^~{TOzLyWDw)Hk`W4qy%pE?67CuCCUG*0k=F|^}mr-w}U&!28 zt*%Fy6lkT2c_ggHVn05ixH8)Hg`q%yLZ(%(S^|^w?b|okWV!F3w>Tj0({dz+Vn`_J z{NJ9B!Gu(4I*q0>J@c8VLO_w@_S(#q1qBPJQsIh1;bR&G@QMn&&aA@hk7fMexeh_V z(r&RoQ`bvn)S79uQ0&ji^8_KZ;EHX3PN0K)-jl;%4O)cn@9%d#SwOj=oiex�av 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 a)kk?Es*px@P4ew`H~t5dbgE|tKmY(R48rFC literal 0 HcmV?d00001 diff --git a/paddle/framework/images/duplicate_op2.png b/paddle/framework/images/duplicate_op2.png new file mode 100644 index 0000000000000000000000000000000000000000..c5588015d1450fd8c1bda3580680d884494868bb GIT binary patch literal 28971 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 OLj|a+OsSOVhyMXT=uKV# literal 0 HcmV?d00001 -- GitLab