Puncte:0

Controlați limita de eroare când utilizați HElib CKKS

drapel bb

Folosesc HElib CKKS pentru a face experimente și mă întreb dacă este posibil să controlez limitarea erorii în fiecare operație de bază, cum ar fi înmulțirea, codificarea și rotația.

Am această întrebare pentru că am constatat că se pare că creșterea legată de eroare în HElib este mai rapidă decât implementarea HEAAN.

Iată un exemplu de verificare a limitei erorii după fiecare operație de pătrat din HElib:

  // c *= c;
  c.capacitate=328.497 c.errorBound=1.28242e-06
  c.capacitate=289,748 c.errorBound=2,69423e-06
  c.capacitate=252,063 c.errorBound=5,71405e-06
  c.capacitate=213.502 c.errorBound=1.1591e-05
  c.capacitate=176,579 c.errorBound=2,37053e-05
  c.capacitate=139,634 c.errorBound=4,79147e-05
  distanta=1,84256e-05

Putem vedea că eroarea Bound crește cu aproximativ un factor de 2 (adică pierdem un pic de precizie).

Pentru o aplicație de înmulțire a matricei (inclusiv rotație, codificare și înmulțire, aici, nu a elaborat detalii), implementarea în HEAAN funcționează bine, dar limita de eroare depășește 200 iar adâncimea nu este suficientă când rescriu aplicația folosind HElib.

În general, aceeași aplicație (adică are același număr de înmulțiri și sloturi) în HElib necesită mai mulți biți decât cea din HEAAN și, în final, are ca rezultat un nivel de securitate mai mic de 80 de biți

Întrebare

În CKKS al HElib, dacă trebuie să controlăm cu exactitate (și cum) limitarea erorii atunci când facem înmulțirea (sau rotația)?

Parametrii

Iată un exemplu de parametri pe care i-am folosit:

param(/*m=*/16 * 1024, /*bits=*/235, /*precision=*/20, /*c=*/2);

Eroarea legată după o operație de pătrat (înmulțire):

ct_Ck[0].capacitate=256.968 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8.6898e-08
ct_Ck[0].capacitate=207,74 ct_Ck[0].isCorrect=1 ct_Ck[0].errorBound=8,6348e-06

Datele de text simplu sunt ca:

-0.23801321 0.30014116 -0.0636206 0.21583742

ACTUALIZAȚI

Am găsit o funcție în HElib pentru a reduce limita de eroare, dar nu știu motivele despre cum funcționează

// rezultat înainte de a invoca bumpNoiseBound ()
ct_F.capacity=38.4047 ct_F.isCorrect=1 ct_F.errorBound=201.848

ct_F.bumpNoiseBound(0,5);
ct_F.capacity=38,4047 ct_F.isCorrect=1 ct_F.errorBound=100,884

ct_F.bumpNoiseBound(0,00001);
ct_F.capacity=38,4047 ct_F.isCorrect=1 ct_F.errorBound=0,00202069

Rezultat decriptat:

[1.04830407 -3.209778495 -2.074653964 -1.684939538 -1.000400425 -4.124713608 -0.3628963567 -3.134082967 -3.801171699 -1.00385792 -1.472975371 -1.121783172 -5.484577652 -1.89848471 -1.517289034 -0.228743587 -1.226775781 3.901777677 1.575880583 -2.008799017 -1.980024549 3.465674733 -1.105679235 -3.594262482 0.1332798533 -7.012550198 0.5623979679 -4.254105028 -0.9447986134 -0.3755929384 -0.906013134 0.5607877395 -2.309902189 -4.112943726 -4.208302789 -2.742109602 -3.230622867 0.6365211006 -1.909193898 -1.761926501 0.07531637181 0.5945984313 -2.727958762 -2.45710736 -2.225926303 0.2915942006 -0.5207882104 -1.719778064 -3.581110672 0.9300763124 1.395581211 0.7434900004 -3.202471826 1.109593845 -5.68517439 0.2502367768 0.6176019573 -1.632018488 -0.3558288489 -1.87408586 3.322116753 -3.055094277 -1.437400739 -3.61812068]

Rezultat text simplu:

[1.048074533 -3.209868922 -2.075044009 -1.683690789 -0.9997621728 -4.124967495 -0.3629476429 -3.1339527 -3.801350955 -1.003947321 -1.473256614 -1.121510668 -5.484447105 -1.89821005 -1.517648893 -0.2295971341 -1.227429856 3.90224666 1.576020144 -2.008567349 -1.98010648 3.464794098 -1.105909147 -3.595045121 0.1335162434 -7.012703056 0.5623665673 -4.2541547 -0.9454690736 -0.3750930498 -0.9075913974 0.5602374826 -2.30977449 -4.11252574 -4.208385862 -2.742450262 -3.230891732 0.6371578519 -1.909217106 -1.76218525 0.07590385029 0.5945647743 -2.727895366 -2.457126412 -2.225143547 0.2917448084 -0.5201044894 -1.719980727 -3.580159571 0.9294232572 1.396138592 0.7433848735 -3.202827843 1.108926304 -5.68442001 0.2495510754 0.6176213132 -1.630955343 -0.35625627 -1.874107776 3.321633929 -3.054599105 -1.438421851 -3.618478743]

Rezultatul după utilizare bumpNoiseBound () este aproape egal cu rezultatul textului simplu. Deci această funcție ne ajută să recuperăm precizia corectă?

Dylan avatar
drapel bb
BTW, nu știm cum funcționează `rescalarea` în HElib. După cum a spus shaih, [HElib se ocupă de redimensionarea CKKS pe cont propriu, astfel încât nu trebuie să vă faceți griji pentru asta. Totuși, încă nu acceptă bootstrapping CKKS.](https://github.com/homenc/HElib/issues/341#issuecomment-581880535). Dar în HEAAN, o facem singuri, cum ar fi:`reScaleByAndEqual(ctxt, cBits); reScaleByAndEqual(ctxt, ctxt.logp);` .Deci acesta este motivul pentru care aceiași parametri din HElib acceptă mai puține calcule?
Hilder Vitor Lima Pereira avatar
drapel us
Cum se face comutarea cheii în acea implementare HEAAN? Dacă folosește un alt algoritm de comutare a tastelor de la HElib, atunci costul și creșterea zgomotului înmulțirii homomorfe vor fi diferite.
Dylan avatar
drapel bb
@HilderVitorLimaPereira Probabil că folosește o metodă diferită. După cum se explică în lucrarea originală [HEAAN](https://eprint.iacr.org/2016/421.pdf), `P3`: Pentru a aborda modulul textului cifrat, sugerăm o nouă tehnică - numită rescalare - care manipulează mesajul textului cifrat.Din punct de vedere tehnic, pare similară cu metoda de comutare a modulului sugerată de Brakerski și Vaikuntanatan, dar joacă un rol complet diferit în construcția noastră.
Dylan avatar
drapel bb
În plus, HEAAN acceptă bootstrapping prin utilizarea CRT + NTT, explicat în [github](https://github.com/snucrypto/HEAAN/issues/7#issuecomment-419614271)
Hilder Vitor Lima Pereira avatar
drapel us
Dar întrebam despre comutarea cu taste, nu despre comutarea modului... Există unele compromisuri între zgomot și timp de rulare când comutăm cu cheie. De exemplu, dacă descompuneți textul cifrat folosind o bază mai mică, atunci obțineți mai multe componente și comutatorul cu cheie devine mai lent, dar zgomotul crește mai puțin. Dacă Helib și HEAAN folosesc o descompunere diferită, atunci creșterea zgomotului va fi deja diferită.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.