Ê×Ò³
ѧϰ
»î¶¯
רÇø
¹¤¾ß
TVP
·¢²¼
¾«Ñ¡ÄÚÈÝ/¼¼ÊõÉçȺ/ÓŻݲúÆ·,¾¡ÔÚС³ÌÐò
Á¢¼´Ç°Íù

ÈçºÎʹÓà Julia ÓïÑÔʵÏÖ¡¸Í¬Ì¬¼ÓÃÜ+»úÆ÷ѧϰ¡¹£¿

×î½ü£¬¡¸Çø¿éÁ´¡¹¡¢¡¸Áª°îѧϰ¡¹µÈ¸ÅÄîÊܵ½ÁË¿ÕÇ°µÄ¹Ø×¢¡£¶øÔÚÕâЩ¸ÅÄî±³ºó£¬ÉÙ²»ÁËÒ»Ïî¼¼ÊõµÄÓ°×Ó¡ª¡ª¡¸Í¬Ì¬¼ÓÃÜ¡¹¡£±¾ÎĽéÉÜÁËʹÓà Julia ÓïÑÔ½øÐлùÓÚ̬ͬ¼ÓÃÜÊý¾Ý»úÆ÷ѧϰµÄÈ«¹ý³Ì£¬¶ÔÓÚÈëÃÅÕß¾ßÓм«´óµÄ²Î¿¼¼ÛÖµ¡£

×¢Ò⣺±¾ÎÄÌÖÂÛÁË×îÇ°ÑصÄÃÜÂëѧ¼¼Êõ£¬Ö¼ÔÚÌṩһÖÖÀûÓá¸Julia Computing¡¹½øÐÐÑо¿µÄÊӽǡ£Çë²»Òª½«ÎÄÖеÄÈκÎʾÀýÓÃÓÚÉú²úÓ¦ÓóÌÐò¡£ÔÚʹÓÃÃÜÂëѧ֮ǰһ¶¨Òª×ÉѯרҵµÄÃÜÂëѧר¼Ò¡£

³ÌÐò°ü£ºhttps://github.com/JuliaComputing/ToyFHE.jl

Ïà¹Ø´úÂ룺https://github.com/JuliaComputing/ToyFHE.jl/blob/master/examples/encrypted_mnist/infer.jl

ÒýÑÔ

¼ÙÉèÄ㿪·¢ÁËÒ»¸ö¿áìŵÄлúÆ÷ѧϰģÐÍ£¬ÏÖÔÚÄãÏ뽫²¿Êð¸ÃÄ£ÐÍ£¬ÎªÓû§Ìṩ·þÎñ¡£Ó¦¸ÃÔõô×öÄØ£¿×î¼òµ¥µÄ·½·¨¿ÉÄÜÊÇÖ±½Ó°ÑÄ£ÐÍ·¢²¼¸øÓû§£¬È»ºóÈÃËûÃÇʹÓÃ×Ô¼ºµÄÊý¾ÝÔÚ±¾µØÔËÐÐÕâ¸öÄ£ÐÍ¡£µ«ÕâÖÖ·½·¨´æÔÚһЩÎÊÌ⣺

  • »úÆ÷ѧϰģÐÍÒ»°ã¶¼ºÜ´ó£¬¶øÓû§µÄÉ豸ʵ¼ÊÉÏ¿ÉÄÜûÓÐ×ã¹»µÄ´æ´¢¿Õ¼ä»òËãÁ¦À´ÔËÐÐÄ£ÐÍ
  • »úÆ÷ѧϰģÐÍÒ»°ã¶¼»áƵ·±µØ¸üУ¬Äã¿ÉÄܲ»»áÏëÔÚÍøÂçÉÏƵ·±´«ÊäÕâô´óµÄÄ£ÐÍ
  • ¿ª·¢»úÆ÷ѧϰģÐÍÐèÒª´óÁ¿Ê±¼äºÍ¼ÆËã×ÊÔ´£¬Äã¿ÉÄÜ»áÏëͨ¹ýÏòʹÓøÃÄ£Ð͵ÄÓû§ÊÕ·ÑÀ´Êջسɱ¾

½ÓÏÂÀ´£¬³£ÓõĽâ¾ö·½°¸Êǽ«Ä£ÐÍ×÷ΪӦÓóÌÐò½Ó¿Ú£¨API£©ÔÚÔÆÉϹ«¿ª¡£ÔÚ¹ýÈ¥¼¸Äê¼ä£¬ÕâЩ¡¸»úÆ÷ѧϰ¼´·þÎñ¡¹²úÆ·ÈçÓêºó´ºËñ°ãÓ¿ÏÖ£¬Ã¿¸öÖ÷ÒªµÄÔÆƽ̨¶¼»áΪÆóÒµ¼¶¿ª·¢ÕßÌṩÕâÑùµÄ·þÎñ¡£

µ«ÕâÀà²úÆ·µÄDZÔÚÓû§ËùÃæ¶ÔµÄÀ§¾³Ò²ÊÇÏÔ¶øÒ×¼ûµÄ¡ª¡ª´¦ÀíÓû§Êý¾ÝµÄÔ¶³Ì·þÎñÆ÷¿ÉÄܲ¢²»¿ÉÐÅ¡£ÕâÑù¾Í»á´æÔÚÃ÷È·µÄÂ×ÀíºÍ·¨ÂɵķÖÆ磬´Ó¶øÏÞÖÆÕâÖÖ½â¾ö·½°¸µÄÓÐЧ·¶Î§¡£ÔÚÊܼà¹ÜµÄ²úÒµ£¨ÓÈÆäÊÇÒ½ÁÆÒµºÍ½ðÈÚÒµ£©ÖУ¬Ò»°ãÊDz»ÔÊÐí½«²¡»¼»ò½ðÈÚÊý¾Ý·¢Ë͸øµÚÈý·½½øÐд¦ÀíµÄ¡£ÎÒÃÇ¿ÉÒÔ×öµÃ¸üºÃÂð£¿

ÊÂʵ֤Ã÷£¬ÎÒÃÇ¿ÉÒÔ£¡×î½ü£¬ÃÜÂëѧ·½ÃæÈ¡µÃµÄÍ»ÆÆ¿ÉÒÔÔÚÎÞÐè½øÐнâÃܵÄÇé¿öÏ£¬Ö±½Ó¼ÆËã¼ÓÃÜÊý¾Ý¡£ÔÚÎÒÃǵÄÀý×ÓÖУ¬Óû§¿ÉÒÔ½«¼ÓÃÜÊý¾Ý£¨ÀýÈçͼÏñ£©´«µÝ¸øÔÆ API£¬ÒÔ´ËÔËÐлúÆ÷ѧϰģÐÍ£¬²¢·µ»Ø¼ÓÃܵĴ𰸡£Õû¸ö¹ý³ÌÖж¼Ã»ÓнâÃÜÓû§Êý¾Ý£¬ÓÈÆäÊÇÔÆ·þÎñÉ̼Ȳ»ÄÜ·ÃÎÊԭʼͼÏñ£¬Ò²²»ÄܽâÂë¼ÆËãµÃµ½µÄÔ¤²âÖµ¡£ÕâÊÇÔõô×öµ½µÄÄØ£¿±¾ÎÄͨ¹ý¹¹½¨Ò»¸ö½øÐмÓÃÜͼÏñµÄÊÖдʶ±ð£¨À´×Ô MNIST Êý¾Ý¼¯£©µÄ»úÆ÷ѧϰģÐÍΪ´ó¼Ò½ÒÃر³ºóµÄÔ­Àí¡£

̬ͬ¼ÓÃÜ£¨Homomorphic Encryption£¬HE£©µÄÒ»°ã½âÊÍ

Ò»°ã¶øÑÔ£¬¶Ô¼ÓÃÜÊý¾Ý½øÐмÆËãµÄÄÜÁ¦±»³ÆΪ¡¸°²È«¼ÆË㡹£¬ÕâÊÇÒ»¸öÏ൱´óµÄÑо¿ÁìÓò£¬Õë¶Ô´óÁ¿²»Í¬µÄ³¡¾°ÒªÓò»Í¬µÄÃÜÂëѧ·½·¨ºÍ¼¼Êõ½â¾öÎÊÌâ¡£ÔÚ±¾ÀýÖУ¬ÎÒÃǽ«¹Ø×¢ËùνµÄ¡¸Í¬Ì¬¼ÓÃÜ¡¹¼¼Êõ¡£ÔÚ̬ͬ¼ÓÃÜϵͳÖУ¬ÎÒÃÇÒ»°ãÒª½øÐÐÒÔϲÙ×÷£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
pub_key,?eval_key,?priv_key?=?keygen()?encrypted?=?encrypt(pub_key,?plaintext)?decrypted?=?decrypt(priv_key,?encrypted)?encrypted¡ä?=?eval(eval_key,?f,?encrypted)?

Ç°Èý²½·Ç³£Ö±¹Û£¬Ö®Ç°Ê¹ÓùýÈκηǶԳƼÓÃܼ¼ÊõµÄÈ˶¼»á¶Ô´Ë¸Ðµ½ºÜÊìϤ£¨¾ÍÏñͨ¹ý°²È«´«Êä²ãЭÒ飨TLS£©Á¬½Óµ½±¾ÎÄ£©¡£×îºóÒ»²½²ÅÊÇÉñÆæÖ®´¦¡£ËüʹÓüÓÃÜÊý¾ÝÆÀ¹ÀÁË f£¬²¢·µ»ØÁËÁíÒ»¸öÓë»ùÓÚ¼ÓÃÜÖµÆÀ¹À f µÄ½á¹û¶ÔÓ¦µÄ¼ÓÃÜÖµ¡£ÕâÒ»ÐÔÖÊÕýÊÇÎÒÃǽ«ÕâÖÖ¼¼Êõ³ÆΪ¡¸Í¬Ì¬¼ÓÃÜ¡¹µÄÔ­Òò¡£ÆÀ¹À²Ù×÷ÓëÏÂÃæµÄ¼ÓÃܲÙ×÷µÈ¼Û£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
f(decrypt(priv_key,?encrypted))?==?decrypt(priv_key,?eval(eval_key,?f,?encrypted))?

£¨Í¬ÑùµØ£¬¿ÉÒÔ»ùÓÚ¼ÓÃÜÖµÆÀ¹ÀÈÎÒâµÄ̬ͬ f£©

Ö§³ÖÄÄЩº¯Êý f È¡¾öÓÚ¼ÓÃÜ·½°¸ºÍÖ§³ÖµÄÔËËã¡£Èç¹ûÖ»Ö§³ÖÒ»ÖÖº¯Êý f£¨±ÈÈç f=+£©£¬ÎÒÃÇ¿ÉÒÔ½«ÕâÖÖ¼ÓÃÜ·½°¸³ÆΪ¡¸²¿·Ö̬ͬ¡¹¡£Èç¹û f ÊÇ¿ÉÒÔ½¨Á¢ÈÎÒâµç·µÄÍêÕûµÄÃŵļ¯ºÏ£¬Èç¹ûµç·´óСÓÐÏÞ£¬³Æ֮Ϊ¡¸ÓÐÏÞ̬ͬ¡¹£¨Somewhat Homomorphic Encryption, SHE£©£»Èç¹ûµç·´óС²»ÊÜÏÞÖÆ£¬³Æ֮Ϊ¡¸È«Í¬Ì¬¡¹£¨Fully Homomorphic Encryption, FHE£©¡£Ò»°ã¿ÉÒÔͨ¹ý×ÔÖú·¨£¨bootstrapping£©£¬½«¡¸ÓÐÏÞ¡¹Í¬Ì¬×ª»»Îª¡¸È«¡¹Í¬Ì¬£¬µ«Õâ¸öÎÊÌâÒѾ­³¬¹ýÁ˱¾ÎÄËùÌÖÂÛµÄÄÚÈÝ¡£

ȫ̬ͬ¼ÓÃÜÊÇ×î½üµÄÑо¿£¬Craig Gentry ÔÚ 2009 Äê·¢±íÁ˵ÚÒ»¸ö¿ÉÐУ¨µ«²»Êµ¼Ê£©µÄ·½¡£ÏÖÔÚ½Ðø³öÏÖÁËһЩ¸üÐÂÒ²¸üʵ¼ÊµÄ FHE ·½°¸¡£¸üÖØÒªµÄÊÇ£¬»¹ÓÐһЩ¿ÉÒÔ¸ßЧµØʵÏÖÕâÒ»·½°¸µÄÈí¼þ°ü¡£×î³£ÓõÄÁ½¸öÈí¼þ°üÊÇ Microsoft SEALºÍ PALISADE¡£´ËÍ⣬ÎÒ×î½ü»¹¿ªÔ´ÁËÕâЩËã·¨µÄ Julia ʵÏÖ£¨https://github.com/JuliaComputing/ToyFHE.jl£©¡£³öÓÚÎÒÃǵÄÄ¿µÄ£¬ÎÒÃǽ«Ê¹ÓúóÕßÖÐʵÏÖµÄ CKKS ¼ÓÃÜ¡£

¸ß¼¶ CKKS

CKKS£¨ÒÔ Cheon-Kim-Kim-Song µÄÃû×ÖÃüÃû£¬ËûÔÚ 2016 ÄêµÄÂÛÎÄ¡¸Homomorphic Encryption for Arithmetic of Approximate Numbers¡¹Ìá³ö£©ÊÇÒ»ÖÖ̬ͬ¼ÓÃÜ·½°¸£¬¿ÉÒÔ¶ÔÒÔÏ»ù±¾²Ù×÷½øÐÐ̬ͬÆÀ¹À£º

  • ³¤¶ÈΪ n µÄ¸´ÊýÏòÁ¿µÄ¶ÔÓ¦ÔªËØÏà¼Ó
  • ³¤¶ÈΪ n µÄ¸´ÊýÏòÁ¿µÄ¶ÔÓ¦ÔªËØÏà³Ë
  • ÏòÁ¿ÖÐÔªËصÄÐýת£¨Í¨¹ýÑ­»·ÒÆλʵÏÖ£©

ÏòÁ¿ÔªËصĸ´¹²éî

ÕâÀïµÄ²ÎÊý n È¡¾öÓÚÐèÒªµÄ°²È«ÐÔºÍ׼ȷÐÔ£¬¸ÃÖµÒ»°ã¶¼±È½Ï¸ß¡£ÔÚ±¾ÀýÖУ¬n=4096£¨ÖµÔ½¸ßÔ½°²È«£¬µ«ÊǼÆË㿪ÏúÒ²¸ü´ó£¬Ê±¼ä¸´ÔӶȴóÖ»áËõ·ÅΪ nlog^n£©¡£

´ËÍ⣬Óà CKKS ¼ÆËãÊÇÓÐÔëÉùµÄ¡£Òò´Ë£¬¼ÆËã½á¹ûÒ»°ã¶¼Ö»ÊǽüËÆÖµ£¬¶øÇÒҪעÒâÈ·±£ÆÀ¹À½á¹û×㹻׼ȷ£¬²»»áÓ°Ïì½á¹ûµÄÕýÈ·ÐÔ¡£

Ò²¾ÍÊÇ˵£¬¶Ô»úÆ÷ѧϰ³ÌÐò°üµÄ¿ª·¢Õ߶øÑÔ£¬ÕâЩÏÞÖƲ¢²»º±¼û¡£Ïñ GPU ÕâÑùÓÐÌØÊâÓÃ;µÄ¼ÓËÙÆ÷£¬Ò²¿ÉÒÔ´¦ÀíÊý×ÖÏòÁ¿¡£Í¬Ñù£¬Ðí¶à¿ª·¢Õß»áÒòË㷨ѡÔñµÄÓ°Ïì¡¢¶àÏ̵߳ÈÔ­Òò£¬ÈÏΪ¸¡µãÊýÔëÉùÌ«¶à£¨ÎÒҪǿµ÷µÄÊÇ£¬ÓÐÒ»¸ö¹Ø¼üµÄÇø±ðÊÇ£¬¸¡µãËã·¨±¾ÉíÊÇÈ·¶¨ÐԵģ¬¾¡¹ÜÒòΪʵÏֵĸ´ÔÓÐÔ£¬ËüÓÐʱ²»»áÕ¹ÏÖ³öÕâÖÖÈ·¶¨ÐÔ£¬µ« CKKS Ô­ÓïµÄÔëÉùÕæµÄºÜ¶à£¬µ«ÕâÒ²Ðí¿ÉÒÔÈÃÓû§Òâʶµ½ÔëÉù²¢Ã»ÓеÚÒ»´Î³öÏÖʱÄÇô¿ÉÅ£©¡£

¿¼Âǵ½ÕâÒ»µã£¬ÎÒÃÇÔÙ¿´¿´ÈçºÎÔÚ Julia ÖÐÖ´ÐÐÕâЩÔËË㣨עÒ⣺ÕâÀïÓÐһЩ·Ç³£²»°²È«µÄ²ÎÊýÑ¡Ôñ£¬ÕâЩ²Ù×÷µÄÄ¿µÄÊÇ˵Ã÷Õâ¸ö¿âÔÚ½»»¥Ê½½âÊÍÆ÷£¨REPL£©ÖеÄÓ÷¨£©¡£

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
julia>?using?ToyFHE????#?Let's?play?with?8?element?vectors????julia>?N?=?8;????#?Choose?some?parameters?-?we'll?talk?about?it?later????julia>???=?NegacyclicRing(2N,?(40,?40,?*40*))????????????????????????????????????????/(x???+?1)????#?We'll?use?CKKS?julia>?params?=?CKKSParams(?)??CKKS?parameters????#?We?need?to?pick?a?scaling?factor?for?a?numbers?-?again?we'll?talk?about?that?later??julia>?Tscale?=?FixedRational{2^40}??FixedRational{1099511627776,T}?where?T????#?Let's?start?with?a?plain?Vector?of?zeros??julia>?plain?=?CKKSEncoding{Tscale}(zero(?))??8-element?CKKSEncoding{FixedRational{1099511627776,T}?where?T}?with?indices?0:7:??0.0?+?0.0im??0.0?+?0.0im??0.0?+?0.0im??0.0?+?0.0im??0.0?+?0.0im??0.0?+?0.0im??0.0?+?0.0im??0.0?+?0.0im????#?Ok,?we're?ready?to?get?started,?but?first?we'll?need?some?keys??julia>?kp?=?keygen(params)??CKKS?key?pair????julia>?kp.priv??CKKS?private?key????julia>?kp.pub??CKKS?public?key????#?Alright,?let's?encrypt?some?things:??julia>?foreach(i->plain[i]?=?i+1,?0:7);?plain??8-element?CKKSEncoding{FixedRational{1099511627776,T}?where?T}?with?indices?0:7:??1.0?+?0.0im??2.0?+?0.0im??3.0?+?0.0im??4.0?+?0.0im??5.0?+?0.0im??6.0?+?0.0im??7.0?+?0.0im??8.0?+?0.0im????julia>?c?=?encrypt(kp.pub,?plain)??CKKS?ciphertext?(length?2,?encoding??CKKSEncoding{FixedRational{1099511627776,T}?where?T})??#?And?decrypt?it?again?julia>?decrypt(kp.priv,?c)?8-element?CKKSEncoding{FixedRational{1099511627776,T}?where?T}?with?indices?0:7:?0.9999999999995506?-?2.7335193113350057e-16im?1.9999999999989408?-?3.885780586188048e-16im?3.000000000000205?+?1.6772825551165524e-16im?4.000000000000538?-?3.885780586188048e-16im?4.999999999998865?+?8.382500573679615e-17im?6.000000000000185?+?4.996003610813204e-16im?7.000000000001043?-?2.0024593503998215e-16im?8.000000000000673?+?4.996003610813204e-16im??#?Note?that?we?had?some?noise.?Let's?go?through?all?the?primitive?operations?we'll?need:??julia>?decrypt(kp.priv,?c+c)?8-element?CKKSEncoding{FixedRational{1099511627776,T}?where?T}?with?indices?0:7:?1.9999999999991012?-?5.467038622670011e-16im?3.9999999999978817?-?7.771561172376096e-16im?6.00000000000041?+?3.354565110233105e-16im?8.000000000001076?-?7.771561172376096e-16im?9.99999999999773?+?1.676500114735923e-16im?12.00000000000037?+?9.992007221626409e-16im?14.000000000002085?-?4.004918700799643e-16im?16.000000000001346?+?9.992007221626409e-16im??julia>?csq?=?c*c?CKKS?ciphertext?(length?3,?encoding?CKKSEncoding{FixedRational{1208925819614629174706176,T}?where?T})??julia>?decrypt(kp.priv,?csq)8-element?CKKSEncoding{FixedRational{1208925819614629174706176,T}?where?T}?with?indices?0:7:?0.9999999999991012?-?2.350516767363621e-15im?3.9999999999957616?-?5.773159728050814e-15im?9.000000000001226?-?2.534464540987068e-15im?16.000000000004306?-?2.220446049250313e-15im?24.99999999998865?+?2.0903753311370056e-15im?36.00000000000222?+?4.884981308350689e-15im?49.000000000014595?+?1.0182491378134327e-15im?64.00000000001077?+?4.884981308350689e-15im?

ÕâºÜ¼òµ¥£¡ÃôÈñµÄ¶ÁÕß¿ÉÄÜÒѾ­×¢Òâµ½ÁË csq ºÍ֮ǰµÄÃÜÎÄ¿´ÆðÀ´Óе㲻ͬ¡£ÓÈÆäÊÇ£¬ËüÊÇ¡¸³¤¶ÈΪ 3¡¹µÄÃÜÎÄ£¬·¶Î§Ò²¸ü´ó¡£ÒªËµÃ÷ËüÃÇÊÇʲô£¬ÒÔ¼°ËüÃÇÊÇ×öʲôÓõÄÓеãÌ«¹ý¸´ÔÓ¡£ÎÒÖ»Ïë˵£¬ÔÚ½øÒ»²½¼ÆËã֮ǰ£¬ÎÒÃÇÒªµÃÈÃÕâЩֵ½µÏÂÀ´£¬·ñÔòÎÒÃǻᾡÃÜÎÄÖеġ¸¿Õ¼ä¡¹¡£ÐÒÔ˵ÄÊÇ£¬ÓÐÒ»ÖÖ·½·¨¿ÉÒÔ½â¾öÕâÁ½¸öÎÊÌ⣺

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
#?To?get?back?down?to?length?2,?we?need?to?`keyswitch`?(aka?#?relinerarize),?which?requires?an?evaluation?key.?Generating?#?this?requires?the?private?key.?In?a?real?application?we?would?#?have?generated?this?up?front?and?sent?it?along?with?the?encrypted?#?data,?but?since?we?have?the?private?key,?we?can?just?do?it?now.?julia>?ek?=?keygen(EvalMultKey,?kp.priv)?CKKS?multiplication?key??julia>?csq_length2?=?keyswitch(ek,?csq)?CKKS?ciphertext?(length?2,?encoding??CKKSEncoding{FixedRational{1208925819614629174706176,T}?where?T})???#?Getting?the?scale?back?down?is?done?using?modswitching.?julia>?csq_smaller?=?modswitch(csq_length2)??CKKS?ciphertext?(length?2,?encoding??CKKSEncoding{FixedRational{1.099511626783e12,T}?where?T})???#?And?it?still?decrypts?correctly?(though?note?we've?lost?some?precision)?julia>?decrypt(kp.priv,?csq_smaller)?8-element?CKKSEncoding{FixedRational{1.099511626783e12,T}?where?T}?with?indices?0:7:?0.9999999999802469?-?5.005163520332181e-11im?3.9999999999957723?-?1.0468514951188039e-11im?8.999999999998249?-?4.7588542623100616e-12im?16.000000000023014?-?1.0413447889166631e-11im?24.999999999955193?-?6.187833723406491e-12im?36.000000000002345?+?1.860733715346631e-13im?49.00000000001647?-?1.442396043149794e-12im?63.999999999988695?-?1.0722489563648028e-10im?

´ËÍ⣬modswitching£¨Ä£×ª»»£ºmodulus switching µÄ¼òд£©¼õÉÙÁËÃÜÎÄÄ£µÄ´óС£¬ËùÒÔÎÒÃDz»ÄÜÎÞÏÞµØÕâô×öÏÂÈ¥¡££¨ÓÃÉÏÎÄÌáµ½µÄÊõÓïÀ´Ëµ£¬ÎÒÃÇÔÚÕâÀïʹÓõÄÊÇ SHE ·½°¸£©£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
julia>???#?Remember?the?ring?we?initially?created???????????????????????????????????????/(x???+?1)??julia>?ToyFHE.ring(csq_smaller)?#?It?shrunk!???????????????????????????/(x???+?1)?

ÎÒÃÇÒª×öµÄ×îºóÒ»²½ÔËËãÊÇ£ºÐýת¡£¾ÍÏñÉÏÎĵÄÃÜԿת»»£¨KeySwitching£©£¬ÔÚÕâÀïÒ²ÐèÒªÆÀ¹ÀÃÜÔ¿£¨Ò²³ÆΪ٤ÂÞÍߣ¨galois£©ÃÜÔ¿£©£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
julia>?gk?=?keygen(GaloisKey,?kp.priv;?steps=2)?CKKS?galois?key?(element?25)??julia>?decrypt(circshift(c,?gk))?decrypt(kp,?circshift(c,?gk))?8-element?CKKSEncoding{FixedRational{1099511627776,T}?where?T}?with?indices?0:7:?7.000000000001042?+?5.68459112632516e-16im?8.000000000000673?+?5.551115123125783e-17im?0.999999999999551?-?2.308655353580721e-16im?1.9999999999989408?+?2.7755575615628914e-16im?3.000000000000205?-?6.009767921608429e-16im?4.000000000000538?+?5.551115123125783e-17im?4.999999999998865?+?4.133860996136768e-17im?6.000000000000185?-?1.6653345369377348e-16im??#?And?let's?compare?to?doing?the?same?on?the?plaintext?julia>?circshift(plain,?2)?8-element?OffsetArray(::Array{Complex{Float64},1},?0:7)?with?eltype?Complex{Float64}?with?indices?0:7:?7.0?+?0.0im?8.0?+?0.0im?1.0?+?0.0im?2.0?+?0.0im?3.0?+?0.0im?4.0?+?0.0im?5.0?+?0.0im?6.0?+?0.0im?

ºÃÁË£¬ÎÒÃÇÒѾ­Á˽âÁË̬ͬ¼ÓÃÜ¿âµÄ»ù±¾Ó÷¨¡£ÔÚ˼¿¼ÈçºÎÓÃÕâЩԭÓï½øÐÐÉñ¾­ÍøÂçÍƶÏ֮ǰ£¬ÎÒÃÇÏȹ۲첢ѵÁ·ÎÒÃÇÐèҪʹÓõÄÉñ¾­ÍøÂç¡£

»úÆ÷ѧϰģÐÍ

Èç¹ûÄã²»ÊìϤ»úÆ÷ѧϰ»ò Flux.jl »úÆ÷ѧϰ¿â£¬ÎÒ½¨ÒéÄãÏÈ¿ìËÙÔĶÁһϠFlux.jl Îĵµ»òÎÒÃÇÔÚ JuliaAcademy ÉÏ·¢²¼µÄÃâ·Ñ»úÆ÷ѧϰ½éÉܿγ̣¬ÒòΪÎÒÃÇÖ»»áÌÖÂÛÔÚ¼ÓÃÜÊý¾ÝÉÏÔËÐÐÄ£ÐÍËù×öµÄ¸ü¸Ä¡£

ÎÒÃǽ«ÒÔ Flux Ä£ÐÍ¿Õ¼äÖоí»ýÉñ¾­ÍøÂçµÄÀý×ÓΪ³ö·¢µã¡£ÔÚÕâ¸öÄ£ÐÍÖУ¬ÑµÁ·Ñ­»·¡¢Êý¾ÝÔ¤´¦ÀíµÈ²Ù×÷¶¼²»±ä£¬Ö»ÊÇÇá΢µØµ÷ÕûÄ£ÐÍ¡£ÎÒÃÇÒªÓõÄÄ£ÐÍÊÇ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
function?reshape_and_vcat(x)?let?y=reshape(x,?64,?4,?size(x,?4))?vcat((y[:,i,:]?for?i=axes(y,2))...)?end?end??model?=?Chain(?#?First?convolution,?operating?upon?a?28x28?image?Conv((7,?7),?1=>4,?stride=(3,3),?x->x.^2),?reshape_and_vcat,?Dense(256,?64,?x->x.^2),?Dense(64,?10),?)?

¸ÃÄ£ÐÍÓ롸°²È«Íâ°ü¾ØÕóµÄ¼ÆËã¼°ÆäÔÚÉñ¾­ÍøÂçÉÏÓëÓ¦Óá¹£¨Secure Outsourced Matrix Computation and Application to Neural Networks£©ÎÄÖÐËùÓõÄÄ£ÐÍ»ù±¾Ïàͬ£¬ËüÃÇÓÃÏàͬµÄ¼ÓÃÜ·½°¸ÑÝʾÁËÏàͬµÄÄ£ÐÍ£¬µ«ÓÐÁ½¸öÇø±ð£º£¨1£©ËûÃǼÓÃÜÁËÄ£ÐͶøÎÒÃÇ£¨Îª¼òµ¥Æð¼û£©Ã»ÓжÔÄ£ÐͼÓÃÜ£»£¨2£©ÎÒÃÇÔÚÿһ²ãÖ®ºó¶¼ÓÐÆ«ÖÃÏòÁ¿£¨ÕâÒ²ÊÇ Flux µÄĬÈÏÐÐΪ£©£¬ÎÒ²»È·¶¨ÕâÖÖÐÐΪ¶Ô±¾ÎÄÆÀ¹ÀµÄÄ£ÐÍÊÇ·ñÊÇÕâÑù¡£Ò²ÐíÊÇÒòΪ£¨2£©£¬ÎÒÃÇÄ£Ð͵Ä׼ȷÂʲÅÂԸߣ¨98.6% vs 98.1%£©£¬µ«ÕâÒ²¿ÉÄܽö½öÊÇÒòΪ³¬²ÎÊýµÄ²îÒì¡£

¡¸x.^2¡¹¼¤»îº¯ÊýÒ²ÊÇÒ»¸ö²»Ñ°³£µÄÌØÕ÷£¨¶ÔÄÇЩÓлúÆ÷ѧϰ±³¾°µÄÈËÀ´Ëµ£©¡£ÕâÀï¸ü³£ÓõÄÑ¡Ôñ¿ÉÄÜÊÇ¡¸tanh¡¹¡¢¡¸relu¡¹»òÕßÆäËû¸ü¸ß¼¶µÄº¯Êý¡£È»¶ø£¬¾¡¹ÜÕâЩº¯Êý£¨ÓÈÆäÊÇ relu£©¿ÉÒÔ¸üÈÝÒ×µØÆÀ¹ÀÃ÷ÎÄÖµ£¬µ«ÆÀ¹À¼ÓÃÜÊý¾ÝµÄ¼ÆË㿪ÏúÔòÏ൱´ó£¨»ù±¾ÉÏÊÇÆÀ¹À¶àÏîʽ½üËÆÖµ£©¡£ÐÒÔ˵ÄÊÇ£¬¡¸x.^2¡¹¿ÉÒԺܺõØÂú×ãÎÒÃǵÄÄ¿µÄ¡£

ÆäÓàµÄѵÁ·Ñ­»·»ù±¾ÉÏÊÇÏàͬµÄ¡£ÎÒÃÇ´ÓÄ£ÐÍÖÐɾ³ýÁË¡¸softmax¡¹£¬È¡¶ø´úÖ®µÄÊÇ¡¸logitcrossentropy¡¹Ëðʧº¯Êý£¨µ±È»Ò²¿ÉÒÔ±£ÁôËü£¬ÔÚ¿Í»§¶Ë½âÃܺóÔÙÆÀ¹À¡¸softmax¡¹£©¡£ÑµÁ·Ä£Ð͵ÄÍêÕû´úÂë¼û GitHub£¬ÔÚ½üÆÚ·¢²¼µÄ GPU ÉÏÖ»ÐèÒª¼¸·ÖÖӾͿÉÒÔÍê³ÉѵÁ·¡£

´úÂëµØÖ·£ºhttps://github.com/JuliaComputing/ToyFHE.jl/blob/master/examples/encrypted_mnist/train.jl

¸ßЧµØ¼ÆËã

ºÃÁË£¬ÏÖÔÚÒѾ­Ã÷È·ÁËÎÒÃÇÐèÒª×öʲô£¬½ÓÏÂÀ´¿´¿´ÎÒÃÇÒª×öÄÄЩÔËË㣺

  • ¾í»ý
  • ?ÔªËØƽ·½
  • ?¾ØÕó³Ë·¨

ÎÒÃÇÔÚÉÏÎÄÖÐÒѾ­¿´µ½ÁË£¬ÔªËØƽ·½²Ù×÷ÊǺܼòµ¥µÄ£¬ËùÒÔÎÒÃÇ°´Ë³Ðò´¦ÀíʣϵÄÁ½¸öÎÊÌâ¡£ÔÚÕû¸ö¹ý³ÌÖУ¬¼ÙÉèÅú´¦Àí´óС£¨batch size£©Îª 64£¨Äã¿ÉÄÜ×¢Òâµ½ÁË£¬ÎÒÃÇÓвßÂÔµØÑ¡ÔñÄ£ÐͲÎÊýºÍÅú´¦Àí´óС£¬´Ó¶ø³ä·ÖÀûÓà 4096 ÔªËØÏòÁ¿µÄÓÅÊÆ£¬ÕâÊÇÎÒÃÇ´Óʵ¼ÊµÄ²ÎÊýÑ¡ÔñÖеõ½µÄ£©¡£

¾í»ý

ÈÃÎÒÃǻعËһϾí»ýÊÇÈçºÎ¹¤×÷µÄ¡£Ê×ÏÈ£¬È¡Ô­Ê¼ÊäÈëÊý×éÖеÄһЩ´°¿Ú£¨±¾ÀýÖÐΪ 7*7£©£¬´°¿ÚÖеÄÿ¸öÔªËظú¾í»ýÑÚÄ£µÄÔªËØÏà³Ë¡£È»ºóÒƶ¯´°¿Ú£¨±¾ÀýÖв½³¤Îª 3£¬ËùÒÔ½«´°¿ÚÒƶ¯ 3 ¸öÔªËØ£©¡£Öظ´Õâ¸ö¹ý³Ì£¨ÓÃÏàͬµÄ¾í»ýÑÚÄ££©¡£ÏÂÃæµÄ¶¯»­ËµÃ÷ÁËÒÔ£¨2£¬2£©µÄ²½³¤½øÐÐ 3*3 ¾í»ýµÄ¹ý³Ì£¨À¶É«Êý×éÊÇÊäÈ룬ÂÌÉ«Êý×éÊÇÊä³ö£©¡£

ÁíÍ⣬ÎÒÃǽ«¾í»ý·Ö³É 4 ¸ö²»Í¬µÄ¡¸Í¨µÀ¡¹£¨ÕâÒâζ×ÅÓò»Í¬µÄ¾í»ýÑÚÄ££¬½«¾í»ýÓÖÖظ´ÁË 3 ´Î£©

ºÃÁË£¬ÏÖÔÚÎÒÃÇÒѾ­ÖªµÀÁËÒª×öʲô£¬½ÓÏÂÀ´¿¼ÂÇһϸÃÈçºÎʵÏÖ¡£ÐÒÔ˵ÄÊÇ£¬¾í»ýÊÇÎÒÃÇÄ£ÐÍÖеĵÚÒ»²½ÔËËã¡£Òò´Ë£¬¿ÉÒÔÔÚ¼ÓÃÜÊý¾Ý֮ǰ£¨ÎÞÐèÄ£ÐÍȨÖØ£©ÏÈÔÚ¿Í»§¶ËÉÏÔ¤´¦Àí£¬À´½ÚʡһЩ¹¤×÷¡£¾ßÌå¶øÑÔ£¬ÎÒÃǽ«Ö´ÐÐÒÔϲÙ×÷£º

  • ?Ô¤ÏȼÆËãÿ¸ö¾í»ý´°¿Ú£¨¼´´ÓԭʼͼÏñÖÐÌáÈ¡ 7*7 µÄ´°¿Ú£©£¬´Óÿ¸öÊäÈëͼÏñÖеõ½ 64 ¸ö 7*7 µÄ¾ØÕó£¨×¢ÒâÒªÔÚ²½³¤Îª 2 µÄÇé¿öϵõ½ 7*7 µÄ´°¿Ú£¬ÒªÆÀ¹À 28*28 µÄÊäÈëͼÏñµÄ»°£¬Òª¼ÆËã 8*8 µÄ¾í»ý´°¿Ú£©
  • ?½«Ã¿¸ö´°¿ÚÖеÄÏàͬλÖÃÊÕ¼¯µ½Ò»¸öÏòÁ¿ÖУ¬¼´¶ÔÿÕÅͼÀ´Ëµ£¬¶¼»áÓаüº¬ 64 ¸öÔªËصÄÏòÁ¿£¬»òµ±Åú´¦Àí´óСΪ 64 ʱ£¬»áµÃµ½ 64*64 µÄÔªËØÏòÁ¿£¨¼´£¬¹²ÓÐ 49 ¸ö 64*64 µÄ¾ØÕó£©
  • ?¼ÓÃÜ

È»ºó¾í»ý¾Í±ä³ÉÁËÕû¸ö¾ØÕóºÍÊʵ±ÑÚÂëÔªËصıêÁ¿³Ë·¨£¬¶ÔÕâ 49 ¸öÔªËØÇóºÍ£¬µÃµ½Á˾í»ýµÄ½á¹û¡£Õâ¸ö·½°¸ÊÇÕâÑùʵÏֵģ¨ÔÚÃ÷ÎÄÉÏ£©£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
function?public_preprocess(batch)?ka?=?OffsetArray(0:7,?0:7)?#?Create?feature?extracted?matrix?I?=?[[batch[i¡ä*3?.+?(1:7),?j¡ä*3?.+?(1:7),?1,?k]?for?i¡ä=ka,?j¡ä=ka]?for?k?=?1:64]??#?Reshape?into?the?ciphertext?I???=?[[I[k][l...][i,j]?for?k=1:64,?l=product(ka,?ka)]?for?i=1:7,?j=1:7]?end??I???=?public_preprocess(batch)??#?Evaluate?the?convolution?weights?=?model.layers[1].weight?conv_weights?=?reverse(reverse(weights,?dims=1),?dims=2)?conved?=?[sum(I??[i,j]*conv_weights[i,j,1,channel]?for?i=1:7,?j=1:7)?for?channel?=?1:4]?conved?=?map(((x,b),)->x?.+?b,?zip(conved,?model.layers[1].bias))?

ÕâÑùµÄʵÏÖ£¨¶Ôά¶ÈÖØÐÂÅÅÐòµÄÄ££©¸ø³öÁËÏàͬµÄ´ð°¸£¬µ«ÊÇÓÃÁËÕâÑùµÄ²Ù×÷£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
model*.*layers[*1*](batch)?

¼ÓÈë¼ÓÃܲÙ×÷ºó£¬ÎÒÃǵõ½£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
I???=?public_preprocess(batch)??C_I???=?map(I??)?do?Iij??plain?=?CKKSEncoding{Tscale}(zero(plaintext_space(ckks_params)))??plain?.=?OffsetArray(vec(Iij),?0:(N¡Â2-1))??encrypt(kp,?plain)??end????weights?=?model.layers[1].weight??conv_weights?=?reverse(reverse(weights,?dims=1),?dims=2)??conved3?=?[sum(C_I??[i,j]*conv_weights[i,j,1,channel]?for?i=1:7,?j=1:7)?for?channel?=?1:4]??conved2?=?map(((x,b),)->x?.+?b,?zip(conved3,?model.layers[1].bias))??conved1?=?map(ToyFHE.modswitch,?conved2)??

×¢Ò⣬ÓÉÓÚȨÖØÊǹ«¿ªµÄ£¬ËùÒÔ²»ÐèÒªÃÜԿת»»£¬Òò´ËûÓÐÀ©Õ¹ÃÜÎĵij¤¶È¡£

¾ØÕó³Ë·¨

½ÓÏÂÀ´¿´¿´¾ØÕó³Ë·¨ÊÇÈçºÎʵÏֵġ£ÎÒÃÇÀûÓÃÕâÑùµÄÊÂʵ¡ª¡ª¿ÉÒÔÐýתÏòÁ¿ÖеÄÔªËØ£¬À´ÖØÅÅÐò³Ë·¨Ë÷Òý¡£ÌرðÊÇ£¬Òª¿¼ÂÇÏòÁ¿ÖоØÕóÔªËصÄÐÐÓÅÏÈÅÅÐò¡£È»ºó£¬Èç¹ûÒÔÐдóСµÄ±¶ÊýÒƶ¯ÏòÁ¿£¬¾Í¿ÉÒԵõ½ÁÐÐýתµÄЧ¹û£¬Õâ¿ÉÒÔÌṩ³ä×ãµÄÔ­ÓïÀ´ÊµÏÖ¾ØÕó³Ë·¨£¨ÖÁÉÙÊÇ·½Õ󣩡£ÎÒÃDz»·ÁÊÔһϣº

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
function?matmul_square_reordered(weights,?x)?sum(1:size(weights,?1))?do?k?#?We?rotate?the?columns?of?the?LHS?and?take?the?diagonal?weight_diag?=?diag(circshift(weights,?(0,(k-1))))?#?We?rotate?the?rows?of?the?RHS?x_rotated?=?circshift(x,?(k-1,0))?#?We?do?an?elementwise,?broadcast?multiply?weight_diag?.*?x_rotated?end?end??function?matmul_reorderd(weights,?x)?sum(partition(1:256,?64))?do?range?matmul_square_reordered(weights[:,?range],?x[range,?:])?end?end??fc1_weights?=?model.layers[3].W?x?=?rand(Float64,?256,?64)?@assert?(fc1_weights*x)?¡Ö?matmul_reorderd(fc1_weights,?x)?

µ±È»£¬¶ÔÓÚÒ»°ãµÄ¾ØÕó³Ë·¨£¬ÎÒÃÇ¿ÉÄÜÐèÒª¸üºÃµÄ·½·¨£¬µ«ÊÇÔÚ±¾ÀýÖУ¬ÏÖÔÚÕâÖ̶ֳȾÍÒѾ­×ã¹»ÁË¡£

ÓÅ»¯´úÂë

ÖÁ´Ë£¬ÎÒÃÇÉè·¨½«ËùÓÐÄÚÈÝÕûºÏÔÚÒ»Æ𣬶øÇÒҲȷʵ×àЧÁË¡£ÕâÀïÌṩÁË´úÂë×÷Ϊ²Î¿¼£¨Ê¡ÂÔÁ˲ÎÊýÑ¡ÔñµÈÉèÖã©£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
ek?=?keygen(EvalMultKey,?kp.priv)?gk?=?keygen(GaloisKey,?kp.priv;?steps=64)??I???=?public_preprocess(batch)?C_I???=?map(I??)?do?Iij?plain?=?CKKSEncoding{Tscale}(zero(plaintext_space(ckks_params)))?plain?.=?OffsetArray(vec(Iij),?0:(N¡Â2-1))?encrypt(kp,?plain)?end??weights?=?model.layers[1].weight?conv_weights?=?reverse(reverse(weights,?dims=1),?dims=2)?conved3?=?[sum(C_I??[i,j]*conv_weights[i,j,1,channel]?for?i=1:7,?j=1:7)?for?channel?=?1:4]?conved2?=?map(((x,b),)->x?.+?b,?zip(conved3,?model.layers[1].bias))?conved1?=?map(ToyFHE.modswitch,?conved2)??Csqed1?=?map(x->x*x,?conved1)?Csqed1?=?map(x->keyswitch(ek,?x),?Csqed1)?Csqed1?=?map(ToyFHE.modswitch,?Csqed1)??function?encrypted_matmul(gk,?weights,?x::ToyFHE.CipherText)?result?=?repeat(diag(weights),?inner=64).*x?rotated?=?x?for?k?=?2:64?rotated?=?ToyFHE.rotate(gk,?rotated)?result?+=?repeat(diag(circshift(weights,?(0,(k-1)))),?inner=64)?.*?rotated?end?result?end??fq1_weights?=?model.layers[3].W?Cfq1?=?sum(enumerate(partition(1:256,?64)))?do?(i,range)?encrypted_matmul(gk,?fq1_weights[:,?range],?Csqed1[i])?end??Cfq1?=?Cfq1?.+?OffsetArray(repeat(model.layers[3].b,?inner=64),?0:4095)?Cfq1?=?modswitch(Cfq1)??Csqed2?=?Cfq1*Cfq1?Csqed2?=?keyswitch(ek,?Csqed2)?Csqed2?=?modswitch(Csqed2)??function?naive_rectangular_matmul(gk,?weights,?x)?@assert?size(weights,?1)?<?size(weights,?2)?weights?=?vcat(weights,?zeros(eltype(weights),?size(weights,?2)-size(weights,?1),?size(weights,?2)))?encrypted_matmul(gk,?weights,?x)?end??fq2_weights?=?model.layers[4].W?Cresult?=?naive_rectangular_matmul(gk,?fq2_weights,?Csqed2)Cresult?=?Cresult?.+?OffsetArray(repeat(vcat(model.layers[4].b,??zeros(54)),?inner=64),?0:4095)?

ËäÈ»´úÂë¿´ÆðÀ´²»ÊǺÜÇåÎú£¬µ«ÊÇÈç¹ûÄãÒѾ­½øÐе½ÕâÒ»²½ÁË£¬ÄÇÄã¾ÍÓ¦¸ÃÀí½âÕâ¸öÁ÷³ÌÖеÄÿһ²½¡£

ÏÖÔÚ£¬°Ñ×¢ÒâÁ¦×ªÒƵ½¿ÉÒÔÈÃÕâÒ»ÇиüºÃÀí½âµÄ³éÏóÉÏ¡£ÎÒÃÇÏÈÌø³öÃÜÂëѧºÍ»úÆ÷ѧϰÁìÓò£¬¿¼ÂDZà³ÌÓïÑÔÉè¼ÆµÄÎÊÌâ¡£Julia ¿ÉÒÔʵÏÖÇ¿´óµÄ³éÏó£¬ÎÒÃÇ¿ÉÒÔÀûÓÃÕâÒ»µã¹¹½¨Ò»Ð©³éÏó¡£ÀýÈ磬¿ÉÒÔ½«Õû¸ö¾í»ýÌáÈ¡¹ý³Ì·âװΪ×Ô¶¨ÒåÊý×éÀàÐÍ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
using?BlockArrays??"""?????ExplodedConvArray{T,?Dims,?Storage}?<:?AbstractArray{T,?4}??Represents?a?an?`nxmx1xb`?array?of?images,?but?rearranged?into?a?series?of?convolution?windows.?Evaluating?a?convolution?compatible?with?`Dims`?on?this?array?is?achievable?through?a?sequence?of?scalar?multiplications?and?sums?on?the?underling?storage.?"""?struct?ExplodedConvArray{T,?Dims,?Storage}?<:?AbstractArray{T,?4}?????#?sx*sy?matrix?of?b*(dx*dy)?matrices?of?extracted?elements?????#?where?(sx,?sy)?=?kernel_size(Dims)?????#???????(dx,?dy)=output_size(DenseConvDims(...))?????cdims::Dims?????x::Matrix{Storage}?????function?ExplodedConvArray{T,?Dims,?Storage}(cdims::Dims,?storage::Matrix{Storage})?where?{T,?Dims,?Storage}?????????@assert?all(==(size(storage[1])),?size.(storage))?????????new{T,?Dims,?Storage}(cdims,?storage)?????end?end?Base.size(ex::ExplodedConvArray)?=?(NNlib.input_size(ex.cdims)...,?1,?size(ex.x[1],?1))??function?ExplodedConvArray{T}(cdims,?batch::AbstractArray{T,?4})?where?{T}?????x,?y?=?NNlib.output_size(cdims)?????kx,?ky?=?NNlib.kernel_size(cdims)?????stridex,?stridey?=?NNlib.stride(cdims)?????kax?=?OffsetArray(0:x-1,?0:x-1)?????kay?=?OffsetArray(0:x-1,?0:x-1)?????I?=?[[batch[i¡ä*stridex?.+?(1:kx),?j¡ä*stridey?.+?(1:ky),?1,?k]?for?i¡ä=kax,?j¡ä=kay]?for?k?=?1:size(batch,?4)]?I???=?[[I[k][l...][i,j]??for?k=1:size(batch,?4),?l=product(kax,?kay)]?for?(i,j)?in?product(1:kx,?1:ky)]??ExplodedConvArray{T,?typeof(cdims),?eltype(I??)}(cdims,?I??)?end??function?NNlib.conv(x::ExplodedConvArray{<:Any,?Dims},??weights::AbstractArray{<:Any,?4},?cdims::Dims)?where?{Dims<:ConvDims}?blocks?=?reshape([??Base.ReshapedArray(sum(x.x[i,j]*weights[i,j,1,channel]?for?i=1:7,?j=1:7),?(NNlib.output_size(cdims)...,1,size(x,?4)),?())?for?channel?=?1:4?],(1,1,4,1))?BlockArrays._BlockArray(blocks,?BlockArrays.BlockSizes([8],?[8],?[1,1,1,1],?[64]))?end?

×¢Ò⣬Èçԭʼ´úÂëËùʾ£¬ÕâÀïÓà BlockArrays ½« 8*8*4*64 µÄÊý×é±íʾ³É 4 ¸ö 8*8*1*64 µÄÊý×é¡£ËùÒÔÏÖÔÚ£¬ÎÒÃÇÒѾ­µÃµ½Á˵ÚÒ»¸ö²½Öè¸üºÃµÄ±íÕ÷£¨ÖÁÉÙÊÇÔÚδ¼ÓÃÜÊý×éÉÏ£©£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
julia>?cdims?=?DenseConvDims(batch,?model.layers[1].weight;?stride=(3,3),?padding=(0,0,0,0),?dilation=(1,1))?DenseConvDims:?(28,?28,?1)?*?(7,?7)?->?(8,?8,?4),?stride:?(3,?3)?pad:?(0,?0,?0,?0),?dil:?(1,?1),?flip:?false??julia>?a?=?ExplodedConvArray{eltype(batch)}(cdims,?batch);?julia>?model(a)?10¡Á64?Array{Float32,2}:?[snip]ÈçºÎ½«ÕâÖÖ±íÕ÷´øÈë¼Ó?

ÈçºÎ½«ÕâÖÖ±íÕ÷´øÈë¼ÓÃܵÄÊÀ½çÄØ£¿ÎÒÃÇÐèÒª×öÁ½¼þÊ£º

1. ÎÒÃÇÏëÒÔÕâÑùµÄ·½Ê½¼ÓÃܽṹÌ壨ExplodedConvArray£©£¬ÒÔÖÂÓÚ¶Ôÿ¸ö×ֶΣ¨field£©¶¼Äܵõ½Ò»¸öÃÜÎÄ¡£È»ºó£¬Í¨¹ý²éѯ¸Ãº¯ÊýÔÚԭʼ½á¹¹ÉÏÖ´ÐеIJÙ×÷£¬ÔÚ¼ÓÃܵĽṹÌåÉϽøÐÐÔËË㣬²¢Ö±½Ó½øÐÐÏàͬµÄ̬ͬ²Ù×÷¡£

2. ÎÒÃÇÏ£ÍûÀ¹½ØijЩÔÚ¼ÓÃܵÄÉÏÏÂÎÄÖÐÒÔ²»Í¬·½Ê½Ö´ÐеIJÙ×÷¡£

ÐÒÔ˵ÄÊÇ Julia ÌṩÁË¿ÉÒÔͬʱִÐÐÕâÁ½¸ö²Ù×÷µÄ³éÏó£ºÊ¹Óà Cassette.jl »úÖƵıàÒëÆ÷²å¼þ¡£ËüÊÇÈçºÎÆð×÷Óõģ¬ÒÔ¼°ÈçºÎʹÓÃËü£¬¶¼ÓÐЩ¸´ÔÓ£¬±¾ÎÄÖв»ÔÙÉîÈë½éÉÜÕⲿ·ÖÄÚÈÝ¡£¼òÑÔÖ®£¬Äã¿ÉÒÔ¶¨ÒåÉÏÏÂÎÄ£¨¼´¡¸Excrypted¡¹£¬È»ºó¶¨ÒåÔÚÕâÑùµÄÉÏÏÂÎÄÖУ¬ÔËËãÊÇÈçºÎÆð×÷ÓõĹæÔò£©¡£ÀýÈ磬µÚ¶þ¸öÒªÇó¿ÉÒÔд³É£º

ËùÓÐÕâÒ»ÇеÄ×îÖÕ½á¹ûÊÇ£¬Óû§¿ÉÒÔÒÔ×îÉÙµÄÊÖ¹¤¹¤×÷£¬Ð´ÍêÕû¸öÄÚÈÝ£º

µ±È»£¬¾ÍËã¾­¹ýÁËÒÔÉÏ´¦Àí£¬´úÂëÒ²²»ÊÇ×îÓŵġ£¼ÓÃÜϵͳµÄ²ÎÊý£¨ÀýÈç ? »·£¬Ê²Ã´Ê±ºòģת»»£¬Ê²Ã´Ê±ºòÃÜԿת»»µÈ£©±íÏÖ³öÁËÔڴ𰸵Ä׼ȷÐÔ¡¢°²È«ÐÔÒÔ¼°ÐÔÄÜÖ®¼äµÄÈ¡Éᣬ¶øÇÒ²ÎÊýºÜ´ó³Ì¶ÈÉÏÈ¡¾öÓÚÕýÔÚÔËÐеĴúÂë¡£Ò»°ãÀ´Ëµ£¬ÈËÃÇÏ£Íû±àÒëÆ÷ÄÜ·ÖÎö½«ÒªÔËÐеļÓÃÜ´úÂ룬Ϊ¸ø¶¨µÄ°²È«µÈ¼¶ºÍËùÐ辫¶ÈÌá³ö²ÎÊý½¨Ò飬ȻºóÓû§ÒÔ×îÉÙµÄÈ˹¤²Ù×÷À´Éú³É´úÂë¡£

½áÓï

¶ÔÓÚÈκÎϵͳÀ´Ëµ£¬°²È«µØ×Ô¶¯Ö´ÐÐÈÎÒâ¼ÆË㶼ÊÇÒ»Ïî¼è¾ÞµÄÈÎÎñ£¬µ« Julia µÄÔª±à³Ì¹¦ÄܺÍÓѺõÄÓï·¨¶¼ÈÃËü³ÉΪºÏÊʵĿª·¢Æ½Ì¨¡£RAMPARTS ϵͳÒѾ­×öÁËһЩ³¢ÊÔ£¬½«¼òµ¥µÄ Julia ´úÂë±àÒëµ½ PALISADE FHE ¿âÖС£¡¸Julia Computing¡¹ÕýÔÚÓë RAMPARTS ±³ºóµÄר¼ÒÔÚ Verona ƽ̨ÉϺÏ×÷£¬×î½üÒѾ­·¢²¼ÁËÏÂÒ»´ú°æ±¾¡£ÔÚ¹ýÈ¥µÄÒ»ÄêÖУ¬Í¬Ì¬¼ÓÃÜϵͳµÄÐÔÄܲŴﵽÄÜÒÔʵ¼Ê¿ÉÓõÄËÙ¶ÈÆÀ¹ÀÓÐȤ¼ÆËãµÄ³Ì¶È¡£Ò»ÉÈոеĴóÞʹ˴ò¿ª¡£Ëæ×ÅËã·¨¡¢Èí¼þºÍÓ²¼þµÄ½ø²½£¬Í¬Ì¬¼ÓÃܱØÈ»»á³ÉΪ±£»¤Êý°ÙÍòÓû§Òþ˽µÄÖ÷Á÷¼¼Êõ¡£

RAMPARTS ÂÛÎÄ£ºhttps://eprint.iacr.org/2019/988.pdf

±¨¸æ£ºhttps://www.youtube.com/watch?v=_KLlMg6jKQg

  • ·¢±íÓÚ:
  • Ô­ÎÄÁ´½Ó£ºhttp://news.51cto.com/art/201912/607843.htm
  • ÈçÓÐÇÖȨ£¬ÇëÁªÏµ cloudcommunity@tencent.com ɾ³ý¡£

Ïà¹Ø¿ìѶ

ɨÂë

Ìí¼ÓÕ¾³¤ ½ø½»Á÷Ⱥ

ÁìȡרÊô 10ÔªÎÞÃż÷ȯ

˽Ïí×îР¼¼Êõ¸É»õ

ɨÂë¼ÓÈ뿪·¢ÕßÉçȺ
Áìȯ
http://www.vxiaotou.com