æè¿ãç§ã¯ããŒãããŒã®1人ãšè©±ãããŸããããHabréã§ã®CNTKã®å©ç¹ã«ã€ããŠã»ãšãã©è©±ããªãçç±ãå°ããããŸããã æåã¯ãäŒç€Ÿã®ããã°ã®èšäºãåãäŒç€Ÿã®è£œåã®å©ç¹ãããäžè¬çãªããšãèããŸããã ãããã圌ãã¯ãããçŽ æŽããããšå€æããããªãã®æèŠãèŠã€ããŠãã£ããããããšãã§ããŸããã CNTKãšTensorFlowã®ãããã¯ã«èå³ã®ãããã¹ãŠã®äººãcatã«æåŸ ããŸãã
Microsoft Cognitive ToolkitïŒCNTKïŒã¯ãç¡æã®ãªãŒãã³ãœãŒã¹ããªãŒãã³ãœãŒã¹ã®åŠç¿ããŒã«ãããã§ãã GitHubã®ã¹ã¿ãŒãåºæºã«ãããšãä»æ¥ã§ã¯TensorFlowãšCaffeã«æ¬¡ãã§ãã£ãŒãã©ãŒãã³ã°åãã®3çªç®ã«äººæ°ã®ããç¹æ®ãªããã±ãŒãžã§ãããMxNetãTheanoãTorchãªã©ã®ãã©ãããã©ãŒã ãæ®ãããŠããŸãã
å 責äºé ïŒ ãã®èšäºã¯å¯äžã®çå®ã§ãããšäž»åŒµããŠããããã§ã¯ãããŸããããCNTKã®éèŠãªç¹åŸŽãæããã«ããŠããŸãã ã³ã¡ã³ãã§ãæèŠããèãããã ããã
CNTKãšTensorFlowïŒã·ã§ãŒã
ããã§ã¯ããã€ã³ãã«è¡ããŸãããã CNTKãšTensorFlowã®éãã¯äœã§ããïŒ
- ã¹ããŒãã CNTKå šäœã¯TensorFlowãããé«éã§ããããªã«ã¬ã³ããããã¯ãŒã¯ã§ã¯æ倧5ã10åã®ããã©ãŒãã³ã¹åäžãå®çŸããŸãã
- æ£ç¢ºãã ãããŸã§ãCNTKã¯æ·±å±€åŠç¿ã¢ãã«ãæããããã®æé«ã®ç²ŸåºŠãåããŠããŸãã
- APIæ§é ã CNTKã«ã¯C ++åãã®æè»ã§åŒ·åãªAPIããããé¢æ°åããã°ã©ãã³ã°ãã©ãã€ã ã«åºã¥ããŠäœã¬ãã«ã§äœ¿ããããé«ã¬ãã«ã®Python APIãæäŸããŸãã
- ã¹ã±ãŒã©ããªãã£ã CNTKã¯ç°¡åã«ã¹ã±ãŒã©ãã«ã§ãããèšç®è² è·ã®é«ãã¿ã¹ã¯ã®å Žåãå°ãªããšãæ°åã®GPUã§å®è¡ã§ããŸãã
- åŸç¹ã CNTKã«ã¯ãC ++ ã. NETãJavaãããã³Pythonçšã®åŒ·åãªEval APIããããã¢ããªã±ãŒã·ã§ã³ã§ã®ãã¥ãŒã©ã«ãããã¯ãŒã¯ã®çµ±åãç°¡çŽ åããŸãã
- æ¡åŒµæ§ã CNTKã¯ãPythonã䜿çšããŠç¬èªã®ã¬ã€ã€ãŒãšãã¬ãŒãã³ã°æé ãå®çŸ©ã§ãããããç°¡åã«æ¡åŒµã§ããŸãã
- çµã¿èŸŒã¿ã®èªã¿åãã¢ãžã¥ãŒã«ã CNTKã«ã¯ãåæ£åŠç¿ããµããŒãããã¡ã¢ãªãã¬ã³ããªãŒãªçµã¿èŸŒã¿ããŒã¿ãªãŒããŒããããŸãã
åã®çãè°è«ã§çåãçåãçããå Žåã¯ãããããã«ã€ããŠè©³ãã説æããŸãã
CNTKãšTensorFlowïŒè©³çŽ°
ã¹ããŒã
ãã£ãŒãã©ãŒãã³ã°ã§ã¯ãèšå€§ãªéã®ããŒã¿ãåŠçãããããã倧éã®èšç®ãªãœãŒã¹ãå¿ èŠã«ãªããŸãã ã¢ããªã±ãŒã·ã§ã³ãéçºããŠããå ŽåããŸãã¯ç§åŠèšäºãæºåããŠããå Žåãæåã¯å®éšã®é床ã«å€§ããäŸåããŸãã
HKBUã®èª¿æ»ãšãã®èšäºã®çµæã¯ããã¹ãããããã¹ãŠã®ãããã¯ãŒã¯ã§ãCNTKãCPUãšGPUã®äž¡æ¹ã«é¢ããŠTensorFlowãšåçã®ããã©ãŒãã³ã¹ãæäŸããããšã瀺ããŸããã å®éãGPUã§ã®èµ·åã®ã¿ãèæ ®ãããšãCNTKã¯ãã¹ãããããã¹ãŠã®ããã±ãŒãžã®äžã§æé«ã®çµæã瀺ããŸããã
ç»åãæäœããå ŽåãCNTKã¯éåžžãTensorFlowãšæ¯èŒããŠ2ã3åã®ããã©ãŒãã³ã¹åäžãæäŸããŸãã ãªã«ã¬ã³ããã¥ãŒã©ã«ãããã¯ãŒã¯ã«é¢ããŠã¯ãããã§CNTKã¯è°è«ã®äœå°ã®ãªããªãŒããŒã§ãïŒ äžèšã®èšäºã§è¿°ã¹ãããã«ãCPUã§èµ·åãããšããCNTKã¯Torchããã³TensorFlowãããã¯ããã«åªããããã©ãŒãã³ã¹ïŒæ倧5ã10åïŒã瀺ããŸãã ïŒã ãŸããGPUã§å®è¡ããå ŽåããCNTKã¯ä»ã®ããŒã«ãããæ¡éãã«åªããçµæã瀺ããŸãããã
åå©ã®ã¹ããŒãã¯ãåã«ç¶æ³ãããŸãçµã¿åãããçµæã§ã¯ãããŸããã CNTKã¯ããšããšMicrosoft Researchã®é³å£°èªèã®å°é家ããŒã ã«ãã£ãŠéçºãããã·ãŒã±ã³ã¹åŠççšã«æé©åãããŠããŸãã ããšãã°ã40åãè¶ ããäŸã®ãã¬ãŒãã³ã°ãµã³ãã«ã§èªç¶èšèªèªèã¢ãã«ãæ§ç¯ããããã«äœ¿çšãããŸãã
ããšãã°ãé³å£°èªèãèªç¶èšèªã®ç解ãæ©æ¢°ç¿»èš³ãªã©ã®ãããžã§ã¯ãã§ã·ãŒã±ã³ã¹åŠçã䜿çšããå Žåãããã©ãŒãã³ã¹ã®èŠ³ç¹ããCNTKãæé©ãªéžæã«ãªããŸãã ãŸãããããªåŠçãšãã¿ãŒã³èªèã«é¢äžããŠããå Žåã¯ãCNTKãè©ŠããŠãã ããã
粟床
ãã£ãŒãã©ãŒãã³ã°ã®ãããã¯ãç解ããŠããã°ãããããããŒã«ãããã®éçºãã©ãã»ã©é£ãããç¥ã£ãŠããã§ãããã ããŒã«ãããã³ãŒãã®ãšã©ãŒã¯ç®ç«ããªãããšãå€æããå€ãã®å Žåãéåžžã«å¹ççãªã¢ãã«ã®åä¿¡ããããã¯ããŸããã ãã ãããã®ãããªãšã©ãŒã§ã¯ãå€ãã®å Žåããããã¯ãŒã¯ã¢ãŒããã¯ãã£ã®å šæ©èœãæããã«ã§ãããçµæã人çºçã«éå°è©äŸ¡ããŠããŸãã ãã®ãããCNTKã®éçºã«æºãã£ãŠããååã¯ããšã©ãŒãç¹å®ããããšã«çŽ°å¿ã®æ³šæãæããããŒã«ã䜿çšããŠã¢ãã«ããŒããããã¬ãŒãã³ã°ããæé«ã®ç²ŸåºŠãå®çŸã§ããããã«ããŸãã
äŸã¯ãGoogleã®è€æ°ã®ç 究è ã«ãã£ãŠéçºãããInception V3ãããã¯ãŒã¯ã®ã¹ããŒãªãŒã§ãã TensorFlowã®å°é家ã¯ãInception V3ãã¬ãŒãã³ã°ã¹ã¯ãªãããšãããŠã³ããŒãããã³æ€èšŒçšã®äºåãã¬ãŒãã³ã°ã¢ãã«ãææ¡ããŠããŸãã ãã ããã¢ãã«ãæåããåãã¬ãŒãã³ã°ããåæ§ã®ç²ŸåºŠãéæããããšã¯ã§ããŸããã§ãããããã«ã¯ãäºåããŒã¿åŠçãªã©ã®è¿œå æ å ±ãå¿ èŠã ã£ãããã§ãã ãµãŒãããŒãã£ïŒãã®å Žåã¯KerasïŒã«ãã£ãŠéæãããæ倧粟床ã¯ãéçºè ãèšäºã§ç€ºãããã®ãããçŽ0.6ïŒ äœããªããŸãã å®éšã®çµæãCNTKããŒã ã®ç 究è ã¯ãæ倧誀差5.972ïŒ ã§CNTK Inception V3ã¢ãã«ããã¬ãŒãã³ã°ããããšãã§ããŸãããããã¯ãå ã®èšäºã«ç€ºãããŠããæ°å€ãããããã«åªããŠããããšãå€æããŸããã ãã®çµæã¯èªåã§ç¢ºèªã§ããŸã ããã¬ãŒãã³ã°ã¹ã¯ãªããã¯GitHubã§å ¥æã§ããŸã ã
ããã«ãCNTKèªåãããåŠçã¢ã«ãŽãªãºã ã«ãããããŸããŸãªé·ãã®ã·ãŒã±ã³ã¹ãããã±ãŒãžåãããªã«ã¬ã³ããã¥ãŒã©ã«ãããã¯ãŒã¯ã®é«ãå®è¡å¹çãå®çŸã§ããŸãã ããã«ããã¬ãŒãã³ã°ããŒã¿ã®ã©ã³ãã åãåäžããä»ã®æ¹æ³ã«åºã¥ãããŒã¿ããã±ãŒãžãšæ¯èŒããŠç²ŸåºŠã1ã2ïŒ åäžããããšããããããŸãã ãã®ã¢ãããŒãã®ãããã§ãMicrosoft Researchã®ç 究è ã¯åããŠãã³ã³ãã¥ãŒã¿ãŒã人ãããæªããªãé³å£°ãèªèããããã«ãªããŸãã ã
APIæ§é
æåãããæ¢æã¢ãã«ã®ã¹ã³ã¢ãªã³ã°ã ããã¢ããªã±ãŒã·ã§ã³ã®äžå¯æ¬ ãªéšåã§ã¯ãªãããšãæ³å®ããŸããã åŠç¿ããŒã«ã¯ãOfficeãWindowsãªã©ã®ã¹ããŒãã¢ããªã±ãŒã·ã§ã³ã«ç·å¯ã«çµ±åããããšãã§ããŸãã ã»ãšãã©ãã¹ãŠã®CNTKæ©èœã¯C ++ã§èšè¿°ãããŠããŸãã ããã«ãããããã©ãŒãã³ã¹ãåäžããã ãã§ãªããC ++ APIãšããŠã䜿çšã§ããããããã¢ããªã±ãŒã·ã§ã³ã«çµ±åã§ããŸãã ããã«ãPythonãJavaã.NETãªã©ã®ãã€ã³ãã£ã³ã°ãç°¡åã«è¿œå ã§ããŸãã
ãŸããCNTKã®Python APIã«ã¯äœã¬ãã«ããã³é«ã¬ãã«ã®å®è£ ãããããšã«æ³šæããŠãã ããã é«ã¬ãã«ã®Python APIã¯ãé¢æ°åããã°ã©ãã³ã°ã®ãã©ãã€ã ã«åºã¥ããŠãããéåžžã«ã³ã³ãã¯ãã§çŽæçã§ããããã¯ããªã«ã¬ã³ããã¥ãŒã©ã«ãããã¯ãŒã¯ã§äœæ¥ããå Žåã«ç¹ã«é¡èã§ãã ããã¯ãã»ãšãã©ã®å°é家ããäœãããããšèããTensorFlowã®Python APIãšã®äž»ãªéãã§ãã
æ¡åŒµæ§
ä»æ¥ã®ãã£ãŒãã©ãŒãã³ã°ã®èª²é¡ã®äžéšãšããŠãæ°ååã®åŠç¿äŸãé©çšãããŠããŸãã ãããã£ãŠãè€æ°ã®GPUãšè€æ°ã®ã³ã³ãã¥ãŒã¿ãŒã§å®è¡ããæ©èœãå®çŸããå¿ èŠããããŸãã å€ãã®ããŒã«ãããã¯è€æ°ã®GPUã§åäœããŸããã1å°ã®ã³ã³ãã¥ãŒã¿ãŒã§ã®ã¿åäœããŸãã ãã·ã³ã®æ°ãå¢ãããŠã¹ã±ãŒãªã³ã°ããããšã¯å¯èœã§ããããã®å®è£ ã«ã¯ãå€ãã®å Žåãããªãã®åªåãå¿ èŠã«ãªããŸãã
å¯Ÿç §çã«ãCNTKã¯ãåæ£åŠç¿ã®æŠå¿µãäžæ žã«èšèšãããŸããã åäžã®GPUã§ã®ãã¬ãŒãã³ã°ããè€æ°ã®ã³ã³ãã¥ãŒã¿ãŒã§è€æ°ã®GPUã䜿çšããæ§æãžã®åãæ¿ãã¯éåžžã«ç°¡åã§ãããããã¯ãCNTKãªããžããªããã®äŸããæãããªããã«ãã»ãã®æ°è¡ã®ã³ãŒãã§ãã ãã€ã¯ããœããã®ç 究è ã¯ãæ°çŸã®GPUãšè€æ°ã®ã³ã³ãã¥ãŒã¿ãŒã§CNTKã¿ã¹ã¯ãã¬ãŒãã³ã°ãéå§ããŸããã ããã«ãããã€ãã®éåžžã«å¹æçãªäžŠååŠç¿ã¹ããŒã ããã¬ãŒã ã¯ãŒã¯ã«å«ãŸããŠããŸãïŒ 1ãããSGDããã³ãããã¯éåéSGD ã ãããã®ã¢ã«ãŽãªãºã ã¯ãã€ããŒãã©ã¡ãŒã¿ãŒã®èšå®ãå€§å¹ ã«æé©åããããè¯ãã¢ãã«ã®æºåãå éããŸããããã®çµæãããšãã°ãMicrosoft Researchã®å°é家ã¯ãèªç¶èšèªèªèã®å質ãå€§å¹ ã«æ¹åãã亀ææ©ã®é»è©±äŒè©±ã®ãã¹ããµã³ãã«ã®äººãäžåããŸããã
åŸç¹
TensorFlowã¯ãåªããã¹ã³ã¢ãªã³ã°æ©èœãæäŸããŸãã ãã©ãããã©ãŒã ã¯ã¢ãã«ã®ããã€ãã®ããŒãžã§ã³ããµããŒãããå®è¡ã«æé©åããã圢åŒã§ä¿åããŸããåãã¢ãã«å ã§ããŸããŸãªã¡ã¿ã°ã©ãã䜿çšãããšãããŸããŸãªã¿ã€ãã®ããã€ã¹ããµããŒããããŸãã ããã«ãXLA AoTã³ã³ãã€ã«ã®ãããã§ãTensorFlowã¯ã¢ãã«ãå®è¡å¯èœãã¡ã€ã«ã«å€æã§ããŸããããã«ãããã¢ãã€ã«ããã³çµã¿èŸŒã¿ããã€ã¹ã®ã¢ãã«ã®ãµã€ãºãå€§å¹ ã«åæžãããé 延ãæå°éã«æããããŸãã
TensorFlowãšã¯ç°ãªããCNTKã¯CNTK EvalããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã«çŽæ¥çµ±åããããšã«éç¹ã眮ããŠããŸãã Pythonããã³C ++ã«å ããŠãCNTKã¯ã¹ã³ã¢ãªã³ã°çšã«CïŒ/ãNETããã³JavaããµããŒãããŸãã ãããã®APIã¯åãC ++ APIã«åºã¥ããŠããããã䜿çšæã«åãã¬ãã«ã®ããã©ãŒãã³ã¹ãåŸãããšãã§ããŸãã .NETã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠããŠããã£ãŒãã©ãŒãã³ã°ãšããŒã¿ãã€ãã³ã°ã®ããã®ããŒã«ã»ãããéžæããå Žåã¯ãCNTKããã䟿å©ãªãªãã·ã§ã³ã§ãã
CNTKã¯èšç·Žãããã¢ãã«ã®äžŠå䜿çšããµããŒããããã®ã·ããªãªã§ã®ã¡ã¢ãªè² è·ã¯å€§å¹ ã«å¢å ããŸããã ããã«ãããããšãã°ãWebã¢ããªã±ãŒã·ã§ã³ãREST APIã§ã¢ãã«ããµãŒãã¹ãšããŠå±éãã絶奜ã®æ©äŒãéãããŸãã CNTKã¯ãIntelãŸãã¯ARMããŒã¹ã®åšèŸºæ©åšãžã®å±éããµããŒãããŠããŸãã
æ¡åŒµæ§
TensorFlowã¯ãã»ãšãã©ãã¹ãŠã®ã¢ãã«ãå®è£ ã§ããéåžžã«æè»ãªããŒã«ãããã§ãã ãã ããçŸåšCaffeã䜿çšããŠããå Žåãç°¡åã«æ¢åã®ã¹ã¯ãªãããTensorFlowã¹ã¯ãªããã«å€æãããšå€±æããŸãã ãã¹ãŠããŒãããæžãçŽããªããã°ãªããŸããã åæ§ã«ãå¥ã®éçºè ãå¥ã®ããŒã«ã»ããã䜿çšããŠäœæããæ°ããã¬ã€ã€ãŒãè©Šãã«ã¯ãèªåã§å®è£ ããå¿ èŠããããŸãã
ãã®ãããªèæ¯ã«å¯ŸããŠãCNTKã¯é«åºŠã«æ¡åŒµå¯èœãªããŒã«ããã¯ã¹ãšåŒã¶ããšãã§ããŸãã UserFunctionsæœè±¡åã«ãããPythonã䜿çšããŠä»»æã®æŒç®åãå®è£ ã§ããŸãã NumPyé åãCNTKãšæ¡åŒµæ©èœã®ä»²ä»ãšããŠäœ¿çšãããšãçŽæ¥ãã¹ãšéãã¹ãå®è£ ããã ãã§ããã®åŸãæ°ããäœæãããã¹ããŒãã¡ã³ããããã«ãããã¯ãŒã¯æ§é ã«å«ããããšãã§ããŸãã ããã«ãå€ãã®å Žåãå¥ã®ããŒã«ã»ããã®ã°ã©ããCNTK UserFunctionã«çŽæ¥é 眮ã§ããããããããžã§ã¯ãã®ç§»æ€ãå€§å¹ ã«å éãããCNTKç¬èªã®æ©èœã䜿çšã§ããŸãã
ããã¯ãéã¿ã®åŸé æŽæ°æé ã«ãé©çšãããŸãã RMSPropãAdamãªã©ã®ã»ãšãã©ã®ã¢ã«ãŽãªãºã ã«ã¯æ¢ã«CNTKãä»å±ããŠããŸãããçŽç²ãªPythonã䜿çšããŠæ°ããåŠç¿ã¢ãããŒããå®è£ ã§ããŸãã
çµ±åãªãŒããŒã¢ãžã¥ãŒã«
æãããªäºå®ã§ãããã¬ãŒãã³ã°ããŒã¿ãå€ãã»ã©ãããè¯ãçµæãåŸãããŸãã ç¶æ³ã«ãã£ãŠã¯ãããŒã¿éã倧ããããŠRAMã«åãŸããªãå Žåãããã1å°ã®ã³ã³ãã¥ãŒã¿ãŒã«ååãªãªãœãŒã¹ããªãå ŽåããããŸãã ããŒã¿ãRAMã«é 眮ãããŠããå Žåã§ããRAMããGPUã«ããŒã¿ã転éããããã«åŠç¿ãµã€ã¯ã«ã«æéãããããããããšããããããŸãã
CNTKã®çµã¿èŸŒã¿èªã¿åºãã¢ãžã¥ãŒã«ã¯ãRAMã«é 眮ããã«ããŒã¿åéã®éåžžã«å¹ççãªå埩æ©èœãæäŸããããšã«ãããäžèšã®åé¡ã解決ããŸãã åäžã®ãã©ã€ããŸãã¯HDFSãªã©ã®åæ£ãã¡ã€ã«ã·ã¹ãã ã§äœæ¥ã§ããŸãã ããªãã§ããã®åºç¯ãªäœ¿çšã«ãããGPUã®ããŠã³ã¿ã€ã ããªããªããŸãã ãŸããCNTKãªãŒããŒã¯ãåºç€ãšãªãããŒã¿ã»ãããé åºä»ããããŠããå Žåã§ããã¢ãã«ãåžžã«é©åã«æ··åãããæ¹æ³ã§ããŒã¿ãåä¿¡ããããã«ããŸãïŒããã«ããåæãåäžããŸãïŒã æåŸã«ããããã®æ©èœã¯ãã¹ãŠãçŸåšã®èªè ãšãŠãŒã¶ãŒã®èªè ã®äž¡æ¹ãå©çšã§ããŸãã ç¬èªã®ã«ã¹ã¿ã 圢åŒã®ãªãŒããŒãäœæããŠããå Žåã§ããããªãã§ããæé ã®å®è£ ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã
çµè«ãšããŠããã®èšäºã®äžã§ããªãã®ã³ã¡ã³ããèããŠãCNTKãæãã¯ãŒã«ã§äŸ¿å©ãªãã£ãŒãã©ãŒãã³ã°ããŒã«ã«ããããã®ãã«ãªã¯ãšã¹ããäžç·ã«åãåãããšãã§ããŠããããã§ãã
远䌞ãã®èšäºã説æããŠãããKonstantin KichinskyïŒ Quantum Quintum ïŒã«æè¬ããŸãã