ZKML 解決了傳統機器學習賞金平台的局限性,利用 ZKP,使開發人員能夠使用公共數據驗證私有模型,確保隱私和安全。這是一個強大的 POC,可以吸引有經驗的 Web2 開發人員進入 Web3 生態系統。

原文:ZKML: Bridging AI/ML and Web3 with Zero-Knowledge Proofs

作者:Cathie So

編譯: zklog

介紹

我很高興地分享,我的 ZKML 項目已經成功完成,得益於 Ethereum Foundation 的生態系統支持計劃(Privacy & Scaling Explorations)的寶貴支持。這個平台橋接了 AI/ML 和 Web3 世界,提供了一個具有巨大潛力的隱私保護解決方案,可以徹底改變這兩個行業。

這是一個端到端平台的 POC,用於讓機器學習開發人員輕鬆將他們的 TensorFlow Keras 模型轉換為 ZK 兼容版本。這個全能的解決方案包括三個核心組件:

  • circomlib-ml:一個綜合的 Circom 庫,包含計算 TensorFlow Keras 中常見層的電路。
  • keras2circom:一個用戶友好的翻譯器,將 Python 中的 ML 模型轉換為 Circom 電路。
  • ZKaggle:一個分散式賞金平台,用於託管、驗證和支付賞金,類似於 Kaggle,但具有隱私保護的附加優勢。

ZKML 解決了傳統機器學習賞金平台的局限性,這些平台通常需要公開整個模型以進行性能驗證。該解決方案利用 ZKP,使開發人員能夠使用公共數據驗證私有模型,確保隱私和安全。這是一個強大的 POC,可以吸引有經驗的 Web2 開發人員進入 Web3 生態系統。

背景和合理性

傳統 ML 賞金的挑戰

傳統的機器學習賞金平台,如 Kaggle,通常要求開發人員向主持人提交完整的模型以進行性能驗證。這可能會導致幾個問題:

  • 知識產權的喪失:披露完整的模型架構和權重可能會暴露有價值的商業機密或創新技術,開發人員希望保持私有。
  • 缺乏透明度:評估過程可能不透明,參與者可能無法驗證其模型與其他模型的排名。
  • 數據隱私問題:共享經過敏感數據訓練的模型可能會意外地揭示有關底層數據的信息,違反隱私規範和法規。

這些挑戰已經創造出對保護機器學習模型和它們訓練的數據隱私的需求。

ZKP 在機器學習中的潛力

ZKP 為解決傳統 ML 賞金所面臨的挑戰提供了一種有前途的方法。通過利用 ZKP 的威力,ZKML 提供了一個隱私保護的解決方案,具有以下好處:

  • 模型隱私:開發人員可以參與賞金而不必公開整個模型架構和權重,從而保護他們的知識產權。
  • 透明的驗證: ZKP 可以在不揭示模型內部的情況下驗證模型的性能,促進透明和不信任的評估過程。
  • 數據隱私: ZKP 可以用於驗證具有公共模型的私有數據或具有公共數據的私有模型,確保敏感信息保持未公開。

將 ZKP 集成到機器學習過程中提供了一個安全的、隱私保護的平台,解決了傳統 ML 賞金的局限性。這不僅促進了機器學習在隱私敏感行業中的採用,也吸引有經驗的 Web2 開發人員探索 Web3 生態系統內的可能性。

當前範圍:綜合 POC

circomlib-ml:用於機器學習的 Circom 庫

circomlib-ml 是一個使用 Circom 語言進行機器學習任務的電路模板庫。它包含各種神經網絡層的模板,例如卷積層、稠密層和激活函數。該庫使得可以為機器學習任務創建自定義電路。

keras2circom:無縫模型轉換

keras2circom 是一個 Python 工具,將 TensorFlow Keras 模型轉換為 Circom 電路。這使得流行的深度學習框架中的機器學習模型可以無縫轉換為具有隱私保護的 ZKP 電路。

ZKaggle:機器學習的分散式賞金平台

ZKaggle 的第一個版本是在 ETHGlobal FVM Space Warp Hack 上提交的一個黑客馬拉鬆活動。該平台通過允許用戶共享其處理能力和將其專有的機器學習模型貨幣化,來實現分散式計算。通過基於瀏覽器的前端,賞金提供者可以將數據上傳到 Filecoin 並創建與獎勵相關的計算任務。賞金獵人可以瀏覽可用的賞金、下載數據並在本地執行計算。完成後,他們將提交帶有散列結果的證明到鏈上供賞金提供者審查。一旦獲得批准,賞金獵人就可以提供散列結果的預圖像來領取獎勵。ZKP 被用於維護計算證明的簡潔性,並使賞金獵人能夠以可信度貨幣化私有模型。

ZKaggleV2 提供了一個增強版的版本,增強了功能。在這個版本中,多個文件聚合成單個電路,可以更有效地處理。該平台還驗證了計算的準確性,並使用橢圓曲線 Diffie-Hellman(ECDH)加密的安全方法,將模型權重從賞金獵人傳輸到賞金提供者。這種額外的安全層確保只有授權方可以訪問和利用模型權重,進一步鞏固了平台對隱私和數據保護的承諾。

代碼亮點

circomlib-ml:ZK-friendly 多項式激活 circomlib-ml/circuits/Poly.circom


pragma circom 2.0.0;

// Poly activation layer: https://arxiv.org/abs/2011.05530
template Poly (n) {
    signal input in;
    signal output out;
    
    out <== in * in + n*in;
}

受 Ali, RE, So, J., & Avestimehr, AS (2020) 的啟發,已經添加了 Poly() 模板,作為實現 f(x)=x**2+x 的替代激活層,可替換 ReLU。ReLU 激活的非多項式特性導致每層的約束數目很大。通過使用多項式激活 f(n,x)=x**2+n*x 替換 ReLU,約束數大大減少,稍微犧牲一些性能。在聲明組件時需要一個參數 n,以調整浮點權重和偏差的縮放為整數。

keras2circom:模型權重 “量化”

keras2circom/keras2circom/circom.py


...
    def to_json(self, weight_scale: float, current_scale: float) -> typing.Dict[str, typing.Any]:
        '''convert the component params to json format'''
        self.weight_scale = weight_scale
        self.bias_scale = self.calc_bias_scale(weight_scale, current_scale)
        # print(self.name, current_scale, self.weight_scale, self.bias_scale)

        json_dict = {}
        for signal in self.inputs:
            if signal.value is not None:
                if signal.name == 'bias' or signal.name == 'b':
                    # print(signal.value)
                    json_dict.update({f'{self.name}_{signal.name}': list(map('{:.0f}'.format, (signal.value*self.bias_scale).round().flatten().tolist()))})
                else:
                    json_dict.update({f'{self.name}_{signal.name}': list(map('{:.0f}'.format, (signal.value*self.weight_scale).round().flatten().tolist()))})
        return json_dict
    
    def calc_bias_scale(self, weight_scale: float, current_scale: float) -> float:
        '''calculate the scale factor of the bias of the component'''
        if self.template.op_name in ['ReLU', 'Flatten2D', 'ArgMax', 'MaxPooling2D', 'GlobalMaxPooling2D']:
            return current_scale
        if self.template.op_name == 'Poly':
            return current_scale * current_scale
        return weight_scale * current_scale
...

Circom 只接受整數信號,但 TensorFlow 的權重和偏差為浮點數。模型不會量化,而是將權重放大 10**m 倍。m 越大,精度越高。隨後,偏置(如果有)必須放大 10**2m 倍或更多,以保持網絡的正確輸出。keras2circom  自動計算最大可能的 m 並相應地調整每個層。

ZKaggle:IPFS CID 匹配和通用加密電路

ZKaggleV2/hardhat/circuits/utils/cid.circom


pragma circom 2.0.0;

include "../sha256/sha256.circom";
include "../../node_modules/circomlib-ml/circuits/circomlib/bitify.circom";

// convert a 797x8 bit array (pgm) to the corresponding CID (in two parts)
template getCid() {
    signal input in[797*8];
    signal output out[2];

    component sha = Sha256(797*8);
    for (var i=0; i<797*8; i++) {
        sha.in[i] <== in[i];
    }
    
    component b2n[2];

    for (var i=1; i>=0; i--) {
        b2n[i] = Bits2Num(128);
        for (var j=127; j>=0; j--) {
            b2n[i].in[127-j] <== sha.out[i*128+j];
        }
        out[i] <== b2n[i].out;
    }
}

機器學習數據集通常太大,無法直接上傳到區塊鏈上,因此它們被上傳到 IPFS。為了確保整個模型計算過程中的數據完整性,設計了一個概念驗證電路,以證明計算 IPFS 內容標識符(CID)的能力,該標識符作為電路中的原始緩衝器上傳。這種方法驗證了計算是在指定的文件上執行的,從而保持了過程的完整性。

ZKaggleV2/hardhat/circuits/utils/encrypt.circom


pragma circom 2.0.0;

include "../../node_modules/circomlib-ml/circuits/crypto/encrypt.circom";
include "../../node_modules/circomlib-ml/circuits/crypto/ecdh.circom";

// encrypt 1000 inputs
template encrypt1000() {
    // public inputs
    signal input public_key[2];

    // private inputs
    signal input in[1000];
    signal input private_key;

    // outputs
    signal output shared_key;
    signal output out[1001];

    component ecdh = Ecdh();

    ecdh.private_key <== private_key;
    ecdh.public_key[0] <== public_key[0];
    ecdh.public_key[1] <== public_key[1];

    component enc = EncryptBits(1000);
    enc.shared_key <== ecdh.shared_key;

    for (var i = 0; i < 1000; i++) {
        enc.plaintext[i] <== in[i];
    }

    for (var i = 0; i < 1001; i++) {
        out[i] <== enc.out[i];
    }

    shared_key <== ecdh.shared_key;
}
...

為了在賞金認領過程中維護證明的完整性,ZKaggleV2 採用了通用模型權重加密電路。該電路已經預編譯並部署,可用於所有賞金和模型。現有實現支持最多 1000 個權重的模型,任何權重較少的模型都可以在末尾填充零以符合所需的大小。這種方法確保了一種一致且安全的處理模型權重的方法。

有關完整的實現和使用詳細信息,請訪問上文鏈接的相應存儲庫。

限制和潛在改進

證明方案:Groth16

該項目目前採用 Groth16 作為證明方案,以最小化證明大小。然而,該平台可以擴展以支持 snarkjs 支持的其他證明方案,這些方案不需要特定於電路的可信設置,例如 PLONK 或 FFLONK。

合約大小和本地測試

目前,由於合約大小超過 EIP-170 限制,合約和前端只能在本地進行測試。這種限制為在以太坊主網(或其測試網)上部署平台並限制其可用性提出了挑戰。為了解決這個限制,開發人員可以研究替代的 L2 解決方案或支持更高合約大小容量的 EVM 兼容鏈,以使該 POC 能夠被部署和更廣泛地使用。

TLDR 和行動呼籲

總之,該項目是一個創新的概念驗證平台,旨在使用 ZKP 橋接 AI / ML 和 Web3 世界,提供包括 circomlib-ml,keras2circom 和 ZKaggleV2 在內的全面工具套件。

開源社區被邀請為 ZKML 的持續開發做出貢獻。特別是,鼓勵以 circomlib-ml 的其他模板形式,擴展 keras2circom 中更多層的支持,以及報告遇到的任何錯誤或問題等形式的貢獻。通過合作和對這個令人興奮的項目的貢獻,可以進一步推動 Web3 生態系統中安全和隱私保護的機器學習的邊界。

免責聲明:作為區塊鏈信息平台,本站所發布文章僅代表作者及嘉賓個人觀點,與 Web3Caff 立場無關。本文內容僅用於信息分享,均不構成任何投資建議及要約,並請您遵守所在國家或地區的相關法律法規。