Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÁÄÌì»úÆ÷ÈË£¨chatbot£©ÖÕ¼«Ö¸ÄÏ£º×ÔÈ»ÓïÑÔ´¦Àí£¨NLP£©ºÍÉî¶È»úÆ÷ѧϰ£¨Deep Machine Learning£©
 
  5867  次浏览      28
 2018-1-10 
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚcsdn£¬Õâ¸öÖ¸ÄÏÖ÷Òª»ùÓÚDenny BritzËù×öµÄ¹¤×÷£¬ËûÉîÈëµØÌ½Ë÷ÁË»úÆ÷ÈË¿ª·¢ÖÐÉî¶Èѧϰ¼¼ÊõµÄÀûÓᣠÎÄÕÂÖаüº¬´úÂëÆ¬¶ÎºÍGithub²Ö£¬ºÃºÃÀûÓã¡

ΪÁËÕâ·Ý°®

ÔÚ¹ýÈ¥µÄ¼¸¸öÔÂÖУ¬ÎÒÒ»Ö±ÔÚÊÕ¼¯×ÔÈ»ÓïÑÔ´¦Àí£¨NLP£©ÒÔ¼°ÈçºÎ½«NLPºÍÉî¶Èѧϰ£¨Deep Learning£©Ó¦Óõ½ÁÄÌì»úÆ÷ÈË£¨Chatbots£©·½ÃæµÄ×îºÃµÄ×ÊÁÏ¡£

ʱ²»Ê±µØÎһᷢÏÖÒ»¸ö³öÉ«µÄ×ÊÔ´£¬Òò´ËÎҺܿì¾Í¿ªÊ¼°ÑÕâЩ×ÊÔ´±àÖÆ³ÉÁÐ±í¡£ ²»¾Ã£¬ÎҾͷ¢ÏÖ×Ô¼º¿ªÊ¼Óëbot¿ª·¢ÈËÔ±ºÍbotÉçÇøµÄÆäËûÈ˹²ÏíÕâ·ÝÇåµ¥ÒÔ¼°Ò»Ð©·Ç³£ÓÐÓõÄÎÄÕÂÁË¡£

ÔÚÕâ¸ö¹ý³ÌÖУ¬ÎÒµÄÃûµ¥±ä³ÉÁËÒ»¸öÖ¸ÄÏ£¬¾­¹ýһЩºÃÓѵĶشٺ͹ÄÀø£¬ÎÒ¾ö¶¨ºÍ´ó¼Ò·ÖÏíÕâ¸öÖ¸ÄÏ£¬»òÐíÊÇÒ»¸ö¾«¼òµÄ°æ±¾ - ÓÉÓÚ³¤¶ÈµÄÔ­Òò¡£

Ïл°²»³¶ÁË¡­ÈÃÎÒÃÇ¿ªÊ¼°É£¡

¸ÅÊö£ºÁÄÌì»úÆ÷ÈË¿ª·¢ÖеÄÉî¶Èѧϰ¼¼Êõ

ÁÄÌì»úÆ÷ÈËÊÇÒ»¸öÈÈÃÅ»°Ì⣬Ðí¶à¹«Ë¾¶¼Ï£ÍûÄܹ»¿ª·¢³öÈÃÈËÎÞ·¨·Ö±æÕæ¼ÙµÄÁÄÌì»úÆ÷ÈË£¬Ðí¶àÈËÉù³Æ¿ÉÒÔʹÓÃ×ÔÈ»ÓïÑÔ´¦Àí£¨NLP£©ºÍÉî¶Èѧϰ£¨Deep Learning£©¼¼ÊõÀ´ÊµÏÖÕâÒ»µã¡£ µ«ÊÇÈ˹¤ÖÇÄÜ£¨AI£©ÏÖÔÚ´µµÃÓеã¹ýÁË£¬ÈÃÈËÓÐʱºòºÜÄÑ´Ó¿Æ»ÃÖзֱæ³öÊÂʵ¡£

ÔÚ±¾ÏµÁÐÖУ¬ÎÒÏë½éÉÜһЩÓÃÓÚ¹¹½¨¶Ô»°Ê½´úÀí£¨conversational agents£©µÄÉî¶Èѧϰ¼¼Êõ£¬Ê×ÏÈÎÒ»á½âÊÍÏ£¬ÏÖÔÚÎÒÃÇËù´¦µÄλÖã¬È»ºóÎÒ»á½éÉÜÏ£¬ÄÄЩÊÇ¿ÉÄÜ×öµ½µÄÊÂÇ飬ÄÄЩÊÇÖÁÉÙÔÚÒ»¶Îʱ¼äÄÚ¼¸ºõ²»¿ÉÄÜʵÏÖµÄÊÂÇé¡£

Ä£ÐÍ·ÖÀà

»ùÓÚ¼ìË÷µÄÄ£ÐÍ VS. Éú³ÉʽģÐÍ

»ùÓÚ¼ìË÷µÄÄ£ÐÍ£¨retrieval-based model£©¸üÈÝÒ×ʵÏÖ£¬ËüʹÓÃÔ¤¶¨ÒåÏìÓ¦µÄÊý¾Ý¿âºÍijÖÖÆô·¢Ê½ÍÆÀíÀ´¸ù¾ÝÊäÈ루input£©ºÍÉÏÏÂÎÄ£¨context£©Ñ¡ÔñÊʵ±µÄÏìÓ¦£¨response£©¡£ Æô·¢Ê½ÍÆÀí¿ÉÒÔÏñ»ùÓÚ¹æÔò£¨rule based£©µÄ±í´ïʽƥÅäÒ»Ñù¼òµ¥£¬»òÕßÏñ»úÆ÷ѧϰÖеķÖÀàÆ÷¼¯ºÏ£¨classifier ensemble£©Ò»Ñù¸´ÔÓ¡£ ÕâЩϵͳ²»»á²úÉúÈκÎеÄÎı¾£¬ËûÃÇÖ»ÊǴӹ̶¨µÄ¼¯ºÏÖÐÑ¡ÔñÒ»¸öÏìÓ¦¡£

³ÉʽģÐÍ£¨generative model£©Òª¸üÄÑһЩ£¬Ëü²»ÒÀÀµÓÚÔ¤¶¨ÒåµÄÏìÓ¦£¬ÍêÈ«´ÓÁ㿪ʼÉú³ÉеÄÏìÓ¦¡£ Éú³ÉʽģÐÍͨ³£»ùÓÚ»úÆ÷·­Òë¼¼Êõ£¬µ«²»ÊÇ´ÓÒ»ÖÖÓïÑÔ·­Òëµ½ÁíÒ»ÖÖÓïÑÔ£¬¶øÊÇ´ÓÊäÈëµ½Êä³ö£¨ÏìÓ¦£©µÄ¡°·­Ò롱£º

Á½ÖÖ·½·¨¶¼ÓÐÃ÷ÏÔµÄÓŵãºÍȱµã¡£ ÓÉÓÚʹÓÃÊÖ¹¤´òÔìµÄ´æ´¢¿â£¬»ùÓÚ¼ìË÷µÄ·½·¨²»»á²úÉúÓï·¨´íÎó¡£ µ«ÊÇ£¬ËüÃÇ¿ÉÄÜÎÞ·¨´¦ÀíûÓÐÔ¤¶¨ÒåÏìÓ¦µÄ³¡¾°¡£ ³öÓÚͬÑùµÄÔ­Òò£¬ÕâЩģÐͲ»ÄÜÒýÓÃÉÏÏÂÎÄʵÌåÐÅÏ¢£¬ÈçÇ°ÃæÌáµ½µÄÃû³Æ¡£ Éú³ÉʽģÐ͸ü¡°¸ü´ÏÃ÷¡±Ò»Ð©¡£ ËüÃÇ¿ÉÒÔÒýÓÃÊäÈëÖеÄʵÌ壬¸øÈËÒ»ÖÖÓ¡Ï󣬼´ÄãÕýÔÚÓëÈ˽»Ì¸¡£ È»¶ø£¬ÕâЩģÐͺÜÄÑѵÁ·£¬¶øÇҺܿÉÄÜ»áÓÐÓï·¨´íÎó£¨ÌرðÊÇÔڽϳ¤µÄ¾ä×ÓÉÏ£©£¬²¢ÇÒͨ³£ÐèÒª´óÁ¿µÄѵÁ·Êý¾Ý¡£

Éî¶Èѧϰ¼¼Êõ¼È¿ÉÒÔÓÃÓÚ»ùÓÚ¼ìË÷µÄÄ£ÐÍ£¬Ò²¿ÉÒÔÓÃÓÚÉú³ÉʽģÐÍ£¬µ«ÊÇchatbotÁìÓòµÄÑо¿ËƺõÕýÔÚÏòÉú³ÉʽģÐÍ·½Ïò·¢Õ¹¡£ Ïñseq2seqÕâÑùµÄÉî¶ÈѧϰÌåϵ½á¹¹·Ç³£ÊʺÏlÀ´Éú³ÉÎı¾£¬Ñо¿ÈËԱϣÍûÔÚÕâ¸öÁìÓòÈ¡µÃ¿ìËÙ½øÕ¹¡£ È»¶ø£¬ÎÒÃÇÈÔÈ»´¦ÓÚ½¨Á¢ºÏÀí¡¢Á¼ºÃµÄÉú³ÉʽģÐ͵ijõÆÚ½×¶Î¡£ÏÖÔÚÉÏÏßµÄÉú²úϵͳ¸ü¿ÉÄÜÊDzÉÓÃÁË»ùÓÚ¼ìË÷µÄÄ£ÐÍ¡£

¶Ô»°µÄ³¤¶Ì

¶Ô»°Ô½³¤£¬¾ÍÔ½ÄÑʵÏÖ×Ô¶¯»¯¡£ Ò»ÖÖÊǶÌÎı¾¶Ô»°£¨¸üÈÝÒ×ʵÏÖ£© £¬ÆäÄ¿±êÊÇΪµ¥¸öÊäÈëÉú³Éµ¥¸öÏìÓ¦¡£ ÀýÈ磬Äã¿ÉÄÜÊÕµ½À´×ÔÓû§µÄÌØ¶¨ÎÊÌ⣬²¢»Ø¸´ÏàÓ¦µÄ´ð°¸¡£ ÁíÒ»ÖÖÊǺܳ¤µÄ̸»°£¨¸üÄÑʵÏÖ£© £¬Ì¸»°¹ý³Ì»á¾­Àú¶à¸öתÕÛ£¬ÐèÒª¸ú×Ù֮ǰ˵¹ýµÄ»°¡£ ¿Í»§·þÎñÖеĶԻ°Í¨³£ÊÇÉæ¼°¶à¸öÎÊÌâµÄ³¤Ê±¼ä¶Ô»°¡£

¿ª·ÅÁìÓò VS. ·â±ÕÁìÓò

¿ª·ÅÁìÓòµÄchatbot¸üÄÑʵÏÖ£¬ÒòΪÓû§ ²»Ò»¶¨ÓÐÃ÷È·µÄÄ¿±ê»òÒâͼ¡£ ÏñTwitterºÍRedditÕâÑùµÄÉ罻ýÌåÍøÕ¾ÉϵĶԻ°Í¨³£ÊÇ¿ª·ÅÁìÓòµÄ - ËûÃÇ¿ÉÒÔ̸ÂÛÈκη½ÏòµÄÈκλ°Ìâ¡£ ÎÞÊýµÄ»°ÌâºÍÉú³ÉºÏÀíµÄ·´Ó¦ËùÐèÒªµÄ֪ʶ¹æÄ££¬Ê¹µÃ¿ª·ÅÁìÓòµÄÁÄÌì»úÆ÷ÈËʵÏÖÏ൱À§ÄÑ¡£

¡°¿ª·ÅÁìÓò £º¿ÉÒÔÌá³öÒ»¸ö¹ØÓÚÈκÎÖ÷ÌâµÄÎÊÌ⣬²¢ÆÚ´ýÏà¹ØµÄ»ØÓ¦£¬ÕâºÜÄÑʵÏÖ¡£¿¼ÂÇһϣ¬Èç¹û¾ÍµÖѺ´û¿îÔÙÈÚ×ÊÎÊÌâ½øÐн»Ì¸µÄ»°£¬Êµ¼ÊÉÏÄã¿ÉÒÔÎÊÈκÎÊÂÇé¡° ¡ª¡ª Âí¿Ë¡¤¿ËÀ­¿Ë

·â±ÕÁìÓòµÄchatbot±È½ÏÈÝÒ×ʵÏÖ£¬¿ÉÄܵÄÊäÈëºÍÊä³öµÄ¿Õ¼äÊÇÓÐÏ޵ģ¬ÒòΪϵͳÊÔͼʵÏÖÒ»¸ö·Ç³£Ìض¨µÄÄ¿±ê¡£ ¼¼ÊõÖ§³Ö»ò¹ºÎïÖúÀíÊÇ·â±ÕÁìÓòÎÊÌâµÄÀý×Ó¡£ ÕâЩϵͳ²»ÐèҪ̸ÂÛÕþÖΣ¬Ö»ÐèÒª¾¡¿ÉÄÜÓÐЧµØÍê³É¾ßÌåÈÎÎñ¡£ µ±È»£¬Óû§ÈÔÈ»¿ÉÒÔÔÚÈκÎËûÃÇÏëÒªµÄµØ·½½øÐжԻ°£¬µ«ÏµÍ³²¢²»ÐèÒª´¦ÀíËùÓÐÕâЩÇé¿ö - Óû§Ò²²»ÆÚÍûÕâÑù×ö¡£

¡°·â±ÕÁìÓò £º¿ÉÒÔÎÊһЩ¹ØÓÚÌØ¶¨Ö÷ÌâµÄÓÐÏÞµÄÎÊÌ⣬¸üÈÝÒ×ʵÏÖ¡£±ÈÈ磬Âõ°¢ÃÜÌìÆøÔõôÑù£¿¡°

¡°Square 1Âõ³öÁËÒ»¸öÁÄÌì»úÆ÷È˵ĿÉϲµÄµÚÒ»²½£¬Ëü±íÃ÷ÁË¿ÉÄܲ»ÐèÒªÖÇÄÜ»úÆ÷µÄ¸´ÔÓÐÔ£¬Ò²¿ÉÒÔÌṩÉÌÒµºÍÓû§¼ÛÖµ¡£

¡±Square 2ʹÓÃÁË¿ÉÒÔÉú³ÉÏìÓ¦µÄÖÇÄÜ»úÆ÷¼¼Êõ¡£ Éú³ÉµÄÏìÓ¦ÔÊÐíChatbot´¦Àí³£¼ûÎÊÌâºÍһЩ²»¿ÉÔ¤¼ûµÄÇé¿ö£¬¶øÕâЩÇé¿öûÓÐÔ¤¶¨ÒåµÄÏìÓ¦¡£ ÖÇÄÜ»úÆ÷¿ÉÒÔ´¦Àí¸ü³¤µÄ¶Ô»°²¢ÇÒ¿´ÆðÀ´¸üÏñÈË¡£ µ«ÊÇÉú³ÉʽÏìÓ¦Ôö¼ÓÁËϵͳµÄ¸´ÔÓÐÔ£¬¶øÇÒÍùÍùÊÇÔö¼ÓÁ˺ܶàµÄ¸´ÔÓÐÔ¡£

ÎÒÃÇÏÖÔÚÔÚ¿Í·þÖÐÐĽâ¾öÕâ¸öÎÊÌâµÄ·½·¨ÊÇ£¬µ±ÓÐÒ»¸öÎÞ·¨Ô¤ÖªµÄÇé¿öʱ£¬ÔÚ×ÔÖú·þÎñÖн«Ã»ÓÐÔ¤¶¨ÒåµÄ»ØÓ¦ £¬ÕâʱÎÒÃÇ»á°Ñºô½Ð´«µÝ¸øÒ»¸öÕæÈË¡° Mark Clark

¹²Í¬µÄÌôÕ½

ÔÚ¹¹½¨ÁÄÌì»úÆ÷ÈËʱ£¬ÓÐһЩÌôÕ½ÊÇÏÔ¶øÒ×¼ûµÄ£¬»¹ÓÐһЩÔò²»ÄÇôÃ÷ÏÔ£¬ÕâЩÌôÕ½ÖеĴ󲿷ֶ¼ÊÇÏÖÔںܻîÔ¾µÄÑо¿ÁìÓò¡£

ʹÓÃÉÏÏÂÎÄÐÅÏ¢

ΪÁ˲úÉúÃ÷Öǵķ´Ó¦£¬ÏµÍ³¿ÉÄÜÐèÒª½áºÏÓïÑÔÉÏÏÂÎĺÍʵÎïÉÏÏÂÎÄ ¡£ ÔÚ³¤Ê±¼äµÄ¶Ô»°ÖУ¬ÈËÃÇ»á¸ú×Ù˵¹ýµÄÄÚÈÝÒÔ¼°Ëù½»»»µÄÐÅÏ¢¡£ÉÏͼÊÇʹÓÃÓïÑÔÉÏÏÂÎĵÄÒ»¸öÀý×Ó¡£×î³£¼ûµÄʵÏÖ·½·¨Êǽ«¶Ô»°Ç¶Èëµ½ÏòÁ¿£¨vector£©ÖУ¬µ«Êdz¤Ê±¼äµÄ¶Ô»°¶ÔÕâÒ»¼¼Êõ´øÀ´ÁËÌôÕ½¡£Á½¸öÏà¹ØµÄÂÛÎÄ£º¡°Ê¹ÓÃÉú³Éʽ²ã¼¶Éñ¾­ÍøÂçÄ£Ð͹¹½¨¶Ëµ½¶ËµÄ¶Ô»°ÏµÍ³¡±ÒÔ¼°¡°ÔÚÉñ¾­ÍøÂç¶Ô»°Ä£ÐÍÖÐʹÓÃÓÐÄ¿µÄµÄ×¢ÒâÁ¦¡±£¬¶¼ÔÚ³¯×ÅÕâ¸ö·½Ïò·¢Õ¹¡£´ËÍ⣬»¹¿ÉÄÜÐèÒªÔÚÉÏÏÂÎÄÖкϲ¢ÆäËûÀàÐ͵ÄÊý¾Ý£¬ÀýÈçÈÕÆÚ/ʱ¼ä£¬Î»Öûò¹ØÓÚÓû§µÄÐÅÏ¢¡£

Ò»ÖµĸöÐÔ

ÀíÏëÇé¿öÏ£¬µ±Éú³ÉÏìӦʱ´úÀíÓ¦µ±¶ÔÓïÒåÏàͬµÄÊäÈë²úÉúÒ»ÖµĴ𰸡£ ÀýÈ磬¶ÔÓÚÕâÁ½¸öÎÊÌ⣺¡°Ä㼸ËêÁË£¿¡±ºÍ¡°ÄãµÄÄêÁäÊÇ£¿¡±£¬Äã»áÆÚÍûµÃµ½Í¬ÑùµÄ»Ø´ð¡£ ÕâÌýÆðÀ´ºÜ¼òµ¥£¬µ«ÊÇÈçºÎ½«ÕâÖ̶ֹ¨µÄ֪ʶ»òÕß˵¡°¸öÐÔ¡±ÄÉÈ뵽ģÐÍÀ»¹ÊÇÒ»¸öÐèÒªÑо¿µÄÎÊÌâ¡£Ðí¶àϵͳѧ¿ÉÒÔÉú³ÉÓïÑÔÉϺÏÀíµÄÏìÓ¦£¬µ«ÊÇËüÃǵÄѵÁ·Ä¿±ê²¢²»°üÀ¨²úÉúÓïÒåÒ»Öµķ´Ó¦¡£ ͨ³£ÕâÊÇÒòΪËüÃǽÓÊÜÁËÀ´×Ô¶à¸ö²»Í¬Óû§µÄ´óÁ¿Êý¾ÝµÄѵÁ·¡£ ÀàËÆÓÚÂÛÎÄ¡°»ùÓÚ½ÇÉ«µÄÉñ¾­¶Ô»°Ä£ÐÍ¡±ÖеÄÄ£ÐÍ£¬ÕýÔÚÏòΪ¸öÐÔ½¨Ä£µÄ·½ÏòÂõ³öµÚÒ»²½¡£

Ä£ÐÍµÄÆÀ¹À

ÆÀ¹ÀÁÄÌì´úÀíµÄÀíÏë·½·¨ÊǺâÁ¿ÊÇ·ñÔÚ¸ø¶¨µÄ¶Ô»°ÖÐÍê³ÉÆäÈÎÎñ£¬ÀýÈç½â¾ö¿Í»§Ö§³ÖÎÊÌâ¡£ µ«ÊÇÕâÑùµÄ±êÇ©£¨label£©µÄ»ñÈ¡³É±¾ºÜ¸ß£¬ÒòΪËüÃÇÐèÒªÈËΪµÄÅÐ¶ÏºÍÆÀ¹À¡£ÓÐʱºòûÓÐÁ¼ºÃ¶¨ÒåµÄÄ¿±ê£¬¾ÍÏñÔÚ¿ª·ÅÁìÓòÓòµÄÄ£ÐÍÒ»Ñù¡£Í¨ÓõĺâÁ¿Ö¸±ê£¬ÈçBLEU£¬ ×î³õÊÇÓÃÓÚ»úÆ÷·­ÒëµÄ£¬Ëü»ùÓÚÎı¾µÄÆ¥Å䣬Òò´Ë²¢²»ÊÇÌØ±ðÊʺÏÓÚ¶Ô»°Ä£Ð͵ĺâÁ¿£¬ÒòΪһ¸öÃ÷ÖǵÄÏìÓ¦¿ÉÄܰüº¬ÍêÈ«²»Í¬µÄµ¥´Ê»ò¶ÌÓï¡£ ÊÂʵÉÏ£¬ÔÚÂÛÎÄ¡° ¶Ô»°ÏìÓ¦Éú³ÉµÄÎ޼ලÆÀ¹ÀÖ¸±êµÄʵ֤Ñо¿¡±ÖУ¬Ñо¿ÈËÔ±·¢ÏÖ£¬Ã»ÓÐÈκγ£ÓÃÖ¸±êÓëÈËÀàµÄÅжϾßÓÐÕæÕýÏà¹ØÐÔ¡£

ÒâͼºÍ¶àÑùÐÔ

Éú³ÉʽϵͳµÄÒ»¸ö³£¼ûÎÊÌâÊÇ£¬ËüÃÇÍùÍù»áÉú³ÉһЩÀàËÆÓÚ¡°ºÜ°ô£¡¡±»ò¡°ÎÒ²»ÖªµÀ¡±Ö®ÀàµÄûÓÐÓªÑøµÄÏìÓ¦£¬ÕâЩÏìÓ¦¿ÉÒÔÓ¦¶ÔºÜ¶àÊäÈë¡£ ¹È¸èÖÇÄܴ𸴵ÄÔçÆÚ°æ±¾ÇãÏòÓÚÓá°ÎÒ°®Ä㡱À´»ØÓ¦¼¸ºõÈκÎÊÂÇé¡£ÕâÒ»ÏÖÏóµÄ²¿·Ö¸ùÔ´ÔÚÓÚÕâЩϵͳÊÇÈçºÎѵÁ·µÄ£¬ÎÞÂÛÊÇÔÚÊý¾Ý·½Ã滹ÊÇÔÚʵ¼ÊµÄѵÁ·Ä¿±êºÍËã·¨·½Ãæ¡£ һЩÑо¿ÈËÔ±ÊÔͼͨ¹ý¸÷ÖÖÄ¿±êº¯Êý£¨Object function£©À´ÈËΪµØ´Ù½ø¶àÑùÐÔ ¡£ È»¶ø£¬ÈËÀàͨ³£»á²úÉúÌØ¶¨ÓÚÊäÈëµÄ·´Ó¦²¢´øÓÐÒâͼ¡£ ÒòΪÉú³Éʽϵͳ£¨ÌرðÊÇ¿ª·ÅÓòϵͳ£©Ã»Óо­¹ýרÃŵÄÒâͼѵÁ·£¬ËùÒÔȱ·¦ÕâÖÖ¶àÑùÐÔ¡£

ÏÖÔÚÄÜʵÏÖµ½Ê²Ã´³Ì¶È£¿

»ùÓÚĿǰËùÓÐÇ°ÑØµÄÑо¿£¬ÎÒÃÇÏÖÔÚ´¦ÓÚʲô½×¶Î£¬ÕâЩϵͳµÄʵ¼Ê¹¤×÷Çé¿öµ½µ×ÔõôÑù£¿ ÔÙÀ´¿´¿´ÎÒÃǵÄÄ£ÐÍ·ÖÀà¡£ »ùÓÚ¼ìË÷µÄ¿ª·ÅÁìÓòϵͳÏÔÈ»ÊDz»¿ÉÄÜʵÏֵģ¬ÒòΪÄãÓÀÔ¶²»¿ÉÄÜÊÖ¹¤ÖÆ×÷×ã¹»µÄÏìÓ¦À´¸²¸ÇËùÓеÄÇé¿ö¡£ Éú³ÉʽµÄ¿ª·ÅÓòϵͳ¼¸ºõÊÇͨÓÃÈ˹¤ÖÇÄÜ£¨AGI£ºArtificial General Intelligence£©£¬ÒòΪËüÐèÒª´¦ÀíËùÓпÉÄܵij¡¾°¡£ ÎÒÃÇÀëÕâ¸öµÄʵÏÖ»¹ºÜÔ¶£¨µ«ÊÇÔÚÕâ¸öÁìÓòÕýÔÚ½øÐдóÁ¿µÄÑо¿£©¡£

Õâ¾Í¸øÎÒÃÇÊ£ÏÂÁËһЩÏÞ¶¨ÁìÓòµÄÎÊÌ⣬ÔÚÕâЩÁìÓòÖУ¬Éú³ÉʽºÍ»ùÓÚ¼ìË÷µÄ·½·¨¶¼ÊǺÏÊʵģ¬¶Ô»°Ô½³¤£¬Çé¾³Ô½ÖØÒª£¬ÎÊÌâ¾ÍÔ½À§ÄÑ¡£

£¨Ç°£©°Ù¶ÈÊ×ϯ¿ÆÑ§¼ÒAndrew Ng ×î½ü½ÓÊܲɷÃʱ˵£º

ÏÖ½×¶ÎÉî¶ÈѧϰµÄ´ó²¿·Ö¼ÛÖµ¿ÉÒÔÌåÏÖÔÚÒ»¸ö¿ÉÒÔ»ñµÃ´óÁ¿µÄÊý¾ÝµÄÏÁÕ­ÁìÓò¡£ ÏÂÃæÊÇÒ»¸öËü×ö²»µ½µÄÀý×Ó£º½øÐÐÒ»¸öÕæÕýÓÐÒâÒåµÄ¶Ô»°¡£ ¾­³£»áÓÐһЩÑÝʾ£¬ÀûÓÃһЩ¾«Ìôϸѡ¹ýµÄ¶Ô»°£¬ÈÃËü¿´ÆðÀ´ÏñÊÇÔÚ½øÐÐÓÐÒâÒåµÄ¶Ô»°£¬µ«Èç¹ûÄãÕæµÄ×Ô¼ºÈ¥³¢ÊÔºÍËü¶Ô»°£¬Ëü¾Í»áºÜ¿ìµØÆ«ÀëÕý³£µÄ¹ìµÀ¡£

Ðí¶à¹«Ë¾¿ªÊ¼½«ËûÃǵÄÁÄÌìÍâ°ü¸øÈËÁ¦¹¤×÷Õߣ¬²¢³Ðŵһµ©ËûÃÇÊÕ¼¯ÁË×ã¹»µÄÊý¾Ý¾Í¿ÉÒÔ¡°×Ô¶¯»¯¡±¡£ ÕâÖ»ÓÐÔÚÒ»¸ö·Ç³£ÏÁÕ­µÄÁìÓòÔËÐÐʱ²Å»á·¢Éú - ±ÈÈç˵һ¸ö½ÐUberµÄÁÄÌì½çÃæ¡£ Èκοª·ÅµÄÁìÓò£¨±ÈÈçÏúÊÛµç×ÓÓʼþ£©¶¼ÊÇÎÒÃÇĿǰÎÞ·¨×öµ½µÄ¡£ µ«ÊÇ£¬ÎÒÃÇÒ²¿ÉÒÔͨ¹ýÌá³öºÍ¾ÀÕý´ð°¸À´ÀûÓÃÕâЩϵͳÀ´Ð­Öú¹¤×÷ÈËÔ±¡£ Õâ¸ü¿ÉÐС£

Éú²úϵͳÖеÄÓï·¨´íÎóÊǷdz£°º¹óµÄ£¬ÒòΪËüÃÇ¿ÉÄÜ»á°ÑÓû§¸ÏÅÜ¡£ Õâ¾ÍÊÇΪʲô´ó¶àÊýϵͳ¿ÉÄÜ×îºÃ²ÉÓûùÓÚ¼ìË÷µÄ·½·¨£¬ÕâÑù¾ÍûÓÐÓï·¨´íÎóºÍ¹¥»÷ÐԵķ´Ó¦¡£ Èç¹û¹«Ë¾Äܹ»ÒÔijÖÖ·½Ê½ÕÆÎÕ´óÁ¿µÄÊý¾Ý£¬ÄÇôÉú³ÉʽģÐ;ͱäµÃ¿ÉÐÐ - µ«ÊÇËüÃDZØÐ븨ÒÔÆäËû¼¼Êõ£¬ÒÔ·ÀÖ¹ËüÃÇÏñ΢ÈíµÄTayÄÇÑùÍѹ졣

ÓÃTENSORFLOWʵÏÖÒ»¸ö»ùÓÚ¼ìË÷µÄÄ£ÐÍ

±¾½Ì³ÌµÄ´úÂëºÍÊý¾ÝÔÚGithubÉÏ¡£

»ùÓÚ¼ìË÷µÄ²©¿Í

µ±½ñ¾ø´ó¶àÊýµÄÉú²úϵͳ¶¼ÊÇ»ùÓÚ¼ìË÷µÄ£¬»òÕßÊÇ»ùÓÚ¼ìË÷µÄºÍÉú³ÉʽÏà½áºÏ¡£ GoogleµÄSmart Reply¾ÍÊÇÒ»¸öºÜºÃµÄÀý×Ó¡£ Éú³ÉʽģÐÍÊÇÒ»¸ö»îÔ¾µÄÑо¿ÁìÓò£¬µ«ÎÒÃÇ»¹²»ÄܺܺõÄʵÏÖ¡£ Èç¹ûÄãÏÖÔÚÏë¹¹½¨Ò»¸öÁÄÌì´úÀí£¬×îºÃµÄÑ¡Ôñ¾ÍÊÇ»ùÓÚ¼ìË÷µÄÄ£ÐÍ¡£

UBUNTU DIALOG CORPUS

ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃǽ«Ê¹ÓÃUbuntu¶Ô»°ÓïÁϿ⣨ ÂÛÎÄ £¬ github £©¡£ Ubuntu ¶Ô»°ÓïÁϿ⣨UDC£©ÊÇ¿ÉÓõÄ×î´óµÄ¹«¹²¶Ô»°Êý¾Ý¼¯Ö®Ò»¡£ Ëü»ùÓÚ¹«¹²IRCÍøÂçÉϵÄUbuntuƵµÀµÄÁÄÌì¼Ç¼¡£ ÂÛÎÄÏêϸ˵Ã÷ÁËÕâ¸öÓïÁÏ¿âÊÇÈçºÎ´´½¨µÄ£¬ËùÒÔÔÚÕâÀïÎÒ²»ÔÙÖØ¸´¡£ µ«ÊÇ£¬Á˽âÎÒÃÇÕýÔÚ´¦ÀíµÄÊÇʲôÑùµÄÊý¾Ý·Ç³£ÖØÒª£¬ËùÒÔÎÒÃÇÏÈ×öһЩÊý¾Ý·½ÃæµÄ̽Ë÷¡£

ѵÁ·Êý¾Ý°üÀ¨100Íò¸öÑùÀý£¬50£¥µÄÕýÑùÀý£¨±êÇ©1£©ºÍ50£¥µÄ¸ºÑùÀý£¨±êÇ©0£©¡£ ÿ¸öÑùÀý¶¼°üº¬Ò»¸öÉÏÏÂÎÄ £¬¼´Ö±µ½ÕâÒ»µãµÄ̸»°¼Ç¼£¬ÒÔ¼°Ò»¸ö»°Óï £¨utterance£©£¬¼´¶ÔÉÏÏÂÎĵĻØÓ¦¡£ Ò»¸öÕý±êÇ©Òâζ×Å»°ÓïÊǶԵ±Ç°Óï¾³ÉÏÏÂÎĵÄʵ¼ÊÏìÓ¦£¬Ò»¸ö¸º±êÇ©Òâζ×ÅÕâ¸ö»°Óï²»ÊÇÕæÊµµÄÏìÓ¦ - ËüÊÇ´ÓÓïÁÏ¿âµÄij¸öµØ·½Ëæ»úÌôÑ¡³öÀ´µÄ¡£ ÕâÊÇһЩʾÀýÊý¾Ý£º

Çë×¢Ò⣬Êý¾Ý¼¯Éú³É½Å±¾ÒѾ­ÎªÎÒÃÇ×öÁËÒ»¶ÑÔ¤´¦Àí - ËüʹÓÃNLTK¹¤¾ß¶ÔÊä³ö½øÐÐÁË·Ö´Ê£¨tokenize£©£¬ ´Ê¸É´¦Àí£¨stem£©ºÍ´ÊÐÎ ¹æ·¶»¯£¨lemmatize£© ¡£ ¸Ã½Å±¾»¹ÓÃÌØÊâµÄ±ê¼ÇÌæ»»ÁËÃû³Æ£¬Î»Öã¬×éÖ¯£¬URLºÍϵͳ·¾¶µÈʵÌ壨entity£©¡£ Õâ¸öÔ¤´¦Àí²¢²»ÊǾø¶Ô±ØÒªµÄ£¬µ«Ëü¿ÉÄÜ»áÌá¸ß¼¸¸ö°Ù·ÖµãµÄÐÔÄÜ¡£ ÉÏÏÂÎĵį½¾ù³¤¶ÈÊÇ86×Ö£¬Æ½¾ù»°Óﳤ17×Ö¡£ ʹÓÃJupyter notebookÀ´²é¿´Êý¾Ý·ÖÎö ¡£

Êý¾Ý¼¯²ð·ÖΪ²âÊÔ¼¯ºÍÑéÖ¤¼¯¡£ ÕâЩ¸ñʽÓëѵÁ·Êý¾ÝµÄ¸ñʽ²»Í¬¡£ ²âÊÔ/ÑéÖ¤¼¯ºÏÖеÄÿ¸ö¼Ç¼¶¼°üº¬Ò»¸öÉÏÏÂÎÄ£¬Ò»¸ö»ù×¼µÄÕæÊµ»°Óï£¨ÕæÊµµÄÏìÓ¦£©ºÍ9¸ö²»ÕýÈ·µÄ»°Ó³ÆÎª¸ÉÈÅÏdistractors£© ¡£ Õâ¸öÄ£Ð͵ÄÄ¿±êÊǸøÕæÕýµÄ»°Óï·ÖÅä×î¸ßµÄ·ÖÊý£¬²¢µ÷µÍ´íÎó»°ÓïµÄ·ÖÊý¡£

ÓжàÖÖ·½Ê½¿ÉÒÔÓÃÀ´ÆÀ¹ÀÎÒÃǵÄÄ£ÐÍ×öµÃÈçºÎ¡£ ³£ÓõĺâÁ¿Ö¸±êÊÇkÕٻأ¨recall@k £©£¬Ëü±íʾÎÒÃÇÈÃÄ£ÐÍ´Ó10¸ö¿ÉÄܵĻشðÖÐÑ¡³ök¸ö×îºÃµÄ»Ø´ð£¨1¸öÕæÊµºÍ9¸ö¸ÉÈÅ£©¡£ Èç¹ûÕýÔÚÑ¡ÖеĻشðÖаüº¬ÕýÈ·µÄ£¬ÎÒÃǾͽ«¸Ã²âÊÔʾÀý±ê¼ÇΪÕýÈ·µÄ¡£ ËùÒÔ£¬¸ü´óµÄkÒâζ×ÅÈÎÎñ±äµÃ¸üÈÝÒס£ Èç¹ûÎÒÃÇÉ趨k = 10£¬ÎÒÃǵõ½100£¥µÄÕٻأ¬ÒòΪÎÒÃÇÖ»ÓÐ10¸ö»Ø´ð¡£ Èç¹ûÎÒÃÇÉèÖÃk = 1£¬Ä£ÐÍÖ»ÓÐÒ»¸ö»ú»áÑ¡ÔñÕýÈ·µÄÏìÓ¦¡£

´ËʱÄã¿ÉÄÜÏëÖªµÀÈçºÎÑ¡Ôñ9¸ö¸ÉÈÅÏî¡£ ÔÚÕâ¸öÊý¾Ý¼¯ÖУ¬9¸ö¸ÉÈÅÏîÊÇËæ»úÌôÑ¡µÄ¡£ È»¶ø£¬ÔÚÏÖʵÊÀ½çÖУ¬Äã¿ÉÄÜÓÐÊýÒÔ°ÙÍò¼ÆµÄ¿ÉÄܵķ´Ó¦£¬Äã²»ÖªµÀÄÄÒ»¸öÊÇÕýÈ·µÄ¡£ Äã²»¿ÉÄÜÆÀ¹ÀÒ»°ÙÍò¸öDZÔڵĴ𰸣¬Ñ¡ÔñÒ»¸ö·ÖÊý×î¸ßµÄ´ð°¸ - Õâ¸ö³É±¾Ì«¸ßÁË¡£ GoogleµÄ¡° ÖÇÄܴ𸴡±Ê¹Óü¯Èº¼¼ÊõÀ´Ìá³öһϵÁпÉÄܵĴ𰸣¬ÒÔ±ã´ÓÖÐÑ¡Ôñ¡£ »òÕߣ¬Èç¹ûÄãÖ»Óм¸°Ù¸öDZÔڵĻØÓ¦£¬Äã¿ÉÒÔ¶ÔËùÓпÉÄܵĻØÓ¦½øÐÐÆÀ¹À¡£

»ù×¼

ÔÚ¿ªÊ¼Ñо¿Éñ¾­ÍøÂçÄ£ÐÍ֮ǰ£¬ÎÒÃÇÏȽ¨Á¢Ò»Ð©¼òµ¥µÄ»ù׼ģÐÍ£¬ÒÔ°ïÖúÎÒÃÇÀí½â¿ÉÒÔÆÚ´ýʲôÑùµÄÐÔÄÜ¡£ ÎÒÃǽ«Ê¹ÓÃÒÔϺ¯ÊýÀ´ÆÀ¹ÀÎÒÃǵÄrecall@ kÖ¸±ê£º

def evaluate_recall(y, y_test, k=1):
num_examples = float(len(y))
num_correct = 0
for predictions, label in zip(y, y_test):
if label in predictions[:k]:
num_correct += 1
return num_correct/num_examples

ÕâÀyÊÇÎÒÃǰ´ÕÕ½µÐòÅÅÐòµÄÔ¤²âÁÐ±í£¬y_testÊÇʵ¼ÊµÄ±êÇ©¡£ ÀýÈ磬[0,3,1,2,5,6,4,7,8,9]ÖеÄay±íʾ»°Óï0µÃ·Ö×î¸ß£¬»°Óï9µÃ·Ö×îµÍ¡£ Çë¼Çס£¬¶ÔÓÚÿ¸ö²âÊÔÑùÀý£¬ÎÒÃÇÓÐ10¸ö»°ÓµÚÒ»¸ö£¨Ë÷Òý0£©Ê¼ÖÕÊÇÕýÈ·µÄ£¬ÒòΪÎÒÃÇÊý¾ÝÖеϰÓïÁÐλÓÚ¸ÉÈÅÏî֮ǰ¡£

Ö±¾õÊÇ£¬Ò»¸öÍêÈ«Ëæ»úµÄÔ¤²âÆ÷Ò²Ó¦¸Ã¿ÉÒÔÔÚrecall@ 1Ö¸±êÉÏÄÃ10·Ö£¬ÔÚrecall@2Ö¸±êÉϵÃ20·Ö£¬ÒÀ´ËÀàÍÆ¡£ ÈÃÎÒÃÇÀ´¿´¿´ÊÇ·ñÊÇÕâÖÖÇé¿ö£º

# Random Predictor
def predict_random(context, utterances):
return np.random.choice(len(utterances), 10, replace=False)

# Evaluate Random predictor
y_random = [predict_random(test_df.Context[x], test_df.iloc[x,1:].values) for x in range(len(test_df))]

y_test = np.zeros(len(y_random))
for n in [1, 2, 5, 10]:
print(¡°Recall @ ({}, 10): {:g}¡±.format(n, evaluate_recall(y_random, y_test, n)))

²âÊÔ½á¹û£º

Recall @ (1, 10): 0.0937632
Recall @ (2, 10): 0.194503
Recall @ (5, 10): 0.49297
Recall @ (10, 10): 1

ºÜºÃ£¬¿´ÆðÀ´·ûºÏÔ¤ÆÚ¡£ µ±È»£¬ÎÒÃDz»Ö»ÊÇÏëÒªÒ»¸öËæ»úÔ¤²âÆ÷¡£ ԭʼÂÛÎÄÖÐÌÖÂÛµÄÁíÒ»¸ö»ù׼ģÐÍÊÇÒ»¸ötf-idfÔ¤²âÆ÷¡£ tf-idf´ú±í¡°term frequency - inverse document frequency¡±£¬ËüºâÁ¿ÎĵµÖеĵ¥´ÊÓëÕû¸öÓïÁÏ¿âµÄÏà¶ÔÖØÒªÐÔ¡£ ÕâÀï²»²ûÊö¾ßÌåµÄµÄϸ½ÚÁË£¨Äã¿ÉÒÔÔÚÍøÉÏÕÒµ½Ðí¶à¹ØÓÚtf-idfµÄ½Ì³Ì£©£¬ÄÇЩ¾ßÓÐÏàËÆÄÚÈݵÄÎĵµ½«¾ßÓÐÀàËÆµÄtf-idfÏòÁ¿¡£ Ö±¾õÉϽ²£¬Èç¹ûÉÏÏÂÎĺÍÏìÓ¦¾ßÓÐÏàËÆµÄ´ÊÓÔòËüÃǸü¿ÉÄÜÊÇÕýÈ·µÄÅä¶Ô¡£ ÖÁÉÙ±ÈËæ»ú¸ü¿ÉÄÜ¡£ Ðí¶à¿â£¨Èçscikit-learn ¶¼´øÓÐÄÚÖõÄtf-idfº¯Êý£¬ËùÒÔËü·Ç³£Ò×ÓÚʹÓᣠÏÖÔÚ£¬ÈÃÎÒÃÇÀ´¹¹½¨Ò»¸ötf-idfÔ¤²âÆ÷£¬¿´¿´ËüµÄ±íÏÖÈçºÎ¡£

class TFIDFPredictor:
def __init__(self):
self.vectorizer = TfidfVectorizer()

def train(self, data):
self.vectorizer.fit(np.append(data.Context.values,
data.Utterance.values))
def predict(self, context, utterances):
# Convert context and utterances into tfidf vector
vector_context = self.vectorizer.transform([context])
vector_doc = self.vectorizer.transform(utterances)

# The dot product measures the similarity of the resulting vectors
result = np.dot(vector_doc, vector_context.T).todense()
result = np.asarray(result).flatten()

# Sort by top results and return the indices in descending order
return np.argsort(result, axis=0)[::-1]


# Evaluate TFIDF predictor
pred = TFIDFPredictor()
pred.train(train_df)

y = [pred.predict(test_df.Context[x], test_df.iloc[x,1:].values) for x in range(len(test_df))]

for n in [1, 2, 5, 10]:
print(¡°Recall @ ({}, 10): {:g}¡±.format(n, evaluate_recall(y, y_test, n)))

ÔËÐнá¹û£º

Recall @ (1, 10): 0.495032

Recall @ (2, 10): 0.596882

Recall @ (5, 10): 0.766121

Recall @ (10, 10): 1

ÎÒÃÇ¿ÉÒÔ¿´µ½tf-idfÄ£ÐͱÈËæ»úÄ£ÐͱíÏֵøüºÃ¡£ ¾¡¹ÜÈç´Ë£¬Õ⻹²»¹»ÍêÃÀ¡£ ÎÒÃÇËù×öµÄ¼ÙÉè²»ÊǺܺᣠÊ×ÏÈ£¬ÏìÓ¦²»Ò»¶¨ÐèÒªÓëÉÏÏÂÎÄÏàËÆ²ÅÊÇÕýÈ·µÄ¡£ Æä´Î£¬tf-idfºöÂÔÁË´ÊÐò£¬Õâ¿ÉÄÜÊÇÒ»¸öÖØÒªµÄ¸Ä½øÐźš£ ʹÓÃÒ»¸öÉñ¾­ÍøÂçÄ£ÐÍ£¬ÎÒÃÇÓ¦¸Ã¿ÉÒÔ×öµÃ¸üºÃÒ»µã¡£

Ë«±àÂëÆ÷LSTM

ÎÒÃǽ«ÔÚ±¾ÎÄÖй¹½¨µÄÉî¶ÈѧϰģÐͳÆÎªË«±àÂëÆ÷LSTMÍøÂ磨Dual Encoder LSTM Network£©¡£ ÕâÖÖÀàÐ͵ÄÍøÂçÖ»ÊÇ¿ÉÒÔÓ¦ÓÃÓÚÕâ¸öÎÊÌâµÄÖÚ¶àÍøÂçÖ®Ò»£¬²¢²»Ò»¶¨ÊÇ×îºÃµÄ¡£ Äã¿ÉÒÔ³¢ÊÔ¸÷ÖÖÉî¶Èѧϰ¼Ü¹¹ - ÕâÊÇÒ»¸ö»îÔ¾µÄÑо¿ÁìÓò¡£ ÀýÈ磬¾­³£ÔÚ»úÆ÷·­ÒëÖÐʹÓõÄseq2seqÄ£ÐÍÔÚÕâ¸öÈÎÎñÉÏ¿ÉÄÜ»á×öµÃºÜºÃ¡£ ÎÒÃÇ´òËãʹÓÃË«±àÂëÆ÷µÄÔ­ÒòÊÇÒòΪ¾Ý±¨µÀ ËüÔÚÕâ¸öÊý¾Ý¼¯ÉÏÐÔÄܲ»´í¡£ ÕâÒâζ×ÅÎÒÃÇÖªµÀ¸ÃÆÚ´ýʲô£¬²¢ÇÒ¿ÉÒԿ϶¨ÎÒÃǵÄË¿Ïß´úÂëÊÇÕýÈ·µÄ¡£ ½«ÆäËûÄ£ÐÍÓ¦ÓÃÓÚÕâ¸öÎÊÌ⽫ÊÇÒ»¸öÓÐȤµÄÏîÄ¿¡£

ÎÒÃǽ«½¨Á¢µÄË«±àÂëÆ÷LSTM¿´ÆðÀ´ÏñÕâÑù£¨ ÂÛÎÄ £©£º

ËüµÄ´óÖ¹¤×÷Ô­ÀíÈçÏ£º

ÉÏÏÂÎĺÍÏìÓ¦Îı¾¶¼Êǰ´ÕÕµ¥´Ê·Ö¸îµÄ£¬Ã¿¸öµ¥´Ê¶¼Ç¶Èëµ½Ò»¸öÏòÁ¿ÖС£ ´ÊǶÈëÊÇÓÃ˹̹¸£´óѧµÄGloVeʸÁ¿½øÐгõʼ»¯µÄ£¬²¢ÇÒÔÚѵÁ·¹ý³ÌÖнøÐÐÁË΢µ÷£¨×¢£ºÕâÊÇ¿ÉÑ¡µÄ£¬²¢ÇÒûÓÐÔÚͼƬÖÐÏÔʾ£¬ÎÒ·¢ÏÖÓÃGloVe½øÐгõʼ»¯¶ÔÄ£ÐÍÐÔÄÜûÓÐÌ«´óµÄÓ°Ï죩¡£

ǶÈëµÄÉÏÏÂÎĺÍÏìÓ¦¶¼Öð×ÖµØÊäÈëµ½ÏàͬµÄµÝ¹éÉñ¾­ÍøÂ磨Recurrent Neural Network£©ÖС£ RNNÉú³ÉÒ»¸öʸÁ¿±íʾ£¬²»ÑϸñµØËµ£¬Õâ¸ö±íʾ²¶×½ÁËÉÏÏÂÎĺÍÏìÓ¦£¨Í¼Æ¬ÖеÄcºÍr£©Öеġ°º¬Ò塱¡£ ÎÒÃÇ¿ÉÒÔ×ÔÓÉÑ¡ÔñʸÁ¿µÄ´óС£¬²»¹ýÏÈÑ¡Ôñ256¸öά¶È°É¡£

ÎÒÃÇÓþØÕóM³ËÒÔcÀ´¡°Ô¤²â¡±Ò»¸öÏìÓ¦r'¡£ Èç¹ûcÊÇ256άÏòÁ¿£¬ÔòMÊÇ256¡Á256ά¾ØÕ󣬽á¹ûÊÇÁíÒ»¸ö256άÏòÁ¿£¬ÎÒÃÇ¿ÉÒÔ½«Æä½âÊÍΪ²úÉúµÄÏìÓ¦¡£ ¾ØÕóMÊÇÔÚѵÁ·ÖÐѧϰµ½µÄ¡£

ÎÒÃÇͨ¹ýÈ¡ÕâÁ½¸öÏòÁ¿µÄµã»ýÀ´¶ÈÁ¿Ô¤²âÏìÓ¦r'ºÍʵ¼ÊÏìÓ¦rµÄÏàËÆ¶È¡£ ´óµÄµã»ýÒâζ×ÅÁ½¸öÏòÁ¿¸üÏàËÆ£¬Òò´ËÓ¦¸ÃµÃµ½¸ß·Ö¡£ È»ºó£¬ÎÒÃÇÓ¦ÓÃsigmoidº¯Êý½«¸Ã·ÖÊýת»»Îª¸ÅÂÊ¡£ Çë×¢Ò⣬²½Öè3ºÍ4ÔÚͼÖÐ×éºÏÔÚÒ»Æð¡£

ΪÁËѵÁ·ÍøÂ磬ÎÒÃÇ»¹ÐèÒªÒ»¸öËðʧ£¨³É±¾£©º¯Êý¡£ ÎÒÃǽ«Ê¹Ó÷ÖÀàÎÊÌâÖг£¼ûµÄ¶þÏî½»²æìØËðʧ£¨binary cross-entropy loss£©¡£ ÈÃÎÒÃǽ«ÉÏÏÂÎÄÏìÓ¦µÄÕæÊµ±êÇ©³ÆÎªy¡£ Õâ¿ÉÒÔÊÇ1£¨Êµ¼ÊÏìÓ¦£©»ò0£¨²»ÕýÈ·µÄÏìÓ¦£©¡£ ÈÃÎÒÃǰÑÉÏÃæµÚ4ÌõÖÐÌáµ½µÄÔ¤²â¸ÅÂʳÆÎªy'¡£ È»ºó£¬½»²æìØËðµÄ¼ÆË㹫ʽΪL = -y * ln£¨y'£© - £¨1-y£©* ln£¨1-y'£©¡£ Õâ¸ö¹«Ê½±³ºóµÄÖ±¾õºÜ¼òµ¥¡£ Èç¹ûy = 1£¬ÔòÊ£ÏÂL = -ln£¨y'£©£¬ÕâÒâζ×ŶÔÔ¶Àë1µÄÔ¤²â¼ÓÒԳͷ££»Èç¹ûy = 0£¬ÔòÊ£ÏÂL = -ln£¨1-y'£©£¬Õâ³Í·£ÁËÔ¶Àë0µÄÔ¤²â¡£

ÎÒÃǵÄʵÏÖ½«Ê¹ÓÃnumpy £¬pandas £¬ TensorflowºÍTF Learn £¨ TensorflowµÄ¸ß²ãAPI£©µÄ×éºÏ¡£

Êý¾ÝÔ¤´¦Àí

ԭʼµÄÊý¾Ý¼¯ÊÇCSV¸ñʽ¡£ ÎÒÃÇ¿ÉÒÔÖ±½ÓʹÓÃCSV£¬µ«×îºÃ½«ÎÒÃǵÄÊý¾Ýת»»³ÉTensorflowרÓеÄexample¸ñʽ¡£ £¨Ë³±ã˵һÏ£º»¹ÓÐÒ»¸ötf.SequenceExample£¬µ«tf.learnËÆºõ²»Ö§³ÖÕâÒ»¸ñʽ£©¡£ example¸ñʽµÄÖ÷ÒªºÃ´¦ÊÇËüÔÊÐíÎÒÃÇÖ±½Ó´ÓÊäÈëÎļþ¼ÓÔØÕÅÁ¿£¨tensor£©£¬²¢ÈÃTensorflowÀ´¶ÔÊäÈë½øÐÐËæ»úÅÅÐò£¨shuffle£©£¬Åú´Î´¦Àí£¨batch£©ºÍ¶ÓÁд¦Àí£¨queue£©¡£ ×÷ΪԤ´¦ÀíµÄÒ»²¿·Ö£¬ÎÒÃÇ»¹´´½¨ÁËÒ»¸ö´Ê±í¡£ ÕâÒâζ×ÅÎÒÃǽ«Ã¿¸öµ¥´ÊÓ³Éäµ½Ò»¸öÕûÊý£¬ÀýÈç¡°cat¡±¿ÉÄܱä³É2631.ÎÒÃǽ«Éú³ÉµÄTFRecordÎļþ£¬´æ´¢µÄ¾ÍÊÇÕâЩÕûÊý¶ø²»ÊÇ×Ö´®¡£ ÎÒÃǻᱣÁô´Ê±í£¬ÒÔ±ãºóÐø¿ÉÒÔ´ÓÕûÊýÓ³É仨µ¥´Ê¡£

ÿ¸öÑùÀý°üº¬ÒÔÏÂ×ֶΣº

context£º±íʾÉÏÏÂÎÄÎı¾µÄ´ÊÐòÁУ¬ÀýÈç[231,2190,737,0,912]

context_len£ºÉÏÏÂÎĵij¤¶È£¬ÀýÈçÉÏÃæÀý×ÓÖеÄ5

utterance£º±íʾ»°ÓÏìÓ¦£©µÄһϵÁе¥´Êid

utterance_len£º»°ÓïµÄ³¤¶È

label£º±êÇ©£¬ÔÚѵÁ·Êý¾ÝÖвÅÓС£ 0»ò1¡£

distractor_ [N]£º½öÔÚ²âÊÔ/ÑéÖ¤Êý¾ÝÖС£ NµÄ·¶Î§´Ó0µ½8.´ú±í¸ÉÈÅÏîµÄ´ÊÐòÁÐid¡£

distractor_ [N] _len£º½öÔÚ²âÊÔ/ÑéÖ¤Êý¾ÝÖС£ NµÄ·¶Î§ÊÇ´Ó0µ½8.·¢ÒôµÄ³¤¶È¡£

Ô¤´¦ÀíÓÉPython½Å±¾prepare_data.py Íê³É£¬¸Ã½Å±¾Éú³É3¸öÎļþ£ºtrain.tfrecords£¬validation.tfrecordsºÍtest.tfrecords¡£ Äã¿ÉÒÔ×Ô¼ºÔËÐнű¾»òÕßÔÚÕâÀïÏÂÔØÊý¾ÝÎļþ ¡£

´´½¨Ò»¸öÊäÈ뺯Êý

ΪÁËʹÓÃTensorflowÄÚÖõÄѵÁ·ºÍÆÀ¹ÀÖ§³Ö£¬ÎÒÃÇÐèÒª´´½¨Ò»¸öÊäÈ뺯Êý - Ò»¸ö·µ»ØÅúÁ¿ÊäÈëÊý¾ÝµÄº¯Êý¡£ ÊÂʵÉÏ£¬ÓÉÓÚÎÒÃǵÄѵÁ·ºÍ²âÊÔÊý¾ÝÓв»Í¬µÄ¸ñʽ£¬ÎÒÃÇÐèÒª²»Í¬µÄÊäÈ빦ÄÜ¡£ ÊäÈ뺯ÊýÓ¦·µ»ØÒ»ÅúÌØÕ÷ºÍ±êÇ©£¨Èç¹û¿ÉÓã©¡£ Ä£°åÈçÏ£º

def input_fn():
# TODO Load and preprocess data here
return batched_features, labels

ÒòΪÔÚѵÁ·ºÍÆÀ¹À¹ý³ÌÖÐÎÒÃÇÐèÒª²»Í¬µÄÊäÈ뺯Êý£¬²¢ÇÒÒòΪÎÒÃÇÌÖÑá¸´ÖÆ´úÂ룬ËùÒÔÎÒÃÇ´´½¨ÁËÒ»¸öÃûΪcreate_input_fnµÄ°ü×°Æ÷£¬ÒÔ±ãΪÏàÓ¦µÄģʽ£¨mode£©´´½¨Ò»¸öÊäÈ뺯Êý¡£ ËüÒ²ÐèҪһЩÆäËû²ÎÊý¡£ ÕâÊÇÎÒÃÇʹÓõ͍Ò壺

def create_input_fn(mode, input_files, batch_size, num_epochs=None):
def input_fn():
# TODO Load and preprocess data here
return batched_features, labels

return input_fn

ÍêÕûµÄ´úÂë¿ÉÒÔÔÚudc_inputs.pyÖÐÕÒµ½¡£ Õâ¸öº¯ÊýÖ÷ÒªÖ´ÐÐÒÔϲÙ×÷£º

´´½¨ÃèÊöÑùÀýÎļþÖÐ×ֶεÄÌØÕ÷¶¨Ò壨feature definition£©

ʹÓÃtf.TFRecordReader´ÓÊäÈëÎļþÖжÁÈ¡¼Ç¼

¸ù¾ÝÌØÕ÷¶¨Òå½âÎö¼Ç¼

ÌáȡѵÁ·±êÇ©

½«¶à¸öÑùÀýºÍÅàѵ±êÇ©¹¹Ôì³ÉÒ»¸öÅú´Î

·µ»ØÅú´Î

¶¨ÒåÆÀ¹ÀÖ¸±ê

ÎÒÃÇÒѾ­Ìáµ½£¬ÎÒÃÇҪʹrecall@ kÖ¸±êÀ´ÆÀ¹ÀÎÒÃǵÄÄ£ÐÍ¡£ ÐÒÔ˵ÄÊÇ£¬TensorflowÔ¤ÖÃÁ˺ܶàÎÒÃÇ¿ÉÒÔʹÓõıê×¼µÄÆÀ¹ÀÖ¸±ê£¬°üÀ¨recall@ k¡£ ҪʹÓÃÕâЩָ±ê£¬ÎÒÃÇÐèÒª´´½¨Ò»¸ö´ÓÖ¸±êÃû³ÆÓ³Éäµ½º¯Êý£¨ÒÔÔ¤²âºÍ±êǩΪ²ÎÊý£©µÄ×ֵ䣺

def create_evaluation_metrics():
eval_metrics = {}
for k in [1, 2, 5, 10]:
eval_metrics[¡°recall_at_%d¡± % k] = functools.partial(
tf.contrib.metrics.streaming_sparse_recall_at_k,
k=k)
return eval_metrics

ÉÏÃæ´úÂëÖУ¬ÎÒÃÇʹÓÃfunctools.partial½«Ò»¸ö´øÓÐ3¸ö²ÎÊýµÄº¯Êýת»»ÎªÖ»´øÓÐ2¸ö²ÎÊýµÄº¯Êý¡£ ²»ÒªÈÃÃû³Æstreaming_sparse_recall_at_k°ÑÄã¸ãºýÍ¿¡£ streamingÖ»ÊÇÒâζ×ÅÖ¸±êÊÇÔÚ¶à¸öÅú´ÎÉÏÀÛ»ýµÄ£¬¶øsparseÔòÊÇÖ¸ÎÒÃDZêÇ©µÄ¸ñʽ¡£

Õâ´øÀ´ÁËÒ»¸öÖØÒªµÄÎÊÌ⣺ÆÀ¹À¹ý³ÌÖÐÎÒÃǵÄÔ¤²âµ½µ×ÊÇʲô¸ñʽ£¿ ÔÚѵÁ·ÆÚ¼ä£¬ÎÒÃÇÔ¤²âÑùÀýÕýÈ·µÄ¸ÅÂÊ¡£ µ«ÊÇÔÚÆÀ¹À¹ý³ÌÖУ¬ÎÒÃǵÄÄ¿±êÊǶԻ°ÓïºÍ9¸ö¸ÉÈÅÏî½øÐÐÆÀ·Ö£¬²¢ÌôÑ¡·Ö×î¸ßµÄÒ»¸ö - ÎÒÃDz»Äܼòµ¥µØÔ¤²âÕýÈ·»¹ÊDz»ÕýÈ·¡£ ÕâÒâζ×ÅÔÚÆÀ¹À¹ý³ÌÖУ¬Ã¿¸öÑùÀý¶¼Ó¦¸ÃµÃµ½Ò»¸öÓÐ10¸ö·ÖÖµµÄÏòÁ¿£¬ÀýÈç[0.34,0.1,0.22,0.45,0.01,0.02,0.03,0.08,0.33,0.11]£¬Ã¿Ò»¸ö·ÖÊý·Ö±ð¶ÔÓ¦ÓÚÕæÊµµÄÏìÓ¦ºÍ9¸ö¸ÉÈÅÏî¡£ ÿ¸ö»°Óï¶¼ÊǶÀÁ¢ÆÀ·ÖµÄ£¬ËùÒÔ¸ÅÂʲ»ÐèÒª¼ÓÆðÀ´Îª1.ÒòÎªÕæÕýµÄÏìÓ¦ÔÚÊý×éÖÐ×ÜÊÇΪ0£¬ËùÒÔÿ¸öÀý×ӵıêÇ©¶¼ÊÇ0¡£ÉÏÃæµÄÀý×Ó½«±»recall@ 1Ö¸±êÊÓΪ·ÖÀà´íÎó£¬ÒòΪµÚÈý¸ö¸ÉÈÅÏîµÄ¸ÅÂÊÊÇ0.45£¬¶øÕæÊµµÄ»Ø´ðÖ»ÓÐ0.34¡£ È»¶ø£¬Ëü»á±»recall@ 2Ö¸±êÊÓΪÕýÈ·µÄ¡£

ѵÁ·´úÂëÑù°å

ÔÚ±àдʵ¼ÊµÄÉñ¾­ÍøÂç´úÂë֮ǰ£¬ÎÒϲ»¶±àдÓÃÓÚѵÁ·ºÍÆÀ¹ÀÄ£Ð͵ÄÑù°å´úÂë¡£ ÕâÊÇÒòΪ£¬Ö»ÒªÄã¼á³ÖÕýÈ·µÄ½Ó¿Ú£¬ºÜÈÝÒ×»»³öÄãʹÓõÄÊÇʲôÑùµÄÍøÂç¡£ ¼ÙÉèÎÒÃÇÓÐÒ»¸öÄ£Ðͺ¯Êýmodel_fn£¬ËüÒÔÅú´ÎÌØÕ÷£¬±êÇ©ºÍģʽ£¨ÑµÁ·»òÆÀ¹À£©×÷ΪÊäÈ룬²¢·µ»ØÔ¤²â½á¹û¡£ ÄÇôÎÒÃÇ¿ÉÒÔ±àдÈçϵÄͨÓôúÂëÀ´ÑµÁ·ÎÒÃǵÄÄ£ÐÍ£º

estimator = tf.contrib.learn.Estimator(
model_fn=model_fn,
model_dir=MODEL_DIR,
config=tf.contrib.learn.RunConfig())

input_fn_train = udc_inputs.create_input_fn(
mode=tf.contrib.learn.ModeKeys.TRAIN,
input_files=[TRAIN_FILE],
batch_size=hparams.batch_size)

input_fn_eval = udc_inputs.create_input_fn(
mode=tf.contrib.learn.ModeKeys.EVAL,
input_files=[VALIDATION_FILE],
batch_size=hparams.eval_batch_size,
num_epochs=1)

eval_metrics = udc_metrics.create_evaluation_metrics()

# We need to subclass theis manually for now. The next TF version will
# have support ValidationMonitors with metrics built-in.
# It¡¯s already on the master branch.
class EvaluationMonitor(tf.contrib.learn.monitors.EveryN):
def every_n_step_end(self, step, outputs):
self._estimator.evaluate(
input_fn=input_fn_eval,
metrics=eval_metrics,
steps=None)

eval_monitor = EvaluationMonitor(every_n_steps=FLAGS.eval_every)
estimator.fit(input_fn=input_fn_train, steps=None, monitors=[eval_monitor])

ÔÚÕâÀÎÒÃÇΪmodel_fn£¬ÑµÁ·ºÍÆÀ¹ÀÊý¾ÝµÄÁ½¸öÊäÈ뺯ÊýÒÔ¼°ÆÀ¹ÀÖ¸±ê×ֵ䴴½¨ÁËÒ»¸ö¹À¼ÆÆ÷¡£ ÎÒÃÇ»¹¶¨ÒåÁËÒ»¸ö¼àÊÓÆ÷£¬ÔÚѵÁ·ÆÚ¼äÿ¸ôFLAGS.eval_every_everyÖ¸¶¨µÄ²½Êý¶ÔÄ£ÐͽøÐÐÆÀ¹À¡£ ×îºó£¬ÎÒÃÇѵÁ·Ä£ÐÍ¡£ ѵÁ·¹ý³Ì¿ÉÒÔÎÞÏÞÆÚµØÔËÐУ¬µ«Tensorflow¿ÉÒÔ×Ô¶¯µØ½«¼ì²éµãÎļþ±£´æÔÚMODEL_DIRÖ¸¶¨µÄĿ¼ÖУ¬Òò´Ë¿ÉÒÔËæÊ±Í£Ö¹ÑµÁ·¡£ Ò»¸ö¸üìŵļ¼ÇÉÊÇʹÓÃÔçÆÚÍ£Ö¹£¬ÕâÒâζ×ŵ±ÑéÖ¤¼¯Ö¸±êÍ£Ö¹¸Ä½øÊ±£¨¼´¿ªÊ¼¹ýÄâºÏ£©£¬½«×Ô¶¯Í£Ö¹ÑµÁ·¡£ Äã¿ÉÒÔÔÚudc_train.pyÖп´µ½ÍêÕûµÄ´úÂë¡£

ÎÒÏë¼òÒªÌá¼°µÄÁ½¼þÊÂÊÇFLAGSµÄʹÓᣠÕâÊǸø³ÌÐòÌṩÃüÁîÐвÎÊýµÄÒ»ÖÖ·½·¨£¨ÀàËÆÓÚPythonµÄargparse£©¡£ hparamsÊÇÎÒÃÇÔÚhparams.pyÖд´½¨µÄÒ»¸ö×Ô¶¨Òå¶ÔÏó£¬Ëü°üº¬ÓÃÀ´µ÷ÕûÄ£Ð͵IJÎÊý¡¢³¬²ÎÊý¡£ ÎÒÃÇÔÚʵÀý»¯Ä£ÐÍʱ½«Õâ¸öhparams¶ÔÏó¸³Óè¸øÄ£ÐÍ¡£

´´½¨Ä£ÐÍ

ÏÖÔÚÎÒÃÇÒѾ­½¨Á¢Á˹ØÓÚÊäÈ룬½âÎö£¬ÆÀ¹ÀºÍѵÁ·µÄÑù°å´úÂ룬¿ÉÒÔΪÎÒÃǵÄDual LSTMÉñ¾­ÍøÂç±àд´úÂëÁË¡£ ÒòΪÎÒÃÇÓв»Í¬¸ñʽµÄѵÁ·ºÍÆÀ¹ÀÊý¾Ý£¬ËùÒÔÎÒдÁËÒ»¸öcreate_model_fn°ü×°Æ÷£¬Ëü¸ºÔðΪÎÒÃÇÌṩÕýÈ·µÄ¸ñʽ¡£ Ëü½ÓÊÜÒ»¸ömodel_impl²ÎÊý£¬Ó¦µ±Ö¸ÏòÒ»¸öʵ¼Ê½øÐÐÔ¤²âµÄº¯Êý¡£ ÔÚÎÒÃǵÄÀý×ÓÖоÍÊÇÉÏÃæ½éÉܵÄË«±àÂëÆ÷LSTM£¬µ«ÊÇÎÒÃÇ¿ÉÒÔºÜÈÝÒ׵ذÑËü»»³ÉÆäËûµÄÉñ¾­ÍøÂç¡£ ÈÃÎÒÃÇ¿´¿´ÊÇʲôÑùµÄ£º

def dual_encoder_model(
hparams,
mode,
context,
context_len,
utterance,
utterance_len,
targets):

# Initialize embedidngs randomly or with pre-trained vectors if available
embeddings_W = get_embeddings(hparams)

# Embed the context and the utterance
context_embedded = tf.nn.embedding_lookup(
embeddings_W, context, name=¡±embed_context¡±)

utterance_embedded = tf.nn.embedding_lookup(
embeddings_W, utterance, name=¡±embed_utterance¡±)

# Build the RNN
with tf.variable_scope(¡°rnn¡±) as vs:
# We use an LSTM Cell
cell = tf.nn.rnn_cell.LSTMCell(
hparams.rnn_dim,
forget_bias=2.0,
use_peepholes=True,
state_is_tuple=True)

# Run the utterance and context through the RNN
rnn_outputs, rnn_states = tf.nn.dynamic_rnn(
cell,
tf.concat(0, [context_embedded, utterance_embedded]),
sequence_length=tf.concat(0, [context_len, utterance_len]),
dtype=tf.float32)

encoding_context, encoding_utterance = tf.split(0, 2, rnn_states.h)

with tf.variable_scope(¡°prediction¡±) as vs:
M = tf.get_variable(¡°M¡±,
shape=[hparams.rnn_dim, hparams.rnn_dim],
initializer=tf.truncated_normal_initializer())

# ¡°Predict¡± a response: c * M
generated_response = tf.matmul(encoding_context, M)
generated_response = tf.expand_dims(generated_response, 2)
encoding_utterance = tf.expand_dims(encoding_utterance, 2)

# Dot product between generated response and actual response
# (c * M) * r
logits = tf.batch_matmul(generated_response, encoding_utterance, True)
logits = tf.squeeze(logits, [2])

# Apply sigmoid to convert logits to probabilities
probs = tf.sigmoid(logits)

# Calculate the binary cross-entropy loss
losses = tf.nn.sigmoid_cross_entropy_with_logits(logits, tf.to_float(targets))

# Mean loss across the batch of examples
mean_loss = tf.reduce_mean(losses, name=¡±mean_loss¡±)

return probs, mean_loss

ÍêÕûµÄ´úÂëÔÚdual_encoder.pyÖÐ ¡£ ¼øÓÚ´Ë£¬ÎÒÃÇÏÖÔÚ¿ÉÒÔÔÚÎÒÃÇ֮ǰ¶¨ÒåµÄudc_train.pyµÄÖ÷Àý³ÌÖÐʵÀý»¯ÎÒÃǵÄÄ£Ðͺ¯Êý¡£

model_fn = udc_model.create_model_fn(
hparams=hparams,
model_impl=dual_encoder_model)

ºÃÁË£¡ ÎÒÃÇÏÖÔÚ¿ÉÒÔÔËÐÐpython udc_train.py£¬Ëü½«¿ªÊ¼ÑµÁ·ÎÒÃǵÄÍøÂ磬¼ä»òÆÀ¹ÀÑéÖ¤Êý¾ÝµÄÕÙ»ØÇé¿ö£¨Äã¿ÉÒÔÑ¡ÔñʹÓÃ-eval_every¿ª¹ØÀ´Ñ¡ÔñÆÀ¹ÀµÄƵÂÊ£©¡£ Òª»ñµÃÎÒÃÇʹÓÃtf.flagsºÍhparams¶¨ÒåµÄËùÓпÉÓõÄÃüÁîÐбêÖ¾µÄÍêÕûÁÐ±í£¬Äã¿ÉÒÔÔËÐÐpython udc_train.py --help¡£

INFO:tensorflow:training step 20200, loss = 0.36895 (0.330 sec/batch).
INFO:tensorflow:Step 20201: mean_loss:0 = 0.385877
INFO:tensorflow:training step 20300, loss = 0.25251 (0.338 sec/batch).
INFO:tensorflow:Step 20301: mean_loss:0 = 0.405653
¡­
INFO:tensorflow:Results after 270 steps (0.248 sec/batch): recall_at_1 = 0.507581018519, recall_at_2 = 0.689699074074, recall_at_5 = 0.913020833333, recall_at_10 = 1.0, loss = 0.5383
¡­

ÆÀ¹ÀÄ£ÐÍ

ÔÚÄãѵÁ·ÍêÄ£ÐÍÖ®ºó£¬Äã¿ÉÒÔÔÚ²âÊÔ¼¯ÉÏʹÓÃpython udc_test.py - model_dir = $ MODEL_DIR_FROM_TRAININGÀ´ÆÀ¹ÀËü£¬ÀýÈçpython udc_test.py - model_dir =?/ github / chatbot-retrieval / runs / 1467389151¡£ Õ⽫ÔÚ²âÊÔ¼¯¶ø²»ÊÇÑéÖ¤¼¯ÉÏÔËÐÐrecall@ kÆÀ¹ÀÖ¸±ê¡£ Çë×¢Ò⣬Äã±ØÐëʹÓÃÔÚѵÁ·ÆÚ¼äʹÓõÄÏàͬ²ÎÊýµ÷ÓÃudc_test.py¡£ ËùÒÔ£¬Èç¹ûÄãÓà - embedding_size = 128½øÐÐѵÁ·£¬¾ÍÐèÒªÓÃÏàͬµÄ·½·¨µ÷ÓòâÊԽű¾¡£

¾­¹ýÔ¼20,000²½µÄѵÁ·£¨ÔÚ¿ìËÙGPUÉÏÒ»¸öСʱ×óÓÒ£©£¬ÎÒÃǵÄÄ£ÐÍÔÚ²âÊÔ¼¯Éϵõ½ÒÔϽá¹û£º

recall_at_1 = 0.507581018519
recall_at_2 = 0.689699074074
recall_at_5 = 0.913020833333

ËäÈ»recall@ 1½Ó½üÎÒÃǵÄTFIDFÄ£ÐÍ£¬recall@ 2ºÍrecall@ 5ÏÔןüºÃ£¬Õâ±íÃ÷ÎÒÃǵÄÉñ¾­ÍøÂçΪÕýÈ·µÄ´ð°¸·ÖÅäÁ˸ü¸ßµÄ·ÖÊý¡£ ԭʼÂÛÎÄÖÐrecall@1¡¢recall@2ºÍrecall@5µÄÖµ·Ö±ðÊÇ0.55£¬0.72ºÍ0.92£¬µ«ÊÇÎÒ»¹Ã»ÄÜÖØÏÖ¡£ Ò²Ðí¶îÍâµÄÊý¾ÝÔ¤´¦Àí»ò³¬²ÎÊýÓÅ»¯¿ÉÄÜ»áʹ·ÖÊýÉÏÉýÒ»µã¡£

Ô¤²â

Äã¿ÉÒÔÐ޸IJ¢ÔËÐÐudc_predict.py£¬ÒÔ»ñÈ¡²»¿É¼ûÊý¾ÝµÄ¸ÅÂʵ÷֡£ ÀýÈçpython udc_predict.py?¡ª?model_dir=./runs/1467576365/£¬½«µÃµ½Êä³ö£º

Context: Example context
Response 1: 0.44806
Response 2: 0.481638

 

Äã¿ÉÒÔÏëÏóΪ£¬ÔÚÒ»¸öÉÏÏÂÎÄÖÐÊäÈë100¸öDZÔÚµÄÏìÓ¦£¬È»ºóÑ¡ÔñÒ»¸ö×î¸ß·ÖµÄ¡£

½áÂÛ

ÔÚÕâÆªÎÄÕÂÖУ¬ÎÒÃÇÒѾ­ÊµÏÖÁËÒ»¸ö»ùÓÚ¼ìË÷µÄÉñ¾­ÍøÂçÄ£ÐÍ£¬¿ÉÒÔ¸ù¾Ý¶Ô»°ÉÏÏÂÎĶÔDZÔÚµÄÏìÓ¦´ò·Ö¡£ È»¶ø£¬»¹Óкܶà¸Ä½øµÄÓàµØ¡£ ¿ÉÒÔÏëÏó£¬ÓëË«LSTM±àÂëÆ÷Ïà±È£¬ÆäËûÉñ¾­ÍøÂçÔÚÕâ¸öÈÎÎñÉÏ×öµÃ¸üºÃ¡£ ³¬²ÎÊýÓÅ»¯»¹Óкܶà¿Õ¼ä£¬»òÕßÔ¤´¦Àí²½ÖèµÄ¸Ä½ø¡£ ±¾½Ì³ÌµÄ´úÂëºÍÊý¾ÝÔÚGithubÉÏ£¬Çë²é¿´¡£

   
5867 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

»ùÓÚͼ¾í»ýÍøÂçµÄͼÉî¶Èѧϰ
×Ô¶¯¼ÝÊ»ÖеÄ3DÄ¿±ê¼ì²â
¹¤Òµ»úÆ÷ÈË¿ØÖÆÏµÍ³¼Ü¹¹½éÉÜ
ÏîĿʵս£ºÈçºÎ¹¹½¨ÖªÊ¶Í¼Æ×
 
Ïà¹ØÎĵµ

5GÈ˹¤ÖÇÄÜÎïÁªÍøµÄµäÐÍÓ¦ÓÃ
Éî¶ÈѧϰÔÚ×Ô¶¯¼ÝÊ»ÖеÄÓ¦ÓÃ
ͼÉñ¾­ÍøÂçÔÚ½»²æÑ§¿ÆÁìÓòµÄÓ¦ÓÃÑо¿
ÎÞÈË»úϵͳԭÀí
Ïà¹Ø¿Î³Ì

È˹¤ÖÇÄÜ¡¢»úÆ÷ѧϰ&TensorFlow
»úÆ÷ÈËÈí¼þ¿ª·¢¼¼Êõ
È˹¤ÖÇÄÜ£¬»úÆ÷ѧϰºÍÉî¶Èѧϰ
ͼÏñ´¦ÀíËã·¨·½·¨Óëʵ¼ù