{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"\u6570\u5b66\u3001\u8ba1\u7b97\u673a\u79d1\u5b66\u4e0e\u4eba\u5de5\u667a\u80fd\u7eb2\u8981","text":"
\u5728\u7ebf\u9605\u8bfb: henryndubuaku.github.io/maths-cs-ai-compendium
"},{"location":"#_2","title":"\u6982\u8ff0","text":"\u5927\u591a\u6570\u6559\u79d1\u4e66\u5c06\u597d\u7684\u601d\u60f3\u57cb\u6ca1\u5728\u5bc6\u96c6\u7684\u7b26\u53f7\u4e4b\u4e0b\uff0c\u8df3\u8fc7\u76f4\u89c9\uff0c\u5047\u8bbe\u4f60\u5df2\u7ecf\u638c\u63e1\u4e86\u4e00\u534a\u7684\u5185\u5bb9\uff0c\u5e76\u4e14\u5728\u4eba\u5de5\u667a\u80fd\u7b49\u5feb\u901f\u53d1\u5c55\u7684\u9886\u57df\u5f88\u5feb\u8fc7\u65f6\u3002\u8fd9\u662f\u4e00\u672c\u5f00\u653e\u3001\u975e\u4f20\u7edf\u7684\u6559\u79d1\u4e66\uff0c\u4ece\u96f6\u5f00\u59cb\u6db5\u76d6\u6570\u5b66\u3001\u8ba1\u7b97\u673a\u79d1\u5b66\u548c\u4eba\u5de5\u667a\u80fd\u3002\u4e3a\u90a3\u4e9b\u5e0c\u671b\u6df1\u5165\u7406\u89e3\u77e5\u8bc6\u3001\u800c\u4e0d\u4ec5\u4ec5\u662f\u4e3a\u4e86\u901a\u8fc7\u8003\u8bd5\u6216\u9762\u8bd5\u7684\u597d\u5947\u5b9e\u8df5\u8005\u800c\u7f16\u5199\u3002
"},{"location":"#_3","title":"\u80cc\u666f","text":"\u5728\u8fc7\u53bb\u51e0\u5e74\u4ece\u4e8bAI/ML\u5de5\u4f5c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u7528\u7b14\u8bb0\u672c\u8bb0\u5f55\u4e86\u6570\u5b66\u3001\u8ba1\u7b97\u673a\u79d1\u5b66\u548c\u4eba\u5de5\u667a\u80fd\u6982\u5ff5\u7684\u76f4\u89c9\u4f18\u5148\u3001\u7ed3\u5408\u5b9e\u9645\u3001\u4e0d\u6253\u9a6c\u864e\u773c\u7684\u89e3\u91ca\u30022025\u5e74\uff0c\u51e0\u4f4d\u670b\u53cb\u7528\u8fd9\u4e9b\u7b14\u8bb0\u51c6\u5907DeepMind\u3001OpenAI\u3001Nvidia\u7b49\u516c\u53f8\u7684\u9762\u8bd5\u3002\u4ed6\u4eec\u5168\u90e8\u88ab\u5f55\u7528\uff0c\u76ee\u524d\u5728\u5de5\u4f5c\u4e2d\u8868\u73b0\u51fa\u8272\u3002\u800c\u6211\u53bb\u5e74\u4e5f\u8fdb\u5165\u4e86Y Combinator\u3002\u6240\u4ee5\u73b0\u5728\u6211\u628a\u8fd9\u4e9b\u5206\u4eab\u7ed9\u6240\u6709\u4eba\u3002
"},{"location":"#mcp","title":"MCP \u670d\u52a1\u5668","text":"\u672c\u4ed3\u5e93\u5305\u542b\u4e00\u4e2aMCP\u670d\u52a1\u5668\uff0c\u5141\u8bb8\u4efb\u4f55AI\u52a9\u624b\uff08Claude Code\u3001Cursor\u3001VS Code\u7b49\uff09\u5c06\u8fd9\u672c\u7eb2\u8981\u4f5c\u4e3a\u77e5\u8bc6\u5e93\u4f7f\u7528\u3002\u5b83\u9700\u8981\u672c\u5730\u514b\u9686\u8be5\u4ed3\u5e93\u3002\u5185\u7f6e\u6559\u80b2\u7528\u9014\u7684\u5de5\u5177\u548c\u793a\u4f8b\u5b9e\u73b0\u3002
"},{"location":"#_4","title":"\u5185\u5bb9\u5927\u7eb2","text":"# \u7ae0\u8282 \u7b80\u4ecb \u72b6\u6001 01 \u5411\u91cf \u7a7a\u95f4\u3001\u6a21\u957f\u3001\u65b9\u5411\u3001\u8303\u6570\u3001\u5ea6\u91cf\u3001\u70b9\u79ef/\u53c9\u79ef/\u5916\u79ef\u3001\u57fa\u3001\u5bf9\u5076\u6027 \u5df2\u5b8c\u6210 02 \u77e9\u9635 \u6027\u8d28\u3001\u7279\u6b8a\u7c7b\u578b\u3001\u8fd0\u7b97\u3001\u7ebf\u6027\u53d8\u6362\u3001\u5206\u89e3\uff08LU\u3001QR\u3001SVD\uff09 \u5df2\u5b8c\u6210 03 \u5fae\u79ef\u5206 \u5bfc\u6570\u3001\u79ef\u5206\u3001\u591a\u5143\u5fae\u79ef\u5206\u3001\u6cf0\u52d2\u8fd1\u4f3c\u3001\u4f18\u5316\u4e0e\u68af\u5ea6\u4e0b\u964d \u5df2\u5b8c\u6210 04 \u7edf\u8ba1\u5b66 \u63cf\u8ff0\u6027\u5ea6\u91cf\u3001\u62bd\u6837\u3001\u4e2d\u5fc3\u6781\u9650\u5b9a\u7406\u3001\u5047\u8bbe\u68c0\u9a8c\u3001\u7f6e\u4fe1\u533a\u95f4 \u5df2\u5b8c\u6210 05 \u6982\u7387\u8bba \u8ba1\u6570\u3001\u6761\u4ef6\u6982\u7387\u3001\u5206\u5e03\u3001\u8d1d\u53f6\u65af\u65b9\u6cd5\u3001\u4fe1\u606f\u8bba \u5df2\u5b8c\u6210 06 \u673a\u5668\u5b66\u4e60 \u7ecf\u5178\u673a\u5668\u5b66\u4e60\u3001\u68af\u5ea6\u65b9\u6cd5\u3001\u6df1\u5ea6\u5b66\u4e60\u3001\u5f3a\u5316\u5b66\u4e60\u3001\u5206\u5e03\u5f0f\u8bad\u7ec3 \u5df2\u5b8c\u6210 07 \u8ba1\u7b97\u8bed\u8a00\u5b66 \u53e5\u6cd5\u5b66\u3001\u8bed\u4e49\u5b66\u3001\u8bed\u7528\u5b66\u3001\u81ea\u7136\u8bed\u8a00\u5904\u7406\u3001\u8bed\u8a00\u6a21\u578b\u3001RNN\u3001CNN\u3001\u6ce8\u610f\u529b\u673a\u5236\u3001Transformer\u3001\u6587\u672c\u6269\u6563\u3001\u6587\u672cOCR\u3001MoE\u3001SSM\u3001\u73b0\u4ee3LLM\u67b6\u6784\u3001\u81ea\u7136\u8bed\u8a00\u5904\u7406\u8bc4\u4f30 \u5df2\u5b8c\u6210 08 \u8ba1\u7b97\u673a\u89c6\u89c9 \u56fe\u50cf\u5904\u7406\u3001\u76ee\u6807\u68c0\u6d4b\u3001\u5206\u5272\u3001\u89c6\u9891\u5904\u7406\u3001SLAM\u3001CNN\u3001\u89c6\u89c9Transformer\u3001\u6269\u6563\u6a21\u578b\u3001\u6d41\u5339\u914d\u3001VR/AR \u5df2\u5b8c\u6210 09 \u97f3\u9891\u4e0e\u8bed\u97f3 \u6570\u5b57\u4fe1\u53f7\u5904\u7406\u3001\u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u3001\u6587\u672c\u8f6c\u8bed\u97f3\u3001\u8bed\u97f3\u4e0e\u58f0\u5b66\u6d3b\u52a8\u68c0\u6d4b\u3001\u8bf4\u8bdd\u4eba\u5206\u79bb\u3001\u6e90\u5206\u79bb\u3001\u4e3b\u52a8\u964d\u566a\u3001WaveNet\u3001Conformer \u5df2\u5b8c\u6210 10 \u591a\u6a21\u6001\u5b66\u4e60 \u878d\u5408\u7b56\u7565\u3001\u5bf9\u6bd4\u5b66\u4e60\u3001CLIP\u3001\u89c6\u89c9\u8bed\u8a00\u6a21\u578b\u3001\u56fe\u50cf/\u89c6\u9891\u5206\u8bcd\u3001\u8de8\u6a21\u6001\u751f\u6210\u3001\u7edf\u4e00\u67b6\u6784\u3001\u4e16\u754c\u6a21\u578b \u5df2\u5b8c\u6210 11 \u81ea\u4e3b\u7cfb\u7edf \u611f\u77e5\u3001\u673a\u5668\u4eba\u5b66\u4e60\u3001\u89c6\u89c9-\u8bed\u8a00-\u52a8\u4f5c\u6a21\u578b\u3001\u81ea\u52a8\u9a7e\u9a76\u3001\u592a\u7a7a\u673a\u5668\u4eba \u5df2\u5b8c\u6210 12 \u56fe\u795e\u7ecf\u7f51\u7edc \u51e0\u4f55\u6df1\u5ea6\u5b66\u4e60\u3001\u56fe\u8bba\u3001GNN\u3001\u56fe\u6ce8\u610f\u529b\u673a\u5236\u3001\u56feTransformer\u3001\u4e09\u7ef4\u7b49\u53d8\u7f51\u7edc \u5df2\u5b8c\u6210 13 \u8ba1\u7b97\u4e0e\u64cd\u4f5c\u7cfb\u7edf \u79bb\u6563\u6570\u5b66\u3001\u8ba1\u7b97\u673a\u4f53\u7cfb\u7ed3\u6784\u3001\u64cd\u4f5c\u7cfb\u7edf\u3001\u5e76\u53d1\u3001\u5e76\u884c\u3001\u7f16\u7a0b\u8bed\u8a00 \u5df2\u5b8c\u6210 14 \u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5 \u5927O\u8868\u793a\u6cd5\u3001\u9012\u5f52\u3001\u56de\u6eaf\u3001\u52a8\u6001\u89c4\u5212\u3001\u6570\u7ec4\u3001\u54c8\u5e0c\u3001\u94fe\u8868\u3001\u6808\u3001\u6811\u3001\u56fe\u3001\u6392\u5e8f\u3001\u4e8c\u5206\u67e5\u627e \u5df2\u5b8c\u6210 15 \u751f\u4ea7\u7ea7\u8f6f\u4ef6\u5de5\u7a0b Linux\u3001Git\u3001\u4ee3\u7801\u5e93\u8bbe\u8ba1\u3001\u6d4b\u8bd5\u3001CI/CD\u3001Docker\u3001\u6a21\u578b\u670d\u52a1\u3001MLOps\u3001\u76d1\u63a7\u3001\u4f7f\u7528\u7f16\u7801\u4ee3\u7406\u7684\u6700\u4f73\u5b9e\u8df5 \u5df2\u5b8c\u6210 16 SIMD\u4e0eGPU\u7f16\u7a0b \u9762\u5411\u673a\u5668\u5b66\u4e60\u7684C++\u3001\u6846\u67b6\u5de5\u4f5c\u539f\u7406\u3001\u786c\u4ef6\u57fa\u7840\u3001ARM NEON/I8MM/SME2\u3001x86 AVX\u3001GPU/CUDA\u3001Triton\u3001TPU\u3001RISC-V\u3001Vulkan\u3001WebGPU \u5df2\u5b8c\u6210 17 AI\u63a8\u7406 \u91cf\u5316\u3001\u9ad8\u6548\u67b6\u6784\u3001\u670d\u52a1\u4e0e\u6279\u5904\u7406\u3001\u8fb9\u7f18\u63a8\u7406\u3001\u63a8\u6d4b\u89e3\u7801\u3001\u6210\u672c\u4f18\u5316 \u5df2\u5b8c\u6210 18 ML\u7cfb\u7edf\u8bbe\u8ba1 \u7cfb\u7edf\u57fa\u7840\u3001\u4e91\u8ba1\u7b97\u3001\u5206\u5e03\u5f0f\u7cfb\u7edf\u3001ML\u751f\u547d\u5468\u671f\u3001\u7279\u5f81\u5b58\u50a8\u3001A/B\u6d4b\u8bd5\u3001\u63a8\u8350/\u641c\u7d22/\u5e7f\u544a/\u6b3a\u8bc8\u8bbe\u8ba1\u5b9e\u4f8b \u5df2\u5b8c\u6210 19 \u5e94\u7528\u4eba\u5de5\u667a\u80fd \u91d1\u878d\u3001\u533b\u7597\u5065\u5eb7\u3001\u86cb\u767d\u8d28\u3001\u836f\u7269\u53d1\u73b0\u4e2d\u7684\u4eba\u5de5\u667a\u80fd \u5f85\u5b8c\u6210 20 \u524d\u6cbf\u4eba\u5de5\u667a\u80fd \u91cf\u5b50\u673a\u5668\u5b66\u4e60\u3001\u795e\u7ecf\u5f62\u6001\u673a\u5668\u5b66\u4e60\u3001\u53bb\u4e2d\u5fc3\u5316\u4eba\u5de5\u667a\u80fd\u3001\u592a\u7a7a\u6570\u636e\u4e2d\u5fc3\u3001\u8111\u673a\u63a5\u53e3 \u5f85\u5b8c\u6210"},{"location":"#_5","title":"\u524d\u8a00","text":"\u65b0\u751f\u5a74\u513f\u7684\u5927\u8111\u662f\u4e00\u4e2a\u65b0\u521d\u59cb\u5316\u7684\u795e\u7ecf\u7f51\u7edc\uff0c\u901a\u8fc7\u73b0\u5b9e\u4e16\u754c\u7684\u6570\u636e\u548c\u7ecf\u9a8c\u8bad\u7ec3\u76f4\u81f3\u6210\u5e74\u2026\u2026\u76f4\u81f3\u6c38\u8fdc\u3002\u80fd\u591f\u7528\u6cd5\u8bed\u6d41\u5229\u4ea4\u6d41\u5e76\u62e5\u6709\u5b8c\u7f8e\u53e3\u97f3\uff0c\u610f\u5473\u7740\u63a5\u89e6\u5230\u4e86\u4f18\u79c0\u7684\u6cd5\u8bed\u548c\u5b8c\u7f8e\u53e3\u97f3\u3002\u540c\u6837\uff0c\u4f18\u79c0\u7684\u4eba\u5de5\u667a\u80fd\u7814\u7a76\u5458\u548c\u5de5\u7a0b\u5e08\u5177\u5907\u51fa\u8272\u7684\u95ee\u9898\u89e3\u51b3\u80fd\u529b\uff0c\u610f\u5473\u7740\u4ed6\u4eec\u5438\u6536\u4e86\u9ad8\u8d28\u91cf\u7684\u77e5\u8bc6\u5e76\u62e5\u6709\u4e30\u5bcc\u7684\u7ecf\u9a8c\u3002
\u79d1\u74e6\u820d\u592b\u5b9e\u9a8c\u662f\u4e00\u9879\u957f\u671f\u7684\u585e\u5c14\u7ef4\u4e9a\u7814\u7a76\uff0c\u8868\u660e\u4e3a\u671f\u4e09\u5e74\u7684\u9ad8\u5f3a\u5ea6\u521b\u9020\u6027\u95ee\u9898\u89e3\u51b3\u8bad\u7ec3\u53ef\u4ee5\u663e\u8457\u63d0\u9ad8\u667a\u529b\uff0c\u5c24\u5176\u662f\u6d41\u4f53\u667a\u529b\uff0c\u63d0\u534710-15\u4e2aIQ\u70b9\u3002\u5f53\u7136\uff0c\u5929\u751f\u9ad8IQ\u662f\u771f\u5b9e\u5b58\u5728\u7684\uff0c\u5c31\u50cf\u4f18\u8d28\u7684\u6743\u91cd\u521d\u59cb\u5316\u80fd\u5e26\u6765\u66f4\u597d\u7684\u8bad\u7ec3\u6548\u679c\u4e00\u6837\u2014\u2014\u5148\u5929\u4e0e\u540e\u5929\u4e4b\u4e89\u7684\u5b9e\u9a8c\u7ed3\u679c\u4e5f\u8bc1\u660e\u4e86\u8fd9\u4e00\u70b9\u3002
\u7136\u800c\uff0c\u9ad8IQ\u4e2a\u4f53\u7684\u771f\u6b63\u4f18\u52bf\u4ec5\u5728\u4e8e\u80fd\u66f4\u5feb\u5730\u5b66\u4e60\u548c\u8bc6\u522b\u6a21\u5f0f\u3002\u4f46\u91cd\u590d\u4f7f\u7528\u4e00\u79cd\u6a21\u5f0f\u53ef\u4ee5\u4f7f\u4efb\u4f55\u6982\u5ff5\u90fd\u53d8\u5f97\u7edd\u5bf9\u53ef\u5b66\u3002\u67e5\u5c14\u65af\u00b7\u8fbe\u5c14\u6587\u88ab\u4ed6\u7684\u8001\u5e08\u548c\u7236\u4eb2\u8ba4\u4e3a\u662f\u4e00\u4e2a\u975e\u5e38\u666e\u901a\u3001\u751a\u81f3\u4f4e\u4e8e\u5e73\u5747\u6c34\u5e73\u7684\u5b66\u751f\u3002\u4ed6\u81ea\u79f0\u5e76\u4e0d\u673a\u667a\uff0c\u611f\u89c9\u81ea\u5df1\u50cf\u4e00\u4e2a\"\u6162\u5904\u7406\u5668\"\uff0c\u9700\u8981\u65f6\u95f4\u6765\u5438\u6536\u6570\u636e\u3002
\u57283\u523010\u5c81\u4e4b\u95f4\uff0c\u6211\u7684\u5b66\u4e60\u6210\u7ee9\u5f88\u597d\uff0c\u81ea\u7136\u800c\u7136\u5730\u7406\u89e3\u6982\u5ff5\uff0c\u4ece\u4e0d\u505a\u7b14\u8bb0\u6216\u590d\u4e60\u300211\u523013\u5c81\u4e4b\u95f4\u6211\u6709\u70b9\u81ea\u5927\uff0c\u7528\u8fd9\u79cd\u65b9\u5f0f\u5728\u4e00\u4e2a80\u4eba\u7684\u73ed\u7ea7\u4e2d\u8dcc\u5230\u4e86\u4e0b\u534a\u90e8\u5206\u300214\u523015\u5c81\u4e4b\u95f4\uff0c\u6211\u5f00\u59cb\u50cf\u666e\u901a\u5b66\u751f\u4e00\u6837\u8bfb\u4e66\uff0c\u5728\u4e2d\u5b66\u6700\u540e\u4e00\u4e2a\u5b66\u671f\u53d6\u5f97\u4e86\u7b2c\u4e00\u540d\u3002\u65e9\u671f\u5b66\u6821\u8bfe\u7a0b\u4e0e\u81ea\u7136IQ\u914d\u5408\u5f97\u5f88\u597d\uff0c\u4f46\u73b0\u5b9e\u4e16\u754c\u7684\u624d\u534e\u6e90\u4e8e\u9ad8\u8d28\u91cf\u7684\u77e5\u8bc6\u6444\u5165\u548c\u6267\u884c\u529b\u5ea6\u3002
\u4e8b\u5b9e\u4e0a\uff0c\u5927\u591a\u6570\u5b66\u4e60\u6210\u7ee9\u597d\u7684\u5b66\u751f\u53ea\u662f\u66f4\u52e4\u594b\uff0c\u4f46\u5b66\u672f\u7cfb\u7edf\u662f\u4e3a\u5feb\u901f\u5b66\u4e60\u8005\u8bbe\u8ba1\u7684\u3002\u8fd9\u672c\u7eb2\u8981\u63d0\u4f9b\u4e86\u4e00\u4e2a\u5168\u9762\u4e14\u76f8\u4e92\u5173\u8054\u7684\u77e5\u8bc6\u6d41\uff0c\u4ee5\u5e2e\u52a9\u4e16\u754c\u4e0a\u90a3\u4e9b\"\u8fbe\u5c14\u6587\u4eec\"\u66f4\u597d\u5730\u5b66\u4e60\u3002\u4f60\u53ea\u9700\u8981\u521d\u7b49\u6570\u5b66\u57fa\u7840\u548c\u57fa\u672c\u7684Python\u7f16\u7a0b\u77e5\u8bc6\uff0c\u5176\u4ed6\u4e00\u5207\u90fd\u4f1a\u9010\u6b65\u638c\u63e1\u2014\u2014\u53ea\u9700\u9605\u8bfb\u5e76\u76f8\u4fe1\u8fd9\u4e2a\u8fc7\u7a0b\uff01
"},{"location":"#_6","title":"\u5982\u4f55\u66f4\u597d\u5730\u5b66\u4e60","text":"\u5927\u5b66\u7b2c\u4e00\u5b66\u671f\uff0c\u6211\u540c\u65f6\u9009\u4e8617\u95e8\u8bfe\uff0c\u6210\u7ee9\u5e76\u4e0d\u7406\u60f3\uff0c\u4e8e\u662f\u6211\u91c7\u7528\u4e86\u4e00\u4e2a\u6280\u5de7\uff1a
\u7b2c\u4e00\u9636\u6bb5\uff1a\u8bfe\u540e\u7d2f\u79ef\u9605\u8bfb \u53ea\u9605\u8bfb\u6bcf\u5f20\u5e7b\u706f\u7247/\u7b14\u8bb0\u7684\u6807\u9898/\u5927\u6807\u9898\uff0c\u5408\u4e0a\u4e66\uff0c\u7136\u540e\u5728\u8111\u6d77\u4e2d\u53ef\u89c6\u5316\u5e76\u5199\u51fa\u5bf9\u8be5\u6982\u5ff5\u7684\u89e3\u91ca\u3002\u53ea\u91cd\u8bfb\u4f60\u9057\u6f0f\u7684\u90e8\u5206\uff0c\u7c7b\u4f3c\u4e8e\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u63a9\u7801\u8bed\u8a00\u5efa\u6a21\u3002\u91cd\u8bfb\u4e4b\u540e\uff0c\u6700\u7ec8\u5c06\u6982\u5ff5\u7528\u4ee3\u7801\u5b9e\u73b0\u3002\u8fd9\u6837\u4f60\u5c31\u80fd\u5bf9\u6bcf\u4e2a\u6982\u5ff5\u5f62\u6210\u808c\u8089\u8bb0\u5fc6\u3002
\u7b2c\u4e8c\u9636\u6bb5\uff1a\u8003\u524d\u5f71\u5b50\u9605\u8bfb \u9605\u8bfb\u6bcf\u5f20\u5e7b\u706f\u7247/\u7b14\u8bb0\u7684\u526f\u6807\u9898\uff0c\u5408\u4e0a\u4e66\uff0c\u7136\u540e\u5728\u8111\u6d77\u4e2d\u53ef\u89c6\u5316\u5e76\u5199\u51fa\u5bf9\u8be5\u6982\u5ff5\u7684\u89e3\u91ca\u3002\u53ea\u91cd\u8bfb\u4f60\u9057\u6f0f\u7684\u90e8\u5206\uff0c\u7c7b\u4f3c\u4e8e\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u63a9\u7801\u8bed\u8a00\u5efa\u6a21\u3002\u91cd\u8bfb\u4e4b\u540e\uff0c\u6700\u7ec8\u5c06\u6982\u5ff5\u7528\u4ee3\u7801\u5b9e\u73b0\u3002\u8fd9\u6837\u4f60\u5c31\u80fd\u5bf9\u6bcf\u4e2a\u6982\u5ff5\u5f62\u6210\u808c\u8089\u8bb0\u5fc6\u3002
\u8fd9\u4e2a\u65b9\u6cd5\u5bf9\u6211\u4e0d\u592a\u81ea\u4fe1\u7684\u670b\u53cb\u4eec\u975e\u5e38\u6709\u6548\u3002\u4e8b\u5b9e\u4e0a\uff0c\u5176\u4e2d\u4e00\u4f4d\u670b\u53cb\u5728\u9ad8\u7b49\u5de5\u7a0b\u6570\u5b66\uff08\u6db5\u76d6\u6d77\u68ee\u77e9\u9635\u548c\u4f18\u5316\uff09\u8fd9\u95e8\u8bfe\u4e0a\u8d85\u8fc7\u4e86\u6211\u3002\u5979\u73b0\u5728\u5728\u4e00\u5bb6\u5927\u578b\u77f3\u6cb9\u5929\u7136\u6c14\u516c\u53f8\u5de5\u4f5c\u3002\u7075\u9b42\u7684\u610f\u613f\u6bd4\u6211\u4eec\u4e0e\u4e4b\u5de5\u4f5c\u7684\u8eab\u4f53\u66f4\u91cd\u8981\uff08\u7f57\u68ee\u5854\u5c14\u5b9e\u9a8c\uff09\u3002
"},{"location":"#_7","title":"\u5173\u4e8e\u4f5c\u8005","text":"\u67e5\u770bGitHub\u4e2a\u4eba\u8d44\u6599\uff01
"},{"location":"#_8","title":"\u5f15\u7528","text":"@book{ndubuaku2025compendium,\n title = {Maths, CS & AI Compendium},\n author = {Henry Ndubuaku},\n year = {2026},\n publisher = {GitHub},\n url = {https://github.com/HenryNdubuaku/maths-cs-ai-compendium}\n}\n"},{"location":"chapter%2001%3A%20vectors/01.%20vector%20spaces/","title":"\u5411\u91cf\u7a7a\u95f4","text":"\u5411\u91cf\u7a7a\u95f4\u6784\u6210\u4e86\u673a\u5668\u5b66\u4e60\u7684\u6570\u5b66\u821e\u53f0\u3002\u672c\u6587\u6db5\u76d6\u5411\u91cf\u52a0\u6cd5\u3001\u6807\u91cf\u4e58\u6cd5\u3001\u5c01\u95ed\u6027\u516c\u7406\u3001\u5b50\u7a7a\u95f4\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48AI\u4e2d\u51e0\u4e4e\u6240\u6709\u4e1c\u897f\u90fd\u8868\u793a\u4e3a\u5411\u91cf\u3002
\u5c06\u5411\u91cf\u7a7a\u95f4\u60f3\u8c61\u6210\u4e00\u79cd\u7279\u5b9a\u7c7b\u578b\u7684\u821e\u53f0\uff0c\u6570\u5b66\u5bf9\u8c61\u751f\u6d3b\u5728\u5176\u4e2d\uff0c\u6bcf\u4e2a\u5bf9\u8c61\u88ab\u79f0\u4e3a\u4e00\u4e2a\u5411\u91cf\u3002
\u4e3a\u4e86\u673a\u5668\u5b66\u4e60\uff08ML\uff09\u4e2d\u7684\u51e0\u4f55\u76f4\u89c9\uff0c\u6211\u4eec\u59cb\u7ec8\u5c06\u5411\u91cf\u89c6\u4e3a\u6b27\u51e0\u91cc\u5f97\u7a7a\u95f4\u4e2d\u7684\u4e00\u4e2a\u70b9\uff0c\u7531\u5176\u5750\u6807\u8868\u793a\u3002
\u5411\u91cf \\(\\mathbf{a}\\)\uff08\u6570\u5b66\u4e0a\u7528\u7c97\u4f53\u5c0f\u5199\u5b57\u6bcd\u8868\u793a\uff09\u6709 \\(n\\) \u4e2a\u5750\u6807\uff0c\u6bcf\u4e2a\u5750\u6807\u4ee3\u8868\u6cbf\u4e00\u4e2a\u8f74\u7684\u4f4d\u7f6e\u3002
\u5411\u91cf\u7a7a\u95f4\u4e2d\u7684\u5411\u91cf\u9075\u5faa\u4e00\u5957\u975e\u5e38\u5177\u4f53\u3001\u4e0d\u53ef\u6253\u7834\u7684\u89c4\u5219\uff1a
\u5411\u91cf\u52a0\u6cd5\uff08\u7ec4\u5408\uff09\uff1a \u4f60\u53ef\u4ee5\u53d6\u4efb\u610f\u4e24\u4e2a\u5411\u91cf\u5e76\u5c06\u5b83\u4eec\u7ec4\u5408\u8d77\u6765\u521b\u5efa\u65b0\u5411\u91cf\u3002 \u628a\u5411\u91cf\u60f3\u8c61\u6210\u79fb\u52a8\u7684\u6307\u4ee4\u3002 \u5982\u679c\u5411\u91cf A \u8868\u793a\"\u5411\u524d\u8d70 3 \u6b65\"\uff0c\u5411\u91cf B \u8868\u793a\"\u5411\u53f3\u8d70 2 \u6b65\"\uff0c \u5c06\u5b83\u4eec\u76f8\u52a0\uff08A + B\uff09\u5c31\u521b\u5efa\u4e86\u4e00\u6761\u65b0\u7684\u5355\u4e00\u6307\u4ee4\uff1a\"\u5411\u524d\u8d70 3 \u6b65\u5e76\u5411\u53f3\u8d70 2 \u6b65\u3002\"
\u6807\u91cf\u4e58\u6cd5\uff08\u7f29\u653e\uff09\uff1a \u4f60\u53ef\u4ee5\u4f7f\u7528\u4e00\u4e2a\u666e\u901a\u6570\u5b57\uff08\"\u6807\u91cf\"\uff09\u6765\u7f29\u653e\u4efb\u610f\u5411\u91cf\u3002 \u4f60\u53ef\u4ee5\u62c9\u4f38\u5b83\u3001\u7f29\u5c0f\u5b83\u6216\u53cd\u8f6c\u5b83\u3002 \u5982\u679c\u5411\u91cf A \u662f\"\u5411\u524d\u8d70 3 \u6b65\"\uff0c\u5c06\u5176\u4e58\u4ee5 2 \u5c31\u53d8\u6210\"\u5411\u524d\u8d70 6 \u6b65\u3002\" \u5c06\u5176\u4e58\u4ee5 -1 \u5219\u5b8c\u5168\u7ffb\u8f6c\u6210\"\u5411\u540e\u8d70 3 \u6b65\u3002\"
\u5411\u91cf\u7a7a\u95f4\u7684\u7ef4\u5ea6\u662f\u5176\u5305\u542b\u7684\u72ec\u7acb\u65b9\u5411\u7684\u6570\u91cf\u3002\\(\\mathbb{R}^2\\) \u662f\u4e8c\u7ef4\u7684\uff08\u9700\u8981 2 \u4e2a\u5750\u6807\uff09\uff0c\u800c\u4e0a\u9762\u7684 \\(\\mathbf{a}\\) \u5b58\u5728\u4e8e \\(\\mathbb{R}^3\\) \u4e2d\u3002
\u4f8b\u5982\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u4efb\u4f55\u5bf9\u8c61\uff08\u6bd4\u5982\u4e00\u4e2a\u4eba\uff09\u8868\u793a\u4e3a\u4e00\u4e2a\u5411\u91cf\uff0c\u5176\u4e2d \\(h_1\\) = \u8eab\u9ad8\uff08\u5398\u7c73\uff09\uff0c\\(h_2\\) = \u4f53\u91cd\uff08\u516c\u65a4\uff09\uff0c\\(h_3\\) = \u5e74\u9f84\u3002
\u6211\u4eec\u73b0\u5728\u5df2\u7ecf\u521b\u5efa\u4e86\u4e00\u4e2a\u5305\u542b\u8868\u793a\u4eba\u7684\u5411\u91cf\u7684\u5411\u91cf\u7a7a\u95f4\u3002
\u6211\u4eec\u53ef\u4ee5\u8868\u793a\u591a\u4e2a\u4eba\uff0c\u5e76\u89c2\u5bdf\u4ed6\u4eec\u4e4b\u95f4\u7684\u8fdc\u8fd1\uff01
\u6211\u4eec\u53ef\u4ee5\u6dfb\u52a0\u66f4\u591a\u7279\u5f81\uff0c\u521b\u5efa\u4e30\u5bcc\u7684\u4eba\u4f53\u8868\u793a\uff0c\u5728 ML \u4e2d\u901a\u5e38\u79f0\u4e3a\u7279\u5f81\u5411\u91cf\u3002
\u4f60\u62e5\u6709\u7684\u72ec\u7279\u4e14\u6709\u610f\u4e49\u7684\u7279\u5f81\u8d8a\u591a\uff0c\u7279\u5f81\u5411\u91cf\u7684\u63cf\u8ff0\u6027\u5c31\u8d8a\u5f3a\uff0c\u8fd9\u662f\u9700\u8981\u8bb0\u4f4f\u7684\u4e00\u4e2a\u91cd\u8981\u56e0\u7d20\u3002
\u8d85\u8fc7 3 \u7ef4\u540e\uff0c\u5411\u91cf\u53d8\u5f97\u975e\u5e38\u96be\u4ee5\u76f4\u89c2\u68c0\u67e5\uff0c\u8fd9\u50ac\u751f\u4e86\u4e00\u4e2a\u540d\u4e3a\u7ebf\u6027\u4ee3\u6570\u7684\u6570\u5b66\u9886\u57df\u3002
\u73b0\u5728\uff0c\u7ebf\u6027\u4ee3\u6570\u662f\u7814\u7a76\u5411\u91cf\u3001\u5411\u91cf\u7a7a\u95f4\u4ee5\u53ca\u5411\u91cf\u4e4b\u95f4\u6620\u5c04\u5173\u7cfb\u7684\u5b66\u79d1\u3002
\u6211\u4eec\u5728 AI/ML \u4e2d\u5c06\u51e0\u4e4e\u6240\u6709\u4e1c\u897f\u90fd\u8868\u793a\u4e3a\u5411\u91cf\uff0c\u8fd9\u4f7f\u5f97\u7ebf\u6027\u4ee3\u6570\u6210\u4e3a\u8be5\u9886\u57df\u7684\u57fa\u77f3\u3002
\u5411\u91cf\u52a0\u6cd5\u53ef\u4ee5\u901a\u8fc7\u5c06\u4e00\u4e2a\u5411\u91cf\u653e\u5728\u53e6\u4e00\u4e2a\u5411\u91cf\u7684\u5c3e\u90e8\uff0c\u7136\u540e\u4ece\u539f\u70b9\u753b\u5230\u7ec8\u70b9\u7684\u53ef\u89c6\u5316\u65b9\u5f0f\u6267\u884c\u3002
\u5bf9\u4e8e\u4e24\u4e2a\u5411\u91cf \\(\\mathbf{a} = (a_1, a_2)\\) \u548c \\(\\mathbf{b} = (b_1, b_2)\\)\uff1a\\(\\mathbf{a} + \\mathbf{b} = (a_1 + b_1, a_2 + b_2)\\)
\u5411\u91cf\u4e5f\u53ef\u4ee5\u76f8\u51cf\uff0c\u6240\u6709\u52a0\u6cd5\u89c4\u5219\u540c\u6837\u9002\u7528\u3002
\u5c06\u5411\u91cf\u4e58\u4ee5\u6807\u91cf\u4f1a\u5728\u76f8\u540c\u65b9\u5411\u4e0a\u6309\u8be5\u56e0\u5b50\u7f29\u653e\u5411\u91cf\u3002
\u5bf9\u4e8e\u6807\u91cf \\(c\\) \u548c\u5411\u91cf \\(\\mathbf{v} = (v_1, v_2)\\)\uff1a\\(c\\mathbf{v} = (cv_1, cv_2)\\)
\u52a0\u6cd5\u5c01\u95ed\u6027\uff1a\u5982\u679c\u5c06\u5411\u91cf\u7a7a\u95f4\u4e2d\u7684\u4efb\u610f\u4e24\u4e2a\u5411\u91cf\u76f8\u52a0\uff0c\u7ed3\u679c\u4e5f\u5c5e\u4e8e\u540c\u4e00\u7a7a\u95f4\uff1a\u5982\u679c \\(\\mathbf{u} \\in V\\) \u4e14 \\(\\mathbf{v} \\in V\\)\uff0c\u5219 \\(\\mathbf{u} + \\mathbf{v} \\in V\\)
\u6807\u91cf\u4e58\u6cd5\u5c01\u95ed\u6027\uff1a\u5982\u679c\u5c06\u5411\u91cf\u7a7a\u95f4\u4e2d\u7684\u4efb\u610f\u5411\u91cf\u4e58\u4ee5\u6807\u91cf\uff0c\u7ed3\u679c\u4e5f\u5c5e\u4e8e\u540c\u4e00\u7a7a\u95f4\uff1a\u5982\u679c \\(\\mathbf{v} \\in V\\) \u4e14 \\(c \\in F\\)\uff0c\u5219 \\(c\\mathbf{v} \\in V\\)
\u52a0\u6cd5\u7ed3\u5408\u5f8b\uff1a\u5bf9\u4e8e\u4efb\u610f\u4e09\u4e2a\u5411\u91cf \\(\\mathbf{u}\\)\u3001\\(\\mathbf{v}\\) \u548c \\(\\mathbf{w}\\)\uff1a\\((\\mathbf{u} + \\mathbf{v}) + \\mathbf{w} = \\mathbf{u} + (\\mathbf{v} + \\mathbf{w})\\)
\u52a0\u6cd5\u4ea4\u6362\u5f8b\uff1a\u5bf9\u4e8e\u4efb\u610f\u4e24\u4e2a\u5411\u91cf \\(\\mathbf{u}\\) \u548c \\(\\mathbf{v}\\)\uff1a\\(\\mathbf{u} + \\mathbf{v} = \\mathbf{v} + \\mathbf{u}\\)
\u901a\u8fc7\u5e73\u884c\u56db\u8fb9\u5f62\u7684\u4e24\u6761\u8def\u5f84\u90fd\u5230\u8fbe\u540c\u4e00\u70b9\u3002
\uff08\u96f6\u5411\u91cf\uff09\uff1a\u5b58\u5728\u4e00\u4e2a\u5411\u91cf \\(\\mathbf{0}\\)\uff0c\u4f7f\u5f97\u5bf9\u4e8e\u4efb\u4f55\u5411\u91cf \\(\\mathbf{v}\\)\uff1a\\(\\mathbf{v} + \\mathbf{0} = \\mathbf{v}\\)
\u7f29\u653e\u548c\uff08\u91d1\u8272\uff09\u4e0e\u5206\u522b\u7f29\u653e\u5411\u91cf\u518d\u6c42\u548c\u7684\u7ed3\u679c\u76f8\u540c\u3002
\u5206\u914d\u5f8b 2\uff1a\u5bf9\u4e8e\u4efb\u610f\u6807\u91cf \\(c\\)\u3001\\(d\\) \u548c\u5411\u91cf \\(\\mathbf{v}\\)\uff1a\\((c + d)\\mathbf{v} = c\\mathbf{v} + d\\mathbf{v}\\)
\u7ed3\u5408\u5f8b\uff1a\u5bf9\u4e8e\u4efb\u610f\u6807\u91cf \\(c\\)\u3001\\(d\\) \u548c\u5411\u91cf \\(\\mathbf{v}\\)\uff1a\\((cd)\\mathbf{v} = c(d\\mathbf{v})\\)
\u5355\u4f4d\u5143\uff1a\u5bf9\u4e8e\u4efb\u4f55\u5411\u91cf \\(\\mathbf{v}\\)\uff1a\\(1\\mathbf{v} = \\mathbf{v}\\)\uff0c\u5176\u4e2d \\(1\\) \u662f\u6807\u91cf\u57df\u4e2d\u7684\u4e58\u6cd5\u5355\u4f4d\u5143\u3002
\u5b50\u7a7a\u95f4\u5c31\u662f\u5927\u7a7a\u95f4\u5185\u90e8\u7684\u4e00\u4e2a\u8f83\u5c0f\u821e\u53f0\u3002\u628a\u4e09\u7ef4\u7a7a\u95f4\u60f3\u8c61\u6210\u4e00\u4e2a\u623f\u95f4\u3002\u4e00\u5f20\u7a7f\u8fc7\u623f\u95f4\u4e2d\u5fc3\u7684\u5e73\u5766\u7eb8\u7247\u5c31\u662f\u4e00\u4e2a\u5b50\u7a7a\u95f4\uff0c\u7a7f\u8fc7\u4e2d\u5fc3\u7684\u4e00\u6839\u76f4\u5bfc\u7ebf\u4e5f\u662f\u5b50\u7a7a\u95f4\u3002
\u5173\u952e\u8981\u6c42\u662f\u5b50\u7a7a\u95f4\u5fc5\u987b\u7ecf\u8fc7\u539f\u70b9\u3002\u5982\u679c\u4f60\u628a\u90a3\u7247\u7eb8\u79fb\u5f00\u4e2d\u5fc3\uff0c\u5b83\u5c31\u4e0d\u518d\u662f\u5b50\u7a7a\u95f4\u4e86\uff0c\u56e0\u4e3a\u96f6\u5411\u91cf\u4e0d\u518d\u4f4d\u4e8e\u5176\u4e0a\u3002
\u5411\u91cf\u7a7a\u95f4\u7684\u6240\u6709\u89c4\u5219\uff08\u52a0\u6cd5\u3001\u7f29\u653e\u3001\u5c01\u95ed\u6027\uff09\u5728\u5b50\u7a7a\u95f4\u5185\u90e8\u4ecd\u7136\u6709\u6548\u3002\u4f60\u53ef\u4ee5\u5728\u5b50\u7a7a\u95f4\u5185\u6dfb\u52a0\u6216\u7f29\u653e\u5411\u91cf\uff0c\u6c38\u8fdc\u4e0d\u4f1a\"\u6389\u51fa\"\u5230\u66f4\u5927\u7684\u7a7a\u95f4\u3002
\u7ecf\u8fc7\u539f\u70b9\u7684\u76f4\u7ebf\u662f\u4e00\u7ef4\u5b50\u7a7a\u95f4\uff0c\u7ecf\u8fc7\u539f\u70b9\u7684\u5e73\u9762\u662f\u4e8c\u7ef4\u5b50\u7a7a\u95f4\uff0c\u800c\u6574\u4e2a\u7a7a\u95f4\u662f\u81ea\u8eab\u7684\u5b50\u7a7a\u95f4\u3002
\u5728 ML \u4e2d\uff0c\u5b50\u7a7a\u95f4\u81ea\u7136\u51fa\u73b0\u3002\u9ad8\u7ef4\u6570\u636e\u901a\u5e38\u5177\u6709\u5b58\u5728\u4e8e\u4f4e\u7ef4\u5b50\u7a7a\u95f4\u4e0a\u7684\u7ed3\u6784\u3002PCA \u7b49\u6280\u672f\u627e\u5230\u90a3\u4e2a\u5b50\u7a7a\u95f4\uff0c\u8fd9\u6837\u6211\u4eec\u53ef\u4ee5\u66f4\u9ad8\u6548\u5730\u5904\u7406\u6570\u636e\u3002
\u8fd0\u884c\u4ee3\u7801\u9a8c\u8bc1\u5206\u914d\u5f8b\u6027\u8d28\uff0c\u7136\u540e\u4fee\u6539\u5e76\u5c1d\u8bd5\u6d4b\u8bd5\u5176\u4ed6\u89c4\u5219\uff01
import jax.numpy as jnp\n\nu = jnp.array([1, 2])\nv = jnp.array([3, 0])\nc = 2\n\nlhs = c * (u + v)\nrhs = c*u + c*v\n\nprint(f\"LHS: {lhs}\")\nprint(f\"RHS: {rhs}\")\n \u8fd0\u884c\u4ee3\u7801\u53ef\u89c6\u5316\u4e0d\u540c\u7684\u5411\u91cf\uff0c\u7136\u540e\u4fee\u6539\u4e0d\u540c\u5750\u6807\u7684\u503c\u4ee5\u7406\u89e3\u6bcf\u4e2a\u8f74\u5982\u4f55\u5f71\u54cd\u4f4d\u7f6e\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u5c1d\u8bd5\u4fee\u6539\u8fd9\u4e9b\u5411\u91cf\uff01\na = jnp.array([3, 2, 4])\nb = jnp.array([1, 4, 2])\nc = jnp.array([4, 1, 3])\n\nfig = plt.figure()\nax = fig.add_subplot(111, projection=\"3d\")\n\nfor vec, name, color in [(a, \"a\", \"red\"), (b, \"b\", \"blue\"), (c, \"c\", \"green\")]:\n ax.quiver(0, 0, 0, *vec, color=color, arrow_length_ratio=0.1, linewidth=2, label=name)\n\nlim = int(jnp.abs(jnp.stack([a, b, c])).max()) + 1\nax.set_xlim([0, lim]); ax.set_ylim([0, lim]); ax.set_zlim([0, lim])\nax.set_xlabel(\"X\"); ax.set_ylabel(\"Y\"); ax.set_zlabel(\"Z\")\nax.legend()\nplt.show()\n \u5411\u91cf\u6027\u8d28\u63cf\u8ff0\u4e86\u5b9a\u4e49\u5411\u91cf\u884c\u4e3a\u7684\u51e0\u4f55\u548c\u4ee3\u6570\u7279\u5f81\u3002\u672c\u6587\u6db5\u76d6\u6a21\u957f\u3001\u65b9\u5411\u3001\u5355\u4f4d\u5411\u91cf\u3001\u76f8\u7b49\u6027\u3001\u5e73\u884c\u6027\u3001\u6b63\u4ea4\u6027\u548c\u7ebf\u6027\u65e0\u5173\u6027\uff0c\u5b83\u4eec\u662f\u6bcf\u4e2a ML \u7279\u5f81\u7a7a\u95f4\u7684\u57fa\u77f3\u3002
\u8fd9\u53ea\u662f\u52fe\u80a1\u5b9a\u7406\u63a8\u5e7f\u5230\u66f4\u9ad8\u7ef4\u5ea6\uff0c\u6d4b\u91cf\u4ece\u539f\u70b9\u5230\u8be5\u70b9\u7684\u76f4\u7ebf\u8ddd\u79bb\u3002
\u5411\u91cf\u7684\u65b9\u5411\u544a\u8bc9\u4f60\u5b83\u6307\u5411\u54ea\u91cc\uff1b\u53ea\u9700\u60f3\u8c61\u4ece\u539f\u70b9\u5230\u5750\u6807\u70b9\u7684\u4e00\u6761\u76f4\u7ebf\u5373\u53ef\u3002
\u5f53\u6ca1\u6709\u660e\u786e\u6307\u5b9a\u539f\u70b9\u65f6\uff0c\u6211\u4eec\u901a\u5e38\u9690\u542b\u5730\u4f7f\u7528 \\((0,0,\\ldots,0)\\) \u5373\u4e2d\u5fc3\u70b9\uff0c\u81f3\u5c11\u4e3a\u4e86\u53ef\u89c6\u5316\u76ee\u7684\u5982\u6b64\u3002
\u4f4d\u7f6e\u5e76\u4e0d\u91cd\u8981\uff0c\u5b83\u603b\u662f\u5173\u4e8e\u4f4d\u79fb\uff1a\u4ece\u539f\u70b9\u753b\u51fa\u7684\u5411\u91cf \\((3, 2)\\) \u548c\u4ece\u53e6\u4e00\u4e2a\u70b9\u753b\u51fa\u7684\u540c\u6837\u7684 \\((3, 2)\\) \u4ecd\u7136\u662f\u76f8\u7b49\u7684\u3002
\u5982\u679c \\(k > 0\\)\uff0c\u5b83\u4eec\u6307\u5411\u76f8\u540c\u65b9\u5411\u3002\u5982\u679c \\(k < 0\\)\uff0c\u5b83\u4eec\u6307\u5411\u76f8\u53cd\u65b9\u5411\u3002\u65e0\u8bba\u54ea\u79cd\u60c5\u51b5\uff0c\u5b83\u4eec\u90fd\u4f4d\u4e8e\u7ecf\u8fc7\u539f\u70b9\u7684\u540c\u4e00\u6761\u76f4\u7ebf\u4e0a\u3002
\u76f4\u89c2\u5730\u8bf4\uff0c\u5e73\u884c\u5411\u91cf\u4e0d\u643a\u5e26\u4efb\u4f55\"\u65b0\u7684\"\u65b9\u5411\u4fe1\u606f\u3002\u4e00\u4e2a\u53ea\u662f\u53e6\u4e00\u4e2a\u7684\u62c9\u4f38\u6216\u7ffb\u8f6c\u7248\u672c\u3002
\u4e24\u4e2a\u5411\u91cf\u6b63\u4ea4\uff08\u5782\u76f4\uff09\u5982\u679c\u5b83\u4eec\u6307\u5411\u5b8c\u5168\u72ec\u7acb\u7684\u65b9\u5411\u3002\u6cbf\u4e00\u4e2a\u65b9\u5411\u79fb\u52a8\u4e0d\u4f1a\u8ba9\u4f60\u5728\u53e6\u4e00\u4e2a\u65b9\u5411\u4e0a\u6709\u4efb\u4f55\u8fdb\u5c55\u3002
\u60f3\u8c61\u5411\u5317\u8d70\u7136\u540e\u5411\u4e1c\u8d70\uff0c\u8fd9\u4e9b\u662f\u6b63\u4ea4\u65b9\u5411\uff0c\u65e0\u8bba\u5411\u5317\u8d70\u591a\u8fdc\u90fd\u4e0d\u4f1a\u4f7f\u4f60\u5411\u4e1c\u79fb\u52a8\u3002\u6211\u4eec\u7ecf\u5e38\u4f1a\u9047\u5230\u6b63\u4ea4\u6027\u3002
\u6b63\u4ea4\u6027\u5bf9 ML \u81f3\u5173\u91cd\u8981\uff1a\u6b63\u4ea4\u7684\u7279\u5f81\u643a\u5e26\u5b8c\u5168\u72ec\u7acb\u7684\u4fe1\u606f\uff0c\u8fd9\u5bf9\u4e8e\u8868\u793a\u662f\u6700\u7406\u60f3\u7684\u3002
\u66f4\u4e00\u822c\u5730\uff0c\u4efb\u610f\u4e24\u4e2a\u5411\u91cf\u4e4b\u95f4\u90fd\u6709\u4e00\u4e2a\u5939\u89d2 \\(\\theta\\)\uff0c\u8303\u56f4\u4ece \\(0\u00b0\\) \u5230 \\(180\u00b0\\)\u3002
\u8fd9\u4e2a\u89d2\u5ea6\u6355\u6349\u4e86\u4e24\u4e2a\u65b9\u5411\u4e4b\u95f4\u7684\u5168\u90e8\u5173\u7cfb\uff1a\\(0\u00b0\\) \u8868\u793a\u5e73\u884c\uff08\u76f8\u540c\u65b9\u5411\uff09\uff0c\\(180\u00b0\\) \u8868\u793a\u5e73\u884c\uff08\u76f8\u53cd\u65b9\u5411\uff09\uff0c\\(90\u00b0\\) \u8868\u793a\u6b63\u4ea4\u3002\u4ecb\u4e8e\u4e4b\u95f4\u7684\u90fd\u662f\u6df7\u5408\u60c5\u51b5\u3002
ML \u4e2d\u7684\u5927\u591a\u6570\u5411\u91cf\u5173\u7cfb\u90fd\u5904\u5728\u8fd9\u4e2a\u8303\u56f4\u7684\u67d0\u5904\u3002\u7a0d\u540e\uff0c\u6211\u4eec\u5c06\u770b\u5230\u7cbe\u786e\u7684\u5de5\u5177\uff08\u70b9\u79ef\u3001\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff09\u6765\u8ba1\u7b97\u8fd9\u4e2a\u89d2\u5ea6\u3002
\u4e00\u7ec4\u5411\u91cf\u662f\u7ebf\u6027\u76f8\u5173\u7684\uff0c\u5982\u679c\u5176\u4e2d\u81f3\u5c11\u4e00\u4e2a\u53ef\u4ee5\u901a\u8fc7\u7f29\u653e\u548c\u76f8\u52a0\u4ece\u5176\u4ed6\u5411\u91cf\u6784\u9020\u51fa\u6765\u3002\u5b83\u6ca1\u6709\u4e3a\u8be5\u96c6\u5408\u5e26\u6765\u65b0\u7684\u4fe1\u606f\u3002
\u4f8b\u5982\uff0c\u5982\u679c \\(\\mathbf{c} = 2\\mathbf{a} + 3\\mathbf{b}\\)\uff0c\u90a3\u4e48 \\(\\mathbf{c}\\) \u662f\u5197\u4f59\u7684\uff0c\u4f60\u5df2\u7ecf\u901a\u8fc7 \\(\\mathbf{a}\\) \u548c \\(\\mathbf{b}\\) \u62e5\u6709\u4e86 \\(\\mathbf{c}\\) \u6240\u63d0\u4f9b\u7684\u5168\u90e8\u4fe1\u606f\u3002
\u5e73\u884c\u5411\u91cf\u603b\u662f\u7ebf\u6027\u76f8\u5173\u7684\uff0c\u56e0\u4e3a\u4e00\u4e2a\u53ea\u662f\u53e6\u4e00\u4e2a\u7684\u7f29\u653e\u526f\u672c\u3002\u4efb\u4f55\u5305\u542b\u96f6\u5411\u91cf\u7684\u96c6\u5408\u4e5f\u662f\u7ebf\u6027\u76f8\u5173\u7684\u3002
\u5411\u91cf\u662f\u7ebf\u6027\u65e0\u5173\u7684\uff0c\u5982\u679c\u5176\u4e2d\u6ca1\u6709\u4e00\u4e2a\u80fd\u4ece\u5176\u4ed6\u5411\u91cf\u6784\u9020\u51fa\u6765\u3002\u6bcf\u4e2a\u5411\u91cf\u90fd\u8d21\u732e\u4e86\u4e00\u4e2a\u771f\u6b63\u7684\u65b0\u65b9\u5411\u3002\u6b63\u4ea4\u5411\u91cf\u603b\u662f\u7ebf\u6027\u65e0\u5173\u7684\u3002
\u5728\u4e8c\u7ef4\u4e2d\uff0c\u4e24\u4e2a\u7ebf\u6027\u65e0\u5173\u7684\u5411\u91cf\u53ef\u4ee5\u5230\u8fbe\u5e73\u9762\u4e0a\u7684\u4efb\u4f55\u70b9\u3002\u5728\u4e09\u7ef4\u4e2d\uff0c\u4f60\u9700\u8981\u4e09\u4e2a\u3002\"\u9700\u8981\u591a\u5c11\u4e2a\u72ec\u7acb\u7684\u5411\u91cf\"\u8fd9\u4e2a\u60f3\u6cd5\u76f4\u63a5\u4e0e\u7ef4\u5ea6\u76f8\u5173\u3002
\u5f53\u5411\u91cf\u7684\u5927\u591a\u6570\u5206\u91cf\u4e3a\u96f6\u65f6\uff0c\u8be5\u5411\u91cf\u662f\u7a00\u758f\u7684\u3002\u76f8\u53cd\uff0c\u5927\u591a\u6570\u5206\u91cf\u975e\u96f6\u79f0\u4e3a\u7a20\u5bc6\u3002
\u7a00\u758f\u6027\u5f88\u91cd\u8981\uff0c\u56e0\u4e3a\u5b83\u5f71\u54cd\u5b58\u50a8\u548c\u8ba1\u7b97\u3002\u7a00\u758f\u5411\u91cf\u53ef\u4ee5\u901a\u8fc7\u53ea\u8ddf\u8e2a\u975e\u96f6\u6761\u76ee\u6765\u66f4\u9ad8\u6548\u5730\u5b58\u50a8\u548c\u5904\u7406\u3002
\u5355\u4f4d\u5411\u91cf\u662f\u6a21\u957f\u6b63\u597d\u4e3a 1 \u7684\u5411\u91cf\u3002\u5b83\u7eaf\u7cb9\u8868\u793a\u65b9\u5411\uff0c\u4e0d\u5305\u542b\u957f\u5ea6\u4fe1\u606f\u3002\u4f60\u53ef\u4ee5\u901a\u8fc7\u9664\u4ee5\u6a21\u957f\u5c06\u4efb\u4f55\u5411\u91cf\u53d8\u6210\u5355\u4f4d\u5411\u91cf\uff1a
\u8fd9\u4e2a\u8fc7\u7a0b\u79f0\u4e3a\u5f52\u4e00\u5316\u3002\u5b83\u5265\u79bb\u4e86\"\u591a\u8fdc\"\uff0c\u53ea\u4fdd\u7559\"\u5f80\u54ea\u8d70\u3002\"
\u6807\u51c6\u5355\u4f4d\u5411\u91cf\u6307\u5411\u6bcf\u4e2a\u8f74\uff1a\\(\\hat{\\mathbf{i}} = (1, 0, 0)\\)\uff0c\\(\\hat{\\mathbf{j}} = (0, 1, 0)\\)\uff0c\\(\\hat{\\mathbf{k}} = (0, 0, 1)\\)\u3002\u4efb\u4f55\u5411\u91cf\u90fd\u53ef\u4ee5\u5199\u6210\u8fd9\u4e9b\u5411\u91cf\u7684\u7ec4\u5408\uff0c\u4f8b\u5982 \\((3, 2, 4) = 3\\hat{\\mathbf{i}} + 2\\hat{\\mathbf{j}} + 4\\hat{\\mathbf{k}}\\)\u3002
\u8ba1\u7b97\u5411\u91cf\u7684\u6a21\u957f\u5e76\u9a8c\u8bc1\u5b83\u7b26\u5408\u52fe\u80a1\u5b9a\u7406\uff0c\u7136\u540e\u4fee\u6539\u4ee3\u7801\u8ba1\u7b97\u5355\u4f4d\u5411\u91cf\u3002
import jax.numpy as jnp\n\na = jnp.array([3.0, 4.0])\n\nmagnitude = jnp.sqrt(jnp.sum(a ** 2))\nprint(f\"Magnitude of a: {magnitude}\") \n \u901a\u8fc7\u6d4b\u8bd5\u4e00\u4e2a\u5411\u91cf\u662f\u5426\u662f\u53e6\u4e00\u4e2a\u7684\u6807\u91cf\u500d\u6570\u6765\u68c0\u67e5\u4e24\u4e2a\u5411\u91cf\u662f\u5426\u5e73\u884c\u3002
import jax.numpy as jnp\n\na = jnp.array([2, 4, 6])\nb = jnp.array([1, 2, 3])\n\nratios = a / b\nprint(f\"Ratios: {ratios}\")\nprint(f\"Parallel: {jnp.allclose(ratios, ratios[0])}\")\n \u8303\u6570\u8861\u91cf\u5355\u4e2a\u5411\u91cf\u7684\u5927\u5c0f\uff1b\u5ea6\u91cf\u8861\u91cf\u4e24\u4e2a\u5411\u91cf\u4e4b\u95f4\u7684\u8ddd\u79bb\u3002\u672c\u6587\u6db5\u76d6 L1\u3001L2 \u548c L-\u65e0\u7a77\u8303\u6570\u3001\u6b27\u51e0\u91cc\u5f97\u8ddd\u79bb\u548c\u4f59\u5f26\u8ddd\u79bb\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u4e3a kNN\u3001\u805a\u7c7b\u548c ML \u4e2d\u7684\u68c0\u7d22\u9009\u62e9\u5408\u9002\u7684\u8ddd\u79bb\u51fd\u6570\u81f3\u5173\u91cd\u8981\u3002
\u6211\u4eec\u77e5\u9053\u5411\u91cf\u6709\u6a21\u957f\u548c\u65b9\u5411\u3002\u4f46\u6211\u4eec\u5982\u4f55\u5b9e\u9645\u8861\u91cf\u5355\u4e2a\u5411\u91cf\"\u6709\u591a\u5927\"\uff0c\u6216\u8005\u4e24\u4e2a\u5411\u91cf\"\u6709\u591a\u8fdc\"\uff1f\u8fd9\u5c31\u662f\u8303\u6570\u548c\u5ea6\u91cf\u53d1\u6325\u4f5c\u7528\u7684\u5730\u65b9\u3002
\u5bf9\u6807\u91cf\u800c\u8a00\uff0c\u6211\u4eec\u77e5\u9053 10 > 5\uff0c\u56e0\u4e3a\u5b83\u4eec\u7684\u503c\u5bf9\u5b83\u4eec\u8fdb\u884c\u4e86\u91cf\u5316\uff0c\u4f46\u662f\u6211\u4eec\u5982\u4f55\u91cf\u5316\u4e00\u4e2a\u5411\u91cf\uff1f\u5b83\u7684\u8303\u6570\u8861\u91cf\u5355\u4e2a\u5411\u91cf\u7684\u5927\u5c0f\u3002
\u6700\u719f\u6089\u7684\u8303\u6570\u662f\u6b27\u51e0\u91cc\u5f97\u8303\u6570\uff08L2\uff09\uff0c\u5b83\u5c31\u662f\u6211\u4eec\u5df2\u77e5\u7684\u6a21\u957f\u516c\u5f0f\uff1a
\u8bbe\u7f6e \\(p = 2\\) \u5f97\u5230\u6b27\u51e0\u91cc\u5f97\uff0c\\(p = 1\\) \u5f97\u5230\u66fc\u54c8\u987f\uff0c\u800c\u5f53 \\(p \\to \\infty\\) \u65f6\u5f97\u5230\u6700\u5927\u8303\u6570\u3002\u968f\u7740 \\(p\\) \u589e\u5927\uff0c\u6700\u5927\u5206\u91cf\u8d21\u732e\u8d8a\u6765\u8d8a\u5927\uff0c\u76f4\u5230\u6700\u7ec8\u53ea\u6709\u5b83\u91cd\u8981\u3002
\u6bcf\u4e2a\u8303\u6570\u5fc5\u987b\u9075\u5b88\u4e09\u6761\u89c4\u5219\uff1a
\u975e\u8d1f\u6027\uff1a\\(\\|\\mathbf{v}\\| \\geq 0\\)\uff0c\u4e14 \\(\\|\\mathbf{v}\\| = 0\\) \u4ec5\u5f53 \\(\\mathbf{v} = \\mathbf{0}\\)\u3002\u5927\u5c0f\u4ece\u4e0d\u4e3a\u8d1f\uff0c\u53ea\u6709\u96f6\u5411\u91cf\u7684\u5927\u5c0f\u4e3a\u96f6\u3002
\u7f29\u653e\u6027\uff1a\\(\\|c\\mathbf{v}\\| = |c| \\cdot \\|\\mathbf{v}\\|\\)\u3002\u5c06\u5411\u91cf\u52a0\u500d\uff0c\u5176\u5927\u5c0f\u4e5f\u52a0\u500d\u3002
\u4e09\u89d2\u4e0d\u7b49\u5f0f\uff1a\\(\\|\\mathbf{u} + \\mathbf{v}\\| \\leq \\|\\mathbf{u}\\| + \\|\\mathbf{v}\\|\\)\u3002\u6377\u5f84\u6c38\u8fdc\u4e0d\u4f1a\u6bd4\u7ed5\u8fdc\u8def\u66f4\u957f\u3002
\u73b0\u5728\uff0c\u5ea6\u91cf\u8861\u91cf\u4e24\u4e2a\u5411\u91cf\u4e4b\u95f4\u7684\u8ddd\u79bb\u3002\u628a\u5b83\u60f3\u8c61\u6210\u95ee\uff1a\"\u8fd9\u4e24\u4e2a\u70b9\u76f8\u8ddd\u591a\u8fdc\uff1f\"
\u83b7\u5f97\u5ea6\u91cf\u7684\u6700\u7b80\u5355\u65b9\u6cd5\u662f\u4f7f\u7528\u5dee\u503c\u7684\u8303\u6570\uff1a\\(d(\\mathbf{u}, \\mathbf{v}) = \\|\\mathbf{u} - \\mathbf{v}\\|\\)\u3002\u51cf\u53bb\u4e24\u4e2a\u5411\u91cf\uff0c\u7136\u540e\u6d4b\u91cf\u5269\u4f59\u90e8\u5206\u7684\u5927\u5c0f\u3002
\u4f7f\u7528\u6b27\u51e0\u91cc\u5f97\u8303\u6570\uff0c\u6211\u4eec\u5f97\u5230\u719f\u6089\u7684\u6b27\u51e0\u91cc\u5f97\u8ddd\u79bb\uff1a
\u4f7f\u7528\u66fc\u54c8\u987f\u8303\u6570\u5f97\u5230\u66fc\u54c8\u987f\u8ddd\u79bb\uff0c\u6cbf\u7740\u6bcf\u4e2a\u8f74\u7684\u603b\u5dee\u5f02\uff0c\u5c31\u50cf\u8ba1\u7b97\u4e24\u4e2a\u4f4d\u7f6e\u4e4b\u95f4\u7684\u57ce\u5e02\u8857\u533a\u6570\u3002
\u6bcf\u4e2a\u5ea6\u91cf\u5fc5\u987b\u9075\u5b88\u56db\u6761\u89c4\u5219\uff1a
\u975e\u8d1f\u6027\uff1a\\(d(\\mathbf{u}, \\mathbf{v}) \\geq 0\\)\u3002\u8ddd\u79bb\u4ece\u4e0d\u4e3a\u8d1f\u3002
\u540c\u4e00\u6027\uff1a\\(d(\\mathbf{u}, \\mathbf{v}) = 0\\) \u5f53\u4e14\u4ec5\u5f53 \\(\\mathbf{u} = \\mathbf{v}\\)\u3002\u96f6\u8ddd\u79bb\u610f\u5473\u7740\u540c\u4e00\u70b9\u3002
\u5bf9\u79f0\u6027\uff1a\\(d(\\mathbf{u}, \\mathbf{v}) = d(\\mathbf{v}, \\mathbf{u})\\)\u3002\u4ece A \u5230 B \u7684\u8ddd\u79bb\u4e0e\u4ece B \u5230 A \u7684\u8ddd\u79bb\u76f8\u540c\u3002
\u4e09\u89d2\u4e0d\u7b49\u5f0f\uff1a\\(d(\\mathbf{u}, \\mathbf{w}) \\leq d(\\mathbf{u}, \\mathbf{v}) + d(\\mathbf{v}, \\mathbf{w})\\)\u3002\u76f4\u63a5\u8d70\u6c38\u8fdc\u4e0d\u4f1a\u6bd4\u7ed5\u8def\u66f4\u957f\u3002
\u90a3\u4e48\u4e24\u8005\u4e4b\u95f4\u7684\u5173\u7cfb\u662f\u4ec0\u4e48\uff1f\u8303\u6570\u8861\u91cf\u4e00\u4e2a\u5411\u91cf\uff0c\u5ea6\u91cf\u8861\u91cf\u4e24\u4e2a\u5411\u91cf\u4e4b\u95f4\u7684\u5dee\u8ddd\u3002\u6bcf\u4e2a\u8303\u6570\u81ea\u7136\u5730\u521b\u5efa\u4e00\u4e2a\u5ea6\u91cf\uff08\u901a\u8fc7\u6d4b\u91cf\u5dee\u503c\uff09\uff0c\u4f46\u5e76\u975e\u6bcf\u4e2a\u5ea6\u91cf\u90fd\u6765\u81ea\u8303\u6570\u3002
\u4f8b\u5982\uff0c\u6c49\u660e\u8ddd\u79bb\u8ba1\u7b97\u4e24\u4e2a\u5411\u91cf\u4e0d\u540c\u7684\u4f4d\u7f6e\u6570\u91cf\u3002\u5b83\u662f\u4e00\u4e2a\u6709\u6548\u7684\u5ea6\u91cf\uff0c\u4f46\u5e76\u975e\u6765\u81ea\u4efb\u4f55\u8303\u6570\u3002
\u5728 ML \u4e2d\uff0c\u9009\u62e9\u5408\u9002\u7684\u8303\u6570\u6216\u5ea6\u91cf\u5f88\u91cd\u8981\u3002
L2 \u8ddd\u79bb\u5728\u6c42\u548c\u524d\u5bf9\u6bcf\u4e2a\u5dee\u503c\u5e73\u65b9\uff0c\u56e0\u6b64\u5355\u4e2a\u5927\u7684\u5dee\u503c\u4f1a\u4e3b\u5bfc\u7ed3\u679c\u3002
L1 \u8ddd\u79bb\u5bf9\u7edd\u5bf9\u5dee\u503c\u6c42\u548c\uff0c\u5e73\u7b49\u5bf9\u5f85\u6bcf\u4e2a\u5dee\u503c\u3002\u4e0e L2 \u76f8\u6bd4\uff0c\u5355\u4e2a\u5927\u7684\u5dee\u503c\u5f71\u54cd\u8f83\u5c0f\u3002
\u8ba1\u7b97\u540c\u4e00\u5411\u91cf\u7684 L1 \u548c L2 \u8303\u6570\u3002\u5c1d\u8bd5\u66f4\u6539\u503c\uff0c\u6ce8\u610f\u54ea\u4e2a\u8303\u6570\u5bf9\u5927\u7684\u5206\u91cf\u6700\u654f\u611f\uff0c\u54ea\u4e2a\u5bf9\u8bb8\u591a\u5c0f\u5206\u91cf\u6700\u654f\u611f\u3002\u7136\u540e\u5c1d\u8bd5\u8ba1\u7b97 p \u503c\u9012\u589e\uff08\u4f8b\u5982 1\u30012\u30015\u300110\u300150\u3001100\uff09\u65f6\u7684 Lp \u8303\u6570\uff0c\u89c2\u5bdf\u5b83\u5982\u4f55\u6536\u655b\u5230 L-\u65e0\u7a77\u503c\u3002
import jax.numpy as jnp\n\nv = jnp.array([3.0, -4.0, 1.0])\n\nl1 = jnp.sum(jnp.abs(v))\nl2 = jnp.sqrt(jnp.sum(v ** 2))\n\nprint(f\"L1: {l1}, L2: {l2:.2f}\")\n \u8ba1\u7b97\u4e24\u4e2a\u5411\u91cf\u4e4b\u95f4\u7684\u6b27\u51e0\u91cc\u5f97\u8ddd\u79bb\u548c\u66fc\u54c8\u987f\u8ddd\u79bb\u3002\u5c1d\u8bd5\u8ba9\u5411\u91cf\u5f7c\u6b64\u9760\u8fd1\u6216\u8fdc\u79bb\uff0c\u89c2\u5bdf\u6bcf\u79cd\u8ddd\u79bb\u5982\u4f55\u4e0d\u540c\u5730\u54cd\u5e94\u3002
import jax.numpy as jnp\n\nu = jnp.array([1.0, 2.0, 3.0])\nv = jnp.array([4.0, 0.0, 1.0])\n\neuclidean = jnp.sqrt(jnp.sum((u - v) ** 2))\nmanhattan = jnp.sum(jnp.abs(u - v))\n\nprint(f\"Euclidean: {euclidean:.2f}, Manhattan: {manhattan}\")\n \u5411\u91cf\u79ef\u662f\u8861\u91cf\u76f8\u4f3c\u6027\u548c\u8ba1\u7b97\u6295\u5f71\u7684\u57fa\u672c\u8fd0\u7b97\u3002\u672c\u6587\u6db5\u76d6\u5185\u79ef\u3001\u70b9\u79ef\u3001\u4f59\u5f26\u76f8\u4f3c\u5ea6\u3001\u53c9\u79ef\u548c\u5916\u79ef\uff0c\u8fd9\u4e9b\u8fd0\u7b97\u652f\u6491\u4e86 AI \u4e2d\u7684\u6ce8\u610f\u529b\u673a\u5236\u3001\u5d4c\u5165\u548c\u51e0\u4f55\u63a8\u7406\u3002
\u6211\u4eec\u5df2\u7ecf\u770b\u5230\u5982\u4f55\u76f8\u52a0\u548c\u7f29\u653e\u5411\u91cf\u3002\u4f46\u662f\u6211\u4eec\u53ef\u4ee5\u76f8\u4e58\u4e24\u4e2a\u5411\u91cf\u5417\uff1f\u4e8b\u5b9e\u8bc1\u660e\u4e0d\u6b62\u4e00\u79cd\u65b9\u6cd5\uff0c\u6bcf\u79cd\u65b9\u6cd5\u56de\u7b54\u4e0d\u540c\u7684\u95ee\u9898\u3002
\u5185\u79ef\u662f\u4e00\u4e2a\u5e7f\u4e49\u6982\u5ff5\uff1a\u4e00\u4e2a\u63a5\u53d7\u4e24\u4e2a\u5411\u91cf\u5e76\u4ea7\u751f\u4e00\u4e2a\u6807\u91cf\u7684\u51fd\u6570\u3002\u5b83\u662f\"\u76f8\u4e58\"\u5411\u91cf\u7684\u62bd\u8c61\u84dd\u56fe\u3002
\u4efb\u4f55\u5185\u79ef\u5fc5\u987b\u6ee1\u8db3\u4e09\u6761\u89c4\u5219\uff1a
\u6b63\u5b9a\u6027\uff1a\\(\\langle \\mathbf{v}, \\mathbf{v} \\rangle \\geq 0\\)\uff0c\u4e14\u4ec5\u5bf9\u96f6\u5411\u91cf\u7b49\u4e8e\u96f6\u3002\u5411\u91cf\u4e0e\u81ea\u8eab\u76f8\u4e58\u603b\u662f\u7ed9\u51fa\u975e\u8d1f\u7ed3\u679c\u3002
\u5bf9\u79f0\u6027\uff1a\\(\\langle \\mathbf{u}, \\mathbf{v} \\rangle = \\langle \\mathbf{v}, \\mathbf{u} \\rangle\\)\u3002\u987a\u5e8f\u65e0\u5173\u7d27\u8981\u3002
\u7ebf\u6027\u6027\uff1a\\(\\langle a\\mathbf{u} + b\\mathbf{v}, \\mathbf{w} \\rangle = a\\langle \\mathbf{u}, \\mathbf{w} \\rangle + b\\langle \\mathbf{v}, \\mathbf{w} \\rangle\\)\u3002\u5b83\u5bf9\u52a0\u6cd5\u548c\u7f29\u653e\u5177\u6709\u5206\u914d\u6027\u3002
\u70b9\u79ef\u662f\u6700\u5e38\u89c1\u7684\u5185\u79ef\u3002\u5b83\u662f\u4f60\u51e0\u4e4e\u5230\u5904\u90fd\u4f1a\u7528\u5230\u7684\u5177\u4f53\u7248\u672c\u3002\u5bf9\u4e8e\u4e24\u4e2a\u5411\u91cf \\(\\mathbf{a} = (a_1, a_2, \\ldots, a_n)\\) \u548c \\(\\mathbf{b} = (b_1, b_2, \\ldots, b_n)\\)\uff1a
\u5c06\u5339\u914d\u7684\u5206\u91cf\u76f8\u4e58\uff0c\u7136\u540e\u5168\u90e8\u52a0\u8d77\u6765\u3002\u8fd9\u5c31\u662f\u5168\u90e8\u3002
\u4f46\u8fd9\u4e2a\u6570\u5b57\u610f\u5473\u7740\u4ec0\u4e48\uff1f\u70b9\u79ef\u6709\u4e00\u4e2a\u4f18\u7f8e\u7684\u51e0\u4f55\u89e3\u91ca\uff1a
\u8fd9\u5c06\u70b9\u79ef\u76f4\u63a5\u4e0e\u4e24\u4e2a\u5411\u91cf\u4e4b\u95f4\u7684\u89d2\u5ea6 \\(\\theta\\) \u8054\u7cfb\u8d77\u6765\u3002\u7ed3\u679c\u544a\u8bc9\u4f60\u4e24\u4e2a\u5411\u91cf\u5728\u65b9\u5411\u4e0a\"\u4e00\u81f4\"\u7684\u7a0b\u5ea6\u3002
\u5982\u679c\u5b83\u4eec\u6307\u5411\u76f8\u540c\u65b9\u5411\uff08\\(\\theta = 0\u00b0\\)\uff09\uff0c\\(\\cos(\\theta) = 1\\) \u4e14\u70b9\u79ef\u6700\u5927\u3002
\u5982\u679c\u5b83\u4eec\u6b63\u4ea4\uff08\\(\\theta = 90\u00b0\\)\uff09\uff0c\\(\\cos(\\theta) = 0\\) \u4e14\u70b9\u79ef\u6070\u597d\u4e3a\u96f6\u3002\u8fd9\u7ed9\u51fa\u4e86\u6b63\u4ea4\u6027\u7684\u7cbe\u786e\u68c0\u9a8c\u3002
\u5982\u679c\u5b83\u4eec\u6307\u5411\u76f8\u53cd\u65b9\u5411\uff08\\(\\theta = 180\u00b0\\)\uff09\uff0c\\(\\cos(\\theta) = -1\\) \u4e14\u70b9\u79ef\u4e3a\u8d1f\u3002
\u5411\u91cf\u4e0e\u81ea\u8eab\u7684\u70b9\u79ef\u7ed9\u51fa\u5176\u6a21\u957f\u7684\u5e73\u65b9\uff1a\\(\\mathbf{a} \\cdot \\mathbf{a} = \\|\\mathbf{a}\\|^2\\)\u3002
\u70b9\u79ef\u8fd8\u7ed9\u51fa\u4e86\u6295\u5f71\uff0c\u5373\u4e00\u4e2a\u5411\u91cf\u5728\u53e6\u4e00\u4e2a\u5411\u91cf\u4e0a\u6295\u4e0b\u7684\u5f71\u5b50\u3002\\(\\mathbf{a}\\) \u5728 \\(\\mathbf{b}\\) \u4e0a\u7684\u6295\u5f71\u4e3a\uff1a
\u60f3\u8c61\u4e00\u675f\u5149\u7ebf\u76f4\u5c04\u5230 \\(\\mathbf{b}\\) \u4e0a\u3002\\(\\mathbf{a}\\) \u5728\u90a3\u6761\u7ebf\u4e0a\u7684\u5f71\u5b50\u5c31\u662f\u6295\u5f71\u3002\u5b83\u544a\u8bc9\u4f60 \\(\\mathbf{a}\\) \u6709\u591a\u5c11\u4f4d\u4e8e \\(\\mathbf{b}\\) \u7684\u65b9\u5411\u4e0a\u3002
\u4f59\u5f26\u76f8\u4f3c\u5ea6\u901a\u8fc7\u9664\u4ee5\u4e24\u4e2a\u6a21\u957f\u6765\u5f52\u4e00\u5316\u70b9\u79ef\uff1a
\u8fd9\u4f1a\u7ed9\u51fa\u4e00\u4e2a\u4ecb\u4e8e \\(-1\\) \u548c \\(1\\) \u4e4b\u95f4\u7684\u503c\uff0c\u8861\u91cf\u65b9\u5411\u5bf9\u9f50\u7a0b\u5ea6\uff0c\u5ffd\u7565\u5411\u91cf\u7684\u957f\u5ea6\u3002\u5b83\u5e7f\u6cdb\u5e94\u7528\u4e8e ML \u4e2d\u6765\u6bd4\u8f83\u6587\u6863\u3001\u5d4c\u5165\u548c\u7528\u6237\u504f\u597d\u7b49\u4e8b\u7269\u3002
\u73b0\u5728\uff0c\u70b9\u79ef\u63a5\u53d7\u4e24\u4e2a\u5411\u91cf\u5e76\u8fd4\u56de\u6807\u91cf\u3002\u53c9\u79ef\u5219\u76f8\u53cd\uff0c\u5b83\u63a5\u53d7\u4e24\u4e2a\u5411\u91cf\u5e76\u8fd4\u56de\u4e00\u4e2a\u65b0\u5411\u91cf\u3002
\u53c9\u79ef \\(\\mathbf{a} \\times \\mathbf{b}\\) \u4ea7\u751f\u4e00\u4e2a\u540c\u65f6\u5782\u76f4\u4e8e \\(\\mathbf{a}\\) \u548c \\(\\mathbf{b}\\) \u7684\u5411\u91cf\uff1a
\u53c9\u79ef\u53ea\u9002\u7528\u4e8e\u4e09\u7ef4\u3002\u70b9\u79ef\u9002\u7528\u4e8e\u4efb\u610f\u7ef4\u5ea6\uff0c\u800c\u53c9\u79ef\u662f\u4e09\u7ef4\u7a7a\u95f4\u7279\u6709\u7684\u3002
\u5176\u6a21\u957f\u7b49\u4e8e\u7531\u8fd9\u4e24\u4e2a\u5411\u91cf\u5f62\u6210\u7684\u5e73\u884c\u56db\u8fb9\u5f62\u7684\u9762\u79ef\uff1a
\u6ce8\u610f\u6a21\u5f0f\uff1a\u70b9\u79ef\u4f7f\u7528 \\(\\cos(\\theta)\\)\uff0c\u53c9\u79ef\u4f7f\u7528 \\(\\sin(\\theta)\\)\u3002\u70b9\u79ef\u8861\u91cf\u4e24\u4e2a\u5411\u91cf\u5bf9\u9f50\u7684\u7a0b\u5ea6\uff0c\u53c9\u79ef\u8861\u91cf\u5b83\u4eec\u5728\u65b9\u5411\u4e0a\u5dee\u5f02\u7684\u7a0b\u5ea6\u3002
\u7ed3\u679c\u7684\u65b9\u5411\u9075\u5faa\u53f3\u624b\u5b9a\u5219\uff1a\u5c06\u53f3\u624b\u7684\u624b\u6307\u4ece \\(\\mathbf{a}\\) \u5f2f\u5411 \\(\\mathbf{b}\\)\uff0c\u62c7\u6307\u6307\u5411 \\(\\mathbf{a} \\times \\mathbf{b}\\) \u7684\u65b9\u5411\u3002
\u4e0e\u70b9\u79ef\u4e0d\u540c\uff0c\u53c9\u79ef\u4e0d\u53ef\u4ea4\u6362\uff1a\\(\\mathbf{a} \\times \\mathbf{b} = -(\\mathbf{b} \\times \\mathbf{a})\\)\u3002\u4ea4\u6362\u987a\u5e8f\u4f1a\u7ffb\u8f6c\u65b9\u5411\u3002
\u5982\u679c\u4e24\u4e2a\u5411\u91cf\u5e73\u884c\uff0c\u5b83\u4eec\u7684\u53c9\u79ef\u662f\u96f6\u5411\u91cf\uff08\u56e0\u4e3a \\(\\sin(0\u00b0) = 0\\)\uff09\u3002\u6ca1\u6709\u9762\u79ef\uff0c\u6ca1\u6709\u5782\u76f4\u65b9\u5411\u3002
\u5f53\u4f60\u4f7f\u7528\u4e24\u4e2a\u4e58\u79ef\u7ed3\u5408\u4e09\u4e2a\u5411\u91cf\u4f1a\u53d1\u751f\u4ec0\u4e48\uff1f\u8fd9\u5c31\u5f97\u5230\u4e86\u4e09\u91cd\u79ef\u3002
xxxxxxxxxx9\u00a01import jax.numpy as jnp2\u200b3u = jnp.array([1.0, 2.0, 3.0])4v = jnp.array([4.0, 0.0, 1.0])5\u200b6euclidean = jnp.sqrt(jnp.sum((u - v) ** 2))7manhattan = jnp.sum(jnp.abs(u - v))8\u200b9print(f\"Euclidean: {euclidean:.2f}, Manhattan: {manhattan}\")python
\u5982\u679c\u6807\u91cf\u4e09\u91cd\u79ef\u4e3a\u96f6\uff0c\u5219\u8fd9\u4e09\u4e2a\u5411\u91cf\u5171\u9762\uff0c\u5b83\u4eec\u90fd\u4f4d\u4e8e\u540c\u4e00\u4e2a\u5e73\u5766\u5e73\u9762\u4e0a\uff0c\u4e0d\u5f62\u6210\u4f53\u79ef\u3002
\u987a\u5e8f\u53ef\u4ee5\u5faa\u73af\u800c\u4e0d\u6539\u53d8\u7ed3\u679c\uff1a\\(\\mathbf{a} \\cdot (\\mathbf{b} \\times \\mathbf{c}) = \\mathbf{b} \\cdot (\\mathbf{c} \\times \\mathbf{a}) = \\mathbf{c} \\cdot (\\mathbf{a} \\times \\mathbf{b})\\)\u3002
\u5411\u91cf\u4e09\u91cd\u79ef \\(\\mathbf{a} \\times (\\mathbf{b} \\times \\mathbf{c})\\) \u5e94\u7528\u4e24\u6b21\u53c9\u79ef\u5e76\u8fd4\u56de\u4e00\u4e2a\u5411\u91cf\u3002\u5b83\u53ef\u4ee5\u4f7f\u7528\u6052\u7b49\u5f0f\u7b80\u6d01\u5c55\u5f00\uff1a
\u8ba1\u7b97\u4e24\u4e2a\u5411\u91cf\u7684\u70b9\u79ef\u5e76\u7528\u5b83\u6c42\u51fa\u5b83\u4eec\u4e4b\u95f4\u7684\u89d2\u5ea6\u3002\u5c1d\u8bd5\u8ba9\u5b83\u4eec\u6b63\u4ea4\u3001\u5e73\u884c\u6216\u53cd\u5411\uff0c\u89c2\u5bdf\u89d2\u5ea6\u5982\u4f55\u53d8\u5316\u3002
import jax.numpy as jnp\n\na = jnp.array([1.0, 2.0, 3.0])\nb = jnp.array([4.0, -1.0, 2.0])\n\ndot = jnp.dot(a, b)\nangle = jnp.arccos(dot / (jnp.linalg.norm(a) * jnp.linalg.norm(b)))\n\nprint(f\"Dot product: {dot}\")\nprint(f\"Angle: {jnp.degrees(angle):.1f}\u00b0\")\n \u8ba1\u7b97\u4e24\u4e2a\u4e09\u7ef4\u5411\u91cf\u7684\u53c9\u79ef\uff0c\u5e76\u901a\u8fc7\u68c0\u67e5\u7ed3\u679c\u4e0e\u6bcf\u4e2a\u539f\u59cb\u5411\u91cf\u7684\u70b9\u79ef\u4e3a\u96f6\u6765\u9a8c\u8bc1\u7ed3\u679c\u5782\u76f4\u4e8e\u4e24\u8005\u3002
import jax.numpy as jnp\n\na = jnp.array([1.0, 0.0, 0.0])\nb = jnp.array([0.0, 1.0, 0.0])\n\ncross = jnp.cross(a, b)\n\nprint(f\"a x b = {cross}\")\nprint(f\"Perpendicular to a: {jnp.dot(cross, a) == 0}\")\nprint(f\"Perpendicular to b: {jnp.dot(cross, b) == 0}\")\n \u57fa\u5b9a\u4e49\u4e86\u5411\u91cf\u7a7a\u95f4\u7684\u5750\u6807\u7cfb\uff0c\u800c\u5bf9\u5076\u6027\u63ed\u793a\u4e86\u7ebf\u6027\u51fd\u6570\u5982\u4f55\u4f5c\u7528\u4e8e\u5411\u91cf\u3002\u672c\u6587\u6db5\u76d6\u7ebf\u6027\u65e0\u5173\u6027\u3001\u751f\u6210\u96c6\u3001\u57fa\u53d8\u6362\u3001\u5bf9\u5076\u7a7a\u95f4\u548c\u4f59\u5411\u91cf\uff0c\u8fd9\u4e9b\u6982\u5ff5\u652f\u6491\u4e86 ML \u4e2d\u7684 PCA\u3001\u7279\u5f81\u53d8\u6362\u548c\u6ce8\u610f\u529b\u67e5\u8be2\u3002
\u6211\u4eec\u5df2\u7ecf\u770b\u5230\u5411\u91cf\u5b58\u5728\u4e8e\u5177\u6709\u4e00\u5b9a\u7ef4\u5ea6\u6570\u7684\u7a7a\u95f4\u4e2d\u3002\u4f46\u4ec0\u4e48\u5b9a\u4e49\u4e86\u8fd9\u4e9b\u7ef4\u5ea6\uff1f\u8fd9\u5c31\u662f\u57fa\u5411\u91cf\u53d1\u6325\u4f5c\u7528\u7684\u5730\u65b9\u3002
\u57fa\u662f\u4e00\u7ec4\u5411\u91cf\uff0c\u53ef\u4ee5\u901a\u8fc7\u7f29\u653e\u548c\u76f8\u52a0\uff08\u7ebf\u6027\u7ec4\u5408\uff09\u6784\u5efa\u7a7a\u95f4\u4e2d\u7684\u6bcf\u4e2a\u5176\u4ed6\u5411\u91cf\uff0c\u4e14\u6ca1\u6709\u5197\u4f59\u3002\u5b83\u4eec\u662f\u7a7a\u95f4\u7684\u6784\u5efa\u5757\u3002
\u57fa\u5fc5\u987b\u6ee1\u8db3\u4e24\u4e2a\u6761\u4ef6\uff1a
\u7ebf\u6027\u65e0\u5173\uff1a\u6ca1\u6709\u57fa\u5411\u91cf\u80fd\u4ece\u5176\u4ed6\u57fa\u5411\u91cf\u6784\u9020\u51fa\u6765\u3002\u6bcf\u4e2a\u90fd\u8d21\u732e\u4e86\u4e00\u4e2a\u771f\u6b63\u7684\u65b0\u65b9\u5411\u3002
\u751f\u6210\u6027\uff1a\u7a7a\u95f4\u4e2d\u7684\u6bcf\u4e2a\u5411\u91cf\u90fd\u53ef\u4ee5\u8868\u793a\u4e3a\u57fa\u5411\u91cf\u7684\u7ec4\u5408\u3002\u6ca1\u6709\u4efb\u4f55\u9057\u6f0f\u3002
\u57fa\u4e2d\u7684\u5411\u91cf\u6570\u91cf\u7b49\u4e8e\u7a7a\u95f4\u7684\u7ef4\u5ea6\u3002\u5728 \\(\\mathbb{R}^2\\) \u4e2d\u4f60\u9700\u8981 2 \u4e2a\uff0c\u5728 \\(\\mathbb{R}^3\\) \u4e2d\u4f60\u9700\u8981 3 \u4e2a\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002
\u6700\u81ea\u7136\u7684\u57fa\u662f\u6807\u51c6\u57fa\uff0c\u5373\u6cbf\u6bcf\u4e2a\u8f74\u7684\u5355\u4f4d\u5411\u91cf\uff1a
\u4efb\u4f55\u5411\u91cf\u90fd\u662f\u8fd9\u4e9b\u57fa\u5411\u91cf\u7684\u52a0\u6743\u548c\u3002\u5411\u91cf \\((3, 2)\\) \u5b9e\u9645\u4e0a\u662f \\(3\\hat{\\mathbf{i}} + 2\\hat{\\mathbf{j}}\\)\u3002\u6743\u91cd\uff083 \u548c 2\uff09\u662f\u8be5\u57fa\u4e0b\u5411\u91cf\u7684\u5750\u6807\u3002
\u4f46\u6807\u51c6\u57fa\u5e76\u4e0d\u662f\u552f\u4e00\u6709\u6548\u7684\u57fa\u3002\u5728 \\(\\mathbb{R}^2\\) \u4e2d\uff0c\u5411\u91cf \\((1, 1)\\) \u548c \\((-1, 1)\\) \u4e5f\u6784\u6210\u57fa\u3002\u5b83\u4eec\u7ebf\u6027\u65e0\u5173\uff0c\u5e76\u4e14\u53ef\u4ee5\u5230\u8fbe\u5e73\u9762\u4e0a\u7684\u4efb\u4f55\u70b9\u3002\u540c\u4e00\u4e2a\u5411\u91cf\u5728\u8fd9\u4e2a\u65b0\u57fa\u4e0b\u53ea\u662f\u6709\u4e0d\u540c\u7684\u5750\u6807\u3002
\u57fa\u53d8\u6362\u4f7f\u7528\u4e0d\u540c\u7684\u6784\u5efa\u5757\u91cd\u65b0\u8868\u8fbe\u540c\u4e00\u4e2a\u5411\u91cf\u3002\u5411\u91cf\u6ca1\u6709\u79fb\u52a8\uff0c\u6211\u4eec\u53ea\u662f\u4ece\u4e0d\u540c\u7684\u89d2\u5ea6\u63cf\u8ff0\u5b83\u3002
\u8fd9\u662f\u901a\u8fc7\u4e58\u4ee5\u4e00\u4e2a\u57fa\u53d8\u6362\u77e9\u9635 \\(P\\) \u6765\u5b8c\u6210\u7684\uff0c\u5176\u5217\u662f\u7528\u65e7\u5750\u6807\u8868\u793a\u7684\u65b0\u57fa\u5411\u91cf\u3002\u8981\u53d8\u56de\u53bb\uff0c\u4e58\u4ee5 \\(P^{-1}\\)\u3002
\u5728 ML \u4e2d\uff0c\u57fa\u53d8\u6362\u7ecf\u5e38\u51fa\u73b0\u3002\u4f8b\u5982\uff0cPCA \u627e\u5230\u4e00\u4e2a\u65b0\u57fa\uff08\u4e3b\u6210\u5206\uff09\uff0c\u5728\u8be5\u57fa\u4e0b\u6570\u636e\u66f4\u5bb9\u6613\u7406\u89e3\uff0c\u5750\u6807\u8f74\u4e0e\u6700\u5927\u53d8\u5316\u65b9\u5411\u5bf9\u9f50\u3002
\u73b0\u5728\uff0c\u8fd9\u91cc\u9690\u85cf\u7740\u4e00\u4e2a\u66f4\u6df1\u5c42\u7684\u60f3\u6cd5\u3002\u5f53\u6211\u4eec\u5199 \\(\\mathbf{v} = (3, 2)\\) \u65f6\uff0c\u5750\u6807 3 \u548c 2 \u5b9e\u9645\u4e0a\u662f\u6cbf\u7740\u6bcf\u4e2a\u57fa\u65b9\u5411\"\u6d4b\u91cf\" \\(\\mathbf{v}\\) \u7684\u7ed3\u679c\u3002\u7b2c\u4e00\u4e2a\u5750\u6807\u95ee\"\\(\\hat{\\mathbf{i}}\\) \u5728 \\(\\mathbf{v}\\) \u4e2d\u6709\u591a\u5c11\uff1f\"\uff0c\u7b2c\u4e8c\u4e2a\u95ee\"\\(\\hat{\\mathbf{j}}\\) \u5462\uff1f\"
\u8fd9\u4e9b\u6d4b\u91cf\u4e2d\u7684\u6bcf\u4e00\u4e2a\u90fd\u662f\u4e00\u4e2a\u7ebf\u6027\u6cdb\u51fd\uff0c\u4e00\u4e2a\u63a5\u53d7\u5411\u91cf\u5e76\u8fd4\u56de\u5355\u4e2a\u6807\u91cf\u7684\u51fd\u6570\u3002\u6240\u6709\u8fd9\u6837\u7684\u7ebf\u6027\u6cdb\u51fd\u7684\u96c6\u5408\u6784\u6210\u4e86\u5bf9\u5076\u7a7a\u95f4 \\(V^\\ast\\)\u3002
\u8fd9\u6837\u60f3\uff1a\u5411\u91cf\u662f\u88ab\u6d4b\u5bf9\u8c61\uff0c\u7ebf\u6027\u6cdb\u51fd\u662f\u6d4b\u91cf\u5b83\u4eec\u7684\u6807\u5c3a\u3002\u5bf9\u5076\u7a7a\u95f4\u662f\u6240\u6709\u53ef\u80fd\u7684\u6807\u5c3a\u7684\u96c6\u5408\u3002
\u5bf9\u4e8e\u6bcf\u4e2a\u57fa \\(\\{\\mathbf{e}_1, \\mathbf{e}_2, \\ldots, \\mathbf{e}_n\\}\\)\uff0c\u5b58\u5728\u4e00\u4e2a\u5bf9\u5e94\u7684\u5bf9\u5076\u57fa \\(\\{\\mathbf{e}_1^\\ast, \\mathbf{e}_2^\\ast, \\ldots, \\mathbf{e}_n^\\ast\\}\\)\u3002\u6bcf\u4e2a\u5bf9\u5076\u57fa\u5411\u91cf\u6070\u597d\u63d0\u53d6\u4e00\u4e2a\u5750\u6807\uff1a
\\(\\mathbf{e}_1^\\ast\\) \u4f5c\u7528\u4e8e \\(\\mathbf{e}_1\\) \u65f6\u8fd4\u56de 1\uff0c\u5bf9\u5176\u5b83\u6240\u6709\u5411\u91cf\u8fd4\u56de 0\u3002\u5b83\u5b8c\u7f8e\u5730\u9694\u79bb\u4e86\u7b2c\u4e00\u4e2a\u5750\u6807\u3002
\u70b9\u79ef\u8fde\u63a5\u4e86\u8fd9\u4e24\u4e2a\u4e16\u754c\u3002\u5f53\u4f60\u8ba1\u7b97 \\(\\mathbf{u} \\cdot \\mathbf{v}\\) \u65f6\uff0c\u4f60\u53ef\u4ee5\u628a\u5176\u4e2d\u4e00\u4e2a\u5411\u91cf\u770b\u4f5c\"\u6807\u5c3a\"\u5728\u6d4b\u91cf\u53e6\u4e00\u4e2a\u5411\u91cf\u3002\u70b9\u79ef \\(\\mathbf{u} \\cdot \\mathbf{v}\\) \u7b49\u540c\u4e8e\u5c06\u7531 \\(\\mathbf{u}\\) \u5b9a\u4e49\u7684\u7ebf\u6027\u6cdb\u51fd\u5e94\u7528\u4e8e\u5411\u91cf \\(\\mathbf{v}\\)\u3002
\u8fd9\u610f\u5473\u7740\u6bcf\u4e2a\u5411\u91cf\u90fd\u9690\u542b\u5730\u5b9a\u4e49\u4e86\u4e00\u4e2a\u7ebf\u6027\u6cdb\u51fd\uff0c\u5e76\u4e14\u6bcf\u4e2a\u7ebf\u6027\u6cdb\u51fd\u90fd\u53ef\u4ee5\u7528\u4e00\u4e2a\u5411\u91cf\u8868\u793a\u3002\u5728\u6709\u9650\u7ef4\u7a7a\u95f4\u4e2d\uff0c\u5bf9\u5076\u7a7a\u95f4\u672c\u8d28\u4e0a\u662f\u539f\u59cb\u7a7a\u95f4\u7684\u955c\u50cf\u3002
\u5bf9\u5076\u6027\u73b0\u5728\u53ef\u80fd\u770b\u8d77\u6765\u5f88\u62bd\u8c61\uff0c\u4f46\u5b83\u652f\u6491\u7740\u8bb8\u591a\u5b9e\u9645\u7684\u6982\u5ff5\uff1a\u5750\u6807\u662f\u5bf9\u5076\u57fa\u7684\u8bc4\u4f30\uff0c\u70b9\u79ef\u662f\u5bf9\u5076\u914d\u5bf9\uff0c\u800c\u795e\u7ecf\u7f51\u7edc\u4e2d\u7684\u6ce8\u610f\u529b\u7b49\u53d8\u6362\u901a\u8fc7\u8ba9\u4e00\u7ec4\u5411\u91cf\"\u67e5\u8be2\"\u53e6\u4e00\u7ec4\u5411\u91cf\u6765\u8fd0\u4f5c\uff0c\u8fd9\u6b63\u662f\u5bf9\u5076\u6027\u5728\u8d77\u4f5c\u7528\u3002
\u5728\u4e24\u4e2a\u4e0d\u540c\u7684\u57fa\u4e2d\u8868\u8fbe\u4e00\u4e2a\u5411\u91cf\uff0c\u5e76\u9a8c\u8bc1\u5b83\u4eec\u4ee3\u8868\u540c\u4e00\u4e2a\u70b9\u3002\u5c1d\u8bd5\u521b\u5efa\u4f60\u81ea\u5df1\u7684\u57fa\uff0c\u89c2\u5bdf\u5411\u91cf\u5f97\u5230\u4ec0\u4e48\u5750\u6807\u3002
import jax.numpy as jnp\n\nv = jnp.array([3.0, 2.0])\n\n# \u6807\u51c6\u57fa\uff1a\u5750\u6807\u5c31\u662f\u5206\u91cf\u672c\u8eab\nprint(f\"Standard basis coords: {v}\")\n\n# \u65b0\u57fa\uff1a(1,1) \u548c (-1,1)\nP = jnp.array([[1.0, -1.0],\n [1.0, 1.0]])\nnew_coords = jnp.linalg.solve(P, v)\nprint(f\"New basis coords: {new_coords}\")\n\n# \u9a8c\u8bc1\uff1a\u4ece\u65b0\u5750\u6807\u91cd\u5efa\nreconstructed = new_coords[0] * P[:, 0] + new_coords[1] * P[:, 1]\nprint(f\"Reconstructed: {reconstructed}\")\n \u9a8c\u8bc1\u5bf9\u5076\u57fa\u6027\u8d28\uff1a\u6bcf\u4e2a\u5bf9\u5076\u57fa\u5411\u91cf\u6070\u597d\u63d0\u53d6\u4e00\u4e2a\u5750\u6807\uff0c\u5bf9\u5176\u4ed6\u5411\u91cf\u8fd4\u56de\u96f6\u3002
import jax.numpy as jnp\n\n# R3 \u4e2d\u7684\u6807\u51c6\u57fa\ne1 = jnp.array([1.0, 0.0, 0.0])\ne2 = jnp.array([0.0, 1.0, 0.0])\ne3 = jnp.array([0.0, 0.0, 1.0])\n\nv = jnp.array([5.0, 3.0, 7.0])\n\n# \u6bcf\u4e2a\u70b9\u79ef\u63d0\u53d6\u4e00\u4e2a\u5750\u6807\nprint(f\"e1 \u00b7 v = {jnp.dot(e1, v)}\")\nprint(f\"e2 \u00b7 v = {jnp.dot(e2, v)}\")\nprint(f\"e3 \u00b7 v = {jnp.dot(e3, v)}\")\n \u77e9\u9635\u662f\u5b58\u50a8\u6570\u636e\u96c6\u3001\u7f16\u7801\u53d8\u6362\u548c\u5b9a\u4e49\u6bcf\u4e2a\u795e\u7ecf\u7f51\u7edc\u5c42\u7684\u6570\u636e\u7ed3\u6784\u3002\u672c\u6587\u6db5\u76d6\u77e9\u9635\u7ef4\u5ea6\u3001\u5143\u7d20\u3001\u8f6c\u7f6e\u3001\u8ff9\u3001\u884c\u5217\u5f0f\u3001\u9006\u3001\u79e9\u548c\u96f6\u7a7a\u95f4\uff0c\u8fd9\u4e9b\u662f\u8d2f\u7a7f\u7ebf\u6027\u4ee3\u6570\u548c ML \u7684\u57fa\u7840\u6027\u8d28\u3002
\u4f60\u4e5f\u53ef\u4ee5\u5c06\u77e9\u9635\u89c6\u4e3a\u5411\u91cf\u7684\u5806\u53e0\u3002
\u5982\u679c\u4e00\u4e2a\u4eba\u7531\u5411\u91cf \\([\\text{age}, \\text{height}, \\text{weight}]\\) \u63cf\u8ff0\uff0c\u90a3\u4e48\u4e09\u4e2a\u4eba\u5c31\u5f62\u6210\u4e00\u4e2a\u77e9\u9635\uff0c\u5176\u4e2d\u6bcf\u884c\u662f\u4e00\u4e2a\u4eba\uff1a
\u8fd9\u4e2a\u77e9\u9635\u6709 3 \u884c\u548c 3 \u5217\uff0c\u6240\u4ee5\u6211\u4eec\u79f0\u5b83\u4e3a \\(3 \\times 3\\) \u77e9\u9635\u3002
\u7f51\u683c\u4e2d\u7684\u6bcf\u4e2a\u6570\u5b57\u79f0\u4e3a\u4e00\u4e2a\u5143\u7d20\u6216\u6761\u76ee\uff0c\u7531\u5176\u884c\u5217\u6807\u8bc6\uff1a\\(A_{ij}\\) \u662f\u7b2c \\(i\\) \u884c\u7b2c \\(j\\) \u5217\u7684\u5143\u7d20\u3002
\u77e9\u9635\u7684\u8f6c\u7f6e\u6cbf\u5176\u5bf9\u89d2\u7ebf\u7ffb\u8f6c\uff0c\u5c06\u884c\u53d8\u4e3a\u5217\uff0c\u5217\u53d8\u4e3a\u884c\u3002\u5982\u679c \\(A\\) \u662f \\(m \\times n\\)\uff0c\u90a3\u4e48 \\(A^T\\) \u662f \\(n \\times m\\)\u3002
\u77e9\u9635\u4e58\u4ee5\u5176\u8f6c\u7f6e\u603b\u662f\u5f97\u5230\u4e00\u4e2a\u65b9\u9635\uff1a\\(AA^T\\) \u662f \\(m \\times m\\)\uff0c\\(A^TA\\) \u662f \\(n \\times n\\)\u3002
\u65b9\u9635\u7684\u8ff9\u662f\u5176\u5bf9\u89d2\u7ebf\u5143\u7d20\u4e4b\u548c\uff1a\\(\\text{tr}(A) = A_{11} + A_{22} + \\cdots + A_{nn}\\)\u3002\u8ff9\u7b49\u4e8e\u7279\u5f81\u503c\u4e4b\u548c\uff08\u6211\u4eec\u7a0d\u540e\u4f1a\u770b\u5230\uff09\u3002
\u5bf9\u4e8e\u4e0a\u9762\u7684\u77e9\u9635\uff0c\\(\\text{tr}(A) = 1 + 4 + 9 = 14\\)\u3002\u53ea\u6709\u9ad8\u4eae\u7684\u5bf9\u89d2\u7ebf\u90e8\u5206\u91cd\u8981\u3002
\u5982\u679c\u4e24\u4e2a\u77e9\u9635\u5728\u4e0d\u540c\u57fa\u4e0b\u8868\u793a\u76f8\u540c\u7684\u7ebf\u6027\u53d8\u6362\uff0c\u5b83\u4eec\u7684\u8ff9\u76f8\u540c\u3002\u8ff9\u662f\"\u4e0e\u57fa\u65e0\u5173\u7684\u3002\"
\u77e9\u9635\u7684\u79e9\u662f\u7ebf\u6027\u65e0\u5173\u7684\u884c\uff08\u6216\u7b49\u4ef7\u5730\uff0c\u5217\uff09\u7684\u6570\u91cf\u3002\u5b83\u544a\u8bc9\u4f60\u77e9\u9635\u643a\u5e26\u4e86\u591a\u5c11\"\u6709\u7528\u4fe1\u606f\u3002\"
\u4f8b\u5982\uff0c\u4ee5\u4e0b\u77e9\u9635\u7684\u79e9\u4e3a 2\uff0c\u56e0\u4e3a\u4e24\u884c\u4e4b\u95f4\u4e92\u4e0d\u4e3a\u500d\u6570\uff1a
\u4f46\u4ee5\u4e0b\u77e9\u9635\u7684\u79e9\u4e3a 1\uff0c\u56e0\u4e3a\u7b2c\u4e8c\u884c\u53ea\u662f\u7b2c\u4e00\u884c\u7684\u4e24\u500d\uff0c\u6240\u4ee5\u5b83\u6ca1\u6709\u589e\u52a0\u65b0\u4fe1\u606f\uff1a
\\[ \\begin{bmatrix} 1 & 2 \\\\ 2 & 4 \\end{bmatrix} \\]\u65b9\u9635\u53ef\u9006\uff08\u6709\u9006\u77e9\u9635\uff09\u5f53\u4e14\u4ec5\u5f53\u5b83\u662f\u6ee1\u79e9\u7684\u3002
\u79e9\u901a\u8fc7\u79e9-\u96f6\u5316\u5ea6\u5b9a\u7406\u4e0e\u96f6\u7a7a\u95f4\uff08\u77e9\u9635\u6620\u5c04\u5230\u96f6\u7684\u5411\u91cf\u7684\u96c6\u5408\uff09\u76f8\u8fde\uff1a\\(\\text{rank}(A) + \\text{nullity}(A) = \\text{\u5217\u6570 of } A\\)\u3002\u77e9\u9635\u4fdd\u7559\u7684\uff08\u79e9\uff09\u52a0\u4e0a\u5b83\u7834\u574f\u7684\uff08\u96f6\u5316\u5ea6\uff09\u7b49\u4e8e\u603b\u7ef4\u5ea6\u3002
\u77e9\u9635\u7684\u5217\u7a7a\u95f4\u662f\u5f53\u4f60\u5c06\u77e9\u9635\u4e58\u4ee5\u4efb\u610f\u5411\u91cf\u65f6\u6240\u6709\u53ef\u80fd\u8f93\u51fa\u7684\u96c6\u5408\u3002\u5b83\u7531\u77e9\u9635\u7684\u5217\u5f20\u6210\u3002\u5982\u679c\u77e9\u9635\u6709 3 \u5217\u4f46\u53ea\u6709 2 \u5217\u72ec\u7acb\uff0c\u5217\u7a7a\u95f4\u662f\u4e00\u4e2a\u4e8c\u7ef4\u5e73\u9762\uff0c\u800c\u4e0d\u662f\u6574\u4e2a\u4e09\u7ef4\u7a7a\u95f4\u3002
\u884c\u7a7a\u95f4\u662f\u540c\u6837\u7684\u6982\u5ff5\uff0c\u4f46\u4ece\u884c\u7684\u89d2\u5ea6\u6765\u770b\u3002\u79e9\u7b49\u4e8e\u5217\u7a7a\u95f4\u548c\u884c\u7a7a\u95f4\u7684\u7ef4\u5ea6\uff0c\u6240\u4ee5\u5b83\u4eec\u603b\u662f\u4e00\u81f4\u7684\u3002
\u4e00\u8d77\u6765\u770b\uff0c\u5217\u7a7a\u95f4\u544a\u8bc9\u4f60\"\u8fd9\u4e2a\u77e9\u9635\u80fd\u4ea7\u751f\u4ec0\u4e48\u8f93\u51fa\uff1f\"\u96f6\u7a7a\u95f4\u544a\u8bc9\u4f60\"\u4ec0\u4e48\u8f93\u5165\u88ab\u6620\u5c04\u5230\u96f6\uff1f\"\u8fd9\u4e24\u4e2a\u7a7a\u95f4\u5b8c\u6574\u63cf\u8ff0\u4e86\u77e9\u9635\u7684\u529f\u80fd\u3002
\u65b9\u9635\u7684\u884c\u5217\u5f0f\u662f\u4e00\u4e2a\u6807\u91cf\uff0c\u6355\u6349\u77e9\u9635\u5982\u4f55\u7f29\u653e\u7a7a\u95f4\u3002\u60f3\u8c61\u4e00\u4e2a \\(2 \\times 2\\) \u77e9\u9635\u5c06\u4e00\u4e2a\u5355\u4f4d\u6b63\u65b9\u5f62\u53d8\u6362\u6210\u4e00\u4e2a\u5e73\u884c\u56db\u8fb9\u5f62\u3002\u884c\u5217\u5f0f\u5c31\u662f\u90a3\u4e2a\u5e73\u884c\u56db\u8fb9\u5f62\u7684\u9762\u79ef\uff08\u5e26\u6709\u7b26\u53f7\uff09\u3002
\u8fd9\u4e2a\u53d8\u6362\u5c06\u5355\u4f4d\u6b63\u65b9\u5f62\u62c9\u4f38\u6210\u4e00\u4e2a\u9762\u79ef\u4e3a 6 \u7684\u5e73\u884c\u56db\u8fb9\u5f62\u3002
\u5982\u679c\u884c\u5217\u5f0f\u4e3a\u6b63\uff0c\u53d8\u6362\u4fdd\u6301\u5b9a\u5411\uff08\u4e8b\u7269\u4e0d\u4f1a\u88ab\"\u7ffb\u8f6c\"\uff09\u3002\u5982\u679c\u4e3a\u8d1f\uff0c\u5b83\u7ffb\u8f6c\u5b9a\u5411\uff08\u50cf\u955c\u9762\u53cd\u5c04\uff09\u3002\u5982\u679c\u4e3a\u96f6\uff0c\u77e9\u9635\u5c06\u7a7a\u95f4\u538b\u7f29\u5230\u66f4\u4f4e\u7ef4\u5ea6\uff0c\u5c06\u5e73\u884c\u56db\u8fb9\u5f62\u574d\u7f29\u6210\u4e00\u6761\u7ebf\u6216\u4e00\u4e2a\u70b9\u3002
\u884c\u5217\u5f0f\u4e3a\u96f6\u7684\u77e9\u9635\u79f0\u4e3a\u5947\u5f02\u77e9\u9635\u3002\u5b83\u6ca1\u6709\u9006\u77e9\u9635\u4e14\u5df2\u6c38\u4e45\u4e22\u5931\u4fe1\u606f\u3002
\u5bf9\u4e8e\u5927\u4e8e \\(2 \\times 2\\) \u7684\u77e9\u9635\uff0c\u884c\u5217\u5f0f\u4f7f\u7528\u4f59\u5b50\u5f0f\u548c\u4ee3\u6570\u4f59\u5b50\u5f0f\u8ba1\u7b97\u3002\u4f59\u5b50\u5f0f \\(M_{ij}\\) \u662f\u901a\u8fc7\u5220\u9664\u7b2c \\(i\\) \u884c\u548c\u7b2c \\(j\\) \u5217\u5f97\u5230\u7684\u8f83\u5c0f\u77e9\u9635\u7684\u884c\u5217\u5f0f\u3002
\u4ee3\u6570\u4f59\u5b50\u5f0f \\(C_{ij} = (-1)^{i+j} M_{ij}\\) \u4e3a\u6bcf\u4e2a\u4f59\u5b50\u5f0f\u9644\u52a0\u4e00\u4e2a\u7b26\u53f7\uff08\u50cf\u68cb\u76d8\u4e00\u6837\u4ea4\u66ff\uff1a\\(+, -, +, \\ldots\\)\uff09\u3002\u6574\u4e2a\u77e9\u9635\u7684\u884c\u5217\u5f0f\u7136\u540e\u6cbf\u7740\u4efb\u610f\u884c\u6216\u5217\u6c42\u548c\uff1a\\(\\det(A) = \\sum_j A_{1j} \\cdot C_{1j}\\)\u3002\u8fd9\u79f0\u4e3a\u4ee3\u6570\u4f59\u5b50\u5f0f\u5c55\u5f00\u3002
\u65b9\u9635 \\(A\\) \u7684\u9006\uff0c\u8bb0\u4f5c \\(A^{-1}\\)\uff0c\u662f\u64a4\u9500 \\(A\\) \u7684\u77e9\u9635\uff1a\\(AA^{-1} = A^{-1}A = I\\)\uff08\u5355\u4f4d\u77e9\u9635\uff09\u3002\u53ea\u6709\u975e\u5947\u5f02\u77e9\u9635\u624d\u6709\u9006\u3002
\u5bf9\u4e8e \\(2 \\times 2\\) \u77e9\u9635\uff0c\u9006\u6709\u4e00\u4e2a\u76f4\u63a5\u516c\u5f0f\uff1a
\u6ce8\u610f\u5206\u6bcd\u4e2d\u7684\u884c\u5217\u5f0f\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5947\u5f02\u77e9\u9635\uff08\u884c\u5217\u5f0f\u4e3a\u96f6\uff09\u6ca1\u6709\u9006\u3002
\u6761\u4ef6\u6570\u8861\u91cf\u77e9\u9635\u5bf9\u5176\u8f93\u5165\u5fae\u5c0f\u53d8\u5316\u7684\u654f\u611f\u7a0b\u5ea6\u3002\u5b83\u5b9a\u4e49\u4e3a \\(\\kappa(A) = \\|A\\| \\cdot \\|A^{-1}\\|\\)\u3002
\u63a5\u8fd1 1 \u7684\u6761\u4ef6\u6570\u610f\u5473\u7740\u77e9\u9635\u662f\u826f\u6001\u7684\uff1a\u5fae\u5c0f\u7684\u8f93\u5165\u53d8\u5316\u4ea7\u751f\u5fae\u5c0f\u7684\u8f93\u51fa\u53d8\u5316\u3002\u5927\u7684\u6761\u4ef6\u6570\u610f\u5473\u7740\u5b83\u662f\u75c5\u6001\u7684\uff1a\u5fae\u5c0f\u7684\u8bef\u5dee\u88ab\u6781\u5927\u653e\u5927\u3002\u6b63\u4ea4\u77e9\u9635\u548c\u5355\u4f4d\u77e9\u9635\u7684\u6761\u4ef6\u6570\u4e3a 1\uff0c\u800c\u5947\u5f02\u77e9\u9635\u7684\u6761\u4ef6\u6570\u4e3a\u65e0\u7a77\u5927\u3002
\u4f8b\u5982\uff0c\u4ee5\u4e0b\u77e9\u9635\u7684\u6761\u4ef6\u6570\u4e3a \\(10^8\\)\u3002\u4e00\u4e2a\u65b9\u5411\u88ab\u6b63\u5e38\u7f29\u653e\uff0c\u800c\u53e6\u4e00\u4e2a\u51e0\u4e4e\u88ab\u538b\u7f29\u4e3a\u96f6\uff0c\u6240\u4ee5\u6cbf\u8be5\u65b9\u5411\u7684\u5c0f\u6270\u52a8\u4f1a\u88ab\u4e25\u91cd\u626d\u66f2\uff1a
\u8c31\u8303\u6570 \\(\\|A\\|_2\\) \u662f \\(A\\) \u7684\u6700\u5927\u5947\u5f02\u503c\u3002\u5b83\u8861\u91cf\u77e9\u9635\u53ef\u4ee5\u62c9\u4f38\u4efb\u4f55\u5355\u4f4d\u5411\u91cf\u7684\u6700\u5927\u7a0b\u5ea6\u3002\u5728 ML \u4e2d\uff0c\u77e9\u9635\u8303\u6570\u7528\u4e8e\u6743\u91cd\u6b63\u5219\u5316\uff08\u60e9\u7f5a\u5927\u6743\u91cd\uff09\u548c\u76d1\u63a7\u8bad\u7ec3\u7a33\u5b9a\u6027\u3002
\u5bf9\u79f0\u77e9\u9635 \\(A\\) \u662f\u6b63\u5b9a\u7684\uff0c\u5982\u679c\u5bf9\u6bcf\u4e2a\u975e\u96f6\u5411\u91cf \\(\\mathbf{x}\\)\uff1a\\(\\mathbf{x}^T A \\mathbf{x} > 0\\)\u3002\u8fd9\u4e2a\u4e8c\u6b21\u578b\u603b\u662f\u4ea7\u751f\u6b63\u6570\u3002
\u4f8b\u5982\uff0c\u4ee5\u4e0b\u77e9\u9635\u662f\u6b63\u5b9a\u7684\uff1a
\u53d6\u4efb\u610f\u5411\u91cf\uff0c\u6bd4\u5982 \\(\\mathbf{x} = [1, -1]^T\\)\uff1a\\(\\mathbf{x}^T A \\mathbf{x} = 2 - 1 - 1 + 3 = 3 > 0\\)\u3002\u65e0\u8bba\u4f60\u5c1d\u8bd5\u54ea\u4e2a\u975e\u96f6 \\(\\mathbf{x}\\)\uff0c\u4f60\u603b\u662f\u5f97\u5230\u6b63\u7684\u7ed3\u679c\u3002
\u6b63\u5b9a\u77e9\u9635\u5f88\u91cd\u8981\uff0c\u56e0\u4e3a\u5b83\u4eec\u4fdd\u8bc1\u4f18\u5316\u95ee\u9898\u6709\u552f\u4e00\u7684\u6700\u5c0f\u503c\u3002
\u5982\u679c\u6761\u4ef6\u653e\u5bbd\u5230 \\(\\mathbf{x}^T A \\mathbf{x} \\geq 0\\)\uff08\u5141\u8bb8\u4e3a\u96f6\uff09\uff0c\u77e9\u9635\u662f\u534a\u6b63\u5b9a\uff08PSD\uff09\u3002PSD \u77e9\u9635\u7ecf\u5e38\u51fa\u73b0\uff1a\u534f\u65b9\u5dee\u77e9\u9635\u3001SVM \u4e2d\u7684\u6838\u77e9\u9635\u4ee5\u53ca\u5c40\u90e8\u6700\u5c0f\u503c\u5904\u7684 Hessian \u77e9\u9635\u90fd\u662f PSD\u3002\u533a\u522b\u5728\u4e8e PSD \u5141\u8bb8\u67d0\u4e9b\u65b9\u5411\u662f\"\u5e73\u5766\u7684\"\uff08\u96f6\u66f2\u7387\uff09\uff0c\u800c\u4e0d\u662f\u4e25\u683c\u5411\u4e0a\u5f2f\u66f2\u3002
\u8ba1\u7b97\u77e9\u9635\u7684\u8ff9\u3001\u79e9\u548c\u884c\u5217\u5f0f\u3002\u5c1d\u8bd5\u4f7f\u4e00\u884c\u6210\u4e3a\u53e6\u4e00\u884c\u7684\u500d\u6570\uff0c\u89c2\u5bdf\u79e9\u548c\u884c\u5217\u5f0f\u5982\u4f55\u53d8\u5316\u3002
import jax.numpy as jnp\n\nA = jnp.array([[1.0, 2.0],\n [3.0, 4.0]])\n\nprint(f\"Trace: {jnp.trace(A)}\")\nprint(f\"Rank: {jnp.linalg.matrix_rank(A)}\")\nprint(f\"Determinant: {jnp.linalg.det(A):.2f}\")\n \u8ba1\u7b97\u77e9\u9635\u7684\u9006\uff0c\u5c06\u5176\u4e58\u4ee5\u539f\u77e9\u9635\uff0c\u9a8c\u8bc1\u5f97\u5230\u5355\u4f4d\u77e9\u9635\u3002\u7136\u540e\u5c1d\u8bd5\u5947\u5f02\u77e9\u9635\u5e76\u89c2\u5bdf\u4f1a\u53d1\u751f\u4ec0\u4e48\u3002
import jax.numpy as jnp\n\nA = jnp.array([[1.0, 2.0],\n [3.0, 4.0]])\n\nA_inv = jnp.linalg.inv(A)\nprint(f\"A * A_inv:\\n{A @ A_inv}\")\n \u7279\u6b8a\u7684\u77e9\u9635\u7ed3\u6784\u80fd\u591f\u89e3\u9501\u8ba1\u7b97\u6377\u5f84\u548c\u6570\u5b66\u4fdd\u8bc1\u3002\u672c\u6587\u6db5\u76d6\u5355\u4f4d\u77e9\u9635\u3001\u5bf9\u89d2\u77e9\u9635\u3001\u5bf9\u79f0\u77e9\u9635\u3001\u4e09\u89d2\u77e9\u9635\u3001\u6b63\u4ea4\u77e9\u9635\u3001\u6b63\u5b9a\u77e9\u9635\u3001\u7a00\u758f\u77e9\u9635\u548c\u968f\u673a\u77e9\u9635\uff0c\u8fd9\u4e9b\u7c7b\u578b\u51fa\u73b0\u5728\u534f\u65b9\u5dee\u4f30\u8ba1\u3001\u56fe\u7b97\u6cd5\u3001\u6b63\u5219\u5316\u548c\u9a6c\u5c14\u53ef\u592b\u94fe\u4e2d\u3002
\u5e76\u975e\u6240\u6709\u77e9\u9635\u90fd\u4e00\u6837\u3002\u4e0d\u540c\u7684\u7ed3\u6784\u8d4b\u4e88\u77e9\u9635\u7279\u6b8a\u7684\u6027\u8d28\uff0c\u4f7f\u5b83\u4eec\u8ba1\u7b97\u66f4\u5feb\u3001\u66f4\u6613\u4e8e\u63a8\u7406\uff0c\u6216\u4e24\u8005\u517c\u5f97\u3002\u4ee5\u4e0b\u662f\u4f60\u6700\u5e38\u9047\u5230\u7684\u7c7b\u578b\u3002
\u65b9\u9635\u7684\u884c\u6570\u548c\u5217\u6570\u76f8\u540c\uff08\\(n \\times n\\)\uff09\u3002\u5927\u591a\u6570\u6709\u8da3\u7684\u6027\u8d28\uff08\u884c\u5217\u5f0f\u3001\u7279\u5f81\u503c\u3001\u9006\uff09\u53ea\u9002\u7528\u4e8e\u65b9\u9635\u3002
\u5355\u4f4d\u77e9\u9635 \\(I\\) \u662f\u4e00\u4e2a\u5bf9\u89d2\u7ebf\u4e3a 1\u3001\u5176\u4f59\u4e3a 0 \u7684\u65b9\u9635\u3002\u5b83\u662f\"\u4ec0\u4e48\u90fd\u4e0d\u505a\"\u7684\u53d8\u6362\uff1a\\(AI = IA = A\\) \u5bf9\u4efb\u4f55\u517c\u5bb9\u7684\u77e9\u9635 \\(A\\)\u3002
\u96f6\u77e9\u9635 \\(O\\) \u7684\u6240\u6709\u5143\u7d20\u90fd\u4e3a\u96f6\u3002\u5b83\u5c06\u6bcf\u4e2a\u5411\u91cf\u6620\u5c04\u5230\u96f6\u5411\u91cf\uff0c\u7834\u574f\u6240\u6709\u4fe1\u606f\u3002
\u5bf9\u89d2\u77e9\u9635\u9664\u4e3b\u5bf9\u89d2\u7ebf\u5916\u5168\u4e3a\u96f6\u3002\u5c06\u5411\u91cf\u4e58\u4ee5\u5bf9\u89d2\u77e9\u9635\u53ea\u662f\u72ec\u7acb\u5730\u7f29\u653e\u6bcf\u4e2a\u5206\u91cf\uff0c\u975e\u5e38\u9ad8\u6548\u3002
\u4e09\u89d2\u77e9\u9635\u7684\u884c\u5217\u5f0f\u5c31\u662f\u5176\u5bf9\u89d2\u7ebf\u5143\u7d20\u7684\u4e58\u79ef\u3002
\u6b63\u4ea4\u77e9\u9635\u5177\u6709\u8f6c\u7f6e\u7b49\u4e8e\u9006\u7684\u6027\u8d28\uff1a\\(Q^TQ = QQ^T = I\\)\u3002
\u8fd9\u610f\u5473\u7740\u4f60\u53ea\u9700\u8f6c\u7f6e\u5c31\u80fd\"\u64a4\u9500\"\u53d8\u6362\uff0c\u8ba1\u7b97\u6210\u672c\u5f88\u4f4e\u3002\u5176\u5217\u662f\u6807\u51c6\u6b63\u4ea4\u7684\uff08\u5355\u4f4d\u957f\u5ea6\u4e14\u76f8\u4e92\u5782\u76f4\uff09\u3002
\u7a00\u758f\u77e9\u9635\u7684\u5927\u591a\u6570\u5143\u7d20\u4e3a\u96f6\uff0c\u800c\u7a20\u5bc6\u77e9\u9635\u7684\u5927\u591a\u6570\u5143\u7d20\u975e\u96f6\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u8bb8\u591a\u73b0\u5b9e\u4e16\u754c\u7684\u77e9\u9635\u662f\u6781\u5176\u7a00\u758f\u7684\u3002
\u4e00\u4e2a\u62e5\u6709\u767e\u4e07\u7528\u6237\u7684\u793e\u4ea4\u7f51\u7edc\u53ef\u4ee5\u8868\u793a\u4e3a\u4e00\u4e2a \\(10^6 \\times 10^6\\) \u7684\u77e9\u9635\uff0c\u4f46\u6bcf\u4e2a\u4eba\u53ea\u8fde\u63a5\u5230\u5c11\u6570\u5176\u4ed6\u4eba\uff0c\u6240\u4ee5\u51e0\u4e4e\u6240\u6709\u5143\u7d20\u90fd\u662f\u96f6\u3002
\u7f6e\u6362\u77e9\u9635\u662f\u901a\u8fc7\u91cd\u6392\u5355\u4f4d\u77e9\u9635\u7684\u884c\u5f97\u5230\u7684\u3002\u4e58\u4ee5\u5b83\u4f1a\u6253\u4e71\u5411\u91cf\u7684\u5143\u7d20\u3002\u6bcf\u884c\u6bcf\u5217\u6070\u597d\u6709\u4e00\u4e2a 1\uff0c\u5176\u4f59\u4e3a 0\u3002
\u4f8b\u5982\uff0c\u4e0b\u9762\u7684\u77e9\u9635\u5c06\u5143\u7d20 3 \u79fb\u5230\u4f4d\u7f6e 1\uff0c\u5143\u7d20 1 \u79fb\u5230\u4f4d\u7f6e 2\uff0c\u5143\u7d20 2 \u79fb\u5230\u4f4d\u7f6e 3\uff1a
\u8fd9\u79cd\u7ed3\u6784\u51fa\u73b0\u5728\u4fe1\u53f7\u5904\u7406\u548c\u5377\u79ef\u4e2d\uff0c\u56e0\u4e3a\u5c06\u56fa\u5b9a\u6ee4\u6ce2\u5668\u6ed1\u8fc7\u4fe1\u53f7\u7b49\u4ef7\u4e8e\u4e58\u4ee5\u6258\u666e\u5229\u8328\u77e9\u9635\u3002
\u5faa\u73af\u77e9\u9635\u662f\u4e00\u79cd\u7279\u6b8a\u7684\u6258\u666e\u5229\u8328\u77e9\u9635\uff0c\u5176\u4e2d\u6bcf\u4e00\u884c\u662f\u4e0a\u4e00\u884c\u7684\u5faa\u73af\u79fb\u4f4d\u3002\u5f53\u4e00\u884c\u5230\u8fbe\u672b\u5c3e\u65f6\uff0c\u5b83\u4f1a\u7ed5\u56de\uff1a
\u5faa\u73af\u77e9\u9635\u4e0e\u79bb\u6563\u5085\u91cc\u53f6\u53d8\u6362\uff08DFT\uff09\u5bc6\u5207\u76f8\u5173\uff0c\u5e76\u4e14\u662f\u5faa\u73af\u5377\u79ef\u5982\u4f55\u5de5\u4f5c\u7684\u6838\u5fc3\u3002
\u57c3\u5c14\u7c73\u7279\u77e9\u9635\u662f\u5bf9\u79f0\u77e9\u9635\u5728\u590d\u6570\u57df\u4e2d\u7684\u7b49\u4ef7\u5f62\u5f0f\uff1a\\(A = A^\\ast\\)\uff08\u5176\u4e2d \\(A^\\ast\\) \u662f\u5171\u8f6d\u8f6c\u7f6e\uff09\u3002
\u5bf9\u4e8e\u5b9e\u503c\u77e9\u9635\uff0c\u57c3\u5c14\u7c73\u7279\u77e9\u9635\u548c\u5bf9\u79f0\u77e9\u9635\u662f\u4e00\u56de\u4e8b\u3002\u4f60\u4f1a\u5728\u91cf\u5b50\u8ba1\u7b97\u548c\u4fe1\u53f7\u5904\u7406\u4e2d\u9047\u5230\u5b83\u4eec\u3002
\u9149\u77e9\u9635\u662f\u6b63\u4ea4\u77e9\u9635\u5728\u590d\u6570\u57df\u4e2d\u7684\u7b49\u4ef7\u5f62\u5f0f\uff1a\\(U^\\ast U = UU^\\ast = I\\)\u3002\u6b63\u5982\u6b63\u4ea4\u77e9\u9635\u5728\u5b9e\u7a7a\u95f4\u4e2d\u4fdd\u6301\u957f\u5ea6\uff0c\u9149\u77e9\u9635\u5728\u590d\u7a7a\u95f4\u4e2d\u4fdd\u6301\u957f\u5ea6\u3002
\u5e42\u7b49\u77e9\u9635\u6ee1\u8db3 \\(A^2 = A\\)\u3002\u5e94\u7528\u53d8\u6362\u4e24\u6b21\u7b49\u540c\u4e8e\u5e94\u7528\u4e00\u6b21\uff0c\u8fd9\u4f7f\u5f97\u5b83\u6210\u4e3a\u4e00\u4e2a\u6295\u5f71\u3002\u4e00\u65e6\u4f60\u6295\u5f71\u4e86\uff0c\u518d\u6b21\u6295\u5f71\u4e0d\u4f1a\u6539\u53d8\u4efb\u4f55\u4e1c\u897f\u3002
\u5e42\u96f6\u77e9\u9635\u6ee1\u8db3\u5bf9\u67d0\u4e2a\u5e42\u6b21 \\(k\\) \u6709 \\(A^k = O\\)\uff08\u96f6\u77e9\u9635\uff09\u3002\u5e94\u7528\u53d8\u6362\u8db3\u591f\u591a\u6b21\u540e\uff0c\u6240\u6709\u4e1c\u897f\u90fd\u574d\u7f29\u4e3a\u96f6\u3002\u4f8b\u5982\uff1a
\u8fd9\u91cc\uff0c\u8282\u70b9 1 \u8fde\u63a5\u5230\u8282\u70b9 2 \u548c 3\uff0c\u4f46\u8282\u70b9 2 \u548c 3 \u4e4b\u95f4\u6ca1\u6709\u8fde\u63a5\u3002
\u8303\u5fb7\u8499\u77e9\u9635\u7531\u4e00\u7ec4\u503c\u7684\u8fde\u7eed\u5e42\u6b21\u6784\u6210\u3002\u7ed9\u5b9a\u503c \\(x_1, x_2, x_3\\)\uff1a
\u8fd9\u79cd\u7ed3\u6784\u51fa\u73b0\u5728\u591a\u9879\u5f0f\u63d2\u503c\u4e2d\uff1a\u627e\u5230\u901a\u8fc7\u7ed9\u5b9a\u70b9\u96c6\u7684\u552f\u4e00\u591a\u9879\u5f0f\u3002
\u6d77\u68ee\u5821\u77e9\u9635\u662f\"\u51e0\u4e4e\"\u4e09\u89d2\u7684\uff0c\u5728\u7b2c\u4e00\u6b21\u6b21\u5bf9\u89d2\u7ebf\u4ee5\u4e0b\u5168\u4e3a\u96f6\uff1a
\u521b\u5efa\u4e00\u4e2a\u6b63\u4ea4\u77e9\u9635\uff08\u65cb\u8f6c\u77e9\u9635\uff09\uff0c\u4e58\u4ee5\u5176\u8f6c\u7f6e\uff0c\u9a8c\u8bc1\u5f97\u5230\u5355\u4f4d\u77e9\u9635\u3002\u5c1d\u8bd5\u4e0d\u540c\u7684\u89d2\u5ea6\u3002
import jax.numpy as jnp\n\ntheta = jnp.pi / 4\nQ = jnp.array([[jnp.cos(theta), -jnp.sin(theta)],\n [jnp.sin(theta), jnp.cos(theta)]])\n\nprint(f\"Q @ Q.T:\\n{Q @ Q.T}\")\nprint(f\"Determinant: {jnp.linalg.det(Q):.2f}\")\n \u521b\u5efa\u4e00\u4e2a\u5bf9\u79f0\u77e9\u9635\u5e76\u9a8c\u8bc1\u5b83\u7b49\u4e8e\u5176\u8f6c\u7f6e\u3002\u7136\u540e\u8ba1\u7b97\u5176\u7279\u5f81\u503c\u5e76\u68c0\u67e5\u7279\u5f81\u5411\u91cf\u662f\u5426\u5782\u76f4\u3002
import jax.numpy as jnp\n\nS = jnp.array([[4.0, 2.0],\n [2.0, 3.0]])\n\nprint(f\"Symmetric: {jnp.allclose(S, S.T)}\")\n\neigenvalues, eigenvectors = jnp.linalg.eigh(S)\nprint(f\"Eigenvalues: {eigenvalues}\")\nprint(f\"Dot product of eigenvectors: {jnp.dot(eigenvectors[:, 0], eigenvectors[:, 1]):.6f}\")\n \u77e9\u9635\u8fd0\u7b97\u662f\u6df1\u5ea6\u5b66\u4e60\u7684\u8ba1\u7b97\u5f15\u64ce\u3002\u672c\u6587\u6db5\u76d6\u77e9\u9635\u52a0\u6cd5\u3001\u6807\u91cf\u4e58\u6cd5\u3001\u77e9\u9635-\u5411\u91cf\u79ef\u3001\u77e9\u9635\u4e58\u6cd5\u3001\u9010\u5143\u7d20\u8fd0\u7b97\u3001Kronecker\u79ef\u548c\u5e7f\u64ad\u2014\u2014\u652f\u6491\u6bcf\u4e00\u6b21\u524d\u5411\u4f20\u64ad\u548c\u68af\u5ea6\u66f4\u65b0\u7684\u8fd0\u7b97\u3002
\u77e9\u9635\u53ef\u4ee5\u50cf\u5411\u91cf\u4e00\u6837\u8fdb\u884c\u52a0\u6cd5\u548c\u7f29\u653e\u3002
\u52a0\u6cd5\u8981\u6c42\u4e24\u4e2a\u77e9\u9635\u7ef4\u5ea6\u76f8\u540c\uff0c\u7136\u540e\u9010\u5143\u7d20\u76f8\u52a0\uff1a
\u8fd9\u662f\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u6838\u5fc3\u8fd0\u7b97\u3002\u6bcf\u4e2a\u795e\u7ecf\u7f51\u7edc\u5c42\u90fd\u8ba1\u7b97 \\(A\\mathbf{x} + \\mathbf{b}\\)\uff1a\u77e9\u9635\u4e58\u4ee5\u8f93\u5165\u5411\u91cf\uff0c\u518d\u52a0\u4e0a\u504f\u7f6e\u3002
\u4e00\u822c\u60c5\u51b5\u662f\u77e9\u9635\u4e58\u6cd5\u3002\u7ed9\u5b9a \\(A\\)\uff08\\(m \\times n\\)\uff09\u548c \\(B\\)\uff08\\(n \\times p\\)\uff09\uff0c\u4e58\u79ef \\(C = AB\\) \u662f\u4e00\u4e2a \\(m \\times p\\) \u77e9\u9635\uff0c\u6bcf\u4e2a\u5143\u7d20\u90fd\u662f\u4e00\u4e2a\u70b9\u79ef\uff1a
\u7ed3\u679c\u4e2d\u7684\u6bcf\u4e2a\u6761\u76ee\u90fd\u662f \\(A\\) \u7684\u4e00\u884c\u4e0e \\(B\\) \u7684\u4e00\u5217\u7684\u70b9\u79ef\u3002\u5185\u90e8\u7ef4\u5ea6\u5fc5\u987b\u5339\u914d\uff08\\(n\\)\uff09\uff0c\u7ed3\u679c\u53d6\u5916\u90e8\u7ef4\u5ea6\uff08\\(m \\times p\\)\uff09\u3002
\u53e6\u4e00\u79cd\u7406\u89e3\u65b9\u5f0f\uff1a\u7ed3\u679c\u7684\u6bcf\u4e00\u5217\u90fd\u662f \\(A\\) \u7684\u5217\u7684\u52a0\u6743\u548c\uff0c\u5176\u4e2d\u6743\u91cd\u6765\u81ea \\(B\\) \u7684\u5bf9\u5e94\u5217\u3002
\u5982\u679c \\(B\\) \u7684\u67d0\u4e00\u5217\u4e3a \\([2, 3]^T\\)\uff0c\u5219\u7ed3\u679c\u5217\u5c31\u662f \\(2 \\times (\\text{A\u7684\u7b2c1\u5217}) + 3 \\times (\\text{A\u7684\u7b2c2\u5217})\\)\u3002
\u4e00\u4e2a\u6709\u7528\u7684\u7279\u4f8b\uff1a\u77e9\u9635\u4e0e\u5176\u8f6c\u7f6e\u76f8\u4e58\u603b\u662f\u5f97\u5230\u4e00\u4e2a\u65b9\u9635\u3002\\(AA^T\\) \u662f \\(m \\times m\\)\uff0c\\(A^TA\\) \u662f \\(n \\times n\\)\uff1a
\u77e9\u9635\u4e58\u6cd5\u6709\u91cd\u8981\u7684\u8fd0\u7b97\u89c4\u5219\uff1a
\u4e0d\u6ee1\u8db3\u4ea4\u6362\u5f8b\uff1a\u901a\u5e38 \\(AB \\neq BA\\)\u3002\u987a\u5e8f\u5f88\u91cd\u8981\u3002
\u6ee1\u8db3\u7ed3\u5408\u5f8b\uff1a\\((AB)C = A(BC)\\)\u3002\u4f60\u53ef\u4ee5\u4efb\u610f\u5206\u7ec4\u4e58\u6cd5\u3002
\u6ee1\u8db3\u5206\u914d\u5f8b\uff1a\\(A(B + C) = AB + AC\\)\u3002
\u5355\u4f4d\u77e9\u9635\uff1a\\(AI = IA = A\\)\u3002
Hadamard\u79ef\uff08\u9010\u5143\u7d20\u4e58\u79ef\uff09\u5c06\u4e24\u4e2a\u76f8\u540c\u5927\u5c0f\u7684\u77e9\u9635\u9010\u9879\u76f8\u4e58\uff0c\u8bb0\u4f5c \\(A \\odot B\\)\uff1a
\u4e0e\u6807\u51c6\u77e9\u9635\u4e58\u6cd5\u4e0d\u540c\uff0cHadamard\u79ef\u6ee1\u8db3\u4ea4\u6362\u5f8b\uff08\\(A \\odot B = B \\odot A\\)\uff09\uff0c\u4e14\u8981\u6c42\u4e24\u4e2a\u77e9\u9635\u7ef4\u5ea6\u76f8\u540c\u3002\u5b83\u5728\u673a\u5668\u5b66\u4e60\u4e2d\u5e7f\u6cdb\u7528\u4e8e\u95e8\u63a7\u673a\u5236\uff1a\u901a\u8fc7\u4e0e\u4e00\u4e2a\u53d6\u503c\u57280\u52301\u4e4b\u95f4\u7684\u63a9\u7801\u9010\u5143\u7d20\u76f8\u4e58\uff0c\u63a7\u5236\u6bcf\u4e2a\u6761\u76ee\"\u901a\u8fc7\"\u591a\u5c11\u3002
\u4e24\u4e2a\u5411\u91cf \\(\\mathbf{u}\\) \u548c \\(\\mathbf{v}\\) \u7684\u5916\u79ef\u4ea7\u751f\u4e00\u4e2a\u77e9\u9635\uff1a\\(\\mathbf{u}\\mathbf{v}^T\\)\u3002\u6bcf\u4e2a\u6761\u76ee\u662f \\(\\mathbf{u}\\) \u7684\u4e00\u4e2a\u5143\u7d20\u4e0e \\(\\mathbf{v}\\) \u7684\u4e00\u4e2a\u5143\u7d20\u7684\u4e58\u79ef\uff1a
\u7ed3\u679c\u603b\u662f\u79e9\u4e3a1\uff0c\u56e0\u4e3a\u6bcf\u4e00\u884c\u90fd\u662f \\(\\mathbf{v}^T\\) \u7684\u7f29\u653e\u7248\u672c\u3002\u4efb\u4f55\u77e9\u9635\u90fd\u53ef\u4ee5\u5199\u6210\u79e9-1\u5916\u79ef\u4e4b\u548c\uff0c\u8fd9\u6b63\u662fSVD\u6240\u505a\u7684\u4e8b\u60c5\uff08\u89c1\u5206\u89e3\u7ae0\u8282\uff09\u3002
\u77e9\u9635\u4e58\u6cd5\u7684\u8ba1\u7b97\u5f00\u9500\u5f88\u5927\u3002\u4e24\u4e2a \\(n \\times n\\) \u77e9\u9635\u76f8\u4e58\u9700\u8981 \\(O(n^3)\\) \u6b21\u8fd0\u7b97\u3002\u5bf9\u4e8e\u4e00\u4e2a \\(1000 \\times 1000\\) \u7684\u77e9\u9635\uff0c\u90a3\u5c31\u662f\u5341\u4ebf\u6b21\u4e58\u6cd5\u3002
\u5f53\u77e9\u9635\u662f\u7a00\u758f\u7684\uff08\u5927\u90e8\u5206\u4e3a\u96f6\uff09\u65f6\uff0c\u6734\u7d20\u7684\u4e58\u6cd5\u4f1a\u6d6a\u8d39\u65f6\u95f4\u4e58\u4ee5\u96f6\u3002\u538b\u7f29\u7a00\u758f\u884c\uff08CSR\uff09\u683c\u5f0f\u53ea\u5b58\u50a8\u975e\u96f6\u5143\u7d20\u53ca\u5176\u4f4d\u7f6e\uff1a
\u4f8b\u5982\uff0c\u77e9\u9635\uff1a
\u5b58\u50a8\u4e3a\uff1avalues = [5, 2, 3, -1], columns = [0, 3, 2, 3], row offsets = [0, 2, 3, 4]\u3002\u8fd9\u8df3\u8fc7\u4e86\u6240\u6709\u96f6\uff0c\u4f7f\u7a00\u758f\u8fd0\u7b97\u5feb\u5f97\u591a\u3002
\u77e9\u9635\u7684\u4e00\u4e2a\u6838\u5fc3\u7528\u9014\u662f\u6c42\u89e3\u7ebf\u6027\u65b9\u7a0b\u7ec4\u3002\u65b9\u7a0b\u7ec4 \\(A\\mathbf{x} = \\mathbf{b}\\) \u95ee\u7684\u662f\uff1a\"\u4ec0\u4e48\u5411\u91cf \\(\\mathbf{x}\\) \u88ab \\(A\\) \u53d8\u6362\u540e\uff0c\u4f1a\u5f97\u5230 \\(\\mathbf{b}\\)\uff1f\"
\u4f8b\u5982\uff0c\u5047\u8bbe\u4f60\u5728\u4e70\u6c34\u679c\u3002\u82f9\u679c\u6bcf\u4e2a \\(x_1\\) \u5143\uff0c\u9999\u8549\u6bcf\u4e2a \\(x_2\\) \u5143\u3002\u5df2\u77e52\u4e2a\u82f9\u679c\u548c1\u4e2a\u9999\u8549\u51715\u5143\uff0c1\u4e2a\u82f9\u679c\u548c3\u4e2a\u9999\u8549\u517110\u5143\u3002\u7528\u77e9\u9635\u5f62\u5f0f\u8868\u793a\uff1a
\u4ece\u7b2c1\u884c\u5f97 \\(x_2 = 5 - 2x_1\\)\u3002\u4ee3\u5165\u7b2c2\u884c\uff1a\\(x_1 + 3(5 - 2x_1) = 10\\)\uff0c\u89e3\u5f97 \\(x_1 = 1\\)\uff0c\u5219 \\(x_2 = 3\\)\u3002\u82f9\u679c\u6bcf\u4e2a1\u5143\uff0c\u9999\u8549\u6bcf\u4e2a3\u5143\u3002
\u9a8c\u8bc1\u2014\u2014\u7ed3\u679c\u6b63\u786e\uff1a
\u5982\u679c \\(A\\) \u6709\u9006\u77e9\u9635\uff0c\u89e3\u5c31\u662f\u7b80\u5355\u7684 \\(\\mathbf{x} = A^{-1}\\mathbf{b}\\)\u3002\u4f46\u76f4\u63a5\u8ba1\u7b97\u9006\u77e9\u9635\u4ee3\u4ef7\u9ad8\u6602\u4e14\u6570\u503c\u4e0d\u7a33\u5b9a\u3002\u5b9e\u8df5\u4e2d\u6211\u4eec\u4f7f\u7528\u5206\u89e3\u65b9\u6cd5\u3002
\u5e76\u975e\u6240\u6709\u77e9\u9635\u90fd\u662f\u65b9\u9635\uff0c\u4e5f\u4e0d\u662f\u6240\u6709\u65b9\u9635\u90fd\u53ef\u9006\u3002\u4f2a\u9006 \\(A^+\\) \u5c06\u9006\u63a8\u5e7f\u5230\u4efb\u610f\u77e9\u9635\u3002\u5b83\u603b\u662f\u5b58\u5728\uff0c\u5e76\u63d0\u4f9b\"\u5c3d\u53ef\u80fd\u597d\u7684\"\u9006\uff1a
\u5f53 \\(A\\) \u662f\u4e0b\u4e09\u89d2\u77e9\u9635\u65f6\uff0c\u901a\u8fc7\u524d\u5411\u4ee3\u5165\u6c42\u89e3 \\(L\\mathbf{x} = \\mathbf{b}\\) \u5f88\u5bb9\u6613\uff1a\u5148\u89e3\u51fa \\(x_1\\)\uff0c\u7136\u540e\u7528\u5b83\u6c42\u51fa \\(x_2\\)\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002
\u5f53 \\(A\\) \u662f\u4e0a\u4e09\u89d2\u77e9\u9635\u65f6\uff0c\u901a\u8fc7\u56de\u4ee3\u6c42\u89e3 \\(U\\mathbf{x} = \\mathbf{b}\\)\uff1a\u5148\u89e3\u51fa\u6700\u540e\u4e00\u4e2a\u53d8\u91cf\uff0c\u7136\u540e\u5411\u4e0a\u6c42\u89e3\u3002
\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5c06\u77e9\u9635\u5206\u89e3\u4e3a\u4e09\u89d2\u56e0\u5b50\uff08\u5982\u5206\u89e3\u7ae0\u8282\u6240\u8ff0\uff09\u5982\u6b64\u6709\u7528\u2014\u2014\u5b83\u5c06\u4e00\u4e2a\u96be\u9898\u8f6c\u5316\u4e3a\u4e24\u4e2a\u7b80\u5355\u95ee\u9898\u3002
import jax.numpy as jnp\n\nA = jnp.array([[1.0, 2.0],\n [3.0, 4.0]])\nB = jnp.array([[5.0, 6.0],\n [7.0, 8.0]])\n\nprint(f\"A @ B:\\n{A @ B}\")\nprint(f\"B @ A:\\n{B @ A}\")\nprint(f\"Equal: {jnp.allclose(A @ B, B @ A)}\")\n import jax.numpy as jnp\n\nA = jnp.array([[2.0, 1.0],\n [5.0, 3.0]])\nb = jnp.array([4.0, 7.0])\n\nx = jnp.linalg.solve(A, b)\nprint(f\"Solution x: {x}\")\nprint(f\"A @ x: {A @ x}\")\n"},{"location":"chapter%2002%3A%20matrices/04.%20linear%20transformations/","title":"\u7ebf\u6027\u53d8\u6362","text":"\u6bcf\u4e2a\u77e9\u9635\u4e58\u6cd5\u90fd\u662f\u4e00\u4e2a\u7ebf\u6027\u53d8\u6362\u2014\u2014\u4e00\u4e2a\u5728\u4fdd\u6301\u7ebf\u6027\u6027\u8d28\u7684\u540c\u65f6\u91cd\u5851\u3001\u65cb\u8f6c\u6216\u6295\u5f71\u5411\u91cf\u7684\u51fd\u6570\u3002\u672c\u6587\u6db5\u76d6\u65cb\u8f6c\u3001\u53cd\u5c04\u3001\u7f29\u653e\u3001\u526a\u5207\u3001\u6295\u5f71\u3001\u6620\u5c04\u7684\u6838\u4e0e\u50cf\uff0c\u4ee5\u53ca\u795e\u7ecf\u7f51\u7edc\u5c42\u5982\u4f55\u4e32\u8054\u8fd9\u4e9b\u53d8\u6362\u3002
\u7ebf\u6027\u53d8\u6362\uff08\u6216\u7ebf\u6027\u6620\u5c04\uff09\u662f\u4e00\u4e2a\u63a5\u6536\u5411\u91cf\u5e76\u4ea7\u751f\u53e6\u4e00\u4e2a\u5411\u91cf\u7684\u51fd\u6570\uff0c\u540c\u65f6\u4fdd\u6301\u52a0\u6cd5\u548c\u7f29\u653e\u6027\u8d28\u3002\u5982\u679c \\(T\\) \u662f\u7ebf\u6027\u7684\uff0c\u5219\uff1a
\u6bcf\u4e2a\u7ebf\u6027\u53d8\u6362\u90fd\u53ef\u4ee5\u8868\u793a\u4e3a\u77e9\u9635\u4e58\u6cd5\u3002\u77e9\u9635\u5c31\u662f\u53d8\u6362\u672c\u8eab\u3002\u5f53\u4f60\u7528\u4e00\u4e2a\u77e9\u9635\u4e58\u4ee5\u4e00\u4e2a\u5411\u91cf\u65f6\uff0c\u5c31\u662f\u5728\u5bf9\u5b83\u65bd\u52a0\u4e00\u4e2a\u7ebf\u6027\u53d8\u6362\u3002
\u53ef\u4ee5\u628a\u4e00\u4e2a \\(2 \\times 2\\) \u77e9\u9635\u60f3\u8c61\u6210\u4e00\u4e2a\u673a\u5668\uff1a\u5b83\u63a5\u6536\u4e8c\u7ef4\u5411\u91cf\uff0c\u8f93\u51fa\u65b0\u7684\u4e8c\u7ef4\u5411\u91cf\u3002\u77e9\u9635\u7684\u5217\u544a\u8bc9\u4f60\u6807\u51c6\u57fa\u5411\u91cf \\(\\hat{\\mathbf{i}}\\) \u548c \\(\\hat{\\mathbf{j}}\\) \u7ecf\u8fc7\u53d8\u6362\u540e\u5230\u4e86\u54ea\u91cc\u3002\u5176\u4f59\u4e00\u5207\u90fd\u7531\u7ebf\u6027\u6027\u8d28\u5bfc\u51fa\u3002
\u90a3\u4e48 \\(\\hat{\\mathbf{i}} = [1, 0]^T\\) \u843d\u5728 \\([2, 1]^T\\)\uff08\u7b2c1\u5217\uff09\uff0c\\(\\hat{\\mathbf{j}} = [0, 1]^T\\) \u843d\u5728 \\([1, 2]^T\\)\uff08\u7b2c2\u5217\uff09\u3002\u5176\u4ed6\u6240\u6709\u5411\u91cf\u90fd\u662f\u8fd9\u4e24\u4e2a\u5411\u91cf\u7684\u7ec4\u5408\uff0c\u56e0\u6b64\u5176\u8f93\u51fa\u81ea\u52a8\u9075\u5faa\u3002
\u5c06\u4e24\u4e2a\u77e9\u9635\u76f8\u4e58\u53ef\u4ee5\u7406\u89e3\u4e3a\u4f9d\u6b21\u65bd\u52a0\u4e24\u4e2a\u53d8\u6362\u3002\u5982\u679c \\(B\\) \u5c06\u5411\u91cf\u4ece\u4e00\u4e2a\u7a7a\u95f4\u53d8\u6362\uff0c\u7136\u540e \\(A\\) \u53d8\u6362\u7ed3\u679c\uff0c\u90a3\u4e48 \\(AB\\) \u6309\u987a\u5e8f\u5b8c\u6210\u8fd9\u4e24\u4e2a\u64cd\u4f5c\u3002\u5728\u6e38\u620f\u5f15\u64ce\u4e2d\uff0c\u5148\u65cb\u8f6c\u89d2\u8272\u518d\u5411\u524d\u79fb\u52a8\uff0c\u4e0e\u5148\u79fb\u52a8\u518d\u65cb\u8f6c\uff0c\u7ed3\u679c\u5b8c\u5168\u4e0d\u540c\u2014\u2014\u8fd9\u5c31\u662f\u77e9\u9635\u4e58\u6cd5\u4e0d\u6ee1\u8db3\u4ea4\u6362\u5f8b\u7684\u539f\u56e0\u3002
\u65cb\u8f6c\u5c06\u5411\u91cf\u7ed5\u4e00\u5b9a\u89d2\u5ea6 \\(\\theta\\) \u8f6c\u52a8\u800c\u4e0d\u6539\u53d8\u5176\u957f\u5ea6\u3002\u5411\u91cf\u5927\u5c0f\u4e0d\u53d8\uff0c\u53ea\u662f\u6307\u5411\u65b0\u7684\u65b9\u5411\u3002
\u56e0\u6b64 \\([1, 0]^T\\) \u53d8\u6210 \\([0, 1]^T\\)\u3002\u539f\u6765\u6307\u5411\u53f3\u4fa7\u7684\u5411\u91cf\u73b0\u5728\u6307\u5411\u4e0a\u65b9\u3002\u65cb\u8f6c\u77e9\u9635\u662f\u6b63\u4ea4\u7684\uff0c\u4e14\u884c\u5217\u5f0f\u59cb\u7ec8\u4e3a1\u3002\u5f53\u4f60\u5728\u624b\u673a\u4e0a\u65cb\u8f6c\u7167\u7247\u65f6\uff0c\u5c31\u662f\u5bf9\u6bcf\u4e2a\u50cf\u7d20\u5750\u6807\u5e94\u7528\u8fd9\u4e2a\u77e9\u9635\u3002
\\(S(2, 1.5)\\) \u5c06x\u5206\u91cf\u52a0\u500d\uff0cy\u5206\u91cf\u4e58\u4ee51.5\u3002\u6cbf\u67d0\u8f74\u7f29\u653e \\(-1\\) \u4f1a\u7ffb\u8f6c\u8be5\u5206\u91cf\u3002\u5bf9\u89d2\u77e9\u9635\u603b\u662f\u7f29\u653e\u53d8\u6362\u3002\u5f53\u4f60\u5c06\u56fe\u7247\u7f29\u5c0f\u523050%\u65f6\uff0c\u5c31\u662f\u5bf9\u6bcf\u4e2a\u50cf\u7d20\u5750\u6807\u5e94\u7528 \\(S(0.5, 0.5)\\)\u3002
\u53cd\u5c04\u50cf\u955c\u5b50\u4e00\u6837\u5c06\u5411\u91cf\u7ffb\u8f6c\u5230\u67d0\u4e2a\u8f74\u6216\u76f4\u7ebf\u7684\u53e6\u4e00\u4fa7\u3002\u6cbfx\u8f74\u7684\u53cd\u5c04\u4fdd\u6301x\u5206\u91cf\u4e0d\u53d8\uff0c\u53d6\u53cdy\u5206\u91cf\uff1a
\u53cd\u5c04\u77e9\u9635\u7684\u884c\u5217\u5f0f\u4e3a \\(-1\\)\uff0c\u8868\u660e\u5b83\u4eec\u7ffb\u8f6c\u4e86\u65b9\u5411\u3002
\u65cb\u8f6c\u548c\u53cd\u5c04\u90fd\u662f\u521a\u6027\u53d8\u6362\uff1a\u5b83\u4eec\u4fdd\u6301\u8ddd\u79bb\u548c\u89d2\u5ea6\u4e0d\u53d8\u3002\u8868\u793a\u8fd9\u4e9b\u53d8\u6362\u7684\u77e9\u9635\u662f\u6b63\u4ea4\u77e9\u9635\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6b63\u4ea4\u77e9\u9635\u7684\u884c\u5217\u5f0f\u603b\u662f \\(+1\\)\uff08\u65cb\u8f6c\uff09\u6216 \\(-1\\)\uff08\u53cd\u5c04\uff09\u3002
\u526a\u5207\u6cbf\u4e00\u4e2a\u5750\u6807\u8f74\u6309\u53e6\u4e00\u5750\u6807\u8f74\u7684\u6bd4\u4f8b\u503e\u659c\u5411\u91cf\u3002\u6c34\u5e73\u526a\u5207\u56e0\u5b50 \\(k\\)\uff1a
\u6bcf\u4e2a\u70b9\u6c34\u5e73\u6ed1\u52a8 \\(k\\) \u500d\u4e8e\u5176\u9ad8\u5ea6\u7684\u8ddd\u79bb\u3002\u5f53 \\(k = 0.5\\) \u65f6\uff0c\u9ad8\u5ea6\u4e3a2\u7684\u70b9\u5411\u53f3\u79fb\u52a81\u3002\u6700\u4e0b\u9762\u4e00\u884c\u4fdd\u6301\u4e0d\u52a8\uff0c\u6700\u4e0a\u9762\u4e00\u884c\u6ed1\u52a8\u6700\u591a\u3002\u8fd9\u5c31\u662f\u659c\u4f53\u6587\u5b57\u7684\u5de5\u4f5c\u539f\u7406\uff1a\u6b63\u7acb\u7684\u5b57\u6bcd\u88ab\u526a\u5207\uff0c\u4ece\u800c\u5411\u53f3\u503e\u659c\u3002
\u4ee5\u4e0a\u6240\u6709\u53d8\u6362\uff08\u65cb\u8f6c\u3001\u7f29\u653e\u3001\u53cd\u5c04\u3001\u526a\u5207\uff09\u90fd\u662f\u7ebf\u6027\u53d8\u6362\u3002\u5b83\u4eec\u4fdd\u6301\u539f\u70b9\u56fa\u5b9a\uff0c\u5e76\u4fdd\u6301\u76f4\u7ebf\u4e3a\u76f4\u7ebf\u3002\u4f46\u5e73\u79fb\uff08\u5c06\u6240\u6709\u70b9\u6309\u56fa\u5b9a\u91cf\u79fb\u52a8\uff09\u5462\uff1f
\u5e73\u79fb\u4e0d\u662f\u7ebf\u6027\u53d8\u6362\uff0c\u56e0\u4e3a\u5b83\u79fb\u52a8\u4e86\u539f\u70b9\u3002\u5982\u679c\u5c06\u6bcf\u4e2a\u70b9\u5411\u53f3\u79fb\u52a83\uff0c\u96f6\u5411\u91cf\u4f1a\u79fb\u52a8\u5230 \\([3, 0]^T\\)\uff0c\u4ece\u800c\u7834\u574f\u4e86\u7ebf\u6027\u6027\u8d28\u3002\u4e3a\u4e86\u5904\u7406\u5e73\u79fb\uff0c\u6211\u4eec\u4f7f\u7528\u4eff\u5c04\u53d8\u6362\uff0c\u5b83\u5c06\u7ebf\u6027\u53d8\u6362\u4e0e\u5e73\u79fb\u7ed3\u5408\u8d77\u6765\uff1a
\u4eff\u5c04\u53d8\u6362\u4fdd\u6301\u76f4\u7ebf\u548c\u5e73\u884c\u6027\uff0c\u4f46\u4e0d\u4e00\u5b9a\u4fdd\u6301\u89d2\u5ea6\u6216\u957f\u5ea6\u3002\u7535\u5b50\u6e38\u620f\u4e2d\u7684\u6bcf\u4e2a\u7269\u4f53\u90fd\u4f7f\u7528\u4eff\u5c04\u53d8\u6362\u6765\u5b9a\u4f4d\uff1a\u65cb\u8f6c\u5b83\u3001\u7f29\u653e\u5b83\uff0c\u7136\u540e\u653e\u7f6e\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u2014\u2014\u6240\u6709\u8fd9\u4e9b\u90fd\u7f16\u7801\u5728\u4e00\u4e2a\u77e9\u9635\u4e2d\u3002
\u9000\u5316\u53d8\u6362\uff08\u5947\u5f02\u77e9\u9635\uff09\u5c06\u7a7a\u95f4\u574d\u7f29\u5230\u66f4\u4f4e\u7ef4\u5ea6\u3002
\u4f8b\u5982\uff0c\u77e9\u9635
\u5c06\u6bcf\u4e2a\u4e8c\u7ef4\u5411\u91cf\u6620\u5c04\u5230\u4e00\u6761\u76f4\u7ebf\u4e0a\uff0c\u56e0\u4e3a\u4e24\u5217\u6307\u5411\u540c\u4e00\u65b9\u5411\u3002\u884c\u5217\u5f0f\u4e3a\u96f6\uff0c\u4fe1\u606f\u4e22\u5931\uff0c\u4e14\u8be5\u53d8\u6362\u4e0d\u53ef\u9006\u3002
\u5c06\u5f69\u8272\u56fe\u50cf\uff08\u6bcf\u4e2a\u50cf\u7d20\u67093\u4e2a\u503c\uff1a\u7ea2\u3001\u7eff\u3001\u84dd\uff09\u8f6c\u6362\u4e3a\u7070\u5ea6\u56fe\uff08\u6bcf\u4e2a\u50cf\u7d201\u4e2a\u503c\uff09\u5c31\u662f\u9000\u5316\u53d8\u6362\uff1a\u989c\u8272\u4fe1\u606f\u6c38\u4e45\u4e22\u5931\u3002
\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u7ebf\u6027\u53d8\u6362\u662f\u795e\u7ecf\u7f51\u7edc\u7684\u6838\u5fc3\u3002\u6570\u636e\u88ab\u8868\u793a\u4e3a\u77e9\u9635\uff08\u5411\u91cf\u7684\u5806\u53e0\uff0c\u8fd9\u4e9b\u5411\u91cf\u4ee3\u8868\u5bf9\u8c61\u7684\u7279\u5f81\u2014\u2014\u4eba\u3001\u98de\u673a\u3001\u6587\u672c\u3001\u56fe\u50cf\u2026\u2026\u4efb\u4f55\u4e1c\u897f\uff01\uff09
\u6bcf\u4e00\u5c42\u5e94\u7528\u4e00\u4e2a\u77e9\u9635\u4e58\u6cd5\uff08\u7ebf\u6027\u53d8\u6362\uff09\uff0c\u8be6\u7ec6\u5185\u5bb9\u5728\u5176\u4ed6\u7ae0\u8282\u4e2d\u63d0\u4f9b\uff0c\u6211\u4eec\u9700\u8981\u89e3\u91ca\u5982\u4f55\u7ec4\u7ec7\u8fd9\u4e9b\u6570\u636e\u5e76\u6070\u5f53\u5730\u5f15\u51fa\u795e\u7ecf\u7f51\u7edc\u3002
\u7136\u800c\uff0c\u5f53\u4eca\u6700\u5e38\u7528\u7684\u6280\u672f\u51e0\u4e4e\u5b8c\u5168\u662f\u5c06\u6570\u636e\u901a\u8fc7\u4e00\u7cfb\u5217\u7ebf\u6027\u53d8\u6362\u4f20\u9012\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3aTransformer\u3002
Gemini\u3001ChatGPT\u3001Claude\u3001Qwen\u3001DeepSeek\u4ee5\u53ca\u5f53\u4eca\u4e16\u754c\u4e0a\u6027\u80fd\u6700\u597d\u7684AI\uff0c\u90fd\u662fTransformer\uff01
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ntheta = jnp.pi / 3\nR = jnp.array([[jnp.cos(theta), -jnp.sin(theta)],\n [jnp.sin(theta), jnp.cos(theta)]])\n\nv = jnp.array([1.0, 0.0])\nv_rot = R @ v\n\nplt.figure(figsize=(5, 5))\nplt.quiver(0, 0, v[0], v[1], angles='xy', scale_units='xy', scale=1, color='red', label='original')\nplt.quiver(0, 0, v_rot[0], v_rot[1], angles='xy', scale_units='xy', scale=1, color='blue', label='rotated')\nplt.xlim(-1.5, 1.5); plt.ylim(-1.5, 1.5)\nplt.grid(True); plt.legend(); plt.gca().set_aspect('equal')\nplt.show()\n import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nsquare = jnp.array([[0,0],[1,0],[1,1],[0,1],[0,0]]).T\n\nk = 0.5\nshear = jnp.array([[1, k],\n [0, 1]])\nsheared = shear @ square\n\nplt.figure(figsize=(6, 4))\nplt.plot(square[0], square[1], 'r-o', label='original')\nplt.plot(sheared[0], sheared[1], 'b-o', label='sheared')\nplt.grid(True); plt.legend(); plt.gca().set_aspect('equal')\nplt.show()\n"},{"location":"chapter%2002%3A%20matrices/05.%20decompositions/","title":"\u77e9\u9635\u5206\u89e3","text":"\u77e9\u9635\u5206\u89e3\u5c06\u590d\u6742\u77e9\u9635\u62c6\u5206\u4e3a\u66f4\u7b80\u5355\u7684\u56e0\u5b50\uff0c\u7528\u4e8e\u6c42\u89e3\u65b9\u7a0b\u7ec4\u3001\u8ba1\u7b97\u9006\u77e9\u9635\u548c\u6570\u636e\u538b\u7f29\u3002\u672c\u6587\u6db5\u76d6\u9ad8\u65af\u6d88\u5143\u3001LU\u3001QR\u3001Cholesky\u3001\u7279\u5f81\u5206\u89e3\u548cSVD\u2014\u2014\u8fd9\u4e9b\u7b97\u6cd5\u662fPCA\u3001\u63a8\u8350\u7cfb\u7edf\u548c\u673a\u5668\u5b66\u4e60\u6570\u503c\u7a33\u5b9a\u6027\u7684\u57fa\u77f3\u3002
\u77e9\u9635\u5206\u89e3\uff08\u6216\u56e0\u5b50\u5206\u89e3\uff09\u5c06\u4e00\u4e2a\u77e9\u9635\u62c6\u5206\u6210\u66f4\u5bb9\u6613\u5904\u7406\u7684\u66f4\u7b80\u5355\u7684\u90e8\u5206\u3002\u53ef\u4ee5\u628a\u5b83\u7c7b\u6bd4\u4e3a\u56e0\u6570\u5206\u89e3\uff1a\\(12 = 3 \\times 4\\) \u6bd4\u5355\u72ec\u768412\u66f4\u5bb9\u6613\u7406\u89e3\u3002
\u6211\u4eec\u5206\u89e3\u77e9\u9635\u662f\u4e3a\u4e86\u66f4\u5feb\u5730\u6c42\u89e3\u65b9\u7a0b\u7ec4\u3001\u7a33\u5b9a\u5730\u8ba1\u7b97\u9006\u77e9\u9635\u3001\u5bfb\u627e\u7279\u5f81\u503c\u3001\u538b\u7f29\u6570\u636e\u4ee5\u53ca\u7406\u89e3\u53d8\u6362\u7684\u51e0\u4f55\u7ed3\u6784\u3002
\u6700\u57fa\u672c\u7684\u6280\u672f\u662f\u9ad8\u65af\u6d88\u5143\uff08\u884c\u5316\u7b80\uff09\u3002\u601d\u8def\u5f88\u7b80\u5355\uff1a\u7ed9\u5b9a\u65b9\u7a0b\u7ec4 \\(A\\mathbf{x} = \\mathbf{b}\\)\uff0c\u4f7f\u7528\u4e09\u79cd\u5141\u8bb8\u7684\u64cd\u4f5c\u7b80\u5316 \\(A\\)\uff0c\u76f4\u5230\u7b54\u6848\u663e\u800c\u6613\u89c1\u3002
\u8fd9\u4e9b\u64cd\u4f5c\u662f\uff1a\u4ea4\u6362\u4e24\u884c\u3001\u5c06\u4e00\u884c\u4e58\u4ee5\u975e\u96f6\u6807\u91cf\u3001\u6216\u5c06\u4e00\u884c\u7684\u500d\u6570\u52a0\u5230\u53e6\u4e00\u884c\u4e0a\u3002
\u4f8b\u5982\uff0c\u8981\u6d88\u9664\u4e3b\u5143\u4e0b\u65b9\u7684\u7b2c\u4e00\u5217\uff0c\u4ece\u4e0b\u9762\u7684\u884c\u4e2d\u51cf\u53bb\u7b2c1\u884c\u7684\u500d\u6570\uff1a
\u8fdb\u4e00\u6b65\u5f97\u5230\u7b80\u5316\u884c\u9636\u68af\u5f62\uff08RREF\uff09\uff0c\u4f7f\u6bcf\u4e2a\u4e3b\u5143\u4e3a1\u4e14\u662f\u8be5\u5217\u4e2d\u552f\u4e00\u7684\u975e\u96f6\u6761\u76ee\u3002\u6bcf\u4e2a\u77e9\u9635\u6709\u552f\u4e00\u7684RREF\u3002
\u4e00\u65e6\u8f6c\u6362\u4e3a\u4e09\u89d2\u5f62\u5f62\u5f0f\uff0c\u6211\u4eec\u901a\u8fc7\u56de\u4ee3\u6c42\u89e3\uff1a\u6700\u4e0b\u9762\u4e00\u884c\u76f4\u63a5\u7ed9\u51fa\u6700\u540e\u4e00\u4e2a\u53d8\u91cf\uff0c\u7136\u540e\u5411\u4e0a\u6c42\u89e3\u3002
\u8fd9\u662f\u6240\u6709\u5176\u4ed6\u5206\u89e3\u65b9\u6cd5\u6240\u5efa\u7acb\u7684\u57fa\u7840\uff0c\u5206\u89e3\u7684\u76ee\u6807\u5c31\u662f\u5c06\u77e9\u9635\u7b80\u5316\u4e3a\u4e09\u89d2\u5f62\u5f62\u5f0f\uff0c\u4ece\u800c\u53ef\u4ee5\u901a\u8fc7\u56de\u4ee3\u6c42\u89e3\u53d8\u91cf\u3002
LU\u5206\u89e3\u5c06\u9ad8\u65af\u6d88\u5143\u5f62\u5f0f\u5316\uff0c\u5c06\u65b9\u9635\u5206\u89e3\u4e3a \\(A = LU\\)\uff08\u6216\u901a\u8fc7\u884c\u4ea4\u6362\u5f97\u5230 \\(A = PLU\\)\uff09\uff0c\u5176\u4e2d \\(L\\) \u662f\u4e0b\u4e09\u89d2\u77e9\u9635\uff0c\\(U\\) \u662f\u4e0a\u4e09\u89d2\u77e9\u9635\u3002
\u6c42\u89e3 \\(A\\mathbf{x} = \\mathbf{b}\\)\uff1a\u5148\u901a\u8fc7\u524d\u5411\u4ee3\u5165\uff08\u4ece\u4e0a\u5230\u4e0b\uff09\u6c42\u89e3 \\(L\\mathbf{y} = \\mathbf{b}\\)\uff0c\u7136\u540e\u901a\u8fc7\u56de\u4ee3\uff08\u4ece\u4e0b\u5230\u4e0a\uff09\u6c42\u89e3 \\(U\\mathbf{x} = \\mathbf{y}\\)\u3002\u4e24\u6b21\u7b80\u5355\u7684\u4e09\u89d2\u6c42\u89e3\u4ee3\u66ff\u4e86\u4e00\u6b21\u56f0\u96be\u7684\u4e00\u822c\u6c42\u89e3\u3002
\u76f8\u6bd4\u539f\u59cb\u9ad8\u65af\u6d88\u5143\u7684\u4f18\u52bf\u5728\u4e8e\u53ef\u590d\u7528\u3002\u4e00\u65e6\u5f97\u5230 \\(L\\) \u548c \\(U\\)\uff0c\u5c31\u53ef\u4ee5\u5bf9\u8bb8\u591a\u4e0d\u540c\u7684 \\(\\mathbf{b}\\) \u5411\u91cf\u6c42\u89e3\uff0c\u800c\u65e0\u9700\u91cd\u65b0\u8fdb\u884c\u5206\u89e3\u3002
\u5982\u679c\u4f60\u9700\u8981\u75281000\u4e2a\u4e0d\u540c\u7684\u53f3\u7aef\u9879\u6c42\u89e3\u540c\u4e00\u4e2a\u65b9\u7a0b\u7ec4\uff08\u8fd9\u5728\u6a21\u62df\u4e2d\u5f88\u5e38\u89c1\uff09\uff0c\u53ea\u9700\u5206\u89e3\u4e00\u6b21\u7136\u540e\u91cd\u590d\u4f7f\u7528\u3002
\u5f53\u77e9\u9635\u662f\u5bf9\u79f0\u6b63\u5b9a\u77e9\u9635\u65f6\uff08\u5982\u534f\u65b9\u5dee\u77e9\u9635\uff09\uff0c\u6211\u4eec\u53ef\u4ee5\u505a\u5f97\u66f4\u597d\u3002
Cholesky\u5206\u89e3\u5c06\u5176\u5206\u89e3\u4e3a \\(A = LL^T\\)\uff0c\u5176\u4e2d \\(L\\) \u662f\u4e0b\u4e09\u89d2\u77e9\u9635\u3002\u4f8b\u5982\uff1a
\u8fd9\u5927\u7ea6\u6bd4LU\u5feb\u4e24\u500d\uff0c\u5e76\u4e14\u4fdd\u8bc1\u6570\u503c\u7a33\u5b9a\u3002\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u77e9\u9635\u7684\"\u5e73\u65b9\u6839\"\u3002
\u5982\u679c\u5206\u89e3\u5931\u8d25\uff08\u5e73\u65b9\u6839\u4e0b\u51fa\u73b0\u8d1f\u503c\uff09\uff0c\u5219\u8be5\u77e9\u9635\u4e0d\u662f\u6b63\u5b9a\u7684\u3002\u56e0\u6b64Cholesky\u5206\u89e3\u4e5f\u53ef\u4ee5\u4f5c\u4e3a\u6b63\u5b9a\u6027\u7684\u68c0\u9a8c\u65b9\u6cd5\u3002
\u65b9\u9635 \\(A\\) \u7684\u7279\u5f81\u5411\u91cf\u662f\u7279\u6b8a\u65b9\u5411\uff0c\u8be5\u53d8\u6362\u5728\u8fd9\u4e9b\u65b9\u5411\u4e0a\u53ea\u8fdb\u884c\u62c9\u4f38\u6216\u538b\u7f29\uff0c\u800c\u4e0d\u65cb\u8f6c\u3002\u7279\u5f81\u503c\u662f\u7f29\u653e\u56e0\u5b50\uff1a
\u5927\u591a\u6570\u5411\u91cf\u5728\u4e58\u4ee5\u77e9\u9635\u65f6\u65b9\u5411\u4f1a\u6539\u53d8\u3002\u4f46\u7279\u5f81\u5411\u91cf\u662f\u7279\u6b8a\u7684\uff1a\u8f93\u51fa\u65b9\u5411\u4e0e\u8f93\u5165\u65b9\u5411\u76f8\u540c\uff0c\u4ec5\u88ab \\(\\lambda\\) \u7f29\u653e\u3002\u5982\u679c \\(\\lambda = 2\\)\uff0c\u7279\u5f81\u5411\u91cf\u957f\u5ea6\u52a0\u500d\u3002\u5982\u679c \\(\\lambda = -1\\)\uff0c\u5b83\u7ffb\u8f6c\u65b9\u5411\u3002\u5982\u679c \\(\\lambda = 0\\)\uff0c\u5b83\u88ab\u538b\u7f29\u4e3a\u96f6\u3002
\u4f8b\u5982\uff0c\u5bf9\u4e8e\uff1a
\u5411\u91cf \\([1, 0]^T\\) \u662f\u7279\u5f81\u5411\u91cf\uff0c\\(\\lambda = 3\\)\uff0c\u56e0\u4e3a \\(A[1, 0]^T = [3, 0]^T = 3[1, 0]^T\\)\u3002
\u6c42\u7279\u5f81\u503c\u9700\u8981\u89e3\u7279\u5f81\u591a\u9879\u5f0f \\(\\det(A - \\lambda I) = 0\\)\u3002\u6839\u5373\u4e3a\u7279\u5f81\u503c\u3002\u7136\u540e\u5c06\u6bcf\u4e2a \\(\\lambda\\) \u4ee3\u56de \\((A - \\lambda I)\\mathbf{x} = \\mathbf{0}\\) \u4e2d\uff0c\u6c42\u51fa\u5bf9\u5e94\u7684\u7279\u5f81\u5411\u91cf\u3002
\u5173\u952e\u6027\u8d28\uff1a
\u901a\u8fc7\u7279\u5f81\u591a\u9879\u5f0f\u8ba1\u7b97\u7279\u5f81\u503c\u5bf9\u4e8e\u5927\u578b\u77e9\u9635\u6765\u8bf4\u662f\u4e0d\u5207\u5b9e\u9645\u7684\u3002\u76f8\u53cd\uff0c\u4f7f\u7528\u8fed\u4ee3\u65b9\u6cd5\uff1a
\u5e42\u8fed\u4ee3\uff1a\u53cd\u590d\u4e58\u4ee5 \\(A\\) \u5e76\u5f52\u4e00\u5316\u3002\u6536\u655b\u5230\u4e3b\u7279\u5f81\u5411\u91cf\uff08\u6700\u5927\u7279\u5f81\u503c\uff09\u3002\u7b80\u5355\u4f46\u53ea\u80fd\u627e\u5230\u4e00\u4e2a\u7279\u5f81\u5bf9\u3002
QR\u7b97\u6cd5\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u3002\u4f7f\u7528QR\u5206\u89e3\u53cd\u590d\u5206\u89e3\u548c\u91cd\u7ec4\u77e9\u9635\uff0c\u76f4\u5230\u77e9\u9635\u6536\u655b\u5230\u4e09\u89d2\u5f62\u5f62\u5f0f\uff0c\u5bf9\u89d2\u7ebf\u4e0a\u7684\u5143\u7d20\u5373\u4e3a\u6240\u6709\u7279\u5f81\u503c\u3002
\u53cd\u8fed\u4ee3\uff1a\u5bfb\u627e\u6700\u63a5\u8fd1\u7ed9\u5b9a\u76ee\u6807\u503c\u7684\u7279\u5f81\u5411\u91cf\u3002\u5f53\u4f60\u5927\u81f4\u77e5\u9053\u60f3\u8981\u54ea\u4e2a\u7279\u5f81\u503c\u65f6\u5f88\u6709\u7528\u3002
\u5bf9\u4e8e\u5927\u578b\u7a00\u758f\u77e9\u9635\uff0cArnoldi\u548cLanczos\u8fed\u4ee3\u5229\u7528\u7a00\u758f\u6027\u63d0\u9ad8\u6548\u7387\u3002
\u5982\u679c\u65b9\u9635\u6709\u4e00\u7ec4\u5b8c\u6574\u7684\u7ebf\u6027\u65e0\u5173\u7684\u7279\u5f81\u5411\u91cf\uff0c\u5b83\u53ef\u4ee5\u88ab\u5bf9\u89d2\u5316\uff1a\\(A = PDP^{-1}\\)\uff0c\u5176\u4e2d \\(D\\) \u662f\u4ee5\u7279\u5f81\u503c\u4e3a\u5bf9\u89d2\u5143\u7684\u5bf9\u89d2\u77e9\u9635\uff0c\\(P\\) \u7684\u5217\u662f\u7279\u5f81\u5411\u91cf\u3002
\u8fd9\u6709\u4ec0\u4e48\u7528\uff1f\u5bf9\u89d2\u77e9\u9635\u975e\u5e38\u5bb9\u6613\u5904\u7406\u3002\u9700\u8981\u8ba1\u7b97 \\(A^{100}\\)\uff1f\u4e0d\u7528\u5c06 \\(A\\) \u81ea\u4e58100\u6b21\uff0c\u8ba1\u7b97 \\(PD^{100}P^{-1}\\) \u5373\u53ef\u2014\u2014\u800c\u5bf9\u89d2\u77e9\u9635\u7684\u5e42\u53ea\u9700\u72ec\u7acb\u5730\u5bf9\u6bcf\u4e2a\u5bf9\u89d2\u5143\u6c42\u5e42\u3002\u8fd9\u5c06\u4e00\u4e2a\u6602\u8d35\u7684\u8fd0\u7b97\u53d8\u6210\u4e86\u5ec9\u4ef7\u8fd0\u7b97\u3002
\u7279\u5f81\u57fa\u662f\u5b8c\u5168\u7531\u7279\u5f81\u5411\u91cf\u6784\u6210\u7684\u57fa\u3002\u5728\u8fd9\u4e2a\u57fa\u4e0b\uff0c\u77e9\u9635\u53d8\u6210\u5bf9\u89d2\u77e9\u9635\uff0c\u53d8\u6362\u4ec5\u4ec5\u662f\u6cbf\u6bcf\u4e2a\u7279\u5f81\u5411\u91cf\u65b9\u5411\u7684\u72ec\u7acb\u7f29\u653e\u3002\u8fd9\u5c31\u50cf\u662f\u627e\u5230\u4e86\u53d8\u6362\u7684\u81ea\u7136\u5750\u6807\u7cfb\u3002
QR\u5206\u89e3\u5c06\u4efb\u610f\u77e9\u9635 \\(A\\) \u5206\u89e3\u4e3a \\(A = QR\\)\uff0c\u5176\u4e2d \\(Q\\) \u662f\u6b63\u4ea4\u77e9\u9635\uff08\u5176\u5217\u662f\u6807\u51c6\u6b63\u4ea4\u7684\uff09\uff0c\\(R\\) \u662f\u4e0a\u4e09\u89d2\u77e9\u9635\u3002\u53ef\u4ee5\u7406\u89e3\u4e3a\u5c06\"\u65b9\u5411\"\u4fe1\u606f\uff08\\(Q\\)\uff09\u4e0e\"\u7f29\u653e\u548c\u6df7\u5408\"\u4fe1\u606f\uff08\\(R\\)\uff09\u5206\u5f00\u3002
Gram-Schmidt\u8fc7\u7a0b\u9010\u5217\u6784\u5efa \\(Q\\)\u3002\u53d6 \\(A\\) \u7684\u7b2c\u4e00\u5217\u5e76\u5f52\u4e00\u5316\u3002\u53d6\u7b2c\u4e8c\u5217\uff0c\u51cf\u53bb\u5176\u5728\u7b2c\u4e00\u5217\u4e0a\u7684\u6295\u5f71\uff08\u4f7f\u5176\u5782\u76f4\uff09\uff0c\u518d\u5f52\u4e00\u5316\u3002\u5bf9\u6bcf\u4e00\u5217\u91cd\u590d\u6b64\u8fc7\u7a0b\u3002\u7ed3\u679c\u662f\u4e00\u7ec4\u6807\u51c6\u6b63\u4ea4\u5411\u91cf\u3002
QR\u5206\u89e3\u662fQR\u7b97\u6cd5\u6c42\u7279\u5f81\u503c\u80cc\u540e\u7684\u5f15\u64ce\u3002\u5b83\u4e5f\u76f4\u63a5\u7528\u4e8e\u6c42\u89e3\u6700\u5c0f\u4e8c\u4e58\u95ee\u9898\uff1a\u5f53 \\(A\\mathbf{x} = \\mathbf{b}\\) \u6ca1\u6709\u7cbe\u786e\u89e3\uff08\u65b9\u7a0b\u591a\u4e8e\u672a\u77e5\u6570\uff09\u65f6\uff0cQR\u627e\u5230\u6700\u4f73\u8fd1\u4f3c\u89e3\u3002
SVD\uff08\u5947\u5f02\u503c\u5206\u89e3\uff09\u662f\u6700\u901a\u7528\u3001\u4e5f\u53ef\u4ee5\u8bf4\u662f\u6700\u91cd\u8981\u7684\u5206\u89e3\u3002\u6bcf\u4e2a\u77e9\u9635\uff08\u4efb\u610f\u5f62\u72b6\u3001\u4efb\u610f\u79e9\uff09\u90fd\u6709SVD\uff1a\\(A = U\\Sigma V^T\\)
\u51e0\u4f55\u4e0a\uff0cSVD\u8868\u660e\u6bcf\u4e2a\u7ebf\u6027\u53d8\u6362\uff0c\u65e0\u8bba\u591a\u4e48\u590d\u6742\uff0c\u90fd\u53ea\u662f\u4e00\u4e2a\u65cb\u8f6c\u3001\u4e00\u4e2a\u6cbf\u5750\u6807\u8f74\u7684\u62c9\u4f38\u3001\u518d\u4e00\u4e2a\u65cb\u8f6c\u7684\u7ec4\u5408\u3002\u4e00\u4e2a\u5706\u53d8\u6210\u4e86\u4e00\u4e2a\u692d\u5706\u3002
\u5947\u5f02\u503c\uff08\\(\\sigma_1 \\geq \\sigma_2 \\geq \\ldots\\)\uff09\u63ed\u793a\u4e86\u6bcf\u4e2a\u65b9\u5411\u7684\"\u91cd\u8981\u6027\"\u3002\u5927\u7684\u5947\u5f02\u503c\u5bf9\u5e94\u6700\u91cd\u8981\u7684\u65b9\u5411\u3002\\(A\\) \u7684\u79e9\u7b49\u4e8e\u975e\u96f6\u5947\u5f02\u503c\u7684\u4e2a\u6570\u3002
\u4f4e\u79e9\u8fd1\u4f3c\uff1a\u53ea\u4fdd\u7559\u6700\u5927\u7684 \\(k\\) \u4e2a\u5947\u5f02\u503c\uff0c\u5c06\u5176\u4ed6\u7f6e\u96f6\uff0c\u5c31\u5f97\u5230\u4e86 \\(A\\) \u7684\u6700\u4f73\u79e9-\\(k\\) \u8fd1\u4f3c\u3002\u8fd9\u5c31\u662f\u56fe\u50cf\u538b\u7f29\u7684\u539f\u7406\uff1a\u4e00\u5f20 \\(1000 \\times 1000\\) \u7684\u56fe\u50cf\u53ef\u80fd\u53ea\u9700\u8981 \\(k = 50\\) \u4e2a\u5947\u5f02\u503c\u5c31\u80fd\u770b\u8d77\u6765\u51e0\u4e4e\u4e00\u6a21\u4e00\u6837\uff0c\u538b\u7f29\u4e8620\u500d\u3002
SVD\u4e5f\u63d0\u4f9b\u4e86\u4f2a\u9006\uff1a\\(A^+ = V\\Sigma^+U^T\\)\uff0c\u5176\u4e2d \\(\\Sigma^+\\) \u662f\u5bf9\u975e\u96f6\u5947\u5f02\u503c\u53d6\u5012\u6570\u3002
\u7279\u5f81\u5206\u89e3\u53ea\u5bf9\u65b9\u9635\u6709\u6548\uff0c\u800cSVD\u5bf9\u4efb\u610f\u77e9\u9635\u90fd\u6709\u6548\u3002\u8fd9\u662f\u5b83\u7684\u5173\u952e\u4f18\u52bf\u3002
PCA\uff08\u4e3b\u6210\u5206\u5206\u6790\uff09\u4f7f\u7528\u7279\u5f81\u5206\u89e3\uff08\u6216SVD\uff09\u8fdb\u884c\u964d\u7ef4\u3002
\u60f3\u8c61\u4e00\u4e2a\u6570\u636e\u96c6\uff0c\u6bcf\u4e2a\u6837\u672c\u6709100\u4e2a\u7279\u5f81\uff08\u5806\u53e0\u6210\u77e9\u9635\u7684100\u7ef4\u5411\u91cf\uff09\u3002\u5176\u4e2d\u8bb8\u591a\u7279\u5f81\u662f\u76f8\u5173\u7684\u3001\u5197\u4f59\u7684\u3002
PCA\u627e\u5230\u6570\u636e\u5b9e\u9645\u53d8\u5316\u7684\u90a3\u4e9b\u65b9\u5411\uff0c\u8ba9\u4f60\u53ea\u4fdd\u7559\u91cd\u8981\u7684\u90e8\u5206\u3002
\u7b2c\u4e00\u4e3b\u6210\u5206\uff08PC1\uff09\u662f\u65b9\u5dee\u6700\u5927\u7684\u65b9\u5411\u3002
\u7b2c\u4e8c\u4e3b\u6210\u5206\uff08PC2\uff09\u6355\u83b7\u5269\u4f59\u90e8\u5206\u7684\u6700\u5927\u65b9\u5dee\uff0c\u4e14\u4e0e\u7b2c\u4e00\u4e3b\u6210\u5206\u5782\u76f4\u3002
\u5982\u679c\u5927\u90e8\u5206\u65b9\u5dee\u53ea\u96c6\u4e2d\u5728\u5c11\u6570\u51e0\u4e2a\u65b9\u5411\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5c06\u6570\u636e\u6295\u5f71\u5230\u8fd9\u4e9b\u7ef4\u5ea6\u4e0a\uff0c\u4e22\u5f03\u5176\u4f59\u90e8\u5206\uff0c\u635f\u5931\u6781\u5c0f\u3002
\u6b65\u9aa4\uff1a
\u6807\u51c6\u5316\u81f3\u5173\u91cd\u8981\uff1a\u5982\u679c\u4e0d\u505a\u6807\u51c6\u5316\uff0c\u7528\u516c\u91cc\u6d4b\u91cf\u7684\u7279\u5f81\u4f1a\u4e3b\u5bfc\u7528\u5398\u7c73\u6d4b\u91cf\u7684\u7279\u5f81\uff0c\u800c\u4e0d\u8bba\u5176\u5b9e\u9645\u91cd\u8981\u6027\u5982\u4f55\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0cPCA\u7528\u4e8e\u53ef\u89c6\u5316\uff08\u5c06\u9ad8\u7ef4\u6570\u636e\u6295\u5f71\u52302D\u62163D\uff09\u3001\u964d\u566a\uff08\u4e22\u5f03\u4e3b\u8981\u662f\u566a\u58f0\u7684\u4f4e\u65b9\u5dee\u65b9\u5411\uff09\uff0c\u4ee5\u53ca\u901a\u8fc7\u51cf\u5c11\u8f93\u5165\u7279\u5f81\u6570\u91cf\u6765\u52a0\u901f\u673a\u5668\u5b66\u4e60\u6a21\u578b\u3002
\u6838PCA\u5c06PCA\u6269\u5c55\u5230\u975e\u7ebf\u6027\u5173\u7cfb\u3002\u5b83\u901a\u8fc7\u6838\u51fd\u6570\u5c06\u6570\u636e\u6620\u5c04\u5230\u66f4\u9ad8\u7ef4\u7a7a\u95f4\uff0c\u5728\u90a3\u91cc\u7ed3\u6784\u53d8\u5f97\u7ebf\u6027\uff0c\u7136\u540e\u5e94\u7528\u6807\u51c6PCA\u5e76\u6295\u5f71\u56de\u6765\u3002
Schur\u5206\u89e3\u5c06\u65b9\u9635\u5206\u89e3\u4e3a \\(A = QTQ^\\ast\\)\uff0c\u5176\u4e2d \\(Q\\) \u662f\u9149\u77e9\u9635\uff0c\\(T\\) \u662f\u4e0a\u4e09\u89d2\u77e9\u9635\u3002\u6bcf\u4e2a\u65b9\u9635\u90fd\u6709Schur\u5206\u89e3\uff0c\u5373\u4f7f\u5b83\u4e0d\u80fd\u88ab\u5bf9\u89d2\u5316\u3002
\u975e\u8d1f\u77e9\u9635\u5206\u89e3\uff08NMF\uff09 \u5c06\u4e00\u4e2a\u77e9\u9635\u5206\u89e3\u4e3a\u4e24\u4e2a\u975e\u8d1f\u77e9\u9635\uff1a\\(A \\approx WH\\)\uff0c\u5176\u4e2d \\(W\\) \u548c \\(H\\) \u7684\u6240\u6709\u6761\u76ee\u90fd \\(\\geq 0\\)\u3002\u4e0e\u53ef\u80fd\u4ea7\u751f\u8d1f\u6761\u76ee\u7684SVD\u4e0d\u540c\uff0cNMF\u53ea\u505a\u52a0\u6cd5\uff0c\u4ece\u4e0d\u505a\u51cf\u6cd5\u3002\u8fd9\u4f7f\u5f97\u5404\u90e8\u5206\u53ef\u89e3\u91ca\uff1a\u5728\u4e3b\u9898\u5efa\u6a21\u4e2d\uff0c\\(W\\) \u7ed9\u51fa\u6bcf\u4e2a\u6587\u6863\u7684\u4e3b\u9898\u6743\u91cd\uff0c\\(H\\) \u7ed9\u51fa\u6bcf\u4e2a\u4e3b\u9898\u7684\u8bcd\u6743\u91cd\uff0c\u5168\u90e8\u975e\u8d1f\uff0c\u8fd9\u4e0e\u6211\u4eec\u5bf9\u6587\u6863\"\u5305\u542b\u591a\u5c11\u67d0\u4e2a\u4e3b\u9898\"\u7684\u601d\u8003\u65b9\u5f0f\u76f8\u7b26\u3002
\u8c31\u5b9a\u7406\u6307\u51fa\uff0c\u5bf9\u79f0\uff08\u6216Hermitian\uff09\u77e9\u9635\u603b\u53ef\u4ee5\u7528\u6b63\u4ea4\uff08\u6216\u9149\uff09\u77e9\u9635\u5bf9\u89d2\u5316\u3002\u5b83\u4eec\u7684\u7279\u5f81\u503c\u603b\u662f\u5b9e\u6570\uff0c\u7279\u5f81\u5411\u91cf\u603b\u662f\u6b63\u4ea4\u7684\u3002\u8fd9\u662fPCA\u7684\u7406\u8bba\u57fa\u7840\u3002
import jax.numpy as jnp\n\nA = jnp.array([[4.0, 2.0],\n [2.0, 3.0]])\n\neigenvalues, eigenvectors = jnp.linalg.eigh(A)\nprint(f\"Eigenvalues: {eigenvalues}\")\nprint(f\"Eigenvectors orthogonal: {jnp.dot(eigenvectors[:,0], eigenvectors[:,1]):.6f}\")\n\n# Reconstruct: A = P D P^T\nD = jnp.diag(eigenvalues)\nA_reconstructed = eigenvectors @ D @ eigenvectors.T\nprint(f\"Reconstruction matches: {jnp.allclose(A, A_reconstructed)}\")\n jnp.linalg.eigh \u6bd4\u8f83\u3002\u7136\u540e\u5c1d\u8bd5\u81ea\u5df1\u5b9e\u73b0QR\u7b97\u6cd5\u3002import jax.numpy as jnp\n\nA = jnp.array([[4.0, 2.0],\n [2.0, 3.0]])\n\n# Power iteration: finds the LARGEST eigenvalue\nv = jnp.array([1.0, 0.0])\nfor _ in range(20):\n v = A @ v\n v = v / jnp.linalg.norm(v)\nprint(f\"Largest eigenvalue: {v @ A @ v:.4f}\")\n\n# Inverse iteration: multiply by A^{-1} instead of A, finds the SMALLEST eigenvalue\nv = jnp.array([1.0, 0.0])\nfor _ in range(20):\n v = jnp.linalg.solve(A, v)\n v = v / jnp.linalg.norm(v)\nprint(f\"Smallest eigenvalue: {1.0 / (v @ jnp.linalg.solve(A, v)):.4f}\")\n\nprint(f\"jnp.linalg.eigh: {jnp.linalg.eigh(A)[0]}\")\n import jax.numpy as jnp\n\nA = jnp.array([[1.0, 2.0, 3.0],\n [4.0, 5.0, 6.0],\n [7.0, 8.0, 9.0]])\n\nU, S, Vt = jnp.linalg.svd(A)\n\nfor k in [1, 2, 3]:\n approx = U[:, :k] @ jnp.diag(S[:k]) @ Vt[:k, :]\n error = jnp.linalg.norm(A - approx)\n print(f\"k={k}, reconstruction error: {error:.4f}\")\n"},{"location":"chapter%2003%3A%20calculus/01.%20differential%20calculus/","title":"\u5fae\u5206","text":"\u5fae\u5206\u5b66\u7814\u7a76\u77ac\u65f6\u53d8\u5316\u7387\u3002\u672c\u8282\u6db5\u76d6\u6781\u9650\u3001\u5bfc\u6570\u3001\u5fae\u5206\u6cd5\u5219\u3001\u94fe\u5f0f\u6cd5\u5219\uff08\u53cd\u5411\u4f20\u64ad\u7684\u57fa\u7840\uff09\uff0c\u4ee5\u53ca\u673a\u5668\u5b66\u4e60\u4e2d\u5e38\u7528\u7684\u5bfc\u6570\u3002
\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u5b66\u4f1a\u4e86\u5982\u4f55\u5c06\u6570\u636e\u8868\u793a\u4e3a\u5411\u91cf\uff0c\u5e76\u7528\u77e9\u9635\u5bf9\u5176\u8fdb\u884c\u53d8\u6362\u3002\u4f46\u73b0\u5b9e\u4e16\u754c\u4e2d\u7684\u8bb8\u591a\u73b0\u8c61\u5e76\u975e\u9759\u6b62\u4e0d\u53d8\u7684\u3002\u6c7d\u8f66\u5728\u52a0\u901f\uff0c\u80a1\u4ef7\u5728\u6ce2\u52a8\uff0c\u795e\u7ecf\u7f51\u7edc\u7684\u635f\u5931\u968f\u7740\u6743\u91cd\u7684\u66f4\u65b0\u800c\u53d8\u5316\u3002\u5fae\u79ef\u5206\u662f\u7814\u7a76\u53d8\u5316\u7684\u6570\u5b66\u3002
\u5fae\u79ef\u5206\u56de\u7b54\u4e24\u4e2a\u95ee\u9898\uff1a\u67d0\u4e2a\u91cf\u5728\u5f53\u524d\u65f6\u523b\u53d8\u5316\u5f97\u6709\u591a\u5feb\uff1f\uff08\u5fae\u5206\u5b66\uff09\u4ee5\u53ca\u5b83\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u7d2f\u79ef\u4e86\u591a\u5c11\uff1f\uff08\u79ef\u5206\u5b66\uff09\u3002\u672c\u8282\u8ba8\u8bba\u7684\u662f\"\u591a\u5feb\"\u7684\u95ee\u9898\u3002
\u60f3\u8c61\u4e00\u4e0b\u4f60\u6b63\u5728\u5f00\u8f66\uff0c\u77a5\u4e86\u4e00\u773c\u8f66\u901f\u8868\u3002\u4e0a\u9762\u663e\u793a 60 km/h\u3002\u8fd9\u4e2a\u6570\u5b57\u4e0d\u662f\u4f60\u6574\u4e2a\u884c\u7a0b\u7684\u5e73\u5747\u901f\u5ea6\uff0c\u800c\u662f\u4f60\u5728\u8fd9\u4e00\u77ac\u95f4\u7684\u77ac\u65f6\u901f\u5ea6\u3002\u5fae\u5206\u5b66\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u8ba1\u7b97\u8fd9\u79cd\u77ac\u65f6\u53d8\u5316\u7387\u7684\u5de5\u5177\u3002
\u4f46\u9996\u5148\uff0c\u8ba9\u6211\u4eec\u56de\u987e\u4e00\u4e0b\u76f4\u7ebf\u65b9\u7a0b\uff1a\\(y = mx + b\\)\u3002
\u8fd9\u662f\u4e24\u4e2a\u91cf\u4e4b\u95f4\u6700\u7b80\u5355\u7684\u5173\u7cfb\u3002
\u659c\u7387\u8ba1\u7b97\u516c\u5f0f\u4e3a \\(m = \\frac{\\Delta y}{\\Delta x} = \\frac{y_2 - y_1}{x_2 - x_1}\\)\uff0c\u5373\"\\(y\\) \u53d8\u5316\u4e86\u591a\u5c11\"\u4e0e\"\\(x\\) \u53d8\u5316\u4e86\u591a\u5c11\"\u7684\u6bd4\u503c\u3002
\u4e00\u65e6\u77e5\u9053\u4e86 \\(m\\) \u548c \\(b\\)\uff0c\u5c31\u53ef\u4ee5\u8ba1\u7b97\u4efb\u610f \\(x\\) \u5bf9\u5e94\u7684 \\(y\\) \u503c\u3002
\u4f8b\u5982\uff0c\u82e5 \\(m = 2\\) \u4e14 \\(b = 3\\)\uff0c\u5219\u5728 \\(x = 5\\) \u5904\uff1a\\(y = 2(5) + 3 = 13\\)\u3002
\u8fd9\u4e24\u4e2a\u53c2\u6570\u5b8c\u5168\u51b3\u5b9a\u4e86\u8fd9\u6761\u76f4\u7ebf\uff0c\u9884\u6d4b\u4efb\u4f55\u8f93\u51fa\u53ea\u9700\u4ee3\u5165\u516c\u5f0f\u5373\u53ef\u3002
\u5bf9\u4e8e\u76f4\u7ebf\uff0c\u659c\u7387\u5904\u5904\u76f8\u540c\u3002
\u8fd9\u4e00\u601d\u60f3\u53ef\u4ee5\u63a8\u5e7f\u5230\u76f4\u7ebf\u4e4b\u5916\u3002\u4efb\u4f55\u51fd\u6570\u90fd\u662f\u4e00\u4e2a\u5c06\u8f93\u5165\u6620\u5c04\u5230\u8f93\u51fa\u7684\u89c4\u5219\uff0c\u4e00\u65e6\u77e5\u9053\u4e86\u5b83\u7684\u516c\u5f0f\uff08\u53c2\u6570\u548c\u5f62\u72b6\uff09\uff0c\u5c31\u53ef\u4ee5\u8ba1\u7b97\u4efb\u610f\u8f93\u5165\u5bf9\u5e94\u7684\u8f93\u51fa\uff0c\u5e76\u5c06\u7ed3\u679c\u7ed8\u5236\u6210\u56fe\u3002
\\(y = x^2\\) \u7ed9\u51fa\u629b\u7269\u7ebf\uff0c\\(y = \\sin(x)\\) \u7ed9\u51fa\u6ce2\u5f62\uff0c\\(y = e^x\\) \u7ed9\u51fa\u6307\u6570\u589e\u957f\u3002\u6bcf\u4e2a\u516c\u5f0f\u90fd\u5b9a\u4e49\u4e86\u4e00\u6761\u7279\u5b9a\u7684\u66f2\u7ebf\uff0c\u80fd\u591f\u719f\u7ec3\u5730\u5c06\u51fd\u6570\u7406\u89e3\u4e3a\u4e00\u79cd\u5f62\u72b6\uff0c\u5bf9\u4e8e\u540e\u7eed\u5185\u5bb9\u81f3\u5173\u91cd\u8981\u3002
\u5bf9\u4e8e\u76f4\u7ebf\uff0c\u659c\u7387\u5904\u5904\u76f8\u540c\u3002\u4f46\u5927\u591a\u6570\u6709\u8da3\u7684\u51fd\u6570\u90fd\u662f\u5f2f\u66f2\u7684\uff0c\u56e0\u6b64\u659c\u7387\u5728\u4e0d\u540c\u70b9\u5904\u5404\u4e0d\u76f8\u540c\u3002\u5fae\u79ef\u5206\u7ed9\u4e86\u6211\u4eec\u4e00\u79cd\u65b9\u6cd5\u6765\u6c42\u66f2\u7ebf\u4e0a\u4efb\u610f\u4e00\u70b9\u7684\u659c\u7387\u3002
\u6211\u4eec\u8fd8\u9700\u8981\u6781\u9650\u7684\u6982\u5ff5\u3002\u6781\u9650\u63cf\u8ff0\u7684\u662f\u5f53\u8f93\u5165\u8d8a\u6765\u8d8a\u63a5\u8fd1\u67d0\u4e2a\u76ee\u6807\u503c\u65f6\uff0c\u51fd\u6570\u8d8b\u8fd1\u4e8e\u4ec0\u4e48\u503c\uff0c\u800c\u4e0d\u4e00\u5b9a\u975e\u8981\u8fbe\u5230\u8be5\u503c\u3002
\u8fd9\u8bfb\u4f5c\uff1a\"\u5f53 \\(x\\) \u8d8b\u8fd1\u4e8e \\(a\\) \u65f6\uff0c\\(f(x)\\) \u8d8b\u8fd1\u4e8e \\(L\\)\u3002\"\u51fd\u6570\u5728 \\(x = a\\) \u5904\u4e0d\u4e00\u5b9a\u7b49\u4e8e \\(L\\)\uff0c\u53ea\u9700\u65e0\u9650\u63a5\u8fd1\u5373\u53ef\u3002
\u4f8b\u5982\uff0c\u8003\u8651 \\(f(x) = \\frac{x^2 - 1}{x - 1}\\)\u3002\u5982\u679c\u76f4\u63a5\u4ee3\u5165 \\(x = 1\\)\uff0c\u4f1a\u5f97\u5230 \\(\\frac{0}{0}\\)\uff0c\u8fd9\u662f\u672a\u5b9a\u4e49\u7684\u3002
\u4f46\u5c1d\u8bd5\u63a5\u8fd1 1 \u7684\u503c\uff1a\\(f(0.9) = 1.9\\)\uff0c\\(f(0.99) = 1.99\\)\uff0c\\(f(1.01) = 2.01\\)\u3002\u8f93\u51fa\u663e\u7136\u671d\u7740 2 \u9760\u8fd1\u3002
\u4ece\u4ee3\u6570\u89d2\u5ea6\u770b\uff0c\u6211\u4eec\u53ef\u4ee5\u7406\u89e3\u539f\u56e0\uff1a\u5c06\u5206\u5b50\u56e0\u5f0f\u5206\u89e3\u4e3a \\((x-1)(x+1)\\)\uff0c\u7ea6\u53bb \\((x-1)\\) \u9879\uff0c\u5bf9\u4e8e\u6240\u6709 \\(x \\neq 1\\) \u5f97\u5230 \\(f(x) = x + 1\\)\u3002\u56e0\u6b64\u5f53 \\(x \\to 1\\) \u65f6\uff0c\\(f(x) \\to 2\\)\u3002
\u8be5\u51fd\u6570\u5728 \\(x = 1\\) \u5904\u6709\u4e00\u4e2a\u7a7a\u6d1e\uff0c\u4f46\u6781\u9650\u4ecd\u7136\u5b58\u5728\u3002
\u6781\u9650\u662f\u5fae\u79ef\u5206\u4e2d\u5176\u4ed6\u4e00\u5207\u5185\u5bb9\u7684\u57fa\u7840\u3002
\u51fd\u6570 \\(f(x)\\) \u5728\u70b9 \\(x = a\\) \u5904\u7684\u5bfc\u6570\u8861\u91cf\u7684\u662f\u77ac\u65f6\u53d8\u5316\u7387\u3002\u4ece\u51e0\u4f55\u89d2\u5ea6\u770b\uff0c\u5b83\u662f\u8be5\u70b9\u5904\u66f2\u7ebf\u5207\u7ebf\u7684\u659c\u7387\u3002
\u5206\u5b50 \\(f(a+h) - f(a)\\) \u662f\u8f93\u51fa\u7684\u53d8\u5316\u91cf\u3002\u5206\u6bcd \\(h\\) \u662f\u8f93\u5165\u7684\u53d8\u5316\u91cf\u3002\u5b83\u4eec\u7684\u6bd4\u503c\u662f\u5728\u4e00\u4e2a\u6781\u5c0f\u533a\u95f4\u4e0a\u7684\u5e73\u5747\u53d8\u5316\u7387\u3002\u5f53 \\(h \\to 0\\) \u65f6\uff0c\u8fd9\u4e2a\u5e73\u5747\u503c\u5c31\u53d8\u6210\u4e86\u77ac\u65f6\u53d8\u5316\u7387\u3002
\u4f8b\u5982\uff0c\u8bbe \\(f(x) = x^2\\)\u3002\u5728 \\(x = 3\\) \u5904\uff1a
\u56e0\u6b64\u5728 \\(x = 3\\) \u5904\uff0c\u51fd\u6570 \\(x^2\\) \u4ee5\u6bcf\u5355\u4f4d\u8f93\u5165\u53d8\u5316 6 \u5355\u4f4d\u8f93\u51fa\u7684\u901f\u7387\u589e\u52a0\u3002
\u5982\u679c\u8fd9\u4e2a\u6781\u9650\u5b58\u5728\uff0c\u5219\u79f0\u51fd\u6570\u5728\u8be5\u70b9\u662f\u53ef\u5fae\u7684\u3002\u8981\u505a\u5230\u8fd9\u4e00\u70b9\uff0c\u51fd\u6570\u5fc5\u987b\u8fde\u7eed\uff08\u6ca1\u6709\u8df3\u8dc3\uff09\u3001\u5149\u6ed1\uff08\u6ca1\u6709\u5c16\u89d2\uff09\uff0c\u5e76\u4e14\u5728\u70b9\u9644\u8fd1\u6709\u5b9a\u4e49\u3002
\u5982\u679c\u4f60\u80fd\u7b14\u4e0d\u79bb\u7eb8\u5730\u753b\u51fa\u66f2\u7ebf\uff0c\u4e14\u6ca1\u6709\u4efb\u4f55\u6298\u70b9\uff0c\u90a3\u4e48\u5b83\u5728\u8be5\u70b9\u5f88\u53ef\u80fd\u662f\u53ef\u5fae\u7684\u3002
\u6bcf\u6b21\u90fd\u4ece\u6781\u9650\u5b9a\u4e49\u51fa\u53d1\u8ba1\u7b97\u5bfc\u6570\u4f1a\u5f88\u7e41\u7410\u3002\u5e78\u8fd0\u7684\u662f\uff0c\u5c11\u6570\u51e0\u6761\u6cd5\u5219\u5c31\u80fd\u8ba9\u6211\u4eec\u5feb\u901f\u5fae\u5206\u51e0\u4e4e\u4efb\u4f55\u51fd\u6570\u3002
\u5e38\u6570\u6cd5\u5219\uff1a\u5e38\u6570\u7684\u5bfc\u6570\u4e3a\u96f6\u3002\u82e5 \\(f(x) = 5\\)\uff0c\u5219 \\(f'(x) = 0\\)\u3002\u6c34\u5e73\u7ebf\u7684\u659c\u7387\u4e3a\u96f6\u3002
\u5e42\u6cd5\u5219\uff1a\u5fae\u5206\u7684\u4e3b\u529b\u6cd5\u5219\u3002\u5c06\u6307\u6570\u63d0\u5230\u524d\u9762\uff0c\u7136\u540e\u5c06\u6307\u6570\u51cf\u4e00\uff1a
\u4f8b\u5982\uff1a\\(\\frac{d}{dx} x^3 = 3x^2\\)\u3002\u4e09\u6b21\u51fd\u6570\u53d8\u6210\u4e86\u4e8c\u6b21\u51fd\u6570\u3002\u8be5\u6cd5\u5219\u9002\u7528\u4e8e\u4efb\u4f55\u5b9e\u6570\u6307\u6570\uff0c\u5305\u62ec\u8d1f\u6570\u548c\u5206\u6570\uff1a\\(\\frac{d}{dx} x^{-1} = -x^{-2}\\) \u4ee5\u53ca \\(\\frac{d}{dx} \\sqrt{x} = \\frac{d}{dx} x^{1/2} = \\frac{1}{2}x^{-1/2}\\)\u3002
\u548c/\u5dee\u6cd5\u5219\uff1a\u9010\u9879\u6c42\u5bfc\u3002
\u53ef\u4ee5\u8fd9\u6837\u7406\u89e3\uff1a\"\u7b2c\u4e00\u4e2a\u7684\u53d8\u5316\u7387\u4e58\u4ee5\u7b2c\u4e8c\u4e2a\uff0c\u52a0\u4e0a\u7b2c\u4e00\u4e2a\u4e58\u4ee5\u7b2c\u4e8c\u4e2a\u7684\u53d8\u5316\u7387\u3002\"\u4f8b\u5982\uff0c\\(\\frac{d}{dx}[x^2 \\sin x] = 2x \\sin x + x^2 \\cos x\\)\u3002
\u5546\u6cd5\u5219\uff1a\u5bf9\u4e8e\u51fd\u6570\u7684\u6bd4\u503c\uff1a
\u4e00\u4e2a\u6709\u7528\u7684\u8bb0\u5fc6\u53e3\u8bc0\uff1a\"\u4e0a\u5bfc\u4e0b\u4e0d\u5bfc\u51cf\u53bb\u4e0a\u4e0d\u5bfc\u4e0b\u5bfc\uff0c\u9664\u4ee5\u5206\u6bcd\u7684\u5e73\u65b9\u3002\"
\u94fe\u5f0f\u6cd5\u5219\uff1a\u5bf9\u673a\u5668\u5b66\u4e60\u6700\u91cd\u8981\u7684\u6cd5\u5219\u3002\u5f53\u51fd\u6570\u590d\u5408\uff08\u4e00\u4e2a\u51fd\u6570\u5d4c\u5957\u5728\u53e6\u4e00\u4e2a\u51fd\u6570\u5185\u90e8\uff09\u65f6\uff0c\u5bfc\u6570\u7b49\u4e8e\u6cbf\u94fe\u5404\u5bfc\u6570\u7684\u4e58\u79ef\uff1a
\u4f8b\u5982\uff0c\\(\\frac{d}{dx} (3x + 1)^5 = 5(3x+1)^4 \\cdot 3 = 15(3x+1)^4\\)\u3002\u5916\u5c42\u51fd\u6570\u662f \\((\\cdot)^5\\)\uff0c\u5185\u5c42\u662f \\(3x+1\\)\u3002
\u94fe\u5f0f\u6cd5\u5219\u662f\u795e\u7ecf\u7f51\u7edc\u4e2d\u53cd\u5411\u4f20\u64ad\u7684\u6570\u5b66\u57fa\u7840\u3002\u4e00\u4e2a\u6df1\u5c42\u7f51\u7edc\u5c31\u662f\u4e00\u4e2a\u7531\u591a\u4e2a\u590d\u5408\u51fd\u6570\u7ec4\u6210\u7684\u957f\u94fe\u3002\u8981\u8ba1\u7b97\u635f\u5931\u76f8\u5bf9\u4e8e\u6bcf\u4e2a\u6743\u91cd\u7684\u53d8\u5316\u7387\uff0c\u6211\u4eec\u4ece\u8f93\u51fa\u5c42\u5f00\u59cb\u9010\u5c42\u5411\u8f93\u5165\u5c42\u53cd\u590d\u5e94\u7528\u94fe\u5f0f\u6cd5\u5219\uff0c\u5c06\u6bcf\u4e00\u6b65\u7684\u5c40\u90e8\u5bfc\u6570\u76f8\u4e58\u3002
\u4ee5\u4e0b\u662f\u4f60\u4f1a\u9047\u5230\u7684\u6700\u5e38\u89c1\u5bfc\u6570\u3002\u6bcf\u4e00\u4e2a\u90fd\u53ef\u4ee5\u4ece\u6781\u9650\u5b9a\u4e49\u63a8\u5bfc\u51fa\u6765\uff0c\u4f46\u719f\u8bb0\u5b83\u4eec\u53ef\u4ee5\u8282\u7701\u65f6\u95f4\uff1a
\u6307\u6570\u51fd\u6570 \\(e^x\\) \u975e\u5e38\u7279\u522b\uff1a\u5b83\u662f\u552f\u4e00\u4e00\u4e2a\u5bfc\u6570\u7b49\u4e8e\u81ea\u8eab\u7684\u51fd\u6570\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48 \\(e\\) \u5728\u673a\u5668\u5b66\u4e60\u4e2d\u65e0\u5904\u4e0d\u5728\uff0c\u4ece softmax \u6fc0\u6d3b\u51fd\u6570\u5230\u6982\u7387\u5206\u5e03\u90fd\u80fd\u89c1\u5230\u5b83\u7684\u8eab\u5f71\u3002
\u6d1b\u5fc5\u8fbe\u6cd5\u5219\u7528\u4e8e\u5904\u7406\u5f62\u5982 \\(\\frac{0}{0}\\) \u6216 \\(\\frac{\\infty}{\\infty}\\) \u7684\u4e0d\u5b9a\u5f0f\u6781\u9650\u3002\u5f53\u76f4\u63a5\u4ee3\u5165\u5f97\u5230\u8fd9\u7c7b\u5f62\u5f0f\u65f6\uff0c\u53ef\u4ee5\u5206\u522b\u5bf9\u5206\u5b50\u548c\u5206\u6bcd\u6c42\u5bfc\uff0c\u7136\u540e\u518d\u6b21\u5c1d\u8bd5\u6c42\u6781\u9650\uff1a
\u6761\u4ef6\uff1a\\(f\\) \u548c \\(g\\) \u90fd\u5fc5\u987b\u5728 \\(a\\) \u9644\u8fd1\u53ef\u5fae\uff0c\u5e76\u4e14 \\(g'(x)\\) \u5728 \\(a\\) \u9644\u8fd1\uff08\u53ef\u80fd\u9664\u53bb \\(a\\) \u672c\u8eab\uff09\u4e0d\u4e3a\u96f6\u3002\u539f\u6781\u9650\u5fc5\u987b\u662f\u4e0d\u5b9a\u5f0f\u3002
\u4f8b\u5982\uff1a\\(\\lim_{x \\to 0} \\frac{\\sin x}{x}\\)\u3002\u76f4\u63a5\u4ee3\u5165\u5f97\u5230 \\(\\frac{0}{0}\\)\u3002\u5e94\u7528\u6d1b\u5fc5\u8fbe\u6cd5\u5219\uff1a\\(\\lim_{x \\to 0} \\frac{\\cos x}{1} = 1\\)\u3002\u8fd9\u4e2a\u6781\u9650\u662f\u57fa\u7840\u7684\uff0c\u5728\u4fe1\u53f7\u5904\u7406\u548c\u5085\u91cc\u53f6\u5206\u6790\u4e2d\u90fd\u4f1a\u51fa\u73b0\u3002
\u5982\u679c\u7ed3\u679c\u4ecd\u7136\u662f\u4e0d\u5b9a\u5f0f\uff0c\u53ef\u4ee5\u53cd\u590d\u5e94\u7528\u8be5\u6cd5\u5219\u3002\u4f8b\u5982\uff0c\\(\\lim_{x \\to 0} \\frac{1 - \\cos x}{x^2}\\) \u5f97\u5230 \\(\\frac{0}{0}\\)\u3002\u7b2c\u4e00\u6b21\u5e94\u7528\uff1a\\(\\lim_{x \\to 0} \\frac{\\sin x}{2x}\\)\uff0c\u4ecd\u7136\u662f \\(\\frac{0}{0}\\)\u3002\u7b2c\u4e8c\u6b21\u5e94\u7528\uff1a\\(\\lim_{x \\to 0} \\frac{\\cos x}{2} = \\frac{1}{2}\\)\u3002
\u5982\u679c\u4e24\u4e2a\u51fd\u6570\u662f\u53ef\u5fae\u7684\uff0c\u90a3\u4e48\u5b83\u4eec\u7684\u548c\u3001\u5dee\u3001\u79ef\u3001\u590d\u5408\u4ee5\u53ca\u5546\uff08\u5206\u6bcd\u4e0d\u4e3a\u96f6\u65f6\uff09\u4e5f\u662f\u53ef\u5fae\u7684\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6211\u4eec\u53ef\u4ee5\u81ea\u4fe1\u5730\u5bf9\u7531\u7b80\u5355\u90e8\u5206\u7ec4\u6210\u7684\u590d\u6742\u8868\u8fbe\u5f0f\u8fdb\u884c\u5fae\u5206\u3002
\u53ef\u89c6\u5316\u5e38\u89c1\u51fd\u6570\u3002\u5728\u540c\u4e00\u5f20\u56fe\u4e2d\u7ed8\u5236 \\(x^2\\)\u3001\\(\\sin(x)\\) \u548c \\(e^x\\)\uff0c\u5efa\u7acb\u5bf9\u4e0d\u540c\u516c\u5f0f\u4ea7\u751f\u4e0d\u540c\u5f62\u72b6\u7684\u76f4\u89c2\u611f\u53d7\u3002\u5c1d\u8bd5\u4fee\u6539\u53c2\u6570\uff08\u4f8b\u5982 \\(2x^2\\)\u3001\\(\\sin(2x)\\)\uff09\uff0c\u89c2\u5bdf\u66f2\u7ebf\u5982\u4f55\u53d8\u5316\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nx = jnp.linspace(-3, 3, 300)\n\nfig, axes = plt.subplots(1, 3, figsize=(12, 3))\naxes[0].plot(x, x**2, color=\"#e74c3c\")\naxes[0].set_title(\"x\u00b2 (\u629b\u7269\u7ebf)\")\naxes[1].plot(x, jnp.sin(x), color=\"#3498db\")\naxes[1].set_title(\"sin(x) (\u6ce2\u5f62)\")\naxes[2].plot(x, jnp.exp(x), color=\"#27ae60\")\naxes[2].set_title(\"e\u02e3 (\u6307\u6570\u51fd\u6570)\")\nfor ax in axes:\n ax.axhline(0, color=\"gray\", linewidth=0.5)\n ax.axvline(0, color=\"gray\", linewidth=0.5)\nplt.tight_layout()\nplt.show()\n \u4f7f\u7528 JAX \u7684\u81ea\u52a8\u5fae\u5206\u8ba1\u7b97 \\(f(x) = x^3 - 2x + 1\\) \u5728\u82e5\u5e72\u70b9\u5904\u7684\u5bfc\u6570\uff0c\u5e76\u4e0e\u89e3\u6790\u5bfc\u6570 \\(f'(x) = 3x^2 - 2\\) \u8fdb\u884c\u6bd4\u8f83\u3002
import jax\nimport jax.numpy as jnp\n\nf = lambda x: x**3 - 2*x + 1\ndf = jax.grad(f)\n\nfor x in [0.0, 1.0, 2.0, -1.0]:\n print(f\"x={x:5.1f} \u81ea\u52a8\u5fae\u5206: {df(x):.4f} \u89e3\u6790\u89e3: {3*x**2 - 2:.4f}\")\n \u6570\u503c\u9a8c\u8bc1\u94fe\u5f0f\u6cd5\u5219\u3002\u5b9a\u4e49 \\(f(x) = \\sin(x^2)\\)\uff0c\u901a\u8fc7 jax.grad \u8ba1\u7b97\u5176\u5bfc\u6570\uff0c\u5e76\u4e0e\u89e3\u6790\u7ed3\u679c \\(2x\\cos(x^2)\\) \u8fdb\u884c\u6bd4\u8f83\u3002
import jax\nimport jax.numpy as jnp\n\nf = lambda x: jnp.sin(x**2)\ndf = jax.grad(f)\n\nfor x in [0.5, 1.0, 2.0]:\n auto = df(x)\n analytical = 2*x * jnp.cos(x**2)\n print(f\"x={x:.1f} \u81ea\u52a8\u5fae\u5206: {auto:.6f} \u89e3\u6790\u89e3: {analytical:.6f}\")\n \u53ef\u89c6\u5316\u5bfc\u6570\u3002\u5c06 \\(f(x) = x^3 - 3x\\) \u4e0e\u5176\u5bfc\u6570 \\(f'(x) = 3x^2 - 3\\) \u7ed8\u5236\u5728\u540c\u4e00\u5f20\u56fe\u4e0a\u3002\u89c2\u5bdf \\(f'(x) = 0\\) \u7684\u4f4d\u7f6e\u4e0e \\(f\\) \u7684\u5cf0\u8c37\u4e4b\u95f4\u7684\u5bf9\u5e94\u5173\u7cfb\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nf = lambda x: x**3 - 3*x\n# jax.grad \u7528\u4e8e\u6807\u91cf\uff1bjax.vmap \u5c06\u5176\u5411\u91cf\u5316\uff0c\u53ef\u540c\u65f6\u5904\u7406\u4e00\u7ec4\u8f93\u5165\ndf = jax.vmap(jax.grad(f))\n\nx = jnp.linspace(-2.5, 2.5, 200)\nplt.plot(x, jax.vmap(f)(x), label=\"f(x)\")\nplt.plot(x, df(x), label=\"f'(x)\", linestyle=\"--\")\nplt.axhline(0, color=\"gray\", linewidth=0.5)\nplt.legend()\nplt.title(\"\u51fd\u6570\u53ca\u5176\u5bfc\u6570\")\nplt.show()\n \u79ef\u5206\u5b66\u5728\u533a\u95f4\u4e0a\u7d2f\u79ef\u91cf\uff0c\u5c06\u5c40\u90e8\u53d8\u5316\u7387\u8fd8\u539f\u4e3a\u603b\u91cf\u3002\u672c\u6587\u6db5\u76d6\u5b9a\u79ef\u5206\u4e0e\u4e0d\u5b9a\u79ef\u5206\u3001\u5fae\u79ef\u5206\u57fa\u672c\u5b9a\u7406\u3001\u79ef\u5206\u6280\u5de7\uff0c\u4ee5\u53ca\u5728\u673a\u5668\u5b66\u4e60\u4e2d\u4e0e\u6982\u7387\u5bc6\u5ea6\u548c\u671f\u671b\u503c\u7684\u5e94\u7528\u3002
\u5fae\u5206\u544a\u8bc9\u6211\u4eec\u5355\u4e2a\u70b9\u7684\u53d8\u5316\u7387\u3002\u79ef\u5206\u5219\u76f8\u53cd\uff1a\u5b83\u5c06\u8bb8\u591a\u5fae\u5c0f\u7247\u6bb5\u7d2f\u79ef\u8d77\u6765\uff0c\u8ba1\u7b97\u51fa\u4e00\u4e2a\u603b\u91cf\u3002
\u5982\u679c\u5bfc\u6570\u56de\u7b54\u7684\u662f\"\u591a\u5feb\uff1f\"\uff0c\u90a3\u4e48\u79ef\u5206\u56de\u7b54\u7684\u662f\"\u591a\u5c11\uff1f\"
\u7406\u89e3\u79ef\u5206\u6700\u7b80\u5355\u7684\u65b9\u5f0f\u662f\u5c06\u5176\u89c6\u4e3a\u66f2\u7ebf\u4e0b\u7684\u9762\u79ef\u3002\u5982\u679c\u7ed8\u5236\u51fa\u51fd\u6570 \\(f(x)\\) \u7684\u56fe\u50cf\uff0c\u5e76\u5c06\u4ece \\(x = a\\) \u5230 \\(x = b\\) \u4e4b\u95f4\u66f2\u7ebf\u4e0e x \u8f74\u4e4b\u95f4\u7684\u533a\u57df\u6d82\u4e0a\u9634\u5f71\uff0c\u79ef\u5206\u7ed9\u51fa\u7684\u5c31\u662f\u8be5\u533a\u57df\u7684\u6709\u7b26\u53f7\u9762\u79ef\u3002
\u4e3a\u4ec0\u4e48\u662f\"\u6709\u7b26\u53f7\"\u7684\uff1f\u5728 x \u8f74\u4e0a\u65b9\u7684\u533a\u57df\u8d21\u732e\u6b63\u9762\u79ef\uff0c\u5728\u4e0b\u65b9\u7684\u533a\u57df\u8d21\u732e\u8d1f\u9762\u79ef\u3002\u8fd9\u5728\u7269\u7406\u4e0a\u662f\u6709\u610f\u4e49\u7684\uff1a\u5982\u679c \\(f(x)\\) \u4ee3\u8868\u901f\u5ea6\uff0c\u79ef\u5206\u7ed9\u51fa\u7684\u662f\u51c0\u4f4d\u79fb\uff08\u6b63\u5411\u51cf\u53bb\u53cd\u5411\uff09\uff0c\u800c\u4e0d\u662f\u603b\u8def\u7a0b\u3002
\u4e3a\u4e86\u8ba1\u7b97\u8fd9\u4e2a\u9762\u79ef\uff0c\u60f3\u8c61\u5c06\u533a\u57df\u5207\u6210 \\(n\\) \u4e2a\u7ec6\u957f\u7684\u7ad6\u76f4\u77e9\u5f62\uff0c\u6bcf\u4e2a\u77e9\u5f62\u7684\u5bbd\u5ea6\u4e3a \\(\\Delta x\\)\u3002\u6bcf\u4e2a\u77e9\u5f62\u7684\u9ad8\u5ea6\u662f\u8be5\u5207\u7247\u5185\u67d0\u4e00\u70b9\u7684\u51fd\u6570\u503c\u3002\u5c06\u5b83\u4eec\u6c42\u548c\uff1a
\\(\\int\\) \u7b26\u53f7\u662f\u62c9\u957f\u7684\"S\"\uff0c\u4ee3\u8868\"\u6c42\u548c\"\uff08Sum\uff09\u3002\\(dx\\) \u63d0\u9192\u6211\u4eec\uff0c\u6211\u4eec\u662f\u5728\u6cbf x \u8f74\u65b9\u5411\u5bf9\u65e0\u7a77\u8584\u7684\u5207\u7247\u6c42\u548c\u3002
\u4e0d\u5b9a\u79ef\u5206\uff08\u6216\u539f\u51fd\u6570\uff09\u662f\u4e00\u4e2a\u51fd\u6570 \\(F(x)\\)\uff0c\u5176\u5bfc\u6570\u4e3a \\(f(x)\\)\u3002\u6211\u4eec\u5199\u4f5c\uff1a
\\(+ C\\) \u662f\u79ef\u5206\u5e38\u6570\u3002\u56e0\u4e3a\u4efb\u4f55\u5e38\u6570\u7684\u5bfc\u6570\u90fd\u662f\u96f6\uff0c\u6240\u4ee5\u5b58\u5728\u65e0\u7a77\u591a\u4e2a\u4ec5\u76f8\u5dee\u4e00\u4e2a\u5e38\u6570\u7684\u539f\u51fd\u6570\u3002\u4f8b\u5982\uff0c\\(\\int 2x\\, dx = x^2 + C\\)\uff0c\u56e0\u4e3a \\(x^2 + 7\\) \u6216 \\(x^2 - 3\\) \u7684\u5bfc\u6570\u4ecd\u7136\u662f \\(2x\\)\u3002
\u5fae\u79ef\u5206\u57fa\u672c\u5b9a\u7406\u662f\u8fde\u63a5\u5fae\u5206\u4e0e\u79ef\u5206\u7684\u6865\u6881\u3002\u5b83\u5305\u542b\u4e24\u90e8\u5206\uff1a
\u7b2c\u4e00\u90e8\u5206\uff1a\u5982\u679c \\(F(x)\\) \u662f \\(f(x)\\) \u7684\u4e00\u4e2a\u539f\u51fd\u6570\uff0c\u90a3\u4e48\u5b9a\u79ef\u5206\u7b49\u4e8e \\(F\\) \u5728\u7aef\u70b9\u5904\u7684\u503c\u4e4b\u5dee\uff1a
\u8fd9\u975e\u5e38\u5b9e\u7528\u3002\u6211\u4eec\u4e0d\u518d\u9700\u8981\u8ba1\u7b97\u4e00\u4e2a\u548c\u7684\u6781\u9650\uff08\u8fd9\u5f88\u56f0\u96be\uff09\uff0c\u800c\u662f\u627e\u5230\u4e00\u4e2a\u539f\u51fd\u6570\u5e76\u5728\u4e24\u70b9\u5904\u6c42\u503c\uff08\u8fd9\u901a\u5e38\u5f88\u7b80\u5355\uff09\u3002
\u7b2c\u4e8c\u90e8\u5206\uff1a\u5982\u679c\u6211\u4eec\u5b9a\u4e49 \\(F(x) = \\int_a^x f(t)\\, dt\\)\uff0c\u90a3\u4e48 \\(F'(x) = f(x)\\)\u3002\u5fae\u5206\u4e0e\u79ef\u5206\u662f\u4e92\u9006\u8fd0\u7b97\uff0c\u5b83\u4eec\u76f8\u4e92\u62b5\u6d88\u3002
\u4f8b\u5982\uff0c\u8ba1\u7b97 \\(\\int_1^3 x^2\\, dx\\)\uff1a\\(x^2\\) \u7684\u539f\u51fd\u6570\u662f \\(\\frac{x^3}{3}\\)\u3002\u6240\u4ee5 \\(\\int_1^3 x^2\\, dx = \\frac{27}{3} - \\frac{1}{3} = \\frac{26}{3} \\approx 8.67\\)\u3002
\u6b63\u5982\u5fae\u5206\u6709\u8fd0\u7b97\u6cd5\u5219\u4e00\u6837\uff0c\u79ef\u5206\u4e5f\u6709\u76f8\u5e94\u7684\u9006\u5411\u8fd0\u7b97\u6cd5\u5219\uff1a
\u548c/\u5dee\u6cd5\u5219\u540c\u6837\u9002\u7528\uff1a\\(\\int [f(x) \\pm g(x)]\\, dx = \\int f(x)\\, dx \\pm \\int g(x)\\, dx\\)\u3002\u5e38\u6570\u53ef\u4ee5\u63d0\u51fa\u6765\uff1a\\(\\int k\\, f(x)\\, dx = k \\int f(x)\\, dx\\)\u3002
\u5f53\u4e00\u4e2a\u51fd\u6570\u592a\u590d\u6742\u800c\u65e0\u6cd5\u76f4\u63a5\u79ef\u5206\u65f6\uff0c\u6211\u4eec\u6709\u7b80\u5316\u5b83\u7684\u6280\u5de7\u3002
\u6362\u5143\u79ef\u5206\u6cd5\uff08u \u4ee3\u6362\uff09\u662f\u94fe\u5f0f\u6cd5\u5219\u7684\u9006\u8fc7\u7a0b\u3002\u5982\u679c\u53d1\u73b0\u4e00\u4e2a\u590d\u5408\u51fd\u6570 \\(f(g(x))\\) \u4e58\u4ee5 \\(g'(x)\\)\uff0c\u5219\u4ee4 \\(u = g(x)\\)\uff0c\u4e8e\u662f \\(du = g'(x)\\, dx\\)\uff0c\u79ef\u5206\u5f97\u4ee5\u7b80\u5316\u3002
\u4f8b\u5982\uff1a\\(\\int 2x \\cos(x^2)\\, dx\\)\u3002\u4ee4 \\(u = x^2\\)\uff0c\u5219 \\(du = 2x\\, dx\\)\u3002\u79ef\u5206\u53d8\u4e3a \\(\\int \\cos(u)\\, du = \\sin(u) + C = \\sin(x^2) + C\\)\u3002
\u5206\u90e8\u79ef\u5206\u6cd5\u662f\u4e58\u79ef\u6cd5\u5219\u7684\u9006\u8fc7\u7a0b\u3002\u5982\u679c\u88ab\u79ef\u51fd\u6570\u662f\u4e24\u4e2a\u51fd\u6570\u7684\u4e58\u79ef\uff1a
\u7b56\u7565\u6027\u5730\u9009\u62e9 \\(u\\) \u548c \\(dv\\)\uff0c\u4f7f\u5f97\u5269\u4e0b\u7684\u79ef\u5206 \\(\\int v\\, du\\) \u6bd4\u539f\u6765\u7684\u66f4\u7b80\u5355\u3002\u9009\u62e9 \\(u\\) \u7684\u5e38\u7528\u52a9\u8bb0\u6cd5\u662f LIATE\uff1a\u5bf9\u6570\u51fd\u6570\uff08Logarithmic\uff09\u3001\u53cd\u4e09\u89d2\u51fd\u6570\uff08Inverse trig\uff09\u3001\u4ee3\u6570\u51fd\u6570\uff08Algebraic\uff09\u3001\u4e09\u89d2\u51fd\u6570\uff08Trigonometric\uff09\u3001\u6307\u6570\u51fd\u6570\uff08Exponential\uff09\uff08\u4f18\u5148\u4ece\u9760\u524d\u7684\u7c7b\u522b\u4e2d\u9009\u62e9 \\(u\\)\uff09\u3002
\u4f8b\u5982\uff1a\\(\\int x\\, e^x\\, dx\\)\u3002\u4ee4 \\(u = x\\)\uff08\u4ee3\u6570\u51fd\u6570\uff09\u548c \\(dv = e^x\\, dx\\)\u3002\u5219 \\(du = dx\\)\uff0c\\(v = e^x\\)\u3002\u56e0\u6b64\uff1a\\(\\int x\\, e^x\\, dx = x\\, e^x - \\int e^x\\, dx = x\\, e^x - e^x + C = e^x(x - 1) + C\\)\u3002
\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u79ef\u5206\u51fa\u73b0\u5728\u6982\u7387\u8bba\u4e2d\uff08\u901a\u8fc7\u5bf9\u5bc6\u5ea6\u51fd\u6570\u79ef\u5206\u6765\u8ba1\u7b97\u6982\u7387\uff09\u3001\u671f\u671b\u503c\u4e2d\uff08\u8fde\u7eed\u5206\u5e03\u4e0a\u7684\u52a0\u6743\u5e73\u5747\uff09\uff0c\u4ee5\u53ca\u8ba1\u7b97 ROC \u66f2\u7ebf\u4e0b\u7684\u9762\u79ef\u3002\u867d\u7136\u5728\u5b9e\u9645\u4e2d\u6211\u4eec\u5f88\u5c11\u624b\u52a8\u79ef\u5206\uff0c\u4f46\u7406\u89e3\u79ef\u5206\u7684\u542b\u4e49\u6709\u52a9\u4e8e\u89e3\u91ca\u8fd9\u4e9b\u91cf\u3002
\u4f7f\u7528\u9ece\u66fc\u548c\uff0c\u7528\u4e0d\u65ad\u589e\u52a0\u6570\u91cf\u7684\u77e9\u5f62\u6765\u6570\u503c\u903c\u8fd1 \\(\\int_0^1 x^2\\, dx\\)\u3002\u4e0e\u7cbe\u786e\u7b54\u6848 \\(\\frac{1}{3}\\) \u8fdb\u884c\u6bd4\u8f83\u3002
import jax.numpy as jnp\n\nfor n in [10, 100, 1000, 10000]:\n x = jnp.linspace(0, 1, n, endpoint=False)\n dx = 1.0 / n\n area = jnp.sum(x**2 * dx)\n print(f\"n={n:5d} approx: {area:.6f} exact: {1/3:.6f}\")\n \u6570\u503c\u9a8c\u8bc1\u5fae\u79ef\u5206\u57fa\u672c\u5b9a\u7406\u3002\u5b9a\u4e49 \\(F(x) = \\int_0^x t^2\\, dt = \\frac{x^3}{3}\\)\uff0c\u5e76\u9a8c\u8bc1\u5176\u5bfc\u6570\uff08\u901a\u8fc7 jax.grad \u8ba1\u7b97\uff09\u7b49\u4e8e \\(x^2\\)\u3002
import jax\nimport jax.numpy as jnp\n\nF = lambda x: x**3 / 3\ndF = jax.grad(F)\n\nfor x in [0.5, 1.0, 2.0, 3.0]:\n print(f\"x={x:.1f} F'(x)={dF(x):.4f} x^2={x**2:.4f}\")\n \u53ef\u89c6\u5316 \\(f(x) = \\sin(x)\\) \u4ece \\(0\\) \u5230 \\(\\pi\\) \u7684\u66f2\u7ebf\u4e0b\u9762\u79ef\u3002\u4f7f\u7528 plt.fill_between \u586b\u5145\u8be5\u533a\u57df\uff0c\u5e76\u7528\u9ece\u66fc\u548c\u6570\u503c\u8ba1\u7b97\u9762\u79ef\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nx = jnp.linspace(0, jnp.pi, 500)\ny = jnp.sin(x)\n\nplt.plot(x, y, color=\"purple\", linewidth=2)\nplt.fill_between(x, y, alpha=0.2, color=\"purple\")\nplt.title(f\"Area = {jnp.sum(jnp.sin(x) * (jnp.pi / 500)):.4f} (exact: 2.0)\")\nplt.show()\n \u591a\u5143\u5fae\u79ef\u5206\u5c06\u5bfc\u6570\u548c\u79ef\u5206\u6269\u5c55\u5230\u591a\u53d8\u91cf\u51fd\u6570\uff0c\u8fd9\u5bf9\u4e8e\u673a\u5668\u5b66\u4e60\u6a21\u578b\u62e5\u6709\u6570\u767e\u4e07\u53c2\u6570\u7684\u60c5\u5f62\u81f3\u5173\u91cd\u8981\u3002\u672c\u7ae0\u6db5\u76d6\u504f\u5bfc\u6570\u3001\u68af\u5ea6\u3001\u96c5\u53ef\u6bd4\u77e9\u9635\u3001\u6d77\u68ee\u77e9\u9635\u4ee5\u53ca\u4f7f\u53cd\u5411\u4f20\u64ad\u6210\u4e3a\u53ef\u80fd\u7684\u591a\u53d8\u91cf\u94fe\u5f0f\u6cd5\u5219\u3002
\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u7684\u51fd\u6570\u90fd\u53ea\u63a5\u53d7\u5355\u4e2a\u8f93\u5165 \\(x\\) \u5e76\u4ea7\u751f\u5355\u4e2a\u8f93\u51fa \\(f(x)\\)\u3002\u4f46\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u6211\u4eec\u51e0\u4e4e\u4ece\u4e0d\u53ea\u5904\u7406\u4e00\u4e2a\u53d8\u91cf\u3002
\u8003\u8651\u4e00\u4e2a\u53cc\u53d8\u91cf\u51fd\u6570\uff0c\u4f8b\u5982 \\(f(x, y) = x^2 + y^2\\)\u3002\u5b83\u5728\u4e09\u7ef4\u7a7a\u95f4\u4e2d\u5b9a\u4e49\u4e86\u4e00\u4e2a\u66f2\u9762\uff0c\u5f62\u72b6\u50cf\u4e00\u4e2a\u7897\u3002\u6211\u4eec\u60f3\u77e5\u9053\uff1a\u5982\u679c\u6211\u4eec\u5728\u4fdd\u6301 \\(y\\) \u56fa\u5b9a\u7684\u540c\u65f6\u7a0d\u5fae\u8c03\u6574 \\(x\\)\uff0c\\(f\\) \u4f1a\u5982\u4f55\u53d8\u5316\uff1f\u8fd9\u5c31\u662f\u504f\u5bfc\u6570\u3002
\\(f\\) \u5bf9 \\(x\\) \u7684\u504f\u5bfc\u6570\uff0c\u8bb0\u4f5c \\(\\frac{\\partial f}{\\partial x}\\)\uff0c\u5c06\u5176\u4ed6\u6240\u6709\u53d8\u91cf\u89c6\u4e3a\u5e38\u6570\uff0c\u7136\u540e\u5bf9 \\(x\\) \u6b63\u5e38\u6c42\u5bfc\u3002
\u5bf9\u4e8e \\(f(x, y) = x^2y + 3x - 2y\\)\uff1a
\u8ba1\u7b97 \\(\\frac{\\partial f}{\\partial x}\\) \u65f6\uff0c\u6211\u4eec\u5c06 \\(y\\) \u89c6\u4e3a\u5e38\u6570\uff0c\u56e0\u6b64 \\(x^2y\\) \u6c42\u5bfc\u5f97 \\(2xy\\)\uff0c\\(3x\\) \u6c42\u5bfc\u5f97 \\(3\\)\uff0c\\(-2y\\) \u6c42\u5bfc\u5f97 \\(0\\)\u3002
\u8ba1\u7b97 \\(\\frac{\\partial f}{\\partial y}\\) \u65f6\uff0c\u6211\u4eec\u5c06 \\(x\\) \u89c6\u4e3a\u5e38\u6570\uff0c\u56e0\u6b64 \\(x^2y\\) \u6c42\u5bfc\u5f97 \\(x^2\\)\uff0c\\(3x\\) \u6c42\u5bfc\u5f97 \\(0\\)\uff0c\\(-2y\\) \u6c42\u5bfc\u5f97 \\(-2\\)\u3002
\u4ece\u51e0\u4f55\u4e0a\u770b\uff0c\u5bf9 \\(x\\) \u6c42\u504f\u5bfc\u6570\u5c31\u50cf\u7528\u4e00\u4e2a\u5e73\u884c\u4e8e \\(xz\\) \u5e73\u9762\u7684\u5e73\u9762\uff08\u5728\u56fa\u5b9a\u7684 \\(y\\) \u503c\u5904\uff09\u5207\u5272\u4e09\u7ef4\u66f2\u9762\uff0c\u7136\u540e\u6c42\u6240\u5f97\u66f2\u7ebf\u7684\u659c\u7387\u3002
\u5bf9\u4e8e \\(f(x, y) = x^2 + y^2\\)\uff1a\\(\\nabla f(x, y) = (2x, 2y)\\)\u3002\u5728\u70b9 \\((1, 2)\\) \u5904\uff1a\\(\\nabla f(1, 2) = (2, 4)\\)\u3002
\u68af\u5ea6\u6709\u4e24\u4e2a\u5173\u952e\u6027\u8d28\uff1a
\u65b9\u5411\uff1a\u5b83\u6307\u5411\u4e0a\u5347\u6700\u9661\u7684\u65b9\u5411\u3002\u60f3\u8c61\u4e00\u4f4d\u767b\u5c71\u8005\u5728\u5c71\u4e0a\u3002\u4ed6\u4eec\u6240\u5728\u4f4d\u7f6e\u7684\u68af\u5ea6\u6307\u5411\u6b63\u4e0a\u65b9\uff0c\u6cbf\u7740\u6700\u9661\u7684\u8def\u5f84\u3002
\u5927\u5c0f\uff1a\\(\\|\\nabla f\\|\\) \u7ed9\u51fa\u4e86\u6700\u9661\u65b9\u5411\u4e0a\u7684\u53d8\u5316\u7387\u3002\u68af\u5ea6\u5927\u610f\u5473\u7740\u5730\u5f62\u9661\u5ced\uff1b\u68af\u5ea6\u5c0f\u610f\u5473\u7740\u5730\u5f62\u8fd1\u4e4e\u5e73\u5766\u3002
\u7531\u4e8e\u68af\u5ea6\u6307\u5411\u4e0a\u5761\uff0c\u6cbf\u76f8\u53cd\u65b9\u5411\uff08\\(-\\nabla f\\)\uff09\u79fb\u52a8\u5c31\u662f\u4e0b\u5761\uff0c\u8d70\u5411\u66f4\u4f4e\u7684\u503c\u3002\u8fd9\u4e2a\u7b80\u5355\u7684\u60f3\u6cd5\u662f\u68af\u5ea6\u4e0b\u964d\u7684\u57fa\u7840\uff0c\u6211\u4eec\u5c06\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\u8be6\u7ec6\u63a2\u8ba8\u8fd9\u79cd\u4f18\u5316\u6280\u672f\u3002\u73b0\u5728\uff0c\u5173\u952e\u8981\u70b9\u662f\uff1a\u68af\u5ea6\u544a\u8bc9\u4f60\u54ea\u4e2a\u65b9\u5411\u662f\"\u4e0a\u5761\"\uff0c\u4ee5\u53ca\u6500\u767b\u7684\u9661\u5ced\u7a0b\u5ea6\u3002
\u65b9\u5411\u5bfc\u6570\u63a8\u5e7f\u4e86\u504f\u5bfc\u6570\u3002\u5b83\u4e0d\u95ee\"\\(f\\) \u6cbf \\(x\\) \u8f74\u5982\u4f55\u53d8\u5316\uff1f\"\uff0c\u800c\u662f\u95ee\"\\(f\\) \u6cbf\u4efb\u610f\u65b9\u5411 \\(\\mathbf{u}\\) \u5982\u4f55\u53d8\u5316\uff1f\"\u5b83\u901a\u8fc7\u68af\u5ea6\u4e0e\u5355\u4f4d\u5411\u91cf\u7684\u70b9\u79ef\u6765\u8ba1\u7b97\uff1a
\u5bf9\u4e8e \\(f(x, y) = x^2 + y^2\\) \u5728\u70b9 \\((1, 2)\\) \u5904\uff0c\u6cbf\u65b9\u5411 \\(\\mathbf{v} = (3, 4)\\)\uff1a\u9996\u5148\u5f52\u4e00\u5316\u5f97\u5230 \\(\\mathbf{u} = (3/5, 4/5)\\)\uff0c\u7136\u540e \\(D_{\\mathbf{u}} f = (2, 4) \\cdot (3/5, 4/5) = 6/5 + 16/5 = 22/5\\)\u3002
\u504f\u5bfc\u6570\u662f\u65b9\u5411\u5bfc\u6570\u7684\u7279\u4f8b\uff0c\u5176\u4e2d\u65b9\u5411\u6cbf\u7740\u5750\u6807\u8f74\u3002\u5982\u679c\u65b9\u5411\u5bfc\u6570\u5728\u67d0\u4e2a\u65b9\u5411\u4e0a\u4e3a\u96f6\uff0c\u5219\u51fd\u6570\u5728\u8be5\u70b9\u6cbf\u8be5\u65b9\u5411\u662f\u5e73\u5766\u7684\u3002
\u7b49\u9ad8\u7ebf\uff08\u6216\u6c34\u5e73\u66f2\u7ebf\uff09\u8fde\u63a5\u51fd\u6570\u503c\u76f8\u7b49\u7684\u70b9\u3002\u5bf9\u4e8e \\(f(x, y) = x^2 + y^2\\)\uff0c\u7b49\u9ad8\u7ebf\u662f\u4ee5\u539f\u70b9\u4e3a\u4e2d\u5fc3\u7684\u5706\uff1a\u5bf9\u5e94\u4e0d\u540c \\(c\\) \u503c\u7684 \\(x^2 + y^2 = c\\)\u3002
\u7b49\u9ad8\u7ebf\u6c38\u4e0d\u76f8\u4ea4\uff08\u4e00\u4e2a\u70b9\u4e0d\u53ef\u80fd\u6709\u4e24\u4e2a\u4e0d\u540c\u7684\u51fd\u6570\u503c\uff09\u3002
\u68af\u5ea6\u59cb\u7ec8\u5782\u76f4\u4e8e\u7b49\u9ad8\u7ebf\uff0c\u4ece\u4f4e\u503c\u6307\u5411\u9ad8\u503c\u3002
\u7b49\u9ad8\u7ebf\u5bc6\u96c6\u8868\u793a\u5730\u5f62\u9661\u5ced\uff1b\u7b49\u9ad8\u7ebf\u7a00\u758f\u8868\u793a\u5761\u5ea6\u5e73\u7f13\u3002
\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u7684\u51fd\u6570\u90fd\u53ea\u4ea7\u751f\u5355\u4e2a\u8f93\u51fa\u3002\u4f46\u8bb8\u591a\u51fd\u6570\u4f1a\u4ea7\u751f\u591a\u4e2a\u8f93\u51fa\u3002\u51fd\u6570 \\(\\mathbf{F}: \\mathbb{R}^n \\to \\mathbb{R}^m\\) \u63a5\u6536 \\(n\\) \u4e2a\u8f93\u5165\u5e76\u4ea7\u751f \\(m\\) \u4e2a\u8f93\u51fa\u3002\u96c5\u53ef\u6bd4\u77e9\u9635\u7ec4\u7ec7\u4e86\u8fd9\u6837\u4e00\u4e2a\u5411\u91cf\u503c\u51fd\u6570\u7684\u6240\u6709\u504f\u5bfc\u6570\uff1a
\u96c5\u53ef\u6bd4\u77e9\u9635\u7684\u6bcf\u4e00\u884c\u662f\u4e00\u4e2a\u8f93\u51fa\u5206\u91cf\u7684\u68af\u5ea6\u3002\u5bf9\u4e8e\u4e00\u4e2a\u6709 3 \u4e2a\u8f93\u5165\u548c 2 \u4e2a\u8f93\u51fa\u7684\u51fd\u6570\uff0c\u96c5\u53ef\u6bd4\u77e9\u9635\u662f\u4e00\u4e2a \\(2 \\times 3\\) \u77e9\u9635\u3002
\u96c5\u53ef\u6bd4\u77e9\u9635\u5c06\u5bfc\u6570\u63a8\u5e7f\u5230\u5411\u91cf\u503c\u51fd\u6570\u3002
\u5c31\u50cf\u6807\u91cf\u51fd\u6570\u7684\u5bfc\u6570\u544a\u8bc9\u4f60\u6bcf\u5355\u4f4d\u8f93\u5165\u53d8\u5316\u5bf9\u5e94\u7684\u8f93\u51fa\u53d8\u5316\u91cf\u4e00\u6837\uff0c\u96c5\u53ef\u6bd4\u77e9\u9635\u544a\u8bc9\u4f60\u6bcf\u4e2a\u8f93\u51fa\u76f8\u5bf9\u4e8e\u6bcf\u4e2a\u8f93\u5165\u7684\u53d8\u5316\u60c5\u51b5\u3002
\u96c5\u53ef\u6bd4\u884c\u5217\u5f0f\u8861\u91cf\u4e00\u4e2a\u53d8\u6362\u5c40\u90e8\u62c9\u4f38\u6216\u538b\u7f29\u7a7a\u95f4\u7684\u7a0b\u5ea6\u3002
\u5982\u679c\u884c\u5217\u5f0f\u4e3a 2\uff0c\u5c0f\u533a\u57df\u7684\u9762\u79ef\u52a0\u500d\u3002\u5982\u679c\u884c\u5217\u5f0f\u4e3a 0\uff0c\u8be5\u53d8\u6362\u5c06\u7a7a\u95f4\u538b\u7f29\u5230\u66f4\u4f4e\u7ef4\u5ea6\uff08\u56de\u60f3\u6211\u4eec\u5728\u77e9\u9635\u7ae0\u8282\u4e2d\u5b66\u5230\u7684\uff1a\u884c\u5217\u5f0f\u4e3a\u96f6\u610f\u5473\u7740\u5947\u5f02\u53d8\u6362\uff0c\u4e0d\u53ef\u9006\uff09\u3002
\u5f53\u591a\u4e2a\u53d8\u6362\u7ec4\u5408\u5728\u4e00\u8d77\uff08\u4e00\u4e2a\u53d8\u6362\u7684\u8f93\u51fa\u4f5c\u4e3a\u4e0b\u4e00\u4e2a\u53d8\u6362\u7684\u8f93\u5165\uff09\u65f6\uff0c\u6574\u4f53\u6620\u5c04\u7684\u96c5\u53ef\u6bd4\u77e9\u9635\u662f\u5404\u4e2a\u96c5\u53ef\u6bd4\u77e9\u9635\u7684\u4e58\u79ef\u3002\u6211\u4eec\u5c06\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\u770b\u5230\u8fd9\u4e2a\u601d\u60f3\u53d8\u5f97\u81f3\u5173\u91cd\u8981\u3002
\u68af\u5ea6\u6355\u83b7\u4e00\u9636\u4fe1\u606f\uff08\u659c\u7387\uff09\uff0c\u800c\u6d77\u68ee\u77e9\u9635\u6355\u83b7\u4e8c\u9636\u4fe1\u606f\uff08\u66f2\u7387\uff09\u3002
\u5bf9\u4e8e\u6807\u91cf\u51fd\u6570 \\(f(x_1, \\ldots, x_n)\\)\uff0c\u6d77\u68ee\u77e9\u9635\u662f\u6240\u6709\u4e8c\u9636\u504f\u5bfc\u6570\u7684 \\(n \\times n\\) \u77e9\u9635\uff1a
\u5bf9\u89d2\u7ebf\u5143\u7d20\uff08\\(6x\\) \u548c \\(4x - 6y\\)\uff09\u544a\u8bc9\u4f60 \\(x\\) \u65b9\u5411\u7684\u659c\u7387\u968f \\(x\\) \u79fb\u52a8\u5982\u4f55\u53d8\u5316\uff0c\\(y\\) \u65b9\u5411\u540c\u7406\u3002
\u975e\u5bf9\u89d2\u7ebf\u5143\u7d20\uff08\\(4y\\)\uff09\u544a\u8bc9\u4f60\u4e00\u4e2a\u65b9\u5411\u7684\u659c\u7387\u968f\u53e6\u4e00\u4e2a\u65b9\u5411\u7684\u79fb\u52a8\u5982\u4f55\u53d8\u5316\u3002
\u514b\u83b1\u7f57\u5b9a\u7406\u4fdd\u8bc1\uff1a\u5bf9\u4e8e\u5177\u6709\u8fde\u7eed\u4e8c\u9636\u5bfc\u6570\u7684\u51fd\u6570\uff0c\u6df7\u5408\u504f\u5bfc\u6570\u76f8\u7b49\uff1a\\(\\frac{\\partial^2 f}{\\partial x \\partial y} = \\frac{\\partial^2 f}{\\partial y \\partial x}\\)\u3002
\u8fd9\u610f\u5473\u7740\u6d77\u68ee\u77e9\u9635\u662f\u5bf9\u79f0\u7684\uff0c\u8fd9\uff08\u6b63\u5982\u6211\u4eec\u5728\u77e9\u9635\u7ae0\u8282\u4e2d\u770b\u5230\u7684\uff09\u4fdd\u8bc1\u4e86\u5b9e\u7279\u5f81\u503c\u548c\u6b63\u4ea4\u7279\u5f81\u5411\u91cf\u3002
\u6d77\u68ee\u77e9\u9635\u544a\u8bc9\u6211\u4eec\u4e34\u754c\u70b9\uff08\u68af\u5ea6\u4e3a\u96f6\u7684\u70b9\uff09\u9644\u8fd1\u51fd\u6570\u7684\u5f62\u72b6\uff1a
\u591a\u53d8\u91cf\u94fe\u5f0f\u6cd5\u5219\u5c06\u94fe\u5f0f\u6cd5\u5219\u6269\u5c55\u5230\u591a\u53d8\u91cf\u51fd\u6570\u3002\u5982\u679c \\(z = f(x, y)\\)\uff0c\u5176\u4e2d \\(x = g(t)\\) \u4e14 \\(y = h(t)\\)\uff0c\u5219\uff1a
\u4ece \\(t\\) \u5230 \\(z\\) \u7684\u6bcf\u6761\u8def\u5f84\u90fd\u8d21\u732e\u4e00\u9879\uff1a\u6cbf\u8be5\u8def\u5f84\u7684\u504f\u5bfc\u6570\u4e58\u4ee5\u4e2d\u95f4\u53d8\u91cf\u5bf9 \\(t\\) \u7684\u5bfc\u6570\u3002
\u4f8b\u5982\uff0c\u5982\u679c \\(z = x^2 y + 3x - y^2\\)\uff0c\\(x = \\cos(t)\\)\uff0c\\(y = \\sin(t)\\)\uff1a
\u9664\u4e86\u624b\u52a8\u8ba1\u7b97\u5bfc\u6570\uff0c\u8fd8\u6709\u4e09\u79cd\u65b9\u6cd5\uff1a
\u4f7f\u7528 jax.grad \u8ba1\u7b97\u51fd\u6570 \\(f(x, y) = x^2 y + 3x - 2y\\) \u5728\u70b9 \\((1, 2)\\) \u5904\u7684\u68af\u5ea6\u3002\u7531\u4e8e \\(f\\) \u63a5\u6536\u5411\u91cf\u8f93\u5165\uff0c\u8bf7\u4f7f\u7528\u5e26 argnums \u53c2\u6570\u7684 jax.grad\u3002
import jax\nimport jax.numpy as jnp\n\ndef f(x, y):\n return x**2 * y + 3*x - 2*y\n\ndf_dx = jax.grad(f, argnums=0)\ndf_dy = jax.grad(f, argnums=1)\n\nx, y = 1.0, 2.0\nprint(f\"\u2202f/\u2202x = {df_dx(x, y):.4f} (\u671f\u671b: {2*x*y + 3:.4f})\")\nprint(f\"\u2202f/\u2202y = {df_dy(x, y):.4f} (\u671f\u671b: {x**2 - 2:.4f})\")\n \u4f7f\u7528 jax.jacobian \u8ba1\u7b97\u5411\u91cf\u503c\u51fd\u6570\u7684\u96c5\u53ef\u6bd4\u77e9\u9635\uff0c\u5e76\u4e0e\u624b\u52a8\u8ba1\u7b97\u7ed3\u679c\u8fdb\u884c\u6bd4\u8f83\u3002
import jax\nimport jax.numpy as jnp\n\ndef F(x):\n return jnp.array([x[0]**2 + x[1], x[0] * x[1]**2])\n\nJ = jax.jacobian(F)\nx = jnp.array([1.0, 2.0])\nprint(f\"\u5728 (1,2) \u5904\u7684\u96c5\u53ef\u6bd4\u77e9\u9635:\\n{J(x)}\")\n# \u671f\u671b: [[2*x[0], 1], [x[1]**2, 2*x[0]*x[1]]] = [[2, 1], [4, 4]]\n \u4f7f\u7528 jax.hessian \u8ba1\u7b97 \\(f(x, y) = x^3 + 2xy^2 - y^3\\) \u7684\u6d77\u68ee\u77e9\u9635\uff0c\u5e76\u9a8c\u8bc1\u5176\u5bf9\u79f0\u6027\u3002
import jax\nimport jax.numpy as jnp\n\ndef f(xy):\n x, y = xy[0], xy[1]\n return x**3 + 2*x*y**2 - y**3\n\nH = jax.hessian(f)\npoint = jnp.array([1.0, 2.0])\nhess = H(point)\nprint(f\"\u6d77\u68ee\u77e9\u9635:\\n{hess}\")\nprint(f\"\u662f\u5426\u5bf9\u79f0: {jnp.allclose(hess, hess.T)}\")\n# \u671f\u671b: [[6x, 4y], [4y, 4x-6y]] = [[6, 8], [8, -8]]\n \u4ece\u5934\u6784\u5efa\u4e00\u4e2a\u6781\u7b80\u7684\u81ea\u52a8\u5fae\u5206\u5f15\u64ce\u3002
Var \u8ffd\u8e2a\u5176\u503c\u4ee5\u53ca\u5982\u4f55\u901a\u8fc7\u94fe\u5f0f\u6cd5\u5219\u53cd\u5411\u4f20\u64ad\u68af\u5ea6\u3002class Var:\n def __init__(self, val, children=(), backward_fn=None):\n self.val = val\n self.grad = 0.0\n self.children = children\n self.backward_fn = backward_fn\n\n def __add__(self, other):\n out = Var(self.val + other.val, children=(self, other))\n def _backward():\n self.grad += out.grad # d(a+b)/da = 1\n other.grad += out.grad # d(a+b)/db = 1\n out.backward_fn = _backward\n return out\n\n def __mul__(self, other):\n out = Var(self.val * other.val, children=(self, other))\n def _backward():\n self.grad += other.val * out.grad # d(a*b)/da = b\n other.grad += self.val * out.grad # d(a*b)/db = a\n out.backward_fn = _backward\n return out\n\n def backward(self):\n # \u62d3\u6251\u6392\u5e8f\uff0c\u7136\u540e\u4f20\u64ad\u68af\u5ea6\n # \u6211\u4eec\u5c06\u5728\u6570\u636e\u7ed3\u6784\u4e0e\u7b97\u6cd5\u7ae0\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecd\n order, visited = [], set()\n def topo(v):\n if v not in visited:\n visited.add(v)\n for c in v.children:\n topo(c)\n order.append(v)\n topo(self)\n self.grad = 1.0\n for v in reversed(order):\n if v.backward_fn:\n v.backward_fn()\n\n# f(x, y) = x*x*y + x \u5728 (3, 2) \u5904\nx = Var(3.0)\ny = Var(2.0)\nf = x * x * y + x # = 3*3*2 + 3 = 21\n\nf.backward()\nprint(f\"f = {f.val}\") # 21.0\nprint(f\"df/dx = {x.grad}\") # 2*x*y + 1 = 13.0\nprint(f\"df/dy = {y.grad}\") # x*x = 9.0\n\u51fd\u6570\u903c\u8fd1\u7528\u8db3\u591f\u63a5\u8fd1\u539f\u51fd\u6570\u7684\u7b80\u5355\u51fd\u6570\u6765\u66ff\u4ee3\u590d\u6742\u51fd\u6570\u3002\u672c\u6587\u6db5\u76d6\u7ebf\u6027\u5316\u3001\u6cf0\u52d2\u7ea7\u6570\u3001\u591a\u9879\u5f0f\u903c\u8fd1\u3001\u5085\u91cc\u53f6\u7ea7\u6570\u4ee5\u53ca\u901a\u7528\u903c\u8fd1\u5b9a\u7406\u2014\u2014\u8fd9\u4e9b\u662f\u795e\u7ecf\u7f51\u7edc\u80fd\u591f\u5b66\u4e60\u4efb\u610f\u6620\u5c04\u7684\u7406\u8bba\u57fa\u7840\u3002
\u6211\u4eec\u9047\u5230\u7684\u8bb8\u591a\u51fd\u6570\u90fd\u8fc7\u4e8e\u590d\u6742\uff0c\u65e0\u6cd5\u76f4\u63a5\u5904\u7406\u3002\u4f8b\u5982\uff0c\u5728\u7eb8\u4e0a\u8ba1\u7b97 \\(e^{0.1}\\)\u3001\u9884\u6d4b\u536b\u661f\u8f68\u8ff9\u7b49\uff0c\u90fd\u6d89\u53ca\u6ca1\u6709\u7b80\u5355\u5c01\u95ed\u5f62\u5f0f\u7b54\u6848\u7684\u51fd\u6570\u3002
\u51fd\u6570\u903c\u8fd1\u7528\u66f4\u7b80\u5355\u7684\u51fd\u6570\u6765\u66ff\u4ee3\u590d\u6742\u51fd\u6570\uff0c\u4f7f\u5176\u5728\u5173\u5fc3\u533a\u57df\u5185\"\u8db3\u591f\u63a5\u8fd1\"\u539f\u51fd\u6570\u3002
\u6700\u81ea\u7136\u7684\u903c\u8fd1\u662f\u591a\u9879\u5f0f\u3002\u591a\u9879\u5f0f\u53ea\u662f \\(x\\) \u7684\u5e42\u6b21\u4e0e\u7cfb\u6570\u7684\u548c\uff0c\u6613\u4e8e\u6c42\u503c\u3001\u5fae\u5206\u548c\u79ef\u5206\u3002
\u4f46\u4e3a\u4ec0\u4e48\u591a\u9879\u5f0f\u4f5c\u4e3a\u903c\u8fd1\u5668\u5982\u6b64\u6709\u6548\uff1f\u770b\u770b \\(x\\) \u7684\u6bcf\u4e2a\u5e42\u6b21\u8d21\u732e\u4e86\u4ec0\u4e48\u3002
\u901a\u8fc7\u9009\u62e9\u5408\u9002\u7684\u7cfb\u6570\uff0c\u6211\u4eec\u53ef\u4ee5\u9010\u6b21\u5339\u914d\u51fd\u6570\u5728\u67d0\u4e00\u70b9\u7684\u503c\u3001\u659c\u7387\u3001\u66f2\u7387\u4ee5\u53ca\u9ad8\u9636\u884c\u4e3a\u3002
\u5f53\u9879\u6570\u8db3\u591f\u65f6\uff0c\u591a\u9879\u5f0f\u51e0\u4e4e\u53ef\u4ee5\u6a21\u4eff\u4efb\u4f55\u5149\u6ed1\u51fd\u6570\u3002
\u95ee\u9898\u5728\u4e8e\uff1a\u5982\u4f55\u627e\u5230\u6b63\u786e\u7684\u7cfb\u6570\uff1f
\u7ebf\u6027\u5316\u662f\u6700\u7b80\u5355\u7684\u903c\u8fd1\u3002\u5728\u70b9 \\(x = a\\) \u9644\u8fd1\uff0c\u6211\u4eec\u7528\u51fd\u6570\u7684\u5207\u7ebf\u6765\u4ee3\u66ff\u5b83\uff1a
\u8fd9\u662f\u4e00\u9636\u6cf0\u52d2\u903c\u8fd1\u3002\u5b83\u7684\u601d\u8def\u662f\uff1a\u4ece\u5df2\u77e5\u503c \\(f(a)\\) \u51fa\u53d1\uff0c\u7136\u540e\u52a0\u4e0a\u659c\u7387\u4e58\u4ee5\u8ddd\u79bb \\(a\\) \u7684\u504f\u79fb\u91cf\u3002
\u4f8b\u5982\uff0c\u5728 \\(x = 0\\) \u5904\u5bf9 \\(\\sin(x)\\) \u7ebf\u6027\u5316\uff1a\\(f(0) = 0\\)\uff0c\\(f'(0) = \\cos(0) = 1\\)\uff0c\u6240\u4ee5 \\(L(x) = x\\)\u3002\u5728\u96f6\u9644\u8fd1\uff0c\\(\\sin(x) \\approx x\\)\u3002\u8bd5\u8bd5\u770b\uff1a\\(\\sin(0.1) = 0.0998\\ldots \\approx 0.1\\)\u3002
\u4f46\u7ebf\u6027\u5316\u4ec5\u5728\u975e\u5e38\u63a5\u8fd1 \\(a\\) \u7684\u5730\u65b9\u6709\u6548\u3002\u79bb\u5f97\u7a0d\u8fdc\uff0c\u903c\u8fd1\u5c31\u5931\u6548\u4e86\u3002\u4e3a\u4e86\u505a\u5f97\u66f4\u597d\uff0c\u6211\u4eec\u9700\u8981\u5f15\u5165\u9ad8\u9636\u9879\u3002
\u6cf0\u52d2\u7ea7\u6570\u5c06\u51fd\u6570\u8868\u793a\u4e3a\u65e0\u7a77\u591a\u4e2a\u591a\u9879\u5f0f\u9879\u7684\u548c\uff0c\u6bcf\u4e00\u9879\u90fd\u6355\u6349\u5230\u51fd\u6570\u5728\u70b9 \\(a\\) \u9644\u8fd1\u884c\u4e3a\u7684\u66f4\u7cbe\u7ec6\u7ec6\u8282\uff1a
\u6bcf\u4e00\u9879\u4f9d\u6b21\u589e\u52a0\u4e00\u4e2a\u4fee\u6b63\u9879\u3002\u7b2c\u4e00\u9879\u5339\u914d\u51fd\u6570\u503c\uff0c\u7b2c\u4e8c\u9879\u5339\u914d\u659c\u7387\uff0c\u7b2c\u4e09\u9879\u5339\u914d\u66f2\u7387\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002\u5305\u542b\u7684\u9879\u8d8a\u591a\uff0c\u903c\u8fd1\u7cbe\u786e\u7684\u533a\u57df\u5c31\u8d8a\u5927\u3002
\u5206\u6bcd\u4e2d\u7684 \\(n!\\) \u5e76\u975e\u968f\u610f\u9009\u62e9\u3002\u5f53\u4f60\u5bf9 \\((x - a)^n\\) \u6070\u597d\u5fae\u5206 \\(n\\) \u6b21\u65f6\uff0c\u4f1a\u5f97\u5230 \\(n!\\)\u3002\u9636\u4e58\u62b5\u6d88\u4e86\u8fd9\u4e2a\u7ed3\u679c\uff0c\u4ece\u800c\u786e\u4fdd\u6cf0\u52d2\u591a\u9879\u5f0f\u7684 \\(n\\) \u9636\u5bfc\u6570\u5728 \\(x = a\\) \u5904\u4e0e\u539f\u51fd\u6570\u7684 \\(n\\) \u9636\u5bfc\u6570\u76f8\u7b49\u3002
\u9ea6\u514b\u52b3\u6797\u7ea7\u6570\u5c31\u662f\u4e2d\u5fc3\u5728 \\(a = 0\\) \u7684\u6cf0\u52d2\u7ea7\u6570\uff1a
\u6ce8\u610f \\(\\sin x\\) \u53ea\u6709\u5947\u6b21\u5e42\uff08\u5b83\u662f\u5947\u51fd\u6570\uff09\uff0c\u800c \\(\\cos x\\) \u53ea\u6709\u5076\u6b21\u5e42\uff08\u5b83\u662f\u5076\u51fd\u6570\uff09\u3002\u4ea4\u66ff\u7684\u7b26\u53f7\u4f7f\u5f97\u903c\u8fd1\u5728\u771f\u5b9e\u503c\u5468\u56f4\u632f\u8361\uff0c\u4ece\u4e24\u4fa7\u540c\u65f6\u6536\u655b\u3002
\u8ba9\u6211\u4eec\u7528\u56db\u9879\u6765\u903c\u8fd1 \\(e^{0.5}\\)\uff1a\\(1 + 0.5 + \\frac{0.25}{2} + \\frac{0.125}{6} = 1 + 0.5 + 0.125 + 0.02083 \\approx 1.6458\\)\u3002\u771f\u5b9e\u503c\u4e3a \\(1.6487\\ldots\\)\uff0c\u56e0\u6b64\u56db\u9879\u5df2\u7ecf\u7ed9\u51fa\u4e86\u4e09\u4e2a\u6b63\u786e\u7684\u5c0f\u6570\u4f4d\u3002
\u5e76\u975e\u6240\u6709\u6cf0\u52d2\u7ea7\u6570\u90fd\u5904\u5904\u6536\u655b\u3002\u6536\u655b\u534a\u5f84\u544a\u8bc9\u6211\u4eec\uff0c\u5728\u8ddd\u79bb\u4e2d\u5fc3 \\(a\\) \u591a\u8fdc\u7684\u8303\u56f4\u5185\uff0c\u7ea7\u6570\u7ed9\u51fa\u6709\u6548\u7684\u7ed3\u679c\u3002\u5728\u6b64\u534a\u5f84\u5185\uff0c\u901a\u8fc7\u589e\u52a0\u9879\u6570\uff0c\u591a\u9879\u5f0f\u903c\u8fd1\u53ef\u4ee5\u8fbe\u5230\u4efb\u610f\u6240\u9700\u7684\u7cbe\u5ea6\u3002\u8d85\u51fa\u6b64\u534a\u5f84\uff0c\u7ea7\u6570\u53d1\u6563\u3002
\u5e42\u7ea7\u6570\u7684\u4e00\u822c\u5f62\u5f0f\u662f\uff1a\\(\\sum_{n=0}^{\\infty} a_n (x - c)^n\\)\u3002\u6cf0\u52d2\u7ea7\u6570\u662f\u7cfb\u6570\u7531\u5bfc\u6570\u786e\u5b9a\u7684\u5e42\u7ea7\u6570\u3002\u5176\u4ed6\u5e42\u7ea7\u6570\u53ef\u80fd\u7531\u5176\u4ed6\u89c4\u5219\u5b9a\u4e49\u3002\u6bd4\u503c\u5224\u522b\u6cd5\u7528\u4e8e\u5224\u5b9a\u6536\u655b\u6027\uff1a\u8ba1\u7b97 \\(\\lim_{n \\to \\infty} \\left|\\frac{a_{n+1}}{a_n}\\right|\\)\u3002\u5982\u679c\u8be5\u6781\u9650\u4e3a \\(L\\)\uff0c\u5219\u6536\u655b\u534a\u5f84\u4e3a \\(R = 1/L\\)\u3002
\u5c06\u6cf0\u52d2\u7ea7\u6570\u622a\u65ad\u5230 \\(n\\) \u9879\u65f6\uff0c\u4f1a\u4ea7\u751f\u8bef\u5dee\u3002\u62c9\u683c\u6717\u65e5\u4f59\u9879\u7ed9\u51fa\u4e86\u8fd9\u4e2a\u8bef\u5dee\u7684\u754c\u9650\uff1a
\u8fd9\u91cc \\(c\\) \u662f \\(a\\) \u548c \\(x\\) \u4e4b\u95f4\u7684\u67d0\u4e2a\u672a\u77e5\u70b9\u3002\u6211\u4eec\u65e0\u6cd5\u786e\u5207\u77e5\u9053 \\(c\\)\uff0c\u4f46\u901a\u5e38\u53ef\u4ee5\u9650\u5b9a \\(|f^{(n+1)}(c)|\\) \u6765\u5f97\u5230\u6700\u574f\u60c5\u51b5\u4e0b\u7684\u8bef\u5dee\u4f30\u8ba1\u3002\u5206\u6bcd\u4e2d\u7684 \\((n+1)!\\) \u589e\u957f\u6781\u5feb\uff0c\u56e0\u6b64\u968f\u7740\u9879\u6570\u589e\u52a0\uff0c\u8bef\u5dee\u8fc5\u901f\u51cf\u5c0f\uff08\u5bf9\u4e8e\u6536\u655b\u534a\u5f84\u5185\u7684\u51fd\u6570\u800c\u8a00\uff09\u3002
\u5bf9\u4e8e\u591a\u53d8\u91cf\u51fd\u6570\uff0c\u6cf0\u52d2\u5c55\u5f00\u5305\u542b\u6df7\u5408\u504f\u5bfc\u6570\u3002\\(f(\\mathbf{x})\\) \u5728\u70b9 \\(\\mathbf{a}\\) \u9644\u8fd1\u7684\u4e8c\u9636\u903c\u8fd1\u4e3a\uff1a
\u7b2c\u4e00\u9879\u662f\u51fd\u6570\u503c\uff0c\u7b2c\u4e8c\u9879\u4f7f\u7528\u68af\u5ea6\uff08\u5411\u91cf\uff0c\u5982\u6211\u4eec\u5728\u591a\u5143\u5fae\u79ef\u5206\u4e2d\u770b\u5230\u7684\uff09\uff0c\u7b2c\u4e09\u9879\u4f7f\u7528\u6d77\u68ee\u77e9\u9635\uff08\u6355\u6349\u66f2\u7387\uff09\u3002\u8fd9\u76f4\u63a5\u5c06\u6211\u4eec\u7684\u77e9\u9635\u7ae0\u8282\u4e0e\u5fae\u79ef\u5206\u8054\u7cfb\u8d77\u6765\uff1a\u6d77\u68ee\u77e9\u9635\u662f\u4e00\u4e2a\u7531\u4e8c\u9636\u5bfc\u6570\u7ec4\u6210\u7684\u77e9\u9635\uff0c\u63cf\u8ff0\u4e86\u51fd\u6570\u8868\u9762\u7684\u5f62\u72b6\u3002
\u8fd9\u79cd\u591a\u53d8\u91cf\u4e8c\u9636\u903c\u8fd1\u662f\u725b\u987f\u6cd5\u548c\u5176\u4ed6\u4e8c\u9636\u4f18\u5316\u6280\u672f\u7684\u57fa\u7840\uff0c\u6211\u4eec\u5c06\u5728\u4e0b\u4e00\u4e2a\u6587\u4ef6\u4e2d\u770b\u5230\u3002
\u9664\u4e86\u591a\u9879\u5f0f\uff0c\u8fd8\u6709\u5176\u4ed6\u503c\u5f97\u4e86\u89e3\u7684\u903c\u8fd1\u65b9\u6cd5\uff1a
\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u5177\u6709\u4f7f\u903c\u8fd1\u53ef\u9760\u7684\u6027\u8d28\u2014\u2014\u8fde\u7eed\u6027\uff08\u65e0\u8df3\u8dc3\uff09\u3001\u53ef\u5fae\u6027\uff08\u65e0\u5c16\u89d2\uff09\u3001\u5149\u6ed1\u6027\uff08\u6240\u6709\u9636\u5bfc\u6570\u90fd\u5b58\u5728\uff09\u548c\u6709\u754c\u6027\uff08\u8f93\u51fa\u4fdd\u6301\u6709\u9650\uff09\uff0c\u6211\u4eec\u5c31\u79f0\u5176\u4e3a\"\u884c\u4e3a\u826f\u597d\"\u7684\u51fd\u6570\u3002
\u591a\u9879\u5f0f\u3001\u6307\u6570\u51fd\u6570\u548c\u4e09\u89d2\u51fd\u6570\u90fd\u5c5e\u4e8e\u884c\u4e3a\u826f\u597d\u7684\u51fd\u6570\u3002\u51fd\u6570\u884c\u4e3a\u8d8a\u597d\uff0c\u83b7\u5f97\u826f\u597d\u903c\u8fd1\u6240\u9700\u7684\u6cf0\u52d2\u9879\u6570\u5c31\u8d8a\u5c11\u3002
\u7528\u9012\u589e\u6570\u91cf\u7684\u6cf0\u52d2\u9879\u903c\u8fd1 \\(e^x\\)\uff0c\u5e76\u53ef\u89c6\u5316\u903c\u8fd1\u6548\u679c\u5982\u4f55\u6539\u5584\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nx = jnp.linspace(-2, 3, 300)\nplt.plot(x, jnp.exp(x), \"k-\", linewidth=2, label=\"e\u02e3 (\u7cbe\u786e\u503c)\")\n\ncolors = [\"#e74c3c\", \"#3498db\", \"#27ae60\", \"#9b59b6\"]\nfor n, color in zip([1, 2, 4, 8], colors):\n approx = sum(x**k / jnp.array(float(jnp.prod(jnp.arange(1, k+1)) if k > 0 else 1))\n for k in range(n+1))\n plt.plot(x, approx, color=color, linestyle=\"--\", label=f\"{n} \u9879\")\n\nplt.ylim(-2, 15)\nplt.legend()\nplt.title(\"e\u02e3 \u7684\u6cf0\u52d2\u903c\u8fd1\")\nplt.show()\n \u8ba1\u7b97\u62c9\u683c\u6717\u65e5\u4f59\u9879\uff0c\u4ee5\u9650\u5b9a\u7528\u4e0d\u540c\u6570\u91cf\u7684\u6cf0\u52d2\u9879\u903c\u8fd1 \\(\\sin(1)\\) \u65f6\u7684\u8bef\u5dee\u3002
import jax.numpy as jnp\n\nx = 1.0\nexact = jnp.sin(x)\n\ntaylor = 0.0\nfor n in range(8):\n sign = (-1)**n\n factorial = float(jnp.prod(jnp.arange(1, 2*n+2)))\n taylor += sign * x**(2*n+1) / factorial\n error = abs(exact - taylor)\n bound = x**(2*n+3) / float(jnp.prod(jnp.arange(1, 2*n+4)))\n print(f\"\u9879\u6570={n+1} \u8fd1\u4f3c\u503c={taylor:.10f} \u8bef\u5dee={error:.2e} \u754c\u9650={bound:.2e}\")\n \u6bd4\u8f83\u5728 \\(x=0\\) \u9644\u8fd1 \\(\\cos(x)\\) \u7684\u7ebf\u6027\u5316\u903c\u8fd1\u4e0e\u4e8c\u6b21\u6cf0\u52d2\u903c\u8fd1\u3002\u5728\u540c\u4e00\u5f20\u56fe\u4e0a\u7ed8\u5236\u4e24\u4e2a\u903c\u8fd1\u548c\u771f\u5b9e\u51fd\u6570\uff0c\u89c2\u5bdf\u5404\u81ea\u7cbe\u786e\u7684\u8303\u56f4\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nx = jnp.linspace(-3, 3, 300)\nplt.plot(x, jnp.cos(x), \"k-\", linewidth=2, label=\"cos(x)\")\nplt.plot(x, jnp.ones_like(x), \"--\", color=\"#e74c3c\", label=\"\u7ebf\u6027: 1\")\nplt.plot(x, 1 - x**2/2, \"--\", color=\"#3498db\", label=\"\u4e8c\u6b21: 1 - x\u00b2/2\")\nplt.plot(x, 1 - x**2/2 + x**4/24, \"--\", color=\"#27ae60\", label=\"\u56db\u9636\")\nplt.ylim(-2, 2)\nplt.legend()\nplt.title(\"cos(x) \u7684\u6cf0\u52d2\u903c\u8fd1\")\nplt.show()\n \u4f18\u5316\u662f\u6a21\u578b\u8bad\u7ec3\u7684\u6570\u5b66\u6838\u5fc3\u2014\u2014\u5bfb\u627e\u4f7f\u635f\u5931\u51fd\u6570\u6700\u5c0f\u7684\u53c2\u6570\u3002\u672c\u6587\u6db5\u76d6\u9a7b\u70b9\u3001\u51f8\u6027\u3001\u68af\u5ea6\u4e0b\u964d\u3001\u725b\u987f\u6cd5\u3001\u5e26\u62c9\u683c\u6717\u65e5\u4e58\u6570\u7684\u7ea6\u675f\u4f18\u5316\uff0c\u4ee5\u53ca\u9a71\u52a8\u73b0\u4ee3\u6df1\u5ea6\u5b66\u4e60\u7684\u4e3b\u6d41\u4f18\u5316\u5668\uff08SGD\u3001Adam\uff09\u3002
\u8bad\u7ec3\u795e\u7ecf\u7f51\u7edc\u3001\u62df\u5408\u56de\u5f52\u7ebf\u3001\u8c03\u4f18\u8d85\u53c2\u6570\uff1a\u51e0\u4e4e\u6240\u6709\u673a\u5668\u5b66\u4e60\u7b97\u6cd5\u7684\u6838\u5fc3\u90fd\u662f\u4e00\u4e2a\u4f18\u5316\u95ee\u9898\u3002
\u6211\u4eec\u6709\u4e00\u4e2a\u51fd\u6570\uff08\u635f\u5931\u51fd\u6570\u3001\u4ee3\u4ef7\u51fd\u6570\u3001\u76ee\u6807\u51fd\u6570\uff09\uff0c\u5e0c\u671b\u627e\u5230\u4f7f\u5176\u5c3d\u53ef\u80fd\u5c0f\uff08\u6216\u5927\uff09\u7684\u8f93\u5165\u3002
\u5728\u4f18\u5316\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u7406\u89e3\u51fd\u6570\u7684\u96f6\u70b9\uff08\u6216\u6839\uff09\u3002\\(f(x)\\) \u7684\u96f6\u70b9\u662f\u6307\u6ee1\u8db3 \\(f(x) = 0\\) \u7684 \\(x\\) \u503c\u3002\u4ece\u56fe\u5f62\u4e0a\u770b\uff0c\u8fd9\u4e9b\u70b9\u5c31\u662f\u4e0e x \u8f74\u7684\u4ea4\u70b9\u3002
\u4f8b\u5982\uff0c\\(f(x) = x^2 - 3x + 2 = (x-1)(x-2)\\) \u7684\u96f6\u70b9\u5728 \\(x = 1\\) \u548c \\(x = 2\\) \u5904\u3002\u5728\u4e24\u4e2a\u96f6\u70b9\u4e4b\u95f4\uff0c\u51fd\u6570\u4e3a\u8d1f\uff08\\(f(1.5) = -0.25\\)\uff09\uff1b\u5728\u96f6\u70b9\u4e4b\u5916\uff0c\u51fd\u6570\u4e3a\u6b63\u3002\u96f6\u70b9\u5c06\u6570\u8f74\u5206\u5272\u6210\u82e5\u5e72\u4e2a\u533a\u57df\uff0c\u5728\u6bcf\u4e2a\u533a\u57df\u4e2d\u51fd\u6570\u4fdd\u6301\u76f8\u540c\u7b26\u53f7\u3002
\u96f6\u70b9\u7684\u91cd\u6570\u662f\u6307\u5bf9\u5e94\u56e0\u5f0f\u51fa\u73b0\u7684\u6b21\u6570\u3002
\u5728\u5355\u96f6\u70b9\uff08\u91cd\u6570\u4e3a 1\uff09\u5904\uff0c\u56fe\u50cf\u7a7f\u8fc7 x \u8f74\u3002\u5728\u4e8c\u91cd\u96f6\u70b9\uff08\u91cd\u6570\u4e3a 2\uff09\u5904\uff0c\u56fe\u50cf\u63a5\u89e6 x \u8f74\u4f46\u53cd\u5f39\u56de\u53bb\u800c\u4e0d\u7a7f\u8fc7\uff0c\u5728\u8be5\u70b9\u5904\u770b\u8d77\u6765\u662f\"\u5e73\u5766\"\u7684\u3002
\u5bfb\u627e\u96f6\u70b9\u4e4b\u6240\u4ee5\u91cd\u8981\uff0c\u662f\u56e0\u4e3a\u5bfc\u6570 \\(f'(x)\\) \u7684\u96f6\u70b9\u6b63\u662f \\(f(x)\\) \u7684\u9a7b\u70b9\u2014\u2014\u5373\u6781\u5927\u503c\u6216\u6781\u5c0f\u503c\u7684\u5019\u9009\u70b9\u3002
\u5728\u6781\u5927\u503c\u6216\u6781\u5c0f\u503c\u5904\uff0c\u5207\u7ebf\u662f\u6c34\u5e73\u7684\uff08\u659c\u7387\u4e3a 0\uff09\uff0c\u56e0\u6b64 \\(f'(x) = 0\\)\u3002
\u4f46\u5e76\u975e\u6bcf\u4e2a\u9a7b\u70b9\u90fd\u662f\u6781\u5927\u503c\u6216\u6781\u5c0f\u503c\u3002\\(f'(x) = 0\\) \u7684\u70b9\u4e5f\u53ef\u80fd\u662f\u62d0\u70b9\uff08\u5982 \\(f(x) = x^3\\) \u5728 \\(x = 0\\) \u5904\uff09\uff0c\u51fd\u6570\u5728\u8be5\u70b9\u6682\u65f6\u53d8\u5e73\u4f46\u5e76\u672a\u6539\u53d8\u65b9\u5411\u3002
\u4e8c\u9636\u5bfc\u6570\u68c0\u9a8c\u53ef\u4ee5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u5728\u9a7b\u70b9 \\(x = c\\)\uff08\u5373 \\(f'(c) = 0\\)\uff09\u5904\uff1a
\u4f8b\u5982\uff0c\\(f(x) = x^3 - 3x\\)\u3002\u5bfc\u6570\u4e3a \\(f'(x) = 3x^2 - 3 = 3(x-1)(x+1)\\)\uff0c\u56e0\u6b64\u9a7b\u70b9\u5728 \\(x = -1\\) \u548c \\(x = 1\\) \u5904\u3002\u4e8c\u9636\u5bfc\u6570\u4e3a \\(f''(x) = 6x\\)\u3002\u5728 \\(x = -1\\) \u5904\uff1a\\(f''(-1) = -6 < 0\\)\uff08\u5c40\u90e8\u6781\u5927\u503c\uff09\u3002\u5728 \\(x = 1\\) \u5904\uff1a\\(f''(1) = 6 > 0\\)\uff08\u5c40\u90e8\u6781\u5c0f\u503c\uff09\u3002
\u5982\u679c\u8fde\u63a5\u51fd\u6570\u56fe\u50cf\u4e0a\u4efb\u610f\u4e24\u70b9\u7684\u7ebf\u6bb5\u4f4d\u4e8e\u56fe\u50cf\u4e4b\u4e0a\uff08\u6216\u4e0e\u4e4b\u91cd\u5408\uff09\uff0c\u5219\u8be5\u51fd\u6570\u662f\u51f8\u7684\u3002\u53ef\u4ee5\u60f3\u8c61\u6210\u4e00\u4e2a\u7897\u5f62\uff0c\u5904\u5904\u5411\u4e0a\u5f2f\u66f2\u3002\u6570\u5b66\u4e0a\uff0c\u82e5\u5bf9\u6240\u6709 \\(x\\) \u6709 \\(f''(x) \\geq 0\\)\uff0c\u5219 \\(f\\) \u662f\u51f8\u51fd\u6570\u3002
\u51f8\u6027\u7684\u5f3a\u5927\u4e4b\u5904\u5728\u4e8e\u51f8\u51fd\u6570\u6709\u4e00\u4e2a\u5353\u8d8a\u7684\u6027\u8d28\uff1a\u6bcf\u4e2a\u5c40\u90e8\u6781\u5c0f\u503c\u540c\u65f6\u4e5f\u662f\u5168\u5c40\u6700\u5c0f\u503c\u3002\u4e0d\u5b58\u5728\u4f1a\u8ba9\u4eba\u9677\u5165\u7684\u6b3a\u9a97\u6027\u5c40\u90e8\u4f4e\u8c37\u3002\u5982\u679c\u4f60\u628a\u4e00\u4e2a\u7403\u6eda\u5165\u51f8\u7897\u4e2d\uff0c\u5b83\u603b\u662f\u4f1a\u5230\u8fbe\u5e95\u90e8\u3002
\u82e5 \\(-f\\) \u662f\u51f8\u7684\uff0c\u5219\u51fd\u6570\u662f\u51f9\u7684\uff08\u5411\u4e0b\u5f2f\u66f2\uff09\u3002\u51fd\u6570\u4ece\u51f9\u6027\u8fc7\u6e21\u5230\u51f8\u6027\u7684\u70b9\u79f0\u4e3a\u62d0\u70b9\uff0c\u51fa\u73b0\u5728 \\(f''(x) = 0\\) \u5904\u3002
\u725b\u987f\u6cd5\u5229\u7528\u5207\u7ebf\u5bfb\u627e\u51fd\u6570\u7684\u96f6\u70b9\uff08\u8fdb\u800c\u4e5f\u53ef\u7528\u4e8e\u5bfb\u627e\u5176\u5bfc\u6570\u7684\u9a7b\u70b9\uff09\u3002\u4ece\u521d\u59cb\u731c\u6d4b \\(x_0\\) \u51fa\u53d1\uff0c\u8fed\u4ee3\u66f4\u65b0\uff1a
\u5176\u601d\u60f3\u662f\uff1a\u5728 \\(x_n\\) \u5904\u753b\u51fa\u5207\u7ebf\uff0c\u627e\u5230\u5b83\u4e0e x \u8f74\u7684\u4ea4\u70b9\uff0c\u8be5\u4ea4\u70b9\u5373\u4e3a \\(x_{n+1}\\)\u3002\u5bf9\u4e8e\u6027\u8d28\u826f\u597d\u4e14\u521d\u59cb\u70b9\u9009\u53d6\u6070\u5f53\u7684\u51fd\u6570\uff0c\u725b\u987f\u6cd5\u6536\u655b\u975e\u5e38\u5feb\uff08\u4e8c\u6b21\u6536\u655b\uff0c\u5373\u6bcf\u6b65\u6b63\u786e\u4f4d\u6570\u5927\u81f4\u7ffb\u500d\uff09\u3002
\u4f8b\u5982\uff0c\u6c42 \\(\\sqrt{5}\\)\uff08\u5373 \\(f(x) = x^2 - 5\\) \u7684\u96f6\u70b9\uff09\uff1a\\(f'(x) = 2x\\)\uff0c\u56e0\u6b64 \\(x_{n+1} = x_n - \\frac{x_n^2 - 5}{2x_n}\\)\u3002\u4ece \\(x_0 = 2\\) \u5f00\u59cb\uff1a\\(x_1 = 2.25\\)\uff0c\\(x_2 = 2.2361\\ldots\\)\uff0c\u5df2\u7cbe\u786e\u5230\u5c0f\u6570\u70b9\u540e\u56db\u4f4d\u3002
\u5982\u679c\u521d\u59cb\u731c\u6d4b\u79bb\u6839\u592a\u8fdc\u3001\u6839\u9644\u8fd1 \\(f'(x) = 0\\)\uff0c\u6216\u51fd\u6570\u5728\u9644\u8fd1\u6709\u62d0\u70b9\uff0c\u725b\u987f\u6cd5\u53ef\u80fd\u4f1a\u5931\u8d25\u3002\u6b64\u5916\uff0c\u5b83\u8fd8\u9700\u8981\u8ba1\u7b97\u5bfc\u6570\uff0c\u8fd9\u53ef\u80fd\u4ee3\u4ef7\u9ad8\u6602\u3002
\u5bf9\u4e8e\u4f18\u5316\uff08\u5bfb\u627e\u6781\u5c0f\u503c\u800c\u975e\u96f6\u70b9\uff09\uff0c\u6211\u4eec\u5c06\u725b\u987f\u6cd5\u5e94\u7528\u4e8e \\(f'(x) = 0\\)\uff0c\u5f97\u5230\u66f4\u65b0\u516c\u5f0f\uff1a
\u5728\u591a\u7ef4\u60c5\u5f62\u4e0b\uff0c\u8fd9\u53d8\u4e3a \\(\\mathbf{x}_{n+1} = \\mathbf{x}_n - H^{-1} \\nabla f(\\mathbf{x}_n)\\)\uff0c\u5176\u4e2d \\(H\\) \u662f Hessian \u77e9\u9635\u3002\u8fd9\u6b63\u662f\u4e0a\u4e00\u8282\u4e2d\u4e8c\u9636\u6cf0\u52d2\u8fd1\u4f3c\u7684\u5b9e\u9645\u5e94\u7528\uff1a\u5c06\u51fd\u6570\u8fd1\u4f3c\u4e3a\u4e8c\u6b21\u578b\uff0c\u8df3\u5230\u8be5\u4e8c\u6b21\u578b\u7684\u6781\u5c0f\u503c\u70b9\uff0c\u7136\u540e\u91cd\u590d\u3002
\u62c9\u683c\u6717\u65e5\u4e58\u6570\u7528\u4e8e\u6c42\u89e3\u7ea6\u675f\u4f18\u5316\uff1a\u5728\u7ea6\u675f\u6761\u4ef6 \\(g(x, y) = c\\) \u4e0b\u6c42 \\(f(x, y)\\) \u7684\u6700\u4f18\u503c\u3002\u6211\u4eec\u4e0d\u662f\u5728 \\(\\mathbb{R}^n\\) \u4e2d\u5168\u57df\u641c\u7d22\uff0c\u800c\u662f\u9650\u5236\u5728\u7ea6\u675f\u6761\u4ef6\u6210\u7acb\u7684\u96c6\u5408\uff08\u4e00\u6761\u66f2\u7ebf\u6216\u66f2\u9762\uff09\u4e0a\u3002
\u5173\u952e\u89c1\u89e3\u662f\u51e0\u4f55\u5c42\u9762\u7684\uff1a\u5728\u7ea6\u675f\u6700\u4f18\u89e3\u5904\uff0c\\(f\\) \u7684\u68af\u5ea6\u5fc5\u987b\u4e0e \\(g\\) \u7684\u68af\u5ea6\u5e73\u884c\u3002\u5982\u679c\u5b83\u4eec\u4e0d\u5e73\u884c\uff0c\u6211\u4eec\u53ef\u4ee5\u6cbf\u7740\u7ea6\u675f\u6761\u4ef6\u671d\u67d0\u4e2a\u65b9\u5411\u79fb\u52a8\uff0c\u4ece\u800c\u7ee7\u7eed\u6539\u8fdb \\(f\\) \u7684\u503c\uff0c\u8fd9\u610f\u5473\u7740\u8fd8\u6ca1\u6709\u8fbe\u5230\u6700\u4f18\u3002
\u6211\u4eec\u5f15\u5165\u4e00\u4e2a\u65b0\u53d8\u91cf \\(\\lambda\\)\uff08\u62c9\u683c\u6717\u65e5\u4e58\u6570\uff09\uff0c\u5b9a\u4e49\u62c9\u683c\u6717\u65e5\u51fd\u6570\uff1a
\u7531\u7b2c\u4e00\u4e2a\u65b9\u7a0b\uff08\u5047\u8bbe \\(x \\neq 0\\)\uff09\uff1a\\(\\lambda = y\\)\u3002\u4ee3\u5165\u7b2c\u4e8c\u4e2a\u65b9\u7a0b\uff1a\\(x^2 = 2y^2\\)\u3002\u7ed3\u5408\u7ea6\u675f\u6761\u4ef6\uff1a\\(2y^2 + y^2 = 1\\)\uff0c\u5f97 \\(y = \\frac{1}{\\sqrt{3}}\\)\u3002\u6700\u5927\u503c\u4e3a \\(f = \\frac{2}{3\\sqrt{3}}\\)\u3002
\u5bf9\u4e8e\u4e0d\u7b49\u5f0f\u7ea6\u675f\uff08\\(g(x,y) \\leq c\\) \u800c\u975e \\(= c\\)\uff09\uff0cKarush-Kuhn-Tucker\uff08KKT\uff09\u6761\u4ef6\u63a8\u5e7f\u4e86\u62c9\u683c\u6717\u65e5\u4e58\u6570\u6cd5\u3002\u7ea6\u675f\u8981\u4e48\u662f\u6fc0\u6d3b\u7684\uff08\u6709\u6548\u7ea6\u675f\uff0c\u6309\u7b49\u5f0f\u5904\u7406\uff09\uff0c\u8981\u4e48\u662f\u975e\u6fc0\u6d3b\u7684\uff08\u89e3\u5728\u5185\u90e8\uff0c\u7ea6\u675f\u65e0\u5173\u7d27\u8981\uff09\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u6211\u4eec\u5f88\u5c11\u624b\u5de5\u8fdb\u884c\u4f18\u5316\u3002\u4ee5\u4e0b\u662f\u4e3b\u8981\u7684\u7b97\u6cd5\u5bb6\u65cf\uff1a
\u4e00\u9636\u65b9\u6cd5\uff08\u4ec5\u4f7f\u7528\u68af\u5ea6\uff09\uff1a\u68af\u5ea6\u4e0b\u964d\u3001\u968f\u673a\u68af\u5ea6\u4e0b\u964d\uff08SGD\uff09\u3001Adam\u3002\u8fd9\u4e9b\u65b9\u6cd5\u6bcf\u6b65\u8ba1\u7b97\u6210\u672c\u4f4e\uff0c\u4f46\u6536\u655b\u53ef\u80fd\u8f83\u6162\uff0c\u5c24\u5176\u662f\u5728\u75c5\u6001\u95ee\u9898\u4e0a\u3002
\u4e8c\u9636\u65b9\u6cd5\uff08\u4f7f\u7528\u68af\u5ea6\u548c Hessian \u77e9\u9635\uff09\uff1a\u725b\u987f\u6cd5\u6536\u655b\u5feb\uff0c\u4f46\u8ba1\u7b97\u548c\u6c42\u9006 Hessian \u77e9\u9635\u4ee3\u4ef7\u9ad8\u6602\uff08\u5bf9\u4e8e \\(n\\) \u4e2a\u53c2\u6570\u4e3a \\(O(n^3)\\)\uff09\u3002\u62df\u725b\u987f\u6cd5\uff08\u5982 BFGS \u548c L-BFGS\uff09\u4ec5\u5229\u7528\u68af\u5ea6\u4fe1\u606f\u8fd1\u4f3c Hessian \u77e9\u9635\uff0c\u6bd4\u4e00\u9636\u65b9\u6cd5\u6536\u655b\u66f4\u5feb\uff0c\u53c8\u65e0\u9700\u627f\u62c5\u5b8c\u5168\u7684\u4e8c\u9636\u65b9\u6cd5\u8ba1\u7b97\u6210\u672c\u3002
\u5171\u8f6d\u68af\u5ea6\u6cd5\uff1a\u9002\u7528\u4e8e\u5927\u578b\u7a00\u758f\u7cfb\u7edf\uff0c\u4ec5\u9700\u77e9\u9635-\u5411\u91cf\u4e58\u79ef\uff0c\u65e0\u9700\u5b58\u50a8\u5b8c\u6574\u7684 Hessian \u77e9\u9635\u3002
\u9ad8\u65af-\u725b\u987f\u6cd5\u548c\u83b1\u6587\u8d1d\u683c-\u9a6c\u5938\u5c14\u7279\u6cd5\uff1a\u4e13\u95e8\u7528\u4e8e\u6700\u5c0f\u4e8c\u4e58\u95ee\u9898\uff08\u5728\u56de\u5f52\u4e2d\u5e38\u89c1\uff09\uff0c\u901a\u8fc7 Jacobian \u77e9\u9635\u8fd1\u4f3c Hessian \u77e9\u9635\u3002
\u81ea\u7136\u68af\u5ea6\u4e0b\u964d\uff1a\u5229\u7528 Fisher \u4fe1\u606f\u77e9\u9635\u8003\u8651\u53c2\u6570\u7a7a\u95f4\u7684\u51e0\u4f55\u7ed3\u6784\uff0c\u5bf9\u6982\u7387\u6a21\u578b\u53ef\u80fd\u66f4\u6709\u6548\u3002
\u4f18\u5316\u5668\u7684\u9009\u62e9\u53d6\u51b3\u4e8e\u5177\u4f53\u95ee\u9898\u3002\u5bf9\u4e8e\u6df1\u5ea6\u5b66\u4e60\uff0c\u4e00\u9636\u65b9\u6cd5\uff08\u5c24\u5176\u662f Adam\uff09\u5360\u4e3b\u5bfc\u5730\u4f4d\uff0c\u56e0\u4e3a\u53c2\u6570\u91cf\u5de8\u5927\uff08\u6570\u767e\u4e07\u5230\u6570\u5341\u4ebf\uff09\uff0c\u8ba1\u7b97 Hessian \u77e9\u9635\u4e0d\u5207\u5b9e\u9645\u3002\u5bf9\u4e8e\u76ee\u6807\u51fd\u6570\u5149\u6ed1\u7684\u5c0f\u89c4\u6a21\u95ee\u9898\uff0c\u4e8c\u9636\u65b9\u6cd5\u53ef\u80fd\u5feb\u5f97\u591a\u3002
\u5b9e\u73b0\u725b\u987f\u6cd5\u6c42 \\(\\sqrt{7}\\)\uff08\u5373 \\(f(x) = x^2 - 7\\) \u7684\u96f6\u70b9\uff09\u3002\u89c2\u5bdf\u5176\u5feb\u901f\u6536\u655b\u3002
import jax.numpy as jnp\n\nf = lambda x: x**2 - 7\ndf = lambda x: 2*x\n\nx = 3.0 # \u521d\u59cb\u731c\u6d4b\nfor i in range(6):\n x = x - f(x) / df(x)\n print(f\"step {i+1}: x = {x:.10f} (error: {abs(x - jnp.sqrt(7.0)):.2e})\")\n \u4f7f\u7528\u68af\u5ea6\u4e0b\u964d\u6700\u5c0f\u5316 \\(f(x, y) = (x - 3)^2 + (y + 1)^2\\)\u3002\u6700\u5c0f\u503c\u5728 \\((3, -1)\\) \u5904\u3002\u5c1d\u8bd5\u4e0d\u540c\u7684\u5b66\u4e60\u7387\u3002
import jax\nimport jax.numpy as jnp\n\ndef f(params):\n x, y = params\n return (x - 3)**2 + (y + 1)**2\n\ngrad_f = jax.grad(f)\nparams = jnp.array([0.0, 0.0])\nlr = 0.1\n\nfor i in range(20):\n g = grad_f(params)\n params = params - lr * g\n if i % 5 == 0 or i == 19:\n print(f\"step {i:2d}: ({params[0]:.4f}, {params[1]:.4f}) loss={f(params):.6f}\")\n \u6570\u503c\u6c42\u89e3\u7ea6\u675f\u4f18\u5316\u95ee\u9898\u3002\u5728 \\(x + y = 10\\) \u7684\u7ea6\u675f\u4e0b\u6700\u5927\u5316 \\(f(x,y) = xy\\)\uff0c\u901a\u8fc7\u53c2\u6570\u5316 \\(y = 10 - x\\) \u5e76\u6c42\u5355\u53d8\u91cf\u51fd\u6570\u7684\u6700\u4f18\u503c\u3002
import jax\nimport jax.numpy as jnp\n\n# \u4ee3\u5165\u7ea6\u675f\u6761\u4ef6\uff1ay = 10 - x\uff0c\u6240\u4ee5 f = x(10 - x) = 10x - x\u00b2\nf = lambda x: x * (10 - x)\ndf = jax.grad(f)\n\n# \u68af\u5ea6\u4e0a\u5347\uff08\u6211\u4eec\u8981\u6c42\u6700\u5927\u503c\uff0c\u6240\u4ee5\u52a0\u4e0a\u68af\u5ea6\uff09\nx = 1.0\nlr = 0.1\nfor i in range(20):\n x = x + lr * df(x)\nprint(f\"x={x:.4f}, y={10-x:.4f}, f={f(x):.4f}\") # \u5e94\u4e3a x=5, y=5, f=25\n \u7edf\u8ba1\u5b66\u63d0\u4f9b\u4e86\u63cf\u8ff0\u6570\u636e\u548c\u91cf\u5316\u4e0d\u786e\u5b9a\u6027\u7684\u8bed\u8a00\u3002\u672c\u8282\u6db5\u76d6\u5206\u5e03\u3001\u968f\u673a\u53d8\u91cf\u3001PMF\u3001PDF\u3001CDF\u3001\u671f\u671b\u3001\u65b9\u5dee\u3001\u77e9\u4ee5\u53ca\u4e2d\u5fc3\u6781\u9650\u5b9a\u7406\u2014\u2014\u8fd9\u4e9b\u6982\u5ff5\u652f\u6491\u7740\u6bcf\u4e00\u4e2a\u673a\u5668\u5b66\u4e60\u8bc4\u4f30\u6307\u6807\u548c\u635f\u5931\u51fd\u6570\u3002
\u7edf\u8ba1\u5b66\u662f\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u7684\u79d1\u5b66\u3002\u4f60\u6536\u96c6\u89c2\u6d4b\u503c\uff0c\u5bf9\u5176\u8fdb\u884c\u6c47\u603b\uff0c\u5e76\u5f97\u51fa\u7ed3\u8bba\u2014\u2014\u901a\u5e38\u9488\u5bf9\u90a3\u4e9b\u65e0\u6cd5\u76f4\u63a5\u6d4b\u91cf\u7684\u4e8b\u7269\u3002
\u5047\u8bbe\u4f60\u60f3\u77e5\u9053\u67d0\u4e2a\u56fd\u5bb6\u6240\u6709\u6210\u5e74\u4eba\u7684\u5e73\u5747\u8eab\u9ad8\u3002\u4f60\u4e0d\u53ef\u80fd\u6d4b\u91cf\u6bcf\u4e00\u4e2a\u4eba\uff0c\u56e0\u6b64\u4f60\u6d4b\u91cf\u4e00\u4e2a\u6837\u672c\uff0c\u5e76\u5229\u7528\u7edf\u8ba1\u5b66\u5bf9\u6574\u4e2a\u603b\u4f53\u505a\u51fa\u6709\u6839\u636e\u7684\u63a8\u6d4b\u3002
\u7edf\u8ba1\u5b66\u6709\u4e24\u4e2a\u4e3b\u8981\u5206\u652f\uff1a
\u7edf\u8ba1\u5b66\u7684\u57fa\u672c\u6784\u4ef6\u662f\u5206\u5e03\u2014\u2014\u4e00\u79cd\u63cf\u8ff0\u6570\u503c\u5982\u4f55\u5206\u5e03\u7684\u65b9\u5f0f\u3002\u5176\u4ed6\u4e00\u5207\u2014\u2014\u5e73\u5747\u503c\u3001\u68c0\u9a8c\u3001\u9884\u6d4b\u2014\u2014\u90fd\u6e90\u4e8e\u5bf9\u5206\u5e03\u7684\u7406\u89e3\u3002
\u9891\u7387\u5206\u5e03\u7edf\u8ba1\u6570\u636e\u4e2d\u6bcf\u4e2a\u503c\uff08\u6216\u503c\u533a\u95f4\uff09\u51fa\u73b0\u7684\u6b21\u6570\u3002\u60f3\u8c61\u4e00\u4e0b\u628a\u8003\u8bd5\u6210\u7ee9\u5206\u5230\u4e0d\u540c\u7684\u533a\u95f4\uff0c\u7136\u540e\u7edf\u8ba1\u6bcf\u4e2a\u533a\u95f4\u4e2d\u6709\u591a\u5c11\u5b66\u751f\u3002\u7ed3\u679c\u5c31\u662f\u76f4\u65b9\u56fe\u3002
\u6982\u7387\u5206\u5e03\u7528\u6982\u7387\u4ee3\u66ff\u539f\u59cb\u8ba1\u6570\u3002\u5b83\u4e0d\u8bf4\"12 \u540d\u5b66\u751f\u7684\u5206\u6570\u5728 70 \u5230 80 \u4e4b\u95f4\"\uff0c\u800c\u662f\u8bf4\"\u5206\u6570\u5728 70 \u5230 80 \u4e4b\u95f4\u7684\u6982\u7387\u4e3a 0.24\"\u3002\u5f53\u6570\u636e\u8fde\u7eed\u65f6\uff0c\u76f4\u65b9\u56fe\u7684\u67f1\u72b6\u4f1a\u53d8\u6210\u4e00\u6761\u5e73\u6ed1\u66f2\u7ebf\u3002
\u5de6\u4fa7\u7684\u76f4\u65b9\u56fe\u57fa\u4e8e\u4f60\u5b9e\u9645\u6536\u96c6\u7684\u6570\u636e\u6784\u5efa\u3002\u53f3\u4fa7\u7684\u5e73\u6ed1\u66f2\u7ebf\u662f\u4e00\u4e2a\u6570\u5b66\u6a21\u578b\uff0c\u63cf\u8ff0\u4e86\u6570\u636e\u80cc\u540e\u7684\u6a21\u5f0f\u3002\u4e00\u4e2a\u662f\u7ecf\u9a8c\u6027\u7684\uff0c\u53e6\u4e00\u4e2a\u662f\u7406\u8bba\u6027\u7684\u3002
\u4e3a\u4e86\u4ece\u6570\u5b66\u4e0a\u5904\u7406\u5206\u5e03\uff0c\u6211\u4eec\u9700\u8981\u4e00\u79cd\u5c06\u7ed3\u679c\u8d4b\u4e88\u6570\u503c\u7684\u65b9\u6cd5\u3002\u8fd9\u6b63\u662f\u968f\u673a\u53d8\u91cf\u6240\u505a\u7684\u3002
\u968f\u673a\u53d8\u91cf\u662f\u4e00\u4e2a\u5c06\u6bcf\u6b21\u8bd5\u9a8c\u7684\u7ed3\u679c\u6620\u5c04\u5230\u5b9e\u6570\u7684\u51fd\u6570\u3002\u629b\u4e00\u679a\u786c\u5e01\uff1a\u7ed3\u679c\u662f\"\u6b63\u9762\"\u6216\"\u53cd\u9762\"\uff0c\u4f46\u968f\u673a\u53d8\u91cf \\(X\\) \u5c06\u5176\u8f6c\u6362\u4e3a \\(X(\u6b63\u9762) = 1\\) \u548c \\(X(\u53cd\u9762) = 0\\)\u3002\u73b0\u5728\u6211\u4eec\u5c31\u53ef\u4ee5\u8fdb\u884c\u7b97\u672f\u8fd0\u7b97\u4e86\u3002
\u79bb\u6563\u968f\u673a\u53d8\u91cf\u53d6\u503c\u4e3a\u53ef\u6570\u96c6\uff1a10 \u6b21\u629b\u63b7\u4e2d\u7684\u6b63\u9762\u6b21\u6570\u3001\u9ab0\u5b50\u7684\u70b9\u6570\u3001\u4e00\u5c0f\u65f6\u5185\u6536\u5230\u7684\u7535\u5b50\u90ae\u4ef6\u6570\u91cf\u3002
\u8fde\u7eed\u968f\u673a\u53d8\u91cf\u53ef\u4ee5\u5728\u4e00\u4e2a\u533a\u95f4\u5185\u53d6\u4efb\u610f\u503c\uff1a\u4f60\u7684\u7cbe\u786e\u8eab\u9ad8\u3001\u4e0b\u4e00\u73ed\u516c\u4ea4\u8f66\u5230\u8fbe\u7684\u65f6\u95f4\u3001\u4e2d\u5348\u7684\u6e29\u5ea6\u3002
\u8fd9\u79cd\u533a\u522b\u5f88\u91cd\u8981\uff0c\u56e0\u4e3a\u5b83\u6539\u53d8\u4e86\u6211\u4eec\u8ba1\u7b97\u6982\u7387\u7684\u65b9\u5f0f\u3002\u5bf9\u4e8e\u79bb\u6563\u53d8\u91cf\uff0c\u6211\u4eec\u6c42\u548c\u3002\u5bf9\u4e8e\u8fde\u7eed\u53d8\u91cf\uff0c\u6211\u4eec\u79ef\u5206\uff08\u56de\u987e\u7b2c 3 \u7ae0\u7684\u79ef\u5206\u5185\u5bb9\uff09\u3002
\u5bf9\u4e8e\u79bb\u6563\u968f\u673a\u53d8\u91cf\uff0c\u6982\u7387\u8d28\u91cf\u51fd\u6570\uff08PMF\uff09\u7ed9\u51fa\u6bcf\u4e2a\u5177\u4f53\u503c\u7684\u6982\u7387\uff1a
\u65e2\u7136\u6211\u4eec\u53ef\u4ee5\u5c06\u7ed3\u679c\u8d4b\u4e88\u6570\u503c\uff0c\u6700\u81ea\u7136\u7684\u95ee\u9898\u5c31\u662f\uff1a\u5e73\u5747\u800c\u8a00\u6211\u4eec\u671f\u671b\u5f97\u5230\u4ec0\u4e48\u503c\uff1f
\u671f\u671b\uff08\u6216\u671f\u671b\u503c\uff09\u662f\u6240\u6709\u53ef\u80fd\u503c\u7684\u52a0\u6743\u5e73\u5747\u503c\uff0c\u6743\u91cd\u5373\u4e3a\u6982\u7387\u3002\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u5206\u5e03\u7684\"\u91cd\u5fc3\"\u3002
\u5982\u679c\u4f60\u591a\u6b21\u63b7\u4e00\u4e2a\u516c\u5e73\u7684\u9ab0\u5b50\uff0c\u4f60\u7684\u5e73\u5747\u63b7\u70b9\u6570\u4f1a\u6536\u655b\u5230 3.5\u3002\u8fd9\u5c31\u662f\u671f\u671b\u503c\uff0c\u5c3d\u7ba1\u4f60\u5b9e\u9645\u4e0a\u6c38\u8fdc\u63b7\u4e0d\u51fa 3.5\u3002
\u5bf9\u4e8e\u79bb\u6563\u968f\u673a\u53d8\u91cf\uff1a
\u671f\u671b\u5177\u6709\u7ebf\u6027\u6027\u8d28\uff0c\u5373 \\(E[aX + b] = aE[X] + b\\)\u3002\u8fd9\u4e00\u6027\u8d28\u6781\u5176\u6709\u7528\uff0c\u5728\u673a\u5668\u5b66\u4e60\u635f\u5931\u51fd\u6570\u4e2d\u9891\u7e41\u51fa\u73b0\u3002
\u671f\u671b\u544a\u8bc9\u6211\u4eec\u4e2d\u5fc3\u4f4d\u7f6e\uff0c\u4f46\u5b8c\u5168\u6ca1\u6709\u8bf4\u660e\u6570\u503c\u7684\u5206\u6563\u7a0b\u5ea6\u3002\u4e3a\u4e86\u63cf\u8ff0\u5206\u5e03\u7684\u5b8c\u6574\u5f62\u72b6\uff0c\u6211\u4eec\u9700\u8981\u77e9\u3002
\u77e9\u662f \\(X\\) \u7684\u67d0\u6b21\u5e42\u7684\u671f\u671b\u3002\u7b2c \\(k\\) \u9636\u539f\u70b9\u77e9\u4e3a\uff1a
\u4e00\u9636\u539f\u70b9\u77e9\uff08\\(k = 1\\)\uff09\u5c31\u662f\u5747\u503c\uff1a\\(\\mu_1' = E[X] = \\mu\\)\u3002
\u539f\u70b9\u77e9\u662f\u4ece\u96f6\u70b9\u5f00\u59cb\u5ea6\u91cf\u7684\u3002\u901a\u5e38\u6211\u4eec\u66f4\u5173\u5fc3\u76f8\u5bf9\u4e8e\u5747\u503c\u7684\u504f\u5dee\u3002\u7b2c \\(k\\) \u9636\u4e2d\u5fc3\u77e9\u5c06\u6d4b\u91cf\u4e2d\u5fc3\u5316\uff1a
\u4e00\u9636\u4e2d\u5fc3\u77e9\u59cb\u7ec8\u4e3a\u96f6\uff08\u5747\u503c\u4e0a\u4e0b\u65b9\u7684\u504f\u5dee\u76f8\u4e92\u62b5\u6d88\uff09\u3002\u4e8c\u9636\u4e2d\u5fc3\u77e9\u5c31\u662f\u65b9\u5dee\u3002
\u4e3a\u4e86\u6bd4\u8f83\u4e0d\u540c\u5c3a\u5ea6\u4e0a\u7684\u5206\u5e03\uff0c\u6211\u4eec\u901a\u8fc7\u9664\u4ee5\u6807\u51c6\u5dee \\(\\sigma\\) \u7684\u9002\u5f53\u5e42\u6b21\u6765\u8fdb\u884c\u6807\u51c6\u5316\uff1a
4 \u9636\u77e9\uff08\u5cf0\u5ea6\uff09\uff1a\u5c3e\u90e8\u7684\u91cd\u91cf\u3002\u5cf0\u5ea6\u8d8a\u9ad8\uff0c\u6781\u7aef\u5f02\u5e38\u503c\u8d8a\u591a\u3002
\u8ba9\u6211\u4eec\u5bf9\u5177\u4f53\u6570\u636e\u96c6 \\(X = \\{2, 4, 4, 4, 5, 5, 7, 9\\}\\) \u8ba1\u7b97\u5168\u90e8\u56db\u4e2a\u77e9\u3002
\u6b65\u9aa4 1\uff1a\u5747\u503c\uff08\u4e00\u9636\u539f\u70b9\u77e9\uff09
\u6807\u51c6\u5dee\u4e3a \\(\\sigma = \\sqrt{4} = 2\\)\u3002
\u6b65\u9aa4 3\uff1a\u504f\u5ea6\uff08\u6807\u51c6\u5316\u4e09\u9636\u4e2d\u5fc3\u77e9\uff09\u3002\u504f\u5dee\u53d6\u4e09\u6b21\u65b9\uff0c\u6c42\u5e73\u5747\uff0c\u518d\u9664\u4ee5 \\(\\sigma^3\\)\uff1a
\u6b63\u504f\u5ea6\u8868\u793a\u53f3\u5c3e\u66f4\u957f\uff0c\u8fd9\u5f88\u5408\u7406\uff0c\u56e0\u4e3a 9 \u8fdc\u9ad8\u4e8e\u5747\u503c\u3002
\u6b65\u9aa4 4\uff1a\u5cf0\u5ea6\uff08\u6807\u51c6\u5316\u56db\u9636\u4e2d\u5fc3\u77e9\uff09\u3002\u504f\u5dee\u53d6\u56db\u6b21\u65b9\uff1a
\u8ba1\u7b97\u4e00\u4e2a\u52a0\u8f7d\u9ab0\u5b50\u7684\u671f\u671b\u503c\uff0c\u5176\u4e2d\u9762 6 \u7684\u6982\u7387\u4e3a 0.3\uff0c\u5176\u4f59\u9762\u5747\u5206\u5269\u4f59\u6982\u7387\u3002\u901a\u8fc7\u6a21\u62df 100,000 \u6b21\u6295\u63b7\u8fdb\u884c\u9a8c\u8bc1\u3002
import jax\nimport jax.numpy as jnp\n\n# \u52a0\u8f7d\u9ab0\u5b50\uff1a\u9762 6 \u7684 p=0.3\uff0c\u5176\u4f59\u9762\u5747\u5206 0.7\nprobs = jnp.array([0.14, 0.14, 0.14, 0.14, 0.14, 0.30])\nfaces = jnp.array([1, 2, 3, 4, 5, 6])\n\n# \u89e3\u6790\u6cd5\u8ba1\u7b97\u671f\u671b\u503c\nev = jnp.sum(faces * probs)\nprint(f\"\u671f\u671b\u503c\uff08\u516c\u5f0f\u6cd5\uff09: {ev:.4f}\")\n\n# \u6a21\u62df\nkey = jax.random.PRNGKey(42)\nrolls = jax.random.choice(key, faces, shape=(100_000,), p=probs)\nprint(f\"\u671f\u671b\u503c\uff08\u6a21\u62df\u6cd5\uff09: {rolls.mean():.4f}\")\n \u8ba1\u7b97\u793a\u4f8b\u6570\u636e\u96c6\u7684\u6240\u6709\u56db\u4e2a\u77e9\uff08\u5747\u503c\u3001\u65b9\u5dee\u3001\u504f\u5ea6\u3001\u5cf0\u5ea6\uff09\uff0c\u7136\u540e\u4fee\u6539\u6570\u636e\u5e76\u89c2\u5bdf\u6bcf\u4e2a\u77e9\u5982\u4f55\u53d8\u5316\u3002
import jax.numpy as jnp\n\nx = jnp.array([2, 4, 4, 4, 5, 5, 7, 9], dtype=jnp.float32)\n\nmean = jnp.mean(x)\nvariance = jnp.mean((x - mean) ** 2)\nstd = jnp.sqrt(variance)\nskewness = jnp.mean(((x - mean) / std) ** 3)\nkurtosis = jnp.mean(((x - mean) / std) ** 4)\n\nprint(f\"\u5747\u503c: {mean:.3f}\")\nprint(f\"\u65b9\u5dee: {variance:.3f}\")\nprint(f\"\u6807\u51c6\u5dee: {std:.3f}\")\nprint(f\"\u504f\u5ea6: {skewness:.3f}\")\nprint(f\"\u5cf0\u5ea6: {kurtosis:.3f}\")\nprint(f\"\u8d85\u503c\u5cf0\u5ea6: {kurtosis - 3:.3f}\")\n \u5e76\u6392\u53ef\u89c6\u5316\u516c\u5e73\u9ab0\u5b50\u7684 PMF \u548c CDF\u3002\u5c1d\u8bd5\u4fee\u6539\u6982\u7387\u4ee5\u89c2\u5bdf\u5f62\u72b6\u5982\u4f55\u53d8\u5316\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nfaces = jnp.array([1, 2, 3, 4, 5, 6])\npmf = jnp.ones(6) / 6 # \u516c\u5e73\u9ab0\u5b50\uff1b\u8bd5\u8bd5\u4fee\u6539\u8fd9\u4e9b\u503c\uff01\ncdf = jnp.cumsum(pmf)\n\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))\n\nax1.bar(faces, pmf, color=\"#3498db\", alpha=0.8)\nax1.set_title(\"PMF\")\nax1.set_xlabel(\"\u9762\u503c\")\nax1.set_ylabel(\"P(X = x)\")\nax1.set_ylim(0, 0.5)\n\nax2.step(faces, cdf, where=\"mid\", color=\"#e74c3c\", linewidth=2)\nax2.set_title(\"CDF\")\nax2.set_xlabel(\"\u9762\u503c\")\nax2.set_ylabel(\"P(X \u2264 x)\")\nax2.set_ylim(0, 1.1)\n\nplt.tight_layout()\nplt.show()\n \u7edf\u8ba1\u91cf\u7528\u5355\u4e2a\u6570\u503c\u6982\u62ec\u6570\u636e\uff0c\u6355\u6349\u5176\u79bb\u6563\u7a0b\u5ea6\u3001\u4f4d\u7f6e\u3001\u5f62\u72b6\u548c\u5173\u8054\u3002\u672c\u8282\u6db5\u76d6\u65b9\u5dee\u3001\u6807\u51c6\u5dee\u3001\u56db\u5206\u4f4d\u6570\u3001\u504f\u5ea6\u3001\u5cf0\u5ea6\u3001\u534f\u65b9\u5dee\u3001\u76f8\u5173\u548c z \u5206\u6570\u2014\u2014\u8fd9\u662f\u63a2\u7d22\u6027\u6570\u636e\u5206\u6790\u548c\u673a\u5668\u5b66\u4e60\u7279\u5f81\u5de5\u7a0b\u7684\u57fa\u7840\u5de5\u5177\u96c6\u3002
\u5728\u4e0a\u4e00\u8282\u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86\u77e9\u4f5c\u4e3a\u4e00\u7ec4\u6982\u62ec\u6027\u7edf\u8ba1\u91cf\u5bb6\u65cf\u3002\u5728\u6b64\uff0c\u6211\u4eec\u5c55\u5f00\u8ba8\u8bba\u4ece\u77e9\u4e2d\u884d\u751f\u51fa\u7684\u5b9e\u7528\u5de5\u5177\uff1a\u5ea6\u91cf\u79bb\u6563\u7a0b\u5ea6\u3001\u4f4d\u7f6e\u3001\u5f62\u72b6\u548c\u5173\u8054\u7684\u7edf\u8ba1\u91cf\u3002
\u79bb\u6563\u7a0b\u5ea6\u56de\u7b54\u4e86\u8fd9\u6837\u4e00\u4e2a\u95ee\u9898\uff1a\u6570\u636e\u7684\u5206\u5e03\u6709\u591a\u5206\u6563\uff1f\u4e24\u4e2a\u73ed\u7ea7\u7684\u5e73\u5747\u8003\u8bd5\u6210\u7ee9\u53ef\u80fd\u76f8\u540c\uff0c\u4f46\u5176\u5206\u6563\u7a0b\u5ea6\u5374\u53ef\u80fd\u5927\u76f8\u5f84\u5ead\u3002
\u7a84\uff08\u84dd\u8272\uff09\u5206\u5e03\u7684\u65b9\u5dee\u8f83\u5c0f\uff1a\u5927\u90e8\u5206\u6570\u503c\u7d27\u5bc6\u805a\u96c6\u5728\u5747\u503c\u5468\u56f4\u3002\u5bbd\uff08\u7ea2\u8272\uff09\u5206\u5e03\u7684\u65b9\u5dee\u8f83\u5927\uff1a\u6570\u503c\u6563\u5e03\u5f97\u66f4\u8fdc\u3002
\u65b9\u5dee\u662f\u8ddd\u5747\u503c\u8ddd\u79bb\u7684\u5e73\u65b9\u7684\u5e73\u5747\u503c\u3002\u53d6\u5e73\u65b9\u662f\u4e3a\u4e86\u907f\u514d\u6b63\u8d1f\u504f\u5dee\u76f8\u4e92\u62b5\u6d88\u3002
\u6807\u51c6\u5dee\u662f\u65b9\u5dee\u7684\u5e73\u65b9\u6839\uff1a\\(\\sigma = \\sqrt{\\sigma^2}\\)\u3002\u5b83\u5c06\u5ea6\u91cf\u5355\u4f4d\u6062\u590d\u4e3a\u539f\u59cb\u5355\u4f4d\u3002\u5982\u679c\u6570\u636e\u7684\u5355\u4f4d\u662f\u5398\u7c73\uff0c\u65b9\u5dee\u7684\u5355\u4f4d\u662f cm\\(^2\\)\uff0c\u800c\u6807\u51c6\u5dee\u7684\u5355\u4f4d\u53c8\u56de\u5230\u4e86 cm\u3002
\u5e73\u5747\u7edd\u5bf9\u504f\u5dee\uff08MAD\uff09\u662f\u4e00\u4e2a\u66f4\u7b80\u5355\u7684\u66ff\u4ee3\u65b9\u6848\u3002\u5b83\u4e0d\u53d6\u5e73\u65b9\uff0c\u800c\u662f\u53d6\u6bcf\u4e2a\u504f\u5dee\u7684\u7edd\u5bf9\u503c\uff1a
MAD \u5bf9\u65b9\u5dee\u800c\u8a00\u5bf9\u5f02\u5e38\u503c\u66f4\u7a33\u5065\uff0c\u56e0\u4e3a\u5b83\u4e0d\u4f1a\u901a\u8fc7\u5e73\u65b9\u6765\u653e\u5927\u5927\u7684\u504f\u5dee\u3002\u7136\u800c\uff0c\u65b9\u5dee\u5728\u6570\u5b66\u4e0a\u66f4\u4fbf\u5229\uff08\u5728\u8bc1\u660e\u548c\u673a\u5668\u5b66\u4e60\u4f18\u5316\u4e2d\u66f4\u5bb9\u6613\u5206\u89e3\uff09\u3002
\u4f4d\u7f6e\u56de\u7b54\u4e86\u4e00\u4e2a\u4e0d\u540c\u7684\u95ee\u9898\uff1a\u7279\u5b9a\u6570\u503c\u76f8\u5bf9\u4e8e\u5176\u4f59\u6570\u636e\u7684\u4f4d\u7f6e\u5728\u54ea\u91cc\uff1f
\u56db\u5206\u4f4d\u6570\u5c06\u6392\u5e8f\u540e\u7684\u6570\u636e\u5206\u6210\u56db\u4e2a\u76f8\u7b49\u7684\u90e8\u5206\u3002Q1\uff08\u7b2c 25 \u767e\u5206\u4f4d\u6570\uff09\u662f\u4f4e\u4e8e\u8be5\u503c\u7684\u6570\u636e\u5360 25% \u7684\u503c\u3002Q2 \u662f\u4e2d\u4f4d\u6570\uff08\u7b2c 50 \u767e\u5206\u4f4d\u6570\uff09\u3002Q3 \u662f\u7b2c 75 \u767e\u5206\u4f4d\u6570\u3002
\u56db\u5206\u4f4d\u8ddd\uff08IQR\uff09\u662f \\(Q3 - Q1\\)\u3002\u5b83\u6355\u6349\u4e86\u4e2d\u95f4 50% \u6570\u636e\u7684\u79bb\u6563\u7a0b\u5ea6\uff0c\u6392\u9664\u4e86\u6781\u7aef\u503c\u3002
\u7bb1\u7ebf\u56fe\u662f\u7edf\u8ba1\u5b66\u4e2d\u6700\u6709\u7528\u7684\u53ef\u89c6\u5316\u5de5\u5177\u4e4b\u4e00\u3002\u7bb1\u4f53\u4ece Q1 \u5ef6\u4f38\u5230 Q3\uff0c\u4e2d\u95f4\u7684\u7ebf\u4e3a\u4e2d\u4f4d\u6570\uff0c\u987b\u7ebf\u5ef6\u4f38\u5230\u6700\u8fdc\u7684\u975e\u5f02\u5e38\u503c\uff0c\u800c\u987b\u7ebf\u4e4b\u5916\u7684\u70b9\u5219\u4e3a\u5f02\u5e38\u503c\u3002
\u767e\u5206\u4f4d\u6570\u662f\u56db\u5206\u4f4d\u6570\u7684\u63a8\u5e7f\u3002\u7b2c \\(p\\) \u767e\u5206\u4f4d\u6570\u662f\u4f4e\u4e8e\u8be5\u503c\u7684\u89c2\u6d4b\u503c\u5360 \\(p\\%\\) \u7684\u503c\u3002Q1 \u662f\u7b2c 25 \u767e\u5206\u4f4d\u6570\uff0c\u4e2d\u4f4d\u6570\u662f\u7b2c 50 \u767e\u5206\u4f4d\u6570\uff0cQ3 \u662f\u7b2c 75 \u767e\u5206\u4f4d\u6570\u3002
z \u5206\u6570\u544a\u8bc9\u4f60\u4e00\u4e2a\u503c\u8ddd\u5747\u503c\u6709\u591a\u5c11\u4e2a\u6807\u51c6\u5dee\uff1a
z \u5206\u6570\u4e3a 2 \u8868\u793a\u8be5\u503c\u9ad8\u4e8e\u5747\u503c 2 \u4e2a\u6807\u51c6\u5dee\u3002z \u5206\u6570\u4e3a \\(-1.5\\) \u8868\u793a\u4f4e\u4e8e\u5747\u503c 1.5 \u4e2a\u6807\u51c6\u5dee\u3002\u8fd9\u4e5f\u79f0\u4e3a\u6807\u51c6\u5316\uff0c\u5728\u673a\u5668\u5b66\u4e60\u4e2d\u5e7f\u6cdb\u7528\u4e8e\u7279\u5f81\u7f29\u653e\uff0c\u56e0\u4e3a\u5b83\u5c06\u4efb\u4f55\u5206\u5e03\u53d8\u6362\u4e3a\u5747\u503c\u4e3a 0\u3001\u6807\u51c6\u5dee\u4e3a 1\u3002
\u5f62\u72b6\u63cf\u8ff0\u4e86\u5206\u5e03\u8d85\u51fa\u5176\u4e2d\u5fc3\u548c\u79bb\u6563\u7a0b\u5ea6\u4e4b\u5916\u7684\u51e0\u4f55\u7279\u5f81\u3002
\u504f\u5ea6\uff08\u4e0a\u4e00\u8282\u4e2d\u7684\u6807\u51c6\u5316\u4e09\u9636\u77e9\uff09\u8861\u91cf\u4e0d\u5bf9\u79f0\u6027\u3002\u50cf\u6b63\u6001\u66f2\u7ebf\u8fd9\u6837\u5b8c\u5168\u5bf9\u79f0\u7684\u5206\u5e03\uff0c\u5176\u504f\u5ea6\u4e3a\u96f6\u3002\u6b63\u504f\u5ea6\u8868\u793a\u53f3\u5c3e\u8f83\u957f\uff08\u5982\u6536\u5165\u5206\u5e03\uff09\u3002\u8d1f\u504f\u5ea6\u8868\u793a\u5de6\u5c3e\u8f83\u957f\uff08\u5982\u9000\u4f11\u5e74\u9f84\u5206\u5e03\uff09\u3002
\u5982\u679c\u4f60\u8fd8\u8bb0\u5f97\u7b2c 1 \u7ae0\u4e2d\u7684\u70b9\u79ef\uff0c\u76ae\u5c14\u68ee\u76f8\u5173\u672c\u8d28\u4e0a\u5c31\u662f \\(\\mathbf{x}\\) \u548c \\(\\mathbf{y}\\) \u5747\u503c\u4e2d\u5fc3\u5316\u4e4b\u540e\u7684\u4f59\u5f26\u76f8\u4f3c\u5ea6\u3002
\u65af\u76ae\u5c14\u66fc\u76f8\u5173\uff08\\(\\rho\\)\uff09\u8861\u91cf\u5355\u8c03\u5173\u8054\u3002\u5b83\u4e0d\u4f7f\u7528\u539f\u59cb\u503c\uff0c\u800c\u662f\u5148\u5bf9\u5b83\u4eec\u8fdb\u884c\u6392\u5e8f\uff0c\u7136\u540e\u5728\u6392\u5e8f\u4e0a\u8ba1\u7b97\u76ae\u5c14\u68ee\u76f8\u5173\u3002\u8fd9\u4f7f\u5f97\u5b83\u5bf9\u5f02\u5e38\u503c\u7a33\u5065\uff0c\u5e76\u4e14\u5373\u4f7f\u5173\u7cfb\u662f\u975e\u7ebf\u6027\u7684\uff0c\u53ea\u8981\u662f\u4e00\u81f4\u9012\u589e\u6216\u9012\u51cf\u7684\uff0c\u4e5f\u80fd\u6b63\u5e38\u5de5\u4f5c\u3002
\u51e0\u4f55\u5e73\u5747\u6570\u662f\u5f53\u6570\u503c\u76f8\u4e92\u4e58\u9664\u65f6\uff08\u5982\u589e\u957f\u7387\uff09\u5408\u9002\u7684\u5e73\u5747\u503c\u3002\u5982\u679c\u4f60\u7684\u6295\u8d44\u5206\u522b\u589e\u957f\u4e86 10%\u300120% \u548c 30%\uff0c\u90a3\u4e48\u5e73\u5747\u589e\u957f\u56e0\u5b50\u5e76\u4e0d\u662f\u8fd9\u4e9b\u589e\u957f\u7387\u7684\u7b97\u672f\u5e73\u5747\u6570\u3002\u800c\u662f\uff1a
\u5177\u4f53\u5230\u589e\u957f\u7387\uff0c\u5148\u5c06\u767e\u5206\u6bd4\u8f6c\u6362\u4e3a\u56e0\u5b50\uff081.10\u30011.20\u30011.30\uff09\uff0c\u8ba1\u7b97\u51e0\u4f55\u5e73\u5747\u6570\uff0c\u518d\u51cf\u53bb 1\u3002
\u6307\u6570\u79fb\u52a8\u5e73\u5747\uff08EMA\uff09\u8d4b\u4e88\u6700\u8fd1\u89c2\u6d4b\u503c\u66f4\u9ad8\u7684\u6743\u91cd\u3002\u4e0e\u7b80\u5355\u79fb\u52a8\u5e73\u5747\u4e2d\u7a97\u53e3\u5185\u6240\u6709\u70b9\u6743\u91cd\u76f8\u7b49\u4e0d\u540c\uff0cEMA \u5448\u6307\u6570\u8870\u51cf\uff1a
\u5e73\u6ed1\u56e0\u5b50 \\(\\alpha\\)\uff08\u4ecb\u4e8e 0 \u548c 1 \u4e4b\u95f4\uff09\u63a7\u5236\u65e7\u89c2\u6d4b\u503c\u5931\u53bb\u5f71\u54cd\u7684\u901f\u5ea6\u3002\\(\\alpha\\) \u8d8a\u5927\uff0c\u5bf9\u8fd1\u671f\u53d8\u5316\u7684\u54cd\u5e94\u8d8a\u7075\u654f\uff1b\\(\\alpha\\) \u8d8a\u5c0f\uff0c\u66f2\u7ebf\u8d8a\u5e73\u6ed1\u3002\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0cEMA \u88ab\u7528\u4e8e Adam \u7b49\u4f18\u5316\u5668\u4ee5\u53ca\u6279\u5f52\u4e00\u5316\u7684\u8fd0\u884c\u7edf\u8ba1\u4e2d\u3002
\u5f02\u5e38\u503c\u68c0\u6d4b\u8bc6\u522b\u51fa\u4e0e\u5176\u4f59\u6570\u636e\u5f02\u5e38\u9065\u8fdc\u7684\u6570\u70b9\u3002\u4e24\u79cd\u5e38\u7528\u65b9\u6cd5\uff1a
IQR \u6cd5\u66f4\u7a33\u5065\uff0c\u56e0\u4e3a\u5b83\u4e0d\u5047\u8bbe\u6b63\u6001\u5206\u5e03\u3002Z \u5206\u6570\u6cd5\u5728\u6570\u636e\u8fd1\u4f3c\u6b63\u6001\u65f6\u6548\u679c\u826f\u597d\uff0c\u4f46\u5f53\u5206\u5e03\u9ad8\u5ea6\u504f\u659c\u65f6\u53ef\u80fd\u5931\u6548\u3002
\u8ba1\u7b97\u6570\u636e\u96c6\u7684\u65b9\u5dee\u3001\u6807\u51c6\u5dee\u548c MAD\uff0c\u5e76\u8fdb\u884c\u6bd4\u8f83\u3002\u89c2\u5bdf\u6dfb\u52a0\u6781\u7aef\u5f02\u5e38\u503c\u65f6\u53d1\u751f\u7684\u53d8\u5316\u3002
import jax.numpy as jnp\n\ndata = jnp.array([4, 8, 6, 5, 3, 7, 9, 5, 6, 7], dtype=jnp.float32)\n\nmean = jnp.mean(data)\nvariance = jnp.var(data)\nstd = jnp.std(data)\nmad = jnp.mean(jnp.abs(data - mean))\n\nprint(\"\u539f\u59cb\u6570\u636e\uff1a\")\nprint(f\" \u65b9\u5dee\uff1a{variance:.3f}\uff0c\u6807\u51c6\u5dee\uff1a{std:.3f}\uff0cMAD\uff1a{mad:.3f}\")\n\n# \u6dfb\u52a0\u4e00\u4e2a\u5f02\u5e38\u503c\u5e76\u91cd\u65b0\u8ba1\u7b97\ndata_outlier = jnp.append(data, 100.0)\nmean2 = jnp.mean(data_outlier)\nprint(f\"\\n\u6dfb\u52a0\u5f02\u5e38\u503c\uff08100\uff09\u540e\uff1a\")\nprint(f\" \u65b9\u5dee\uff1a{jnp.var(data_outlier):.3f}\uff0c\u6807\u51c6\u5dee\uff1a{jnp.std(data_outlier):.3f}\uff0cMAD\uff1a{jnp.mean(jnp.abs(data_outlier - mean2)):.3f}\")\n \u8ba1\u7b97\u4e24\u4e2a\u53d8\u91cf\u4e4b\u95f4\u7684\u76ae\u5c14\u68ee\u76f8\u5173\u548c\u65af\u76ae\u5c14\u66fc\u76f8\u5173\u3002\u5c1d\u8bd5\u4e0d\u540c\u7684\u5173\u7cfb\u3002
import jax\nimport jax.numpy as jnp\n\n# \u5b8c\u5168\u7ebf\u6027\u5173\u7cfb\nx = jnp.array([1, 2, 3, 4, 5, 6, 7, 8], dtype=jnp.float32)\ny = 2 * x + 1 # \u8bd5\u8bd5\u4fee\u6539\u8fd9\u4e2a\uff01\n\ndef pearson(a, b):\n a_c = a - jnp.mean(a)\n b_c = b - jnp.mean(b)\n return jnp.sum(a_c * b_c) / (jnp.sqrt(jnp.sum(a_c**2)) * jnp.sqrt(jnp.sum(b_c**2)))\n\ndef spearman(a, b):\n rank_a = jnp.argsort(jnp.argsort(a)).astype(jnp.float32)\n rank_b = jnp.argsort(jnp.argsort(b)).astype(jnp.float32)\n return pearson(rank_a, rank_b)\n\nprint(f\"\u76ae\u5c14\u68ee r\uff1a {pearson(x, y):.4f}\")\nprint(f\"\u65af\u76ae\u5c14\u66fc \u03c1\uff1a{spearman(x, y):.4f}\")\n \u5206\u522b\u4f7f\u7528 IQR \u548c Z \u5206\u6570\u65b9\u6cd5\u5b9e\u73b0\u5f02\u5e38\u503c\u68c0\u6d4b\uff0c\u7136\u540e\u6bd4\u8f83\u5b83\u4eec\u5728\u504f\u659c\u6570\u636e\u4e0a\u7684\u7ed3\u679c\u3002
import jax.numpy as jnp\n\ndata = jnp.array([2, 3, 3, 4, 5, 5, 5, 6, 6, 7, 50], dtype=jnp.float32)\n\n# IQR \u65b9\u6cd5\nq1, q3 = jnp.percentile(data, 25), jnp.percentile(data, 75)\niqr = q3 - q1\nlower, upper = q1 - 1.5 * iqr, q3 + 1.5 * iqr\niqr_outliers = data[(data < lower) | (data > upper)]\nprint(f\"IQR \u8fb9\u754c\uff1a[{lower:.1f}, {upper:.1f}]\")\nprint(f\"IQR \u5f02\u5e38\u503c\uff1a{iqr_outliers}\")\n\n# Z \u5206\u6570\u65b9\u6cd5\nz_scores = (data - jnp.mean(data)) / jnp.std(data)\nz_outliers = data[jnp.abs(z_scores) > 3]\nprint(f\"\\nZ \u5206\u6570\uff1a{z_scores}\")\nprint(f\"Z \u5206\u6570\u5f02\u5e38\u503c\uff08|z| > 3\uff09\uff1a{z_outliers}\")\n \u5728\u4e0d\u540c\u5e73\u6ed1\u56e0\u5b50\u4e0b\u8ba1\u7b97\u5e76\u7ed8\u5236\u5e26\u566a\u58f0\u6570\u636e\u7684\u6307\u6570\u79fb\u52a8\u5e73\u5747\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u751f\u6210\u5e26\u566a\u58f0\u7684\u6570\u636e\nkey = __import__(\"jax\").random.PRNGKey(0)\nnoise = __import__(\"jax\").random.normal(key, shape=(50,))\nsignal = jnp.linspace(0, 5, 50) + noise\n\ndef ema(data, alpha):\n result = jnp.zeros_like(data)\n result = result.at[0].set(data[0])\n for t in range(1, len(data)):\n result = result.at[t].set(alpha * data[t] + (1 - alpha) * result[t - 1])\n return result\n\nplt.figure(figsize=(10, 4))\nplt.plot(signal, \"o\", alpha=0.3, label=\"\u539f\u59cb\u6570\u636e\", color=\"#999\")\nfor alpha, color in [(0.1, \"#e74c3c\"), (0.3, \"#3498db\"), (0.7, \"#27ae60\")]:\n plt.plot(ema(signal, alpha), label=f\"\u03b1={alpha}\", color=color, linewidth=2)\nplt.legend()\nplt.title(\"\u4e0d\u540c\u5e73\u6ed1\u56e0\u5b50\u4e0b\u7684 EMA\")\nplt.show()\n \u62bd\u6837\u51b3\u5b9a\u4e86\u6211\u4eec\u5982\u4f55\u6536\u96c6\u6570\u636e\uff0c\u5e76\u76f4\u63a5\u63a7\u5236\u7740\u6211\u4eec\u6240\u505a\u6bcf\u9879\u7ed3\u8bba\u7684\u8d28\u91cf\u3002\u672c\u6587\u6db5\u76d6\u968f\u673a\u62bd\u6837\u3001\u5206\u5c42\u62bd\u6837\u3001\u6574\u7fa4\u62bd\u6837\u4e0e\u7cfb\u7edf\u62bd\u6837\u3001\u62bd\u6837\u5206\u5e03\u3001\u5927\u6570\u5b9a\u5f8b\u4ee5\u53ca\u81ea\u52a9\u6cd5\u2014\u2014\u8fd9\u4e9b\u65b9\u6cd5\u5bf9\u4e8e\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u8bad\u7ec3/\u6d4b\u8bd5\u5212\u5206\u548c\u6570\u636e\u96c6\u6574\u7406\u81f3\u5173\u91cd\u8981\u3002
\u5728\u7406\u60f3\u4e16\u754c\u4e2d\uff0c\u4f60\u4f1a\u6d4b\u91cf\u6240\u5173\u5fc3\u7fa4\u4f53\u4e2d\u7684\u6bcf\u4e00\u4e2a\u6210\u5458\u3002\u4f46\u5728\u5b9e\u8df5\u4e2d\uff0c\u8fd9\u51e0\u4e4e\u6c38\u8fdc\u4e0d\u53ef\u80fd\u505a\u5230\u3002\u4f60\u65e0\u6cd5\u8c03\u67e5\u6bcf\u4e00\u4f4d\u9009\u6c11\uff0c\u65e0\u6cd5\u6d4b\u8bd5\u6bcf\u4e00\u53ea\u706f\u6ce1\uff0c\u4e5f\u65e0\u6cd5\u626b\u63cf\u6bcf\u4e00\u4f4d\u60a3\u8005\u3002\u6240\u4ee5\u4f60\u53ea\u80fd\u62bd\u53d6\u4e00\u4e2a\u6837\u672c\uff0c\u5e76\u7528\u5b83\u6765\u4e86\u89e3\u6574\u4f53\u3002
\u603b\u4f53\u662f\u4f60\u60f3\u7814\u7a76\u7684\u4e2a\u4f53\u6216\u9879\u76ee\u7684\u5b8c\u6574\u96c6\u5408\u3002\u6837\u672c\u662f\u4f60\u5b9e\u9645\u89c2\u6d4b\u5230\u7684\u5b50\u96c6\u3002
\u53c2\u6570\u662f\u63cf\u8ff0\u603b\u4f53\u7684\u6570\u503c\uff08\u4f8b\u5982\uff0c\u67d0\u4e2a\u56fd\u5bb6\u6240\u6709\u6210\u5e74\u4eba\u7684\u771f\u5b9e\u5e73\u5747\u8eab\u9ad8\uff09\u3002
\u7edf\u8ba1\u91cf\u662f\u4ece\u6837\u672c\u4e2d\u8ba1\u7b97\u51fa\u7684\u6570\u503c\uff08\u4f8b\u5982\uff0c\u4f60\u6d4b\u91cf\u7684 500 \u4eba\u7684\u5e73\u5747\u8eab\u9ad8\uff09\u3002\u7edf\u8ba1\u91cf\u7528\u4e8e\u4f30\u8ba1\u53c2\u6570\u3002
\u7ed3\u8bba\u7684\u8d28\u91cf\u5b8c\u5168\u53d6\u51b3\u4e8e\u4f60\u5982\u4f55\u9009\u62e9\u6837\u672c\u3002\u4e00\u4e2a\u6709\u504f\u7684\u6837\u672c\u4f1a\u5bfc\u81f4\u6709\u504f\u7684\u7ed3\u8bba\uff0c\u65e0\u8bba\u4f60\u7684\u5206\u6790\u591a\u4e48\u590d\u6742\u3002
\u62bd\u6837\u6846\u662f\u4f60\u5b9e\u9645\u4ece\u4e2d\u62bd\u53d6\u6837\u672c\u7684\u6240\u6709\u4e2a\u4f53\u7684\u5217\u8868\u3002\u7406\u60f3\u60c5\u51b5\u4e0b\uff0c\u62bd\u6837\u6846\u4e0e\u603b\u4f53\u5b8c\u5168\u543b\u5408\uff0c\u4f46\u5728\u5b9e\u8df5\u4e2d\u603b\u4f1a\u5b58\u5728\u5dee\u8ddd\u3002
\u4f8b\u5982\uff0c\u5982\u679c\u4f60\u901a\u8fc7\u7535\u8bdd\u8c03\u67e5\u4eba\u7fa4\uff0c\u5c31\u4f1a\u6f0f\u6389\u6240\u6709\u6ca1\u6709\u7535\u8bdd\u7684\u4eba\u3002\u62bd\u6837\u6846\u4e0e\u603b\u4f53\u4e4b\u95f4\u7684\u5dee\u5f02\u79f0\u4e3a\u8986\u76d6\u8bef\u5dee\u3002
\u62bd\u6837\u8bef\u5dee\u662f\u6837\u672c\u7edf\u8ba1\u91cf\u4e0e\u603b\u4f53\u53c2\u6570\u4e4b\u95f4\u7684\u81ea\u7136\u5dee\u5f02\u3002
\u5373\u4f7f\u662f\u5b8c\u5168\u968f\u673a\u7684\u6837\u672c\u4e5f\u4e0d\u4f1a\u4e0e\u603b\u4f53\u5b8c\u5168\u4e00\u81f4\u3002\u66f4\u5927\u7684\u6837\u672c\u53ef\u4ee5\u51cf\u5c11\u62bd\u6837\u8bef\u5dee\u3002
\u62bd\u6837\u6709\u4e24\u5927\u7c7b\uff1a\u6982\u7387\u62bd\u6837\u548c\u975e\u6982\u7387\u62bd\u6837\u3002
\u6982\u7387\u62bd\u6837\u610f\u5473\u7740\u603b\u4f53\u4e2d\u7684\u6bcf\u4e00\u4e2a\u6210\u5458\u90fd\u6709\u5df2\u77e5\u7684\u3001\u975e\u96f6\u7684\u6982\u7387\u88ab\u9009\u4e2d\u3002\u8fd9\u8ba9\u4f60\u80fd\u591f\u91cf\u5316\u4e0d\u786e\u5b9a\u6027\u5e76\u63a8\u5e7f\u7ed3\u679c\u3002
\u7b80\u5355\u968f\u673a\u62bd\u6837\uff1a\u6bcf\u4e2a\u4e2a\u4f53\u88ab\u9009\u4e2d\u7684\u6982\u7387\u76f8\u7b49\uff0c\u4e14\u6bcf\u4e2a\u5927\u5c0f\u4e3a \\(n\\) \u7684\u53ef\u80fd\u6837\u672c\u51fa\u73b0\u7684\u6982\u7387\u76f8\u540c\u3002\u5c31\u50cf\u628a\u6bcf\u4e2a\u540d\u5b57\u653e\u8fdb\u4e00\u9876\u5e3d\u5b50\u91cc\uff0c\u7136\u540e\u8499\u773c\u62bd\u53d6\u3002
\u5206\u5c42\u62bd\u6837\uff1a\u6839\u636e\u67d0\u4e2a\u5171\u540c\u7279\u5f81\uff08\u5982\u5e74\u9f84\u7ec4\u3001\u5730\u533a\uff09\u5c06\u603b\u4f53\u5212\u5206\u4e3a\u4e92\u4e0d\u91cd\u53e0\u7684\u7ec4\uff08\u5c42\uff09\uff0c\u7136\u540e\u4ece\u6bcf\u4e00\u5c42\u4e2d\u968f\u673a\u62bd\u6837\u3002\u8fd9\u4fdd\u8bc1\u4e86\u6bcf\u4e2a\u7fa4\u4f53\u7684\u4ee3\u8868\u6027\uff0c\u5e76\u4e14\u5f53\u5c42\u4e0e\u5c42\u4e4b\u95f4\u5b58\u5728\u5dee\u5f02\u65f6\uff0c\u53ef\u4ee5\u964d\u4f4e\u65b9\u5dee\u3002
\u6574\u7fa4\u62bd\u6837\uff1a\u5c06\u603b\u4f53\u5212\u5206\u4e3a\u82e5\u5e72\u7ec4\uff08\u7fa4\uff09\uff0c\u968f\u673a\u9009\u62e9\u4e00\u4e9b\u7fa4\uff0c\u7136\u540e\u5c06\u6240\u9009\u7fa4\u4e2d\u7684\u5168\u90e8\u4e2a\u4f53\u90fd\u7eb3\u5165\u6837\u672c\u3002\u5f53\u603b\u4f53\u5728\u5730\u7406\u4e0a\u5206\u6563\u65f6\u8fd9\u79cd\u65b9\u6cd5\u5f88\u5b9e\u7528\uff0c\u6bd4\u5982\u5728\u6574\u4e2a\u5b66\u533a\u4e2d\u62bd\u53d6\u6574\u6240\u5b66\u6821\u800c\u975e\u5355\u4e2a\u5b66\u751f\u3002
\u7cfb\u7edf\u62bd\u6837\uff1a\u968f\u673a\u9009\u62e9\u4e00\u4e2a\u8d77\u70b9\uff0c\u7136\u540e\u4ece\u5217\u8868\u4e2d\u6bcf\u9694 \\(k\\) \u4e2a\u4e2a\u4f53\u9009\u53d6\u4e00\u4e2a\u3002\u4f8b\u5982\uff0c\u4ece\u7b2c 7 \u4e2a\u4eba\u5f00\u59cb\uff0c\u7136\u540e\u6bcf\u9694 10 \u4e2a\u4eba\u53d6\u4e00\u4e2a\uff087, 17, 27, ...\uff09\u3002\u8fd9\u79cd\u65b9\u6cd5\u6613\u4e8e\u5b9e\u65bd\uff0c\u4f46\u5982\u679c\u5217\u8868\u4e2d\u5b58\u5728\u9690\u85cf\u6a21\u5f0f\uff0c\u5219\u53ef\u80fd\u5f15\u5165\u504f\u5dee\u3002
\u975e\u6982\u7387\u62bd\u6837\u5e76\u4e0d\u7ed9\u6bcf\u4e2a\u6210\u5458\u5df2\u77e5\u7684\u5165\u9009\u673a\u4f1a\u3002\u5176\u7ed3\u679c\u65e0\u6cd5\u88ab\u4e25\u683c\u63a8\u5e7f\uff0c\u4f46\u8fd9\u4e9b\u65b9\u6cd5\u901a\u5e38\u66f4\u5feb\u3001\u66f4\u4fbf\u5b9c\u3002
\u4fbf\u5229\u62bd\u6837\uff1a\u9009\u62e9\u6700\u5bb9\u6613\u63a5\u89e6\u5230\u7684\u4eba\u3002\u5728\u8d2d\u7269\u4e2d\u5fc3\u8c03\u67e5\u4eba\u7fa4\u5f88\u65b9\u4fbf\uff0c\u4f46\u4f1a\u9057\u6f0f\u90a3\u4e9b\u4e0d\u53bb\u8d2d\u7269\u4e2d\u5fc3\u7684\u4eba\u3002
\u914d\u989d\u62bd\u6837\uff1a\u4e0e\u5206\u5c42\u62bd\u6837\u7c7b\u4f3c\uff0c\u4f46\u6ca1\u6709\u968f\u673a\u6027\u3002\u7814\u7a76\u8005\u901a\u8fc7\u4ece\u6bcf\u4e2a\u7fa4\u4f53\u4e2d\u9009\u53d6\u65b9\u4fbf\u63a5\u89e6\u7684\u4e2a\u4f53\u6765\u586b\u8865\u914d\u989d\uff08\u4f8b\u5982 50 \u540d\u7537\u6027\u548c 50 \u540d\u5973\u6027\uff09\u3002
\u96ea\u7403\u62bd\u6837\uff1a\u4ece\u5c11\u6570\u53c2\u4e0e\u8005\u5f00\u59cb\uff0c\u7136\u540e\u8bf7\u4ed6\u4eec\u62db\u52df\u5176\u4ed6\u4eba\u3002\u9002\u7528\u4e8e\u96be\u4ee5\u63a5\u89e6\u5230\u7684\u4eba\u7fa4\uff08\u4f8b\u5982\u7814\u7a76\u7f55\u89c1\u75be\u75c5\uff09\uff0c\u4f46\u4f1a\u4e25\u91cd\u504f\u5411\u4e8e\u6709\u793e\u4ea4\u8054\u7cfb\u7684\u4e2a\u4f53\u3002
\u4e00\u65e6\u4f60\u6709\u4e86\u62bd\u6837\u65b9\u6cd5\uff0c\u4e00\u4e2a\u81ea\u7136\u7684\u95ee\u9898\u5c31\u51fa\u73b0\u4e86\uff1a\u5982\u679c\u62bd\u53d6\u4e00\u4e2a\u4e0d\u540c\u7684\u6837\u672c\uff0c\u4f1a\u5f97\u5230\u4e0d\u540c\u7684\u7edf\u8ba1\u91cf\u5417\uff1f\u51e0\u4e4e\u80af\u5b9a\u4f1a\u3002\u62bd\u6837\u5206\u5e03\u662f\u4e00\u4e2a\u7edf\u8ba1\u91cf\uff08\u5982\u6837\u672c\u5747\u503c\uff09\u5728\u6240\u6709\u76f8\u540c\u5927\u5c0f\u7684\u53ef\u80fd\u6837\u672c\u4e0a\u7684\u5206\u5e03\u3002
\u60f3\u8c61\u4e00\u4e0b\u62bd\u53d6 1000 \u4e2a\u4e0d\u540c\u7684 30 \u4eba\u6837\u672c\uff0c\u5e76\u8ba1\u7b97\u6bcf\u4e2a\u6837\u672c\u7684\u5e73\u5747\u8eab\u9ad8\u3002\u8fd9 1000 \u4e2a\u5747\u503c\u5f62\u6210\u4e86\u4e00\u4e2a\u5206\u5e03\u3002\u6709\u4e9b\u4f1a\u7565\u9ad8\u4e8e\u771f\u5b9e\u7684\u603b\u4f53\u5747\u503c\uff0c\u6709\u4e9b\u4f1a\u7565\u4f4e\u4e8e\uff0c\u800c\u5927\u591a\u6570\u4f1a\u805a\u96c6\u5728\u771f\u5b9e\u503c\u5468\u56f4\u3002
\u8fd9\u4e2a\u62bd\u6837\u5206\u5e03\u7684\u6807\u51c6\u5dee\u79f0\u4e3a\u6807\u51c6\u8bef\uff1a
\u6ce8\u610f\u6807\u51c6\u8bef\u968f\u7740 \\(n\\) \u7684\u589e\u5927\u800c\u7f29\u5c0f\u3002\u66f4\u5927\u7684\u6837\u672c\u80fd\u7ed9\u51fa\u66f4\u7cbe\u786e\u7684\u4f30\u8ba1\u3002\u6837\u672c\u91cf\u6269\u5927\u5230\u56db\u500d\uff0c\u6807\u51c6\u8bef\u51cf\u534a\u3002
\u7edf\u8ba1\u5b66\u4e2d\u6700\u91cd\u8981\u7684\u7ed3\u679c\u662f\u4e2d\u5fc3\u6781\u9650\u5b9a\u7406\uff08CLT\uff09\u3002\u5b83\u6307\u51fa\uff1a\u65e0\u8bba\u539f\u59cb\u603b\u4f53\u7684\u5206\u5e03\u5f62\u6001\u5982\u4f55\uff0c\u968f\u7740\u6837\u672c\u91cf\u7684\u589e\u5927\uff0c\u6837\u672c\u5747\u503c\u7684\u5206\u5e03\u90fd\u8d8b\u8fd1\u4e8e\u6b63\u6001\u5206\u5e03\u3002
CLT \u662f\u5927\u90e8\u5206\u63a8\u65ad\u7edf\u8ba1\u5f97\u4ee5\u8fdb\u884c\u7684\u57fa\u7840\u3002\u5b83\u8ba9\u6211\u4eec\u80fd\u591f\u4f7f\u7528\u6b63\u6001\u5206\u5e03\u4f5c\u4e3a\u8fd1\u4f3c\uff0c\u5373\u4f7f\u5e95\u5c42\u6570\u636e\u4e0d\u662f\u6b63\u6001\u5206\u5e03\uff0c\u53ea\u8981\u6837\u672c\u91cf\u8db3\u591f\u5927\u5373\u53ef\u3002
\"\u8db3\u591f\u5927\"\u662f\u591a\u5927\uff1f\u4e00\u4e2a\u5e38\u89c1\u7684\u7ecf\u9a8c\u6cd5\u5219\u662f \\(n \\ge 30\\)\uff0c\u4f46\u8fd9\u53d6\u51b3\u4e8e\u603b\u4f53\u7684\u975e\u6b63\u6001\u7a0b\u5ea6\u3002\u5bf9\u4e8e\u9ad8\u5ea6\u504f\u6001\u7684\u5206\u5e03\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u66f4\u5927\u7684\u6837\u672c\u91cf\u3002\u5bf9\u4e8e\u5927\u81f4\u5bf9\u79f0\u7684\u603b\u4f53\uff0c\u5373\u4f7f \\(n = 10\\) \u4e5f\u53ef\u80fd\u8db3\u591f\u4e86\u3002
CLT \u6709\u4e09\u4e2a\u5173\u952e\u6761\u4ef6\uff1a
\u53ef\u89c6\u5316\u6f14\u793a CLT\uff1a\u4ece\u9ad8\u5ea6\u504f\u6001\u7684\u5206\u5e03\u4e2d\u62bd\u53d6\u6837\u672c\uff0c\u8ba1\u7b97\u6837\u672c\u5747\u503c\uff0c\u89c2\u5bdf\u5747\u503c\u76f4\u65b9\u56fe\u5982\u4f55\u53d8\u6210\u949f\u5f62\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nkey = jax.random.PRNGKey(0)\n\n# \u6307\u6570\u5206\u5e03\uff08\u9ad8\u5ea6\u504f\u6001\uff09\npopulation = jax.random.exponential(key, shape=(100_000,))\n\nfig, axes = plt.subplots(1, 4, figsize=(14, 3))\nsample_sizes = [1, 5, 30, 100]\n\nfor ax, n in zip(axes, sample_sizes):\n keys = jax.random.split(key, 2000)\n means = jnp.array([jax.random.choice(k, population, shape=(n,)).mean() for k in keys])\n ax.hist(means, bins=40, color=\"#3498db\", alpha=0.7, density=True)\n ax.set_title(f\"n = {n}\")\n ax.set_xlim(0, 4)\n\nfig.suptitle(\"CLT\uff1a\u968f\u7740 n \u589e\u5927\uff0c\u6837\u672c\u5747\u503c\u8d8b\u8fd1\u6b63\u6001\u5206\u5e03\", fontsize=13)\nplt.tight_layout()\nplt.show()\n \u6bd4\u8f83\u7b80\u5355\u968f\u673a\u62bd\u6837\u4e0e\u5206\u5c42\u62bd\u6837\u3002\u521b\u5efa\u4e00\u4e2a\u5177\u6709\u4e0d\u540c\u5206\u7ec4\u7684\u603b\u4f53\uff0c\u5c55\u793a\u5206\u5c42\u62bd\u6837\u80fd\u7ed9\u51fa\u66f4\u4f4e\u7684\u4f30\u8ba1\u65b9\u5dee\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(42)\n\n# \u603b\u4f53\uff1a\u4e24\u4e2a\u4e0d\u540c\u7684\u7ec4\ngroup_a = jax.random.normal(key, shape=(500,)) + 10 # \u5747\u503c ~10\nkey, subkey = jax.random.split(key)\ngroup_b = jax.random.normal(subkey, shape=(500,)) + 20 # \u5747\u503c ~20\npopulation = jnp.concatenate([group_a, group_b])\n\n# \u7b80\u5355\u968f\u673a\u62bd\u6837\uff1a1000 \u6b21\u8bd5\u9a8c\uff0c\u6837\u672c\u91cf 20\nsrs_means = []\nfor i in range(1000):\n key, subkey = jax.random.split(key)\n sample = jax.random.choice(subkey, population, shape=(20,), replace=False)\n srs_means.append(sample.mean())\nsrs_means = jnp.array(srs_means)\n\n# \u5206\u5c42\u62bd\u6837\uff1a\u6bcf\u7ec4\u5404\u53d6 10 \u4e2a\nstrat_means = []\nfor i in range(1000):\n key, k1, k2 = jax.random.split(key, 3)\n s_a = jax.random.choice(k1, group_a, shape=(10,), replace=False)\n s_b = jax.random.choice(k2, group_b, shape=(10,), replace=False)\n strat_means.append(jnp.concatenate([s_a, s_b]).mean())\nstrat_means = jnp.array(strat_means)\n\nprint(f\"\u7b80\u5355\u968f\u673a - \u5747\u503c: {srs_means.mean():.3f}, \u6807\u51c6\u5dee: {srs_means.std():.3f}\")\nprint(f\"\u5206\u5c42\u62bd\u6837 - \u5747\u503c: {strat_means.mean():.3f}, \u6807\u51c6\u5dee: {strat_means.std():.3f}\")\nprint(f\"\u5206\u5c42\u62bd\u6837\u964d\u4f4e\u4e86\u65b9\u5dee {(1 - strat_means.var()/srs_means.var())*100:.1f}%\")\n \u63a2\u7d22\u6837\u672c\u91cf\u5982\u4f55\u5f71\u54cd\u6807\u51c6\u8bef\u3002\u7ed8\u5236\u6807\u51c6\u8bef\u968f\u6837\u672c\u91cf\u53d8\u5316\u7684\u66f2\u7ebf\uff0c\u9a8c\u8bc1 \\(1/\\sqrt{n}\\) \u7684\u5173\u7cfb\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nkey = jax.random.PRNGKey(7)\npopulation = jax.random.normal(key, shape=(50_000,)) * 10 + 50\n\nsample_sizes = [5, 10, 20, 50, 100, 200, 500, 1000]\nstd_errors = []\n\nfor n in sample_sizes:\n means = []\n for _ in range(500):\n key, subkey = jax.random.split(key)\n sample = jax.random.choice(subkey, population, shape=(n,))\n means.append(sample.mean())\n std_errors.append(jnp.array(means).std())\n\nplt.figure(figsize=(8, 4))\nplt.plot(sample_sizes, std_errors, \"o-\", color=\"#e74c3c\", label=\"\u89c2\u6d4b\u5230\u7684 SE\")\ntheoretical = population.std() / jnp.sqrt(jnp.array(sample_sizes, dtype=jnp.float32))\nplt.plot(sample_sizes, theoretical, \"--\", color=\"#3498db\", label=\"\u03c3/\u221an\uff08\u7406\u8bba\u503c\uff09\")\nplt.xlabel(\"\u6837\u672c\u91cf (n)\")\nplt.ylabel(\"\u6807\u51c6\u8bef\")\nplt.legend()\nplt.title(\"\u6807\u51c6\u8bef\u968f\u6837\u672c\u91cf\u589e\u5927\u800c\u7f29\u5c0f\")\nplt.show()\n \u5047\u8bbe\u68c0\u9a8c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4e25\u8c28\u7684\u6846\u67b6\uff0c\u7528\u4e8e\u5224\u65ad\u89c2\u6d4b\u5230\u7684\u6548\u5e94\u662f\u771f\u5b9e\u5b58\u5728\u7684\u8fd8\u662f\u7531\u968f\u673a\u56e0\u7d20\u9020\u6210\u7684\u3002\u672c\u6587\u6db5\u76d6\u539f\u5047\u8bbe\u4e0e\u5907\u62e9\u5047\u8bbe\u3001p\u503c\u3001\u663e\u8457\u6027\u6c34\u5e73\u3001t\u68c0\u9a8c\u3001\u5361\u65b9\u68c0\u9a8c\u3001\u65b9\u5dee\u5206\u6790\u4ee5\u53ca\u7b2c\u4e00\u7c7b/\u7b2c\u4e8c\u7c7b\u9519\u8bef\u2014\u2014\u8fd9\u4e9b\u903b\u8f91\u540c\u6837\u5e94\u7528\u4e8eA/B\u6d4b\u8bd5\u3001\u6a21\u578b\u6bd4\u8f83\u548c\u7814\u7a76\u4e2d\u3002
\u7edf\u8ba1\u5b66\u4e0d\u4ec5\u4ec5\u662f\u5bf9\u6570\u636e\u8fdb\u884c\u63cf\u8ff0\u3002\u4f60\u7ecf\u5e38\u9700\u8981\u505a\u51fa\u51b3\u7b56\uff1a\u65b0\u836f\u662f\u5426\u6709\u6548\uff1f\u67d0\u4e2a\u7b97\u6cd5\u662f\u5426\u6bd4\u53e6\u4e00\u4e2a\u66f4\u5feb\uff1f\u5e73\u5747\u503c\u662f\u5426\u53d1\u751f\u4e86\u53d8\u5316\uff1f\u5047\u8bbe\u68c0\u9a8c\u4e3a\u4f60\u63d0\u4f9b\u4e86\u4e00\u4e2a\u57fa\u4e8e\u6570\u636e\u56de\u7b54\u8fd9\u4e9b\u95ee\u9898\u7684\u7ed3\u6784\u5316\u6846\u67b6\u3002
\u5176\u601d\u8def\u5f88\u7b80\u5355\uff1a\u5047\u8bbe\u6ca1\u6709\u4efb\u4f55\u53d8\u5316\uff08\"\u539f\u5047\u8bbe\"\uff09\uff0c\u7136\u540e\u68c0\u9a8c\u6570\u636e\u662f\u5426\u6781\u7aef\u5230\u8ba9\u8fd9\u4e2a\u5047\u8bbe\u96be\u4ee5\u4ee4\u4eba\u7f6e\u4fe1\u3002
\u539f\u5047\u8bbe\uff08\\(H_0\\)\uff09\u662f\u9ed8\u8ba4\u7684\u4e3b\u5f20\uff0c\u901a\u5e38\u8868\u8ff0\u4e3a\"\u65e0\u6548\u5e94\"\u6216\"\u65e0\u5dee\u5f02\"\u3002\u4f8b\u5982\uff1a\"\u5e73\u5747\u914d\u9001\u65f6\u95f4\u4ecd\u4e3a30\u5206\u949f\"\u6216\"\u65b0\u6a21\u578b\u5e76\u4e0d\u6bd4\u65e7\u6a21\u578b\u66f4\u597d\"\u3002
\u5907\u62e9\u5047\u8bbe\uff08\\(H_1\\) \u6216 \\(H_a\\)\uff09\u662f\u4f60\u8ba4\u4e3a\u53ef\u80fd\u6210\u7acb\u7684\u66ff\u4ee3\u60c5\u51b5\uff1a\"\u5e73\u5747\u914d\u9001\u65f6\u95f4\u53d1\u751f\u4e86\u53d8\u5316\"\u6216\"\u65b0\u6a21\u578b\u66f4\u597d\"\u3002
\u4f60\u6c38\u8fdc\u65e0\u6cd5\u76f4\u63a5\u8bc1\u660e \\(H_1\\)\u3002\u76f8\u53cd\uff0c\u4f60\u63d0\u51fa\u8fd9\u6837\u4e00\u4e2a\u95ee\u9898\uff1a\u5982\u679c \\(H_0\\) \u6210\u7acb\uff0c\u89c2\u5bdf\u5230\u5982\u6b64\u6781\u7aef\u7684\u6570\u636e\u7684\u53ef\u80fd\u6027\u6709\u591a\u5927\uff1f\u5982\u679c\u8fd9\u79cd\u53ef\u80fd\u6027\u975e\u5e38\u5c0f\uff0c\u4f60\u5c31\u62d2\u7edd \\(H_0\\)\uff0c\u8f6c\u800c\u63a5\u53d7 \\(H_1\\)\u3002
\u68c0\u9a8c\u7edf\u8ba1\u91cf\u662f\u4e00\u4e2a\u5355\u4e00\u6570\u503c\uff0c\u5b83\u6982\u62ec\u4e86\u4f60\u7684\u6837\u672c\u7ed3\u679c\u4e0e \\(H_0\\) \u9884\u6d4b\u503c\u4e4b\u95f4\u7684\u504f\u5dee\u7a0b\u5ea6\u3002\u4e0d\u540c\u7684\u68c0\u9a8c\u4f7f\u7528\u4e0d\u540c\u7684\u516c\u5f0f\uff0c\u4f46\u903b\u8f91\u59cb\u7ec8\u4e00\u81f4\uff1a\u5ea6\u91cf\u89c2\u6d4b\u503c\u4e0e\u671f\u671b\u503c\u4e4b\u95f4\u7684\u8ddd\u79bb\u3002
p\u503c\u662f\u5728\u5047\u8bbe \\(H_0\\) \u6210\u7acb\u7684\u524d\u63d0\u4e0b\uff0c\u89c2\u5bdf\u5230\u81f3\u5c11\u4e0e\u5f53\u524d\u68c0\u9a8c\u7edf\u8ba1\u91cf\u4e00\u6837\u6781\u7aef\u7684\u7ed3\u679c\u7684\u6982\u7387\u3002p\u503c\u8d8a\u5c0f\uff0c\u610f\u5473\u7740\u5728 \\(H_0\\) \u4e0b\u6570\u636e\u8d8a\u4ee4\u4eba\u610f\u5916\u3002
\u663e\u8457\u6027\u6c34\u5e73\uff08\\(\\alpha\\)\uff09\u662f\u4f60\u5728\u770b\u5230\u6570\u636e\u4e4b\u524d\u8bbe\u5b9a\u7684\u9608\u503c\u3002\u5982\u679c \\(p \\le \\alpha\\)\uff0c\u5219\u62d2\u7edd \\(H_0\\)\u3002\u5e38\u7528\u7684\u9009\u62e9\u6709 \\(\\alpha = 0.05\\)\uff085%\uff09\u548c \\(\\alpha = 0.01\\)\uff081%\uff09\u3002
\u9634\u5f71\u5c3e\u90e8\u5373\u62d2\u7edd\u57df\u3002\u5982\u679c\u4f60\u7684\u68c0\u9a8c\u7edf\u8ba1\u91cf\u843d\u5728\u6b64\u533a\u57df\uff0c\u8bf4\u660e\u5728 \\(H_0\\) \u4e0b\u6570\u636e\u8db3\u591f\u6781\u7aef\uff0c\u4f60\u62d2\u7edd \\(H_0\\)\u3002\u7eff\u8272\u533a\u57df\u663e\u793a\u4e86\u67d0\u4e2a\u7279\u5b9a\u68c0\u9a8c\u7edf\u8ba1\u91cf\u5bf9\u5e94\u7684p\u503c\u3002
\u4ee5\u4e0b\u662f\u9010\u6b65\u6d41\u7a0b\uff1a
\u5b9e\u4f8b\u6f14\u7ec3\uff1a\u67d0\u5de5\u5382\u58f0\u79f0\u5176\u87ba\u6813\u7684\u5e73\u5747\u957f\u5ea6\u4e3a10 cm\u3002\u4f60\u6d4b\u91cf\u4e8636\u4e2a\u87ba\u6813\uff0c\u5f97\u5230\u6837\u672c\u5747\u503c\u4e3a10.3 cm\u3002\u5df2\u77e5\u603b\u4f53\u6807\u51c6\u5dee\u4e3a0.9 cm\u3002\u662f\u5426\u6709\u8bc1\u636e\u8868\u660e\u5747\u503c\u53d1\u751f\u4e86\u53d8\u5316\uff1f
\\(H_0\\)\uff1a\\(\\mu = 10\\)\uff0c\\(H_1\\)\uff1a\\(\\mu \\neq 10\\)\uff0c\\(\\alpha = 0.05\\)
\u68c0\u9a8c\u7edf\u8ba1\u91cf\uff08z\u68c0\u9a8c\uff0c\u56e0\u4e3a \\(\\sigma\\) \u5df2\u77e5\u4e14 \\(n\\) \u8f83\u5927\uff09\uff1a
\u5bf9\u4e8e \\(\\alpha = 0.05\\) \u7684\u53cc\u4fa7\u68c0\u9a8c\uff0c\u4e34\u754c\u503c\u4e3a \\(\\pm 1.96\\)\u3002\u6211\u4eec\u7684 \\(z = 2.0 > 1.96\\)\uff0c\u56e0\u6b64\u62d2\u7edd \\(H_0\\)\u3002p\u503c\u7ea6\u4e3a0.046\uff0c\u5c0f\u4e8e0.05\u3002
\u7ed3\u8bba\uff1a\u6709\u7edf\u8ba1\u5b66\u4e0a\u7684\u663e\u8457\u8bc1\u636e\u8868\u660e\uff0c\u87ba\u6813\u7684\u5e73\u5747\u957f\u5ea6\u4e0e10 cm\u4e0d\u540c\u3002
\u5355\u4fa7\u68c0\u9a8c\u68c0\u67e5\u6548\u5e94\u662f\u5426\u671d\u7740\u67d0\u4e2a\u7279\u5b9a\u65b9\u5411\u53d1\u751f\uff08\\(H_1\\)\uff1a\\(\\mu > 10\\) \u6216 \\(\\mu < 10\\)\uff09\u3002\u6574\u4e2a \\(\\alpha\\) \u96c6\u4e2d\u4e8e\u4e00\u4e2a\u5c3e\u90e8\uff0c\u4f7f\u5f97\u5728\u8be5\u65b9\u5411\u4e0a\u66f4\u5bb9\u6613\u62d2\u7edd \\(H_0\\)\uff0c\u4f46\u65e0\u6cd5\u68c0\u6d4b\u5230\u76f8\u53cd\u65b9\u5411\u7684\u6548\u5e94\u3002
\u53cc\u4fa7\u68c0\u9a8c\u68c0\u67e5\u662f\u5426\u5b58\u5728\u4efb\u4f55\u5dee\u5f02\uff08\\(H_1\\)\uff1a\\(\\mu \\neq 10\\)\uff09\u3002\\(\\alpha\\) \u88ab\u5206\u914d\u5230\u4e24\u4e2a\u5c3e\u90e8\uff08\u5404 \\(\\alpha/2\\)\uff09\u3002\u8fd9\u79cd\u65b9\u6cd5\u66f4\u4fdd\u5b88\uff0c\u4f46\u80fd\u6355\u6349\u5230\u4e24\u4e2a\u65b9\u5411\u4e0a\u7684\u6548\u5e94\u3002
\u5373\u4f7f\u6709\u4e86\u826f\u597d\u7684\u6d41\u7a0b\uff0c\u9519\u8bef\u4ecd\u7136\u53ef\u80fd\u53d1\u751f\u3002\u5171\u6709\u4e24\u79cd\u7c7b\u578b\u7684\u9519\u8bef\uff1a
\u7b2c\u4e00\u7c7b\u9519\u8bef\uff08\u5047\u9633\u6027\uff09\uff1a\u5f53 \\(H_0\\) \u5b9e\u9645\u4e3a\u771f\u65f6\uff0c\u4f60\u9519\u8bef\u5730\u62d2\u7edd\u4e86\u5b83\u3002\u5176\u6982\u7387\u4e3a \\(\\alpha\\)\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u9009\u62e9\u663e\u8457\u6027\u6c34\u5e73\u6765\u63a7\u5236\u3002\u5c31\u50cf\u6ca1\u6709\u706b\u707e\u65f6\u706b\u707e\u62a5\u8b66\u5668\u5374\u54cd\u4e86\u3002
\u7b2c\u4e8c\u7c7b\u9519\u8bef\uff08\u5047\u9634\u6027\uff09\uff1a\u5f53 \\(H_0\\) \u5b9e\u9645\u4e3a\u5047\u65f6\uff0c\u4f60\u672a\u80fd\u62d2\u7edd\u5b83\u3002\u5176\u6982\u7387\u4e3a \\(\\beta\\)\u3002\u5c31\u50cf\u53d1\u751f\u771f\u5b9e\u706b\u707e\u65f6\u706b\u707e\u62a5\u8b66\u5668\u4fdd\u6301\u6c89\u9ed8\u3002
\u68c0\u9a8c\u529f\u6548\u4e3a \\(1 - \\beta\\)\uff0c\u5373\u6b63\u786e\u62d2\u7edd\u9519\u8bef \\(H_0\\) \u7684\u6982\u7387\u3002\u529f\u6548\u8d8a\u9ad8\uff0c\u610f\u5473\u7740\u4f60\u68c0\u6d4b\u771f\u5b9e\u6548\u5e94\u7684\u80fd\u529b\u8d8a\u5f3a\u3002\u529f\u6548\u968f\u4ee5\u4e0b\u56e0\u7d20\u589e\u52a0\uff1a
\u7b2c\u4e00\u7c7b\u9519\u8bef\u4e0e\u7b2c\u4e8c\u7c7b\u9519\u8bef\u4e4b\u95f4\u5b58\u5728\u6743\u8861\u5173\u7cfb\u3002\u964d\u4f4e \\(\\alpha\\)\uff08\u5bf9\u5047\u9633\u6027\u66f4\u52a0\u8c28\u614e\uff09\u4f1a\u589e\u52a0 \\(\\beta\\)\uff08\u66f4\u591a\u5047\u9634\u6027\uff09\u3002\u5728\u56fa\u5b9a\u6837\u672c\u91cf\u4e0b\uff0c\u4f60\u65e0\u6cd5\u540c\u65f6\u6700\u5c0f\u5316\u8fd9\u4e24\u7c7b\u9519\u8bef\u3002
\u53c2\u6570\u68c0\u9a8c\u5047\u8bbe\u6570\u636e\u670d\u4ece\u7279\u5b9a\u7684\u5206\u5e03\uff08\u901a\u5e38\u662f\u6b63\u6001\u5206\u5e03\uff09\u3002\u5f53\u5047\u8bbe\u6761\u4ef6\u6210\u7acb\u65f6\uff0c\u53c2\u6570\u68c0\u9a8c\u7684\u529f\u6548\u66f4\u9ad8\u3002
Z\u68c0\u9a8c\uff1a\u5728 \\(\\sigma\\) \u5df2\u77e5\u4e14 \\(n\\) \u8f83\u5927\uff08\\(n \\ge 30\\)\uff09\u65f6\uff0c\u5c06\u6837\u672c\u5747\u503c\u4e0e\u5df2\u77e5\u503c\u8fdb\u884c\u6bd4\u8f83\u3002\u68c0\u9a8c\u7edf\u8ba1\u91cf\uff1a
t\u5206\u5e03\u6709\u4e00\u4e2a\u79f0\u4e3a\u81ea\u7531\u5ea6\uff08\\(df = n - 1\\)\uff09\u7684\u53c2\u6570\u3002\u968f\u7740 \\(df\\) \u589e\u5927\uff0ct\u5206\u5e03\u8d8b\u8fd1\u4e8e\u6b63\u6001\u5206\u5e03\u3002
t\u68c0\u9a8c\u6709\u51e0\u79cd\u53d8\u4f53\uff1a
\u65b9\u5dee\u5206\u6790\uff1a\u68c0\u9a8c\u4e09\u4e2a\u6216\u66f4\u591a\u7ec4\u7684\u5747\u503c\u662f\u5426\u76f8\u7b49\u3002\u4e0e\u8fd0\u884c\u591a\u6b21t\u68c0\u9a8c\uff08\u8fd9\u4f1a\u81a8\u80c0\u7b2c\u4e00\u7c7b\u9519\u8bef\u7387\uff09\u4e0d\u540c\uff0c\u65b9\u5dee\u5206\u6790\u901a\u8fc7\u6bd4\u8f83\u7ec4\u95f4\u65b9\u5dee\u4e0e\u7ec4\u5185\u65b9\u5dee\u8fdb\u884c\u4e00\u6b21\u7edf\u4e00\u68c0\u9a8c\u3002
\u8f83\u5927\u7684 \\(F\\) \u6bd4\u503c\u610f\u5473\u7740\u5404\u7ec4\u4e4b\u95f4\u7684\u5dee\u5f02\u8d85\u51fa\u4e86\u968f\u673a\u53d8\u5f02\u6240\u80fd\u89e3\u91ca\u7684\u8303\u56f4\u3002
\u975e\u53c2\u6570\u68c0\u9a8c\u5bf9\u6570\u636e\u5206\u5e03\u7684\u5047\u8bbe\u8f83\u5c11\u3002\u5b83\u4eec\u57fa\u4e8e\u79e9\u6b21\u800c\u975e\u539f\u59cb\u503c\u8fdb\u884c\u8fd0\u7b97\uff0c\u56e0\u6b64\u5bf9\u5f02\u5e38\u503c\u548c\u975e\u6b63\u6001\u6027\u5177\u6709\u7a33\u5065\u6027\u3002
\u5361\u65b9\u68c0\u9a8c\uff08\\(\\chi^2\\)\uff09\uff1a\u68c0\u9a8c\u89c2\u6d4b\u9891\u6570\u4e0e\u671f\u671b\u9891\u6570\u662f\u5426\u4e00\u81f4\u3002\u7528\u4e8e\u5206\u7c7b\u6570\u636e\u3002\u4f8b\u5982\uff1a\u7ea2\u3001\u84dd\u3001\u7eff\u4e09\u79cd\u989c\u8272\u6c7d\u8f66\u7684\u6bd4\u4f8b\u662f\u5426\u4e0e\u5236\u9020\u5546\u58f0\u79f0\u7684\u6bd4\u4f8b\u4e00\u81f4\uff1f
Mann-Whitney U\u68c0\u9a8c\uff1a\u72ec\u7acb\u53cc\u6837\u672ct\u68c0\u9a8c\u7684\u975e\u53c2\u6570\u66ff\u4ee3\u65b9\u6cd5\u3002\u901a\u8fc7\u6bd4\u8f83\u79e9\u6b21\u6765\u68c0\u9a8c\u4e00\u7ec4\u662f\u5426\u503e\u5411\u4e8e\u6bd4\u53e6\u4e00\u7ec4\u6709\u66f4\u5927\u7684\u503c\u3002
Wilcoxon\u7b26\u53f7\u79e9\u68c0\u9a8c\uff1a\u914d\u5bf9t\u68c0\u9a8c\u7684\u975e\u53c2\u6570\u66ff\u4ee3\u65b9\u6cd5\u3002\u901a\u8fc7\u8003\u5bdf\u5dee\u5f02\u7684\u5927\u5c0f\u548c\u65b9\u5411\u6765\u6bd4\u8f83\u914d\u5bf9\u89c2\u6d4b\u503c\u3002
Kruskal-Wallis\u68c0\u9a8c\uff1a\u5355\u56e0\u7d20\u65b9\u5dee\u5206\u6790\u7684\u975e\u53c2\u6570\u66ff\u4ee3\u65b9\u6cd5\u3002\u901a\u8fc7\u6bd4\u8f83\u6240\u6709\u7ec4\u7684\u79e9\u6b21\u6765\u68c0\u9a8c\u591a\u4e2a\u7ec4\u662f\u5426\u6765\u81ea\u540c\u4e00\u5206\u5e03\u3002
\u62df\u5408\u4f18\u5ea6\u68c0\u9a8c\u68c0\u67e5\u6570\u636e\u662f\u5426\u670d\u4ece\u67d0\u4e2a\u7279\u5b9a\u7684\u7406\u8bba\u5206\u5e03\u3002\u5361\u65b9\u62df\u5408\u4f18\u5ea6\u68c0\u9a8c\u5c06\u89c2\u6d4b\u5230\u7684\u533a\u95f4\u8ba1\u6570\u4e0e\u5047\u8bbe\u5206\u5e03\u4e0b\u7684\u671f\u671b\u8ba1\u6570\u8fdb\u884c\u6bd4\u8f83\u3002
\u6b63\u6001\u6027\u68c0\u9a8c\u4e13\u95e8\u68c0\u9a8c\u6570\u636e\u662f\u5426\u670d\u4ece\u6b63\u6001\u5206\u5e03\u3002\u5e38\u7528\u7684\u68c0\u9a8c\u5305\u62ecShapiro-Wilk\u68c0\u9a8c\uff08\u5bf9\u5c0f\u6837\u672c\u68c0\u9a8c\u529b\u5f3a\uff09\u548cKolmogorov-Smirnov\u68c0\u9a8c\uff08\u5c06\u6837\u672c\u7ecf\u9a8c\u5206\u5e03\u51fd\u6570\u4e0e\u7406\u8bba\u5206\u5e03\u51fd\u6570\u8fdb\u884c\u6bd4\u8f83\uff09\u3002
\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u5047\u8bbe\u68c0\u9a8c\u51fa\u73b0\u5728\u6bd4\u8f83\u6a21\u578b\u6027\u80fd\u65f6\u3002\u5982\u679c\u6a21\u578bA\u8fbe\u523092%\u7684\u51c6\u786e\u7387\uff0c\u6a21\u578bB\u8fbe\u523091%\u7684\u51c6\u786e\u7387\uff0c\u8fd9\u79cd\u5dee\u5f02\u662f\u771f\u5b9e\u7684\u8fd8\u662f\u4ec5\u4ec5\u662f\u566a\u58f0\uff1f\u5bf9\u4ea4\u53c9\u9a8c\u8bc1\u5f97\u5206\u8fdb\u884c\u914d\u5bf9t\u68c0\u9a8c\u53ef\u4ee5\u56de\u7b54\u8fd9\u4e2a\u95ee\u9898\u3002
\u5bf9\u6587\u4e2d\u7684\u87ba\u6813\u5de5\u5382\u793a\u4f8b\u6267\u884cz\u68c0\u9a8c\u3002\u8ba1\u7b97\u68c0\u9a8c\u7edf\u8ba1\u91cf\u3001p\u503c\u5e76\u505a\u51fa\u51b3\u7b56\u3002
import jax.numpy as jnp\n\nx_bar = 10.3 # \u6837\u672c\u5747\u503c\nmu_0 = 10.0 # \u539f\u5047\u8bbe\u503c\nsigma = 0.9 # \u5df2\u77e5\u603b\u4f53\u6807\u51c6\u5dee\nn = 36 # \u6837\u672c\u91cf\nalpha = 0.05\n\n# \u68c0\u9a8c\u7edf\u8ba1\u91cf\nz = (x_bar - mu_0) / (sigma / jnp.sqrt(n))\nprint(f\"z = {z:.4f}\")\n\n# p\u503c\uff08\u53cc\u4fa7\u68c0\u9a8c\uff09\u4f7f\u7528\u6b63\u6001CDF\u8fd1\u4f3c\n# \u5bf9\u4e8e |z| = 2.0\uff0cp \u2248 0.0456\nfrom jax.scipy.stats import norm\np_value = 2 * (1 - norm.cdf(jnp.abs(z)))\nprint(f\"p\u503c = {p_value:.4f}\")\nprint(f\"\u62d2\u7eddH\u2080\uff1f{p_value <= alpha}\")\n \u6a21\u62df\u7b2c\u4e00\u7c7b\u9519\u8bef\uff1a\u5f53 \\(H_0\\) \u4e3a\u771f\u65f6\uff0c\u6211\u4eec\u72af\u9519\u8bef\u7684\u9891\u7387\u6709\u591a\u9ad8\uff1f\u8fd0\u884c10,000\u6b21\u5b9e\u9a8c\uff0c\u68c0\u9a8c\u62d2\u7edd\u7387\u662f\u5426\u4e0e \\(\\alpha\\) \u4e00\u81f4\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(0)\nmu_0 = 50.0\nsigma = 10.0\nn = 30\nalpha = 0.05\nn_experiments = 10_000\n\nrejections = 0\nfor i in range(n_experiments):\n key, subkey = jax.random.split(key)\n sample = mu_0 + sigma * jax.random.normal(subkey, shape=(n,))\n z = (sample.mean() - mu_0) / (sigma / jnp.sqrt(n))\n p_value = 2 * (1 - __import__(\"jax\").scipy.stats.norm.cdf(jnp.abs(z)))\n if p_value <= alpha:\n rejections += 1\n\nprint(f\"\u62d2\u7edd\u7387\uff1a{rejections/n_experiments:.4f}\")\nprint(f\"\u671f\u671b\u503c\uff08\u03b1\uff09\uff1a {alpha}\")\n \u5bf9\u4e24\u7ec4\u6570\u636e\u5206\u522b\u8fd0\u884ct\u68c0\u9a8c\u548cMann-Whitney U\u68c0\u9a8c\u3002\u751f\u6210\u4e00\u7ec4\u5747\u503c\u7565\u9ad8\u4e8e\u53e6\u4e00\u7ec4\u7684\u6570\u636e\uff0c\u89c2\u5bdf\u54ea\u79cd\u68c0\u9a8c\u80fd\u68c0\u6d4b\u51fa\u5dee\u5f02\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(99)\nk1, k2 = jax.random.split(key)\n\ngroup_a = jax.random.normal(k1, shape=(25,)) * 5 + 100\ngroup_b = jax.random.normal(k2, shape=(25,)) * 5 + 103 # \u5747\u503c\u7565\u9ad8\n\n# \u53cc\u6837\u672ct\u68c0\u9a8c\uff08\u5047\u8bbe\u65b9\u5dee\u76f8\u7b49\uff09\nn_a, n_b = len(group_a), len(group_b)\nmean_a, mean_b = group_a.mean(), group_b.mean()\npooled_var = ((n_a - 1) * group_a.var() + (n_b - 1) * group_b.var()) / (n_a + n_b - 2)\nse = jnp.sqrt(pooled_var * (1/n_a + 1/n_b))\nt_stat = (mean_a - mean_b) / se\nprint(f\"t\u68c0\u9a8c\u7edf\u8ba1\u91cf\uff1a{t_stat:.4f}\")\n\n# Mann-Whitney\uff1a\u7edf\u8ba1group_a\u7684\u503c\u5c0f\u4e8egroup_b\u503c\u7684\u6b21\u6570\nu_stat = jnp.sum(group_a[:, None] < group_b[None, :])\nprint(f\"Mann-Whitney U\uff1a {u_stat}\")\nprint(f\"\\nA\u7ec4\u5747\u503c\uff1a{mean_a:.2f}\uff0cB\u7ec4\u5747\u503c\uff1a{mean_b:.2f}\")\n \u7edf\u8ba1\u63a8\u65ad\u8d85\u8d8a\u4e86\u7b80\u5355\u7684\"\u662f/\u5426\"\u51b3\u7b56\uff0c\u4ee5\u91cf\u5316\u7684\u4e0d\u786e\u5b9a\u6027\u6765\u4f30\u8ba1\u603b\u4f53\u53c2\u6570\u3002\u672c\u8282\u6db5\u76d6\u7f6e\u4fe1\u533a\u95f4\u3001\u70b9\u4f30\u8ba1\u4e0e\u533a\u95f4\u4f30\u8ba1\u3001\u6781\u5927\u4f3c\u7136\u4f30\u8ba1\u3001\u77e9\u6cd5\u4ee5\u53ca\u56de\u5f52\u5206\u6790\u2014\u2014\u8fd9\u662f\u8fde\u63a5\u539f\u59cb\u6570\u636e\u4e0e\u673a\u5668\u5b66\u4e60\u9884\u6d4b\u6a21\u578b\u7684\u6865\u6881\u3002
\u5047\u8bbe\u68c0\u9a8c\u7ed9\u51fa\u4e00\u4e2a\"\u662f/\u5426\"\u7684\u7ed3\u8bba\uff1a\u62d2\u7edd\u6216\u4e0d\u62d2\u7edd\u539f\u5047\u8bbe\u3002\u4f46\u901a\u5e38\u4f60\u5e0c\u671b\u5f97\u5230\u66f4\u6709\u4fe1\u606f\u91cf\u7684\u7ed3\u679c\u2014\u2014\u4f60\u6b63\u5728\u4f30\u8ba1\u7684\u53c2\u6570\u7684\u4e00\u4e2a\u5408\u7406\u53d6\u503c\u533a\u95f4\u3002\u8fd9\u6b63\u662f\u7f6e\u4fe1\u533a\u95f4\u6240\u63d0\u4f9b\u7684\u3002
\u70b9\u4f30\u8ba1\u662f\u4ece\u6837\u672c\u4e2d\u8ba1\u7b97\u51fa\u7684\u5355\u4e00\u6570\u503c\uff0c\u6bd4\u5982\u6837\u672c\u5747\u503c \\(\\bar{x}\\)\u3002\u5b83\u662f\u4f60\u5bf9\u603b\u4f53\u53c2\u6570\u7684\u6700\u4f73\u731c\u6d4b\uff0c\u4f46\u4ec5\u51ed\u5b83\u672c\u8eab\u65e0\u6cd5\u53cd\u6620\u4f30\u8ba1\u7684\u7cbe\u786e\u7a0b\u5ea6\u3002
\u7f6e\u4fe1\u533a\u95f4\u5728\u70b9\u4f30\u8ba1\u5468\u56f4\u5305\u88f9\u4e00\u4e2a\u53cd\u6620\u4e0d\u786e\u5b9a\u6027\u7684\u8303\u56f4\u3002\u5176\u5f62\u5f0f\u4e3a\uff1a
95% \u7f6e\u4fe1\u533a\u95f4\u7684\u542b\u4e49\u662f\uff1a\u5982\u679c\u4f60\u91cd\u590d\u8fdb\u884c\u591a\u6b21\u5b9e\u9a8c\uff0c\u6bcf\u6b21\u6784\u5efa\u4e00\u4e2a\u533a\u95f4\uff0c\u90a3\u4e48\u5927\u7ea6 95% \u7684\u533a\u95f4\u4f1a\u5305\u542b\u771f\u5b9e\u7684\u603b\u4f53\u53c2\u6570\u3002\u8fd9\u5e76\u4e0d\u610f\u5473\u7740\u8be5\u53c2\u6570\u6709 95% \u7684\u6982\u7387\u843d\u5728\u8fd9\u4e2a\u7279\u5b9a\u7684\u533a\u95f4\u5185\u3002\u53c2\u6570\u662f\u4e00\u4e2a\u56fa\u5b9a\u503c\uff1b\u53d8\u5316\u7684\u662f\u533a\u95f4\u672c\u8eab\u3002
\u793a\u4f8b\uff1a\u4f60\u6d4b\u91cf\u4e86 50 \u4eba\u7684\u8eab\u9ad8\uff0c\u5f97\u5230 \\(\\bar{x} = 170\\) cm\uff0c\\(\\sigma = 8\\) cm\u3002\u6784\u5efa\u4e00\u4e2a 95% \u7f6e\u4fe1\u533a\u95f4\u3002
\u4f60\u53ef\u4ee5\u8bf4\uff0c\u6709 95% \u7684\u628a\u63e1\u8ba4\u4e3a\u771f\u6b63\u7684\u5e73\u5747\u8eab\u9ad8\u4ecb\u4e8e 167.78 cm \u548c 172.22 cm \u4e4b\u95f4\u3002
\u5f53 \\(\\sigma\\) \u672a\u77e5\u65f6\uff08\u8fd9\u662f\u5e38\u89c1\u60c5\u51b5\uff09\uff0c\u6539\u7528\u6837\u672c\u6807\u51c6\u5dee \\(s\\) \u548c t \u5206\u5e03\uff1a
\u8d8a\u5bbd\u7684\u533a\u95f4\u7f6e\u4fe1\u5ea6\u8d8a\u9ad8\uff0c\u4f46\u7cbe\u5ea6\u8d8a\u4f4e\uff1b\u8d8a\u7a84\u7684\u533a\u95f4\u7cbe\u5ea6\u8d8a\u9ad8\uff0c\u4f46\u7f6e\u4fe1\u5ea6\u8d8a\u4f4e\u3002\u5728\u4e0d\u964d\u4f4e\u7f6e\u4fe1\u5ea6\u7684\u524d\u63d0\u4e0b\uff0c\u589e\u5927\u6837\u672c\u91cf\u53ef\u4ee5\u7f29\u5c0f\u533a\u95f4\u3002
\u529f\u6548\u5206\u6790\u5e2e\u52a9\u4f60\u5728\u5b9e\u9a8c\u5f00\u59cb\u524d\u8fdb\u884c\u89c4\u5212\u3002\u8981\u56de\u7b54\u7684\u95ee\u9898\u662f\uff1a\u4e3a\u4e86\u68c0\u6d4b\u5230\u67d0\u4e2a\u7ed9\u5b9a\u5927\u5c0f\u7684\u6548\u5e94\u5e76\u8fbe\u5230\u6307\u5b9a\u7684\u68c0\u9a8c\u529f\u6548\uff0c\u6211\u9700\u8981\u591a\u5927\u7684\u6837\u672c\u91cf\uff1f
\u56de\u987e\u4e0a\u4e00\u8282\u7684\u5185\u5bb9\uff0c\u529f\u6548 = \\(1 - \\beta\\)\uff0c\u5373\u6b63\u786e\u62d2\u7edd\u9519\u8bef\u539f\u5047\u8bbe \\(H_0\\) \u7684\u6982\u7387\u3002\u5e38\u89c1\u7684\u529f\u6548\u76ee\u6807\u662f 80%\u3002
\u5bf9\u4e8e z \u68c0\u9a8c\uff0c\u68c0\u6d4b\u5dee\u5f02 \\(\\delta\\) \u6240\u9700\u6837\u672c\u91cf\uff08\u7ed9\u5b9a\u663e\u8457\u6027\u6c34\u5e73 \\(\\alpha\\) \u548c\u529f\u6548 \\(1-\\beta\\)\uff09\u4e3a\uff1a
\u4f60\u5927\u7ea6\u9700\u8981\u6bcf\u7ec4 126 \u4eba\u3002
\u529f\u6548\u5206\u6790\u53ef\u4ee5\u9632\u6b62\u4e24\u79cd\u5e38\u89c1\u9519\u8bef\uff1a\u5b9e\u9a8c\u89c4\u6a21\u592a\u5c0f\uff0c\u65e0\u6cd5\u68c0\u6d4b\u5230\u771f\u5b9e\u7684\u6548\u5e94\uff08\u529f\u6548\u4e0d\u8db3\uff09\uff1b\u6216\u8005\u6d6a\u8d39\u8d44\u6e90\u505a\u8fdc\u8d85\u5fc5\u8981\u89c4\u6a21\u7684\u5b9e\u9a8c\uff08\u529f\u6548\u8fc7\u5269\uff09\u3002
\u8499\u7279\u5361\u6d1b\u65b9\u6cd5\u5229\u7528\u968f\u673a\u62bd\u6837\u6765\u6c42\u89e3\u96be\u4ee5\u6216\u65e0\u6cd5\u89e3\u6790\u6c42\u89e3\u7684\u95ee\u9898\u3002\u5176\u6838\u5fc3\u601d\u60f3\u662f\uff1a\u5982\u679c\u4f60\u65e0\u6cd5\u7cbe\u786e\u8ba1\u7b97\u67d0\u4e2a\u91cf\uff0c\u90a3\u5c31\u591a\u6b21\u6a21\u62df\u5e76\u7528\u7ed3\u679c\u4f5c\u4e3a\u8fd1\u4f3c\u503c\u3002
\u540d\u79f0\u6765\u6e90\u4e8e\u8499\u7279\u5361\u6d1b\u8d4c\u573a\uff0c\u5bd3\u610f\u968f\u673a\u6027\u7684\u89d2\u8272\u3002\u8fd9\u4e9b\u65b9\u6cd5\u662f\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u91cd\u8981\u5de5\u5177\uff0c\u7528\u4e8e\u4f30\u8ba1\u79ef\u5206\u3001\u8bc4\u4f30\u6a21\u578b\u4e0d\u786e\u5b9a\u6027\u4ee5\u53ca\u8fd1\u4f3c\u590d\u6742\u5206\u5e03\u7b49\u4efb\u52a1\u3002
\u8499\u7279\u5361\u6d1b\u7684\u4e00\u822c\u6b65\u9aa4\uff1a
\u4e00\u4e2a\u7ecf\u5178\u4f8b\u5b50\u662f\u4f30\u7b97 \\(\\pi\\)\u3002\u60f3\u8c61\u4e00\u4e2a\u8fb9\u957f\u4e3a 2 \u7684\u6b63\u65b9\u5f62\uff0c\u4e2d\u5fc3\u5728\u539f\u70b9\uff0c\u5185\u5207\u4e00\u4e2a\u534a\u5f84\u4e3a 1 \u7684\u5706\u3002\u6b63\u65b9\u5f62\u7684\u9762\u79ef\u4e3a 4\uff0c\u5706\u7684\u9762\u79ef\u4e3a \\(\\pi\\)\u3002
\u70b9 \\((x, y)\\) \u5728\u5706\u5185\u7684\u6761\u4ef6\u662f \\(x^2 + y^2 \\le 1\\)\u3002\u6295\u7684\u70b9\u8d8a\u591a\uff0c\u4f30\u7b97\u503c\u5c31\u8d8a\u63a5\u8fd1 \\(\\pi\\) \u7684\u771f\u5b9e\u503c\u3002
\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u8499\u7279\u5361\u6d1b\u65b9\u6cd5\u51fa\u73b0\u5728\uff1a
\u56e0\u5b50\u5206\u6790\u662f\u4e00\u79cd\u53d1\u73b0\u9690\u85cf\uff08\u6f5c\u5728\uff09\u53d8\u91cf\u7684\u6280\u672f\uff0c\u8fd9\u4e9b\u53d8\u91cf\u89e3\u91ca\u4e86\u89c2\u6d4b\u53d8\u91cf\u4e4b\u95f4\u7684\u76f8\u5173\u6027\u3002\u5982\u679c 10 \u4e2a\u4e2a\u6027\u8c03\u67e5\u95ee\u9898\u53ef\u4ee5\u7531 3 \u4e2a\u6f5c\u5728\u7279\u8d28\uff08\u5916\u5411\u6027\u3001\u5b9c\u4eba\u6027\u3001\u8d23\u4efb\u5fc3\uff09\u89e3\u91ca\uff0c\u56e0\u5b50\u5206\u6790\u5c31\u80fd\u627e\u51fa\u8fd9\u4e9b\u7279\u8d28\u3002
\u8be5\u6a21\u578b\u5047\u8bbe\u6bcf\u4e2a\u89c2\u6d4b\u53d8\u91cf \\(x_i\\) \u662f\u5c11\u6570\u6f5c\u5728\u56e0\u5b50 \\(f_j\\) \u7684\u7ebf\u6027\u7ec4\u5408\u52a0\u4e0a\u566a\u58f0\uff1a
\\(\\lambda\\) \u503c\u79f0\u4e3a\u56e0\u5b50\u8f7d\u8377\uff0c\u8868\u793a\u6bcf\u4e2a\u89c2\u6d4b\u53d8\u91cf\u4e0e\u5404\u56e0\u5b50\u7684\u5173\u8054\u5f3a\u5ea6\u3002\u8fd9\u4e0e\u7b2c 2 \u7ae0\u7684\u77e9\u9635\u5206\u89e3\u76f4\u63a5\u76f8\u5173\uff1b\u56e0\u5b50\u5206\u6790\u4e0e\u7279\u5f81\u503c\u5206\u89e3\u548c SVD \u5bc6\u5207\u76f8\u5173\u3002
\u5b9e\u9a8c\u8bbe\u8ba1\u662f\u5b89\u6392\u5b9e\u9a8c\u7ed3\u6784\u7684\u827a\u672f\uff0c\u4f7f\u4f60\u80fd\u591f\u5f97\u51fa\u6709\u6548\u7684\u7ed3\u8bba\u3002\u7cdf\u7cd5\u7684\u8bbe\u8ba1\u751a\u81f3\u4f1a\u4f7f\u5927\u91cf\u6570\u636e\u53d8\u5f97\u6beb\u65e0\u4ef7\u503c\u3002
\u826f\u597d\u5b9e\u9a8c\u8bbe\u8ba1\u7684\u5173\u952e\u8981\u7d20\uff1a
\u5e38\u89c1\u7684\u5b9e\u9a8c\u8bbe\u8ba1\uff1a
\u5728\u673a\u5668\u5b66\u4e60\u5b9e\u9a8c\u4e2d\uff0c\u8fd9\u4e9b\u539f\u5219\u81f3\u5173\u91cd\u8981\u3002\u6bd4\u8f83\u6a21\u578b\u65f6\uff0c\u5e94\u63a7\u5236\u968f\u673a\u79cd\u5b50\u3001\u6570\u636e\u96c6\u5212\u5206\u548c\u786c\u4ef6\u73af\u5883\u3002\u4ea4\u53c9\u9a8c\u8bc1\u662f\u4e00\u79cd\u4ea4\u53c9\u8bbe\u8ba1\u5f62\u5f0f\u3002\u9010\u6b21\u79fb\u9664\u4e00\u4e2a\u7ec4\u4ef6\u7684\u6d88\u878d\u7814\u7a76\u5219\u9075\u5faa\u6790\u56e0\u8bbe\u8ba1\u7684\u903b\u8f91\u3002
\u4e3a\u8eab\u9ad8\u793a\u4f8b\u6784\u5efa\u4e00\u4e2a 95% \u7f6e\u4fe1\u533a\u95f4\uff0c\u7136\u540e\u5c1d\u8bd5\u4e0d\u540c\u7684\u7f6e\u4fe1\u6c34\u5e73\u548c\u6837\u672c\u91cf\u3002
import jax.numpy as jnp\n\nx_bar = 170.0 # \u6837\u672c\u5747\u503c\nsigma = 8.0 # \u603b\u4f53\u6807\u51c6\u5dee\uff08\u5df2\u77e5\uff09\nn = 50 # \u6837\u672c\u91cf\n\n# \u5e38\u7528\u7f6e\u4fe1\u6c34\u5e73\u7684\u4e34\u754c\u503c\nz_stars = {0.90: 1.645, 0.95: 1.960, 0.99: 2.576}\n\nfor conf, z_star in z_stars.items():\n me = z_star * (sigma / jnp.sqrt(n))\n lower, upper = x_bar - me, x_bar + me\n print(f\"{conf*100:.0f}% CI: [{lower:.2f}, {upper:.2f}] (ME = {me:.2f})\")\n \u4f7f\u7528\u8499\u7279\u5361\u6d1b\u6a21\u62df\u4f30\u7b97 \\(\\pi\\)\u3002\u7ed8\u5236\u968f\u7740\u70b9\u6570\u589e\u52a0\u4f30\u7b97\u503c\u6536\u655b\u7684\u66f2\u7ebf\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nkey = jax.random.PRNGKey(42)\n\n# \u5728 [-1, 1] x [-1, 1] \u5185\u751f\u6210\u968f\u673a\u70b9\nn_points = 100_000\nk1, k2 = jax.random.split(key)\nx = jax.random.uniform(k1, shape=(n_points,), minval=-1, maxval=1)\ny = jax.random.uniform(k2, shape=(n_points,), minval=-1, maxval=1)\n\n# \u68c0\u67e5\u54ea\u4e9b\u70b9\u5728\u5355\u4f4d\u5706\u5185\ninside = (x**2 + y**2) <= 1.0\ncumulative_inside = jnp.cumsum(inside)\ncounts = jnp.arange(1, n_points + 1)\npi_estimates = 4.0 * cumulative_inside / counts\n\nplt.figure(figsize=(10, 4))\nplt.plot(pi_estimates, color=\"#3498db\", alpha=0.7, linewidth=0.5)\nplt.axhline(y=jnp.pi, color=\"#e74c3c\", linestyle=\"--\", label=f\"\u03c0 = {jnp.pi:.6f}\")\nplt.xlabel(\"\u70b9\u6570\")\nplt.ylabel(\"\u03c0 \u7684\u4f30\u7b97\u503c\")\nplt.title(\"\u8499\u7279\u5361\u6d1b\u4f30\u7b97 \u03c0\")\nplt.legend()\nplt.ylim(2.8, 3.5)\nplt.show()\n\nprint(f\"\u6700\u7ec8\u4f30\u7b97\u503c: {pi_estimates[-1]:.6f}\")\nprint(f\"\u771f\u5b9e\u503c: {jnp.pi:.6f}\")\nprint(f\"\u8bef\u5dee: {abs(pi_estimates[-1] - jnp.pi):.6f}\")\n \u6267\u884c\u4e00\u4e2a\u7b80\u5355\u7684\u529f\u6548\u5206\u6790\uff1a\u7ed9\u5b9a\u6548\u5e94\u5927\u5c0f\u548c\u6807\u51c6\u5dee\uff0c\u8ba1\u7b97\u6240\u9700\u6837\u672c\u91cf\u5e76\u901a\u8fc7\u6a21\u62df\u9a8c\u8bc1\u3002
import jax\nimport jax.numpy as jnp\n\n# \u53c2\u6570\ndelta = 2.0 # \u6548\u5e94\u5927\u5c0f\uff08\u5747\u503c\u5dee\uff09\nsigma = 8.0 # \u603b\u4f53\u6807\u51c6\u5dee\nalpha = 0.05\npower_target = 0.80\n\n# \u89e3\u6790\u8ba1\u7b97\u7684\u6837\u672c\u91cf\nz_alpha = 1.96 # \u53cc\u5c3e\uff0calpha=0.05\nz_beta = 0.84 # power=0.80\nn_required = ((z_alpha + z_beta) * sigma / delta) ** 2\nprint(f\"\u6bcf\u7ec4\u6240\u9700\u6837\u672c\u91cf: {n_required:.0f}\")\n\n# \u901a\u8fc7\u6a21\u62df\u9a8c\u8bc1\nkey = jax.random.PRNGKey(7)\nn = int(jnp.ceil(n_required))\nn_sims = 5000\nrejections = 0\n\nfor _ in range(n_sims):\n key, k1, k2 = jax.random.split(key, 3)\n group_a = jax.random.normal(k1, shape=(n,)) * sigma + 50\n group_b = jax.random.normal(k2, shape=(n,)) * sigma + 50 + delta\n pooled_se = jnp.sqrt(2 * sigma**2 / n)\n z = (group_b.mean() - group_a.mean()) / pooled_se\n p = 2 * (1 - __import__(\"jax\").scipy.stats.norm.cdf(jnp.abs(z)))\n if p <= alpha:\n rejections += 1\n\nprint(f\"\u6a21\u62df\u529f\u6548: {rejections/n_sims:.3f}\")\nprint(f\"\u76ee\u6807\u529f\u6548: {power_target:.3f}\")\n \u53ef\u89c6\u5316\u7f6e\u4fe1\u533a\u95f4\u5bbd\u5ea6\u968f\u6837\u672c\u91cf\u7684\u53d8\u5316\u3002\u8fd9\u5c55\u793a\u4e86\u4e3a\u4ec0\u4e48\u6536\u96c6\u66f4\u591a\u6570\u636e\u53ef\u4ee5\u5f97\u5230\u66f4\u7cbe\u786e\u7684\u4f30\u8ba1\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nsigma = 8.0\nz_star = 1.96 # 95% \u7f6e\u4fe1\u5ea6\n\nsample_sizes = jnp.array([10, 20, 30, 50, 100, 200, 500, 1000], dtype=jnp.float32)\nmargins = z_star * sigma / jnp.sqrt(sample_sizes)\n\nplt.figure(figsize=(8, 4))\nplt.bar([str(int(n)) for n in sample_sizes], margins, color=\"#3498db\", alpha=0.7)\nplt.xlabel(\"\u6837\u672c\u91cf\")\nplt.ylabel(\"\u8bef\u5dee\u8303\u56f4 (cm)\")\nplt.title(\"95% CI \u8bef\u5dee\u8303\u56f4\u968f\u6837\u672c\u91cf\u589e\u5927\u800c\u7f29\u5c0f\")\nplt.show()\n \u8ba1\u6570\u662f\u8ba1\u7b97\u6982\u7387\u7684\u524d\u63d0\u2014\u2014\u5728\u5206\u914d\u53ef\u80fd\u6027\u4e4b\u524d\uff0c\u4f60\u5fc5\u987b\u5148\u77e5\u9053\u6709\u591a\u5c11\u79cd\u7ed3\u679c\u3002\u672c\u6587\u6db5\u76d6\u4e58\u6cd5\u4e0e\u52a0\u6cd5\u89c4\u5219\u3001\u9636\u4e58\u3001\u6392\u5217\u3001\u7ec4\u5408\u3001\u4e8c\u9879\u5f0f\u7cfb\u6570\uff0c\u4ee5\u53ca\u652f\u6491\u673a\u5668\u5b66\u4e60\u4e2d\u91c7\u6837\u3001\u54c8\u5e0c\u548c\u6982\u7387\u5206\u6790\u7684\u57fa\u672c\u7ec4\u5408\u5de5\u5177\u3002
\u5728\u8ba1\u7b97\u6982\u7387\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5148\u6570\u6e05\u7ed3\u679c\u7684\u6570\u91cf\u3002\u5982\u679c\u4f60\u60f3\u77e5\u9053\u5728\u6251\u514b\u4e2d\u62ff\u5230\u4e00\u624b\u8d62\u724c\u7684\u6982\u7387\uff0c\u4f60\u5fc5\u987b\u5148\u77e5\u9053\u4e00\u5171\u6709\u591a\u5c11\u79cd\u53ef\u80fd\u7684\u724c\u578b\uff0c\u4ee5\u53ca\u5176\u4e2d\u6709\u591a\u5c11\u79cd\u662f\u8d62\u724c\u3002\u8ba1\u6570\u6b63\u662f\u8ba9\u6982\u7387\u7cbe\u786e\u5316\u7684\u57fa\u7840\u5de5\u5177\u3002
\u6700\u7b80\u5355\u7684\u8ba1\u6570\u539f\u5219\u662f\u4e58\u6cd5\u89c4\u5219\u3002\u5982\u679c\u4e00\u4e2a\u9009\u62e9\u6709 \\(m\\) \u79cd\u9009\u9879\uff0c\u53e6\u4e00\u4e2a\u72ec\u7acb\u7684\u9009\u62e9\u6709 \\(n\\) \u79cd\u9009\u9879\uff0c\u90a3\u4e48\u7ec4\u5408\u8d77\u6765\u7684\u603b\u7ed3\u679c\u6570\u4e3a \\(m \\times n\\)\u3002
\u60f3\u8c61\u65e9\u4e0a\u7a7f\u8863\u670d\u7684\u573a\u666f\u3002\u4f60\u6709 3 \u4ef6\u886c\u886b\u548c 4 \u6761\u88e4\u5b50\u3002\u6bcf\u4ef6\u886c\u886b\u90fd\u80fd\u4e0e\u6bcf\u6761\u88e4\u5b50\u642d\u914d\uff0c\u5171\u6709 \\(3 \\times 4 = 12\\) \u79cd\u7a7f\u642d\u3002
\u4e58\u6cd5\u89c4\u5219\u53ef\u4ee5\u63a8\u5e7f\u5230\u4efb\u610f\u6570\u91cf\u7684\u9009\u62e9\u3002\u5982\u679c\u4f60\u8fd8\u6709 2 \u53cc\u978b\uff0c\u90a3\u4e48\u603b\u7a7f\u642d\u6570\u5c31\u53d8\u6210 \\(3 \\times 4 \\times 2 = 24\\)\u3002\u6bcf\u4e2a\u65b0\u7684\u72ec\u7acb\u9009\u62e9\u90fd\u4f1a\u4e58\u5230\u603b\u8ba1\u6570\u4e2d\u3002
\u52a0\u6cd5\u89c4\u5219\u5904\u7406\"\u6216\"\u7684\u573a\u666f\u3002\u5982\u679c\u4e8b\u4ef6 A \u6709 \\(m\\) \u79cd\u53d1\u751f\u65b9\u5f0f\uff0c\u4e8b\u4ef6 B \u6709 \\(n\\) \u79cd\u53d1\u751f\u65b9\u5f0f\uff0c\u4e14\u5b83\u4eec\u4e0d\u80fd\u540c\u65f6\u53d1\u751f\uff08\u4e92\u65a5\uff09\uff0c\u90a3\u4e48\u603b\u7684\u65b9\u5f0f\u6570\u4e3a \\(m + n\\)\u3002
\u5047\u8bbe\u4f60\u8981\u4ece\u57ce\u5e02 X \u524d\u5f80\u57ce\u5e02 Y\uff1a\u5f00\u8f66\u6709 3 \u6761\u8def\u7ebf\uff0c\u5750\u706b\u8f66\u6709 2 \u6761\u8def\u7ebf\u3002\u4f60\u65e0\u6cd5\u540c\u65f6\u9009\u62e9\u4e24\u8005\uff0c\u56e0\u6b64\u603b\u9009\u9879\u6570\u4e3a \\(3 + 2 = 5\\)\u3002
\u5f53\u4e8b\u4ef6\u6709\u91cd\u53e0\u65f6\uff0c\u9700\u8981\u51cf\u53bb\u88ab\u91cd\u590d\u8ba1\u6570\u7684\u7ed3\u679c\u3002\u5982\u679c \\(A\\) \u548c \\(B\\) \u53ef\u4ee5\u540c\u65f6\u53d1\u751f\uff0c\u8ba1\u6570\u4e3a \\(|A \\cup B| = |A| + |B| - |A \\cap B|\\)\u3002\u8fd9\u5c31\u662f\u5bb9\u65a5\u539f\u7406\uff0c\u5b83\u5c06\u5728\u6211\u4eec\u8ba8\u8bba\u6982\u7387\u52a0\u6cd5\u89c4\u5219\u65f6\u518d\u6b21\u51fa\u73b0\u3002
\u975e\u8d1f\u6574\u6570 \\(n\\) \u7684\u9636\u4e58\u662f\u4ece 1 \u5230 \\(n\\) \u7684\u6240\u6709\u6b63\u6574\u6570\u7684\u4e58\u79ef\uff1a
\u53ef\u4ee5\u5c06\u9636\u4e58\u7406\u89e3\u4e3a\uff1a\u5c06 \\(n\\) \u4e2a\u4e0d\u540c\u7684\u7269\u4f53\u6392\u6210\u4e00\u5217\u6709\u591a\u5c11\u79cd\u65b9\u5f0f\uff1f\u4e09\u672c\u4e66\u5728\u4e66\u67b6\u4e0a\u6709 \\(3! = 3 \\times 2 \\times 1 = 6\\) \u79cd\u6392\u5217\u65b9\u5f0f\u3002\u6309\u7ea6\u5b9a\uff0c\\(0! = 1\\)\u3002
\u9636\u4e58\u7684\u589e\u957f\u901f\u5ea6\u6781\u5feb\u3002\\(10! = 3{,}628{,}800\\)\uff0c\u800c \\(20!\\) \u5df2\u7ecf\u8d85\u8fc7 \\(2.4 \\times 10^{18}\\)\u3002\u8fd9\u79cd\u7206\u70b8\u5f0f\u589e\u957f\u6b63\u662f\u66b4\u529b\u641c\u7d22\u5728\u7ec4\u5408\u95ee\u9898\u4e2d\u53d8\u5f97\u4e0d\u5207\u5b9e\u9645\u7684\u539f\u56e0\u3002
\u6392\u5217\u662f\u5bf9\u7269\u4f53\u7684\u6709\u5e8f\u5b89\u6392\u3002\u5f53\u4f60\u4ece \\(n\\) \u4e2a\u4e0d\u540c\u7684\u7269\u4f53\u4e2d\u9009\u53d6 \\(r\\) \u4e2a\u4e14\u987a\u5e8f\u91cd\u8981\u65f6\uff0c\u6392\u5217\u6570\u4e3a\uff1a
\u60f3\u8c61\u4ece\u4e00\u4e2a 10 \u4eba\u7684\u4ff1\u4e50\u90e8\u4e2d\u9009\u51fa\u4f1a\u957f\u3001\u526f\u4f1a\u957f\u548c\u8d22\u52a1\u4e3b\u7ba1\u3002\u7b2c\u4e00\u4e2a\u804c\u4f4d\u6709 10 \u4e2a\u5019\u9009\u4eba\uff0c\u7b2c\u4e8c\u4e2a\u6709 9 \u4e2a\uff0c\u7b2c\u4e09\u4e2a\u6709 8 \u4e2a\u3002\u56e0\u6b64 \\(P(10, 3) = 10 \\times 9 \\times 8 = 720\\)\u3002\u516c\u5f0f\u4e5f\u5370\u8bc1\u4e86\u8fd9\u4e00\u70b9\uff1a\\(\\frac{10!}{7!} = 720\\)\u3002
\u7ec4\u5408\u662f\u65e0\u5e8f\u7684\u9009\u62e9\u3002\u5f53\u4f60\u4ece \\(n\\) \u4e2a\u4e2d\u9009\u53d6 \\(r\\) \u4e2a\u4e14\u987a\u5e8f\u65e0\u5173\u7d27\u8981\u65f6\uff0c\u9700\u8981\u9664\u53bb\u91cd\u590d\u7684\u6392\u5217\u987a\u5e8f\uff1a
\u540c\u6837\u7684 10 \u4e2a\u4eba\u4ea7\u751f 720 \u79cd\u6392\u5217\uff0c\u4f46\u53ea\u6709 120 \u79cd\u7ec4\u5408\uff0c\u56e0\u4e3a\u6bcf\u4e2a 3 \u4eba\u7ec4\u5185\u90e8\u6709 \\(3! = 6\\) \u79cd\u6392\u5e8f\u65b9\u5f0f\u3002
\u7ec4\u5408\u5728\u6982\u7387\u4e2d\u81f3\u5173\u91cd\u8981\u3002\u4e8c\u9879\u5f0f\u7cfb\u6570 \\(\\binom{n}{r}\\) \u7edf\u8ba1\u4e86\u5728 \\(n\\) \u6b21\u8bd5\u9a8c\u4e2d\u6070\u597d\u83b7\u5f97 \\(r\\) \u6b21\u6210\u529f\u7684\u65b9\u5f0f\u6570\uff0c\u8fd9\u6b63\u662f\u4e8c\u9879\u5206\u5e03\uff08\u89c1\u6587\u4ef6 03\uff09\u7684\u6838\u5fc3\u3002
\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u7ecf\u5178\u7684\u59d4\u5458\u4f1a\u95ee\u9898\u6765\u7efc\u5408\u8fd0\u7528\u591a\u79cd\u8ba1\u6570\u601d\u8def\u3002
\u95ee\u9898\uff1a\u4e00\u4e2a\u4ff1\u4e50\u90e8\u6709 8 \u540d\u7537\u6027\u548c 6 \u540d\u5973\u6027\u3002\u8981\u7ec4\u6210\u4e00\u4e2a 5 \u4eba\u59d4\u5458\u4f1a\uff0c\u5176\u4e2d\u6070\u597d\u5305\u542b 3 \u540d\u7537\u6027\u548c 2 \u540d\u5973\u6027\uff0c\u6709\u591a\u5c11\u79cd\u65b9\u5f0f\uff1f
\u7b2c 1 \u6b65\uff1a\u4ece 8 \u4eba\u4e2d\u9009 3 \u540d\u7537\u6027\u3002
\u8fd9\u79cd\u5c06\u590d\u6742\u8ba1\u6570\u95ee\u9898\u5206\u89e3\u4e3a\u72ec\u7acb\u5b50\u9009\u62e9\u518d\u76f8\u4e58\u7684\u6a21\u5f0f\uff0c\u662f\u7ec4\u5408\u6570\u5b66\u4e2d\u7684\u6807\u51c6\u65b9\u6cd5\u3002
\u8fd8\u6709\u53ef\u91cd\u590d\u7684\u6392\u5217\u3002\u5f53\u7269\u54c1\u53ef\u4ee5\u91cd\u590d\u65f6\uff0c\u4ece \\(n\\) \u79cd\u7c7b\u578b\u4e2d\u9009 \\(r\\) \u4e2a\u4f1a\u4ea7\u751f \\(n^r\\) \u79cd\u7ed3\u679c\u3002\u4e00\u4e2a\u4f7f\u7528\u6570\u5b57 0-9 \u7684 4 \u4f4d PIN \u7801\u6709 \\(10^4 = 10{,}000\\) \u79cd\u53ef\u80fd\u6027\u3002\u6bcf\u4e00\u4f4d\u90fd\u6709 10 \u79cd\u9009\u62e9\uff0c\u4e58\u6cd5\u89c4\u5219\u5373\u53ef\u89e3\u51b3\u3002
\u53ef\u91cd\u590d\u7684\u7ec4\u5408\uff08\u4e5f\u79f0\"\u661f\u6761\u6cd5\"\uff09\u7edf\u8ba1\u4ece \\(n\\) \u79cd\u7c7b\u578b\u4e2d\u9009 \\(r\\) \u4e2a\u3001\u5141\u8bb8\u91cd\u590d\u4e14\u987a\u5e8f\u65e0\u5173\u7684\u65b9\u5f0f\u6570\uff1a
\u793a\u4f8b\uff1a\u4ece 4 \u79cd\u51b0\u6dc7\u6dcb\u53e3\u5473\u4e2d\u9009\u62e9 3 \u52fa\uff08\u5141\u8bb8\u91cd\u590d\uff09\u6709 \\(\\binom{4 + 3 - 1}{3} = \\binom{6}{3} = 20\\) \u79cd\u9009\u9879\u3002
\u603b\u7ed3\u8ba1\u6570\u5de5\u5177\u7bb1\uff1a
\u4f7f\u7528\u9636\u4e58\u516c\u5f0f\u548c\u76f4\u63a5\u8ba1\u7b97\u4e24\u79cd\u65b9\u5f0f\u8ba1\u7b97 \\(P(10, 3)\\) \u548c \\(\\binom{10}{3}\\)\u3002\u9a8c\u8bc1\u6392\u5217\u6570\u603b\u662f\u7ec4\u5408\u6570\u7684 \\(r!\\) \u500d\u3002
import jax.numpy as jnp\nfrom math import factorial\n\nn, r = 10, 3\n\nperm = factorial(n) // factorial(n - r)\ncomb = factorial(n) // (factorial(r) * factorial(n - r))\n\nprint(f\"P({n},{r}) = {perm}\")\nprint(f\"C({n},{r}) = {comb}\")\nprint(f\"P / C = {perm // comb} (\u5e94\u7b49\u4e8e {r}! = {factorial(r)})\")\n \u901a\u8fc7\u7a0b\u5e8f\u89e3\u51b3\u59d4\u5458\u4f1a\u95ee\u9898\uff088 \u4eba\u4e2d\u9009 3 \u540d\u7537\u6027\uff0c6 \u4eba\u4e2d\u9009 2 \u540d\u5973\u6027\uff09\uff0c\u5e76\u901a\u8fc7\u679a\u4e3e\u6240\u6709\u6709\u6548\u59d4\u5458\u4f1a\u6765\u9a8c\u8bc1\u3002
from itertools import combinations\nfrom math import factorial\n\ndef comb_count(n, r):\n return factorial(n) // (factorial(r) * factorial(n - r))\n\n# \u516c\u5f0f\u6cd5\nmen_ways = comb_count(8, 3)\nwomen_ways = comb_count(6, 2)\nprint(f\"\u516c\u5f0f\u6cd5: {men_ways} \u00d7 {women_ways} = {men_ways * women_ways}\")\n\n# \u679a\u4e3e\u6cd5\nmen = [f\"M{i}\" for i in range(1, 9)]\nwomen = [f\"W{i}\" for i in range(1, 7)]\ncount = sum(1 for _ in combinations(men, 3) for _ in combinations(women, 2))\nprint(f\"\u679a\u4e3e\u6cd5: {count}\")\n \u7edf\u8ba1\u7531 26 \u4e2a\u5c0f\u5199\u5b57\u6bcd\u7ec4\u6210\u7684 4 \u4f4d\u5bc6\u7801\u6709\u591a\u5c11\u79cd\uff08\u5141\u8bb8\u91cd\u590d\uff09\u3002\u7136\u540e\u7edf\u8ba1\u6ca1\u6709\u91cd\u590d\u5b57\u6bcd\u7684\u5bc6\u7801\u6709\u591a\u5c11\u79cd\u3002
from math import factorial\n\nn = 26\nr = 4\n\nwith_rep = n ** r\nwithout_rep = factorial(n) // factorial(n - r)\n\nprint(f\"\u5141\u8bb8\u91cd\u590d: {with_rep:>10,}\")\nprint(f\"\u4e0d\u5141\u8bb8\u91cd\u590d: {without_rep:>10,}\")\nprint(f\"\u542b\u91cd\u590d\u7684\u6bd4\u4f8b: {1 - without_rep/with_rep:.2%}\")\n \u6a21\u62df\u751f\u65e5\u95ee\u9898\uff1a\u5728 \\(k\\) \u4eba\u7684\u7fa4\u4f53\u4e2d\uff0c\u81f3\u5c11\u4e24\u4eba\u5171\u4eab\u751f\u65e5\u7684\u6982\u7387\u662f\u591a\u5c11\uff1f\u7ed8\u5236 \\(k = 1\\) \u5230 \\(60\\) \u7684\u6982\u7387\u66f2\u7ebf\uff0c\u5e76\u627e\u51fa\u6982\u7387\u8d85\u8fc7 50% \u7684\u4f4d\u7f6e\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef birthday_prob_exact(k):\n \\\"\\\"\\\"k \u4eba\u7fa4\u4f53\u4e2d\u81f3\u5c11\u6709\u4e00\u5bf9\u5171\u4eab\u751f\u65e5\u7684\u6982\u7387\u3002\\\"\\\"\\\"\n p_no_match = 1.0\n for i in range(k):\n p_no_match *= (365 - i) / 365\n return 1 - p_no_match\n\nks = list(range(1, 61))\nprobs = [birthday_prob_exact(k) for k in ks]\n\nplt.figure(figsize=(8, 4))\nplt.plot(ks, probs, color=\"#3498db\", linewidth=2)\nplt.axhline(y=0.5, color=\"#e74c3c\", linestyle=\"--\", alpha=0.7, label=\"50%\")\ncross = next(k for k, p in zip(ks, probs) if p >= 0.5)\nplt.axvline(x=cross, color=\"#e74c3c\", linestyle=\"--\", alpha=0.7)\nplt.xlabel(\"\u7fa4\u4f53\u5927\u5c0f (k)\")\nplt.ylabel(\"P(\u81f3\u5c11\u4e24\u4eba\u5171\u4eab\u751f\u65e5)\")\nplt.title(f\"\u751f\u65e5\u95ee\u9898\uff08\u5728 k={cross} \u65f6\u8d85\u8fc7 50%\uff09\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n \u6982\u7387\u8bba\u5f62\u5f0f\u5316\u4e86\u4e0d\u786e\u5b9a\u6027\uff0c\u5e76\u63d0\u4f9b\u4e86\u5728\u6b64\u6846\u67b6\u4e0b\u8fdb\u884c\u63a8\u7406\u7684\u89c4\u5219\u3002\u672c\u6587\u6db5\u76d6\u6837\u672c\u7a7a\u95f4\u3001\u4e8b\u4ef6\u3001\u6982\u7387\u516c\u7406\u3001\u6761\u4ef6\u6982\u7387\u3001\u72ec\u7acb\u6027\u3001\u8d1d\u53f6\u65af\u5b9a\u7406\u3001\u9891\u7387\u6d3e\u4e0e\u8d1d\u53f6\u65af\u6d3e\u89e3\u91ca\uff0c\u8fd9\u662f\u673a\u5668\u5b66\u4e60\u4e2d\u6bcf\u4e2a\u751f\u6210\u6a21\u578b\u548c\u5224\u522b\u6a21\u578b\u80cc\u540e\u7684\u6570\u5b66\u6846\u67b6\u3002
\u6982\u7387\u4e3a\u4e00\u4e2a\u4e8b\u4ef6\u8d4b\u4e88\u4e00\u4e2a\u4ecb\u4e8e 0 \u548c 1 \u4e4b\u95f4\u7684\u6570\u5b57\uff0c\u8861\u91cf\u8be5\u4e8b\u4ef6\u53d1\u751f\u7684\u53ef\u80fd\u6027\u3002
\u6982\u7387\u4e3a 0 \u8868\u793a\u4e0d\u53ef\u80fd\uff0c1 \u8868\u793a\u5fc5\u7136\uff0c0.5 \u5219\u50cf\u629b\u786c\u5e01\u4e00\u6837\u3002
\u6709\u4e24\u79cd\u4e3b\u8981\u89e3\u91ca\u3002\u9891\u7387\u6d3e\u89c2\u70b9\u8ba4\u4e3a\u6982\u7387\u662f\u957f\u671f\u76f8\u5bf9\u9891\u7387\uff1a\u629b\u4e00\u679a\u5747\u5300\u786c\u5e01 10,000 \u6b21\uff0c\u6b63\u9762\u5927\u7ea6\u4f1a\u51fa\u73b0 50% \u7684\u6b21\u6570\u3002
\u8d1d\u53f6\u65af\u6d3e\u89c2\u70b9\u8ba4\u4e3a\u6982\u7387\u662f\u4fe1\u5ff5\u7a0b\u5ea6\uff1a\u4f60\u53ef\u80fd\u4f1a\u8bf4\u660e\u5929\u964d\u96e8\u7684\u6982\u7387\u662f 70%\uff0c\u5c3d\u7ba1\u660e\u5929\u53ea\u4f1a\u53d1\u751f\u4e00\u6b21\u3002
\u4e24\u79cd\u89e3\u91ca\u4f7f\u7528\u76f8\u540c\u7684\u6570\u5b66\u89c4\u5219\u3002\u533a\u522b\u5728\u4e8e\u54f2\u5b66\u5c42\u9762\uff0c\u4f46\u5728\u673a\u5668\u5b66\u4e60\u4e2d\u8fd9\u5f88\u91cd\u8981\u3002\u9891\u7387\u6d3e\u65b9\u6cd5\u7ed9\u51fa\u70b9\u4f30\u8ba1\u3002\u8d1d\u53f6\u65af\u6d3e\u65b9\u6cd5\u7ed9\u51fa\u53c2\u6570\u7684\u5b8c\u6574\u5206\u5e03\u3002
\u6837\u672c\u7a7a\u95f4 \\(S\\) \u662f\u5b9e\u9a8c\u6240\u6709\u53ef\u80fd\u7ed3\u679c\u7684\u96c6\u5408\u3002\u629b\u4e00\u679a\u786c\u5e01\uff1a\\(S = \\{H, T\\}\\)\u3002\u63b7\u4e00\u4e2a\u9ab0\u5b50\uff1a\\(S = \\{1, 2, 3, 4, 5, 6\\}\\)\u3002
\u4e8b\u4ef6\u662f\u6837\u672c\u7a7a\u95f4\u7684\u4efb\u610f\u5b50\u96c6\u3002\"\u63b7\u51fa\u5076\u6570\"\u662f\u4e8b\u4ef6 \\(A = \\{2, 4, 6\\}\\)\uff0c\u5b83\u662f \\(S\\) \u7684\u4e00\u4e2a\u5b50\u96c6\u3002
\u5f53\u6240\u6709\u7ed3\u679c\u7b49\u53ef\u80fd\u65f6\uff0c\u4e8b\u4ef6\u7684\u6982\u7387\u5c31\u662f\u7b80\u5355\u7684\u8ba1\u6570\uff08\u6765\u81ea\u6587\u4ef6 01\uff09\uff1a
\u8865\u96c6\u901a\u5e38\u662f\u66f4\u7b80\u4fbf\u7684\u9014\u5f84\u3002\u4e0e\u5176\u8ba1\u7b97 5 \u6b21\u629b\u786c\u5e01\u4e2d\u81f3\u5c11\u5f97\u5230\u4e00\u4e2a\u6b63\u9762\u7684\u6240\u6709\u65b9\u5f0f\uff0c\u4e0d\u5982\u8ba1\u7b97\u5f97\u5230\u5168\u53cd\u9762\u7684\u4e00\u79cd\u65b9\u5f0f\u7136\u540e\u76f8\u51cf\uff1a\\(P(\\text{\u81f3\u5c11\u4e00\u4e2a\u6b63\u9762}) = 1 - P(\\text{\u5168\u53cd\u9762}) = 1 - (0.5)^5 = 0.969\\)\u3002
\u5982\u679c\u4e24\u4e2a\u4e8b\u4ef6\u4e0d\u80fd\u540c\u65f6\u53d1\u751f\uff0c\u5219\u5b83\u4eec\u662f\u4e92\u65a5\uff08\u4e0d\u76f8\u4ea4\uff09\u7684\uff1a\\(A \\cap B = \\emptyset\\)\u3002\u4e00\u6b21\u63b7\u9ab0\u5b50\u4e2d\u63b7\u51fa 2 \u548c\u63b7\u51fa 5 \u662f\u4e92\u65a5\u4e8b\u4ef6\u3002
\u4e92\u65a5\u4e8b\u4ef6\u7684\u52a0\u6cd5\u6cd5\u5219\u5f88\u76f4\u63a5\uff1a
\u8fd9\u4e0e\u8ba1\u6570\u4e2d\u7684\u5bb9\u65a5\u539f\u7406\u76f8\u5bf9\u5e94\u3002\u4e0a\u65b9\u7684\u7ef4\u6069\u56fe\u8bf4\u660e\u4e86\u539f\u56e0\uff1a\u7d2b\u8272\u533a\u57df\uff08\u4ea4\u96c6\uff09\u5728 \\(P(A)\\) \u4e2d\u88ab\u8ba1\u7b97\u4e00\u6b21\uff0c\u5728 \\(P(B)\\) \u4e2d\u53c8\u88ab\u8ba1\u7b97\u4e00\u6b21\uff0c\u56e0\u6b64\u6211\u4eec\u51cf\u53bb\u4e00\u6b21\u3002
\u8054\u5408\u6982\u7387 \\(P(A \\cap B)\\) \u662f \\(A\\) \u548c \\(B\\) \u540c\u65f6\u53d1\u751f\u7684\u6982\u7387\u3002\u5728\u4e00\u526f\u6251\u514b\u724c\u4e2d\uff0c\\(P(\\text{\u7ea2\u8272} \\cap \\text{\u56fd\u738b}) = \\frac{2}{52}\\)\uff0c\u56e0\u4e3a\u6709 2 \u5f20\u7ea2\u8272\u56fd\u738b\u3002
\u8fb9\u9645\u6982\u7387\u662f\u5355\u4e2a\u4e8b\u4ef6\u4e0d\u8003\u8651\u5176\u4ed6\u4e8b\u4ef6\u65f6\u7684\u6982\u7387\u3002\\(P(\\text{\u7ea2\u8272}) = \\frac{26}{52} = 0.5\\) \u662f\u4e00\u4e2a\u8fb9\u9645\u6982\u7387\u3002\u5982\u679c\u4f60\u6709\u5173\u4e8e\u4e24\u4e2a\u53d8\u91cf\u7684\u8054\u5408\u5206\u5e03\uff0c\u901a\u8fc7\u5bf9\u53e6\u4e00\u4e2a\u53d8\u91cf\u6c42\u548c\uff08\u6216\u79ef\u5206\uff09\u5373\u53ef\u5f97\u5230\u8fb9\u9645\u6982\u7387\u3002
\u6761\u4ef6\u6982\u7387\u56de\u7b54\u7684\u662f\uff1a\u5df2\u77e5 \\(B\\) \u5df2\u7ecf\u53d1\u751f\uff0c\\(A\\) \u7684\u6982\u7387\u662f\u591a\u5c11\uff1f\u6211\u4eec\u5c06\u6837\u672c\u7a7a\u95f4\u4ece \\(S\\) \u7f29\u5c0f\u5230 \\(B\\)\uff0c\u5e76\u95ee \\(B\\) \u4e2d\u540c\u65f6\u5c5e\u4e8e \\(A\\) \u7684\u6bd4\u4f8b\u662f\u591a\u5c11\uff1a
\u793a\u4f8b\uff1a\u4f60\u62bd\u4e00\u5f20\u724c\uff0c\u6709\u4eba\u544a\u8bc9\u4f60\u5b83\u662f\u7ea2\u8272\u3002\u5b83\u662f\u56fd\u738b\u7684\u6982\u7387\u662f\u591a\u5c11\uff1f\u6709 26 \u5f20\u7ea2\u8272\u724c\uff0c\u5176\u4e2d 2 \u5f20\u662f\u56fd\u738b\uff0c\u6240\u4ee5 \\(P(\\text{\u56fd\u738b} | \\text{\u7ea2\u8272}) = \\frac{2}{26} = \\frac{1}{13}\\)\u3002\u4f7f\u7528\u516c\u5f0f\uff1a\\(P(\\text{\u56fd\u738b} \\cap \\text{\u7ea2\u8272}) / P(\\text{\u7ea2\u8272}) = \\frac{2/52}{26/52} = \\frac{1}{13}\\)\u3002
\u5982\u679c\u77e5\u9053\u4e00\u4e2a\u4e8b\u4ef6\u53d1\u751f\u4e86\u4e0d\u4f1a\u544a\u8bc9\u4f60\u5173\u4e8e\u53e6\u4e00\u4e2a\u4e8b\u4ef6\u7684\u4efb\u4f55\u4fe1\u606f\uff0c\u5219\u8fd9\u4e24\u4e2a\u4e8b\u4ef6\u662f\u72ec\u7acb\u7684\u3002\u5f62\u5f0f\u5316\u5b9a\u4e49\uff1a
\u7b49\u4ef7\u5730\uff0c\\(P(A | B) = P(A)\\)\u3002\u5206\u522b\u629b\u4e24\u679a\u786c\u5e01\u662f\u72ec\u7acb\u4e8b\u4ef6\u3002\u65e0\u653e\u56de\u5730\u62bd\u4e24\u5f20\u724c\u4e0d\u662f\u72ec\u7acb\u7684\uff08\u7b2c\u4e00\u6b21\u62bd\u53d6\u4f1a\u6539\u53d8\u5269\u4f59\u724c\u7684\u6570\u91cf\uff09\u3002
\u72ec\u7acb\u6027\u662f\u4e00\u4e2a\u5de8\u5927\u7684\u7b80\u5316\u5de5\u5177\u3002\u5bf9\u4e8e\u72ec\u7acb\u4e8b\u4ef6\uff0c\u8054\u5408\u6982\u7387\u5206\u89e3\u4e3a\u4e58\u79ef\u5f62\u5f0f\uff0c\u8fd9\u4f7f\u5f97\u8ba1\u7b97\u53ef\u5904\u7406\u3002\u8bb8\u591a\u673a\u5668\u5b66\u4e60\u6a21\u578b\u5047\u8bbe\u7279\u5f81\u4e4b\u95f4\u72ec\u7acb\uff08\u4f8b\u5982\u6734\u7d20\u8d1d\u53f6\u65af\uff09\uff0c\u6b63\u662f\u57fa\u4e8e\u8fd9\u79cd\u7b80\u5316\u3002
\u4efb\u610f\u4e24\u4e2a\u4e8b\u4ef6\u7684\u4e58\u6cd5\u6cd5\u5219\u7531\u6761\u4ef6\u6982\u7387\u516c\u5f0f\u91cd\u65b0\u6392\u5217\u5f97\u5230\uff1a
\u5bf9\u4e8e\u72ec\u7acb\u4e8b\u4ef6\uff0c\u7531\u4e8e\u6761\u4ef6\u6982\u7387\u7b49\u4e8e\u8fb9\u9645\u6982\u7387\uff0c\u4e0a\u5f0f\u7b80\u5316\u4e3a \\(P(A \\cap B) = P(A) \\cdot P(B)\\)\u3002
\u8d1d\u53f6\u65af\u5b9a\u7406\u662f\u6982\u7387\u8bba\u4e2d\u6700\u91cd\u8981\u7684\u7ed3\u8bba\u4e4b\u4e00\uff0c\u4e5f\u662f\u8d1d\u53f6\u65af\u673a\u5668\u5b66\u4e60\u7684\u57fa\u7840\u3002\u5b83\u8ba9\u6211\u4eec\u53ef\u4ee5\u53cd\u8f6c\u6761\u4ef6\u6982\u7387\u7684\u65b9\u5411\uff1a
\u6bcf\u4e2a\u90e8\u5206\u90fd\u6709\u540d\u79f0\uff1a
\u8ba9\u6211\u4eec\u901a\u8fc7\u7ecf\u5178\u7684\u533b\u5b66\u8bca\u65ad\u4f8b\u5b50\u6765\u7406\u89e3\u3002\u5047\u8bbe\u67d0\u79cd\u75be\u75c5\u5f71\u54cd 1% \u7684\u4eba\u53e3\u3002\u9488\u5bf9\u8be5\u75be\u75c5\u7684\u68c0\u6d4b\u51c6\u786e\u7387\u4e3a 95%\uff1a\u5b83\u80fd\u6b63\u786e\u8bc6\u522b 95% \u7684\u60a3\u75c5\u8005\uff08\u7075\u654f\u5ea6\uff09\uff0c\u5e76\u80fd\u6b63\u786e\u8bc6\u522b 90% \u7684\u5065\u5eb7\u4eba\uff08\u7279\u5f02\u5ea6\uff09\u3002
\u4f60\u7684\u68c0\u6d4b\u7ed3\u679c\u4e3a\u9633\u6027\u3002\u4f60\u5b9e\u9645\u60a3\u75c5\u7684\u6982\u7387\u662f\u591a\u5c11\uff1f
\u8bbe \\(D\\) = \u60a3\u75c5\uff0c\\(+\\) = \u68c0\u6d4b\u9633\u6027\u3002
\u6211\u4eec\u9700\u8981 \\(P(+)\\)\u3002\u6839\u636e\u5168\u6982\u7387\u516c\u5f0f\uff1a
\u5c3d\u7ba1\u68c0\u6d4b\"\u51c6\u786e\u7387\u9ad8\u8fbe 95%\"\uff0c\u4f46\u9633\u6027\u7ed3\u679c\u53ea\u80fd\u7ed9\u4f60\u7ea6 8.8% \u7684\u60a3\u75c5\u6982\u7387\u3002\u5148\u9a8c\u81f3\u5173\u91cd\u8981\u3002\u7531\u4e8e\u8be5\u75be\u75c5\u7f55\u89c1\uff0c\u5927\u591a\u6570\u9633\u6027\u7ed3\u679c\u90fd\u662f\u5047\u9633\u6027\u3002\u8fd9\u5bf9\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u4efb\u4f55\u5206\u7c7b\u95ee\u9898\u90fd\u662f\u4e00\u4e2a\u5173\u952e\u89c1\u89e3\uff1a\u5f53\u7c7b\u522b\u4e0d\u5e73\u8861\u65f6\uff0c\u4ec5\u9760\u51c6\u786e\u7387\u662f\u5177\u6709\u8bef\u5bfc\u6027\u7684\u3002
\u5168\u6982\u7387\u516c\u5f0f\u5c06\u6837\u672c\u7a7a\u95f4\u5212\u5206\u4e3a\u4e92\u65a5\u4e14\u5b8c\u5907\u7684\u4e8b\u4ef6 \\(B_1, B_2, \\ldots, B_n\\)\uff0c\u5e76\u5c06\u4efb\u610f\u4e8b\u4ef6 \\(A\\) \u8868\u793a\u4e3a\uff1a
\u8fd9\u6b63\u662f\u6211\u4eec\u5728\u533b\u5b66\u4f8b\u5b50\u4e2d\u8ba1\u7b97 \\(P(+)\\) \u6240\u7528\u7684\u65b9\u6cd5\uff1a\u6211\u4eec\u5c06\u4eba\u7fa4\u5206\u4e3a\"\u60a3\u75c5\"\u548c\"\u672a\u60a3\u75c5\"\u4e24\u7c7b\u3002
\u6982\u7387\u7684\u94fe\u5f0f\u6cd5\u5219\u5c06\u4e58\u6cd5\u6cd5\u5219\u63a8\u5e7f\u5230\u4efb\u610f\u6570\u91cf\u7684\u4e8b\u4ef6\uff1a
\u6bcf\u4e2a\u56e0\u5b50\u90fd\u4ee5\u524d\u9762\u6240\u6709\u4e8b\u4ef6\u4e3a\u6761\u4ef6\u3002\u8fd9\u662f\u81ea\u56de\u5f52\u8bed\u8a00\u6a21\u578b\u7684\u57fa\u77f3\uff1a\u4e00\u4e2a\u53e5\u5b50\u7684\u6982\u7387\u7b49\u4e8e\u6bcf\u4e2a\u5355\u8bcd\u5728\u7ed9\u5b9a\u524d\u9762\u6240\u6709\u5355\u8bcd\u6761\u4ef6\u4e0b\u7684\u6982\u7387\u7684\u4e58\u79ef\u3002
\u6761\u4ef6\u72ec\u7acb\u610f\u5473\u7740\u4e24\u4e2a\u4e8b\u4ef6\u5728\u7ed9\u5b9a\u7b2c\u4e09\u4e2a\u4e8b\u4ef6\u7684\u6761\u4ef6\u4e0b\u662f\u72ec\u7acb\u7684\u3002\u5982\u679c\u6ee1\u8db3\u4e0b\u5f0f\uff0c\u5219 \\(A\\) \u548c \\(B\\) \u5728\u7ed9\u5b9a \\(C\\) \u7684\u6761\u4ef6\u4e0b\u6761\u4ef6\u72ec\u7acb\uff1a
\u4e8b\u4ef6\u53ef\u4ee5\u8fb9\u9645\u4e0a\u76f8\u5173\u4f46\u6761\u4ef6\u72ec\u7acb\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002\u4f8b\u5982\uff0c\u4e24\u540d\u5b66\u751f\u7684\u8003\u8bd5\u6210\u7ee9\u53ef\u80fd\u76f8\u5173\uff08\u90fd\u4f9d\u8d56\u4e8e\u8003\u8bd5\u7684\u96be\u5ea6\uff09\uff0c\u4f46\u7ed9\u5b9a\u8003\u8bd5\u96be\u5ea6\u540e\uff0c\u4ed6\u4eec\u7684\u6210\u7ee9\u662f\u72ec\u7acb\u7684\u3002
\u6761\u4ef6\u72ec\u7acb\u662f\u8d1d\u53f6\u65af\u7f51\u7edc\u7b49\u56fe\u6a21\u578b\u80cc\u540e\u7684\u5173\u952e\u5047\u8bbe\u3002\u5b83\u5141\u8bb8\u5c06\u590d\u6742\u7684\u8054\u5408\u5206\u5e03\u5206\u89e3\u4e3a\u53ef\u7ba1\u7406\u7684\u90e8\u5206\uff0c\u4f7f\u63a8\u65ad\u5728\u8ba1\u7b97\u4e0a\u53ef\u884c\u3002
\u6a21\u62df\u533b\u5b66\u8bca\u65ad\u95ee\u9898\u3002\u751f\u6210 100,000 \u4eba\u7684\u603b\u4f53\uff0c\u5e94\u7528\u75be\u75c5\u60a3\u75c5\u7387\u548c\u68c0\u6d4b\u51c6\u786e\u7387\uff0c\u9a8c\u8bc1\u8d1d\u53f6\u65af\u5b9a\u7406\u7ed9\u51fa\u6b63\u786e\u7684\u540e\u9a8c\u6982\u7387\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(42)\nn = 100_000\n\n# \u751f\u6210\u603b\u4f53\nk1, k2 = jax.random.split(key)\nhas_disease = jax.random.bernoulli(k1, p=0.01, shape=(n,))\n\n# \u751f\u6210\u68c0\u6d4b\u7ed3\u679c\nk3, k4 = jax.random.split(k2)\n# \u7075\u654f\u5ea6\uff1aP(+|D) = 0.95\uff0c\u7279\u5f02\u5ea6\uff1aP(-|D') = 0.90\ntest_positive = jnp.where(\n has_disease,\n jax.random.bernoulli(k3, p=0.95, shape=(n,)),\n jax.random.bernoulli(k4, p=0.10, shape=(n,))\n)\n\n# \u5728\u68c0\u6d4b\u9633\u6027\u7684\u4eba\u7fa4\u4e2d\uff0c\u5b9e\u9645\u60a3\u75c5\u7684\u6bd4\u4f8b\u662f\u591a\u5c11\uff1f\npositives = test_positive.astype(bool)\ntrue_positives = (has_disease & positives).sum()\ntotal_positives = positives.sum()\n\nprint(f\"\u68c0\u6d4b\u9633\u6027\u603b\u4eba\u6570: {total_positives}\")\nprint(f\"\u771f\u9633\u6027\u4eba\u6570: {true_positives}\")\nprint(f\"P(\u60a3\u75c5 | \u9633\u6027) = {true_positives / total_positives:.4f}\")\nprint(f\"\u8d1d\u53f6\u65af\u516c\u5f0f: {0.95 * 0.01 / 0.1085:.4f}\")\n \u901a\u8fc7\u6a21\u62df\u9a8c\u8bc1\u52a0\u6cd5\u6cd5\u5219\u3002\u751f\u6210\u5177\u6709\u5df2\u77e5\u6982\u7387\u548c\u91cd\u53e0\u7a0b\u5ea6\u7684\u968f\u673a\u4e8b\u4ef6 A \u548c B\uff0c\u7136\u540e\u9a8c\u8bc1 \\(P(A \\cup B) = P(A) + P(B) - P(A \\cap B)\\)\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(0)\nn = 200_000\nk1, k2 = jax.random.split(key)\n\n# \u4e8b\u4ef6\uff1aA = \u503c < 0.4\uff0cB = \u503c < 0.6\uff08\u5728 < 0.4 \u5904\u91cd\u53e0\uff09\nvals_a = jax.random.uniform(k1, shape=(n,))\nvals_b = jax.random.uniform(k2, shape=(n,))\n\nA = vals_a < 0.4\nB = vals_b < 0.6\n\np_a = A.mean()\np_b = B.mean()\np_a_and_b = (A & B).mean()\np_a_or_b = (A | B).mean()\n\nprint(f\"P(A) = {p_a:.4f}\")\nprint(f\"P(B) = {p_b:.4f}\")\nprint(f\"P(A \u2229 B) = {p_a_and_b:.4f}\")\nprint(f\"P(A \u222a B) \u6a21\u62df\u503c = {p_a_or_b:.4f}\")\nprint(f\"P(A) + P(B) - P(A\u2229B) = {p_a + p_b - p_a_and_b:.4f}\")\n \u6f14\u793a\u6761\u4ef6\u6982\u7387\u968f\u8bc1\u636e\u53d8\u5316\u3002\u6a21\u62df\u63b7\u4e24\u4e2a\u9ab0\u5b50\uff0c\u8ba1\u7b97 \\(P(\\text{\u548c} = 7)\\)\uff0c\u7136\u540e\u8ba1\u7b97 \\(P(\\text{\u548c} = 7 | \\text{\u7b2c\u4e00\u4e2a\u9ab0\u5b50} = 3)\\)\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(1)\nn = 500_000\nk1, k2 = jax.random.split(key)\n\nd1 = jax.random.randint(k1, shape=(n,), minval=1, maxval=7)\nd2 = jax.random.randint(k2, shape=(n,), minval=1, maxval=7)\ntotal = d1 + d2\n\n# \u65e0\u6761\u4ef6\u6982\u7387\np_sum7 = (total == 7).mean()\nprint(f\"P(\u548c=7) = {p_sum7:.4f} (\u7cbe\u786e\u503c: {6/36:.4f})\")\n\n# \u6761\u4ef6\u4e8e\u7b2c\u4e00\u4e2a\u9ab0\u5b50 = 3\nmask = d1 == 3\np_sum7_given_d1_3 = (total[mask] == 7).mean()\nprint(f\"P(\u548c=7 | d1=3) = {p_sum7_given_d1_3:.4f} (\u7cbe\u786e\u503c: {1/6:.4f})\")\n \u5c06\u8d1d\u53f6\u65af\u5b9a\u7406\u5b9e\u73b0\u4e3a\u4e00\u4e2a\u51fd\u6570\uff0c\u5e76\u7528\u5b83\u8fed\u4ee3\u66f4\u65b0\u4fe1\u5ff5\u3002\u4ece\u786c\u5e01\u504f\u5411\u7684\u5747\u5300\u5148\u9a8c\u5f00\u59cb\uff0c\u5728\u89c2\u5bdf\u5230\u6bcf\u6b21\u629b\u63b7\u540e\u66f4\u65b0\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef bayes_update(prior, likelihood):\n \"\"\"\u5c06\u5148\u9a8c\u4e58\u4ee5\u4f3c\u7136\u5e76\u5f52\u4e00\u5316\u3002\"\"\"\n posterior = prior * likelihood\n return posterior / posterior.sum()\n\n# \u79bb\u6563\u5316\u53ef\u80fd\u7684\u504f\u5411\u503c\ntheta = jnp.linspace(0, 1, 200)\nprior = jnp.ones_like(theta) # \u5747\u5300\u5148\u9a8c\nprior = prior / prior.sum()\n\n# \u89c2\u6d4b\u5230\u7684\u629b\u63b7\u7ed3\u679c\uff1a1=\u6b63\u9762\uff0c0=\u53cd\u9762\nflips = [1, 1, 0, 1, 1, 1, 0, 1, 0, 1]\n\nplt.figure(figsize=(10, 5))\nplt.plot(theta, prior, \"--\", color=\"#999\", label=\"\u5148\u9a8c\")\n\nfor i, flip in enumerate(flips):\n likelihood = theta if flip == 1 else (1 - theta)\n prior = bayes_update(prior, likelihood)\n if i in [0, 2, 4, 9]:\n plt.plot(theta, prior, label=f\"\u7ecf\u8fc7 {i+1} \u6b21\u629b\u63b7\u540e\", linewidth=2)\n\nplt.xlabel(\"\u786c\u5e01\u504f\u5411 \u03b8\")\nplt.ylabel(\"\u4fe1\u5ff5\uff08\u5f52\u4e00\u5316\uff09\")\nplt.title(\"\u8d1d\u53f6\u65af\u66f4\u65b0\uff1a\u5173\u4e8e\u786c\u5e01\u504f\u5411\u7684\u4fe1\u5ff5\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n \u6982\u7387\u5206\u5e03\u63cf\u8ff0\u4e86\u968f\u673a\u7ed3\u679c\u5982\u4f55\u5728\u53ef\u80fd\u53d6\u503c\u4e0a\u5206\u5e03\u3002\u672c\u6587\u6863\u6574\u7406\u4e86\u5173\u952e\u7684\u79bb\u6563\u548c\u8fde\u7eed\u5206\u5e03\uff1a\u4f2f\u52aa\u5229\u5206\u5e03\u3001\u4e8c\u9879\u5206\u5e03\u3001\u6cca\u677e\u5206\u5e03\u3001\u9ad8\u65af\u5206\u5e03\u3001\u6307\u6570\u5206\u5e03\u3001\u8d1d\u5854\u5206\u5e03\u7b49\uff0c\u7ed9\u51fa\u4e86\u5404\u81ea\u7684\u516c\u5f0f\u3001\u76f4\u89c2\u7406\u89e3\u53ca\u5176\u5728\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u5e94\u7528\uff08\u635f\u5931\u51fd\u6570\u3001\u5148\u9a8c\u3001\u566a\u58f0\u6a21\u578b\uff09\u3002
\u5728\u7b2c4\u7ae0\u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86\u968f\u673a\u53d8\u91cf\u3001PMF\u3001PDF\u548cCDF\u3002\u672c\u7ae0\u5217\u51fa\u4f60\u5728\u673a\u5668\u5b66\u4e60\u548c\u7edf\u8ba1\u5b66\u4e2d\u6700\u5e38\u9047\u5230\u7684\u91cd\u8981\u6982\u7387\u5206\u5e03\uff0c\u7ed9\u51fa\u6bcf\u4e2a\u5206\u5e03\u7684\u76f4\u89c2\u7406\u89e3\u3001\u516c\u5f0f\u3001\u5747\u503c\u548c\u65b9\u5dee\u3002
\u4e09\u79cd\u6838\u5fc3\u51fd\u6570\u7684\u5feb\u901f\u56de\u987e\uff08\u5b8c\u6574\u5b9a\u4e49\u89c1\u7b2c4\u7ae0\uff09\uff1a
\u5206\u5e03\u7684\u652f\u6491\u96c6\u662f\u6307PMF\u6216PDF\u53d6\u6b63\u503c\u7684\u96c6\u5408\u3002\u5bf9\u63b7\u9ab0\u5b50\u800c\u8a00\uff0c\u652f\u6491\u96c6\u4e3a \\(\\{1,2,3,4,5,6\\}\\)\u3002\u5bf9\u6b63\u6001\u5206\u5e03\u800c\u8a00\uff0c\u652f\u6491\u96c6\u4e3a\u5168\u4f53\u5b9e\u6570 \\((-\\infty, \\infty)\\)\u3002
\u5206\u5e03\u6e05\u6670\u5730\u5206\u4e3a\u4e24\u4e2a\u5bb6\u65cf\uff1a\u79bb\u6563\u5206\u5e03\uff08\u7ed3\u679c\u53ef\u6570\uff0c\u4f7f\u7528PMF\uff09\u548c\u8fde\u7eed\u5206\u5e03\uff08\u7ed3\u679c\u4e0d\u53ef\u6570\uff0c\u4f7f\u7528PDF\uff09\u3002
\u4f2f\u52aa\u5229\u5206\u5e03\uff1a\u6700\u7b80\u5355\u7684\u5206\u5e03\u3002\u5355\u6b21\u8bd5\u9a8c\u6709\u4e24\u79cd\u7ed3\u679c\uff1a\u6210\u529f\uff081\uff09\u7684\u6982\u7387\u4e3a \\(p\\)\uff0c\u5931\u8d25\uff080\uff09\u7684\u6982\u7387\u4e3a \\(1-p\\)\u3002
\u5747\u503c\uff1a\\(E[X] = p\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = p(1-p)\\)\u3002
\u6bcf\u4e00\u6b21\u629b\u786c\u5e01\u3001\u6bcf\u4e00\u4e2a\u662f/\u5426\u5206\u7c7b\u3001\u6bcf\u4e00\u4e2a\u4e8c\u5143\u7ed3\u679c\u90fd\u662f\u4f2f\u52aa\u5229\u8bd5\u9a8c\u3002\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0csigmoid\u51fd\u6570\u7684\u8f93\u51fa\u6b63\u662f\u4f2f\u52aa\u5229\u5206\u5e03\u7684\u53c2\u6570 \\(p\\)\u3002
\u4e8c\u9879\u5206\u5e03\uff1a\u8ba1\u7b97 \\(n\\) \u6b21\u72ec\u7acb\u4f2f\u52aa\u5229\u8bd5\u9a8c\u4e2d\u6210\u529f\u7684\u6b21\u6570\uff0c\u6bcf\u6b21\u8bd5\u9a8c\u7684\u6210\u529f\u6982\u7387 \\(p\\) \u76f8\u540c\u3002
\u4e8c\u9879\u5f0f\u7cfb\u6570 \\(\\binom{n}{k}\\)\uff08\u89c1\u6587\u4ef601\uff09\u8ba1\u7b97\u4e86 \\(k\\) \u6b21\u6210\u529f\u5728 \\(n\\) \u6b21\u8bd5\u9a8c\u4e2d\u7684\u6392\u5217\u65b9\u5f0f\u6570\u91cf\u3002
\u5747\u503c\uff1a\\(E[X] = np\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = np(1-p)\\)\u3002
\u793a\u4f8b\uff1a\u629b\u4e00\u679a\u6709\u504f\u786c\u5e01\uff08\\(p = 0.7\\)\uff09\u516b\u6b21\u3002\u6070\u597d\u5f97\u52306\u6b21\u6b63\u9762\u7684\u6982\u7387\u4e3a \\(\\binom{8}{6}(0.7)^6(0.3)^2 = 28 \\times 0.1176 \\times 0.09 \\approx 0.296\\)\u3002
\u6cca\u677e\u5206\u5e03\uff1a\u5728\u56fa\u5b9a\u7684\u65f6\u95f4\u6216\u7a7a\u95f4\u533a\u95f4\u5185\uff0c\u4ee5\u5df2\u77e5\u7684\u5e73\u5747\u901f\u7387 \\(\\lambda\\) \u8ba1\u7b97\u4e8b\u4ef6\u53d1\u751f\u7684\u6b21\u6570\u3002\u9002\u7528\u4e8e\u4e8b\u4ef6\u7a00\u5c11\u4e14\u76f8\u4e92\u72ec\u7acb\u7684\u60c5\u5f62\u3002
\u5747\u503c\uff1a\\(E[X] = \\lambda\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = \\lambda\\)\u3002\u5747\u503c\u7b49\u4e8e\u65b9\u5dee\u662f\u5176\u6807\u5fd7\u6027\u7279\u5f81\u3002
\u793a\u4f8b\uff1a\u6bcf\u5c0f\u65f6\u6536\u5230\u7684\u90ae\u4ef6\u6570\uff08\\(\\lambda = 5\\)\uff09\u3001\u6bcf\u9875\u7684\u9519\u522b\u5b57\u6570\u3001\u6bcf\u79d2\u7684\u670d\u52a1\u5668\u8bf7\u6c42\u6570\u3002\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u6cca\u677e\u56de\u5f52\u7528\u4e8e\u5efa\u6a21\u8ba1\u6570\u6570\u636e\uff0c\u800c\u7ebf\u6027\u6a21\u578b\u53ef\u80fd\u4f1a\u9884\u6d4b\u51fa\u8d1f\u7684\u8ba1\u6570\u503c\u3002
\u5f53 \\(n \\to \\infty\\) \u4e14 \\(p \\to 0\\)\uff0c\u4e14 \\(np = \\lambda\\) \u4fdd\u6301\u4e0d\u53d8\u65f6\uff0c\u4e8c\u9879\u5206\u5e03 Binomial\\((n,p)\\) \u6536\u655b\u4e8e\u6cca\u677e\u5206\u5e03 Poisson\\((\\lambda)\\)\u3002\u8fd9\u5c31\u662f\u6cca\u677e\u5206\u5e03\u9002\u7528\u4e8e\u5927\u603b\u4f53\u4e2d\u7a00\u6709\u4e8b\u4ef6\u7684\u539f\u56e0\u3002
\u51e0\u4f55\u5206\u5e03\uff1a\u8ba1\u7b97\u76f4\u5230\u9996\u6b21\u6210\u529f\u6240\u9700\u7684\u8bd5\u9a8c\u6b21\u6570\u3002\"\u6211\u8981\u629b\u591a\u5c11\u6b21\u786c\u5e01\u624d\u80fd\u7b2c\u4e00\u6b21\u5f97\u5230\u6b63\u9762\uff1f\"
\u5747\u503c\uff1a\\(E[X] = 1/p\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = (1-p)/p^2\\)\u3002
\u51e0\u4f55\u5206\u5e03\u5177\u6709\u65e0\u8bb0\u5fc6\u6027\uff1a\u518d\u7b49\u5f85 \\(k\\) \u6b21\u8bd5\u9a8c\u624d\u6210\u529f\u7684\u6982\u7387\u4e0e\u4f60\u5df2\u7ecf\u7b49\u5f85\u4e86\u591a\u5c11\u6b21\u8bd5\u9a8c\u65e0\u5173\u3002\u8fd9\u4f7f\u5f97\u5b83\u5728\u79bb\u6563\u5206\u5e03\u4e2d\u975e\u5e38\u7279\u6b8a\u3002
\u8d1f\u4e8c\u9879\u5206\u5e03\uff1a\u63a8\u5e7f\u4e86\u51e0\u4f55\u5206\u5e03\uff0c\u8ba1\u7b97\u76f4\u5230\u7b2c \\(r\\) \u6b21\u6210\u529f\u6240\u9700\u7684\u8bd5\u9a8c\u6b21\u6570\uff08\u51e0\u4f55\u5206\u5e03\u662f \\(r=1\\) \u7684\u7279\u6b8a\u60c5\u5f62\uff09\u3002
\u5747\u503c\uff1a\\(E[X] = r/p\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = r(1-p)/p^2\\)\u3002
\u8d1f\u4e8c\u9879\u5206\u5e03\u5728\u5b9e\u8df5\u4e2d\u4e5f\u7528\u4e8e\u5efa\u6a21\u8fc7\u5ea6\u79bb\u6563\u7684\u8ba1\u6570\u6570\u636e\uff08\u65b9\u5dee\u8d85\u8fc7\u5747\u503c\u7684\u60c5\u5f62\uff09\uff0c\u8fd9\u662f\u6cca\u677e\u5206\u5e03\u65e0\u6cd5\u5904\u7406\u7684\u3002
\u63a5\u4e0b\u6765\u6211\u4eec\u8fdb\u5165\u8fde\u7eed\u5206\u5e03\u3002
\u5747\u5300\u5206\u5e03\uff1a\u533a\u95f4 \\([a, b]\\) \u5185\u7684\u6240\u6709\u503c\u7b49\u53ef\u80fd\u3002\u5176PDF\u662f\u4e00\u4e2a\u5e73\u5766\u7684\u77e9\u5f62\u3002
\u5747\u503c\uff1a\\(E[X] = \\frac{a+b}{2}\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = \\frac{(b-a)^2}{12}\\)\u3002
\u968f\u673a\u6570\u751f\u6210\u5668\u4ee5\u751f\u6210\u5747\u5300\u5206\u5e03 Uniform(0,1) \u6837\u672c\u4e3a\u8d77\u70b9\u3002\u5176\u4ed6\u5206\u5e03\u901a\u8fc7\u5bf9\u8fd9\u4e9b\u5747\u5300\u6837\u672c\u8fdb\u884c\u53d8\u6362\u5f97\u5230\u3002
\u6b63\u6001\uff08\u9ad8\u65af\uff09\u5206\u5e03\uff1a\u7edf\u8ba1\u5b66\u4e2d\u6700\u91cd\u8981\u7684\u5206\u5e03\u3002\u5b83\u7531\u4e2d\u5fc3\u6781\u9650\u5b9a\u7406\uff08\u89c1\u7b2c4\u7ae0\uff09\u81ea\u7136\u5bfc\u51fa\uff1a\u5927\u91cf\u72ec\u7acb\u968f\u673a\u53d8\u91cf\u7684\u5e73\u5747\u503c\u8d8b\u4e8e\u6b63\u6001\u5206\u5e03\uff0c\u65e0\u8bba\u539f\u59cb\u5206\u5e03\u662f\u4ec0\u4e48\u3002
\u5747\u503c\uff1a\\(E[X] = \\mu\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = \\sigma^2\\)\u3002
\u6807\u51c6\u6b63\u6001\u5206\u5e03\u7684 \\(\\mu = 0\\) \u4e14 \\(\\sigma = 1\\)\u3002\u4efb\u610f\u6b63\u6001\u53d8\u91cf \\(X\\) \u53ef\u901a\u8fc7 \\(Z = (X - \\mu)/\\sigma\\) \u6807\u51c6\u5316\u4e3a\u6807\u51c6\u6b63\u6001\u53d8\u91cf \\(Z\\)\u3002
\u7ecf\u9a8c\u6cd5\u5219\uff0868-95-99.7\u6cd5\u5219\uff09\u6307\u51fa\uff1a
\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u6b63\u6001\u5206\u5e03\u65e0\u5904\u4e0d\u5728\uff1a\u6743\u91cd\u521d\u59cb\u5316\u3001\u6570\u636e\u589e\u5f3a\u4e2d\u7684\u566a\u58f0\u3001MSE\u635f\u5931\u80cc\u540e\u7684\u5047\u8bbe\uff08\u5176\u9690\u542b\u5047\u8bbe\u9ad8\u65af\u8bef\u5dee\uff09\u3001\u4ee5\u53ca\u53d8\u5206\u81ea\u7f16\u7801\u5668\u4e2d\u7684\u91cd\u53c2\u6570\u5316\u6280\u5de7\u3002
\u6307\u6570\u5206\u5e03\uff1a\u6a21\u62df\u6cca\u677e\u8fc7\u7a0b\u4e2d\u4e8b\u4ef6\u4e4b\u95f4\u7684\u65f6\u95f4\u95f4\u9694\u3002\u5982\u679c\u4e8b\u4ef6\u4ee5\u901f\u7387 \\(\\lambda\\) \u5230\u8fbe\uff0c\u5219\u5b83\u4eec\u4e4b\u95f4\u7684\u7b49\u5f85\u65f6\u95f4\u670d\u4ece\u6307\u6570\u5206\u5e03 Exponential\\((\\lambda)\\)\u3002
\u5747\u503c\uff1a\\(E[X] = 1/\\lambda\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = 1/\\lambda^2\\)\u3002
\u4e0e\u79bb\u6563\u53d8\u91cf\u4e2d\u7684\u51e0\u4f55\u5206\u5e03\u7c7b\u4f3c\uff0c\u6307\u6570\u5206\u5e03\u4e5f\u5177\u6709\u65e0\u8bb0\u5fc6\u6027\uff1a\\(P(X > s + t | X > s) = P(X > t)\\)\u3002\u518d\u7b49\u5f85 \\(t\\) \u4e2a\u65f6\u95f4\u5355\u4f4d\u7684\u6982\u7387\u4e0e\u4f60\u5df2\u7ecf\u7b49\u5f85\u4e86\u591a\u957f\u65f6\u95f4\u65e0\u5173\u3002
\u4f3d\u9a6c\u5206\u5e03\uff1a\u63a8\u5e7f\u4e86\u6307\u6570\u5206\u5e03\u3002\u5b83\u6a21\u62df\u6cca\u677e\u8fc7\u7a0b\u4e2d\u7b2c \\(\\alpha\\) \u4e2a\u4e8b\u4ef6\u53d1\u751f\u7684\u65f6\u95f4\uff08\u6307\u6570\u5206\u5e03\u662f \\(\\alpha = 1\\) \u7684\u7279\u6b8a\u60c5\u5f62\uff09\u3002
\u8fd9\u91cc \\(\\alpha\\)\uff08\u5f62\u72b6\u53c2\u6570\uff09\u63a7\u5236\u5f62\u72b6\uff0c\\(\\beta\\)\uff08\u901f\u7387\u53c2\u6570\uff09\u63a7\u5236\u5c3a\u5ea6\u3002\\(\\Gamma(\\alpha)\\) \u662f\u4f3d\u9a6c\u51fd\u6570\uff0c\u5b83\u5c06\u9636\u4e58\u63a8\u5e7f\u5230\u5b9e\u6570\uff1a\u5bf9\u6b63\u6574\u6570 \\(n\\) \u6709 \\(\\Gamma(n) = (n-1)!\\)\u3002
\u5747\u503c\uff1a\\(E[X] = \\alpha/\\beta\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = \\alpha/\\beta^2\\)\u3002
\u8d1d\u5854\u5206\u5e03\uff1a\u5b9a\u4e49\u5728\u533a\u95f4 \\([0, 1]\\) \u4e0a\uff0c\u975e\u5e38\u9002\u5408\u5bf9\u6982\u7387\u3001\u6bd4\u4f8b\u548c\u6bd4\u7387\u8fdb\u884c\u5efa\u6a21\u3002
\u5206\u6bcd \\(B(\\alpha, \\beta) = \\frac{\\Gamma(\\alpha)\\Gamma(\\beta)}{\\Gamma(\\alpha + \\beta)}\\) \u662f\u8d1d\u5854\u51fd\u6570\uff0c\u8d77\u5230\u5f52\u4e00\u5316\u5e38\u6570\u7684\u4f5c\u7528\u3002
\u5747\u503c\uff1a\\(E[X] = \\frac{\\alpha}{\\alpha + \\beta}\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = \\frac{\\alpha\\beta}{(\\alpha+\\beta)^2(\\alpha+\\beta+1)}\\)\u3002
\u8d1d\u5854\u5206\u5e03\u662f\u4f2f\u52aa\u5229\u548c\u4e8c\u9879\u4f3c\u7136\u51fd\u6570\u7684\u5171\u8f6d\u5148\u9a8c\u3002\u8fd9\u610f\u5473\u7740\u5982\u679c\u5148\u9a8c\u662f\u8d1d\u5854\u5206\u5e03\u4e14\u6570\u636e\u670d\u4ece\u4f2f\u52aa\u5229\u5206\u5e03\uff0c\u5219\u540e\u9a8c\u4e5f\u662f\u8d1d\u5854\u5206\u5e03\uff0c\u8fd9\u4f7f\u5f97\u8d1d\u53f6\u65af\u66f4\u65b0\u5728\u89e3\u6790\u4e0a\u6613\u4e8e\u5904\u7406\u3002\u6211\u4eec\u5c06\u5728\u6587\u4ef604\u4e2d\u4f7f\u7528\u8fd9\u4e00\u6027\u8d28\u3002
\u5747\u503c\uff1a\\(E[X] = k\\)\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = 2k\\)\u3002
\\(\\chi^2\\) \u5206\u5e03\u5b9e\u9645\u4e0a\u662f\u4f3d\u9a6c\u5206\u5e03\u7684\u7279\u6b8a\u60c5\u5f62\uff0c\u5176\u4e2d \\(\\alpha = k/2\\) \u4e14 \\(\\beta = 1/2\\)\u3002\u5b83\u51fa\u73b0\u5728\u5047\u8bbe\u68c0\u9a8c\uff08\u7b2c4\u7ae0\u4e2d\u7684\u5361\u65b9\u68c0\u9a8c\uff09\u3001\u62df\u5408\u4f18\u5ea6\u68c0\u9a8c\u4ee5\u53ca\u65b9\u5dee\u7f6e\u4fe1\u533a\u95f4\u7684\u8ba1\u7b97\u4e2d\u3002
\u5b66\u751ft\u5206\u5e03\uff1a\u5f62\u72b6\u7c7b\u4f3c\u4e8e\u6b63\u6001\u5206\u5e03\u4f46\u5c3e\u90e8\u66f4\u91cd\u3002\u5f53\u4f60\u4f7f\u7528\u5c0f\u6837\u672c\u4e14\u603b\u4f53\u65b9\u5dee\u672a\u77e5\u65f6\uff0c\u5bf9\u6b63\u6001\u5206\u5e03\u603b\u4f53\u7684\u5747\u503c\u8fdb\u884c\u4f30\u8ba1\u65f6\u5c31\u4f1a\u51fa\u73b0t\u5206\u5e03\u3002
\u53c2\u6570 \\(\\nu\\)\uff08\u81ea\u7531\u5ea6\uff09\u3002\u5f53 \\(\\nu \\to \\infty\\) \u65f6\uff0ct\u5206\u5e03\u6536\u655b\u4e8e\u6807\u51c6\u6b63\u6001\u5206\u5e03\u3002\u5f53 \\(\\nu\\) \u8f83\u5c0f\u65f6\uff0c\u66f4\u91cd\u7684\u5c3e\u90e8\u8d4b\u4e88\u6781\u7aef\u503c\u66f4\u9ad8\u7684\u6982\u7387\uff0c\u53cd\u6620\u4e86\u5c0f\u6837\u672c\u5e26\u6765\u7684\u989d\u5916\u4e0d\u786e\u5b9a\u6027\u3002
\u5747\u503c\uff1a\\(E[X] = 0\\)\uff08\u5f53 \\(\\nu > 1\\) \u65f6\uff09\u3002\u65b9\u5dee\uff1a\\(\\text{Var}(X) = \\frac{\\nu}{\\nu - 2}\\)\uff08\u5f53 \\(\\nu > 2\\) \u65f6\uff09\u3002
t\u5206\u5e03\u7528\u4e8et\u68c0\u9a8c\uff08\u7b2c4\u7ae0\uff09\uff0c\u5e76\u51fa\u73b0\u5728\u8d1d\u53f6\u65af\u63a8\u65ad\u4e2d\uff0c\u4f5c\u4e3a\u5728\u79ef\u5206\u6d88\u53bb\u672a\u77e5\u65b9\u5dee\u65f6\u7684\u8fb9\u7f18\u5206\u5e03\u3002
\u5173\u952e\u5206\u5e03\u603b\u7ed3\uff1a
\u7ed8\u5236 \\(n=20\\) \u65f6\u4e8c\u9879\u5206\u5e03PMF\u5728\u4e0d\u540c \\(p\\) \u53d6\u503c\u4e0b\u7684\u56fe\u50cf\u3002\u89c2\u5bdf\u5f62\u72b6\u5982\u4f55\u4ece\u5de6\u504f\u53d8\u4e3a\u5bf9\u79f0\u518d\u53d8\u4e3a\u53f3\u504f\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom math import comb\n\nn = 20\nks = jnp.arange(0, n + 1)\n\nfig, axes = plt.subplots(1, 3, figsize=(12, 4), sharey=True)\nfor ax, p, color in zip(axes, [0.2, 0.5, 0.8], [\"#e74c3c\", \"#3498db\", \"#27ae60\"]):\n pmf = jnp.array([comb(n, int(k)) * p**k * (1-p)**(n-k) for k in ks])\n ax.bar(ks, pmf, color=color, alpha=0.7)\n ax.set_title(f\"Binomial(n={n}, p={p})\")\n ax.set_xlabel(\"k\")\naxes[0].set_ylabel(\"P(X = k)\")\nplt.tight_layout()\nplt.show()\n \u9a8c\u8bc1\u6cca\u677e\u5206\u5e03\u5bf9\u4e8c\u9879\u5206\u5e03\u7684\u8fd1\u4f3c\u3002\u8bbe \\(n = 1000\\)\uff0c\\(p = 0.003\\)\uff0c\u6bd4\u8f83\u4e8c\u9879\u5206\u5e03 Binomial\\((n, p)\\) \u548c\u6cca\u677e\u5206\u5e03 Poisson\\((\\lambda = np)\\)\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom math import comb, factorial, exp\n\nn, p = 1000, 0.003\nlam = n * p\nks = jnp.arange(0, 15)\n\nbinom_pmf = jnp.array([comb(n, int(k)) * p**k * (1-p)**(n-k) for k in ks])\npoisson_pmf = jnp.array([lam**k * exp(-lam) / factorial(int(k)) for k in ks])\n\nplt.figure(figsize=(8, 4))\nplt.bar(ks - 0.15, binom_pmf, width=0.3, color=\"#3498db\", alpha=0.7, label=f\"Binomial({n},{p})\")\nplt.bar(ks + 0.15, poisson_pmf, width=0.3, color=\"#e74c3c\", alpha=0.7, label=f\"Poisson({lam})\")\nplt.xlabel(\"k\")\nplt.ylabel(\"P(X = k)\")\nplt.title(\"\u6cca\u677e\u5206\u5e03\u5bf9\u4e8c\u9879\u5206\u5e03\u7684\u8fd1\u4f3c\")\nplt.legend()\nplt.show()\n \u4ece\u6b63\u6001\u5206\u5e03\u4e2d\u91c7\u6837\u5e76\u9a8c\u8bc1\u7ecf\u9a8c\u6cd5\u5219\u3002\u8ba1\u7b97\u843d\u57281\u30012\u548c3\u4e2a\u6807\u51c6\u5dee\u5185\u7684\u6837\u672c\u6bd4\u4f8b\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(42)\nmu, sigma = 5.0, 2.0\nsamples = mu + sigma * jax.random.normal(key, shape=(100_000,))\n\nfor k in [1, 2, 3]:\n within = jnp.abs(samples - mu) <= k * sigma\n print(f\"Within {k}\u03c3: {within.mean():.4f} (expected: {[0.6827, 0.9545, 0.9973][k-1]:.4f})\")\n \u901a\u8fc7\u6539\u53d8 \\(\\alpha\\) \u548c \\(\\beta\\) \u63a2\u7d22\u8d1d\u5854\u5206\u5e03\u3002\u7ed8\u5236\u51e0\u79cd\u5f62\u72b6\uff0c\u89c2\u5bdf\u5206\u5e03\u5982\u4f55\u4ece\u5747\u5300\u53d8\u4e3a\u504f\u659c\u518d\u53d8\u4e3a\u96c6\u4e2d\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nx = jnp.linspace(0.01, 0.99, 200)\n\ndef beta_pdf(x, a, b):\n # \u672a\u5f52\u4e00\u5316\uff0c\u7528\u4e8e\u5f62\u72b6\u6bd4\u8f83\n return x**(a-1) * (1-x)**(b-1)\n\nplt.figure(figsize=(10, 5))\nparams = [(1,1,\"\u5747\u5300\"), (2,5,\"\u5de6\u504f\"), (5,2,\"\u53f3\u504f\"),\n (5,5,\"\u5bf9\u79f0\"), (0.5,0.5,\"U\u5f62\")]\ncolors = [\"#999\", \"#e74c3c\", \"#3498db\", \"#27ae60\", \"#9b59b6\"]\n\nfor (a, b, label), color in zip(params, colors):\n y = beta_pdf(x, a, b)\n y = y / jnp.trapezoid(y, x) # \u5f52\u4e00\u5316\n plt.plot(x, y, label=f\"\u03b1={a}, \u03b2={b} ({label})\", color=color, linewidth=2)\n\nplt.xlabel(\"x\")\nplt.ylabel(\"\u5bc6\u5ea6\")\nplt.title(\"\u8d1d\u5854\u5206\u5e03\u5f62\u72b6\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n \u8d1d\u53f6\u65af\u65b9\u6cd5\u5c06\u5148\u9a8c\u4fe1\u5ff5\u4e0e\u89c2\u6d4b\u6570\u636e\u76f8\u7ed3\u5408\uff0c\u751f\u6210\u6a21\u578b\u53c2\u6570\u7684\u540e\u9a8c\u5206\u5e03\u3002\u672c\u6587\u6db5\u76d6\u6700\u5927\u4f3c\u7136\u4f30\u8ba1\u3001\u6700\u5927\u540e\u9a8c\u4f30\u8ba1\u3001\u5171\u8f6d\u5148\u9a8c\u3001\u8d1d\u53f6\u65af\u63a8\u65ad\u3001\u9690\u9a6c\u5c14\u53ef\u592b\u6a21\u578b\u548cEM\u7b97\u6cd5\u2014\u2014\u8fd9\u4e9b\u6280\u672f\u662f\u5783\u573e\u90ae\u4ef6\u8fc7\u6ee4\u5668\u3001\u8bed\u8a00\u6a21\u578b\u548c\u4e0d\u786e\u5b9a\u6027\u611f\u77e5\u673a\u5668\u5b66\u4e60\u7684\u57fa\u7840\u3002
\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86\u5404\u79cd\u5206\u5e03\u4ee5\u53ca\u5982\u4f55\u8ba1\u7b97\u6982\u7387\u3002\u73b0\u5728\u6211\u4eec\u6765\u5904\u7406\u673a\u5668\u5b66\u4e60\u7684\u6838\u5fc3\u95ee\u9898\uff1a\u7ed9\u5b9a\u89c2\u6d4b\u6570\u636e\uff0c\u5982\u4f55\u627e\u5230\u6a21\u578b\u7684\u6700\u4f73\u53c2\u6570\uff1f
\u6700\u5927\u4f3c\u7136\u4f30\u8ba1 (MLE) \u76f4\u63a5\u56de\u7b54\u4e86\u8fd9\u4e2a\u95ee\u9898\uff1a\u9009\u62e9\u4f7f\u89c2\u6d4b\u6570\u636e\u6982\u7387\u6700\u5927\u7684\u53c2\u6570\u503c\u3002
\u5f62\u5f0f\u4e0a\uff0c\u7ed9\u5b9a\u6570\u636e \\(D = \\{x_1, x_2, \\ldots, x_n\\}\\) \u548c\u5e26\u6709\u53c2\u6570 \\(\\theta\\) \u7684\u6a21\u578b\uff0c\u4f3c\u7136\u51fd\u6570\u4e3a\uff1a
\u7531\u4e8e \\(\\log\\) \u662f\u5355\u8c03\u9012\u589e\u51fd\u6570\uff0c\u4f7f\u5f97 \\(\\ell(\\theta)\\) \u6700\u5927\u7684 \\(\\theta\\) \u4e5f\u540c\u6837\u4f7f\u5f97 \\(L(\\theta)\\) \u6700\u5927\u3002
\u629b\u786c\u5e01\u793a\u4f8b\uff1a\u4f60\u629b\u4e00\u679a\u786c\u5e0110\u6b21\uff0c\u5f97\u52307\u6b21\u6b63\u9762\u3002\u786c\u5e01\u504f\u7f6e \\(p\\)\uff08\u6b63\u9762\u6982\u7387\uff09\u7684MLE\u4f30\u8ba1\u662f\u591a\u5c11\uff1f
\u6bcf\u6b21\u629b\u63b7\u670d\u4ece Bernoulli(\\(p\\))\uff0c\u56e0\u6b6410\u6b21\u629b\u63b7\u4e2d\u51fa\u73b07\u6b21\u6b63\u9762\u7684\u4f3c\u7136\u4e3a\uff1a
\u53d6\u5bf9\u6570\u5e76\u6c42\u5bfc\uff1a\\(\\frac{d\\ell}{dp} = \\frac{7}{p} - \\frac{3}{1-p} = 0\\)\uff0c\u89e3\u5f97 \\(\\hat{p}_{\\text{MLE}} = 7/10 = 0.7\\)\u3002
MLE\u76f4\u89c2\u4e14\u7b80\u5355\u3002\u5982\u679c10\u6b21\u629b\u63b7\u4e2d\u5f97\u52307\u6b21\u6b63\u9762\uff0c\u6700\u53ef\u80fd\u7684\u504f\u7f6e\u662f0.7\u3002\u4f46\u6ce8\u610f\u4e00\u4e2a\u95ee\u9898\uff1a\u5982\u679c10\u6b21\u629b\u63b7\u4e2d\u5f97\u523010\u6b21\u6b63\u9762\uff0cMLE\u4f1a\u5f97\u51fa \\(\\hat{p} = 1\\)\uff0c\u610f\u5473\u7740\u786c\u5e01\u5c06\u6c38\u8fdc\u6b63\u9762\u671d\u4e0a\u3002\u4ec5\u51ed10\u6b21\u89c2\u6d4b\u5c31\u5f97\u51fa\u8fd9\u6837\u7684\u7ed3\u8bba\u4f3c\u4e4e\u8fc7\u4e8e\u81ea\u4fe1\u3002
\u6700\u5927\u540e\u9a8c\u4f30\u8ba1 (MAP) \u901a\u8fc7\u52a0\u5165\u5148\u9a8c\u4fe1\u5ff5\u6765\u4fee\u590d\u8fd9\u4e2a\u95ee\u9898\u3002MAP\u4e0d\u662f\u4ec5\u6700\u5927\u5316\u4f3c\u7136\uff0c\u800c\u662f\u6700\u5927\u5316\u540e\u9a8c\uff1a
\u6211\u4eec\u7701\u7565\u4e86\u5206\u6bcd \\(P(D)\\)\uff0c\u56e0\u4e3a\u5b83\u4e0d\u4f9d\u8d56\u4e8e \\(\\theta\\)\uff0c\u4e0d\u5f71\u54cdargmax\u7684\u7ed3\u679c\u3002
\u5148\u9a8c \\(P(\\theta)\\) \u7f16\u7801\u4e86\u6211\u4eec\u5728\u770b\u5230\u6570\u636e\u4e4b\u524d\u5bf9 \\(\\theta\\) \u7684\u4fe1\u5ff5\u3002\u5982\u679c\u6211\u4eec\u4f7f\u7528 Beta(2, 2) \u5148\u9a8c\u6765\u8868\u793a\u786c\u5e01\u504f\u7f6e\uff08\u8868\u8fbe\"\u786c\u5e01\u5927\u81f4\u662f\u516c\u5e73\u7684\"\u8fd9\u4e00\u6e29\u548c\u4fe1\u5ff5\uff09\uff0cMAP\u4f30\u8ba1\u5c31\u4e0d\u518d\u4ec5\u4ec5\u662f\u6b63\u9762\u7684\u6bd4\u4f8b\uff0c\u800c\u662f\u88ab\u62c9\u54110.5\u3002
\u5bf9\u4e8e\u6211\u4eec\u7684\u793a\u4f8b\uff0cBeta(2,2)\u5148\u9a8c\uff0c7\u6b21\u6b63\u9762\uff0c3\u6b21\u53cd\u9762\uff1a\\(\\hat{p}_{\\text{MAP}} = \\frac{2 + 7 - 1}{2 + 2 + 10 - 2} = \\frac{8}{12} = 0.667\\)\u3002
\u6ce8\u610fMAP\u4f30\u8ba1\uff080.667\uff09\u76f8\u6bd4MLE\uff080.7\uff09\u5982\u4f55\u88ab\u62c9\u54110.5\u3002\u5148\u9a8c\u8d77\u5230\u4e86\u6b63\u5219\u5316\u7684\u4f5c\u7528\u3002\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0cL2\u6b63\u5219\u5316\uff08\u6743\u91cd\u8870\u51cf\uff09\u5b8c\u5168\u7b49\u4ef7\u4e8e\u5728\u6743\u91cd\u4e0a\u4f7f\u7528\u9ad8\u65af\u5148\u9a8c\u7684MAP\u4f30\u8ba1\u3002
\u5b8c\u6574\u7684\u8d1d\u53f6\u65af\u63a8\u65ad\u6bd4MAP\u66f4\u8fdb\u4e00\u6b65\u3002\u5b83\u4e0d\u662f\u5bfb\u627e\u5355\u4e00\u7684\u6700\u4f73 \\(\\theta\\)\uff0c\u800c\u662f\u7ef4\u62a4\u6574\u4e2a\u540e\u9a8c\u5206\u5e03 \\(P(\\theta | D)\\)\u3002\u8fd9\u4e0d\u4ec5\u7ed9\u4f60\u4e00\u4e2a\u70b9\u4f30\u8ba1\uff0c\u8fd8\u7ed9\u51fa\u4e86\u4e0d\u786e\u5b9a\u6027\u7684\u5ea6\u91cf\u3002
\u5bf9\u4e8e\u5177\u6709Beta(2,2)\u5148\u9a8c\u548c7\u6b21\u6b63\u9762\u30013\u6b21\u53cd\u9762\u7684\u504f\u7f6e\u786c\u5e01\uff0c\u5b8c\u6574\u7684\u540e\u9a8c\u662f Beta(9, 5)\u3002\u8be5\u5206\u5e03\u7684\u5747\u503c\u4e3a \\(9/14 \\approx 0.643\\)\uff0c\u5176\u5f25\u6563\u7a0b\u5ea6\u544a\u8bc9\u6211\u4eec\u7f6e\u4fe1\u5ea6\u7684\u9ad8\u4f4e\u3002\u6570\u636e\u8d8a\u591a\uff0c\u540e\u9a8c\u8d8a\u7a84\u3002
\u4e09\u79cd\u65b9\u6cd5\u5f62\u6210\u4e86\u4e00\u4e2a\u8c31\u7cfb\uff1a
\u9a6c\u5c14\u53ef\u592b\u94fe\u5bf9\u5e8f\u5217\u8fdb\u884c\u5efa\u6a21\uff0c\u5176\u4e2d\u4e0b\u4e00\u72b6\u6001\u4ec5\u4f9d\u8d56\u4e8e\u5f53\u524d\u72b6\u6001\uff0c\u800c\u4e0d\u4f9d\u8d56\u4e8e\u5386\u53f2\u3002\u8fd9\u79cd\"\u65e0\u8bb0\u5fc6\u6027\"\u79f0\u4e3a\u9a6c\u5c14\u53ef\u592b\u6027\uff1a
\u4ee5\u5929\u6c14\u4e3a\u4f8b\u3002\u660e\u5929\u7684\u5929\u6c14\u53d6\u51b3\u4e8e\u4eca\u5929\u7684\u5929\u6c14\uff0c\u4f46\u4e0d\u53d6\u51b3\u4e8e\u4e0a\u5468\u7684\u5929\u6c14\uff08\u8fd9\u662f\u4e00\u4e2a\u7b80\u5316\uff0c\u4f46\u51fa\u5947\u5730\u6709\u7528\uff09\u3002
\u9a6c\u5c14\u53ef\u592b\u94fe\u5177\u6709\u6709\u9650\u4e2a\u72b6\u6001\u548c\u4e00\u4e2a\u8f6c\u79fb\u77e9\u9635 \\(T\\)\uff0c\u5176\u4e2d\u5143\u7d20 \\(T_{ij}\\) \u8868\u793a\u4ece\u72b6\u6001 \\(i\\) \u8f6c\u79fb\u5230\u72b6\u6001 \\(j\\) \u7684\u6982\u7387\u3002\u6bcf\u4e00\u884c\u4e4b\u548c\u4e3a1\u3002
\u5982\u679c\u4eca\u5929\u662f\u96e8\u5929\uff08\u72b6\u6001\u5411\u91cf \\(\\mathbf{s}_0 = [1, 0, 0]\\)\uff09\uff0c\u660e\u5929\u5929\u6c14\u7684\u6982\u7387\u5206\u5e03\u4e3a \\(\\mathbf{s}_1 = \\mathbf{s}_0 T = [0.3, 0.4, 0.3]\\)\u3002\u4e24\u5929\u540e\uff1a\\(\\mathbf{s}_2 = \\mathbf{s}_0 T^2\\)\u3002\u8fd9\u4f7f\u7528\u4e86\u7b2c\u4e00\u7ae0\u4e2d\u7684\u77e9\u9635\u4e58\u6cd5\u3002
\u8bb8\u591a\u9a6c\u5c14\u53ef\u592b\u94fe\u4f1a\u6536\u655b\u5230\u4e00\u4e2a\u5e73\u7a33\u5206\u5e03 \\(\\pi\\)\uff0c\u6ee1\u8db3 \\(\\pi T = \\pi\\)\u3002\u65e0\u8bba\u4ece\u54ea\u91cc\u51fa\u53d1\uff0c\u7ecf\u8fc7\u8db3\u591f\u591a\u7684\u6b65\u6570\u540e\uff0c\u94fe\u4f1a\u6536\u655b\u5230 \\(\\pi\\)\u3002\u8fd9\u4e00\u6027\u8d28\u662fMCMC\uff08\u9a6c\u5c14\u53ef\u592b\u94fe\u8499\u7279\u5361\u7f57\uff09\u7684\u57fa\u7840\uff0cMCMC\u662f\u8d1d\u53f6\u65af\u673a\u5668\u5b66\u4e60\u4e2d\u5e7f\u6cdb\u4f7f\u7528\u7684\u91c7\u6837\u6280\u672f\u3002
\u9690\u9a6c\u5c14\u53ef\u592b\u6a21\u578b (HMM) \u901a\u8fc7\u589e\u52a0\u4e00\u5c42\u95f4\u63a5\u6027\u6765\u6269\u5c55\u9a6c\u5c14\u53ef\u592b\u94fe\u3002\u771f\u5b9e\u72b6\u6001\u662f\u9690\u85cf\u7684\uff08\u4e0d\u53ef\u89c2\u6d4b\u7684\uff09\uff0c\u6bcf\u4e2a\u65f6\u95f4\u6b65\u9690\u85cf\u72b6\u6001\u4f1a\u53d1\u51fa\u4e00\u4e2a\u53ef\u89c2\u6d4b\u7684\u4fe1\u53f7\u3002
HMM \u6709\u4e09\u4e2a\u7ec4\u6210\u90e8\u5206\uff1a
\u96e8\u4f1e\u793a\u4f8b\uff1a\u5047\u8bbe\u4f60\u4e0d\u80fd\u76f4\u63a5\u770b\u5230\u5929\u6c14\uff0c\u4f46\u53ef\u4ee5\u89c2\u5bdf\u5230\u4f60\u7684\u670b\u53cb\u662f\u5426\u5e26\u4f1e\u3002\u9690\u85cf\u72b6\u6001\u4e3a {\u96e8\u5929, \u6674\u5929}\uff0c\u89c2\u6d4b\u4e3a {\u5e26\u4f1e, \u4e0d\u5e26\u4f1e}\u3002
\u8f6c\u79fb\u6982\u7387\uff1a\\(P(\\text{\u96e8\u5929}|\\text{\u96e8\u5929}) = 0.7\\)\uff0c\\(P(\\text{\u6674\u5929}|\\text{\u96e8\u5929}) = 0.3\\)\uff0c\\(P(\\text{\u96e8\u5929}|\\text{\u6674\u5929}) = 0.4\\)\uff0c\\(P(\\text{\u6674\u5929}|\\text{\u6674\u5929}) = 0.6\\)\u3002
\u53d1\u5c04\u6982\u7387\uff1a\\(P(\\text{\u5e26\u4f1e}|\\text{\u96e8\u5929}) = 0.9\\)\uff0c\\(P(\\text{\u4e0d\u5e26\u4f1e}|\\text{\u96e8\u5929}) = 0.1\\)\uff0c\\(P(\\text{\u5e26\u4f1e}|\\text{\u6674\u5929}) = 0.2\\)\uff0c\\(P(\\text{\u4e0d\u5e26\u4f1e}|\\text{\u6674\u5929}) = 0.8\\)\u3002
HMM \u7684\u5173\u952e\u95ee\u9898\u6709\uff1a
\u7ef4\u7279\u6bd4\u6f14\u7b97\uff1a\u5047\u8bbe\u4f60\u89c2\u6d4b\u5230 [\u5e26\u4f1e, \u5e26\u4f1e, \u4e0d\u5e26\u4f1e]\uff0c\u60f3\u627e\u5230\u6700\u53ef\u80fd\u7684\u5929\u6c14\u5e8f\u5217\u3002
\u4ece\u521d\u59cb\u6982\u7387\u5f00\u59cb\u3002\u5047\u8bbe \\(P(R) = 0.5\\)\uff0c\\(P(S) = 0.5\\)\u3002
\u7b2c1\u5929\uff08\u89c2\u6d4b\u5230\u5e26\u4f1e\uff09\uff1a
\u7b2c2\u5929\uff08\u89c2\u6d4b\u5230\u5e26\u4f1e\uff09\uff1a
\u7b2c3\u5929\uff08\u89c2\u6d4b\u5230\u4e0d\u5e26\u4f1e\uff09\uff1a
\u7b2c3\u5929\u7684\u6700\u5927\u503c\u5728\u6674\u5929\u3002\u56de\u6eaf\uff1a\u7b2c3\u5929 = \u6674\u5929\uff08\u6765\u81eaR\uff09\uff0c\u7b2c2\u5929 = \u96e8\u5929\uff08\u6765\u81eaR\uff09\uff0c\u7b2c1\u5929 = \u96e8\u5929\u3002\u6700\u53ef\u80fd\u7684\u5e8f\u5217\uff1a\u96e8\u5929, \u96e8\u5929, \u6674\u5929\u3002
\u524d\u5411-\u540e\u5411\u7b97\u6cd5\u8ba1\u7b97\u5728\u7ed9\u5b9a\u6574\u4e2a\u89c2\u6d4b\u5e8f\u5217\u6761\u4ef6\u4e0b\uff0c\u6bcf\u4e2a\u65f6\u95f4\u6b65\u5904\u4e8e\u6bcf\u4e2a\u9690\u85cf\u72b6\u6001\u7684\u6982\u7387\u3002\u524d\u5411\u8fc7\u7a0b\u8ba1\u7b97 \\(P(z_t, x_{1:t})\\)\uff0c\u540e\u5411\u8fc7\u7a0b\u8ba1\u7b97 \\(P(x_{t+1:T} | z_t)\\)\u3002\u4e24\u8005\u76f8\u4e58\u5f97\u5230\u5e73\u6ed1\u540e\u7684\u72b6\u6001\u6982\u7387\u3002
Baum-Welch\u7b97\u6cd5\u5728\u9690\u85cf\u72b6\u6001\u4e0d\u53ef\u89c2\u6d4b\u65f6\u4ece\u6570\u636e\u4e2d\u5b66\u4e60HMM\u53c2\u6570\u3002\u5b83\u662f\u4e00\u79cd\u671f\u671b\u6700\u5927\u5316\uff08EM\uff09\u7b97\u6cd5\uff1aE\u6b65\u4f7f\u7528\u524d\u5411-\u540e\u5411\u7b97\u6cd5\u4f30\u8ba1\u54ea\u4e9b\u9690\u85cf\u72b6\u6001\u751f\u6210\u4e86\u89c2\u6d4b\uff0cM\u6b65\u66f4\u65b0\u8f6c\u79fb\u6982\u7387\u548c\u53d1\u5c04\u6982\u7387\u3002
HMM\u5728\u5386\u53f2\u4e0a\u4e3b\u5bfc\u4e86\u8bed\u97f3\u8bc6\u522b\uff08\u9690\u85cf\u7684\u97f3\u7d20\u72b6\u6001\u53d1\u51fa\u58f0\u5b66\u4fe1\u53f7\uff09\u548c\u751f\u7269\u4fe1\u606f\u5b66\uff08\u9690\u85cf\u7684\u57fa\u56e0\u72b6\u6001\u53d1\u51faDNA\u78b1\u57fa\u5bf9\uff09\u3002\u867d\u7136\u6df1\u5ea6\u5b66\u4e60\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u5df2\u53d6\u4ee3\u4e86\u8fd9\u4e9b\u9886\u57df\u4e2d\u7684HMM\uff0c\u4f46\u9690\u85cf\u72b6\u6001\u3001\u53d1\u5c04\u548c\u5e8f\u5217\u63a8\u65ad\u7684\u601d\u60f3\u4ecd\u7136\u662f\u5e8f\u5217\u6a21\u578b\u7684\u6838\u5fc3\u3002
\u6761\u4ef6\u968f\u673a\u573a (CRF) \u901a\u8fc7\u53bb\u9664\u53d1\u5c04\u72ec\u7acb\u5047\u8bbe\u6765\u6539\u8fdbHMM\u3002\u5728HMM\u4e2d\uff0c\u65f6\u95f4 \\(t\\) \u7684\u89c2\u6d4b\u4ec5\u4f9d\u8d56\u4e8e\u65f6\u95f4 \\(t\\) \u7684\u9690\u85cf\u72b6\u6001\u3002CRF\u5141\u8bb8\u4f4d\u7f6e \\(t\\) \u7684\u6807\u7b7e\u4f9d\u8d56\u4e8e\u6574\u4e2a\u8f93\u5165\u5e8f\u5217\u3002
\u7ebf\u6027\u94feCRF\u5bf9\u7ed9\u5b9a\u8f93\u5165\u5e8f\u5217 \\(\\mathbf{x}\\) \u6761\u4ef6\u4e0b\u6807\u7b7e\u5e8f\u5217 \\(\\mathbf{y}\\) \u7684\u6761\u4ef6\u6982\u7387\u5efa\u6a21\uff1a
\u5176\u4e2d \\(f_k\\) \u662f\u7279\u5f81\u51fd\u6570\uff08\u53ef\u4ee5\u67e5\u770b\u8f93\u5165\u7684\u4efb\u610f\u90e8\u5206\uff09\uff0c\\(\\lambda_k\\) \u662f\u5b66\u4e60\u5230\u7684\u6743\u91cd\uff0c\\(Z(\\mathbf{x})\\) \u662f\u5f52\u4e00\u5316\u5e38\u6570\u3002
CRF\u662f\u5224\u522b\u5f0f\u6a21\u578b\uff08\u76f4\u63a5\u5efa\u6a21 \\(P(\\mathbf{y}|\\mathbf{x})\\)\uff09\uff0c\u800cHMM\u662f\u751f\u6210\u5f0f\u6a21\u578b\uff08\u5efa\u6a21 \\(P(\\mathbf{x}, \\mathbf{y})\\)\uff09\u3002\u8fd9\u4e00\u533a\u522b\u4e0e\u903b\u8f91\u56de\u5f52\uff08\u5224\u522b\u5f0f\uff09\u548c\u6734\u7d20\u8d1d\u53f6\u65af\uff08\u751f\u6210\u5f0f\uff09\u4e4b\u95f4\u7684\u533a\u522b\u76f8\u540c\u3002
\u5728\u73b0\u4ee3NLP\u4e2d\uff0cCRF\u5c42\u901a\u5e38\u88ab\u52a0\u5728\u795e\u7ecf\u7f51\u7edc\u4e4b\u4e0a\uff08BiLSTM-CRF\u3001BERT-CRF\uff09\uff0c\u7528\u4e8e\u547d\u540d\u5b9e\u4f53\u8bc6\u522b\u548c\u8bcd\u6027\u6807\u6ce8\u7b49\u9700\u8981\u6355\u6349\u6807\u7b7e\u4f9d\u8d56\u5173\u7cfb\u7684\u4efb\u52a1\u3002
\u5b9e\u73b0\u629b\u786c\u5e01\u5b9e\u9a8c\u7684MLE\u548cMAP\u3002\u89c2\u5bdfMAP\u4f30\u8ba1\u5982\u4f55\u968f\u4e0d\u540c\u7684\u5148\u9a8c\u548c\u4e0d\u540c\u7684\u6570\u636e\u91cf\u800c\u53d8\u5316\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u6570\u636e\uff1a\u89c2\u6d4b\u5230\u7684\u786c\u5e01\u629b\u63b7\u7ed3\u679c\nheads, tails = 7, 3\n\n# MLE\np_mle = heads / (heads + tails)\nprint(f\"MLE: {p_mle:.4f}\")\n\n# \u4f7f\u7528 Beta \u5148\u9a8c\u7684 MAP\nfor alpha, beta in [(1,1), (2,2), (5,5), (10,10)]:\n p_map = (alpha + heads - 1) / (alpha + beta + heads + tails - 2)\n print(f\"MAP (Beta({alpha},{beta})): {p_map:.4f}\")\n\n# \u53ef\u89c6\u5316 Beta(2,2) \u5148\u9a8c\u4e0b\u7684\u540e\u9a8c\ntheta = jnp.linspace(0.01, 0.99, 200)\n# \u540e\u9a8c\u4e3a Beta(alpha+heads, beta+tails)\na_post, b_post = 2 + heads, 2 + tails\nposterior = theta**(a_post-1) * (1-theta)**(b_post-1)\nposterior = posterior / jnp.trapezoid(posterior, theta)\n\nplt.figure(figsize=(8, 4))\nplt.plot(theta, posterior, color=\"#e74c3c\", linewidth=2, label=f\"\u540e\u9a8c Beta({a_post},{b_post})\")\nplt.axvline(p_mle, color=\"#3498db\", linestyle=\"--\", label=f\"MLE = {p_mle:.2f}\")\nplt.axvline((a_post-1)/(a_post+b_post-2), color=\"#e74c3c\", linestyle=\"--\", label=f\"MAP = {(a_post-1)/(a_post+b_post-2):.3f}\")\nplt.xlabel(\"\u03b8 (\u786c\u5e01\u504f\u7f6e)\")\nplt.ylabel(\"\u5bc6\u5ea6\")\nplt.title(\"7\u6b21\u6b63\u9762\u30013\u6b21\u53cd\u9762\u540e Beta(2,2) \u5148\u9a8c\u4e0b\u7684\u540e\u9a8c\u5206\u5e03\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n \u4e3a\u5929\u6c14\u6a21\u578b\u6784\u5efa\u4e00\u4e2a\u9a6c\u5c14\u53ef\u592b\u94fe\u5e76\u8fdb\u884c\u6a21\u62df\u3002\u5206\u522b\u901a\u8fc7\u6a21\u62df\u548c\u6c42\u89e3 \\(\\pi T = \\pi\\) \u8ba1\u7b97\u5e73\u7a33\u5206\u5e03\u3002
import jax\nimport jax.numpy as jnp\n\n# \u8f6c\u79fb\u77e9\u9635\uff1aR\uff08\u96e8\u5929\uff09, S\uff08\u6674\u5929\uff09, C\uff08\u591a\u4e91\uff09\nT = jnp.array([\n [0.3, 0.4, 0.3],\n [0.2, 0.5, 0.3],\n [0.4, 0.3, 0.3]\n])\nstates = [\"\u96e8\u5929\", \"\u6674\u5929\", \"\u591a\u4e91\"]\n\n# \u6a21\u62df 100,000 \u6b65\nkey = jax.random.PRNGKey(42)\nn_steps = 100_000\nstate = 0 # \u4ece\u96e8\u5929\u5f00\u59cb\ncounts = jnp.zeros(3)\n\nfor i in range(n_steps):\n key, subkey = jax.random.split(key)\n state = jax.random.choice(subkey, 3, p=T[state])\n counts = counts.at[state].add(1)\n\nsim_stationary = counts / n_steps\nprint(\"\u6a21\u62df\u5f97\u5230\u7684\u5e73\u7a33\u5206\u5e03\uff1a\")\nfor s, p in zip(states, sim_stationary):\n print(f\" {s}: {p:.4f}\")\n\n# \u89e3\u6790\u6cd5\uff1a\u627e\u5230\u7279\u5f81\u503c\u4e3a1\u7684\u5de6\u7279\u5f81\u5411\u91cf\neigenvalues, eigenvectors = jnp.linalg.eig(T.T)\nidx = jnp.argmin(jnp.abs(eigenvalues - 1.0))\npi = jnp.real(eigenvectors[:, idx])\npi = pi / pi.sum()\nprint(\"\\n\u89e3\u6790\u5f97\u5230\u7684\u5e73\u7a33\u5206\u5e03\uff1a\")\nfor s, p in zip(states, pi):\n print(f\" {s}: {p:.4f}\")\n \u4e3a\u96e8\u4f1eHMM\u5b9e\u73b0\u7ef4\u7279\u6bd4\u7b97\u6cd5\uff0c\u5e76\u89e3\u7801\u4e00\u4e2a\u89c2\u6d4b\u5e8f\u5217\u3002
import jax.numpy as jnp\n\n# HMM \u53c2\u6570\nstates = [\"\u96e8\u5929\", \"\u6674\u5929\"]\nobs_names = [\"\u5e26\u4f1e\", \"\u4e0d\u5e26\u4f1e\"]\n\ntrans = jnp.array([[0.7, 0.3], # R->R, R->S\n [0.4, 0.6]]) # S->R, S->S\n\nemit = jnp.array([[0.9, 0.1], # R->\u5e26\u4f1e, R->\u4e0d\u5e26\u4f1e\n [0.2, 0.8]]) # S->\u5e26\u4f1e, S->\u4e0d\u5e26\u4f1e\n\ninit = jnp.array([0.5, 0.5])\n\n# \u89c2\u6d4b\uff1a\u5e26\u4f1e=0\uff0c\u4e0d\u5e26\u4f1e=1\nobservations = [0, 0, 1] # \u5e26\u4f1e, \u5e26\u4f1e, \u4e0d\u5e26\u4f1e\n\ndef viterbi(obs, init, trans, emit):\n n_states = len(init)\n T = len(obs)\n V = jnp.zeros((T, n_states))\n path = jnp.zeros((T, n_states), dtype=int)\n\n # \u521d\u59cb\u5316\n V = V.at[0].set(init * emit[:, obs[0]])\n\n # \u9012\u63a8\n for t in range(1, T):\n for j in range(n_states):\n probs = V[t-1] * trans[:, j]\n V = V.at[t, j].set(jnp.max(probs) * emit[j, obs[t]])\n path = path.at[t, j].set(jnp.argmax(probs))\n\n # \u56de\u6eaf\n best = [int(jnp.argmax(V[-1]))]\n for t in range(T-1, 0, -1):\n best.insert(0, int(path[t, best[0]]))\n return best, V\n\ndecoded, scores = viterbi(observations, init, trans, emit)\nprint(\"\u89c2\u6d4b\u5e8f\u5217\uff1a\", [obs_names[o] for o in observations])\nprint(\"\u89e3\u7801\u7ed3\u679c\uff1a\", [states[s] for s in decoded])\n \u53ef\u89c6\u5316\u968f\u7740\u89c2\u6d4b\u66f4\u591a\u629b\u786c\u5e01\u7ed3\u679c\uff0c\u540e\u9a8c\u5982\u4f55\u6f14\u5316\u3002\u4ece Beta(1,1) \u5148\u9a8c\uff08\u5747\u5300\u5206\u5e03\uff09\u5f00\u59cb\uff0c\u6bcf\u6b21\u629b\u63b7\u540e\u66f4\u65b0\u540e\u9a8c\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ntheta = jnp.linspace(0.01, 0.99, 300)\nkey = jax.random.PRNGKey(7)\n\n# \u771f\u5b9e\u504f\u7f6e = 0.65\nflips = jax.random.bernoulli(key, p=0.65, shape=(50,))\n\nplt.figure(figsize=(10, 5))\na, b = 1, 1 # Beta(1,1) = \u5747\u5300\u5206\u5e03\n\nfor n_obs in [0, 1, 5, 10, 25, 50]:\n h = int(flips[:n_obs].sum())\n t = n_obs - h\n a_post = a + h\n b_post = b + t\n y = theta**(a_post-1) * (1-theta)**(b_post-1)\n y = y / jnp.trapezoid(y, theta)\n plt.plot(theta, y, linewidth=2, label=f\"n={n_obs} (h={h})\")\n\nplt.axvline(0.65, color=\"black\", linestyle=\":\", alpha=0.5, label=\"\u771f\u5b9e p=0.65\")\nplt.xlabel(\"\u03b8\")\nplt.ylabel(\"\u5bc6\u5ea6\")\nplt.title(\"\u8d1d\u53f6\u65af\u66f4\u65b0\uff1a\u6570\u636e\u8d8a\u591a\u540e\u9a8c\u8d8a\u7a84\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n \u4fe1\u606f\u8bba\u91cf\u5316\u4e86\u4fe1\u606f\u3001\u60ca\u5947\u5ea6\u4ee5\u53ca\u6982\u7387\u5206\u5e03\u4e4b\u95f4\u7684\u5dee\u5f02\u3002\u672c\u6587\u6db5\u76d6\u71b5\u3001\u4ea4\u53c9\u71b5\u3001KL\u6563\u5ea6\u3001\u4e92\u4fe1\u606f\u548c\u81ea\u4fe1\u606f\u2014\u2014\u8fd9\u4e9b\u6982\u5ff5\u662f\u673a\u5668\u5b66\u4e60\u4e2d\u6bcf\u4e00\u4e2a\u5206\u7c7b\u635f\u5931\u51fd\u6570\u3001VAE\u76ee\u6807\u548c\u6570\u636e\u538b\u7f29\u65b9\u6848\u80cc\u540e\u7684\u7406\u8bba\u57fa\u7840\u3002
\u4fe1\u606f\u8bba\u7531\u514b\u52b3\u5fb7\u00b7\u9999\u519c\u4e8e1948\u5e74\u521b\u7acb\uff0c\u4e3a\u6211\u4eec\u63d0\u4f9b\u4e86\u91cf\u5316\u4fe1\u606f\u7684\u6570\u5b66\u6846\u67b6\u3002\u5b83\u56de\u7b54\u4e86\u8bf8\u5982\u6b64\u7c7b\u7684\u95ee\u9898\uff1a\u4e00\u4e2a\u4e8b\u4ef6\u5e94\u5f53\u8ba9\u4f60\u611f\u5230\u591a\u60ca\u8bb6\uff1f\u4e00\u6761\u6d88\u606f\u643a\u5e26\u4e86\u591a\u5c11\u4fe1\u606f\uff1f\u4e24\u4e2a\u6982\u7387\u5206\u5e03\u4e4b\u95f4\u6709\u591a\u5927\u7684\u5dee\u5f02\uff1f
\u8fd9\u4e9b\u95ee\u9898\u770b\u4f3c\u62bd\u8c61\uff0c\u4f46\u5b83\u4eec\u662f\u673a\u5668\u5b66\u4e60\u635f\u5931\u51fd\u6570\u3001\u6570\u636e\u538b\u7f29\u548c\u901a\u4fe1\u7cfb\u7edf\u7684\u57fa\u7840\u3002\u4ea4\u53c9\u71b5\u635f\u5931\u2014\u2014\u5206\u7c7b\u4e2d\u6700\u5e38\u89c1\u7684\u635f\u5931\u51fd\u6570\u2014\u2014\u76f4\u63a5\u6e90\u4e8e\u4fe1\u606f\u8bba\u3002
\u4ece\u6700\u7b80\u5355\u7684\u95ee\u9898\u5f00\u59cb\uff1a\u5355\u4e2a\u4e8b\u4ef6\u643a\u5e26\u4e86\u591a\u5c11\u4fe1\u606f\uff1f
\u81ea\u4fe1\u606f\uff08surprisal\uff0c\u4e5f\u79f0 self-information\uff09\u8861\u91cf\u4e00\u4e2a\u4e8b\u4ef6\u7684\u60ca\u5947\u7a0b\u5ea6\u3002\u5982\u679c\u67d0\u4ef6\u6781\u6709\u53ef\u80fd\u53d1\u751f\u7684\u4e8b\u60c5\u771f\u7684\u53d1\u751f\u4e86\uff0c\u4f60\u51e0\u4e4e\u5b66\u4e0d\u5230\u4efb\u4f55\u65b0\u4fe1\u606f\u3002\u5982\u679c\u67d0\u4ef6\u7f55\u89c1\u7684\u4e8b\u60c5\u53d1\u751f\u4e86\uff0c\u4f60\u5219\u4f1a\u83b7\u5f97\u5927\u91cf\u4fe1\u606f\u3002
\u5982\u679c\u4f60\u4f4f\u5728\u6c99\u6f20\u91cc\uff0c\u6709\u4eba\u544a\u8bc9\u4f60\u4eca\u5929\u662f\u5927\u6674\u5929\uff0c\u8fd9\u5e76\u6ca1\u6709\u4ec0\u4e48\u4fe1\u606f\u91cf\u3002\u4f46\u5982\u679c\u4ed6\u4eec\u544a\u8bc9\u4f60\u6b63\u5728\u4e0b\u96ea\uff0c\u90a3\u4fe1\u606f\u91cf\u5c31\u6781\u5176\u4e30\u5bcc\u3002\u81ea\u4fe1\u606f\u5c06\u8fd9\u79cd\u76f4\u89c9\u5f62\u5f0f\u5316\uff1a
\u4f7f\u7528 \\(\\log_2\\) \u65f6\uff0c\u5355\u4f4d\u662f\u6bd4\u7279\u3002\u4e00\u679a\u516c\u5e73\u7684\u786c\u5e01\u629b\u63b7\u7684\u81ea\u4fe1\u606f\u4e3a \\(-\\log_2(0.5) = 1\\) \u6bd4\u7279\u3002\u4e00\u4e2a\u6982\u7387\u4e3a \\(1/8\\) \u7684\u4e8b\u4ef6\u5177\u6709 $ \\log_2(8) = 3$ \u6bd4\u7279\u7684\u81ea\u4fe1\u606f\u3002
\u4e3a\u4ec0\u4e48\u7528\u5bf9\u6570\u800c\u4e0d\u662f\u7b80\u5355\u7684 \\(1/p\\)\uff1f\u4e09\u4e2a\u539f\u56e0\uff1a
\u71b5\u662f\u81ea\u4fe1\u606f\u7684\u671f\u671b\u503c\uff0c\u5373\u4ece\u4e00\u4e2a\u5206\u5e03\u4e2d\u6bcf\u6b21\u91c7\u6837\u83b7\u5f97\u7684\u5e73\u5747\u4fe1\u606f\u91cf\u3002\u5b83\u8861\u91cf\u8be5\u5206\u5e03\u7684\u4e0d\u786e\u5b9a\u6027\u6216\"\u4e0d\u53ef\u9884\u6d4b\u6027\"\uff1a
\u4e00\u679a\u516c\u5e73\u786c\u5e01\u7684\u71b5\u4e3a \\(H = -0.5\\log_2(0.5) - 0.5\\log_2(0.5) = 1\\) \u6bd4\u7279\u3002\u4e0d\u786e\u5b9a\u6027\u6700\u5927\u3002
\u4e00\u679a\u504f\u501a\u786c\u5e01\uff0c\\(p = 0.9\\)\uff0c\u5176\u71b5\u4e3a \\(H = -0.9\\log_2(0.9) - 0.1\\log_2(0.1) \\approx 0.469\\) \u6bd4\u7279\u3002\u4e0d\u592a\u786e\u5b9a\uff0c\u56e0\u6b64\u71b5\u66f4\u5c0f\u3002
\u4e00\u4e2a\u786e\u5b9a\u6027\u4e8b\u4ef6\uff08\\(p = 1\\)\uff09\u7684\u71b5\u4e3a \\(H = 0\\)\u3002\u5b8c\u5168\u6ca1\u6709\u4e0d\u786e\u5b9a\u6027\u3002
\u5f53\u6240\u6709\u7ed3\u679c\u7b49\u53ef\u80fd\u65f6\uff0c\u71b5\u8fbe\u5230\u6700\u5927\u3002\u5bf9\u4e8e \\(n\\) \u4e2a\u7b49\u53ef\u80fd\u7ed3\u679c\uff0c\\(H = \\log_2 n\\)\u3002\u4e00\u9897\u516c\u5e73\u9ab0\u5b50\u7684\u71b5\u4e3a \\(\\log_2 6 \\approx 2.585\\) \u6bd4\u7279\u3002
\u71b5\u7684\u5b9e\u9645\u610f\u4e49\u5728\u4e8e\u538b\u7f29\u3002\u9999\u519c\u7684\u6e90\u7f16\u7801\u5b9a\u7406\u6307\u51fa\uff0c\u5982\u679c\u4e0d\u4e22\u5931\u4fe1\u606f\uff0c\u4f60\u65e0\u6cd5\u5c06\u6570\u636e\u538b\u7f29\u5230\u4f4e\u4e8e\u5176\u71b5\u7387\u3002\u4e00\u5e45\u6bcf\u4e2a\u50cf\u7d20\u90fd\u7b49\u53ef\u80fd\u7684\u56fe\u50cf\uff08\u6700\u5927\u71b5\uff09\u65e0\u6cd5\u538b\u7f29\u3002\u4e00\u5e45\u51e0\u4e4e\u5168\u662f\u767d\u8272\u7684\u56fe\u50cf\uff08\u4f4e\u71b5\uff09\u5219\u53ef\u4ee5\u5f88\u597d\u5730\u538b\u7f29\u3002
\u5feb\u901f\u611f\u53d7\u4e00\u4e0b\u6570\u91cf\u7ea7\uff1a\u4e00\u4e2a\u7070\u5ea6\u50cf\u7d20\uff08256 \u4e2a\u503c\uff09\u7684\u6700\u5927\u71b5\u4e3a 8 \u6bd4\u7279\u3002\u4e00\u5f20 1080p \u7684\u7070\u5ea6\u56fe\u50cf\u6700\u591a\u6709 \\(1920 \\times 1080 \\times 8 \\approx 1660\\) \u4e07\u6bd4\u7279\u3002\u771f\u5b9e\u56fe\u50cf\u7684\u71b5\u8981\u4f4e\u5f97\u591a\uff0c\u56e0\u4e3a\u76f8\u90bb\u50cf\u7d20\u662f\u76f8\u5173\u7684\u2014\u2014\u8fd9\u6b63\u662f JPEG \u538b\u7f29\u80fd\u591f\u5de5\u4f5c\u7684\u539f\u56e0\u3002
\u5bf9\u4e8e\u8fde\u7eed\u968f\u673a\u53d8\u91cf\uff0c\u79bb\u6563\u6c42\u548c\u53d8\u4e3a\u79ef\u5206\u3002\u5fae\u5206\u71b5\u5b9a\u4e49\u4e3a\uff1a
\u65b9\u5dee\u4e3a \\(\\sigma^2\\) \u7684\u9ad8\u65af\u5206\u5e03\u7684\u5fae\u5206\u71b5\u4e3a \\(h = \\frac{1}{2}\\log_2(2\\pi e \\sigma^2)\\)\u3002\u5728\u6240\u6709\u5177\u6709\u76f8\u540c\u65b9\u5dee\u7684\u5206\u5e03\u4e2d\uff0c\u9ad8\u65af\u5206\u5e03\u5177\u6709\u6700\u5927\u71b5\u3002\u8fd9\u4e5f\u662f\u9ad8\u65af\u5206\u5e03\u5728\u5efa\u6a21\u4e2d\u5982\u6b64\u5e38\u89c1\u7684\u539f\u56e0\u4e4b\u4e00\uff1a\u5b83\u5728\u6307\u5b9a\u5747\u503c\u548c\u65b9\u5dee\u4e4b\u5916\u505a\u51fa\u4e86\u6700\u5c11\u7684\u5047\u8bbe\u3002
\u4e92\u4fe1\u606f\u8861\u91cf\u77e5\u9053\u4e00\u4e2a\u53d8\u91cf\u80fd\u544a\u8bc9\u4f60\u5173\u4e8e\u53e6\u4e00\u4e2a\u53d8\u91cf\u7684\u591a\u5c11\u4fe1\u606f\u3002\u5b83\u662f\u89c2\u5bdf\u5230 \\(Y\\) \u540e \\(X\\) \u4e0d\u786e\u5b9a\u6027\u7684\u51cf\u5c11\u91cf\uff1a
\u5982\u679c \\(X\\) \u548c \\(Y\\) \u72ec\u7acb\uff0c\u5219 \\(p(x,y) = p(x)p(y)\\)\uff0c\u4e92\u4fe1\u606f\u4e3a\u96f6\u3002\u5b83\u4eec\u4f9d\u8d56\u7a0b\u5ea6\u8d8a\u9ad8\uff0c\u4e92\u4fe1\u606f\u5c31\u8d8a\u5927\u3002
\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u4e92\u4fe1\u606f\u7528\u4e8e\u7279\u5f81\u9009\u62e9\uff08\u6311\u9009\u4e0e\u76ee\u6807\u5177\u6709\u9ad8 MI \u7684\u7279\u5f81\uff09\u3001\u4fe1\u606f\u74f6\u9888\u65b9\u6cd5\u4ee5\u53ca\u805a\u7c7b\u8d28\u91cf\u8bc4\u4f30\u3002
\u4ea4\u53c9\u71b5\u8861\u91cf\u4f7f\u7528\u9488\u5bf9\u5206\u5e03 \\(q\\) \u4f18\u5316\u7684\u7f16\u7801\u65b9\u6848\u6765\u7f16\u7801\u6765\u81ea\u5206\u5e03 \\(p\\) \u7684\u4e8b\u4ef6\u6240\u9700\u7684\u5e73\u5747\u6bd4\u7279\u6570\uff1a
\u5982\u679c \\(q\\) \u4e0e \\(p\\) \u5b8c\u5168\u5339\u914d\uff0c\u5219\u4ea4\u53c9\u71b5\u7b49\u4e8e\u71b5\uff1a\\(H(p, p) = H(p)\\)\u3002\u5982\u679c \\(q\\) \u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u8fd1\u4f3c\uff0c\u4ea4\u53c9\u71b5\u5c31\u4f1a\u66f4\u9ad8\u3002\"\u989d\u5916\"\u7684\u6bd4\u7279\u6765\u81ea\u8fd9\u79cd\u4e0d\u5339\u914d\u3002
\u8fd9\u6b63\u662f\u4ea4\u53c9\u71b5\u6210\u4e3a\u673a\u5668\u5b66\u4e60\u4e2d\u5206\u7c7b\u6807\u51c6\u635f\u5931\u51fd\u6570\u7684\u539f\u56e0\u3002\u771f\u5b9e\u6807\u7b7e\u5b9a\u4e49\u4e86 \\(p\\)\uff08\u4e00\u4e2a one-hot \u5206\u5e03\uff09\uff0c\u6a21\u578b\u7684\u9884\u6d4b\u6982\u7387\u5b9a\u4e49\u4e86 \\(q\\)\u3002\u6700\u5c0f\u5316\u4ea4\u53c9\u71b5\u63a8\u52a8 \\(q\\) \u8d8b\u8fd1\u4e8e \\(p\\)\uff1a
\u5bf9\u4e8e\u5355\u4e2a\u6837\u672c\uff0c\u82e5\u771f\u5b9e\u7c7b\u522b\u4e3a \\(c\\)\uff0c\u4e0a\u5f0f\u7b80\u5316\u4e3a \\(\\mathcal{L} = -\\log \\hat{y}_c\\)\u3002\u8be5\u635f\u5931\u5c31\u662f\u6a21\u578b\u9884\u6d4b\u4e0b\u771f\u5b9e\u7c7b\u522b\u7684\u81ea\u4fe1\u606f\u3002\u5982\u679c\u6a21\u578b\u5bf9\u6b63\u786e\u7c7b\u522b\u8d4b\u4e88\u9ad8\u6982\u7387\uff0c\u5219\u635f\u5931\u8f83\u4f4e\u3002
KL \u6563\u5ea6\uff08Kullback-Leibler \u6563\u5ea6\uff0c\u4e5f\u79f0\u76f8\u5bf9\u71b5\uff09\u8861\u91cf\u4e00\u4e2a\u5206\u5e03\u4e0e\u53e6\u4e00\u4e2a\u5206\u5e03\u7684\u5dee\u5f02\u7a0b\u5ea6\uff1a
KL \u6563\u5ea6\u4e0d\u662f\u5bf9\u79f0\u7684\uff1a\\(D_{\\text{KL}}(p \\| q) \\ne D_{\\text{KL}}(q \\| p)\\)\u3002\u8fd9\u79cd\u4e0d\u5bf9\u79f0\u6027\u5f88\u91cd\u8981\u3002\\(D_{\\text{KL}}(p \\| q)\\) \u60e9\u7f5a \\(q\\) \u5728 \\(p\\) \u5177\u6709\u9ad8\u6982\u7387\u5904\u653e\u7f6e\u4f4e\u6982\u7387\uff08\u56e0\u4e3a \\(\\log(p/q)\\) \u4f1a\u8d8b\u4e8e\u65e0\u7a77\u5927\uff09\u3002\\(D_{\\text{KL}}(q \\| p)\\) \u5219\u60e9\u7f5a\u76f8\u53cd\u7684\u60c5\u51b5\u3002
\u8fd9\u79cd\u4e0d\u5bf9\u79f0\u6027\u5bfc\u81f4\u4e86\u4e24\u79cd\u8fd1\u4f3c\u98ce\u683c\uff1a
\u7531\u4e8e \\(H(p)\\) \u76f8\u5bf9\u4e8e\u6a21\u578b\u662f\u5e38\u6570\uff0c\u6700\u5c0f\u5316\u4ea4\u53c9\u71b5 \\(H(p, q)\\) \u7b49\u4ef7\u4e8e\u6700\u5c0f\u5316 \\(D_{\\text{KL}}(p \\| q)\\)\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u4ea4\u53c9\u71b5\u635f\u5931\uff0c\u540c\u65f6\u77e5\u9053\u6211\u4eec\u4e5f\u5728\u6700\u5c0f\u5316\u771f\u5b9e\u5206\u5e03\u4e0e\u9884\u6d4b\u5206\u5e03\u4e4b\u95f4\u7684 KL \u6563\u5ea6\u3002
KL \u6563\u5ea6\u5728\u8d1d\u53f6\u65af\u66f4\u65b0\u4e2d\u626e\u6f14\u7740\u6838\u5fc3\u89d2\u8272\u3002\u540e\u9a8c \\(P(\\theta | D)\\) \u662f\u5728 KL \u6563\u5ea6\u610f\u4e49\u4e0a\u4e0e\u5148\u9a8c \\(P(\\theta)\\) \u6700\u63a5\u8fd1\u4e14\u4e0e\u89c2\u6d4b\u6570\u636e\u4e00\u81f4\u7684\u5206\u5e03\u3002\u6bcf\u4e00\u6b21\u65b0\u7684\u89c2\u6d4b\u90fd\u4f1a\u66f4\u65b0\u540e\u9a8c\uff0c\u51cf\u5c11\u5173\u4e8e \\(\\theta\\) \u7684\u4e0d\u786e\u5b9a\u6027\u3002
\u5728\u53d8\u5206\u81ea\u7f16\u7801\u5668\uff08VAE\uff09\u4e2d\uff0c\u635f\u5931\u51fd\u6570\u5305\u542b\u4e24\u9879\uff1a\u91cd\u6784\u635f\u5931\uff08\u4ea4\u53c9\u71b5\uff09\u548c\u4e00\u4e2a KL \u6563\u5ea6\u9879\uff0c\u540e\u8005\u5bf9\u6f5c\u5728\u7a7a\u95f4\u8fdb\u884c\u6b63\u5219\u5316\uff0c\u4f7f\u5176\u4fdd\u6301\u63a5\u8fd1\u6807\u51c6\u6b63\u6001\u5206\u5e03\u3002
\u5c06\u6240\u6709\u6982\u5ff5\u8054\u7cfb\u8d77\u6765\uff1a\u71b5\u544a\u8bc9\u4f60\u4e00\u4e2a\u5206\u5e03\u5185\u5728\u7684\u4e0d\u786e\u5b9a\u6027\uff0c\u4ea4\u53c9\u71b5\u544a\u8bc9\u4f60\u7684\u6a21\u578b\u5bf9\u73b0\u5b9e\u7684\u8fd1\u4f3c\u7a0b\u5ea6\uff0c\u800c KL \u6563\u5ea6\u5219\u544a\u8bc9\u4f60\u4e24\u8005\u4e4b\u95f4\u7684\u5dee\u8ddd\u3002\u8fd9\u4e09\u4e2a\u91cf\u6784\u6210\u4e86\u73b0\u4ee3\u673a\u5668\u5b66\u4e60\u4f18\u5316\u7684\u57fa\u77f3\u3002
\u8ba1\u7b97\u5404\u79cd\u5206\u5e03\u7684\u71b5\uff0c\u5e76\u9a8c\u8bc1\u5728\u7ed9\u5b9a\u7ed3\u679c\u6570\u91cf\u4e0b\uff0c\u5747\u5300\u5206\u5e03\u7684\u71b5\u6700\u5927\u3002
import jax.numpy as jnp\n\ndef entropy(p):\n \"\"\"\u4ee5\u6bd4\u7279\u4e3a\u5355\u4f4d\u8ba1\u7b97\u71b5\u3002\u8fc7\u6ee4\u6389\u6982\u7387\u4e3a\u96f6\u7684\u4e8b\u4ef6\u3002\"\"\"\n p = p[p > 0]\n return -jnp.sum(p * jnp.log2(p))\n\n# \u516c\u5e73\u9ab0\u5b50\nfair = jnp.ones(6) / 6\nprint(f\"\u516c\u5e73\u9ab0\u5b50\u71b5: {entropy(fair):.4f} \u6bd4\u7279 (\u6700\u5927 = log2(6) = {jnp.log2(6.):.4f})\")\n\n# \u704c\u94c5\u9ab0\u5b50\nloaded = jnp.array([0.1, 0.1, 0.1, 0.1, 0.1, 0.5])\nprint(f\"\u704c\u94c5\u9ab0\u5b50\u71b5: {entropy(loaded):.4f} \u6bd4\u7279\")\n\n# \u786e\u5b9a\u6027\ndet = jnp.array([0.0, 0.0, 0.0, 0.0, 0.0, 1.0])\nprint(f\"\u786e\u5b9a\u6027: {entropy(det):.4f} \u6bd4\u7279\")\n\n# \u516c\u5e73\u786c\u5e01\ncoin = jnp.array([0.5, 0.5])\nprint(f\"\u516c\u5e73\u786c\u5e01\u71b5: {entropy(coin):.4f} \u6bd4\u7279\")\n \u8ba1\u7b97\u771f\u5b9e\u5206\u5e03\u4e0e\u591a\u4e2a\u8fd1\u4f3c\u5206\u5e03\u4e4b\u95f4\u7684\u4ea4\u53c9\u71b5\u548c KL \u6563\u5ea6\u3002\u9a8c\u8bc1 \\(D_{\\text{KL}}(p \\| q) = H(p, q) - H(p)\\)\u3002
import jax.numpy as jnp\n\ndef cross_entropy(p, q):\n return -jnp.sum(p * jnp.log2(jnp.clip(q, 1e-10, 1.0)))\n\ndef kl_divergence(p, q):\n mask = p > 0\n return jnp.sum(jnp.where(mask, p * jnp.log2(p / jnp.clip(q, 1e-10, 1.0)), 0.0))\n\ndef entropy(p):\n p = p[p > 0]\n return -jnp.sum(p * jnp.log2(p))\n\np = jnp.array([0.4, 0.3, 0.2, 0.1]) # \u771f\u5b9e\u5206\u5e03\n\nfor name, q in [(\"\u5b8c\u5168\u5339\u914d\", p),\n (\"\u8f7b\u5fae\u504f\u5dee\", jnp.array([0.35, 0.30, 0.25, 0.10])),\n (\"\u4e25\u91cd\u504f\u5dee\", jnp.array([0.1, 0.1, 0.1, 0.7]))]:\n h_p = entropy(p)\n h_pq = cross_entropy(p, q)\n kl = kl_divergence(p, q)\n print(f\"{name:20s}: H(p)={h_p:.4f}, H(p,q)={h_pq:.4f}, \"\n f\"KL={kl:.4f}, H(p,q)-H(p)={h_pq-h_p:.4f}\")\n \u901a\u8fc7\u8ba1\u7b97\u4e24\u4e2a\u4e0d\u540c\u5206\u5e03\u4e4b\u95f4\u7684 \\(D_{\\text{KL}}(p \\| q)\\) \u548c \\(D_{\\text{KL}}(q \\| p)\\)\uff0c\u8bc1\u660e KL \u6563\u5ea6\u4e0d\u662f\u5bf9\u79f0\u7684\u3002
import jax.numpy as jnp\n\ndef kl_div(p, q):\n mask = p > 0\n return float(jnp.sum(jnp.where(mask, p * jnp.log2(p / jnp.clip(q, 1e-10, 1.0)), 0.0)))\n\np = jnp.array([0.9, 0.1])\nq = jnp.array([0.5, 0.5])\n\nprint(f\"D_KL(p || q) = {kl_div(p, q):.4f}\")\nprint(f\"D_KL(q || p) = {kl_div(q, p):.4f}\")\nprint(\"\u4e0d\u76f8\u540c\uff01KL \u6563\u5ea6\u662f\u4e0d\u5bf9\u79f0\u7684\u3002\")\n \u6a21\u62df\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\u4ea4\u53c9\u71b5\u635f\u5931\u7684\u53d8\u5316\u3002\u521b\u5efa\u4e00\u4e2a\"\u771f\u5b9e\"\u7684 one-hot \u6807\u7b7e\uff0c\u5c55\u793a\u968f\u7740\u6a21\u578b\u9884\u6d4b\u6982\u7387\u7684\u6539\u5584\uff0c\u635f\u5931\u5982\u4f55\u4e0b\u964d\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u771f\u5b9e\u6807\u7b7e\uff1a4 \u4e2a\u7c7b\u522b\u4e2d\u7684\u7b2c 2 \u7c7b\ntrue_label = jnp.array([0, 0, 1, 0])\n\n# \u6a21\u62df\u9884\u6d4b\u9010\u6b65\u6539\u5584\nsteps = []\nlosses = []\nfor confidence in jnp.linspace(0.25, 0.99, 50):\n # \u6a21\u578b\u5bf9\u7c7b\u522b 2 \u7684\u7f6e\u4fe1\u5ea6\u9010\u6e10\u63d0\u9ad8\n remaining = (1 - confidence) / 3\n pred = jnp.array([remaining, remaining, confidence, remaining])\n loss = -jnp.sum(true_label * jnp.log(jnp.clip(pred, 1e-10, 1.0)))\n steps.append(float(confidence))\n losses.append(float(loss))\n\nplt.figure(figsize=(8, 4))\nplt.plot(steps, losses, color=\"#e74c3c\", linewidth=2)\nplt.xlabel(\"\u6a21\u578b\u5bf9\u771f\u5b9e\u7c7b\u522b\u7684\u7f6e\u4fe1\u5ea6\")\nplt.ylabel(\"\u4ea4\u53c9\u71b5\u635f\u5931\")\nplt.title(\"\u4ea4\u53c9\u71b5\u635f\u5931\u968f\u9884\u6d4b\u6539\u5584\u800c\u4e0b\u964d\")\nplt.grid(alpha=0.3)\nplt.show()\n \u7ecf\u5178\u673a\u5668\u5b66\u4e60\u7b97\u6cd5\u901a\u8fc7\u6570\u636e\u5b66\u4e60\u6a21\u5f0f\u800c\u65e0\u9700\u663e\u5f0f\u7f16\u7a0b\uff0c\u4f7f\u7528\u95ed\u5f0f\u89e3\u6216\u542f\u53d1\u5f0f\u641c\u7d22\u800c\u975e\u68af\u5ea6\u4e0b\u964d\u3002\u672c\u6587\u6db5\u76d6\u6734\u7d20\u8d1d\u53f6\u65af\u3001k-NN\u3001\u51b3\u7b56\u6811\u3001\u968f\u673a\u68ee\u6797\u3001\u652f\u6301\u5411\u91cf\u673a\u3001k-means\u805a\u7c7b\u548c\u4e3b\u6210\u5206\u5206\u6790
\u673a\u5668\u5b66\u4e60\u662f\u7814\u7a76\u7b97\u6cd5\u901a\u8fc7\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u6765\u63d0\u5347\u5176\u5728\u67d0\u9879\u4efb\u52a1\u4e0a\u8868\u73b0\u7684\u5b66\u79d1\uff0c\u800c\u975e\u901a\u8fc7\u663e\u5f0f\u89c4\u5219\u7f16\u7a0b\u3002\u4e0e\u5176\u7f16\u5199\"\u5982\u679c\u6536\u5165 > 50k \u4e14\u5e74\u9f84 < 30 \u5219\u6279\u51c6\u8d37\u6b3e\"\uff0c\u4e0d\u5982\u5c06\u6570\u5343\u6761\u5386\u53f2\u8d37\u6b3e\u51b3\u7b56\u4ea4\u7ed9\u7b97\u6cd5\uff0c\u8ba9\u5b83\u81ea\u884c\u627e\u51fa\u6a21\u5f0f\u3002
\u5b58\u5728\u4e09\u5927\u8303\u5f0f\u3002\u76d1\u7763\u5b66\u4e60\u4f7f\u7528\u5e26\u6807\u7b7e\u6570\u636e\uff0c\u5373\u6bcf\u4e2a\u8f93\u5165\u90fd\u6709\u5df2\u77e5\u7684\u6b63\u786e\u8f93\u51fa\u3002\u7b97\u6cd5\u5b66\u4e60\u4ece\u8f93\u5165\u5230\u8f93\u51fa\u7684\u6620\u5c04\u3002\u65e0\u76d1\u7763\u5b66\u4e60\u5904\u7406\u672a\u6807\u7b7e\u6570\u636e\uff0c\u8bd5\u56fe\u53d1\u73b0\u9690\u85cf\u7ed3\u6784\uff0c\u5982\u805a\u7c7b\u6216\u538b\u7f29\u8868\u793a\u3002\u5f3a\u5316\u5b66\u4e60\u901a\u8fc7\u8bd5\u9519\u5b66\u4e60\uff0c\u6839\u636e\u5728\u73af\u5883\u4e2d\u91c7\u53d6\u7684\u52a8\u4f5c\u63a5\u6536\u5956\u52b1\u6216\u60e9\u7f5a\uff08\u5728\u7b2c04\u7bc7\u4e2d\u4ecb\u7ecd\uff09\u3002
\u5728\u76d1\u7763\u5b66\u4e60\u4e2d\uff0c\u5206\u7c7b\u9884\u6d4b\u79bb\u6563\u7c7b\u522b\uff08\u5783\u573e\u90ae\u4ef6\u6216\u975e\u5783\u573e\u90ae\u4ef6\uff0c\u732b\u6216\u72d7\uff09\uff0c\u800c\u56de\u5f52\u9884\u6d4b\u8fde\u7eed\u503c\uff08\u623f\u4ef7\u3001\u660e\u5929\u6e29\u5ea6\uff09\u3002\u8fb9\u754c\u5e76\u4e0d\u603b\u662f\u6e05\u6670\uff1a\u903b\u8f91\u56de\u5f52\u867d\u7136\u540d\u4e3a\"\u56de\u5f52\"\uff0c\u4f46\u5b9e\u9645\u4e0a\u6267\u884c\u5206\u7c7b\u4efb\u52a1\u3002
\u6982\u7387\u6a21\u578b\u4e2d\u7684\u4e00\u4e2a\u5173\u952e\u533a\u5206\u662f\u751f\u6210\u5f0f vs \u5224\u522b\u5f0f\u3002\u751f\u6210\u6a21\u578b\u5b66\u4e60\u8054\u5408\u5206\u5e03 \\(P(x, y)\\)\uff0c\u8fd9\u610f\u5473\u7740\u5b83\u7406\u89e3\u6570\u636e\u672c\u8eab\u7684\u751f\u6210\u65b9\u5f0f\u3002\u5b83\u80fd\u4ea7\u751f\u65b0\u6837\u672c\u3002\u5224\u522b\u6a21\u578b\u76f4\u63a5\u5b66\u4e60 \\(P(y \\mid x)\\)\uff0c\u4ec5\u5173\u6ce8\u7c7b\u522b\u4e4b\u95f4\u7684\u8fb9\u754c\u3002\u6734\u7d20\u8d1d\u53f6\u65af\u662f\u751f\u6210\u5f0f\u7684\uff1b\u903b\u8f91\u56de\u5f52\uff08\u7b2c02\u7bc7\uff09\u662f\u5224\u522b\u5f0f\u7684\u3002\u751f\u6210\u6a21\u578b\u66f4\u7075\u6d3b\u4f46\u66f4\u96be\u8bad\u7ec3\u597d\uff1b\u5224\u522b\u6a21\u578b\u5728\u6570\u636e\u5145\u8db3\u65f6\u901a\u5e38\u7ed9\u51fa\u66f4\u597d\u7684\u5206\u7c7b\u51c6\u786e\u7387\u3002
\u6734\u7d20\u8d1d\u53f6\u65af\u662f\u6700\u7b80\u5355\u4e14\u6700\u6709\u6548\u7684\u5206\u7c7b\u5668\u4e4b\u4e00\u3002\u5b83\u76f4\u63a5\u5e94\u7528\u8d1d\u53f6\u65af\u5b9a\u7406\uff08\u6765\u81ea\u7b2c05\u7ae0\uff09\uff1a
\"\u6734\u7d20\"\u4e4b\u5904\u5728\u4e8e\u4e00\u4e2a\u5f3a\u70c8\u7684\u72ec\u7acb\u6027\u5047\u8bbe\uff1a\u5b83\u5047\u8bbe\u7ed9\u5b9a\u7c7b\u522b\u540e\u6bcf\u4e2a\u7279\u5f81\u76f8\u4e92\u72ec\u7acb\u3002\u5982\u679c\u4f60\u6b63\u5728\u5c06\u7535\u5b50\u90ae\u4ef6\u5206\u7c7b\u4e3a\u5783\u573e\u90ae\u4ef6\uff0c\u6734\u7d20\u8d1d\u53f6\u65af\u5047\u8bbe\u4e00\u65e6\u4f60\u77e5\u9053\u90ae\u4ef6\u662f\u5783\u573e\u90ae\u4ef6\uff0c\u5355\u8bcd\"\u514d\u8d39\"\u7684\u51fa\u73b0\u544a\u8bc9\u4f60\u5173\u4e8e\u5355\u8bcd\"\u8d62\u5bb6\"\u662f\u5426\u51fa\u73b0\u7684\u4fe1\u606f\u4e3a\u96f6\u3002\u8fd9\u5728\u73b0\u5b9e\u4e2d\u51e0\u4e4e\u4ece\u4e0d\u6210\u7acb\uff0c\u4f46\u5206\u7c7b\u5668\u4ecd\u7136\u51fa\u5947\u5730\u597d\u7528\u3002
\u7531\u4e8e \\(P(x)\\) \u5bf9\u6240\u6709\u7c7b\u522b\u90fd\u4e00\u6837\uff0c\u5206\u7c7b\u7b80\u5316\u4e3a\u9009\u62e9\u6700\u5927\u5316\u5206\u5b50\u7684\u7c7b\u522b\uff1a
\u5148\u9a8c \\(P(C_k)\\) \u5c31\u662f\u6bcf\u4e2a\u7c7b\u522b\u4e2d\u8bad\u7ec3\u6837\u672c\u7684\u6bd4\u4f8b\u3002\u4f3c\u7136 \\(P(x_i \\mid C_k)\\) \u53d6\u51b3\u4e8e\u7279\u5f81\u7684\u7c7b\u578b\uff0c\u4ece\u800c\u4ea7\u751f\u4e09\u79cd\u5e38\u89c1\u53d8\u4f53\u3002
\u591a\u9879\u5f0f\u6734\u7d20\u8d1d\u53f6\u65af\u4e13\u4e3a\u8ba1\u6570\u6570\u636e\u8bbe\u8ba1\uff0c\u5982\u6587\u6863\u4e2d\u7684\u8bcd\u9891\u3002\u6bcf\u4e2a\u7279\u5f81 \\(x_i\\) \u8868\u793a\u5355\u8bcd \\(i\\) \u51fa\u73b0\u7684\u6b21\u6570\uff0c\u4f3c\u7136\u9075\u5faa\u591a\u9879\u5206\u5e03\u3002\u8fd9\u662f\u6587\u672c\u5206\u7c7b\u3001\u60c5\u611f\u5206\u6790\u548c\u5783\u573e\u90ae\u4ef6\u8fc7\u6ee4\u7684\u6807\u51c6\u9009\u62e9\u3002
\u9ad8\u65af\u6734\u7d20\u8d1d\u53f6\u65af\u5047\u8bbe\u6bcf\u4e2a\u7279\u5f81\u5728\u6bcf\u4e2a\u7c7b\u522b\u5185\u670d\u4ece\u6b63\u6001\u5206\u5e03\u3002\u4f60\u4ece\u8bad\u7ec3\u6570\u636e\u4e2d\u4f30\u8ba1\u7279\u5f81 \\(i\\) \u5bf9\u7c7b\u522b \\(k\\) \u7684\u5747\u503c \\(\\mu_{ik}\\) \u548c\u65b9\u5dee \\(\\sigma_{ik}^2\\)\uff0c\u7136\u540e\u8ba1\u7b97\uff1a
\u4f2f\u52aa\u5229\u6734\u7d20\u8d1d\u53f6\u65af\u5bf9\u4e8c\u5143\u7279\u5f81\u5efa\u6a21\uff1a\u6bcf\u4e2a\u7279\u5f81\u8981\u4e48\u5b58\u5728\uff081\uff09\u8981\u4e48\u4e0d\u5b58\u5728\uff080\uff09\u3002\u4f60\u4e0d\u518d\u7edf\u8ba1\u5355\u8bcd\u51fa\u73b0\u7684\u6b21\u6570\uff0c\u800c\u662f\u53ea\u8ddf\u8e2a\u5b83\u662f\u5426\u51fa\u73b0\u3002\u8fd9\u9002\u7528\u4e8e\u77ed\u6587\u672c\u6216\u4e8c\u5143\u7279\u5f81\u5411\u91cf\u3002
\u4e00\u4e2a\u5b9e\u9645\u95ee\u9898\u662f\uff0c\u5f53\u67d0\u4e2a\u7279\u5f81\u503c\u5728\u8bad\u7ec3\u6570\u636e\u4e2d\u4ece\u672a\u4e0e\u67d0\u4e2a\u7c7b\u522b\u4e00\u8d77\u51fa\u73b0\u65f6\uff0c\u4f3c\u7136\u53d8\u4e3a\u96f6\uff0c\u7531\u4e8e\u6240\u6709\u6982\u7387\u76f8\u4e58\uff0c\u6574\u4e2a\u540e\u9a8c\u6982\u7387\u4e5f\u5f52\u96f6\u3002\u62c9\u666e\u62c9\u65af\u5e73\u6ed1\u901a\u8fc7\u4e3a\u6bcf\u4e2a\u7279\u5f81-\u7c7b\u522b\u7ec4\u5408\u6dfb\u52a0\u4e00\u4e2a\u5c0f\u8ba1\u6570\uff08\u901a\u5e38\u4e3a1\uff09\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff1a
\u8fd9\u91cc \\(\\alpha\\) \u662f\u5e73\u6ed1\u53c2\u6570\uff08\u901a\u5e38\u4e3a1\uff09\uff0c\\(V\\) \u662f\u8be5\u7279\u5f81\u7684\u53ef\u80fd\u53d6\u503c\u6570\u91cf\u3002\u8fd9\u786e\u4fdd\u4e86\u4efb\u4f55\u6982\u7387\u6c38\u8fdc\u4e0d\u4f1a\u7cbe\u786e\u4e3a\u96f6\u3002
\u51b3\u7b56\u6811\u91c7\u7528\u4e86\u4e00\u79cd\u5b8c\u5168\u4e0d\u540c\u7684\u65b9\u6cd5\u3002\u5b83\u4e0d\u662f\u8ba1\u7b97\u6982\u7387\uff0c\u800c\u662f\u901a\u8fc7\u4e00\u7cfb\u5217\u7684\"\u662f/\u5426\"\u95ee\u9898\u6765\u5212\u5206\u7279\u5f81\u7a7a\u95f4\u3002\u60f3\u8c61\"\u4e8c\u5341\u95ee\"\u6e38\u620f\uff1a\u6bcf\u4e00\u6b65\uff0c\u4f60\u95ee\u4e00\u4e2a\u6700\u80fd\u7f29\u5c0f\u53ef\u80fd\u6027\u8303\u56f4\u7684\u95ee\u9898\u3002
\u6811\u4ece\u6839\u8282\u70b9\u5f00\u59cb\uff0c\u5305\u542b\u6240\u6709\u8bad\u7ec3\u6837\u672c\u3002\u5728\u6bcf\u4e2a\u5185\u90e8\u8282\u70b9\uff0c\u5b83\u9009\u62e9\u4e00\u4e2a\u7279\u5f81\u548c\u4e00\u4e2a\u9608\u503c\u8fdb\u884c\u5206\u88c2\uff08\u4f8b\u5982\uff0c\"\u5e74\u9f84 < 30\uff1f\"\uff09\u3002\u6837\u672c\u6839\u636e\u7b54\u6848\u5411\u5de6\u6216\u5411\u53f3\u6d41\u52a8\u3002\u8fd9\u4e00\u8fc7\u7a0b\u9012\u5f52\u8fdb\u884c\u76f4\u5230\u53f6\u8282\u70b9\uff0c\u53f6\u8282\u70b9\u4e2d\u5b58\u653e\u9884\u6d4b\u7ed3\u679c\uff1a\u5206\u7c7b\u4efb\u52a1\u4e2d\u7684\u591a\u6570\u7c7b\u522b\uff0c\u6216\u56de\u5f52\u4efb\u52a1\u4e2d\u7684\u5747\u503c\u3002
\u5173\u952e\u95ee\u9898\u662f\uff1a\u5e94\u8be5\u9009\u62e9\u54ea\u4e2a\u7279\u5f81\u8fdb\u884c\u5206\u88c2\uff1f\u4f60\u5e0c\u671b\u5206\u88c2\u4ea7\u751f\u6700\"\u7eaf\"\u7684\u5b50\u8282\u70b9\uff0c\u5373\u5927\u591a\u6570\u6837\u672c\u5c5e\u4e8e\u540c\u4e00\u7c7b\u522b\u3002\u8861\u91cf\u4e0d\u7eaf\u5ea6\u7684\u4e24\u79cd\u5e38\u7528\u6307\u6807\u662f\u57fa\u5c3c\u4e0d\u7eaf\u5ea6\u548c\u71b5\u3002
\u57fa\u5c3c\u4e0d\u7eaf\u5ea6\u8861\u91cf\u7684\u662f\u5982\u679c\u6309\u7167\u8be5\u8282\u70b9\u4e2d\u7684\u5206\u5e03\u6807\u8bb0\uff0c\u968f\u673a\u9009\u62e9\u7684\u6837\u672c\u88ab\u9519\u8bef\u5206\u7c7b\u7684\u6982\u7387\uff1a
\u5982\u679c\u8282\u70b9\u5b8c\u5168\u7eaf\uff08\u5168\u90e8\u5c5e\u4e8e\u4e00\u4e2a\u7c7b\u522b\uff09\uff0c\u57fa\u5c3c\u503c\u4e3a0\u3002\u5982\u679c\u7c7b\u522b\u5b8c\u5168\u5e73\u8861\uff08\u6bd4\u5982\u4e24\u7c7b\u5404\u536050%\uff09\uff0c\u57fa\u5c3c\u503c\u8fbe\u5230\u6700\u5927\u503c0.5\u3002
\u71b5\uff08\u6765\u81ea\u7b2c05\u7ae0\u7684\u4fe1\u606f\u8bba\u90e8\u5206\uff09\u8861\u91cf\u5e73\u5747\u60ca\u8bb6\u7a0b\u5ea6\uff1a
\u7eaf\u8282\u70b9\u7684\u71b5\u4e3a0\u3002\u5b8c\u5168\u5e73\u8861\u7684\u4e8c\u5143\u8282\u70b9\u7684\u71b5\u4e3a1\u6bd4\u7279\u3002\u5b9e\u9645\u4e0a\uff0c\u57fa\u5c3c\u548c\u71b5\u4ea7\u751f\u7684\u6811\u975e\u5e38\u76f8\u4f3c\uff1b\u57fa\u5c3c\u8ba1\u7b97\u7a0d\u5feb\uff0c\u56e0\u4e3a\u5b83\u907f\u514d\u4e86\u5bf9\u6570\u8fd0\u7b97\u3002
\u4fe1\u606f\u589e\u76ca\u662f\u7531\u4e00\u6b21\u5206\u88c2\u5e26\u6765\u7684\u4e0d\u7eaf\u5ea6\u964d\u4f4e\u3002\u5bf9\u4e8e\u5c06\u96c6\u5408 \\(S\\) \u5212\u5206\u4e3a\u5b50\u96c6 \\(S_L\\) \u548c \\(S_R\\) \u7684\u5206\u88c2\uff1a
\u7b97\u6cd5\u5728\u6bcf\u4e00\u8282\u70b9\u8d2a\u5fc3\u5730\u9009\u62e9\u4fe1\u606f\u589e\u76ca\u6700\u9ad8\u7684\u5206\u88c2\u3002\u8fd9\u662f\u4e00\u79cd\u5c40\u90e8\u6700\u4f18\u7b56\u7565\uff0c\u800c\u975e\u5168\u5c40\u6700\u4f18\uff0c\u4f46\u5728\u5b9e\u8df5\u4e2d\u6548\u679c\u5f88\u597d\u3002
\u56de\u5f52\u6811\u5de5\u4f5c\u539f\u7406\u76f8\u540c\uff0c\u4f46\u53f6\u5b50\u9884\u6d4b\u8fde\u7eed\u503c\uff08\u5230\u8fbe\u8be5\u53f6\u5b50\u7684\u6837\u672c\u7684\u5747\u503c\uff09\uff0c\u5206\u88c2\u51c6\u5219\u4f7f\u7528\u65b9\u5dee\u51cf\u5c11\u800c\u975e\u57fa\u5c3c\u6216\u71b5\u3002
\u5982\u679c\u4e0d\u52a0\u7ea6\u675f\uff0c\u51b3\u7b56\u6811\u4f1a\u4e00\u76f4\u5206\u88c2\u76f4\u5230\u6bcf\u4e2a\u53f6\u5b50\u90fd\u7eaf\uff0c\u672c\u8d28\u4e0a\u662f\u5728\u8bb0\u5fc6\u8bad\u7ec3\u6570\u636e\u3002\u8fd9\u662f\u4e25\u91cd\u7684\u8fc7\u62df\u5408\u3002\u526a\u679d\u7528\u4e8e\u5e94\u5bf9\u8fd9\u4e00\u95ee\u9898\u3002\u9884\u526a\u679d\u5728\u6811\u751f\u957f\u4e4b\u524d\u8bbe\u7f6e\u9650\u5236\uff1a\u6700\u5927\u6df1\u5ea6\u3001\u6bcf\u4e2a\u53f6\u5b50\u7684\u6700\u5c11\u6837\u672c\u6570\u3001\u6216\u8fdb\u884c\u5206\u88c2\u7684\u6700\u5c0f\u4fe1\u606f\u589e\u76ca\u3002\u540e\u526a\u679d\u5148\u751f\u957f\u5b8c\u6574\u6811\uff0c\u7136\u540e\u79fb\u9664\u90a3\u4e9b\u4e0d\u80fd\u63d0\u5347\u9a8c\u8bc1\u96c6\u6027\u80fd\u7684\u5206\u652f\u3002
\u5355\u4e2a\u51b3\u7b56\u6811\u6613\u4e8e\u89e3\u91ca\uff0c\u4f46\u5f80\u5f80\u4e0d\u7a33\u5b9a\uff1a\u6570\u636e\u7684\u5fae\u5c0f\u53d8\u5316\u53ef\u80fd\u5bfc\u81f4\u5b8c\u5168\u4e0d\u540c\u7684\u6811\u3002\u96c6\u6210\u65b9\u6cd5\u7ec4\u5408\u591a\u4e2a\u6a21\u578b\uff0c\u4ee5\u83b7\u5f97\u6bd4\u4efb\u4f55\u5355\u4e2a\u6a21\u578b\u66f4\u597d\u7684\u9884\u6d4b\u7ed3\u679c\u3002
\u6838\u5fc3\u601d\u60f3\u662f\"\u7fa4\u4f17\u667a\u6167\"\u3002\u5982\u679c\u4f60\u95ee100\u4e2a\u5e73\u5eb8\u7684\u5206\u7c7b\u5668\u7136\u540e\u8fdb\u884c\u591a\u6570\u6295\u7968\uff0c\u53ea\u8981\u5404\u4e2a\u5206\u7c7b\u5668\u505a\u51fa\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u72ec\u7acb\u7684\u9519\u8bef\uff0c\u96c6\u6210\u7ed3\u679c\u53ef\u4ee5\u975e\u5e38\u51fa\u8272\u3002
Bagging\uff08\u81ea\u52a9\u6c47\u805a\u6cd5\uff09\u5728\u6570\u636e\u7684\u4e0d\u540c\u968f\u673a\u5b50\u96c6\u4e0a\u8bad\u7ec3\u591a\u4e2a\u6a21\u578b\uff0c\u91c7\u7528\u6709\u653e\u56de\u62bd\u6837\uff08bootstrap\u6837\u672c\uff09\u3002\u6bcf\u4e2a\u6a21\u578b\u5927\u7ea6\u770b\u5230\u539f\u59cb\u6570\u636e\u768463%\u3002\u5728\u9884\u6d4b\u65f6\uff0c\u4f60\u5bf9\u8f93\u51fa\u53d6\u5e73\u5747\uff08\u56de\u5f52\uff09\u6216\u8fdb\u884c\u591a\u6570\u6295\u7968\uff08\u5206\u7c7b\uff09\u3002\u7531\u4e8e\u6bcf\u4e2a\u6a21\u578b\u770b\u5230\u4e0d\u540c\u7684\u6570\u636e\uff0c\u5b83\u4eec\u72af\u4e0d\u540c\u7684\u9519\u8bef\uff0c\u5e73\u5747\u64cd\u4f5c\u62b5\u6d88\u4e86\u5927\u90e8\u5206\u65b9\u5dee\u3002
\u968f\u673a\u68ee\u6797\u662f\u5c06bagging\u5e94\u7528\u4e8e\u51b3\u7b56\u6811\u5e76\u589e\u52a0\u4e00\u4e2a\u989d\u5916\u6280\u5de7\uff1a\u5728\u6bcf\u4e2a\u5206\u88c2\u5904\uff0c\u6811\u53ea\u8003\u8651\u4e00\u4e2a\u968f\u673a\u7684\u7279\u5f81\u5b50\u96c6\uff08\u901a\u5e38\u662f\u4ece \\(d\\) \u4e2a\u603b\u7279\u5f81\u4e2d\u9009 \\(\\sqrt{d}\\) \u4e2a\uff09\u3002\u8fd9\u8fdb\u4e00\u6b65\u53bb\u9664\u4e86\u6811\u4e4b\u95f4\u7684\u76f8\u5173\u6027\uff0c\u4f7f\u96c6\u6210\u66f4\u5f3a\u5927\u3002\u968f\u673a\u68ee\u6797\u662f\u6574\u4e2a\u673a\u5668\u5b66\u4e60\u4e2d\u6700\u53ef\u9760\u7684\u73b0\u6210\u5206\u7c7b\u5668\u4e4b\u4e00\u3002
Boosting\u91c7\u53d6\u4e86\u76f8\u53cd\u7684\u54f2\u5b66\u3002\u5b83\u4e0d\u662f\u72ec\u7acb\u5730\u8bad\u7ec3\u6a21\u578b\uff0c\u800c\u662f\u987a\u5e8f\u5730\u8bad\u7ec3\uff0c\u6bcf\u4e2a\u65b0\u6a21\u578b\u4e13\u6ce8\u4e8e\u4e4b\u524d\u6a21\u578b\u5206\u7c7b\u9519\u8bef\u7684\u6837\u672c\u3002
AdaBoost\uff08\u81ea\u9002\u5e94\u63d0\u5347\uff09\u4e3a\u6bcf\u4e2a\u8bad\u7ec3\u6837\u672c\u7ef4\u62a4\u4e00\u4e2a\u6743\u91cd\u3002\u6700\u521d\u6240\u6709\u6743\u91cd\u76f8\u7b49\u3002\u8bad\u7ec3\u4e00\u4e2a\u5f31\u5b66\u4e60\u5668\uff08\u901a\u5e38\u662f\u6df1\u5ea6\u5f88\u6d45\u7684\u51b3\u7b56\u6811\uff0c\u79f0\u4e3a\"\u6869\"\uff09\u540e\uff0c\u88ab\u9519\u8bef\u5206\u7c7b\u7684\u6837\u672c\u83b7\u5f97\u66f4\u9ad8\u7684\u6743\u91cd\uff0c\u56e0\u6b64\u4e0b\u4e00\u4e2a\u5b66\u4e60\u5668\u66f4\u52a0\u5173\u6ce8\u5b83\u4eec\u3002\u6700\u7ec8\u9884\u6d4b\u662f\u6240\u6709\u5b66\u4e60\u5668\u7684\u52a0\u6743\u6295\u7968\uff0c\u8868\u73b0\u66f4\u597d\u7684\u5b66\u4e60\u5668\u62e5\u6709\u66f4\u5927\u7684\u53d1\u8a00\u6743\uff1a
\u9519\u8bef\u7387\u4f4e\u7684\u5b66\u4e60\u5668\u83b7\u5f97\u5927\u7684\u6b63\u6743\u91cd\uff1b\u8868\u73b0\u4e0e\u968f\u673a\u6c34\u5e73\u6301\u5e73\uff08\\(\\epsilon = 0.5\\)\uff09\u7684\u5b66\u4e60\u5668\u83b7\u5f97\u96f6\u6743\u91cd\u3002
\u68af\u5ea6\u63d0\u5347\u63a8\u5e7f\u4e86\u8fd9\u4e00\u601d\u60f3\u3002\u4e0d\u540c\u4e8e\u91cd\u65b0\u52a0\u6743\u6837\u672c\uff0c\u6bcf\u4e2a\u65b0\u6a21\u578b\u88ab\u8bad\u7ec3\u6765\u9884\u6d4b\u5f53\u524d\u96c6\u6210\u6574\u4f53\u7684\u6b8b\u5dee\u8bef\u5dee\uff08\u635f\u5931\u51fd\u6570\u7684\u8d1f\u68af\u5ea6\uff09\u3002\u5bf9\u4e8e\u5e73\u65b9\u8bef\u5dee\u635f\u5931\uff0c\u6b8b\u5dee\u5c31\u662f\u9884\u6d4b\u503c\u4e0e\u76ee\u6807\u503c\u4e4b\u95f4\u7684\u5dee\u503c\u3002\u57fa\u4e8e\u51b3\u7b56\u6811\u7684\u68af\u5ea6\u63d0\u5347\uff08GBDT\uff09\u662f\u7ed3\u6784\u5316\u6570\u636e\u7ade\u8d5b\u4e2d\u8bb8\u591a\u83b7\u80dc\u65b9\u6848\u80cc\u540e\u7684\u65b9\u6cd5\uff08XGBoost\u3001LightGBM\u3001CatBoost\u662f\u6d41\u884c\u7684\u5b9e\u73b0\uff09\u3002
\u5173\u952e\u5bf9\u6bd4\uff1abagging\u964d\u4f4e\u65b9\u5dee\uff08\u901a\u8fc7\u5e73\u5747\u6d88\u9664\u566a\u58f0\uff09\uff0c\u800cboosting\u964d\u4f4e\u504f\u5dee\uff08\u7ea0\u6b63\u7cfb\u7edf\u6027\u9519\u8bef\uff09\u3002Bagging\u5728\u4e2a\u522b\u6a21\u578b\u8fc7\u62df\u5408\u65f6\u6548\u679c\u6700\u597d\uff1bboosting\u5728\u6a21\u578b\u6b20\u62df\u5408\u65f6\u6548\u679c\u6700\u597d\u3002
\u8f6c\u5411\u65e0\u76d1\u7763\u5b66\u4e60\uff0cK-Means\u805a\u7c7b\u662f\u6700\u7b80\u5355\u4e14\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684\u805a\u7c7b\u7b97\u6cd5\u3002\u7ed9\u5b9a \\(n\\) \u4e2a\u6570\u636e\u70b9\u548c\u76ee\u6807\u805a\u7c7b\u6570 \\(K\\)\uff0c\u5b83\u901a\u8fc7\u6700\u5c0f\u5316\u6bcf\u4e2a\u70b9\u5230\u5176\u805a\u7c7b\u4e2d\u5fc3\u7684\u8ddd\u79bb\u603b\u548c\uff0c\u5c06\u6bcf\u4e2a\u70b9\u5206\u914d\u7ed9 \\(K\\) \u4e2a\u7ec4\u4e4b\u4e00\u3002
\u7b97\u6cd5\u4ea4\u66ff\u8fdb\u884c\u4e24\u4e2a\u6b65\u9aa4\u3002\u9996\u5148\uff0c\u5c06\u6bcf\u4e2a\u70b9\u5206\u914d\u5230\u6700\u8fd1\u7684\u4e2d\u5fc3\u70b9\u3002\u5176\u6b21\uff0c\u5c06\u6bcf\u4e2a\u4e2d\u5fc3\u70b9\u66f4\u65b0\u4e3a\u5206\u914d\u7ed9\u5b83\u7684\u6240\u6709\u70b9\u7684\u5747\u503c\u3002\u91cd\u590d\u76f4\u5230\u5206\u914d\u4e0d\u518d\u53d8\u5316\u3002\u8fd9\u4fdd\u8bc1\u6536\u655b\uff0c\u56e0\u4e3a\u6bcf\u4e00\u6b65\u603b\u7c07\u5185\u8ddd\u79bb\u90fd\u4f1a\u51cf\u5c0f\uff08\u6216\u4fdd\u6301\u4e0d\u53d8\uff09\u3002
\u5176\u4e2d \\(\\mu_k\\) \u662f\u7c07 \\(C_k\\) \u7684\u4e2d\u5fc3\u70b9\u3002
K-Means\u5bf9\u521d\u59cb\u5316\u654f\u611f\u3002\u7cdf\u7cd5\u7684\u8d77\u59cb\u4e2d\u5fc3\u70b9\u53ef\u80fd\u5bfc\u81f4\u8f83\u5dee\u7684\u5c40\u90e8\u6700\u5c0f\u503c\u3002K-Means++ \u521d\u59cb\u5316\u7b56\u7565\u9996\u5148\u968f\u673a\u9009\u62e9\u4e00\u4e2a\u4e2d\u5fc3\u70b9\uff0c\u7136\u540e\u6bcf\u4e2a\u540e\u7eed\u4e2d\u5fc3\u70b9\u7684\u9009\u62e9\u6982\u7387\u4e0e\u5176\u8ddd\u79bb\u6700\u8fd1\u73b0\u6709\u4e2d\u5fc3\u70b9\u7684\u5e73\u65b9\u8ddd\u79bb\u6210\u6b63\u6bd4\u3002\u8fd9\u5206\u6563\u4e86\u521d\u59cb\u4e2d\u5fc3\u70b9\uff0c\u51e0\u4e4e\u603b\u662f\u80fd\u7ed9\u51fa\u66f4\u597d\u7684\u7ed3\u679c\u3002
\u5982\u4f55\u9009\u62e9 \\(K\\)\uff1f\u4e24\u79cd\u5e38\u7528\u5de5\u5177\u3002\u8098\u90e8\u6cd5\u7ed8\u5236\u60ef\u6027\u968f \\(K\\) \u53d8\u5316\u7684\u66f2\u7ebf\uff0c\u5bfb\u627e\"\u8098\u90e8\"\u2014\u2014\u589e\u52a0\u66f4\u591a\u7c07\u4e0d\u518d\u663e\u8457\u5e2e\u52a9\u7684\u70b9\u3002\u8f6e\u5ed3\u7cfb\u6570\u8861\u91cf\u4e00\u4e2a\u70b9\u4e0e\u5176\u81ea\u8eab\u7c07\u7684\u76f8\u4f3c\u5ea6\u76f8\u5bf9\u4e8e\u6700\u8fd1\u5176\u4ed6\u7c07\u7684\u76f8\u4f3c\u5ea6\uff0c\u8303\u56f4\u4ece-1\uff08\u9519\u8bef\u7c07\uff09\u5230+1\uff08\u826f\u597d\u805a\u7c7b\uff09\u3002\u6240\u6709\u70b9\u7684\u5e73\u5747\u8f6e\u5ed3\u7cfb\u6570\u7ed9\u51fa\u4e86\u805a\u7c7b\u8d28\u91cf\u7684\u6574\u4f53\u8861\u91cf\u3002
K-Means\u6709\u5c40\u9650\u6027\uff1a\u5b83\u5047\u8bbe\u5927\u81f4\u76f8\u7b49\u5927\u5c0f\u7684\u7403\u5f62\u7c07\uff0c\u5e76\u4e14\u5b83\u505a\u51fa\"\u786c\"\u5206\u914d\uff08\u6bcf\u4e2a\u70b9\u6070\u597d\u5c5e\u4e8e\u4e00\u4e2a\u7c07\uff09\u3002\u9ad8\u65af\u6df7\u5408\u6a21\u578b\uff08GMM\uff09 \u653e\u677e\u4e86\u8fd9\u4e24\u4e2a\u9650\u5236\u3002
GMM\u5c06\u6570\u636e\u5efa\u6a21\u4e3a \\(K\\) \u4e2a\u9ad8\u65af\u5206\u5e03\u7684\u6df7\u5408\uff0c\u6bcf\u4e2a\u5206\u5e03\u6709\u81ea\u5df1\u7684\u5747\u503c \\(\\mu_k\\)\u3001\u534f\u65b9\u5dee \\(\\Sigma_k\\) \u548c\u6df7\u5408\u6743\u91cd \\(\\pi_k\\)\uff08\u6240\u6709\u6743\u91cd\u4e4b\u548c\u4e3a1\uff09\uff1a
\u4e0d\u540c\u4e8e\u786c\u5206\u914d\uff0c\u6bcf\u4e2a\u70b9\u5f97\u5230\u4e00\u4e2a\u8f6f\u5206\u914d\uff1a\u5b83\u5c5e\u4e8e\u6bcf\u4e2a\u7c07\u7684\u6982\u7387\uff08\u79f0\u4e3a\"\u8d23\u4efb\"\uff09\u3002\u4f4d\u4e8e\u4e24\u4e2a\u9ad8\u65af\u8fb9\u754c\u9644\u8fd1\u7684\u70b9\u53ef\u80fd\u662f60%\u5c5e\u4e8e\u7c07A\uff0c40%\u5c5e\u4e8e\u7c07B\u3002
GMM\u4f7f\u7528\u671f\u671b-\u6700\u5927\u5316\uff08EM\uff09\u7b97\u6cd5\u8fdb\u884c\u62df\u5408\uff0c\u8be5\u7b97\u6cd5\u4ea4\u66ff\u4e24\u4e2a\u6b65\u9aa4\uff0c\u4e0eK-Means\u975e\u5e38\u7c7b\u4f3c\u3002E\u6b65\u8ba1\u7b97\u8d23\u4efb\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u70b9\uff0c\u5b83\u6765\u81ea\u6bcf\u4e2a\u9ad8\u65af\u7684\u6982\u7387\u662f\u591a\u5c11\uff1fM\u6b65\u66f4\u65b0\u53c2\u6570\uff1a\u7ed9\u5b9a\u8d23\u4efb\uff0c\u6700\u4f73\u7684\u5747\u503c\u3001\u534f\u65b9\u5dee\u548c\u6df7\u5408\u6743\u91cd\u662f\u4ec0\u4e48\uff1fEM\u4fdd\u8bc1\u6bcf\u6b21\u8fed\u4ee3\u589e\u52a0\u6570\u636e\u4f3c\u7136\uff0c\u5e76\u6536\u655b\u5230\u5c40\u90e8\u6700\u5927\u503c\u3002
K-Means\u5b9e\u9645\u4e0a\u662fGMM\u7684EM\u7b97\u6cd5\u7684\u4e00\u4e2a\u7279\u4f8b\uff1a\u5b83\u5bf9\u5e94\u4e8e\u5177\u6709\u76f8\u7b49\u534f\u65b9\u5dee\u7684\u7403\u5f62\u9ad8\u65af\u548c\u786c\uff080/1\uff09\u8d23\u4efb\u5206\u914d\u3002
\u652f\u6301\u5411\u91cf\u673a\uff08SVM\uff09 \u4ece\u51e0\u4f55\u89c6\u89d2\u5904\u7406\u5206\u7c7b\u95ee\u9898\u3002\u7ed9\u5b9a\u4e24\u4e2a\u7ebf\u6027\u53ef\u5206\u7684\u7c7b\u522b\uff0c\u5b58\u5728\u65e0\u9650\u591a\u4e2a\u8d85\u5e73\u9762\u53ef\u4ee5\u5c06\u5b83\u4eec\u5206\u5f00\u3002SVM\u627e\u5230\u6700\u5927\u95f4\u9694\u7684\u90a3\u4e2a\u2014\u2014\u8d85\u5e73\u9762\u4e0e\u6bcf\u4e2a\u7c7b\u522b\u6700\u8fd1\u6570\u636e\u70b9\u4e4b\u95f4\u7684\u6700\u5927\u53ef\u80fd\u95f4\u9699\u3002
\u6700\u8fd1\u7684\u70b9\uff0c\u5373\u6070\u597d\u4f4d\u4e8e\u95f4\u9694\u8fb9\u7f18\u7684\u70b9\uff0c\u79f0\u4e3a\u652f\u6301\u5411\u91cf\u3002\u5b83\u4eec\u662f\u5b9a\u4e49\u51b3\u7b56\u8fb9\u754c\u552f\u4e00\u91cd\u8981\u7684\u70b9\uff1b\u4f60\u53ef\u4ee5\u79fb\u9664\u6240\u6709\u5176\u4ed6\u8bad\u7ec3\u70b9\uff0c\u4ecd\u7136\u5f97\u5230\u76f8\u540c\u7684\u8d85\u5e73\u9762\u3002
\u8fd9\u662f\u4e00\u4e2a\u51f8\u4e8c\u6b21\u89c4\u5212\u95ee\u9898\uff0c\u56e0\u6b64\u6709\u552f\u4e00\u7684\u5168\u5c40\u89e3\uff08\u65e0\u9700\u62c5\u5fc3\u5c40\u90e8\u6700\u5c0f\u503c\uff09\u3002
\u771f\u5b9e\u6570\u636e\u5f88\u5c11\u5b8c\u7f8e\u53ef\u5206\u3002\u8f6f\u95f4\u9694SVM \u901a\u8fc7\u5f15\u5165\u677e\u5f1b\u53d8\u91cf \\(\\xi_i \\geq 0\\) \u5141\u8bb8\u4e00\u4e9b\u70b9\u8fdd\u53cd\u95f4\u9694\uff1a
\u8d85\u53c2\u6570 \\(C\\) \u63a7\u5236\u6743\u8861\uff1a\u5927\u7684 \\(C\\) \u5bf9\u9519\u8bef\u5206\u7c7b\u65bd\u52a0\u9ad8\u60e9\u7f5a\uff08\u66f4\u7d27\u7684\u62df\u5408\uff0c\u6709\u8fc7\u62df\u5408\u98ce\u9669\uff09\uff0c\u5c0f\u7684 \\(C\\) \u5141\u8bb8\u66f4\u591a\u8fdd\u89c4\uff08\u66f4\u5bbd\u7684\u95f4\u9694\uff0c\u66f4\u5f3a\u7684\u6b63\u5219\u5316\uff09\u3002
SVM\u6700\u5f3a\u5927\u7684\u7279\u6027\u662f\u6838\u6280\u5de7\u3002\u8bb8\u591a\u5728\u539f\u59cb\u7279\u5f81\u7a7a\u95f4\u4e2d\u4e0d\u662f\u7ebf\u6027\u53ef\u5206\u7684\u6570\u636e\u96c6\uff0c\u5728\u6620\u5c04\u5230\u9ad8\u7ef4\u7a7a\u95f4\u540e\u53d8\u5f97\u53ef\u5206\u3002\u6838\u6280\u5de7\u8ba9\u4f60\u80fd\u591f\u5728\u90a3\u4e2a\u9ad8\u7ef4\u7a7a\u95f4\u4e2d\u8ba1\u7b97\u70b9\u79ef\uff0c\u800c\u65e0\u9700\u663e\u5f0f\u8ba1\u7b97\u53d8\u6362\u3002
\u6838\u51fd\u6570 \\(K(x_i, x_j) = \\phi(x_i) \\cdot \\phi(x_j)\\) \u66ff\u6362SVM\u4f18\u5316\u4e2d\u7684\u6bcf\u4e2a\u70b9\u79ef\u3002\u6700\u6d41\u884c\u7684\u6838\u662f\u5f84\u5411\u57fa\u51fd\u6570\uff08RBF\uff09\u6838\uff1a
RBF\u6838\u9690\u5f0f\u5730\u5c06\u6570\u636e\u6620\u5c04\u5230\u65e0\u9650\u7ef4\u7a7a\u95f4\u3002\u53c2\u6570 \\(\\gamma\\) \u63a7\u5236\u5355\u4e2a\u8bad\u7ec3\u70b9\u7684\u5f71\u54cd\u8303\u56f4\uff1a\u5927\u7684 \\(\\gamma\\) \u610f\u5473\u7740\u6bcf\u4e2a\u70b9\u53ea\u5f71\u54cd\u5176\u7d27\u90bb\u533a\u57df\uff08\u8fc7\u62df\u5408\u98ce\u9669\uff09\uff0c\u5c0f\u7684 \\(\\gamma\\) \u7ed9\u51fa\u66f4\u5e73\u6ed1\u7684\u8fb9\u754c\u3002
\u5176\u4ed6\u5e38\u89c1\u6838\u5305\u62ec\u591a\u9879\u5f0f\u6838 \\(K(x_i, x_j) = (x_i \\cdot x_j + c)^d\\) \u548c\u7ebf\u6027\u6838 \\(K(x_i, x_j) = x_i \\cdot x_j\\)\uff08\u5373\u6ca1\u6709\u4efb\u4f55\u53d8\u6362\u7684\u6807\u51c6SVM\uff09\u3002
\u5b9e\u9645\u4e0a\uff0c\u5e26RBF\u6838\u7684SVM\u5728\u6df1\u5ea6\u5b66\u4e60\u51fa\u73b0\u4e4b\u524d\u662f\u4e3b\u5bfc\u5206\u7c7b\u5668\u3002\u5b83\u4eec\u5728\u4e2d\u5c0f\u89c4\u6a21\u6570\u636e\u96c6\u4e0a\u4ecd\u7136\u8868\u73b0\u826f\u597d\uff0c\u7279\u522b\u662f\u5f53\u7279\u5f81\u6570\u91cf\u76f8\u5bf9\u4e8e\u6837\u672c\u6570\u91cf\u8f83\u5927\u65f6\u3002
SVM\u4e0e\u7b2c02\u7ae0\uff08\u77e9\u9635\uff09\u7684\u8054\u7cfb\u5f88\u6df1\u3002\u4f18\u5316\u901a\u5e38\u4ee5\u5176\u5bf9\u5076\u5f62\u5f0f\u6c42\u89e3\uff0c\u5176\u4e2d\u89e3\u4ec5\u4f9d\u8d56\u4e8e\u8bad\u7ec3\u6837\u672c\u4e4b\u95f4\u7684\u70b9\u79ef\u2014\u2014\u8fd9\u6b63\u662f\u4f7f\u6838\u6280\u5de7\u6210\u4e3a\u53ef\u80fd\u7684\u539f\u56e0\u3002\u6574\u4e2a\u7b97\u6cd5\u4ee5\u5185\u79ef\u548c\u7ebf\u6027\u4ee3\u6570\u7684\u8bed\u8a00\u8fd0\u4f5c\u3002
\u6c47\u603b\u7ecf\u5178ML\u5de5\u5177\u7bb1\uff1a
\u4ece\u5934\u5b9e\u73b0\u9ad8\u65af\u6734\u7d20\u8d1d\u53f6\u65af\u3002\u5728\u5408\u6210\u4e8c\u7ef4\u6570\u636e\uff08\u4e24\u4e2a\u7c7b\u522b\uff09\u4e0a\u8bad\u7ec3\u5e76\u53ef\u89c6\u5316\u51b3\u7b56\u8fb9\u754c\u3002\u4e0escikit-learn\u7684\u5b9e\u73b0\u8fdb\u884c\u6bd4\u8f83\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_classification\n\n# \u751f\u6210\u5408\u6210\u6570\u636e\nX, y = make_classification(n_samples=300, n_features=2, n_redundant=0,\n n_informative=2, n_clusters_per_class=1, random_state=42)\nX, y = jnp.array(X), jnp.array(y)\n\n# \u4ece\u5934\u62df\u5408\u9ad8\u65af\u6734\u7d20\u8d1d\u53f6\u65af\nclasses = jnp.unique(y)\nparams = {}\nfor c in classes:\n c = int(c)\n mask = y == c\n X_c = X[mask]\n params[c] = {\n 'mean': jnp.mean(X_c, axis=0),\n 'var': jnp.var(X_c, axis=0),\n 'prior': jnp.sum(mask) / len(y)\n }\n\ndef gaussian_log_likelihood(x, mean, var):\n return -0.5 * jnp.sum(jnp.log(2 * jnp.pi * var) + (x - mean)**2 / var)\n\ndef predict(X):\n preds = []\n for x in X:\n log_posts = []\n for c in [0, 1]:\n log_post = jnp.log(params[c]['prior']) + gaussian_log_likelihood(\n x, params[c]['mean'], params[c]['var'])\n log_posts.append(log_post)\n preds.append(jnp.argmax(jnp.array(log_posts)))\n return jnp.array(preds)\n\n# \u51b3\u7b56\u8fb9\u754c\u53ef\u89c6\u5316\nxx, yy = jnp.meshgrid(jnp.linspace(X[:,0].min()-1, X[:,0].max()+1, 200),\n jnp.linspace(X[:,1].min()-1, X[:,1].max()+1, 200))\ngrid = jnp.column_stack([xx.ravel(), yy.ravel()])\nzz = predict(grid).reshape(xx.shape)\n\nplt.figure(figsize=(8, 6))\nplt.contourf(xx, yy, zz, alpha=0.3, cmap='coolwarm')\nplt.scatter(X[y==0, 0], X[y==0, 1], c='#3498db', label='Class 0', edgecolors='k', s=20)\nplt.scatter(X[y==1, 0], X[y==1, 1], c='#e74c3c', label='Class 1', edgecolors='k', s=20)\nplt.title(\"Gaussian Naive Bayes Decision Boundary\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n\naccuracy = jnp.mean(predict(X) == y)\nprint(f\"Training accuracy: {accuracy:.2%}\")\n \u6784\u5efa\u4e00\u4e2a\u4f7f\u7528\u57fa\u5c3c\u4e0d\u7eaf\u5ea6\u8fdb\u884c\u5206\u88c2\u7684\u51b3\u7b56\u6811\u3002\u5b9e\u73b0\u5355\u4e2a\u8282\u70b9\u7684\u5206\u88c2\u903b\u8f91\uff0c\u5e76\u5c55\u793a\u4fe1\u606f\u589e\u76ca\u5982\u4f55\u9009\u62e9\u6700\u4f73\u7279\u5f81\u548c\u9608\u503c\u3002
import jax.numpy as jnp\n\ndef gini_impurity(y):\n \"\"\"\u8ba1\u7b97\u6807\u7b7e\u6570\u7ec4\u7684\u57fa\u5c3c\u4e0d\u7eaf\u5ea6\u3002\"\"\"\n classes, counts = jnp.unique(y, return_counts=True)\n probs = counts / len(y)\n return 1.0 - jnp.sum(probs ** 2)\n\ndef information_gain(y, left_mask):\n \"\"\"\u901a\u8fc7\u5e03\u5c14\u63a9\u7801\u5c06y\u5206\u88c2\u4e3a\u5de6/\u53f3\u540e\u7684\u4fe1\u606f\u589e\u76ca\u3002\"\"\"\n parent_gini = gini_impurity(y)\n left_y, right_y = y[left_mask], y[~left_mask]\n n = len(y)\n if len(left_y) == 0 or len(right_y) == 0:\n return 0.0\n child_gini = (len(left_y)/n) * gini_impurity(left_y) + \\\n (len(right_y)/n) * gini_impurity(right_y)\n return float(parent_gini - child_gini)\n\ndef best_split(X, y):\n \"\"\"\u627e\u5230\u6700\u5927\u5316\u4fe1\u606f\u589e\u76ca\u7684\u7279\u5f81\u548c\u9608\u503c\u3002\"\"\"\n best_ig, best_feat, best_thresh = -1, None, None\n for feat in range(X.shape[1]):\n thresholds = jnp.unique(X[:, feat])\n for thresh in thresholds:\n mask = X[:, feat] <= float(thresh)\n ig = information_gain(y, mask)\n if ig > best_ig:\n best_ig, best_feat, best_thresh = ig, feat, float(thresh)\n return best_feat, best_thresh, best_ig\n\n# \u793a\u4f8b\uff1a\u5408\u6210\u6570\u636e\nfrom sklearn.datasets import make_classification\nX, y = make_classification(n_samples=100, n_features=4, n_redundant=0, random_state=0)\nX, y = jnp.array(X), jnp.array(y)\n\nfeat, thresh, ig = best_split(X, y)\nprint(f\"Best split: feature {feat}, threshold {thresh:.3f}, info gain {ig:.4f}\")\nprint(f\"Parent Gini: {gini_impurity(y):.4f}\")\nmask = X[:, feat] <= thresh\nprint(f\"Left Gini: {gini_impurity(y[mask]):.4f} ({int(jnp.sum(mask))} samples)\")\nprint(f\"Right Gini: {gini_impurity(y[~mask]):.4f} ({int(jnp.sum(~mask))} samples)\")\n \u4ece\u5934\u5b9e\u73b0\u5e26K-Means++\u521d\u59cb\u5316\u7684K-Means\u3002\u5bf9\u5408\u6210\u6570\u636e\u96c6\u8fdb\u884c\u805a\u7c7b\u5e76\u53ef\u89c6\u5316\u6bcf\u6b21\u8fed\u4ee3\u7684\u7c07\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_blobs\n\n# \u751f\u6210\u5408\u6210\u7c07\nX, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.8, random_state=42)\nX = jnp.array(X)\n\ndef kmeans_plus_plus_init(X, K, key):\n \"\"\"K-Means++\u521d\u59cb\u5316\u3002\"\"\"\n n = X.shape[0]\n idx = jax.random.randint(key, (), 0, n)\n centroids = [X[idx]]\n for _ in range(1, K):\n dists = jnp.min(jnp.stack([jnp.sum((X - c)**2, axis=1) for c in centroids]), axis=0)\n probs = dists / jnp.sum(dists)\n key, subkey = jax.random.split(key)\n idx = jax.random.choice(subkey, n, p=probs)\n centroids.append(X[idx])\n return jnp.stack(centroids)\n\ndef kmeans(X, K, max_iters=20, key=jax.random.PRNGKey(0)):\n centroids = kmeans_plus_plus_init(X, K, key)\n history = [centroids]\n for _ in range(max_iters):\n # \u5206\u914d\u6b65\u9aa4\n dists = jnp.stack([jnp.sum((X - c)**2, axis=1) for c in centroids])\n labels = jnp.argmin(dists, axis=0)\n # \u66f4\u65b0\u6b65\u9aa4\n new_centroids = jnp.stack([\n jnp.mean(X[labels == k], axis=0) for k in range(K)\n ])\n history.append(new_centroids)\n if jnp.allclose(centroids, new_centroids):\n break\n centroids = new_centroids\n return labels, centroids, history\n\nK = 4\nlabels, centroids, history = kmeans(X, K)\n\n# \u7ed8\u5236\u6700\u7ec8\u7ed3\u679c\ncolors = ['#3498db', '#e74c3c', '#27ae60', '#9b59b6']\nplt.figure(figsize=(8, 6))\nfor k in range(K):\n mask = labels == k\n plt.scatter(X[mask, 0], X[mask, 1], c=colors[k], s=20, alpha=0.6)\n plt.scatter(centroids[k, 0], centroids[k, 1], c=colors[k], marker='X',\n s=200, edgecolors='k', linewidths=1.5)\nplt.title(f\"K-Means Clustering (K={K}, {len(history)-1} iterations)\")\nplt.grid(alpha=0.3)\nplt.show()\n\n# \u8ba1\u7b97\u60ef\u6027\ninertia = sum(jnp.sum((X[labels == k] - centroids[k])**2) for k in range(K))\nprint(f\"Final inertia: {inertia:.2f}\")\n \u6f14\u793a\u6838\u6280\u5de7\u3002\u901a\u8fc7\u6bd4\u8f83\u6838\u77e9\u9635\u4e0e\u591a\u9879\u5f0f\u6838\u7684\u663e\u5f0f\u7279\u5f81\u6620\u5c04\uff0c\u5c55\u793aRBF\u6838\u5982\u4f55\u5728\u9ad8\u7ef4\u7a7a\u95f4\u4e2d\u8ba1\u7b97\u70b9\u79ef\u3002
import jax.numpy as jnp\n\n# \u7b80\u53552D\u6570\u636e\nX = jnp.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])\n\n# \u591a\u9879\u5f0f\u6838\uff1aK(x,y) = (x\u00b7y + 1)^2\ndef poly_kernel(X, degree=2, c=1.0):\n return (X @ X.T + c) ** degree\n\n# 2D\u7684\u663e\u5f0f\u4e8c\u6b21\u7279\u5f81\u6620\u5c04\uff1a(1, sqrt(2)*x1, sqrt(2)*x2, x1^2, x2^2, sqrt(2)*x1*x2)\ndef poly_features(X):\n x1, x2 = X[:, 0], X[:, 1]\n return jnp.column_stack([\n jnp.ones(len(X)),\n jnp.sqrt(2) * x1,\n jnp.sqrt(2) * x2,\n x1 ** 2,\n x2 ** 2,\n jnp.sqrt(2) * x1 * x2\n ])\n\nK_trick = poly_kernel(X)\nphi = poly_features(X)\nK_explicit = phi @ phi.T\n\nprint(\"Kernel trick (polynomial degree 2):\")\nprint(K_trick)\nprint(\"\\nExplicit feature map dot products:\")\nprint(K_explicit)\nprint(f\"\\nMatrices match: {jnp.allclose(K_trick, K_explicit)}\")\n\n# RBF\u6838\uff1a\u4e0d\u5b58\u5728\u6709\u9650\u7684\u663e\u5f0f\u6620\u5c04\ndef rbf_kernel(X, gamma=0.5):\n sq_dists = jnp.sum(X**2, axis=1, keepdims=True) + \\\n jnp.sum(X**2, axis=1) - 2 * X @ X.T\n return jnp.exp(-gamma * sq_dists)\n\nK_rbf = rbf_kernel(X)\nprint(\"\\nRBF kernel matrix:\")\nprint(K_rbf)\nprint(\"Diagonal is always 1 (a point is identical to itself)\")\nprint(\"Off-diagonal entries decay with distance\")\n \u57fa\u4e8e\u68af\u5ea6\u7684\u5b66\u4e60\u901a\u8fc7\u6cbf\u7740\u635f\u5931\u66f2\u9762\u7684\u659c\u7387\u8fed\u4ee3\u4f18\u5316\u6a21\u578b\u53c2\u6570\u3002\u672c\u6587\u6db5\u76d6\u7ebf\u6027\u56de\u5f52\u3001\u903b\u8f91\u56de\u5f52\u3001softmax\u5206\u7c7b\u3001\u68af\u5ea6\u4e0b\u964d\u53d8\u4f53\u3001\u6b63\u5219\u5316\uff08L1/L2\uff09\u548c\u504f\u5dee-\u65b9\u5dee\u6743\u8861
\u7b2c01\u7bc7\u4e2d\u7684\u7ecf\u5178\u65b9\u6cd5\u4f7f\u7528\u5de7\u5999\u7684\u542f\u53d1\u5f0f\u6216\u95ed\u5f0f\u89e3\u3002\u672c\u6587\u6db5\u76d6\u901a\u8fc7\u6cbf\u7740\u68af\u5ea6\u5b66\u4e60\u3001\u5728\u635f\u5931\u66f2\u9762\u4e0a\u5c0f\u6b65\u4e0b\u5761\u76f4\u5230\u627e\u5230\u597d\u53c2\u6570\u7684\u7b97\u6cd5\u3002\u57fa\u4e8e\u68af\u5ea6\u7684\u5b66\u4e60\u662f\u4ece\u7ebf\u6027\u56de\u5f52\u5230\u6700\u5927\u795e\u7ecf\u7f51\u7edc\u7684\u4e00\u5207\u80cc\u540e\u7684\u5f15\u64ce\u3002
\u7ebf\u6027\u56de\u5f52\u662f\u6700\u7b80\u5355\u7684\u57fa\u4e8e\u68af\u5ea6\u7684\u6a21\u578b\uff0c\u5b83\u4e5f\u6709\u95ed\u5f0f\u89e3\uff0c\u8fd9\u4f7f\u5176\u6210\u4e3a\u5b8c\u7f8e\u7684\u8d77\u70b9\u3002\u6a21\u578b\u662f\u4e00\u6761\u76f4\u7ebf\uff08\u6216\u66f4\u9ad8\u7ef4\u7684\u8d85\u5e73\u9762\uff09\uff1a
\u7528\u77e9\u9635\u7b26\u53f7\uff08\u6765\u81ea\u7b2c02\u7ae0\uff09\uff0c\u5982\u679c\u6211\u4eec\u5c06\u6240\u6709\u8bad\u7ec3\u8f93\u5165\u5806\u53e0\u4e3a\u77e9\u9635 \\(X\\) \u7684\u884c\uff0c\u5e76\u901a\u8fc7\u8ffd\u52a0\u4e00\u52171\u5c06\u504f\u7f6e\u5438\u6536\u5230 \\(w\\) \u4e2d\uff0c\u8fd9\u5c31\u53d8\u6210\u4e86 \\(\\hat{y} = Xw\\)\u3002
\u76ee\u6807\u662f\u6700\u5c0f\u5316\u5747\u65b9\u8bef\u5dee\uff08MSE\uff09\uff0c\u5373\u9884\u6d4b\u503c\u4e0e\u5b9e\u9645\u503c\u4e4b\u95f4\u5e73\u5747\u5e73\u65b9\u5dee\uff1a
\u8fd9\u76f4\u63a5\u4f7f\u7528\u4e86\u7b2c02\u7ae0\u7684\u77e9\u9635\u9006\u8fd0\u7b97\u3002\u8868\u8fbe\u5f0f \\(X^T X\\) \u662f\u4e00\u4e2a \\(d \\times d\\) \u77e9\u9635\uff08\u5176\u4e2d \\(d\\) \u662f\u7279\u5f81\u6570\u91cf\uff09\uff0c\\(X^T y\\) \u662f\u4e00\u4e2a \\(d\\) \u7ef4\u5411\u91cf\u3002\u6b63\u89c4\u65b9\u7a0b\u4e00\u6b21\u6027\u7ed9\u51fa\u7cbe\u786e\u7684\u6700\u4f18\u6743\u91cd\u3002
\u6b63\u89c4\u65b9\u7a0b\u4f55\u65f6\u5931\u6548\uff1f\u5f53 \\(X^T X\\) \u5947\u5f02\uff08\u4e0d\u53ef\u9006\uff09\u65f6\uff0c\u8fd9\u53d1\u751f\u5728\u7279\u5f81\u7ebf\u6027\u76f8\u5173\u6216\u7279\u5f81\u6570\u91cf\u591a\u4e8e\u6837\u672c\u6570\u91cf\uff08\\(d > n\\)\uff09\u7684\u60c5\u51b5\u4e0b\u3002\u5728\u8fd9\u4e9b\u60c5\u51b5\u4e0b\uff0c\u4f60\u9700\u8981\u6b63\u5219\u5316\uff08\u540e\u7eed\u4ecb\u7ecd\uff09\u6216\u68af\u5ea6\u4e0b\u964d\u3002
\u903b\u8f91\u56de\u5f52\u5c06\u7ebf\u6027\u6a21\u578b\u9002\u7528\u4e8e\u4e8c\u5143\u5206\u7c7b\u3002\u6211\u4eec\u4e0d\u9884\u6d4b\u8fde\u7eed\u503c\uff0c\u800c\u662f\u60f3\u8981\u4e00\u4e2a\u4ecb\u4e8e0\u548c1\u4e4b\u95f4\u7684\u6982\u7387\u3002Sigmoid\u51fd\u6570\u5c06\u6240\u6709\u5b9e\u6570\u538b\u7f29\u5230\u8fd9\u4e2a\u8303\u56f4\u5185\uff1a
Sigmoid\u5177\u6709\u826f\u597d\u7684\u6027\u8d28\uff1a\\(\\sigma(0) = 0.5\\)\uff0c\\(\\sigma(z) \\to 1\\) \u5f53 \\(z \\to \\infty\\)\uff0c\\(\\sigma(z) \\to 0\\) \u5f53 \\(z \\to -\\infty\\)\uff0c\u4e14\u5176\u5bfc\u6570\u5177\u6709\u4f18\u96c5\u7684\u5f62\u5f0f \\(\\sigma'(z) = \\sigma(z)(1 - \\sigma(z))\\)\u3002
\u903b\u8f91\u56de\u5f52\u7684\u635f\u5931\u51fd\u6570\u662f\u4e8c\u5143\u4ea4\u53c9\u71b5\uff08BCE\uff09\uff0c\u76f4\u63a5\u6765\u81ea\u4e8e\u4f2f\u52aa\u5229\u4f3c\u7136\uff08\u7b2c05\u7ae0\uff09\uff1a
\u5f53\u771f\u5b9e\u6807\u7b7e\u4e3a1\u65f6\uff0c\u53ea\u6709\u7b2c\u4e00\u9879\u8d77\u4f5c\u7528\uff0c\u5b83\u60e9\u7f5a\u8fc7\u4f4e\u7684\u9884\u6d4b\u3002\u5f53\u771f\u5b9e\u6807\u7b7e\u4e3a0\u65f6\uff0c\u53ea\u6709\u7b2c\u4e8c\u9879\u8d77\u4f5c\u7528\uff0c\u5b83\u60e9\u7f5a\u8fc7\u9ad8\u7684\u9884\u6d4b\u3002\u5bf9\u6570\u4f7f\u5f97\u5bf9\u4e8e\u81ea\u4fe1\u7684\u9519\u8bef\u9884\u6d4b\uff0c\u60e9\u7f5a\u6781\u5176\u9661\u5ced\uff1a\u5f53\u771f\u5b9e\u6807\u7b7e\u4e3a1\u65f6\u9884\u6d4b0.01\uff0c\u4ee3\u4ef7\u8fdc\u9ad8\u4e8e\u9884\u6d4b0.4\u3002
\u4e0e\u7ebf\u6027\u56de\u5f52\u7684MSE\u4e0d\u540c\uff0cBCE\u6700\u5c0f\u5316\u6743\u91cd\u6ca1\u6709\u95ed\u5f0f\u89e3\u3002\u6211\u4eec\u9700\u8981\u4e00\u79cd\u8fed\u4ee3\u65b9\u6cd5\uff1a\u68af\u5ea6\u4e0b\u964d\u3002
\u68af\u5ea6\u4e0b\u964d\u7684\u76f4\u89c9\u5f88\u7b80\u5355\uff1a\u60f3\u8c61\u4f60\u8eab\u5904\u5927\u96fe\u4e2d\u7684\u4e18\u9675\u5730\u5e26\uff08\u635f\u5931\u66f2\u9762\uff09\u3002\u4f60\u770b\u4e0d\u5230\u5168\u5c40\u6700\u5c0f\u503c\uff0c\u4f46\u53ef\u4ee5\u611f\u53d7\u5230\u811a\u4e0b\u7684\u5761\u5ea6\u3002\u4f60\u5411\u4e0b\u5761\u8d70\u4e00\u6b65\uff0c\u518d\u6b21\u611f\u53d7\u5761\u5ea6\uff0c\u7136\u540e\u91cd\u590d\u3002\u6700\u7ec8\u4f60\u5230\u8fbe\u4e00\u4e2a\u5c71\u8c37\u3002
\u68af\u5ea6 \\(\\frac{\\partial \\mathcal{L}}{\\partial w}\\) \u662f\u4e00\u4e2a\u6307\u5411\u6700\u9661\u4e0a\u5347\u65b9\u5411\u7684\u5411\u91cf\u3002\u6211\u4eec\u51cf\u53bb\u5b83\u662f\u56e0\u4e3a\u60f3\u5411\u4e0b\u5761\u8d70\u3002\u8fd9\u662f\u7b2c03\u7ae0\u4e2d\u7684\u94fe\u5f0f\u6cd5\u5219\u5e94\u7528\u4e8e\u635f\u5931\u51fd\u6570\u3002
\u6279\u91cf\u68af\u5ea6\u4e0b\u964d\u6bcf\u4e00\u6b65\u4f7f\u7528\u6574\u4e2a\u8bad\u7ec3\u96c6\u8ba1\u7b97\u68af\u5ea6\u3002\u8fd9\u7ed9\u51fa\u7cbe\u786e\u68af\u5ea6\uff0c\u4f46\u5f53 \\(n\\) \u5f88\u5927\u65f6\u8ba1\u7b97\u4ee3\u4ef7\u9ad8\u6602\u3002
\u968f\u673a\u68af\u5ea6\u4e0b\u964d\uff08SGD\uff09 \u6bcf\u4e00\u6b65\u4f7f\u7528\u5355\u4e2a\u968f\u673a\u6837\u672c\u3002\u68af\u5ea6\u5e26\u6709\u566a\u58f0\uff08\u5b83\u4ece\u4e00\u4e2a\u6837\u672c\u4f30\u8ba1\u771f\u5b9e\u68af\u5ea6\uff09\uff0c\u4f46\u6bcf\u4e00\u6b65\u975e\u5e38\u5feb\u3002\u566a\u58f0\u5b9e\u9645\u4e0a\u53ef\u4ee5\u5e2e\u52a9\u9003\u79bb\u6d45\u7684\u5c40\u90e8\u6781\u5c0f\u503c\u3002
\u5c0f\u6279\u91cf\u68af\u5ea6\u4e0b\u964d\u6298\u4e2d\uff1a\u6bcf\u4e00\u6b65\u4f7f\u7528 \\(B\\) \u4e2a\u6837\u672c\u7684\u6279\u6b21\uff08\u901a\u5e38\u4e3a32\u300164\u6216256\uff09\u3002\u8fd9\u5e73\u8861\u4e86\u8ba1\u7b97\u6548\u7387\uff08\u5bf9\u6279\u6b21\u7684\u5411\u91cf\u5316\u64cd\u4f5c\uff09\u4e0e\u68af\u5ea6\u8d28\u91cf\u3002\u51e0\u4e4e\u6240\u6709\u6df1\u5ea6\u5b66\u4e60\u90fd\u4f7f\u7528\u5c0f\u6279\u91cfSGD\u3002
\u53cd\u5411\u4f20\u64ad\u662f\u6211\u4eec\u5b9e\u9645\u8ba1\u7b97\u5177\u6709\u8bb8\u591a\u53c2\u6570\u7684\u6a21\u578b\uff08\u5982\u795e\u7ecf\u7f51\u7edc\uff09\u4e2d\u68af\u5ea6\u7684\u65b9\u6cd5\u3002\u5b83\u662f\u7b2c03\u7ae0\u7684\u94fe\u5f0f\u6cd5\u5219\u901a\u8fc7\u8ba1\u7b97\u56fe\u7cfb\u7edf\u5316\u5730\u5e94\u7528\u3002
\u4efb\u4f55\u6a21\u578b\u90fd\u53ef\u4ee5\u8868\u793a\u4e3a\u64cd\u4f5c\u7684\u6709\u5411\u65e0\u73af\u56fe\uff1a\u8f93\u5165\u6d41\u5165\uff0c\u4e58\u4ee5\u6743\u91cd\uff0c\u52a0\u5728\u4e00\u8d77\uff0c\u901a\u8fc7\u975e\u7ebf\u6027\u51fd\u6570\u4f20\u9012\uff0c\u6700\u7ec8\u4ea7\u751f\u635f\u5931\u503c\u3002\u524d\u5411\u4f20\u64ad\u901a\u8fc7\u8ba9\u6570\u636e\u4ece\u8f93\u5165\u5230\u8f93\u51fa\u6d41\u7ecf\u6b64\u56fe\u6765\u8ba1\u7b97\u8f93\u51fa\uff08\u548c\u635f\u5931\uff09\u3002
\u53cd\u5411\u4f20\u64ad\u53cd\u5411\u6d41\u52a8\u68af\u5ea6\u3002\u4ece\u635f\u5931\u5f00\u59cb\uff0c\u4f60\u4f7f\u7528\u6bcf\u4e2a\u8282\u70b9\u7684\u94fe\u5f0f\u6cd5\u5219\u8ba1\u7b97\u635f\u5931\u76f8\u5bf9\u4e8e\u6bcf\u4e2a\u4e2d\u95f4\u503c\u7684\u53d8\u5316\u3002\u5982\u679c \\(L\\) \u4f9d\u8d56\u4e8e \\(z\\)\uff0c\u800c \\(z\\) \u4f9d\u8d56\u4e8e \\(w\\)\uff0c\u5219\uff1a
\u6bcf\u4e2a\u8282\u70b9\u53ea\u9700\u8981\u77e5\u9053\u81ea\u5df1\u7684\u5c40\u90e8\u5bfc\u6570\u548c\u4ece\u4e0a\u65b9\u6d41\u5165\u7684\u68af\u5ea6\u3002\u8fd9\u4f7f\u5f97\u53cd\u5411\u4f20\u64ad\u6a21\u5757\u5316\u4e14\u9ad8\u6548\uff1a\u4ee3\u4ef7\u5927\u7ea6\u662f\u524d\u5411\u4f20\u64ad\u7684\u4e24\u500d\uff08\u4e00\u6b21\u524d\u5411\uff0c\u4e00\u6b21\u53cd\u5411\uff09\u3002
\u539f\u59cbSGD\u6709\u4e00\u4e2a\u95ee\u9898\uff1a\u5b83\u5728\u9661\u5ced\u66f2\u7387\u65b9\u5411\u4e0a\u632f\u8361\uff0c\u800c\u5728\u5e73\u5766\u65b9\u5411\u4e0a\u8fdb\u5c55\u7f13\u6162\u3002\u4f18\u5316\u5668\u901a\u8fc7\u6839\u636e\u68af\u5ea6\u5386\u53f2\u8c03\u6574\u6b65\u957f\u6765\u6539\u8fdb\u8fd9\u4e00\u70b9\u3002
\u5e26\u52a8\u91cf\u7684SGD\u7ef4\u62a4\u8fc7\u53bb\u68af\u5ea6\u7684\u8fd0\u884c\u5e73\u5747\u503c\uff08\u6307\u6570\u79fb\u52a8\u5e73\u5747\uff0c\u6765\u81ea\u7b2c04\u7ae0\uff09\u3002\u8fd9\u5e73\u6ed1\u4e86\u632f\u8361\u5e76\u52a0\u901f\u4e86\u6cbf\u4e00\u81f4\u65b9\u5411\u7684\u8fdb\u5c55\uff1a
\u60f3\u8c61\u4e00\u4e2a\u6eda\u4e0b\u5c71\u7684\u7403\uff1a\u52a8\u91cf\u8ba9\u5b83\u6cbf\u4e00\u81f4\u65b9\u5411\u79ef\u7d2f\u901f\u5ea6\u5e76\u6291\u5236\u4fa7\u5411\u6296\u52a8\u3002\u5178\u578b\u503c\u4e3a \\(\\beta = 0.9\\)\u3002
\u5185\u65af\u7279\u7f57\u592b\u52a0\u901f\u68af\u5ea6\uff08NAG\uff09 \u662f\u4e00\u4e2a\u5c0f\u5de7\u4f46\u5de7\u5999\u7684\u8c03\u6574\uff1a\u4e0d\u5728\u5f53\u524d\u4f4d\u7f6e\u8ba1\u7b97\u68af\u5ea6\uff0c\u800c\u662f\u5728\"\u524d\u77bb\"\u4f4d\u7f6e \\(w - \\eta \\beta v_{t-1}\\) \u8ba1\u7b97\u68af\u5ea6\u3002\u8fd9\u4e00\u4fee\u6b63\u6b65\u9aa4\u51cf\u5c11\u4e86\u8fc7\u51b2\uff1a
\u95ee\u9898\u5728\u4e8e\uff1a\\(G_t\\) \u53ea\u589e\u4e0d\u51cf\uff0c\u56e0\u6b64\u6709\u6548\u5b66\u4e60\u7387\u5355\u8c03\u9012\u51cf\uff0c\u6700\u7ec8\u53d8\u5f97\u592a\u5c0f\u800c\u65e0\u6cd5\u5b66\u4e60\u4efb\u4f55\u4e1c\u897f\u3002
RMSprop \u901a\u8fc7\u4f7f\u7528\u5e73\u65b9\u68af\u5ea6\u7684\u6307\u6570\u79fb\u52a8\u5e73\u5747\u800c\u975e\u6c42\u548c\u6765\u4fee\u590d\u6b64\u95ee\u9898\uff0c\u4f7f\u5f97\u8fd1\u671f\u68af\u5ea6\u6bd4\u65e9\u671f\u68af\u5ea6\u66f4\u91cd\u8981\uff1a
\u9ed8\u8ba4\u8d85\u53c2\u6570\uff08\\(\\beta_1 = 0.9\\), \\(\\beta_2 = 0.999\\), \\(\\epsilon = 10^{-8}\\)\uff09\u5728\u5e7f\u6cdb\u7684\u95ee\u9898\u4e0a\u8868\u73b0\u826f\u597d\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48Adam\u662f\u5927\u591a\u6570\u6df1\u5ea6\u5b66\u4e60\u5de5\u4f5c\u4e2d\u7684\u9ed8\u8ba4\u4f18\u5316\u5668\u3002
AdamW \u5c06\u6743\u91cd\u8870\u51cf\u4e0e\u68af\u5ea6\u66f4\u65b0\u89e3\u8026\u3002\u6807\u51c6L2\u6b63\u5219\u5316\u548c\u6743\u91cd\u8870\u51cf\u5bf9\u4e8eSGD\u662f\u7b49\u4ef7\u7684\uff0c\u4f46\u5bf9\u4e8eAdam\u5219\u4e0d\u7136\u3002AdamW\u76f4\u63a5\u5c06\u6743\u91cd\u8870\u51cf\u5e94\u7528\u4e8e\u53c2\u6570\uff0c\u800c\u4e0d\u662f\u5c06 \\(\\lambda w\\) \u52a0\u5230\u68af\u5ea6\u4e0a\u3002\u8fd9\u5e26\u6765\u4e86\u66f4\u597d\u7684\u6cdb\u5316\u6027\u80fd\uff0c\u73b0\u5728\u662fTransformer\u8bad\u7ec3\u7684\u6807\u51c6\uff1a
\u9664\u4e86MSE\u548cBCE\u4e4b\u5916\uff0c\u8fd8\u6709\u51e0\u79cd\u5e38\u7528\u7684\u635f\u5931\u51fd\u6570\u3002
\u5e73\u5747\u7edd\u5bf9\u8bef\u5dee\uff08MAE\uff09\uff0c\u6216L1\u635f\u5931\uff0c\u53d6\u7edd\u5bf9\u5dee\u7684\u5e73\u5747\u503c\uff1a\\(\\frac{1}{n}\\sum|y_i - \\hat{y}_i|\\)\u3002\u5b83\u5bf9\u5f02\u5e38\u503c\u6bd4MSE\u66f4\u9c81\u68d2\uff0c\u56e0\u4e3a\u5b83\u4e0d\u5bf9\u5927\u8bef\u5dee\u8fdb\u884c\u5e73\u65b9\u3002
Huber\u635f\u5931\u7ed3\u5408\u4e86\u4e24\u8005\u7684\u4f18\u70b9\uff1a\u5bf9\u4e8e\u5c0f\u8bef\u5dee\u8868\u73b0\u50cfMSE\uff08\u5e73\u6ed1\uff0c\u6613\u4e8e\u4f18\u5316\uff09\uff0c\u5bf9\u4e8e\u5927\u8bef\u5dee\u8868\u73b0\u50cfMAE\uff08\u5bf9\u5f02\u5e38\u503c\u9c81\u68d2\uff09\u3002\u5b83\u6709\u4e00\u4e2a\u63a7\u5236\u8fc7\u6e21\u7684\u9608\u503c \\(\\delta\\)\u3002
\u5206\u7c7b\u4ea4\u53c9\u71b5\uff08CCE\uff09 \u5c06BCE\u63a8\u5e7f\u5230\u591a\u4e2a\u7c7b\u522b\u3002\u5982\u679c \\(\\hat{y}_k\\) \u662f\u7c7b\u522b \\(k\\) \u7684\u9884\u6d4b\u6982\u7387\uff0c\u771f\u5b9e\u7c7b\u522b\u4e3a \\(c\\)\uff1a
\u8fd9\u53ea\u662f\u6b63\u786e\u7c7b\u522b\u7684\u8d1f\u5bf9\u6570\u6982\u7387\u3002\u6700\u5c0f\u5316\u4ea4\u53c9\u71b5\u7b49\u4ef7\u4e8e\u6700\u5927\u5316\u4f3c\u7136\uff0c\u8fd9\u8054\u7cfb\u5230\u7b2c05\u7ae0\u7684\u4fe1\u606f\u8bba\uff1a\u4ea4\u53c9\u71b5\u8861\u91cf\u5f53\u4f60\u4f7f\u7528\u9884\u6d4b\u5206\u5e03\u4ee3\u66ff\u771f\u5b9e\u5206\u5e03\u65f6\u9700\u8981\u591a\u5c11\u989d\u5916\u6bd4\u7279\u3002
Hinge\u635f\u5931 \u88abSVM\u4f7f\u7528\uff1a\\(\\mathcal{L} = \\max(0, 1 - y \\cdot f(x))\\)\u3002\u5b83\u53ea\u60e9\u7f5a\u5728\u95f4\u9694\u9519\u8bef\u4e00\u4fa7\u6216\u95f4\u9694\u5185\u7684\u9884\u6d4b\u3002\u4e00\u65e6\u4e00\u4e2a\u70b9\u88ab\u8db3\u591f\u7f6e\u4fe1\u5730\u6b63\u786e\u5206\u7c7b\uff0c\u635f\u5931\u4e3a\u96f6\u3002
\u6b63\u5219\u5316\u901a\u8fc7\u6dfb\u52a0\u5bf9\u590d\u6742\u6a21\u578b\u7684\u60e9\u7f5a\u6765\u9632\u6b62\u8fc7\u62df\u5408\u3002\u6b63\u5219\u5316\u540e\u7684\u635f\u5931\u4e3a\uff1a
L2\u6b63\u5219\u5316\uff08Ridge\uff0c\u6743\u91cd\u8870\u51cf\uff09\u60e9\u7f5a\u5e73\u65b9\u6743\u91cd\u4e4b\u548c\uff1a\\(R(w) = \\|w\\|^2 = \\sum w_i^2\\)\u3002\u5b83\u963b\u6b62\u4efb\u4f55\u5355\u4e2a\u6743\u91cd\u53d8\u5f97\u8fc7\u5927\uff0c\u6709\u6548\u5730\u5c06\u6240\u6709\u6743\u91cd\u5411\u96f6\u6536\u7f29\uff0c\u4f46\u5f88\u5c11\u4f7f\u5b83\u4eec\u7cbe\u786e\u4e3a\u96f6\u3002
L1\u6b63\u5219\u5316\uff08Lasso\uff09\u60e9\u7f5a\u7edd\u5bf9\u6743\u91cd\u4e4b\u548c\uff1a\\(R(w) = \\|w\\|_1 = \\sum |w_i|\\)\u3002\u5b83\u9f13\u52b1\u7a00\u758f\u6027\uff0c\u5c06\u8bb8\u591a\u6743\u91cd\u9a71\u52a8\u5230\u7cbe\u786e\u4e3a\u96f6\uff0c\u5b9e\u73b0\u81ea\u52a8\u7279\u5f81\u9009\u62e9\u3002
\u5f39\u6027\u7f51\u7edc \u7ed3\u5408\u4e86\u4e24\u8005\uff1a\\(R(w) = \\alpha \\|w\\|_1 + (1 - \\alpha) \\|w\\|^2\\)\uff0c\u878d\u5408\u4e86\u7a00\u758f\u6027\u548c\u6536\u7f29\u3002
\u6709\u4e00\u4e2a\u4f18\u7f8e\u7684\u8d1d\u53f6\u65af\u89e3\u91ca\uff08\u6765\u81ea\u7b2c05\u7ae0\uff09\u3002L2\u6b63\u5219\u5316\u7b49\u4ef7\u4e8e\u5728\u6743\u91cd\u4e0a\u653e\u7f6e\u9ad8\u65af\u5148\u9a8c\u5e76\u5bfb\u627eMAP\u4f30\u8ba1\u3002L1\u6b63\u5219\u5316\u5bf9\u5e94\u4e8e\u62c9\u666e\u62c9\u65af\u5148\u9a8c\u3002\u6b63\u5219\u5316\u5f3a\u5ea6 \\(\\lambda\\) \u63a7\u5236\u4f60\u76f8\u5bf9\u4e8e\u6570\u636e\u4fe1\u4efb\u5148\u9a8c\u7684\u7a0b\u5ea6\u3002
\u8bc4\u4f30\u6307\u6807\u544a\u8bc9\u4f60\u6a21\u578b\u662f\u5426\u771f\u6b63\u6709\u6548\u3002\u5bf9\u4e8e\u56de\u5f52\uff0cMSE\u548cMAE\u662f\u6807\u51c6\u6307\u6807\u3002\u5bf9\u4e8e\u5206\u7c7b\uff0c\u60c5\u51b5\u66f4\u4e3a\u5fae\u5999\u3002
\u6df7\u6dc6\u77e9\u9635\u662f\u4e00\u4e2a\u4e8c\u5143\u5206\u7c7b\u7684\u56db\u683c\u8868\uff1a
\u5047\u8d1f\u4f8b\uff08FN\uff09\uff1a\u9884\u6d4b\u4e3a\u8d1f\uff0c\u5b9e\u9645\u4e3a\u6b63
\u51c6\u786e\u7387 = \\(\\frac{TP + TN}{TP + TN + FP + FN}\\) \u5728\u7c7b\u522b\u4e0d\u5e73\u8861\u65f6\u53ef\u80fd\u5177\u6709\u8bef\u5bfc\u6027\u3002\u5982\u679c99%\u7684\u7535\u5b50\u90ae\u4ef6\u4e0d\u662f\u5783\u573e\u90ae\u4ef6\uff0c\u4e00\u4e2a\u603b\u662f\u9884\u6d4b\"\u975e\u5783\u573e\u90ae\u4ef6\"\u7684\u6a21\u578b\u670999%\u7684\u51c6\u786e\u7387\uff0c\u4f46\u6ca1\u6709\u7528\u5904\u3002
\u7cbe\u786e\u7387 = \\(\\frac{TP}{TP + FP}\\) \u56de\u7b54\uff1a\u5728\u6240\u6709\u9884\u6d4b\u4e3a\u6b63\u7684\u6837\u672c\u4e2d\uff0c\u6709\u591a\u5c11\u5b9e\u9645\u4e3a\u6b63\uff1f\u9ad8\u7cbe\u786e\u7387\u610f\u5473\u7740\u8bef\u62a5\u5c11\u3002
\u53ec\u56de\u7387\uff08\u654f\u611f\u5ea6\uff09= \\(\\frac{TP}{TP + FN}\\) \u56de\u7b54\uff1a\u5728\u6240\u6709\u5b9e\u9645\u4e3a\u6b63\u7684\u6837\u672c\u4e2d\uff0c\u4f60\u6355\u83b7\u4e86\u591a\u5c11\uff1f\u9ad8\u53ec\u56de\u7387\u610f\u5473\u7740\u6f0f\u68c0\u5c11\u3002
F1\u5206\u6570 = \\(\\frac{2 \\cdot \\text{precision} \\cdot \\text{recall}}{\\text{precision} + \\text{recall}}\\) \u662f\u7cbe\u786e\u7387\u548c\u53ec\u56de\u7387\u7684\u8c03\u548c\u5e73\u5747\u6570\uff0c\u5e73\u8861\u4e86\u4e24\u8005\u3002
ROC\u66f2\u7ebf\u7ed8\u5236\u4e86\u771f\u6b63\u7387\uff08\u53ec\u56de\u7387\uff09\u5bf9\u5047\u6b63\u7387\uff08\\(\\frac{FP}{FP + TN}\\)\uff09\u968f\u5206\u7c7b\u9608\u503c\u4ece0\u52301\u53d8\u5316\u7684\u66f2\u7ebf\u3002\u5b8c\u7f8e\u5206\u7c7b\u5668\u7d27\u8d34\u5de6\u4e0a\u89d2\u3002AUC\uff08ROC\u66f2\u7ebf\u4e0b\u9762\u79ef\uff09\u7528\u4e00\u4e2a\u6570\u5b57\u6982\u62ec\u6027\u80fd\uff1a1.0\u4e3a\u5b8c\u7f8e\uff0c0.5\u4e3a\u968f\u673a\u731c\u6d4b\u3002
\u4ea4\u53c9\u9a8c\u8bc1\u63d0\u4f9b\u4e86\u66f4\u53ef\u9760\u7684\u6cdb\u5316\u6027\u80fd\u4f30\u8ba1\u3002\u5728 \\(k\\) \u6298\u4ea4\u53c9\u9a8c\u8bc1\u4e2d\uff0c\u4f60\u5c06\u6570\u636e\u5206\u6210 \\(k\\) \u4efd\uff0c\u5728 \\(k-1\\) \u4efd\u4e0a\u8bad\u7ec3\uff0c\u5728\u5269\u4f59\u4e00\u4efd\u4e0a\u6d4b\u8bd5\uff0c\u7136\u540e\u8f6e\u6362\u3002\u6240\u6709 \\(k\\) \u6298\u7684\u5e73\u5747\u6d4b\u8bd5\u6027\u80fd\u5c31\u662f\u4f60\u7684\u4f30\u8ba1\u3002\u8fd9\u4f7f\u7528\u4e86\u6240\u6709\u6570\u636e\u8fdb\u884c\u8bad\u7ec3\u548c\u6d4b\u8bd5\uff08\u53ea\u662f\u4e0d\u5728\u540c\u4e00\u65f6\u95f4\uff09\uff0c\u5728\u6570\u636e\u7a00\u7f3a\u65f6\u5c24\u4e3a\u5b9d\u8d35\u3002
\u504f\u5dee-\u65b9\u5dee\u6743\u8861\uff08\u6765\u81ea\u7b2c04\u7ae0\uff09\u662fML\u4e2d\u7684\u57fa\u672c\u5f20\u529b\u3002\u6a21\u578b\u671f\u671b\u8bef\u5dee\u5206\u89e3\u4e3a\uff1a
\u504f\u5dee\u662f\u9519\u8bef\u5047\u8bbe\u5e26\u6765\u7684\u7cfb\u7edf\u6027\u8bef\u5dee\uff08\u4f8b\u5982\uff0c\u7528\u76f4\u7ebf\u62df\u5408\u66f2\u7ebf\u6570\u636e\uff09\u3002\u65b9\u5dee\u662f\u5bf9\u8bad\u7ec3\u6570\u636e\u6ce2\u52a8\u7684\u654f\u611f\u5ea6\uff08\u4f8b\u5982\uff0c20\u6b21\u591a\u9879\u5f0f\u62df\u5408\u566a\u58f0\uff09\u3002\u7b80\u5355\u6a21\u578b\u5177\u6709\u9ad8\u504f\u5dee\u548c\u4f4e\u65b9\u5dee\uff1b\u590d\u6742\u6a21\u578b\u5177\u6709\u4f4e\u504f\u5dee\u548c\u9ad8\u65b9\u5dee\u3002\u6700\u4f18\u5728\u4e24\u8005\u4e4b\u95f4\u3002
\u5b66\u4e60\u7387\u8c03\u5ea6\u5728\u8bad\u7ec3\u671f\u95f4\u8c03\u6574 \\(\\eta\\)\u3002\u5e38\u89c1\u7b56\u7565\uff1a
1cycle\uff1a\u4e00\u4e2a\u5148\u5347\u540e\u964d\u7684\u4f59\u5f26\u5468\u671f\uff0c\u53ef\u4ee5\u5e26\u6765\u66f4\u5feb\u7684\u6536\u655b
\u8d85\u53c2\u6570\u8c03\u4f18\u662f\u627e\u5230\u5b66\u4e60\u7387\u3001\u6279\u91cf\u5927\u5c0f\u3001\u6b63\u5219\u5316\u5f3a\u5ea6\u548c\u5176\u4ed6\u4e0d\u7531\u68af\u5ea6\u4e0b\u964d\u5b66\u4e60\u7684\u8bbe\u7f6e\u7684\u826f\u597d\u503c\u7684\u8fc7\u7a0b\u3002\u5e38\u7528\u65b9\u6cd5\uff1a
ASHA\uff08\u5f02\u6b65\u8fde\u7eed\u51cf\u534a\u7b97\u6cd5\uff09\uff1a\u4f7f\u7528\u5c0f\u9884\u7b97\u5e76\u884c\u8fd0\u884c\u8bb8\u591a\u8bd5\u9a8c\uff0c\u7136\u540e\u5c06\u6700\u6709\u5e0c\u671b\u7684\u63d0\u5347\u5230\u66f4\u5927\u9884\u7b97\uff0c\u540c\u65f6\u53ca\u65e9\u7ec8\u6b62\u5176\u4f59\u8bd5\u9a8c\u3002\u5b83\u7ed3\u5408\u4e86\u65e9\u505c\u7684\u9ad8\u6548\u6027\u548c\u5927\u89c4\u6a21\u5e76\u884c\u6027\u2014\u2014\u4e0d\u662f\u8fd0\u884c100\u6b21\u5b8c\u6574\u7684\u8bad\u7ec3\uff0c\u800c\u662f\u5ec9\u4ef7\u5730\u542f\u52a8\u6240\u6709100\u6b21\uff0c\u5728\u6bcf\u7ea7\u4fdd\u7559\u524d\u56db\u5206\u4e4b\u4e00\uff0c\u53ea\u6709\u5c11\u6570\u8fd0\u884c\u5230\u5b8c\u6210\u3002\u8fd9\u662f\u73b0\u4ee3\u5927\u89c4\u6a21\u8c03\u4f18\u6846\u67b6\uff08\u5982Ray Tune\uff09\u7684\u9aa8\u5e72\u3002
\u65e0\u8c03\u5ea6\u5b66\u4e60\u5b8c\u5168\u6d88\u9664\u4e86\u5bf9\u5b66\u4e60\u7387\u8c03\u5ea6\u7684\u9700\u6c42\u3002\u5b83\u4e0d\u662f\u5728\u56fa\u5b9a\u66f2\u7ebf\u4e0a\u8870\u51cf \\(\\eta\\)\uff0c\u800c\u662f\u7ef4\u62a4\u4e24\u4e2a\u5e8f\u5217\uff1a\u4e00\u4e2a\u7f13\u6162\u79fb\u52a8\u7684\u8fed\u4ee3\u5e73\u5747\u503c \\(z_t\\)\uff08\u6536\u655b\u5230\u6700\u4f18\u503c\uff09\u548c\u4e00\u4e2a\u5feb\u901f\u63a2\u7d22\u7684\u8fed\u4ee3 \\(y_t\\)\uff08\u5728\u5176\u4e0a\u8bc4\u4f30\u68af\u5ea6\uff09\u3002\u6700\u7ec8\u8f93\u51fa\u662f\u5e73\u5747\u5e8f\u5217\uff0c\u88ab\u8bc1\u660e\u5728\u4e8b\u540e\u80fd\u5339\u914d\u6700\u4f73\u8c03\u5ea6\u7684\u6536\u655b\u901f\u5ea6\u3002\u8fd9\u5b8c\u5168\u6d88\u9664\u4e86\u8c03\u5ea6\u4f5c\u4e3a\u4e00\u4e2a\u8d85\u53c2\u6570\u2014\u2014\u4f60\u53ea\u9700\u8bbe\u7f6e\u57fa\u7840\u5b66\u4e60\u7387\uff0c\u4f18\u5316\u5668\u5904\u7406\u5176\u4f59\u90e8\u5206\u3002SGD\u548cAdam\u7684\u65e0\u8c03\u5ea6\u53d8\u4f53\u5df2\u88ab\u8bc1\u660e\u80fd\u8fbe\u5230\u6216\u8d85\u8d8a\u5176\u7ecf\u8fc7\u8c03\u5ea6\u7684\u5bf9\u5e94\u7248\u672c\u3002
\u4f7f\u7528\u6b63\u89c4\u65b9\u7a0b\u548c\u68af\u5ea6\u4e0b\u964d\u4e24\u79cd\u65b9\u6cd5\u5b9e\u73b0\u7ebf\u6027\u56de\u5f52\u3002\u6bd4\u8f83\u6c42\u89e3\u7ed3\u679c\uff0c\u5e76\u7ed8\u5236GD\u635f\u5931\u968f\u8fed\u4ee3\u7684\u6536\u655b\u66f2\u7ebf\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u751f\u6210\u5408\u6210\u6570\u636e\uff1ay = 3x + 2 + noise\nkey = jax.random.PRNGKey(42)\nn = 100\nX = jax.random.uniform(key, (n, 1), minval=0, maxval=10)\ny = 3 * X[:, 0] + 2 + jax.random.normal(key, (n,)) * 1.5\n\n# \u6dfb\u52a0\u504f\u7f6e\u5217\nX_b = jnp.column_stack([X, jnp.ones(n)])\n\n# \u6b63\u89c4\u65b9\u7a0b\nw_exact = jnp.linalg.solve(X_b.T @ X_b, X_b.T @ y)\nprint(f\"Normal equation: w={w_exact[0]:.4f}, b={w_exact[1]:.4f}\")\n\n# \u68af\u5ea6\u4e0b\u964d\nw_gd = jnp.zeros(2)\nlr = 0.005\nlosses = []\nfor step in range(500):\n pred = X_b @ w_gd\n error = pred - y\n loss = jnp.mean(error ** 2)\n losses.append(float(loss))\n grad = (2 / n) * X_b.T @ error\n w_gd = w_gd - lr * grad\n\nprint(f\"Gradient descent: w={w_gd[0]:.4f}, b={w_gd[1]:.4f}\")\n\nfig, axes = plt.subplots(1, 2, figsize=(12, 4))\naxes[0].scatter(X[:, 0], y, s=15, alpha=0.5, color='#3498db')\naxes[0].plot([0, 10], [w_exact[1], w_exact[0]*10 + w_exact[1]], color='#e74c3c', linewidth=2)\naxes[0].set_title(\"Linear Regression Fit\")\naxes[0].set_xlabel(\"x\"); axes[0].set_ylabel(\"y\")\n\naxes[1].plot(losses, color='#27ae60', linewidth=1.5)\naxes[1].set_title(\"GD Loss Convergence\")\naxes[1].set_xlabel(\"Step\"); axes[1].set_ylabel(\"MSE\")\naxes[1].set_yscale('log')\nplt.tight_layout()\nplt.show()\n \u4ece\u5934\u5b9e\u73b0\u5e26\u68af\u5ea6\u4e0b\u964d\u7684\u903b\u8f91\u56de\u5f52\u3002\u5728\u4e8c\u7ef4\u6570\u636e\u96c6\u4e0a\u8bad\u7ec3\u5e76\u53ef\u89c6\u5316\u5b66\u4e60\u5230\u7684\u51b3\u7b56\u8fb9\u754c\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_moons\n\n# \u751f\u6210\u6570\u636e\nX, y = make_moons(n_samples=300, noise=0.2, random_state=42)\nX, y = jnp.array(X), jnp.array(y, dtype=jnp.float32)\n\ndef sigmoid(z):\n return 1 / (1 + jnp.exp(-z))\n\n# \u6dfb\u52a0\u504f\u7f6e\u5217\nX_b = jnp.column_stack([X, jnp.ones(len(X))])\nw = jnp.zeros(3)\nlr = 0.5\nlosses = []\n\nfor step in range(2000):\n z = X_b @ w\n pred = sigmoid(z)\n # BCE\u635f\u5931\n loss = -jnp.mean(y * jnp.log(pred + 1e-8) + (1 - y) * jnp.log(1 - pred + 1e-8))\n losses.append(float(loss))\n # \u68af\u5ea6\n grad = X_b.T @ (pred - y) / len(y)\n w = w - lr * grad\n\n# \u51b3\u7b56\u8fb9\u754c\nxx, yy = jnp.meshgrid(jnp.linspace(-2, 3, 200), jnp.linspace(-1.5, 2, 200))\ngrid = jnp.column_stack([xx.ravel(), yy.ravel(), jnp.ones(xx.size)])\nzz = sigmoid(grid @ w).reshape(xx.shape)\n\nplt.figure(figsize=(8, 6))\nplt.contourf(xx, yy, zz, levels=[0, 0.5, 1], alpha=0.3, colors=['#e74c3c', '#3498db'])\nplt.contour(xx, yy, zz, levels=[0.5], colors='#9b59b6', linewidths=2)\nplt.scatter(X[y==0, 0], X[y==0, 1], c='#e74c3c', s=15, label='Class 0')\nplt.scatter(X[y==1, 0], X[y==1, 1], c='#3498db', s=15, label='Class 1')\nplt.title(\"Logistic Regression Decision Boundary\")\nplt.legend()\nplt.grid(alpha=0.3)\nplt.show()\n \u5728\u4e8c\u7ef4\u4e8c\u6b21\u66f2\u9762\u4e0a\u6bd4\u8f83\u4f18\u5316\u5668\u7684\u8f68\u8ff9\u3002\u4ece\u76f8\u540c\u7684\u8d77\u70b9\u8fd0\u884cSGD\u3001SGD+Momentum\u548cAdam\uff0c\u7ed8\u5236\u5b83\u4eec\u7684\u8def\u5f84\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u62c9\u957f\u7684\u4e8c\u6b21\u66f2\u9762\uff1aL(w1, w2) = 0.5*w1^2 + 10*w2^2\ndef loss_fn(w):\n return 0.5 * w[0]**2 + 10 * w[1]**2\n\ngrad_fn = jax.grad(loss_fn)\n\ndef run_sgd(w0, lr=0.05, steps=80):\n w = w0.copy()\n path = [w.copy()]\n for _ in range(steps):\n g = grad_fn(w)\n w = w - lr * g\n path.append(w.copy())\n return jnp.stack(path)\n\ndef run_momentum(w0, lr=0.05, beta=0.9, steps=80):\n w, v = w0.copy(), jnp.zeros(2)\n path = [w.copy()]\n for _ in range(steps):\n g = grad_fn(w)\n v = beta * v + (1 - beta) * g\n w = w - lr * v\n path.append(w.copy())\n return jnp.stack(path)\n\ndef run_adam(w0, lr=0.05, b1=0.9, b2=0.999, eps=1e-8, steps=80):\n w, m, v = w0.copy(), jnp.zeros(2), jnp.zeros(2)\n path = [w.copy()]\n for t in range(1, steps + 1):\n g = grad_fn(w)\n m = b1 * m + (1 - b1) * g\n v = b2 * v + (1 - b2) * g**2\n m_hat = m / (1 - b1**t)\n v_hat = v / (1 - b2**t)\n w = w - lr * m_hat / (jnp.sqrt(v_hat) + eps)\n path.append(w.copy())\n return jnp.stack(path)\n\nw0 = jnp.array([8.0, 3.0])\nsgd_path = run_sgd(w0)\nmom_path = run_momentum(w0)\nadam_path = run_adam(w0)\n\n# \u7ed8\u56fe\nfig, ax = plt.subplots(figsize=(8, 6))\nw1 = jnp.linspace(-10, 10, 100)\nw2 = jnp.linspace(-4, 4, 100)\nW1, W2 = jnp.meshgrid(w1, w2)\nL = 0.5 * W1**2 + 10 * W2**2\nax.contour(W1, W2, L, levels=20, cmap='Greys', alpha=0.4)\nax.plot(sgd_path[:,0], sgd_path[:,1], 'o-', color='#3498db', markersize=2, linewidth=1, label='SGD')\nax.plot(mom_path[:,0], mom_path[:,1], 'o-', color='#27ae60', markersize=2, linewidth=1, label='Momentum')\nax.plot(adam_path[:,0], adam_path[:,1], 'o-', color='#e74c3c', markersize=2, linewidth=1, label='Adam')\nax.plot(0, 0, 'k*', markersize=15, label='Minimum')\nax.set_xlabel('w\u2081'); ax.set_ylabel('w\u2082')\nax.set_title(\"Optimizer Trajectories on Elongated Quadratic\")\nax.legend()\nplt.grid(alpha=0.3)\nplt.show()\n \u5c55\u793aL1\u4e0eL2\u6b63\u5219\u5316\u5bf9\u6743\u91cd\u7a00\u758f\u6027\u7684\u5f71\u54cd\u3002\u4f7f\u7528\u4e24\u79cd\u60e9\u7f5a\u8bad\u7ec3\u7ebf\u6027\u56de\u5f52\uff0c\u5e76\u6bd4\u8f83\u5f97\u5230\u7684\u6743\u91cd\u5411\u91cf\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u5408\u6210\u6570\u636e\uff1a20\u4e2a\u7279\u5f81\u4e2d\u53ea\u6709\u524d3\u4e2a\u662f\u76f8\u5173\u7684\nkey = jax.random.PRNGKey(0)\nn, d = 200, 20\nw_true = jnp.zeros(d).at[:3].set(jnp.array([3.0, -2.0, 1.5]))\nX = jax.random.normal(key, (n, d))\ny = X @ w_true + 0.5 * jax.random.normal(key, (n,))\n\ndef train_ridge(X, y, lam=1.0, lr=0.01, steps=2000):\n \"\"\"\u901a\u8fc7GD\u8fdb\u884cL2\u6b63\u5219\u5316\u7ebf\u6027\u56de\u5f52\u3002\"\"\"\n w = jnp.zeros(X.shape[1])\n for _ in range(steps):\n pred = X @ w\n grad = (2/len(y)) * X.T @ (pred - y) + 2 * lam * w\n w = w - lr * grad\n return w\n\ndef train_lasso(X, y, lam=1.0, lr=0.01, steps=2000):\n \"\"\"\u901a\u8fc7\u8fd1\u7aefGD\u8fdb\u884cL1\u6b63\u5219\u5316\u7ebf\u6027\u56de\u5f52\u3002\"\"\"\n w = jnp.zeros(X.shape[1])\n for _ in range(steps):\n pred = X @ w\n grad = (2/len(y)) * X.T @ (pred - y)\n w = w - lr * grad\n # \u8f6f\u9608\u503c\uff08L1\u7684\u8fd1\u7aef\u7b97\u5b50\uff09\n w = jnp.sign(w) * jnp.maximum(jnp.abs(w) - lr * lam, 0)\n return w\n\nw_l2 = train_ridge(X, y, lam=0.1)\nw_l1 = train_lasso(X, y, lam=0.1)\n\nfig, axes = plt.subplots(1, 3, figsize=(14, 4))\naxes[0].bar(range(d), w_true, color='#333', alpha=0.7)\naxes[0].set_title(\"True Weights\"); axes[0].set_xlabel(\"Feature\")\naxes[1].bar(range(d), w_l2, color='#3498db', alpha=0.7)\naxes[1].set_title(\"L2 (Ridge): shrinks all\"); axes[1].set_xlabel(\"Feature\")\naxes[2].bar(range(d), w_l1, color='#e74c3c', alpha=0.7)\naxes[2].set_title(\"L1 (Lasso): zeros out irrelevant\"); axes[2].set_xlabel(\"Feature\")\nplt.tight_layout()\nplt.show()\n\nprint(f\"L2 non-zero weights: {int(jnp.sum(jnp.abs(w_l2) > 0.01))}/{d}\")\nprint(f\"L1 non-zero weights: {int(jnp.sum(jnp.abs(w_l1) > 0.01))}/{d}\")\n \u6df1\u5ea6\u5b66\u4e60\u5806\u53e0\u975e\u7ebf\u6027\u5c42\u6765\u6784\u5efa\u5c42\u6b21\u5316\u8868\u793a\uff0c\u81ea\u52a8\u5c06\u539f\u59cb\u8f93\u5165\u8f6c\u6362\u4e3a\u6709\u7528\u7684\u7279\u5f81\u3002\u672c\u6587\u6db5\u76d6MLP\u3001\u6fc0\u6d3b\u51fd\u6570\u3001\u53cd\u5411\u4f20\u64ad\u3001CNN\u3001RNN\u3001LSTM\u3001\u6ce8\u610f\u529b\u673a\u5236\u3001Transformer\u3001GAN\u3001VAE\u3001\u6269\u6563\u6a21\u578b\u548c\u5f52\u4e00\u5316\u6280\u672f
\u4ec0\u4e48\u4f7f\u7f51\u7edc\"\u6df1\"\uff1f\u6d45\u7f51\u7edc\u53ea\u6709\u4e00\u4e2a\u9690\u85cf\u5c42\uff1b\u6df1\u7f51\u7edc\u6709\u8bb8\u591a\u5c42\u3002\u6df1\u5ea6\u8ba9\u7f51\u7edc\u6784\u5efa\u5c42\u6b21\u5316\u8868\u793a\uff0c\u65e9\u671f\u5c42\u5b66\u4e60\u7b80\u5355\u7279\u5f81\uff08\u8fb9\u7f18\u3001\u97f3\u8c03\uff09\uff0c\u540e\u671f\u5c42\u5c06\u5b83\u4eec\u7ec4\u5408\u6210\u590d\u6742\u6982\u5ff5\uff08\u4eba\u8138\u3001\u53e5\u5b50\uff09\u3002\u8fd9\u79cd\u7ec4\u5408\u6027\u6b63\u662f\u6df1\u5ea6\u5b66\u4e60\u529b\u91cf\u7684\u6765\u6e90\u3002
\u6700\u7b80\u5355\u7684\u6df1\u5ea6\u7f51\u7edc\u662f\u591a\u5c42\u611f\u77e5\u5668\uff08MLP\uff09\uff0c\u4e5f\u79f0\u4e3a\u5168\u8fde\u63a5\u6216\u5bc6\u96c6\u7f51\u7edc\u3002\u6bcf\u5c42\u8ba1\u7b97\uff1a
\u8fd9\u91cc \\(W\\) \u662f\u6743\u91cd\u77e9\u9635\uff08\u7b2c02\u7ae0\uff09\uff0c\\(b\\) \u662f\u504f\u7f6e\u5411\u91cf\uff0c\\(\\sigma\\) \u662f\u975e\u7ebf\u6027\u6fc0\u6d3b\u51fd\u6570\u3002\u4e00\u5c42\u7684\u8f93\u51fa\u6210\u4e3a\u4e0b\u4e00\u5c42\u7684\u8f93\u5165\u3002\u6ca1\u6709\u975e\u7ebf\u6027\uff0c\u5806\u53e0\u5c42\u5c06\u6beb\u65e0\u610f\u4e49\uff1a\\(W_2(W_1 x) = (W_2 W_1)x\\)\uff0c\u8fd9\u53ea\u662f\u53e6\u4e00\u4e2a\u7ebf\u6027\u53d8\u6362\u3002\u8fd9\u6b63\u662f\u7b2c02\u7ae0\u4e2d\u7684\u77e9\u9635\u4e58\u6cd5\u584c\u7f29\u3002
\u6fc0\u6d3b\u51fd\u6570\u5f15\u5165\u4f7f\u6df1\u5ea6\u6709\u610f\u4e49\u7684\u975e\u7ebf\u6027\u3002
ReLU\uff08\u4fee\u6b63\u7ebf\u6027\u5355\u5143\uff09\uff1a\\(\\text{ReLU}(x) = \\max(0, x)\\)\u3002\u5b83\u662f\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684\u6fc0\u6d3b\u51fd\u6570\u3002\u8ba1\u7b97\u901f\u5ea6\u5feb\uff0c\u6b63\u8f93\u5165\u4e0d\u9971\u548c\uff0c\u5e76\u4ea7\u751f\u7a00\u758f\u6fc0\u6d3b\uff08\u8bb8\u591a\u795e\u7ecf\u5143\u8f93\u51fa\u7cbe\u786e\u4e3a\u96f6\uff09\u3002\u7f3a\u70b9\uff1a\u8d1f\u8f93\u5165\u7684\u795e\u7ecf\u5143\u603b\u662f\u8f93\u51fa\u96f6\uff0c\u5982\u679c\u5b83\u4eec\u6c38\u4e45\u5361\u5728\u90a3\u91cc\uff0c\u5c31\u4f1a\"\u6b7b\u4ea1\"\u5e76\u505c\u6b62\u5b66\u4e60\u3002
Sigmoid\uff1a\\(\\sigma(x) = \\frac{1}{1+e^{-x}}\\)\uff0c\u5c06\u8f93\u5165\u538b\u7f29\u5230 \\((0, 1)\\)\u3002\u9002\u7528\u4e8e\u4e8c\u5143\u5206\u7c7b\u7684\u8f93\u51fa\u5c42\uff0c\u4f46\u5728\u9690\u85cf\u5c42\u4e2d\u6709\u95ee\u9898\uff0c\u56e0\u4e3a\u5f53\u8f93\u5165\u8fdc\u79bb\u96f6\u65f6\u68af\u5ea6\u6d88\u5931\uff08\u66f2\u7ebf\u51e0\u4e4e\u5e73\u5766\uff09\u3002
Tanh\uff1a\\(\\tanh(x) = \\frac{e^x - e^{-x}}{e^x + e^{-x}}\\)\uff0c\u538b\u7f29\u5230 \\((-1, 1)\\)\u3002\u96f6\u4e2d\u5fc3\uff08\u4e0d\u540c\u4e8esigmoid\uff09\uff0c\u6709\u52a9\u4e8e\u68af\u5ea6\u6d41\u52a8\uff0c\u4f46\u5728\u6781\u7aef\u503c\u5904\u4ecd\u5b58\u5728\u68af\u5ea6\u6d88\u5931\u95ee\u9898\u3002
GELU\uff08\u9ad8\u65af\u8bef\u5dee\u7ebf\u6027\u5355\u5143\uff09\uff1a\\(\\text{GELU}(x) = x \\cdot \\Phi(x)\\)\uff0c\u5176\u4e2d \\(\\Phi\\) \u662f\u6807\u51c6\u6b63\u6001CDF\u3002\u5b83\u662fReLU\u7684\u5e73\u6ed1\u8fd1\u4f3c\uff0c\u5141\u8bb8\u5fae\u5c0f\u7684\u8d1f\u503c\u901a\u8fc7\u3002GELU\u662fGPT\u548cBERT\u4e2d\u7684\u9ed8\u8ba4\u9009\u62e9\u3002
Swish\uff1a\\(\\text{Swish}(x) = x \\cdot \\sigma(x)\\)\uff0c\u53e6\u4e00\u79cd\u5e73\u6ed1\u95e8\u63a7\u3002\u5b9e\u9645\u4f7f\u7528\u4e2d\u4e0eGELU\u7c7b\u4f3c\u3002
\u4e00\u4e2a\u5177\u6709 \\(d_{\\text{in}}\\) \u4e2a\u8f93\u5165\u548c \\(d_{\\text{out}}\\) \u4e2a\u8f93\u51fa\u7684\u5bc6\u96c6\u5c42\u6709 \\(d_{\\text{in}} \\times d_{\\text{out}} + d_{\\text{out}}\\) \u4e2a\u53c2\u6570\uff08\u6743\u91cd\u52a0\u504f\u7f6e\uff09\u3002\u77e9\u9635\u4e58\u6cd5 \\(Wx\\) \u5c31\u662f\u7b2c02\u7ae0\u4e2d\u7684\u77e9\u9635-\u5411\u91cf\u4e58\u6cd5\u3002\u5728\u6279\u5904\u7406\u8bbe\u7f6e\u4e2d\uff0c\u8f93\u5165\u662f\u5f62\u72b6\u4e3a \\((B, d_{\\text{in}})\\) \u7684\u77e9\u9635 \\(X\\)\uff0c\u8f93\u51fa\u662f\u5f62\u72b6\u4e3a \\((B, d_{\\text{out}})\\) \u7684 \\(XW^T + b\\)\u3002
\u4e07\u80fd\u8fd1\u4f3c\u5b9a\u7406\u6307\u51fa\uff0c\u4e00\u4e2a\u5177\u6709\u8db3\u591f\u795e\u7ecf\u5143\u7684\u9690\u85cf\u5c42\u53ef\u4ee5\u5728\u7d27\u81f4\u57df\u4e0a\u4ee5\u4efb\u610f\u7cbe\u5ea6\u903c\u8fd1\u4efb\u4f55\u8fde\u7eed\u51fd\u6570\u3002\u8fd9\u542c\u8d77\u6765\u4f3c\u4e4e\u6df1\u5ea6\u65e0\u5173\u7d27\u8981\uff0c\u4f46\u5173\u952e\u5728\u4e8e\"\u8db3\u591f\u7684\u795e\u7ecf\u5143\"\u3002\u5b9e\u9645\u4e0a\uff0c\u6df1\u5c42\u7f51\u7edc\u53ef\u4ee5\u7528\u6307\u6570\u7ea7\u5c11\u4e8e\u6d45\u5c42\u7f51\u7edc\u7684\u53c2\u6570\u6765\u8868\u793a\u76f8\u540c\u7684\u51fd\u6570\u3002\u6df1\u5ea6\u5e26\u6765\u7684\u662f\u6548\u7387\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u8868\u8fbe\u80fd\u529b\u3002
\u968f\u7740\u7f51\u7edc\u53d8\u6df1\uff0c\u51fa\u73b0\u4e24\u79cd\u68af\u5ea6\u75c5\u7406\u3002\u68af\u5ea6\u6d88\u5931\uff1a\u5f53\u68af\u5ea6\u901a\u8fc7\u8bb8\u591a\u5c42\u65f6\uff08\u901a\u8fc7\u94fe\u5f0f\u6cd5\u5219\uff0c\u7b2c03\u7ae0\uff09\uff0c\u5b83\u4eec\u88ab\u4e58\u4ee5\u8bb8\u591a\u56e0\u5b50\u3002\u5982\u679c\u8fd9\u4e9b\u56e0\u5b50\u90fd\u5c0f\u4e8e1\uff08\u5982sigmoid\u548ctanh\u9971\u548c\u65f6\u53d1\u751f\u7684\u60c5\u51b5\uff09\uff0c\u68af\u5ea6\u5448\u6307\u6570\u7ea7\u7f29\u5c0f\u8d8b\u8fd1\u4e8e\u96f6\u3002\u65e9\u671f\u5c42\u51e0\u4e4e\u65e0\u6cd5\u5b66\u4e60\u3002\u68af\u5ea6\u7206\u70b8\uff1a\u5982\u679c\u56e0\u5b50\u90fd\u5927\u4e8e1\uff0c\u68af\u5ea6\u5448\u6307\u6570\u7ea7\u589e\u957f\uff0c\u5bfc\u81f4\u6570\u503c\u6ea2\u51fa\u548c\u8bad\u7ec3\u4e0d\u7a33\u5b9a\u3002
\u68af\u5ea6\u6d88\u5931/\u7206\u70b8\u7684\u89e3\u51b3\u65b9\u6848\uff1a
\u68af\u5ea6\u88c1\u526a\uff08\u9488\u5bf9\u68af\u5ea6\u7206\u70b8\uff09\uff1a\u5c06\u68af\u5ea6\u8303\u6570\u9650\u5236\u5728\u6700\u5927\u503c
\u6743\u91cd\u521d\u59cb\u5316\u5f88\u91cd\u8981\uff0c\u56e0\u4e3a\u5b83\u51b3\u5b9a\u4e86\u8bad\u7ec3\u5f00\u59cb\u65f6\u6fc0\u6d3b\u503c\u548c\u68af\u5ea6\u7684\u5c3a\u5ea6\u3002\u5982\u679c\u6743\u91cd\u592a\u5927\uff0c\u6fc0\u6d3b\u503c\u7206\u70b8\uff1b\u592a\u5c0f\uff0c\u5b83\u4eec\u6d88\u5931\u3002
Xavier (Glorot) \u521d\u59cb\u5316\u4ece\u65b9\u5dee\u4e3a \\(\\frac{2}{d_{\\text{in}} + d_{\\text{out}}}\\) \u7684\u5206\u5e03\u4e2d\u8bbe\u7f6e\u6743\u91cd\u3002\u8fd9\u5047\u8bbe\u4f7f\u7528\u7ebf\u6027\u6216tanh\u6fc0\u6d3b\u51fd\u6570\u65f6\uff0c\u80fd\u4f7f\u6fc0\u6d3b\u503c\u7684\u65b9\u5dee\u5728\u5404\u5c42\u5927\u81f4\u4fdd\u6301\u6052\u5b9a\u3002
He (Kaiming) \u521d\u59cb\u5316\u4f7f\u7528\u65b9\u5dee \\(\\frac{2}{d_{\\text{in}}}\\)\uff0c\u9488\u5bf9ReLU\u6fc0\u6d3b\u51fd\u6570\u6821\u51c6\uff08\u7531\u4e8eReLU\u5c06\u534a\u6570\u6fc0\u6d3b\u503c\u7f6e\u96f6\uff0c\u9700\u8981\u53cc\u500d\u65b9\u5dee\u6765\u8865\u507f\uff09\u3002
\u5f52\u4e00\u5316\u5c42\u901a\u8fc7\u786e\u4fdd\u6bcf\u5c42\u7684\u8f93\u5165\u5177\u6709\u4e00\u81f4\u7684\u7edf\u8ba1\u7279\u6027\uff08\u5927\u81f4\u96f6\u5747\u503c\u3001\u5355\u4f4d\u65b9\u5dee\uff09\u6765\u7a33\u5b9a\u8bad\u7ec3\u3002
\u6279\u5f52\u4e00\u5316\uff08BatchNorm\uff09 \u5728\u6279\u6b21\u7ef4\u5ea6\u4e0a\u8fdb\u884c\u5f52\u4e00\u5316\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u901a\u9053/\u7279\u5f81\uff0c\u8ba1\u7b97\u5c0f\u6279\u6b21\u4e2d\u6240\u6709\u6837\u672c\u7684\u5747\u503c\u548c\u65b9\u5dee\uff0c\u7136\u540e\u5f52\u4e00\u5316\u3002\u5b83\u6dfb\u52a0\u4e86\u53ef\u5b66\u4e60\u7684\u5c3a\u5ea6\uff08\\(\\gamma\\)\uff09\u548c\u504f\u79fb\uff08\\(\\beta\\)\uff09\u53c2\u6570\uff0c\u4ee5\u4fbf\u7f51\u7edc\u5728\u9700\u8981\u65f6\u64a4\u9500\u5f52\u4e00\u5316\uff1a
BatchNorm\u6709\u4e00\u4e2a\u95ee\u9898\uff1a\u5b83\u4f9d\u8d56\u4e8e\u6279\u91cf\u5927\u5c0f\u3002\u5f53\u6279\u6b21\u975e\u5e38\u5c0f\u65f6\uff0c\u7edf\u8ba1\u6570\u636e\u6709\u566a\u58f0\u3002\u5728\u63a8\u7406\u65f6\uff0c\u4f7f\u7528\u8fd0\u884c\u5e73\u5747\u503c\u800c\u975e\u6279\u6b21\u7edf\u8ba1\uff0c\u8fd9\u9020\u6210\u4e86\u8bad\u7ec3/\u6d4b\u8bd5\u4e0d\u4e00\u81f4\u3002
\u5c42\u5f52\u4e00\u5316\uff08LayerNorm\uff09 \u5bf9\u6bcf\u4e2a\u5355\u72ec\u6837\u672c\u5728\u7279\u5f81\u7ef4\u5ea6\u4e0a\u8fdb\u884c\u5f52\u4e00\u5316\u3002\u5b83\u4e0d\u4f9d\u8d56\u4e8e\u6279\u6b21\u4e2d\u7684\u5176\u4ed6\u6837\u672c\uff0c\u4f7f\u5176\u6210\u4e3aTransformer\u548c\u5faa\u73af\u7f51\u7edc\u7684\u6807\u51c6\u9009\u62e9\u3002
\u5b9e\u4f8b\u5f52\u4e00\u5316 \u5bf9\u6bcf\u4e2a\u6837\u672c\u548c\u6bcf\u4e2a\u901a\u9053\u72ec\u7acb\u5730\u5728\u7a7a\u95f4\u7ef4\u5ea6\u4e0a\u8fdb\u884c\u5f52\u4e00\u5316\u3002\u5728\u98ce\u683c\u8fc1\u79fb\u4e2d\u5f88\u6d41\u884c\u3002
\u7ec4\u5f52\u4e00\u5316 \u5c06\u901a\u9053\u5206\u6210\u7ec4\u5e76\u5728\u6bcf\u4e2a\u7ec4\u5185\u8fdb\u884c\u5f52\u4e00\u5316\u3002\u5b83\u662fLayerNorm\u548cInstanceNorm\u4e4b\u95f4\u7684\u6298\u4e2d\u3002
Dropout \u662f\u4e00\u79cd\u6b63\u5219\u5316\u6280\u672f\uff0c\u5728\u8bad\u7ec3\u671f\u95f4\u968f\u673a\u5c06\u4e00\u90e8\u5206 \\(p\\) \u7684\u795e\u7ecf\u5143\u7f6e\u96f6\u3002\u8fd9\u8feb\u4f7f\u7f51\u7edc\u4e0d\u4f9d\u8d56\u4efb\u4f55\u5355\u4e2a\u795e\u7ecf\u5143\uff0c\u9f13\u52b1\u5197\u4f59\u8868\u793a\u3002\u6d4b\u8bd5\u65f6\uff0c\u6240\u6709\u795e\u7ecf\u5143\u90fd\u88ab\u6fc0\u6d3b\u3002\u9006\u7f6eDropout \u5728\u8bad\u7ec3\u671f\u95f4\u5c06\u6fc0\u6d3b\u503c\u7f29\u653e \\(\\frac{1}{1-p}\\)\uff0c\u4ee5\u4fbf\u6d4b\u8bd5\u65f6\u65e0\u9700\u7f29\u653e\u3002\u8fd9\u662f\u6807\u51c6\u5b9e\u73b0\u3002
\u5377\u79ef\u795e\u7ecf\u7f51\u7edc\uff08CNN\uff09 \u5229\u7528\u4e86\u7a7a\u95f4\u7ed3\u6784\u3002\u5377\u79ef\u5c42\u4e0d\u662f\u5c06\u6bcf\u4e2a\u8f93\u5165\u8fde\u63a5\u5230\u6bcf\u4e2a\u8f93\u51fa\uff08\u5982\u5bc6\u96c6\u5c42\uff09\uff0c\u800c\u662f\u5728\u8f93\u5165\u4e0a\u6ed1\u52a8\u4e00\u4e2a\u5c0f\u6ee4\u6ce2\u5668\uff08\u6838\uff09\uff0c\u5728\u6bcf\u4e2a\u4f4d\u7f6e\u8ba1\u7b97\u70b9\u79ef\u3002\u76f8\u540c\u7684\u6ee4\u6ce2\u5668\u6743\u91cd\u5728\u6240\u6709\u4f4d\u7f6e\u5171\u4eab\uff0c\u8fd9\u5927\u5927\u51cf\u5c11\u4e86\u53c2\u6570\u5e76\u5185\u5efa\u4e86\u5e73\u79fb\u4e0d\u53d8\u6027\u3002
\u4e8c\u7ef4\u8f93\u5165\u4e0e\u5927\u5c0f\u4e3a \\(k \\times k\\) \u7684\u6ee4\u6ce2\u5668 \\(K\\) \u7684\u5377\u79ef\u64cd\u4f5c\uff1a
\u8f93\u51fa\u5927\u5c0f\u53d6\u51b3\u4e8e\u4e09\u4e2a\u8d85\u53c2\u6570\u3002\u6b65\u5e45\u63a7\u5236\u6ee4\u6ce2\u5668\u5728\u4f4d\u7f6e\u4e4b\u95f4\u79fb\u52a8\u591a\u5c11\u50cf\u7d20\uff08\u6b65\u5e452\u4f7f\u7a7a\u95f4\u7ef4\u5ea6\u51cf\u534a\uff09\u3002\u586b\u5145\u5728\u8f93\u5165\u8fb9\u754c\u5468\u56f4\u6dfb\u52a0\u96f6\uff08\"same\"\u586b\u5145\u4fdd\u6301\u7a7a\u95f4\u5927\u5c0f\uff0c\"valid\"\u586b\u5145\u4e0d\u586b\u5145\uff09\u3002\u8f93\u51fa\u5927\u5c0f\u516c\u5f0f\uff1a\\(\\text{out} = \\lfloor (\\text{in} - k + 2p) / s \\rfloor + 1\\)\u3002
\u6c60\u5316\u5c42\u5bf9\u7279\u5f81\u56fe\u8fdb\u884c\u4e0b\u91c7\u6837\u3002\u6700\u5927\u6c60\u5316\u53d6\u6bcf\u4e2a\u7a97\u53e3\u4e2d\u7684\u6700\u5927\u503c\uff1b\u5e73\u5747\u6c60\u5316\u53d6\u5747\u503c\u3002\u6c60\u5316\u5728\u4fdd\u7559\u6700\u91cd\u8981\u4fe1\u606f\u7684\u540c\u65f6\u51cf\u5c11\u7a7a\u95f4\u7ef4\u5ea6\u3002
\u6269\u5f20\u5377\u79ef \u5728\u6ee4\u6ce2\u5668\u5143\u7d20\u4e4b\u95f4\u63d2\u5165\u95f4\u9699\uff0c\u589e\u52a0\u611f\u53d7\u91ce\u800c\u4e0d\u589e\u52a0\u53c2\u6570\u3002\u6269\u5f20\u7387\u4e3a2\u610f\u5473\u77403x3\u6ee4\u6ce2\u5668\u8986\u76d65x5\u533a\u57df\u3002
1x1\u5377\u79ef \u662f\u4f7f\u75281x1\u6ee4\u6ce2\u5668\u7684\u5377\u79ef\u3002\u5b83\u4eec\u4e0d\u67e5\u770b\u7a7a\u95f4\u90bb\u5c45\uff1b\u800c\u662f\u8de8\u901a\u9053\u6df7\u5408\u4fe1\u606f\u3002\u53ef\u4ee5\u5c06\u5176\u89c6\u4e3a\u5728\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u5e94\u7528\u5bc6\u96c6\u5c42\u3002\u7528\u4e8e\u5ec9\u4ef7\u5730\u6539\u53d8\u901a\u9053\u6570\u3002
\u8df3\u8dc3\u8fde\u63a5\uff08\u6b8b\u5dee\u8fde\u63a5\uff09\u8ba9\u8f93\u5165\u7ed5\u8fc7\u4e00\u5c42\u6216\u591a\u5c42\uff1a\\(\\text{output} = F(x) + x\\)\u3002\u8be5\u5c42\u53ea\u9700\u5b66\u4e60\u6b8b\u5dee \\(F(x) = \\text{output} - x\\)\uff0c\u5f53\u6700\u4f18\u53d8\u6362\u63a5\u8fd1\u6052\u7b49\u6620\u5c04\u65f6\u8fd9\u66f4\u5bb9\u6613\u3002ResNet\uff08\u6b8b\u5dee\u7f51\u7edc\uff09\u4f7f\u7528\u8fd9\u4e00\u6280\u5de7\u5806\u53e0\u8d85\u8fc7100\u5c42\uff0c\u89e3\u51b3\u4e86\u66f4\u6df1\u7684\u7f51\u7edc\u8868\u73b0\u6bd4\u6d45\u5c42\u7f51\u7edc\u66f4\u5dee\u7684\u9000\u5316\u95ee\u9898\u3002
CNN\u6784\u5efa\u4e86\u4e00\u4e2a\u7279\u5f81\u5c42\u6b21\u7ed3\u6784\u3002\u65e9\u671f\u5c42\u68c0\u6d4b\u8fb9\u7f18\u548c\u7eb9\u7406\u3002\u4e2d\u95f4\u5c42\u5c06\u8fd9\u4e9b\u7ec4\u5408\u6210\u90e8\u4ef6\uff08\u773c\u775b\u3001\u8f6e\u5b50\uff09\u3002\u540e\u671f\u5c42\u8bc6\u522b\u6574\u4e2a\u7269\u4f53\u3002\u6bcf\u5c42\u7684\u611f\u53d7\u91ce\uff08\u5b83\"\u770b\u5230\"\u7684\u8f93\u5165\u533a\u57df\uff09\u968f\u6df1\u5ea6\u589e\u52a0\u3002
\u5d4c\u5165\u5c06\u79bb\u6563\u7684\u6807\u8bb0\uff08\u5355\u8bcd\u3001\u5b57\u7b26\u3001\u7269\u54c1ID\uff09\u6620\u5c04\u5230\u5bc6\u96c6\u5411\u91cf\u3002\u5d4c\u5165\u5c42\u53ea\u662f\u4e00\u4e2a\u67e5\u627e\u8868\uff1a\u4e00\u4e2a\u5f62\u72b6\u4e3a\uff08\u8bcd\u6c47\u8868\u5927\u5c0f\uff0c\u5d4c\u5165\u7ef4\u5ea6\uff09\u7684\u77e9\u9635 \\(E\\)\u3002\u67e5\u627e\u6807\u8bb0 \\(i\\) \u610f\u5473\u7740\u9009\u62e9 \\(E\\) \u7684\u7b2c \\(i\\) \u884c\u3002\u8fd9\u7b49\u4ef7\u4e8e\u4e58\u4ee5one-hot\u5411\u91cf\uff0c\u8fd9\u53ea\u662f\u77e9\u9635-\u5411\u91cf\u4e58\u6cd5\u7684\u4e00\u4e2a\u7279\u4f8b\uff08\u7b2c02\u7ae0\uff09\u3002\u5d4c\u5165\u5728\u8bad\u7ec3\u671f\u95f4\u5b66\u4e60\uff0c\u56e0\u6b64\u76f8\u4f3c\u7684\u6807\u8bb0\u6700\u7ec8\u5177\u6709\u76f8\u4f3c\u7684\u5411\u91cf\u3002
\u5206\u8bcd\u662f\u5c06\u539f\u59cb\u6587\u672c\u8f6c\u6362\u4e3a\u6807\u8bb0\u5e8f\u5217\u7684\u8fc7\u7a0b\u3002\u8bcd\u7ea7\u5206\u8bcd\u6309\u7a7a\u683c\u5206\u5272\uff0c\u4f46\u65e0\u6cd5\u5904\u7406\u672a\u89c1\u8fc7\u7684\u8bcd\u3002\u5b50\u8bcd\u5206\u8bcd\uff08BPE\u3001WordPiece\u3001SentencePiece\uff09\u5c06\u6587\u672c\u5206\u89e3\u4e3a\u9891\u7e41\u7684\u5b50\u8bcd\u5355\u5143\uff0c\u5e73\u8861\u8bcd\u6c47\u8868\u5927\u5c0f\u548c\u8986\u76d6\u7387\u3002\u5355\u8bcd\"unhappiness\"\u53ef\u80fd\u53d8\u6210[\"un\", \"happiness\"]\u6216[\"un\", \"happ\", \"iness\"]\u3002
\u5faa\u73af\u795e\u7ecf\u7f51\u7edc\uff08RNN\uff09 \u4e00\u6b21\u5904\u7406\u4e00\u4e2a\u5e8f\u5217\u5143\u7d20\uff0c\u7ef4\u62a4\u4e00\u4e2a\u5411\u524d\u4f20\u9012\u4fe1\u606f\u7684\u9690\u85cf\u72b6\u6001\uff1a
\u9690\u85cf\u72b6\u6001 \\(h_t\\) \u662f\u7f51\u7edc\u5230\u65f6\u95f4 \\(t\\) \u4e3a\u6b62\u6240\u770b\u5230\u5185\u5bb9\u7684\u538b\u7f29\u6458\u8981\u3002\u76f8\u540c\u7684\u6743\u91cd \\(W_h\\) \u548c \\(W_x\\) \u5728\u6240\u6709\u65f6\u95f4\u6b65\u5171\u4eab\uff08\u6743\u91cd\u5171\u4eab\uff0c\u5982\u540cCNN\u5171\u4eab\u7a7a\u95f4\u6743\u91cd\uff09\u3002
\u539f\u59cbRNN\u5728\u957f\u5e8f\u5217\u4e0a\u5b58\u5728\u68af\u5ea6\u6d88\u5931\u95ee\u9898\uff1a\u4ece\u6b65\u9aa4 \\(t\\) \u5230\u6b65\u9aa4 \\(t - k\\) \u7684\u68af\u5ea6\u4fe1\u53f7\u7ecf\u8fc7 \\(k\\) \u6b21\u4e0e \\(W_h\\) \u7684\u4e58\u6cd5\uff0c\u5448\u6307\u6570\u7ea7\u7f29\u5c0f\uff08\u6216\u7206\u70b8\uff09\u3002
LSTM\uff08\u957f\u77ed\u65f6\u8bb0\u5fc6\u7f51\u7edc\uff09\u901a\u8fc7\u5f15\u5165\u4e00\u4e2a\u72ec\u7acb\u7684\u7ec6\u80de\u72b6\u6001 \\(c_t\\) \u6765\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\uff0c\u8be5\u72b6\u6001\u4ee5\u6700\u5c0f\u5e72\u6270\u6d41\u8fc7\u65f6\u95f4\u3002\u4e09\u4e2a\u95e8\u63a7\u5236\u54ea\u4e9b\u4fe1\u606f\u8fdb\u5165\u3001\u79bb\u5f00\u548c\u6301\u7eed\u5b58\u5728\uff1a
\u9057\u5fd8\u95e8\u51b3\u5b9a\u4ece\u7ec6\u80de\u72b6\u6001\u4e2d\u64e6\u9664\u4ec0\u4e48\uff1a\\(f_t = \\sigma(W_f [h_{t-1}, x_t] + b_f)\\)
\u7ec6\u80de\u72b6\u6001\u50cf\u4f20\u9001\u5e26\u4e00\u6837\u5de5\u4f5c\uff1a\u4fe1\u606f\u53ef\u4ee5\u4e0d\u53d8\u5730\u6d41\u8fc7\u8bb8\u591a\u65f6\u95f4\u6b65\uff08\u9057\u5fd8\u95e8\u4fdd\u6301\u63a5\u8fd11\uff09\uff0c\u8fd9\u89e3\u51b3\u4e86\u957f\u8ddd\u79bb\u4f9d\u8d56\u7684\u68af\u5ea6\u6d88\u5931\u95ee\u9898\u3002
GRU\uff08\u95e8\u63a7\u5faa\u73af\u5355\u5143\uff09\u901a\u8fc7\u5c06\u7ec6\u80de\u72b6\u6001\u548c\u9690\u85cf\u72b6\u6001\u5408\u5e76\u4e3a\u4e00\u4e2a\uff0c\u5e76\u4f7f\u7528\u4e24\u4e2a\u95e8\uff08\u66f4\u65b0\u95e8\u548c\u91cd\u7f6e\u95e8\uff09\u4ee3\u66ff\u4e09\u4e2a\u95e8\u6765\u7b80\u5316LSTM\u3002GRU\u53c2\u6570\u66f4\u5c11\uff0c\u901a\u5e38\u8868\u73b0\u4e0eLSTM\u76f8\u5f53\u3002
RNN\uff08\u5305\u62ecLSTM\uff09\u7684\u6839\u672c\u9650\u5236\u662f\u987a\u5e8f\u5904\u7406\uff1a\u5fc5\u987b\u6309\u987a\u5e8f\u5904\u7406\u6807\u8bb01\u3001\u6807\u8bb02\u3001\u6807\u8bb03\u3002\u8fd9\u963b\u6b62\u4e86\u5e76\u884c\u5316\u5e76\u9020\u6210\u4fe1\u606f\u74f6\u9888\uff0c\u56e0\u4e3a\u6240\u6709\u4e0a\u4e0b\u6587\u5fc5\u987b\u901a\u8fc7\u56fa\u5b9a\u5927\u5c0f\u7684\u9690\u85cf\u72b6\u6001\u3002
\u6ce8\u610f\u529b\u673a\u5236\u89e3\u51b3\u4e86\u8fd9\u4e24\u4e2a\u95ee\u9898\u3002\u6ce8\u610f\u529b\u673a\u5236\u4e0d\u662f\u5c06\u6574\u4e2a\u8f93\u5165\u538b\u7f29\u4e3a\u56fa\u5b9a\u5411\u91cf\uff0c\u800c\u662f\u8ba9\u6a21\u578b\u56de\u987e\u6240\u6709\u8f93\u5165\u4f4d\u7f6e\u5e76\u51b3\u5b9a\u54ea\u4e9b\u4f4d\u7f6e\u4e0e\u5f53\u524d\u8f93\u51fa\u76f8\u5173\u3002
\u73b0\u4ee3\u516c\u5f0f\u4f7f\u7528\u67e5\u8be2\u3001\u952e\u548c\u503c\uff08Q, K, V\uff09\u3002\u5c06\u5176\u60f3\u8c61\u4e3a\u56fe\u4e66\u9986\u641c\u7d22\uff1a\u4f60\u6709\u4e00\u4e2a\u67e5\u8be2\uff08\u4f60\u5728\u627e\u4ec0\u4e48\uff09\u3001\u952e\uff08\u6bcf\u672c\u4e66\u7684\u6807\u7b7e\uff09\u548c\u503c\uff08\u5b9e\u9645\u4e66\u7c4d\u5185\u5bb9\uff09\u3002\u4f60\u5c06\u67e5\u8be2\u4e0e\u6240\u6709\u952e\u6bd4\u8f83\uff0c\u4ee5\u786e\u5b9a\u68c0\u7d22\u54ea\u4e9b\u503c\u3002
\u7f29\u653e\u70b9\u79ef\u6ce8\u610f\u529b\uff1a
\\(QK^T\\) \u8ba1\u7b97\u6bcf\u4e2a\u67e5\u8be2\u548c\u6bcf\u4e2a\u952e\u4e4b\u95f4\u7684\u76f8\u4f3c\u5ea6\u3002\u8fd9\u662f\u77e9\u9635\u4e58\u6cd5\uff08\u7b2c02\u7ae0\uff09\uff0c\u5176\u4e2d\u7684\u6761\u76ee\u662f\u70b9\u79ef\uff0c\u8861\u91cf\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff08\u7b2c01\u7ae0\uff09\u3002\u9664\u4ee5 \\(\\sqrt{d_k}\\) \u9632\u6b62\u70b9\u79ef\u53d8\u5f97\u592a\u5927\uff08\u8fd9\u4f1a\u4f7fsoftmax\u9971\u548c\u5e76\u4ea7\u751f\u63a5\u8fd1one-hot\u5206\u5e03\uff0c\u5bfc\u81f4\u68af\u5ea6\u6d88\u5931\uff09\u3002Softmax\u5c06\u76f8\u4f3c\u5ea6\u8f6c\u6362\u4e3a\u6982\u7387\u5206\u5e03\u3002\u4e58\u4ee5 \\(V\\) \u4ea7\u751f\u503c\u7684\u52a0\u6743\u7ec4\u5408\u3002
\u591a\u5934\u6ce8\u610f\u529b\u8fd0\u884c \\(h\\) \u4e2a\u5e76\u884c\u7684\u6ce8\u610f\u529b\u64cd\u4f5c\uff0c\u6bcf\u4e2a\u4f7f\u7528\u4e0d\u540c\u7684Q\u3001K\u3001V\u5b66\u4e60\u6295\u5f71\u3002\u8fd9\u8ba9\u6a21\u578b\u540c\u65f6\u4ece\u4e0d\u540c\u7684\u8868\u793a\u5b50\u7a7a\u95f4\u5173\u6ce8\u4fe1\u606f\u3002\u4e00\u4e2a\u5934\u53ef\u80fd\u5173\u6ce8\u53e5\u6cd5\u5173\u7cfb\uff0c\u800c\u53e6\u4e00\u4e2a\u5173\u6ce8\u8bed\u4e49\u5173\u7cfb\u3002\u8f93\u51fa\u88ab\u62fc\u63a5\u5e76\u6295\u5f71\uff1a
\u6bcf\u4e2a\u4f4d\u7f6e\u83b7\u5f97\u4e00\u4e2a\u552f\u4e00\u7684\u5411\u91cf\uff0c\u6a21\u578b\u53ef\u4ee5\u7528\u6765\u533a\u5206\u4f4d\u7f6e\u3002\u73b0\u4ee3\u6a21\u578b\u901a\u5e38\u4f7f\u7528\u5b66\u4e60\u7684\u4f4d\u7f6e\u5d4c\u5165\u6216\u76f8\u5bf9\u4f4d\u7f6e\u7f16\u7801\uff08RoPE\u3001ALiBi\uff09\u4ee3\u66ff\u3002
Transformer\u5e76\u884c\u5904\u7406\u6240\u6709\u6807\u8bb0\uff08\u81ea\u6ce8\u610f\u529b\u77e9\u9635 \\(QK^T\\) \u5728\u4e00\u6b21\u77e9\u9635\u4e58\u6cd5\u4e2d\u8ba1\u7b97\uff09\uff0c\u8fd9\u4f7f\u5f97\u5b83\u4eec\u5728\u73b0\u4ee3\u786c\u4ef6\u4e0a\u6bd4RNN\u8bad\u7ec3\u66f4\u5feb\u3002\u6743\u8861\u662f\u81ea\u6ce8\u610f\u529b\u5728\u5e8f\u5217\u957f\u5ea6\u4e0a\u662f \\(O(n^2)\\)\uff08\u6bcf\u4e2a\u6807\u8bb0\u5173\u6ce8\u6bcf\u4e2a\u5176\u4ed6\u6807\u8bb0\uff09\uff0c\u800cRNN\u662f \\(O(n)\\)\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u957f\u4e0a\u4e0b\u6587\u6a21\u578b\u9700\u8981\u7279\u6b8a\u7684\u6ce8\u610f\u529b\u53d8\u4f53\uff08\u7a00\u758f\u6ce8\u610f\u529b\u3001\u7ebf\u6027\u6ce8\u610f\u529b\u3001Flash Attention\uff09\u3002
\u89c6\u89c9Transformer\uff08ViT\uff09 \u901a\u8fc7\u5c06\u56fe\u50cf\u5206\u5272\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684\u5757\uff08\u598216x16\uff09\uff0c\u5c06\u6bcf\u4e2a\u5757\u5c55\u5e73\u4e3a\u5411\u91cf\uff0c\u5e76\u5c06\u8fd9\u4e9b\u5757\u89c6\u4e3a\u6807\u8bb0\u5e8f\u5217\uff0c\u5c06Transformer\u5e94\u7528\u4e8e\u56fe\u50cf\u3002\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684[CLS]\u6807\u8bb0\u88ab\u524d\u7f6e\uff0c\u5176\u6700\u7ec8\u8868\u793a\u7528\u4e8e\u5206\u7c7b\u3002\u5c3d\u7ba1\u6ca1\u6709\u5377\u79ef\u7684\u5f52\u7eb3\u504f\u7f6e\uff0cViT\u5728\u8db3\u591f\u6570\u636e\u4e0a\u8bad\u7ec3\u65f6\u53ef\u4ee5\u5339\u914d\u6216\u8d85\u8d8aCNN\u3002
MLP-Mixer \u662f\u4e00\u79cd\u66f4\u7b80\u5355\u7684\u67b6\u6784\uff0c\u7528MLP\u66ff\u4ee3\u4e86\u6ce8\u610f\u529b\u548c\u5377\u79ef\u3002\u5b83\u5728\"\u6807\u8bb0\u6df7\u5408\"MLP\uff08\u8de8\u7a7a\u95f4\u4f4d\u7f6e\u5e94\u7528\uff09\u548c\"\u901a\u9053\u6df7\u5408\"MLP\uff08\u8de8\u7279\u5f81\u5e94\u7528\uff09\u4e4b\u95f4\u4ea4\u66ff\u3002\u5b83\u7684\u8868\u73b0\u5177\u6709\u7ade\u4e89\u529b\uff0c\u8868\u660e\u73b0\u4ee3\u67b6\u6784\u7684\u5173\u952e\u6d1e\u5bdf\u4e0d\u662f\u6ce8\u610f\u529b\u672c\u8eab\uff0c\u800c\u662f\u8de8\u6807\u8bb0\u548c\u7279\u5f81\u7684\u9ad8\u6548\u4fe1\u606f\u6df7\u5408\u3002
\u81ea\u7f16\u7801\u5668\u901a\u8fc7\u8bad\u7ec3\u7f51\u7edc\u91cd\u6784\u81ea\u8eab\u8f93\u5165\u6765\u5b66\u4e60\u538b\u7f29\u8868\u793a\u3002\u7f16\u7801\u5668\u5c06\u8f93\u5165\u6620\u5c04\u5230\u4f4e\u7ef4\u74f6\u9888\uff08\u6f5c\u7801\uff09\uff0c\u89e3\u7801\u5668\u5c06\u5176\u6620\u5c04\u56de\u6765\uff1a
\u74f6\u9888\u8feb\u4f7f\u7f51\u7edc\u5b66\u4e60\u6700\u91cd\u8981\u7684\u7279\u5f81\u3002\u81ea\u7f16\u7801\u5668\u7528\u4e8e\u964d\u7ef4\u3001\u53bb\u566a\uff08\u5728\u566a\u58f0\u8f93\u5165\u4e0a\u8bad\u7ec3\uff0c\u91cd\u6784\u5e72\u51c0\u8f93\u51fa\uff09\u548c\u5f02\u5e38\u68c0\u6d4b\uff08\u9ad8\u91cd\u6784\u8bef\u5dee\u8868\u660e\u8f93\u5165\u5f02\u5e38\uff09\u3002
\u53d8\u5206\u81ea\u7f16\u7801\u5668\uff08VAE\uff09 \u589e\u52a0\u4e86\u6982\u7387\u7684\u53d8\u4f53\u3002\u7f16\u7801\u5668\u4e0d\u662f\u7f16\u7801\u5230\u5355\u4e2a\u70b9 \\(z\\)\uff0c\u800c\u662f\u8f93\u51fa\u5206\u5e03\u7684\u53c2\u6570\uff08\u9ad8\u65af\u7684\u5747\u503c \\(\\mu\\) \u548c\u65b9\u5dee \\(\\sigma^2\\)\uff09\u3002\u6f5c\u7801\u4ece\u6b64\u5206\u5e03\u4e2d\u91c7\u6837\uff1a\\(z = \\mu + \\sigma \\odot \\epsilon\\)\uff0c\u5176\u4e2d \\(\\epsilon \\sim \\mathcal{N}(0, I)\\)\u3002\u8fd9\u4e2a\u91cd\u53c2\u6570\u5316\u6280\u5de7\u4f7f\u91c7\u6837\u53ef\u5fae\uff0c\u68af\u5ea6\u53ef\u4ee5\u6d41\u8fc7\u3002
VAE\u635f\u5931\u6709\u4e24\u4e2a\u9879\uff1a
\u5728JAX\u4e2d\u4ece\u5934\u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684MLP\u3002\u5728\u4e8c\u7ef4\u5206\u7c7b\u95ee\u9898\uff08\u5982\u540c\u5fc3\u5706\uff09\u4e0a\u8bad\u7ec3\u5e76\u53ef\u89c6\u5316\u51b3\u7b56\u8fb9\u754c\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_circles\n\n# \u6570\u636e\nX, y = make_circles(n_samples=500, noise=0.1, factor=0.5, random_state=42)\nX, y = jnp.array(X), jnp.array(y, dtype=jnp.float32)\n\n# \u521d\u59cb\u5316\u4e00\u4e2a2\u5c42MLP\uff1a2 -> 16 -> 16 -> 1\ndef init_params(key):\n k1, k2, k3 = jax.random.split(key, 3)\n return {\n 'W1': jax.random.normal(k1, (2, 16)) * 0.5,\n 'b1': jnp.zeros(16),\n 'W2': jax.random.normal(k2, (16, 16)) * 0.5,\n 'b2': jnp.zeros(16),\n 'W3': jax.random.normal(k3, (16, 1)) * 0.5,\n 'b3': jnp.zeros(1),\n }\n\ndef forward(params, x):\n h = jnp.maximum(0, x @ params['W1'] + params['b1']) # ReLU\n h = jnp.maximum(0, h @ params['W2'] + params['b2']) # ReLU\n logit = (h @ params['W3'] + params['b3']).squeeze()\n return jax.nn.sigmoid(logit)\n\ndef loss_fn(params, X, y):\n pred = forward(params, X)\n return -jnp.mean(y * jnp.log(pred + 1e-7) + (1 - y) * jnp.log(1 - pred + 1e-7))\n\ngrad_fn = jax.jit(jax.grad(loss_fn))\nparams = init_params(jax.random.PRNGKey(0))\nlr = 0.1\n\nfor step in range(2000):\n grads = grad_fn(params, X, y)\n params = {k: params[k] - lr * grads[k] for k in params}\n\n# \u7ed8\u5236\u51b3\u7b56\u8fb9\u754c\nxx, yy = jnp.meshgrid(jnp.linspace(-2, 2, 200), jnp.linspace(-2, 2, 200))\ngrid = jnp.column_stack([xx.ravel(), yy.ravel()])\nzz = forward(params, grid).reshape(xx.shape)\n\nplt.figure(figsize=(7, 6))\nplt.contourf(xx, yy, zz, levels=[0, 0.5, 1], alpha=0.3, colors=['#e74c3c', '#3498db'])\nplt.scatter(X[y==0,0], X[y==0,1], c='#e74c3c', s=10, label='Class 0')\nplt.scatter(X[y==1,0], X[y==1,1], c='#3498db', s=10, label='Class 1')\nplt.title(\"MLP Decision Boundary on Concentric Circles\")\nplt.legend(); plt.grid(alpha=0.3); plt.show()\n\nacc = jnp.mean((forward(params, X) > 0.5) == y)\nprint(f\"Accuracy: {acc:.2%}\")\n \u4ece\u5934\u5b9e\u73b0\u4e00\u7ef4\u5377\u79ef\u3002\u5c06\u7b80\u5355\u7684\u8fb9\u7f18\u68c0\u6d4b\u6ee4\u6ce2\u5668\u5e94\u7528\u4e8e\u4fe1\u53f7\uff0c\u5e76\u4e0e\u5185\u7f6e\u7684 jnp.convolve \u8fdb\u884c\u6bd4\u8f83\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef conv1d(signal, kernel):\n \"\"\"\u4ece\u5934\u5b9e\u73b0\u4e00\u7ef4\u5377\u79ef\uff08valid\u6a21\u5f0f\uff09\u3002\"\"\"\n n, k = len(signal), len(kernel)\n output = jnp.zeros(n - k + 1)\n for i in range(n - k + 1):\n output = output.at[i].set(jnp.sum(signal[i:i+k] * kernel))\n return output\n\n# \u521b\u5efa\u4e00\u4e2a\u5e26\u6709\u9636\u8dc3\u51fd\u6570\u7684\u4fe1\u53f7\nt = jnp.linspace(0, 4, 200)\nsignal = jnp.where(t < 1, 0.0, jnp.where(t < 2, 1.0, jnp.where(t < 3, 0.5, 1.5)))\n\n# \u8fb9\u7f18\u68c0\u6d4b\u6838\nedge_kernel = jnp.array([-1.0, 0.0, 1.0])\n\n# \u6211\u4eec\u7684\u5b9e\u73b0 vs \u5185\u7f6e\u51fd\u6570\nour_output = conv1d(signal, edge_kernel)\njnp_output = jnp.convolve(signal, edge_kernel, mode='valid')\n\nfig, axes = plt.subplots(3, 1, figsize=(10, 6), sharex=True)\naxes[0].plot(t, signal, color='#3498db', linewidth=1.5)\naxes[0].set_title(\"Original Signal\"); axes[0].set_ylabel(\"Value\")\n\naxes[1].plot(t[:len(our_output)], our_output, color='#e74c3c', linewidth=1.5)\naxes[1].set_title(\"After Edge Detection (our conv1d)\"); axes[1].set_ylabel(\"Value\")\n\naxes[2].plot(t[:len(jnp_output)], jnp_output, color='#27ae60', linewidth=1.5, linestyle='--')\naxes[2].set_title(\"After Edge Detection (jnp.convolve)\"); axes[2].set_ylabel(\"Value\")\naxes[2].set_xlabel(\"t\")\n\nplt.tight_layout(); plt.show()\nprint(f\"Outputs match: {jnp.allclose(our_output, jnp_output)}\")\n \u4ece\u5934\u5b9e\u73b0\u7f29\u653e\u70b9\u79ef\u6ce8\u610f\u529b\u3002\u4e3a\u4e00\u4e2a\u5c0f\u4f8b\u5b50\u8ba1\u7b97\u6ce8\u610f\u529b\u6743\u91cd\uff0c\u5e76\u5c06\u6ce8\u610f\u529b\u77e9\u9635\u53ef\u89c6\u5316\u4e3a\u70ed\u529b\u56fe\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef scaled_dot_product_attention(Q, K, V):\n \"\"\"\u7f29\u653e\u70b9\u79ef\u6ce8\u610f\u529b\u3002\"\"\"\n d_k = Q.shape[-1]\n scores = Q @ K.T / jnp.sqrt(d_k)\n weights = jax.nn.softmax(scores, axis=-1)\n output = weights @ V\n return output, weights\n\n# \u793a\u4f8b\uff1a4\u4e2a\u6807\u8bb0\uff0c\u5d4c\u5165\u7ef4\u5ea68\nkey = jax.random.PRNGKey(42)\nk1, k2, k3 = jax.random.split(key, 3)\nseq_len, d_model = 4, 8\n\nQ = jax.random.normal(k1, (seq_len, d_model))\nK = jax.random.normal(k2, (seq_len, d_model))\nV = jax.random.normal(k3, (seq_len, d_model))\n\noutput, weights = scaled_dot_product_attention(Q, K, V)\n\nprint(f\"Q shape: {Q.shape}\")\nprint(f\"Attention weights shape: {weights.shape}\")\nprint(f\"Output shape: {output.shape}\")\nprint(f\"\\nAttention weights (rows sum to 1):\")\nprint(weights)\nprint(f\"Row sums: {weights.sum(axis=-1)}\")\n\n# \u53ef\u89c6\u5316\u6ce8\u610f\u529b\nfig, ax = plt.subplots(figsize=(5, 4))\nim = ax.imshow(weights, cmap='Blues', vmin=0, vmax=1)\nax.set_xlabel(\"Key position\"); ax.set_ylabel(\"Query position\")\nax.set_title(\"Attention Weights\")\ntokens = ['tok 0', 'tok 1', 'tok 2', 'tok 3']\nax.set_xticks(range(4)); ax.set_xticklabels(tokens)\nax.set_yticks(range(4)); ax.set_yticklabels(tokens)\nfor i in range(4):\n for j in range(4):\n ax.text(j, i, f\"{weights[i,j]:.2f}\", ha='center', va='center', fontsize=10)\nplt.colorbar(im); plt.tight_layout(); plt.show()\n \u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u81ea\u7f16\u7801\u5668\uff0c\u901a\u8fc7\u4e00\u7ef4\u74f6\u9888\u538b\u7f29\u4e8c\u7ef4\u6570\u636e\u5e76\u91cd\u5efa\u3002\u53ef\u89c6\u5316\u6f5c\u7a7a\u95f4\u548c\u91cd\u5efa\u7ed3\u679c\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom sklearn.datasets import make_moons\n\n# \u6570\u636e\nX, _ = make_moons(n_samples=500, noise=0.05, random_state=42)\nX = jnp.array(X)\n\n# \u81ea\u7f16\u7801\u5668\uff1a2 -> 8 -> 1 -> 8 -> 2\ndef init_ae(key):\n k1, k2, k3, k4 = jax.random.split(key, 4)\n return {\n 'enc_W1': jax.random.normal(k1, (2, 8)) * 0.5, 'enc_b1': jnp.zeros(8),\n 'enc_W2': jax.random.normal(k2, (8, 1)) * 0.5, 'enc_b2': jnp.zeros(1),\n 'dec_W1': jax.random.normal(k3, (1, 8)) * 0.5, 'dec_b1': jnp.zeros(8),\n 'dec_W2': jax.random.normal(k4, (8, 2)) * 0.5, 'dec_b2': jnp.zeros(2),\n }\n\ndef encode(p, x):\n h = jnp.tanh(x @ p['enc_W1'] + p['enc_b1'])\n return h @ p['enc_W2'] + p['enc_b2']\n\ndef decode(p, z):\n h = jnp.tanh(z @ p['dec_W1'] + p['dec_b1'])\n return h @ p['dec_W2'] + p['dec_b2']\n\ndef ae_loss(p, X):\n z = encode(p, X)\n X_hat = decode(p, z)\n return jnp.mean((X - X_hat) ** 2)\n\ngrad_fn = jax.jit(jax.grad(ae_loss))\nparams = init_ae(jax.random.PRNGKey(0))\nlr = 0.01\n\nfor step in range(3000):\n grads = grad_fn(params, X)\n params = {k: params[k] - lr * grads[k] for k in params}\n\nz = encode(params, X)\nX_hat = decode(params, z)\n\nfig, axes = plt.subplots(1, 2, figsize=(12, 5))\naxes[0].scatter(X[:,0], X[:,1], c=z.squeeze(), cmap='viridis', s=10)\naxes[0].set_title(\"Original Data (coloured by latent code)\")\naxes[1].scatter(X_hat[:,0], X_hat[:,1], c=z.squeeze(), cmap='viridis', s=10)\naxes[1].set_title(\"Reconstruction from 1D bottleneck\")\nfor ax in axes:\n ax.set_aspect('equal'); ax.grid(alpha=0.3)\nplt.tight_layout(); plt.show()\n\nprint(f\"Reconstruction MSE: {ae_loss(params, X):.4f}\")\n \u5f3a\u5316\u5b66\u4e60\u901a\u8fc7\u8bd5\u9519\u6cd5\u6700\u5927\u5316\u7d2f\u79ef\u5956\u52b1\u6765\u8bad\u7ec3\u667a\u80fd\u4f53\u505a\u51fa\u5e8f\u5217\u51b3\u7b56\u3002\u672c\u6587\u4ef6\u6db5\u76d6MDP\u3001\u4ef7\u503c\u51fd\u6570\u3001\u8d1d\u5c14\u66fc\u65b9\u7a0b\u3001Q\u5b66\u4e60\u3001\u7b56\u7565\u68af\u5ea6\u3001\u6f14\u5458-\u8bc4\u8bba\u5bb6\u65b9\u6cd5\u3001PPO\u548cRLHF\u2014\u2014\u8fd9\u4e9b\u662f\u6e38\u620f\u667a\u80fd\u4f53\u548c\u8bed\u8a00\u6a21\u578b\u5bf9\u9f50\u80cc\u540e\u7684\u6846\u67b6\u3002
\u76d1\u7763\u5b66\u4e60\u9700\u8981\u6807\u6ce8\u6570\u636e\u3002\u65e0\u76d1\u7763\u5b66\u4e60\u5728\u65e0\u6807\u6ce8\u6570\u636e\u4e2d\u53d1\u73b0\u6a21\u5f0f\u3002\u5f3a\u5316\u5b66\u4e60\uff08RL\uff09 \u4e0e\u4e24\u8005\u90fd\u4e0d\u540c\uff1a\u667a\u80fd\u4f53\u901a\u8fc7\u4e0e\u73af\u5883\u7684\u4ea4\u4e92\u3001\u91c7\u53d6\u884c\u52a8\u548c\u63a5\u6536\u5956\u52b1\u6765\u5b66\u4e60\u3002\u6ca1\u6709\u6b63\u786e\u7684\u6807\u7b7e\uff1b\u667a\u80fd\u4f53\u5fc5\u987b\u901a\u8fc7\u8bd5\u9519\u6765\u53d1\u73b0\u597d\u7684\u884c\u4e3a\u3002
\u60f3\u8c61\u6559\u72d7\u4e00\u4e2a\u65b0\u628a\u620f\u3002\u4f60\u4e0d\u4f1a\u7ed9\u5b83\u5c55\u793a\u4e00\u4e2a\u6b63\u786e\u884c\u4e3a\u7684\u6570\u636e\u96c6\u3002\u76f8\u53cd\uff0c\u5b83\u5c1d\u8bd5\u5404\u79cd\u52a8\u4f5c\uff0c\u4f60\u5bf9\u597d\u7684\u884c\u4e3a\u7ed9\u4e88\u5956\u52b1\uff0c\u968f\u7740\u65f6\u95f4\u7684\u63a8\u79fb\u5b83\u660e\u767d\u4e86\u4f60\u60f3\u8981\u4ec0\u4e48\u3002RL\u5c06\u8fd9\u4e2a\u5f62\u5f0f\u5316\u3002
RL\u8bbe\u7f6e\u5305\u542b\u4e94\u4e2a\u6838\u5fc3\u7ec4\u4ef6\u3002\u667a\u80fd\u4f53\uff08agent\uff09 \u662f\u5b66\u4e60\u8005\u548c\u51b3\u7b56\u8005\u3002\u73af\u5883\uff08environment\uff09 \u662f\u667a\u80fd\u4f53\u4e4b\u5916\u4e0e\u4e4b\u4ea4\u4e92\u7684\u4e00\u5207\u3002\u5728\u6bcf\u4e2a\u65f6\u95f4\u6b65\uff0c\u667a\u80fd\u4f53\u89c2\u5bdf\u4e00\u4e2a\u72b6\u6001\uff08state\uff09 \\(s_t\\)\uff0c\u9009\u62e9\u4e00\u4e2a\u52a8\u4f5c\uff08action\uff09 \\(a_t\\)\uff0c\u63a5\u6536\u4e00\u4e2a\u5956\u52b1\uff08reward\uff09 \\(r_t\\)\uff0c\u5e76\u8f6c\u79fb\u5230\u65b0\u72b6\u6001 \\(s_{t+1}\\)\u3002\u667a\u80fd\u4f53\u7684\u76ee\u6807\u662f\u6700\u5927\u5316\u5176\u968f\u65f6\u95f4\u6536\u96c6\u7684\u603b\u5956\u52b1\u3002
\u7b56\u7565\uff08policy\uff09 \\(\\pi\\) \u662f\u667a\u80fd\u4f53\u7684\u7b56\u7565\uff1a\u4ece\u72b6\u6001\u5230\u52a8\u4f5c\u7684\u6620\u5c04\u3002\u786e\u5b9a\u6027\u7b56\u7565\u5bf9\u6bcf\u4e2a\u72b6\u6001\u7ed9\u51fa\u4e00\u4e2a\u52a8\u4f5c\uff1a\\(a = \\pi(s)\\)\u3002\u968f\u673a\u7b56\u7565\u7ed9\u51fa\u52a8\u4f5c\u4e0a\u7684\u6982\u7387\u5206\u5e03\uff1a\\(\\pi(a \\mid s)\\)\u3002RL\u7684\u76ee\u6807\u662f\u627e\u5230\u6700\u4f18\u7b56\u7565\uff0c\u5373\u6700\u5927\u5316\u671f\u671b\u7d2f\u79ef\u5956\u52b1\u7684\u7b56\u7565\u3002
RL\u7684\u6570\u5b66\u6846\u67b6\u662f\u9a6c\u5c14\u53ef\u592b\u51b3\u7b56\u8fc7\u7a0b\uff08MDP\uff09\uff0c\u7531\u5143\u7ec4 \\((S, A, P, R, \\gamma)\\) \u5b9a\u4e49\uff1a\u4e00\u7ec4\u72b6\u6001 \\(S\\)\uff0c\u4e00\u7ec4\u52a8\u4f5c \\(A\\)\uff0c\u8f6c\u79fb\u6982\u7387 \\(P(s' \\mid s, a)\\)\uff0c\u5956\u52b1\u51fd\u6570 \\(R(s, a)\\)\uff0c\u4ee5\u53ca\u6298\u6263\u56e0\u5b50 \\(\\gamma\\)\u3002
\u9a6c\u5c14\u53ef\u592b\u6027\u8d28\uff08\u6765\u81ea\u7b2c05\u7ae0\uff09\u6307\u51fa\u672a\u6765\u4ec5\u53d6\u51b3\u4e8e\u5f53\u524d\u72b6\u6001\uff0c\u800c\u4e0d\u662f\u5982\u4f55\u5230\u8fbe\u90a3\u91cc\u7684\u5386\u53f2\uff1a\\(P(s_{t+1} \\mid s_t, a_t, s_{t-1}, \\ldots) = P(s_{t+1} \\mid s_t, a_t)\\)\u3002\u8fd9\u610f\u5473\u7740\u72b6\u6001\u5305\u542b\u4e86\u505a\u51fa\u51b3\u7b56\u6240\u9700\u7684\u5168\u90e8\u4fe1\u606f\u3002
\u6298\u6263\u56e0\u5b50 \\(\\gamma \\in [0, 1)\\) \u51b3\u5b9a\u4e86\u667a\u80fd\u4f53\u5bf9\u672a\u6765\u5956\u52b1\u76f8\u5bf9\u4e8e\u5373\u65f6\u5956\u52b1\u7684\u91cd\u89c6\u7a0b\u5ea6\u3002\u4ece\u65f6\u95f4 \\(t\\) \u5f00\u59cb\u7684\u6298\u6263\u56de\u62a5\u4e3a\uff1a
\u5f53 \\(\\gamma = 0\\) \u65f6\uff0c\u667a\u80fd\u4f53\u5b8c\u5168\u77ed\u89c6\uff0c\u53ea\u5173\u5fc3\u4e0b\u4e00\u4e2a\u5956\u52b1\u3002\u5f53 \\(\\gamma\\) \u63a5\u8fd11\u65f6\uff0c\u667a\u80fd\u4f53\u5177\u6709\u957f\u8fdc\u773c\u5149\u3002\u6298\u6263\u56e0\u5b50\u8fd8\u786e\u4fdd\u4e86\u6c42\u548c\u6536\u655b\uff08\u5982\u679c\u5956\u52b1\u6709\u754c\uff09\uff0c\u8fd9\u5bf9\u6570\u5b66\u4e0a\u7684\u826f\u5b9a\u4e49\u6027\u5f88\u91cd\u8981\u3002
\u4ef7\u503c\u51fd\u6570\u4f30\u8ba1\u5904\u4e8e\u67d0\u4e2a\u72b6\u6001\uff08\u6216\u5728\u67d0\u4e2a\u72b6\u6001\u4e0b\u91c7\u53d6\u67d0\u4e2a\u52a8\u4f5c\uff09\u6709\u591a\u597d\u3002\u72b6\u6001\u4ef7\u503c\u51fd\u6570 \\(V^\\pi(s)\\) \u662f\u4ece\u72b6\u6001 \\(s\\) \u5f00\u59cb\u5e76\u6309\u7167\u7b56\u7565 \\(\\pi\\) \u884c\u52a8\u6240\u83b7\u5f97\u7684\u671f\u671b\u56de\u62a5\uff1a
\u4e24\u8005\u5173\u7cfb\uff1a\\(V^\\pi(s) = \\sum_a \\pi(a \\mid s) \\, Q^\\pi(s, a)\\)\u3002\u72b6\u6001\u4ef7\u503c\u662f\u52a8\u4f5c\u4ef7\u503c\u6309\u7b56\u7565\u52a0\u6743\u7684\u5e73\u5747\u503c\u3002
\u8d1d\u5c14\u66fc\u65b9\u7a0b\u8868\u8fbe\u4e86\u9012\u5f52\u5173\u7cfb\uff1a\u4e00\u4e2a\u72b6\u6001\u7684\u4ef7\u503c\u7b49\u4e8e\u5373\u65f6\u5956\u52b1\u52a0\u4e0a\u4e0b\u4e00\u4e2a\u72b6\u6001\u7684\u6298\u6263\u4ef7\u503c\u3002\u5bf9\u4e8e\u72b6\u6001\u4ef7\u503c\u51fd\u6570\uff1a
\u4e00\u65e6\u4f60\u6709\u4e86 \\(Q^{*}\\)\uff0c\u6700\u4f18\u7b56\u7565\u5c31\u5f88\u7b80\u5355\u4e86\uff1a\u603b\u662f\u9009\u62e9Q\u503c\u6700\u9ad8\u7684\u52a8\u4f5c\uff1a\\(\\pi^{*}(s) = \\arg\\max_a Q^{*}(s, a)\\)\u3002
\u52a8\u6001\u89c4\u5212\u65b9\u6cd5\u5728\u5df2\u77e5\u8f6c\u79fb\u6982\u7387\u548c\u5956\u52b1\uff08\u5b8c\u6574\u6a21\u578b\uff09\u65f6\u6c42\u89e3MDP\u3002\u7b56\u7565\u8bc4\u4f30\u901a\u8fc7\u8fed\u4ee3\u5e94\u7528\u8d1d\u5c14\u66fc\u65b9\u7a0b\u76f4\u5230\u6536\u655b\u6765\u8ba1\u7b97\u7ed9\u5b9a\u7b56\u7565\u7684 \\(V^\\pi\\)\u3002\u7b56\u7565\u6539\u8fdb\u5229\u7528\u4ef7\u503c\u51fd\u6570\u5e76\u901a\u8fc7\u5bf9\u6700\u4f18\u52a8\u4f5c\u8d2a\u5fc3\u6765\u6784\u5efa\u66f4\u597d\u7684\u7b56\u7565\uff1a\\(\\pi'(s) = \\arg\\max_a \\sum_{s'} P(s' \\mid s, a)[R(s,a) + \\gamma V^\\pi(s')]\\)\u3002
\u7b56\u7565\u8fed\u4ee3\u5728\u8bc4\u4f30\u548c\u6539\u8fdb\u4e4b\u95f4\u4ea4\u66ff\uff0c\u76f4\u5230\u7b56\u7565\u505c\u6b62\u53d8\u5316\u3002\u5b83\u4fdd\u8bc1\u6536\u655b\u5230\u6700\u4f18\u7b56\u7565\u3002
\u4ef7\u503c\u8fed\u4ee3\u5c06\u4e24\u4e2a\u6b65\u9aa4\u5408\u5e76\u4e3a\u4e00\u4e2a\uff1a\u91cd\u590d\u5e94\u7528\u8d1d\u5c14\u66fc\u6700\u4f18\u65b9\u7a0b\u76f4\u5230 \\(V^{*}\\) \u6536\u655b\uff0c\u7136\u540e\u63d0\u53d6\u7b56\u7565\u3002
\u52a8\u6001\u89c4\u5212\u9700\u8981\u77e5\u9053 \\(P(s' \\mid s, a)\\)\uff0c\u8fd9\u901a\u5e38\u4e0d\u53ef\u884c\u3002\u5728\u5927\u591a\u6570\u771f\u5b9e\u95ee\u9898\u4e2d\uff0c\u667a\u80fd\u4f53\u4e0d\u77e5\u9053\u73af\u5883\u7684\u52a8\u6001\uff1b\u5b83\u53ea\u80fd\u4e0e\u73af\u5883\u4ea4\u4e92\u3002\u8fd9\u5c31\u662f\u65e0\u6a21\u578b\u65b9\u6cd5\u53d1\u6325\u4f5c\u7528\u7684\u5730\u65b9\u3002
\u65f6\u5e8f\u5dee\u5206\uff08TD\uff09\u5b66\u4e60\u5728\u4e0d\u4e86\u89e3\u6a21\u578b\u7684\u60c5\u51b5\u4e0b\u4ece\u7ecf\u9a8c\u4e2d\u5b66\u4e60\u3002\u5173\u952e\u601d\u60f3\u662f\u5f15\u5bfc\uff08bootstrapping\uff09\uff1a\u4e0d\u7b49\u60c5\u8282\u7ed3\u675f\u624d\u8ba1\u7b97\u5b9e\u9645\u56de\u62a5 \\(G_t\\)\uff0c\u800c\u662f\u4f7f\u7528\u5f53\u524d\u7684\u4ef7\u503c\u51fd\u6570\u5bf9\u5176\u8fdb\u884c\u4f30\u8ba1\uff1a
TD\u5b66\u4e60\u5728\u6bcf\u4e00\u6b65\u4e4b\u540e\uff08\u800c\u4e0d\u662f\u5b8c\u6210\u6574\u4e2a\u60c5\u8282\u540e\uff09\u8fdb\u884c\u66f4\u65b0\uff0c\u8fd9\u4f7f\u5176\u6bd4\u8499\u7279\u5361\u6d1b\u65b9\u6cd5\u9ad8\u6548\u5f97\u591a\u3002\u5b83\u4e5f\u9002\u7528\u4e8e\u6301\u7eed\uff08\u975e\u60c5\u8282\u5f0f\uff09\u73af\u5883\u3002
SARSA\uff08\u72b6\u6001-\u52a8\u4f5c-\u5956\u52b1-\u72b6\u6001-\u52a8\u4f5c\uff09\u662f\u5c06TD\u5b66\u4e60\u5e94\u7528\u4e8eQ\u503c\u3002\u667a\u80fd\u4f53\u5728\u72b6\u6001 \\(s\\) \u4e0b\u91c7\u53d6\u52a8\u4f5c \\(a\\)\uff0c\u89c2\u5bdf\u5956\u52b1 \\(r\\) \u548c\u4e0b\u4e00\u72b6\u6001 \\(s'\\)\uff0c\u7136\u540e\u6839\u636e\u5176\u7b56\u7565\u9009\u62e9\u4e0b\u4e00\u4e2a\u52a8\u4f5c \\(a'\\)\uff1a
SARSA\u662f\u5728\u7b56\u7565\uff08on-policy\uff09\uff1a\u5b83\u4f7f\u7528\u667a\u80fd\u4f53\u5b9e\u9645\u91c7\u53d6\u7684\u52a8\u4f5c\u8fdb\u884c\u66f4\u65b0\uff0c\u8fd9\u5305\u62ec\u4e86\u63a2\u7d22\u3002\u8fd9\u4f7f\u5f97SARSA\u66f4\u4e3a\u4fdd\u5b88\uff1b\u5b83\u5b66\u4e60\u4e00\u4e2a\u8003\u8651\u81ea\u8eab\u63a2\u7d22\u566a\u58f0\u7684\u7b56\u7565\u3002
Q\u5b66\u4e60\u662f\u6700\u8457\u540d\u7684RL\u7b97\u6cd5\u3002\u5b83\u7c7b\u4f3c\u4e8eSARSA\uff0c\u4f46\u4e0d\u540c\u7684\u662f\u5b83\u4f7f\u7528\u6700\u4f73\u53ef\u80fd\u52a8\u4f5c\u800c\u975e\u667a\u80fd\u4f53\u5b9e\u9645\u91c7\u53d6\u7684\u52a8\u4f5c\uff1a
Q\u5b66\u4e60\u662f\u79bb\u7b56\u7565\uff08off-policy\uff09\uff1a\u5b83\u5b66\u4e60\u6700\u4f18Q\u503c\uff0c\u4e0e\u6b63\u5728\u6267\u884c\u7684\u7b56\u7565\u65e0\u5173\u3002\u667a\u80fd\u4f53\u53ef\u4ee5\u968f\u673a\u63a2\u7d22\uff0c\u540c\u65f6\u4ecd\u7136\u5b66\u4e60\u6700\u4f18\u52a8\u4f5c\u4ef7\u503c\u3002\u8fd9\u4f7f\u5f97Q\u5b66\u4e60\u66f4\u5177\u653b\u51fb\u6027\uff0c\u901a\u5e38\u6536\u655b\u66f4\u5feb\uff0c\u4f46\u53ef\u80fd\u9ad8\u4f30\u503c\u3002
\u63a2\u7d22 vs \u5229\u7528\u662f\u57fa\u672c\u56f0\u5883\uff1a\u667a\u80fd\u4f53\u5e94\u8be5\u5229\u7528\u5df2\u77e5\u4fe1\u606f\uff08\u9009\u62e9\u4f30\u8ba1\u4ef7\u503c\u6700\u9ad8\u7684\u52a8\u4f5c\uff09\u8fd8\u662f\u63a2\u7d22\u672a\u77e5\u52a8\u4f5c\uff08\u53ef\u80fd\u53d1\u73b0\u66f4\u597d\u7684\uff09\uff1f
\u6700\u7b80\u5355\u7684\u7b56\u7565\u662f\u03b5-\u8d2a\u5fc3\uff1a\u4ee5\u6982\u7387 \\(\\epsilon\\) \u91c7\u53d6\u968f\u673a\u52a8\u4f5c\uff08\u63a2\u7d22\uff09\uff1b\u4ee5\u6982\u7387 \\(1 - \\epsilon\\) \u91c7\u53d6\u8d2a\u5fc3\u52a8\u4f5c\uff08\u5229\u7528\uff09\u3002\u4e00\u79cd\u5e38\u89c1\u7684\u65f6\u95f4\u8868\u662f\u4ece\u9ad8 \\(\\epsilon\\)\uff08\u5927\u91cf\u63a2\u7d22\uff09\u5f00\u59cb\uff0c\u968f\u65f6\u95f4\u8870\u51cf\u3002
\u8868\u683c\u65b9\u6cd5\uff08\u5728\u8868\u4e2d\u5b58\u50a8\u6bcf\u4e2a\u72b6\u6001-\u52a8\u4f5c\u5bf9\u7684\u4ef7\u503c\uff09\u9002\u7528\u4e8e\u5c0f\u7684\u79bb\u6563\u72b6\u6001\u7a7a\u95f4\u3002\u5bf9\u4e8e\u5927\u6216\u8fde\u7eed\u7684\u72b6\u6001\u7a7a\u95f4\uff0c\u9700\u8981\u51fd\u6570\u8fd1\u4f3c\u3002\u6df1\u5ea6Q\u7f51\u7edc\uff08DQN\uff09 \u4f7f\u7528\u795e\u7ecf\u7f51\u7edc\u6765\u8fd1\u4f3c \\(Q(s, a; \\theta)\\)\uff0c\u5176\u4e2d \\(\\theta\\) \u662f\u7f51\u7edc\u6743\u91cd\u3002
DQN\u5f15\u5165\u4e86\u4e24\u4e2a\u5173\u952e\u7684\u7a33\u5b9a\u6280\u672f\u3002\u7ecf\u9a8c\u56de\u653e\uff1a\u4e0d\u662f\u4ece\u8fde\u7eed\u7684\u8f6c\u79fb\u4e2d\u5b66\u4e60\uff08\u9ad8\u5ea6\u76f8\u5173\uff09\uff0c\u800c\u662f\u5c06\u8f6c\u79fb\u5b58\u50a8\u5728\u56de\u653e\u7f13\u51b2\u533a\u4e2d\uff0c\u5e76\u91c7\u6837\u968f\u673a\u5c0f\u6279\u6b21\u8fdb\u884c\u8bad\u7ec3\u3002\u8fd9\u6253\u7834\u4e86\u76f8\u5173\u6027\u5e76\u9ad8\u6548\u5730\u91cd\u7528\u6570\u636e\u3002
\u76ee\u6807\u7f51\u7edc\uff1a\u4f7f\u7528\u4e00\u4e2a\u5355\u72ec\u7684\u3001\u7f13\u6162\u66f4\u65b0\u7684\u7f51\u7edc\u526f\u672c\u6765\u8ba1\u7b97TD\u76ee\u6807\u3002\u6ca1\u6709\u8fd9\u4e2a\uff0c\u6bcf\u6b21\u66f4\u65b0\u7f51\u7edc\u65f6\u76ee\u6807\u90fd\u4f1a\u79fb\u52a8\uff0c\u9020\u6210\"\u8ffd\u81ea\u5df1\u5c3e\u5df4\"\u7684\u4e0d\u7a33\u5b9a\u6027\u3002\u76ee\u6807\u7f51\u7edc\u5b9a\u671f\u66f4\u65b0\uff08\u6bcf \\(N\\) \u6b65\u786c\u66f4\u65b0\uff09\u6216\u8fde\u7eed\u66f4\u65b0\uff08\u8f6f\u66f4\u65b0\uff1a\\(\\theta^{-} \\leftarrow \\tau\\theta + (1-\\tau)\\theta^{-}\\)\uff09\u3002
DQN\u635f\u5931\u53ea\u662f\u9884\u6d4bQ\u503c\u4e0eTD\u76ee\u6807\u4e4b\u95f4\u7684\u5747\u65b9\u8bef\u5dee\uff1a
\u5230\u76ee\u524d\u4e3a\u6b62\u7684\u6240\u6709\u65b9\u6cd5\u90fd\u5b66\u4e60\u4ef7\u503c\u51fd\u6570\u5e76\u4ece\u4e2d\u63a8\u5bfc\u7b56\u7565\u3002\u7b56\u7565\u68af\u5ea6\u65b9\u6cd5\u91c7\u7528\u4e0d\u540c\u65b9\u6cd5\uff1a\u5b83\u4eec\u76f4\u63a5\u53c2\u6570\u5316\u7b56\u7565 \\(\\pi(a \\mid s; \\theta)\\) \u5e76\u901a\u8fc7\u68af\u5ea6\u4e0a\u5347\u4f18\u5316\u671f\u671b\u56de\u62a5\u3002
\u7b56\u7565\u68af\u5ea6\u5b9a\u7406\u7ed9\u51fa\u4e86\u671f\u671b\u56de\u62a5\u76f8\u5bf9\u4e8e\u7b56\u7565\u53c2\u6570\u7684\u68af\u5ea6\uff1a
\u8fd9\u8bf4\u660e\uff1a\u589e\u52a0\u5bfc\u81f4\u9ad8\u56de\u62a5\u7684\u52a8\u4f5c\u7684\u6982\u7387\uff0c\u51cf\u5c11\u5bfc\u81f4\u4f4e\u56de\u62a5\u7684\u52a8\u4f5c\u7684\u6982\u7387\u3002\u5bf9\u6570\u6982\u7387\u68af\u5ea6\u7ed9\u51fa\u4e86\u6539\u53d8\u7b56\u7565\u7684\u65b9\u5411\uff0c\\(G_t\\) \u5219\u7f29\u653e\u6539\u53d8\u7684\u7a0b\u5ea6\u3002
REINFORCE\u662f\u6700\u7b80\u5355\u7684\u7b56\u7565\u68af\u5ea6\u7b97\u6cd5\u3002\u8fd0\u884c\u4e00\u4e2a\u60c5\u8282\uff0c\u4e3a\u6bcf\u4e00\u6b65\u8ba1\u7b97\u56de\u62a5 \\(G_t\\)\uff0c\u7136\u540e\u66f4\u65b0\uff1a
PPO\uff08\u8fd1\u7aef\u7b56\u7565\u4f18\u5316\uff09\u662f\u5b9e\u8df5\u4e2d\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684\u7b56\u7565\u68af\u5ea6\u7b97\u6cd5\u3002\u5b83\u89e3\u51b3\u4e86\u4e00\u4e2a\u5173\u952e\u95ee\u9898\uff1a\u5982\u679c\u7b56\u7565\u66f4\u65b0\u8fc7\u5927\uff0c\u6027\u80fd\u53ef\u80fd\u707e\u96be\u6027\u5730\u5d29\u6e83\u3002
PPO\u4f7f\u7528\u4e00\u4e2a\u88c1\u526a\u7684\u66ff\u4ee3\u76ee\u6807\u3002\u4ee4 \\(r_t(\\theta) = \\frac{\\pi(a_t | s_t; \\theta)}{\\pi(a_t | s_t; \\theta_{\\text{old}})}\\) \u4e3a\u65b0\u65e7\u7b56\u7565\u4e4b\u95f4\u7684\u6982\u7387\u6bd4\u3002\u635f\u5931\u4e3a\uff1a
\u88c1\u526a\uff08\u901a\u5e38 \\(\\epsilon = 0.2\\)\uff09\u9632\u6b62\u6bd4\u7387\u8fdc\u79bb1\uff0c\u4f7f\u66f4\u65b0\u4fdd\u6301\u5c0f\u800c\u7a33\u5b9a\u3002\u5982\u679c\u4f18\u52bf\u4e3a\u6b63\uff08\u52a8\u4f5c\u597d\uff09\uff0c\u6bd4\u7387\u4e0a\u9650\u4e3a \\(1 + \\epsilon\\)\u3002\u5982\u679c\u4e3a\u8d1f\uff08\u52a8\u4f5c\u5dee\uff09\uff0c\u6bd4\u7387\u4e0b\u9650\u4e3a \\(1 - \\epsilon\\)\u3002\u8fd9\u6bd4\u65e9\u671f\u7684\u4fe1\u4efb\u533a\u57df\u65b9\u6cd5\uff08TRPO\uff09\u66f4\u7b80\u5355\u3001\u66f4\u7a33\u5b9a\u3002
PPO\u88ab\u7528\u4e8e\u901a\u8fc7RLHF\uff08\u57fa\u4e8e\u4eba\u7c7b\u53cd\u9988\u7684\u5f3a\u5316\u5b66\u4e60\uff09\u8bad\u7ec3ChatGPT\u98ce\u683c\u7684\u6a21\u578b\u3002\u5728RLHF\u4e2d\uff0c\u4e00\u4e2a\u5956\u52b1\u6a21\u578b\u5728\u4eba\u7c7b\u504f\u597d\u6570\u636e\uff08\u4eba\u7c7b\u66f4\u559c\u6b22\u4e24\u4e2a\u8f93\u51fa\u4e2d\u7684\u54ea\u4e00\u4e2a\uff1f\uff09\u4e0a\u8bad\u7ec3\uff0c\u7136\u540ePPO\u4f18\u5316\u8bed\u8a00\u6a21\u578b\u7b56\u7565\u4ee5\u6700\u5927\u5316\u8fd9\u4e2a\u5b66\u4e60\u5230\u7684\u5956\u52b1\u3002
DPO\uff08\u76f4\u63a5\u504f\u597d\u4f18\u5316\uff09\u901a\u8fc7\u5b8c\u5168\u6d88\u9664\u5956\u52b1\u6a21\u578b\u6765\u7b80\u5316RLHF\u3002DPO\u4e0d\u8bad\u7ec3\u5956\u52b1\u6a21\u578b\u7136\u540e\u8fd0\u884cRL\uff0c\u800c\u662f\u63a8\u5bfc\u51fa\u4e00\u4e2a\u95ed\u5f0f\u635f\u5931\uff0c\u76f4\u63a5\u4ece\u504f\u597d\u6570\u636e\u4f18\u5316\u7b56\u7565\uff1a
\u8fd9\u91cc \\(y_w\\) \u662f\u504f\u597d\u7684\uff08\u80dc\u51fa\uff09\u56de\u7b54\uff0c\\(y_l\\) \u662f\u4e0d\u88ab\u504f\u597d\u7684\uff08\u5931\u8d25\uff09\u56de\u7b54\u3002DPO\u589e\u52a0\u504f\u597d\u8f93\u51fa\u7684\u76f8\u5bf9\u6982\u7387\uff0c\u5e76\u4e14\u6bd4\u57fa\u4e8ePPO\u7684RLHF\u5b9e\u73b0\u8d77\u6765\u7b80\u5355\u5f97\u591a\u3002
RL\u7b97\u6cd5\u4e2d\u6709\u4e24\u4e2a\u91cd\u8981\u533a\u5206\u3002\u5728\u7b56\u7565 vs \u79bb\u7b56\u7565\uff1a\u5728\u7b56\u7565\u65b9\u6cd5\uff08SARSA, PPO\uff09\u4ece\u5f53\u524d\u7b56\u7565\u751f\u6210\u7684\u6570\u636e\u4e2d\u5b66\u4e60\uff1b\u79bb\u7b56\u7565\u65b9\u6cd5\uff08Q\u5b66\u4e60, DQN\uff09\u53ef\u4ee5\u4ece\u4efb\u4f55\u7b56\u7565\u751f\u6210\u7684\u6570\u636e\u4e2d\u5b66\u4e60\u3002\u79bb\u7b56\u7565\u65b9\u6cd5\u6837\u672c\u6548\u7387\u66f4\u9ad8\uff08\u5b83\u4eec\u91cd\u7528\u65e7\u6570\u636e\uff09\uff0c\u4f46\u53ef\u80fd\u4e0d\u90a3\u4e48\u7a33\u5b9a\u3002
\u57fa\u4e8e\u6a21\u578b vs \u65e0\u6a21\u578b\uff1a\u65e0\u6a21\u578b\u65b9\u6cd5\uff08\u5230\u76ee\u524d\u4e3a\u6b62\u8ba8\u8bba\u7684\u6240\u6709\u65b9\u6cd5\uff09\u76f4\u63a5\u4ece\u7ecf\u9a8c\u4e2d\u5b66\u4e60\u4ef7\u503c\u6216\u7b56\u7565\u3002\u57fa\u4e8e\u6a21\u578b\u7684\u65b9\u6cd5\u5b66\u4e60\u73af\u5883\u7684\u6a21\u578b\uff08\\(P(s' \\mid s, a)\\) \u548c \\(R(s, a)\\)\uff09\u5e76\u7528\u5176\u8fdb\u884c\u89c4\u5212\uff08\u60f3\u8c61\u672a\u6765\u7684\u8f68\u8ff9\u800c\u4e0d\u5b9e\u9645\u91c7\u53d6\u52a8\u4f5c\uff09\u3002\u57fa\u4e8e\u6a21\u578b\u7684\u65b9\u6cd5\u6837\u672c\u6548\u7387\u66f4\u9ad8\uff0c\u4f46\u589e\u52a0\u4e86\u5b66\u4e60\u7cbe\u786e\u6a21\u578b\u7684\u590d\u6742\u6027\u3002
\u603b\u7ed3RL\u9886\u57df\uff1a
\u4e3a\u7b80\u5355\u7684\u7f51\u683c\u4e16\u754c\u5b9e\u73b0\u4ef7\u503c\u8fed\u4ee3\u3002\u8ba1\u7b97\u6700\u4f18\u4ef7\u503c\u51fd\u6570\u5e76\u63d0\u53d6\u6700\u4f18\u7b56\u7565\u3002\u5c06\u4e24\u8005\u53ef\u89c6\u5316\u4e3a\u70ed\u529b\u56fe\u548c\u7bad\u5934\u56fe\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# 4x4\u7f51\u683c\u4e16\u754c\uff1a\u76ee\u6807\u5728(3,3)\uff0c\u6bcf\u6b65\u5956\u52b1-1\uff0c\u76ee\u6807\u5904\u4e3a0\ngrid_size = 4\ngamma = 0.99\ngoal = (3, 3)\n\n# \u52a8\u4f5c\uff1a\u4e0a\u3001\u4e0b\u3001\u5de6\u3001\u53f3\nactions = [(-1, 0), (1, 0), (0, -1), (0, 1)]\naction_names = ['up', 'down', 'left', 'right']\naction_arrows = ['\\u2191', '\\u2193', '\\u2190', '\\u2192']\n\ndef step(s, a):\n \"\"\"\u786e\u5b9a\u6027\u8f6c\u79fb\u3002\"\"\"\n ns = (max(0, min(grid_size-1, s[0]+a[0])),\n max(0, min(grid_size-1, s[1]+a[1])))\n return ns\n\n# \u4ef7\u503c\u8fed\u4ee3\nV = jnp.zeros((grid_size, grid_size))\nfor iteration in range(100):\n V_new = jnp.array(V)\n for i in range(grid_size):\n for j in range(grid_size):\n if (i, j) == goal:\n continue\n values = []\n for a in actions:\n ns = step((i, j), a)\n values.append(-1 + gamma * float(V[ns[0], ns[1]]))\n V_new = V_new.at[i, j].set(max(values))\n if jnp.max(jnp.abs(V_new - V)) < 1e-6:\n print(f\"\u5728{iteration+1}\u6b21\u8fed\u4ee3\u540e\u6536\u655b\")\n break\n V = V_new\n\n# \u63d0\u53d6\u7b56\u7565\npolicy = [['' for _ in range(grid_size)] for _ in range(grid_size)]\nfor i in range(grid_size):\n for j in range(grid_size):\n if (i, j) == goal:\n policy[i][j] = 'G'\n continue\n best_a = max(range(4), key=lambda a: -1 + gamma * float(V[step((i,j), actions[a])[0], step((i,j), actions[a])[1]]))\n policy[i][j] = action_arrows[best_a]\n\nfig, axes = plt.subplots(1, 2, figsize=(10, 4))\nim = axes[0].imshow(V, cmap='YlOrRd_r')\naxes[0].set_title(\"\u6700\u4f18\u4ef7\u503c\u51fd\u6570\")\nfor i in range(grid_size):\n for j in range(grid_size):\n axes[0].text(j, i, f\"{V[i,j]:.1f}\", ha='center', va='center', fontsize=10)\nplt.colorbar(im, ax=axes[0])\n\naxes[1].imshow(jnp.ones((grid_size, grid_size)), cmap='Greys', vmin=0, vmax=2)\naxes[1].set_title(\"\u6700\u4f18\u7b56\u7565\")\nfor i in range(grid_size):\n for j in range(grid_size):\n axes[1].text(j, i, policy[i][j], ha='center', va='center', fontsize=18)\nplt.tight_layout(); plt.show()\n \u5728\u7b80\u5355\u7684\u7f51\u683c\u4e16\u754c\u4e0a\u5b9e\u73b0\u8868\u683cQ\u5b66\u4e60\u3002\u8bad\u7ec3\u667a\u80fd\u4f53\uff0c\u7ed8\u5236\u5b66\u4e60\u66f2\u7ebf\uff0c\u663e\u793a\u5b66\u4e60\u5230\u7684Q\u503c\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ngrid_size = 5\ngoal = (4, 4)\nactions = [(-1,0), (1,0), (0,-1), (0,1)]\n\n# Q\u8868\nQ = {}\nfor i in range(grid_size):\n for j in range(grid_size):\n Q[(i,j)] = [0.0] * 4\n\nalpha = 0.1\ngamma = 0.95\nepsilon = 1.0\nepsilon_decay = 0.995\nmin_epsilon = 0.01\n\ndef step(s, a_idx):\n a = actions[a_idx]\n ns = (max(0, min(grid_size-1, s[0]+a[0])),\n max(0, min(grid_size-1, s[1]+a[1])))\n r = 0.0 if ns == goal else -1.0\n done = ns == goal\n return ns, r, done\n\nkey = jax.random.PRNGKey(42)\nrewards_per_episode = []\n\nfor ep in range(500):\n s = (0, 0)\n total_reward = 0\n for _ in range(100):\n key, subkey = jax.random.split(key)\n if float(jax.random.uniform(subkey)) < epsilon:\n key, subkey = jax.random.split(key)\n a = int(jax.random.randint(subkey, (), 0, 4))\n else:\n a = max(range(4), key=lambda i: Q[s][i])\n\n ns, r, done = step(s, a)\n total_reward += r\n # Q\u5b66\u4e60\u66f4\u65b0\n Q[s][a] += alpha * (r + gamma * max(Q[ns]) - Q[s][a])\n s = ns\n if done:\n break\n rewards_per_episode.append(total_reward)\n epsilon = max(min_epsilon, epsilon * epsilon_decay)\n\nplt.figure(figsize=(8, 4))\n# \u5e73\u6ed1\u66f2\u7ebf\nwindow = 20\nsmoothed = [sum(rewards_per_episode[max(0,i-window):i+1])/min(i+1, window)\n for i in range(len(rewards_per_episode))]\nplt.plot(smoothed, color='#3498db', linewidth=1.5)\nplt.xlabel(\"Episode\"); plt.ylabel(\"Total Reward (smoothed)\")\nplt.title(\"Q-Learning on Gridworld\")\nplt.grid(alpha=0.3); plt.show()\n\n# \u663e\u793a\u5b66\u5230\u7684\u7b56\u7565\narrow = ['\\u2191', '\\u2193', '\\u2190', '\\u2192']\nprint(\"\u5b66\u5230\u7684\u7b56\u7565:\")\nfor i in range(grid_size):\n row = \"\"\n for j in range(grid_size):\n if (i,j) == goal:\n row += \" G \"\n else:\n row += f\" {arrow[max(range(4), key=lambda a: Q[(i,j)][a])]} \"\n print(row)\n \u5728\u591a\u81c2\u8001\u864e\u673a\u95ee\u9898\u4e0a\u5b9e\u73b0REINFORCE\u3002\u5c55\u793a\u7b56\u7565\u5982\u4f55\u968f\u8bad\u7ec3\u6f14\u53d8\u4ee5\u504f\u5411\u6700\u4f73\u81c2\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# 5\u81c2\u8001\u864e\u673a\uff0c\u4e0d\u540c\u671f\u671b\u5956\u52b1\ntrue_rewards = jnp.array([0.2, 0.5, 0.8, 0.3, 0.1])\nn_arms = len(true_rewards)\n\n# \u7b56\u7565\uff1a\u5728logits\u4e0a\u7684softmax\nlogits = jnp.zeros(n_arms)\nlr = 0.1\nkey = jax.random.PRNGKey(42)\n\npolicy_history = []\nreward_history = []\n\nfor step in range(2000):\n probs = jax.nn.softmax(logits)\n policy_history.append(probs)\n\n # \u91c7\u6837\u52a8\u4f5c\n key, subkey = jax.random.split(key)\n action = jax.random.choice(subkey, n_arms, p=probs)\n\n # \u83b7\u53d6\u5956\u52b1\uff08\u4f2f\u52aa\u5229\u5206\u5e03\uff09\n key, subkey = jax.random.split(key)\n reward = float(jax.random.uniform(subkey) < true_rewards[action])\n reward_history.append(reward)\n\n # REINFORCE\u66f4\u65b0\n # grad log pi(a) = e_a - probs\uff08\u5bf9\u4e8esoftmax\u53c2\u6570\u5316\uff09\n grad_log_pi = -probs.at[action].add(1.0) # one-hot(a) - probs\n logits = logits + lr * reward * grad_log_pi\n\npolicy_history = jnp.stack(policy_history)\n\nfig, axes = plt.subplots(1, 2, figsize=(12, 4))\ncolors = ['#3498db', '#e74c3c', '#27ae60', '#9b59b6', '#f39c12']\nfor i in range(n_arms):\n axes[0].plot(policy_history[:, i], color=colors[i],\n label=f'\u81c2{i} (\u771f\u5b9e={true_rewards[i]:.1f})', linewidth=1.5)\naxes[0].set_xlabel(\"\u6b65\u9aa4\"); axes[0].set_ylabel(\"P(\u81c2)\")\naxes[0].set_title(\"\u7b56\u7565\u6f14\u53d8 (REINFORCE)\")\naxes[0].legend(fontsize=8); axes[0].grid(alpha=0.3)\n\n# \u5e73\u6ed1\u5956\u52b1\nwindow = 50\nsmoothed = [sum(reward_history[max(0,i-window):i+1])/min(i+1,window)\n for i in range(len(reward_history))]\naxes[1].plot(smoothed, color='#27ae60', linewidth=1.5)\naxes[1].axhline(y=0.8, color='#e74c3c', linestyle='--', alpha=0.5, label='\u6700\u4f73\u81c2')\naxes[1].set_xlabel(\"\u6b65\u9aa4\"); axes[1].set_ylabel(\"\u5e73\u5747\u5956\u52b1\")\naxes[1].set_title(\"\u5956\u52b1\u968f\u65f6\u95f4\u53d8\u5316\"); axes[1].legend()\naxes[1].grid(alpha=0.3)\nplt.tight_layout(); plt.show()\n \u5206\u5e03\u5f0f\u8bad\u7ec3\u5c06\u8ba1\u7b97\u5206\u6563\u5230\u591a\u4e2aGPU\u548c\u673a\u5668\u4e0a\uff0c\u4ee5\u8bad\u7ec3\u5355\u4e2a\u8bbe\u5907\u65e0\u6cd5\u5bb9\u7eb3\u6216\u8bad\u7ec3\u592a\u6162\u7684\u6a21\u578b\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u6df7\u5408\u7cbe\u5ea6\u3001\u6570\u636e\u5e76\u884c\u3001\u6a21\u578b\u5e76\u884c\u3001\u6d41\u6c34\u7ebf\u5e76\u884c\u3001ZeRO\u3001FSDP\u3001\u5f20\u91cf\u5e76\u884c\u4ee5\u53ca\u5168\u89c4\u7ea6\u7b49\u901a\u4fe1\u539f\u8bed\u2014\u2014\u8fd9\u4e9b\u5bf9\u4e8e\u5927\u89c4\u6a21\u8bad\u7ec3LLM\u81f3\u5173\u91cd\u8981\u3002
\u5728\u5355\u4e2aGPU\u4e0a\u8bad\u7ec3\u5927\u578b\u795e\u7ecf\u7f51\u7edc\u6700\u7ec8\u4f1a\u9047\u5230\u74f6\u9888\u3002\u6a21\u578b\u53ef\u80fd\u65e0\u6cd5\u653e\u5165\u5185\u5b58\uff0c\u6216\u8005\u8bad\u7ec3\u53ef\u80fd\u9700\u8981\u6570\u6708\u3002\u5206\u5e03\u5f0f\u8bad\u7ec3\u5c06\u5de5\u4f5c\u5206\u6563\u5230\u591a\u4e2a\u8bbe\u5907\uff08GPU\u3001TPU\u6216\u6574\u53f0\u673a\u5668\uff09\u4e0a\uff0c\u4ee5\u66f4\u5feb\u5730\u8bad\u7ec3\u548c\u8bad\u7ec3\u66f4\u5927\u7684\u6a21\u578b\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u4e86\u5b9e\u73b0\u8fd9\u4e00\u76ee\u6807\u7684\u6280\u672f\u3002
\u8981\u7406\u89e3\u4e3a\u4f55\u5206\u5e03\u5f0f\u91cd\u8981\uff0c\u4ece\u8bad\u7ec3\u7684\u8ba1\u7b97\u6210\u672c\u5f00\u59cb\u3002\u5728\u4e00\u4e2a\u5305\u542b \\(d_{\\text{in}}\\) \u4e2a\u8f93\u5165\u548c \\(d_{\\text{out}}\\) \u4e2a\u8f93\u51fa\u7684\u5bc6\u96c6\u5c42\u4e0a\uff0c\u5bf9\u4e00\u6279 \\(B\\) \u4e2a\u6837\u672c\u8fdb\u884c\u4e00\u6b21\u524d\u5411\u4f20\u64ad\u9700\u8981\u5927\u7ea6 \\(2 \\cdot B \\cdot d_{\\text{in}} \\cdot d_{\\text{out}}\\) \u6b21FLOP\uff08\u6d6e\u70b9\u8fd0\u7b97\uff09\uff1a\u5bf9\u8f93\u51fa\u77e9\u9635\u7684\u6bcf\u4e2a\u5143\u7d20\u8fdb\u884c\u4e00\u6b21\u4e58\u6cd5\u548c\u4e00\u6b21\u52a0\u6cd5\u3002\u53cd\u5411\u4f20\u64ad\u7684\u6210\u672c\u5927\u7ea6\u662f\u524d\u5411\u4f20\u64ad\u7684\u4e24\u500d\uff08\u8ba1\u7b97\u76f8\u5bf9\u4e8e\u8f93\u5165\u548c\u6743\u91cd\u7684\u68af\u5ea6\uff09\uff0c\u56e0\u6b64\u4e00\u4e2a\u5bc6\u96c6\u5c42\u7684\u4e00\u4e2a\u8bad\u7ec3\u6b65\u9aa4\u7ea6\u4e3a \\(6 \\cdot B \\cdot d_{\\text{in}} \\cdot d_{\\text{out}}\\) \u6b21FLOP\u3002
\u5bf9\u4e8e\u9690\u85cf\u7ef4\u5ea6\u4e3a \\(d\\) \u7684Transformer\u5c42\uff0c\u81ea\u6ce8\u610f\u529b\u5757\u6d89\u53ca\u56db\u4e2a\u6295\u5f71\uff08Q\u3001K\u3001V\u548c\u8f93\u51fa\uff09\uff0c\u6bcf\u4e2a\u7684\u6210\u672c\u4e3a \\(O(B \\cdot n \\cdot d^2)\\) \u6b21FLOP\uff08\u5176\u4e2d \\(n\\) \u662f\u5e8f\u5217\u957f\u5ea6\uff09\uff0c\u52a0\u4e0a\u6ce8\u610f\u529b\u77e9\u9635\u8ba1\u7b97 \\(O(B \\cdot n^2 \\cdot d)\\)\u3002\u524d\u9988\u5757\u6709\u4e24\u4e2a\u5bc6\u96c6\u5c42\uff0c\u901a\u5e38\u6269\u5c55\u5230 \\(4d\\) \u518d\u56de\u6765\uff1a\\(O(B \\cdot n \\cdot 8d^2)\\)\u3002\u6bcf\u5c42\u603b\u8ba1\uff1a\u5927\u7ea6 \\(O(B \\cdot n \\cdot 12d^2 + B \\cdot n^2 \\cdot d)\\)\u3002\u4e58\u4ee5\u5c42\u6570\uff0c\u4f60\u5c31\u4f1a\u660e\u767d\u4e3a\u4ec0\u4e48\u8bad\u7ec3GPT\u89c4\u6a21\u7684\u6a21\u578b\u9700\u8981\u6570\u5343\u4e2aGPU\u5c0f\u65f6\u3002
\u5185\u5b58\u5899\u901a\u5e38\u662f\u66f4\u4e25\u683c\u7684\u7ea6\u675f\u3002\u5728\u8bad\u7ec3\u671f\u95f4\uff0cGPU\u5185\u5b58\u5fc5\u987b\u540c\u65f6\u5bb9\u7eb3\u56db\u6837\u4e1c\u897f\uff1a
\u6fc0\u6d3b\u503c\uff1a\u5728\u524d\u5411\u4f20\u64ad\u8fc7\u7a0b\u4e2d\u4fdd\u5b58\u4e0b\u6765\u4f9b\u53cd\u5411\u4f20\u64ad\u4f7f\u7528\u7684\u4e2d\u95f4\u503c\u3002\u5927\u5c0f\u53d6\u51b3\u4e8e\u6279\u91cf\u5927\u5c0f\u3001\u5e8f\u5217\u957f\u5ea6\u548c\u6a21\u578b\u5bbd\u5ea6\u3002\u8fd9\u901a\u5e38\u662f\u6700\u4e3b\u8981\u7684\u7ec4\u6210\u90e8\u5206\uff0c\u5e76\u968f\u6279\u91cf\u5927\u5c0f\u7ebf\u6027\u589e\u957f\u3002
\u5bf9\u4e8e\u4f7f\u7528FP32 Adam\u76847B\u6a21\u578b\uff1a28\uff08\u53c2\u6570\uff09+ 28\uff08\u68af\u5ea6\uff09+ 56\uff08\u4f18\u5316\u5668\uff09= 112 GB\uff0c\u8fd9\u8fd8\u6ca1\u7b97\u6fc0\u6d3b\u503c\u3002\u5355\u4e2a80 GB\u7684A100 GPU\u65e0\u6cd5\u5bb9\u7eb3\u3002\u8fd9\u5c31\u662f\u5206\u5e03\u5f0f\u7b56\u7565\u81f3\u5173\u91cd\u8981\u7684\u539f\u56e0\u3002
\u6df7\u5408\u7cbe\u5ea6\u8bad\u7ec3\u662f\u7b2c\u4e00\u9053\u9632\u7ebf\u3002\u4e0d\u662f\u5c06\u6240\u6709\u5185\u5bb9\u5b58\u50a8\u5728FP32\uff0832\u4f4d\u6d6e\u70b9\uff09\u4e2d\uff0c\u800c\u662f\u4f7f\u7528FP16\u6216BF16\uff0816\u4f4d\uff09\u8fdb\u884c\u524d\u5411\u548c\u53cd\u5411\u4f20\u64ad\uff0c\u540c\u65f6\u5c06\u6743\u91cd\u7684FP32\u4e3b\u526f\u672c\u4fdd\u7559\u7ed9\u4f18\u5316\u5668\u66f4\u65b0\u3002
FP16\u5177\u6709\u9ad8\u7cbe\u5ea6\uff0810\u4f4d\u5c3e\u6570\uff09\uff0c\u4f46\u8303\u56f4\u6709\u9650\uff0c\u53ef\u80fd\u5bfc\u81f4\u4e0a\u6ea2/\u4e0b\u6ea2\u3002\u635f\u5931\u7f29\u653e\uff08\u5728\u53cd\u5411\u4f20\u64ad\u524d\u5c06\u635f\u5931\u4e58\u4ee5\u4e00\u4e2a\u5927\u56e0\u5b50\uff0c\u7136\u540e\u5c06\u68af\u5ea6\u9664\u4ee5\u76f8\u540c\u56e0\u5b50\uff09\u7f13\u89e3\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002
BF16\uff08\u8111\u6d6e\u70b9\uff09\u5177\u6709\u4e0eFP32\u76f8\u540c\u7684\u6307\u6570\u8303\u56f4\uff088\u4f4d\u6307\u6570\uff09\uff0c\u4f46\u7cbe\u5ea6\u8f83\u4f4e\uff087\u4f4d\u5c3e\u6570\uff09\u3002\u5b83\u51e0\u4e4e\u4ece\u4e0d\u6ea2\u51fa\uff0c\u5f88\u5c11\u9700\u8981\u635f\u5931\u7f29\u653e\uff0c\u56e0\u6b64\u4f7f\u7528\u66f4\u7b80\u5355\u3002BF16\u662f\u73b0\u4ee3Transformer\u8bad\u7ec3\u7684\u9ed8\u8ba4\u9009\u62e9\u3002
\u6df7\u5408\u7cbe\u5ea6\u5927\u81f4\u5c06\u6fc0\u6d3b\u503c\u548c\u68af\u5ea6\u7684\u5185\u5b58\u51cf\u534a\uff08\u524d\u5411/\u53cd\u5411\u4f20\u64ad\u671f\u95f4\u7684\u4e3b\u8981\u6210\u672c\uff09\uff0c\u540c\u65f6\u5c06\u4f18\u5316\u5668\u72b6\u6001\u4fdd\u7559\u5728FP32\u4e2d\u4ee5\u786e\u4fdd\u6570\u503c\u7a33\u5b9a\u6027\u3002
\u6570\u636e\u5e76\u884c\u662f\u6700\u7b80\u5355\u7684\u5206\u5e03\u5f0f\u7b56\u7565\u3002\u4f60\u5728 \\(N\\) \u4e2aGPU\u4e0a\u590d\u5236\u6574\u4e2a\u6a21\u578b\uff0c\u5c06\u6bcf\u4e2a\u5c0f\u6279\u91cf\u5206\u6210 \\(N\\) \u4e2a\u76f8\u7b49\u7684\u5757\uff0c\u5e76\u5c06\u4e00\u4e2a\u5757\u53d1\u9001\u5230\u6bcf\u4e2aGPU\u3002\u6bcf\u4e2aGPU\u5728\u5176\u5757\u4e0a\u72ec\u7acb\u8fd0\u884c\u524d\u5411\u548c\u53cd\u5411\u4f20\u64ad\u3002\u7136\u540e\u68af\u5ea6\u5728\u6240\u6709GPU\u4e0a\u5e73\u5747\uff08\u4f7f\u7528\u5168\u89c4\u7ea6\u64cd\u4f5c\uff09\uff0c\u6bcf\u4e2aGPU\u66f4\u65b0\u5176\u672c\u5730\u6a21\u578b\u526f\u672c\u3002
\u4ece\u6a21\u578b\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u8fd9\u76f8\u5f53\u4e8e\u4f7f\u7528\u5927\u4e86 \\(N\\) \u500d\u7684\u5c0f\u6279\u91cf\u8fdb\u884c\u8bad\u7ec3\u3002\u5982\u679c\u6bcf\u4e2aGPU\u5904\u7406\u4e00\u4e2a\u5927\u5c0f\u4e3a \\(B\\) \u7684\u6279\u6b21\uff0c\u5219\u6709\u6548\u6279\u91cf\u5927\u5c0f\u4e3a \\(N \\cdot B\\)\u3002
\u68af\u5ea6\u5e73\u5747\u53ef\u4ee5\u540c\u6b65\u6216\u5f02\u6b65\u8fdb\u884c\u3002\u540c\u6b65SGD\u7b49\u5f85\u6240\u6709GPU\u5b8c\u6210\u540e\u518d\u8fdb\u884c\u5e73\u5747\uff0c\u786e\u4fdd\u4e0e\u4f7f\u7528\u66f4\u5927\u6279\u91cf\u7684\u5355GPU\u8bad\u7ec3\u6570\u5b66\u4e0a\u7b49\u4ef7\u3002\u7f3a\u70b9\u662f\uff0c\u6700\u6162\u7684GPU\uff08\"\u6389\u961f\u8005\"\uff09\u4f1a\u62d6\u6162\u6240\u6709\u4eba\u3002
\u5f02\u6b65SGD\u8ba9\u6bcf\u4e2aGPU\u72ec\u7acb\u5730\u66f4\u65b0\u4e00\u4e2a\u5171\u4eab\u7684\u53c2\u6570\u670d\u52a1\u5668\uff0c\u65e0\u9700\u7b49\u5f85\u3002\u8fd9\u6d88\u9664\u4e86\u6389\u961f\u8005\u95ee\u9898\uff0c\u4f46\u5f15\u5165\u4e86\"\u9648\u65e7\u68af\u5ea6\"\uff1a\u4e00\u4e2aGPU\u53ef\u80fd\u57fa\u4e8e\u7565\u5fae\u8fc7\u65f6\u7684\u53c2\u6570\u8ba1\u7b97\u68af\u5ea6\u3002\u9648\u65e7\u68af\u5ea6\u589e\u52a0\u4e86\u566a\u58f0\uff0c\u53ef\u80fd\u51cf\u7f13\u6536\u655b\u3002\u5728\u5b9e\u8df5\u4e2d\uff0c\u5e26\u9ad8\u6548\u901a\u4fe1\u7684\u540c\u6b65SGD\u66f4\u53d7\u9752\u7750\u3002
\u68af\u5ea6\u7d2f\u79ef\u662f\u4e00\u79cd\u8f6f\u4ef6\u6280\u5de7\uff0c\u7528\u4e8e\u5728\u6709\u9650\u786c\u4ef6\u4e0a\u6a21\u62df\u66f4\u5927\u7684\u6279\u91cf\u5927\u5c0f\u3002\u4e0d\u5fc5\u6bcf\u4e2a\u5c0f\u6279\u91cf\u505a\u4e00\u6b21\u66f4\u65b0\uff0c\u800c\u662f\u8fd0\u884c\u591a\u6b21\u524d\u5411/\u53cd\u5411\u4f20\u64ad\u5e76\u7d2f\u79ef\u68af\u5ea6\uff0c\u7136\u540e\u505a\u4e00\u6b21\u66f4\u65b0\u3002\u8fd9\u4e0e\u66f4\u5927\u6279\u91cf\u5f97\u5230\u76f8\u540c\u7684\u7ed3\u679c\uff0c\u800c\u65e0\u9700\u66f4\u591aGPU\u5185\u5b58\u7528\u4e8e\u6fc0\u6d3b\u503c\uff08\u4e00\u6b21\u53ea\u6709\u4e00\u4e2a\u5c0f\u6279\u91cf\u7684\u6fc0\u6d3b\u503c\u5728\u5185\u5b58\u4e2d\uff09\u3002
\u5f53\u6a21\u578b\u672c\u8eab\u592a\u5927\u65e0\u6cd5\u653e\u5165\u5355\u4e2aGPU\u65f6\uff0c\u9700\u8981\u6a21\u578b\u5e76\u884c\u3002\u6709\u4e24\u79cd\u4e3b\u8981\u5f62\u5f0f\u3002
\u5f20\u91cf\u5e76\u884c\u5c06\u5355\u4e2a\u5c42\u5206\u5272\u5230\u591a\u4e2aGPU\u4e0a\u3002\u4e00\u4e2a\u5927\u7684\u77e9\u9635\u4e58\u6cd5 \\(Y = XW\\) \u53ef\u4ee5\u6309\u5217\u5206\u5272\uff1a\u5c06 \\(W\\) \u5206\u533a\u4e3a \\([W_1, W_2]\\) \u5206\u5e03\u5728\u4e24\u4e2aGPU\u4e0a\uff0c\u5e76\u884c\u8ba1\u7b97 \\(Y_1 = XW_1\\) \u548c \\(Y_2 = XW_2\\)\uff0c\u7136\u540e\u62fc\u63a5\u3002\u8fd9\u9002\u7528\u4e8e\u6ce8\u610f\u529b\u6295\u5f71\u548c\u524d\u9988\u5c42\u3002\u5b83\u9700\u8981GPU\u4e4b\u95f4\u5feb\u901f\u901a\u4fe1\uff08\u901a\u5e38\u662f\u8282\u70b9\u5185\u7684NVLink\uff09\uff0c\u56e0\u4e3a\u6bcf\u5c42\u90fd\u5fc5\u987b\u7ec4\u5408\u90e8\u5206\u7ed3\u679c\u3002
\u6d41\u6c34\u7ebf\u5e76\u884c\u5c06\u4e0d\u540c\u7684\u5c42\u5206\u914d\u5230\u4e0d\u540c\u7684GPU\u4e0a\u3002GPU 0\u8fd0\u884c\u7b2c1-4\u5c42\uff0cGPU 1\u8fd0\u884c\u7b2c5-8\u5c42\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002\u6570\u636e\u50cf\u6d41\u6c34\u7ebf\u4e00\u6837\u6d41\u7ecf\u6574\u4e2a\u7ba1\u9053\u3002\u6734\u7d20\u7684\u65b9\u6cd5\u6709\u4e00\u4e2a\"\u6d41\u6c34\u7ebf\u6c14\u6ce1\"\uff1a\u5f53GPU 0\u5904\u7406\u5fae\u6279\u6b211\u7684\u524d\u5411\u4f20\u64ad\u65f6\uff0cGPU 1-3\u5904\u4e8e\u7a7a\u95f2\u72b6\u6001\u3002\u5fae\u6279\u5904\u7406\u901a\u8fc7\u5c06\u5c0f\u6279\u91cf\u5206\u5272\u6210\u66f4\u5c0f\u7684\u5fae\u6279\u6b21\u6765\u7f13\u89e3\u8fd9\u4e2a\u95ee\u9898\uff0c\u8fd9\u4e9b\u5fae\u6279\u6b21\u6309\u987a\u5e8f\u6d41\u7ecf\u6d41\u6c34\u7ebf\uff0c\u4f7f\u6240\u6709GPU\u5927\u90e8\u5206\u65f6\u95f4\u4fdd\u6301\u5fd9\u788c\u3002
\u6df7\u5408\u5e76\u884c\u7ed3\u5408\u4e86\u6570\u636e\u5e76\u884c\u3001\u5f20\u91cf\u5e76\u884c\u548c\u6d41\u6c34\u7ebf\u5e76\u884c\u3002\u4e00\u4e2a\u5178\u578b\u7684\u5927\u6a21\u578b\u8bbe\u7f6e\u53ef\u80fd\u4f7f\u7528\u8282\u70b9\u5185\u7684\u5f20\u91cf\u5e76\u884c\uff088\u4e2aGPU\u901a\u8fc7\u5feb\u901fNVLink\u8fde\u63a5\uff09\u3001\u8de8\u8282\u70b9\u7684\u6d41\u6c34\u7ebf\u5e76\u884c\u4ee5\u53ca\u8de8\u8282\u70b9\u7ec4\u7684\u6570\u636e\u5e76\u884c\u3002\u8fd9\u5c31\u662fGPT-4\u548cLlama\u7b49\u6a21\u578b\u7684\u8bad\u7ec3\u65b9\u5f0f\u3002
\u5206\u5e03\u5f0f\u8bad\u7ec3\u7684\u6548\u7387\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u53d6\u51b3\u4e8e\u901a\u4fe1\u3002\u5173\u952e\u64cd\u4f5c\u662f\u5168\u89c4\u7ea6\uff08all-reduce\uff09\uff1a\u7ed9\u5b9a \\(N\\) \u4e2aGPU\u4e0a\u5404\u6709\u4e00\u4e2a\u503c\uff0c\u8ba1\u7b97\u603b\u548c\uff08\u6216\u5e73\u5747\u503c\uff09\u5e76\u5c06\u7ed3\u679c\u5206\u53d1\u7ed9\u6240\u6709GPU\u3002
\u6734\u7d20\u7684\u5168\u89c4\u7ea6\u5c06\u6240\u6709\u6570\u636e\u53d1\u9001\u5230\u4e00\u4e2aGPU\uff0c\u6c42\u548c\uff0c\u7136\u540e\u5e7f\u64ad\u56de\u6765\u3002\u901a\u4fe1\u91cf\u4e3a \\(O(N)\\)\uff0c\u5e76\u5728\u6839\u8282\u70b9\u9020\u6210\u74f6\u9888\u3002
\u73af\u5168\u89c4\u7ea6\uff08Ring all-reduce\uff09 \u8981\u9ad8\u6548\u5f97\u591a\u3002\u5c06 \\(N\\) \u4e2aGPU\u6392\u5217\u6210\u4e00\u4e2a\u73af\u3002\u6bcf\u4e2aGPU\u5c06\u5176\u6570\u636e\u5206\u5272\u6210 \\(N\\) \u5757\u3002\u5728 \\(N - 1\\) \u6b65\u4e2d\uff0c\u6bcf\u4e2aGPU\u5411\u90bb\u5c45\u53d1\u9001\u4e00\u5757\uff0c\u5e76\u4ece\u53e6\u4e00\u4e2a\u90bb\u5c45\u63a5\u6536\u4e00\u5757\uff0c\u7d2f\u52a0\u90e8\u5206\u548c\u3002\u518d\u7ecf\u8fc7 \\(N - 1\\) \u6b65\u540e\uff0c\u5b8c\u6574\u7684\u603b\u548c\u4f20\u64ad\u5230\u6240\u6709GPU\u3002\u6bcf\u4e2aGPU\u7684\u603b\u6570\u636e\u4f20\u8f93\u91cf\uff1a\u6570\u636e\u5927\u5c0f\u7684 \\(2(N-1)/N\\) \u500d\uff0c\u968f\u7740 \\(N\\) \u7684\u589e\u957f\u8d8b\u8fd1\u4e8e \\(2\\times\\)\u3002\u5173\u952e\u5728\u4e8e\uff0c\u8fd9\u4e0d\u968f \\(N\\) \u589e\u52a0\uff0c\u4f7f\u5176\u5e26\u5bbd\u6700\u4f18\u3002
\u53c2\u6570\u670d\u52a1\u5668\u662f\u4e00\u79cd\u66ff\u4ee3\u67b6\u6784\uff0c\u5176\u4e2d\u4e13\u7528\u670d\u52a1\u5668\u8282\u70b9\u4fdd\u5b58\u6a21\u578b\u53c2\u6570\u3002\u5de5\u4f5c\u8282\u70b9\u8ba1\u7b97\u68af\u5ea6\u5e76\u5c06\u5176\u53d1\u9001\u5230\u670d\u52a1\u5668\uff0c\u670d\u52a1\u5668\u66f4\u65b0\u53c2\u6570\u5e76\u5c06\u5176\u53d1\u9001\u56de\u6765\u3002\u8fd9\u66f4\u7b80\u5355\uff0c\u4f46\u53ef\u80fd\u5728\u670d\u52a1\u5668\u5904\u9020\u6210\u901a\u4fe1\u74f6\u9888\u3002
NCCL\uff08NVIDIA\u96c6\u5408\u901a\u4fe1\u5e93\uff09\u662fGPU\u95f4\u901a\u4fe1\u7684\u6807\u51c6\u5e93\u3002\u5b83\u63d0\u4f9b\u4e86\u5168\u89c4\u7ea6\u3001\u5168\u6536\u96c6\u3001\u5e7f\u64ad\u548c\u5176\u4ed6\u96c6\u5408\u64cd\u4f5c\u7684\u9ad8\u6548\u5b9e\u73b0\uff0c\u81ea\u52a8\u4e3a\u7f51\u7edc\u62d3\u6251\u9009\u62e9\u6700\u4f73\u7b97\u6cd5\u3002
\u7f29\u653e\u5b9a\u5f8b\u63cf\u8ff0\u4e86\u6a21\u578b\u6027\u80fd\u5982\u4f55\u968f\u8ba1\u7b97\u91cf\u3001\u6570\u636e\u91cf\u548c\u6a21\u578b\u5927\u5c0f\u800c\u63d0\u5347\u3002\u539f\u59cb\u7684Kaplan\u7b49\u4eba\uff082020\uff09\u7f29\u653e\u5b9a\u5f8b\u53d1\u73b0\uff0c\u635f\u5931\u968f\u6bcf\u4e2a\u56e0\u7d20\u4ee5\u5e42\u5f8b\u65b9\u5f0f\u4e0b\u964d\uff1a
\u5176\u4e2d \\(N\\) \u662f\u53c2\u6570\u6570\u91cf\uff0c\\(D\\) \u662f\u6570\u636e\u96c6\u5927\u5c0f\uff0c\\(C\\) \u662f\u8ba1\u7b97\u9884\u7b97\u3002
Chinchilla\u7f29\u653e\u5b9a\u5f8b\uff08Hoffmann\u7b49\u4eba\uff0c2022\uff09\u8868\u660e\u5927\u591a\u6570\u6a21\u578b\u8bad\u7ec3\u4e0d\u8db3\uff1a\u5bf9\u4e8e\u7ed9\u5b9a\u7684\u8ba1\u7b97\u9884\u7b97\uff0c\u5e94\u8be5\u8bad\u7ec3\u4e00\u4e2a\u66f4\u5c0f\u7684\u6a21\u578b\uff0c\u4f7f\u7528\u6bd4\u4ee5\u524d\u8ba4\u4e3a\u7684\u66f4\u591a\u7684\u6570\u636e\u3002\u6700\u4f18\u6bd4\u4f8b\u5927\u7ea6\u662f\u6bcf\u53c2\u657020\u4e2atoken\u3002\u4e00\u4e2a7B\u6a21\u578b\u5e94\u8be5\u770b\u5230\u5927\u7ea6140B\u4e2atoken\uff0c\u800c\u4e0d\u662fLlama 1\u572865B\u6a21\u578b\u4e0a\u4f7f\u7528\u7684300B\u4e2atoken\u3002\u8fd9\u4e00\u53d1\u73b0\u5c06\u9886\u57df\u8f6c\u5411\u4e86\"\u8ba1\u7b97\u6700\u4f18\"\u8bad\u7ec3\u3002
\u6df7\u5408\u4e13\u5bb6\uff08MoE\uff09 \u662f\u4e00\u79cd\u5728\u4e0d\u6309\u6bd4\u4f8b\u589e\u52a0\u8ba1\u7b97\u91cf\u7684\u60c5\u51b5\u4e0b\u6269\u5c55\u6a21\u578b\u5bb9\u91cf\u7684\u67b6\u6784\u3002\u6bcf\u4e2aTransformer\u5c42\u4e0d\u662f\u4f7f\u7528\u4e00\u4e2a\u524d\u9988\u7f51\u7edc\uff0c\u800c\u662f\u6709 \\(N\\) \u4e2a\"\u4e13\u5bb6\"\u7f51\u7edc\uff08\u6bcf\u4e2a\u90fd\u662f\u4e00\u4e2a\u6807\u51c6FFN\uff09\u3002\u4e00\u4e2a\u95e8\u63a7\u7f51\u7edc\uff08\u8def\u7531\u5668\uff09\u68c0\u67e5\u6bcf\u4e2atoken\u5e76\u5c06\u5176\u53d1\u9001\u5230top-\\(K\\)\u4e2a\u4e13\u5bb6\uff08\u901a\u5e38 \\(K = 1\\) \u6216 \\(K = 2\\)\uff09\u3002
\u603b\u53c2\u6570\u91cf\u8981\u5927\u5f97\u591a\uff08\u56e0\u4e3a\u6709 \\(N\\) \u4e2a\u4e13\u5bb6\uff09\uff0c\u4f46\u6bcf\u4e2atoken\u7684FLOPs\u5927\u81f4\u4fdd\u6301\u4e0d\u53d8\uff08\u56e0\u4e3a\u6bcf\u4e2atoken\u53ea\u6709 \\(K\\) \u4e2a\u4e13\u5bb6\u6fc0\u6d3b\uff09\u3002\u4f8b\u5982\uff0cMixtral 8x7B\u5171\u670947B\u4e2a\u53c2\u6570\uff0c\u4f46\u6bcf\u6b21\u524d\u5411\u4f20\u64ad\u53ea\u7528\u5927\u7ea613B\uff0c\u4ee5\u8f83\u5c0f\u6a21\u578b\u7684\u4ee3\u4ef7\u83b7\u5f97\u66f4\u5927\u6a21\u578b\u7684\u6027\u80fd\u3002
MoE\u5e26\u6765\u4e86\u6311\u6218\u3002\u8d1f\u8f7d\u5747\u8861\uff1a\u5982\u679c\u8def\u7531\u5668\u5c06\u5927\u591a\u6570token\u53d1\u9001\u5230\u540c\u4e00\u4e2a\u4e13\u5bb6\uff0c\u5176\u4ed6\u4e13\u5bb6\u5c31\u88ab\u6d6a\u8d39\u4e86\u3002\u8f85\u52a9\u635f\u5931\u9f13\u52b1\u5747\u5300\u8def\u7531\u3002\u901a\u4fe1\uff1a\u4e0d\u540c\u7684\u4e13\u5bb6\u53ef\u80fd\u4f4d\u4e8e\u4e0d\u540c\u7684GPU\u4e0a\uff0c\u56e0\u6b64\u8def\u7531token\u9700\u8981\u5168\u5bf9\u5168\u901a\u4fe1\uff0c\u8fd9\u5f88\u6602\u8d35\u3002
\u5bb9\u9519\u5728\u8bad\u7ec3\u8fd0\u884c\u6301\u7eed\u6570\u5468\u6216\u6570\u6708\u3001\u6d89\u53ca\u6570\u5343\u4e2aGPU\u65f6\u81f3\u5173\u91cd\u8981\u3002\u5982\u679c\u5355\u4e2aGPU\u5931\u6548\uff0c\u4f60\u4e0d\u60f3\u4e22\u5931\u6240\u6709\u8fdb\u5ea6\u3002\u68c0\u67e5\u70b9\u5b9a\u671f\u5c06\u6a21\u578b\u6743\u91cd\u3001\u4f18\u5316\u5668\u72b6\u6001\u548c\u8bad\u7ec3\u72b6\u6001\uff08\u5b66\u4e60\u7387\u3001\u6b65\u6570\u3001\u6570\u636e\u4f4d\u7f6e\uff09\u4fdd\u5b58\u5230\u78c1\u76d8\u3002\u5982\u679c\u53d1\u751f\u6545\u969c\uff0c\u4f60\u53ef\u4ee5\u4ece\u6700\u8fd1\u7684\u68c0\u67e5\u70b9\u91cd\u65b0\u5f00\u59cb\u3002
\u68af\u5ea6\u68c0\u67e5\u70b9\uff08\u4e5f\u79f0\u4e3a\u6fc0\u6d3b\u91cd\u8ba1\u7b97\uff09\u662f\u4e00\u79cd\u5185\u5b58\u4f18\u5316\uff0c\u800c\u975e\u5bb9\u9519\u673a\u5236\u3002\u5728\u524d\u5411\u4f20\u64ad\u8fc7\u7a0b\u4e2d\uff0c\u4e0d\u662f\u4fdd\u5b58\u6240\u6709\u6fc0\u6d3b\u503c\u4f9b\u53cd\u5411\u4f20\u64ad\u4f7f\u7528\uff0c\u800c\u662f\u53ea\u5728\u67d0\u4e9b\u68c0\u67e5\u70b9\u4fdd\u5b58\u6fc0\u6d3b\u503c\u3002\u5728\u53cd\u5411\u4f20\u64ad\u8fc7\u7a0b\u4e2d\uff0c\u4ece\u68c0\u67e5\u70b9\u91cd\u65b0\u8ba1\u7b97\u7f3a\u5931\u7684\u6fc0\u6d3b\u503c\u3002\u8fd9\u4ee5\u8ba1\u7b97\u6362\u53d6\u5185\u5b58\uff1a\u5b83\u4f7f\u524d\u5411\u4f20\u64ad\u6210\u672c\u589e\u52a0\u7ea633%\uff0c\u4f46\u53ef\u4ee5\u5c06\u6fc0\u6d3b\u5185\u5b58\u51cf\u5c11 \\(\\sqrt{L}\\) \u500d\uff08\u5176\u4e2d \\(L\\) \u662f\u5c42\u6570\uff09\u3002
\u7efc\u5408\u8d77\u6765\uff0c\u8bad\u7ec3\u524d\u6cbf\u6a21\u578b\u7ed3\u5408\u4e86\u6240\u6709\u8fd9\u4e9b\u6280\u672f\uff1aBF16\u6df7\u5408\u7cbe\u5ea6\u3001\u4f7f\u7528\u73af\u5168\u89c4\u7ea6\u5728\u6570\u5343\u4e2aGPU\u4e0a\u8fdb\u884c\u6570\u636e\u5e76\u884c\u3001\u8282\u70b9\u5185\u7684\u5f20\u91cf\u5e76\u884c\u3001\u8de8\u8282\u70b9\u7684\u6d41\u6c34\u7ebf\u5e76\u884c\u3001\u51cf\u5c11\u5185\u5b58\u7684\u68af\u5ea6\u68c0\u67e5\u70b9\u3001\u63d0\u9ad8\u53c2\u6570\u6548\u7387\u7684MoE\uff0c\u4ee5\u53ca\u7528\u4e8e\u5bb9\u9519\u7684\u5b9a\u671f\u68c0\u67e5\u70b9\u3002\u7cfb\u7edf\u5de5\u7a0b\u4e0e\u7b97\u6cd5\u8bbe\u8ba1\u4e00\u6837\u5177\u6709\u6311\u6218\u6027\u3002
\u603b\u7ed3\u5206\u5e03\u5f0f\u8bad\u7ec3\u5de5\u5177\u5305\uff1a
\u8ba1\u7b97Transformer\u5c42\u7684FLOPs\u548c\u5185\u5b58\u9700\u6c42\u3002\u7ed9\u5b9a\u9690\u85cf\u7ef4\u5ea6 \\(d\\)\u3001\u5e8f\u5217\u957f\u5ea6 \\(n\\)\u3001\u6279\u91cf\u5927\u5c0f \\(B\\) \u548c\u5c42\u6570\uff0c\u4f30\u8ba1\u603b\u8bad\u7ec3\u6210\u672c\u3002
import jax.numpy as jnp\n\ndef transformer_layer_flops(d, n, B):\n \"\"\"\u4e00\u4e2aTransformer\u5c42\u524d\u5411\u4f20\u64ad\u7684\u8fd1\u4f3cFLOPs\u3002\"\"\"\n # QKV\u6295\u5f71\uff1a3 * (B * n * d * d) * 2\uff08\u4e58\u6cd5-\u52a0\u6cd5\uff09\n qkv_flops = 3 * 2 * B * n * d * d\n # \u6ce8\u610f\u529b\uff1a(B * n * n * d) * 2 \u7528\u4e8eQK^T\uff0c(B * n * n * d) * 2 \u7528\u4e8eattn*V\n attn_flops = 2 * 2 * B * n * n * d\n # \u8f93\u51fa\u6295\u5f71\uff1a(B * n * d * d) * 2\n out_flops = 2 * B * n * d * d\n # FFN\uff1a\u4e24\u5c42\uff0cd->4d \u548c 4d->d\uff1a2 * (B * n * d * 4d) * 2\n ffn_flops = 2 * 2 * B * n * d * 4 * d\n return qkv_flops + attn_flops + out_flops + ffn_flops\n\ndef transformer_layer_memory(d, n, B, dtype_bytes=2):\n \"\"\"\u4e00\u4e2a\u5c42\u7684\u8fd1\u4f3c\u6fc0\u6d3b\u5185\u5b58\uff08\u5b57\u8282\uff09\u3002\"\"\"\n # QKV\uff1a3 * B * n * d\n qkv_mem = 3 * B * n * d * dtype_bytes\n # \u6ce8\u610f\u529b\u6743\u91cd\uff1aB * heads * n * n\uff08\u8fd1\u4f3c B * n * n * sizeof\uff09\n attn_mem = B * n * n * dtype_bytes\n # FFN\u4e2d\u95f4\u503c\uff1aB * n * 4d\n ffn_mem = B * n * 4 * d * dtype_bytes\n return qkv_mem + attn_mem + ffn_mem\n\n# \u793a\u4f8b\uff1aGPT-2\u89c4\u6a21\nd, n, B, L = 1024, 1024, 8, 24\nfwd_flops = transformer_layer_flops(d, n, B)\ntotal_flops = 3 * L * fwd_flops # \u524d\u5411+\u53cd\u5411\u76843\u500d\nact_mem = L * transformer_layer_memory(d, n, B)\nparam_count = L * (12 * d * d + 13 * d) # \u8fd1\u4f3c\n\nprint(f\"\u6a21\u578b\uff1ad={d}, n={n}, B={B}, L={L}\")\nprint(f\"\u53c2\u6570\uff1a{param_count / 1e6:.0f}M\")\nprint(f\"\u6bcf\u6b65FLOPs\uff1a{total_flops / 1e12:.2f} TFLOPs\")\nprint(f\"\u6fc0\u6d3b\u5185\u5b58\uff1a{act_mem / 1e9:.2f} GB (BF16)\")\nprint(f\"\u53c2\u6570\u5185\u5b58 (FP32)\uff1a{param_count * 4 / 1e9:.2f} GB\")\nprint(f\"Adam\u4f18\u5316\u5668\u5185\u5b58\uff1a{param_count * 8 / 1e9:.2f} GB\")\nprint(f\"\u603b\u8bad\u7ec3\u5185\u5b58\uff1a{(param_count * 16 + act_mem) / 1e9:.2f} GB\")\n \u6a21\u62df\u6570\u636e\u5e76\u884c\u8bad\u7ec3\u3002\u5c06\u6570\u636e\u96c6\u5206\u5272\u5230\u591a\u4e2a\"\u865a\u62dfGPU\"\u4e0a\uff0c\u72ec\u7acb\u8ba1\u7b97\u68af\u5ea6\uff0c\u5e73\u5747\u5b83\u4eec\uff0c\u5e76\u9a8c\u8bc1\u7ed3\u679c\u4e0e\u5355GPU\u8bad\u7ec3\u5339\u914d\u3002
import jax\nimport jax.numpy as jnp\n\n# \u7b80\u5355\u7ebf\u6027\u6a21\u578b\uff1ay = wx + b\nkey = jax.random.PRNGKey(0)\nX = jax.random.normal(key, (64, 4))\nw_true = jnp.array([1.0, -2.0, 3.0, 0.5])\ny = X @ w_true + 0.1 * jax.random.normal(key, (64,))\n\ndef loss_fn(w, X, y):\n return jnp.mean((X @ w - y) ** 2)\n\ngrad_fn = jax.grad(loss_fn)\n\n# \u5355GPU\uff1a\u5168\u6279\u91cf\u68af\u5ea6\nw = jnp.zeros(4)\ngrad_single = grad_fn(w, X, y)\n\n# \u6570\u636e\u5e76\u884c\uff1a\u5206\u5272\u52304\u4e2a\"GPU\"\u4e0a\nn_gpus = 4\nchunk_size = len(X) // n_gpus\ngrads = []\nfor i in range(n_gpus):\n X_chunk = X[i*chunk_size:(i+1)*chunk_size]\n y_chunk = y[i*chunk_size:(i+1)*chunk_size]\n grads.append(grad_fn(w, X_chunk, y_chunk))\n\n# \u5168\u89c4\u7ea6\uff1a\u5e73\u5747\u68af\u5ea6\ngrad_parallel = jnp.mean(jnp.stack(grads), axis=0)\n\nprint(\"\u5355GPU\u68af\u5ea6\uff1a\", grad_single)\nprint(\"\u6570\u636e\u5e76\u884c\u68af\u5ea6\uff08\u5e73\u5747\uff09\uff1a\", grad_parallel)\nprint(f\"\u5339\u914d\uff1a{jnp.allclose(grad_single, grad_parallel, atol=1e-5)}\")\n\n# \u8bad\u7ec3\u4e24\u8005\u5e76\u6bd4\u8f83\nw_single, w_parallel = jnp.zeros(4), jnp.zeros(4)\nlr = 0.1\nfor step in range(100):\n w_single = w_single - lr * grad_fn(w_single, X, y)\n\n grads = [grad_fn(w_parallel, X[i*chunk_size:(i+1)*chunk_size],\n y[i*chunk_size:(i+1)*chunk_size]) for i in range(n_gpus)]\n avg_grad = jnp.mean(jnp.stack(grads), axis=0)\n w_parallel = w_parallel - lr * avg_grad\n\nprint(f\"\\n100\u6b65\u4e4b\u540e\uff1a\")\nprint(f\"\u5355GPU\u6743\u91cd\uff1a{w_single}\")\nprint(f\"\u6570\u636e\u5e76\u884c\u6743\u91cd\uff1a{w_parallel}\")\nprint(f\"\u6700\u5927\u5dee\u5f02\uff1a{jnp.max(jnp.abs(w_single - w_parallel)):.2e}\")\n \u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684\u6df7\u5408\u4e13\u5bb6\u5c42\u3002\u521b\u5efa\u4e00\u4e2a\u95e8\u63a7\u7f51\u7edc\uff0c\u5c06token\u8def\u7531\u5230top-K\u4e2a\u4e13\u5bb6\u5e76\u7ec4\u5408\u5b83\u4eec\u7684\u8f93\u51fa\u3002
import jax\nimport jax.numpy as jnp\n\ndef expert_fn(x, W1, b1, W2, b2):\n \"\"\"\u7b80\u5355\u76842\u5c42FFN\u4e13\u5bb6\u3002\"\"\"\n h = jnp.maximum(0, x @ W1 + b1) # ReLU\n return h @ W2 + b2\n\ndef moe_layer(x, gate_W, experts_params, top_k=2):\n \"\"\"\n MoE\u524d\u5411\u4f20\u64ad\u3002\n x: (batch, d_model)\n gate_W: (d_model, n_experts)\n experts_params: \u6bcf\u4e2a\u4e13\u5bb6\u7684 (W1, b1, W2, b2) \u5217\u8868\n \"\"\"\n n_experts = len(experts_params)\n\n # \u95e8\u63a7\uff1a\u8ba1\u7b97\u8def\u7531\u5206\u6570\n gate_logits = x @ gate_W # (batch, n_experts)\n gate_probs = jax.nn.softmax(gate_logits, axis=-1)\n\n # Top-K\u9009\u62e9\n top_k_indices = jnp.argsort(-gate_probs, axis=-1)[:, :top_k]\n top_k_probs = jnp.take_along_axis(gate_probs, top_k_indices, axis=-1)\n # \u91cd\u65b0\u5f52\u4e00\u5316\n top_k_probs = top_k_probs / jnp.sum(top_k_probs, axis=-1, keepdims=True)\n\n # \u8ba1\u7b97\u4e13\u5bb6\u8f93\u51fa\uff08\u7b80\u5316\uff1a\u8fd0\u884c\u6240\u6709\u4e13\u5bb6\uff0c\u7a0d\u540e\u63a9\u7801\uff09\n expert_outputs = jnp.stack([\n expert_fn(x, *experts_params[i]) for i in range(n_experts)\n ], axis=1) # (batch, n_experts, d_model)\n\n # \u6536\u96c6top-K\u4e13\u5bb6\u8f93\u51fa\u5e76\u52a0\u6743\n batch_idx = jnp.arange(x.shape[0])[:, None]\n selected_outputs = expert_outputs[batch_idx, top_k_indices] # (batch, top_k, d_model)\n output = jnp.sum(selected_outputs * top_k_probs[:, :, None], axis=1)\n\n return output, gate_probs\n\n# \u8bbe\u7f6e\nkey = jax.random.PRNGKey(42)\nbatch, d_model, d_ff, n_experts = 8, 16, 32, 4\n\n# \u521d\u59cb\u5316\u4e13\u5bb6\nexperts_params = []\nfor i in range(n_experts):\n k1, k2, key = jax.random.split(key, 3)[0], jax.random.split(key, 3)[1], jax.random.split(key, 3)[2]\n experts_params.append((\n jax.random.normal(k1, (d_model, d_ff)) * 0.1,\n jnp.zeros(d_ff),\n jax.random.normal(k2, (d_ff, d_model)) * 0.1,\n jnp.zeros(d_model),\n ))\n\nkey, subkey = jax.random.split(key)\ngate_W = jax.random.normal(subkey, (d_model, n_experts)) * 0.1\nx = jax.random.normal(key, (batch, d_model))\n\noutput, gate_probs = moe_layer(x, gate_W, experts_params, top_k=2)\n\nprint(f\"\u8f93\u5165\u5f62\u72b6\uff1a{x.shape}\")\nprint(f\"\u8f93\u51fa\u5f62\u72b6\uff1a{output.shape}\")\nprint(f\"\u95e8\u63a7\u6982\u7387\uff08\u7b2c\u4e00\u4e2a\u6837\u672c\uff09\uff1a{gate_probs[0]}\")\nprint(f\"\u4e13\u5bb6\u4f7f\u7528\u7387\uff08\u6279\u91cf\u5e73\u5747\uff09\uff1a\")\nfor i in range(n_experts):\n usage = jnp.mean(gate_probs[:, i])\n print(f\" \u4e13\u5bb6 {i}: {usage:.3f}\")\n \u8bed\u8a00\u5b66\u4e3aNLP\u7cfb\u7edf\u63d0\u4f9b\u4e86\u5b83\u4eec\u9690\u5f0f\u5b66\u4e60\u5e76\u5229\u7528\u7684\u7ed3\u6784\u5316\u8bcd\u6c47\u3002\u672c\u6587\u6db5\u76d6\u5f62\u6001\u5b66\u3001\u53e5\u6cd5\u5b66\u3001\u8bed\u4e49\u5b66\u3001\u8bed\u7528\u5b66\u3001\u97f3\u7cfb\u5b66\u3001\u6210\u5206\u53e5\u6cd5\u548c\u4f9d\u5b58\u53e5\u6cd5\u5206\u6790\uff0c\u4ee5\u53ca\u5206\u5e03\u5047\u8bbe\u2014\u2014\u8fd9\u4e9b\u4eba\u7c7b\u8bed\u8a00\u79d1\u5b66\u6784\u6210\u4e86AI\u4e2d\u8bcd\u5143\u5316\u3001\u8bed\u6cd5\u548c\u610f\u4e49\u7684\u57fa\u7840\u3002
\u5728\u6784\u5efa\u80fd\u591f\u7406\u89e3\u6216\u751f\u6210\u8bed\u8a00\u7684\u7cfb\u7edf\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u7406\u89e3\u8bed\u8a00\u672c\u8eab\u662f\u5982\u4f55\u8fd0\u4f5c\u7684\u3002
\u8bed\u8a00\u5b66\u662f\u5bf9\u8bed\u8a00\u7684\u79d1\u5b66\u7814\u7a76\uff0c\u5b83\u4e3aNLP\u63d0\u4f9b\u4e86\u4e0d\u65ad\u501f\u7528\u7684\u6982\u5ff5\u6027\u8bcd\u6c47\u3002
\u5373\u4f7f\u662f\u73b0\u4ee3\u795e\u7ecf\u6a21\u578b\u2014\u2014\u5b83\u4eec\u4ece\u539f\u59cb\u6570\u636e\u4e2d\u5b66\u4e60\u8bed\u8a00\u2014\u2014\u4e5f\u4f1a\u9690\u5f0f\u5730\u91cd\u65b0\u53d1\u73b0\u8bed\u8a00\u5b66\u5bb6\u4eec\u51e0\u5341\u5e74\u6765\u5df2\u7ecf\u7f16\u76ee\u7684\u8bb8\u591a\u7ed3\u6784\u3002
\u8bed\u8a00\u5728\u6bcf\u4e00\u5c42\u90fd\u5177\u6709\u7ed3\u6784\uff1a\u7ec4\u6210\u5355\u8bcd\u7684\u58f0\u97f3\u3001\u7ec4\u6210\u5355\u8bcd\u7684\u90e8\u4ef6\u3001\u5c06\u5355\u8bcd\u7ec4\u5408\u6210\u53e5\u5b50\u7684\u89c4\u5219\u3001\u8fd9\u4e9b\u53e5\u5b50\u6240\u627f\u8f7d\u7684\u610f\u4e49\uff0c\u4ee5\u53ca\u8bed\u5883\u5982\u4f55\u5851\u9020\u89e3\u8bfb\u3002\u6211\u4eec\u5c06\u81ea\u4e0b\u800c\u4e0a\u5730\u9010\u5c42\u63a2\u7d22\u3002
\u5f62\u6001\u5b66\u662f\u5bf9\u5355\u8bcd\u5185\u90e8\u7ed3\u6784\u7684\u7814\u7a76\u3002\u5355\u8bcd\u5e76\u975e\u4e0d\u53ef\u5206\u5272\u7684\u539f\u5b50\uff1b\u5b83\u4eec\u7531\u66f4\u5c0f\u7684\u6709\u610f\u4e49\u7684\u5355\u5143\u6784\u5efa\u800c\u6210\uff0c\u8fd9\u4e9b\u5355\u5143\u79f0\u4e3a\u8bed\u7d20\u3002
\u5355\u8bcd\"unhappiness\"\u5305\u542b\u4e09\u4e2a\u8bed\u7d20\uff1a\"un-\"\uff08\u524d\u7f00\uff0c\u610f\u4e3a\"\u4e0d\"\uff09\u3001\"happy\"\uff08\u8bcd\u6839\uff09\u548c\"-ness\"\uff08\u540e\u7f00\uff0c\u5c06\u5f62\u5bb9\u8bcd\u8f6c\u5316\u4e3a\u540d\u8bcd\uff09\u3002\u6bcf\u4e2a\u8bed\u7d20\u90fd\u5bf9\u610f\u4e49\u6709\u6240\u8d21\u732e\u3002
\u8bcd\u6839\uff08\u6216\u79f0\u8bcd\u5e72\uff09\u662f\u627f\u8f7d\u4e3b\u8981\u610f\u4e49\u7684\u6838\u5fc3\u8bed\u7d20\u3002\"Happy\"\u3001\"run\"\u3001\"compute\"\u90fd\u662f\u8bcd\u6839\u3002
\u8bcd\u7f00\u662f\u9644\u52a0\u5230\u8bcd\u6839\u4e0a\u4ee5\u4fee\u9970\u5176\u610f\u4e49\u6216\u8bed\u6cd5\u529f\u80fd\u7684\u8bed\u7d20\u3002
\u82f1\u8bed\u4e2d\u6709\u524d\u7f00\uff08\u4f4d\u4e8e\u8bcd\u6839\u4e4b\u524d\uff1aun-\u3001re-\u3001pre-\uff09\u548c\u540e\u7f00\uff08\u4f4d\u4e8e\u8bcd\u6839\u4e4b\u540e\uff1a-ing\u3001-ed\u3001-tion\uff09\u3002\u4e00\u4e9b\u8bed\u8a00\u8fd8\u5305\u542b\u4e2d\u7f00\uff08\u63d2\u5165\u8bcd\u6839\u5185\u90e8\uff09\u548c\u73af\u7f00\uff08\u5305\u88f9\u5728\u8bcd\u6839\u5468\u56f4\uff09\u3002
\u5f62\u6001\u5b66\u5bf9NLP\u5f88\u91cd\u8981\uff0c\u56e0\u4e3a\u5b83\u5f71\u54cd\u8bcd\u5143\u5316\u3002\u4e00\u4e2a\u57fa\u4e8e\u8bcd\u7ea7\u7684\u8bcd\u5143\u5316\u5668\u4f1a\u5c06\"run\"\u3001\"runs\"\u3001\"running\"\u548c\"ran\"\u89c6\u4e3a\u56db\u4e2a\u4e92\u4e0d\u76f8\u5173\u7684\u7b26\u53f7\u3002
\u4e00\u4e2a\u5177\u6709\u5f62\u6001\u5b66\u610f\u8bc6\u7684\u7cfb\u7edf\u4f1a\u8bc6\u522b\u51fa\u5b83\u4eec\u5171\u4eab\u540c\u4e00\u4e2a\u8bcd\u6839\u3002\u5b50\u8bcd\u8bcd\u5143\u5316\uff08BPE\u3001WordPiece\uff09\u2014\u2014\u6211\u4eec\u5c06\u5728\u6587\u4ef602\u4e2d\u8ba8\u8bba\u2014\u2014\u662f\u5f62\u6001\u5b66\u5206\u6790\u7684\u7edf\u8ba1\u8fd1\u4f3c\u65b9\u6cd5\u3002
\u53e5\u6cd5\u5b66\u7814\u7a76\u5355\u8bcd\u5982\u4f55\u7ec4\u5408\u6210\u77ed\u8bed\u548c\u53e5\u5b50\u3002\u6bcf\u79cd\u8bed\u8a00\u90fd\u6709\u63a7\u5236\u8bcd\u5e8f\u548c\u7ed3\u6784\u7684\u89c4\u5219\uff1b\u8fdd\u53cd\u8fd9\u4e9b\u89c4\u5219\u4f1a\u4ea7\u751f\u65e0\u610f\u4e49\u7684\u8f93\u51fa\u3002
\"The cat sat on the mat\"\u662f\u5408\u4e4e\u8bed\u6cd5\u7684\u82f1\u8bed\uff1b\"Mat the on sat cat the\"\u5219\u4e0d\u662f\u3002
\u63cf\u8ff0\u53e5\u6cd5\u7ed3\u6784\u4e3b\u8981\u6709\u4e24\u79cd\u6846\u67b6\u3002
\u77ed\u8bed\u7ed3\u6784\u8bed\u6cd5\uff08\u4e5f\u79f0\u4e3a\u6210\u5206\u8bed\u6cd5\uff09\u8ba4\u4e3a\u53e5\u5b50\u662f\u901a\u8fc7\u5c06\u4e00\u4e2a\u77ed\u8bed\u5d4c\u5957\u5728\u53e6\u4e00\u4e2a\u77ed\u8bed\u5185\u90e8\u6784\u5efa\u800c\u6210\u7684\u3002\u4e00\u4e2a\u53e5\u5b50\uff08S\uff09\u7531\u4e00\u4e2a\u540d\u8bcd\u77ed\u8bed\uff08NP\uff09\u548c\u4e00\u4e2a\u52a8\u8bcd\u77ed\u8bed\uff08VP\uff09\u7ec4\u6210\u3002
\u4e00\u4e2a\u540d\u8bcd\u77ed\u8bed\u53ef\u80fd\u7531\u4e00\u4e2a\u9650\u5b9a\u8bcd\uff08Det\uff09\u540e\u8ddf\u4e00\u4e2a\u540d\u8bcd\uff08N\uff09\u7ec4\u6210\u3002\u4e00\u4e2a\u52a8\u8bcd\u77ed\u8bed\u53ef\u80fd\u7531\u4e00\u4e2a\u52a8\u8bcd\uff08V\uff09\u540e\u8ddf\u4e00\u4e2a\u540d\u8bcd\u77ed\u8bed\u7ec4\u6210\u3002\u8fd9\u4e9b\u89c4\u5219\u6784\u5efa\u51fa\u4e00\u68f5\u6811\uff1a
\u8fd9\u68f5\u6811\u79f0\u4e3a\u6210\u5206\u6811\uff08\u6216\u5206\u6790\u6811\uff09\u3002\u6bcf\u4e2a\u5185\u90e8\u8282\u70b9\u662f\u4e00\u4e2a\u77ed\u8bed\u7c7b\u578b\uff0c\u6bcf\u4e2a\u53f6\u5b50\u8282\u70b9\u662f\u4e00\u4e2a\u5355\u8bcd\u3002\u8fd9\u68f5\u6811\u6355\u6349\u4e86\u5c42\u6b21\u5316\u5206\u7ec4\uff1a\"on the mat\"\u662f\u4e00\u4e2a\u5355\u5143\uff08\u4ecb\u8bcd\u77ed\u8bed\uff09\uff0c\"sat on the mat\"\u662f\u4e00\u4e2a\u5355\u5143\uff08\u52a8\u8bcd\u77ed\u8bed\uff09\uff0c\u800c\u6574\u4e2a\u7ed3\u6784\u662f\u4e00\u4e2a\u53e5\u5b50\u3002
\u4e0a\u4e0b\u6587\u65e0\u5173\u6587\u6cd5\uff08CFG\uff09\u5c06\u8fd9\u4e9b\u89c4\u5219\u5f62\u5f0f\u5316\u3002\u5b83\u7531\u4e00\u7ec4\u4ea7\u751f\u5f0f\u89c4\u5219\u7ec4\u6210\uff0c\u6bcf\u6761\u89c4\u5219\u7684\u5f62\u5f0f\u4e3a \\(A \\to \\alpha\\)\uff0c\u5176\u4e2d \\(A\\) \u662f\u4e00\u4e2a\u975e\u7ec8\u7ed3\u7b26\uff08\u5982NP\u6216VP\u8fd9\u6837\u7684\u77ed\u8bed\u7c7b\u578b\uff09\uff0c\\(\\alpha\\) \u662f\u4e00\u4e2a\u7531\u7ec8\u7ed3\u7b26\uff08\u5355\u8bcd\uff09\u548c\u975e\u7ec8\u7ed3\u7b26\u7ec4\u6210\u7684\u5e8f\u5217\u3002\u4f8b\u5982\uff1a
S \u2192 NP VP\nNP \u2192 Det N\nNP \u2192 Det N PP\nVP \u2192 V NP\nVP \u2192 V PP\nPP \u2192 P NP\nDet \u2192 \"the\" | \"a\"\nN \u2192 \"cat\" | \"mat\" | \"dog\"\nV \u2192 \"sat\" | \"chased\"\nP \u2192 \"on\" | \"under\"\n \u4eceS\u5f00\u59cb\uff0c\u53cd\u590d\u5e94\u7528\u89c4\u5219\uff0c\u4f60\u53ef\u4ee5\u751f\u6210\u8be5\u6587\u6cd5\u5141\u8bb8\u7684\u6240\u6709\u53e5\u5b50\u3002\u5206\u6790\u5219\u662f\u76f8\u53cd\u7684\u8fc7\u7a0b\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u53e5\u5b50\uff0c\u627e\u51fa\u4ea7\u751f\u5b83\u7684\u6811\uff08\u6216\u6240\u6709\u53ef\u80fd\u7684\u6811\uff09\u3002\u4e00\u4e2a\u6709\u591a\u4e2a\u6709\u6548\u5206\u6790\u6811\u7684\u53e5\u5b50\u79f0\u4e3a\u53e5\u6cd5\u6b67\u4e49\u3002\"I saw the man with the telescope\"\u6709\u4e24\u79cd\u5206\u6790\uff1a\u6211\u4f7f\u7528\u671b\u8fdc\u955c\u770b\u5230\u4e86\u90a3\u4e2a\u7537\u4eba\uff0c\u6216\u8005\u6211\u770b\u5230\u4e86\u4e00\u4e2a\u62ff\u7740\u671b\u8fdc\u955c\u7684\u7537\u4eba\u3002
\u4f9d\u5b58\u8bed\u6cd5\u91c7\u53d6\u4e86\u4e00\u79cd\u4e0d\u540c\u7684\u89c6\u89d2\u3002\u5b83\u4e0d\u4f9d\u8d56\u77ed\u8bed\u5d4c\u5957\uff0c\u800c\u662f\u63cf\u8ff0\u5355\u8bcd\u4e4b\u95f4\u7684\u76f4\u63a5\u5173\u7cfb\u3002\u53e5\u5b50\u4e2d\u7684\u6bcf\u4e2a\u5355\u8bcd\u90fd\u6070\u597d\u4f9d\u8d56\u4e8e\u53e6\u4e00\u4e2a\u5355\u8bcd\uff08\u5b83\u7684\u6838\u5fc3\u8bcd\uff09\uff0c\u9664\u4e86\u53e5\u5b50\u7684\u6839\u8282\u70b9\u3002\u7ed3\u679c\u662f\u4e00\u4e2a\u4f9d\u5b58\u6811\uff0c\u5176\u4e2d\u8fb9\u6807\u6709\u8bed\u6cd5\u5173\u7cfb\u6807\u7b7e\uff08\u4e3b\u8bed\u3001\u5bbe\u8bed\u3001\u4fee\u9970\u8bed\u7b49\uff09\u3002
\u5728\u4f9d\u5b58\u89c6\u89d2\u4e0b\uff0c\"sat\"\u662f\u6839\u8282\u70b9\u3002\"Cat\"\u4f5c\u4e3a\u4e3b\u8bed\uff08nsubj\uff09\u4f9d\u8d56\u4e8e\"sat\"\u3002\"On\"\u4f5c\u4e3a\u4ecb\u8bcd\u4fee\u9970\u8bed\u4f9d\u8d56\u4e8e\"sat\"\u3002\"Mat\"\u4f5c\u4e3a\u4ecb\u8bcd\u5bbe\u8bed\u4f9d\u8d56\u4e8e\"on\"\u3002\u6bcf\u4e2a\u5355\u8bcd\u90fd\u6302\u5728\u6070\u597d\u4e00\u4e2a\u6838\u5fc3\u8bcd\u4e0a\uff0c\u5f62\u6210\u4e00\u68f5\u6811\u3002
\u4f9d\u5b58\u8bed\u6cd5\u5df2\u6210\u4e3a\u73b0\u4ee3NLP\u4e2d\u7684\u4e3b\u5bfc\u6846\u67b6\uff0c\u56e0\u4e3a\u4f9d\u5b58\u6811\u66f4\u5bb9\u6613\u7528\u7edf\u8ba1\u5206\u6790\u5668\u751f\u6210\uff0c\u800c\u4e14\u8fd9\u4e9b\u5173\u7cfb\u66f4\u76f4\u63a5\u5730\u6620\u5c04\u5230\u8bed\u4e49\u89d2\u8272\uff08\u8c01\u5bf9\u8c01\u505a\u4e86\u4ec0\u4e48\uff09\u3002
\u914d\u4ef7\u63cf\u8ff0\u4e00\u4e2a\u52a8\u8bcd\u9700\u8981\u591a\u5c11\u4e2a\u8bba\u5143\u3002\"Sleep\"\u662f\u4e0d\u53ca\u7269\u52a8\u8bcd\uff08\u4e00\u4e2a\u8bba\u5143\uff1a\u7761\u89c9\u8005\uff09\u3002\"Eat\"\u662f\u53ca\u7269\u52a8\u8bcd\uff08\u4e24\u4e2a\uff1a\u5403\u8005\u548c\u88ab\u5403\u4e4b\u7269\uff09\u3002\"Give\"\u662f\u53cc\u53ca\u7269\u52a8\u8bcd\uff08\u4e09\u4e2a\uff1a\u7ed9\u4e88\u8005\u3001\u7ed9\u4e88\u4e4b\u7269\u548c\u63a5\u53d7\u8005\uff09\u3002\u4e86\u89e3\u52a8\u8bcd\u7684\u914d\u4ef7\u53ef\u4ee5\u7ea6\u675f\u54ea\u4e9b\u5206\u6790\u6811\u662f\u6709\u6548\u7684\u3002
\u8bed\u4e49\u5b66\u662f\u5bf9\u610f\u4e49\u7684\u7814\u7a76\u3002\u53e5\u6cd5\u5b66\u544a\u8bc9\u4f60\u53e5\u5b50\u662f\u5982\u4f55\u7ed3\u6784\u7684\uff1b\u8bed\u4e49\u5b66\u544a\u8bc9\u4f60\u53e5\u5b50\u610f\u5473\u7740\u4ec0\u4e48\u3002
\u8bcd\u6c47\u8bed\u4e49\u5b66\u5173\u6ce8\u5355\u4e2a\u5355\u8bcd\u7684\u610f\u4e49\u3002\u5355\u8bcd\u4e4b\u95f4\u4ee5\u7cfb\u7edf\u6027\u7684\u65b9\u5f0f\u76f8\u4e92\u5173\u8054\uff1a
\u8bcd\u4e49\u6d88\u6b67\uff08WSD\uff09\u662f\u6839\u636e\u4e0a\u4e0b\u6587\u786e\u5b9a\u591a\u4e49\u8bcd\u7684\u54ea\u4e2a\u4e49\u9879\u88ab\u4f7f\u7528\u7684\u4efb\u52a1\u3002\u5728\"I deposited money at the bank\"\u4e2d\uff0c\u91d1\u878d\u4e49\u9879\u662f\u6b63\u786e\u7684\u3002\u5728\"We sat by the river bank\"\u4e2d\uff0c\u5730\u7406\u4e49\u9879\u662f\u6b63\u786e\u7684\u3002WSD\u662f\u65e9\u671fNLP\u4e2d\u7684\u4e00\u4e2a\u6838\u5fc3\u95ee\u9898\uff1b\u73b0\u4ee3\u7684\u4e0a\u4e0b\u6587\u5d4c\u5165\uff08ELMo\u3001BERT\uff09\u901a\u8fc7\u4e3a\u540c\u4e00\u4e2a\u5355\u8bcd\u7684\u4e0d\u540c\u7528\u6cd5\u751f\u6210\u4e0d\u540c\u7684\u5411\u91cf\u8868\u793a\uff0c\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002
\u7ec4\u5408\u8bed\u4e49\u5b66\u7814\u7a76\u5355\u4e2a\u5355\u8bcd\u7684\u610f\u4e49\u5982\u4f55\u7ec4\u5408\u4ee5\u5f62\u6210\u77ed\u8bed\u6216\u53e5\u5b50\u7684\u610f\u4e49\u3002\u7ec4\u5408\u6027\u539f\u5219\uff08\u5f52\u529f\u4e8e\u5f17\u96f7\u683c\uff09\u6307\u51fa\uff0c\u4e00\u4e2a\u590d\u6742\u8868\u8fbe\u5f0f\u7684\u610f\u4e49\u7531\u5176\u7ec4\u6210\u90e8\u5206\u7684\u610f\u4e49\u4ee5\u53ca\u7ec4\u5408\u8fd9\u4e9b\u90e8\u5206\u7684\u89c4\u5219\u5171\u540c\u51b3\u5b9a\u3002\"The cat chased the dog\"\u4e0e\"the dog chased the cat\"\u610f\u4e49\u4e0d\u540c\uff0c\u56e0\u4e3a\u53e5\u6cd5\u7ed3\u6784\uff08\u8c01\u662f\u4e3b\u8bed\u3001\u8c01\u662f\u5bbe\u8bed\uff09\u4e0e\u5355\u8bcd\u610f\u4e49\u76f8\u4e92\u4f5c\u7528\u3002
\u5e76\u975e\u6240\u6709\u610f\u4e49\u90fd\u662f\u7ec4\u5408\u6027\u7684\u3002\u4e60\u8bed\u5982\"kick the bucket\"\uff08\u610f\u4e3a\"\u53bb\u4e16\"\uff09\u5177\u6709\u65e0\u6cd5\u4ece\u5176\u7ec4\u6210\u90e8\u5206\u63a8\u5bfc\u51fa\u7684\u610f\u4e49\u3002\u8fd9\u5bf9\u4efb\u4f55\u7ec4\u5408\u6027\u65b9\u6cd5\u90fd\u662f\u4e00\u4e2a\u6311\u6218\u3002
\u5206\u5e03\u8bed\u4e49\u5b66\u662f\u652f\u6491\u73b0\u4ee3NLP\u7684\u8ba1\u7b97\u6027\u610f\u4e49\u7814\u7a76\u65b9\u6cd5\u3002\u5206\u5e03\u5047\u8bbe\uff08Firth, 1957\uff09\u6307\u51fa\uff1a\"\u89c2\u5176\u4f34\uff0c\u77e5\u5176\u610f\u3002\"\uff08You shall know a word by the company it keeps.\uff09\u51fa\u73b0\u5728\u76f8\u4f3c\u8bed\u5883\u4e2d\u7684\u5355\u8bcd\u5f80\u5f80\u5177\u6709\u76f8\u4f3c\u7684\u610f\u4e49\u3002\u8fd9\u662f\u8bcd\u5d4c\u5165\uff08Word2Vec\u3001GloVe\uff09\u7684\u7406\u8bba\u57fa\u7840\uff0c\u6211\u4eec\u5c06\u5728\u6587\u4ef603\u4e2d\u6df1\u5165\u63a2\u8ba8\u3002
\u8bed\u7528\u5b66\u7814\u7a76\u8bed\u5883\u5982\u4f55\u5f71\u54cd\u610f\u4e49\u3002\u540c\u4e00\u4e2a\u53e5\u5b50\u6839\u636e\u8bf4\u8bdd\u8005\u3001\u65f6\u95f4\u3001\u5730\u70b9\u548c\u539f\u56e0\u7684\u4e0d\u540c\uff0c\u53ef\u80fd\u610f\u5473\u7740\u4e0d\u540c\u7684\u4e8b\u60c5\u3002
\"Can you pass the salt?\"\u5728\u53e5\u6cd5\u4e0a\u662f\u4e00\u4e2a\u5173\u4e8e\u80fd\u529b\u7684\u7591\u95ee\u53e5\u3002\u5728\u8bed\u7528\u4e0a\uff0c\u5b83\u662f\u4e00\u4e2a\u8bf7\u6c42\u3002\u4f60\u4e0d\u4f1a\u56de\u7b54\"\u662f\u7684\uff0c\u6211\u80fd\"\u7136\u540e\u5750\u7740\u4e0d\u52a8\u3002\u7406\u89e3\u8fd9\u4e00\u70b9\u9700\u8981\u8d85\u8d8a\u5b57\u9762\u610f\u4e49\u7684\u77e5\u8bc6\uff0c\u5177\u4f53\u6765\u8bf4\uff0c\u662f\u5173\u4e8e\u8a00\u8bed\u884c\u4e3a\u7684\u60ef\u4f8b\u77e5\u8bc6\u3002
\u8a00\u8bed\u884c\u4e3a\u7406\u8bba\uff08Austin, Searle\uff09\u533a\u5206\u4e86\uff1a
\u9690\u6db5\uff08Grice\uff09\u662f\u6307\u88ab\u6697\u793a\u4f46\u672a\u660e\u786e\u9648\u8ff0\u7684\u610f\u4e49\u3002\u5982\u679c\u6709\u4eba\u95ee\"Is John a good cook?\"\u800c\u4f60\u56de\u7b54\"He's British\"\uff0c\u4f60\u5e76\u6ca1\u6709\u4ece\u5b57\u9762\u4e0a\u56de\u7b54\u95ee\u9898\uff0c\u4f46\u542c\u8005\u53ef\u4ee5\u63a8\u65ad\uff08\u901a\u8fc7\u6587\u5316\u523b\u677f\u5370\u8c61\uff0c\u65e0\u8bba\u516c\u5e73\u4e0e\u5426\uff09\u4f60\u7684\u610f\u601d\u662f\"\u4e0d\u597d\"\u3002Grice\u7684\u5408\u4f5c\u539f\u5219\u6307\u51fa\uff0c\u8bf4\u8bdd\u8005\u901a\u5e38\u4f1a\u52aa\u529b\u505a\u5230\u4fe1\u606f\u5145\u5206\u3001\u771f\u5b9e\u3001\u76f8\u5173\u548c\u6e05\u6670\uff0c\u800c\u542c\u8005\u5047\u5b9a\u8fd9\u4e9b\u51c6\u5219\u6210\u7acb\u6765\u8fdb\u884c\u89e3\u8bfb\u3002
\u5171\u6307\u662f\u4e00\u79cd\u8bed\u7528\u73b0\u8c61\uff0c\u5176\u4e2d\u4e0d\u540c\u7684\u8868\u8fbe\u6307\u5411\u540c\u4e00\u4e2a\u5b9e\u4f53\u3002\u5728\"Alice went to the store. She bought milk\"\u4e2d\uff0c\"she\"\u6307\u4ee3Alice\u3002\u89e3\u51b3\u5171\u6307\u95ee\u9898\u5bf9\u4e8e\u7406\u89e3\u591a\u53e5\u6587\u672c\u81f3\u5173\u91cd\u8981\uff0c\u662fNLP\u4e2d\u7684\u4e00\u4e2a\u5173\u952e\u4efb\u52a1\u3002
\u7bc7\u7ae0\u7ed3\u6784\u63cf\u8ff0\u53e5\u5b50\u5982\u4f55\u8fde\u63a5\u4ee5\u5f62\u6210\u8fde\u8d2f\u7684\u6587\u672c\u3002\u53d9\u4e8b\u6709\u5f00\u5934\u3001\u4e2d\u95f4\u548c\u7ed3\u5c3e\u3002\u8bba\u8bc1\u6709\u4e3b\u5f20\u548c\u8bc1\u636e\u3002\u4fee\u8f9e\u7ed3\u6784\u7406\u8bba\uff08RST\uff09\u5c06\u6587\u672c\u5206\u6790\u4e3a\u7bc7\u7ae0\u5173\u7cfb\uff08\u9610\u8ff0\u3001\u5bf9\u6bd4\u3001\u56e0\u679c\u7b49\uff09\u7684\u6811\u72b6\u7ed3\u6784\u3002
\u8bed\u7528\u5b66\u662fNLP\u4e2d\u6700\u56f0\u96be\u7684\u9886\u57df\u3002\u73b0\u4ee3\u8bed\u8a00\u6a21\u578b\u901a\u8fc7\u8bad\u7ec3\u6570\u636e\u9690\u5f0f\u5730\u5904\u7406\u4e86\u5927\u90e8\u5206\u53e5\u6cd5\u548c\u8bed\u4e49\uff0c\u4f46\u8bed\u7528\u63a8\u7406\u2014\u2014\u7406\u89e3\u8bbd\u523a\u3001\u9690\u6db5\u548c\u4f9d\u8d56\u8bed\u5883\u7684\u610f\u4e49\u2014\u2014\u4ecd\u7136\u662f\u4e00\u4e2a\u524d\u6cbf\u6311\u6218\u3002
\u97f3\u7cfb\u5b66\u7814\u7a76\u8bed\u8a00\u7684\u58f0\u97f3\u7cfb\u7edf\u3002\u867d\u7136\u672c\u7ae0\u4e3b\u8981\u5173\u6ce8\u6587\u672c\uff0c\u4f46\u7b80\u8981\u6982\u8ff0\u53ef\u4ee5\u8854\u63a5\u97f3\u9891\u548c\u8bed\u97f3\u7ae0\u8282\uff08\u7b2c09\u7ae0\uff09\u3002
\u97f3\u4f4d\u662f\u533a\u5206\u610f\u4e49\u7684\u6700\u5c0f\u58f0\u97f3\u5355\u4f4d\u3002\u82f1\u8bed\u7ea6\u670944\u4e2a\u97f3\u4f4d\u3002\u5355\u8bcd\"bat\"\u548c\"pat\"\u76f8\u5dee\u4e00\u4e2a\u97f3\u4f4d\uff08/b/ \u4e0e /p/\uff09\uff0c\u800c\u610f\u4e49\u7684\u6539\u53d8\u662f\u5b8c\u5168\u6027\u7684\u3002\u8fd9\u88ab\u79f0\u4e3a\u6700\u5c0f\u5bf9\u7acb\u4f53\u3002
\u97f3\u4f4d\u53d8\u4f53\u662f\u540c\u4e00\u4e2a\u97f3\u4f4d\u7684\u4e0d\u540c\u7269\u7406\u5b9e\u73b0\uff0c\u4e0d\u6539\u53d8\u610f\u4e49\u3002\"pin\"\u4e2d\u7684\"p\"\uff08\u9001\u6c14\u97f3\uff0c\u5e26\u4e00\u80a1\u6c14\u6d41\uff09\u548c\"spin\"\u4e2d\u7684\"p\"\uff08\u4e0d\u9001\u6c14\u97f3\uff09\u5728\u82f1\u8bed\u4e2d\u662f\u97f3\u4f4d/p/\u7684\u97f3\u4f4d\u53d8\u4f53\uff1b\u6bcd\u8bed\u8005\u5c06\u5b83\u4eec\u89c6\u4e3a\u540c\u4e00\u4e2a\u58f0\u97f3\u3002
\u56fd\u9645\u97f3\u6807\uff08IPA\uff09\u4e3a\u6240\u6709\u8bed\u8a00\u7684\u97f3\u4f4d\u63d0\u4f9b\u4e86\u6807\u51c6\u5316\u7684\u8bb0\u6cd5\u3002\u5355\u8bcd\"cat\"\u8f6c\u5f55\u4e3a/k\u00e6t/\u3002IPA\u662f\u4e66\u9762\u6587\u672c\u548c\u8bed\u97f3\u7cfb\u7edf\u4e4b\u95f4\u7684\u6865\u6881\u3002
\u97f5\u5f8b\u6db5\u76d6\u8bed\u97f3\u7684\u8282\u594f\u3001\u91cd\u97f3\u548c\u8bed\u8c03\u3002\"I didn't say he stole the money\"\u6839\u636e\u91cd\u97f3\u843d\u5728\u54ea\u4e2a\u5355\u8bcd\u4e0a\uff0c\u53ef\u4ee5\u6709\u4e03\u79cd\u4e0d\u540c\u7684\u542b\u4e49\u3002\u97f5\u5f8b\u643a\u5e26\u4e86\u7eaf\u6587\u672c\u6240\u4e22\u5931\u7684\u4fe1\u606f\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6587\u672c\u8f6c\u8bed\u97f3\u7cfb\u7edf\u5fc5\u987b\u4ed4\u7ec6\u5efa\u6a21\u97f5\u5f8b\u7684\u539f\u56e0\u3002
\u5728NLP\u4e2d\uff0c\u97f3\u7cfb\u5b66\u77e5\u8bc6\u51fa\u73b0\u5728\u6587\u672c\u8f6c\u8bed\u97f3\uff08\u5b57\u5f62\u5230\u97f3\u4f4d\u7684\u8f6c\u6362\uff09\u3001\u8bed\u97f3\u8bc6\u522b\uff08\u5c06\u58f0\u5b66\u4fe1\u53f7\u6620\u5c04\u5230\u97f3\u4f4d\uff09\uff0c\u751a\u81f3\u62fc\u5199\u7ea0\u6b63\u548c\u97f3\u8bd1\u4e2d\u3002
\u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u5f62\u6001\u5206\u6790\u5668\uff0c\u4f7f\u7528\u5e38\u89c1\u524d\u7f00\u548c\u540e\u7f00\u5217\u8868\u5c06\u82f1\u8bed\u5355\u8bcd\u5206\u89e3\u4e3a\u53ef\u80fd\u7684\u8bed\u7d20\u3002
prefixes = ['un', 're', 'pre', 'dis', 'mis', 'over', 'under', 'out', 'non']\nsuffixes = ['ing', 'ed', 'ly', 'ness', 'ment', 'tion', 'able', 'ible', 'er', 'est', 'ful', 'less', 'ous']\n\ndef analyse_morphemes(word):\n \"\"\"\u4f7f\u7528\u5df2\u77e5\u8bcd\u7f00\u8fdb\u884c\u7b80\u5355\u7684\u8bed\u7d20\u5206\u6790\u3002\"\"\"\n parts = []\n remaining = word.lower()\n\n # \u68c0\u67e5\u524d\u7f00\n for p in sorted(prefixes, key=len, reverse=True):\n if remaining.startswith(p) and len(remaining) > len(p) + 2:\n parts.append(f\"[prefix: {p}]\")\n remaining = remaining[len(p):]\n break\n\n # \u68c0\u67e5\u540e\u7f00\n for s in sorted(suffixes, key=len, reverse=True):\n if remaining.endswith(s) and len(remaining) > len(s) + 2:\n root = remaining[:-len(s)]\n parts.append(f\"[root: {root}]\")\n parts.append(f\"[suffix: {s}]\")\n remaining = None\n break\n\n if remaining is not None:\n parts.append(f\"[root: {remaining}]\")\n\n return parts\n\nfor word in ['unhappiness', 'reusable', 'disconnected', 'overreacting', 'kindness']:\n print(f\"{word:20s} \u2192 {' + '.join(analyse_morphemes(word))}\")\n \u5b9e\u73b0\u4e00\u4e2a\u4f7f\u7528\u9012\u5f52\u4e0b\u964d\u6cd5\u7684\u7b80\u5355\u4e0a\u4e0b\u6587\u65e0\u5173\u6587\u6cd5\u5206\u6790\u5668\u3002\u5b9a\u4e49\u4e00\u4e2a\u5c0f\u578b\u6587\u6cd5\uff0c\u5e76\u5c06\u53e5\u5b50\u5206\u6790\u4e3a\u6210\u5206\u6811\u3002
class CFGParser:\n \"\"\"\u7528\u4e8e\u5c0f\u578b\u82f1\u8bed\u6587\u6cd5\u7684\u9012\u5f52\u4e0b\u964d\u5206\u6790\u5668\u3002\"\"\"\n def __init__(self, tokens):\n self.tokens = tokens\n self.pos = 0\n\n def peek(self):\n return self.tokens[self.pos] if self.pos < len(self.tokens) else None\n\n def consume(self, expected=None):\n tok = self.peek()\n if expected and tok != expected:\n return None\n self.pos += 1\n return tok\n\n def parse_det(self):\n if self.peek() in ('the', 'a'):\n return ('Det', self.consume())\n return None\n\n def parse_noun(self):\n if self.peek() in ('cat', 'dog', 'mat', 'man'):\n return ('N', self.consume())\n return None\n\n def parse_verb(self):\n if self.peek() in ('sat', 'chased', 'saw'):\n return ('V', self.consume())\n return None\n\n def parse_prep(self):\n if self.peek() in ('on', 'under', 'with'):\n return ('P', self.consume())\n return None\n\n def parse_np(self):\n save = self.pos\n det = self.parse_det()\n noun = self.parse_noun()\n if det and noun:\n # \u68c0\u67e5\u53ef\u9009\u7684PP\n pp = self.parse_pp()\n if pp:\n return ('NP', det, noun, pp)\n return ('NP', det, noun)\n self.pos = save\n return None\n\n def parse_pp(self):\n save = self.pos\n prep = self.parse_prep()\n np = self.parse_np()\n if prep and np:\n return ('PP', prep, np)\n self.pos = save\n return None\n\n def parse_vp(self):\n save = self.pos\n verb = self.parse_verb()\n if verb:\n np = self.parse_np()\n if np:\n return ('VP', verb, np)\n pp = self.parse_pp()\n if pp:\n return ('VP', verb, pp)\n self.pos = save\n return None\n\n def parse_sentence(self):\n np = self.parse_np()\n vp = self.parse_vp()\n if np and vp and self.pos == len(self.tokens):\n return ('S', np, vp)\n return None\n\ndef print_tree(tree, indent=0):\n if isinstance(tree, str):\n print(' ' * indent + tree)\n elif isinstance(tree, tuple):\n print(' ' * indent + tree[0])\n for child in tree[1:]:\n print_tree(child, indent + 2)\n\nsentences = [\n \"the cat sat on the mat\",\n \"a dog chased the cat\",\n]\n\nfor sent in sentences:\n tokens = sent.split()\n parser = CFGParser(tokens)\n tree = parser.parse_sentence()\n print(f\"\\n'{sent}':\")\n if tree:\n print_tree(tree)\n else:\n print(\" (no parse found)\")\n \u901a\u8fc7\u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u8bcd\u56fe\u6765\u63a2\u7d22\u8bcd\u6c47\u5173\u7cfb\u3002\u7ed9\u5b9a\u4e00\u4e2a\u5305\u542b\u540c\u4e49\u3001\u53cd\u4e49\u548c\u4e0a\u4f4d\u5173\u7cfb\u7684\u5c0f\u578b\u8bcd\u6c47\u8868\uff0c\u67e5\u627e\u5355\u8bcd\u4e4b\u95f4\u7684\u8def\u5f84\u3002
relations = {\n ('big', 'large'): 'synonym',\n ('big', 'small'): 'antonym',\n ('small', 'tiny'): 'synonym',\n ('dog', 'animal'): 'hypernym',\n ('cat', 'animal'): 'hypernym',\n ('puppy', 'dog'): 'hypernym',\n ('happy', 'glad'): 'synonym',\n ('happy', 'sad'): 'antonym',\n ('hot', 'cold'): 'antonym',\n ('hot', 'warm'): 'synonym',\n}\n\n# \u6784\u5efa\u90bb\u63a5\u5217\u8868\nfrom collections import defaultdict, deque\n\ngraph = defaultdict(list)\nfor (w1, w2), rel in relations.items():\n graph[w1].append((w2, rel))\n graph[w2].append((w1, rel))\n\ndef find_path(start, end):\n \"\"\"\u4f7f\u7528BFS\u5728\u5173\u7cfb\u56fe\u4e2d\u67e5\u627e\u4e24\u4e2a\u5355\u8bcd\u4e4b\u95f4\u7684\u8def\u5f84\u3002\"\"\"\n queue = deque([(start, [(start, None)])])\n visited = {start}\n while queue:\n node, path = queue.popleft()\n if node == end:\n return path\n for neighbor, rel in graph[node]:\n if neighbor not in visited:\n visited.add(neighbor)\n queue.append((neighbor, path + [(neighbor, rel)]))\n return None\n\npairs = [('big', 'tiny'), ('puppy', 'cat'), ('happy', 'sad')]\nfor w1, w2 in pairs:\n path = find_path(w1, w2)\n if path:\n steps = \" \u2192 \".join(f\"{w}({r})\" if r else w for w, r in path)\n print(f\"{w1} \u2192 {w2}: {steps}\")\n else:\n print(f\"{w1} \u2192 {w2}: no path found\")\n \u6587\u672c\u5904\u7406\u5c06\u539f\u59cb\u5b57\u7b26\u8f6c\u6362\u4e3a\u6a21\u578b\u53ef\u6d88\u8d39\u7684\u7ed3\u6784\u5316\u8868\u793a\u3002\u672c\u6587\u6db5\u76d6\u5206\u8bcd\uff08\u8bcd\u7ea7\u3001\u5b50\u8bcd\u3001BPE\u3001WordPiece\uff09\u3001\u6587\u672c\u89c4\u8303\u5316\u3001\u7f16\u8f91\u8ddd\u79bb\u3001TF-IDF\u3001n\u5143\u7ec4\u8bed\u8a00\u6a21\u578b\u3001\u8bcd\u6027\u6807\u6ce8\u3001\u547d\u540d\u5b9e\u4f53\u8bc6\u522b\u548c\u60c5\u611f\u5206\u6790\u2014\u2014\u8fd9\u4e9b\u7ecf\u5178NLP\u6d41\u6c34\u7ebf\u81f3\u4eca\u4ecd\u662f\u73b0\u4ee3\u7cfb\u7edf\u7684\u57fa\u7840\u3002
\u539f\u59cb\u6587\u672c\u662f\u6df7\u4e71\u7684\u3002\u5728\u4efb\u4f55NLP\u6a21\u578b\u5904\u7406\u8bed\u8a00\u4e4b\u524d\uff0c\u6587\u672c\u5fc5\u987b\u7ecf\u8fc7\u6e05\u6d17\u3001\u89c4\u8303\u5316\u5e76\u8f6c\u6362\u4e3a\u7ed3\u6784\u5316\u8868\u793a\u3002\u672c\u6587\u6db5\u76d6\u4e86\u4ece\u539f\u59cb\u5b57\u7b26\u5230\u6a21\u578b\u53ef\u6d88\u8d39\u7279\u5f81\u7684\u5b8c\u6574\u6d41\u6c34\u7ebf\uff0c\u4ee5\u53ca\u6df1\u5ea6\u5b66\u4e60\u5174\u8d77\u4e4b\u524d\u4e3b\u5bfc\u9886\u57df\u7684\u7ecf\u5178NLP\u7b97\u6cd5\u3002
\u6587\u672c\u89c4\u8303\u5316\u5c06\u539f\u59cb\u6587\u672c\u8f6c\u6362\u4e3a\u89c4\u8303\u5f62\u5f0f\u3002\u5176\u76ee\u6807\u662f\u51cf\u5c11\u4e0d\u76f8\u5173\u7684\u53d8\u5f02\uff0c\u4f7f\"Hello\"\u3001\"hello\"\u3001\"HELLO\"\u548c\"h\u00e9llo\"\u5f97\u5230\u6070\u5f53\u7684\u5904\u7406\u3002
\u5927\u5c0f\u5199\u6298\u53e0\u5c06\u6587\u672c\u8f6c\u6362\u4e3a\u5c0f\u5199\u3002\u8fd9\u5c06\"The\"\u548c\"the\"\u5408\u5e76\u4e3a\u4e00\u4e2a\u8bcd\u5143\u3002\u8fd9\u5bf9\u5927\u591a\u6570\u4efb\u52a1\u6709\u5e2e\u52a9\uff0c\u4f46\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u4f1a\u7834\u574f\u6709\u7528\u4fe1\u606f\uff1a\"US\"\uff08\u56fd\u5bb6\uff09vs \"us\"\uff08\u4ee3\u8bcd\uff09\uff0c\u6216\"Apple\"\uff08\u516c\u53f8\uff09vs \"apple\"\uff08\u6c34\u679c\uff09\u3002
Unicode\u89c4\u8303\u5316\u5904\u7406\u540c\u4e00\u5b57\u7b26\u6709\u591a\u79cd\u7f16\u7801\u65b9\u5f0f\u7684\u95ee\u9898\u3002\u5b57\u7b26\"\u00e9\"\u53ef\u4ee5\u662f\u5355\u4e2a\u7801\u70b9\uff08U+00E9\uff09\uff0c\u4e5f\u53ef\u4ee5\u662f\u57fa\u7840\"e\"\u52a0\u4e0a\u7ec4\u5408\u53d8\u97f3\u7b26\u53f7\uff08U+0065 + U+0301\uff09\u3002NFC\u89c4\u8303\u5316\u5c06\u5b83\u4eec\u7ec4\u5408\u6210\u4e00\u4e2a\u7801\u70b9\uff1bNFD\u5219\u8fdb\u884c\u5206\u89e3\u3002\u5982\u679c\u6ca1\u6709\u89c4\u8303\u5316\uff0c\u4e24\u4e2a\u770b\u8d77\u6765\u76f8\u540c\u7684\u5b57\u7b26\u4e32\u53ef\u80fd\u65e0\u6cd5\u5339\u914d\u3002
\u7f16\u8f91\u8ddd\u79bb\u8861\u91cf\u4e24\u4e2a\u5b57\u7b26\u4e32\u4e4b\u95f4\u7684\u5dee\u5f02\u7a0b\u5ea6\u3002\u83b1\u6587\u65af\u5766\u8ddd\u79bb\u8ba1\u7b97\u5c06\u4e00\u4e2a\u5b57\u7b26\u4e32\u8f6c\u6362\u4e3a\u53e6\u4e00\u4e2a\u6240\u9700\u7684\u6700\u5c11\u5355\u5b57\u7b26\u63d2\u5165\u3001\u5220\u9664\u548c\u66ff\u6362\u6b21\u6570\u3002\"kitten\" \u2192 \"sitting\"\u7684\u7f16\u8f91\u8ddd\u79bb\u4e3a3\uff08k\u2192s\uff0ce\u2192i\uff0c\u63d2\u5165g\uff09\u3002
\u7f16\u8f91\u8ddd\u79bb\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u8ba1\u7b97\uff08\u6211\u4eec\u5728\u7b97\u6cd5\u7ae0\u8282\u4e2d\u56de\u987e\uff09\u3002\u5b9a\u4e49 \\(D[i][j]\\) \u4e3a\u5b57\u7b26\u4e32 \\(s\\) \u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u4e0e\u5b57\u7b26\u4e32 \\(t\\) \u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\u4e4b\u95f4\u7684\u8ddd\u79bb\uff1a
\u7f16\u8f91\u8ddd\u79bb\u652f\u6491\u7740\u62fc\u5199\u7ea0\u6b63\u3001\u6a21\u7cca\u5339\u914d\u548cDNA\u5e8f\u5217\u6bd4\u5bf9\u3002\u5728NLP\u4e2d\uff0c\u5b83\u7528\u4e8e\u5904\u7406\u62fc\u5199\u9519\u8bef\u548c\u67e5\u627e\u76f8\u4f3c\u5355\u8bcd\u3002
\u5206\u8bcd\u5c06\u6587\u672c\u5206\u5272\u6210\u6a21\u578b\u53ef\u4ee5\u5904\u7406\u7684\u79bb\u6563\u5355\u5143\uff08\u8bcd\u5143\uff09\u3002\u8fd9\u662f\u7b2c\u4e00\u4e2a\u4e5f\u662f\u6700\u91cd\u8981\u7684\u9884\u5904\u7406\u6b65\u9aa4\u3002\u5206\u8bcd\u7b56\u7565\u7684\u9009\u62e9\u6df1\u523b\u5f71\u54cd\u7740\u6a21\u578b\u884c\u4e3a\u3002
\u7a7a\u767d\u5206\u8bcd\u4ee5\u7a7a\u683c\u5206\u5272\u3002\u7b80\u5355\u4f46\u5e7c\u7a1a\uff1a\"New York\"\u53d8\u6210\u4e24\u4e2a\u8bcd\u5143\uff0c\"don't\"\u662f\u4e00\u4e2a\u8bcd\u5143\uff08\u6216\u6839\u636e\u5206\u5272\u5668\u4e0d\u540c\uff0c\u62c6\u5206\u4e3a\"don\"\u548c\"'t\"\uff09\uff0c\u800c\u4e2d\u6587\u548c\u65e5\u6587\u7b49\u8bed\u8a00\u5728\u8bcd\u4e4b\u95f4\u6839\u672c\u6ca1\u6709\u7a7a\u683c\u3002
\u57fa\u4e8e\u89c4\u5219\u7684\u5206\u8bcd\u4f7f\u7528\u624b\u5de5\u8bbe\u8ba1\u7684\u6a21\u5f0f\uff08\u6b63\u5219\u8868\u8fbe\u5f0f\uff09\u6765\u5904\u7406\u7f29\u5199\u3001\u6807\u70b9\u7b26\u53f7\u548c\u7279\u6b8a\u60c5\u51b5\u3002\"I'm\" \u2192 \"I\" + \"'m\"\uff0c\"U.S.A.\"\u4fdd\u6301\u4e3a\u4e00\u4e2a\u8bcd\u5143\u3002\u6bcf\u79cd\u8bed\u8a00\u90fd\u9700\u8981\u81ea\u5df1\u7684\u89c4\u5219\uff0c\u8fd9\u975e\u5e38\u8017\u8d39\u4eba\u529b\u3002
\u5b50\u8bcd\u5206\u8bcd\u662f\u73b0\u4ee3\u89e3\u51b3\u65b9\u6848\u3002\u5b83\u4e0d\u662f\u5728\u8bcd\u8fb9\u754c\u5904\u5206\u5272\uff0c\u800c\u662f\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u4e00\u4e2a\u9ad8\u9891\u5b50\u8bcd\u5355\u5143\u7684\u8bcd\u6c47\u8868\u3002\u8fd9\u4f18\u96c5\u5730\u5904\u7406\u4e86\u672a\u77e5\u8bcd\uff1a\u5982\u679c\"unhappiness\"\u4e0d\u5728\u8bcd\u6c47\u8868\u4e2d\uff0c\u5b83\u53ef\u80fd\u88ab\u62c6\u5206\u4e3a\"un\" + \"happi\" + \"ness\"\uff0c\u4fdd\u7559\u4e86\u5f62\u6001\u7ed3\u6784\u3002
\u5b57\u8282\u5bf9\u7f16\u7801\uff08BPE\uff09\u4ece\u5355\u4e2a\u5b57\u7b26\u4f5c\u4e3a\u8bcd\u6c47\u8868\u5f00\u59cb\u3002\u5b83\u53cd\u590d\u67e5\u627e\u6700\u9891\u7e41\u7684\u76f8\u90bb\u5bf9\u5e76\u5c06\u5176\u5408\u5e76\u4e3a\u4e00\u4e2a\u65b0\u8bcd\u5143\u3002\u7ecf\u8fc7\u8db3\u591f\u6b21\u6570\u7684\u5408\u5e76\u540e\uff0c\u5e38\u89c1\u8bcd\u6210\u4e3a\u5355\u4e2a\u8bcd\u5143\uff0c\u7f55\u89c1\u8bcd\u5219\u88ab\u62c6\u5206\u4e3a\u9ad8\u9891\u5b50\u8bcd\u7247\u6bb5\u3002
BPE\u7b97\u6cd5\uff1a
\u4f8b\u5982\uff0c\u4ece\"l o w\"\uff085\u6b21\uff09\u3001\"l o w e r\"\uff082\u6b21\uff09\u3001\"n e w e s t\"\uff086\u6b21\uff09\u5f00\u59cb\uff1a\u6700\u9891\u7e41\u7684\u5bf9\u53ef\u80fd\u662f\"e s\" \u2192 \u5408\u5e76\u4e3a\"es\"\u3002\u7136\u540e\"es t\" \u2192 \"est\"\u3002\u7136\u540e\"n e w\" \u2192 \"new\"\u3002\u6700\u7ec8\u7684\u8bcd\u6c47\u8868\u540c\u65f6\u5305\u542b\u5b8c\u6574\u5355\u8bcd\u548c\u5b50\u8bcd\u7247\u6bb5\u3002
WordPiece\uff08BERT\u4f7f\u7528\uff09\u4e0eBPE\u7c7b\u4f3c\uff0c\u4f46\u57fa\u4e8e\u4f3c\u7136\u800c\u975e\u9891\u7387\u6765\u9009\u62e9\u5408\u5e76\u3002\u5b83\u5408\u5e76\u80fd\u4f7f\u8bad\u7ec3\u6570\u636e\u7684\u8bed\u8a00\u6a21\u578b\u4f3c\u7136\u6700\u5927\u5316\u7684\u5bf9\u3002\u975e\u8bcd\u9996\u7684\u5b50\u8bcd\u8bcd\u5143\u4ee5\"##\"\u4f5c\u4e3a\u524d\u7f00\uff08\u4f8b\u5982\uff0c\"playing\" \u2192 \"play\" + \"##ing\"\uff09\u3002
Unigram\uff08SentencePiece\u4f7f\u7528\uff09\u91c7\u7528\u76f8\u53cd\u7684\u65b9\u6cd5\uff1a\u4ece\u4e00\u4e2a\u5927\u578b\u8bcd\u6c47\u8868\u5f00\u59cb\uff0c\u8fed\u4ee3\u5730\u79fb\u9664\u90a3\u4e9b\u79fb\u9664\u540e\u5bf9\u8bad\u7ec3\u6570\u636e\u4f3c\u7136\u635f\u5931\u6700\u5c0f\u7684\u8bcd\u5143\u3002\u6700\u7ec8\u7684\u8bcd\u6c47\u8868\u662f\u6700\u80fd\u89e3\u91ca\u8bed\u6599\u5e93\u7684\u5b50\u8bcd\u5355\u5143\u96c6\u5408\u3002
SentencePiece\u662f\u4e00\u4e2a\u8bed\u8a00\u65e0\u5173\u7684\u5206\u8bcd\u5e93\uff0c\u5b83\u5c06\u8f93\u5165\u89c6\u4e3a\u539f\u59cb\u5b57\u8282\u6d41\uff08\u4e0d\u5728\u7a7a\u683c\u4e0a\u8fdb\u884c\u9884\u5206\u8bcd\uff09\u3002\u8fd9\u4f7f\u5f97\u5b83\u9002\u7528\u4e8e\u4efb\u4f55\u8bed\u8a00\uff0c\u5305\u62ec\u6ca1\u6709\u7a7a\u683c\u7684\u8bed\u8a00\u3002\u5b83\u540c\u65f6\u5b9e\u73b0\u4e86BPE\u548cUnigram\u7b97\u6cd5\u3002
\u8bcd\u6c47\u8868\u5927\u5c0f\u662f\u4e00\u4e2a\u5173\u952e\u8d85\u53c2\u6570\u3002\u5178\u578b\u7684\u9009\u62e9\u8303\u56f4\u4ece30,000\u5230100,000\u4e2a\u8bcd\u5143\u3002\u66f4\u5927\u7684\u8bcd\u6c47\u8868\u610f\u5473\u7740\u6bcf\u4e2a\u5e8f\u5217\u7684\u8bcd\u5143\u66f4\u5c11\uff08\u66f4\u9ad8\u6548\uff09\uff0c\u4f46\u9700\u8981\u66f4\u5927\u7684\u5d4c\u5165\u8868\u3002\u66f4\u5c0f\u7684\u8bcd\u6c47\u8868\u610f\u5473\u7740\u66f4\u591a\u7684\u5b50\u8bcd\u5206\u5272\u548c\u66f4\u957f\u7684\u5e8f\u5217\u3002
\u4e24\u79cd\u6280\u672f\u90fd\u5c06\u8bcd\u6c47\u7b80\u5316\u4e3a\u57fa\u672c\u5f62\u5f0f\uff0c\u4f46\u65b9\u6cd5\u4e0d\u540c\u3002
\u8bcd\u5e72\u63d0\u53d6\u4f7f\u7528\u7c97\u7565\u89c4\u5219\u5207\u9664\u540e\u7f00\u3002\u6ce2\u7279\u8bcd\u5e72\u63d0\u53d6\u5668\u5c06\"running\"\u7b80\u5316\u4e3a\"run\"\uff0c\"happiness\"\u7b80\u5316\u4e3a\"happi\"\uff0c\"studies\"\u7b80\u5316\u4e3a\"studi\"\u3002\u5b83\u901f\u5ea6\u5feb\u4f46\u4e0d\u7cbe\u786e\uff1a\"university\"\u548c\"universe\"\u90fd\u88ab\u8bcd\u5e72\u5316\u4e3a\"univers\"\uff0c\u5c3d\u7ba1\u5b83\u4eec\u6beb\u4e0d\u76f8\u5173\u3002
\u8bcd\u5f62\u8fd8\u539f\u4f7f\u7528\u8bcd\u6c47\u8868\u548c\u5f62\u6001\u5b66\u5206\u6790\u6765\u627e\u5230\u771f\u6b63\u7684\u8bcd\u5178\u5f62\u5f0f\uff08\u8bcd\u5143\uff09\u3002\"Running\" \u2192 \"run\"\uff0c\"better\" \u2192 \"good\"\uff0c\"mice\" \u2192 \"mouse\"\u3002\u5b83\u9700\u8981\u77e5\u9053\u8bcd\u6027\uff1a\"saw\"\u4f5c\u4e3a\u52a8\u8bcd\u65f6\u8bcd\u5f62\u8fd8\u539f\u4e3a\"see\"\uff0c\u4f46\u4f5c\u4e3a\u540d\u8bcd\u65f6\u4fdd\u6301\u4e3a\"saw\"\u3002
\u73b0\u4ee3\u5b50\u8bcd\u5206\u8bcd\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u5df2\u53d6\u4ee3\u4e86\u795e\u7ecfNLP\u4e2d\u7684\u8bcd\u5e72\u63d0\u53d6\u548c\u8bcd\u5f62\u8fd8\u539f\uff0c\u4f46\u5b83\u4eec\u5728\u4fe1\u606f\u68c0\u7d22\u4ee5\u53ca\u5904\u7406\u8f83\u5c0f\u6a21\u578b\u6216\u6709\u9650\u6570\u636e\u65f6\u4ecd\u7136\u6709\u7528\u3002
\u8bcd\u6027\u6807\u6ce8\u4e3a\u6bcf\u4e2a\u8bcd\u5206\u914d\u4e00\u4e2a\u8bed\u6cd5\u7c7b\u522b\uff1a\u540d\u8bcd\u3001\u52a8\u8bcd\u3001\u5f62\u5bb9\u8bcd\u3001\u9650\u5b9a\u8bcd\u7b49\u3002\u8fd9\u662f\u6700\u53e4\u8001\u7684NLP\u4efb\u52a1\u4e4b\u4e00\uff0c\u4e5f\u662f\u53e5\u6cd5\u5206\u6790\u7684\u57fa\u7840\u3002
\u5bbe\u5dde\u6811\u5e93\u6807\u7b7e\u96c6\u662f\u82f1\u8bed\u4e2d\u6700\u5e38\u7528\u7684\uff0c\u5305\u542b36\u4e2a\u6807\u7b7e\uff08NN\u8868\u793a\u5355\u6570\u540d\u8bcd\uff0cNNS\u8868\u793a\u590d\u6570\u540d\u8bcd\uff0cVB\u8868\u793a\u52a8\u8bcd\u539f\u5f62\uff0cVBD\u8868\u793a\u8fc7\u53bb\u5f0f\uff0cJJ\u8868\u793a\u5f62\u5bb9\u8bcd\u7b49\uff09\u3002
\u8bcd\u6027\u6807\u6ce8\u5f88\u68d8\u624b\uff0c\u56e0\u4e3a\u8bb8\u591a\u8bcd\u662f\u6709\u6b67\u4e49\u7684\u3002\"Book\"\u53ef\u4ee5\u662f\u540d\u8bcd\uff08\"the book\"\uff09\u6216\u52a8\u8bcd\uff08\"book a flight\"\uff09\u3002\"Run\"\u5728\u4e0d\u540c\u8bcd\u6027\u4e0b\u6709\u6570\u5341\u79cd\u542b\u4e49\u3002\u4e0a\u4e0b\u6587\u81f3\u5173\u91cd\u8981\u3002
\u65e9\u671f\u7684\u6807\u6ce8\u5668\u4f7f\u7528\u7b2c05\u7ae0\u4e2d\u7684\u9690\u9a6c\u5c14\u53ef\u592b\u6a21\u578b\uff08HMM\uff09\u3002\u9690\u85cf\u72b6\u6001\u662f\u8bcd\u6027\u6807\u7b7e\uff0c\u89c2\u6d4b\u503c\u662f\u5355\u8bcd\u3002\u8f6c\u79fb\u6982\u7387\u6355\u6349\u6807\u7b7e\u5e8f\u5217\uff08\u9650\u5b9a\u8bcd\u540e\u9762\u5f88\u53ef\u80fd\u8ddf\u540d\u8bcd\u6216\u5f62\u5bb9\u8bcd\uff09\uff0c\u53d1\u5c04\u6982\u7387\u6355\u6349\u54ea\u4e9b\u8bcd\u4e0e\u54ea\u4e9b\u6807\u7b7e\u4e00\u8d77\u51fa\u73b0\u3002\u7ef4\u7279\u6bd4\u7b97\u6cd5\u627e\u51fa\u6700\u53ef\u80fd\u7684\u6807\u7b7e\u5e8f\u5217\u3002
\u7528\u4e8e\u8bcd\u6027\u6807\u6ce8\u7684HMM\u6a21\u578b\uff1a
\u73b0\u4ee3\u8bcd\u6027\u6807\u6ce8\u5668\u4f7f\u7528\u795e\u7ecf\u7f51\u7edc\uff08\u53cc\u5411LSTM\u6216Transformer\uff09\uff0c\u5728\u82f1\u8bed\u4e0a\u8fbe\u5230\u8d85\u8fc797%\u7684\u51c6\u786e\u7387\uff0c\u63a5\u8fd1\u4eba\u7c7b\u6c34\u5e73\u3002
\u547d\u540d\u5b9e\u4f53\u8bc6\u522b\uff08NER\uff09\u8bc6\u522b\u5e76\u5206\u7c7b\u6587\u672c\u4e2d\u7684\u4e13\u6709\u540d\u8bcd\u548c\u5176\u4ed6\u7279\u5b9a\u5b9e\u4f53\uff1a\u4eba\u7269\u3001\u7ec4\u7ec7\u3001\u5730\u70b9\u3001\u65e5\u671f\u3001\u8d27\u5e01\u91d1\u989d\u7b49\u3002
\u5728\"Apple CEO Tim Cook announced the event in Cupertino on Monday\"\u4e2d\uff0cNER\u7cfb\u7edf\u5e94\u8bc6\u522b\u51fa\uff1aApple\uff08ORG\u7ec4\u7ec7\uff09\u3001Tim Cook\uff08PER\u4eba\u7269\uff09\u3001Cupertino\uff08LOC\u5730\u70b9\uff09\u3001Monday\uff08DATE\u65e5\u671f\uff09\u3002
NER\u901a\u5e38\u88ab\u6846\u67b6\u5316\u4e3a\u5e8f\u5217\u6807\u6ce8\uff0c\u4f7f\u7528BIO\u6807\u6ce8\uff08\u4e5f\u79f0\u4e3aIOB\u6807\u6ce8\uff09\u3002\u6bcf\u4e2a\u8bcd\u5143\u83b7\u5f97\u4e00\u4e2a\u6807\u7b7e\uff1a
\"Tim Cook visited New York\"\u53d8\u4e3a\uff1aTim/B-PER Cook/I-PER visited/O New/B-LOC York/I-LOC\u3002B\u6807\u7b7e\u6807\u8bb0\u65b0\u5b9e\u4f53\u7684\u8d77\u59cb\u4f4d\u7f6e\uff0c\u8fd9\u5bf9\u4e8e\u4e24\u4e2a\u540c\u7c7b\u578b\u5b9e\u4f53\u76f8\u90bb\u7684\u60c5\u51b5\u5f88\u91cd\u8981\u3002
\u8fd9\u91cc \\(f_k\\) \u662f\u53d1\u5c04\u7279\u5f81\uff08\u7ed9\u5b9a\u4f4d\u7f6e \\(i\\) \u7684\u8f93\u5165\uff0c\u6807\u7b7e \\(y_i\\) \u7684\u53ef\u80fd\u6027\uff09\uff0c\\(g_j\\) \u662f\u8f6c\u79fb\u7279\u5f81\uff08\u7ed9\u5b9a\u524d\u4e00\u4e2a\u6807\u7b7e \\(y_{i-1}\\)\uff0c\u5f53\u524d\u6807\u7b7e \\(y_i\\) \u7684\u53ef\u80fd\u6027\uff09\u3002
\u914d\u5206\u51fd\u6570 \\(Z(x) = \\\\sum_{y'} \\\\exp(\\\\ldots)\\) \u5bf9\u6240\u6709\u53ef\u80fd\u7684\u6807\u7b7e\u5e8f\u5217\u6c42\u548c\uff0c\u4ee5\u5f52\u4e00\u5316\u5206\u5e03\u3002\u8bad\u7ec3\u6700\u5927\u5316\u6761\u4ef6\u5bf9\u6570\u4f3c\u7136\uff0c\u8fd9\u9700\u8981\u4f7f\u7528\u524d\u5411\u7b97\u6cd5\uff08\u7b2c05\u7ae0\uff09\u9ad8\u6548\u8ba1\u7b97 \\(Z(x)\\)\u3002
\u4e0e\u72ec\u7acb\u5206\u7c7b\u6bcf\u4e2a\u8bcd\u5143\u76f8\u6bd4\u7684\u5173\u952e\u4f18\u52bf\uff1aCRF\u7684\u8f6c\u79fb\u7279\u5f81\u5f3a\u5236\u7ed3\u6784\u7ea6\u675f\uff08\u4f8b\u5982\uff0cI-PER\u5e94\u8be5\u53ea\u8ddf\u5728B-PER\u6216I-PER\u4e4b\u540e\uff0c\u7edd\u4e0d\u5e94\u51fa\u73b0\u5728O\u4e4b\u540e\uff09\u3002
\u73b0\u4ee3NER\u5c06CRF\u5806\u53e0\u5728\u795e\u7ecf\u7f16\u7801\u5668\u4e4b\u4e0a\uff08BiLSTM-CRF\u6216BERT-CRF\uff09\uff0c\u5176\u4e2d\u795e\u7ecf\u7f51\u7edc\u4ea7\u751f\u53d1\u5c04\u5206\u6570\uff0cCRF\u5c42\u5b66\u4e60\u8f6c\u79fb\u7ed3\u6784\u3002
\u53e5\u6cd5\u5206\u6790\u5c06\u53e5\u5b50\u8f6c\u6362\u4e3a\u5176\u53e5\u6cd5\u7ed3\u6784\uff0c\u53ef\u4ee5\u662f\u6210\u5206\u6811\u6216\u4f9d\u5b58\u6811\uff08\u4e24\u8005\u5747\u89c1\u6587\u4ef601\uff09\u3002
CYK\u7b97\u6cd5\uff08Cocke-Younger-Kasami\uff09\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u7ed3\u5408\u4e0a\u4e0b\u6587\u65e0\u5173\u6587\u6cd5\u89e3\u6790\u53e5\u5b50\u3002
\u5b83\u8981\u6c42\u6587\u6cd5\u4e3a\u4e54\u59c6\u65af\u57fa\u8303\u5f0f\uff08\u6bcf\u6761\u89c4\u5219\u7684\u53f3\u4fa7\u8981\u4e48\u6709\u4e24\u4e2a\u975e\u7ec8\u7ed3\u7b26\uff0c\u8981\u4e48\u6709\u4e00\u4e2a\u7ec8\u7ed3\u7b26\uff09\u3002\u5b83\u81ea\u5e95\u5411\u4e0a\u586b\u5145\u4e00\u4e2a\u4e09\u89d2\u8868\u683c\uff1a\u5355\u5143\u683c\u8868\u793a\u53e5\u5b50\u7684\u8de8\u5ea6\uff0c\u6bcf\u4e2a\u5355\u5143\u683c\u5b58\u50a8\u53ef\u4ee5\u751f\u6210\u8be5\u8de8\u5ea6\u7684\u975e\u7ec8\u7ed3\u7b26\u3002
CYK\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n^3 \\\\cdot |G|)\\)\uff0c\u5176\u4e2d \\(n\\) \u662f\u53e5\u5b50\u957f\u5ea6\uff0c\\(|G|\\) \u662f\u6587\u6cd5\u89c4\u6a21\u3002\u8fd9\u662f\u7cbe\u786e\u7b97\u6cd5\uff0c\u4f46\u5bf9\u4e8e\u5927\u578b\u6587\u6cd5\u6765\u8bf4\u901f\u5ea6\u8f83\u6162\u3002
\u79fb\u8fdb-\u5f52\u7ea6\u89e3\u6790\u4ece\u5de6\u5230\u53f3\u5904\u7406\u53e5\u5b50\uff0c\u7ef4\u62a4\u4e00\u4e2a\u6808\u3002\u5728\u6bcf\u4e00\u6b65\uff0c\u5b83\u8981\u4e48\u79fb\u8fdb\uff08\u5c06\u4e0b\u4e00\u4e2a\u8bcd\u538b\u5165\u6808\uff09\uff0c\u8981\u4e48\u5f52\u7ea6\uff08\u4ece\u6808\u4e2d\u5f39\u51fa\u5143\u7d20\u5e76\u7528\u77ed\u8bed\u66ff\u6362\uff09\u3002\u4e00\u4e2a\u8bad\u7ec3\u597d\u7684\u5206\u7c7b\u5668\u5728\u6bcf\u4e00\u6b65\u51b3\u5b9a\u64cd\u4f5c\u3002\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\uff0c\u6bd4CYK\u5feb\u5f97\u591a\u3002
\u4f9d\u5b58\u89e3\u6790\u5728\u5b9e\u8df5\u4e2d\u6bd4\u6210\u5206\u89e3\u6790\u66f4\u4e3a\u5e38\u89c1\u3002\u57fa\u4e8e\u8f6c\u6362\u7684\u4f9d\u5b58\u89e3\u6790\u5668\uff08\u5982\u79fb\u8fdb-\u5f52\u7ea6\uff09\u548c\u57fa\u4e8e\u56fe\u7684\u89e3\u6790\u5668\uff08\u5bf9\u6240\u6709\u53ef\u80fd\u7684\u8fb9\u8bc4\u5206\u5e76\u627e\u5230\u6700\u5927\u751f\u6210\u6811\uff09\u662f\u4e24\u79cd\u4e3b\u8981\u65b9\u6cd5\u3002\u4f7f\u7528BiLSTM\u6216Transformer\u7684\u795e\u7ecf\u4f9d\u5b58\u89e3\u6790\u5668\u53d6\u5f97\u4e86\u6700\u5148\u8fdb\u7684\u6210\u679c\u3002
\u5728\u5d4c\u5165\u51fa\u73b0\u4e4b\u524d\uff0cNLP\u4f7f\u7528\u7b80\u5355\u7684\u8ba1\u6570\u65b9\u6cd5\u5c06\u6587\u6863\u8868\u793a\u4e3a\u5411\u91cf\u3002
\u8bcd\u888b\u6a21\u578b\uff08BoW\uff09\u5c06\u6587\u6863\u8868\u793a\u4e3a\u8bcd\u9891\u5411\u91cf\uff0c\u5b8c\u5168\u5ffd\u7565\u8bcd\u5e8f\u3002\u5982\u679c\u8bcd\u6c47\u8868\u6709 \\(V\\) \u4e2a\u8bcd\uff0c\u6bcf\u4e2a\u6587\u6863\u5c31\u662f \\(\\\\mathbb{R}^V\\) \u7a7a\u95f4\u4e2d\u7684\u4e00\u4e2a\u5411\u91cf\uff08\u4e0e\u7b2c01\u7ae0\u7684\u5411\u91cf\u7a7a\u95f4\u76f8\u8054\u7cfb\uff09\u3002\u8bcd \\(w\\) \u5bf9\u5e94\u7684\u6761\u76ee\u662f \\(w\\) \u5728\u6587\u6863\u4e2d\u51fa\u73b0\u7684\u6b21\u6570\u3002
BoW\u7b80\u5355\u4f46\u51fa\u5947\u6709\u6548\uff0c\u9002\u7528\u4e8e\u6587\u6863\u5206\u7c7b\u548c\u5783\u573e\u90ae\u4ef6\u8fc7\u6ee4\u7b49\u4efb\u52a1\u3002\u5176\u4e3b\u8981\u7f3a\u70b9\u662f\u6bcf\u4e2a\u8bcd\u90fd\u88ab\u540c\u7b49\u5bf9\u5f85\uff1a\"the\"\u548c\"revolutionary\"\u83b7\u5f97\u76f8\u540c\u7684\u6743\u91cd\u3002
TF-IDF\uff08\u8bcd\u9891-\u9006\u6587\u6863\u9891\u7387\uff09\u901a\u8fc7\u6839\u636e\u8bcd\u7684\u4fe1\u606f\u91cf\u5927\u5c0f\u6765\u52a0\u6743\uff0c\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002\u5728\u5355\u4e2a\u6587\u6863\u4e2d\u9891\u7e41\u51fa\u73b0\u4f46\u5728\u6574\u4e2a\u8bed\u6599\u5e93\u4e2d\u7f55\u89c1\u7684\u8bcd\uff0c\u5f88\u53ef\u80fd\u5bf9\u8be5\u6587\u6863\u5f88\u91cd\u8981\u3002
\u8bcd\u9891 \\(\\\\text{TF}(t, d)\\) \u901a\u5e38\u662f\u8bcd \\(t\\) \u5728\u6587\u6863 \\(d\\) \u4e2d\u7684\u539f\u59cb\u8ba1\u6570\uff08\u6216\u5176\u5bf9\u6570\u5f62\u5f0f\uff1a\\(1 + \\\\log(\\\\text{count})\\)\uff09\u3002
\u9006\u6587\u6863\u9891\u7387 \\(\\\\text{IDF}(t) = \\\\log\\\\frac{N}{|\\\\{d : t \\\\in d\\\\}|}\\)\uff0c\u5176\u4e2d \\(N\\) \u662f\u6587\u6863\u603b\u6570\u3002\u51fa\u73b0\u5728\u6bcf\u4e2a\u6587\u6863\u4e2d\u7684\u8bcd\uff08\u5982\"the\"\uff09\u7684IDF\u63a5\u8fd10\u3002\u7f55\u89c1\u8bcd\u83b7\u5f97\u9ad8IDF\u3002
TF-IDF\u5411\u91cf\u53ef\u4ee5\u4f7f\u7528\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff08\u6765\u81ea\u7b2c01\u7ae0\uff09\u8fdb\u884c\u6bd4\u8f83\uff0c\u4ee5\u8861\u91cf\u6587\u6863\u76f8\u4f3c\u6027\u3002\u8fd9\u662f\u7ecf\u5178\u4fe1\u606f\u68c0\u7d22\u548c\u641c\u7d22\u5f15\u64ce\u7684\u57fa\u7840\u3002
\u8bed\u8a00\u6a21\u578b\u4e3a\u8bcd\u5e8f\u5217\u5206\u914d\u6982\u7387\u3002\u5b83\u56de\u7b54\u7684\u662f\uff1a\u8fd9\u4e2a\u53e5\u5b50\u7684\u53ef\u80fd\u6027\u6709\u591a\u5927\uff1f\u8bed\u8a00\u6a21\u578b\u662f\u673a\u5668\u7ffb\u8bd1\u3001\u8bed\u97f3\u8bc6\u522b\u3001\u62fc\u5199\u7ea0\u6b63\u548c\u6587\u672c\u751f\u6210\u7684\u6838\u5fc3\u3002
\u53e5\u5b50 \\(w_1, w_2, \\\\ldots, w_n\\) \u7684\u6982\u7387\uff0c\u6839\u636e\u6982\u7387\u7684\u94fe\u5f0f\u6cd5\u5219\uff08\u7b2c05\u7ae0\uff09\u4e3a\uff1a
\u8fd9\u662f\u7cbe\u786e\u7684\u4f46\u4e0d\u5b9e\u7528\uff1a\u4f60\u9700\u8981\u4e3a\u6bcf\u4e2a\u53ef\u80fd\u7684\u5386\u53f2\u5b58\u50a8\u6982\u7387\u3002\u9a6c\u5c14\u53ef\u592b\u5047\u8bbe\uff08\u7b2c05\u7ae0\uff09\u5c06\u5386\u53f2\u622a\u65ad\u5230\u6700\u8fd1 \\(k-1\\) \u4e2a\u8bcd\uff0c\u5f97\u5230 n\u5143\u8bed\u6cd5\u6a21\u578b\uff08\u5176\u4e2d \\(n = k\\)\uff09\u3002
\u4e8c\u5143\u6a21\u578b\uff08\\(n = 2\\)\uff09\u4ec5\u4f9d\u8d56\u524d\u4e00\u4e2a\u8bcd\uff1a
\u56f0\u60d1\u5ea6\u8d8a\u4f4e\uff0c\u8bf4\u660e\u6a21\u578b\u5bf9\u6d4b\u8bd5\u6570\u636e\u8d8a\"\u4e0d\u60ca\u8bb6\"\uff0c\u56e0\u6b64\u6027\u80fd\u8d8a\u597d\u3002\u572810,000\u8bcd\u8bcd\u6c47\u8868\u4e0a\u5206\u914d\u5747\u5300\u6982\u7387\u7684\u6a21\u578b\uff0c\u56f0\u60d1\u5ea6\u4e3a10,000\u3002\u4e00\u4e2a\u597d\u7684\u4e8c\u5143\u6a21\u578b\u53ef\u80fd\u8fbe\u5230\u7ea6200\u7684\u56f0\u60d1\u5ea6\u3002\u73b0\u4ee3\u795e\u7ecf\u8bed\u8a00\u6a21\u578b\u7684\u56f0\u60d1\u5ea6\u4f4e\u4e8e20\u3002
\u6ce8\u610f\uff0c\u56f0\u60d1\u5ea6\u662f\u6307\u6570\u5316\u7684\u4ea4\u53c9\u71b5\uff08\u6765\u81ea\u7b2c05\u7ae0\u7684\u4fe1\u606f\u8bba\u90e8\u5206\uff09\u3002\u8bad\u7ec3\u671f\u95f4\u6700\u5c0f\u5316\u4ea4\u53c9\u71b5\u635f\u5931\u76f4\u63a5\u6700\u5c0f\u5316\u56f0\u60d1\u5ea6\u3002
\u5e73\u6ed1\u5904\u7406\u96f6\u6982\u7387\u95ee\u9898\uff1a\u5982\u679c\u67d0\u4e2an\u5143\u7ec4\u4ece\u672a\u5728\u8bad\u7ec3\u4e2d\u51fa\u73b0\u8fc7\uff0c\u6a21\u578b\u4f1a\u8d4b\u4e88\u5b83\u6982\u73870\uff0c\u8fd9\u4f1a\u4f7f\u6574\u4e2a\u53e5\u5b50\u7684\u6982\u7387\u4e3a0\u3002\u62c9\u666e\u62c9\u65af\u5e73\u6ed1\uff08\u52a01\uff09\u4e3a\u6bcf\u4e2an\u5143\u7ec4\u6dfb\u52a0\u4e00\u4e2a\u5c0f\u8ba1\u6570\uff1a
\u5bf9\u4e8e\u5927\u8bcd\u6c47\u8868\u6765\u8bf4\u8fd9\u8fc7\u4e8e\u6fc0\u8fdb\uff08\u4ece\u5df2\u89c2\u5bdf\u5230\u7684n\u5143\u7ec4\u4e2d\u632a\u8d70\u4e86\u592a\u591a\u6982\u7387\uff09\u3002Kneser-Ney\u5e73\u6ed1\u662fn\u5143\u8bed\u6cd5\u6a21\u578b\u7684\u91d1\u6807\u51c6\u3002\u5b83\u7ed3\u5408\u4e86\u4e24\u4e2a\u601d\u60f3\uff1a\u7edd\u5bf9\u6298\u6263\u548c\u7528\u4e8e\u56de\u9000\u7684\u5ef6\u7eed\u6982\u7387\u3002
\u9996\u5148\uff0c\u7edd\u5bf9\u6298\u6263\u4ece\u6bcf\u4e2a\u89c2\u5bdf\u5230\u7684\u8ba1\u6570\u4e2d\u51cf\u53bb\u4e00\u4e2a\u56fa\u5b9a\u6298\u6263 \\(d\\)\uff08\u901a\u5e38 \\(d \\\\approx 0.75\\)\uff09\uff0c\u800c\u4e0d\u662f\u6dfb\u52a0\u4f2a\u8ba1\u6570\u3002\u91ca\u653e\u51fa\u7684\u6982\u7387\u8d28\u91cf\u91cd\u65b0\u5206\u914d\u7ed9\u672a\u89c1\u8fc7\u7684n\u5143\u7ec4\u3002\u63d2\u503c\u5f62\u5f0f\u4e3a\uff1a
\u5206\u5b50\u7edf\u8ba1\u5728\u8bed\u6599\u5e93\u4e2d\u51fa\u73b0\u5728 \\(w_i\\) \u4e4b\u524d\u7684\u4e0d\u540c\u8bcd\u7684\u6570\u91cf\u3002\u50cf\"Francisco\"\u8fd9\u6837\u7684\u8bcd\u51fa\u73b0\u5728\u5f88\u5c11\u7684\u4e0a\u4e0b\u6587\u4e2d\uff08\u51e0\u4e4e\u603b\u662f\u5728\"San\"\u4e4b\u540e\uff09\uff0c\u6240\u4ee5\u5373\u4f7f\"San Francisco\"\u975e\u5e38\u9891\u7e41\uff0c\"Francisco\"\u7684\u5ef6\u7eed\u6982\u7387\u4e5f\u5f88\u4f4e\uff0c\u4e0d\u4f1a\u5728\u5176\u4ed6\u4e0a\u4e0b\u6587\u4e2d\u88ab\u9519\u8bef\u9884\u6d4b\u3002
\u76f8\u53cd\uff0c\u50cf\"the\"\u8fd9\u6837\u7684\u5e38\u89c1\u8bcd\u51fa\u73b0\u5728\u8bb8\u591a\u4e0d\u540c\u8bcd\u4e4b\u540e\uff0c\u83b7\u5f97\u9ad8\u5ef6\u7eed\u6982\u7387\u3002\u8fd9\u4f53\u73b0\u4e86\u8fd9\u6837\u4e00\u79cd\u76f4\u89c9\uff1a\u5bf9\u4e8e\u56de\u9000\u4f30\u8ba1\u800c\u8a00\uff0c\u8bcd\u7684\u591a\u529f\u80fd\u6027\u6bd4\u5176\u539f\u59cb\u9891\u7387\u66f4\u91cd\u8981\u3002
n\u5143\u8bed\u6cd5\u6a21\u578b\u51e0\u5341\u5e74\u6765\u4e00\u76f4\u662f\u4e3b\u6d41\u6280\u672f\u3002\u5b83\u4eec\u901f\u5ea6\u5feb\u3001\u53ef\u89e3\u91ca\u6027\u5f3a\uff0c\u4e14\u65e0\u9700\u8bad\u7ec3\uff08\u53ea\u9700\u8ba1\u6570\uff09\u3002\u4f46\u5b83\u4eec\u96be\u4ee5\u5904\u7406\u957f\u8ddd\u79bb\u4f9d\u8d56\uff08\"The keys that I left on the table are missing\"\u9700\u8981\u77e5\u9053\u4e3b\u8bed\"keys\"\u662f\u590d\u6570\uff0c\u800c\u5b83\u4e0e\u52a8\u8bcd\u76f8\u8ddd\u751a\u8fdc\uff09\u3002\u795e\u7ecf\u8bed\u8a00\u6a21\u578b\u2014\u2014\u4eceRNN\u5f00\u59cb\u5230Transformer\u8fbe\u5230\u9876\u5cf0\u2014\u2014\u89e3\u51b3\u4e86\u8fd9\u4e00\u5c40\u9650\u6027\u3002
\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u5b9e\u73b0\u83b1\u6587\u65af\u5766\u7f16\u8f91\u8ddd\u79bb\u3002\u5728\u8bcd\u5bf9\u4e0a\u6d4b\u8bd5\uff0c\u5e76\u7528\u4e8e\u7b80\u5355\u7684\u62fc\u5199\u7ea0\u6b63\u3002
import jax.numpy as jnp\n\ndef edit_distance(s, t):\n \"\"\"Compute Levenshtein edit distance using DP.\"\"\"\n m, n = len(s), len(t)\n D = [[0] * (n + 1) for _ in range(m + 1)]\n\n for i in range(m + 1):\n D[i][0] = i\n for j in range(n + 1):\n D[0][j] = j\n\n for i in range(1, m + 1):\n for j in range(1, n + 1):\n if s[i-1] == t[j-1]:\n D[i][j] = D[i-1][j-1]\n else:\n D[i][j] = 1 + min(D[i-1][j], D[i][j-1], D[i-1][j-1])\n\n return D[m][n]\n\n# Test\npairs = [(\"kitten\", \"sitting\"), (\"sunday\", \"saturday\"), (\"hello\", \"hallo\")]\nfor s, t in pairs:\n print(f\"d('{s}', '{t}') = {edit_distance(s, t)}\")\n\n# Simple spelling correction\ndictionary = [\"the\", \"their\", \"there\", \"then\", \"than\", \"this\", \"that\", \"these\", \"those\"]\nmisspelled = \"thier\"\ncorrections = sorted(dictionary, key=lambda w: edit_distance(misspelled, w))\nprint(f\"\\nClosest to '{misspelled}': {corrections[:3]}\")\n \u4ece\u5934\u5b9e\u73b0BPE\u5206\u8bcd\u3002\u4ece\u5b57\u7b26\u7ea7\u8bcd\u5143\u5f00\u59cb\uff0c\u8fed\u4ee3\u5730\u5408\u5e76\u6700\u9891\u7e41\u7684\u5bf9\u3002
from collections import Counter\n\ndef get_pairs(corpus):\n \"\"\"Count adjacent token pairs across all words.\"\"\"\n pairs = Counter()\n for word, freq in corpus.items():\n symbols = word.split()\n for i in range(len(symbols) - 1):\n pairs[(symbols[i], symbols[i+1])] += freq\n return pairs\n\ndef merge_pair(pair, corpus):\n \"\"\"Merge all occurrences of a pair in the corpus.\"\"\"\n new_corpus = {}\n bigram = ' '.join(pair)\n replacement = ''.join(pair)\n for word, freq in corpus.items():\n new_word = word.replace(bigram, replacement)\n new_corpus[new_word] = freq\n return new_corpus\n\n# Training corpus with word frequencies\ntext = \"low low low low low lower lower newest newest newest newest newest newest\"\nword_freqs = Counter(text.split())\n# Initialise: split each word into characters with end-of-word marker\ncorpus = {' '.join(word) + ' _': freq for word, freq in word_freqs.items()}\n\nprint(\"Initial corpus:\")\nfor word, freq in corpus.items():\n print(f\" {word}: {freq}\")\n\n# Run BPE for 10 merges\nfor i in range(10):\n pairs = get_pairs(corpus)\n if not pairs:\n break\n best_pair = max(pairs, key=pairs.get)\n corpus = merge_pair(best_pair, corpus)\n print(f\"\\nMerge {i+1}: {best_pair} (freq={pairs[best_pair]})\")\n for word, freq in corpus.items():\n print(f\" {word}: {freq}\")\n \u6784\u5efa\u4e00\u4e2a\u4e8c\u5143\u8bed\u8a00\u6a21\u578b\uff0c\u5e76\u8ba1\u7b97\u6d4b\u8bd5\u53e5\u5b50\u7684\u56f0\u60d1\u5ea6\u3002\u5c1d\u8bd5\u62c9\u666e\u62c9\u65af\u5e73\u6ed1\u3002
from collections import Counter, defaultdict\nimport math\n\n# Training corpus\ntrain = \"\"\"the cat sat on the mat . the dog chased the cat .\nthe cat ran from the dog . a dog sat on a mat .\"\"\".split()\n\n# Count bigrams and unigrams\nbigrams = Counter(zip(train[:-1], train[1:]))\nunigrams = Counter(train)\nvocab_size = len(set(train))\n\ndef bigram_prob(w2, w1, alpha=0):\n \"\"\"P(w2 | w1) with optional Laplace smoothing.\"\"\"\n return (bigrams[(w1, w2)] + alpha) / (unigrams[w1] + alpha * vocab_size)\n\n# Compute perplexity\ntest = \"the cat sat on a mat .\".split()\n\nfor alpha in [0, 1, 0.1]:\n log_prob = 0\n for w1, w2 in zip(test[:-1], test[1:]):\n p = bigram_prob(w2, w1, alpha=alpha)\n if p > 0:\n log_prob += math.log(p)\n else:\n log_prob += float('-inf')\n\n ppl = math.exp(-log_prob / (len(test) - 1)) if log_prob > float('-inf') else float('inf')\n print(f\"Smoothing \u03b1={alpha}: perplexity = {ppl:.2f}\")\n \u4ece\u5934\u5b9e\u73b0TF-IDF\uff0c\u5e76\u4f7f\u7528\u4f59\u5f26\u76f8\u4f3c\u5ea6\u627e\u5230\u4e0e\u67e5\u8be2\u6700\u76f8\u4f3c\u7684\u6587\u6863\u3002
import jax.numpy as jnp\nimport math\nfrom collections import Counter\n\ndocuments = [\n \"the cat sat on the mat\",\n \"the dog chased the cat around the park\",\n \"a mat was placed on the floor by the door\",\n \"the quick brown fox jumped over the lazy dog\",\n]\n\n# Build vocabulary\nvocab = sorted(set(word for doc in documents for word in doc.split()))\nword_to_idx = {w: i for i, w in enumerate(vocab)}\nV = len(vocab)\nN = len(documents)\n\n# Compute TF-IDF matrix\ndoc_freq = Counter()\nfor doc in documents:\n for word in set(doc.split()):\n doc_freq[word] += 1\n\ntfidf_matrix = jnp.zeros((N, V))\nfor i, doc in enumerate(documents):\n word_counts = Counter(doc.split())\n for word, count in word_counts.items():\n tf = 1 + math.log(count)\n idf = math.log(N / doc_freq[word])\n j = word_to_idx[word]\n tfidf_matrix = tfidf_matrix.at[i, j].set(tf * idf)\n\n# Query\nquery = \"cat on the mat\"\nquery_vec = jnp.zeros(V)\nquery_counts = Counter(query.split())\nfor word, count in query_counts.items():\n if word in word_to_idx:\n tf = 1 + math.log(count)\n idf = math.log(N / doc_freq.get(word, 1))\n query_vec = query_vec.at[word_to_idx[word]].set(tf * idf)\n\n# Cosine similarity (from chapter 01)\ndef cosine_sim(a, b):\n return jnp.dot(a, b) / (jnp.linalg.norm(a) * jnp.linalg.norm(b) + 1e-8)\n\nprint(f\"Query: '{query}'\\n\")\nfor i, doc in enumerate(documents):\n sim = cosine_sim(query_vec, tfidf_matrix[i])\n print(f\" Doc {i} (sim={sim:.3f}): '{doc}'\")\n \u8bcd\u5d4c\u5165\u5c06\u7a00\u758f\u7684\u7b26\u53f7\u5316\u6587\u672c\u538b\u7f29\u5230\u7a20\u5bc6\u5411\u91cf\u7a7a\u95f4\u4e2d\uff0c\u4f7f\u5f97\u8bed\u4e49\u76f8\u4f3c\u6027\u8f6c\u5316\u4e3a\u51e0\u4f55\u90bb\u8fd1\u6027\u3002\u672c\u6587\u6db5\u76d6 Word2Vec\uff08CBOW\u3001Skip-gram\uff09\u3001GloVe\u3001FastText\u3001RNN\u3001LSTM\u3001GRU\u3001\u5e26\u6ce8\u610f\u529b\u673a\u5236\u7684 seq2seq\u3001\u7f16\u7801\u5668-\u89e3\u7801\u5668\u8303\u5f0f\uff0c\u4ee5\u53ca\u4ece\u8bcd\u888b\u6a21\u578b\u5230\u4e0a\u4e0b\u6587\u8868\u793a\u7684\u53d1\u5c55\u5386\u7a0b\u3002
\u5728\u6587\u4ef6 01 \u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86\u5206\u5e03\u5047\u8bbe\uff1a\u51fa\u73b0\u5728\u76f8\u4f3c\u8bed\u5883\u4e2d\u7684\u8bcd\u5f80\u5f80\u5177\u6709\u76f8\u4f3c\u7684\u542b\u4e49\u3002\u5728\u6587\u4ef6 02 \u4e2d\uff0c\u6211\u4eec\u4f7f\u7528\u7a00\u758f\u7684\u3001\u624b\u5de5\u8bbe\u8ba1\u7684\u7279\u5f81\uff08\u5982 TF-IDF \u5411\u91cf\uff09\u6765\u8868\u793a\u6587\u672c\u3002\u8fd9\u4e9b\u5411\u91cf\u4f4d\u4e8e\u6781\u9ad8\u7ef4\u7a7a\u95f4\u4e2d\uff08\u6bcf\u4e2a\u8bcd\u6c47\u8868\u8bcd\u5360\u4e00\u7ef4\uff09\uff0c\u4e14\u5927\u90e8\u5206\u4e3a\u96f6\u3002\u8bcd\u5d4c\u5165\u5c06\u8fd9\u4e9b\u4fe1\u606f\u538b\u7f29\u5230\u7a20\u5bc6\u7684\u4f4e\u7ef4\u5411\u91cf\u4e2d\uff0c\u6355\u6349\u8bed\u4e49\u5173\u7cfb\uff0c\u5e76\u4e14\u76f4\u63a5\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u3002
Word2Vec\uff08Mikolov et al., 2013\uff09\u901a\u8fc7\u5728\u7b80\u5355\u7684\u9884\u6d4b\u4efb\u52a1\u4e0a\u8bad\u7ec3\u4e00\u4e2a\u6d45\u5c42\u795e\u7ecf\u7f51\u7edc\u6765\u5b66\u4e60\u8bcd\u5d4c\u5165\u3002\u5171\u6709\u4e24\u79cd\u67b6\u6784\u3002
\u8fde\u7eed\u8bcd\u888b\u6a21\u578b\uff08CBOW\uff09\u6839\u636e\u76ee\u6807\u8bcd\u5468\u56f4\u7684\u4e0a\u4e0b\u6587\u8bcd\u6765\u9884\u6d4b\u8be5\u8bcd\u3002\u7ed9\u5b9a\u4e00\u4e2a\u7a97\u53e3\u5927\u5c0f\u7684\u4e0a\u4e0b\u6587\u8bcd\uff08\u4f8b\u5982\uff0c\"the cat ___ on the\"\uff09\uff0c\u6a21\u578b\u6c42\u5b83\u4eec\u7684\u5d4c\u5165\u5411\u91cf\u7684\u5e73\u5747\u503c\uff0c\u5e76\u5c06\u7ed3\u679c\u901a\u8fc7\u4e00\u4e2a\u7ebf\u6027\u5c42\u6765\u9884\u6d4b\u7f3a\u5931\u7684\u8bcd\uff08\"sat\"\uff09\u3002\u8bad\u7ec3\u76ee\u6807\u6700\u5927\u5316\uff1a
Skip-gram \u901a\u5e38\u5bf9\u7f55\u89c1\u8bcd\u6548\u679c\u66f4\u597d\uff0c\u56e0\u4e3a\u6bcf\u4e2a\u8bcd\u4f1a\u4ea7\u751f\u591a\u4e2a\u8bad\u7ec3\u6837\u672c\uff08\u6bcf\u4e2a\u4e0a\u4e0b\u6587\u4f4d\u7f6e\u4e00\u4e2a\uff09\u3002CBOW \u901f\u5ea6\u66f4\u5feb\uff0c\u5bf9\u9891\u7e41\u8bcd\u7565\u4f18\uff0c\u56e0\u4e3a\u5b83\u5bf9\u591a\u4e2a\u4e0a\u4e0b\u6587\u4fe1\u53f7\u53d6\u5e73\u5747\u3002
\u5728\u6574\u4e2a\u8bcd\u6c47\u8868\u4e0a\u8bad\u7ec3\u4ee3\u4ef7\u5f88\u9ad8\uff0c\u56e0\u4e3a softmax \u5206\u6bcd\u9700\u8981\u5bf9\u6240\u6709 \\(V\\) \u4e2a\u8bcd\u6c42\u548c\u3002\u8d1f\u91c7\u6837\u901a\u8fc7\u5c06\u95ee\u9898\u8f6c\u5316\u4e3a\u4e8c\u5206\u7c7b\u6765\u8fd1\u4f3c\u8fd9\u4e00\u8fc7\u7a0b\uff1a\u533a\u5206\u771f\u5b9e\u7684\u4e0a\u4e0b\u6587\u8bcd\uff08\u6b63\u6837\u672c\uff09\u4e0e\u968f\u673a\u91c7\u6837\u7684\u566a\u58f0\u8bcd\uff08\u8d1f\u6837\u672c\uff09\u3002\u6a21\u578b\u65e0\u9700\u8ba1\u7b97\u5b8c\u6574\u7684 softmax\uff0c\u53ea\u9700\u66f4\u65b0\u76ee\u6807\u8bcd\u3001\u771f\u5b9e\u4e0a\u4e0b\u6587\u8bcd\u4ee5\u53ca\u5c11\u6570\u8d1f\u6837\u672c\u7684\u5d4c\u5165\uff1a
\u8fd9\u91cc \\(v_{w_I}\\) \u662f\u8f93\u5165\u8bcd\u5d4c\u5165\uff0c\\(v_{w_O}\\) \u662f\u8f93\u51fa\uff08\u4e0a\u4e0b\u6587\uff09\u8bcd\u5d4c\u5165\uff0c\\(P_n\\) \u662f\u566a\u58f0\u5206\u5e03\uff0c\u901a\u5e38\u91c7\u7528\u8bcd\u9891\u7684 3/4 \u6b21\u65b9\uff08\u8fd9\u4f1a\u964d\u4f4e\"the\"\u8fd9\u7c7b\u9ad8\u9891\u8bcd\u7684\u6743\u91cd\uff09\u3002
\u4e3a\u4ec0\u4e48\u8fd9\u4e2a\u7b80\u5355\u7684\u76ee\u6807\u51fd\u6570\u80fd\u4ea7\u751f\u6709\u610f\u4e49\u7684\u5d4c\u5165\uff1fLevy \u548c Goldberg\uff082014\uff09\u8bc1\u660e\uff0c\u5e26\u8d1f\u91c7\u6837\u7684 skip-gram \u5b9e\u9645\u4e0a\u662f\u5728\u5206\u89e3\u4e00\u4e2a\u79fb\u4f4d\u70b9\u4e92\u4fe1\u606f\uff08PMI\uff09\u77e9\u9635\u3002\u5728\u6536\u655b\u65f6\uff0c\u4e24\u4e2a\u8bcd\u5411\u91cf\u7684\u70b9\u79ef\u8fd1\u4f3c\u4e8e\uff1a
\u5176\u4e2d \\(\\text{PMI}(w, c) = \\log \\frac{P(w, c)}{P(w) P(c)}\\) \u8861\u91cf\u8bcd \\(w\\) \u548c \\(c\\) \u5171\u73b0\u7684\u9891\u7387\u6bd4\u968f\u673a\u671f\u671b\u9ad8\u51fa\u591a\u5c11\uff08\u89c1\u7b2c 05 \u7ae0\u4fe1\u606f\u8bba\uff09\uff0c\\(k\\) \u662f\u8d1f\u6837\u672c\u6570\u91cf\u3002\u5171\u73b0\u8fdc\u9ad8\u4e8e\u968f\u673a\u671f\u671b\u7684\u8bcd\u5177\u6709\u9ad8 PMI\uff0c\u4ece\u800c\u5177\u6709\u9ad8\u70b9\u79ef\uff08\u76f8\u4f3c\u7684\u5d4c\u5165\uff09\u3002\u5171\u73b0\u4f4e\u4e8e\u9884\u671f\u7684\u8bcd\u5177\u6709\u8d1f PMI \u548c\u4e0d\u76f8\u4f3c\u7684\u5d4c\u5165\u3002\u8fd9\u8868\u660e Word2Vec \u5b9e\u9645\u4e0a\u4e0e\u7ecf\u5178\u7684\u5206\u5e03\u8bed\u4e49\u5b66\u65b9\u6cd5\uff08\u5982\u6f5c\u5728\u8bed\u4e49\u5206\u6790\uff0c\u5373\u5bf9\u5171\u73b0\u77e9\u9635\u505a SVD\uff09\u5728\u505a\u540c\u6837\u7684\u4e8b\u60c5\uff0c\u53ea\u662f\u91c7\u7528\u4e86\u66f4\u5177\u6269\u5c55\u6027\u7684\u5728\u7ebf\u65b9\u5f0f\u3002
Word2Vec \u5d4c\u5165\u6700\u4ee4\u4eba\u60ca\u8bb6\u7684\u7279\u6027\u662f\u5b83\u4eec\u80fd\u901a\u8fc7\u5411\u91cf\u7b97\u672f\u6355\u6349\u7c7b\u6bd4\u5173\u7cfb\u3002\u5411\u91cf \\(v_{\\text{king}} - v_{\\text{man}} + v_{\\text{woman}}\\) \u6700\u63a5\u8fd1 \\(v_{\\text{queen}}\\)\u3002\u8fd9\u662f\u56e0\u4e3a\u5d4c\u5165\u7a7a\u95f4\u5c06\u8bed\u4e49\u5173\u7cfb\u7f16\u7801\u4e3a\u8fd1\u4f3c\u7ebf\u6027\u65b9\u5411\uff1a\"\u738b\u5ba4\"\u65b9\u5411\u5927\u81f4\u4e3a \\(v_{\\text{king}} - v_{\\text{man}}\\)\uff0c\u5c06\u5176\u52a0\u5230 \\(v_{\\text{woman}}\\) \u4e0a\u5c31\u4f1a\u843d\u5728 \\(v_{\\text{queen}}\\) \u9644\u8fd1\u3002\u8fd9\u4e0e\u7b2c 01 \u7ae0\u7684\u7ebf\u6027\u4ee3\u6570\u76f8\u5173\u8054\uff1a\u8bed\u4e49\u5173\u7cfb\u5c31\u662f\u5411\u91cf\u5e73\u79fb\u3002
GloVe\uff08Global Vectors for Word Representation\uff0cPennington et al., 2014\uff09\u91c7\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\u3002\u5b83\u4e0d\u662f\u4e00\u6b21\u4e00\u4e2a\u5730\u4ece\u5c40\u90e8\u4e0a\u4e0b\u6587\u7a97\u53e3\u5b66\u4e60\uff0c\u800c\u662f\u6784\u5efa\u4e00\u4e2a\u5168\u5c40\u7684\u8bcd\u5171\u73b0\u77e9\u9635 \\(X\\)\uff0c\u5176\u4e2d \\(X_{ij}\\) \u7edf\u8ba1\u5728\u6574\u4e2a\u8bed\u6599\u5e93\u4e2d\u8bcd \\(j\\) \u51fa\u73b0\u5728\u8bcd \\(i\\) \u4e0a\u4e0b\u6587\u4e2d\u7684\u6b21\u6570\u3002\u7136\u540e\u6a21\u578b\u5b66\u4e60\u5d4c\u5165\uff0c\u4f7f\u5176\u70b9\u79ef\u8fd1\u4f3c\u4e8e\u5bf9\u6570\u5171\u73b0\u6b21\u6570\uff1a
GloVe \u7ed3\u5408\u4e86\u5168\u5c40\u77e9\u9635\u5206\u89e3\uff08\u5982\u6f5c\u5728\u8bed\u4e49\u5206\u6790\uff09\u548c Word2Vec \u7684\u5c40\u90e8\u4e0a\u4e0b\u6587\u5b66\u4e60\u7684\u4f18\u70b9\u3002\u5728\u5b9e\u8df5\u4e2d\uff0cGloVe \u548c Word2Vec \u751f\u6210\u7684\u5d4c\u5165\u8d28\u91cf\u76f8\u8fd1\u3002
FastText\uff08Bojanowski et al., 2017\uff09\u6269\u5c55\u4e86 skip-gram\uff0c\u5c06\u6bcf\u4e2a\u8bcd\u8868\u793a\u4e3a\u4e00\u7ec4\u5b57\u7b26 n-gram \u7684\u96c6\u5408\u3002\u5bf9\u4e8e \\(n = 3\\)\uff0c\u8bcd \"where\" \u53d8\u6210\uff1a\"\\<wh\"\u3001\"whe\"\u3001\"her\"\u3001\"ere\"\u3001\"re>\"\uff0c\u52a0\u4e0a\u5b8c\u6574\u8bcd\u6807\u8bb0 \"\\<where>\"\u3002\u8be5\u8bcd\u7684\u5d4c\u5165\u662f\u5176\u6240\u6709 n-gram \u5d4c\u5165\u4e4b\u548c\u3002
\u8fd9\u6709\u4e00\u4e2a\u5173\u952e\u4f18\u52bf\uff1aFastText \u80fd\u591f\u4e3a\u8bad\u7ec3\u4e2d\u4ece\u672a\u89c1\u8fc7\u7684\u8bcd\u751f\u6210\u5d4c\u5165\u3002\u8bcd \"whereabouts\" \u4e0e \"where\" \u5171\u4eab n-gram\uff0c\u56e0\u6b64\u5373\u4f7f \"whereabouts\" \u4ece\u672a\u51fa\u73b0\u5728\u8bad\u7ec3\u6570\u636e\u4e2d\uff0c\u5176\u5d4c\u5165\u4e5f\u662f\u5408\u7406\u7684\u3002\u8fd9\u5bf9\u4e8e\u5f62\u6001\u4e30\u5bcc\u7684\u8bed\u8a00\uff08\u6587\u4ef6 01\uff09\u5c24\u4e3a\u6709\u7528\uff0c\u56e0\u4e3a\u8fd9\u4e9b\u8bed\u8a00\u4e2d\u7684\u8bcd\u6709\u8bb8\u591a\u5c48\u6298\u5f62\u5f0f\u3002
\u5d4c\u5165\u8bc4\u4f30\u901a\u5e38\u4f7f\u7528\u4e24\u7c7b\u57fa\u51c6\u6d4b\u8bd5\u3002\u7c7b\u6bd4\u4efb\u52a1\u6d4b\u8bd5 \\(v_a - v_b + v_c \\approx v_d\\) \u662f\u5426\u6210\u7acb\uff08\u4f8b\u5982\uff0c\"Paris\" \\(-\\) \"France\" \\(+\\) \"Italy\" \\(\\approx\\) \"Rome\"\uff09\u3002\u76f8\u4f3c\u6027\u57fa\u51c6\u5c06\u8bcd\u5bf9\u4e4b\u95f4\u7684\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff08\u7b2c 01 \u7ae0\uff09\u4e0e\u4eba\u5de5\u5224\u65ad\u8fdb\u884c\u6bd4\u8f83\u3002\u5e38\u89c1\u7684\u6570\u636e\u96c6\u5305\u62ec WordSim-353\u3001SimLex-999 \u548c Google \u7c7b\u6bd4\u6d4b\u8bd5\u96c6\u3002\u4e00\u4e2a\u5b9e\u7528\u6ce8\u610f\u4e8b\u9879\uff1a\u5728\u7c7b\u6bd4\u4efb\u52a1\u4e0a\u8868\u73b0\u51fa\u8272\u7684\u5d4c\u5165\u4e0d\u4e00\u5b9a\u6700\u9002\u5408\u4e0b\u6e38\u4efb\u52a1\uff0c\u5982\u60c5\u611f\u5206\u7c7b\u3002\u6700\u597d\u7684\u8bc4\u4f30\u5f80\u5f80\u662f\u4efb\u52a1\u672c\u8eab\u3002
\u5728\u7b2c 06 \u7ae0\u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86 RNN\u3001LSTM \u548c GRU \u4f5c\u4e3a\u5904\u7406\u5e8f\u5217\u6570\u636e\u7684\u67b6\u6784\u3002\u8fd9\u91cc\u6211\u4eec\u91cd\u70b9\u8ba8\u8bba\u5b83\u4eec\u5982\u4f55\u5177\u4f53\u5e94\u7528\u4e8e\u8bed\u8a00\u4efb\u52a1\u3002
\u8bed\u8a00\u6a21\u578b RNN \u6bcf\u6b21\u8bfb\u53d6\u4e00\u4e2a\u8bcd\u5143\uff0c\u5e76\u5728\u6bcf\u4e00\u6b65\u9884\u6d4b\u4e0b\u4e00\u4e2a\u8bcd\u5143\u3002\u9690\u85cf\u72b6\u6001 \\(h_t\\) \u5c06\u6574\u4e2a\u5386\u53f2\u5e8f\u5217 \\(w_1, \\ldots, w_t\\) \u538b\u7f29\u4e3a\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u5411\u91cf\uff0c\u7ebf\u6027\u5c42\u52a0 softmax \u5c06 \\(h_t\\) \u6620\u5c04\u5230\u8bcd\u6c47\u8868\u4e0a\u7684\u5206\u5e03\u3002\u8bad\u7ec3\u4f7f\u7528\u4e0e\u771f\u5b9e\u4e0b\u4e00\u8bcd\u5143\u7684\u4ea4\u53c9\u71b5\u635f\u5931\uff0c\u8fd9\u7b49\u4ef7\u4e8e\u6700\u5c0f\u5316\u56f0\u60d1\u5ea6\uff08\u6587\u4ef6 02\uff09\u3002\u5173\u952e\u5c40\u9650\u5728\u4e8e\uff1a\u56fa\u5b9a\u5927\u5c0f\u7684\u9690\u85cf\u72b6\u6001\u5fc5\u987b\u7f16\u7801\u5173\u4e8e\u5386\u53f2\u7684\u6240\u6709\u4fe1\u606f\uff0c\u65e9\u671f\u8bcd\u5143\u7684\u4fe1\u606f\u4f1a\u9010\u6e10\u88ab\u8986\u76d6\u3002
\u53cc\u5411 RNN \u4ece\u4e24\u4e2a\u65b9\u5411\u5904\u7406\u5e8f\u5217\uff1a\u4e00\u4e2a RNN \u4ece\u5de6\u5230\u53f3\u8bfb\u53d6\uff0c\u53e6\u4e00\u4e2a\u4ece\u53f3\u5230\u5de6\u8bfb\u53d6\u3002\u5728\u6bcf\u4e2a\u4f4d\u7f6e \\(t\\)\uff0c\u524d\u5411\u9690\u85cf\u72b6\u6001 \\(\\overrightarrow{h}_t\\) \u548c\u540e\u5411\u9690\u85cf\u72b6\u6001 \\(\\overleftarrow{h}_t\\) \u88ab\u62fc\u63a5\u8d77\u6765\uff0c\u5f62\u6210\u4e0a\u4e0b\u6587\u611f\u77e5\u7684\u8868\u793a \\(h_t = [\\overrightarrow{h}_t ; \\overleftarrow{h}_t]\\)\u3002\u8fd9\u4f7f\u6a21\u578b\u80fd\u591f\u540c\u65f6\u8bbf\u95ee\u8fc7\u53bb\u548c\u672a\u6765\u7684\u4e0a\u4e0b\u6587\uff0c\u5bf9\u4e8e\u8bcd\u6027\u6807\u6ce8\u548c\u547d\u540d\u5b9e\u4f53\u8bc6\u522b\uff08\u6587\u4ef6 02\uff09\u7b49\u4efb\u52a1\u975e\u5e38\u6709\u6548\uff0c\u56e0\u4e3a\u8fd9\u4e9b\u4efb\u52a1\u4e2d\u4e00\u4e2a\u8bcd\u7684\u6807\u7b7e\u4f9d\u8d56\u4e8e\u5176\u524d\u540e\u7684\u8bcd\u3002\u53cc\u5411 RNN \u4e0d\u80fd\u7528\u4e8e\u8bed\u8a00\u5efa\u6a21\uff0c\u56e0\u4e3a\u5728\u9884\u6d4b\u672a\u6765\u8bcd\u5143\u65f6\u4e0d\u80fd\u7aa5\u89c6\u5b83\u4eec\u3002
\u6df1\u5c42\u5806\u53e0 RNN \u5c06\u591a\u4e2a RNN \u5c42\u53e0\u653e\u5728\u4e00\u8d77\u3002\u7b2c \\(l\\) \u5c42\u6240\u6709\u65f6\u95f4\u6b65\u7684\u9690\u85cf\u72b6\u6001\u6210\u4e3a\u7b2c \\(l+1\\) \u5c42\u7684\u8f93\u5165\u5e8f\u5217\u3002\u5806\u53e0 2-4 \u5c42\u901a\u5e38\u80fd\u901a\u8fc7\u6784\u5efa\u5c42\u6b21\u5316\u8868\u793a\u6765\u63d0\u5347\u6027\u80fd\uff0c\u7c7b\u4f3c\u4e8e\u6df1\u5c42 CNN \u6784\u5efa\u7279\u5f81\u5c42\u6b21\u7ed3\u6784\uff08\u7b2c 06 \u7ae0\uff09\u3002\u8d85\u8fc7 4 \u5c42\u65f6\uff0c\u68af\u5ea6\u6d88\u5931\u548c\u8fc7\u62df\u5408\u4f1a\u6210\u4e3a\u95ee\u9898\uff0c\u9664\u975e\u5728\u5c42\u4e4b\u95f4\u6dfb\u52a0\u6b8b\u5dee\u8fde\u63a5\u3002
\u5e8f\u5217\u5230\u5e8f\u5217\uff08seq2seq\uff09\u67b6\u6784\uff08Sutskever et al., 2014\uff09\u5c06\u53ef\u53d8\u957f\u5ea6\u7684\u8f93\u5165\u5e8f\u5217\u6620\u5c04\u5230\u53ef\u53d8\u957f\u5ea6\u7684\u8f93\u51fa\u5e8f\u5217\u3002\u5b83\u7531\u4e00\u4e2a\u7f16\u7801\u5668 RNN\uff08\u8bfb\u53d6\u8f93\u5165\u5e76\u5c06\u5176\u538b\u7f29\u4e3a\u4e0a\u4e0b\u6587\u5411\u91cf\uff0c\u5373\u6700\u7ec8\u7684\u9690\u85cf\u72b6\u6001\uff09\u548c\u4e00\u4e2a\u89e3\u7801\u5668 RNN\uff08\u57fa\u4e8e\u8be5\u4e0a\u4e0b\u6587\u5411\u91cf\u9010\u6b65\u751f\u6210\u8f93\u51fa\uff09\u7ec4\u6210\u3002
Seq2seq \u662f\u673a\u5668\u7ffb\u8bd1\u7684\u7a81\u7834\u6027\u67b6\u6784\u3002\u7f16\u7801\u5668\u8bfb\u53d6\u6cd5\u8bed\u53e5\u5b50\uff0c\u89e3\u7801\u5668\u751f\u6210\u82f1\u6587\u7ffb\u8bd1\u3002\u89e3\u7801\u5668\u4ece\u4e00\u4e2a\u7279\u6b8a\u7684\u5e8f\u5217\u8d77\u59cb\u8bcd\u5143\u5f00\u59cb\uff0c\u81ea\u56de\u5f52\u5730\u751f\u6210\u8bcd\u5143\uff0c\u76f4\u5230\u4ea7\u751f\u5e8f\u5217\u7ed3\u675f\u8bcd\u5143\u3002\u4e00\u4e2a\u5b9e\u7528\u7684\u6280\u5de7\uff1a\u53cd\u8f6c\u8f93\u5165\u5e8f\u5217\uff08\u8f93\u5165 \"chat le\" \u800c\u4e0d\u662f \"le chat\"\uff09\u53ef\u4ee5\u6539\u5584\u7ed3\u679c\uff0c\u56e0\u4e3a\u8fd9\u4f7f\u5f97\u7b2c\u4e00\u4e2a\u8f93\u5165\u8bcd\u5728\u8ba1\u7b97\u56fe\u4e2d\u66f4\u9760\u8fd1\u7b2c\u4e00\u4e2a\u8f93\u51fa\u8bcd\uff0c\u7f29\u77ed\u4e86\u68af\u5ea6\u8def\u5f84\u3002
\u74f6\u9888\u95ee\u9898\uff1a\u6574\u4e2a\u8f93\u5165\u5fc5\u987b\u88ab\u538b\u7f29\u5230\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u5411\u91cf\u4e2d\u3002\u5bf9\u4e8e\u957f\u53e5\u5b50\uff0c\u8fd9\u4e2a\u5411\u91cf\u65e0\u6cd5\u6355\u6349\u6240\u6709\u4fe1\u606f\uff0c\u6027\u80fd\u4f1a\u4e0b\u964d\u3002\u8fd9\u63a8\u52a8\u4e86\u6ce8\u610f\u529b\u673a\u5236\u7684\u53d1\u5c55\u3002
\u7b2c 06 \u7ae0\u4ecb\u7ecd\u4e86\u73b0\u4ee3\u7684\u70b9\u79ef\u6ce8\u610f\u529b Q\u3001K\u3001V \u5f62\u5f0f\u3002NLP \u4e2d\u6700\u65e9\u7684\u6ce8\u610f\u529b\u673a\u5236\u4ee5\u4e0d\u540c\u7684\u65b9\u5f0f\u63d0\u51fa\uff0c\u4f5c\u4e3a\u7f16\u7801\u5668\u548c\u89e3\u7801\u5668\u72b6\u6001\u4e4b\u95f4\u7684\u5bf9\u9f50\u6a21\u578b\u3002
Bahdanau \u6ce8\u610f\u529b\uff08\u52a0\u6027\u6ce8\u610f\u529b\uff0cBahdanau et al., 2015\uff09\u4f7f\u7528\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684\u524d\u9988\u7f51\u7edc\u8ba1\u7b97\u89e3\u7801\u5668\u9690\u85cf\u72b6\u6001 \\(s_t\\) \u4e0e\u6bcf\u4e2a\u7f16\u7801\u5668\u9690\u85cf\u72b6\u6001 \\(h_i\\) \u4e4b\u95f4\u7684\u5bf9\u9f50\u5206\u6570\uff1a
\u7136\u540e\u89e3\u7801\u5668\u540c\u65f6\u4f7f\u7528 \\(s_{t-1}\\) \u548c \\(c_t\\) \u6765\u751f\u6210\u4e0b\u4e00\u4e2a\u8f93\u51fa\u3002\u5173\u952e\u6d1e\u5bdf\uff1a\u4e0d\u662f\u4e3a\u6574\u4e2a\u53e5\u5b50\u4f7f\u7528\u4e00\u4e2a\u56fa\u5b9a\u7684\u4e0a\u4e0b\u6587\u5411\u91cf\uff0c\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\u83b7\u5f97\u7f16\u7801\u5668\u72b6\u6001\u7684\u4e0d\u540c\u52a0\u6743\u7ec4\u5408\uff0c\u4f7f\u6a21\u578b\u80fd\u591f\"\u56de\u987e\"\u8f93\u5165\u7684\u76f8\u5173\u90e8\u5206\u3002
Luong \u6ce8\u610f\u529b\uff08\u4e58\u6027\u6ce8\u610f\u529b\uff0cLuong et al., 2015\uff09\u7b80\u5316\u4e86\u5206\u6570\u8ba1\u7b97\u3002\u70b9\u79ef\u53d8\u4f53\u4f7f\u7528 \\(e_{ti} = s_t^T h_i\\)\u3002\u901a\u7528\u53d8\u4f53\u4f7f\u7528 \\(e_{ti} = s_t^T W h_i\\)\u3002\u8fd9\u4e9b\u6bd4 Bahdanau \u7684\u52a0\u6027\u5206\u6570\u66f4\u5feb\uff0c\u56e0\u4e3a\u5b83\u4eec\u4f7f\u7528\u77e9\u9635\u4e58\u6cd5\u800c\u975e\u524d\u9988\u7f51\u7edc\u3002Luong \u6ce8\u610f\u529b\u8fd8\u4ece\u5f53\u524d\u89e3\u7801\u5668\u72b6\u6001 \\(s_t\\)\uff08\u800c\u975e \\(s_{t-1}\\)\uff09\u8ba1\u7b97\u4e0a\u4e0b\u6587\u5411\u91cf\uff0c\u8fd9\u4f7f\u5f97\u5b83\u80fd\u83b7\u53d6\u66f4\u591a\u4fe1\u606f\uff0c\u4f46\u8ba1\u7b97\u65b9\u5f0f\u7565\u6709\u4e0d\u540c\u3002
\u6ce8\u610f\u529b\u6743\u91cd\u901a\u5e38\u53ef\u89c6\u5316\u4e3a\u70ed\u529b\u56fe\uff0c\u663e\u793a\u89e3\u7801\u5668\u5728\u751f\u6210\u6bcf\u4e2a\u8f93\u51fa\u8bcd\u5143\u65f6\u5173\u6ce8\u54ea\u4e9b\u8f93\u5165\u8bcd\u5143\u3002\u5728\u7ffb\u8bd1\u4e2d\uff0c\u8fd9\u4e9b\u70ed\u529b\u56fe\u5927\u81f4\u52fe\u52d2\u51fa\u6e90\u8bed\u8a00\u548c\u76ee\u6807\u8bed\u8a00\u4e4b\u95f4\u7684\u8bcd\u5bf9\u9f50\u5173\u7cfb\uff0c\u5bf9\u89d2\u6a21\u5f0f\u4f1a\u88ab\u91cd\u6392\u5e8f\u6253\u7834\uff08\u4f8b\u5982\uff0c\u5f62\u5bb9\u8bcd-\u540d\u8bcd\u987a\u5e8f\u5728\u6cd5\u8bed\u548c\u82f1\u8bed\u4e2d\u6709\u6240\u4e0d\u540c\uff09\u3002
\u63a8\u7406\u65f6\uff0c\u89e3\u7801\u5668\u6bcf\u4e00\u6b65\u5fc5\u987b\u9009\u62e9\u4e00\u4e2a\u8bcd\u5143\u3002\u8d2a\u5fc3\u89e3\u7801\u5728\u6bcf\u4e2a\u4f4d\u7f6e\u9009\u62e9\u6982\u7387\u6700\u9ad8\u7684\u8bcd\u5143\uff0c\u4f46\u8fd9\u53ef\u80fd\u5bfc\u81f4\u6b21\u4f18\u5e8f\u5217\uff1a\u4e00\u4e2a\u5c40\u90e8\u597d\u7684\u9009\u62e9\u53ef\u80fd\u8feb\u4f7f\u6a21\u578b\u8fdb\u5165\u5168\u5c40\u4e0d\u4f73\u7684\u53e5\u5b50\u3002\u675f\u641c\u7d22\u5728\u6bcf\u4e00\u6b65\u7ef4\u62a4\u5206\u6570\u6700\u9ad8\u7684 \\(k\\) \u4e2a\uff08\u675f\u5bbd\uff09\u90e8\u5206\u5e8f\u5217\uff0c\u5bf9\u6bcf\u4e2a\u5e8f\u5217\u6269\u5c55\u6240\u6709\u53ef\u80fd\u7684\u4e0b\u4e00\u8bcd\u5143\uff0c\u5e76\u4fdd\u7559\u603b\u4f53\u6700\u597d\u7684 \\(k\\) \u4e2a\u3002
\u5f53\u675f\u5bbd \\(k = 1\\) \u65f6\uff0c\u675f\u641c\u7d22\u9000\u5316\u4e3a\u8d2a\u5fc3\u89e3\u7801\u3002\u5178\u578b\u503c\u4e3a \\(k = 4\\) \u5230 \\(k = 10\\)\u3002\u66f4\u5927\u7684\u675f\u80fd\u627e\u5230\u66f4\u597d\u7684\u5e8f\u5217\uff0c\u4f46\u901f\u5ea6\u4f1a\u6210\u6bd4\u4f8b\u964d\u4f4e\u3002\u675f\u641c\u7d22\u8fd8\u9700\u8981\u957f\u5ea6\u5f52\u4e00\u5316\uff0c\u4ee5\u907f\u514d\u504f\u5411\u8f83\u77ed\u7684\u5e8f\u5217\uff08\u56e0\u4e3a\u8f83\u77ed\u7684\u5e8f\u5217\u4e58\u6cd5\u9879\u66f4\u5c11\uff0c\u81ea\u7136\u5177\u6709\u66f4\u9ad8\u7684\u603b\u6982\u7387\uff09\u3002\u5f52\u4e00\u5316\u540e\u7684\u5206\u6570\u4e3a\uff1a
\u5176\u4e2d \\(|y|\\) \u662f\u5e8f\u5217\u957f\u5ea6\uff0c\\(\\alpha\\)\uff08\u901a\u5e38\u4e3a 0.6-0.7\uff09\u63a7\u5236\u957f\u5ea6\u60e9\u7f5a\u7684\u5f3a\u5ea6\u3002\u5f53 \\(\\alpha = 0\\) \u65f6\uff0c\u6ca1\u6709\u957f\u5ea6\u5f52\u4e00\u5316\u3002\u5f53 \\(\\alpha = 1\\) \u65f6\uff0c\u5206\u6570\u662f\u6bcf\u4e2a\u8bcd\u5143\u7684\u5bf9\u6570\u6982\u7387\uff08\u51e0\u4f55\u5e73\u5747\uff09\u3002\u4e2d\u95f4\u503c\u5728\u503e\u5411\u4e8e\u7b80\u6d01\u8f93\u51fa\u548c\u4e0d\u8fc7\u65e9\u622a\u65ad\u4e4b\u95f4\u53d6\u5f97\u5e73\u8861\u3002
\u867d\u7136 RNN \u987a\u5e8f\u5904\u7406\u6587\u672c\uff0c\u4f46 1D CNN \u901a\u8fc7\u5728\u8bcd\u5143\u5e8f\u5217\u4e0a\u6ed1\u52a8\u6ee4\u6ce2\u5668\u6765\u5e76\u884c\u5904\u7406\u6587\u672c\u3002\u6bcf\u4e2a\u6ee4\u6ce2\u5668\u68c0\u6d4b\u4e00\u4e2a\u5c40\u90e8\u6a21\u5f0f\uff08n-gram \u7279\u5f81\uff09\u3002
TextCNN\uff08Kim, 2014\uff09\u5bf9\u8f93\u5165\u7684\u5d4c\u5165\u77e9\u9635\u5e94\u7528\u591a\u4e2a\u4e0d\u540c\u5bbd\u5ea6\uff08\u4f8b\u5982 3\u30014\u30015 \u4e2a\u8bcd\u5143\uff09\u7684\u4e00\u7ef4\u5377\u79ef\u6ee4\u6ce2\u5668\u3002\u6bcf\u4e2a\u6ee4\u6ce2\u5668\u751f\u6210\u4e00\u4e2a\u7279\u5f81\u56fe\uff0c\u65f6\u5e8f\u6700\u5927\u6c60\u5316\u4ece\u6bcf\u4e2a\u7279\u5f81\u56fe\u4e2d\u53d6\u5355\u4e00\u6700\u5927\u503c\uff0c\u6355\u83b7\u8be5\u6a21\u5f0f\u662f\u5426\u5728\u6587\u672c\u4e2d\u7684\u4efb\u4f55\u4f4d\u7f6e\u88ab\u68c0\u6d4b\u5230\uff0c\u800c\u4e0d\u8003\u8651\u4f4d\u7f6e\u3002\u6240\u6709\u6ee4\u6ce2\u5668\u7684\u6c60\u5316\u7279\u5f81\u88ab\u62fc\u63a5\u540e\u4f20\u9012\u7ed9\u5206\u7c7b\u5668\u3002
TextCNN \u901f\u5ea6\u5feb\uff0c\u5bf9\u4e8e\u60c5\u611f\u5206\u6790\u7b49\u6587\u672c\u5206\u7c7b\u4efb\u52a1\u6548\u679c\u51fa\u5947\u5730\u597d\u3002\u5b83\u80fd\u6355\u83b7\u5c40\u90e8 n-gram \u6a21\u5f0f\uff0c\u4f46\u65e0\u6cd5\u5efa\u6a21\u957f\u8ddd\u79bb\u4f9d\u8d56\uff1a\u5bbd\u5ea6\u4e3a 5 \u7684\u6ee4\u6ce2\u5668\u53ea\u80fd\u770b\u5230 5 \u4e2a\u8fde\u7eed\u7684\u8bcd\u5143\u3002\u81a8\u80c0\u56e0\u679c\u5377\u79ef\u901a\u8fc7\u5728\u6ee4\u6ce2\u5668\u5143\u7d20\u4e4b\u95f4\u63d2\u5165\u95f4\u9699\uff08\u81a8\u80c0\uff09\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u5806\u53e0\u81a8\u80c0\u7387\u5448\u6307\u6570\u589e\u957f\uff081\u30012\u30014\u30018\u3001...\uff09\u7684\u5c42\uff0c\u53ef\u4ee5\u5728\u4e0d\u589e\u52a0\u53c2\u6570\u7684\u60c5\u51b5\u4e0b\u6307\u6570\u7ea7\u5730\u6269\u5927\u611f\u53d7\u91ce\uff0c\u4f7f\u6a21\u578b\u80fd\u591f\u6355\u83b7\u8de8\u8d8a\u6570\u767e\u4e2a\u8bcd\u5143\u7684\u4f9d\u8d56\u5173\u7cfb\u3002
\u5230\u76ee\u524d\u4e3a\u6b62\u8ba8\u8bba\u7684\u6240\u6709\u5d4c\u5165\uff08Word2Vec\u3001GloVe\u3001FastText\uff09\u9488\u5bf9\u6bcf\u4e2a\u8bcd\u7c7b\u578b\u751f\u6210\u5355\u4e00\u5411\u91cf\uff0c\u4e0e\u4e0a\u4e0b\u6587\u65e0\u5173\u3002\"Bank\"\u65e0\u8bba\u662f\u6307\u91d1\u878d\u673a\u6784\u8fd8\u662f\u6cb3\u5cb8\uff0c\u90fd\u5f97\u5230\u76f8\u540c\u7684\u5d4c\u5165\u3002\u8fd9\u662f\u4e00\u4e2a\u6839\u672c\u6027\u7684\u5c40\u9650\uff0c\u800c\u4e0a\u4e0b\u6587\u5d4c\u5165\u89e3\u51b3\u4e86\u8fd9\u4e00\u95ee\u9898\u3002
ELMo\uff08Embeddings from Language Models\uff0cPeters et al., 2018\uff09\u901a\u8fc7\u5728\u8f93\u5165\u6587\u672c\u4e0a\u8fd0\u884c\u4e00\u4e2a\u6df1\u5c42\u53cc\u5411 LSTM \u8bed\u8a00\u6a21\u578b\u6765\u751f\u6210\u4e0a\u4e0b\u6587\u76f8\u5173\u7684\u8bcd\u8868\u793a\u3002\u524d\u5411 LSTM \u5728\u6bcf\u4e2a\u4f4d\u7f6e\u9884\u6d4b\u4e0b\u4e00\u4e2a\u8bcd\uff1b\u4e00\u4e2a\u72ec\u7acb\u7684\u540e\u5411 LSTM \u9884\u6d4b\u524d\u4e00\u4e2a\u8bcd\u3002\u4e24\u8005\u90fd\u5728\u5927\u89c4\u6a21\u8bed\u6599\u5e93\u4e0a\u4f5c\u4e3a\u8bed\u8a00\u6a21\u578b\u8fdb\u884c\u8bad\u7ec3\u3002
\u5728\u6bcf\u4e2a\u4f4d\u7f6e \\(k\\)\uff0cELMo \u4f7f\u7528\u4efb\u52a1\u7279\u5b9a\u7684\u5b66\u4e60\u6743\u91cd\u7ec4\u5408\u6240\u6709 \\(L\\) \u5c42\u7684\u9690\u85cf\u72b6\u6001\uff1a
\u8fd9\u91cc \\(h_{k,j}\\) \u662f\u4f4d\u7f6e \\(k\\) \u5c42 \\(j\\) \u7684\u9690\u85cf\u72b6\u6001\uff08\u5c42 0 \u662f\u539f\u59cb\u8bcd\u5d4c\u5165\uff09\uff0c\\(s_j\\) \u662f softmax \u5f52\u4e00\u5316\u7684\u6807\u91cf\u6743\u91cd\uff0c\\(\\gamma\\) \u662f\u4efb\u52a1\u7279\u5b9a\u7684\u7f29\u653e\u56e0\u5b50\u3002\u4e0d\u540c\u5c42\u6355\u83b7\u4e0d\u540c\u4fe1\u606f\uff1a\u8f83\u4f4e\u5c42\u6355\u83b7\u53e5\u6cd5\uff08\u8bcd\u6027\u6807\u6ce8\u3001\u8bcd\u5f62\u6001\uff09\uff0c\u8f83\u9ad8\u5c42\u6355\u83b7\u8bed\u4e49\uff08\u8bcd\u4e49\u3001\u8bed\u4e49\u89d2\u8272\uff09\u3002\u901a\u8fc7\u4f7f\u7528\u5b66\u4e60\u5230\u7684\u6743\u91cd\u6df7\u5408\u6240\u6709\u5c42\uff0cELMo \u5d4c\u5165\u80fd\u591f\u9002\u5e94\u591a\u6837\u5316\u7684\u4e0b\u6e38\u4efb\u52a1\u3002
ELMo \u6807\u5fd7\u7740\u9884\u8bad\u7ec3\u7136\u540e\u5fae\u8c03\u8303\u5f0f\u7684\u5f00\u59cb\uff1a\u5728\u6d77\u91cf\u65e0\u6807\u6ce8\u6587\u672c\u4e0a\u8bad\u7ec3\u5927\u578b\u8bed\u8a00\u6a21\u578b\uff0c\u7136\u540e\u5c06\u5176\u8868\u793a\u7528\u4e8e\u4e0b\u6e38\u4efb\u52a1\u3002ELMo \u5177\u4f53\u4f7f\u7528\u9884\u8bad\u7ec3\u7684\u8868\u793a\u4f5c\u4e3a\u56fa\u5b9a\u7684\u6216\u8f7b\u5ea6\u5fae\u8c03\u7684\u7279\u5f81\uff0c\u4e0e\u4efb\u52a1\u7279\u5b9a\u7684\u8f93\u5165\u62fc\u63a5\u5728\u4e00\u8d77\u3002BERT \u548c GPT\uff08\u6587\u4ef6 04\uff09\u901a\u8fc7\u7aef\u5230\u7aef\u5730\u5fae\u8c03\u6574\u4e2a\u6a21\u578b\u8fdb\u4e00\u6b65\u63a8\u8fdb\u4e86\u8fd9\u4e00\u8303\u5f0f\uff0c\u4e8b\u5b9e\u8bc1\u660e\u8fd9\u8981\u6709\u6548\u5f97\u591a\u3002
\u4ece Word2Vec \u5230 ELMo \u7684\u53d1\u5c55\u8fc7\u7a0b\u5c55\u793a\u4e86 NLP \u4e2d\u4e00\u4e2a\u53cd\u590d\u51fa\u73b0\u7684\u4e3b\u9898\uff1a\u4ece\u9759\u6001\u8868\u793a\u5230\u52a8\u6001\u8868\u793a\uff0c\u4ece\u5c40\u90e8\u4e0a\u4e0b\u6587\u5230\u5168\u5c40\u4e0a\u4e0b\u6587\uff0c\u4ece\u6d45\u5c42\u6a21\u578b\u5230\u6df1\u5c42\u6a21\u578b\u3002\u6bcf\u4e00\u6b65\u90fd\u4ee5\u8ba1\u7b97\u6210\u672c\u6362\u53d6\u66f4\u4e30\u5bcc\u7684\u8868\u793a\u3002Transformer\uff08\u6587\u4ef6 04\uff09\u901a\u8fc7\u7528\u6ce8\u610f\u529b\u5b8c\u5168\u53d6\u4ee3\u5faa\u73af\uff0c\u5b9e\u73b0\u4e86\u6df1\u5c42\u4e0a\u4e0b\u6587\u5316\u548c\u5e76\u884c\u8ba1\u7b97\uff0c\u5b8c\u6210\u4e86\u8fd9\u4e00\u6f14\u8fdb\u3002
\u4ece\u5934\u5b9e\u73b0\u5e26\u8d1f\u91c7\u6837\u7684 Word2Vec skip-gram\u3002\u5728\u5c0f\u578b\u8bed\u6599\u5e93\u4e0a\u8bad\u7ec3\uff0c\u5e76\u4f7f\u7528 PCA \u53ef\u89c6\u5316\u5b66\u4e60\u5230\u7684\u5d4c\u5165\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u5c0f\u578b\u8bed\u6599\u5e93\ncorpus = \"\"\"the king ruled the kingdom . the queen ruled the kingdom .\nthe prince is the son of the king . the princess is the daughter of the queen .\na man worked in the castle . a woman worked in the castle .\nthe king and queen lived in the castle . the prince and princess played outside .\"\"\".lower().split()\n\nvocab = sorted(set(corpus))\nword2idx = {w: i for i, w in enumerate(vocab)}\nidx2word = {i: w for w, i in word2idx.items()}\nV = len(vocab)\n\n# \u751f\u6210 skip-gram \u5bf9\uff0c\u7a97\u53e3\u5927\u5c0f\u4e3a 2\nwindow = 2\npairs = []\nfor i, word in enumerate(corpus):\n for j in range(max(0, i - window), min(len(corpus), i + window + 1)):\n if i != j:\n pairs.append((word2idx[word], word2idx[corpus[j]]))\n\npairs = jnp.array(pairs)\nprint(f\"\u8bcd\u6c47\u8868\u5927\u5c0f: {V} \u4e2a\u8bcd, \u8bad\u7ec3\u6837\u672c\u6570: {len(pairs)}\")\n\n# \u6a21\u578b\u53c2\u6570\nembed_dim = 16\nkey = jax.random.PRNGKey(42)\nk1, k2 = jax.random.split(key)\nW_in = jax.random.normal(k1, (V, embed_dim)) * 0.1 # \u8f93\u5165\u5d4c\u5165\nW_out = jax.random.normal(k2, (V, embed_dim)) * 0.1 # \u8f93\u51fa\u5d4c\u5165\n\n# \u5355\u4e2a\u6837\u672c\u5bf9\u7684\u8d1f\u91c7\u6837\u635f\u5931\ndef neg_sampling_loss(W_in, W_out, target, context, neg_ids):\n v_in = W_in[target] # (embed_dim,)\n v_out = W_out[context] # (embed_dim,)\n v_neg = W_out[neg_ids] # (k, embed_dim)\n\n pos_loss = -jax.nn.log_sigmoid(jnp.dot(v_in, v_out))\n neg_loss = -jnp.sum(jax.nn.log_sigmoid(-v_neg @ v_in))\n return pos_loss + neg_loss\n\n# \u8bad\u7ec3\u5faa\u73af\nnum_neg = 5\nlr = 0.05\n\n@jax.jit\ndef train_step(W_in, W_out, target, context, neg_ids):\n loss, (g_in, g_out) = jax.value_and_grad(neg_sampling_loss, argnums=(0, 1))(\n W_in, W_out, target, context, neg_ids)\n return loss, W_in - lr * g_in, W_out - lr * g_out\n\nkey = jax.random.PRNGKey(0)\nfor epoch in range(50):\n total_loss = 0.0\n for i in range(len(pairs)):\n key, subkey = jax.random.split(key)\n neg_ids = jax.random.randint(subkey, (num_neg,), 0, V)\n loss, W_in, W_out = train_step(W_in, W_out, pairs[i, 0], pairs[i, 1], neg_ids)\n total_loss += loss\n if (epoch + 1) % 10 == 0:\n print(f\"Epoch {epoch+1}: avg loss = {total_loss / len(pairs):.4f}\")\n\n# \u4f7f\u7528 PCA \u53ef\u89c6\u5316\uff08\u7b2c 01 \u7ae0\uff09\nembeddings = W_in\nmean = embeddings.mean(axis=0)\ncentered = embeddings - mean\nU, S, Vt = jnp.linalg.svd(centered, full_matrices=False)\ncoords = centered @ Vt[:2].T # \u6295\u5f71\u5230\u524d\u4e24\u4e2a\u4e3b\u6210\u5206\n\nplt.figure(figsize=(10, 8))\nfor i, word in idx2word.items():\n plt.scatter(coords[i, 0], coords[i, 1], c='#3498db', s=40)\n plt.annotate(word, (coords[i, 0] + 0.02, coords[i, 1] + 0.02), fontsize=9)\nplt.title(\"Word2Vec Skip-gram \u5d4c\u5165\uff08PCA \u6295\u5f71\uff09\")\nplt.grid(alpha=0.3); plt.show()\n \u6784\u5efa\u4e00\u4e2a\u5b57\u7b26\u7ea7 RNN \u8bed\u8a00\u6a21\u578b\uff0c\u4ece\u4e00\u5c0f\u6bb5\u8bad\u7ec3\u6587\u672c\u4e2d\u5b66\u4e60\u751f\u6210\u6587\u672c\u3002
import jax\nimport jax.numpy as jnp\n\n# \u5c0f\u578b\u8bad\u7ec3\u6587\u672c\ntext = \"to be or not to be that is the question \"\nchars = sorted(set(text))\nchar2idx = {c: i for i, c in enumerate(chars)}\nidx2char = {i: c for c, i in char2idx.items()}\nV = len(chars)\ndata = jnp.array([char2idx[c] for c in text])\n\n# RNN \u53c2\u6570\nhidden_dim = 64\nkey = jax.random.PRNGKey(0)\nk1, k2, k3, k4, k5 = jax.random.split(key, 5)\n\nparams = {\n 'Wx': jax.random.normal(k1, (V, hidden_dim)) * 0.1,\n 'Wh': jax.random.normal(k2, (hidden_dim, hidden_dim)) * 0.05,\n 'bh': jnp.zeros(hidden_dim),\n 'Wy': jax.random.normal(k3, (hidden_dim, V)) * 0.1,\n 'by': jnp.zeros(V),\n}\n\ndef rnn_step(params, h, x_idx):\n x = jnp.eye(V)[x_idx] # one-hot \u7f16\u7801\n h = jnp.tanh(x @ params['Wx'] + h @ params['Wh'] + params['bh'])\n logits = h @ params['Wy'] + params['by']\n return h, logits\n\ndef loss_fn(params, inputs, targets):\n h = jnp.zeros(hidden_dim)\n total_loss = 0.0\n for t in range(len(inputs)):\n h, logits = rnn_step(params, h, inputs[t])\n log_probs = jax.nn.log_softmax(logits)\n total_loss -= log_probs[targets[t]]\n return total_loss / len(inputs)\n\ngrad_fn = jax.jit(jax.grad(loss_fn))\n\n# \u8bad\u7ec3\ninputs = data[:-1]\ntargets = data[1:]\nlr = 0.01\n\nfor step in range(500):\n grads = grad_fn(params, inputs, targets)\n params = {k: params[k] - lr * grads[k] for k in params}\n if (step + 1) % 100 == 0:\n l = loss_fn(params, inputs, targets)\n print(f\"Step {step+1}: loss = {l:.4f}\")\n\n# \u751f\u6210\u6587\u672c\ndef generate(params, seed_char, length=60):\n h = jnp.zeros(hidden_dim)\n idx = char2idx[seed_char]\n result = [seed_char]\n key = jax.random.PRNGKey(42)\n for _ in range(length):\n h, logits = rnn_step(params, h, idx)\n key, subkey = jax.random.split(key)\n idx = jax.random.categorical(subkey, logits)\n result.append(idx2char[int(idx)])\n return ''.join(result)\n\nprint(f\"\\n\u751f\u6210\u6587\u672c: {generate(params, 't')}\")\n \u5b9e\u73b0\u4e00\u4e2a\u5e26 Bahdanau \u6ce8\u610f\u529b\u7684\u7b80\u6613 seq2seq \u6a21\u578b\uff0c\u7528\u4e8e\u5e8f\u5217\u53cd\u8f6c\u3002\u53ef\u89c6\u5316\u6ce8\u610f\u529b\u5bf9\u9f50\u77e9\u9635\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u4efb\u52a1\uff1a\u53cd\u8f6c\u6570\u5b57\u5e8f\u5217\uff08\u4f8b\u5982\uff0c[3, 1, 4] -> [4, 1, 3]\uff09\nvocab_size = 10 # \u6570\u5b57 0-9\nSOS, EOS = 10, 11 # \u7279\u6b8a\u8bcd\u5143\ntotal_vocab = 12\nembed_dim, hidden_dim = 16, 32\nmax_len = 5\n\nkey = jax.random.PRNGKey(42)\nkeys = jax.random.split(key, 8)\n\nparams = {\n 'embed': jax.random.normal(keys[0], (total_vocab, embed_dim)) * 0.1,\n 'enc_Wx': jax.random.normal(keys[1], (embed_dim, hidden_dim)) * 0.1,\n 'enc_Wh': jax.random.normal(keys[2], (hidden_dim, hidden_dim)) * 0.05,\n 'dec_Wx': jax.random.normal(keys[3], (embed_dim, hidden_dim)) * 0.1,\n 'dec_Wh': jax.random.normal(keys[4], (hidden_dim, hidden_dim)) * 0.05,\n # Bahdanau \u6ce8\u610f\u529b\n 'Ws': jax.random.normal(keys[5], (hidden_dim, hidden_dim)) * 0.1,\n 'Wh_att': jax.random.normal(keys[6], (hidden_dim, hidden_dim)) * 0.1,\n 'v_att': jax.random.normal(keys[7], (hidden_dim,)) * 0.1,\n # \u8f93\u51fa\u6295\u5f71\uff08\u4ece\u9690\u85cf\u72b6\u6001+\u4e0a\u4e0b\u6587\u5230\u8bcd\u6c47\u8868\uff09\n 'Wo': jax.random.normal(keys[0], (hidden_dim * 2, total_vocab)) * 0.1,\n}\n\ndef encode(params, seq):\n \"\"\"\u7f16\u7801\u8f93\u5165\u5e8f\u5217\uff0c\u8fd4\u56de\u6240\u6709\u9690\u85cf\u72b6\u6001\u3002\"\"\"\n h = jnp.zeros(hidden_dim)\n states = []\n for t in range(len(seq)):\n x = params['embed'][seq[t]]\n h = jnp.tanh(x @ params['enc_Wx'] + h @ params['enc_Wh'])\n states.append(h)\n return jnp.stack(states), h\n\ndef bahdanau_attention(params, dec_state, enc_states):\n \"\"\"\u8ba1\u7b97 Bahdanau \u6ce8\u610f\u529b\u6743\u91cd\u548c\u4e0a\u4e0b\u6587\u5411\u91cf\u3002\"\"\"\n scores = jnp.tanh(enc_states @ params['Wh_att'] + dec_state @ params['Ws'])\n e = scores @ params['v_att'] # (src_len,)\n alpha = jax.nn.softmax(e)\n context = alpha @ enc_states\n return context, alpha\n\ndef decode_step(params, dec_h, prev_token, enc_states):\n x = params['embed'][prev_token]\n dec_h = jnp.tanh(x @ params['dec_Wx'] + dec_h @ params['dec_Wh'])\n context, alpha = bahdanau_attention(params, dec_h, enc_states)\n combined = jnp.concatenate([dec_h, context])\n logits = combined @ params['Wo']\n return dec_h, logits, alpha\n\ndef seq2seq_loss(params, src, tgt):\n enc_states, enc_final = encode(params, src)\n dec_h = enc_final\n loss = 0.0\n prev_token = SOS\n for t in range(len(tgt)):\n dec_h, logits, _ = decode_step(params, dec_h, prev_token, enc_states)\n log_probs = jax.nn.log_softmax(logits)\n loss -= log_probs[tgt[t]]\n prev_token = tgt[t]\n return loss / len(tgt)\n\n# \u751f\u6210\u8bad\u7ec3\u6570\u636e\uff1a\u53cd\u8f6c\u5e8f\u5217\nkey = jax.random.PRNGKey(0)\ntrain_srcs, train_tgts = [], []\nfor _ in range(200):\n key, subkey = jax.random.split(key)\n length = jax.random.randint(subkey, (), 3, max_len + 1)\n key, subkey = jax.random.split(key)\n seq = jax.random.randint(subkey, (int(length),), 0, vocab_size)\n train_srcs.append(seq)\n train_tgts.append(seq[::-1]) # \u53cd\u8f6c\n\n# \u8bad\u7ec3\ngrad_fn = jax.grad(seq2seq_loss)\nlr = 0.01\n\nfor epoch in range(100):\n total_loss = 0.0\n for src, tgt in zip(train_srcs, train_tgts):\n grads = grad_fn(params, src, tgt)\n params = {k: params[k] - lr * grads[k] for k in params}\n total_loss += seq2seq_loss(params, src, tgt)\n if (epoch + 1) % 20 == 0:\n print(f\"Epoch {epoch+1}: avg loss = {total_loss / len(train_srcs):.4f}\")\n\n# \u53ef\u89c6\u5316\u4e00\u4e2a\u793a\u4f8b\u7684\u6ce8\u610f\u529b\ntest_src = jnp.array([3, 1, 4, 1, 5])\ntest_tgt = test_src[::-1]\n\nenc_states, enc_final = encode(params, test_src)\ndec_h = enc_final\nattentions = []\nprev_token = SOS\nfor t in range(len(test_tgt)):\n dec_h, logits, alpha = decode_step(params, dec_h, prev_token, enc_states)\n attentions.append(alpha)\n prev_token = test_tgt[t]\n\natt_matrix = jnp.stack(attentions)\nfig, ax = plt.subplots(figsize=(6, 5))\nim = ax.imshow(att_matrix, cmap='Blues')\nax.set_xlabel(\"\u6e90\u4f4d\u7f6e\"); ax.set_ylabel(\"\u76ee\u6807\u4f4d\u7f6e\")\nsrc_labels = [str(int(x)) for x in test_src]\ntgt_labels = [str(int(x)) for x in test_tgt]\nax.set_xticks(range(len(src_labels))); ax.set_xticklabels(src_labels)\nax.set_yticks(range(len(tgt_labels))); ax.set_yticklabels(tgt_labels)\nfor i in range(len(tgt_labels)):\n for j in range(len(src_labels)):\n ax.text(j, i, f\"{att_matrix[i,j]:.2f}\", ha='center', va='center', fontsize=9)\nax.set_title(\"Bahdanau \u6ce8\u610f\u529b\u5bf9\u9f50\uff08\u5e8f\u5217\u53cd\u8f6c\uff09\")\nplt.colorbar(im); plt.tight_layout(); plt.show()\n Transformer\u7528\u81ea\u6ce8\u610f\u529b\u53d6\u4ee3\u4e86\u5faa\u73af\u7ed3\u6784\uff0c\u6210\u4e3a\u8bed\u8a00\u7406\u89e3\u548c\u751f\u6210\u7684\u4e3b\u5bfc\u67b6\u6784\u3002\u672c\u6587\u4ef6\u6db5\u76d6BERT\u3001GPT\u3001T5\u3001\u4f4d\u7f6e\u7f16\u7801\uff08\u6b63\u5f26\u7f16\u7801\u3001RoPE\uff09\u3001\u9884\u8bad\u7ec3\u76ee\u6807\uff08MLM\u3001CLM\uff09\u3001\u5fae\u8c03\u3001\u63d0\u793a\u5de5\u7a0b\u548c\u7f29\u653e\u5b9a\u5f8b\u2014\u2014\u8fd9\u4e9b\u662f\u73b0\u4ee3\u5927\u8bed\u8a00\u6a21\u578b\u80cc\u540e\u7684\u84dd\u56fe\u3002
\u5728\u7b2c06\u7ae0\u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86Transformer\u67b6\u6784\uff1a\u81ea\u6ce8\u610f\u529b\u3001\u591a\u5934\u6ce8\u610f\u529b\u3001\u4f4d\u7f6e\u7f16\u7801\u4ee5\u53ca\u7f16\u7801\u5668-\u89e3\u7801\u5668\u7ed3\u6784\u3002\u8fd9\u91cc\u6211\u4eec\u805a\u7126\u4e8eTransformer\u5982\u4f55\u9002\u914d\u7279\u5b9a\u7684NLP\u8303\u5f0f\u3001\u5b9a\u4e49\u73b0\u4ee3NLP\u7684\u6a21\u578b\uff08BERT\u3001GPT\u3001T5\uff09\uff0c\u4ee5\u53ca\u8ba9\u5b83\u4eec\u5728\u5927\u89c4\u6a21\u4e0b\u5207\u5b9e\u53ef\u884c\u7684\u6280\u672f\u3002
\u56de\u987e\u6838\u5fc3\u64cd\u4f5c\uff1a\u7f29\u653e\u70b9\u79ef\u6ce8\u610f\u529b\u8ba1\u7b97 \\(\\text{softmax}(QK^T / \\sqrt{d_k}) V\\)\uff0c\u5176\u4e2d\u67e5\u8be2\u3001\u952e\u548c\u503c\u90fd\u662f\u8f93\u5165\u7684\u7ebf\u6027\u6295\u5f71\u3002\u591a\u5934\u6ce8\u610f\u529b\u5e76\u884c\u8fd0\u884c \\(h\\) \u4e2a\u6ce8\u610f\u529b\u5934\uff0c\u6bcf\u4e2a\u5934\u4f7f\u7528\u4e0d\u540c\u7684\u5b66\u4e60\u6295\u5f71\uff0c\u7136\u540e\u5c06\u7ed3\u679c\u62fc\u63a5\u8d77\u6765\u3002Transformer\u5757\u901a\u8fc7\u6b8b\u5dee\u8fde\u63a5\u3001\u5c42\u5f52\u4e00\u5316\u548c\u9010\u4f4d\u7f6e\u524d\u9988\u7f51\u7edc\uff08\u7b2c06\u7ae0\uff09\u5c06\u8fd9\u4e00\u5207\u5305\u88f9\u8d77\u6765\u3002
\u4e00\u4e2a\u5fae\u5999\u4f46\u91cd\u8981\u7684\u67b6\u6784\u9009\u62e9\u662f\u5c42\u5f52\u4e00\u5316\u7684\u653e\u7f6e\u4f4d\u7f6e\u3002\u539f\u59cbTransformer\u4f7f\u7528\u540e\u5f52\u4e00\u5316\uff1a\u6b8b\u5dee\u548c\u5f52\u4e00\u5316\u5728\u5b50\u5c42\u4e4b\u540e\u6267\u884c\uff0c\u5373 \\(\\text{LayerNorm}(x + \\text{Sublayer}(x))\\)\u3002
\u5927\u591a\u6570\u73b0\u4ee3\u6a21\u578b\u4f7f\u7528\u524d\u5f52\u4e00\u5316\uff1a\u5728\u5b50\u5c42\u4e4b\u524d\u8fdb\u884c\u5f52\u4e00\u5316\uff0c\u5373 \\(x + \\text{Sublayer}(\\text{LayerNorm}(x))\\)\u3002\u524d\u5f52\u4e00\u5316\u5728\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\u66f4\u52a0\u7a33\u5b9a\uff0c\u56e0\u4e3a\u6b8b\u5dee\u8fde\u63a5\u76f4\u63a5\u5c06\u68af\u5ea6\u901a\u8fc7\u6052\u7b49\u8def\u5f84\u4f20\u9012\uff0c\u4e0d\u53d7\u5f52\u4e00\u5316\u7684\u5f71\u54cd\u3002\u8fd9\u4f7f\u5f97\u8bad\u7ec3\u975e\u5e38\u6df1\u7684\u6a21\u578b\u53d8\u5f97\u66f4\u5bb9\u6613\uff0c\u65e0\u9700\u4ed4\u7ec6\u7684\u5b66\u4e60\u7387\u9884\u70ed\u3002
\u6bcf\u4e2aTransformer\u5757\u4e2d\u7684\u524d\u9988\u5b50\u5c42\u662f\u4e00\u4e2a\u4e24\u5c42MLP\uff0c\u72ec\u7acb\u5e94\u7528\u4e8e\u6bcf\u4e2a\u6807\u8bb0\u4f4d\u7f6e\uff1a
\u5185\u90e8\u7ef4\u5ea6\u901a\u5e38\u662f\u6a21\u578b\u7ef4\u5ea6\u76844\u500d\uff08\u4f8b\u5982\uff0c\\(d_{\\text{model}} = 768\\)\uff0c\\(d_{\\text{ff}} = 3072\\)\uff09\u3002\u8fd9\u4e2aFFN\u7ea6\u5360\u6bcf\u4e2a\u5757\u4e2d\u53c2\u6570\u7684\u4e09\u5206\u4e4b\u4e8c\uff0c\u88ab\u8ba4\u4e3a\u8d77\u5230\u952e-\u503c\u8bb0\u5fc6\u7684\u4f5c\u7528\uff0c\u5b58\u50a8\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\u5b66\u5230\u7684\u4e8b\u5b9e\u77e5\u8bc6\u3002
\u4f4d\u7f6e\u7f16\u7801\u4e3a\u6a21\u578b\u63d0\u4f9b\u6807\u8bb0\u987a\u5e8f\u7684\u4fe1\u606f\uff0c\u56e0\u4e3a\u6ce8\u610f\u529b\u672c\u8eab\u662f\u7f6e\u6362\u7b49\u53d8\u7684\u3002\u539f\u59cb\u7684\u6b63\u5f26\u7f16\u7801\uff08\u7b2c06\u7ae0\uff09\u4f7f\u7528\u4e0d\u540c\u9891\u7387\u7684\u56fa\u5b9a\u6b63\u5f26\u548c\u4f59\u5f26\u51fd\u6570\u3002\u53ef\u5b66\u4e60\u4f4d\u7f6e\u5d4c\u5165\u5219\u7b80\u5355\u5730\u4e3a\u6bcf\u4e2a\u4f4d\u7f6e\u6dfb\u52a0\u4e00\u4e2a\u53ef\u8bad\u7ec3\u5411\u91cf\uff08\u7528\u4e8eBERT\u548cGPT-2\uff09\u3002\u4e24\u8005\u90fd\u662f\u7edd\u5bf9\u7f16\u7801\uff1a\u65e0\u8bba\u4e0a\u4e0b\u6587\u5982\u4f55\uff0c\u4f4d\u7f6e5\u603b\u662f\u5f97\u5230\u76f8\u540c\u7684\u5411\u91cf\u3002
\u65cb\u8f6c\u4f4d\u7f6e\u7f16\u7801\uff08RoPE\uff09\u901a\u8fc7\u5728\u4e8c\u7ef4\u5b50\u7a7a\u95f4\u4e2d\u65cb\u8f6c\u67e5\u8be2\u548c\u952e\u5411\u91cf\u6765\u7f16\u7801\u4f4d\u7f6e\u3002\u5bf9\u4e8e\u4e00\u5bf9\u7ef4\u5ea6 \\((q_{2i}, q_{2i+1})\\)\uff0c\u6309\u89d2\u5ea6 \\(m\\theta_i\\) \u7684\u65cb\u8f6c\uff08\u5176\u4e2d \\(m\\) \u662f\u4f4d\u7f6e\uff0c\\(\\theta_i = 10000^{-2i/d}\\)\uff09\u5e94\u7528\u5982\u4e0b\uff1a
RoPE\u7684\u7cbe\u5999\u4e4b\u5904\u5728\u4e8e\uff0c\u65cb\u8f6c\u540e\u7684\u67e5\u8be2\u548c\u952e\u4e4b\u95f4\u7684\u70b9\u79ef \\(q'^T k'\\) \u4ec5\u4f9d\u8d56\u4e8e\u76f8\u5bf9\u4f4d\u7f6e \\(m - n\\)\uff0c\u800c\u975e\u7edd\u5bf9\u4f4d\u7f6e\u3002
\u4e3a\u4e86\u7406\u89e3\u539f\u56e0\uff0c\u5c06\u65cb\u8f6c\u5199\u4e3a \\(q' = R_m q\\) \u548c \\(k' = R_n k\\)\uff0c\u5176\u4e2d \\(R_m\\) \u662f\u4e00\u4e2a\u5757\u5bf9\u89d2\u65cb\u8f6c\u77e9\u9635\u3002\u6ce8\u610f\u529b\u5206\u6570\u53d8\u4e3a\uff1a
\u6700\u540e\u4e00\u6b65\u5229\u7528\u4e86\u65cb\u8f6c\u7fa4\u6027\u8d28\uff1a\\(R_m^T R_n = R_{n-m}\\)\uff08\u5148\u5411\u540e\u65cb\u8f6c \\(m\\) \u518d\u5411\u524d\u65cb\u8f6c \\(n\\)\uff0c\u7b49\u4ef7\u4e8e\u65cb\u8f6c \\(n - m\\)\uff09\u3002
\u8fd9\u610f\u5473\u7740\u6ce8\u610f\u529b\u5206\u6570\u4ec5\u4f9d\u8d56\u4e8e\u76f8\u5bf9\u8ddd\u79bb \\(n - m\\)\uff0c\u800c\u975e\u7edd\u5bf9\u4f4d\u7f6e \\(m\\) \u548c \\(n\\) \u672c\u8eab\u3002
\u6a21\u578b\u65e0\u9700\u4efb\u4f55\u5b66\u4e60\u7684\u4f4d\u7f6e\u53c2\u6570\u5c31\u80fd\u83b7\u5f97\u81ea\u7136\u7684\u8ddd\u79bb\u6982\u5ff5\uff0c\u5e76\u4e14\u53ef\u4ee5\u6cdb\u5316\u5230\u8bad\u7ec3\u65f6\u672a\u89c1\u8fc7\u7684\u5e8f\u5217\u957f\u5ea6\u3002
ALiBi\uff08\u5e26\u7ebf\u6027\u504f\u7f6e\u7684\u6ce8\u610f\u529b\uff09\u91c7\u7528\u4e86\u4e00\u79cd\u66f4\u7b80\u5355\u7684\u65b9\u6cd5\uff1a\u5b83\u6839\u636e\u8ddd\u79bb\u5411\u6ce8\u610f\u529b\u5206\u6570\u6dfb\u52a0\u4e00\u4e2a\u56fa\u5b9a\u7684\u7ebf\u6027\u60e9\u7f5a\uff0c\u5373 \\(\\text{score}_{ij} = q_i^T k_j - m \\cdot |i - j|\\)\uff0c\u5176\u4e2d \\(m\\) \u662f\u6bcf\u4e2a\u5934\u7279\u5b9a\u7684\u659c\u7387\u3002\u4e0d\u540c\u7684\u5934\u4f7f\u7528\u4e0d\u540c\u7684\u659c\u7387\uff0c\u4f7f\u4e00\u4e9b\u5934\u53ef\u4ee5\u5173\u6ce8\u5c40\u90e8\u4fe1\u606f\uff0c\u53e6\u4e00\u4e9b\u5934\u5173\u6ce8\u5168\u5c40\u4fe1\u606f\u3002ALiBi\u4e0d\u9700\u8981\u4efb\u4f55\u53ef\u5b66\u4e60\u7684\u4f4d\u7f6e\u53c2\u6570\uff0c\u5e76\u4e14\u80fd\u591f\u5f88\u597d\u5730\u6cdb\u5316\u5230\u6bd4\u8bad\u7ec3\u65f6\u66f4\u957f\u7684\u5e8f\u5217\u3002
\u57fa\u4e8eTransformer\u7684\u8bed\u8a00\u6a21\u578b\u7684\u4e09\u79cd\u4e3b\u5bfc\u8303\u5f0f\u662f\u4ec5\u7f16\u7801\u5668\u3001\u4ec5\u89e3\u7801\u5668\u548c\u7f16\u7801\u5668-\u89e3\u7801\u5668\u3002\u5b83\u4eec\u5728\u6a21\u578b\u80fd\u770b\u5230\u7684\u8303\u56f4\uff08\u6ce8\u610f\u529b\u63a9\u7801\uff09\u4ee5\u53ca\u8bad\u7ec3\u65b9\u5f0f\u4e0a\u6709\u6240\u4e0d\u540c\u3002
BERT\uff08\u6765\u81eaTransformer\u7684\u53cc\u5411\u7f16\u7801\u5668\u8868\u793a\uff0cDevlin\u7b49\u4eba\uff0c2019\uff09\u662f\u5178\u578b\u7684\u4ec5\u7f16\u7801\u5668\u6a21\u578b\u3002\u5b83\u4f7f\u7528\u5b8c\u5168\u7684\u53cc\u5411\u6ce8\u610f\u529b\u5904\u7406\u6587\u672c\uff1a\u6bcf\u4e2a\u6807\u8bb0\u53ef\u4ee5\u5173\u6ce8\u6240\u6709\u5176\u4ed6\u6807\u8bb0\uff0c\u5305\u62ec\u5de6\u53f3\u4e24\u4fa7\u3002\u8fd9\u8d4b\u4e88\u4e86BERT\u4e30\u5bcc\u7684\u4e0a\u4e0b\u6587\u8868\u793a\uff0c\u4f46\u610f\u5473\u7740\u5b83\u4e0d\u80fd\u81ea\u56de\u5f52\u5730\u751f\u6210\u6587\u672c\u3002
BERT\u901a\u8fc7\u4e24\u4e2a\u76ee\u6807\u8fdb\u884c\u9884\u8bad\u7ec3\u3002\u63a9\u7801\u8bed\u8a00\u5efa\u6a21\uff08MLM\uff09\u968f\u673a\u906e\u853d15%\u7684\u8f93\u5165\u6807\u8bb0\uff0c\u5e76\u8bad\u7ec3\u6a21\u578b\u53bb\u9884\u6d4b\u5b83\u4eec\u3002\u5728\u88ab\u9009\u4e2d\u7684\u6807\u8bb0\u4e2d\uff0c80%\u88ab\u66ff\u6362\u4e3a[MASK]\u6807\u8bb0\uff0c10%\u88ab\u66ff\u6362\u4e3a\u968f\u673a\u8bcd\uff0c10%\u4fdd\u6301\u4e0d\u53d8\uff08\u4ee5\u9632\u6b62\u6a21\u578b\u53ea\u5b66\u4f1a\u5728\u770b\u5230[MASK]\u65f6\u624d\u8fdb\u884c\u9884\u6d4b\uff09\u3002\u8bad\u7ec3\u76ee\u6807\u5982\u4e0b\uff1a
\u4e0b\u4e00\u53e5\u9884\u6d4b\uff08NSP\uff09\u8bad\u7ec3BERT\u9884\u6d4b\u4e24\u4e2a\u53e5\u5b50\u5728\u539f\u59cb\u6587\u672c\u4e2d\u662f\u5426\u8fde\u7eed\u3002\u8f93\u5165\u5f00\u5934\u7684\u7279\u6b8a[CLS]\u6807\u8bb0\u7528\u4e8e\u6b64\u4e8c\u5206\u7c7b\u3002NSP\u7684\u52a0\u5165\u662f\u4e3a\u4e86\u5e2e\u52a9\u7406\u89e3\u53e5\u5b50\u5173\u7cfb\u7684\u4efb\u52a1\uff08\u5982\u95ee\u7b54\uff09\uff0c\u4e0d\u8fc7\u540e\u6765\u7684\u5de5\u4f5c\uff08RoBERTa\uff09\u8868\u660e\u5176\u8d21\u732e\u5f88\u5c0f\uff0c\u53ef\u4ee5\u53bb\u6389\u3002
BERT\u7684\u9884\u8bad\u7ec3\u8868\u793a\u901a\u8fc7\u5728\u5176\u9876\u90e8\u6dfb\u52a0\u7279\u5b9a\u4efb\u52a1\u7684\u5934\u90e8\uff08\u4e00\u4e2a\u7b80\u5355\u7684\u7ebf\u6027\u5c42\uff09\u5e76\u5fae\u8c03\u6574\u4e2a\u6a21\u578b\u6765\u9002\u5e94\u4e0b\u6e38\u4efb\u52a1\u3002\u5bf9\u4e8e\u5206\u7c7b\u4efb\u52a1\uff0c\u4f7f\u7528[CLS]\u6807\u8bb0\u7684\u8868\u793a\u3002\u5bf9\u4e8e\u6807\u8bb0\u7ea7\u4efb\u52a1\uff08\u547d\u540d\u5b9e\u4f53\u8bc6\u522b\u3001\u8bcd\u6027\u6807\u6ce8\uff09\uff0c\u4f7f\u7528\u6bcf\u4e2a\u6807\u8bb0\u7684\u8868\u793a\u3002\u8fd9\u79cd\u5fae\u8c03\u65b9\u6cd5\u5c06\u9884\u8bad\u7ec3\u671f\u95f4\u5b66\u5230\u7684\u8bed\u8a00\u77e5\u8bc6\u8fc1\u79fb\u5230\u65b0\u4efb\u52a1\u4e0a\uff0c\u53ea\u9700\u76f8\u5bf9\u8f83\u5c11\u7684\u6807\u6ce8\u6570\u636e\u3002
GPT\uff08\u751f\u6210\u5f0f\u9884\u8bad\u7ec3Transformer\uff0cRadford\u7b49\u4eba\uff0c2018\uff09\u662f\u5178\u578b\u7684\u4ec5\u89e3\u7801\u5668\u6a21\u578b\u3002\u5b83\u4f7f\u7528\u56e0\u679c\uff08\u81ea\u56de\u5f52\uff09\u6ce8\u610f\u529b\uff1a\u6bcf\u4e2a\u6807\u8bb0\u53ea\u80fd\u5173\u6ce8\u66f4\u65e9\u4f4d\u7f6e\u7684\u6807\u8bb0\uff08\u4ee5\u53ca\u81ea\u8eab\uff09\u3002\u8fd9\u662f\u901a\u8fc7\u5728\u6ce8\u610f\u529b\u77e9\u9635\u4e2d\u906e\u853d\u672a\u6765\u4f4d\u7f6e\uff08\u5c06\u5176\u5206\u6570\u8bbe\u7f6e\u4e3a \\(-\\infty\\)\uff0c\u7136\u540e\u518d\u8fdb\u884csoftmax\uff09\u6765\u5b9e\u73b0\u7684\u3002\u8bad\u7ec3\u76ee\u6807\u662f\u7b80\u5355\u7684\u56e0\u679c\u8bed\u8a00\u5efa\u6a21\uff1a\u6839\u636e\u6240\u6709\u4e4b\u524d\u7684\u6807\u8bb0\u9884\u6d4b\u4e0b\u4e00\u4e2a\u6807\u8bb0\u3002
\u8fd9\u4e0e\u6587\u4ef602\u4e2d\u7684n-gram\u8bed\u8a00\u6a21\u578b\u76ee\u6807\u76f8\u540c\uff0c\u4f46\u91c7\u7528\u4e86Transformer\u53c2\u6570\u5316\u65b9\u5f0f\uff0c\u53ef\u4ee5\u57fa\u4e8e\u6574\u4e2a\u524d\u6587\u8fdb\u884c\u6761\u4ef6\u5efa\u6a21\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u6700\u540e \\(k-1\\) \u4e2a\u6807\u8bb0\u3002
GPT-2\u5c06\u5176\u89c4\u6a21\u6269\u5927\u523015\u4ebf\u53c2\u6570\uff0c\u5e76\u5c55\u73b0\u4e86\u5f3a\u5927\u7684\u96f6\u6837\u672c\u80fd\u529b\uff1a\u65e0\u9700\u4efb\u4f55\u5fae\u8c03\uff0c\u5b83\u5c31\u80fd\u901a\u8fc7\u81ea\u7136\u8bed\u8a00\u63d0\u793a\uff08\"\u5c06\u82f1\u8bed\u7ffb\u8bd1\u6210\u6cd5\u8bed\uff1a\u2026\u2026\"\uff09\u6765\u6267\u884c\u4efb\u52a1\u3002
GPT-3\uff081750\u4ebf\u53c2\u6570\uff09\u8868\u660e\uff0c\u4ec5\u51ed\u89c4\u6a21\u5c31\u80fd\u5b9e\u73b0\u4e0a\u4e0b\u6587\u5b66\u4e60\uff1a\u901a\u8fc7\u5728\u63d0\u793a\u4e2d\u63d0\u4f9b\u51e0\u4e2a\u8f93\u5165-\u8f93\u51fa\u793a\u4f8b\uff0c\u6a21\u578b\u65e0\u9700\u4efb\u4f55\u68af\u5ea6\u66f4\u65b0\u5c31\u80fd\u6267\u884c\u65b0\u4efb\u52a1\u3002
\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u578b\u5982T5\uff08\u6587\u672c\u5230\u6587\u672c\u8fc1\u79fbTransformer\uff0cRaffel\u7b49\u4eba\uff0c2020\uff09\u5c06\u6bcf\u4e2aNLP\u4efb\u52a1\u90fd\u89c6\u4e3a\u6587\u672c\u5230\u6587\u672c\uff1a\u8f93\u5165\u662f\u4e00\u4e2a\u6587\u672c\u5b57\u7b26\u4e32\uff08\u53ef\u80fd\u5e26\u6709\u4efb\u52a1\u524d\u7f00\uff0c\u5982\"\u5c06\u82f1\u8bed\u7ffb\u8bd1\u6210\u5fb7\u8bed\uff1a\"\uff09\uff0c\u8f93\u51fa\u4e5f\u662f\u4e00\u4e2a\u6587\u672c\u5b57\u7b26\u4e32\u3002\u7f16\u7801\u5668\u4f7f\u7528\u53cc\u5411\u6ce8\u610f\u529b\u5904\u7406\u8f93\u5165\uff0c\u89e3\u7801\u5668\u5219\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\u81ea\u56de\u5f52\u5730\u751f\u6210\u8f93\u51fa\u3002
T5\u901a\u8fc7\u8de8\u5ea6\u7834\u574f\u8fdb\u884c\u9884\u8bad\u7ec3\uff1a\u968f\u673a\u8fde\u7eed\u6807\u8bb0\u8de8\u5ea6\u88ab\u66ff\u6362\u4e3a\u54e8\u5175\u6807\u8bb0\uff0c\u6a21\u578b\u9700\u8981\u751f\u6210\u539f\u59cb\u6807\u8bb0\u3002\u4f8b\u5982\uff0c\"The cat sat on the mat\"\u53ef\u80fd\u53d8\u6210\u8f93\u5165\"The [X] on [Y]\"\uff0c\u76ee\u6807\u8f93\u51fa\u662f\"[X] cat sat [Y] the mat\"\u3002\u8fd9\u662fBERT\u7684MLM\u4ece\u5355\u4e2a\u6807\u8bb0\u5411\u8de8\u5ea6\u7684\u6cdb\u5316\u3002
BART\uff08Lewis\u7b49\u4eba\uff0c2020\uff09\u662f\u53e6\u4e00\u79cd\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u578b\uff0c\u901a\u8fc7\u53bb\u566a\u76ee\u6807\u8fdb\u884c\u9884\u8bad\u7ec3\uff0c\u4f46\u5b83\u5e94\u7528\u4e86\u66f4\u5e7f\u6cdb\u7684\u7834\u574f\u7b56\u7565\uff1a\u6807\u8bb0\u906e\u853d\u3001\u6807\u8bb0\u5220\u9664\u3001\u8de8\u5ea6\u906e\u853d\u3001\u53e5\u5b50\u7f6e\u6362\u548c\u6587\u6863\u65cb\u8f6c\u3002\u591a\u6837\u5316\u7684\u7834\u574f\u65b9\u5f0f\u8feb\u4f7f\u6a21\u578b\u5b66\u4e60\u66f4\u9c81\u68d2\u7684\u8868\u793a\u3002
\u968f\u7740\u8bed\u8a00\u6a21\u578b\u53d8\u5f97\u8d8a\u6765\u8d8a\u5927\uff0c\u5168\u91cf\u5fae\u8c03\uff08\u66f4\u65b0\u6240\u6709\u53c2\u6570\uff09\u53d8\u5f97\u4e0d\u5207\u5b9e\u9645\uff1a\u4e00\u4e2a175B\u53c2\u6570\u7684\u6a21\u578b\u4ec5\u5b58\u50a8\u4f18\u5316\u5668\u72b6\u6001\u5c31\u9700\u8981\u6570\u767eGB\u3002\u53c2\u6570\u9ad8\u6548\u5fae\u8c03\uff08PEFT\uff09\u65b9\u6cd5\u53ea\u8c03\u6574\u4e00\u5c0f\u90e8\u5206\u53c2\u6570\u3002
\u9002\u914d\u5668\u5728\u73b0\u6709Transformer\u5c42\u4e4b\u95f4\u63d2\u5165\u5c0f\u578b\u74f6\u9888\u5c42\uff08\u901a\u5e38\u662f\u4e24\u4e2a\u7ebf\u6027\u5c42\u52a0\u4e00\u4e2a\u975e\u7ebf\u6027\u6fc0\u6d3b\uff1a\u4e0b\u6295\u5f71\u5230\u5c0f\u7ef4\u5ea6\uff0c\u518d\u4e0a\u6295\u5f71\u56de\u6765\uff09\u3002\u53ea\u6709\u9002\u914d\u5668\u7684\u6743\u91cd\u88ab\u8bad\u7ec3\uff1b\u539f\u59cb\u6a21\u578b\u6743\u91cd\u88ab\u51bb\u7ed3\u3002\u8fd9\u589e\u52a0\u4e86\u4e0d\u52305%\u7684\u65b0\u53c2\u6570\uff0c\u540c\u65f6\u5728\u5927\u591a\u6570\u4efb\u52a1\u4e0a\u5339\u914d\u5168\u91cf\u5fae\u8c03\u7684\u6027\u80fd\u3002
LoRA\uff08\u4f4e\u79e9\u9002\u914d\uff09\u76f4\u63a5\u4fee\u6539\u6743\u91cd\u77e9\u9635\uff0c\u800c\u4e0d\u6dfb\u52a0\u65b0\u5c42\u3002LoRA\u4e0d\u66f4\u65b0\u5b8c\u6574\u7684\u6743\u91cd\u77e9\u9635 \\(W\\)\uff0c\u800c\u662f\u5b66\u4e60\u4e00\u4e2a\u4f4e\u79e9\u5206\u89e3\u7684\u66f4\u65b0\uff1a\\(W' = W + BA\\)\uff0c\u5176\u4e2d \\(B\\) \u662f \\(d \\times r\\) \u77e9\u9635\uff0c\\(A\\) \u662f \\(r \\times d\\) \u77e9\u9635\uff0c\u4e14 \\(r \\ll d\\)\uff08\u901a\u5e38 \\(r = 4\\) \u5230 \\(r = 64\\)\uff09\u3002\u539f\u59cb \\(W\\) \u88ab\u51bb\u7ed3\uff1b\u53ea\u8bad\u7ec3 \\(A\\) \u548c \\(B\\)\u3002\u5728\u63a8\u7406\u65f6\uff0c\u66f4\u65b0\u53ef\u4ee5\u5408\u5e76\u5230\u539f\u59cb\u6743\u91cd\u4e2d\uff0c\u4e0d\u4f1a\u589e\u52a0\u989d\u5916\u5ef6\u8fdf\uff1a
\u524d\u7f00\u5fae\u8c03\u5728\u6bcf\u4e2a\u6ce8\u610f\u529b\u5c42\u7684\u952e\u548c\u503c\u77e9\u9635\u524d\u6dfb\u52a0\u4e00\u4e32\u53ef\u5b66\u4e60\u7684\"\u865a\u62df\u6807\u8bb0\"\u3002\u6a21\u578b\u50cf\u5bf9\u5f85\u771f\u5b9e\u6807\u8bb0\u4e00\u6837\u5173\u6ce8\u8fd9\u4e9b\u524d\u7f00\u5411\u91cf\uff0c\u5e76\u4e14\u53ea\u8bad\u7ec3\u524d\u7f00\u53c2\u6570\u3002\u8fd9\u4e0e\u63d0\u793a\u5fae\u8c03\u7c7b\u4f3c\uff0c\u4f46\u5728\u6fc0\u6d3b\u7a7a\u95f4\u800c\u975e\u5d4c\u5165\u7a7a\u95f4\u4e2d\u64cd\u4f5c\u3002
\u63d0\u793a\u5de5\u7a0b\u662f\u8bbe\u8ba1\u8f93\u5165\u6587\u672c\u7684\u827a\u672f\uff0c\u65e8\u5728\u4ece\u9884\u8bad\u7ec3\u6a21\u578b\u4e2d\u5f15\u51fa\u6240\u9700\u884c\u4e3a\uff0c\u800c\u65e0\u9700\u4efb\u4f55\u53c2\u6570\u66f4\u65b0\u3002
\u96f6\u6837\u672c\u63d0\u793a\u7528\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\u4efb\u52a1\uff08\"\u5bf9\u4ee5\u4e0b\u8bc4\u8bba\u7684\u60c5\u611f\u8fdb\u884c\u5206\u7c7b\uff1a\"\uff09\u3002
\u5c11\u6837\u672c\u63d0\u793a\u5728\u5b9e\u9645\u67e5\u8be2\u4e4b\u524d\u63d0\u4f9b\u8f93\u5165-\u8f93\u51fa\u793a\u4f8b\u3002
\u94fe\u5f0f\u601d\u7ef4\uff08CoT\uff09\u63d0\u793a\u6dfb\u52a0\"\u8ba9\u6211\u4eec\u4e00\u6b65\u4e00\u6b65\u5730\u601d\u8003\"\u6216\u5728\u793a\u4f8b\u4e2d\u5305\u542b\u63a8\u7406\u8fc7\u7a0b\uff0c\u8fd9\u901a\u8fc7\u5f15\u5bfc\u6a21\u578b\u5206\u89e3\u95ee\u9898\uff0c\u663e\u8457\u63d0\u9ad8\u4e86\u7b97\u672f\u548c\u903b\u8f91\u63a8\u7406\u4efb\u52a1\u7684\u6027\u80fd\u3002
\u4e0a\u4e0b\u6587\u5b66\u4e60\uff08ICL\uff09\u662f\u5927\u8bed\u8a00\u6a21\u578b\u80fd\u591f\u4ece\u63d0\u793a\u4e2d\u63d0\u4f9b\u7684\u793a\u4f8b\u5b66\u4e60\u6267\u884c\u4efb\u52a1\u7684\u73b0\u8c61\uff0c\u800c\u65e0\u9700\u4efb\u4f55\u68af\u5ea6\u66f4\u65b0\u3002\u6a21\u578b\u7684\u6743\u91cd\u6ca1\u6709\u6539\u53d8\uff1b\u5b83\u5c06\u793a\u4f8b\u4f5c\u4e3a\u4e00\u79cd\u9690\u5f0f\u89c4\u8303\u6765\u4f7f\u7528\u3002
ICL\u5728\u673a\u5236\u4e0a\u662f\u5982\u4f55\u5de5\u4f5c\u7684\u4ecd\u7136\u662f\u4e00\u4e2a\u6d3b\u8dc3\u7684\u7814\u7a76\u95ee\u9898\uff1b\u4e00\u79cd\u5047\u8bf4\u662f\u6ce8\u610f\u529b\u5c42\u5728\u524d\u5411\u4f20\u64ad\u4e2d\u5b9e\u73b0\u4e86\u4e00\u79cd\u68af\u5ea6\u4e0b\u964d\u5f62\u5f0f\uff0c\u5b9e\u9645\u4e0a\u662f\u5728\u4e0a\u4e0b\u6587\u793a\u4f8b\u4e0a\u8fdb\u884c\"\u8bad\u7ec3\"\u3002
\u7f29\u653e\u5b9a\u5f8b\u63cf\u8ff0\u4e86\u6a21\u578b\u5927\u5c0f\u3001\u6570\u636e\u5927\u5c0f\u3001\u8ba1\u7b97\u9884\u7b97\u4e0e\u6027\u80fd\uff08\u4ee5\u635f\u5931\u8861\u91cf\uff09\u4e4b\u95f4\u7684\u53ef\u9884\u6d4b\u5173\u7cfb\u3002Kaplan\u7b49\u4eba\uff082020\uff09\u53d1\u73b0\u635f\u5931\u5728\u6bcf\u4e2a\u53d8\u91cf\u4e0a\u90fd\u9075\u5faa\u5e42\u5f8b\uff1a
\u8fd9\u610f\u5473\u7740\u5982\u679c\u8ba1\u7b97\u9884\u7b97\u7ffb\u500d\uff0c\u5e94\u8be5\u540c\u65f6\u5c06\u6a21\u578b\u5927\u5c0f\u548c\u6570\u636e\u96c6\u5927\u5c0f\u589e\u52a0 \\(\\sqrt{2}\\) \u500d\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u8ba9\u6a21\u578b\u53d8\u5f97\u66f4\u5927\u3002
Kaplan\u7b49\u4eba\u66fe\u5efa\u8bae \\(N\\) \u7684\u7f29\u653e\u901f\u5ea6\u5e94\u5feb\u4e8e \\(D\\)\uff0c\u8fd9\u5bfc\u81f4\u4e86\u975e\u5e38\u5927\u4f46\u8bad\u7ec3\u4e0d\u8db3\u7684\u6a21\u578b\u3002Chinchilla\uff0870B\u53c2\u6570\uff0c1.4T\u6807\u8bb0\uff09\u5728\u76f8\u540c\u7684\u8ba1\u7b97\u9884\u7b97\u4e0b\u5339\u914d\u4e86Gopher\uff08280B\u53c2\u6570\uff0c300B\u6807\u8bb0\uff09\u7684\u6027\u80fd\uff0c\u8868\u660e\u65e9\u671f\u6a21\u578b\u4e25\u91cd\u7f3a\u4e4f\u6570\u636e\u3002
\u5b9e\u7528\u7684\u7ecf\u9a8c\u6cd5\u5219\uff1a\u5927\u7ea6\u6bcf\u4e2a\u53c2\u6570\u8bad\u7ec320\u4e2a\u6807\u8bb0\u3002
\u6df7\u5408\u4e13\u5bb6\uff08MoE\uff09\u662f\u4e00\u79cd\u5728\u4e0d\u6210\u6bd4\u4f8b\u589e\u52a0\u8ba1\u7b97\u91cf\u7684\u60c5\u51b5\u4e0b\u6269\u5927\u6a21\u578b\u5bb9\u91cf\u7684\u67b6\u6784\u3002MoE\u4e0d\u91c7\u7528\u5355\u4e00\u7684\u5927\u578b\u524d\u9988\u5c42\uff0c\u800c\u662f\u4f7f\u7528\u591a\u4e2a\u4e13\u5bb6FFN\u5c42\u548c\u4e00\u4e2a\u95e8\u63a7\u7f51\u7edc\uff08\u8def\u7531\u7f51\u7edc\uff09\u6765\u9009\u62e9\u6bcf\u4e2a\u6807\u8bb0\u5e94\u8be5\u6fc0\u6d3b\u54ea\u4e9b\u4e13\u5bb6\u3002
\u95e8\u63a7\u51fd\u6570\u8ba1\u7b97\u6bcf\u4e2a\u4e13\u5bb6\u7684\u8def\u7531\u5206\u6570\uff0c\u5e76\u9009\u62e9\u524d \\(k\\) \u4e2a\uff08\u901a\u5e38 \\(k = 1\\) \u6216 \\(k = 2\\)\uff09\uff1a
\u5176\u4e2d \\(f_i\\) \u662f\u5206\u914d\u7ed9\u4e13\u5bb6 \\(i\\) \u7684\u6807\u8bb0\u6bd4\u4f8b\uff0c\\(p_i\\) \u662f\u4e13\u5bb6 \\(i\\) \u7684\u5e73\u5747\u8def\u7531\u6982\u7387\u3002\u5f53\u6807\u8bb0\u6bd4\u4f8b\u548c\u6982\u7387\u90fd\u5747\u5300\uff08\u5404\u7b49\u4e8e \\(1/E\\)\uff09\u65f6\uff0c\u8be5\u4e58\u79ef\u6700\u5c0f\u3002
\u4e13\u5bb6\u5e76\u884c\u5c06\u4e0d\u540c\u7684\u4e13\u5bb6\u5206\u5e03\u5230\u4e0d\u540c\u7684\u52a0\u901f\u5668\u4e0a\u3002\u5728\u524d\u5411\u4f20\u64ad\u8fc7\u7a0b\u4e2d\uff0c\u901a\u8fc7\u4e00\u4e2a\u5168\u5230\u5168\u7684\u901a\u4fe1\u6b65\u9aa4\u5c06\u6807\u8bb0\u8def\u7531\u5230\u5176\u6307\u5b9a\u4e13\u5bb6\u6240\u5728\u7684\u8bbe\u5907\uff0c\u7136\u540e\u5c06\u7ed3\u679c\u8def\u7531\u56de\u6765\u3002\u8fd9\u79cd\u901a\u4fe1\u6210\u672c\u662fMoE\u5728\u5927\u89c4\u6a21\u90e8\u7f72\u4e2d\u7684\u4e3b\u8981\u5de5\u7a0b\u6311\u6218\u3002Switch Transformer\u3001Mixtral\u548cGShard\u7b49\u6a21\u578b\u4f7f\u7528MoE\u6765\u83b7\u5f97\u5f3a\u5927\u7684\u6027\u80fd\uff0c\u540c\u65f6\u4fdd\u6301\u5408\u7406\u7684\u63a8\u7406\u6210\u672c\u3002
\u6784\u5efa\u6a21\u578b\u53ea\u662f\u5de5\u4f5c\u7684\u4e00\u534a\uff1b\u8861\u91cf\u5b83\u4eec\u662f\u5426\u6709\u6548\u662f\u53e6\u4e00\u534a\u3002NLP\u8bc4\u4f30\u7279\u522b\u56f0\u96be\uff0c\u56e0\u4e3a\u8bed\u8a00\u662f\u6a21\u7cca\u7684\u3001\u4e3b\u89c2\u7684\u548c\u5f00\u653e\u5f0f\u7684\u3002
\u4e00\u4e2a\u7ffb\u8bd1\u53ef\u4ee5\u6709\u591a\u79cd\u6b63\u786e\u7684\u8868\u8fbe\u65b9\u5f0f\u3002\u4e00\u4e2a\u6458\u8981\u5373\u4f7f\u4e0e\u53c2\u8003\u6458\u8981\u6ca1\u6709\u4efb\u4f55\u5b8c\u5168\u76f8\u540c\u7684\u8bcd\u6c47\uff0c\u4e5f\u53ef\u80fd\u662f\u597d\u7684\u3002
\u4e00\u4e2a\u804a\u5929\u673a\u5668\u4eba\u7684\u56de\u590d\u53ef\u80fd\u65e2\u6709\u7528\u3001\u53c8\u65e0\u5bb3\u3001\u53c8\u8bda\u5b9e\uff0c\u4f46\u7406\u6027\u7684\u4eba\u4ecd\u4f1a\u5bf9\u6b64\u6709\u4e0d\u540c\u770b\u6cd5\u3002
\u7cbe\u786e\u5339\u914d\uff08EM\uff09\u662f\u6700\u7b80\u5355\u7684\u6307\u6807\uff1a\u6a21\u578b\u7684\u8f93\u51fa\u662f\u5426\u4e0e\u6807\u51c6\u7b54\u6848\u5b8c\u5168\u4e00\u81f4\uff1f\u5b83\u7528\u4e8e\u7b54\u6848\u7b80\u77ed\u4e14\u65e0\u6b67\u4e49\u7684\u4efb\u52a1\uff0c\u5982\u62bd\u53d6\u5f0f\u95ee\u7b54\uff08SQuAD\uff09\u6216\u5c01\u95ed\u5f0f\u6570\u5b66\u95ee\u9898\u3002
EM\u662f\u4e25\u82db\u7684\uff1b\"New York City\"\u548c\"new york city\"\u5728\u4e0d\u505a\u5f52\u4e00\u5316\u7684\u60c5\u51b5\u4e0b\u65e0\u6cd5\u5339\u914d\u2014\u2014\u4f46\u5b83\u7684\u7b80\u5355\u6027\u4f7f\u5176\u6ca1\u6709\u6b67\u4e49\u3002
\u6807\u8bb0\u7ea7\u6307\u6807\u5c06NLP\u89c6\u4e3a\u6807\u8bb0\u7ea7\u522b\u7684\u5206\u7c7b\u95ee\u9898\uff0c\u4f7f\u7528\u7b2c06\u7ae0\u4e2d\u7684\u7cbe\u786e\u7387\u3001\u53ec\u56de\u7387\u548cF1\u503c\u3002
\u7cbe\u786e\u7387\uff08Precision\uff09\u8861\u91cf\u6a21\u578b\u9884\u6d4b\u7684\u6807\u8bb0\u4e2d\u6b63\u786e\u90e8\u5206\u7684\u6bd4\u4f8b\uff1a\\(P = \\text{TP} / (\\text{TP} + \\text{FP})\\)\u3002\u4e00\u4e2a\u9884\u6d4b\u5f88\u5c11\u4f46\u5168\u90e8\u6b63\u786e\u7684\u6a21\u578b\u5177\u6709\u9ad8\u7cbe\u786e\u7387\u3002
\u53ec\u56de\u7387\uff08Recall\uff09\u8861\u91cf\u6a21\u578b\u627e\u5230\u4e86\u591a\u5c11\u6807\u51c6\u6807\u8bb0\uff1a\\(R = \\text{TP} / (\\text{TP} + \\text{FN})\\)\u3002\u4e00\u4e2a\u5c06\u6240\u6709\u6807\u8bb0\u90fd\u9884\u6d4b\u4e3a\u5b9e\u4f53\u7684\u6a21\u578b\u5177\u6709\u5b8c\u7f8e\u7684\u53ec\u56de\u7387\u4f46\u7cbe\u786e\u7387\u6781\u4f4e\u3002
F1\u662f\u7cbe\u786e\u7387\u548c\u53ec\u56de\u7387\u7684\u8c03\u548c\u5e73\u5747\u503c\uff1a
\u8c03\u548c\u5e73\u5747\u503c\uff08\u800c\u975e\u7b97\u672f\u5e73\u5747\u503c\uff09\u60e9\u7f5a\u4e0d\u5747\u8861\uff1a\u5982\u679c \\(P\\) \u6216 \\(R\\) \u4e2d\u4efb\u4f55\u4e00\u4e2a\u8f83\u4f4e\uff0cF1\u5c31\u4f1a\u5f88\u4f4e\u3002\u5bf9\u4e8e\u547d\u540d\u5b9e\u4f53\u8bc6\u522b\uff08\u6587\u4ef602\uff09\uff0cF1\u6309\u6bcf\u4e2a\u5b9e\u4f53\u7c7b\u578b\u5206\u522b\u8ba1\u7b97\uff0c\u7136\u540e\u8de8\u7c7b\u578b\u53d6\u5b8f\u5e73\u5747\u3002\u5bf9\u4e8e\u8bcd\u6027\u6807\u6ce8\uff0c\u6807\u8bb0\u7ea7\u51c6\u786e\u7387\u66f4\u5e38\u89c1\uff0c\u56e0\u4e3a\u6bcf\u4e2a\u6807\u8bb0\u90fd\u6709\u4e00\u4e2a\u6807\u7b7e\u3002
\u8de8\u5ea6\u7ea7F1\uff08\u7528\u4e8eSQuAD\uff09\u6bd4\u8f83\u9884\u6d4b\u8de8\u5ea6\u4e2d\u7684\u6807\u8bb0\u96c6\u4e0e\u6807\u51c6\u8de8\u5ea6\u4e2d\u7684\u6807\u8bb0\u96c6\u3002\u8fd9\u6bd4\u7cbe\u786e\u5339\u914d\u66f4\u5bbd\u5bb9\uff1a\u5982\u679c\u6807\u51c6\u7b54\u6848\u662f\"the Eiffel Tower\"\u800c\u6a21\u578b\u9884\u6d4b\u7684\u662f\"Eiffel Tower\"\uff0c\u8de8\u5ea6F1\u5f88\u9ad8\uff085\u4e2a\u91cd\u53e0\u6807\u8bb0\u4e2d\u76844\u4e2a\uff09\uff0c\u5373\u4f7fEM\u4e3a\u96f6\u3002
BLEU\uff08\u53cc\u8bed\u8bc4\u4f30\u66ff\u8865\uff0cPapineni\u7b49\u4eba\uff0c2002\uff09\u662f\u673a\u5668\u7ffb\u8bd1\u7684\u7ecf\u5178\u6307\u6807\u3002\u5b83\u8861\u91cf\u5019\u9009\u7ffb\u8bd1\u4e0e\u4e00\u4e2a\u6216\u591a\u4e2a\u53c2\u8003\u7ffb\u8bd1\u4e4b\u95f4\u7684n-gram\u91cd\u53e0\u3002\u8be5\u8bc4\u5206\u7ed3\u5408\u4e86\u591a\u4e2an-gram\u7ea7\u522b\uff08unigram\u52304-gram\uff09\u7684\u7cbe\u786e\u7387\u548c\u4e00\u4e2a\u7b80\u77ed\u60e9\u7f5a\uff1a
\u5176\u4e2d \\(p_n\\) \u662f\u4fee\u6b63\u7684n-gram\u7cbe\u786e\u7387\uff1a\u5019\u9009\u7ffb\u8bd1\u4e2d\u6bcf\u4e2an-gram\u7684\u8ba1\u6570\u88ab\u88c1\u526a\u4e3a\u5176\u5728\u4efb\u4f55\u53c2\u8003\u7ffb\u8bd1\u4e2d\u7684\u6700\u5927\u8ba1\u6570\uff0c\u9632\u6b62\u50cf\"the the the the\"\u8fd9\u6837\u7684\u9000\u5316\u5019\u9009\u83b7\u5f97\u9ad8\u5206\u3002\u6743\u91cd \\(w_n\\) \u901a\u5e38\u662f\u5747\u5300\u7684\uff08\\(w_n = 1/N\\)\uff0c\u5176\u4e2d \\(N = 4\\)\uff09\u3002
\u7b80\u77ed\u60e9\u7f5a \\(\\text{BP} = \\min(1, \\exp(1 - r/c))\\) \u60e9\u7f5a\u6bd4\u53c2\u8003\u7ffb\u8bd1\u77ed\u7684\u5019\u9009\uff08\\(c\\) \u662f\u5019\u9009\u957f\u5ea6\uff0c\\(r\\) \u662f\u53c2\u8003\u957f\u5ea6\uff09\u3002\u6ca1\u6709\u8fd9\u4e2a\u60e9\u7f5a\uff0c\u6a21\u578b\u53ef\u4ee5\u901a\u8fc7\u8f93\u51fa\u5f88\u5c11\u4f46\u975e\u5e38\u5b89\u5168\u7684\u8bcd\u6765\u83b7\u5f97\u9ad8\u7cbe\u786e\u7387\u3002
BLEU\u5728\u8bed\u6599\u7ea7\u522b\uff08\u5bf9\u591a\u4e2a\u53e5\u5b50\u53d6\u5e73\u5747\uff09\u4e0e\u4eba\u7c7b\u5224\u65ad\u6709\u5408\u7406\u7684\u76f8\u5173\u6027\uff0c\u4f46\u5728\u53e5\u5b50\u7ea7\u522b\u76f8\u5173\u6027\u8f83\u5dee\u3002
\u5b83\u5956\u52b1\u7cbe\u786e\u7684n-gram\u5339\u914d\uff0c\u4f46\u4f1a\u9057\u6f0f\u6709\u6548\u7684\u91ca\u4e49\uff1a\"the cat is on the mat\"\u548c\"a feline sits atop the rug\"\u5c3d\u7ba1\u610f\u601d\u76f8\u540c\uff0c\u4f46\u4e8c\u5143\u7ec4\u91cd\u53e0\u4e3a\u96f6\u3002
BLEU\u4e5f\u5b8c\u5168\u5ffd\u7565\u4e86\u53ec\u56de\u7387\u2014\u2014\u53ea\u8f93\u51fa\u6700\u5e38\u89c1\u8bcd\u6c47\u7684\u5019\u9009\u5728\u7cbe\u786e\u7387\u4e0a\u5f97\u5206\u5f88\u9ad8\u3002
ROUGE\uff08\u9762\u5411\u53ec\u56de\u7387\u7684\u6458\u8981\u8bc4\u4f30\u66ff\u8865\uff0cLin\uff0c2004\uff09\u662f\u6458\u8981\u7684\u6807\u51c6\u6307\u6807\u3002\u4e0e\u5f3a\u8c03\u7cbe\u786e\u7387\u7684BLEU\u4e0d\u540c\uff0cROUGE\u5f3a\u8c03\u53ec\u56de\u7387\uff1a\u53c2\u8003n-gram\u4e2d\u6709\u591a\u5c11\u6bd4\u4f8b\u51fa\u73b0\u5728\u5019\u9009\u6458\u8981\u4e2d\uff1f
ROUGE-N\u8ba1\u7b97n-gram\u7684\u53ec\u56de\u7387\uff1a\\(\\text{ROUGE-N} = \\frac{|\\text{n-grams}_{\\text{ref}} \\cap \\text{n-grams}_{\\text{cand}}|}{|\\text{n-grams}_{\\text{ref}}|}\\)\u3002ROUGE-1\uff08unigram\uff09\u548cROUGE-2\uff08bigram\uff09\u6700\u4e3a\u5e38\u7528\u3002
ROUGE-L\u4f7f\u7528\u5019\u9009\u548c\u53c2\u8003\u4e4b\u95f4\u7684\u6700\u957f\u516c\u5171\u5b50\u5e8f\u5217\uff08LCS\uff09\uff0c\u8fd9\u53ef\u4ee5\u6355\u6349\u53e5\u5b50\u7ea7\u522b\u7684\u8bcd\u5e8f\u4fe1\u606f\uff0c\u800c\u4e0d\u8981\u6c42\u8fde\u7eed\u5339\u914d\u3002
LCS\u957f\u5ea6\u9664\u4ee5\u53c2\u8003\u957f\u5ea6\u5f97\u5230\u53ec\u56de\u7387\uff0c\u9664\u4ee5\u5019\u9009\u957f\u5ea6\u5f97\u5230\u7cbe\u786e\u7387\uff0cF\u5ea6\u91cf\u5219\u7ec4\u5408\u4e24\u8005\u3002
LCS\u901a\u8fc7\u52a8\u6001\u89c4\u5212\u5728 \\(O(mn)\\) \u65f6\u95f4\u5185\u8ba1\u7b97\uff08\u7c7b\u4f3c\u4e8e\u6587\u4ef602\u4e2d\u7684\u7f16\u8f91\u8ddd\u79bb\uff09\uff1a
\u5176\u4e2d \\(m\\) \u548c \\(n\\) \u5206\u522b\u662f\u53c2\u8003\u548c\u5019\u9009\u7684\u957f\u5ea6\uff0c\\(\\beta\\) \u901a\u5e38\u8bbe\u7f6e\u4e3a\u504f\u5411\u53ec\u56de\u7387\uff08\\(\\beta \\to \\infty\\) \u7ed9\u51fa\u7eaf\u53ec\u56de\u7387\uff09\u3002
METEOR\uff08\u5e26\u663e\u5f0f\u6392\u5e8f\u7684\u7ffb\u8bd1\u8bc4\u4f30\u5ea6\u91cf\uff0cBanerjee\u548cLavie\uff0c2005\uff09\u901a\u8fc7\u5f15\u5165\u540c\u4e49\u8bcd\u3001\u8bcd\u5e72\u63d0\u53d6\u548c\u8bcd\u5e8f\u6765\u89e3\u51b3BLEU\u7684\u5f31\u70b9\u3002
\u5b83\u9996\u5148\u4f7f\u7528\u7cbe\u786e\u5339\u914d\u3001\u8bcd\u5e72\u5339\u914d\uff08\u901a\u8fc7\u6587\u4ef602\u4e2d\u7684Porter\u8bcd\u5e72\u63d0\u53d6\u7b97\u6cd5\uff09\u548c\u540c\u4e49\u8bcd\u5339\u914d\uff08\u901a\u8fc7\u6587\u4ef601\u4e2d\u7684WordNet\uff09\u5728\u5019\u9009\u548c\u53c2\u8003\u4e4b\u95f4\u5bf9\u9f50\u8bcd\u6c47\u3002
\u7136\u540e\u8ba1\u7b97unigram\u7cbe\u786e\u7387\u548c\u53ec\u56de\u7387\u7684\u8c03\u548c\u5e73\u5747\u503c\uff08\u504f\u5411\u53ec\u56de\u7387\uff09\uff0c\u5e76\u5e94\u7528\u4e00\u4e2a\u788e\u7247\u5316\u60e9\u7f5a\uff0c\u60e9\u7f5a\u90a3\u4e9b\u5339\u914d\u8bcd\u987a\u5e8f\u4e0e\u53c2\u8003\u4e0d\u540c\u7684\u5019\u9009\u3002
ChrF\uff08\u5b57\u7b26n-gram F\u503c\uff09\u8ba1\u7b97\u5b57\u7b26n-gram\u800c\u975e\u8bcd\u6c47n-gram\u7684F\u503c\u3002\u8fd9\u4f7f\u5176\u5bf9\u5f62\u6001\u53d8\u5316\u5177\u6709\u9c81\u68d2\u6027\uff08\u5bf9\u6587\u4ef601\u4e2d\u7684\u9ecf\u7740\u8bed\u81f3\u5173\u91cd\u8981\uff09\uff0c\u5e76\u90e8\u5206\u5904\u7406\u4e86\u5206\u8bcd\u5dee\u5f02\u3002ChrF++\u5728\u5b57\u7b26n-gram\u7684\u57fa\u7840\u4e0a\u589e\u52a0\u4e86\u8bcd\u6c47\u4e8c\u5143\u7ec4\u3002
\u5b83\u5df2\u6210\u4e3a\u673a\u5668\u7ffb\u8bd1\u4e2d\u4e0eBLEU\u4e00\u8d77\u63a8\u8350\u7684\u5ea6\u91cf\u6807\u51c6\uff0c\u7279\u522b\u662f\u5bf9\u4e8e\u5f62\u6001\u4e30\u5bcc\u7684\u8bed\u8a00\u3002
\u56f0\u60d1\u5ea6\uff08\u6587\u4ef602\uff09\u8861\u91cf\u8bed\u8a00\u6a21\u578b\u5728\u4fdd\u7559\u6d4b\u8bd5\u96c6\u4e0a\u7684\u9884\u6d4b\u6548\u679c\u3002\u8fd9\u662f\u8bed\u8a00\u6a21\u578b\u7684\u6807\u51c6\u5185\u5728\u6307\u6807\uff1a\\(\\text{PPL} = \\exp(-\\frac{1}{N} \\sum_{i} \\log P(w_i \\mid w_{<i}))\\)\u3002\u8d8a\u4f4e\u8d8a\u597d\u3002
\u56f0\u60d1\u5ea6\u53ea\u80fd\u5728\u4f7f\u7528\u4e86\u76f8\u540c\u5206\u8bcd\u65b9\u6cd5\u7684\u6a21\u578b\u4e4b\u95f4\u8fdb\u884c\u6bd4\u8f83\uff0c\u56e0\u4e3a\u4e0d\u540c\u7684\u5206\u8bcd\u5668\u5bf9\u540c\u4e00\u6587\u672c\u4f1a\u4ea7\u751f\u4e0d\u540c\u7684\u5e8f\u5217\u957f\u5ea6 \\(N\\)\u3002
\u8bcd\u6c47\u91cf\u66f4\u5927\u7684\u6a21\u578b\u6bcf\u4e2a\u6807\u8bb0\u7684\u56f0\u60d1\u5ea6\u5f80\u5f80\u66f4\u4f4e\uff0c\u4f46\u6bcf\u4e2a\u53e5\u5b50\u5904\u7406\u7684\u6807\u8bb0\u6570\u4e5f\u66f4\u5c11\u3002
\u6bcf\u5b57\u8282\u6bd4\u7279\u6570\uff08BPB\uff09\u6309\u7167\u6587\u672c\u4e2dUTF-8\u5b57\u8282\u6570\u800c\u975e\u6807\u8bb0\u6570\u8fdb\u884c\u5f52\u4e00\u5316\uff0c\u4f7f\u5176\u4e0e\u5206\u8bcd\u65b9\u5f0f\u65e0\u5173\uff1a
\u5176\u4e2d \\(r_i\\) \u548c \\(c_j\\) \u662f\u53c2\u8003\u548c\u5019\u9009\u6807\u8bb0\u7684\u4e0a\u4e0b\u6587\u5d4c\u5165\u3002\u8fd9\u6355\u6349\u4e86n-gram\u6307\u6807\u65e0\u6cd5\u6355\u6349\u7684\u8bed\u4e49\u76f8\u4f3c\u6027\uff1a\"automobile\"\u548c\"car\"\u5f97\u5206\u5f88\u9ad8\uff0c\u56e0\u4e3a\u5b83\u4eec\u7684BERT\u5d4c\u5165\u76f8\u4f3c\uff0c\u5c3d\u7ba1\u5b83\u4eec\u6ca1\u6709\u5171\u4eab\u4efb\u4f55\u5b57\u7b26\u3002
BLEURT\uff08Sellam\u7b49\u4eba\uff0c2020\uff09\u5728\u6b64\u57fa\u7840\u4e0a\u66f4\u8fdb\u4e00\u6b65\uff0c\u76f4\u63a5\u5728\u4eba\u5de5\u8d28\u91cf\u5224\u65ad\u4e0a\u5fae\u8c03BERT\u6a21\u578b\u3002\u7ed9\u5b9a\u4e00\u4e2a\u53c2\u8003\u548c\u5019\u9009\u5bf9\uff0c\u5b83\u8f93\u51fa\u4e00\u4e2a\u6807\u91cf\u8d28\u91cf\u5206\u6570\u3002BLEURT\u5728\u5408\u6210\u6570\u636e\uff08\u7531BLEU\u548cMETEOR\u7b49\u6307\u6807\u8bc4\u5206\u7684\u53c2\u8003\u7ffb\u8bd1\u7684\u968f\u673a\u6270\u52a8\uff09\u4e0a\u8bad\u7ec3\uff0c\u7136\u540e\u5728\u4eba\u5de5\u8bc4\u5206\u4e0a\u5fae\u8c03\u3002\u5b83\u4e0e\u4eba\u7c7b\u5224\u65ad\u7684\u76f8\u5173\u6027\u4f18\u4e8e\u4efb\u4f55\u8868\u9762\u7ea7\u6307\u6807\u3002
COMET\uff08\u7ffb\u8bd1\u8bc4\u4f30\u8de8\u8bed\u8a00\u4f18\u5316\u6307\u6807\uff0cRei\u7b49\u4eba\uff0c2020\uff09\u662f\u4e00\u4e2a\u7528\u4e8e\u673a\u5668\u7ffb\u8bd1\u7684\u5b66\u4e60\u5ea6\u91cf\uff0c\u5b83\u540c\u65f6\u4ee5\u6e90\u53e5\u3001\u53c2\u8003\u548c\u5019\u9009\u4f5c\u4e3a\u6761\u4ef6\u2014\u2014\u800c\u4e0d\u4ec5\u4ec5\u662f\u53c2\u8003\u548c\u5019\u9009\u3002\u5b83\u4f7f\u7528\u591a\u8bed\u8a00\u7f16\u7801\u5668\uff08XLM-R\uff09\u5d4c\u5165\u4e09\u8005\uff0c\u5e76\u9884\u6d4b\u8d28\u91cf\u5206\u6570\u3002\u901a\u8fc7\u770b\u5230\u6e90\u53e5\uff0cCOMET\u53ef\u4ee5\u68c0\u6d4b\u4ec5\u57fa\u4e8e\u53c2\u8003\u7684\u6307\u6807\u6240\u9057\u6f0f\u7684\u610f\u4e49\u9519\u8bef\uff08\u4f8b\u5982\uff0c\u6d41\u7545\u4f46\u4e8b\u5b9e\u9519\u8bef\u7684\u7ffb\u8bd1\uff09\u3002
\u5927\u8bed\u8a00\u6a21\u578b\u4f5c\u4e3a\u88c1\u5224\uff08LLM-as-judge\uff09\u662f\u5927\u89c4\u6a21\u8bc4\u4f30\u7684\u73b0\u4ee3\u65b9\u6cd5\u3002\u4e0d\u518d\u8ba1\u7b97\u4e0e\u53c2\u8003\u7684\u6307\u6807\uff0c\u800c\u662f\u8ba9\u4e00\u4e2a\u5f3a\u5927\u7684\u8bed\u8a00\u6a21\u578b\uff08GPT-4\u3001Claude\uff09\u88ab\u63d0\u793a\u8bc4\u4f30\u6a21\u578b\u8f93\u51fa\u7684\u8d28\u91cf\u3002\u88c1\u5224\u63a5\u6536\u8f93\u5165\u3001\u6a21\u578b\u7684\u56de\u590d\u4ee5\u53ca\u53ef\u9009\u7684\u53c2\u8003\u7b54\u6848\uff0c\u5e76\u7ed9\u51fa\u8bc4\u5206\uff08\u4f8b\u59821-5\u5206\uff09\u6216\u6210\u5bf9\u504f\u597d\uff08\u56de\u590dA\u4f18\u4e8e\u56de\u590dB\uff09\u3002
\u6210\u5bf9\u6bd4\u8f83\uff08\u7528\u4e8eChatbot Arena\uff09\u662f\u6700\u53ef\u9760\u7684LLM-as-judge\u683c\u5f0f\u3002\u88c1\u5224\u770b\u5230\u4e24\u4e2a\u56de\u590d\u5e76\u9009\u62e9\u66f4\u597d\u7684\u90a3\u4e2a\uff0c\u800c\u4e0d\u662f\u7ed9\u51fa\u7edd\u5bf9\u5206\u6570\u3002\u8fd9\u907f\u514d\u4e86\u6821\u51c6\u95ee\u9898\uff08\u4e0d\u540c\u7684\u88c1\u5224\u53ef\u80fd\u5bf9\"3/5\"\u6709\u4e0d\u540c\u7684\u57fa\u51c6\uff09\u3002\u7ed3\u679c\u6c47\u603b\u4e3aElo\u8bc4\u5206\uff08\u6e90\u81ea\u56fd\u9645\u8c61\u68cb\uff09\uff0c\u6bcf\u4e2a\u6a21\u578b\u4ece\u4e00\u4e2a\u57fa\u51c6\u8bc4\u5206\u5f00\u59cb\uff0c\u6839\u636e\u4e0e\u5176\u4ed6\u6a21\u578b\u7684\u5bf9\u6218\u80dc\u8d1f\u589e\u51cf\u5206\u6570\u3002\u6a21\u578b \\(A\\) \u5bf9\u6a21\u578b \\(B\\) \u7684\u9884\u671f\u83b7\u80dc\u6982\u7387\u4e3a\uff1a
\u5176\u4e2d \\(R_A, R_B\\) \u662fElo\u8bc4\u5206\u3002\u6bcf\u6b21\u6bd4\u8f83\u540e\uff0c\u8bc4\u5206\u66f4\u65b0\uff1a\\(R_A' = R_A + K(S - P(A \\succ B))\\)\uff0c\u5176\u4e2d \\(S \\in \\{0, 1\\}\\) \u662f\u5b9e\u9645\u7ed3\u679c\uff0c\\(K\\) \u63a7\u5236\u66f4\u65b0\u5e45\u5ea6\u3002\u6301\u7eed\u51fb\u8d25\u5f3a\u5bf9\u624b\u7684\u6a21\u578b\u5feb\u901f\u4e0a\u5347\uff1b\u8f93\u7ed9\u5f31\u5bf9\u624b\u7684\u6a21\u578b\u4e0b\u964d\u3002
\u4f4d\u7f6e\u504f\u7f6e\u662fLLM\u88c1\u5224\u7684\u4e00\u4e2a\u5df2\u77e5\u95ee\u9898\uff1a\u5b83\u4eec\u503e\u5411\u4e8e\u504f\u597d\u5148\u5c55\u793a\u7684\u56de\u590d\uff08\u6216\u8005\u5728\u67d0\u4e9b\u6a21\u578b\u4e2d\uff0c\u540e\u5c55\u793a\u7684\u56de\u590d\uff09\u3002\u4ea4\u6362\uff08\u4ee5\u4e24\u79cd\u987a\u5e8f\u5bf9\u6bcf\u5bf9\u8fdb\u884c\u8bc4\u4f30\uff09\u5e76\u5e73\u5747\u7ed3\u679c\u53ef\u4ee5\u7f13\u89e3\u8fd9\u4e00\u95ee\u9898\u3002
\u5197\u957f\u504f\u7f6e\u662f\u53e6\u4e00\u4e2a\u95ee\u9898\uff1a\u88c1\u5224\u503e\u5411\u4e8e\u504f\u597d\u66f4\u957f\u3001\u66f4\u8be6\u7ec6\u7684\u56de\u590d\uff0c\u5373\u4f7f\u7b80\u6d01\u7684\u56de\u7b54\u66f4\u597d\u3002
\u81ea\u4e00\u81f4\u6027\u68c0\u67e5\u88c1\u5224\u5728\u591a\u6b21\u8bc4\u4f30\u540c\u4e00\u8f93\u5165\u65f6\u662f\u5426\u7ed9\u51fa\u76f8\u540c\u7684\u8bc4\u5206\u3002\u9ad8\u65b9\u5dee\u8868\u660e\u8bc4\u4f30\u4fe1\u53f7\u5b58\u5728\u566a\u97f3\u3002
\u6807\u6ce8\u8005\u95f4\u4e00\u81f4\u6027\uff08Cohen's kappa\u6216Krippendorff's alpha\uff09\u8861\u91cf\u591a\u4e2a\u88c1\u5224\u662f\u5426\u4e00\u81f4\uff0c\u4e3a\u8bc4\u4f30\u53ef\u9760\u6027\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4e0a\u9650\u3002
\u6570\u636e\u6c61\u67d3\u662f\u4e00\u4e2a\u5173\u952e\u95ee\u9898\uff1a\u5982\u679c\u8bc4\u4f30\u6570\u636e\u51fa\u73b0\u5728\u6a21\u578b\u7684\u8bad\u7ec3\u96c6\u4e2d\uff0c\u57fa\u51c6\u5206\u6570\u5c31\u4f1a\u88ab\u5938\u5927\u4e14\u6beb\u65e0\u610f\u4e49\u3002
\u8fd9\u5bf9\u4e8e\u5728\u7f51\u9875\u6293\u53d6\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\u5927\u8bed\u8a00\u6a21\u578b\u5c24\u5176\u6709\u95ee\u9898\uff0c\u56e0\u4e3a\u6d41\u884c\u7684\u57fa\u51c6\u5f88\u53ef\u80fd\u51fa\u73b0\u5728\u5176\u4e2d\u3002\u7f13\u89e3\u7b56\u7565\u5305\u62ec\uff1a\u4f7f\u7528\u672a\u516c\u5f00\u53d1\u5e03\u7684\u4fdd\u7559\u6d4b\u8bd5\u96c6\u3001\u521b\u5efa\u5b9a\u671f\u91cd\u65b0\u751f\u6210\u95ee\u9898\u7684\u52a8\u6001\u57fa\u51c6\u3001\u91d1\u4e1d\u96c0\u5b57\u7b26\u4e32\uff08\u5d4c\u5165\u5728\u57fa\u51c6\u6570\u636e\u4e2d\u7528\u4e8e\u68c0\u6d4b\u6cc4\u9732\u7684\u552f\u4e00\u6807\u8bc6\u7b26\uff09\uff0c\u4ee5\u53ca\u6bd4\u8f83\u5728\u6c61\u67d3\u4e0e\u6e05\u6d01\u5b50\u96c6\u4e0a\u7684\u6027\u80fd\u3002
\u6807\u51c6NLU\u57fa\u51c6\u8bc4\u4f30\u8de8\u591a\u79cd\u4efb\u52a1\u7684\u8bed\u8a00\u7406\u89e3\u80fd\u529b\u3002
GLUE\uff08\u901a\u7528\u8bed\u8a00\u7406\u89e3\u8bc4\u4f30\uff09\u548cSuperGLUE\u662f\u591a\u4efb\u52a1\u57fa\u51c6\uff0c\u6db5\u76d6\u60c5\u611f\u5206\u6790\uff08SST-2\uff09\u3001\u6587\u672c\u76f8\u4f3c\u5ea6\uff08STS-B\uff09\u3001\u81ea\u7136\u8bed\u8a00\u63a8\u7406\uff08MNLI\u3001RTE\uff09\u3001\u5171\u6307\u6d88\u89e3\uff08WSC\uff09\u548c\u95ee\u7b54\uff08BoolQ\uff09\u3002
\u6a21\u578b\u5728\u6bcf\u4e2a\u4efb\u52a1\u4e0a\u5206\u522b\u8bc4\u4f30\uff0c\u5e76\u6309\u805a\u5408\u6307\u6807\u6253\u5206\u3002GLUE\u73b0\u5728\u88ab\u8ba4\u4e3a\u5df2\u7ecf\u9971\u548c\uff08\u6a21\u578b\u5728\u5927\u591a\u6570\u4efb\u52a1\u4e0a\u5df2\u8d85\u8fc7\u4eba\u7c7b\u8868\u73b0\uff09\uff1bSuperGLUE\u4ecd\u7136\u66f4\u5177\u6311\u6218\u6027\u3002
MMLU\uff08\u5927\u89c4\u6a21\u591a\u4efb\u52a1\u8bed\u8a00\u7406\u89e3\uff09\u901a\u8fc7\u591a\u9879\u9009\u62e9\u9898\u8bc4\u4f3057\u4e2a\u5b66\u672f\u79d1\u76ee\uff08\u6570\u5b66\u3001\u5386\u53f2\u3001\u6cd5\u5f8b\u3001\u533b\u5b66\u3001\u8ba1\u7b97\u673a\u79d1\u5b66\u7b49\uff09\u4e2d\u7684\u77e5\u8bc6\u548c\u63a8\u7406\u80fd\u529b\u3002
\u5b83\u6d4b\u8bd5\u6a21\u578b\u5728\u9884\u8bad\u7ec3\u671f\u95f4\u662f\u5426\u5438\u6536\u4e86\u5e7f\u6cdb\u7684\u77e5\u8bc6\u3002\u5206\u6570\u6309\u79d1\u76ee\u62a5\u544a\u5e76\u4f5c\u4e3a\u5b8f\u5e73\u5747\u7ed9\u51fa\u3002
MMLU-Pro\u589e\u52a0\u4e86\u66f4\u56f0\u96be\u7684\u591a\u6b65\u63a8\u7406\u95ee\u9898\uff0c\u670910\u4e2a\u9009\u9879\u800c\u975e4\u4e2a\u3002
HellaSwag\u901a\u8fc7\u8981\u6c42\u6a21\u578b\u9009\u62e9\u4e00\u4e2a\u573a\u666f\u6700\u5408\u7406\u7684\u7eed\u5199\u6765\u6d4b\u8bd5\u5e38\u8bc6\u63a8\u7406\u3002\u9519\u8bef\u7684\u7b54\u6848\u662f\u901a\u8fc7\u6a21\u578b\u5bf9\u6297\u6027\u751f\u6210\u7684\uff0c\u8868\u9762\u770b\u4f3c\u5408\u7406\u4f46\u8bed\u4e49\u9519\u8bef\u3002
WinoGrande\u901a\u8fc7\u4ec5\u4e00\u8bcd\u4e4b\u5dee\u7684\u6781\u5c0f\u5bf9\u6d4b\u8bd5\u5e38\u8bc6\u5171\u6307\u6d88\u89e3\u3002
ARC\uff08AI2\u63a8\u7406\u6311\u6218\uff09\u4f7f\u7528\u5c0f\u5b66\u79d1\u5b66\u95ee\u9898\uff0c\u5206\u4e3a\u7b80\u5355\u548c\u6311\u6218\u96c6\uff0c\u6d4b\u8bd5\u4e8b\u5b9e\u548c\u63a8\u7406\u80fd\u529b\u3002
\u63a8\u7406\u548c\u6570\u5b66\u57fa\u51c6\u8bc4\u4f30\u533a\u5206\u5f3a\u5927LLM\u4e0e\u5f31\u5c0fLLM\u7684\u95ee\u9898\u89e3\u51b3\u80fd\u529b\u3002
GSM8K\uff08\u5c0f\u5b66\u6570\u5b668K\uff09\u5305\u542b8,500\u9053\u5c0f\u5b66\u7b97\u672f\u5e94\u7528\u9898\uff0c\u9700\u8981\u591a\u6b65\u7b97\u672f\u63a8\u7406\u3002\u5b83\u662f\u57fa\u7840\u6570\u5b66\u63a8\u7406\u548c\u8bc4\u4f30\u94fe\u5f0f\u601d\u7ef4\u63d0\u793a\uff08\u6587\u4ef604\uff09\u7684\u6807\u51c6\u57fa\u51c6\u3002
MATH\u662f\u4e00\u4e2a\u66f4\u96be\u7684\u6570\u636e\u96c6\uff0c\u5305\u542b\u4ee3\u6570\u3001\u6570\u8bba\u3001\u51e0\u4f55\u3001\u8ba1\u6570\u548c\u6982\u7387\u65b9\u9762\u7684\u7ade\u8d5b\u7ea7\u6570\u5b66\u95ee\u9898\u3002\u95ee\u9898\u9700\u8981\u591a\u6b65\u7b26\u53f7\u63a8\u7406\uff0cMATH-500\u662f\u5e38\u7528\u7684500\u9898\u5b50\u96c6\u3002
AIME\uff08\u7f8e\u56fd\u6570\u5b66\u9080\u8bf7\u8d5b\uff09\u95ee\u9898\u662f\u7ade\u8d5b\u7ea7\u7684\uff1a\u6b63\u786e\u89e3\u7b54\u9700\u8981\u8de8\u8d8a\u591a\u4e2a\u6b65\u9aa4\u7684\u6df1\u5ea6\u6570\u5b66\u63a8\u7406\u3002DeepSeek-R1\u5728AIME 2024\u4e0a\u5f97\u5206\u4e3a79.8%\uff0c\u5c55\u793a\u4e86\u7ecf\u8fc7RL\u8bad\u7ec3\u7684\u63a8\u7406\u6a21\u578b\uff08\u6587\u4ef605\uff09\u53ef\u4ee5\u63a5\u8fd1\u4eba\u7c7b\u9ad8\u624b\u3002
HumanEval\u548cMBPP\uff08\u57fa\u7840\u7f16\u7a0b\u95ee\u9898\uff09\u901a\u8fc7\u68c0\u67e5\u6a21\u578b\u751f\u6210\u7684\u4ee3\u7801\u662f\u5426\u901a\u8fc7\u5355\u5143\u6d4b\u8bd5\u6765\u8bc4\u4f30\u4ee3\u7801\u751f\u6210\u80fd\u529b\u3002HumanEval\u5305\u542b164\u4e2aPython\u95ee\u9898\uff0c\u5305\u62ec\u51fd\u6570\u7b7e\u540d\u548c\u6587\u6863\u5b57\u7b26\u4e32\uff1b\u6a21\u578b\u9700\u8981\u751f\u6210\u51fd\u6570\u4f53\u3002
\u6307\u6807\u662fpass@k\uff1a\u5728 \\(k\\) \u4e2a\u751f\u6210\u7684\u89e3\u51b3\u65b9\u6848\u4e2d\u81f3\u5c11\u6709\u4e00\u4e2a\u901a\u8fc7\u6240\u6709\u6d4b\u8bd5\u7684\u6982\u7387\u3002\u5bf9\u4e8e\u5355\u4e2a\u6837\u672c\uff1a
\u5176\u4e2d \\(n\\) \u662f\u751f\u6210\u7684\u6837\u672c\u603b\u6570\uff0c\\(c\\) \u662f\u901a\u8fc7\u7684\u6570\u91cf\u3002\u8fd9\u4e2a\u516c\u5f0f\u4fee\u6b63\u4e86\u7b80\u5355\u53d6 \\(k\\) \u4e2a\u6837\u672c\u4e2d\u6700\u597d\u7ed3\u679c\u7684\u504f\u5dee\u3002
SWE-bench\u66f4\u8fdb\u4e00\u6b65\uff0c\u8bc4\u4f30\u6a21\u578b\u80fd\u5426\u901a\u8fc7\u4fee\u6539\u73b0\u6709\u4ee3\u7801\u5e93\u6765\u89e3\u51b3\u771f\u5b9e\u7684GitHub\u95ee\u9898\u2014\u2014\u8fd9\u662f\u5bf9\u5b9e\u9645\u8f6f\u4ef6\u5de5\u7a0b\u80fd\u529b\u7684\u66f4\u56f0\u96be\u6d4b\u8bd5\u3002
GPQA\uff08\u7814\u7a76\u751f\u7ea7Google-proof\u95ee\u7b54\uff09\u5305\u542b\u751f\u7269\u5b66\u3001\u7269\u7406\u5b66\u548c\u5316\u5b66\u9886\u57df\u7684\u4e13\u5bb6\u7ea7\u95ee\u9898\uff0c\u5373\u4f7f\u662f\u9886\u57df\u4e13\u5bb6\u4e5f\u5f88\u96be\u89e3\u7b54\u3002\u5b83\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u5177\u6709\u771f\u6b63\u7684\u7406\u89e3\u80fd\u529b\u800c\u975e\u6a21\u5f0f\u5339\u914d\u3002\"Diamond\"\u5b50\u96c6\u662f\u6700\u96be\u7684\u90e8\u5206\u3002
\u5b89\u5168\u548c\u5bf9\u9f50\u57fa\u51c6\u8bc4\u4f30\u6a21\u578b\u662f\u5426\u6709\u7528\u3001\u65e0\u5bb3\u548c\u8bda\u5b9e\u3002
TruthfulQA\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u590d\u73b0\u4e86\u5e38\u89c1\u7684\u8bef\u89e3\u3002\u95ee\u9898\u8bbe\u8ba1\u4e3a\u6700\u5e38\u89c1\u7684\u4e92\u8054\u7f51\u7b54\u6848\u662f\u9519\u8bef\u7684\uff08\u4f8b\u5982\uff0c\"\u5982\u679c\u541e\u4e0b\u53e3\u9999\u7cd6\u4f1a\u600e\u6837\uff1f\"\uff0c\u5e38\u89c1\u7684\u8c23\u8a00\u662f\u5b83\u4f1a\u5728\u80c3\u91cc\u505c\u75597\u5e74\uff0c\u4f46\u4e8b\u5b9e\u662f\u5b83\u4f1a\u6b63\u5e38\u901a\u8fc7\uff09\u3002\u90a3\u4e9b\u8bb0\u5fc6\u4e86\u6d41\u884c\u4f46\u4e0d\u6b63\u786e\u8bf4\u6cd5\u7684\u6a21\u578b\u5f97\u5206\u5f88\u4f4e\u3002
BBQ\uff08\u95ee\u7b54\u504f\u7f6e\u57fa\u51c6\uff09\u6d4b\u8bd5\u5728\u5e74\u9f84\u3001\u6027\u522b\u3001\u79cd\u65cf\u548c\u5b97\u6559\u7b49\u7c7b\u522b\u4e0a\u7684\u793e\u4f1a\u504f\u7f6e\u3002\u95ee\u9898\u7684\u7ed3\u6784\u4f7f\u5f97\u6709\u504f\u7f6e\u7684\u6a21\u578b\u4f1a\u7cfb\u7edf\u5730\u9009\u62e9\u523b\u677f\u5370\u8c61\u7684\u7b54\u6848\u3002Toxigen\u8bc4\u4f30\u6a21\u578b\u9488\u5bf9\u7279\u5b9a\u4eba\u53e3\u7fa4\u4f53\u751f\u6210\u6709\u5bb3\u5185\u5bb9\u7684\u503e\u5411\u3002
MT-Bench\u4f7f\u752880\u4e2a\u7cbe\u5fc3\u8bbe\u8ba1\u7684\u95ee\u9898\u8bc4\u4f30\u591a\u8f6e\u5bf9\u8bdd\u80fd\u529b\uff0c\u6db5\u76d6\u5199\u4f5c\u3001\u89d2\u8272\u626e\u6f14\u3001\u63a8\u7406\u3001\u6570\u5b66\u3001\u7f16\u7a0b\u3001\u4fe1\u606f\u62bd\u53d6\u3001STEM\u548c\u4eba\u6587\u5b66\u79d1\u3002LLM\u88c1\u5224\uff08GPT-4\uff09\u63091-10\u5206\u5bf9\u56de\u590d\u8bc4\u5206\u3002\u591a\u8f6e\u683c\u5f0f\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u80fd\u8fdb\u884c\u540e\u7eed\u63d0\u95ee\u3001\u4fdd\u6301\u4e0a\u4e0b\u6587\u548c\u5904\u7406\u6f84\u6e05\u8bf7\u6c42\u3002
Chatbot Arena\uff08LMSYS\uff09\u4f7f\u7528\u771f\u5b9e\u7528\u6237\u5bf9\u533f\u540d\u6a21\u578b\u8fdb\u884c\u76f2\u6cd5\u6210\u5bf9\u6bd4\u8f83\u3002\u7528\u6237\u63d0\u4ea4\u63d0\u793a\u5e76\u5bf9\u66f4\u597d\u7684\u56de\u590d\u6295\u7968\uff0c\u800c\u4e0d\u77e5\u9053\u662f\u54ea\u4e2a\u6a21\u578b\u751f\u6210\u7684\u3002\u7531\u6b64\u4ea7\u751f\u7684Elo\u6392\u884c\u699c\u88ab\u8ba4\u4e3a\u662f\u5bf9\u901a\u7528LLM\u8d28\u91cf\u6700\u751f\u6001\u6709\u6548\u7684\u8bc4\u4f30\uff0c\u56e0\u4e3a\u5b83\u53cd\u6620\u4e86\u771f\u5b9e\u7528\u6237\u5728\u591a\u6837\u5316\u3001\u672a\u7ecf\u7b56\u5212\u7684\u63d0\u793a\u4e0a\u7684\u504f\u597d\u3002
AlpacaEval\u901a\u8fc7\u5728\u4e00\u7ec4\u56fa\u5b9a\u7684\u6307\u4ee4\u4e0a\u5c06\u6a21\u578b\u8f93\u51fa\u4e0e\u53c2\u8003\u6a21\u578b\uff08GPT-4\uff09\u8fdb\u884c\u6bd4\u8f83\u6765\u81ea\u52a8\u5316\u6210\u5bf9\u8bc4\u4f30\u3002\u7531\u88c1\u5224\u6a21\u578b\u51b3\u5b9a\u80dc\u7387\u3002
AlpacaEval 2.0\u4f7f\u7528\u957f\u5ea6\u63a7\u5236\u7684\u80dc\u7387\u6765\u7ea0\u6b63\u5197\u957f\u504f\u7f6e\u3002
\u4efb\u52a1\u7279\u5b9a\u8bc4\u4f30\u9700\u8981\u9488\u5bf9\u4e13\u4e1a\u9886\u57df\u91cf\u8eab\u5b9a\u5236\u7684\u6307\u6807\u3002
\u8bcd\u9519\u8bef\u7387\uff08WER\uff09\u7528\u4e8e\u8bed\u97f3\u8bc6\u522b\uff1a\\(\\text{WER} = (S + D + I) / N\\)\uff0c\u5176\u4e2d \\(S\\)\u3001\\(D\\)\u3001\\(I\\) \u5206\u522b\u662f\u66ff\u6362\u3001\u5220\u9664\u548c\u63d2\u5165\u9519\u8bef\uff0c\\(N\\) \u662f\u53c2\u8003\u8bcd\u7684\u6570\u91cf\u3002\u8fd9\u662f\u6309\u53c2\u8003\u957f\u5ea6\u5f52\u4e00\u5316\u7684\u7f16\u8f91\u8ddd\u79bb\uff08\u6587\u4ef602\uff09\uff0c\u5e94\u7528\u4e8e\u8bcd\u6c47\u7ea7\u522b\u3002
\u69fd\u4f4dF1\u7528\u4e8e\u4efb\u52a1\u5bfc\u5411\u7684\u5bf9\u8bdd\u7cfb\u7edf\uff0c\u8861\u91cf\u6a21\u578b\u662f\u5426\u6b63\u786e\u5730\u4ece\u7528\u6237\u8bdd\u8bed\u4e2d\u63d0\u53d6\u7ed3\u6784\u5316\u4fe1\u606f\uff08\u4f8b\u5982\uff0c\u4ece\"\u5e2e\u6211\u8ba2\u4e00\u5f20\u660e\u5929\u53bb\u5df4\u9ece\u7684\u673a\u7968\"\u4e2d\u63d0\u53d6\"\u76ee\u7684\u5730\uff1a\u5df4\u9ece\"\u548c\"\u65e5\u671f\uff1a\u660e\u5929\"\uff09\u3002
\u5f15\u7528\u51c6\u786e\u7387\u7528\u4e8eRAG\u7cfb\u7edf\uff08\u6587\u4ef605\uff09\uff0c\u68c0\u67e5\u6a21\u578b\u751f\u6210\u7684\u5f15\u7528\u662f\u5426\u786e\u5b9e\u652f\u6301\u6240\u63d0\u51fa\u7684\u4e3b\u5f20\u3002\u5c06\u4e3b\u5f20\u4e0e\u68c0\u7d22\u5230\u7684\u6bb5\u843d\u8fdb\u884c\u9a8c\u8bc1\uff0c\u6307\u6807\u7edf\u8ba1\u5b8c\u5168\u652f\u6301\u3001\u90e8\u5206\u652f\u6301\u548c\u4e0d\u652f\u6301\u7684\u4e3b\u5f20\u6bd4\u4f8b\u3002
\u8bc4\u4f30\u9677\u9631\u5f88\u5e38\u89c1\uff0c\u53ef\u80fd\u4f7f\u6574\u4e2a\u57fa\u51c6\u6bd4\u8f83\u65e0\u6548\u3002
\u5bf9\u6d4b\u8bd5\u6295\u5176\u6240\u597d\uff1a\u4f18\u5316\u57fa\u51c6\u6027\u80fd\u800c\u975e\u771f\u6b63\u80fd\u529b\u3002\u5728MMLU\u98ce\u683c\u7684\u591a\u9879\u9009\u62e9\u4e0a\u5fae\u8c03\u7684\u6a21\u578b\u5728MMLU\u4e0a\u5f97\u5206\u5f88\u9ad8\uff0c\u4f46\u5728\u4ee5\u5f00\u653e\u5f0f\u5f62\u5f0f\u63d0\u51fa\u7684\u76f8\u540c\u95ee\u9898\u4e0a\u53ef\u80fd\u5931\u8d25\u3002
\u6307\u6807\u6e38\u620f\u5316\uff1a\u6a21\u578b\u53ef\u4ee5\u88ab\u4f18\u5316\u4ee5\u4ea7\u751f\u5728\u81ea\u52a8\u6307\u6807\u4e0a\u5f97\u5206\u5f88\u9ad8\u7684\u8f93\u51fa\uff08\u9ad8BLEU\u3001\u4f4e\u56f0\u60d1\u5ea6\uff09\uff0c\u4f46\u5e76\u975e\u771f\u6b63\u4f18\u79c0\u3002BLEU\u6700\u4f18\u7684\u7ffb\u8bd1\u5f80\u5f80\u662f\u5b89\u5168\u3001\u901a\u7528\u7684\u91ca\u4e49\uff0c\u800c\u975e\u81ea\u7136\u6d41\u7545\u7684\u7ffb\u8bd1\u3002
\u57fa\u51c6\u9971\u548c\uff1a\u5f53\u6a21\u578b\u5728\u57fa\u51c6\u4e0a\u63a5\u8fd1\u6216\u8d85\u8fc7\u4eba\u7c7b\u8868\u73b0\u65f6\uff0c\u8be5\u57fa\u51c6\u5c31\u4e0d\u518d\u63d0\u4f9b\u4fe1\u606f\u3002GLUE\u3001SQuAD 1.1\u548c\u5176\u4ed6\u51e0\u4e2a\u57fa\u51c6\u73b0\u5728\u5df2\u7ecf\u9971\u548c\u3002
\u8be5\u9886\u57df\u4e0d\u65ad\u521b\u5efa\u66f4\u96be\u7684\u65b0\u57fa\u51c6\uff0c\u4f46\u8fd9\u79cd\u521b\u5efa\u3001\u9971\u548c\u548c\u66ff\u6362\u7684\u5faa\u73af\u4f7f\u5f97\u7eb5\u5411\u6bd4\u8f83\u53d8\u5f97\u56f0\u96be\u3002
\u4eba\u5de5\u8bc4\u4f30\u4ecd\u7136\u662f\u9ec4\u91d1\u6807\u51c6\uff0c\u4f46\u6210\u672c\u9ad8\u3001\u901f\u5ea6\u6162\u4e14\u96be\u4ee5\u590d\u73b0\u3002\u4e0d\u540c\u7684\u6807\u6ce8\u8005\u7fa4\u4f53\uff08\u4f17\u5305\u5de5\u4f5c\u8005\u4e0e\u9886\u57df\u4e13\u5bb6\u3001\u4e0d\u540c\u6587\u5316\u3001\u4e0d\u540c\u8bed\u8a00\uff09\u4f1a\u4ea7\u751f\u4e0d\u540c\u7684\u5224\u65ad\u3002\u62a5\u544a\u6807\u6ce8\u8005\u95f4\u4e00\u81f4\u6027\u548c\u6807\u6ce8\u8005\u4eba\u53e3\u7edf\u8ba1\u4fe1\u606f\u5bf9\u53ef\u590d\u73b0\u6027\u81f3\u5173\u91cd\u8981\u3002
\u4ece\u5934\u5b9e\u73b0\u4e00\u4e2a\u5b8c\u6574\u7684Transformer\u7f16\u7801\u5668\u5757\uff08\u591a\u5934\u6ce8\u610f\u529b\u3001\u524d\u9988\u7f51\u7edc\u3001\u6b8b\u5dee\u8fde\u63a5\u3001\u5c42\u5f52\u4e00\u5316\uff09\u3002\u5c06\u5176\u5e94\u7528\u4e8e\u4e00\u4e2a\u7b80\u5355\u7684\u5e8f\u5217\u5206\u7c7b\u4efb\u52a1\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef layer_norm(x, gamma, beta, eps=1e-5):\n mean = x.mean(axis=-1, keepdims=True)\n var = x.var(axis=-1, keepdims=True)\n return gamma * (x - mean) / jnp.sqrt(var + eps) + beta\n\ndef multi_head_attention(Q, K, V, W_q, W_k, W_v, W_o, n_heads):\n B, T, D = Q.shape\n head_dim = D // n_heads\n\n q = Q @ W_q # (B, T, D)\n k = K @ W_k\n v = V @ W_v\n\n # Reshape to (B, n_heads, T, head_dim)\n q = q.reshape(B, T, n_heads, head_dim).transpose(0, 2, 1, 3)\n k = k.reshape(B, T, n_heads, head_dim).transpose(0, 2, 1, 3)\n v = v.reshape(B, T, n_heads, head_dim).transpose(0, 2, 1, 3)\n\n scores = q @ k.transpose(0, 1, 3, 2) / jnp.sqrt(head_dim)\n weights = jax.nn.softmax(scores, axis=-1)\n out = (weights @ v).transpose(0, 2, 1, 3).reshape(B, T, D)\n return out @ W_o, weights\n\ndef transformer_block(x, params):\n # Pre-norm multi-head self-attention\n normed = layer_norm(x, params['ln1_g'], params['ln1_b'])\n attn_out, weights = multi_head_attention(\n normed, normed, normed,\n params['W_q'], params['W_k'], params['W_v'], params['W_o'],\n n_heads=4\n )\n x = x + attn_out\n\n # Pre-norm feed-forward\n normed = layer_norm(x, params['ln2_g'], params['ln2_b'])\n ff = jax.nn.gelu(normed @ params['W1'] + params['b1'])\n ff = ff @ params['W2'] + params['b2']\n x = x + ff\n return x, weights\n\n# Initialise parameters\nd_model, d_ff, n_heads = 32, 128, 4\nkey = jax.random.PRNGKey(42)\nkeys = jax.random.split(key, 10)\n\nparams = {\n 'W_q': jax.random.normal(keys[0], (d_model, d_model)) * 0.05,\n 'W_k': jax.random.normal(keys[1], (d_model, d_model)) * 0.05,\n 'W_v': jax.random.normal(keys[2], (d_model, d_model)) * 0.05,\n 'W_o': jax.random.normal(keys[3], (d_model, d_model)) * 0.05,\n 'ln1_g': jnp.ones(d_model), 'ln1_b': jnp.zeros(d_model),\n 'ln2_g': jnp.ones(d_model), 'ln2_b': jnp.zeros(d_model),\n 'W1': jax.random.normal(keys[4], (d_model, d_ff)) * 0.05,\n 'b1': jnp.zeros(d_ff),\n 'W2': jax.random.normal(keys[5], (d_ff, d_model)) * 0.05,\n 'b2': jnp.zeros(d_model),\n}\n\n# Test with random input\nx = jax.random.normal(keys[6], (2, 8, d_model)) # batch=2, seq_len=8\nout, attn_weights = transformer_block(x, params)\nprint(f\"Input shape: {x.shape}\")\nprint(f\"Output shape: {out.shape}\")\nprint(f\"Attention weights shape: {attn_weights.shape}\") # (B, n_heads, T, T)\n\n# Visualise attention patterns for each head\nfig, axes = plt.subplots(1, 4, figsize=(16, 3.5))\nfor h in range(4):\n im = axes[h].imshow(attn_weights[0, h], cmap='Blues', vmin=0)\n axes[h].set_title(f\"Head {h}\")\n axes[h].set_xlabel(\"Key pos\"); axes[h].set_ylabel(\"Query pos\")\nplt.suptitle(\"Multi-Head Attention Patterns\")\nplt.tight_layout(); plt.show()\n \u5b9e\u73b0\u56e0\u679c\uff08\u81ea\u56de\u5f52\uff09\u6ce8\u610f\u529b\u63a9\u7801\uff0c\u5e76\u4e0e\u53cc\u5411\u6ce8\u610f\u529b\u8fdb\u884c\u6bd4\u8f83\u3002\u5c55\u793a\u63a9\u7801\u5982\u4f55\u9632\u6b62\u4fe1\u606f\u4ece\u672a\u6765\u6d41\u5411\u8fc7\u53bb\u7684\u6807\u8bb0\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef attention(Q, K, V, mask=None):\n d_k = Q.shape[-1]\n scores = Q @ K.T / jnp.sqrt(d_k)\n if mask is not None:\n scores = jnp.where(mask, scores, -1e9)\n weights = jax.nn.softmax(scores, axis=-1)\n return weights @ V, weights\n\nseq_len, d_model = 6, 8\nkey = jax.random.PRNGKey(0)\nk1, k2, k3 = jax.random.split(key, 3)\nQ = jax.random.normal(k1, (seq_len, d_model))\nK = jax.random.normal(k2, (seq_len, d_model))\nV = jax.random.normal(k3, (seq_len, d_model))\n\n# Bidirectional (encoder-style): all positions visible\nbidir_mask = jnp.ones((seq_len, seq_len), dtype=bool)\nbidir_out, bidir_weights = attention(Q, K, V, bidir_mask)\n\n# Causal (decoder-style): only past and current positions visible\ncausal_mask = jnp.tril(jnp.ones((seq_len, seq_len), dtype=bool))\ncausal_out, causal_weights = attention(Q, K, V, causal_mask)\n\nfig, axes = plt.subplots(1, 3, figsize=(14, 4))\ntokens = [f\"t{i}\" for i in range(seq_len)]\n\naxes[0].imshow(bidir_weights, cmap='Blues', vmin=0, vmax=0.5)\naxes[0].set_title(\"Bidirectional Attention\\n(BERT-style)\")\naxes[0].set_xticks(range(seq_len)); axes[0].set_xticklabels(tokens)\naxes[0].set_yticks(range(seq_len)); axes[0].set_yticklabels(tokens)\n\naxes[1].imshow(causal_mask.astype(float), cmap='Greys', vmin=0, vmax=1)\naxes[1].set_title(\"Causal Mask\\n(1 = allowed, 0 = blocked)\")\naxes[1].set_xticks(range(seq_len)); axes[1].set_xticklabels(tokens)\naxes[1].set_yticks(range(seq_len)); axes[1].set_yticklabels(tokens)\n\naxes[2].imshow(causal_weights, cmap='Blues', vmin=0, vmax=0.5)\naxes[2].set_title(\"Causal Attention\\n(GPT-style)\")\naxes[2].set_xticks(range(seq_len)); axes[2].set_xticklabels(tokens)\naxes[2].set_yticks(range(seq_len)); axes[2].set_yticklabels(tokens)\n\nfor ax in axes:\n ax.set_xlabel(\"Key\"); ax.set_ylabel(\"Query\")\nplt.tight_layout(); plt.show()\n\n# Verify: in causal attention, output at position i depends only on positions <= i\nprint(\"Causal attention weight at position 2 (should only attend to 0, 1, 2):\")\nprint(f\" Weights: {causal_weights[2]}\")\nprint(f\" Sum of future weights (should be ~0): {causal_weights[2, 3:].sum():.6f}\")\n \u5b9e\u73b0LoRA\uff08\u4f4e\u79e9\u9002\u914d\uff09\uff0c\u5e76\u5c55\u793a\u5b83\u5982\u4f55\u4ee5\u8fdc\u5c11\u4e8e\u5168\u91cf\u5fae\u8c03\u7684\u53ef\u8bad\u7ec3\u53c2\u6570\u6765\u4fee\u6539\u6743\u91cd\u77e9\u9635\u3002
import jax\nimport jax.numpy as jnp\n\nd_model = 256\nrank = 4 # LoRA rank (much smaller than d_model)\n\nkey = jax.random.PRNGKey(42)\nk1, k2, k3 = jax.random.split(key, 3)\n\n# Original frozen weight matrix\nW_frozen = jax.random.normal(k1, (d_model, d_model)) * 0.02\n\n# LoRA matrices (only these are trainable)\nB = jnp.zeros((d_model, rank)) # initialised to zero\nA = jax.random.normal(k2, (rank, d_model)) * 0.01 # random init\n\n# Forward pass: W_effective = W_frozen + B @ A\nx = jax.random.normal(k3, (8, d_model))\n\n# Without LoRA\ny_original = x @ W_frozen.T\n\n# With LoRA\nW_effective = W_frozen + B @ A\ny_lora = x @ W_effective.T\n\n# Parameter counts\nfull_params = d_model * d_model\nlora_params = d_model * rank + rank * d_model # B + A\n\nprint(f\"Model dimension: {d_model}\")\nprint(f\"LoRA rank: {rank}\")\nprint(f\"Full fine-tuning parameters: {full_params:,}\")\nprint(f\"LoRA parameters: {lora_params:,}\")\nprint(f\"Parameter reduction: {full_params / lora_params:.1f}x\")\nprint(f\"\\nSince B is initialised to zeros, initial LoRA output matches original:\")\nprint(f\" Max difference: {jnp.abs(y_original - y_lora).max():.2e}\")\n\n# Simulate training: only update A and B\ndef lora_forward(A, B, W_frozen, x):\n return x @ (W_frozen + B @ A).T\n\ndef dummy_loss(A, B, W_frozen, x, target):\n pred = lora_forward(A, B, W_frozen, x)\n return jnp.mean((pred - target) ** 2)\n\n# Target: some transformation of x\ntarget = x @ jax.random.normal(jax.random.PRNGKey(99), (d_model, d_model)).T * 0.02\n\ngrad_fn = jax.jit(jax.grad(dummy_loss, argnums=(0, 1)))\nlr = 0.01\n\nfor step in range(200):\n gA, gB = grad_fn(A, B, W_frozen, x, target)\n A = A - lr * gA\n B = B - lr * gB\n\nloss_before = dummy_loss(jnp.zeros_like(A), jnp.zeros_like(B), W_frozen, x, target)\nloss_after = dummy_loss(A, B, W_frozen, x, target)\nprint(f\"\\nLoss before LoRA: {loss_before:.6f}\")\nprint(f\"Loss after LoRA: {loss_after:.6f}\")\nprint(f\"Effective weight change rank: {jnp.linalg.matrix_rank(B @ A)}\")\n \u9ad8\u7ea7\u6587\u672c\u751f\u6210\u8d85\u8d8a\u4e86\u666e\u901a\u7684\u81ea\u56de\u5f52\u89e3\u7801\uff0c\u65e8\u5728\u63d0\u5347\u8d28\u91cf\u3001\u53ef\u63a7\u6027\u548c\u901f\u5ea6\u3002\u672c\u6587\u6db5\u76d6\u6587\u672c\u6269\u6563\u6a21\u578b\uff08D3PM\u3001MDLM\uff09\u3001OCR\u3001\u7528\u4e8e\u5bf9\u9f50\u7684RLHF\u4e0eDPO\u3001\u957f\u4e0a\u4e0b\u6587\u65b9\u6cd5\uff08RoPE\u7f29\u653e\u3001\u73af\u5f62\u6ce8\u610f\u529b\uff09\u3001\u68c0\u7d22\u589e\u5f3a\u751f\u6210\uff0c\u4ee5\u53ca\u7528\u4e8e\u52a0\u901f\u63a8\u7406\u7684\u63a8\u6d4b\u6027\u89e3\u7801\u3002
\u6807\u51c6\u7684\u81ea\u56de\u5f52\u751f\u6210\uff08\u6587\u4ef604\uff09\u4ece\u5de6\u5230\u53f3\u9010\u4e2a\u751f\u6210token\u3002\u8fd9\u79cd\u65b9\u5f0f\u7b80\u5355\u6709\u6548\uff0c\u4f46\u672c\u8d28\u4e0a\u662f\u4e32\u884c\u7684\uff0c\u65e0\u6cd5\u8fdb\u884c\u5168\u5c40\u89c4\u5212\uff0c\u5bf9\u8f93\u51fa\u7684\u63a7\u5236\u4e5f\u6709\u9650\u3002\u672c\u6587\u6db5\u76d6\u4e86\u8d85\u8d8a\u666e\u901a\u81ea\u56de\u5f52\u89e3\u7801\u7684\u65b9\u6cd5\uff1a\u6587\u672c\u6269\u6563\u6a21\u578b\u3001\u5149\u5b66\u5b57\u7b26\u8bc6\u522b\u3001\u901a\u8fc7\u4eba\u7c7b\u53cd\u9988\u5b9e\u73b0\u7684\u53ef\u63a7\u751f\u6210\u3001\u957f\u4e0a\u4e0b\u6587\u5904\u7406\u3001\u68c0\u7d22\u589e\u5f3a\u751f\u6210\uff0c\u4ee5\u53ca\u7528\u4e8e\u52a0\u901f\u63a8\u7406\u7684\u63a8\u6d4b\u6027\u89e3\u7801\u3002
\u6587\u672c\u6269\u6563\u6a21\u578b\u5c06\u6269\u6563\u6846\u67b6\uff08\u5728\u7b2c08\u7ae0\u4e2d\u4e3a\u56fe\u50cf\u5f15\u5165\uff09\u5e94\u7528\u4e8e\u79bb\u6563\u6587\u672c\u3002\u6838\u5fc3\u6311\u6218\u5728\u4e8e\u6587\u672c\u662f\u79bb\u6563\u7684\uff1a\u4f60\u4e0d\u80fd\u50cf\u5bf9\u50cf\u7d20\u6dfb\u52a0\u566a\u58f0\u90a3\u6837\uff0c\u5411token\u6dfb\u52a0\u8fde\u7eed\u7684\u9ad8\u65af\u566a\u58f0\u3002\u6709\u51e0\u79cd\u65b9\u6cd5\u53ef\u4ee5\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002
D3PM\uff08\u79bb\u6563\u53bb\u566a\u6269\u6563\u6982\u7387\u6a21\u578b\uff0cAustin\u7b49\u4eba\uff0c2021\uff09\u5b9a\u4e49\u4e86\u4e00\u4e2a\u76f4\u63a5\u5728\u79bb\u6563token\u4e0a\u7684\u524d\u5411\u52a0\u566a\u8fc7\u7a0b\uff0c\u4f7f\u7528\u8f6c\u79fb\u77e9\u9635\u3002\u5728\u6bcf\u4e2a\u524d\u5411\u6b65\u9aa4\u4e2d\uff0c\u4e00\u4e2atoken\u6709\u4e00\u5b9a\u6982\u7387\u88ab\u53e6\u4e00\u4e2atoken\u66ff\u6362\uff08\u5747\u5300\u566a\u58f0\uff09\u3001\u88ab\u63a9\u7801\uff08\u5438\u6536\u6001\uff09\u6216\u4fdd\u6301\u4e0d\u53d8\u3002\u9006\u5411\u8fc7\u7a0b\u5b66\u4e60\u53bb\u566a\uff0c\u4ece\u52a0\u566a\u7684token\u9884\u6d4b\u51fa\u5e72\u51c0\u7684token\u3002\u5728\u6b65\u9aa4\\(t\\)\u5904\u7684\u8f6c\u79fb\u77e9\u9635\\(Q_t\\)\u63a7\u5236\u52a0\u566a\u8fc7\u7a0b\uff1a
\u7b2c\u4e00\u9879\u786e\u4fdd\u5b8c\u5168\u52a0\u566a\u540e\u7684\u5206\u5e03\u4e0e\u5148\u9a8c\u5206\u5e03\uff08\u5747\u5300\u5206\u5e03\u6216\u5168\u63a9\u7801\uff09\u5339\u914d\u3002KL\u9879\u7684\u548c\u8bad\u7ec3\u6a21\u578b\u53bb\u9006\u8f6c\u6bcf\u4e2a\u52a0\u566a\u6b65\u9aa4\uff1a\u771f\u5b9e\u7684\u9006\u5411\u540e\u9a8c\\(q(x_{t-1} \\mid x_t, x_0)\\)\u53ef\u4ee5\u4f7f\u7528\u8d1d\u53f6\u65af\u89c4\u5219\u548c\u5df2\u77e5\u7684\u8f6c\u79fb\u77e9\u9635\u4ee5\u95ed\u5f0f\u5f62\u5f0f\u8ba1\u7b97\uff0c\u6a21\u578b\\(p_\\theta(x_{t-1} \\mid x_t)\\)\u88ab\u8bad\u7ec3\u53bb\u5339\u914d\u5b83\u3002
\u7531\u4e8e\u8fd9\u4e24\u4e2a\u5206\u5e03\u90fd\u662f\u7c7b\u522b\u5206\u5e03\uff0cKL\u6563\u5ea6\u5c31\u662f\u8bcd\u6c47\u8868\u6761\u76ee\u4e0a\u7684\u7b80\u5355\u6c42\u548c\u3002\u6700\u540e\u4e00\u9879\u8861\u91cf\u6765\u81ea\u6700\u5e72\u51c0\u52a0\u566a\u72b6\u6001\u7684\u91cd\u5efa\u8d28\u91cf\u3002
MDLM\uff08\u63a9\u7801\u6269\u6563\u8bed\u8a00\u6a21\u578b\uff0cSahoo\u7b49\u4eba\uff0c2024\uff09\u901a\u8fc7\u4ec5\u4f7f\u7528\u63a9\u7801\u4f5c\u4e3a\u552f\u4e00\u7684\u52a0\u566a\u64cd\u4f5c\u6765\u7b80\u5316D3PM\uff1a\u524d\u5411\u8fc7\u7a0b\u9010\u6b65\u7528[MASK]token\u66ff\u6362\u539f\u59cbtoken\uff0c\u9006\u5411\u8fc7\u7a0b\u9884\u6d4b\u539f\u59cbtoken\u3002\u8fd9\u4f7f\u6587\u672c\u6269\u6563\u4e0e\u63a9\u7801\u8bed\u8a00\u5efa\u6a21\uff08BERT\uff0c\u6587\u4ef604\uff09\u8054\u7cfb\u8d77\u6765\uff0c\u6269\u6563\u65f6\u95f4\u6b65\u63a7\u5236\u88ab\u63a9\u7801\u7684token\u6bd4\u4f8b\u3002\u5728\\(t = 0\\)\u65f6\u523b\u6587\u672c\u5b8c\u5168\u5e72\u51c0\uff1b\u5728\\(t = T\\)\u65f6\u523b\u6587\u672c\u88ab\u5b8c\u5168\u63a9\u7801\u3002
\u8fde\u7eed\u6587\u672c\u6269\u6563\u901a\u8fc7\u5728\u8fde\u7eed\u7684\u5d4c\u5165\u7a7a\u95f4\u4e2d\u5de5\u4f5c\u6765\u89c4\u907f\u79bb\u6563\u95ee\u9898\u3002Token\u9996\u5148\u88ab\u6620\u5c04\u5230\u5b83\u4eec\u7684\u5d4c\u5165\u5411\u91cf\uff08\u7b2c06\u7ae0\uff09\uff0c\u566a\u58f0\u5728\u8fd9\u4e2a\u8fde\u7eed\u7a7a\u95f4\u4e2d\u88ab\u6dfb\u52a0\uff0c\u4e00\u4e2a\u53bb\u566a\u6a21\u578b\uff08\u901a\u5e38\u662fTransformer\uff09\u5b66\u4e60\u9006\u8f6c\u8fd9\u4e2a\u8fc7\u7a0b\u3002\u5728\u751f\u6210\u65f6\uff0c\u6a21\u578b\u4ea7\u751f\u8fde\u7eed\u5411\u91cf\uff0c\u901a\u8fc7\u627e\u5230\u6700\u8fd1\u7684\u5d4c\u5165\u5c06\u5176\u6620\u5c04\u56de\u79bb\u6563token\u3002\u6311\u6218\u5728\u4e8e\u8fde\u7eed\u7a7a\u95f4\u4e2d\u7684\u5c0f\u8bef\u5dee\u53ef\u80fd\u6620\u5c04\u5230\u5b8c\u5168\u9519\u8bef\u7684token\uff0c\u56e0\u6b64\u9700\u8981\u4ed4\u7ec6\u7684\u820d\u5165\u548c\u88c1\u526a\u3002
\u6587\u672c\u6269\u6563\u7684\u5438\u5f15\u529b\u5728\u4e8e\u5b83\u901a\u8fc7\u8fed\u4ee3\u7cbe\u70bc\u540c\u65f6\u751f\u6210\u6240\u6709token\uff0c\u800c\u4e0d\u662f\u4ece\u5de6\u5230\u53f3\u3002\u8fd9\u5141\u8bb8\u5168\u5c40\u8fde\u8d2f\u6027\u548c\u8f7b\u677e\u586b\u5145\uff08\u5728\u6bb5\u843d\u4e2d\u95f4\u751f\u6210\u7f3a\u5931\u7684\u6587\u672c\uff09\uff0c\u4f46\u5f53\u524d\u6587\u672c\u6269\u6563\u6a21\u578b\u5728\u957f\u6587\u672c\u7684\u751f\u6210\u8d28\u91cf\u4e0a\u4ecd\u7136\u843d\u540e\u4e8e\u81ea\u56de\u5f52\u6a21\u578b\u3002
\u6587\u672cOCR\uff08\u5149\u5b66\u5b57\u7b26\u8bc6\u522b\uff09\u662f\u4ece\u56fe\u50cf\u4e2d\u63d0\u53d6\u6587\u672c\u7684\u4efb\u52a1\u3002\u867d\u7136\u4f20\u7edf\u4e0a\u4e0d\u5f52\u5165\u8bed\u8a00\u751f\u6210\uff0c\u4f46\u73b0\u4ee3OCR\u7cfb\u7edf\u4e0eNLP\u6df1\u5ea6\u96c6\u6210\uff0c\u5e76\u4e14\u8d8a\u6765\u8d8a\u591a\u5730\u4f7f\u7528\u8bed\u8a00\u6a21\u578b\u7ec4\u4ef6\u3002
\u573a\u666f\u6587\u672c\u68c0\u6d4b\u5728\u81ea\u7136\u56fe\u50cf\uff08\u8def\u724c\u3001\u4ea7\u54c1\u6807\u7b7e\u3001\u8f66\u724c\uff09\u4e2d\u5b9a\u4f4d\u6587\u672c\u533a\u57df\u3002\u8fd9\u5f88\u6709\u6311\u6218\u6027\uff0c\u56e0\u4e3a\u91ce\u5916\u7684\u6587\u672c\u51fa\u73b0\u5728\u4efb\u610f\u89d2\u5ea6\u3001\u5c3a\u5bf8\u3001\u5b57\u4f53\u548c\u6742\u4e71\u7684\u80cc\u666f\u4e2d\u3002\u68c0\u6d4b\u65b9\u6cd5\u901a\u5e38\u4f7f\u7528CNN\u6216Transformer\u4e3b\u5e72\u7f51\u7edc\uff0c\u56f4\u7ed5\u6587\u672c\u533a\u57df\u751f\u6210\u8fb9\u754c\u6846\u6216\u5206\u5272\u63a9\u7801\u3002
CRNN\uff08\u5377\u79ef\u5faa\u73af\u795e\u7ecf\u7f51\u7edc\uff0cShi\u7b49\u4eba\uff0c2017\uff09\u662f\u4e00\u79cd\u7ecf\u5178\u7684\u6587\u672c\u8bc6\u522b\u67b6\u6784\u3002CNN\u4ece\u6587\u672c\u56fe\u50cf\u4e2d\u63d0\u53d6\u89c6\u89c9\u7279\u5f81\uff0c\u7279\u5f81\u56fe\u88ab\u5207\u7247\u6210\u5217\u5e8f\u5217\uff08\u6bcf\u4e2a\u6c34\u5e73\u4f4d\u7f6e\u4e00\u5217\uff09\uff0c\u53cc\u5411LSTM\u8bfb\u53d6\u8fd9\u4e2a\u5e8f\u5217\u4ee5\u5efa\u6a21\u4e0a\u4e0b\u6587\u3002\u8f93\u51fa\u4f7f\u7528CTC\uff08\u8fde\u63a5\u65f6\u5e8f\u5206\u7c7b\uff09\u8fdb\u884c\u89e3\u7801\uff0c\u8be5\u7b97\u6cd5\u5904\u7406\u8f93\u5165\u5217\u548c\u8f93\u51fa\u5b57\u7b26\u4e4b\u95f4\u7684\u5bf9\u9f50\uff0c\u65e0\u9700\u663e\u5f0f\u5206\u5272\u3002
CTC\u89e3\u51b3\u7684\u6839\u672c\u95ee\u9898\u662f\uff1a\u6a21\u578b\u4ea7\u751f\\(T\\)\u4e2a\u8f93\u51fa\u5206\u5e03\uff08\u6bcf\u4e2a\u8f93\u5165\u5217\u4e00\u4e2a\uff09\uff0c\u4f46\u76ee\u6807\u6587\u672c\u6709\\(L \\leq T\\)\u4e2a\u5b57\u7b26\u3002
\u6211\u4eec\u4e0d\u77e5\u9053\u54ea\u4e9b\u5217\u5bf9\u5e94\u54ea\u4e9b\u5b57\u7b26\u3002CTC\u5f15\u5165\u4e86\u4e00\u4e2a\u7a7a\u767dtoken \\(\\epsilon\\)\uff0c\u5e76\u5b9a\u4e49\u4e86\u4e00\u4e2a\u591a\u5bf9\u4e00\u7684\u6620\u5c04\\(\\mathcal{B}\\)\uff0c\u8be5\u6620\u5c04\u6298\u53e0\u91cd\u590d\u5b57\u7b26\u5e76\u79fb\u9664\u7a7a\u767d\uff1a\\(\\mathcal{B}(\\text{\\\"HH-ee-ll-ll-oo\\\"}) = \\text{\\\"Hello\\\"}\\)\uff08\u5176\u4e2d\\\"-\\\"\u662f\u7a7a\u767d\uff09\u3002
\u76ee\u6807\u5e8f\u5217\\(y\\)\u7684\u6982\u7387\u662f\u6240\u6709\u6298\u53e0\u540e\u5f97\u5230\\(y\\)\u7684\u8f93\u5165\u5bf9\u9f50\u8def\u5f84\u7684\u6982\u7387\u4e4b\u548c\uff1a
\u5176\u4e2d\\(\\pi\\)\u662f\u4e00\u6761\u957f\u5ea6\u4e3a\\(T\\)\u7684\u5bf9\u9f50\u8def\u5f84\uff08\u6bcf\u5217\u4e00\u4e2a\u6807\u7b7e\uff0c\u5305\u62ec\u7a7a\u767d\uff09\u3002\u6734\u7d20\u5730\u6c42\u548c\u6240\u6709\u8def\u5f84\u662f\u6307\u6570\u7ea7\u7684\uff0c\u4f46\u524d\u5411\u7b97\u6cd5\uff08\u7b2c05\u7ae0HMM\uff09\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u5728\\(O(T \\cdot L)\\)\u65f6\u95f4\u5185\u9ad8\u6548\u5730\u8ba1\u7b97\u8fd9\u4e2a\u548c\u3002
\u7a7a\u767dtoken\u662f\u5fc5\u4e0d\u53ef\u5c11\u7684\uff1a\u6ca1\u6709\u5b83\uff0c\u50cf\\\"Hello\\\"\u4e2d\u91cd\u590d\u7684\\\"ll\\\"\u5c31\u65e0\u6cd5\u4e0e\u5355\u4e2a\\\"l\\\"\u533a\u5206\u5f00\u6765\u3002\u8bad\u7ec3\u6700\u5927\u5316\\(\\log P(y \\mid x)\\)\uff0c\u5728\u63a8\u7406\u65f6\uff0c\u901a\u8fc7\u5728CTC\u8f93\u51fa\u4e0a\u8fdb\u884c\u675f\u641c\u7d22\u6216\u8d2a\u5fc3\u89e3\u7801\u6765\u627e\u5230\u6700\u4f73\u8def\u5f84\u3002
\u6587\u6863OCR\u5904\u7406\u7ed3\u6784\u5316\u6587\u6863\uff08\u53d1\u7968\u3001\u8868\u683c\u3001\u79d1\u5b66\u8bba\u6587\uff09\uff0c\u9664\u4e86\u8bc6\u522b\u5b57\u7b26\u5916\uff0c\u8fd8\u5fc5\u987b\u7406\u89e3\u5e03\u5c40\u3002\u50cfLayoutLM\u8fd9\u6837\u7684\u73b0\u4ee3\u7cfb\u7edf\u5c06\u6587\u672c\u8bc6\u522b\u4e0e\u7a7a\u95f4\u4f4d\u7f6e\u7279\u5f81\u76f8\u7ed3\u5408\uff1a\u6bcf\u4e2atoken\u65e2\u6709\u5176\u6587\u672c\u5d4c\u5165\uff0c\u4e5f\u6709\u7f16\u7801\u5176\u5728\u9875\u9762\u4e0a\\((x, y)\\)\u5750\u6807\u7684\u4f4d\u7f6e\u5d4c\u5165\u3002\u8fd9\u4f7f\u5f97\u6a21\u578b\u80fd\u591f\u7406\u89e3\u51fa\u73b0\u5728\\\"\u603b\u8ba1\uff1a\\\"\u4e0b\u9762\u7684\u6570\u5b57\u5c31\u662f\u603b\u91d1\u989d\u3002
\u89c6\u89c9-\u8bed\u8a00OCR\u6a21\u578b\u5982TrOCR\u5c06\u6587\u672c\u8bc6\u522b\u89c6\u4e3a\u56fe\u50cf\u5230\u6587\u672c\u7684\u751f\u6210\uff1a\u89c6\u89c9Transformer\u7f16\u7801\u5668\u5904\u7406\u56fe\u50cf\uff0c\u8bed\u8a00\u6a21\u578b\u89e3\u7801\u5668\u9010\u5b57\u7b26\u751f\u6210\u6587\u672c\u3002\u8fd9\u5229\u7528\u4e86\u9884\u8bad\u7ec3\u89c6\u89c9\u548c\u8bed\u8a00\u6a21\u578b\u7684\u80fd\u529b\uff0c\u65e0\u9700\u624b\u5de5\u7279\u5f81\u5de5\u7a0b\u5373\u53ef\u5904\u7406\u591a\u79cd\u6587\u5b57\u3001\u5b57\u4f53\u548c\u5e03\u5c40\u3002
\u53ef\u63a7\u751f\u6210\u662f\u5f15\u5bfc\u8bed\u8a00\u6a21\u578b\u4ea7\u751f\u5177\u6709\u6240\u9700\u5c5e\u6027\uff08\u7279\u5b9a\u7684\u98ce\u683c\u3001\u4e3b\u9898\u3001\u60c5\u611f\u3001\u5b89\u5168\u7ea7\u522b\u6216\u4e8b\u5b9e\u51c6\u786e\u6027\uff09\u7684\u8f93\u51fa\u7684\u6311\u6218\u3002\u6a21\u578b\u5e94\u5f53\u9075\u5faa\u6307\u4ee4\uff0c\u540c\u65f6\u4fdd\u6301\u6d41\u7545\u548c\u8fde\u8d2f\u3002
\u9488\u5bf9\u6587\u672c\u7684\u5206\u7c7b\u5668\u65e0\u5173\u5f15\u5bfc\uff08CFG\uff09 \u6539\u7f16\u81ea\u56fe\u50cf\u751f\u6210\u4e2d\u7684\u6280\u672f\u3002\u5728\u8bad\u7ec3\u671f\u95f4\uff0c\u6761\u4ef6\u4fe1\u53f7\uff08\u5982\u63d0\u793a\u8bcd\uff09\u4ee5\u4e00\u5b9a\u6bd4\u4f8b\u88ab\u968f\u673a\u4e22\u5f03\uff0c\u4ece\u800c\u5728\u540c\u4e00\u4e2a\u6a21\u578b\u4e2d\u540c\u65f6\u8bad\u7ec3\u6761\u4ef6\u6a21\u578b\u548c\u65e0\u6761\u4ef6\u6a21\u578b\u3002\u5728\u63a8\u7406\u65f6\uff0c\u8f93\u51falogits\u88ab\u63d2\u503c\uff1a
\u5176\u4e2d\\(w > 0\\)\u653e\u5927\u4e86\u6761\u4ef6\u7684\u5f71\u54cd\u3002\u8d8a\u5927\u7684\\(w\\)\u4f7f\u8f93\u51fa\u66f4\u5f3a\u70c8\u5730\u9075\u5faa\u63d0\u793a\u8bcd\uff0c\u4f46\u964d\u4f4e\u4e86\u591a\u6837\u6027\u3002
RLHF\uff08\u57fa\u4e8e\u4eba\u7c7b\u53cd\u9988\u7684\u5f3a\u5316\u5b66\u4e60\uff0cOuyang\u7b49\u4eba\uff0c2022\uff09\u662f\u5bf9\u9f50\u8bed\u8a00\u6a21\u578b\u4e0e\u4eba\u7c7b\u504f\u597d\u7684\u4e3b\u6d41\u65b9\u6cd5\u3002\u8be5\u8fc7\u7a0b\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\uff1a
\u9996\u5148\uff0c\u76d1\u7763\u5fae\u8c03\uff08SFT\uff09\uff1a\u5728\u9ad8\u8d28\u91cf\u4eba\u5de5\u7f16\u5199\u7684\u63d0\u793a-\u56de\u590d\u6570\u636e\u96c6\u4e0a\u5bf9\u57fa\u7840\u8bed\u8a00\u6a21\u578b\u8fdb\u884c\u5fae\u8c03\u3002
\u5176\u6b21\uff0c\u5956\u52b1\u6a21\u578b\u8bad\u7ec3\uff1a\u6536\u96c6\u4eba\u7c7b\u6bd4\u8f83\u6570\u636e\uff08\u7ed9\u5b9a\u63d0\u793a\\(x\\)\u548c\u4e24\u4e2a\u56de\u590d\\(y_1, y_2\\)\uff0c\u54ea\u4e2a\u66f4\u597d\uff1f\uff09\u5e76\u8bad\u7ec3\u4e00\u4e2a\u5956\u52b1\u6a21\u578b\\(r_\\phi(x, y)\\)\u6765\u9884\u6d4b\u4eba\u7c7b\u504f\u597d\u3002\u5956\u52b1\u6a21\u578b\u4f7f\u7528\u6210\u5bf9\u6392\u5e8f\u635f\u5931\u8fdb\u884c\u8bad\u7ec3\uff1a
\u5176\u4e2d\\(y_w\\)\u662f\u66f4\u53d7\u504f\u597d\u7684\u56de\u590d\uff0c\\(y_l\\)\u662f\u4e0d\u53d7\u504f\u597d\u7684\u56de\u590d\u3002
\u7b2c\u4e09\uff0cRL\u5fae\u8c03\uff1a\u4f18\u5316\u8bed\u8a00\u6a21\u578b\u4ee5\u6700\u5927\u5316\u5956\u52b1\uff0c\u540c\u65f6\u4fdd\u6301\u63a5\u8fd1SFT\u6a21\u578b\uff08\u4ee5\u9632\u6b62\u6a21\u5f0f\u5d29\u584c\uff09\u3002\u8fd9\u4f7f\u7528\u5e26\u6709KL\u60e9\u7f5a\u7684PPO\uff08\u8fd1\u7aef\u7b56\u7565\u4f18\u5316\uff0c\u6765\u81ea\u7b2c06\u7ae0\uff09\uff1a
\u8fd9\u5728\u6570\u5b66\u4e0a\u7b49\u4ef7\u4e8eRLHF\uff0c\u4f46\u5c06\u5956\u52b1\u6a21\u578b\u548cRL\u8bad\u7ec3\u5408\u5e76\u4e3a\u4e00\u4e2a\u5355\u4e00\u7684\u76d1\u7763\u6b65\u9aa4\u3002
sigmoid\u5185\u90e8\u7684\u8868\u8fbe\u5f0f\u53ef\u4ee5\u7406\u89e3\u4e3a\uff1a\"\u589e\u52a0\u504f\u597d\u56de\u590d\u7684\u76f8\u5bf9\u6982\u7387\uff0c\u964d\u4f4e\u4e0d\u504f\u597d\u56de\u590d\u7684\u76f8\u5bf9\u6982\u7387\uff0c\u8fd9\u662f\u76f8\u5bf9\u4e8e\u53c2\u8003\u6a21\u578b\u800c\u8a00\u7684\u3002\"
\u53c2\u6570\\(\\beta\\)\u63a7\u5236\u7b56\u7565\u53ef\u4ee5\u504f\u79bb\u53c2\u8003\u6a21\u578b\u7684\u7a0b\u5ea6\u3002\u5728\u5b9e\u8df5\u4e2d\uff0cDPO\u5b9e\u73b0\u66f4\u7b80\u5355\uff08\u53ea\u9700\u8ba1\u7b97\u5f53\u524d\u6a21\u578b\u548c\u53c2\u8003\u6a21\u578b\u5bf9\u4e24\u4e2a\u5b8c\u6210\u5e8f\u5217\u7684\u5bf9\u6570\u6982\u7387\uff09\uff0c\u5e76\u4e14\u907f\u514d\u4e86PPO\u8bad\u7ec3\u7684\u4e0d\u7a33\u5b9a\u6027\u3002
Constitutional AI\uff08Bai\u7b49\u4eba\uff0c2022\uff09\u81ea\u52a8\u5316\u4e86\u5bf9\u9f50\u8fc7\u7a0b\u7684\u67d0\u4e9b\u90e8\u5206\u3002\u5b83\u4e0d\u518d\u6536\u96c6\u4eba\u7c7b\u6bd4\u8f83\u6570\u636e\uff0c\u800c\u662f\u8ba9\u8bed\u8a00\u6a21\u578b\u672c\u8eab\u6839\u636e\u4e00\u7ec4\u539f\u5219\uff08\"\u5baa\u6cd5\"\uff09\u6765\u6279\u8bc4\u548c\u4fee\u8ba2\u81ea\u5df1\u7684\u8f93\u51fa\uff0c\u4f8b\u5982\"\u9009\u62e9\u5371\u5bb3\u8f83\u5c0f\u7684\u56de\u590d\"\u3002\u7136\u540e\uff0cAI\u751f\u6210\u7684\u6bd4\u8f83\u6570\u636e\u88ab\u7528\u4e8e\u504f\u597d\u8bad\u7ec3\uff08RLAIF\uff1a\u57fa\u4e8eAI\u53cd\u9988\u7684\u5f3a\u5316\u5b66\u4e60\uff09\u3002
\u957f\u4e0a\u4e0b\u6587\u65b9\u6cd5\u89e3\u51b3\u4e86\u6807\u51c6\u81ea\u6ce8\u610f\u529b\u7684\\(O(n^2)\\)\u5185\u5b58\u548c\u8ba1\u7b97\u6210\u672c\u95ee\u9898\uff0c\u8fd9\u9650\u5236\u4e86\u5e8f\u5217\u957f\u5ea6\u3002\u5f53\\(n\\)\u589e\u957f\u5230\u6570\u4e07\u6216\u6570\u5341\u4e07\u4e2atoken\u65f6\uff0c\u6807\u51c6\u6ce8\u610f\u529b\u53d8\u5f97\u4e0d\u53ef\u884c\u3002
\u7a00\u758f\u6ce8\u610f\u529b\u5c06\u7a20\u5bc6\u7684\\(n \\times n\\)\u6ce8\u610f\u529b\u77e9\u9635\u66ff\u6362\u4e3a\u4e00\u79cd\u7a00\u758f\u6a21\u5f0f\uff0c\u5176\u4e2d\u6bcf\u4e2atoken\u53ea\u5173\u6ce8\u5176\u4ed6token\u7684\u4e00\u4e2a\u5b50\u96c6\u3002\u5e38\u89c1\u7684\u6a21\u5f0f\u5305\u62ec\u5c40\u90e8\u6ce8\u610f\u529b\uff08\u6bcf\u4e2atoken\u5173\u6ce8\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u76f8\u90bb\u7a97\u53e3\uff09\u3001\u6b65\u957f\u6ce8\u610f\u529b\uff08\u5173\u6ce8\u6bcf\u9694\\(k\\)\u4e2atoken\uff09\u548c\u968f\u673a\u6ce8\u610f\u529b\uff08\u5173\u6ce8\u4e00\u4e2a\u968f\u673a\u5b50\u96c6\uff09\u3002\u8fd9\u4e9b\u6a21\u5f0f\u7684\u7ec4\u5408\uff08\u7528\u4e8eBigBird\u3001Longformer\uff09\u5b9e\u73b0\u4e86\\(O(n)\\)\u6216\\(O(n \\sqrt{n})\\)\u7684\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u4fdd\u6301\u4e86\u6355\u83b7\u5c40\u90e8\u548c\u5168\u5c40\u4f9d\u8d56\u5173\u7cfb\u7684\u80fd\u529b\u3002
\u6ed1\u52a8\u7a97\u53e3\u6ce8\u610f\u529b\u5c06\u6bcf\u4e2atoken\u9650\u5236\u4e3a\u53ea\u5173\u6ce8\u5176\u4e4b\u524d\u7684\\(w\\)\u4e2atoken\uff08\u5176\u5c40\u90e8\u7a97\u53e3\uff09\u3002\u8fd9\u662f\\(O(nw)\\)\u800c\u4e0d\u662f\\(O(n^2)\\)\uff0c\u4f46\u957f\u8ddd\u79bb\u4fe1\u606f\u5fc5\u987b\u901a\u8fc7\u8de8\u5c42\u7684\u91cd\u53e0\u7a97\u53e3\u4f20\u64ad\u3002\u5bf9\u4e8e\\(L\\)\u5c42\u548c\u7a97\u53e3\u5927\u5c0f\\(w\\)\uff0c\u6709\u6548\u611f\u53d7\u91ce\u4e3a\\(L \\times w\\)\u4e2atoken\u3002
\u73af\u5f62\u6ce8\u610f\u529b\u901a\u8fc7\u5c06\u8bbe\u5907\u6392\u5217\u6210\u73af\u5f62\u62d3\u6251\u7ed3\u6784\uff0c\u5c06\u957f\u5e8f\u5217\u5206\u5e03\u5230\u591a\u4e2a\u8bbe\u5907\u4e0a\u3002\u6bcf\u4e2a\u8bbe\u5907\u6301\u6709\u5e8f\u5217\u7684\u4e00\u4e2a\u5757\uff0c\u5e76\u4e3a\u5176\u5757\u8ba1\u7b97\u6ce8\u610f\u529b\uff0c\u540c\u65f6\u5c06\u952e\u503c\u5757\u53d1\u9001\u7ed9\u73af\u4e2d\u7684\u4e0b\u4e00\u4e2a\u8bbe\u5907\u3002\u8fd9\u79cd\u65b9\u5f0f\u5c06\u8ba1\u7b97\u4e0e\u901a\u4fe1\u91cd\u53e0\uff0c\u5141\u8bb8\u4efb\u610f\u957f\u5ea6\u7684\u5e8f\u5217\uff0c\u4ec5\u53d7\u6240\u6709\u8bbe\u5907\u603b\u5185\u5b58\u7684\u9650\u5236\uff0c\u800c\u4e0d\u53d7\u4efb\u4f55\u5355\u4e2a\u8bbe\u5907\u5185\u5b58\u7684\u9650\u5236\u3002
\u8bb0\u5fc6\u589e\u5f3a\u6a21\u578b\u901a\u8fc7\u4e3aTransformer\u914d\u5907\u4e00\u4e2a\u5916\u90e8\u8bb0\u5fc6\u5e93\u6765\u6269\u5c55\u4e0a\u4e0b\u6587\u3002\u5728\u6bcf\u4e2a\u5c42\u4e2d\uff0c\u6a21\u578b\u53ef\u4ee5\u4f7f\u7528\u6ce8\u610f\u529b\u4ece\u8fd9\u4e2a\u8bb0\u5fc6\u5e93\u4e2d\u8bfb\u53d6\u548c\u5199\u5165\u3002Memorizing Transformers\u7f13\u5b58\u6765\u81ea\u5148\u524d\u5757\u7684\u952e\u503c\u5bf9\uff0c\u5e76\u5728\u540e\u7eed\u5757\u4e2d\u5173\u6ce8\u5b83\u4eec\uff0c\u4ece\u800c\u6709\u6548\u5730\u5c06\u4e0a\u4e0b\u6587\u6269\u5c55\u5230\u8bad\u7ec3\u7a97\u53e3\u4e4b\u5916\u3002\u68c0\u7d22\u662f\u8fd1\u4f3c\u7684\uff08\u4f7f\u7528\u7f13\u5b58\u952e\u7684\\(k\\)\u8fd1\u90bb\u641c\u7d22\uff09\u4ee5\u4fdd\u6301\u9ad8\u6548\u3002
\u4e0a\u8ff0\u65b9\u6cd5\u662f\u5904\u7406\u957f\u4e0a\u4e0b\u6587\u7684\u67b6\u6784\u89e3\u51b3\u65b9\u6848\u3002\u540c\u6837\u91cd\u8981\u7684\u662f\u6a21\u578b\u5982\u4f55\u88ab\u8bad\u7ec3\u4ee5\u6709\u6548\u4f7f\u7528\u957f\u4e0a\u4e0b\u6587\u3002
\u6e10\u8fdb\u5f0f\u4e0a\u4e0b\u6587\u6269\u5c55\u662f\u6807\u51c6\u65b9\u6cd5\u3002\u4ece\u4e00\u5f00\u59cb\u5c31\u5728\u975e\u5e38\u957f\u7684\u5e8f\u5217\u4e0a\u8bad\u7ec3\u4ee3\u4ef7\u9ad8\u6602\uff08\\(O(n^2)\\)\u7684\u6ce8\u610f\u529b\u6210\u672c\uff09\uff0c\u56e0\u6b64\u6a21\u578b\u5728\u8f83\u77ed\u7684\u4e0a\u4e0b\u6587\u957f\u5ea6\u4e0a\u9884\u8bad\u7ec3\uff08\u901a\u5e38\u4e3a4K-8K token\uff09\uff0c\u7136\u540e\u901a\u8fc7\u7ee7\u7eed\u9884\u8bad\u7ec3\u5206\u9636\u6bb5\u6269\u5c55\u5230\u76ee\u6807\u957f\u5ea6\u3002
Llama 3.1\u4ece8K\u6269\u5c55\u5230128K\uff0c\u4f7f\u7528\u4e86800B token\uff0c\u5e76\u9010\u6b65\u589e\u52a0\u5e8f\u5217\u957f\u5ea6\u3002DeepSeek-V3\u57284K\u5904\u8bad\u7ec3\uff0c\u7136\u540e\u6269\u5c55\u523032K\uff0c\u518d\u5230128K\u3002
\u6bcf\u4e2a\u9636\u6bb5\u4f7f\u7528\u9002\u4e2d\u7684token\u6570\u91cf\uff08\u76f8\u5bf9\u4e8e\u5b8c\u6574\u7684\u9884\u8bad\u7ec3\u9884\u7b97\uff09\uff0c\u56e0\u4e3a\u6a21\u578b\u53ea\u9700\u8981\u5b66\u4e60\u5982\u4f55\u4f7f\u7528\u66f4\u957f\u7684\u4f4d\u7f6e\uff0c\u800c\u4e0d\u662f\u91cd\u65b0\u5b66\u4e60\u8bed\u8a00\u672c\u8eab\u3002
\u5728\u6269\u5c55\u8fc7\u7a0b\u4e2d\uff0c\u4f4d\u7f6e\u7f16\u7801\u5fc5\u987b\u8fdb\u884c\u8c03\u6574\u3002RoPE\u63d2\u503c\u7f29\u5c0f\u4f4d\u7f6e\u7d22\u5f15\uff0c\u4f7f\u5f97\u6a21\u578b\u770b\u5230\u4e0e\u8bad\u7ec3\u65f6\u76f8\u540c\u7684\u65cb\u8f6c\u89d2\u5ea6\uff0c\u53ea\u662f\u5206\u5e03\u5728\u66f4\u957f\u7684\u5e8f\u5217\u4e0a\u3002\u5982\u679c\u6a21\u578b\u5728\u957f\u5ea6\\(L\\)\u4e0a\u8bad\u7ec3\uff0c\u4f60\u60f3\u8981\u6269\u5c55\u5230\\(L' = 4L\\)\uff0c\u4f60\u53ef\u4ee5\u5c06\u6240\u6709\u4f4d\u7f6e\u7d22\u5f15\u9664\u4ee54\u3002
\u8fd9\u610f\u5473\u7740\u6a21\u578b\u6c38\u8fdc\u4e0d\u4f1a\u9047\u5230\u672a\u89c1\u8fc7\u7684\u65cb\u8f6c\u89d2\u5ea6\uff0c\u4f46\u76f8\u90bb\u4f4d\u7f6e\u4e4b\u95f4\u7684\u6709\u6548\u5206\u8fa8\u7387\u4f1a\u4e0b\u964d\u3002
RoPE\u5916\u63a8\u4fdd\u6301\u539f\u59cb\u4f4d\u7f6e\u7d22\u5f15\u4e0d\u53d8\uff0c\u76f4\u63a5\u5c06RoPE\u5e94\u7528\u4e8e\u8d85\u51fa\\(L\\)\u7684\u4f4d\u7f6e\uff0c\u4f9d\u8d56\u6a21\u578b\u5bf9\u672a\u89c1\u89d2\u5ea6\u7684\u6cdb\u5316\u80fd\u529b\u3002
\u63d2\u503c\u8981\u7a33\u5b9a\u5f97\u591a\uff1b\u5728\u4e0d\u8c03\u6574\u57fa\u9891\uff08ABF\uff09\u7684\u60c5\u51b5\u4e0b\uff0c\u5916\u63a8\u4f1a\u8fc5\u901f\u9000\u5316\u3002
YaRN\uff08Yet another RoPE extensioN\uff0c\u53c8\u4e00\u79cdRoPE\u6269\u5c55\uff09\u6539\u8fdb\u4e86\u6734\u7d20\u63d2\u503c\uff0c\u56e0\u4e3a\u5b83\u8ba4\u8bc6\u5230\u5e76\u975e\u6240\u6709RoPE\u7ef4\u5ea6\u90fd\u5e94\u88ab\u540c\u7b49\u5bf9\u5f85\u3002
\u9ad8\u9891\u7ef4\u5ea6\uff08\u5728\\(\\theta_i = \\theta_{\\text{base}}^{-2i/d}\\)\u4e2d\u8f83\u5c0f\u7684\\(i\\)\uff09\u5728\u8bad\u7ec3\u957f\u5ea6\u5185\u65cb\u8f6c\u591a\u6b21\uff0c\u53ef\u4ee5\u5f88\u597d\u5730\u5916\u63a8\u3002
\u4f4e\u9891\u7ef4\u5ea6\uff08\u8f83\u5927\u7684\\(i\\)\uff09\u65cb\u8f6c\u7f13\u6162\uff0c\u5bf9\u957f\u5ea6\u6269\u5c55\u66f4\u654f\u611f\u3002
YaRN\u53ea\u63d2\u503c\u4f4e\u9891\u7ef4\u5ea6\uff0c\u5916\u63a8\u9ad8\u9891\u7ef4\u5ea6\uff0c\u5e76\u5bf9\u6ce8\u610f\u529blogits\u5e94\u7528\u6e29\u5ea6\u7f29\u653e\\(t\\)\u4ee5\u8865\u507f\u5206\u5e03\u504f\u79fb\uff1a
\u5176\u4e2d\\(t > 1\\)\u5c55\u5e73\u4e86\u6ce8\u610f\u529b\u5206\u5e03\uff0c\u9632\u6b62\u6a21\u578b\u5728\u4f4d\u7f6e\u4fe1\u53f7\u88ab\u538b\u7f29\u65f6\u8fc7\u4e8e\u5c16\u9510\u5730\u5173\u6ce8\u9644\u8fd1\u7684token\u3002
\u957f\u4e0a\u4e0b\u6587\u6570\u636e\u7b56\u5c55\u662f\u4e00\u4e2a\u5173\u952e\u4e14\u5e38\u88ab\u4f4e\u4f30\u7684\u6311\u6218\u3002\u5927\u591a\u6570\u9884\u8bad\u7ec3\u8bed\u6599\u5e93\u7531\u77ed\u6587\u6863\u7ec4\u6210\uff08\u65b0\u95fb\u6587\u7ae0\u3001\u7f51\u9875\u3001\u793e\u4ea4\u5a92\u4f53\u5e16\u5b50\uff09\u3002
\u957f\u4e0a\u4e0b\u6587\u8bad\u7ec3\u9700\u8981\u5b9e\u9645\u5229\u7528\u5b8c\u6574\u4e0a\u4e0b\u6587\u7a97\u53e3\u7684\u6570\u636e\u7ec4\u5408\uff1a\u4e66\u7c4d\u3001\u4ee3\u7801\u4ed3\u5e93\u3001\u957f\u7bc7\u79d1\u5b66\u6587\u7ae0\u3001\u591a\u8f6e\u5bf9\u8bdd\u65e5\u5fd7\uff0c\u4ee5\u53ca\u4e3b\u9898\u76f8\u5173\u7684\u62fc\u63a5\u6587\u6863\u3002
\u5982\u679c\u6a21\u578b\u4ec5\u5728\u586b\u5145\u6216\u6253\u5305\u4ee5\u586b\u6ee1\u4e0a\u4e0b\u6587\u7a97\u53e3\u7684\u77ed\u6587\u6863\u4e0a\u8bad\u7ec3\uff0c\u5b83\u4f1a\u5b66\u4f1a\u5ffd\u7565\u8fdc\u5904\u7684token\uff0c\u56e0\u4e3a\u5b83\u4eec\u4ece\u6765\u90fd\u4e0d\u76f8\u5173\u3002
\u5e8f\u5217\u6253\u5305\u662f\u4e00\u79cd\u8bad\u7ec3\u6548\u7387\u6280\u672f\uff1a\u591a\u4e2a\u6587\u6863\u62fc\u63a5\u6210\u4e00\u4e2a\u8bad\u7ec3\u5e8f\u5217\u4ee5\u907f\u514d\u586b\u5145\u6d6a\u8d39\uff0c\u4f7f\u7528\u6ce8\u610f\u529b\u63a9\u7801\u9632\u6b62\u8de8\u6587\u6863\u7684\u6ce8\u610f\u529b\u3002
\u5bf9\u4e8e\u957f\u4e0a\u4e0b\u6587\u8bad\u7ec3\uff0c\u6253\u5305\u7b56\u7565\u5f88\u91cd\u8981\uff1a\u6253\u5305\u8bb8\u591a\u4e0d\u76f8\u5173\u7684\u77ed\u6587\u6863\u4f1a\u6559\u6a21\u578b\u5c06\u8fdc\u5904\u7684token\u89c6\u4e3a\u566a\u58f0\uff0c\u800c\u6253\u5305\u66f4\u5c11\u7684\u3001\u771f\u6b63\u957f\u7684\u6587\u6863\u5219\u6559\u5b83\u4f7f\u7528\u5b8c\u6574\u7684\u4e0a\u4e0b\u6587\u3002
\u4e00\u4e2a\u5df2\u77e5\u7684\u5931\u8d25\u6a21\u5f0f\u662f\"\u4e2d\u95f4\u8ff7\u5931\"\u73b0\u8c61\uff08Liu\u7b49\u4eba\uff0c2023\uff09\uff1a\u8bed\u8a00\u6a21\u578b\u80fd\u591f\u6709\u6548\u5229\u7528\u4e0a\u4e0b\u6587\u7a97\u53e3\u5f00\u5934\u548c\u7ed3\u5c3e\u7684\u4fe1\u606f\uff0c\u4f46\u5728\u5904\u7406\u4f4d\u4e8e\u4e2d\u95f4\u7684\u4fe1\u606f\u65f6\u8868\u73b0\u56f0\u96be\u3002
\u8fd9\u7c7b\u4f3c\u4e8e\u4eba\u7c7b\u8bb0\u5fc6\u4e2d\u7684\u5e8f\u5217\u4f4d\u7f6e\u6548\u5e94\uff08\u9996\u56e0\u6548\u5e94\u548c\u8fd1\u56e0\u6548\u5e94\uff09\u3002
\u5b83\u90e8\u5206\u6e90\u4e8e\u8bad\u7ec3\u6570\u636e\u7684\u5206\u5e03\uff08\u91cd\u8981\u4fe1\u606f\u901a\u5e38\u5728\u6587\u6863\u7684\u5f00\u5934\u6216\u7ed3\u5c3e\uff09\uff0c\u90e8\u5206\u6e90\u4e8e\u6ce8\u610f\u529b\u6a21\u5f0f\u96c6\u4e2d\u4e8e\u90bb\u8fd1token\u548c\u521d\u59cbtoken\u3002
\u901a\u8fc7\u5728\u4e0d\u540c\u4f4d\u7f6e\u653e\u7f6e\u5173\u952e\u4fe1\u606f\u8fdb\u884c\u957f\u4e0a\u4e0b\u6587\u8bad\u7ec3\u53ef\u4ee5\u7f13\u89e3\u4f46\u65e0\u6cd5\u5b8c\u5168\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002
\u5927\u6d77\u635e\u9488\u8bc4\u4f30\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u80fd\u591f\u4ece\u957f\u957f\u7684\u5e72\u6270\u4e0a\u4e0b\u6587\uff08\"\u5927\u6d77\"\uff09\u4e2d\u68c0\u7d22\u51fa\u4f4d\u4e8e\u4e0d\u540c\u4f4d\u7f6e\u7684\u7279\u5b9a\u4e8b\u5b9e\uff08\"\u9488\"\uff09\u3002
\u5177\u6709\u771f\u6b63\u957f\u4e0a\u4e0b\u6587\u80fd\u529b\u7684\u6a21\u578b\u5e94\u8be5\u65e0\u8bba\u9488\u653e\u5728\u54ea\u91cc\u90fd\u80fd\u5b9e\u73b0\u8fd1\u4e4e\u5b8c\u7f8e\u7684\u68c0\u7d22\u3002
\u8fd9\u4e2a\u6d4b\u8bd5\u6e05\u6670\u5730\u63ed\u793a\u4e86\"\u4e2d\u95f4\u8ff7\u5931\"\u6548\u5e94\uff0c\u5e76\u88ab\u7528\u4f5c\u4e0a\u4e0b\u6587\u6269\u5c55\u65b9\u6cd5\u7684\u57fa\u51c6\u3002
\u9884\u8bad\u7ec3\u540e\u7684\u957f\u4e0a\u4e0b\u6587\u5fae\u8c03\u4f7f\u7528\u6709\u9488\u5bf9\u6027\u7684SFT\u6570\u636e\uff1a\u957f\u591a\u8f6e\u5bf9\u8bdd\u3001\u8bc1\u636e\u5206\u6563\u5728\u6570\u5343\u4e2atoken\u4e2d\u7684\u6587\u6863\u95ee\u7b54\u3001\u957f\u7bc7\u6458\u8981\uff0c\u4ee5\u53ca\u4ed3\u5e93\u7ea7\u522b\u7684\u4ee3\u7801\u7406\u89e3\u3002
Qwen3\u5728\u6b64\u9636\u6bb5\u4f7f\u7528\u53cc\u5757\u6ce8\u610f\u529b\uff08DCA\uff09\uff0c\u5b83\u5c06\u957f\u5e8f\u5217\u4f5c\u4e3a\u6210\u5bf9\u7684\u5757\u8fdb\u884c\u5904\u7406\uff0c\u5176\u4e2d\u5757\u5185\u6ce8\u610f\u529b\u662f\u5b8c\u6574\u7684\uff0c\u5757\u95f4\u6ce8\u610f\u529b\u662f\u9ad8\u6548\u7684\uff0c\u5728\u5fae\u8c03\u671f\u95f4\u5b9e\u73b0\u4e864\u500d\u7684\u6709\u6548\u5e8f\u5217\u5bb9\u91cf\u3002
\u72b6\u6001\u7a7a\u95f4\u6a21\u578b\uff08SSM\uff09\u63d0\u4f9b\u4e86\u4e00\u79cd\u6839\u672c\u4e0d\u540c\u7684\u957f\u5e8f\u5217\u5efa\u6a21\u65b9\u6cd5\u3002\u5b83\u4eec\u4e0d\u662f\u4fee\u6539\u6ce8\u610f\u529b\uff0c\u800c\u662f\u7528\u53d7\u8fde\u7eed\u65f6\u95f4\u63a7\u5236\u7406\u8bba\u542f\u53d1\u7684\u7ebf\u6027\u52a8\u529b\u7cfb\u7edf\u5b8c\u5168\u53d6\u4ee3\u6ce8\u610f\u529b\u3002
\u4e00\u4e2aSSM\u5c06\u8f93\u5165\u5e8f\u5217\\(u(t)\\)\u901a\u8fc7\u4e00\u4e2a\u6f5c\u5728\u72b6\u6001\\(x(t) \\in \\mathbb{R}^N\\)\u6620\u5c04\u5230\u8f93\u51fa\\(y(t)\\)\uff0c\u5176\u63a7\u5236\u65b9\u7a0b\u4e3a\uff1a
\u5176\u4e2d\\(A \\in \\mathbb{R}^{N \\times N}\\)\u662f\u72b6\u6001\u8f6c\u79fb\u77e9\u9635\uff0c\\(B \\in \\mathbb{R}^{N \\times 1}\\)\u662f\u8f93\u5165\u6295\u5f71\uff0c\\(C \\in \\mathbb{R}^{1 \\times N}\\)\u662f\u8f93\u51fa\u6295\u5f71\uff0c\\(D\\)\u662f\u4e00\u4e2a\u8df3\u8dc3\u8fde\u63a5\u3002
\u4e3a\u4e86\u5c06\u5176\u5e94\u7528\u4e8e\u79bb\u6563\u5e8f\u5217\uff08token\uff09\uff0c\u4f7f\u7528\u6b65\u957f\\(\\Delta\\)\u5bf9\u8fde\u7eed\u7cfb\u7edf\u8fdb\u884c\u79bb\u6563\u5316\u3002\u96f6\u9636\u4fdd\u6301\u79bb\u6563\u5316\u7ed9\u51fa\uff1a
\u79bb\u6563\u9012\u5f52\u53d8\u4e3a\\(x_k = \\bar{A} x_{k-1} + \\bar{B} u_k\\)\uff0c\\(y_k = C x_k + D u_k\\)\uff0c\u8fd9\u770b\u8d77\u6765\u50cf\u4e00\u4e2aRNN\uff1a\u6bcf\u6b21\u7528\u4e00\u4e2a\u9690\u85cf\u72b6\u6001\u5904\u7406\u4e00\u4e2atoken\u3002
\u4e0eRNN\u4e0d\u540c\uff0c\u8fd9\u4e2a\u9012\u5f52\u4e5f\u53ef\u4ee5\u5c55\u5f00\u4e3a\u4e00\u4e2a\u5168\u5c40\u5377\u79ef\uff1a\u56e0\u4e3a\u7cfb\u7edf\u662f\u7ebf\u6027\u7684\uff0c\u8f93\u51fa\u4e3a\\(y = \\bar{K} \\ast u\\)\uff0c\u5176\u4e2d\u6838\\(\\bar{K} = (C\\bar{B}, \\, C\\bar{A}\\bar{B}, \\, C\\bar{A}^2\\bar{B}, \\ldots)\\)\u4ec5\u53d6\u51b3\u4e8e\u56fa\u5b9a\u53c2\u6570\u3002
\u8fd9\u79cd\u53cc\u91cd\u89c6\u89d2\u2014\u2014\u7528\u4e8e\u9ad8\u6548\u81ea\u56de\u5f52\u63a8\u7406\u7684\u9012\u5f52\uff08\u6bcf\u6b65\\(O(1)\\)\uff09\u548c\u7528\u4e8e\u9ad8\u6548\u5e76\u884c\u8bad\u7ec3\u7684\u5377\u79ef\uff08\u901a\u8fc7FFT\u5b9e\u73b0\\(O(n \\log n)\\)\uff09\u2014\u2014\u662fSSM\u7684\u6838\u5fc3\u6d1e\u89c1\u3002
S4\uff08\u5e8f\u5217\u5efa\u6a21\u7684\u7ed3\u6784\u5316\u72b6\u6001\u7a7a\u95f4\uff0cGu\u7b49\u4eba\uff0c2022\uff09\u901a\u8fc7\u89e3\u51b3\u5173\u952e\u7684\u6570\u503c\u6311\u6218\u4f7fSSM\u53d8\u5f97\u5b9e\u7528\uff1a\u72b6\u6001\u77e9\u9635\\(A\\)\u5fc5\u987b\u6355\u83b7\u957f\u8ddd\u79bb\u4f9d\u8d56\u5173\u7cfb\uff0c\u4f46\u6734\u7d20\u5730\u53c2\u6570\u5316\u4f1a\u5bfc\u81f4\u68af\u5ea6\u6d88\u5931\u6216\u7206\u70b8\uff08\u4e0e\u666e\u901aRNN\u76f8\u540c\u7684\u95ee\u9898\uff09\u3002
S4\u4f7f\u7528HiPPO\uff08\u9ad8\u9636\u591a\u9879\u5f0f\u6295\u5f71\u7b97\u5b50\uff09\u77e9\u9635\u521d\u59cb\u5316\\(A\\)\uff0c\u8be5\u77e9\u9635\u6765\u6e90\u4e8e\u8fde\u7eed\u4fe1\u53f7\u6700\u4f18\u591a\u9879\u5f0f\u903c\u8fd1\u7684\u7406\u8bba\u3002HiPPO\u77e9\u9635\u5177\u6709\u7279\u5b9a\u7684\u7ed3\u6784\uff0c\u88ab\u8bc1\u660e\u80fd\u4f7f\u72b6\u6001\u4ee5\u4f18\u96c5\u8870\u51cf\u7684\u65b9\u5f0f\u7ef4\u6301\u6574\u4e2a\u8f93\u5165\u5386\u53f2\u7684\u538b\u7f29\u8868\u793a\uff1a
\u8fd9\u79cd\u4e0b\u4e09\u89d2\u7ed3\u6784\u786e\u4fdd\u72b6\u6001\u4f7f\u7528\u52d2\u8ba9\u5fb7\u591a\u9879\u5f0f\u4f5c\u4e3a\u4fe1\u53f7\u7684\u5728\u7ebf\u903c\u8fd1\u5668\u3002\u8ba1\u7b97\u957f\u6838\u7684\\(\\bar{A}^k\\)\u4ee3\u4ef7\u9ad8\u6602\uff0c\u56e0\u6b64S4\u5229\u7528HiPPO\u77e9\u9635\u53ef\u4ee5\u5206\u89e3\u4e3a\u4f4e\u79e9\u9879\u548c\u5bf9\u89d2\u9879\u4e4b\u548c\u7684\u4e8b\u5b9e\uff0c\u5b9e\u73b0\u4e86\\(O(n \\log n)\\)\u7684\u6838\u8ba1\u7b97\u3002
Mamba\uff08Gu\u548cDao\uff0c2023\uff09\u5f15\u5165\u4e86\u9009\u62e9\u6027\u72b6\u6001\u7a7a\u95f4\u8fd9\u4e00\u5173\u952e\u521b\u65b0\uff1a\u4f7fSSM\u53c2\u6570\u4f9d\u8d56\u4e8e\u8f93\u5165\u3002\u5728S4\u4e2d\uff0c\u77e9\u9635\\(A\\)\u3001\\(B\\)\u3001\\(C\\)\u548c\u6b65\u957f\\(\\Delta\\)\u662f\u56fa\u5b9a\u7684\u2014\u2014\u65e0\u8bba\u5185\u5bb9\u5982\u4f55\uff0c\u76f8\u540c\u7684\u52a8\u529b\u5b66\u5e94\u7528\u4e8e\u6bcf\u4e2atoken\u3002Mamba\u4f7f\\(B\\)\u3001\\(C\\)\u548c\\(\\Delta\\)\u6210\u4e3a\u8f93\u5165\u7684\u51fd\u6570\uff1a
\u8fd9\u79cd\u9009\u62e9\u6027\u5141\u8bb8\u6a21\u578b\u5728\u6bcf\u4e2a\u4f4d\u7f6e\u51b3\u5b9a\u54ea\u4e9b\u4fe1\u606f\u5b58\u5165\u72b6\u6001\u3001\u54ea\u4e9b\u4fe1\u606f\u5ffd\u7565\u2014\u2014\u7c7b\u4f3c\u4e8e\u6ce8\u610f\u529b\u5982\u4f55\u9009\u62e9\u76f8\u5173token\uff0c\u4f46\u6ca1\u6709\u4e8c\u6b21\u6210\u672c\u3002\u6b65\u957f\\(\\Delta_k\\)\u63a7\u5236\u7740\"\u95e8\"\uff1a\u5927\u7684\\(\\Delta\\)\u5bfc\u81f4\u72b6\u6001\u5f3a\u70c8\u5730\u6574\u5408\u5f53\u524d\u8f93\u5165\uff08\u8fde\u7eed\u52a8\u529b\u5b66\u524d\u8fdb\u4e00\u5927\u6b65\uff0c\u6709\u6548\u91cd\u7f6e\u72b6\u6001\uff09\uff0c\u800c\u5c0f\u7684\\(\\Delta\\)\u5219\u4fdd\u7559\u73b0\u6709\u72b6\u6001\u5e76\u5ffd\u7565\u5f53\u524d\u8f93\u5165\u3002
\u6743\u8861\u4e4b\u5904\u5728\u4e8e\uff0c\u4f9d\u8d56\u4e8e\u8f93\u5165\u7684\u53c2\u6570\u6253\u7834\u4e86\u5377\u79ef\u89c6\u89d2\uff08\u6838\u4e0d\u518d\u56fa\u5b9a\uff09\uff0c\u56e0\u6b64Mamba\u65e0\u6cd5\u4f7f\u7528\u57fa\u4e8eFFT\u7684\u8bad\u7ec3\u3002\u76f8\u53cd\uff0c\u5b83\u4f7f\u7528\u4e00\u79cd\u786c\u4ef6\u611f\u77e5\u7684\u5e76\u884c\u626b\u63cf\u7b97\u6cd5\uff0c\u5229\u7528\u9012\u5f52\u7684\u7ed3\u5408\u5f8b\uff1a\u72b6\u6001\u66f4\u65b0\\((x_k, u_k) \\mapsto x_{k+1}\\)\u53ef\u4ee5\u8868\u793a\u4e3a\u4e00\u4e32\u7ed3\u5408\u6027\u64cd\u4f5c\uff0c\u5e76\u4f7f\u7528\u524d\u7f00\u548c\uff08\u626b\u63cf\uff09\u8fdb\u884c\u5e76\u884c\u5316\uff0c\u7c7b\u4f3c\u4e8e\u786c\u4ef6\u8bbe\u8ba1\u4e2d\u7684\u5e76\u884c\u524d\u7f00\u52a0\u6cd5\u3002\u8fd9\u5728GPU\u4e0a\u4ee5\\(O(n)\\)\u65f6\u95f4\u548c\\(O(\\log n)\\)\u6df1\u5ea6\u8fd0\u884c\uff0c\u51e0\u4e4e\u4e0e\u5377\u79ef\u7684\u6548\u7387\u76f8\u5f53\u3002
Mamba\u5b9e\u73b0\u4e86\u771f\u6b63\u6bcftoken \\(O(1)\\)\u7684\u63a8\u7406\uff08\u53ea\u9700\u66f4\u65b0\u56fa\u5b9a\u5927\u5c0f\u7684\u72b6\u6001\uff0c\u6ca1\u6709\u968f\u4e0a\u4e0b\u6587\u589e\u957f\u7684KV\u7f13\u5b58\uff09\uff0c\u4f7f\u5176\u5728\u957f\u5e8f\u5217\u957f\u5ea6\u4e0a\u4ece\u6839\u672c\u4e0a\u6bd4Transformer\u66f4\u8282\u7701\u5185\u5b58\u3002\u72b6\u6001\u5927\u5c0f\\(N\\)\uff08\u901a\u5e38\u4e3a16\uff09\u8fdc\u5c0f\u4e8eTransformer\u7684KV\u7f13\u5b58\uff08\u5b58\u50a8\\(O(n \\cdot d)\\)\u4e2a\u503c\uff09\u3002\u5728\u5b9e\u8df5\u4e2d\uff0c\u5728\u76f8\u540c\u7684\u53c2\u6570\u91cf\u4e0b\uff0cMamba\u5728\u8bed\u8a00\u5efa\u6a21\u57fa\u51c6\u4e0a\u7684\u8d28\u91cf\u8fbe\u5230\u6216\u8d85\u8fc7Transformer\uff0c\u5e76\u4e14\u5728\u957f\u5e8f\u5217\u4e0a\u63a8\u7406\u901f\u5ea6\u663e\u8457\u66f4\u5feb\u3002
\u6df7\u5408\u67b6\u6784\u5c06SSM\u5c42\u4e0e\u6ce8\u610f\u529b\u5c42\u76f8\u7ed3\u5408\uff0c\u4f7f\u7528SSM\u5904\u7406\u5927\u90e8\u5206\u5c42\uff08\u9ad8\u6548\u7684\u957f\u8ddd\u79bb\u4f20\u64ad\uff09\uff0c\u5e76\u7a7f\u63d2\u5c11\u91cf\u6ce8\u610f\u529b\u5c42\uff08\u7cbe\u786e\u7684\u57fa\u4e8e\u5185\u5bb9\u7684\u68c0\u7d22\uff09\u3002\u50cfJamba\u548cZamba\u8fd9\u6837\u7684\u6a21\u578b\u4ea4\u9519\u4e86Mamba\u548cTransformer\u5757\uff0c\u5728\u4fdd\u6301\u5927\u90e8\u5206\u63a8\u7406\u6548\u7387\u4f18\u52bf\u7684\u540c\u65f6\uff0c\u5b9e\u73b0\u4e86\u6bd4\u7eafSSM\u66f4\u597d\u7684\u8d28\u91cf\u3002\u8fd9\u8868\u660e\u6ce8\u610f\u529b\u548cSSM\u6355\u83b7\u4e86\u4e92\u8865\u7684\u80fd\u529b\uff1aSSM\u64c5\u957f\u5e73\u6ed1\u7684\u957f\u8ddd\u79bb\u72b6\u6001\u4f20\u64ad\uff0c\u800c\u6ce8\u610f\u529b\u64c5\u957f\u7cbe\u786e\u7684\u3001\u4f9d\u8d56\u4e8e\u5185\u5bb9\u7684\u67e5\u627e\u3002
\u68c0\u7d22\u589e\u5f3a\u751f\u6210\uff08RAG\uff09\u901a\u8fc7\u5728\u63a8\u7406\u65f6\u8ba9\u8bed\u8a00\u6a21\u578b\u8bbf\u95ee\u5916\u90e8\u77e5\u8bc6\u5e93\uff0c\u6765\u89e3\u51b3\u8bed\u8a00\u6a21\u578b\u7684\u77e5\u8bc6\u5c40\u9650\u6027\u3002RAG\u4e0d\u662f\u4ec5\u4f9d\u8d56\u4e8e\u8bad\u7ec3\u671f\u95f4\u7f16\u7801\u5728\u6a21\u578b\u53c2\u6570\u4e2d\u7684\u77e5\u8bc6\uff0c\u800c\u662f\u68c0\u7d22\u76f8\u5173\u6587\u6863\u5e76\u57fa\u4e8e\u5b83\u4eec\u8fdb\u884c\u6761\u4ef6\u751f\u6210\u3002
\u7ecf\u5178\u7684\u68c0\u7d22\u5668-\u9605\u8bfb\u5668\u67b6\u6784\u6709\u4e24\u4e2a\u7ec4\u4ef6\u3002\u68c0\u7d22\u5668\u63a5\u6536\u67e5\u8be2\u5e76\u4ece\u8bed\u6599\u5e93\u4e2d\u83b7\u53d6\u6700\u76f8\u5173\u7684top-\\(k\\)\u4e2a\u6bb5\u843d\u3002\u9605\u8bfb\u5668\uff08\u4e00\u4e2a\u8bed\u8a00\u6a21\u578b\uff09\u57fa\u4e8e\u67e5\u8be2\u548c\u68c0\u7d22\u5230\u7684\u6bb5\u843d\u751f\u6210\u7b54\u6848\u3002\u68c0\u7d22\u5668\u53ef\u4ee5\u4f7f\u7528\u7a00\u758f\u65b9\u6cd5\uff08BM25\uff0c\u5b83\u6269\u5c55\u4e86\u6587\u4ef602\u4e2d\u7684TF-IDF\uff09\u6216\u7a20\u5bc6\u65b9\u6cd5\u3002
\u7a20\u5bc6\u6bb5\u843d\u68c0\u7d22\uff08DPR\uff09\u4f7f\u7528\u53cc\u7f16\u7801\u5668\u67b6\u6784\uff1a\u4e00\u4e2a\u7f16\u7801\u5668\u5c06\u95ee\u9898\u6620\u5c04\u4e3a\u5411\u91cf\uff0c\u53e6\u4e00\u4e2a\u5c06\u6bb5\u843d\u6620\u5c04\u4e3a\u5411\u91cf\u3002\u4e24\u8005\u901a\u5e38\u90fd\u662f\u57fa\u4e8eBERT\u7684\u3002\u5728\u7d22\u5f15\u65f6\uff0c\u6240\u6709\u6bb5\u843d\u88ab\u7f16\u7801\u5e76\u5b58\u50a8\u3002\u5728\u67e5\u8be2\u65f6\uff0c\u95ee\u9898\u88ab\u7f16\u7801\uff0c\u4f7f\u7528\u8fd1\u4f3c\u6700\u8fd1\u90bb\u641c\u7d22\uff08\u5982FAISS\uff09\u627e\u5230\u6700\u8fd1\u7684\u6bb5\u843d\u3002\u76f8\u4f3c\u5ea6\u5ea6\u91cf\u662f\u95ee\u9898\u5411\u91cf\u548c\u6bb5\u843d\u5411\u91cf\u4e4b\u95f4\u7684\u70b9\u79ef\u3002
\u5206\u5757\u7b56\u7565\u663e\u8457\u5f71\u54cd\u68c0\u7d22\u8d28\u91cf\u3002\u6587\u6863\u5fc5\u987b\u88ab\u5206\u5272\u6210\u8db3\u591f\u5c0f\u4ee5\u4f7f\u68c0\u7d22\u5668\u80fd\u591f\u5904\u7406\u7684\u6bb5\u843d\uff0c\u4f46\u53c8\u8981\u8db3\u591f\u5927\u4ee5\u5305\u542b\u5b8c\u6574\u7684\u601d\u60f3\u3002\u56fa\u5b9a\u5927\u5c0f\u7684\u5206\u5757\uff08\u4f8b\u5982\uff0c256\u4e2atoken\uff0c50\u4e2atoken\u91cd\u53e0\uff09\u5f88\u7b80\u5355\uff0c\u4f46\u53ef\u80fd\u7b28\u62d9\u5730\u5206\u5272\u53e5\u5b50\u3002\u8bed\u4e49\u5206\u5757\u5728\u6bb5\u843d\u6216\u7ae0\u8282\u8fb9\u754c\u5904\u5206\u5272\u3002\u5c42\u6b21\u5316\u5206\u5757\u5728\u4e0d\u540c\u7c92\u5ea6\u4e0a\u521b\u5efa\u4e00\u4e2a\u6458\u8981\u6811\u3002
RAG\u6709\u51e0\u4e2a\u4f18\u52bf\uff1a\u77e5\u8bc6\u5e93\u53ef\u4ee5\u66f4\u65b0\u800c\u65e0\u9700\u91cd\u65b0\u8bad\u7ec3\u6a21\u578b\uff0c\u6a21\u578b\u53ef\u4ee5\u5f15\u7528\u6765\u6e90\uff0c\u5e76\u4e14\u56e0\u4e3a\u6a21\u578b\u53ef\u4ee5\u57fa\u4e8e\u68c0\u7d22\u5230\u7684\u6587\u672c\u8fdb\u884c\u56de\u7b54\uff0c\u5e7b\u89c9\u51cf\u5c11\u4e86\u3002\u4e3b\u8981\u6311\u6218\u662f\u68c0\u7d22\u8d28\u91cf\uff08\u5982\u679c\u68c0\u7d22\u5230\u9519\u8bef\u7684\u6bb5\u843d\uff0c\u6a21\u578b\u53ef\u80fd\u4f1a\u81ea\u4fe1\u5730\u7ed9\u51fa\u9519\u8bef\u7b54\u6848\uff09\u548c\u5ef6\u8fdf\uff08\u68c0\u7d22\u4e3a\u63a8\u7406\u589e\u52a0\u4e86\u4e00\u4e2a\u6b65\u9aa4\uff09\u3002
\u63a8\u6d4b\u6027\u89e3\u7801\u901a\u8fc7\u4f7f\u7528\u4e00\u4e2a\u5c0f\u7684\u3001\u5feb\u901f\u7684\u8349\u7a3f\u6a21\u578b\u5e76\u884c\u63d0\u51fa\u591a\u4e2atoken\uff0c\u7136\u540e\u7531\u5927\u7684\u76ee\u6807\u6a21\u578b\u5728\u5355\u4e2a\u524d\u5411\u4f20\u64ad\u4e2d\u8fdb\u884c\u9a8c\u8bc1\uff0c\u4ece\u800c\u52a0\u901f\u81ea\u56de\u5f52\u751f\u6210\u3002
\u8be5\u7b97\u6cd5\u7684\u5de5\u4f5c\u65b9\u5f0f\u5982\u4e0b\uff1a\u8349\u7a3f\u6a21\u578b\u81ea\u56de\u5f52\u5730\u751f\u6210\\(k\\)\u4e2a\u5019\u9009token\uff08\u56e0\u4e3a\u8349\u7a3f\u6a21\u578b\u5f88\u5c0f\uff0c\u6240\u4ee5\u8fd9\u5f88\u5feb\uff09\u3002
\u7136\u540e\uff0c\u76ee\u6807\u6a21\u578b\u5728\u5355\u4e2a\u524d\u5411\u4f20\u64ad\u4e2d\u540c\u65f6\u5bf9\u5168\u90e8\\(k\\)\u4e2atoken\u8fdb\u884c\u8bc4\u5206\uff08\u56e0\u4e3a\u5de5\u4f5c\u88ab\u6279\u5904\u7406\uff0c\u6240\u4ee5\u8fd9\u5f88\u9ad8\u6548\uff09\u3002
\u5bf9\u4e8e\u4ece\u8349\u7a3f\u5206\u5e03\\(p_d(t)\\)\u4e2d\u91c7\u6837\u7684\u6bcf\u4e2a\u5019\u9009token \\(t\\)\uff0c\u5b83\u4ee5\u6982\u7387\\(\\min(1, \\, p_{\\text{target}}(t) / p_d(t))\\)\u88ab\u63a5\u53d7\u3002\u5982\u679c\u88ab\u62d2\u7edd\uff0c\u5219\u4ece\u8c03\u6574\u540e\u5206\u5e03\\(p_{\\text{adj}}(t) = \\max(0, \\, p_{\\text{target}}(t) - p_d(t))\\)\uff08\u7ecf\u5f52\u4e00\u5316\uff09\u4e2d\u91cd\u65b0\u91c7\u6837\u4e00\u4e2a\u4fee\u6b63\u540e\u7684token\u3002
\u8fd9\u79cd\u63a5\u53d7-\u62d2\u7edd\u65b9\u6848\u4fdd\u8bc1\u4e86\u8f93\u51fa\u5206\u5e03\u4e0e\u5355\u72ec\u4f7f\u7528\u76ee\u6807\u6a21\u578b\u5b8c\u5168\u76f8\u540c\u3002
\u4e3a\u4e86\u7406\u89e3\u539f\u56e0\uff0c\u8003\u8651\u751f\u6210token \\(t\\)\u7684\u6709\u6548\u6982\u7387\u3002\u5b83\u53ef\u4ee5\u76f4\u63a5\u88ab\u63a5\u53d7\uff08\u6982\u7387\\(p_d(t) \\cdot \\min(1, p_{\\text{target}}(t)/p_d(t))\\)\uff09\uff0c\u6216\u8005\u901a\u8fc7\u91cd\u65b0\u91c7\u6837\u4ea7\u751f\u3002
\u5bf9\u4e8e\\(p_{\\text{target}}(t) \\leq p_d(t)\\)\u7684token\uff0c\u76f4\u63a5\u63a5\u53d7\u8d21\u732e\\(p_{\\text{target}}(t)\\)\u3002\u5bf9\u4e8e\\(p_{\\text{target}}(t) > p_d(t)\\)\u7684token\uff0c\u76f4\u63a5\u63a5\u53d7\u8d21\u732e\\(p_d(t)\\)\uff0c\u91cd\u65b0\u91c7\u6837\u8d21\u732e\u5269\u4f59\u90e8\u5206\\(p_{\\text{target}}(t) - p_d(t)\\)\uff08\u5728\u8003\u8651\u62d2\u7edd\u6982\u7387\u4e4b\u540e\uff09\u3002
\u5728\u8fd9\u4e24\u79cd\u60c5\u51b5\u4e0b\uff0c\u751f\u6210\\(t\\)\u7684\u603b\u6982\u7387\u7b49\u4e8e\\(p_{\\text{target}}(t)\\)\u3002\u8349\u7a3f\u6a21\u578b\u53ea\u5f71\u54cd\u901f\u5ea6\uff0c\u4e0d\u5f71\u54cd\u8d28\u91cf\u3002
\u52a0\u901f\u53d6\u51b3\u4e8e\u63a5\u53d7\u7387\uff1a\u5982\u679c\u8349\u7a3f\u6a21\u578b\u4e0e\u76ee\u6807\u6a21\u578b\u5bf9\u9f50\u826f\u597d\uff0c\u5927\u591a\u6570token\u88ab\u63a5\u53d7\uff0c\u5899\u4e0a\u65f6\u949f\u65f6\u95f4\u5927\u81f4\u7b49\u4e8e\u8349\u7a3f\u6a21\u578b\u7684\u65f6\u95f4\u3002\u5178\u578b\u52a0\u901f\u4e3a2-3\u500d\uff0c\u4e14\u8d28\u91cf\u65e0\u4e0b\u964d\u3002
Medusa\uff08Cai\u7b49\u4eba\uff0c2024\uff09\u91c7\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff1a\u4e0d\u662f\u4f7f\u7528\u5355\u72ec\u7684\u8349\u7a3f\u6a21\u578b\uff0c\u800c\u662f\u5728\u76ee\u6807\u6a21\u578b\u672c\u8eab\u4e2d\u6dfb\u52a0\u591a\u4e2a\u8f7b\u91cf\u7ea7\u7684\u9884\u6d4b\u5934\u3002\u6bcf\u4e2a\u5934\u540c\u65f6\u9884\u6d4b\u4e0d\u540c\u7684\u672a\u6765token\u4f4d\u7f6e\uff08\u63d0\u524d\\(k = 1, 2, 3, \\ldots\\)\u6b65\uff09\u3002\u5728\u6bcf\u4e00\u6b65\uff0cMedusa\u4f7f\u7528\u6811\u72b6\u7ed3\u6784\u63d0\u51fa\u82e5\u5e72\u5019\u9009\u5ef6\u7eed\uff0c\u901a\u8fc7\u76ee\u6807\u6a21\u578b\u6ce8\u610f\u529b\u5c42\u7684\u5355\u4e2a\u524d\u5411\u4f20\u64ad\u9a8c\u8bc1\u54ea\u4e9b\u5019\u9009\u662f\u4e00\u81f4\u7684\u3002\u8fd9\u5b8c\u5168\u907f\u514d\u4e86\u5bf9\u5355\u72ec\u8349\u7a3f\u6a21\u578b\u7684\u9700\u6c42\u3002
\u5e76\u884c\u751f\u6210\u65b9\u6cd5\u66f4\u5e7f\u6cdb\u5730\u65e8\u5728\u6253\u7834\u81ea\u56de\u5f52\u89e3\u7801\u7684\u4e32\u884c\u74f6\u9888\u3002\u96c5\u53ef\u6bd4\u89e3\u7801\u4f7f\u7528\u731c\u6d4b\u521d\u59cb\u5316\u6240\u6709\u4f4d\u7f6e\uff0c\u5e76\u5e76\u884c\u5730\u8fed\u4ee3\u7cbe\u70bc\u76f4\u5230\u6536\u655b\uff0c\u5c06\u751f\u6210\u89c6\u4e3a\u4e00\u4e2a\u4e0d\u52a8\u70b9\u8fed\u4ee3\u3002\u975e\u81ea\u56de\u5f52\u6a21\u578b\uff08NAT\uff09\u5728\u5355\u4e2a\u524d\u5411\u4f20\u64ad\u4e2d\u540c\u65f6\u751f\u6210\u6240\u6709token\uff0c\u4f46\u901a\u5e38\u906d\u53d7\u8d28\u91cf\u4e0b\u964d\u7684\u95ee\u9898\uff0c\u9700\u8981\u50cf\u8fed\u4ee3\u7cbe\u70bc\u3001CTC\u635f\u5931\u6216\u6765\u81ea\u81ea\u56de\u5f52\u6559\u5e08\u7684\u77e5\u8bc6\u84b8\u998f\u8fd9\u6837\u7684\u6280\u672f\u6765\u7f29\u5c0f\u5dee\u8ddd\u3002
\u4e0a\u8ff0\u6280\u672f\u2014\u2014\u5bf9\u9f50\u3001\u957f\u4e0a\u4e0b\u6587\u3001\u68c0\u7d22\u3001\u9ad8\u6548\u89e3\u7801\u3001\u72b6\u6001\u7a7a\u95f4\u6a21\u578b\u2014\u2014\u5728\u73b0\u4ee3\u751f\u4ea7\u7ea7LLM\u4e2d\u7ed3\u5408\u5728\u4e00\u8d77\u3002
\u672c\u6587\u7684\u5176\u4f59\u90e8\u5206\u5ba1\u89c6\u4e86\u524d\u6cbf\u6a21\u578b\u7684\u67b6\u6784\u521b\u65b0\uff0c\u5c55\u793a\u4e86\u6587\u4ef601-04\u4e2d\u7684\u7406\u8bba\u601d\u60f3\u4ee5\u53ca\u4e0a\u8ff0\u65b9\u6cd5\u662f\u5982\u4f55\u5728\u5b9e\u8df5\u4e2d\u7ed3\u5408\u8d77\u6765\u7684\u3002
\u5206\u7ec4\u67e5\u8be2\u6ce8\u610f\u529b\uff08GQA\uff09 \u662f\u91c7\u7528\u6700\u5e7f\u6cdb\u7684\u6ce8\u610f\u529b\u6548\u7387\u6280\u672f\u3002\u6807\u51c6\u591a\u5934\u6ce8\u610f\u529b\uff08MHA\uff09\u4e3a\u6bcf\u4e2a\u5934\u7ef4\u62a4\u72ec\u7acb\u7684\u952e\u548c\u503c\u6295\u5f71\uff0c\u6bcf\u4e2atoken\u9700\u8981\u7f13\u5b58\\(n_{\\text{heads}} \\times d_{\\text{head}}\\)\u4e2a\u503c\u3002GQA\u5c06\u591a\u4e2a\u67e5\u8be2\u5934\u5206\u7ec4\u4ee5\u5171\u4eab\u4e00\u4e2a\u952e-\u503c\u5934\u3002
\u4f7f\u752864\u4e2a\u67e5\u8be2\u5934\u548c8\u4e2aKV\u5934\uff08Llama 3\u3001Qwen\u3001Gemma\u4e2d\u7684\u5e38\u89c1\u914d\u7f6e\uff09\uff0c\u6bcf\u4e2aKV\u5934\u88ab8\u4e2a\u67e5\u8be2\u5934\u5171\u4eab\uff0c\u4e0eMHA\u76f8\u6bd4KV\u7f13\u5b58\u51cf\u5c11\u4e868\u500d\u3002
\u8f93\u51fa\u8d28\u91cf\u51e0\u4e4e\u4e0eMHA\u76f8\u540c\uff0c\u56e0\u4e3a\u67e5\u8be2\u4ecd\u7136\u53ef\u4ee5\u5173\u6ce8\u4e0d\u540c\u7684\u6a21\u5f0f\uff0c\u5b83\u4eec\u53ea\u662f\u5171\u4eab\u76f8\u540c\u7684\u952e-\u503c\u5b50\u7a7a\u95f4\u3002\u591a\u67e5\u8be2\u6ce8\u610f\u529b\uff08MQA\uff09\u662f\u6240\u6709\u67e5\u8be2\u4f7f\u7528\u5355\u4e2aKV\u5934\u7684\u6781\u7aef\u60c5\u51b5\uff0c\u4f46GQA\u63d0\u4f9b\u4e86\u66f4\u597d\u7684\u8d28\u91cf-\u6548\u7387\u6743\u8861\u3002
\u591a\u5934\u6f5c\u5728\u6ce8\u610f\u529b\uff08MLA\uff09\uff0c\u7531DeepSeek-V2\u5f15\u5165\uff0c\u5b9e\u73b0\u4e86\u66f4\u6fc0\u8fdb\u7684KV\u7f13\u5b58\u538b\u7f29\u3002MLA\u4e0d\u662f\u7f13\u5b58\u5b8c\u6574\u7684\u952e-\u503c\u6295\u5f71\uff08\u5373\u4f7f\u4f7f\u7528GQA\uff09\uff0c\u800c\u662f\u5c06\u9690\u85cf\u72b6\u6001\u4e0b\u6295\u5f71\u4e3a\u4e00\u4e2a\u4f4e\u79e9\u7684\u6f5c\u5728\u5411\u91cf\\(c_t \\in \\mathbb{R}^{d_c}\\)\uff0c\u5176\u4e2d\\(d_c \\ll n_{\\text{heads}} \\times d_{\\text{head}}\\)\uff1a
\u4ec5\u7f13\u5b58\u8fd9\u4e2a\u538b\u7f29\u5411\u91cf\u3002\u5728\u6ce8\u610f\u529b\u8ba1\u7b97\u65f6\uff0c\u901a\u8fc7\u4e0a\u6295\u5f71\u91cd\u5efa\u5b8c\u6574\u7684\u952e\u548c\u503c\u8868\u793a\uff1a\\(k_t = W_{\\text{up}}^K c_t\\)\uff0c\\(v_t = W_{\\text{up}}^V c_t\\)\u3002\u5728DeepSeek-V3\u4e2d\uff08671B\u603b\u53c2\u6570\uff0c37B\u6fc0\u6d3b\u53c2\u6570\uff09\uff0c\u538b\u7f29\u7ef4\u5ea6\u4e3a\\(d_c = 512\\)\uff0c\u800c\u5b8c\u6574MHA\u9700\u8981\\(128 \\times 128 = 16{,}384\\)\uff0cKV\u7f13\u5b58\u51cf\u5c11\u4e8693%\u3002
\u4e00\u4e2a\u5fae\u5999\u7684\u70b9\uff1a\u6807\u51c6RoPE\u4f9d\u8d56\u4e8e\u4f4d\u7f6e\uff0c\u4e0e\u5171\u4eab\u538b\u7f29\u4e0d\u517c\u5bb9\uff0c\u56e0\u6b64MLA\u4f7f\u7528\u89e3\u8026\u7684RoPE\uff1a\u67e5\u8be2\u548c\u952e\u7684\u4e00\u4e2a\u5c0f\u7684\u72ec\u7acb\u6d41\uff08\u6bcf\u593464\u7ef4\uff09\u901a\u8fc7RoPE\u643a\u5e26\u4f4d\u7f6e\u4fe1\u606f\uff0c\u800c\u8868\u793a\u7684\u4e3b\u8981\u90e8\u5206\u901a\u8fc7\u538b\u7f29\u7684\u6f5c\u5728\u8def\u5f84\u6d41\u52a8\u3002
\u5927\u89c4\u6a21\u4f4d\u7f6e\u7f16\u7801\u5df2\u7ecf\u4ece\u539f\u59cb\u7684\u6b63\u5f26\u65b9\u6848\u663e\u8457\u5206\u5316\u3002\u6240\u6709\u524d\u6cbf\u6a21\u578b\u90fd\u4f7f\u7528RoPE\uff08\u6587\u4ef604\uff09\uff0c\u4f46\u9488\u5bf9\u957f\u4e0a\u4e0b\u6587\u6709\u5173\u952e\u4fee\u6539\u3002\u539f\u59cbRoPE\u516c\u5f0f\\(\\theta_i = \\theta_{\\text{base}}^{-2i/d}\\)\u4e2d\u7684\u57fa\u9891\\(\\theta_{\\text{base}}\\)\u901a\u5e38\u4e3a10,000\uff0c\u8fd9\u9650\u5236\u4e86\u8d85\u51fa\u8bad\u7ec3\u957f\u5ea6\u7684\u5916\u63a8\u80fd\u529b\u3002
\u8c03\u6574\u57fa\u9891\uff08ABF\uff09\u53ea\u662f\u5c06\\(\\theta_{\\text{base}}\\)\u589e\u52a0\u5230500,000\uff08Llama 3\uff09\u62161,000,000\uff08Qwen3\u3001Gemma 3\uff09\uff0c\u62c9\u4f38\u65cb\u8f6c\u5468\u671f\uff0c\u4f7f\u5f97\u6a21\u578b\u5728\u8bad\u7ec3\u671f\u95f4\u9047\u5230\u66f4\u5c11\u7684\u5b8c\u6574\u65cb\u8f6c\uff0c\u4ece\u800c\u80fd\u591f\u5916\u63a8\u5f97\u66f4\u8fdc\u3002
YaRN\uff08Yet another RoPE extensioN\uff0c\u53c8\u4e00\u79cdRoPE\u6269\u5c55\uff09\u5e94\u7528\u4f9d\u8d56\u4e8e\u9891\u7387\u7684\u63d2\u503c\uff1a\u4f4e\u9891\u7ef4\u5ea6\u88ab\u63d2\u503c\uff08\u7f29\u5c0f\u6bd4\u4f8b\uff09\uff0c\u9ad8\u9891\u7ef4\u5ea6\u88ab\u5916\u63a8\uff0c\u540c\u65f6\u6e29\u5ea6\u56e0\u5b50\u8c03\u6574\u6ce8\u610f\u529b\u5206\u5e03\u3002DeepSeek-V3\u3001Qwen\u548cKimi K2\u90fd\u4f7f\u7528\u57fa\u4e8eYaRN\u7684\u6269\u5c55\uff0c\u4ece\u9884\u8bad\u7ec3\u65f6\u76844K-8K\u4e0a\u4e0b\u6587\u8fbe\u5230128K\u4e0a\u4e0b\u6587\u3002
iRoPE\uff08\u4ea4\u9519RoPE\uff09\uff0c\u7531Llama 4\u5f15\u5165\uff0c\u91c7\u53d6\u4e86\u66f4\u6fc0\u8fdb\u7684\u65b9\u6cd5\uff1a\u6bcf4\u4e2a\u6ce8\u610f\u529b\u5c42\u4e2d\u6709\u4e00\u4e2a\u5b8c\u5168\u4e0d\u4f7f\u7528\u4f4d\u7f6e\u7f16\u7801\uff08NoPE\uff09\uff0c\u800c\u5176\u4ed6\u5c42\u4f7f\u7528\u6807\u51c6RoPE\u914d\u5408\u5206\u5757\u6ce8\u610f\u529b\u3002
NoPE\u5c42\u53ef\u4ee5\u5728\u6ca1\u6709\u4efb\u4f55\u4f4d\u7f6e\u504f\u5dee\u7684\u60c5\u51b5\u4e0b\u5173\u6ce8\u6240\u6709\u4f4d\u7f6e\uff0c\u800cRoPE\u5c42\u63d0\u4f9b\u5c40\u90e8\u6392\u5e8f\u3002\u7ed3\u5408\u63a8\u7406\u65f6\u7684\u6e29\u5ea6\u7f29\u653e\uff0c\u8fd9\u4f7f\u5f97Llama 4 Scout\u76841000\u4e07token\u4e0a\u4e0b\u6587\u7a97\u53e3\u6210\u4e3a\u53ef\u80fd\u2014\u2014\u6bd4\u4efb\u4f55\u7eafRoPE\u65b9\u6cd5\u90fd\u9ad8\u51fa\u51e0\u4e2a\u6570\u91cf\u7ea7\u3002
\u5927\u89c4\u6a21\u6df7\u5408\u4e13\u5bb6\u5df2\u6210\u4e3a\u524d\u6cbf\u6a21\u578b\u7684\u4e3b\u5bfc\u67b6\u6784\uff08\u6587\u4ef604\u4ecb\u7ecd\u4e86MoE\u57fa\u7840\uff09\u3002\u5173\u952e\u7684\u8bbe\u8ba1\u9009\u62e9\u662f\u4e13\u5bb6\u6570\u91cf\u3001\u8def\u7531\u7a00\u758f\u6027\u548c\u8d1f\u8f7d\u5747\u8861\u3002
\u8def\u7531\u7a00\u758f\u6027\u5dee\u5f02\u663e\u8457\uff1aDeepSeek-V3\u4f7f\u7528256\u4e2a\u4e13\u5bb6\uff0ctop-8\u8def\u7531\uff0832\u500d\u7a00\u758f\uff09\uff1bQwen3\u4f7f\u7528128\u4e2a\u4e13\u5bb6\uff0ctop-8\u8def\u7531\uff0816\u500d\u7a00\u758f\uff09\uff1bMixtral\u4f7f\u75288\u4e2a\u4e13\u5bb6\uff0ctop-2\u8def\u7531\uff084\u500d\u7a00\u758f\uff09\uff1bLlama 4 Maverick\u4f7f\u7528128\u4e2a\u4e13\u5bb6\uff0ctop-1\u52a0\u4e00\u4e2a\u5171\u4eab\u4e13\u5bb6\uff08128\u500d\u7a00\u758f\uff09\u3002
\u66f4\u9ad8\u7684\u7a00\u758f\u6027\u610f\u5473\u7740\u5728\u76f8\u540c\u6fc0\u6d3b\u8ba1\u7b97\u91cf\u4e0b\u62e5\u6709\u66f4\u591a\u603b\u53c2\u6570\uff0c\u4f46\u9700\u8981\u66f4\u4ed4\u7ec6\u7684\u8d1f\u8f7d\u5747\u8861\u548c\u901a\u4fe1\u57fa\u7840\u8bbe\u65bd\u3002
\u65e0\u8f85\u52a9\u635f\u5931\u7684\u8d1f\u8f7d\u5747\u8861\uff08DeepSeek-V3\uff09\u53d6\u4ee3\u4e86\u4f20\u7edf\u7684\u8d1f\u8f7d\u5747\u8861\u635f\u5931\uff08\u6587\u4ef604\uff09\uff0c\u540e\u8005\u88ab\u53d1\u73b0\u4f1a\u964d\u4f4e\u6a21\u578b\u8d28\u91cf\u3002\u6bcf\u4e2a\u4e13\u5bb6\u7ef4\u62a4\u4e00\u4e2a\u52a8\u6001\u504f\u7f6e\u9879\uff0c\u5728\u6bcf\u4e2a\u8bad\u7ec3\u6b65\u9aa4\u8fdb\u884c\u8c03\u6574\uff1a\u8fc7\u8f7d\u7684\u4e13\u5bb6\u5176\u504f\u7f6e\u964d\u4f4e\uff08\u63a5\u6536\u66f4\u5c11\u7684token\uff09\uff0c\u6b20\u8f7d\u7684\u4e13\u5bb6\u5176\u504f\u7f6e\u589e\u52a0\u3002\u8fd9\u5b9e\u73b0\u4e86\u5747\u8861\u7684\u8def\u7531\uff0c\u6ca1\u6709\u4efb\u4f55\u8f85\u52a9\u635f\u5931\u6c61\u67d3\u4e3b\u8981\u8bad\u7ec3\u4fe1\u53f7\u3002
\u5171\u4eab\u4e13\u5bb6\u51fa\u73b0\u5728\u5927\u591a\u6570MoE\u8bbe\u8ba1\u4e2d\uff1a\u4e00\u4e2a\u6216\u591a\u4e2a\u4e13\u5bb6FFN\u5904\u7406\u6bcf\u4e2atoken\uff0c\u65e0\u8bba\u8def\u7531\u7ed3\u679c\u5982\u4f55\u3002\u8fd9\u4e9b\u5904\u7406\u6240\u6709token\u90fd\u9700\u8981\u7684\u5e38\u89c1\u6a21\u5f0f\uff08\u57fa\u672c\u8bed\u6cd5\u3001\u529f\u80fd\u8bcd\uff09\uff0c\u4f7f\u5f97\u8def\u7531\u4e13\u5bb6\u53ef\u4ee5\u4e13\u6ce8\u4e8e specialization\u3002Llama 4\u4f7f\u75281\u4e2a\u5171\u4eab\u4e13\u5bb6\u52a0\u6bcf\u4e2atoken 1\u4e2a\u8def\u7531\u4e13\u5bb6\uff08\u975e\u5e38\u7a00\u758f\uff09\uff1bDeepSeek-V3\u4f7f\u75281\u4e2a\u5171\u4eab\u52a08\u4e2a\u8def\u7531\u3002
\u4ea4\u66ff\u7a20\u5bc6\u5c42\u548cMoE\u5c42\u63d0\u4f9b\u4e86\u53e6\u4e00\u4e2a\u8bbe\u8ba1\u7ef4\u5ea6\u3002Gemma 2\u548c3\u4ea4\u66ff\u4f7f\u7528\u5c40\u90e8/\u5168\u5c40\u6ce8\u610f\u529b\u5c42\uff08Gemma 3\u4e2d\u6bd4\u4f8b\u4e3a5:1\uff0c\u5176\u4e2d\u5c40\u90e8\u5c42\u4f7f\u75281024 token\u7684\u6ed1\u52a8\u7a97\u53e3\uff0c\u53ea\u6709\u5168\u5c40\u5c42\u7f13\u5b58\u5b8c\u6574\u7684128K\u4e0a\u4e0b\u6587\uff09\u3002
Llama 4 Maverick\u4ea4\u9519\u4f7f\u7528\u7a20\u5bc6FFN\u5c42\u548cMoE\u5c42\u3002Kimi K2\u4f7f\u7528\u6df7\u5408\u7a00\u758f\u5c42\uff08\u4e00\u4e2a\u7a20\u5bc6\u5c42\u7a7f\u63d2\u5728\u4e13\u5bb6\u5c42\u4e4b\u95f4\uff09\u3002\u8fd9\u79cd\u5f02\u6784\u8bbe\u8ba1\u5141\u8bb8\u4e0d\u540c\u5c42\u670d\u52a1\u4e8e\u4e0d\u540c\u7684\u529f\u80fd\u3002
\u591atoken\u9884\u6d4b\uff08MTP\uff09\uff0c\u7528\u4e8eDeepSeek-V3\uff0c\u8bad\u7ec3\u6a21\u578b\u4e0d\u4ec5\u9884\u6d4b\u4e0b\u4e00\u4e2atoken\uff0c\u8fd8\u9884\u6d4b\u540e\u9762\u7684token\u3002\u5728\u6bcf\u4e2a\u4f4d\u7f6e\uff0c\u4e00\u4e2a\u6b21\u7ea7\u9884\u6d4b\u6a21\u5757\uff08\u5171\u4eab\u4e3b\u6a21\u578b\u7684\u5d4c\u5165\uff09\u9884\u6d4b\u4e00\u4e2a\u989d\u5916\u7684\u672a\u6765token\u3002MTP\u635f\u5931\u7684\u6743\u91cd\u662f\u4e3b\u4e0b\u4e00\u4e2atoken\u635f\u5931\u76840.1-0.3\u500d\u3002\u9664\u4e86\u5728\u8bad\u7ec3\u671f\u95f4\u6539\u5584\u8868\u793a\u8d28\u91cf\u5916\uff0cMTP\u5934\u8fd8\u53ef\u4ee5\u5728\u63a8\u7406\u65f6\u4f5c\u4e3a\u63a8\u6d4b\u6027\u89e3\u7801\u7684\u8349\u7a3f\u5934\uff0c\u63d0\u4f9b\u514d\u8d39\u7684\u52a0\u901f\u3002
\u77e5\u8bc6\u84b8\u998f\u662f\u4e00\u79cd\u8bad\u7ec3\u7b56\u7565\uff0c\u5176\u4e2d\u5927\u578b\"\u6559\u5e08\"\u6a21\u578b\u7684\u8f93\u51fa\u6307\u5bfc\u8f83\u5c0f\"\u5b66\u751f\"\u6a21\u578b\u7684\u8bad\u7ec3\u3002Gemma 2\u548c3\u5e7f\u6cdb\u4f7f\u7528\u84b8\u998f\uff1a\u8f83\u5c0f\u7684\u6a21\u578b\uff082B\u30014B\uff09\u5728\u8ba1\u7b97\u6700\u4f18\u6570\u636e\u91cf\u768450\u500d\u4e0a\u8bad\u7ec3\uff0c\u4f7f\u7528\u6559\u5e08\u7684\u6982\u7387\u5206\u5e03\u4f5c\u4e3a\u8f6f\u76ee\u6807\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48Gemma 3-4B\u5728\u8d28\u91cf\u4e0a\u5339\u914dGemma 2-27B\u3002
\u84b8\u998f\u635f\u5931\u66ff\u4ee3\u6216\u8865\u5145\u4e86\u6807\u51c6\u4ea4\u53c9\u71b5\uff1a\u5b66\u751f\u6700\u5c0f\u5316\u5176\u8f93\u51fa\u5206\u5e03\u4e0e\u6559\u5e08\u5206\u5e03\u4e4b\u95f4\u7684KL\u6563\u5ea6\uff1a
DeepSeek-R1\u5c06\u5176671B\u63a8\u7406\u6a21\u578b\u84b8\u998f\u5230\u5c0f\u81f31.5B\u7684\u7a20\u5bc6\u6a21\u578b\u4e2d\uff0c\u4f7f\u7528\u4e8680\u4e07\u6761\u7cbe\u9009\u7684\u601d\u7ef4\u94fe\u6837\u672c\uff0c\u4ea7\u751f\u4e86\u63a8\u7406\u80fd\u529b\u5f02\u5e38\u5f3a\u7684\u5c0f\u6a21\u578b\u3002
\u57fa\u4e8e\u5f3a\u5316\u5b66\u4e60\u7684\u63a8\u7406\u4ee3\u8868\u4e86LLM\u80fd\u529b\u4e2d\u6700\u663e\u8457\u7684\u6700\u65b0\u8fdb\u5c55\u3002DeepSeek-R1\u8bc1\u660e\uff0c\u5728\u57fa\u7840\u6a21\u578b\u4e0a\u8fdb\u884c\u7eaf\u5f3a\u5316\u5b66\u4e60\uff08\u65e0\u9700\u76d1\u7763\u5fae\u8c03\uff09\u53ef\u4ee5\u5f15\u51fa\u601d\u7ef4\u94fe\u63a8\u7406\u3001\u81ea\u6211\u9a8c\u8bc1\u548c\u7ea0\u9519\u884c\u4e3a\u2014\u2014\u5f53\u6a21\u578b\u56e0\u7ed9\u51fa\u6b63\u786e\u7684\u6700\u7ec8\u7b54\u6848\u800c\u83b7\u5f97\u5956\u52b1\u65f6\uff0c\u8fd9\u4e9b\u884c\u4e3a\u4f1a\u81ea\u53d1\u6d8c\u73b0\u3002
DeepSeek-R1\u4f7f\u7528GRPO\uff08\u7ec4\u76f8\u5bf9\u7b56\u7565\u4f18\u5316\uff09\uff0c\u5b83\u6d88\u9664\u4e86PPO\u6240\u9700\u7684\u4ef7\u503c\u7f51\u7edc\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u63d0\u793a\uff0cGRPO\u91c7\u6837\u4e00\u7ec4\\(G\\)\u4e2a\u8f93\u51fa\uff0c\u8ba1\u7b97\u5b83\u4eec\u7684\u5956\u52b1\uff0c\u5e76\u5728\u7ec4\u5185\u5f52\u4e00\u5316\u4f18\u52bf\u503c\uff1a
\u7136\u540e\u7b56\u7565\u68af\u5ea6\u4f7f\u7528\u8fd9\u4e9b\u7ec4\u76f8\u5bf9\u4f18\u52bf\u503c\uff0c\u914d\u5408\u4e00\u4e2a\u88c1\u526a\u76ee\u6807\uff08\u7c7b\u4f3c\u4e8ePPO\u7684\u88c1\u526a\uff09\u3002
\u6d88\u9664\u8bc4\u8bba\u5bb6\u7f51\u7edc\u5c06RL\u8bad\u7ec3\u7684\u5185\u5b58\u548c\u8ba1\u7b97\u9700\u6c42\u51cf\u534a\uff0c\u4f7f\u5f97\u5728671B\u53c2\u6570\u6a21\u578b\u4e0a\u8fdb\u884cRL\u8bad\u7ec3\u53d8\u5f97\u53ef\u884c\u3002
\u4e00\u4e2a\u5173\u952e\u7684\u8bbe\u8ba1\u9009\u62e9\uff1aDeepSeek-R1\u4f7f\u7528\u57fa\u4e8e\u89c4\u5219\u7684\u5956\u52b1\uff08\u5bf9\u7167\u6807\u51c6\u7b54\u6848\u68c0\u67e5\u6570\u5b66\u7b54\u6848\u3001\u8fd0\u884c\u4ee3\u7801\u6d4b\u8bd5\u7528\u4f8b\uff09\u800c\u4e0d\u662f\u795e\u7ecf\u5956\u52b1\u6a21\u578b\uff0c\u56e0\u4e3a\u795e\u7ecf\u5956\u52b1\u6a21\u578b\u5728\u6b64\u89c4\u6a21\u4e0b\u88ab\u53d1\u73b0\u5bb9\u6613\u53d7\u5230\u5956\u52b1\u7834\u89e3\u7684\u5f71\u54cd\u3002
Qwen3\u7684\u6df7\u5408\u601d\u8003\u6a21\u5f0f\u5c06\u63a8\u7406\uff08\u4f7f\u7528<think>\u6807\u7b7e\u8fdb\u884c\u9010\u6b65\u601d\u7ef4\u94fe\uff09\u548c\u5feb\u901f\u76f4\u63a5\u56de\u590d\u6574\u5408\u5230\u4e00\u4e2a\u6a21\u578b\u4e2d\uff0c\u5141\u8bb8\u7528\u6237\u63a7\u5236\u4e00\u4e2a\"\u601d\u8003\u9884\u7b97\"\uff0c\u5728\u5ef6\u8fdf\u548c\u63a8\u7406\u6df1\u5ea6\u4e4b\u95f4\u8fdb\u884c\u6743\u8861\u3002
\u8fd9\u662f\u901a\u8fc7\u5728\u601d\u8003\u548c\u601d\u8003\u6570\u636e\u4e0a\u8bad\u7ec3\u5b9e\u73b0\u7684\uff0c\u800c\u4e0d\u662f\u901a\u8fc7\u5355\u72ec\u7684\u6a21\u578b\u68c0\u67e5\u70b9\u3002
\u5927\u89c4\u6a21\u8bad\u7ec3\u7a33\u5b9a\u5316\u9700\u8981\u8d85\u8d8a\u6807\u51c6\u5b9e\u8df5\u7684\u65b0\u6280\u672f\u3002Logits\u8f6f\u88c1\u526a\uff08Gemma 2\uff09\u5c06\u6ce8\u610f\u529b\u5206\u6570\u901a\u8fc7\\(s \\cdot \\tanh(\\text{logits} / s)\\)\u5904\u7406\uff0c\u8f6f\u88c1\u526a\u503c\\(s\\)\uff08\u901a\u5e38\u4e3a30-50\uff09\uff0c\u4ee5\u9632\u6b62\u65e0\u754c\u589e\u957f\u3002
QK\u5f52\u4e00\u5316\uff08Qwen3\uff09\u5728\u8ba1\u7b97\u6ce8\u610f\u529b\u5206\u6570\u4e4b\u524d\u5bf9\u67e5\u8be2\u548c\u952e\u5411\u91cf\u5e94\u7528RMSNorm\uff0c\u53d6\u4ee3\u4e86\u5bf9QKV\u504f\u7f6e\u7684\u9700\u6c42\u3002QK\u88c1\u526a\uff08Kimi K2\u7684MuonClip\u4f18\u5316\u5668\uff09\u5728\u8bad\u7ec3\u671f\u95f4\u76d1\u63a7\u6700\u5927\u6ce8\u610f\u529blogits\uff0c\u5f53\u67e5\u8be2-\u952e\u6743\u91cd\u77e9\u9635\u8d85\u8fc7\u9608\u503c\u65f6\u5bf9\u5176\u8fdb\u884c\u91cd\u65b0\u7f29\u653e\uff0c\u4f7f\u5f971T\u53c2\u6570\u6a21\u578b\u7684\u9884\u8bad\u7ec3\u80fd\u591f\u7a33\u5b9a\u8fdb\u884c\uff0c\u4e14\u6ca1\u6709\u4e0d\u7a33\u5b9a\u4e8b\u4ef6\u3002
FP8\u6df7\u5408\u7cbe\u5ea6\u8bad\u7ec3\uff08DeepSeek-V3\uff09\u5728\u524d\u5411\u548c\u53cd\u5411\u4f20\u64ad\u4e2d\u4f7f\u75288\u4f4d\u6d6e\u70b9\u6570\u8fdb\u884c\u8ba1\u7b97\u5bc6\u96c6\u7684\u77e9\u9635\u4e58\u6cd5\uff0c\u540c\u65f6\u5c06\u4e3b\u6743\u91cd\u4fdd\u6301\u5728\u66f4\u9ad8\u7cbe\u5ea6\u3002
\u4e0eBF16/FP16\u8bad\u7ec3\u76f8\u6bd4\uff0c\u8fd9\u5927\u81f4\u5c06\u541e\u5410\u91cf\u63d0\u5347\u4e86\u4e00\u500d\uff0c\u4e14\u8d28\u91cf\u635f\u5931\u53ef\u5ffd\u7565\u4e0d\u8ba1\u3002DeepSeek-V3\u4f7f\u7528\u4ec5280\u4e07H800 GPU\u5c0f\u65f6\u8bad\u7ec3\u4e86\u5176671B\u53c2\u6570\u6a21\u578b\u2014\u2014\u53ea\u662f\u540c\u7c7b\u6a21\u578b\u7684\u4e00\u5c0f\u90e8\u5206\u2014\u2014\u8fd9\u4e3b\u8981\u5f52\u529f\u4e8e\u8fd9\u4e00\u4f18\u5316\u548c\u5176\u4ed6\u5de5\u7a0b\u4f18\u5316\u3002
FP8\u6df7\u5408\u7cbe\u5ea6\u8bad\u7ec3\uff08DeepSeek-V3\uff09\u5728\u524d\u5411\u548c\u53cd\u5411\u4f20\u64ad\u4e2d\u4f7f\u75288\u4f4d\u6d6e\u70b9\u6570\u8fdb\u884c\u8ba1\u7b97\u5bc6\u96c6\u7684\u77e9\u9635\u4e58\u6cd5\uff0c\u540c\u65f6\u5c06\u4e3b\u6743\u91cd\u4fdd\u6301\u5728\u66f4\u9ad8\u7cbe\u5ea6\u3002
\u4e0eBF16/FP16\u8bad\u7ec3\u76f8\u6bd4\uff0c\u8fd9\u5927\u81f4\u5c06\u541e\u5410\u91cf\u63d0\u5347\u4e86\u4e00\u500d\uff0c\u4e14\u8d28\u91cf\u635f\u5931\u53ef\u5ffd\u7565\u4e0d\u8ba1\u3002DeepSeek-V3\u4f7f\u7528\u4ec5280\u4e07H800 GPU\u5c0f\u65f6\u8bad\u7ec3\u4e86\u5176671B\u53c2\u6570\u6a21\u578b\u2014\u2014\u53ea\u662f\u540c\u7c7b\u6a21\u578b\u7684\u4e00\u5c0f\u90e8\u5206\u2014\u2014\u8fd9\u4e3b\u8981\u5f52\u529f\u4e8e\u8fd9\u4e00\u4f18\u5316\u548c\u5176\u4ed6\u5de5\u7a0b\u4f18\u5316\u3002
\u4ece\u5934\u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684\u68c0\u7d22\u589e\u5f3a\u751f\u6210\u7ba1\u7ebf\u3002\u4f7f\u7528TF-IDF\uff08\u6587\u4ef602\uff09\u7d22\u5f15\u4e00\u7ec4\u6587\u6863\uff0c\u4e3a\u67e5\u8be2\u68c0\u7d22\u6700\u76f8\u5173\u7684\u6bb5\u843d\uff0c\u5e76\u5c06\u5176\u524d\u7f6e\u5230\u63d0\u793a\u4e2d\u3002
import jax.numpy as jnp\nimport math\nfrom collections import Counter\n\n# \u77e5\u8bc6\u5e93\uff1a\u4e00\u7ec4\u7b80\u77ed\u6bb5\u843d\nknowledge_base = [\n \"The Eiffel Tower is a wrought-iron lattice tower in Paris, France. It was constructed from 1887 to 1889 as the centerpiece of the 1889 World's Fair.\",\n \"The Great Wall of China is a series of fortifications built along the northern borders of China. Construction began in the 7th century BC.\",\n \"Photosynthesis is the process by which plants convert sunlight, water, and carbon dioxide into glucose and oxygen using chlorophyll.\",\n \"The theory of general relativity, published by Albert Einstein in 1915, describes gravity as the curvature of spacetime caused by mass and energy.\",\n \"Python is a high-level programming language known for its simple syntax and readability. It was created by Guido van Rossum and released in 1991.\",\n \"The mitochondria are organelles found in eukaryotic cells. They generate most of the cell's supply of ATP, used as a source of chemical energy.\",\n]\n\n# \u6784\u5efa TF-IDF \u7d22\u5f15\uff08\u91cd\u7528\u4e86\u6587\u4ef602\u4e2d\u7684\u6982\u5ff5\uff09\ndef tokenise(text):\n return text.lower().split()\n\nvocab = sorted(set(w for doc in knowledge_base for w in tokenise(doc)))\nword2idx = {w: i for i, w in enumerate(vocab)}\nV = len(vocab)\nN = len(knowledge_base)\n\n# \u6587\u6863\u9891\u7387\ndoc_freq = Counter()\nfor doc in knowledge_base:\n for w in set(tokenise(doc)):\n doc_freq[w] += 1\n\ndef tfidf_vector(text):\n words = tokenise(text)\n counts = Counter(words)\n vec = jnp.zeros(V)\n for w, c in counts.items():\n if w in word2idx:\n tf = 1 + math.log(c)\n idf = math.log(N / (doc_freq.get(w, 0) + 1))\n vec = vec.at[word2idx[w]].set(tf * idf)\n return vec\n\n# \u7d22\u5f15\u6240\u6709\u6587\u6863\ndoc_vectors = jnp.stack([tfidf_vector(doc) for doc in knowledge_base])\n\ndef cosine_sim(a, b):\n return jnp.dot(a, b) / (jnp.linalg.norm(a) * jnp.linalg.norm(b) + 1e-8)\n\ndef retrieve(query, top_k=2):\n \"\"\"\u4e3a\u67e5\u8be2\u68c0\u7d22top-k\u4e2a\u6700\u76f8\u5173\u7684\u6bb5\u843d\u3002\"\"\"\n q_vec = tfidf_vector(query)\n sims = jnp.array([cosine_sim(q_vec, doc_vectors[i]) for i in range(N)])\n top_indices = jnp.argsort(-sims)[:top_k]\n return [(int(i), float(sims[i]), knowledge_base[int(i)]) for i in top_indices]\n\n# \u6d4b\u8bd5\u68c0\u7d22\nqueries = [\n \"Who built the Eiffel Tower?\",\n \"How do plants make food?\",\n \"What did Einstein discover?\",\n]\n\nfor query in queries:\n results = retrieve(query, top_k=1)\n print(f\"\\nQuery: '{query}'\")\n for idx, sim, passage in results:\n print(f\" Retrieved (sim={sim:.3f}): '{passage[:80]}...'\")\n\n # RAG\u98ce\u683c\u7684\u63d0\u793a\u6784\u5efa\n context = results[0][2]\n rag_prompt = f\"Context: {context}\\n\\nQuestion: {query}\\nAnswer:\"\n print(f\" RAG prompt:\\n {rag_prompt[:120]}...\")\n \u4f7f\u7528\u73a9\u5177\u8349\u7a3f\u6a21\u578b\u548c\u76ee\u6807\u6a21\u578b\u5b9e\u73b0\u63a8\u6d4b\u6027\u89e3\u7801\u3002\u5c55\u793a\u63a5\u53d7\u7684\u8f93\u51fa\u4e0e\u76ee\u6807\u6a21\u578b\u7684\u5206\u5e03\u4e00\u81f4\u3002
import jax\nimport jax.numpy as jnp\n\n# \u6a21\u62df\u8349\u7a3f\u6a21\u578b\uff08\u5feb\u901f\uff0c\u4e0d\u592a\u51c6\u786e\uff09\u548c\u76ee\u6807\u6a21\u578b\uff08\u6162\u901f\uff0c\u51c6\u786e\uff09\nvocab_size = 8\nseq_len = 5\n\nkey = jax.random.PRNGKey(42)\n\n# \u76ee\u6807\u6a21\u578b\uff1a\u7ed9\u5b9a\u5e8f\u5217\u8fd4\u56delogits\ndef target_model(seq, key):\n \"\"\"\u6a21\u62df\u7684\u76ee\u6807\u6a21\u578b\uff1a\u4ea7\u751ftoken logits\uff08\u6602\u8d35\u7684\uff09\u3002\"\"\"\n # \u5b9e\u8df5\u4e2d\u8fd9\u5c06\u662f\u4e00\u4e2a\u5927\u578bTransformer\u524d\u5411\u4f20\u64ad\n k1, k2 = jax.random.split(key)\n logits = jax.random.normal(k1, (len(seq), vocab_size)) * 2\n # \u4f7f\u5176\u6709\u4e9b\u53ef\u9884\u6d4b\u6027\uff1a\u504f\u5411\u4e8e token (seq[-1] + 1) % vocab_size\n for i in range(len(seq)):\n logits = logits.at[i, (seq[i] + 1) % vocab_size].add(3.0)\n return logits\n\ndef draft_model(seq, key):\n \"\"\"\u6a21\u62df\u7684\u8349\u7a3f\u6a21\u578b\uff1a\u7c7b\u4f3c\u4f46\u566a\u58f0\u66f4\u5927\uff08\u4fbf\u5b9c\u7684\uff09\u3002\"\"\"\n k1, k2 = jax.random.split(key)\n logits = jax.random.normal(k1, (len(seq), vocab_size))\n for i in range(len(seq)):\n logits = logits.at[i, (seq[i] + 1) % vocab_size].add(2.0)\n return logits\n\ndef sample_token(logits, key):\n return jax.random.categorical(key, logits)\n\ndef speculative_decode(prefix, draft_steps=3, key=jax.random.PRNGKey(0)):\n \"\"\"\u63a8\u6d4b\u6027\u89e3\u7801\uff1a\u8349\u7a3f\u63d0\u51fa\uff0c\u76ee\u6807\u9a8c\u8bc1\u3002\"\"\"\n seq = list(prefix)\n total_accepted = 0\n total_proposed = 0\n\n for _ in range(4): # \u751f\u62104\u8f6e\n key, *subkeys = jax.random.split(key, draft_steps + 3)\n\n # \u8349\u7a3f\u6a21\u578b\u63d0\u51fadraft_steps\u4e2atoken\n draft_tokens = []\n draft_probs = []\n draft_seq = list(seq)\n for i in range(draft_steps):\n d_logits = draft_model(jnp.array(draft_seq), subkeys[i])\n d_probs = jax.nn.softmax(d_logits[-1])\n tok = sample_token(d_logits[-1], subkeys[i])\n draft_tokens.append(int(tok))\n draft_probs.append(d_probs)\n draft_seq.append(int(tok))\n\n # \u76ee\u6807\u6a21\u578b\u5728\u4e00\u6b21\u524d\u5411\u4e2d\u8bc4\u4f30\u6240\u6709\u8349\u7a3ftoken\n target_logits = target_model(jnp.array(draft_seq), subkeys[draft_steps])\n target_start = len(seq) - 1 # \u6700\u540e\u4e00\u4e2a\u524d\u7f00token\u7684\u4f4d\u7f6e\n\n # \u63a5\u53d7/\u62d2\u7edd\u6bcf\u4e2a\u8349\u7a3ftoken\n accepted = 0\n for i in range(draft_steps):\n t_probs = jax.nn.softmax(target_logits[target_start + i])\n d_prob = draft_probs[i][draft_tokens[i]]\n t_prob = t_probs[draft_tokens[i]]\n\n # \u4ee5\u6982\u7387 min(1, target_prob / draft_prob) \u63a5\u53d7\n accept_prob = jnp.minimum(1.0, t_prob / (d_prob + 1e-10))\n key, accept_key = jax.random.split(key)\n if jax.random.uniform(accept_key) < accept_prob:\n seq.append(draft_tokens[i])\n accepted += 1\n else:\n # \u62d2\u7edd\uff1a\u4ece\u8c03\u6574\u540e\u7684\u5206\u5e03\u4e2d\u91c7\u6837\n key, resample_key = jax.random.split(key)\n adjusted = jnp.maximum(0, t_probs - draft_probs[i])\n adjusted = adjusted / (adjusted.sum() + 1e-10)\n new_tok = jax.random.categorical(resample_key, jnp.log(adjusted + 1e-10))\n seq.append(int(new_tok))\n break\n\n total_accepted += accepted\n total_proposed += draft_steps\n\n return seq, total_accepted, total_proposed\n\n# \u8fd0\u884c\u63a8\u6d4b\u6027\u89e3\u7801\nprefix = [0, 1]\nresult_seq, accepted, proposed = speculative_decode(prefix)\nacceptance_rate = accepted / proposed if proposed > 0 else 0\n\nprint(f\"Prefix: {prefix}\")\nprint(f\"Generated sequence: {result_seq}\")\nprint(f\"Draft proposals: {proposed}\")\nprint(f\"Accepted: {accepted}\")\nprint(f\"Acceptance rate: {acceptance_rate:.1%}\")\nprint(f\"Speedup potential: {(accepted + proposed) / proposed:.2f}x\")\n \u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684DPO\u8bad\u7ec3\u5faa\u73af\u3002\u7ed9\u5b9a\u504f\u597d\u548c\u4e0d\u504f\u597d\u7684\u5b8c\u6210\u5e8f\u5217\u5bf9\uff0c\u4f7f\u7528DPO\u635f\u5931\u66f4\u65b0\u4e00\u4e2a\u5c0f\u6a21\u578b\u3002
import jax\nimport jax.numpy as jnp\n\n# \u5fae\u578b\u8bed\u8a00\u6a21\u578b\uff1a\u4eceone-hot\u5230logits\u7684\u7ebf\u6027\u6295\u5f71\nvocab_size = 10\nseq_len = 4\n\nkey = jax.random.PRNGKey(42)\nk1, k2 = jax.random.split(key)\n\n# \u5f53\u524d\u7b56\u7565\u53c2\u6570\uff08\u53ef\u8bad\u7ec3\u7684\uff09\ntheta = jax.random.normal(k1, (vocab_size, vocab_size)) * 0.1\n# \u53c2\u8003\u7b56\u7565\u53c2\u6570\uff08theta\u7684\u51bb\u7ed3\u526f\u672c\uff09\ntheta_ref = theta.copy()\n\ndef log_prob_sequence(params, sequence):\n \"\"\"\u8ba1\u7b97\u7b80\u5355\u81ea\u56de\u5f52\u6a21\u578b\u4e0b\u7684 log P(sequence)\u3002\"\"\"\n total = 0.0\n for t in range(1, len(sequence)):\n # \u7b80\u5355\uff1a\u4f4d\u7f6et\u5904\u7684logits\u53d6\u51b3\u4e8e\u4f4d\u7f6et-1\u5904\u7684token\n logits = params[sequence[t-1]]\n log_probs = jax.nn.log_softmax(logits)\n total += log_probs[sequence[t]]\n return total\n\ndef dpo_loss(theta, theta_ref, preferred, dispreferred, beta=0.1):\n \"\"\"\u4e00\u5bf9\u6570\u636e\u7684\u76f4\u63a5\u504f\u597d\u4f18\u5316\u635f\u5931\u3002\"\"\"\n log_pi_w = log_prob_sequence(theta, preferred)\n log_pi_l = log_prob_sequence(theta, dispreferred)\n log_ref_w = log_prob_sequence(theta_ref, preferred)\n log_ref_l = log_prob_sequence(theta_ref, dispreferred)\n\n # DPO\u76ee\u6807\n return -jax.nn.log_sigmoid(\n beta * ((log_pi_w - log_ref_w) - (log_pi_l - log_ref_l))\n )\n\n# \u504f\u597d\u6570\u636e\u96c6\uff1a(\u63d0\u793a\u524d\u7f00, \u504f\u597d\u5b8c\u6210\u5e8f\u5217, \u4e0d\u504f\u597d\u5b8c\u6210\u5e8f\u5217)\npreferences = [\n (jnp.array([1, 3, 5, 7]), jnp.array([1, 3, 5, 2])), # \u7ed3\u5c3e\u504f\u597d7\u800c\u4e0d\u662f2\n (jnp.array([0, 2, 4, 6]), jnp.array([0, 2, 4, 9])), # \u504f\u597d6\u800c\u4e0d\u662f9\n (jnp.array([3, 3, 3, 3]), jnp.array([3, 3, 3, 0])), # \u504f\u597d\u91cd\u590d\u800c\u4e0d\u662f0\n (jnp.array([5, 6, 7, 8]), jnp.array([5, 6, 7, 1])), # \u504f\u597d8\u800c\u4e0d\u662f1\n]\n\ngrad_fn = jax.jit(jax.grad(dpo_loss))\nlr = 0.05\n\nprint(\"\u8bad\u7ec3 DPO...\")\nfor epoch in range(100):\n total_loss = 0.0\n for preferred, dispreferred in preferences:\n loss = dpo_loss(theta, theta_ref, preferred, dispreferred)\n grads = grad_fn(theta, theta_ref, preferred, dispreferred)\n theta = theta - lr * grads\n total_loss += loss\n if (epoch + 1) % 20 == 0:\n avg_loss = total_loss / len(preferences)\n print(f\" Epoch {epoch+1}: avg DPO loss = {avg_loss:.4f}\")\n\n# \u68c0\u67e5\uff1a\u6a21\u578b\u73b0\u5728\u5e94\u8be5\u504f\u597d\u504f\u597d\u7684\u5b8c\u6210\u5e8f\u5217\nprint(\"\\nDPO\u8bad\u7ec3\u540e\u7684\u504f\u597d\u68c0\u67e5:\")\nfor preferred, dispreferred in preferences:\n lp_w = log_prob_sequence(theta, preferred)\n lp_l = log_prob_sequence(theta, dispreferred)\n print(f\" Preferred {list(preferred.astype(int))}: logP={lp_w:.3f} \"\n f\"Dispreferred {list(dispreferred.astype(int))}: logP={lp_l:.3f} \"\n f\"{'correct' if lp_w > lp_l else 'WRONG'}\")\n \u56fe\u50cf\u57fa\u7840\u89e3\u91ca\u6570\u5b57\u56fe\u50cf\u5728\u88ab\u4efb\u4f55\u6a21\u578b\u5904\u7406\u4e4b\u524d\u5982\u4f55\u8868\u793a\u3001\u5f62\u6210\u548c\u9884\u5904\u7406\u3002\u672c\u6587\u6db5\u76d6\u50cf\u7d20\u3001\u8272\u5f69\u7a7a\u95f4\uff08RGB\u3001HSV\u3001YCbCr\u3001LAB\uff09\u3001\u9488\u5b54\u76f8\u673a\u6a21\u578b\u3001\u5377\u79ef\u3001\u8fb9\u7f18\u68c0\u6d4b\uff08Sobel\u3001Canny\uff09\u3001\u76f4\u65b9\u56fe\u4ee5\u53ca\u7279\u5f81\u63cf\u8ff0\u5b50\uff08SIFT\u3001ORB\uff09\uff0c\u662f\u5e95\u5c42\u89c6\u89c9\u7684\u5de5\u5177\u5305\u3002
\u6570\u5b57\u56fe\u50cf\u662f\u4e00\u4e2a\u4e8c\u7ef4\u6570\u5b57\u7f51\u683c\u3002\u7f51\u683c\u4e2d\u7684\u6bcf\u4e2a\u5355\u5143\u683c\u662f\u4e00\u4e2a\u50cf\u7d20\uff08\u56fe\u50cf\u5143\u7d20\uff09\uff0c\u5176\u503c\u8868\u793a\u5f3a\u5ea6\u6216\u989c\u8272\u3002\u7070\u5ea6\u56fe\u50cf\u662f\u4e00\u4e2a\u5355\u4e00\u7684\u4e8c\u7ef4\u77e9\u9635\uff0c\u5176\u4e2d\u6bcf\u4e2a\u50cf\u7d20\u5305\u542b\u4e00\u4e2a\u4eae\u5ea6\u503c\uff0c\u5bf9\u4e8e 8 \u4f4d\u56fe\u50cf\uff0c\u901a\u5e38\u8303\u56f4\u4ece 0\uff08\u9ed1\u8272\uff09\u5230 255\uff08\u767d\u8272\uff09\u3002
\u5f69\u8272\u56fe\u50cf\u5c06\u6b64\u6269\u5c55\u5230\u4e09\u4e2a\u901a\u9053\u3002\u5728 RGB \u8272\u5f69\u7a7a\u95f4\u4e2d\uff0c\u6bcf\u4e2a\u50cf\u7d20\u5b58\u50a8\u4e09\u4e2a\u503c\uff1a\u7ea2\u8272\u3001\u7eff\u8272\u548c\u84dd\u8272\u7684\u5f3a\u5ea6\u3002
\u5f69\u8272\u56fe\u50cf\u662f\u4e00\u4e2a\u5f62\u72b6\u4e3a (\u9ad8\u5ea6, \u5bbd\u5ea6, 3) \u7684\u4e09\u7ef4\u5f20\u91cf\uff08\u77e9\u9635\uff09\u3002\u4ee5\u4e0d\u540c\u5f3a\u5ea6\u6df7\u5408\u8fd9\u4e09\u4e2a\u901a\u9053\u53ef\u4ee5\u4ea7\u751f\u5b8c\u6574\u7684\u53ef\u89c1\u5149\u8c31\u3002
\u4f4d\u6df1\u5ea6\u51b3\u5b9a\u6bcf\u4e2a\u901a\u9053\u53ef\u4ee5\u8868\u793a\u7684\u79bb\u6563\u5f3a\u5ea6\u7ea7\u522b\u6570\u91cf\u3002
8 \u4f4d\u56fe\u50cf\u6bcf\u4e2a\u901a\u9053\u6709 \\(2^8 = 256\\) \u4e2a\u7ea7\u522b\uff0c\u603b\u5171 \\(256^3 \\approx 1670\\) \u4e07\u79cd\u53ef\u80fd\u7684\u989c\u8272\u300216 \u4f4d\u56fe\u50cf\u6bcf\u4e2a\u901a\u9053\u6709 65,536 \u4e2a\u7ea7\u522b\uff0c\u7528\u4e8e\u533b\u5b66\u6210\u50cf\u548c\u9ad8\u52a8\u6001\u8303\u56f4\u6444\u5f71\u7b49\u5bf9\u7cbe\u7ec6\u5f3a\u5ea6\u5dee\u5f02\u654f\u611f\u7684\u573a\u666f\u3002
RGB \u4fbf\u4e8e\u663e\u793a\uff0c\u4f46\u5176\u4ed6\u8272\u5f69\u7a7a\u95f4\u66f4\u9002\u5408\u4e0d\u540c\u7684\u4efb\u52a1\u3002
HSV\uff08\u8272\u8c03\u3001\u9971\u548c\u5ea6\u3001\u660e\u5ea6\uff09\u5c06\u989c\u8272\u4fe1\u606f\u4e0e\u4eae\u5ea6\u5206\u79bb\u3002\u8272\u8c03\u662f\u7eaf\u8272\uff08\u5728\u8272\u73af\u4e0a 0-360 \u5ea6\uff09\uff0c\u9971\u548c\u5ea6\u662f\u989c\u8272\u7684\u9c9c\u8273\u7a0b\u5ea6\uff080 = \u7070\u8272\uff0c1 = \u7eaf\u8272\uff09\uff0c\u660e\u5ea6\u662f\u4eae\u5ea6\u3002HSV \u9002\u5408\u57fa\u4e8e\u989c\u8272\u7684\u5206\u5272\uff0c\u56e0\u4e3a\u4f60\u53ef\u4ee5\u4ec5\u6839\u636e\u8272\u8c03\u8bbe\u5b9a\u9608\u503c\uff0c\u800c\u65e0\u9700\u8003\u8651\u5149\u7167\u6761\u4ef6\u3002\u5728 HSV \u4e2d\u68c0\u6d4b\"\u7ea2\u8272\u7269\u4f53\"\u6bd4\u5728 RGB \u4e2d\u5bb9\u6613\u5f97\u591a\u3002
YCbCr \u5c06\u4eae\u5ea6\uff08Y\uff0c\u611f\u77e5\u4eae\u5ea6\uff09\u4e0e\u8272\u5ea6\uff08Cb\u3001Cr\uff0c\u989c\u8272\u5dee\u5f02\u4fe1\u53f7\uff09\u5206\u79bb\u3002\u8fd9\u662f JPEG \u538b\u7f29\u548c\u89c6\u9891\u7f16\u89e3\u7801\u5668\u4e2d\u4f7f\u7528\u7684\u8272\u5f69\u7a7a\u95f4\u3002\u4eba\u773c\u5bf9\u4eae\u5ea6\u6bd4\u5bf9\u989c\u8272\u66f4\u654f\u611f\uff0c\u56e0\u6b64\u8272\u5ea6\u53ef\u4ee5\u4ee5\u8f83\u4f4e\u5206\u8fa8\u7387\u5b58\u50a8\uff08\u8272\u5ea6\u5b50\u91c7\u6837\uff09\u800c\u51e0\u4e4e\u4e0d\u4ea7\u751f\u611f\u77e5\u635f\u5931\u3002
LAB\uff08CIELAB\uff09\u7684\u8bbe\u8ba1\u76ee\u6807\u662f\u4f7f\u4e24\u79cd\u989c\u8272\u4e4b\u95f4\u7684\u6570\u503c\u8ddd\u79bb\u5bf9\u5e94\u4e8e\u611f\u77e5\u5dee\u5f02\u3002\u5728 LAB \u7a7a\u95f4\u4e2d\u76f8\u7b49\u7684\u6b65\u957f\u5bf9\u4eba\u773c\u89c2\u5bdf\u8005\u6765\u8bf4\u770b\u8d77\u6765\u4e5f\u662f\u76f8\u7b49\u7684\u3002L \u901a\u9053\u662f\u660e\u5ea6\uff0cA \u4ece\u7eff\u8272\u5230\u7ea2\u8272\uff0cB \u4ece\u84dd\u8272\u5230\u9ec4\u8272\u3002\u5f53\u9700\u8981\u611f\u77e5\u5747\u5300\u7684\u989c\u8272\u6bd4\u8f83\u65f6\uff0c\u4f7f\u7528 LAB\u3002
\u56fe\u50cf\u5f62\u6210\u63cf\u8ff0\u4e09\u7ef4\u573a\u666f\u5982\u4f55\u53d8\u6210\u4e8c\u7ef4\u56fe\u50cf\u3002\u6700\u7b80\u5355\u7684\u6a21\u578b\u662f\u9488\u5b54\u76f8\u673a\uff1a\u6765\u81ea\u573a\u666f\u7684\u5149\u7ebf\u901a\u8fc7\u4e00\u4e2a\u5c0f\u5b54\u6295\u5c04\u5230\u5176\u540e\u7684\u4f20\u611f\u5668\u5e73\u9762\u4e0a\u3002\u4e16\u754c\u5750\u6807\u7cfb\u4e2d\u7684\u70b9 \\((X, Y, Z)\\) \u6295\u5f71\u5230\u50cf\u7d20\u5750\u6807 \\((u, v)\\)\uff1a
\u5176\u4e2d \\(\\mathbf{P} = [X, Y, Z, 1]^T\\) \u662f\u9f50\u6b21\u5750\u6807\u4e0b\u7684\u4e09\u7ef4\u70b9\uff0c\\(\\mathbf{p} = [u, v, 1]^T\\) \u662f\u6295\u5f71\u540e\u7684\u50cf\u7d20\u3002\\([R \\mid t]\\) \u77e9\u9635\u662f 3x4\uff0c\u5c06\u65cb\u8f6c\u548c\u5e73\u79fb\u5e76\u6392\u653e\u7f6e\u3002\u8fd9\u5168\u662f\u7b2c 02 \u7ae0\u4e2d\u7684\u7ebf\u6027\u4ee3\u6570\u3002
\u771f\u5b9e\u955c\u5934\u4f1a\u5f15\u5165\u7578\u53d8\u3002
\u76f8\u673a\u6807\u5b9a\u901a\u8fc7\u62cd\u6444\u5df2\u77e5\u56fe\u6848\uff08\u5982\u68cb\u76d8\u683c\uff09\u7684\u56fe\u50cf\u6765\u4f30\u8ba1\u5185\u53c2\u548c\u7578\u53d8\u7cfb\u6570\uff0c\u7136\u540e\u6821\u6b63\uff08\u53bb\u7578\u53d8\uff09\u56fe\u50cf\u3002
\u7a7a\u95f4\u6ee4\u6ce2\u662f\u7ecf\u5178\u56fe\u50cf\u5904\u7406\u7684\u57fa\u7840\u3002\u4e00\u4e2a\u6ee4\u6ce2\u5668\uff08\u6216\u5377\u79ef\u6838\uff09\u662f\u4e00\u4e2a\u5c0f\u77e9\u9635\uff08\u901a\u5e38\u4e3a 3x3 \u6216 5x5\uff09\uff0c\u5b83\u5728\u56fe\u50cf\u4e0a\u6ed1\u52a8\u3002\u5728\u6bcf\u4e2a\u4f4d\u7f6e\uff0c\u6ee4\u6ce2\u5668\u7684\u503c\u4e0e\u91cd\u53e0\u7684\u56fe\u50cf\u5757\u9010\u5143\u7d20\u76f8\u4e58\u5e76\u6c42\u548c\uff0c\u4ea7\u751f\u4e00\u4e2a\u8f93\u51fa\u50cf\u7d20\u3002\u8fd9\u5c31\u662f\u4e8c\u7ef4\u5377\u79ef\uff0c\u4e0e\u9a71\u52a8 CNN\uff08\u6587\u4ef6 02\uff09\u7684\u8fd0\u7b97\u76f8\u540c\uff0c\u4f46\u8fd9\u91cc\u7684\u6ee4\u6ce2\u5668\u6743\u91cd\u662f\u624b\u5de5\u8bbe\u8ba1\u800c\u975e\u5b66\u4e60\u5f97\u5230\u7684\u3002
\u8fd9\u662f\u7b2c 06 \u7ae0\u4e2d\u4e00\u7ef4\u5377\u79ef\u7684\u4e8c\u7ef4\u6269\u5c55\u3002\u6ee4\u6ce2\u5668\u51b3\u5b9a\u4e86\u8be5\u8fd0\u7b97\u68c0\u6d4b\u7684\u5185\u5bb9\uff1a\u4e0d\u540c\u7684\u6ee4\u6ce2\u5668\u68c0\u6d4b\u4e0d\u540c\u7684\u7279\u5f81\u3002
\u6a21\u7cca\u901a\u8fc7\u5bf9\u76f8\u90bb\u50cf\u7d20\u53d6\u5e73\u5747\u6765\u5e73\u6ed1\u56fe\u50cf\u3002\u76d2\u5f0f\u6ee4\u6ce2\u5668\u5bf9\u6240\u6709\u76f8\u90bb\u50cf\u7d20\u8d4b\u4e88\u76f8\u540c\u7684\u6743\u91cd\u3002
\u9ad8\u65af\u6ee4\u6ce2\u5668\u901a\u8fc7\u4e8c\u7ef4\u9ad8\u65af\u51fd\u6570\uff08\u7b2c 05 \u7ae0\uff09\u5bf9\u76f8\u90bb\u50cf\u7d20\u52a0\u6743\uff0c\u7ed9\u76f8\u90bb\u50cf\u7d20\u66f4\u5927\u7684\u6743\u91cd\uff0c\u7ed9\u8fdc\u5904\u7684\u50cf\u7d20\u66f4\u5c0f\u7684\u6743\u91cd\u3002\u9ad8\u65af\u6a21\u7cca\u662f\u6700\u5e38\u89c1\u7684\u5e73\u6ed1\u64cd\u4f5c\uff0c\u7531 \\(\\sigma\\) \u53c2\u6570\u5316\uff1a\\(\\sigma\\) \u8d8a\u5927\uff0c\u5e73\u6ed1\u7a0b\u5ea6\u8d8a\u9ad8\u3002
\u4e2d\u503c\u6ee4\u6ce2\u7528\u90bb\u57df\u7684\u4e2d\u503c\u4ee3\u66ff\u6bcf\u4e2a\u50cf\u7d20\uff0c\u800c\u975e\u52a0\u6743\u5e73\u5747\u3002\u5b83\u5728\u53bb\u9664\u6912\u76d0\u566a\u58f0\uff08\u968f\u673a\u7684\u9ed1\u767d\u50cf\u7d20\uff09\u65b9\u9762\u7279\u522b\u6709\u6548\uff0c\u540c\u65f6\u4fdd\u7559\u8fb9\u7f18\uff0c\u56e0\u4e3a\u4e2d\u503c\u5bf9\u5f02\u5e38\u503c\u5177\u6709\u9c81\u68d2\u6027\uff08\u5982\u7b2c 04 \u7ae0\u6240\u8ba8\u8bba\u7684\uff09\u3002
\u8fb9\u7f18\u68c0\u6d4b\u8bc6\u522b\u50cf\u7d20\u5f3a\u5ea6\u6025\u5267\u53d8\u5316\u7684\u8fb9\u754c\u3002\u8fb9\u7f18\u627f\u8f7d\u4e86\u56fe\u50cf\u4e2d\u7684\u5927\u90e8\u5206\u7ed3\u6784\u4fe1\u606f\uff1b\u4ec5\u51ed\u8fb9\u7f18\u5c31\u53ef\u4ee5\u8bc6\u522b\u7269\u4f53\u3002
Sobel \u7b97\u5b50\u4f7f\u7528\u4e24\u4e2a 3x3 \u6ee4\u6ce2\u5668\u6765\u4f30\u8ba1\u6c34\u5e73\u65b9\u5411\u548c\u5782\u76f4\u65b9\u5411\u7684\u68af\u5ea6\uff1a
\u5c06\u56fe\u50cf\u4e0e \\(G_x\\) \u5377\u79ef\u5f97\u5230\u6c34\u5e73\u68af\u5ea6\uff08\u5bf9\u5782\u76f4\u8fb9\u7f18\u54cd\u5e94\u5f3a\u70c8\uff09\uff0c\u4e0e \\(G_y\\) \u5377\u79ef\u5f97\u5230\u5782\u76f4\u68af\u5ea6\uff08\u5bf9\u6c34\u5e73\u8fb9\u7f18\u54cd\u5e94\u5f3a\u70c8\uff09\u3002
\u68af\u5ea6\u5e45\u503c \\(\\sqrt{G_x^2 + G_y^2}\\) \u548c\u65b9\u5411 \\(\\arctan(G_y / G_x)\\) \u5171\u540c\u63cf\u8ff0\u6bcf\u4e2a\u50cf\u7d20\u5904\u7684\u8fb9\u7f18\u5f3a\u5ea6\u548c\u65b9\u5411\u3002\u8fd9\u662f\u7b2c 03 \u7ae0\u4e2d\u68af\u5ea6\u5728\u56fe\u50cf\u57df\u7684\u5bf9\u5e94\u6982\u5ff5\u3002
Canny \u8fb9\u7f18\u68c0\u6d4b\u5668\u662f\u8fb9\u7f18\u68c0\u6d4b\u7684\u9ec4\u91d1\u6807\u51c6\u3002\u5b83\u5305\u542b\u56db\u4e2a\u6b65\u9aa4\uff1a
Canny \u4e2d\u7684\u53cc\u9608\u503c\u4f7f\u5176\u6bd4\u5355\u9608\u503c\u66f4\u9c81\u68d2\uff1a\u5f3a\u8fb9\u7f18\u59cb\u7ec8\u88ab\u4fdd\u7559\uff0c\u5f31\u8fb9\u7f18\u4ec5\u5f53\u5c5e\u4e8e\u8fde\u7eed\u8fb9\u7f18\u7ed3\u6784\u65f6\u624d\u88ab\u4fdd\u7559\u3002
\u9891\u57df\u5206\u6790\u63ed\u793a\u4e86\u5728\u7a7a\u95f4\u57df\u96be\u4ee5\u770b\u5230\u7684\u6a21\u5f0f\u3002\u4e8c\u7ef4\u5085\u91cc\u53f6\u53d8\u6362\uff08\u6269\u5c55\u81ea\u7b2c 03 \u7ae0\u7684\u4e00\u7ef4\u7248\u672c\uff09\u5c06\u56fe\u50cf\u5206\u89e3\u4e3a\u4e0d\u540c\u9891\u7387\u548c\u65b9\u5411\u7684\u6b63\u5f26\u6a21\u5f0f\u4e4b\u548c\uff1a
\u4f4e\u9891\u5bf9\u5e94\u5e73\u6ed1\u3001\u7f13\u6162\u53d8\u5316\u7684\u533a\u57df\uff08\u5929\u7a7a\u3001\u5899\u58c1\uff09\u3002\u9ad8\u9891\u5bf9\u5e94\u9510\u5229\u53d8\u5316\uff08\u8fb9\u7f18\u3001\u7eb9\u7406\u3001\u566a\u58f0\uff09\u3002\u5e45\u5ea6\u8c31\u663e\u793a\u6bcf\u4e2a\u9891\u7387\u4e0a\u5b58\u5728\u591a\u5c11\u80fd\u91cf\uff0c\u76f8\u4f4d\u8c31\u7f16\u7801\u4e86\u7a7a\u95f4\u6392\u5217\u4fe1\u606f\u3002
\u4f4e\u901a\u6ee4\u6ce2\u53bb\u9664\u9ad8\u9891\uff0c\u4ece\u800c\u5e73\u6ed1\u56fe\u50cf\uff08\u76f8\u5f53\u4e8e\u7a7a\u95f4\u57df\u7684\u9ad8\u65af\u6a21\u7cca\uff09\u3002\u9ad8\u901a\u6ee4\u6ce2\u53bb\u9664\u4f4e\u9891\uff0c\u4ece\u800c\u5f3a\u8c03\u8fb9\u7f18\u548c\u7ec6\u8282\u3002\u5e26\u901a\u6ee4\u6ce2\u53ea\u4fdd\u7559\u4e00\u5b9a\u8303\u56f4\u7684\u9891\u7387\uff0c\u7528\u4e8e\u7eb9\u7406\u5206\u6790\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u5bf9\u4e8e\u5927\u5c3a\u5bf8\u6ee4\u6ce2\u5668\uff0c\u9891\u57df\u6ee4\u6ce2\u53ef\u80fd\u6bd4\u7a7a\u95f4\u5377\u79ef\u66f4\u5feb\uff0c\u56e0\u4e3a\u7a7a\u95f4\u57df\u4e2d\u7684\u5377\u79ef\u7b49\u4ef7\u4e8e\u9891\u57df\u4e2d\u7684\u9010\u5143\u7d20\u4e58\u6cd5\uff08\u5377\u79ef\u5b9a\u7406\uff09\u3002\u8fd9\u76f4\u63a5\u8054\u7cfb\u5230\u7b2c 03 \u7ae0\u4e2d\u7684\u5085\u91cc\u53f6\u53d8\u6362\u6027\u8d28\u3002
\u76f4\u65b9\u56fe\u603b\u7ed3\u50cf\u7d20\u5f3a\u5ea6\u7684\u5206\u5e03\u3002\u76f4\u65b9\u56fe\u7edf\u8ba1\u6bcf\u4e2a\u5f3a\u5ea6\u503c\u6709\u591a\u5c11\u50cf\u7d20\uff08\u5bf9\u4e8e 8 \u4f4d\u56fe\u50cf\u4e3a 0-255\uff09\u3002\u8fd9\u662f\u7b2c 04 \u7ae0\u4e2d\u7684\u9891\u7387\u5206\u5e03\u5e94\u7528\u4e8e\u50cf\u7d20\u503c\u3002
\u6697\u56fe\u50cf\u7684\u76f4\u65b9\u56fe\u96c6\u4e2d\u5728\u5de6\u4fa7\uff08\u4f4e\u503c\uff09\u3002\u4eae\u56fe\u50cf\u7684\u76f4\u65b9\u56fe\u96c6\u4e2d\u5728\u53f3\u4fa7\u3002\u4f4e\u5bf9\u6bd4\u5ea6\u56fe\u50cf\u7684\u76f4\u65b9\u56fe\u72ed\u7a84\u3002\u9ad8\u5bf9\u6bd4\u5ea6\u56fe\u50cf\u7684\u76f4\u65b9\u56fe\u5bbd\u800c\u5206\u6563\u3002
\u76f4\u65b9\u56fe\u5747\u8861\u5316\u5c06\u76f4\u65b9\u56fe\u62c9\u4f38\u4ee5\u8986\u76d6\u6574\u4e2a\u5f3a\u5ea6\u8303\u56f4\uff0c\u4ece\u800c\u6539\u5584\u5bf9\u6bd4\u5ea6\u3002\u5176\u601d\u8def\u662f\u627e\u5230\u4e00\u4e2a\u6620\u5c04\uff0c\u4f7f\u50cf\u7d20\u5f3a\u5ea6\u7684\u7d2f\u79ef\u5206\u5e03\u51fd\u6570\uff08CDF\uff09\u8fd1\u4f3c\u4e3a\u7ebf\u6027\u3002\u8fd9\u662f\u7b2c 04 \u7ae0\u4e2d CDF \u6982\u5ff5\u7684\u76f4\u63a5\u5e94\u7528\u3002
Otsu \u65b9\u6cd5\u81ea\u52a8\u627e\u5230\u5c06\u56fe\u50cf\u5206\u5272\u4e3a\u524d\u666f\u548c\u80cc\u666f\u7684\u6700\u4f73\u9608\u503c\u3002\u5b83\u5c1d\u8bd5\u6bcf\u4e2a\u53ef\u80fd\u7684\u9608\u503c\uff0c\u5e76\u9009\u62e9\u4f7f\u7c7b\u5185\u65b9\u5dee\u6700\u5c0f\uff08\u6216\u7b49\u4ef7\u5730\uff0c\u4f7f\u7c7b\u95f4\u65b9\u5dee\u6700\u5927\uff09\u7684\u9608\u503c\u3002\u8fd9\u662f\u7b2c 04 \u7ae0\u4e2d\u65b9\u5dee\u6982\u5ff5\u5e94\u7528\u4e8e\u50cf\u7d20\u5f3a\u5ea6\u7fa4\u4f53\u7684\u4f53\u73b0\u3002
\u7279\u5f81\u63d0\u53d6\u8bc6\u522b\u56fe\u50cf\u4e2d\u53ef\u7528\u4e8e\u5339\u914d\u3001\u8bc6\u522b\u548c\u4e09\u7ef4\u91cd\u5efa\u7684\u72ec\u7279\u70b9\u6216\u533a\u57df\u3002\u597d\u7684\u7279\u5f81\u5e94\u5177\u6709\u53ef\u91cd\u590d\u6027\uff08\u5728\u4e0d\u540c\u89c6\u89d2\u4e0b\u80fd\u88ab\u518d\u6b21\u627e\u5230\uff09\u3001\u72ec\u7279\u6027\uff08\u53ef\u4e0e\u5176\u4ed6\u7279\u5f81\u533a\u5206\uff09\u548c\u8ba1\u7b97\u9ad8\u6548\u6027\u3002
\u89d2\u70b9\u68c0\u6d4b\u5bfb\u627e\u56fe\u50cf\u5f3a\u5ea6\u5728\u591a\u4e2a\u65b9\u5411\u4e0a\u663e\u8457\u53d8\u5316\u7684\u70b9\u3002\u5e73\u6ed1\u533a\u57df\u5728\u4efb\u4f55\u65b9\u5411\u4e0a\u7684\u53d8\u5316\u90fd\u5f88\u5c0f\u3002\u8fb9\u7f18\u5728\u4e00\u4e2a\u65b9\u5411\u4e0a\u6709\u53d8\u5316\u3002\u89d2\u70b9\u5728\u81f3\u5c11\u4e24\u4e2a\u65b9\u5411\u4e0a\u90fd\u6709\u53d8\u5316\uff0c\u4f7f\u5176\u5728\u5c40\u90e8\u662f\u552f\u4e00\u7684\uff0c\u56e0\u6b64\u662f\u53ef\u9760\u7684\u6807\u5fd7\u70b9\u3002
Harris \u89d2\u70b9\u68c0\u6d4b\u5668\u5206\u6790\u6bcf\u4e2a\u50cf\u7d20\u5904\u7684\u7ed3\u6784\u5f20\u91cf\uff08\u4e5f\u79f0\u4e3a\u4e8c\u9636\u77e9\u77e9\u9635\uff09\uff1a
\u5176\u4e2d \\(I_x\\) \u548c \\(I_y\\) \u662f\u56fe\u50cf\u68af\u5ea6\uff08\u4f7f\u7528 Sobel \u8ba1\u7b97\uff09\uff0c\\(W\\) \u662f\u5c40\u90e8\u7a97\u53e3\uff0c\\(w\\) \u662f\u9ad8\u65af\u52a0\u6743\u51fd\u6570\u3002\\(M\\) \u7684\u7279\u5f81\u503c\uff08\u6765\u81ea\u7b2c 02 \u7ae0\uff09\u544a\u8bc9\u4f60\u7279\u5f81\u7684\u7c7b\u578b\uff1a
Harris \u4e0d\u663e\u5f0f\u8ba1\u7b97\u7279\u5f81\u503c\uff0c\u800c\u662f\u4f7f\u7528\u89d2\u70b9\u54cd\u5e94\u51fd\u6570\uff1a\\(R = \\det(M) - k \\cdot (\\text{tr}(M))^2\\)\uff0c\u5176\u4e2d \\(\\det(M) = \\lambda_1 \\lambda_2\\) \u4e14 \\(\\text{tr}(M) = \\lambda_1 + \\lambda_2\\)\uff08\u5747\u6765\u81ea\u7b2c 02 \u7ae0\uff09\u3002\\(R\\) \u4e3a\u6b63\u4e14\u8f83\u5927\u65f6\u8868\u793a\u89d2\u70b9\u3002\u5e38\u6570 \\(k\\) \u901a\u5e38\u4e3a 0.04-0.06\u3002
Shi-Tomasi \u68c0\u6d4b\u5668\u5c06\u5176\u7b80\u5316\u4e3a \\(R = \\min(\\lambda_1, \\lambda_2)\\)\uff0c\u76f4\u63a5\u68c0\u67e5\u8f83\u5c0f\u7684\u7279\u5f81\u503c\u662f\u5426\u8db3\u591f\u5927\u3002\u8fd9\u5728\u5b9e\u9645\u4e2d\u7a0d\u5fae\u66f4\u7a33\u5b9a\u3002
\u6591\u70b9\u68c0\u6d4b\u5bfb\u627e\u4e0e\u5468\u56f4\u73af\u5883\u4e0d\u540c\u7684\u533a\u57df\u3002\u4e0e\u89d2\u70b9\uff08\u5c5e\u4e8e\u70b9\u7279\u5f81\uff09\u4e0d\u540c\uff0c\u6591\u70b9\u5177\u6709\u7279\u5f81\u5c3a\u5bf8\u3002
SIFT\uff08\u5c3a\u5ea6\u4e0d\u53d8\u7279\u5f81\u53d8\u6362\uff0cLowe\uff0c2004\uff09\u5728\u591a\u4e2a\u5c3a\u5ea6\u4e0a\u68c0\u6d4b\u6591\u70b9\uff0c\u5e76\u6784\u5efa\u5bf9\u65cb\u8f6c\u3001\u5c3a\u5ea6\u5177\u6709\u4e0d\u53d8\u6027\uff0c\u5bf9\u5149\u7167\u53d8\u5316\u5177\u6709\u90e8\u5206\u4e0d\u53d8\u6027\u7684\u63cf\u8ff0\u5b50\u3002\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u662f\uff1a
SURF\uff08\u52a0\u901f\u7a33\u5065\u7279\u5f81\uff09\u4f7f\u7528\u76d2\u5f0f\u6ee4\u6ce2\u5668\u548c\u79ef\u5206\u56fe\u50cf\u8fd1\u4f3c SIFT \u4ee5\u5b9e\u73b0\u66f4\u5feb\u7684\u8ba1\u7b97\u3002ORB\uff08\u5b9a\u5411 FAST \u548c\u65cb\u8f6c BRIEF\uff09\u662f\u4e00\u4e2a\u5feb\u901f\u3001\u5f00\u6e90\u7684\u66ff\u4ee3\u65b9\u6848\uff0c\u5b83\u5c06 FAST \u89d2\u70b9\u68c0\u6d4b\u5668\u4e0e BRIEF \u4e8c\u8fdb\u5236\u63cf\u8ff0\u5b50\u7ed3\u5408\uff0c\u5e76\u589e\u52a0\u4e86\u65cb\u8f6c\u4e0d\u53d8\u6027\u3002
HOG\uff08\u65b9\u5411\u68af\u5ea6\u76f4\u65b9\u56fe\uff09\u63cf\u8ff0\u5b50\u5c06\u56fe\u50cf\u5212\u5206\u4e3a\u5c0f\u5355\u5143\u683c\uff0c\u8ba1\u7b97\u6bcf\u4e2a\u5355\u5143\u683c\u5185\u68af\u5ea6\u65b9\u5411\u7684\u76f4\u65b9\u56fe\uff0c\u5e76\u5728\u5355\u5143\u683c\u5757\u95f4\u8fdb\u884c\u5f52\u4e00\u5316\u3002HOG \u6355\u6349\u8fb9\u7f18\u65b9\u5411\u7684\u5206\u5e03\uff0c\u8fd9\u5bf9\u7269\u4f53\u5f62\u72b6\u5177\u6709\u9ad8\u5ea6\u4fe1\u606f\u91cf\u3002\u5728\u6df1\u5ea6\u5b66\u4e60\u4e4b\u524d\uff0cHOG + SVM\uff08\u7b2c 06 \u7ae0\uff09\u662f\u884c\u4eba\u68c0\u6d4b\u548c\u7269\u4f53\u8bc6\u522b\u7684\u4e3b\u6d41\u65b9\u6cd5\u3002
\u56fe\u50cf\u91d1\u5b57\u5854\u4ee5\u591a\u79cd\u5206\u8fa8\u7387\u8868\u793a\u56fe\u50cf\u3002
\u52a0\u8f7d\u56fe\u50cf\uff0c\u5c06\u5176\u8f6c\u6362\u4e3a\u4e0d\u540c\u7684\u8272\u5f69\u7a7a\u95f4\uff08RGB\u3001HSV\u3001LAB\uff09\uff0c\u5e76\u53ef\u89c6\u5316\u5404\u4e2a\u901a\u9053\u3002\u89c2\u5bdf\u989c\u8272\u4fe1\u606f\u5728\u4e0d\u540c\u7a7a\u95f4\u4e2d\u7684\u5206\u5e03\u5dee\u5f02\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport numpy as np\n\n# Create a synthetic test image with distinct colours\nH, W = 128, 256\nimg = np.zeros((H, W, 3), dtype=np.uint8)\nimg[:, :64] = [255, 50, 50] # red\nimg[:, 64:128] = [50, 255, 50] # green\nimg[:, 128:192] = [50, 50, 255] # blue\nimg[:, 192:] = [255, 255, 50] # yellow\n\n# Add a brightness gradient\nfor y in range(H):\n scale = 0.3 + 0.7 * y / H\n img[y] = (img[y] * scale).astype(np.uint8)\n\nimg_jnp = jnp.array(img, dtype=jnp.float32) / 255.0\n\n# Manual RGB to HSV conversion\ndef rgb_to_hsv(rgb):\n r, g, b = rgb[..., 0], rgb[..., 1], rgb[..., 2]\n maxc = jnp.max(rgb, axis=-1)\n minc = jnp.min(rgb, axis=-1)\n diff = maxc - minc + 1e-7\n\n # Hue\n h = jnp.where(maxc == minc, 0.0,\n jnp.where(maxc == r, 60 * ((g - b) / diff % 6),\n jnp.where(maxc == g, 60 * ((b - r) / diff + 2),\n 60 * ((r - g) / diff + 4))))\n s = jnp.where(maxc < 1e-7, 0.0, diff / maxc)\n v = maxc\n return jnp.stack([h / 360, s, v], axis=-1)\n\nhsv = rgb_to_hsv(img_jnp)\n\nfig, axes = plt.subplots(2, 3, figsize=(14, 8))\nfor i, (ch, name) in enumerate(zip([img_jnp[...,0], img_jnp[...,1], img_jnp[...,2]],\n ['Red', 'Green', 'Blue'])):\n axes[0, i].imshow(ch, cmap='gray', vmin=0, vmax=1)\n axes[0, i].set_title(f'RGB: {name}'); axes[0, i].axis('off')\n\nfor i, (ch, name) in enumerate(zip([hsv[...,0], hsv[...,1], hsv[...,2]],\n ['Hue', 'Saturation', 'Value'])):\n axes[1, i].imshow(ch, cmap='gray', vmin=0, vmax=1)\n axes[1, i].set_title(f'HSV: {name}'); axes[1, i].axis('off')\n\nplt.suptitle('RGB vs HSV Channels')\nplt.tight_layout(); plt.show()\n \u4f7f\u7528\u4e8c\u7ef4\u5377\u79ef\u4ece\u5934\u5b9e\u73b0 Sobel \u8fb9\u7f18\u68c0\u6d4b\u548c\u9ad8\u65af\u6a21\u7cca\u3002\u5c06\u5176\u5e94\u7528\u4e8e\u56fe\u50cf\u5e76\u6bd4\u8f83\u7ed3\u679c\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef conv2d(image, kernel):\n \"\"\"2D convolution (valid mode) from scratch.\"\"\"\n H, W = image.shape\n kH, kW = kernel.shape\n out_h, out_w = H - kH + 1, W - kW + 1\n output = jnp.zeros((out_h, out_w))\n for i in range(out_h):\n for j in range(out_w):\n patch = image[i:i+kH, j:j+kW]\n output = output.at[i, j].set(jnp.sum(patch * kernel))\n return output\n\n# Create a test image: white rectangle on dark background\nimg = jnp.zeros((64, 64))\nimg = img.at[15:50, 20:45].set(1.0)\n# Add some noise\nkey = jax.random.PRNGKey(42)\nimg = img + jax.random.normal(key, img.shape) * 0.05\n\n# Sobel filters\nsobel_x = jnp.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=jnp.float32)\nsobel_y = jnp.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtype=jnp.float32)\n\n# Gaussian blur kernel (5x5, sigma=1)\nax = jnp.arange(-2, 3, dtype=jnp.float32)\nxx, yy = jnp.meshgrid(ax, ax)\ngaussian = jnp.exp(-(xx**2 + yy**2) / (2 * 1.0**2))\ngaussian = gaussian / gaussian.sum()\n\n# Apply filters\ngx = conv2d(img, sobel_x)\ngy = conv2d(img, sobel_y)\nedges = jnp.sqrt(gx**2 + gy**2)\nblurred = conv2d(img, gaussian)\n\nfig, axes = plt.subplots(1, 4, figsize=(16, 4))\nfor ax, data, title in zip(axes,\n [img, edges, blurred, gx],\n ['Original', 'Edge Magnitude', 'Gaussian Blur', 'Horizontal Gradient']):\n ax.imshow(data, cmap='gray')\n ax.set_title(title); ax.axis('off')\nplt.tight_layout(); plt.show()\n \u4ece\u5934\u5b9e\u73b0\u76f4\u65b9\u56fe\u5747\u8861\u5316\uff0c\u5e76\u5c06\u5176\u5e94\u7528\u4e8e\u4f4e\u5bf9\u6bd4\u5ea6\u7070\u5ea6\u56fe\u50cf\u3002\u6bd4\u8f83\u5747\u8861\u524d\u540e\u7684\u76f4\u65b9\u56fe\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# Create a low-contrast image (values clustered in a narrow range)\nkey = __import__('jax').random.PRNGKey(42)\nimg = __import__('jax').random.uniform(key, (128, 128)) * 0.3 + 0.3 # values in [0.3, 0.6]\n\ndef histogram_equalise(img, n_bins=256):\n \"\"\"Histogram equalisation for a grayscale image.\"\"\"\n # Quantise to bins\n bins = jnp.linspace(0, 1, n_bins + 1)\n hist = jnp.histogram(img, bins=bins)[0]\n\n # Compute CDF\n cdf = jnp.cumsum(hist)\n cdf_normalised = (cdf - cdf.min()) / (cdf.max() - cdf.min())\n\n # Map each pixel through the CDF\n indices = jnp.clip((img * n_bins).astype(jnp.int32), 0, n_bins - 1)\n equalised = cdf_normalised[indices]\n return equalised\n\neq_img = histogram_equalise(img)\n\nfig, axes = plt.subplots(2, 2, figsize=(12, 10))\naxes[0, 0].imshow(img, cmap='gray', vmin=0, vmax=1)\naxes[0, 0].set_title('Original (Low Contrast)'); axes[0, 0].axis('off')\naxes[0, 1].imshow(eq_img, cmap='gray', vmin=0, vmax=1)\naxes[0, 1].set_title('After Histogram Equalisation'); axes[0, 1].axis('off')\n\naxes[1, 0].hist(img.ravel(), bins=64, color='#3498db', alpha=0.8)\naxes[1, 0].set_title('Histogram Before'); axes[1, 0].set_xlim(0, 1)\naxes[1, 1].hist(eq_img.ravel(), bins=64, color='#e74c3c', alpha=0.8)\naxes[1, 1].set_title('Histogram After'); axes[1, 1].set_xlim(0, 1)\n\nplt.tight_layout(); plt.show()\n \u4ece\u5934\u5b9e\u73b0 Harris \u89d2\u70b9\u68c0\u6d4b\u5668\u3002\u5728\u7b80\u5355\u56fe\u50cf\u4e2d\u68c0\u6d4b\u89d2\u70b9\u5e76\u53ef\u89c6\u5316\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef harris_corners(img, k=0.05, threshold=0.01):\n \"\"\"Harris corner detection from scratch.\"\"\"\n # Compute gradients with Sobel\n sobel_x = jnp.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=jnp.float32)\n sobel_y = jnp.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtype=jnp.float32)\n\n # Pad image for valid convolution to preserve size\n img_pad = jnp.pad(img, 1, mode='edge')\n H, W = img.shape\n\n Ix = jnp.zeros_like(img)\n Iy = jnp.zeros_like(img)\n for i in range(H):\n for j in range(W):\n patch = img_pad[i:i+3, j:j+3]\n Ix = Ix.at[i, j].set(jnp.sum(patch * sobel_x))\n Iy = Iy.at[i, j].set(jnp.sum(patch * sobel_y))\n\n # Structure tensor components\n Ixx = Ix * Ix\n Iyy = Iy * Iy\n Ixy = Ix * Iy\n\n # Gaussian smoothing of structure tensor (approximate with window sum)\n w = 3 # window half-size\n R = jnp.zeros_like(img)\n pad_xx = jnp.pad(Ixx, w, mode='constant')\n pad_yy = jnp.pad(Iyy, w, mode='constant')\n pad_xy = jnp.pad(Ixy, w, mode='constant')\n\n for i in range(H):\n for j in range(W):\n sxx = jnp.sum(pad_xx[i:i+2*w+1, j:j+2*w+1])\n syy = jnp.sum(pad_yy[i:i+2*w+1, j:j+2*w+1])\n sxy = jnp.sum(pad_xy[i:i+2*w+1, j:j+2*w+1])\n det = sxx * syy - sxy * sxy\n trace = sxx + syy\n R = R.at[i, j].set(det - k * trace * trace)\n\n # Threshold\n corners = R > threshold * R.max()\n return R, corners\n\n# Test image: checkerboard pattern (lots of corners)\nblock = 16\nn = 4\nchecker = jnp.zeros((block * n, block * n))\nfor i in range(n):\n for j in range(n):\n if (i + j) % 2 == 0:\n checker = checker.at[i*block:(i+1)*block, j*block:(j+1)*block].set(1.0)\n\nR, corners = harris_corners(checker)\ncy, cx = jnp.where(corners)\n\nfig, axes = plt.subplots(1, 3, figsize=(14, 4))\naxes[0].imshow(checker, cmap='gray')\naxes[0].set_title('Checkerboard'); axes[0].axis('off')\naxes[1].imshow(R, cmap='hot')\naxes[1].set_title('Harris Response'); axes[1].axis('off')\naxes[2].imshow(checker, cmap='gray')\naxes[2].scatter(cx, cy, c='#e74c3c', s=15, marker='x')\naxes[2].set_title(f'Detected Corners ({len(cx)})'); axes[2].axis('off')\nplt.tight_layout(); plt.show()\n \u5377\u79ef\u795e\u7ecf\u7f51\u7edc\u76f4\u63a5\u4ece\u50cf\u7d20\u6570\u636e\u4e2d\u5b66\u4e60\u7a7a\u95f4\u7279\u5f81\u5c42\u7ea7\uff0c\u7528\u68af\u5ea6\u4f18\u5316\u7684\u6ee4\u6ce2\u5668\u53d6\u4ee3\u4eba\u5de5\u8bbe\u8ba1\u7684\u6ee4\u6ce2\u5668\u3002\u672c\u6587\u6db5\u76d6\u5377\u79ef\u673a\u5236\u3001\u6c60\u5316\u3001\u6b65\u957f\u3001\u7a7a\u6d1e\u5377\u79ef\u3001\u611f\u53d7\u91ce\uff0c\u4ee5\u53ca\u5b9a\u4e49\u4e86\u56fe\u50cf\u5206\u7c7b\u7684\u6807\u5fd7\u6027\u67b6\u6784\uff08LeNet\u3001AlexNet\u3001VGG\u3001ResNet\u3001Inception\u3001EfficientNet\uff09\u3002
\u5728\u6587\u4ef6 01 \u4e2d\uff0c\u6211\u4eec\u624b\u5de5\u8bbe\u8ba1\u4e86\u7528\u4e8e\u8fb9\u7f18\u68c0\u6d4b\u3001\u6a21\u7cca\u548c\u89d2\u70b9\u68c0\u6d4b\u7684\u6ee4\u6ce2\u5668\u3002\u4e00\u4e2a\u81ea\u7136\u800c\u7136\u7684\u95ee\u9898\u662f\uff1a\u6211\u4eec\u80fd\u5426\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u6700\u4f18\u7684\u6ee4\u6ce2\u5668\uff1f\u8fd9\u6b63\u662f\u5377\u79ef\u795e\u7ecf\u7f51\u7edc\uff08CNN\uff09\u6240\u505a\u7684\u3002
CNN \u4e0d\u662f\u624b\u52a8\u9009\u62e9\u6ee4\u6ce2\u5668\u6743\u91cd\uff0c\u800c\u662f\u901a\u8fc7\u68af\u5ea6\u4e0b\u964d\uff08\u7b2c 06 \u7ae0\uff09\u5b66\u4e60\u5b83\u4eec\uff0c\u53d1\u73b0\u5bf9\u5f53\u524d\u4efb\u52a1\u76f4\u63a5\u6709\u7528\u7684\u7279\u5f81\u3002
\u5728\u7b2c 06 \u7ae0\u4e2d\uff0c\u6211\u4eec\u4ecb\u7ecd\u4e86\u5377\u79ef\u64cd\u4f5c\u3001CNN \u57fa\u7840\u4ee5\u53ca\u6ee4\u6ce2\u5668\u5b66\u4e60\u7684\u601d\u60f3\u3002\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u6df1\u5165\u63a2\u8ba8\u4f7f CNN \u5728\u5341\u591a\u5e74\u6765\u6210\u4e3a\u8ba1\u7b97\u673a\u89c6\u89c9\u4e3b\u5bfc\u8303\u5f0f\u7684\u67b6\u6784\u521b\u65b0\u3002
\u56de\u987e\u6838\u5fc3\u7684\u5377\u79ef\u64cd\u4f5c\uff1a\u4e00\u4e2a\u5927\u5c0f\u4e3a \\(k \\times k\\) \u7684\u6ee4\u6ce2\u5668 \\(K\\) \u5728\u8f93\u5165\u7279\u5f81\u56fe\u4e0a\u6ed1\u52a8\uff0c\u5728\u6bcf\u4e2a\u4f4d\u7f6e\u8ba1\u7b97\u70b9\u79ef\uff08\u7b2c 06 \u7ae0\uff09\u3002\u8f93\u51fa\u5927\u5c0f\u7531\u4e09\u4e2a\u8d85\u53c2\u6570\u63a7\u5236\uff1a
\u5377\u79ef\u540e\u7684\u8f93\u51fa\u7a7a\u95f4\u5927\u5c0f\uff1a
\u5176\u4e2d \\(\\text{in}\\) \u662f\u8f93\u5165\u5927\u5c0f\uff0c\\(k\\) \u662f\u5377\u79ef\u6838\u5927\u5c0f\uff0c\\(p\\) \u662f\u586b\u5145\uff0c\\(s\\) \u662f\u6b65\u957f\u3002\u8be5\u516c\u5f0f\u72ec\u7acb\u5730\u9002\u7528\u4e8e\u9ad8\u5ea6\u548c\u5bbd\u5ea6\u3002
\u611f\u53d7\u91ce\u662f\u6307\u80fd\u591f\u5f71\u54cd\u67d0\u4e2a\u795e\u7ecf\u5143\u503c\u7684\u539f\u59cb\u8f93\u5165\u533a\u57df\u3002
\u611f\u53d7\u91ce\u968f\u7740\u6bcf\u4e00\u5c42\u589e\u957f\uff1a\u5927\u81f4\u6bcf\u5c42\u5377\u79ef\u589e\u52a0 \\(k - 1\\) \u4e2a\u50cf\u7d20\uff08\u52a0\u5165\u6b65\u957f\u6216\u7a7a\u6d1e\u5377\u79ef\u65f6\u589e\u957f\u66f4\u591a\uff09\u3002
\u6c60\u5316\u5c42\u5728\u4fdd\u7559\u6700\u91cd\u8981\u4fe1\u606f\u7684\u540c\u65f6\u964d\u4f4e\u7a7a\u95f4\u7ef4\u5ea6\u3002
\u5168\u5c40\u5e73\u5747\u6c60\u5316\uff08GAP\uff09 \u5c06\u6bcf\u4e2a\u901a\u9053\u7684\u6574\u4e2a\u7a7a\u95f4\u8303\u56f4\u5e73\u5747\u4e3a\u5355\u4e2a\u6570\u503c\uff0c\u751f\u6210\u4e00\u4e2a\u957f\u5ea6\u7b49\u4e8e\u901a\u9053\u6570\u7684\u5411\u91cf\u3002GAP \u53d6\u4ee3\u4e86\u8bb8\u591a\u73b0\u4ee3\u67b6\u6784\u672b\u5c3e\u7684\u5168\u8fde\u63a5\u5c42\uff0c\u5927\u5e45\u51cf\u5c11\u4e86\u53c2\u6570\u91cf\uff0c\u5e76\u8d77\u5230\u4e86\u7ed3\u6784\u6b63\u5219\u5316\u7684\u4f5c\u7528\u3002
\u6279\u5f52\u4e00\u5316\uff08BatchNorm\uff09 \u5c06\u6bcf\u4e2a\u5c0f\u6279\u91cf\u5185\u7684\u6fc0\u6d3b\u503c\u5f52\u4e00\u5316\u4e3a\u96f6\u5747\u503c\u548c\u5355\u4f4d\u65b9\u5dee\uff0c\u7136\u540e\u5e94\u7528\u53ef\u5b66\u4e60\u7684\u7f29\u653e\u548c\u5e73\u79fb\uff08\u7b2c 06 \u7ae0\uff09\u3002\u5728 CNN \u4e2d\uff0c\u6279\u5f52\u4e00\u5316\u6309\u901a\u9053\u5e94\u7528\uff1a\u7edf\u8ba1\u91cf\u5728\u8de8\u6279\u6b21\u548c\u7a7a\u95f4\u7ef4\u5ea6\u4e0a\u4e3a\u6bcf\u4e2a\u901a\u9053\u72ec\u7acb\u8ba1\u7b97\u3002\u5b83\u7a33\u5b9a\u4e86\u8bad\u7ec3\uff0c\u5141\u8bb8\u4f7f\u7528\u66f4\u9ad8\u7684\u5b66\u4e60\u7387\uff0c\u5e76\u8d77\u5230\u8f7b\u5ea6\u6b63\u5219\u5316\u7684\u4f5c\u7528\u3002
\u4e22\u5f03\u6cd5\uff08\u7b2c 06 \u7ae0\uff09\u5728\u8bad\u7ec3\u671f\u95f4\u968f\u673a\u5c06\u795e\u7ecf\u5143\u7f6e\u96f6\u3002
\u5728 CNN \u4e2d\uff0c\u7a7a\u95f4\u4e22\u5f03\u6cd5\uff08Dropout2D\uff09 \u4e22\u5f03\u6574\u4e2a\u7279\u5f81\u56fe\u901a\u9053\u800c\u975e\u5355\u4e2a\u50cf\u7d20\uff0c\u8fd9\u66f4\u4e3a\u6709\u6548\uff0c\u56e0\u4e3a\u7279\u5f81\u56fe\u4e2d\u76f8\u90bb\u50cf\u7d20\u9ad8\u5ea6\u76f8\u5173\u3002
\u6570\u636e\u589e\u5e7f\u901a\u8fc7\u5728\u8bad\u7ec3\u671f\u95f4\u5bf9\u6bcf\u5f20\u56fe\u50cf\u5e94\u7528\u968f\u673a\u53d8\u6362\u6765\u4eba\u4e3a\u5730\u6269\u5c55\u8bad\u7ec3\u96c6\uff1a\u6c34\u5e73\u7ffb\u8f6c\u3001\u968f\u673a\u88c1\u526a\u3001\u65cb\u8f6c\u3001\u989c\u8272\u6296\u52a8\uff08\u8c03\u6574\u4eae\u5ea6\u3001\u5bf9\u6bd4\u5ea6\u3001\u9971\u548c\u5ea6\u3001\u8272\u8c03\uff09\u4ee5\u53ca cutout\uff08\u906e\u6321\u968f\u673a\u77e9\u5f62\u533a\u57df\uff09\u3002\u7f51\u7edc\u4ee5\u591a\u79cd\u4e0d\u540c\u5f62\u5f0f\u770b\u5230\u6bcf\u5f20\u56fe\u50cf\uff0c\u8feb\u4f7f\u5176\u5b66\u4e60\u53d8\u6362\u4e0d\u53d8\u7684\u7279\u5f81\uff0c\u800c\u975e\u8bb0\u5fc6\u7279\u5b9a\u7684\u50cf\u7d20\u6a21\u5f0f\u3002
\u9ad8\u7ea7\u589e\u5e7f\u7b56\u7565\u5305\u62ec Mixup\uff08\u6df7\u5408\u4e24\u5f20\u56fe\u50cf\u53ca\u5176\u6807\u7b7e\uff1a\\(\\tilde{x} = \\lambda x_i + (1-\\lambda) x_j\\)\uff0c\\(\\tilde{y} = \\lambda y_i + (1-\\lambda) y_j\\)\uff09\u3001CutMix\uff08\u5c06\u4e00\u5f20\u56fe\u50cf\u7684\u77e9\u5f62\u533a\u57df\u7c98\u8d34\u5230\u53e6\u4e00\u5f20\u56fe\u50cf\u4e0a\uff0c\u5e76\u6309\u9762\u79ef\u6bd4\u4f8b\u6df7\u5408\u6807\u7b7e\uff09\u4ee5\u53ca RandAugment\uff08\u4ece\u4e00\u4e2a\u56fa\u5b9a\u96c6\u5408\u4e2d\u968f\u673a\u91c7\u6837\u4e00\u7cfb\u5217\u589e\u5e7f\u64cd\u4f5c\uff0c\u4f7f\u7528\u5355\u4e00\u7684\u5f3a\u5ea6\u53c2\u6570\uff09\u3002
CNN \u67b6\u6784\u7684\u5386\u53f2\u662f\u4e00\u4e2a\u9010\u6b65\u8d70\u5411\u66f4\u6df1\u3001\u66f4\u9ad8\u6548\u8bbe\u8ba1\u7684\u6545\u4e8b\uff0c\u6bcf\u4e00\u6b65\u90fd\u89e3\u51b3\u4e86\u9650\u5236\u524d\u4ee3\u67b6\u6784\u7684\u95ee\u9898\u3002
LeNet-5\uff08LeCun \u7b49\u4eba\uff0c1998 \u5e74\uff09\u662f\u6700\u65e9\u7684 CNN\uff0c\u4e13\u4e3a\u624b\u5199\u6570\u5b57\u8bc6\u522b\u8bbe\u8ba1\u3002\u4e24\u4e2a\u5377\u79ef\u5c42\u540e\u63a5\u4e09\u4e2a\u5168\u8fde\u63a5\u5c42\uff0c\u4f7f\u7528\u5e73\u5747\u6c60\u5316\u548c tanh \u6fc0\u6d3b\u51fd\u6570\u3002\u5b83\u8bc1\u660e\u4e86\u5b66\u4e60\u5230\u7684\u6ee4\u6ce2\u5668\u4f18\u4e8e\u624b\u5de5\u8bbe\u8ba1\u7684\u7279\u5f81\uff0c\u4f46\u6309\u73b0\u4ee3\u6807\u51c6\u6765\u770b\u5f88\u5c0f\uff086 \u4e07\u4e2a\u53c2\u6570\uff09\u3002
AlexNet\uff08Krizhevsky \u7b49\u4eba\uff0c2012 \u5e74\uff09\u4ee5\u5de8\u5927\u4f18\u52bf\u8d62\u5f97\u4e86 ImageNet \u7ade\u8d5b\uff0c\u5f15\u53d1\u4e86\u6df1\u5ea6\u5b66\u4e60\u9769\u547d\u3002\u5173\u952e\u521b\u65b0\uff1aReLU \u6fc0\u6d3b\u51fd\u6570\uff08\u53d6\u4ee3\u4e86\u5b58\u5728\u68af\u5ea6\u6d88\u5931\u95ee\u9898\u7684 tanh\uff09\u3001\u7528\u4e8e\u6b63\u5219\u5316\u7684\u4e22\u5f03\u6cd5\u3001\u6570\u636e\u589e\u5e7f\u4ee5\u53ca\u5728 GPU \u4e0a\u8bad\u7ec3\u3002\u4e94\u4e2a\u5377\u79ef\u5c42\uff0c\u4e09\u4e2a\u5168\u8fde\u63a5\u5c42\uff0c6000 \u4e07\u4e2a\u53c2\u6570\u3002
VGG\uff08Simonyan \u548c Zisserman\uff0c2014 \u5e74\uff09\u8bc1\u660e\uff0c\u4ec5\u4f7f\u7528 3x3 \u6ee4\u6ce2\u5668\u5e76\u6df1\u5c42\u5806\u53e0\u6548\u679c\u4f18\u4e8e\u66f4\u5927\u7684\u6ee4\u6ce2\u5668\u3002\u4e24\u4e2a\u5806\u53e0\u7684 3x3 \u6ee4\u6ce2\u5668\u5177\u6709\u4e0e\u4e00\u4e2a 5x5 \u6ee4\u6ce2\u5668\u76f8\u540c\u7684\u611f\u53d7\u91ce\uff0c\u4f46\u53c2\u6570\u66f4\u5c11\uff08\\(2 \\times 3^2 = 18\\) \u5bf9\u6bd4 \\(5^2 = 25\\)\uff09\u4e14\u591a\u4e86\u4e00\u4e2a\u975e\u7ebf\u6027\u5c42\u3002VGG-16\uff0816 \u5c42\uff09\u548c VGG-19\uff0819 \u5c42\uff09\u81f3\u4eca\u4ecd\u88ab\u5e7f\u6cdb\u7528\u4f5c\u7279\u5f81\u63d0\u53d6\u5668\u3002\u67b6\u6784\u975e\u5e38\u7b80\u5355\uff1a\u5377\u79ef\u5757\u901a\u9053\u6570\u9012\u589e\uff0864\u3001128\u3001256\u3001512\uff09\uff0c\u6bcf\u4e2a\u5757\u540e\u63a5\u6700\u5927\u6c60\u5316\u3002
Inception \u6a21\u5757\u540c\u65f6\u6355\u83b7\u591a\u4e2a\u5c3a\u5ea6\u7684\u7279\u5f81\u30021x1 \u6ee4\u6ce2\u5668\u6355\u83b7\u9010\u70b9\u6a21\u5f0f\uff0c3x3 \u6355\u83b7\u5c40\u90e8\u7eb9\u7406\uff0c5x5 \u6355\u83b7\u66f4\u5927\u7684\u7ed3\u6784\u3002\u62fc\u63a5\u5c06\u6240\u6709\u89c6\u89d2\u7ec4\u5408\u6210\u4e30\u5bcc\u7684\u8868\u793a\u3002
ResNet\uff08He \u7b49\u4eba\uff0c2016 \u5e74\uff09\u89e3\u51b3\u4e86\u9000\u5316\u95ee\u9898\uff1a\u66f4\u6df1\u7684\u7f51\u7edc\u8868\u73b0\u53cd\u800c\u4e0d\u5982\u8f83\u6d45\u7684\u7f51\u7edc\uff0c\u8fd9\u4e0d\u662f\u56e0\u4e3a\u8fc7\u62df\u5408\uff0c\u800c\u662f\u56e0\u4e3a\u66f4\u6df1\u7684\u7f51\u7edc\u66f4\u96be\u4f18\u5316\u3002\u89e3\u51b3\u65b9\u6848\u662f\u8df3\u8dc3\u8fde\u63a5\uff08\u6b8b\u5dee\u8fde\u63a5\uff09\uff1a
\u5f53\u8f93\u5165\u548c\u8f93\u51fa\u7ef4\u5ea6\u4e0d\u540c\u65f6\uff08\u7531\u4e8e\u6b65\u957f\u6216\u901a\u9053\u6570\u53d8\u5316\uff09\uff0c\u6295\u5f71\u6377\u5f84\u4f1a\u5e94\u7528\u4e00\u4e2a 1x1 \u5377\u79ef\u6765\u5339\u914d \\(x\\) \u7684\u7ef4\u5ea6\uff1a\\(\\text{output} = F(x) + W_s x\\)\u3002
\u74f6\u9888\u5757\uff08\u7528\u4e8e ResNet-50 \u53ca\u66f4\u6df1\u7248\u672c\uff09\u4f7f\u7528\u4e09\u4e2a\u5377\u79ef\uff1a1x1 \u964d\u901a\u9053\uff0c3x3 \u8fdb\u884c\u7a7a\u95f4\u5904\u7406\uff0c1x1 \u518d\u5c06\u901a\u9053\u6570\u6062\u590d\u3002\u8fd9\u6bd4\u4e24\u4e2a 3x3 \u5377\u79ef\u8ba1\u7b97\u91cf\u66f4\u5c0f\uff0c\u5141\u8bb8\u6784\u5efa\u66f4\u6df1\u7684\u7f51\u7edc\u3002
DenseNet\uff08Huang \u7b49\u4eba\uff0c2017 \u5e74\uff09\u5c06\u8df3\u8dc3\u8fde\u63a5\u7684\u601d\u60f3\u8fdb\u4e00\u6b65\u63a8\u8fdb\uff1a\u5728\u4e00\u4e2a\u5bc6\u96c6\u5757\u5185\uff0c\u6bcf\u4e00\u5c42\u90fd\u4e0e\u6240\u6709\u540e\u7eed\u5c42\u76f8\u8fde\u3002\u7b2c \\(l\\) \u5c42\u63a5\u6536\u524d\u9762\u6240\u6709\u5c42\u7684\u7279\u5f81\u56fe\u4f5c\u4e3a\u8f93\u5165\uff1a\\(x_l = H_l([x_0, x_1, \\ldots, x_{l-1}])\\)\uff0c\u5176\u4e2d \\([\\cdot]\\) \u8868\u793a\u6cbf\u901a\u9053\u7ef4\u5ea6\u7684\u62fc\u63a5\u3002\u8fd9\u4fc3\u8fdb\u4e86\u7279\u5f81\u590d\u7528\uff0c\u589e\u5f3a\u4e86\u68af\u5ea6\u6d41\u52a8\uff0c\u5e76\u51cf\u5c11\u4e86\u603b\u53c2\u6570\u91cf\u3002
\u9ad8\u6548\u67b6\u6784\u9762\u5411\u79fb\u52a8\u8bbe\u5907\u548c\u8fb9\u7f18\u786c\u4ef6\u4e0a\u7684\u90e8\u7f72\uff0c\u8fd9\u4e9b\u573a\u666f\u4e0b\u8ba1\u7b97\u3001\u5185\u5b58\u548c\u80fd\u8017\u90fd\u53d7\u5230\u9650\u5236\u3002
MobileNet\uff08Howard \u7b49\u4eba\uff0c2017 \u5e74\uff09\u7528\u6df1\u5ea6\u53ef\u5206\u79bb\u5377\u79ef\u53d6\u4ee3\u4e86\u6807\u51c6\u5377\u79ef\uff0c\u5c06\u64cd\u4f5c\u5206\u89e3\u4e3a\u4e24\u4e2a\u6b65\u9aa4\uff1a
\u4e00\u4e2a\u6807\u51c6 \\(k \\times k\\) \u5377\u79ef\uff0c\u8f93\u5165\u901a\u9053\u6570\u4e3a \\(C_{\\text{in}}\\)\uff0c\u8f93\u51fa\u901a\u9053\u6570\u4e3a \\(C_{\\text{out}}\\)\uff0c\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u9700\u8981 \\(k^2 \\cdot C_{\\text{in}} \\cdot C_{\\text{out}}\\) \u6b21\u4e58\u6cd5\u3002\u6df1\u5ea6\u53ef\u5206\u79bb\u5377\u79ef\u9700\u8981 \\(k^2 \\cdot C_{\\text{in}} + C_{\\text{in}} \\cdot C_{\\text{out}}\\) \u6b21\uff0c\u51cf\u5c11\u4e86\u5927\u7ea6 \\(k^2\\) \u500d\u3002\u5bf9\u4e8e 3x3 \u6ee4\u6ce2\u5668\uff0c\u8fd9\u5927\u7ea6\u4fbf\u5b9c 9 \u500d\u3002
MobileNet-V2 \u5f15\u5165\u4e86\u9006\u6b8b\u5dee\u5757\uff1a\u5148\u7528 1x1 \u5377\u79ef\u6269\u5c55\u901a\u9053\uff0c\u5728\u6269\u5c55\u7a7a\u95f4\u4e2d\u5e94\u7528\u6df1\u5ea6\u5377\u79ef\uff0c\u518d\u7528 1x1 \u5377\u79ef\u6295\u5f71\u56de\u4f4e\u7ef4\u3002\u8df3\u8dc3\u8fde\u63a5\u653e\u7f6e\u5728\u7a84\uff08\u74f6\u9888\uff09\u5c42\u4e0a\uff0c\u4e0e ResNet \u7684\u6a21\u5f0f\u76f8\u53cd\u3002\u6269\u5c55\u7387\u901a\u5e38\u4e3a 6\u3002
EfficientNet\uff08Tan \u548c Le\uff0c2019 \u5e74\uff09\u5f15\u5165\u4e86\u590d\u5408\u7f29\u653e\uff1a\u4e0d\u662f\u72ec\u7acb\u5730\u4ec5\u7f29\u653e\u6df1\u5ea6\u3001\u6216\u4ec5\u7f29\u653e\u5bbd\u5ea6\u3001\u6216\u4ec5\u7f29\u653e\u5206\u8fa8\u7387\uff0c\u800c\u662f\u4f7f\u7528\u56fa\u5b9a\u6bd4\u4f8b\u540c\u65f6\u7f29\u653e\u6240\u6709\u4e09\u4e2a\u7ef4\u5ea6\u3002\u7ed9\u5b9a\u7f29\u653e\u7cfb\u6570 \\(\\phi\\)\uff1a
ShuffleNet \u901a\u8fc7\u4f7f\u7528\u5206\u7ec4\u5377\u79ef\u540e\u63a5\u901a\u9053\u6df7\u6d17\u6765\u964d\u4f4e 1x1 \u5377\u79ef\uff08\u5728 MobileNet \u98ce\u683c\u7684\u67b6\u6784\u4e2d\u5360\u4e3b\u5bfc\uff09\u7684\u6210\u672c\u3002\u5206\u7ec4\u5377\u79ef\u5c06\u901a\u9053\u5206\u6210\u591a\u4e2a\u7ec4\uff0c\u5728\u6bcf\u4e2a\u7ec4\u5185\u72ec\u7acb\u8fdb\u884c\u5377\u79ef\uff0c\u4f46\u8fd9\u963b\u6b62\u4e86\u8de8\u7ec4\u7684\u4fe1\u606f\u6d41\u52a8\u3002\u6df7\u6d17\u64cd\u4f5c\u5728\u7ec4\u4e4b\u95f4\u91cd\u65b0\u6392\u5217\u901a\u9053\uff0c\u4ee5\u53ef\u5ffd\u7565\u4e0d\u8ba1\u7684\u6210\u672c\u6062\u590d\u4e86\u4fe1\u606f\u6df7\u5408\u3002
\u8fc1\u79fb\u5b66\u4e60\u662f\u5c06\u5728\u4e00\u4e2a\u4efb\u52a1\u4e0a\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u9002\u914d\u5230\u4e0d\u540c\u4efb\u52a1\u7684\u5b9e\u8df5\u3002\u5728\u8ba1\u7b97\u673a\u89c6\u89c9\u4e2d\uff0c\u8fd9\u51e0\u4e4e\u603b\u662f\u610f\u5473\u7740\u4ece\u4e00\u4e2a\u5728 ImageNet\uff08140 \u4e07\u5f20\u56fe\u50cf\uff0c1000 \u4e2a\u7c7b\u522b\uff09\u4e0a\u9884\u8bad\u7ec3\u7684\u6a21\u578b\u5f00\u59cb\uff0c\u9002\u914d\u5230\u7279\u5b9a\u9886\u57df\u7684\u6570\u636e\u96c6\uff08\u533b\u5b66\u56fe\u50cf\u3001\u536b\u661f\u56fe\u50cf\u3001\u5236\u9020\u7f3a\u9677\u68c0\u6d4b\uff09\u3002
\u7279\u5f81\u63d0\u53d6\uff1a\u51bb\u7ed3\u6240\u6709\u5377\u79ef\u5c42\uff0c\u79fb\u9664\u6700\u7ec8\u7684\u5206\u7c7b\u5934\uff0c\u4ec5\u5728\u4e0a\u9762\u8bad\u7ec3\u4e00\u4e2a\u65b0\u7684\u5206\u7c7b\u5934\u3002\u51bb\u7ed3\u7684\u5c42\u5145\u5f53\u901a\u7528\u7279\u5f81\u63d0\u53d6\u5668\u3002\u5f53\u76ee\u6807\u57df\u4e0e ImageNet \u76f8\u4f3c\u4e14\u76ee\u6807\u6570\u636e\u96c6\u8f83\u5c0f\u65f6\uff0c\u8fd9\u79cd\u65b9\u6cd5\u6548\u679c\u5f88\u597d\u3002
\u5fae\u8c03\uff1a\u89e3\u51bb\u90e8\u5206\u6216\u5168\u90e8\u5377\u79ef\u5c42\uff0c\u4ee5\u8f83\u5c0f\u7684\u5b66\u4e60\u7387\u8fdb\u884c\u8bad\u7ec3\u3002\u9884\u8bad\u7ec3\u7684\u6743\u91cd\u4f5c\u4e3a\u8d77\u70b9\u800c\u975e\u56fa\u5b9a\u7279\u5f81\u3002\u5fae\u8c03\u901a\u5e38\u5148\u89e3\u51bb\u540e\u9762\u7684\u5c42\uff08\u8fd9\u4e9b\u5c42\u6355\u83b7\u9ad8\u7ea7\u7684\u3001\u4efb\u52a1\u7279\u5b9a\u7684\u7279\u5f81\uff09\uff0c\u518d\u6839\u636e\u9700\u8981\u89e3\u51bb\u66f4\u65e9\u7684\u5c42\u3002
\u8fc1\u79fb\u5b66\u4e60\u4e4b\u6240\u4ee5\u6709\u6548\uff0c\u662f\u56e0\u4e3a CNN \u7684\u65e9\u671f\u5c42\u5b66\u4e60\u901a\u7528\u7279\u5f81\uff08\u8fb9\u7f18\u3001\u7eb9\u7406\u3001\u989c\u8272\uff09\uff0c\u8fd9\u4e9b\u7279\u5f81\u5bf9\u5404\u79cd\u4efb\u52a1\u90fd\u6709\u7528\uff0c\u800c\u540e\u9762\u5c42\u5b66\u4e60\u4efb\u52a1\u7279\u5b9a\u7684\u7279\u5f81\u3002\u4e00\u4e2a\u7528\u4e8e\u5206\u7c7b\u52a8\u7269\u7684\u7f51\u7edc\uff0c\u5176\u8fb9\u7f18\u68c0\u6d4b\u5668\u5bf9\u5206\u7c7b\u5efa\u7b51\u7269\u4ecd\u7136\u6709\u7528\u3002
\u53ef\u89c6\u5316 CNN \u53ef\u4ee5\u63ed\u793a\u7f51\u7edc\u5b66\u5230\u4e86\u4ec0\u4e48\uff0c\u5e76\u5e2e\u52a9\u8c03\u8bd5\u610f\u5916\u884c\u4e3a\u3002
\u6fc0\u6d3b\u56fe\uff08\u7279\u5f81\u56fe\uff09\u5c55\u793a\u4e86\u7ed9\u5b9a\u8f93\u5165\u56fe\u50cf\u4e0b\u6bcf\u4e2a\u6ee4\u6ce2\u5668\u7684\u8f93\u51fa\u3002\u65e9\u671f\u5c42\u7684\u6fc0\u6d3b\u56fe\u770b\u8d77\u6765\u50cf\u8fb9\u7f18\u56fe\uff1b\u66f4\u6df1\u5c42\u7684\u6fc0\u6d3b\u56fe\u5219\u8d8a\u6765\u8d8a\u62bd\u8c61\uff0c\u7a7a\u95f4\u4e0a\u8d8a\u6765\u8d8a\u7c97\u7cd9\u3002
Grad-CAM\uff08\u68af\u5ea6\u52a0\u6743\u7c7b\u522b\u6fc0\u6d3b\u6620\u5c04\uff0cSelvaraju \u7b49\u4eba\uff0c2017 \u5e74\uff09\u9ad8\u4eae\u4e86\u8f93\u5165\u56fe\u50cf\u4e2d\u5bf9\u6a21\u578b\u9884\u6d4b\u6700\u91cd\u8981\u7684\u533a\u57df\u3002\u5176\u5de5\u4f5c\u539f\u7406\u662f\uff1a
\u7279\u5f81\u53cd\u6f14\u901a\u8fc7\u4f18\u5316\u4e00\u5f20\u968f\u673a\u56fe\u50cf\u4f7f\u5176\u5339\u914d\u76ee\u6807\u7279\u5f81\uff08\u5bf9\u50cf\u7d20\u503c\u8fdb\u884c\u68af\u5ea6\u4e0b\u964d\uff09\uff0c\u4ece\u7279\u5f81\u8868\u793a\u4e2d\u91cd\u5efa\u8f93\u5165\u56fe\u50cf\u3002\u8fd9\u63ed\u793a\u4e86\u7f51\u7edc\u5728\u5404\u5c42\u4fdd\u7559\u4e86\u54ea\u4e9b\u4fe1\u606f\u3002\u6d45\u5c42\u51e0\u4e4e\u80fd\u5b8c\u7f8e\u91cd\u5efa\u56fe\u50cf\uff1b\u6df1\u5c42\u4ea7\u751f\u7684\u56fe\u50cf\u53ef\u8bc6\u522b\u4f46\u6709\u6240\u626d\u66f2\uff0c\u8fd9\u8868\u660e\u7cbe\u7ec6\u7684\u7a7a\u95f4\u7ec6\u8282\u4e22\u5931\u4e86\uff0c\u800c\u8bed\u4e49\u5185\u5bb9\u5f97\u4ee5\u4fdd\u7559\u3002
Deep Dream \u548c\u795e\u7ecf\u98ce\u683c\u8fc1\u79fb\u662f\u7279\u5f81\u53ef\u89c6\u5316\u7684\u521b\u610f\u5e94\u7528\u3002Deep Dream \u6700\u5927\u5316\u9009\u5b9a\u5c42\u4e2d\u795e\u7ecf\u5143\u7684\u6fc0\u6d3b\uff0c\u4ea7\u751f\u8d85\u73b0\u5b9e\u7684\u3001\u653e\u5927\u6a21\u5f0f\u7684\u56fe\u50cf\u3002\u795e\u7ecf\u98ce\u683c\u8fc1\u79fb\u4f18\u5316\u76ee\u6807\u56fe\u50cf\uff0c\u4f7f\u5176\u540c\u65f6\u5339\u914d\u4e00\u5f20\u56fe\u50cf\u7684\u5185\u5bb9\u7279\u5f81\uff08\u6765\u81ea\u6df1\u5c42\uff09\u548c\u53e6\u4e00\u5f20\u56fe\u50cf\u7684\u98ce\u683c\u7279\u5f81\uff08\u6ee4\u6ce2\u5668\u6fc0\u6d3b\u7684 Gram \u77e9\u9635\uff0c\u6355\u83b7\u7eb9\u7406\u7edf\u8ba1\u4fe1\u606f\uff09\u3002
\u7528 JAX \u4ece\u5934\u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684 CNN\uff0c\u5305\u542b\u4e24\u4e2a\u5377\u79ef\u5c42\u3001\u6700\u5927\u6c60\u5316\u548c\u4e00\u4e2a\u5206\u7c7b\u5934\u3002\u5728\u4e00\u4e2a\u5408\u6210\u7684\u4e8c\u7ef4\u6a21\u5f0f\u5206\u7c7b\u4efb\u52a1\u4e0a\u8bad\u7ec3\u5b83\u3002
import jax\nimport jax.numpy as jnp\nimport jax.lax as lax\nimport matplotlib.pyplot as plt\n\ndef conv2d(x, kernel, stride=1):\n \"\"\"\u7b80\u5355 2D \u5377\u79ef\uff0c\u5355\u8f93\u5165\uff0c\u5355\u6ee4\u6ce2\u5668\u3002\"\"\"\n return lax.conv(x[None, None], kernel[None, None], (stride, stride), 'SAME')[0, 0]\n\ndef max_pool(x, size=2):\n \"\"\"2x2 \u6700\u5927\u6c60\u5316\u3002\"\"\"\n H, W = x.shape\n x = x[:H//size*size, :W//size*size]\n return x.reshape(H//size, size, W//size, size).max(axis=(1, 3))\n\ndef init_cnn(key):\n k1, k2, k3 = jax.random.split(key, 3)\n return {\n 'conv1': jax.random.normal(k1, (5, 5)) * 0.3,\n 'conv2': jax.random.normal(k2, (3, 3)) * 0.3,\n 'fc_w': jax.random.normal(k3, (64, 1)) * 0.1,\n 'fc_b': jnp.zeros(1),\n }\n\ndef forward_cnn(params, img):\n # Conv1 -> ReLU -> Pool\n h = jnp.maximum(0, conv2d(img, params['conv1']))\n h = max_pool(h)\n # Conv2 -> ReLU -> Pool\n h = jnp.maximum(0, conv2d(h, params['conv2']))\n h = max_pool(h)\n # Flatten and classify\n flat = h.ravel()\n # Pad or truncate to fixed size\n flat = jnp.pad(flat, (0, max(0, 64 - len(flat))))[:64]\n logit = (flat @ params['fc_w'] + params['fc_b']).squeeze()\n return jax.nn.sigmoid(logit)\n\n# Generate synthetic data: class 0 = low-freq pattern, class 1 = high-freq\ndef make_data(key, n=200):\n images, labels = [], []\n for i in range(n):\n k1, key = jax.random.split(key)\n x, y = jnp.meshgrid(jnp.linspace(0, 4*jnp.pi, 32), jnp.linspace(0, 4*jnp.pi, 32))\n if i < n // 2:\n img = jnp.sin(x) + jax.random.normal(k1, (32, 32)) * 0.1\n labels.append(0)\n else:\n img = jnp.sin(4 * x) * jnp.sin(4 * y) + jax.random.normal(k1, (32, 32)) * 0.1\n labels.append(1)\n images.append(img)\n return images, jnp.array(labels, dtype=jnp.float32)\n\nkey = jax.random.PRNGKey(42)\nimages, labels = make_data(key)\nparams = init_cnn(jax.random.PRNGKey(0))\n\ndef loss_fn(params, img, label):\n pred = forward_cnn(params, img)\n return -(label * jnp.log(pred + 1e-7) + (1 - label) * jnp.log(1 - pred + 1e-7))\n\ngrad_fn = jax.grad(loss_fn)\nlr = 0.01\n\nfor epoch in range(5):\n total_loss = 0.0\n for img, label in zip(images, labels):\n grads = grad_fn(params, img, label)\n params = {k: params[k] - lr * grads[k] for k in params}\n total_loss += loss_fn(params, img, label)\n print(f\"Epoch {epoch}: loss = {total_loss / len(images):.4f}\")\n\n# Test accuracy\npreds = jnp.array([forward_cnn(params, img) > 0.5 for img in images])\nacc = jnp.mean(preds == labels)\nprint(f\"Accuracy: {acc:.2%}\")\n \u53ef\u89c6\u5316\u4e0d\u540c\u6ee4\u6ce2\u5668\u5927\u5c0f\u5982\u4f55\u5f71\u54cd\u611f\u53d7\u91ce\u3002\u5c55\u793a\u4e24\u4e2a\u5806\u53e0\u7684 3x3 \u6ee4\u6ce2\u5668\u4e0e\u4e00\u4e2a 5x5 \u6ee4\u6ce2\u5668\u8986\u76d6\u76f8\u540c\u7684\u611f\u53d7\u91ce\uff0c\u4f46\u53c2\u6570\u66f4\u5c11\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef compute_receptive_field(layers):\n \"\"\"\u4ece\u4e00\u7ec4 (kernel_size, stride) \u5143\u7ec4\u8ba1\u7b97\u611f\u53d7\u91ce\u5927\u5c0f\u3002\"\"\"\n rf = 1 # \u4ece 1 \u4e2a\u50cf\u7d20\u5f00\u59cb\n stride_product = 1\n for k, s in layers:\n rf += (k - 1) * stride_product\n stride_product *= s\n return rf\n\n# Compare architectures\nconfigs = {\n 'Single 5x5': [(5, 1)],\n 'Two 3x3': [(3, 1), (3, 1)],\n 'Three 3x3': [(3, 1), (3, 1), (3, 1)],\n 'Single 7x7': [(7, 1)],\n '3x3 stride 2 + 3x3': [(3, 2), (3, 1)],\n}\n\nprint(f\"{'Config':<25} {'RF':>4} {'Params (per channel)':>20}\")\nprint('-' * 55)\nfor name, layers in configs.items():\n rf = compute_receptive_field(layers)\n # Parameters: sum of k^2 for each layer (per input-output channel pair)\n params = sum(k * k for k, s in layers)\n print(f\"{name:<25} {rf:>4} {params:>20}\")\n\n# Visualise receptive fields\nfig, axes = plt.subplots(1, 3, figsize=(14, 4))\nfor ax, (name, rf_size) in zip(axes, [('5x5 filter', 5), ('Two 3x3 filters', 5), ('Three 3x3 filters', 7)]):\n grid = jnp.zeros((9, 9))\n c = 4 # centre\n half = rf_size // 2\n grid = grid.at[c-half:c+half+1, c-half:c+half+1].set(1.0)\n ax.imshow(grid, cmap='Blues', vmin=0, vmax=1)\n ax.set_title(f'{name}\\nRF = {rf_size}x{rf_size}')\n ax.set_xticks(range(9)); ax.set_yticks(range(9))\n ax.grid(True, alpha=0.3)\nplt.suptitle('Receptive Field Comparison')\nplt.tight_layout(); plt.show()\n \u4ece\u5934\u5b9e\u73b0 Grad-CAM\u3002\u7ed9\u5b9a\u4e00\u4e2a\u9884\u6784\u5efa\u7684\u7b80\u5355 CNN\uff0c\u8ba1\u7b97\u9488\u5bf9\u7279\u5b9a\u7c7b\u522b\u7684\u68af\u5ea6\u52a0\u6743\u6fc0\u6d3b\u56fe\uff0c\u5e76\u5c06\u5176\u53ef\u89c6\u5316\u4e3a\u70ed\u529b\u56fe\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef simple_cnn(params, img):\n \"\"\"\u8fd4\u56de\u9884\u6d4b\u548c\u6700\u540e\u4e00\u4e2a\u5377\u79ef\u5c42\u6fc0\u6d3b\u7684\u7b80\u5355 CNN\u3002\"\"\"\n # Conv layer (our \"last conv layer\" for Grad-CAM)\n H, W = img.shape\n k = params['conv'].shape[0]\n pad = k // 2\n img_pad = jnp.pad(img, pad, mode='edge')\n activation_map = jnp.zeros((H, W))\n for i in range(H):\n for j in range(W):\n activation_map = activation_map.at[i, j].set(\n jnp.sum(img_pad[i:i+k, j:j+k] * params['conv'])\n )\n activation_map = jnp.maximum(0, activation_map) # ReLU\n\n # Global average pool -> dense -> output\n pooled = activation_map.mean()\n logit = pooled * params['w'] + params['b']\n return jax.nn.sigmoid(logit), activation_map\n\n# Create test image: bright region on the left (class indicator)\nimg = jnp.zeros((32, 32))\nimg = img.at[8:24, 4:16].set(1.0)\nimg = img.at[5:10, 20:28].set(0.3)\n\nkey = jax.random.PRNGKey(42)\nparams = {\n 'conv': jax.random.normal(key, (5, 5)) * 0.3,\n 'w': jnp.array(2.0),\n 'b': jnp.array(-0.5),\n}\n\n# Compute Grad-CAM\ndef class_score(params, img):\n pred, _ = simple_cnn(params, img)\n return pred\n\n# Get activation map and gradients\npred, act_map = simple_cnn(params, img)\ngrad_fn = jax.grad(lambda img: simple_cnn(params, img)[0])\nimg_grad = grad_fn(img)\n\n# Weight = global average of gradients (simplified 1-channel Grad-CAM)\nalpha = img_grad.mean()\ngrad_cam = jnp.maximum(0, alpha * act_map) # ReLU\ngrad_cam = (grad_cam - grad_cam.min()) / (grad_cam.max() - grad_cam.min() + 1e-8)\n\nfig, axes = plt.subplots(1, 3, figsize=(14, 4))\naxes[0].imshow(img, cmap='gray'); axes[0].set_title('Input Image'); axes[0].axis('off')\naxes[1].imshow(act_map, cmap='viridis'); axes[1].set_title('Activation Map'); axes[1].axis('off')\naxes[2].imshow(img, cmap='gray', alpha=0.6)\naxes[2].imshow(grad_cam, cmap='jet', alpha=0.4)\naxes[2].set_title(f'Grad-CAM (pred={pred:.2f})'); axes[2].axis('off')\nplt.tight_layout(); plt.show()\n \u6bd4\u8f83\u6df1\u5ea6\u53ef\u5206\u79bb\u5377\u79ef\u4e0e\u6807\u51c6\u5377\u79ef\u3002\u7edf\u8ba1\u4e24\u8005\u7684\u53c2\u6570\u548c FLOPs\uff0c\u5e76\u5c55\u793a\u5b83\u4eec\u5728\u8ba1\u7b97\u91cf\u5c11\u5f97\u591a\u7684\u60c5\u51b5\u4e0b\u4ea7\u751f\u76f8\u4f3c\u7684\u8f93\u51fa\u3002
import jax\nimport jax.numpy as jnp\n\ndef standard_conv(x, kernel):\n \"\"\"\u6807\u51c6\u5377\u79ef\uff1a(H, W, C_in) * (k, k, C_in, C_out) -> (H, W, C_out)\u3002\"\"\"\n H, W, C_in = x.shape\n k, _, _, C_out = kernel.shape\n pad = k // 2\n x_pad = jnp.pad(x, ((pad, pad), (pad, pad), (0, 0)), mode='constant')\n out = jnp.zeros((H, W, C_out))\n for i in range(H):\n for j in range(W):\n patch = x_pad[i:i+k, j:j+k, :] # (k, k, C_in)\n for c in range(C_out):\n out = out.at[i, j, c].set(jnp.sum(patch * kernel[:, :, :, c]))\n return out\n\ndef depthwise_separable_conv(x, dw_kernel, pw_kernel):\n \"\"\"\u6df1\u5ea6\u53ef\u5206\u79bb\uff1a\u6df1\u5ea6\u5377\u79ef (k,k,C_in) \u7136\u540e\u9010\u70b9\u5377\u79ef (C_in, C_out)\u3002\"\"\"\n H, W, C_in = x.shape\n k = dw_kernel.shape[0]\n pad = k // 2\n x_pad = jnp.pad(x, ((pad, pad), (pad, pad), (0, 0)), mode='constant')\n\n # Depthwise: one filter per channel\n dw_out = jnp.zeros((H, W, C_in))\n for i in range(H):\n for j in range(W):\n for c in range(C_in):\n patch = x_pad[i:i+k, j:j+k, c]\n dw_out = dw_out.at[i, j, c].set(jnp.sum(patch * dw_kernel[:, :, c]))\n\n # Pointwise: 1x1 conv across channels\n out = dw_out @ pw_kernel\n return out\n\n# Setup\nH, W, C_in, C_out, k = 8, 8, 16, 32, 3\nkey = jax.random.PRNGKey(42)\nk1, k2, k3, k4 = jax.random.split(key, 4)\n\nx = jax.random.normal(k1, (H, W, C_in))\nstd_kernel = jax.random.normal(k2, (k, k, C_in, C_out)) * 0.1\ndw_kernel = jax.random.normal(k3, (k, k, C_in)) * 0.1\npw_kernel = jax.random.normal(k4, (C_in, C_out)) * 0.1\n\n# Compare\nstd_params = k * k * C_in * C_out\ndw_params = k * k * C_in + C_in * C_out\n\nstd_flops = H * W * k * k * C_in * C_out\ndw_flops = H * W * (k * k * C_in + C_in * C_out)\n\nprint(f\"Standard conv: {std_params:>8,} params, {std_flops:>10,} FLOPs\")\nprint(f\"Depthwise separable conv: {dw_params:>8,} params, {dw_flops:>10,} FLOPs\")\nprint(f\"Parameter reduction: {std_params / dw_params:.1f}x\")\nprint(f\"FLOP reduction: {std_flops / dw_flops:.1f}x\")\n\nstd_out = standard_conv(x, std_kernel)\nds_out = depthwise_separable_conv(x, dw_kernel, pw_kernel)\nprint(f\"\\nStandard output shape: {std_out.shape}\")\nprint(f\"Depthwise sep output shape: {ds_out.shape}\")\n \u76ee\u6807\u68c0\u6d4b\u5b9a\u4f4d\u5e76\u5206\u7c7b\u56fe\u50cf\u4e2d\u7684\u6bcf\u4e2a\u7269\u4f53\uff1b\u5206\u5272\u4e3a\u6bcf\u4e2a\u50cf\u7d20\u5206\u914d\u4e00\u4e2a\u6807\u7b7e\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u4ea4\u5e76\u6bd4\uff08IoU\uff09\u3001\u5e73\u5747\u7cbe\u5ea6\u5747\u503c\uff08mAP\uff09\u3001\u951a\u6846\u3001R-CNN\u7cfb\u5217\u3001YOLO\u3001SSD\u3001\u7279\u5f81\u91d1\u5b57\u5854\u7f51\u7edc\uff08FPN\uff09\u3001\u8bed\u4e49/\u5b9e\u4f8b/\u5168\u666f\u5206\u5272\uff08U-Net\u3001Mask R-CNN\u3001SAM\uff09\u4ee5\u53ca\u7528\u4e8e\u57fa\u51c6\u6d4b\u8bd5\u7684\u8bc4\u4f30\u6307\u6807\u3002
\u56fe\u50cf\u5206\u7c7b\uff08\u6587\u4ef602\uff09\u56de\u7b54\u4e86\"\u8fd9\u5f20\u56fe\u50cf\u91cc\u6709\u4ec0\u4e48\uff1f\"\u76ee\u6807\u68c0\u6d4b\u63d0\u51fa\u4e86\u4e00\u4e2a\u66f4\u96be\u7684\u95ee\u9898\uff1a\"\u8fd9\u5f20\u56fe\u50cf\u91cc\u6709\u54ea\u4e9b\u7269\u4f53\uff0c\u5b83\u4eec\u5728\u54ea\u91cc\uff1f\"
\u5206\u5272\u5219\u66f4\u8fdb\u4e00\u6b65\uff1a\"\u54ea\u4e9b\u50cf\u7d20\u5c5e\u4e8e\u54ea\u4e2a\u7269\u4f53\u6216\u7c7b\u522b\uff1f\"\u8fd9\u4e9b\u4efb\u52a1\u5f62\u6210\u4e86\u4e00\u4e2a\u7a7a\u95f4\u7406\u89e3\u7cbe\u5ea6\u9010\u6b65\u63d0\u9ad8\u7684\u5c42\u6b21\u7ed3\u6784\u3002
\u76ee\u6807\u68c0\u6d4b\u6a21\u578b\u8f93\u51fa\u4e00\u7ec4\u8fb9\u754c\u6846\uff0c\u6bcf\u4e2a\u8fb9\u754c\u6846\u7531\u56db\u4e2a\u5750\u6807\uff08\u5de6\u4e0a\u89d2 \\(x, y\\)\u3001\u5bbd\u5ea6\u3001\u9ad8\u5ea6\uff09\u4ee5\u53ca\u4e00\u4e2a\u5e26\u6709\u7f6e\u4fe1\u5ea6\u5206\u6570\u7684\u7c7b\u522b\u6807\u7b7e\u5b9a\u4e49\u3002\u4e00\u5f20\u56fe\u50cf\u53ef\u80fd\u5305\u542b\u96f6\u4e2a\u3001\u4e00\u4e2a\u6216\u6570\u767e\u4e2a\u6765\u81ea\u591a\u4e2a\u7c7b\u522b\u7684\u7269\u4f53\u3002
IoU\u4e3a1\u8868\u793a\u5b8c\u5168\u91cd\u53e0\uff0cIoU\u4e3a0\u8868\u793a\u5b8c\u5168\u4e0d\u91cd\u53e0\u3002\"\u6b63\u786e\"\u68c0\u6d4b\u7684\u6807\u51c6\u9608\u503c\u4e3aIoU \\(\\geq 0.5\\)\uff0c\u4f46\u4e5f\u4f7f\u7528\u66f4\u4e25\u683c\u7684\u9608\u503c\uff080.75\u30010.9\uff09\u3002
\u5982\u679c\u9884\u6d4b\u6846\u4e0e\u771f\u5b9e\u6846\u7684IoU\u8d85\u8fc7\u9608\u503c\u4e14\u7c7b\u522b\u6b63\u786e\uff0c\u5219\u68c0\u6d4b\u7ed3\u679c\u4e3a\u771f\u6b63\u4f8b\uff08TP\uff09\u3002
\u5047\u6b63\u4f8b\uff08FP\uff09\u662f\u672a\u5339\u914d\u5230\u4efb\u4f55\u771f\u5b9e\u6807\u6ce8\u7684\u9884\u6d4b\u6846\u3002
\u5047\u8d1f\u4f8b\uff08FN\uff09\u662f\u6ca1\u6709\u4efb\u4f55\u9884\u6d4b\u6846\u5339\u914d\u5230\u7684\u771f\u5b9e\u7269\u4f53\u3002\u8fd9\u4e9b\u4e0e\u7b2c06\u7ae0\u4e2d\u7684\u7cbe\u786e\u7387\u548c\u53ec\u56de\u7387\u6982\u5ff5\u76f8\u540c\u3002
\u5e73\u5747\u7cbe\u5ea6\uff08AP\uff09\u603b\u7ed3\u5355\u4e2a\u7c7b\u522b\u7684\u68c0\u6d4b\u8d28\u91cf\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u7c7b\u522b\uff0c\u6309\u7f6e\u4fe1\u5ea6\u5206\u6570\u5bf9\u6240\u6709\u68c0\u6d4b\u7ed3\u679c\u6392\u5e8f\uff0c\u8ba1\u7b97\u6bcf\u4e2a\u6392\u5e8f\u4f4d\u7f6e\u7684\u7cbe\u786e\u7387\u548c\u53ec\u56de\u7387\uff0c\u7136\u540e\u8ba1\u7b97\u7cbe\u786e\u7387-\u53ec\u56de\u7387\u66f2\u7ebf\u4e0b\u7684\u9762\u79ef\uff1a
\u5728\u5b9e\u8df5\u4e2d\uff0c\u66f2\u7ebf\u662f\u63d2\u503c\u5904\u7406\u7684\uff1a\u5728\u6bcf\u4e2a\u53ec\u56de\u7387\u6c34\u5e73\u4e0a\uff0c\u7cbe\u786e\u7387\u88ab\u8bbe\u7f6e\u4e3a\u6240\u6709\u53ec\u56de\u7387 \\(\\geq r\\) \u5904\u7684\u6700\u5927\u7cbe\u786e\u7387\u3002\u8fd9\u4f7f\u66f2\u7ebf\u5e73\u6ed1\u5e76\u4f7f\u5176\u5355\u8c03\u9012\u51cf\u3002
\u5e73\u5747\u7cbe\u5ea6\u5747\u503c\uff08mAP\uff09\u5bf9\u6240\u6709\u7c7b\u522b\u7684AP\u8fdb\u884c\u5e73\u5747\u3002\"mAP@0.5\"\u4f7f\u7528IoU\u9608\u503c0.5\u3002\"mAP@[.5:.95]\"\uff08COCO\u6807\u51c6\uff09\u5728\u4ece0.5\u52300.95\u7684\u5341\u4e2aIoU\u9608\u503c\u4e0a\uff08\u6b65\u957f0.05\uff09\u5bf9mAP\u8fdb\u884c\u5e73\u5747\uff0c\u540c\u65f6\u5956\u52b1\u68c0\u6d4b\u80fd\u529b\u548c\u7cbe\u786e\u7684\u5b9a\u4f4d\u80fd\u529b\u3002
\u975e\u6781\u5927\u503c\u6291\u5236\uff08NMS\uff09\u79fb\u9664\u91cd\u590d\u7684\u68c0\u6d4b\u7ed3\u679c\u3002\u5f53\u6a21\u578b\u4e3a\u540c\u4e00\u4e2a\u7269\u4f53\u9884\u6d4b\u51fa\u591a\u4e2a\u91cd\u53e0\u7684\u8fb9\u754c\u6846\u65f6\uff0cNMS\u4fdd\u7559\u7f6e\u4fe1\u5ea6\u6700\u9ad8\u7684\u6846\uff0c\u5e76\u79fb\u9664\u6240\u6709\u4e0e\u5176\u91cd\u53e0\u8d85\u8fc7IoU\u9608\u503c\u7684\u5176\u4ed6\u6846\u3002\u8fd9\u662f\u5728\u6a21\u578b\u751f\u6210\u539f\u59cb\u9884\u6d4b\u4e4b\u540e\uff0c\u6309\u6bcf\u4e2a\u7c7b\u522b\u5206\u522b\u8fdb\u884c\u7684\u3002
\u4e24\u9636\u6bb5\u68c0\u6d4b\u5668\u9996\u5148\u63d0\u51fa\u5019\u9009\u533a\u57df\uff0c\u7136\u540e\u5bf9\u6bcf\u4e2a\u63d0\u6848\u8fdb\u884c\u5206\u7c7b\u548c\u7cbe\u7ec6\u5316\u8c03\u6574\u3002
R-CNN\uff08Girshick \u7b49\u4eba\uff0c2014\u5e74\uff09\u662f\u7b2c\u4e00\u4e2a\u6210\u529f\u7684\u6df1\u5ea6\u5b66\u4e60\u68c0\u6d4b\u5668\u3002\u5b83\u4f7f\u7528\u9009\u62e9\u6027\u641c\u7d22\uff08\u4e00\u79cd\u7ecf\u5178\u7b97\u6cd5\uff09\u63d0\u51fa\u7ea62,000\u4e2a\u5019\u9009\u533a\u57df\uff0c\u5c06\u6bcf\u4e2a\u533a\u57df\u53d8\u5f62\u4e3a\u56fa\u5b9a\u5c3a\u5bf8\uff0c\u72ec\u7acb\u901a\u8fc7CNN\u8fd0\u884c\uff0c\u5e76\u4f7f\u7528SVM\uff08\u7b2c06\u7ae0\uff09\u8fdb\u884c\u5206\u7c7b\u3002R-CNN\u51c6\u786e\u4f46\u6781\u5176\u7f13\u6162\uff1a\u6bcf\u5f20\u56fe\u50cf\u9700\u8981\u8fd0\u884cCNN 2,000\u6b21\u3002
Fast R-CNN\uff08Girshick\uff0c2015\u5e74\uff09\u89e3\u51b3\u4e86\u5197\u4f59\u95ee\u9898\uff1a\u5b83\u5728\u6574\u5f20\u56fe\u50cf\u4e0a\u8fd0\u884c\u4e00\u6b21CNN\u4ee5\u751f\u6210\u5171\u4eab\u7279\u5f81\u56fe\uff0c\u7136\u540e\u4f7f\u7528RoI\u6c60\u5316\uff08\u611f\u5174\u8da3\u533a\u57df\u6c60\u5316\uff09\u4ece\u8be5\u5171\u4eab\u7279\u5f81\u56fe\u4e2d\u4e3a\u6bcf\u4e2a\u63d0\u6848\u63d0\u53d6\u7279\u5f81\u3002
RoI\u6c60\u5316\u4ece\u7279\u5f81\u56fe\u4e2d\u53d6\u51fa\u4e00\u4e2a\u53ef\u53d8\u5927\u5c0f\u7684\u533a\u57df\uff0c\u901a\u8fc7\u5c06\u8be5\u533a\u57df\u5212\u5206\u4e3a\u4e00\u4e2a\u7f51\u683c\u5e76\u5728\u6bcf\u4e2a\u5355\u5143\u683c\u5185\u8fdb\u884c\u6700\u5927\u6c60\u5316\uff0c\u751f\u6210\u56fa\u5b9a\u5927\u5c0f\u7684\u8f93\u51fa\u3002\u8fd9\u79cd\u65b9\u6cd5\u5feb\u5f97\u591a\uff0c\u56e0\u4e3a\u6602\u8d35\u7684CNN\u8ba1\u7b97\u53ea\u8fdb\u884c\u4e00\u6b21\u3002
Faster R-CNN\uff08Ren \u7b49\u4eba\uff0c2015\u5e74\uff09\u5f15\u5165\u4e86\u533a\u57df\u63d0\u8bae\u7f51\u7edc\uff08RPN\uff09\uff0c\u4ece\u800c\u6d88\u9664\u4e86\u5916\u90e8\u533a\u57df\u63d0\u8bae\u7b97\u6cd5\u3002RPN\u662f\u4e00\u4e2a\u5c0f\u578bCNN\uff0c\u8fd0\u884c\u5728\u5171\u4eab\u7279\u5f81\u56fe\u4e4b\u4e0a\uff0c\u76f4\u63a5\u9884\u6d4b\u63d0\u6848\u3002RPN\u5728\u7279\u5f81\u56fe\u4e0a\u6ed1\u52a8\u4e00\u4e2a\u5c0f\u7a97\u53e3\uff0c\u5728\u6bcf\u4e2a\u4f4d\u7f6e\u4e0a\u9884\u6d4b \\(k\\) \u4e2a\u63d0\u6848\uff08\u6bcf\u4e2a\u951a\u6846\u5bf9\u5e94\u4e00\u4e2a\u63d0\u6848\uff09\u3002
\u951a\u6846\u662f\u7279\u5f81\u56fe\u4e0a\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u5904\u9884\u5b9a\u4e49\u7684\u8fb9\u754c\u6846\uff0c\u8986\u76d6\u4e0d\u540c\u7684\u5c3a\u5ea6\u548c\u957f\u5bbd\u6bd4\uff08\u4f8b\u5982\uff0c\u4e09\u4e2a\u5c3a\u5ea6 \\(\\times\\) \u4e09\u4e2a\u6bd4\u4f8b = \u6bcf\u4e2a\u4f4d\u7f6e9\u4e2a\u951a\u6846\uff09\u3002RPN\u4e3a\u6bcf\u4e2a\u951a\u6846\u9884\u6d4b\u4e24\u6837\u4e1c\u897f\uff1a\u7269\u4f53\u6027\u5206\u6570\uff08\u7269\u4f53vs\u80cc\u666f\uff09\u4ee5\u53ca\u7528\u4e8e\u5c06\u951a\u6846\u7cbe\u70bc\u4e3a\u66f4\u7d27\u51d1\u63d0\u6848\u7684\u5750\u6807\u504f\u79fb\u91cf\u3002\u8fd9\u79cd\u53c2\u6570\u5316\u4f7f\u56de\u5f52\u95ee\u9898\u66f4\u5bb9\u6613\uff1a\u7f51\u7edc\u4e0d\u9700\u8981\u9884\u6d4b\u7edd\u5bf9\u5750\u6807\uff0c\u53ea\u9700\u9884\u6d4b\u5bf9\u5408\u7406\u521d\u59cb\u6846\u7684\u5c0f\u5e45\u8c03\u6574\u3002
\u951a\u6846\u504f\u79fb\u91cf\u7684\u53c2\u6570\u5316\u516c\u5f0f\u4e3a\uff1a
\u5176\u4e2d \\((x, y, w, h)\\) \u662f\u9884\u6d4b\u6846\u7684\u4e2d\u5fc3\u548c\u5c3a\u5bf8\uff0c\\((x_a, y_a, w_a, h_a)\\) \u662f\u951a\u6846\u3002\u5bbd\u5ea6\u548c\u9ad8\u5ea6\u7684\u5bf9\u6570\u53d8\u6362\u786e\u4fdd\u9884\u6d4b\u6846\u59cb\u7ec8\u4e3a\u6b63\u6570\uff0c\u5e76\u4f7f\u56de\u5f52\u5177\u6709\u5c3a\u5ea6\u4e0d\u53d8\u6027\u3002
Faster R-CNN\u4f7f\u7528\u591a\u4efb\u52a1\u635f\u5931\u8fdb\u884c\u8bad\u7ec3\uff1a\u7c7b\u522b\u6807\u7b7e\u7684\u5206\u7c7b\u635f\u5931\uff08\u7b2c05\u7ae0\u7684\u4ea4\u53c9\u71b5\uff09\uff0c\u4ee5\u53ca\u7528\u4e8e\u8fb9\u754c\u6846\u56de\u5f52\u7684\u5e73\u6ed1L1\u635f\u5931\u3002\u5e73\u6ed1L1\u5bf9\u5f02\u5e38\u503c\u4e0d\u5982L2\u654f\u611f\uff1a
\u7279\u5f81\u91d1\u5b57\u5854\u7f51\u7edc\uff08FPN\uff09\uff08Lin \u7b49\u4eba\uff0c2017\u5e74\uff09\u901a\u8fc7\u6784\u5efa\u4e00\u4e2a\u5e26\u6709\u4fa7\u8fb9\u8fde\u63a5\u7684\u81ea\u9876\u5411\u4e0b\u8def\u5f84\u6765\u89e3\u51b3\u591a\u5c3a\u5ea6\u95ee\u9898\uff0c\u8be5\u8def\u5f84\u5c06\u9ad8\u5c42\u8bed\u4e49\u4fe1\u606f\u4e0e\u4f4e\u5c42\u7a7a\u95f4\u7ec6\u8282\u878d\u5408\u3002\u9aa8\u5e72\u7f51\u7edc\u751f\u6210\u591a\u4e2a\u5c3a\u5ea6\u7684\u7279\u5f81\u56fe\uff08\u6bcf\u4e2a\u6c60\u5316\u5c42\u5c06\u5206\u8fa8\u7387\u51cf\u534a\uff09\u3002FPN\u6dfb\u52a0\u4e86\u4e00\u4e2a\u81ea\u9876\u5411\u4e0b\u7684\u8def\u5f84\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5c42\u7ea7\u63a5\u6536\u6765\u81ea\u4e0a\u4e00\u5c42\u7ea7\u7684\u4e0a\u91c7\u6837\u7279\u5f81\uff0c\u5e76\u901a\u8fc7\u4fa7\u8fb91x1\u5377\u79ef\u4e0e\u5bf9\u5e94\u7684\u81ea\u5e95\u5411\u4e0a\u5c42\u7ea7\u5408\u5e76\u3002\u7ed3\u679c\u662f\u4e00\u4e2a\u7279\u5f81\u56fe\u91d1\u5b57\u5854\uff0c\u6bcf\u4e2a\u5c42\u7ea7\u7684\u7279\u5f81\u56fe\u65e2\u5177\u6709\u5f3a\u8bed\u4e49\u4fe1\u606f\u53c8\u5177\u6709\u826f\u597d\u7684\u7a7a\u95f4\u5206\u8fa8\u7387\u3002
\u5c0f\u7269\u4f53\u4ece\u91d1\u5b57\u5854\u7684\u9ad8\u5206\u8fa8\u7387\u5c42\u7ea7\u68c0\u6d4b\uff1b\u5927\u7269\u4f53\u4ece\u4f4e\u5206\u8fa8\u7387\u5c42\u7ea7\u68c0\u6d4b\u3002FPN\u73b0\u5728\u5df2\u6210\u4e3a\u5927\u591a\u6570\u73b0\u4ee3\u68c0\u6d4b\u67b6\u6784\u7684\u6807\u51c6\u7ec4\u4ef6\u3002
\u5355\u9636\u6bb5\u68c0\u6d4b\u5668\u5b8c\u5168\u8df3\u8fc7\u4e86\u63d0\u6848\u6b65\u9aa4\uff0c\u5728\u4e00\u6b21\u524d\u5411\u4f20\u64ad\u4e2d\u76f4\u63a5\u9884\u6d4b\u7c7b\u522b\u6807\u7b7e\u548c\u8fb9\u754c\u6846\u3002\u8fd9\u79cd\u65b9\u6cd5\u66f4\u5feb\uff0c\u4f46\u5728\u5386\u53f2\u4e0a\u51c6\u786e\u7387\u4f4e\u4e8e\u4e24\u9636\u6bb5\u68c0\u6d4b\u5668\uff0c\u76f4\u5230\u7126\u70b9\u635f\u5931\uff08focal loss\uff09\u7f29\u5c0f\u4e86\u8fd9\u4e00\u5dee\u8ddd\u3002
YOLO\uff08You Only Look Once\uff0cRedmon \u7b49\u4eba\uff0c2016\u5e74\uff09\u5c06\u56fe\u50cf\u5212\u5206\u4e3a\u4e00\u4e2a \\(S \\times S\\) \u7684\u7f51\u683c\u3002\u6bcf\u4e2a\u7f51\u683c\u5355\u5143\u9884\u6d4b \\(B\\) \u4e2a\u8fb9\u754c\u6846\u548c \\(C\\) \u4e2a\u7c7b\u522b\u6982\u7387\u3002\u5982\u679c\u4e00\u4e2a\u7269\u4f53\u7684\u4e2d\u5fc3\u843d\u5728\u4e00\u4e2a\u7f51\u683c\u5355\u5143\u5185\uff0c\u8be5\u5355\u5143\u8d1f\u8d23\u68c0\u6d4b\u8be5\u7269\u4f53\u3002YOLO\u6781\u5176\u5feb\u901f\uff0c\u56e0\u4e3a\u6574\u4e2a\u68c0\u6d4b\u8fc7\u7a0b\u53ea\u6709\u4e00\u6b21\u524d\u5411\u4f20\u64ad\uff0c\u6ca1\u6709\u63d0\u6848\u9636\u6bb5\u3002
YOLOv2\u6dfb\u52a0\u4e86\u951a\u6846\u3001\u6279\u5f52\u4e00\u5316\u548c\u591a\u5c3a\u5ea6\u8bad\u7ec3\u3002YOLOv3\u4f7f\u7528\u4e86\u7279\u5f81\u91d1\u5b57\u5854\u7f51\u7edc\u5e76\u5728\u4e09\u4e2a\u5c3a\u5ea6\u4e0a\u8fdb\u884c\u9884\u6d4b\u3002YOLOv4-v8\u7ee7\u7eed\u6539\u8fdb\uff0c\u91c7\u7528\u4e86\u66f4\u597d\u7684\u9aa8\u5e72\u7f51\u7edc\u3001\u8def\u5f84\u805a\u5408\u7f51\u7edc\u548c\u9a6c\u8d5b\u514b\u6570\u636e\u589e\u5f3a\uff08\u5728\u8bad\u7ec3\u4e2d\u5c06\u56db\u5f20\u56fe\u50cf\u62fc\u63a5\u5728\u4e00\u8d77\u4ee5\u589e\u52a0\u4e0a\u4e0b\u6587\u591a\u6837\u6027\uff09\u3002
SSD\uff08Single Shot MultiBox Detector\uff0cLiu \u7b49\u4eba\uff0c2016\u5e74\uff09\u5728\u9aa8\u5e72\u7f51\u7edc\u5185\u7684\u591a\u4e2a\u7279\u5f81\u56fe\u5c3a\u5ea6\u4e0a\u8fdb\u884c\u9884\u6d4b\uff0c\u5728\u6bcf\u4e2a\u5c3a\u5ea6\u4e0a\u4f7f\u7528\u951a\u6846\u3002\u65e9\u671f\uff08\u9ad8\u5206\u8fa8\u7387\uff09\u7279\u5f81\u56fe\u68c0\u6d4b\u5c0f\u7269\u4f53\uff1b\u540e\u671f\uff08\u4f4e\u5206\u8fa8\u7387\uff09\u7279\u5f81\u56fe\u68c0\u6d4b\u5927\u7269\u4f53\u3002SSD\u6bd4Faster R-CNN\u66f4\u5feb\uff0c\u4e14\u5177\u6709\u7ade\u4e89\u529b\u7684\u51c6\u786e\u7387\u3002
RetinaNet\uff08Lin \u7b49\u4eba\uff0c2017\u5e74\uff09\u6307\u51fa\u4e86\u5355\u9636\u6bb5\u68c0\u6d4b\u5668\u7684\u6838\u5fc3\u95ee\u9898\uff1a\u7c7b\u522b\u4e0d\u5e73\u8861\u3002\u7edd\u5927\u591a\u6570\u951a\u6846\u5bf9\u5e94\u7684\u662f\u80cc\u666f\uff0c\u8fd9\u4ea7\u751f\u4e86\u5927\u91cf\u5bb9\u6613\u7684\u8d1f\u6837\u672c\uff0c\u5b83\u4eec\u4e3b\u5bfc\u4e86\u635f\u5931\u51fd\u6570\u5e76\u538b\u5012\u4e86\u6765\u81ea\u7a00\u6709\u6b63\u6837\u672c\u7684\u68af\u5ea6\u3002
\u7126\u70b9\u635f\u5931\uff08Focal Loss\uff09\u901a\u8fc7\u964d\u4f4e\u5bb9\u6613\u6837\u672c\u7684\u6743\u91cd\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff1a
\u5176\u4e2d \\(p_t\\) \u662f\u6b63\u786e\u7c7b\u522b\u7684\u9884\u6d4b\u6982\u7387\u3002\u5f53\u6a21\u578b\u81ea\u4fe1\u4e14\u6b63\u786e\u65f6\uff08\\(p_t\\) \u5f88\u9ad8\uff09\uff0c\\((1 - p_t)^\\gamma\\) \u5f88\u5c0f\uff0c\u4ece\u800c\u51cf\u5c11\u4e86\u5bb9\u6613\u8d1f\u6837\u672c\u5bf9\u635f\u5931\u7684\u8d21\u732e\u3002\u8d85\u53c2\u6570 \\(\\gamma\\) \uff08\u901a\u5e38\u4e3a2\uff09\u63a7\u5236\u964d\u6743\u7684\u5f3a\u5ea6\u3002\u5f53 \\(\\gamma = 0\\) \u65f6\uff0c\u7126\u70b9\u635f\u5931\u9000\u5316\u4e3a\u6807\u51c6\u4ea4\u53c9\u71b5\u3002\u51ed\u501f\u7126\u70b9\u635f\u5931\uff0cRetinaNet\u4ee5\u5355\u9636\u6bb5\u7684\u901f\u5ea6\u5b9e\u73b0\u4e86\u4e0e\u4e24\u9636\u6bb5\u68c0\u6d4b\u5668\u76f8\u5f53\u7684\u51c6\u786e\u7387\u3002
\u65e0\u951a\u6846\u68c0\u6d4b\u5b8c\u5168\u6d88\u9664\u4e86\u951a\u6846\uff0c\u51cf\u5c11\u4e86\u8d85\u53c2\u6570\u8c03\u4f18\u5e76\u7b80\u5316\u4e86\u6d41\u7a0b\u3002
FCOS\uff08\u5168\u5377\u79ef\u5355\u9636\u6bb5\u68c0\u6d4b\u5668\uff0cTian \u7b49\u4eba\uff0c2019\u5e74\uff09\u5728\u7279\u5f81\u56fe\u7684\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u9884\u6d4b\u4ece\u8be5\u4f4d\u7f6e\u5230\u6700\u8fd1\u8fb9\u754c\u6846\u56db\u6761\u8fb9\uff08\u5de6\u3001\u4e0a\u3001\u53f3\u3001\u4e0b\uff09\u7684\u8ddd\u79bb\u4ee5\u53ca\u4e00\u4e2a\u7c7b\u522b\u6807\u7b7e\u3002\u4e2d\u5fc3\u6027\uff08centerness\uff09\u5206\u6570\u964d\u4f4e\u4e86\u8fdc\u79bb\u7269\u4f53\u4e2d\u5fc3\u7684\u9884\u6d4b\u7684\u6743\u91cd\uff0c\u4ece\u800c\u63d0\u9ad8\u4e86\u8d28\u91cf\u3002FCOS\u4f7f\u7528FPN\u6765\u5904\u7406\u591a\u5c3a\u5ea6\u95ee\u9898\u3002
CenterNet\uff08Zhou \u7b49\u4eba\uff0c2019\u5e74\uff09\u5c06\u7269\u4f53\u68c0\u6d4b\u4e3a\u70b9\uff1a\u5b83\u9884\u6d4b\u4e00\u4e2a\u70ed\u529b\u56fe\uff0c\u5176\u4e2d\u7684\u5cf0\u503c\u5bf9\u5e94\u7269\u4f53\u4e2d\u5fc3\uff0c\u7136\u540e\u5728\u6bcf\u4e2a\u5cf0\u503c\u5904\u56de\u5f52\u5bbd\u5ea6\u548c\u9ad8\u5ea6\u3002\u68c0\u6d4b\u53d8\u6210\u4e86\u5173\u952e\u70b9\u4f30\u8ba1\u3002\u8fd9\u79cd\u65b9\u6cd5\u4f18\u96c5\u4e14\u65e0\u9700\u951a\u6846\uff0c\u4f46\u9700\u8981\u4ed4\u7ec6\u7684\u70ed\u529b\u56fe\u540e\u5904\u7406\u3002
CornerNet\u5c06\u7269\u4f53\u68c0\u6d4b\u4e3a\u4e00\u5bf9\u89d2\u70b9\uff08\u5de6\u4e0a\u89d2\u548c\u53f3\u4e0b\u89d2\uff09\u3002\u5b83\u9884\u6d4b\u4e24\u4e2a\u70ed\u529b\u56fe\uff08\u6bcf\u4e2a\u89d2\u7c7b\u578b\u4e00\u4e2a\uff09\uff0c\u5e76\u4f7f\u7528\u5173\u8054\u5d4c\u5165\uff08associative embedding\uff09\u5c06\u5bf9\u5e94\u7684\u89d2\u70b9\u5339\u914d\u6210\u8fb9\u754c\u6846\u3002\u8fd9\u907f\u514d\u4e86\u5bf9\u951a\u6846\u7684\u9700\u6c42\uff0c\u5e76\u5904\u7406\u4e86\u4efb\u610f\u5f62\u72b6\u7684\u7269\u4f53\u3002
\u8bed\u4e49\u5206\u5272\u4e3a\u56fe\u50cf\u4e2d\u7684\u6bcf\u4e2a\u50cf\u7d20\u5206\u914d\u4e00\u4e2a\u7c7b\u522b\u6807\u7b7e\u3002\u4e0e\u68c0\u6d4b\uff08\u8f93\u51fa\u8fb9\u754c\u6846\uff09\u4e0d\u540c\uff0c\u5206\u5272\u751f\u6210\u5bc6\u96c6\u7684\u50cf\u7d20\u7ea7\u6620\u5c04\u3002\u4e00\u6761\u8857\u666f\u53ef\u80fd\u4f1a\u5c06\u6bcf\u4e2a\u50cf\u7d20\u6807\u8bb0\u4e3a\u9053\u8def\u3001\u4eba\u884c\u9053\u3001\u6c7d\u8f66\u3001\u884c\u4eba\u3001\u5efa\u7b51\u3001\u5929\u7a7a\u7b49\u3002
\u5168\u5377\u79ef\u7f51\u7edc\uff08FCN\uff09\uff08Long \u7b49\u4eba\uff0c2015\u5e74\uff09\u901a\u8fc7\u5c06\u5168\u8fde\u63a5\u5c42\u66ff\u6362\u4e3a\u5377\u79ef\u5c42\uff0c\u4f7f\u5206\u7c7bCNN\u9002\u7528\u4e8e\u5206\u5272\u4efb\u52a1\uff0c\u4ece\u800c\u4f7f\u7f51\u7edc\u80fd\u591f\u8f93\u51fa\u7a7a\u95f4\u6620\u5c04\u800c\u975e\u5355\u4e2a\u7c7b\u522b\u3002\u4e0a\u91c7\u6837\uff08\u901a\u8fc7\u8f6c\u7f6e\u5377\u79ef\u6216\u53cc\u7ebf\u6027\u63d2\u503c\uff09\u5c06\u8f93\u51fa\u6062\u590d\u5230\u8f93\u5165\u5206\u8fa8\u7387\u3002\u6765\u81ea\u65e9\u671f\u5c42\u7684\u8df3\u8dc3\u8fde\u63a5\u6dfb\u52a0\u4e86\u5728\u4e0b\u91c7\u6837\u8fc7\u7a0b\u4e2d\u4e22\u5931\u7684\u7a7a\u95f4\u7ec6\u8282\u3002
\u8f6c\u7f6e\u5377\u79ef\uff08\u6709\u65f6\u79f0\u4e3a\"\u53cd\u5377\u79ef\"\uff09\u662f\u5377\u79ef\u7684\u4e0a\u91c7\u6837\u5bf9\u5e94\u64cd\u4f5c\u3002\u6b65\u5e45\u5377\u79ef\u51cf\u5c11\u7a7a\u95f4\u7ef4\u5ea6\uff0c\u800c\u8f6c\u7f6e\u5377\u79ef\u589e\u52a0\u7a7a\u95f4\u7ef4\u5ea6\u3002\u5b83\u5728\u8f93\u5165\u5143\u7d20\u4e4b\u95f4\u63d2\u5165\u96f6\uff0c\u7136\u540e\u5e94\u7528\u6807\u51c6\u5377\u79ef\uff0c\u4ece\u800c\u6709\u6548\u5730\u5b66\u4e60\u5982\u4f55\u4e0a\u91c7\u6837\u3002
U-Net\uff08Ronneberger \u7b49\u4eba\uff0c2015\u5e74\uff09\u5f15\u5165\u4e86\u4e00\u79cd\u5bf9\u79f0\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u67b6\u6784\uff0c\u5728\u6bcf\u4e00\u5c42\u90fd\u6709\u8df3\u8dc3\u8fde\u63a5\u3002\u7f16\u7801\u5668\uff08\u6536\u7f29\u8def\u5f84\uff09\u5728\u589e\u52a0\u901a\u9053\u6570\u7684\u540c\u65f6\u964d\u4f4e\u7a7a\u95f4\u5206\u8fa8\u7387\uff0c\u4e0e\u5206\u7c7bCNN\u5b8c\u5168\u76f8\u540c\u3002\u89e3\u7801\u5668\uff08\u6269\u5c55\u8def\u5f84\uff09\u5c06\u7ed3\u679c\u4e0a\u91c7\u6837\u56de\u5168\u5206\u8fa8\u7387\u3002\u8df3\u8dc3\u8fde\u63a5\u5728\u6bcf\u4e00\u5c42\u5c06\u7f16\u7801\u5668\u7279\u5f81\u56fe\u4e0e\u89e3\u7801\u5668\u7279\u5f81\u56fe\u62fc\u63a5\u8d77\u6765\uff0c\u4e3a\u89e3\u7801\u5668\u63d0\u4f9b\u7cbe\u7ec6\u7684\u7a7a\u95f4\u7ec6\u8282\u3002\u8fd9\u79cd\u9ad8\u5c42\u8bed\u4e49\u4e0e\u4f4e\u5c42\u7ec6\u8282\u7684\u7ed3\u5408\u4ea7\u751f\u4e86\u6e05\u6670\u3001\u51c6\u786e\u7684\u5206\u5272\u8fb9\u754c\u3002
U-Net\u6700\u521d\u662f\u4e3a\u751f\u7269\u533b\u5b66\u56fe\u50cf\u5206\u5272\u8bbe\u8ba1\u7684\uff08\u5176\u4e2d\u8bad\u7ec3\u6570\u636e\u7a00\u7f3a\uff09\uff0c\u5176\u67b6\u6784\u5df2\u6210\u4e3a\u8bb8\u591a\u540e\u7eed\u6a21\u578b\u7684\u57fa\u7840\uff0c\u5305\u62ec\u6f5c\u5728\u6269\u6563\u6a21\u578b\u4e2d\u7684U-Net\uff08\u6587\u4ef604\uff09\u3002
DeepLab\uff08Chen \u7b49\u4eba\uff0c2014-2018\u5e74\uff09\u4e3a\u5206\u5272\u5f15\u5165\u4e86\u4e24\u4e2a\u5173\u952e\u521b\u65b0\uff1a
\u7a7a\u6d1e\uff08\u6269\u5f20\uff09\u5377\u79ef\uff1a\u5728\u6ee4\u6ce2\u5668\u5143\u7d20\u4e4b\u95f4\u63d2\u5165\u95f4\u9699\u7684\u6807\u51c6\u5377\u79ef\uff0c\u7531\u6269\u5f20\u7387 \\(r\\) \u63a7\u5236\u3002\u4e00\u4e2a\u6269\u5f20\u7387\u4e3a \\(r\\) \u76843x3\u6ee4\u6ce2\u5668\u7684\u611f\u53d7\u91ce\u4e3a \\((2r + 1) \\times (2r + 1)\\)\uff0c\u800c\u4ec5\u4f7f\u75289\u4e2a\u53c2\u6570\u3002\u8fd9\u5728\u4e0d\u8fdb\u884c\u4e0b\u91c7\u6837\u7684\u60c5\u51b5\u4e0b\u6355\u83b7\u591a\u5c3a\u5ea6\u4e0a\u4e0b\u6587\uff0c\u540c\u65f6\u4fdd\u6301\u7a7a\u95f4\u5206\u8fa8\u7387\u3002
\u7a7a\u6d1e\u7a7a\u95f4\u91d1\u5b57\u5854\u6c60\u5316\uff08ASPP\uff09\uff1a\u5e76\u884c\u5e94\u7528\u591a\u4e2a\u5177\u6709\u4e0d\u540c\u6269\u5f20\u7387\u7684\u7a7a\u6d1e\u5377\u79ef\uff08\u4f8b\u5982\uff0c\u6269\u5f20\u73871\u30016\u300112\u300118\uff09\uff0c\u62fc\u63a5\u7ed3\u679c\uff0c\u5e76\u901a\u8fc71x1\u5377\u79ef\u878d\u5408\u3002ASPP\u540c\u65f6\u6355\u83b7\u591a\u4e2a\u5c3a\u5ea6\u7684\u4e0a\u4e0b\u6587\uff0c\u5176\u7cbe\u795e\u7c7b\u4f3c\u4e8eInception\u6a21\u5757\uff08\u6587\u4ef602\uff09\uff0c\u4f46\u4f7f\u7528\u6269\u5f20\u800c\u975e\u4e0d\u540c\u5927\u5c0f\u7684\u5377\u79ef\u6838\u3002
DeepLab\u8fd8\u4f7f\u7528\u6761\u4ef6\u968f\u673a\u573a\uff08CRF\uff09\uff08\u7b2c05\u7ae0\uff09\u4f5c\u4e3a\u540e\u5904\u7406\u6b65\u9aa4\uff0c\u901a\u8fc7\u9f13\u52b1\u7a7a\u95f4\u4e0a\u76f8\u90bb\u4e14\u989c\u8272\u76f8\u4f3c\u7684\u50cf\u7d20\u5171\u4eab\u76f8\u540c\u7684\u6807\u7b7e\u6765\u4f18\u5316\u5206\u5272\u8fb9\u754c\u3002
\u5b9e\u4f8b\u5206\u5272\u7ed3\u5408\u4e86\u68c0\u6d4b\u548c\u5206\u5272\uff1a\u5b83\u8bc6\u522b\u6bcf\u4e2a\u5355\u72ec\u7684\u7269\u4f53\u5b9e\u4f8b\uff0c\u5e76\u4e3a\u6bcf\u4e2a\u5b9e\u4f8b\u751f\u6210\u50cf\u7d20\u7ea7\u63a9\u7801\u3002\u573a\u666f\u4e2d\u7684\u4e24\u8f86\u8f66\u4f1a\u5f97\u5230\u4e24\u4e2a\u72ec\u7acb\u7684\u63a9\u7801\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\"\u8f66\"\u3002
Mask R-CNN\uff08He \u7b49\u4eba\uff0c2017\u5e74\uff09\u901a\u8fc7\u6dfb\u52a0\u4e00\u4e2a\u5c0f\u578b\u5206\u5272\u5934\u6765\u6269\u5c55Faster R-CNN\uff0c\u8be5\u5206\u5272\u5934\u4e3a\u6bcf\u4e2a\u68c0\u6d4b\u5230\u7684\u7269\u4f53\u9884\u6d4b\u4e00\u4e2a\u4e8c\u503c\u63a9\u7801\u3002\u5176\u67b6\u6784\u4e3aFaster R-CNN\u52a0\u4e0a\u4e00\u4e2a\u63a9\u7801\u5206\u652f\uff1a\u63a9\u7801\u5206\u652f\u63a5\u6536RoI\u6c60\u5316\u540e\u7684\u7279\u5f81\uff0c\u5e76\u4e3a\u6bcf\u4e2a\u7c7b\u522b\u8f93\u51fa\u4e00\u4e2a \\(m \\times m\\) \u7684\u4e8c\u503c\u63a9\u7801\u3002\u5b83\u4f7f\u7528RoIAlign\u4ee3\u66ffRoI\u6c60\u5316\uff1a\u5728\u7cbe\u786e\u5b9a\u4f4d\u7684\u91c7\u6837\u70b9\u5904\u8fdb\u884c\u53cc\u7ebf\u6027\u63d2\u503c\uff0c\u800c\u975e\u5728\u91cf\u5316\u7684\u7f51\u683c\u5355\u5143\u683c\u5185\u8fdb\u884c\uff0c\u8fd9\u907f\u514d\u4e86\u91cf\u5316\u5f15\u8d77\u7684\u7a7a\u95f4\u9519\u4f4d\u3002\u8fd9\u4e00\u5c0f\u6539\u52a8\u663e\u8457\u63d0\u9ad8\u4e86\u63a9\u7801\u8d28\u91cf\u3002
Mask R-CNN\u4f7f\u7528\u591a\u4efb\u52a1\u635f\u5931\u8fdb\u884c\u8bad\u7ec3\uff1a\u5206\u7c7b\u635f\u5931 + \u8fb9\u754c\u6846\u56de\u5f52\u635f\u5931 + \u63a9\u7801\u635f\u5931\uff08\u9010\u50cf\u7d20\u4e8c\u503c\u4ea4\u53c9\u71b5\uff09\u3002\u63a9\u7801\u5206\u652f\u72ec\u7acb\u5730\u4e3a\u6bcf\u4e2a\u7c7b\u522b\u9884\u6d4b\u4e00\u4e2a\u63a9\u7801\uff1b\u4ec5\u4f7f\u7528\u4e0e\u9884\u6d4b\u7c7b\u522b\u5bf9\u5e94\u7684\u63a9\u7801\uff0c\u8fd9\u4f7f\u63a9\u7801\u9884\u6d4b\u4e0e\u5206\u7c7b\u89e3\u8026\uff0c\u5e76\u540c\u65f6\u6539\u8fdb\u4e86\u4e24\u8005\u3002
\u5168\u666f\u5206\u5272\u5c06\u8bed\u4e49\u5206\u5272\u548c\u5b9e\u4f8b\u5206\u5272\u7edf\u4e00\u4e3a\u5355\u4e2a\u4efb\u52a1\u3002\u6bcf\u4e2a\u50cf\u7d20\u540c\u65f6\u83b7\u5f97\u4e00\u4e2a\u7c7b\u522b\u6807\u7b7e\uff08\u8bed\u4e49\uff09\u548c\u4e00\u4e2a\u5b9e\u4f8bID\uff08\u7528\u4e8e\"\u7269\u4f53\"\u7c7b\u522b\uff0c\u5982\u6c7d\u8f66\u548c\u4eba\uff09\u3002\"\u80cc\u666f\"\u7c7b\u522b\uff08\u5929\u7a7a\u3001\u9053\u8def\u3001\u8349\u5730\uff09\u53ea\u83b7\u5f97\u8bed\u4e49\u6807\u7b7e\uff0c\u56e0\u4e3a\u5b83\u4eec\u662f\u65e0\u5f62\u533a\u57df\uff0c\u6ca1\u6709\u53ef\u8ba1\u6570\u7684\u5b9e\u4f8b\u3002
\u5168\u666f\u8d28\u91cf\uff08PQ\uff09\u6307\u6807\u901a\u8fc7\u5206\u89e3\u4e3a\u5206\u5272\u8d28\u91cf\uff08\u5339\u914d\u7247\u6bb5\u7684\u5e73\u5747IoU\uff09\u548c\u8bc6\u522b\u8d28\u91cf\uff08\u5339\u914d\u7247\u6bb5\u7684F1\u5206\u6570\uff09\u6765\u8bc4\u4f30\uff1a
\u5b9e\u65f6\u5206\u5272\u5bf9\u4e8e\u81ea\u52a8\u9a7e\u9a76\u548c\u589e\u5f3a\u73b0\u5b9e\u7b49\u5e94\u7528\u81f3\u5173\u91cd\u8981\uff0c\u8fd9\u4e9b\u5e94\u7528\u5bf9\u5ef6\u8fdf\u9884\u7b97\u8981\u6c42\u4e25\u683c\uff08\u901a\u5e38\u6bcf\u5e27\u4e0d\u8d85\u8fc730\u6beb\u79d2\uff09\u3002
BiSeNet\uff08\u53cc\u8fb9\u5206\u5272\u7f51\u7edc\uff0cYu \u7b49\u4eba\uff0c2018\u5e74\uff09\u4f7f\u7528\u4e24\u6761\u5e76\u884c\u8def\u5f84\uff1a\u4e00\u6761\u7a7a\u95f4\u8def\u5f84\uff0c\u5177\u6709\u5bbd\u800c\u6d45\u7684\u5c42\u4ee5\u4fdd\u7559\u7a7a\u95f4\u7ec6\u8282\uff1b\u4e00\u6761\u4e0a\u4e0b\u6587\u8def\u5f84\uff0c\u5177\u6709\u6df1\u800c\u7a84\u7684\u5c42\u4ee5\u6355\u83b7\u8bed\u4e49\u4fe1\u606f\u3002\u8f93\u51fa\u88ab\u878d\u5408\uff0c\u517c\u987e\u901f\u5ea6\u548c\u51c6\u786e\u7387\u3002
DDRNet\uff08\u6df1\u5ea6\u53cc\u5206\u8fa8\u7387\u7f51\u7edc\uff0cHong \u7b49\u4eba\uff0c2021\u5e74\uff09\u5728\u6574\u4e2a\u7f51\u7edc\u4e2d\u4ee5\u4e0d\u540c\u5206\u8fa8\u7387\u7ef4\u6301\u4e24\u4e2a\u5206\u652f\uff0c\u5e76\u5728\u5b83\u4eec\u4e4b\u95f4\u53cd\u590d\u4ea4\u6362\u4fe1\u606f\u3002\u9ad8\u5206\u8fa8\u7387\u5206\u652f\u4fdd\u7559\u7a7a\u95f4\u7ec6\u8282\uff0c\u800c\u4f4e\u5206\u8fa8\u7387\u5206\u652f\u6355\u83b7\u5168\u5c40\u4e0a\u4e0b\u6587\u3002\u591a\u4e2a\u53cc\u8fb9\u878d\u5408\u6a21\u5757\u5728\u4e24\u4e2a\u65b9\u5411\u4e0a\u5408\u5e76\u4fe1\u606f\u3002
\u5b9e\u65f6\u5206\u5272\u7684\u603b\u4f53\u8d8b\u52bf\u662f\u907f\u514d\u6c89\u91cd\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u5f0f\uff0c\u800c\u662f\u901a\u8fc7\u7f51\u7edc\u5168\u7a0b\u7ef4\u6301\u8db3\u591f\u7684\u7a7a\u95f4\u5206\u8fa8\u7387\uff0c\u4ee5\u4e00\u5b9a\u7684\u51c6\u786e\u7387\u4e3a\u4ee3\u4ef7\u6362\u53d6\u663e\u8457\u66f4\u4f4e\u7684\u5ef6\u8fdf\u3002
\u4ece\u5934\u5b9e\u73b0IoU\u8ba1\u7b97\u548c\u975e\u6781\u5927\u503c\u6291\u5236\u3002\u5bf9\u4e00\u7ec4\u91cd\u53e0\u7684\u8fb9\u754c\u6846\u5e94\u7528NMS\u5e76\u53ef\u89c6\u5316\u7ed3\u679c\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\n\ndef compute_iou(box1, box2):\n \"\"\"\u8ba1\u7b97\u4e24\u4e2a\u6846[x1, y1, x2, y2]\u4e4b\u95f4\u7684IoU\u3002\"\"\"\n x1 = jnp.maximum(box1[0], box2[0])\n y1 = jnp.maximum(box1[1], box2[1])\n x2 = jnp.minimum(box1[2], box2[2])\n y2 = jnp.minimum(box1[3], box2[3])\n\n intersection = jnp.maximum(0, x2 - x1) * jnp.maximum(0, y2 - y1)\n area1 = (box1[2] - box1[0]) * (box1[3] - box1[1])\n area2 = (box2[2] - box2[0]) * (box2[3] - box2[1])\n union = area1 + area2 - intersection\n\n return intersection / (union + 1e-6)\n\ndef nms(boxes, scores, iou_threshold=0.5):\n \"\"\"\u975e\u6781\u5927\u503c\u6291\u5236\u3002\"\"\"\n order = jnp.argsort(-scores) # \u6309\u7f6e\u4fe1\u5ea6\u964d\u5e8f\u6392\u5217\n keep = []\n\n remaining = list(range(len(scores)))\n order_list = order.tolist()\n\n while order_list:\n idx = order_list[0]\n keep.append(idx)\n order_list = order_list[1:]\n\n new_order = []\n for j in order_list:\n iou = compute_iou(boxes[idx], boxes[j])\n if iou < iou_threshold:\n new_order.append(j)\n order_list = new_order\n\n return keep\n\n# \u793a\u4f8b\uff1a\u540c\u4e00\u7269\u4f53\u7684\u91cd\u53e0\u68c0\u6d4b\nboxes = jnp.array([\n [50, 60, 150, 160], # \u9ad8\u7f6e\u4fe1\u5ea6\n [55, 65, 155, 165], # \u91cd\u53e0\u7684\u91cd\u590d\u6846\n [52, 58, 148, 158], # \u91cd\u53e0\u7684\u91cd\u590d\u6846\n [200, 100, 300, 200], # \u4e0d\u540c\u7269\u4f53\n [205, 105, 305, 205], # \u91cd\u53e0\u7684\u91cd\u590d\u6846\n])\nscores = jnp.array([0.95, 0.80, 0.70, 0.90, 0.60])\n\nkeep = nms(boxes, scores, iou_threshold=0.5)\n\nfig, axes = plt.subplots(1, 2, figsize=(14, 5))\ncolors = ['#3498db', '#e74c3c', '#27ae60', '#9b59b6', '#f39c12']\n\nfor ax, title, indices in zip(axes, ['NMS\u4e4b\u524d', 'NMS\u4e4b\u540e'],\n [range(len(boxes)), keep]):\n ax.set_xlim(0, 400); ax.set_ylim(0, 300)\n ax.set_aspect('equal'); ax.invert_yaxis()\n ax.set_title(title)\n for i in indices:\n b = boxes[i]\n rect = patches.Rectangle((b[0], b[1]), b[2]-b[0], b[3]-b[1],\n linewidth=2, edgecolor=colors[i],\n facecolor='none')\n ax.add_patch(rect)\n ax.text(b[0], b[1]-5, f'{scores[i]:.2f}', color=colors[i], fontsize=10)\n\nplt.tight_layout(); plt.show()\nprint(f\"NMS\u540e\u4fdd\u7559\u4e86{len(keep)}\u4e2a\u6846\uff0c\u5171{len(boxes)}\u4e2a\")\n \u5b9e\u73b0\u4e00\u4e2a\u7b80\u5316\u7684\u533a\u57df\u63d0\u8bae\u7f51\u7edc\uff08RPN\uff09\u3002\u7ed9\u5b9a\u4e00\u4e2a\u7279\u5f81\u56fe\uff0c\u751f\u6210\u5177\u6709\u591a\u79cd\u5c3a\u5ea6\u548c\u957f\u5bbd\u6bd4\u7684\u951a\u6846\uff0c\u5e76\u9884\u6d4b\u7269\u4f53\u6027\u5206\u6570\u548c\u8fb9\u754c\u6846\u504f\u79fb\u91cf\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as patches\n\ndef generate_anchors(feature_h, feature_w, stride, scales, ratios):\n \"\"\"\u4e3a\u7279\u5f81\u56fe\u4e0a\u7684\u6bcf\u4e2a\u4f4d\u7f6e\u751f\u6210\u951a\u6846\u3002\"\"\"\n anchors = []\n for y in range(feature_h):\n for x in range(feature_w):\n cx = (x + 0.5) * stride\n cy = (y + 0.5) * stride\n for s in scales:\n for r in ratios:\n w = s * jnp.sqrt(r)\n h = s / jnp.sqrt(r)\n anchors.append([cx - w/2, cy - h/2, cx + w/2, cy + h/2])\n return jnp.array(anchors)\n\ndef rpn_forward(feature_map, params):\n \"\"\"\u7b80\u5316\u7248RPN\uff1a\u9884\u6d4b\u6bcf\u4e2a\u951a\u6846\u7684\u7269\u4f53\u6027\u548c\u6846\u504f\u79fb\u91cf\u3002\"\"\"\n H, W, C = feature_map.shape\n n_anchors = params['cls_w'].shape[1]\n\n # \u5728\u7279\u5f81\u56fe\u4e0a\u6ed1\u52a81x1\u5377\u79ef\uff08\u7b80\u5316\u7248\uff09\n cls_scores = feature_map.reshape(-1, C) @ params['cls_w'] # (H*W, n_anchors)\n box_offsets = feature_map.reshape(-1, C) @ params['reg_w'] # (H*W, n_anchors*4)\n\n cls_scores = jax.nn.sigmoid(cls_scores)\n return cls_scores.ravel(), box_offsets.reshape(-1, 4)\n\n# \u8bbe\u7f6e\nfeature_h, feature_w, channels = 4, 4, 16\nstride = 16 # \u6bcf\u4e2a\u7279\u5f81\u56fe\u5355\u5143\u683c\u8986\u76d616x16\u50cf\u7d20\nscales = [32, 64, 128]\nratios = [0.5, 1.0, 2.0]\nn_anchors_per_pos = len(scales) * len(ratios)\n\nkey = jax.random.PRNGKey(42)\nk1, k2, k3 = jax.random.split(key, 3)\n\nfeature_map = jax.random.normal(k1, (feature_h, feature_w, channels))\nparams = {\n 'cls_w': jax.random.normal(k2, (channels, n_anchors_per_pos)) * 0.01,\n 'reg_w': jax.random.normal(k3, (channels, n_anchors_per_pos * 4)) * 0.01,\n}\n\nanchors = generate_anchors(feature_h, feature_w, stride, scales, ratios)\nscores, offsets = rpn_forward(feature_map, params)\n\nprint(f\"\u7279\u5f81\u56fe\uff1a{feature_h}x{feature_w}\uff0c\u6b65\u5e45={stride}\")\nprint(f\"\u6bcf\u4e2a\u4f4d\u7f6e\u7684\u951a\u6846\u6570\uff1a{n_anchors_per_pos}\")\nprint(f\"\u951a\u6846\u603b\u6570\uff1a{len(anchors)}\")\nprint(f\"\u7269\u4f53\u6027\u5206\u6570\u5f62\u72b6\uff1a{scores.shape}\")\nprint(f\"\u8fb9\u754c\u6846\u504f\u79fb\u91cf\u5f62\u72b6\uff1a{offsets.shape}\")\n\n# \u53ef\u89c6\u5316\u4e00\u4e2a\u4f4d\u7f6e\u7684\u951a\u6846\nfig, ax = plt.subplots(figsize=(6, 6))\nimg_size = feature_h * stride\nax.set_xlim(0, img_size); ax.set_ylim(0, img_size)\nax.invert_yaxis(); ax.set_aspect('equal')\n\npos_idx = feature_h // 2 * feature_w + feature_w // 2 # \u4e2d\u5fc3\u4f4d\u7f6e\ncolors = ['#3498db', '#e74c3c', '#27ae60']\nfor i, s in enumerate(scales):\n for j, r in enumerate(ratios):\n idx = pos_idx * n_anchors_per_pos + i * len(ratios) + j\n a = anchors[idx]\n rect = patches.Rectangle((a[0], a[1]), a[2]-a[0], a[3]-a[1],\n linewidth=1.5, edgecolor=colors[i],\n facecolor='none', linestyle=['--', '-', ':'][j])\n ax.add_patch(rect)\n\nax.scatter([img_size/2], [img_size/2], c='red', s=50, zorder=5)\nax.set_title(f'\u4e2d\u5fc3\u4f4d\u7f6e\u7684\u951a\u6846\\n3\u4e2a\u5c3a\u5ea6 \u00d7 3\u4e2a\u6bd4\u4f8b = {n_anchors_per_pos}')\nax.grid(True, alpha=0.3)\nplt.tight_layout(); plt.show()\n \u5b9e\u73b0\u4e00\u4e2a\u7b80\u5316\u7248\u7684\u4e00\u7ef4U-Net\u7f16\u7801\u5668-\u89e3\u7801\u5668\uff0c\u5e26\u6709\u8df3\u8dc3\u8fde\u63a5\uff0c\u7528\u4e8e\u4e00\u7ef4\u5206\u5272\uff08\u4e00\u7ef4\u4fe1\u53f7\u7684\u4e8c\u503c\u6807\u6ce8\uff09\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef conv1d_same(x, kernel):\n \"\"\"\u5177\u6709\u76f8\u540c\u586b\u5145\u7684\u4e00\u7ef4\u5377\u79ef\u3002\"\"\"\n k = len(kernel)\n pad = k // 2\n x_pad = jnp.pad(x, pad, mode='edge')\n n = len(x)\n out = jnp.zeros(n)\n for i in range(n):\n out = out.at[i].set(jnp.sum(x_pad[i:i+k] * kernel))\n return out\n\ndef downsample(x):\n return x[::2]\n\ndef upsample(x, target_len):\n return jnp.interp(jnp.linspace(0, 1, target_len), jnp.linspace(0, 1, len(x)), x)\n\ndef unet_1d(x, params):\n \"\"\"\u7b80\u5316\u7248\u4e00\u7ef4U-Net\uff0c\u5305\u542b2\u4e2a\u7f16\u7801\u5668/\u89e3\u7801\u5668\u5c42\u7ea7\u3002\"\"\"\n # \u7f16\u7801\u5668\n e1 = jnp.maximum(0, conv1d_same(x, params['enc1']))\n e1_down = downsample(e1)\n\n e2 = jnp.maximum(0, conv1d_same(e1_down, params['enc2']))\n e2_down = downsample(e2)\n\n # \u74f6\u9888\u5c42\n bottleneck = jnp.maximum(0, conv1d_same(e2_down, params['bottleneck']))\n\n # \u5e26\u8df3\u8dc3\u8fde\u63a5\u7684\u89e3\u7801\u5668\n d2_up = upsample(bottleneck, len(e2))\n d2 = jnp.maximum(0, conv1d_same(d2_up + e2, params['dec2'])) # \u8df3\u8dc3\u8fde\u63a5\n\n d1_up = upsample(d2, len(e1))\n d1 = conv1d_same(d1_up + e1, params['dec1']) # \u8df3\u8dc3\u8fde\u63a5\n\n return jax.nn.sigmoid(d1)\n\n# \u521b\u5efa\u5e26\u6709\u6807\u6ce8\u533a\u57df\u7684\u4fe1\u53f7\nn = 128\nt = jnp.linspace(0, 4 * jnp.pi, n)\nsignal = jnp.sin(t) + 0.5 * jnp.sin(3 * t)\nlabels = (signal > 0.5).astype(jnp.float32) # \u4e8c\u503c\u5206\u5272\u76ee\u6807\n\nkey = jax.random.PRNGKey(42)\nkeys = jax.random.split(key, 5)\nparams = {\n 'enc1': jax.random.normal(keys[0], (5,)) * 0.3,\n 'enc2': jax.random.normal(keys[1], (5,)) * 0.3,\n 'bottleneck': jax.random.normal(keys[2], (3,)) * 0.3,\n 'dec2': jax.random.normal(keys[3], (5,)) * 0.3,\n 'dec1': jax.random.normal(keys[4], (5,)) * 0.3,\n}\n\ndef loss_fn(params, signal, labels):\n pred = unet_1d(signal, params)\n return -jnp.mean(labels * jnp.log(pred + 1e-7) + (1 - labels) * jnp.log(1 - pred + 1e-7))\n\ngrad_fn = jax.jit(jax.grad(loss_fn))\nlr = 0.05\n\nfor step in range(500):\n grads = grad_fn(params, signal, labels)\n params = {k: params[k] - lr * grads[k] for k in params}\n\npred = unet_1d(signal, params)\n\nfig, axes = plt.subplots(3, 1, figsize=(12, 7), sharex=True)\naxes[0].plot(t, signal, color='#3498db', linewidth=1.5)\naxes[0].set_title('\u8f93\u5165\u4fe1\u53f7'); axes[0].set_ylabel('\u503c')\n\naxes[1].fill_between(t, 0, labels, alpha=0.3, color='#27ae60')\naxes[1].set_title('\u771f\u5b9e\u6807\u6ce8'); axes[1].set_ylabel('\u6807\u7b7e')\n\naxes[2].plot(t, pred, color='#e74c3c', linewidth=1.5)\naxes[2].fill_between(t, 0, (pred > 0.5).astype(float), alpha=0.2, color='#e74c3c')\naxes[2].set_title('U-Net\u9884\u6d4b'); axes[2].set_ylabel('\u6982\u7387')\naxes[2].set_xlabel('t')\n\nplt.tight_layout(); plt.show()\nprint(f\"\u6700\u7ec8\u635f\u5931\uff1a{loss_fn(params, signal, labels):.4f}\")\nprint(f\"\u50cf\u7d20\u51c6\u786e\u7387\uff1a{jnp.mean((pred > 0.5) == labels):.2%}\")\n \u89c6\u89c9Transformer\u5c06\u81ea\u6ce8\u610f\u529b\u5e94\u7528\u4e8e\u56fe\u50cf\u5757\uff0c\u901a\u8fc7\u6570\u636e\u9a71\u52a8\u7684\u7a7a\u95f4\u5b66\u4e60\u6311\u6218\u4e86CNN\u7684\u4e3b\u5bfc\u5730\u4f4d\u3002\u672c\u6587\u6db5\u76d6ViT\u3001DeiT\u3001Swin Transformer\u3001\u57fa\u4e8eGAN\u7684\u56fe\u50cf\u751f\u6210\uff08StyleGAN\uff09\u3001VAE\u548c\u6269\u6563\u6a21\u578b\uff08DDPM\u3001Stable Diffusion\uff09\uff0c\u4ee5\u53ca\u8d85\u5206\u8fa8\u7387\u548c\u795e\u7ecf\u98ce\u683c\u8fc1\u79fb\u3002
CNN\uff08\u6587\u4ef602\uff09\u5185\u7f6e\u4e86\u5f88\u5f3a\u7684\u7a7a\u95f4\u5f52\u7eb3\u504f\u7f6e\uff1a\u5c40\u90e8\u8fde\u63a5\u3001\u6743\u91cd\u5171\u4eab\u548c\u5e73\u79fb\u7b49\u53d8\u6027\u3002\u89c6\u89c9Transformer\uff08ViT\uff09\u63d0\u51fa\u4e86\u4e00\u4e2a\u542f\u53d1\u6027\u7684\u95ee\u9898\uff1a\u5982\u679c\u6211\u4eec\u5b8c\u5168\u629b\u5f03\u8fd9\u4e9b\u504f\u7f6e\uff0c\u4ec5\u4f7f\u7528\u7b2c06\u7ae0\u4e2d\u7684\u6ce8\u610f\u529b\u673a\u5236\uff0c\u8ba9\u6a21\u578b\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u7a7a\u95f4\u7ed3\u6784\uff0c\u7ed3\u679c\u4f1a\u600e\u6837\uff1f
ViT\uff08Vision Transformer\uff0cDosovitskiy\u7b49\u4eba\uff0c2021\uff09\u5c06\u6807\u51c6\u7684Transformer\u7f16\u7801\u5668\u76f4\u63a5\u5e94\u7528\u4e8e\u56fe\u50cf\u3002\u5176\u6838\u5fc3\u601d\u60f3\u662f\u5c06\u56fe\u50cf\u89c6\u4e3a\u4e00\u4e2a\u56fe\u50cf\u5757\u5e8f\u5217\uff0c\u5c31\u50cfNLP\u5c06\u6587\u672c\u89c6\u4e3a\u4e00\u4e2a\u8bcd\u5143\u5e8f\u5217\u4e00\u6837\u3002
\u5176\u5904\u7406\u6d41\u7a0b\u5982\u4e0b\uff1a
\u56fe\u50cf\u5757\u5d4c\u5165\u7b49\u4ef7\u4e8e\u4e00\u4e2a\u5377\u79ef\u6838\u5927\u5c0f\u4e3a\\(P\\)\u3001\u6b65\u957f\u4e3a\\(P\\)\uff08\u4e0d\u91cd\u53e0\uff09\u7684\u5377\u79ef\u64cd\u4f5c\u3002ViT\u5c062D\u56fe\u50cf\u5b57\u9762\u5730\u8f6c\u6362\u4e3a1D\u5e8f\u5217\uff0c\u7136\u540e\u7528\u4e0e\u5904\u7406\u8bed\u8a00\u76f8\u540c\u7684\u67b6\u6784\u6765\u5904\u7406\u5b83\u3002
ViT\u7684\u5f52\u7eb3\u504f\u7f6e\u6bd4CNN\u5c11\uff1a\u5b83\u4e0d\u5f3a\u5236\u5c40\u90e8\u8fde\u63a5\u6216\u5e73\u79fb\u7b49\u53d8\u6027\u3002\u8fd9\u610f\u5473\u7740\u5b83\u9700\u8981\u66f4\u591a\u7684\u8bad\u7ec3\u6570\u636e\u624d\u80fd\u4ece\u5934\u5b66\u4e60\u7a7a\u95f4\u7ed3\u6784\u3002\u5728\u5c0f\u578b\u6570\u636e\u96c6\u4e0a\uff0cCNN\u4f18\u4e8eViT\u3002\u4f46\u5728\u975e\u5e38\u5927\u7684\u6570\u636e\u96c6\uff08JFT-300M\uff0c3\u4ebf\u5f20\u56fe\u50cf\uff09\u4e0a\u8bad\u7ec3\u65f6\uff0cViT\u8fbe\u5230\u6216\u8d85\u8fc7\u4e86\u6700\u4f73CNN\u7684\u6027\u80fd\uff0c\u8fd9\u8868\u660eCNN\u7684\u5f52\u7eb3\u504f\u7f6e\u6709\u52a9\u4e8e\u6570\u636e\u6548\u7387\uff0c\u4f46\u5bf9\u4e8e\u6700\u7ec8\u6027\u80fd\u5e76\u975e\u5fc5\u9700\u3002
ViT\u81ea\u6ce8\u610f\u529b\u7684\u590d\u6742\u5ea6\u4e3a\\(O(N^2)\\)\uff0c\u5176\u4e2dN\u662f\u56fe\u50cf\u5757\u6570\u91cf\u3002\u5bf9\u4e8e224x224\u7684\u56fe\u50cf\u548c16x16\u7684\u56fe\u50cf\u5757\uff0c\\(N = 196\\)\uff0c\u8fd9\u5728\u53ef\u63a7\u8303\u56f4\u5185\u3002\u4f46\u5bf9\u4e8e\u66f4\u9ad8\u5206\u8fa8\u7387\u7684\u56fe\u50cf\u6216\u66f4\u5c0f\u7684\u56fe\u50cf\u5757\uff0c\u4e8c\u6b21\u6210\u672c\u53d8\u5f97\u96be\u4ee5\u627f\u53d7\u3002
DeiT\uff08\u6570\u636e\u9ad8\u6548\u7684\u56fe\u50cfTransformer\uff0cTouvron\u7b49\u4eba\uff0c2021\uff09\u8868\u660e\uff0c\u4ec5\u4f7f\u7528ImageNet\uff08\u65e0\u9700\u5e9e\u5927\u7684JFT\u6570\u636e\u96c6\uff09\u5e76\u501f\u52a9\u5f3a\u6570\u636e\u589e\u5f3a\u3001\u6b63\u5219\u5316\uff08\u968f\u673a\u6df1\u5ea6\u3001\u6807\u7b7e\u5e73\u6ed1\u3001dropout\uff09\u548c\u77e5\u8bc6\u84b8\u998f\uff0c\u5c31\u53ef\u4ee5\u6709\u6548\u8bad\u7ec3ViT\uff1a\u4e00\u4e2a\u9884\u8bad\u7ec3\u7684CNN\u6559\u5e08\u63d0\u4f9b\u8f6f\u6807\u7b7e\uff0cViT\u5b66\u751f\u5b66\u4e60\u5339\u914d\u8fd9\u4e9b\u6807\u7b7e\u3002DeiT\u5728[CLS]\u6807\u8bb0\u65c1\u8fb9\u6dfb\u52a0\u4e86\u4e00\u4e2a\u84b8\u998f\u6807\u8bb0\uff0c\u8bad\u7ec3\u7528\u4e8e\u9884\u6d4b\u6559\u5e08\u7684\u8f93\u51fa\u3002
Swin Transformer\uff08Liu\u7b49\u4eba\uff0c2021\uff09\u89e3\u51b3\u4e86ViT\u7684\u4e24\u4e2a\u4e3b\u8981\u5c40\u9650\uff1a\u968f\u56fe\u50cf\u5927\u5c0f\u5448\u4e8c\u6b21\u589e\u957f\u7684\u8ba1\u7b97\u6210\u672c\uff0c\u4ee5\u53ca\u7f3a\u5c11\u5c42\u6b21\u5316\u7279\u5f81\u56fe\uff08\u68c0\u6d4b\u548c\u5206\u5272\u9700\u8981\u5c42\u6b21\u5316\u7279\u5f81\uff09\u3002
Swin\u5f15\u5165\u4e86\u79fb\u52a8\u7a97\u53e3\uff1a\u4e0d\u518d\u5bf9\u6240\u6709\u56fe\u50cf\u5757\u8fdb\u884c\u5168\u5c40\u81ea\u6ce8\u610f\u529b\uff0c\u800c\u662f\u5728\u5c40\u90e8\u7a97\u53e3\u5185\uff08\u4f8b\u59827x7\u4e2a\u56fe\u50cf\u5757\uff09\u8ba1\u7b97\u6ce8\u610f\u529b\u3002\u8fd9\u4f7f\u5f97\u8ba1\u7b97\u6210\u672c\u4e0e\u56fe\u50cf\u5927\u5c0f\u5448\u7ebf\u6027\u5173\u7cfb\uff1a\\(O(N)\\)\u800c\u975e\\(O(N^2)\\)\u3002\u4f46\u4ec5\u9760\u5c40\u90e8\u7a97\u53e3\u4f1a\u963b\u6b62\u533a\u57df\u4e4b\u95f4\u7684\u4fe1\u606f\u6d41\u52a8\u3002
\u7a97\u53e3\u79fb\u52a8\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff1a\u5728\u4ea4\u66ff\u5c42\u4e2d\uff0c\u7a97\u53e3\u5212\u5206\u4f1a\u504f\u79fb\u534a\u4e2a\u7a97\u53e3\u5927\u5c0f\u3002\u8fd9\u521b\u5efa\u4e86\u8de8\u7a97\u53e3\u8fde\u63a5\uff0c\u4f7f\u5f97\u4fe1\u606f\u53ef\u4ee5\u5728\u6240\u6709\u56fe\u50cf\u90e8\u5206\u4e4b\u95f4\u6d41\u52a8\uff0c\u800c\u65e0\u9700\u5168\u5c40\u6ce8\u610f\u529b\u7684\u6210\u672c\u3002
Swin\u8fd8\u901a\u8fc7\u8de8\u9636\u6bb5\u5408\u5e76\u56fe\u50cf\u5757\u6765\u6784\u5efa\u5c42\u6b21\u5316\u8868\u793a\u3002\u6bcf\u4e2a\u9636\u6bb5\u4e4b\u540e\uff0c\u76f8\u90bb\u76842x2\u56fe\u50cf\u5757\u88ab\u62fc\u63a5\u5e76\u6295\u5f71\uff0c\u4f7f\u901a\u9053\u7ef4\u5ea6\u52a0\u500d\u3001\u7a7a\u95f4\u5206\u8fa8\u7387\u51cf\u534a\u3002\u8fd9\u4ea7\u751f\u4e86\u591a\u5c3a\u5ea6\u7279\u5f81\u56fe\uff0c\u7c7b\u4f3c\u4e8eCNN\u548cFPN\uff08\u6587\u4ef603\uff09\u4e2d\u7684\u7279\u5f81\u56fe\uff0c\u4f7f\u5f97Swin\u53ef\u4ee5\u76f4\u63a5\u517c\u5bb9Faster R-CNN\u7b49\u68c0\u6d4b\u5934\u548cU-Net\u7b49\u5206\u5272\u5934\u3002
PVT\uff08\u91d1\u5b57\u5854\u89c6\u89c9Transformer\uff09\u91c7\u7528\u4e86\u7c7b\u4f3c\u7684\u5c42\u6b21\u5316\u65b9\u6cd5\uff0c\u5177\u6709\u7a7a\u95f4\u7f29\u51cf\u6ce8\u610f\u529b\uff1a\u5728\u6bcf\u4e2a\u9636\u6bb5\uff0c\u952e\u548c\u503c\u5728\u8ba1\u7b97\u6ce8\u610f\u529b\u4e4b\u524d\u5148\u8fdb\u884c\u7a7a\u95f4\u4e0b\u91c7\u6837\uff0c\u4ece\u800c\u5728\u4fdd\u6301\u5168\u5c40\u611f\u53d7\u91ce\u7684\u540c\u65f6\u964d\u4f4e\u4e8c\u6b21\u6210\u672c\u3002
\u81ea\u76d1\u7763\u89c6\u89c9\u5b66\u4e60\u4ece\u672a\u6807\u6ce8\u7684\u56fe\u50cf\u4e2d\u8bad\u7ec3\u8868\u793a\u3002\u6807\u6ce8\u6210\u672c\u9ad8\uff0c\u4f46\u56fe\u50cf\u8d44\u6e90\u4e30\u5bcc\u3002\u76ee\u6807\u662f\u5728\u6ca1\u6709\u4efb\u4f55\u4eba\u5de5\u6807\u6ce8\u7684\u60c5\u51b5\u4e0b\uff0c\u5b66\u4e60\u80fd\u5f88\u597d\u5730\u8fc1\u79fb\u5230\u4e0b\u6e38\u4efb\u52a1\u7684\u7279\u5f81\u3002
\u5bf9\u6bd4\u5b66\u4e60\u8bad\u7ec3\u6a21\u578b\u8bc6\u522b\uff1a\u540c\u4e00\u5f20\u56fe\u50cf\u7684\u4e24\u4e2a\u589e\u5e7f\u89c6\u56fe\uff08\"\u6b63\u6837\u672c\u5bf9\"\uff09\u5e94\u5177\u6709\u76f8\u4f3c\u7684\u8868\u793a\uff0c\u800c\u4e0d\u540c\u56fe\u50cf\u7684\u89c6\u56fe\uff08\"\u8d1f\u6837\u672c\u5bf9\"\uff09\u5e94\u5177\u6709\u4e0d\u76f8\u4f3c\u7684\u8868\u793a\u3002
SimCLR\uff08Chen\u7b49\u4eba\uff0c2020\uff09\u5bf9\u4e00\u4e2a\u6279\u6b21\u4e2d\u7684\u6bcf\u5f20\u56fe\u50cf\u521b\u5efa\u4e24\u4e2a\u589e\u5e7f\u89c6\u56fe\uff0c\u7528\u5171\u4eab\u4e3b\u5e72\u7f51\u7edc+\u6295\u5f71\u5934\u5bf9\u4e24\u8005\u8fdb\u884c\u7f16\u7801\uff0c\u5e76\u5e94\u7528NT-Xent\u635f\u5931\uff08\u5f52\u4e00\u5316\u6e29\u5ea6\u6807\u5ea6\u4ea4\u53c9\u71b5\uff09\uff1a
\u5176\u4e2d\\(\\text{sim}\\)\u662f\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff08\u7b2c01\u7ae0\uff09\uff0c\\(\\tau\\)\u662f\u6e29\u5ea6\u53c2\u6570\u3002\u5206\u5b50\u5c06\u6b63\u6837\u672c\u5bf9\u62c9\u8fd1\uff1b\u5206\u6bcd\u5c06\u8d1f\u6837\u672c\u5bf9\u63a8\u8fdc\u3002SimCLR\u9700\u8981\u5927\u6279\u91cf\u5927\u5c0f\uff084,096+\uff09\u6765\u63d0\u4f9b\u8db3\u591f\u7684\u8d1f\u6837\u672c\u3002
MoCo\uff08\u52a8\u91cf\u5bf9\u6bd4\uff0cHe\u7b49\u4eba\uff0c2020\uff09\u901a\u8fc7\u7ef4\u62a4\u4e00\u4e2a\u52a8\u91cf\u66f4\u65b0\u7684\u8d1f\u5d4c\u5165\u961f\u5217\u6765\u89e3\u51b3\u5927\u6279\u91cf\u9700\u6c42\u3002\u67e5\u8be2\u7f16\u7801\u5668\u901a\u8fc7\u68af\u5ea6\u4e0b\u964d\u66f4\u65b0\uff1b\u952e\u7f16\u7801\u5668\u4f5c\u4e3a\u67e5\u8be2\u7f16\u7801\u5668\u7684\u6307\u6570\u79fb\u52a8\u5e73\u5747\uff08EMA\uff0c\u7b2c04\u7ae0\uff09\u8fdb\u884c\u66f4\u65b0\uff1a\\(\\theta_k \\leftarrow m \\theta_k + (1 - m) \\theta_q\\)\uff0c\u5176\u4e2d\\(m = 0.999\\)\u3002\u961f\u5217\u5b58\u50a8\u6700\u8fd1\u7684\u952e\u5d4c\u5165\uff0c\u63d0\u4f9b\u4e86\u5927\u91cf\u4e14\u4e00\u81f4\u7684\u8d1f\u6837\u672c\u96c6\uff0c\u65e0\u9700\u5de8\u5927\u7684\u6279\u6b21\u3002
BYOL\uff08\u81ea\u4e3e\u4f60\u81ea\u5df1\u7684\u9690\u7a7a\u95f4\uff0cGrill\u7b49\u4eba\uff0c2020\uff09\u5b8c\u5168\u6d88\u9664\u4e86\u8d1f\u6837\u672c\u5bf9\u3002\u5b83\u4f7f\u7528\u4e24\u4e2a\u7f51\u7edc\uff1a\"\u5728\u7ebf\"\u7f51\u7edc\u548c\"\u76ee\u6807\"\u7f51\u7edc\uff08\u5728\u7ebf\u7684EMA\uff09\u3002\u5728\u7ebf\u7f51\u7edc\u9884\u6d4b\u76ee\u6807\u7f51\u7edc\u5bf9\u53e6\u4e00\u589e\u5e7f\u89c6\u56fe\u7684\u8868\u793a\u3002\u65e0\u9700\u8d1f\u6837\u672c\uff0cBYOL\u901a\u8fc7\u9884\u6d4b\u5934\u7684\u4e0d\u5bf9\u79f0\u6027\u548cEMA\u76ee\u6807\u907f\u514d\u4e86\u574d\u584c\u95ee\u9898\uff08\u6a21\u578b\u5bf9\u6240\u6709\u8f93\u5165\u8f93\u51fa\u76f8\u540c\u5411\u91cf\uff09\u3002
DINO\uff08\u65e0\u6807\u7b7e\u81ea\u84b8\u998f\uff0cCaron\u7b49\u4eba\uff0c2021\uff09\u5c06\u81ea\u84b8\u998f\u5e94\u7528\u4e8eViT\u3002\u5b66\u751f\u7f51\u7edc\u9884\u6d4b\u6559\u5e08\u7f51\u7edc\uff08\u5b66\u751f\u7684EMA\uff09\u5728\u4e0d\u540c\u589e\u5e7f\u89c6\u56fe\u4e0b\u7684\u8f93\u51fa\u3002\u6559\u5e08\u4f7f\u7528\u66f4\u5927\u7684\u88c1\u526a\u533a\u57df\uff1b\u5b66\u751f\u4f7f\u7528\u66f4\u5c0f\u7684\u88c1\u526a\u533a\u57df\u3002DINO\u4ea7\u751f\u7684\u7279\u5f81\u5305\u542b\u5173\u4e8e\u573a\u666f\u5e03\u5c40\u7684\u663e\u5f0f\u4fe1\u606f\uff1aDINO\u8bad\u7ec3\u7684ViT\u7684\u81ea\u6ce8\u610f\u529b\u56fe\u81ea\u7136\u5730\u5bf9\u7269\u4f53\u8fdb\u884c\u5206\u5272\uff0c\u65e0\u9700\u4efb\u4f55\u5206\u5272\u76d1\u7763\u3002
\u63a9\u7801\u56fe\u50cf\u5efa\u6a21\u662fBERT\u63a9\u7801\u8bed\u8a00\u5efa\u6a21\uff08\u7b2c07\u7ae0\uff09\u5728\u89c6\u89c9\u9886\u57df\u7684\u7c7b\u6bd4\u3002\u8f93\u5165\u56fe\u50cf\u5757\u7684\u4e00\u5927\u90e8\u5206\u88ab\u63a9\u7801\uff0c\u6a21\u578b\u5b66\u4e60\u91cd\u5efa\u5b83\u4eec\u3002
MAE\uff08\u63a9\u7801\u81ea\u7f16\u7801\u5668\uff0cHe\u7b49\u4eba\uff0c2022\uff09\u63a9\u7801\u4e8675%\u7684\u56fe\u50cf\u5757\uff0c\u5e76\u8bad\u7ec3\u4e00\u4e2aViT\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6765\u91cd\u5efa\u7f3a\u5931\u7684\u50cf\u7d20\u503c\u3002\u53ea\u6709\u672a\u63a9\u7801\u7684\u56fe\u50cf\u5757\u7531\u7f16\u7801\u5668\u5904\u7406\uff08\u5728\u9884\u8bad\u7ec3\u671f\u95f4\u8282\u77014\u500d\u8ba1\u7b97\u91cf\uff09\uff0c\u8f7b\u91cf\u7ea7\u89e3\u7801\u5668\u4ece\u7f16\u7801\u540e\u7684\u53ef\u89c1\u56fe\u50cf\u5757\u52a0\u4e0a\u53ef\u5b66\u4e60\u7684\u63a9\u7801\u6807\u8bb0\u91cd\u5efa\u5b8c\u6574\u56fe\u50cf\u3002
BEiT\uff08\u56fe\u50cfTransformer\u7684BERT\u9884\u8bad\u7ec3\uff0cBao\u7b49\u4eba\uff0c2022\uff09\u63a9\u7801\u56fe\u50cf\u5757\u5e76\u9884\u6d4b\u79bb\u6563\u7684\u89c6\u89c9\u6807\u8bb0\uff08\u4ece\u9884\u8bad\u7ec3\u7684dVAE\u5206\u8bcd\u5668\u83b7\u5f97\uff09\uff0c\u800c\u4e0d\u662f\u539f\u59cb\u50cf\u7d20\u3002\u8fd9\u7c7b\u4f3c\u4e8eBERT\u9884\u6d4b\u79bb\u6563\u8bcd\u6807\u8bb0\uff0c\u907f\u514d\u4e86\u50cf\u7d20\u91cd\u5efa\u7684\u4f4e\u5c42\u7ec6\u8282\u3002
\u56fe\u50cf\u751f\u6210\u65e8\u5728\u751f\u6210\u8bad\u7ec3\u96c6\u4e2d\u4e0d\u5b58\u5728\u7684\u65b0\u9896\u3001\u903c\u771f\u7684\u56fe\u50cf\u3002\u6838\u5fc3\u6311\u6218\u662f\u5bf9\u81ea\u7136\u56fe\u50cf\u7684\u9ad8\u7ef4\u6982\u7387\u5206\u5e03\u8fdb\u884c\u5efa\u6a21\u3002
\u751f\u6210\u5bf9\u6297\u7f51\u7edc\uff08GAN\uff09\uff08Goodfellow\u7b49\u4eba\uff0c2014\uff09\u4f7f\u7528\u4e24\u4e2a\u76f8\u4e92\u7ade\u4e89\u7684\u7f51\u7edc\uff1a\u4e00\u4e2a\u751f\u6210\u5668\\(G\\)\u4ece\u968f\u673a\u566a\u58f0\u4e2d\u521b\u5efa\u5047\u56fe\u50cf\uff0c\u548c\u4e00\u4e2a\u5224\u522b\u5668\\(D\\)\u8bd5\u56fe\u533a\u5206\u771f\u5b9e\u56fe\u50cf\u548c\u5047\u56fe\u50cf\u3002\u5b83\u4eec\u901a\u8fc7\u5bf9\u6297\u6027\u8bad\u7ec3\uff1a\\(G\\)\u8bd5\u56fe\u6b3a\u9a97\\(D\\)\uff0c\u800c\\(D\\)\u8bd5\u56fe\u6293\u4f4f\\(G\\)\u3002
\u751f\u6210\u5668\u63a5\u6536\u968f\u673a\u9690\u5411\u91cf\\(z\\)\uff08\u4ece\u9ad8\u65af\u5206\u5e03\u7b49\u7b80\u5355\u5206\u5e03\u4e2d\u91c7\u6837\uff09\uff0c\u901a\u8fc7\u4e00\u7cfb\u5217\u8f6c\u7f6e\u5377\u79ef\u5c06\u5176\u6620\u5c04\u751f\u6210\u56fe\u50cf\u3002\u5224\u522b\u5668\u662f\u4e00\u4e2a\u6807\u51c6\u7684CNN\u5206\u7c7b\u5668\u3002\u5728\u5747\u8861\u72b6\u6001\u4e0b\uff0c\\(G\\)\u751f\u6210\u7684\u56fe\u50cf\u4e0e\u771f\u5b9e\u6570\u636e\u65e0\u6cd5\u533a\u5206\uff0c\\(D\\)\u5bf9\u6240\u6709\u8f93\u5165\u8f93\u51fa0.5\u3002
\u6a21\u5f0f\u574d\u584c\u662fGAN\u7684\u4e3b\u8981\u5931\u8d25\u6a21\u5f0f\uff1a\u751f\u6210\u5668\u5b66\u4f1a\u53ea\u751f\u6210\u5c11\u6570\u51e0\u79cd\u80fd\u6b3a\u9a97\u5224\u522b\u5668\u7684\u56fe\u50cf\uff0c\u5ffd\u7565\u4e86\u8bad\u7ec3\u6570\u636e\u7684\u591a\u6837\u6027\u3002\u751f\u6210\u5668\u627e\u5230\u4e00\u5c0f\u90e8\u5206\"\u5b89\u5168\"\u8f93\u51fa\uff0c\u800c\u4e0d\u662f\u8986\u76d6\u5b8c\u6574\u7684\u6570\u636e\u5206\u5e03\u3002
\u7a33\u5b9aGAN\u7684\u8bad\u7ec3\u6280\u5de7\u5305\u62ec\uff1a\u8c31\u5f52\u4e00\u5316\uff08\u7ea6\u675f\u5224\u522b\u5668\u7684Lipschitz\u5e38\u6570\uff09\u3001\u6e10\u8fdb\u5f0f\u589e\u957f\uff08\u5148\u5728\u4f4e\u5206\u8fa8\u7387\u8bad\u7ec3\uff0c\u7136\u540e\u9010\u6b65\u63d0\u9ad8\uff09\u3001\u7279\u5f81\u5339\u914d\uff08\u5339\u914d\u4e2d\u95f4\u5224\u522b\u5668\u7279\u5f81\u7684\u7edf\u8ba1\u91cf\u800c\u975e\u6700\u7ec8\u8f93\u51fa\uff09\uff0c\u4ee5\u53ca\u4f7f\u7528Wasserstein\u8ddd\u79bb\u66ff\u4ee3\u539f\u59cb\u7684JS\u6563\u5ea6\u76ee\u6807\u3002
StyleGAN\uff08Karras\u7b49\u4eba\uff0c2019\uff09\u662f\u6700\u5177\u5f71\u54cd\u529b\u7684\u9ad8\u8d28\u91cf\u56fe\u50cf\u5408\u6210GAN\u67b6\u6784\u3002\u5176\u5173\u952e\u521b\u65b0\u662f\u57fa\u4e8e\u98ce\u683c\u7684\u751f\u6210\u5668\uff1a\u4e0d\u662f\u5c06\u9690\u5411\u91cf\\(z\\)\u76f4\u63a5\u8f93\u5165\u751f\u6210\u5668\uff0c\u800c\u662f\u5148\u901a\u8fc7\u4e00\u4e2a\u6620\u5c04\u7f51\u7edc\uff088\u5c42MLP\uff09\u751f\u6210\u98ce\u683c\u5411\u91cf\\(w\\)\u3002\u8be5\u98ce\u683c\u5411\u91cf\u901a\u8fc7\u81ea\u9002\u5e94\u5b9e\u4f8b\u5f52\u4e00\u5316\uff08AdaIN\uff09\u6ce8\u5165\u5230\u751f\u6210\u5668\u7684\u6bcf\u4e00\u5c42\uff0c\u8c03\u8282\u7279\u5f81\u56fe\u7684\u7edf\u8ba1\u91cf\uff1a
\u5176\u4e2d\\(y_s\\)\u548c\\(y_b\\)\u662f\u4ece\\(w\\)\u63a8\u5bfc\u51fa\u7684\u7f29\u653e\u548c\u504f\u7f6e\u3002\u4e0d\u540c\u5c42\u63a7\u5236\u4e0d\u540c\u65b9\u9762\uff1a\u65e9\u671f\u5c42\u63a7\u5236\u7c97\u7c92\u5ea6\u7279\u5f81\uff08\u59ff\u6001\u3001\u8138\u578b\uff09\uff0c\u4e2d\u95f4\u5c42\u63a7\u5236\u4e2d\u7c92\u5ea6\u7279\u5f81\uff08\u53d1\u578b\u3001\u773c\u775b\uff09\uff0c\u540e\u671f\u5c42\u63a7\u5236\u7ec6\u7c92\u5ea6\u7ec6\u8282\uff08\u96c0\u6591\u3001\u53d1\u8d28\u7eb9\u7406\uff09\u3002StyleGAN\u80fd\u4ee51024x1024\u5206\u8fa8\u7387\u751f\u6210\u7167\u7247\u7ea7\u903c\u771f\u7684\u4eba\u8138\u3002
\u53d8\u5206\u81ea\u7f16\u7801\u5668\uff08VAE\uff09\uff08\u7b2c06\u7ae0\uff09\u63d0\u4f9b\u4e86\u53e6\u4e00\u79cd\u751f\u6210\u65b9\u6cd5\u3002\u4e0eGAN\u4e0d\u540c\uff0cVAE\u6709\u4e00\u4e2a\u539f\u5219\u6027\u7684\u6982\u7387\u6846\u67b6\uff0c\u5177\u6709\u6e05\u6670\u7684\u8bad\u7ec3\u76ee\u6807\uff08ELBO\uff09\u3002\u5b83\u4eec\u751f\u6210\u7684\u56fe\u50cf\u901a\u5e38\u6bd4GAN\u6a21\u7cca\uff0c\u4f46\u63d0\u4f9b\u4e86\u66f4\u5e73\u6ed1\u3001\u66f4\u7ed3\u6784\u5316\u7684\u9690\u7a7a\u95f4\u3002VAE\u662f\u9690\u6269\u6563\u6a21\u578b\u4e2d\u7528\u4e8e\u5c06\u56fe\u50cf\u538b\u7f29\u5230\u9690\u7a7a\u95f4\u548c\u4ece\u9690\u7a7a\u95f4\u91cd\u5efa\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u5bf9\u3002
\u6269\u6563\u6a21\u578b\u5df2\u6210\u4e3a\u56fe\u50cf\u751f\u6210\u7684\u4e3b\u5bfc\u8303\u5f0f\uff0c\u5728\u8d28\u91cf\u548c\u591a\u6837\u6027\u4e0a\u90fd\u8d85\u8d8a\u4e86GAN\u3002\u5176\u601d\u60f3\u6982\u5ff5\u4e0a\u5f88\u7b80\u5355\uff1a\u9010\u6b65\u5411\u6570\u636e\u6dfb\u52a0\u566a\u58f0\u76f4\u5230\u53d8\u6210\u7eaf\u9ad8\u65af\u566a\u58f0\uff08\u524d\u5411\u8fc7\u7a0b\uff09\uff0c\u7136\u540e\u5b66\u4e60\u9010\u6b65\u9006\u8f6c\u8fd9\u4e00\u8fc7\u7a0b\uff08\u53cd\u5411\u8fc7\u7a0b\uff09\u3002
\u524d\u5411\u8fc7\u7a0b\u5728\\(T\\)\u4e2a\u65f6\u95f4\u6b65\u4e2d\u6dfb\u52a0\u9ad8\u65af\u566a\u58f0\uff1a
DDPM\uff08\u53bb\u566a\u6269\u6563\u6982\u7387\u6a21\u578b\uff0cHo\u7b49\u4eba\uff0c2020\uff09\u5efa\u7acb\u4e86\u8fd9\u4e2a\u6846\u67b6\u3002\u91c7\u6837\u9700\u8981\u8fed\u4ee3\u6240\u6709\\(T\\)\u6b65\uff08\u901a\u5e38\u4e3a1,000\u6b65\uff09\uff0c\u8fd9\u5f88\u6162\u3002DDIM\uff08\u53bb\u566a\u6269\u6563\u9690\u5f0f\u6a21\u578b\uff0cSong\u7b49\u4eba\uff0c2021\uff09\u5c06\u91c7\u6837\u8fc7\u7a0b\u91cd\u65b0\u8868\u8ff0\u4e3a\u786e\u5b9a\u6027\u6620\u5c04\uff0c\u5141\u8bb8\u5927\u8de8\u5ea6\u8df3\u8fc7\uff08\u4f8b\u598250\u6b65\u4ee3\u66ff1,000\u6b65\uff09\u4e14\u8d28\u91cf\u635f\u5931\u6781\u5c0f\u3002
\u57fa\u4e8e\u5206\u6570\u7684\u6a21\u578b\uff08Song\u548cErmon\uff0c2019\uff09\u63d0\u4f9b\u4e86\u53e6\u4e00\u79cd\u89c6\u89d2\u3002\u8be5\u6a21\u578b\u4e0d\u662f\u9884\u6d4b\u566a\u58f0\\(\\epsilon\\)\uff0c\u800c\u662f\u4f30\u8ba1\u5206\u6570\u51fd\u6570\\(\\nabla_{x_t} \\log p(x_t)\\)\uff0c\u5373\u5bf9\u6570\u6982\u7387\u76f8\u5bf9\u4e8e\u542b\u566a\u56fe\u50cf\u7684\u68af\u5ea6\u3002\u8be5\u68af\u5ea6\u6307\u5411\u6570\u636e\u5206\u5e03\u4e2d\u66f4\u9ad8\u6982\u7387\uff08\u66f4\u5e72\u51c0\uff09\u7684\u533a\u57df\u3002\u91c7\u6837\u4f7f\u7528Langevin\u52a8\u529b\u5b66\u6cbf\u7740\u8be5\u68af\u5ea6\u8fdb\u884c\u3002\u57fa\u4e8e\u5206\u6570\u7684\u6a21\u578b\u548cDDPM\u5728\u968f\u673a\u5fae\u5206\u65b9\u7a0b\uff08SDE\uff09\u7684\u6846\u67b6\u4e0b\u88ab\u7edf\u4e00\uff1a\u524d\u5411\u8fc7\u7a0b\u662f\u6dfb\u52a0\u566a\u58f0\u7684SDE\uff0c\u53cd\u5411\u8fc7\u7a0b\u662f\u65f6\u95f4\u53cd\u8f6c\u7684SDE\u3002
\u65e0\u5206\u7c7b\u5668\u5f15\u5bfc\uff08Ho\u548cSalimans\uff0c2022\uff09\u63a7\u5236\u6837\u672c\u8d28\u91cf\u548c\u591a\u6837\u6027\u4e4b\u95f4\u7684\u6743\u8861\u3002\u6a21\u578b\u540c\u65f6\u8fdb\u884c\u6761\u4ef6\u8bad\u7ec3\uff08\u4f7f\u7528\u6587\u672c\u63d0\u793a\u6216\u7c7b\u522b\u6807\u7b7e\uff09\u548c\u65e0\u6761\u4ef6\u8bad\u7ec3\uff08\u6761\u4ef6\u968f\u673a\u4e22\u5f03\uff09\u3002\u5728\u91c7\u6837\u65f6\uff0c\u9884\u6d4b\u662f\u52a0\u6743\u7ec4\u5408\uff1a
\u5176\u4e2d\\(c\\)\u662f\u6761\u4ef6\uff0c\\(\\varnothing\\)\u662f\u7a7a\u6761\u4ef6\uff0c\\(s > 1\\)\u662f\u5f15\u5bfc\u5c3a\u5ea6\u3002\\(s\\)\u8d8a\u9ad8\uff0c\u751f\u6210\u7684\u56fe\u50cf\u8d8a\u7b26\u5408\u6761\u4ef6\uff0c\u4f46\u591a\u6837\u6027\u8d8a\u4f4e\u3002\\(s = 1\\)\u662f\u65e0\u5f15\u5bfc\u6a21\u578b\uff1b\\(s = 7.5\\)\u662f\u5e38\u89c1\u7684\u9ed8\u8ba4\u503c\u3002
\u9690\u6269\u6563\uff08Rombach\u7b49\u4eba\uff0c2022\uff1bStable Diffusion\uff09\u5c06\u6269\u6563\u8fc7\u7a0b\u4ece\u50cf\u7d20\u7a7a\u95f4\u8f6c\u79fb\u5230\u5b66\u4e60\u7684\u9690\u7a7a\u95f4\u4e2d\u3002\u4e00\u4e2a\u9884\u8bad\u7ec3\u7684VAE\u7f16\u7801\u5668\u5c06\u56fe\u50cf\u538b\u7f29\u4e3a\u8f83\u4f4e\u7ef4\u5ea6\u7684\u9690\u7a7a\u95f4\u8868\u793a\uff08\u901a\u5e38\u7a7a\u95f4\u4e0b\u91c7\u68374\u500d\u62168\u500d\uff09\uff0c\u6269\u6563\u5728\u8fd9\u4e2a\u538b\u7f29\u7a7a\u95f4\u4e2d\u8fdb\u884c\uff0cVAE\u89e3\u7801\u5668\u4ece\u53bb\u566a\u540e\u7684\u9690\u53d8\u91cf\u91cd\u5efa\u50cf\u7d20\u3002\u8fd9\u5927\u5927\u63d0\u9ad8\u4e86\u6548\u7387\uff1a\u5728\u50cf\u7d20\u7a7a\u95f4\u6269\u6563512x512\u56fe\u50cf\u9700\u8981\u5904\u7406\\(512 \\times 512 \\times 3\\)\u7684\u5f20\u91cf\uff0c\u4f46\u5728\u9690\u7a7a\u95f4\u4e2d\u4ec5\u9700\u5904\u7406\\(64 \\times 64 \\times 4\\)\u7684\u5f20\u91cf\u3002
\u9690\u6269\u6563\u4e2d\u7684\u53bb\u566aU-Net\u63a5\u6536\u542b\u566a\u9690\u53d8\u91cf\u3001\u65f6\u95f4\u6b65\uff08\u7f16\u7801\u4e3a\u6b63\u5f26\u5d4c\u5165\uff0c\u7c7b\u4f3c\u4e8eTransformer\u4e2d\u7684\u4f4d\u7f6e\u7f16\u7801\uff09\u548c\u6761\u4ef6\u4fe1\u53f7\uff08\u6765\u81ea\u51bb\u7ed3\u7684CLIP\u6216T5\u6587\u672c\u7f16\u7801\u5668\u7684\u6587\u672c\u5d4c\u5165\uff09\u3002\u6587\u672c\u6761\u4ef6\u901a\u8fc7U-Net\u5185\u7684\u4ea4\u53c9\u6ce8\u610f\u529b\u5c42\u8fdb\u5165\uff1a\u6587\u672c\u5d4c\u5165\u4f5c\u4e3a\u952e\u548c\u503c\uff0c\u56fe\u50cf\u7279\u5f81\u4f5c\u4e3a\u67e5\u8be2\u3002\u8fd9\u4f7f\u5f97\u6a21\u578b\u5728\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u90fd\u80fd\u5173\u6ce8\u6587\u672c\u63d0\u793a\u7684\u76f8\u5173\u90e8\u5206\u3002
\u6d41\u5339\u914d\u662f\u6269\u6563\u6a21\u578b\u7684\u4e00\u4e2a\u65b0\u5174\u66ff\u4ee3\u65b9\u6848\uff0c\u5b83\u5b66\u4e60\u566a\u58f0\u548c\u6570\u636e\u4e4b\u95f4\u7684\u76f4\u63a5\u4f20\u8f93\u8def\u5f84\uff0c\u800c\u4e0d\u662fDDPM\u7684\u8fed\u4ee3\u53bb\u566a\u3002
\u8fde\u7eed\u5f52\u4e00\u5316\u6d41\uff08CNF\uff09\u5b9a\u4e49\u4e86\u4e00\u4e2a\u65f6\u95f4\u76f8\u5173\u7684\u901f\u5ea6\u573a\\(v_\\theta(x, t)\\)\uff0c\u6cbf\u7740\u5e73\u6ed1\u8f68\u8ff9\u5c06\u6837\u672c\u4ece\u7b80\u5355\u5206\u5e03\\(p_0\\)\uff08\u566a\u58f0\uff09\u63a8\u9001\u5230\u6570\u636e\u5206\u5e03\\(p_1\\)\u3002\u8be5\u53d8\u6362\u9075\u5faa\u4e00\u4e2a\u5e38\u5fae\u5206\u65b9\u7a0b\uff08ODE\uff09\uff1a
\u4ece\\(x_0 \\sim \\mathcal{N}(0, I)\\)\u5f00\u59cb\uff0c\u5c06ODE\u5411\u524d\u79ef\u5206\u5230\\(t = 1\\)\u5373\u53ef\u5f97\u5230\u6570\u636e\u5206\u5e03\u4e2d\u7684\u6837\u672c\u3002\u901f\u5ea6\u573a\u7531\u795e\u7ecf\u7f51\u7edc\u53c2\u6570\u5316\uff0c\u8bad\u7ec3\u76ee\u6807\u662f\u5339\u914d\u76ee\u6807\u6761\u4ef6\u6d41\u3002
\u6700\u4f18\u4f20\u8f93\uff08OT\uff09\u6d41\u5339\u914d\uff08Lipman\u7b49\u4eba\uff0c2023\uff09\u4f7f\u7528\u566a\u58f0\u548c\u6570\u636e\u4e4b\u95f4\u7684\u76f4\u7ebf\u8def\u5f84\u4f5c\u4e3a\u76ee\u6807\u6d41\uff1a\u4ece\u566a\u58f0\u6837\u672c\\(x_0\\)\u5230\u6570\u636e\u6837\u672c\\(x_1\\)\u7684\u6761\u4ef6\u8def\u5f84\u7b80\u5355\u5730\u662f\\(x_t = (1 - t) x_0 + t x_1\\)\uff0c\u76ee\u6807\u901f\u5ea6\u4e3a\\(v = x_1 - x_0\\)\u3002\u8bad\u7ec3\u635f\u5931\u53d8\u4e3a\uff1a
\u6574\u6d41\u6d41\uff08Liu\u7b49\u4eba\uff0c2022\uff09\u901a\u8fc7\u8fed\u4ee3\u65b9\u5f0f\u62c9\u76f4\u5b66\u4e60\u5230\u7684\u6d41\u8def\u5f84\u3002\u5728\u521d\u59cb\u8bad\u7ec3\u540e\uff0c\u6a21\u578b\u901a\u8fc7\u6a21\u62dfODE\u751f\u6210\uff08\u566a\u58f0\uff0c\u6570\u636e\uff09\u5bf9\u3002\u8fd9\u4e9b\u6bd4\u968f\u673a\u914d\u5bf9\u66f4\u7d27\u5bc6\u5bf9\u9f50\u7684\u5bf9\u7528\u4e8e\u91cd\u65b0\u8bad\u7ec3\u6a21\u578b\u3002\u91cd\u590d\u6b64\u8fc7\u7a0b\u4f1a\u4ea7\u751f\u8d8a\u6765\u8d8a\u76f4\u7684\u8def\u5f84\uff0c\u53ef\u4ee5\u901a\u8fc7\u66f4\u5c11\u7684ODE\u6b65\u9aa4\uff08\u751a\u81f3\u5355\u6b65\uff09\u6765\u904d\u5386\uff0c\u4ece\u800c\u5b9e\u73b0\u6781\u5feb\u901f\u7684\u751f\u6210\u3002
\u6d41\u5339\u914d\u76f8\u6bd4\u6269\u6563\u6709\u51e0\u4e2a\u4f18\u52bf\uff1a\u8bad\u7ec3\u76ee\u6807\u66f4\u7b80\u5355\uff08\u76f4\u63a5\u7684\u901f\u5ea6\u56de\u5f52\uff0c\u65e0\u9700\u566a\u58f0\u8c03\u5ea6\uff09\uff0c\u91c7\u6837ODE\u66f4\u5e73\u6ed1\uff08\u9700\u8981\u7684\u79ef\u5206\u6b65\u9aa4\u66f4\u5c11\uff09\uff0c\u4e0e\u6700\u4f18\u4f20\u8f93\u7684\u8054\u7cfb\u63d0\u4f9b\u4e86\u7406\u8bba\u4f9d\u636e\u3002Stable Diffusion 3\u548cFlux\u4f7f\u7528\u6d41\u5339\u914d\u66ff\u4ee3\u4e86\u4f20\u7edf\u7684DDPM\u3002
\u4ece\u5934\u5b9e\u73b0ViT\u56fe\u50cf\u5757\u5d4c\u5165\u3002\u5c06\u56fe\u50cf\u5206\u5272\u6210\u56fe\u50cf\u5757\uff0c\u5c55\u5e73\uff0c\u6295\u5f71\u5230\u6a21\u578b\u7ef4\u5ea6\uff0c\u6dfb\u52a0\u4f4d\u7f6e\u5d4c\u5165\uff0c\u5e76\u524d\u7f6e[CLS]\u6807\u8bb0\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef create_patch_embedding(image, patch_size, d_model, params):\n \"\"\"\u5c06\u56fe\u50cf\u8f6c\u6362\u4e3a\u56fe\u50cf\u5757\u5d4c\u5165\u5e8f\u5217\u3002\"\"\"\n H, W, C = image.shape\n n_patches_h = H // patch_size\n n_patches_w = W // patch_size\n n_patches = n_patches_h * n_patches_w\n\n # \u63d0\u53d6\u56fe\u50cf\u5757\n patches = []\n for i in range(n_patches_h):\n for j in range(n_patches_w):\n patch = image[i*patch_size:(i+1)*patch_size,\n j*patch_size:(j+1)*patch_size, :]\n patches.append(patch.ravel())\n patches = jnp.stack(patches) # (N, P*P*C)\n\n # \u7ebf\u6027\u6295\u5f71\u5230d_model\n embeddings = patches @ params['proj_w'] + params['proj_b'] # (N, d_model)\n\n # \u524d\u7f6eCLS\u6807\u8bb0\n cls_token = params['cls_token'] # (1, d_model)\n embeddings = jnp.concatenate([cls_token, embeddings], axis=0) # (N+1, d_model)\n\n # \u6dfb\u52a0\u4f4d\u7f6e\u5d4c\u5165\n embeddings = embeddings + params['pos_embed'] # (N+1, d_model)\n\n return embeddings, patches\n\n# \u8bbe\u7f6e\nH, W, C = 32, 32, 3\npatch_size = 8\nd_model = 64\nn_patches = (H // patch_size) * (W // patch_size) # 16\n\nkey = jax.random.PRNGKey(42)\nkeys = jax.random.split(key, 5)\n\n# \u521b\u5efa\u5177\u6709\u4e0d\u540c\u8c61\u9650\u7684\u5408\u6210\u56fe\u50cf\nimage = jnp.zeros((H, W, C))\nimage = image.at[:16, :16, 0].set(1.0) # \u7ea2\u8272 \u5de6\u4e0a\nimage = image.at[:16, 16:, 1].set(1.0) # \u7eff\u8272 \u53f3\u4e0a\nimage = image.at[16:, :16, 2].set(1.0) # \u84dd\u8272 \u5de6\u4e0b\nimage = image.at[16:, 16:, :2].set(1.0) # \u9ec4\u8272 \u53f3\u4e0b\n\nparams = {\n 'proj_w': jax.random.normal(keys[0], (patch_size**2 * C, d_model)) * 0.02,\n 'proj_b': jnp.zeros(d_model),\n 'cls_token': jax.random.normal(keys[1], (1, d_model)) * 0.02,\n 'pos_embed': jax.random.normal(keys[2], (n_patches + 1, d_model)) * 0.02,\n}\n\nembeddings, patches = create_patch_embedding(image, patch_size, d_model, params)\n\nprint(f\"\u56fe\u50cf\u5f62\u72b6: {image.shape}\")\nprint(f\"\u56fe\u50cf\u5757\u5927\u5c0f: {patch_size}x{patch_size}\")\nprint(f\"\u56fe\u50cf\u5757\u6570\u91cf: {n_patches}\")\nprint(f\"\u56fe\u50cf\u5757\u5411\u91cf\u957f\u5ea6: {patch_size**2 * C}\")\nprint(f\"\u5d4c\u5165\u5f62\u72b6: {embeddings.shape} (CLS + {n_patches} \u4e2a\u56fe\u50cf\u5757)\")\n\n# \u53ef\u89c6\u5316\u56fe\u50cf\u5757\nfig, axes = plt.subplots(2, 5, figsize=(14, 6))\naxes[0, 0].imshow(image); axes[0, 0].set_title('\u5b8c\u6574\u56fe\u50cf'); axes[0, 0].axis('off')\nfor idx in range(min(9, n_patches)):\n ax = axes[(idx+1) // 5, (idx+1) % 5]\n patch_img = patches[idx].reshape(patch_size, patch_size, C)\n ax.imshow(patch_img); ax.set_title(f'\u56fe\u50cf\u5757 {idx}'); ax.axis('off')\nplt.suptitle('ViT \u56fe\u50cf\u5757\u5206\u89e3')\nplt.tight_layout(); plt.show()\n \u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684GAN\u8bad\u7ec3\u5faa\u73af\u3002\u5728\u4e8c\u7ef4\u6570\u636e\u4e0a\u8bad\u7ec3\u751f\u6210\u5668\u548c\u5224\u522b\u5668\uff0c\u5e76\u53ef\u89c6\u5316\u751f\u6210\u5206\u5e03\u9010\u6e10\u6536\u655b\u5230\u771f\u5b9e\u5206\u5e03\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef generator(z, params):\n h = jnp.tanh(z @ params['g_w1'] + params['g_b1'])\n h = jnp.tanh(h @ params['g_w2'] + params['g_b2'])\n return h @ params['g_w3'] + params['g_b3']\n\ndef discriminator(x, params):\n h = jax.nn.leaky_relu(x @ params['d_w1'] + params['d_b1'], 0.2)\n h = jax.nn.leaky_relu(h @ params['d_w2'] + params['d_b2'], 0.2)\n return jax.nn.sigmoid(h @ params['d_w3'] + params['d_b3'])\n\ndef init_params(key):\n keys = jax.random.split(key, 6)\n z_dim, h_dim, data_dim = 2, 32, 2\n scale = 0.1\n return {\n 'g_w1': jax.random.normal(keys[0], (z_dim, h_dim)) * scale,\n 'g_b1': jnp.zeros(h_dim),\n 'g_w2': jax.random.normal(keys[1], (h_dim, h_dim)) * scale,\n 'g_b2': jnp.zeros(h_dim),\n 'g_w3': jax.random.normal(keys[2], (h_dim, data_dim)) * scale,\n 'g_b3': jnp.zeros(data_dim),\n 'd_w1': jax.random.normal(keys[3], (data_dim, h_dim)) * scale,\n 'd_b1': jnp.zeros(h_dim),\n 'd_w2': jax.random.normal(keys[4], (h_dim, h_dim)) * scale,\n 'd_b2': jnp.zeros(h_dim),\n 'd_w3': jax.random.normal(keys[5], (h_dim, 1)) * scale,\n 'd_b3': jnp.zeros(1),\n }\n\ndef d_loss(params, real_data, fake_data):\n real_score = discriminator(real_data, params)\n fake_score = discriminator(fake_data, params)\n return -jnp.mean(jnp.log(real_score + 1e-7) + jnp.log(1 - fake_score + 1e-7))\n\ndef g_loss(params, fake_data):\n fake_score = discriminator(fake_data, params)\n return -jnp.mean(jnp.log(fake_score + 1e-7))\n\n# \u771f\u5b9e\u6570\u636e\uff1a\u73af\u5f62\u5206\u5e03\nkey = jax.random.PRNGKey(42)\ntheta = jax.random.uniform(key, (512,)) * 2 * jnp.pi\nreal_data = jnp.stack([jnp.cos(theta), jnp.sin(theta)], axis=1)\nreal_data = real_data + jax.random.normal(key, real_data.shape) * 0.05\n\nparams = init_params(jax.random.PRNGKey(0))\nd_grad = jax.grad(d_loss)\ng_grad = jax.grad(g_loss)\nlr = 0.001\n\nsnapshots = []\nfor step in range(3000):\n key, k1 = jax.random.split(key)\n z = jax.random.normal(k1, (512, 2))\n fake_data = generator(z, params)\n\n # \u66f4\u65b0\u5224\u522b\u5668\n grads = d_grad(params, real_data, fake_data)\n for k in ['d_w1', 'd_b1', 'd_w2', 'd_b2', 'd_w3', 'd_b3']:\n params[k] = params[k] - lr * grads[k]\n\n # \u66f4\u65b0\u751f\u6210\u5668\n fake_data = generator(z, params)\n grads = g_grad(params, fake_data)\n for k in ['g_w1', 'g_b1', 'g_w2', 'g_b2', 'g_w3', 'g_b3']:\n params[k] = params[k] - lr * grads[k]\n\n if step in [0, 500, 1500, 2999]:\n snapshots.append((step, fake_data.copy()))\n\nfig, axes = plt.subplots(1, 4, figsize=(16, 4))\nfor ax, (step, fake) in zip(axes, snapshots):\n ax.scatter(real_data[:, 0], real_data[:, 1], s=5, alpha=0.3, c='#3498db', label='\u771f\u5b9e')\n ax.scatter(fake[:, 0], fake[:, 1], s=5, alpha=0.3, c='#e74c3c', label='\u751f\u6210')\n ax.set_title(f'\u6b65\u9aa4 {step}'); ax.set_xlim(-2, 2); ax.set_ylim(-2, 2)\n ax.set_aspect('equal'); ax.legend(markerscale=3)\nplt.suptitle('GAN\u8bad\u7ec3\uff1a\u751f\u6210\u5668\u5b66\u4e60\u73af\u5f62\u5206\u5e03')\nplt.tight_layout(); plt.show()\n \u5b9e\u73b0\u6269\u6563\u524d\u5411\u8fc7\u7a0b\uff1a\u5728\u4e0d\u540c\u65f6\u95f4\u6b65\u5411\u56fe\u50cf\u6dfb\u52a0\u566a\u58f0\uff0c\u5e76\u53ef\u89c6\u5316\u9010\u6b65\u7834\u574f\u8fc7\u7a0b\u3002\u7136\u540e\u5b9e\u73b0\u5355\u6b65\u53bb\u566a\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef noise_schedule(T, beta_start=0.0001, beta_end=0.02):\n \"\"\"\u7ebf\u6027\u566a\u58f0\u8c03\u5ea6\u3002\"\"\"\n betas = jnp.linspace(beta_start, beta_end, T)\n alphas = 1.0 - betas\n alpha_bars = jnp.cumprod(alphas)\n return betas, alphas, alpha_bars\n\ndef forward_diffusion(x0, t, alpha_bars, key):\n \"\"\"\u5728\u65f6\u95f4\u6b65t\u5411x0\u6dfb\u52a0\u566a\u58f0\u3002\"\"\"\n alpha_bar_t = alpha_bars[t]\n noise = jax.random.normal(key, x0.shape)\n xt = jnp.sqrt(alpha_bar_t) * x0 + jnp.sqrt(1 - alpha_bar_t) * noise\n return xt, noise\n\n# \u521b\u5efa\u7b80\u5355\u76842D\"\u56fe\u50cf\"\uff08\u68cb\u76d8\u683c\uff09\nimg = jnp.zeros((32, 32))\nfor i in range(4):\n for j in range(4):\n if (i + j) % 2 == 0:\n img = img.at[i*8:(i+1)*8, j*8:(j+1)*8].set(1.0)\n\nT = 1000\nbetas, alphas, alpha_bars = noise_schedule(T)\n\n# \u53ef\u89c6\u5316\u524d\u5411\u8fc7\u7a0b\ntimesteps = [0, 50, 200, 500, 999]\nkey = jax.random.PRNGKey(42)\n\nfig, axes = plt.subplots(1, len(timesteps), figsize=(16, 3.5))\nfor ax, t in zip(axes, timesteps):\n key, subkey = jax.random.split(key)\n xt, noise = forward_diffusion(img, t, alpha_bars, subkey)\n ax.imshow(xt, cmap='gray', vmin=-2, vmax=2)\n ax.set_title(f't={t}\\n$\\\\bar{{\\\\alpha}}$={alpha_bars[t]:.3f}')\n ax.axis('off')\nplt.suptitle('\u6269\u6563\u524d\u5411\u8fc7\u7a0b\uff1a\u9010\u6b65\u6dfb\u52a0\u566a\u58f0')\nplt.tight_layout(); plt.show()\n\n# \u7b80\u5355\u53bb\u566a\uff1a\u8bad\u7ec3\u5c0f\u578b\u7f51\u7edc\u5728t=200\u65f6\u9884\u6d4b\u566a\u58f0\nt_denoise = 200\nkey, k1 = jax.random.split(key)\nxt, true_noise = forward_diffusion(img, t_denoise, alpha_bars, k1)\n\n# \u5c0f\u578b\"\u53bb\u566a\u5668\"\uff1a\u4ec5\u5b66\u4e60\u6052\u5b9a\u7684\u566a\u58f0\u4f30\u8ba1\uff08\u7528\u4e8e\u6f14\u793a\uff09\nnoise_estimate = jnp.zeros_like(img)\nlr = 0.01\nfor step in range(100):\n residual = noise_estimate - true_noise\n noise_estimate = noise_estimate - lr * residual\n\n# \u53cd\u5411\u4e00\u6b65\nalpha_bar_t = alpha_bars[t_denoise]\nx_denoised = (xt - jnp.sqrt(1 - alpha_bar_t) * noise_estimate) / jnp.sqrt(alpha_bar_t)\n\nfig, axes = plt.subplots(1, 3, figsize=(12, 4))\naxes[0].imshow(img, cmap='gray'); axes[0].set_title('\u539f\u59cb $x_0$'); axes[0].axis('off')\naxes[1].imshow(xt, cmap='gray', vmin=-2, vmax=2)\naxes[1].set_title(f'\u542b\u566a $x_{{200}}$'); axes[1].axis('off')\naxes[2].imshow(x_denoised, cmap='gray')\naxes[2].set_title('\u53bb\u566a\u540e\uff08\u5355\u6b65\uff09'); axes[2].axis('off')\nplt.tight_layout(); plt.show()\n\nmse = jnp.mean((x_denoised - img)**2)\nprint(f\"\u53bb\u566aMSE: {mse:.4f}\")\n \u89c6\u9891\u4e0e3D\u89c6\u89c9\u5c06\u56fe\u50cf\u7406\u89e3\u6269\u5c55\u5230\u65f6\u95f4\u57df\u548c\u7a7a\u95f4\u57df\u3002\u672c\u6587\u6db5\u76d6\u5149\u6d41\u3001\u89c6\u9891\u5206\u7c7b\uff083D\u5377\u79ef\u7f51\u7edc\u3001TimeSformer\uff09\u3001\u76ee\u6807\u8ddf\u8e2a\uff08SORT\u3001DeepSORT\uff09\u3001\u52a8\u4f5c\u8bc6\u522b\u3001\u6df1\u5ea6\u4f30\u8ba1\uff08\u5355\u76ee\u4e0e\u7acb\u4f53\uff09\u3001\u70b9\u4e91\u3001\u795e\u7ecf\u8f90\u5c04\u573a\uff08NeRF\uff09\u548c3D\u9ad8\u65af\u6cfc\u6e85\u3002
\u6587\u4ef601-04\u5c06\u56fe\u50cf\u89c6\u4e3a\u5b64\u7acb\u5feb\u7167\u3002\u4f46\u89c6\u89c9\u4e16\u754c\u662f\u8fde\u7eed\u7684\uff1a\u7269\u4f53\u5728\u8fd0\u52a8\uff0c\u573a\u666f\u5728\u53d8\u5316\uff0c\u6df1\u5ea6\u771f\u5b9e\u5b58\u5728\u3002\u672c\u6587\u5c06\u8ba1\u7b97\u673a\u89c6\u89c9\u6269\u5c55\u5230\u65f6\u95f4\u57df\uff08\u89c6\u9891\uff09\u548c\u7a7a\u95f4\u57df\uff083D\uff09\uff0c\u6db5\u76d6\u6a21\u578b\u5982\u4f55\u7406\u89e3\u8fd0\u52a8\u3001\u8ddf\u8e2a\u76ee\u6807\u3001\u4f30\u8ba1\u6df1\u5ea6\u548c\u91cd\u5efa\u573a\u666f\u3002
\u89c6\u9891\u662f\u4e00\u7cfb\u5217\u968f\u65f6\u95f4\u6355\u83b7\u7684\u56fe\u50cf\uff08\u5e27\uff09\u3002\u4ee530\u5e27/\u79d2\u8ba1\u7b97\uff0c\u4e00\u6bb510\u79d2\u7684\u7247\u6bb5\u5305\u542b300\u5e27\u3002\u5173\u952e\u6311\u6218\u5728\u4e8e\u5efa\u6a21\u65f6\u95f4\u7ef4\u5ea6\uff1a\u7269\u4f53\u5982\u4f55\u8fd0\u52a8\uff0c\u573a\u666f\u5982\u4f55\u6f14\u53d8\uff0c\u4ee5\u53ca\u5982\u4f55\u8de8\u5e27\u5173\u8054\u4fe1\u606f\u3002
\u5149\u6d41\u4f30\u8ba1\u4e24\u5e27\u8fde\u7eed\u56fe\u50cf\u4e4b\u95f4\u50cf\u7d20\u7684\u8868\u89c2\u8fd0\u52a8\u3002\u5bf9\u4e8e\u5e27\\(t\\)\u4e2d\u7684\u6bcf\u4e2a\u50cf\u7d20\uff0c\u5149\u6d41\u4ea7\u751f\u4e00\u4e2a\u4e8c\u7ef4\u4f4d\u79fb\u5411\u91cf\\((u, v)\\)\uff0c\u6307\u5411\u8be5\u50cf\u7d20\u5728\u5e27\\(t+1\\)\u4e2d\u7684\u4f4d\u7f6e\u3002\u7ed3\u679c\u662f\u4e00\u4e2a\u4e0e\u56fe\u50cf\u5927\u5c0f\u76f8\u540c\u7684\u7a20\u5bc6\u8fd0\u52a8\u573a\u3002
\u5176\u4e2d\\(I_x, I_y\\)\u662f\u7a7a\u95f4\u68af\u5ea6\uff08Sobel\u7b97\u5b50\uff0c\u89c1\u6587\u4ef601\uff09\uff0c\\(I_t\\)\u662f\u65f6\u95f4\u68af\u5ea6\uff08\u76f8\u90bb\u5e27\u7684\u5dee\u503c\uff09\u3002\u8fd9\u5c31\u662f\u5149\u6d41\u7ea6\u675f\u65b9\u7a0b\u3002\u4e00\u4e2a\u65b9\u7a0b\uff0c\u4e24\u4e2a\u672a\u77e5\u6570\\((u, v)\\)\uff1a\u6211\u4eec\u9700\u8981\u989d\u5916\u7684\u7ea6\u675f\u6761\u4ef6\u3002
Lucas-Kanade\u5047\u8bbe\u5149\u6d41\u5728\u4e00\u4e2a\u5c0f\u7a97\u53e3\u5185\uff08\u4f8b\u59825x5\u50cf\u7d20\uff09\u662f\u6052\u5b9a\u7684\u3002\u8fd9\u7ed9\u51fa\u4e86\u4e00\u4e2a\u8d85\u5b9a\u7cfb\u7edf\uff0825\u4e2a\u65b9\u7a0b\uff0c2\u4e2a\u672a\u77e5\u6570\uff09\uff0c\u901a\u8fc7\u6700\u5c0f\u4e8c\u4e58\u6cd5\u6c42\u89e3\uff08\u7b2c06\u7ae0\u7684\u6b63\u89c4\u65b9\u7a0b\uff09\uff1a
\u8fd9\u4e2a2x2\u77e9\u9635\u5c31\u662f\u6587\u4ef601\u4e2d\u7684\u7ed3\u6784\u5f20\u91cf\uff08\u4e0eHarris\u89d2\u70b9\u68c0\u6d4b\u4e2d\u4f7f\u7528\u7684\u77e9\u9635\u76f8\u540c\uff09\u3002Lucas-Kanade\u9002\u7528\u4e8e\u5c0f\u8fd0\u52a8\uff0c\u4f46\u5f53\u7269\u4f53\u5728\u5e27\u95f4\u79fb\u52a8\u8d85\u8fc7\u51e0\u4e2a\u50cf\u7d20\u65f6\u4f1a\u5931\u6548\u3002
Farneback\u65b9\u6cd5\u5bf9\u6bcf\u4e2a\u50cf\u7d20\u90bb\u57df\u8fdb\u884c\u591a\u9879\u5f0f\u5c55\u5f00\uff0c\u5e76\u4f30\u8ba1\u6700\u80fd\u89e3\u91ca\u5e27\u95f4\u53d8\u5316\u7684\u4f4d\u79fb\u573a\u3002\u5b83\u4ea7\u751f\u7a20\u5bc6\u5149\u6d41\uff08\u6bcf\u4e2a\u50cf\u7d20\u4e00\u4e2a\u5411\u91cf\uff09\uff0c\u80fd\u5904\u7406\u6bd4Lucas-Kanade\u66f4\u5927\u7684\u8fd0\u52a8\u3002
\u73b0\u4ee3\u6df1\u5ea6\u5b66\u4e60\u5149\u6d41\u65b9\u6cd5\uff08FlowNet\u3001RAFT\uff09\u5b66\u4e60\u4ece\u5e27\u5bf9\u7aef\u5230\u7aef\u9884\u6d4b\u5149\u6d41\u3002RAFT\uff08Recurrent All-Pairs Field Transforms\uff0cTeed\u548cDeng\uff0c2020\uff09\u8ba1\u7b97\u4e24\u5e27\u4e2d\u6240\u6709\u50cf\u7d20\u5bf9\u4e4b\u95f4\u76844D\u76f8\u5173\u4f53\uff0c\u5e76\u4f7f\u7528\u57fa\u4e8eGRU\u7684\u66f4\u65b0\u7b97\u5b50\u8fed\u4ee3\u4f18\u5316\u5149\u6d41\u4f30\u8ba1\u3002RAFT\u8fbe\u5230\u4e86\u6700\u5148\u8fdb\u7684\u7cbe\u5ea6\uff0c\u5e76\u5df2\u6210\u4e3a\u6807\u51c6\u7684\u5149\u6d41\u9aa8\u5e72\u7f51\u7edc\u3002
\u53cc\u6d41\u7f51\u7edc\uff08Simonyan\u548cZisserman\uff0c2014\uff09\u662f\u89c6\u9891\u7406\u89e3\u7684\u65e9\u671f\u65b9\u6cd5\u3002\u4e00\u4e2a\u6d41\u5904\u7406\u5355\u5e27RGB\u56fe\u50cf\uff08\u5916\u89c2\uff09\uff0c\u53e6\u4e00\u4e2a\u6d41\u5904\u7406\u5149\u6d41\u5e27\u7684\u5806\u53e0\uff08\u8fd0\u52a8\uff09\u3002\u4e24\u4e2a\u6d41\u5728\u672b\u7aef\u878d\u5408\uff08\u901a\u8fc7\u5e73\u5747\u6216\u62fc\u63a5\uff09\u3002\u8fd9\u79cd\u67b6\u6784\u660e\u786e\u533a\u5206\u4e86\"\u4e8b\u7269\u770b\u8d77\u6765\u50cf\u4ec0\u4e48\"\u4e0e\"\u5b83\u4eec\u5982\u4f55\u8fd0\u52a8\"\u3002
3D\u5377\u79ef\u7f51\u7edc\u5c062D\u5377\u79ef\u6269\u5c55\u5230\u65f6\u95f4\u7ef4\u5ea6\u30023D\u5377\u79ef\u4f7f\u7528\u5927\u5c0f\u4e3a\\(k \\times k \\times k_t\\)\u7684\u6ee4\u6ce2\u5668\uff0c\u540c\u65f6\u8de8\u8d8a\u7a7a\u95f4\u548c\u65f6\u95f4\u7ef4\u5ea6\uff0c\u76f4\u63a5\u5b66\u4e60\u65f6\u7a7a\u7279\u5f81\u3002
C3D\uff08Tran\u7b49\u4eba\uff0c2015\uff09\u5806\u53e0\u4e863x3x3\u6ee4\u6ce2\u5668\u76843D\u5377\u79ef\uff0c\u5c55\u793a\u4e86\u65f6\u95f4\u5377\u79ef\u53ef\u4ee5\u5728\u6ca1\u6709\u663e\u5f0f\u5149\u6d41\u7684\u60c5\u51b5\u4e0b\u5b66\u4e60\u8fd0\u52a8\u7279\u5f81\u3002\u4ee3\u4ef7\u662f\u9ad8\u6602\u7684\uff1a3D\u5377\u79ef\u7684\u53c2\u6570\u548c\u8ba1\u7b97\u91cf\u662f\u51762D\u5bf9\u5e94\u7269\u7684\\(k_t\\)\u500d\u3002
I3D\uff08Inflated 3D\uff0cCarreira\u548cZisserman\uff0c2017\uff09\u91c7\u7528\u4e86\u4e00\u79cd\u66f4\u5b9e\u7528\u7684\u65b9\u6cd5\uff1a\u4ece\u9884\u8bad\u7ec3\u76842D CNN\uff08\u5982Inception\u6216ResNet\uff09\u5f00\u59cb\uff0c\u5c06\u6240\u67092D\u6ee4\u6ce2\u5668\u6cbf\u65f6\u95f4\u7ef4\u5ea6\"\u81a8\u80c0\"\u4e3a3D\uff0c\u91cd\u590d\u6743\u91cd\u5e76\u9664\u4ee5\\(k_t\\)\u3002\u8fd9\u5c06ImageNet\u9884\u8bad\u7ec3\u8fc1\u79fb\u5230\u89c6\u9891\uff0c\u540c\u65f6\u589e\u52a0\u4e86\u65f6\u95f4\u5efa\u6a21\u80fd\u529b\u3002\u4e00\u4e2a2D\u7684\\(k \\times k\\)\u6ee4\u6ce2\u5668\u53d8\u4e3a\\(k \\times k \\times k_t\\)\u7684\u6ee4\u6ce2\u5668\uff0c\u521d\u59cb\u5316\u4e3a\\(W_{\\text{3D}}[:,:,j] = W_{\\text{2D}} / k_t\\)\uff0c\u5bf9\u6240\u6709\u65f6\u95f4\u4f4d\u7f6e\\(j\\)\u3002
SlowFast\u7f51\u7edc\uff08Feichtenhofer\u7b49\u4eba\uff0c2019\uff09\u4f7f\u7528\u4e24\u6761\u5e76\u884c\u7684\u8def\u5f84\uff0c\u4ee5\u4e0d\u540c\u7684\u65f6\u95f4\u5206\u8fa8\u7387\u8fd0\u884c\uff1a
\u5176\u6838\u5fc3\u6d1e\u89c1\u662f\uff1a\u7a7a\u95f4\u548c\u65f6\u95f4\u4fe1\u606f\u5177\u6709\u4e0d\u540c\u7684\u5e26\u5bbd\u9700\u6c42\u2014\u2014\u7269\u4f53\u5916\u89c2\u53d8\u5316\u7f13\u6162\uff0c\u4f46\u8fd0\u52a8\u53ef\u4ee5\u5f88\u8fc5\u901f\u3002SlowFast\u901a\u8fc7\u8bbe\u8ba1\u5339\u914d\u8fd9\u79cd\u975e\u5bf9\u79f0\u6027\u3002
TimeSformer\uff08Bertasius\u7b49\u4eba\uff0c2021\uff09\u5c06Vision Transformer\u5e94\u7528\u4e8e\u89c6\u9891\u3002\u5b83\u5c06\u5b8c\u6574\u7684\u65f6\u7a7a\u6ce8\u610f\u529b\uff08\u4ee3\u4ef7\u8fc7\u9ad8\uff1a\\(O((T \\times N)^2)\\)\uff0c\u5176\u4e2d\\(T\\)\u4e3a\u5e27\u6570\uff0c\\(N\\)\u4e3a\u6bcf\u5e27\u7684\u5757\u6570\uff09\u5206\u89e3\u4e3a\u5206\u5757\u6ce8\u610f\u529b\uff1a\u6bcf\u4e2a\u5757\u5728\u65f6\u95f4\u6ce8\u610f\uff08\u6bcf\u4e2a\u5757\u5728\u76f8\u540c\u7a7a\u95f4\u4f4d\u7f6e\u8de8\u65f6\u95f4\u8fdb\u884c\u6ce8\u610f\u529b\uff09\u548c\u7a7a\u95f4\u6ce8\u610f\uff08\u6bcf\u4e2a\u5757\u5728\u540c\u4e00\u5e27\u5185\u8de8\u7a7a\u95f4\u8fdb\u884c\u6ce8\u610f\u529b\uff09\u4e4b\u95f4\u4ea4\u66ff\u3002\u8fd9\u4f7f\u4ee3\u4ef7\u4ece\\(O(T^2 N^2)\\)\u964d\u4f4e\u5230\\(O(T^2 + N^2)\\)\u3002
VideoMAE\uff08Tong\u7b49\u4eba\uff0c2022\uff09\u5c06\u63a9\u7801\u81ea\u7f16\u7801\u5668\u601d\u60f3\uff08\u89c1\u6587\u4ef604\uff09\u6269\u5c55\u5230\u89c6\u9891\u3002\u4f7f\u7528\u6781\u9ad8\u7684\u63a9\u7801\u6bd4\u4f8b\uff0890-95%\uff09\uff0c\u56e0\u4e3a\u89c6\u9891\u5177\u6709\u9ad8\u5ea6\u7684\u65f6\u95f4\u5197\u4f59\u6027\uff1a\u76f8\u90bb\u5e27\u770b\u8d77\u6765\u51e0\u4e4e\u76f8\u540c\uff0c\u56e0\u6b64\u63a9\u7801\u5927\u90e8\u5206\u5757\u540e\u4ecd\u7136\u7559\u6709\u8db3\u591f\u7684\u4fe1\u606f\u8fdb\u884c\u91cd\u5efa\u3002VideoMAE\u5728\u65e0\u6807\u7b7e\u89c6\u9891\u4e0a\u9884\u8bad\u7ec3ViT\u9aa8\u5e72\u7f51\u7edc\uff0c\u5e76\u8fc1\u79fb\u5230\u4e0b\u6e38\u4efb\u52a1\u3002
\u52a8\u4f5c\u8bc6\u522b\u5c06\u89c6\u9891\u7247\u6bb5\u5206\u7c7b\u4e3a\u591a\u79cd\u52a8\u4f5c\u7c7b\u522b\u4e4b\u4e00\uff08\u4f8b\u5982\"\u8dd1\u6b65\"\u3001\"\u70f9\u996a\"\u3001\"\u5f39\u5409\u4ed6\"\uff09\u3002\u5b83\u662f\u56fe\u50cf\u5206\u7c7b\u7684\u89c6\u9891\u5bf9\u5e94\u4efb\u52a1\u3002\u6807\u51c6\u57fa\u51c6\u6570\u636e\u96c6\u5305\u62ecKinetics-400\uff08400\u4e2a\u52a8\u4f5c\u7c7b\u522b\uff0c\u7ea630\u4e07\u4e2a\u7247\u6bb5\uff09\u3001Something-Something\uff08174\u4e2a\u9700\u8981\u65f6\u95f4\u63a8\u7406\u7684\u7ec6\u7c92\u5ea6\u52a8\u4f5c\uff09\u548cActivityNet\uff08200\u4e2a\u7c7b\u522b\uff0c\u5305\u542b\u957f\u65f6\u672a\u88c1\u526a\u89c6\u9891\uff09\u3002
\u65f6\u95f4\u52a8\u4f5c\u68c0\u6d4b\u8d85\u8d8a\u4e86\u5206\u7c7b\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u957f\u6bb5\u672a\u88c1\u526a\u7684\u89c6\u9891\uff0c\u627e\u5230\u6bcf\u4e2a\u52a8\u4f5c\u7684\u5f00\u59cb\u65f6\u95f4\u3001\u7ed3\u675f\u65f6\u95f4\u548c\u7c7b\u522b\u3002\u8fd9\u662f\u76ee\u6807\u68c0\u6d4b\u7684\u65f6\u95f4\u5bf9\u5e94\u4efb\u52a1\u3002ActionFormer\u7b49\u65b9\u6cd5\u4f7f\u7528Transformer\u5904\u7406\u65f6\u95f4\u7279\u5f81\u5e76\u9884\u6d4b\u52a8\u4f5c\u8fb9\u754c\u3002
\u89c6\u9891\u76ee\u6807\u8ddf\u8e2a\u5728\u7b2c\u4e00\u5e27\u8bc6\u522b\u51fa\u7279\u5b9a\u76ee\u6807\u540e\uff0c\u8de8\u5e27\u8ddf\u8e2a\u8be5\u76ee\u6807\u3002
SORT\uff08Simple Online and Realtime Tracking\uff0cBewley\u7b49\u4eba\uff0c2016\uff09\u5c06\u68c0\u6d4b\u6a21\u578b\uff08\u72ec\u7acb\u68c0\u6d4b\u6bcf\u5e27\u4e2d\u7684\u76ee\u6807\uff09\u4e0e\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\uff08\u7528\u4e8e\u8fd0\u52a8\u9884\u6d4b\uff09\u548c\u5308\u7259\u5229\u7b97\u6cd5\uff08\u7528\u4e8e\u5206\u914d\uff09\u76f8\u7ed3\u5408\u3002
\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\u4e3a\u6bcf\u4e2a\u8ddf\u8e2a\u7684\u76ee\u6807\u7ef4\u62a4\u4e00\u4e2a\u72b6\u6001\u4f30\u8ba1\uff08\u4f4d\u7f6e\u3001\u901f\u5ea6\u3001\u5927\u5c0f\uff09\uff0c\u5e76\u4f7f\u7528\u7ebf\u6027\u8fd0\u52a8\u6a21\u578b\u9884\u6d4b\u5b83\u5728\u4e0b\u4e00\u5e27\u4e2d\u7684\u4f4d\u7f6e\u3002\u5f53\u65b0\u7684\u68c0\u6d4b\u7ed3\u679c\u5230\u8fbe\u65f6\uff0c\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\u901a\u8fc7\u7ed3\u5408\u9884\u6d4b\u503c\u548c\u89c2\u6d4b\u503c\uff08\u6309\u5404\u81ea\u7684\u4e0d\u786e\u5b9a\u6027\u52a0\u6743\uff09\u6765\u66f4\u65b0\u5176\u4f30\u8ba1\u3002\u8fd9\u662f\u8d1d\u53f6\u65af\u66f4\u65b0\uff08\u7b2c05\u7ae0\uff09\u5728\u8ddf\u8e2a\u4e2d\u7684\u5e94\u7528\u3002
\u5308\u7259\u5229\u7b97\u6cd5\u89e3\u51b3\u53cc\u7ebf\u6027\u5206\u914d\u95ee\u9898\uff1a\u7ed9\u5b9a\\(M\\)\u4e2a\u5df2\u8ddf\u8e2a\u76ee\u6807\u548c\\(N\\)\u4e2a\u65b0\u68c0\u6d4b\u7ed3\u679c\uff0c\u627e\u5230\u4f7f\u603b\u4ee3\u4ef7\u6700\u5c0f\u5316\u7684\u6700\u4f18\u4e00\u5bf9\u4e00\u5339\u914d\uff08\u4f7f\u7528\u6587\u4ef603\u4e2d\u7684IoU\u8ddd\u79bb\uff09\u3002\u672a\u5339\u914d\u7684\u68c0\u6d4b\u7ed3\u679c\u5f00\u59cb\u65b0\u7684\u8f68\u8ff9\uff1b\u672a\u5339\u914d\u7684\u8f68\u8ff9\u5728\u5bbd\u9650\u671f\u540e\u88ab\u7ec8\u6b62\u3002
DeepSORT\u901a\u8fc7\u6dfb\u52a0\u6df1\u5ea6\u5916\u89c2\u7279\u5f81\u6269\u5c55\u4e86SORT\uff1a\u6bcf\u4e2a\u68c0\u6d4b\u5230\u7684\u76ee\u6807\u7ecf\u8fc7\u4e00\u4e2a\u5c0f\u578bCNN\uff0c\u4ea7\u751f\u4e00\u4e2a\u5916\u89c2\u5d4c\u5165\uff08\u63cf\u8ff0\u5b50\u5411\u91cf\uff09\u3002\u5339\u914d\u4ee3\u4ef7\u7ed3\u5408\u4e86IoU\u8ddd\u79bb\u548c\u5d4c\u5165\u7a7a\u95f4\u4e2d\u7684\u4f59\u5f26\u8ddd\u79bb\uff08\u7b2c01\u7ae0\uff09\u3002\u8fd9\u5904\u7406\u4e86\u906e\u6321\u548c\u91cd\u8bc6\u522b\uff1a\u5373\u4f7f\u4e00\u4e2a\u76ee\u6807\u5728\u5176\u4ed6\u76ee\u6807\u540e\u6d88\u5931\u6570\u5e27\uff0c\u5176\u5916\u89c2\u5d4c\u5165\u5141\u8bb8\u5728\u91cd\u65b0\u51fa\u73b0\u65f6\u91cd\u65b0\u5339\u914d\u3002
ByteTrack\uff08Zhang\u7b49\u4eba\uff0c2022\uff09\u901a\u8fc7\u4f7f\u7528\u6240\u6709\u68c0\u6d4b\u7ed3\u679c\uff08\u5305\u62ec\u4f4e\u7f6e\u4fe1\u5ea6\u7684\uff09\u6765\u6539\u8fdb\u8ddf\u8e2a\u3002\u5927\u591a\u6570\u8ddf\u8e2a\u5668\u4f1a\u4e22\u5f03\u4f4e\u4e8e\u7f6e\u4fe1\u5ea6\u9608\u503c\u7684\u68c0\u6d4b\u7ed3\u679c\u3002ByteTrack\u9996\u5148\u5c06\u9ad8\u7f6e\u4fe1\u5ea6\u68c0\u6d4b\u7ed3\u679c\u4e0e\u73b0\u6709\u8f68\u8ff9\u5339\u914d\uff0c\u7136\u540e\u5c06\u5269\u4f59\u7684\u4f4e\u7f6e\u4fe1\u5ea6\u68c0\u6d4b\u7ed3\u679c\u4e0e\u672a\u5339\u914d\u7684\u8f68\u8ff9\u5339\u914d\u3002\u8fd9\u6062\u590d\u4e86\u6682\u65f6\u88ab\u906e\u6321\u6216\u6a21\u7cca\uff08\u56e0\u6b64\u68c0\u6d4b\u7f6e\u4fe1\u5ea6\u4f4e\uff09\u7684\u76ee\u6807\u3002
3D\u89c6\u89c9\u6062\u590d\u57282D\u56fe\u50cf\u6295\u5f71\u4e2d\u4e22\u5931\u7684\u7b2c\u4e09\u4e2a\u7a7a\u95f4\u7ef4\u5ea6\uff08\u89c1\u6587\u4ef601\uff09\u3002
\u6df1\u5ea6\u4f30\u8ba1\u9884\u6d4b\u4ece\u76f8\u673a\u5230\u573a\u666f\u4e2d\u6bcf\u4e2a\u70b9\u7684\u8ddd\u79bb\u3002
\u7acb\u4f53\u6df1\u5ea6\u4f7f\u7528\u4e24\u4e2a\u76f8\u8ddd\u57fa\u7ebf\u8ddd\u79bb\\(b\\)\u7684\u76f8\u673a\u3002\u540c\u4e00\u4e2a\u70b9\u5728\u5de6\u53f3\u56fe\u50cf\u4e2d\u51fa\u73b0\u5728\u4e0d\u540c\u7684\u6c34\u5e73\u4f4d\u7f6e\uff08\u8fd9\u4e2a\u504f\u79fb\u79f0\u4e3a\u89c6\u5dee\\(d\\)\uff09\u3002\u6df1\u5ea6\u4e0e\u89c6\u5dee\u6210\u53cd\u6bd4\uff1a
\u5176\u4e2d\\(f\\)\u662f\u7126\u8ddd\uff0c\\(b\\)\u662f\u57fa\u7ebf\u8ddd\u79bb\u3002\u8ba1\u7b97\u89c6\u5dee\u9700\u8981\u627e\u5230\u4e24\u4e2a\u56fe\u50cf\u4e4b\u95f4\u7684\u5bf9\u5e94\u70b9\uff08\u7acb\u4f53\u5339\u914d\uff09\uff0c\u8fd9\u662f\u6cbf\u6c34\u5e73\u626b\u63cf\u7ebf\u7684\u4e00\u7ef4\u641c\u7d22\uff08\u56e0\u4e3a\u76f8\u673a\u6c34\u5e73\u5bf9\u9f50\uff0c3D\u4e2d\u540c\u4e00\u9ad8\u5ea6\u7684\u70b9\u6295\u5f71\u5230\u4e24\u5e45\u56fe\u50cf\u7684\u540c\u4e00\u884c\uff09\u3002
\u5355\u76ee\u6df1\u5ea6\u4f30\u8ba1\u4ece\u5355\u5f20\u56fe\u50cf\u9884\u6d4b\u6df1\u5ea6\uff0c\u8fd9\u672c\u8d28\u4e0a\u662f\u75c5\u6001\u95ee\u9898\uff08\u65e0\u9650\u591a\u4e2a3D\u573a\u666f\u53ef\u4ee5\u4ea7\u751f\u76f8\u540c\u76842D\u56fe\u50cf\uff09\u3002\u7136\u800c\uff0c\u4eba\u7c7b\u5229\u7528\u76f8\u5bf9\u5927\u5c0f\u3001\u7eb9\u7406\u68af\u5ea6\u3001\u906e\u6321\u548c\u5927\u6c14\u96fe\u973e\u7b49\u7ebf\u7d22\u6beb\u4e0d\u8d39\u529b\u5730\u505a\u5230\u8fd9\u4e00\u70b9\u3002\u6df1\u5ea6\u5b66\u4e60\u7f51\u7edc\u4ece\u8bad\u7ec3\u6570\u636e\u4e2d\u5b66\u4e60\u8fd9\u4e9b\u7ebf\u7d22\u3002
MiDaS\u548cDepth Anything\u7b49\u6a21\u578b\u4ece\u5355\u5f20\u56fe\u50cf\u9884\u6d4b\u76f8\u5bf9\u6df1\u5ea6\u56fe\uff08\u6392\u5e8f\u54ea\u4e9b\u7269\u4f53\u66f4\u8fd1\uff09\u3002\u5b83\u4eec\u4f7f\u7528\u5c3a\u5ea6\u4e0d\u53d8\u635f\u5931\u5728\u5404\u79cd\u6570\u636e\u96c6\u4e0a\u8bad\u7ec3\uff0c\u5c3d\u7ba1\u7406\u8bba\u4e0a\u5b58\u5728\u6b67\u4e49\uff0c\u4f46\u4ecd\u80fd\u4ea7\u751f\u975e\u5e38\u51c6\u786e\u7684\u7ed3\u679c\u3002
\u70b9\u4e91\u662f3D\u70b9\\((x, y, z)\\)\u7684\u96c6\u5408\uff0c\u53ef\u9009\u5730\u5e26\u6709\u989c\u8272\u6216\u5176\u4ed6\u5c5e\u6027\uff0c\u7531LiDAR\u4f20\u611f\u5668\u6216\u7acb\u4f53\u91cd\u5efa\u6355\u83b7\u3002\u4e0e\u56fe\u50cf\u4e0d\u540c\uff0c\u70b9\u4e91\u662f\u65e0\u5e8f\u4e14\u4e0d\u89c4\u5219\u95f4\u9694\u7684\u3002
PointNet\uff08Qi\u7b49\u4eba\uff0c2017\uff09\u901a\u8fc7\u72ec\u7acb\u5730\u5bf9\u6bcf\u4e2a\u70b9\u5e94\u7528\u5171\u4eabMLP\uff0c\u7136\u540e\u4f7f\u7528\u6700\u5927\u6c60\u5316\u805a\u5408\uff08\u8fd9\u662f\u7f6e\u6362\u4e0d\u53d8\u7684\uff0c\u89e3\u51b3\u4e86\u6392\u5e8f\u95ee\u9898\uff09\uff0c\u76f4\u63a5\u5904\u7406\u70b9\u4e91\u3002PointNet++\u589e\u52a0\u4e86\u5c42\u6b21\u5316\u5206\u7ec4\uff0c\u4ee5\u6355\u83b7\u591a\u5c3a\u5ea6\u7684\u5c40\u90e8\u7ed3\u6784\u3002
\u795e\u7ecf\u8f90\u5c04\u573a\uff08NeRF\uff09\uff08Mildenhall\u7b49\u4eba\uff0c2020\uff09\u5c063D\u573a\u666f\u8868\u793a\u4e3a\u4e00\u4e2a\u8fde\u7eed\u51fd\u6570\uff0c\u5c063D\u4f4d\u7f6e\\((x, y, z)\\)\u548c\u89c6\u89d2\u65b9\u5411\\((\\theta, \\phi)\\)\u6620\u5c04\u5230\u989c\u8272\\((r, g, b)\\)\u548c\u5bc6\u5ea6\\(\\sigma\\)\u3002\u8be5\u51fd\u6570\u7531\u4e00\u4e2aMLP\u53c2\u6570\u5316\uff1a
NeRF\u901a\u8fc7\u6700\u5c0f\u5316\u6e32\u67d3\u50cf\u7d20\u4e0e\u4e00\u7ec4\u5e26\u4f4d\u59ff\u7167\u7247\u7684\u771f\u5b9e\u50cf\u7d20\u4e4b\u95f4\u7684MSE\u6765\u8bad\u7ec3\u3002\u8bad\u7ec3\u5b8c\u6210\u540e\uff0cNeRF\u53ef\u4ee5\u4ece\u4efb\u4f55\u76f8\u673a\u4f4d\u7f6e\u6e32\u67d3\u903c\u771f\u7684\u65b0\u89c6\u89d2\u3002\u5176\u5c40\u9650\u6027\u5728\u4e8e\u901f\u5ea6\uff1a\u6e32\u67d3\u9700\u8981\u5bf9MLP\u8fdb\u884c\u6570\u767e\u4e07\u6b21\u8bc4\u4f30\uff08\u6bcf\u4e2a\u50cf\u7d20\u6bcf\u4e2a\u91c7\u6837\u70b9\u4e00\u6b21\uff09\uff0c\u8fd9\u4f7f\u5f97\u5b9e\u65f6\u6e32\u67d3\u53d8\u5f97\u56f0\u96be\u3002
3D\u9ad8\u65af\u6cfc\u6e85\uff08Kerbl\u7b49\u4eba\uff0c2023\uff09\u901a\u8fc7\u5c06\u573a\u666f\u8868\u793a\u4e3a3D\u9ad8\u65af\u539f\u8bed\u7684\u96c6\u5408\uff08\u800c\u975e\u8fde\u7eed\u7684\u4f53\u79ef\u51fd\u6570\uff09\u6765\u89e3\u51b3NeRF\u7684\u901f\u5ea6\u9650\u5236\u3002\u6bcf\u4e2a\u9ad8\u65af\u539f\u8bed\u6709\u4e00\u4e2a3D\u4f4d\u7f6e\uff08\u5747\u503c\uff09\u3001\u4e00\u4e2a3D\u534f\u65b9\u5dee\u77e9\u9635\uff08\u63a7\u5236\u5f62\u72b6\u548c\u671d\u5411\uff09\u3001\u4e0d\u900f\u660e\u5ea6\u53ca\u989c\u8272\uff08\u8868\u793a\u4e3a\u7403\u8c10\u51fd\u6570\u4ee5\u5b9e\u73b0\u89c6\u89d2\u76f8\u5173\u6548\u679c\uff09\u3002
\u6e32\u67d3\u5c06\u6bcf\u4e2a3D\u9ad8\u65af\u6295\u5f71\u5230\u56fe\u50cf\u5e73\u9762\uff08\u4ea7\u751f\u4e00\u4e2a2D\u9ad8\u65af\"\u6cfc\u6e85\"\uff09\uff0c\u6309\u6df1\u5ea6\u6392\u5e8f\uff0c\u5e76\u4f7f\u7528alpha\u6df7\u5408\u4ece\u524d\u5f80\u540e\u5408\u6210\u3002\u8fd9\u662f\u4e00\u4e2a\u5728GPU\u4e0a\u5b9e\u65f6\u8fd0\u884c\u7684\u6805\u683c\u5316\u8fc7\u7a0b\uff08100+ FPS\uff09\uff0c\u6bd4NeRF\u7684\u5c04\u7ebf\u6b65\u8fdb\u5feb\u51e0\u4e2a\u6570\u91cf\u7ea7\u3002\u9ad8\u65af\u6cfc\u6e85\u8fbe\u5230\u6216\u8d85\u8fc7NeRF\u7684\u8d28\u91cf\uff0c\u540c\u65f6\u5b9e\u73b0\u5b9e\u65f6\u6e32\u67d3\u3002
SLAM\uff08\u540c\u65f6\u5b9a\u4f4d\u4e0e\u5730\u56fe\u6784\u5efa\uff09\u662f\u5728\u672a\u77e5\u73af\u5883\u4e2d\u6784\u5efa\u5730\u56fe\u540c\u65f6\u8ddf\u8e2a\u76f8\u673a\u81ea\u8eab\u4f4d\u7f6e\u7684\u95ee\u9898\u3002\u8fd9\u662f\u673a\u5668\u4eba\u3001\u81ea\u52a8\u9a7e\u9a76\u548cAR\u7684\u57fa\u7840\u3002
\u89c6\u89c9\u91cc\u7a0b\u8ba1\u901a\u8fc7\u8de8\u56fe\u50cf\u8ddf\u8e2a\u7279\u5f81\u6765\u4f30\u8ba1\u76f8\u673a\u4ece\u4e00\u5e27\u5230\u53e6\u4e00\u5e27\u7684\u8fd0\u52a8\u3002\u7279\u5f81\u70b9\uff08SIFT\u3001ORB\uff0c\u89c1\u6587\u4ef601\uff09\u5728\u8fde\u7eed\u5e27\u4e4b\u95f4\u5339\u914d\uff0c\u5e76\u5229\u7528\u8fd9\u4e9b\u5339\u914d\u5173\u7cfb\u901a\u8fc7\u672c\u8d28\u77e9\u9635\uff08\u7f16\u7801\u4e24\u89c6\u56fe\u4e4b\u95f4\u7684\u51e0\u4f55\u5173\u7cfb\uff0c\u7531\u6587\u4ef601\u7684\u5185\u53c2\u548c\u5916\u53c2\u63a8\u5bfc\uff09\u4f30\u8ba1\u76f8\u673a\u7684\u65cb\u8f6c\u548c\u5e73\u79fb\u3002
\u57fa\u4e8e\u7279\u5f81\u7684SLAM\u901a\u8fc7\u7ef4\u62a4\u6301\u4e45\u5730\u56fe\u6765\u6269\u5c55\u89c6\u89c9\u91cc\u7a0b\u8ba1\u3002ORB-SLAM\uff08Mur-Artal\u7b49\u4eba\uff0c2015\uff09\u662f\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684\u57fa\u4e8e\u7279\u5f81\u7684SLAM\u7cfb\u7edf\u3002\u5b83\u6709\u4e09\u4e2a\u5e76\u884c\u7ebf\u7a0b\uff1a
LiDAR SLAM\u4f7f\u7528\u6765\u81eaLiDAR\u4f20\u611f\u5668\u76843D\u70b9\u4e91\u66ff\u4ee3\uff08\u6216\u8865\u5145\uff09\u76f8\u673a\u56fe\u50cf\u3002LiDAR\u63d0\u4f9b\u76f4\u63a5\u7684\u6df1\u5ea6\u6d4b\u91cf\uff0c\u4f7f\u51e0\u4f55\u4f30\u8ba1\u66f4\u9c81\u68d2\uff0c\u4f46\u786c\u4ef6\u6210\u672c\u66f4\u9ad8\u3002LOAM\uff08LiDAR Odometry and Mapping\uff09\u7b49\u65b9\u6cd5\u4f7f\u7528\u8fed\u4ee3\u6700\u8fd1\u70b9\uff08ICP\uff09\u914d\u51c6\u6765\u5bf9\u9f50\u8fde\u7eed\u626b\u63cf\u4e4b\u95f4\u7684\u70b9\u4e91\u3002
\u89c6\u89c9-\u60ef\u6027SLAM\u878d\u5408\u76f8\u673a\u6570\u636e\u4e0eIMU\uff08\u52a0\u901f\u5ea6\u8ba1+\u9640\u87ba\u4eea\uff09\u7684\u6d4b\u91cf\u7ed3\u679c\u3002IMU\u63d0\u4f9b\u9ad8\u9891\u7684\u65cb\u8f6c\u548c\u52a0\u901f\u5ea6\u4f30\u8ba1\uff0c\u5f25\u8865\u76f8\u673a\u5e27\u4e4b\u95f4\u7684\u95f4\u9699\uff0c\u5e76\u5904\u7406\u5feb\u901f\u8fd0\u52a8\u6216\u4e34\u65f6\u89c6\u89c9\u7279\u5f81\u4e22\u5931\u7684\u60c5\u51b5\u3002
VR/AR\u5e94\u7528\u662f\u8ba1\u7b97\u673a\u89c6\u89c9\u6700\u82db\u523b\u7684\u6d88\u8d39\u8005\u4e4b\u4e00\u3002
\u59ff\u6001\u4f30\u8ba1\u4ece\u56fe\u50cf\u4e2d\u786e\u5b9a\u4eba\u4f53\uff08\u6216\u9762\u90e8\u3001\u624b\u90e8\uff09\u7684\u4f4d\u7f6e\u548c\u671d\u5411\u3002\u8eab\u4f53\u59ff\u6001\u901a\u5e38\u8868\u793a\u4e3a\u4e00\u7ec42D\u62163D\u5173\u952e\u70b9\u4f4d\u7f6e\uff08\u5173\u8282\u70b9\uff1a\u80a9\u8180\u3001\u8098\u90e8\u3001\u624b\u8155\u3001\u9acb\u90e8\u3001\u819d\u76d6\u3001\u811a\u8e1d\uff09\u3002OpenPose\u548cMediaPipe\u7b49\u6a21\u578b\u4f7f\u7528\u70ed\u56fe\u56de\u5f52\u9884\u6d4b\u8fd9\u4e9b\u5173\u952e\u70b9\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u5173\u8282\u70b9\uff0c\u6a21\u578b\u8f93\u51fa\u4e00\u4e2a\u70ed\u56fe\uff0c\u5176\u4e2d\u5cf0\u503c\u6307\u793a\u5173\u8282\u70b9\u7684\u4f4d\u7f6e\u3002
\u81ea\u4e0a\u800c\u4e0b\u7684\u65b9\u6cd5\u9996\u5148\u4f7f\u7528\u8fb9\u754c\u6846\u68c0\u6d4b\u5668\uff08\u89c1\u6587\u4ef603\uff09\u68c0\u6d4b\u4eba\u7269\uff0c\u7136\u540e\u5728\u6bcf\u4e2a\u6846\u5185\u4f30\u8ba1\u59ff\u6001\u3002\u81ea\u4e0b\u800c\u4e0a\u7684\u65b9\u6cd5\u9996\u5148\u68c0\u6d4b\u56fe\u50cf\u4e2d\u7684\u6240\u6709\u5173\u952e\u70b9\uff0c\u7136\u540e\u4f7f\u7528\u90e8\u4f4d\u4eb2\u548c\u573a\uff08\u7f16\u7801\u8fde\u63a5\u5173\u8282\u70b9\u4e4b\u95f4\u5173\u8054\u7684\u5411\u91cf\u573a\uff09\u5c06\u5b83\u4eec\u5206\u7ec4\u4e3a\u4e2a\u4f53\u3002
\u573a\u666f\u91cd\u5efa\u4ece\u4f20\u611f\u5668\u6570\u636e\u6784\u5efa\u73af\u5883\u76843D\u6a21\u578b\u3002\u5728AR\u4e2d\uff0c\u8fd9\u4f7f\u5f97\u53ef\u4ee5\u5c06\u865a\u62df\u7269\u4f53\u653e\u7f6e\u5728\u771f\u5b9e\u8868\u9762\u4e0a\u3001\u906e\u6321\u771f\u5b9e\u7269\u4f53\u540e\u9762\u7684\u865a\u62df\u7269\u4f53\u4ee5\u53ca\u6295\u5c04\u865a\u62df\u9634\u5f71\u3002\u5b9e\u65f6\u573a\u666f\u91cd\u5efa\u65b9\u6cd5\uff08\u5982ARKit\u548cARCore\u4e2d\u57fa\u4e8e\u6df1\u5ea6\u4f20\u611f\u5668\u7684\u7cfb\u7edf\uff09\u6784\u5efa\u73af\u5883\u7684\u7a00\u758f\u7f51\u683c\uff0c\u5e76\u968f\u7740\u7528\u6237\u79fb\u52a8\u800c\u66f4\u65b0\u3002
VR\u4e2d\u7684\u5b9e\u65f6\u6e32\u67d3\u7ea6\u675f\u6781\u4e3a\u82db\u523b\uff1a\u53cc\u773c\u9700\u8981\u72ec\u7acb\u6e32\u67d390+ FPS\uff08\u4ee5\u907f\u514d\u6655\u52a8\u75c7\uff09\uff0c\u4ece\u5934\u90e8\u4f4d\u79fb\u5230\u663e\u793a\u66f4\u65b0\u7684\u5ef6\u8fdf\u9700\u4f4e\u4e8e20\u6beb\u79d2\u3002\u6ce8\u89c6\u70b9\u6e32\u67d3\uff08\u4ec5\u6e32\u67d3\u7528\u6237\u6ce8\u89c6\u4f4d\u7f6e\u7684\u9ad8\u5206\u8fa8\u7387\uff0c\u4f7f\u7528\u773c\u52a8\u8ffd\u8e2a\uff09\u548c\u91cd\u6295\u5f71\uff08\u57fa\u4e8e\u65b0\u5934\u90e8\u4f4d\u59ff\u626d\u66f2\u4e0a\u4e00\u5e27\u4ee5\u586b\u8865\u4e0b\u4e00\u5e27\u6e32\u67d3\u95f4\u9699\uff09\u7b49\u6280\u672f\u5bf9\u4e8e\u6ee1\u8db3\u8fd9\u4e9b\u7ea6\u675f\u81f3\u5173\u91cd\u8981\u3002
\u5b9e\u65f6\u795e\u7ecf\u6e32\u67d3\uff083D\u9ad8\u65af\u6cfc\u6e85\uff09\u3001\u9c81\u68d2\u8ddf\u8e2a\uff08\u89c6\u89c9-\u60ef\u6027SLAM\uff09\u548c\u9ad8\u6548\u59ff\u6001\u4f30\u8ba1\u7684\u878d\u5408\uff0c\u6b63\u4f7f\u903c\u771f\u7684\u4ea4\u4e92\u5f0fAR/VR\u4f53\u9a8c\u53d8\u5f97\u8d8a\u6765\u8d8a\u53ef\u884c\u3002
\u4ece\u5934\u5b9e\u73b0Lucas-Kanade\u5149\u6d41\u7b97\u6cd5\u3002\u8ba1\u7b97\u4e00\u4e2a\u65b9\u5757\u5411\u53f3\u79fb\u52a8\u7684\u4e24\u5e27\u5408\u6210\u56fe\u50cf\u4e4b\u95f4\u7684\u5149\u6d41\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef lucas_kanade(frame1, frame2, window_size=5):\n \"\"\"Lucas-Kanade\u5149\u6d41\u3002\"\"\"\n # \u8ba1\u7b97\u68af\u5ea6\n Ix = jnp.zeros_like(frame1)\n Iy = jnp.zeros_like(frame1)\n It = frame2 - frame1\n\n # Sobel\u98ce\u683c\u68af\u5ea6\n Ix = Ix.at[1:-1, :].set((frame1[2:, :] - frame1[:-2, :]) / 2)\n Iy = Iy.at[:, 1:-1].set((frame1[:, 2:] - frame1[:, :-2]) / 2)\n\n H, W = frame1.shape\n half_w = window_size // 2\n u = jnp.zeros_like(frame1)\n v = jnp.zeros_like(frame1)\n\n for i in range(half_w, H - half_w):\n for j in range(half_w, W - half_w):\n Ix_win = Ix[i-half_w:i+half_w+1, j-half_w:j+half_w+1].ravel()\n Iy_win = Iy[i-half_w:i+half_w+1, j-half_w:j+half_w+1].ravel()\n It_win = It[i-half_w:i+half_w+1, j-half_w:j+half_w+1].ravel()\n\n A = jnp.stack([Ix_win, Iy_win], axis=1)\n ATA = A.T @ A\n ATb = -A.T @ It_win\n\n # \u68c0\u67e5\u7cfb\u7edf\u662f\u5426\u826f\u6001\n det = ATA[0,0] * ATA[1,1] - ATA[0,1] * ATA[1,0]\n if jnp.abs(det) > 1e-6:\n flow = jnp.linalg.solve(ATA, ATb)\n u = u.at[i, j].set(flow[0])\n v = v.at[i, j].set(flow[1])\n\n return u, v\n\n# \u521b\u5efa\u4e24\u5e27\uff1a\u4e00\u4e2a\u5411\u53f3\u79fb\u52a8\u7684\u767d\u8272\u65b9\u5757\nframe1 = jnp.zeros((64, 64))\nframe1 = frame1.at[20:40, 15:35].set(1.0)\n\nframe2 = jnp.zeros((64, 64))\nframe2 = frame2.at[20:40, 20:40].set(1.0) # \u5411\u53f3\u79fb\u52a85\u4e2a\u50cf\u7d20\n\nu, v = lucas_kanade(frame1, frame2, window_size=7)\n\n# \u53ef\u89c6\u5316\nfig, axes = plt.subplots(1, 3, figsize=(14, 4))\naxes[0].imshow(frame1, cmap='gray'); axes[0].set_title('\u5e271'); axes[0].axis('off')\naxes[1].imshow(frame2, cmap='gray'); axes[1].set_title('\u5e272'); axes[1].axis('off')\n\n# \u5149\u6d41\u7684\u7bad\u77e2\u56fe\uff08\u4e3a\u6e05\u6670\u8d77\u89c1\u964d\u91c7\u6837\uff09\nstep = 4\nY, X = jnp.mgrid[0:64:step, 0:64:step]\naxes[2].imshow(frame1, cmap='gray', alpha=0.5)\naxes[2].quiver(X, Y, u[::step, ::step], v[::step, ::step],\n color='#e74c3c', scale=50, width=0.005)\naxes[2].set_title('\u5149\u6d41'); axes[2].axis('off')\n\nplt.tight_layout(); plt.show()\n\n# \u68c0\u67e5\u8fd0\u52a8\u533a\u57df\u7684\u5e73\u5747\u5149\u6d41\nregion_u = u[20:40, 15:35]\nprint(f\"\u7269\u4f53\u533a\u57df\u7684\u5e73\u5747\u6c34\u5e73\u5149\u6d41: {region_u[region_u != 0].mean():.2f} \u50cf\u7d20\")\n \u5b9e\u73b0\u4e00\u4e2a\u7528\u4e8e2D\u76ee\u6807\u8ddf\u8e2a\u7684\u7b80\u5355\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\u3002\u6a21\u62df\u4e00\u4e2a\u5e26\u566a\u58f0\u7684\u8f68\u8ff9\uff0c\u5e76\u5c55\u793a\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\u5982\u4f55\u5e73\u6ed1\u4f30\u8ba1\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef kalman_predict(x, P, F, Q):\n \"\"\"\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\u9884\u6d4b\u6b65\u9aa4\u3002\"\"\"\n x_pred = F @ x\n P_pred = F @ P @ F.T + Q\n return x_pred, P_pred\n\ndef kalman_update(x_pred, P_pred, z, H, R):\n \"\"\"\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\u66f4\u65b0\u6b65\u9aa4\u3002\"\"\"\n y = z - H @ x_pred # \u521b\u65b0\n S = H @ P_pred @ H.T + R # \u521b\u65b0\u534f\u65b9\u5dee\n K = P_pred @ H.T @ jnp.linalg.inv(S) # \u5361\u5c14\u66fc\u589e\u76ca\n x_updated = x_pred + K @ y\n P_updated = (jnp.eye(len(x_pred)) - K @ H) @ P_pred\n return x_updated, P_updated\n\n# \u72b6\u6001: [x, y, vx, vy]\ndt = 1.0\nF = jnp.array([[1, 0, dt, 0], # \u72b6\u6001\u8f6c\u79fb\n [0, 1, 0, dt],\n [0, 0, 1, 0],\n [0, 0, 0, 1]])\nH = jnp.array([[1, 0, 0, 0], # \u89c2\u6d4b\uff1a\u6d4b\u91cf x, y\n [0, 1, 0, 0]])\nQ = jnp.eye(4) * 0.01 # \u8fc7\u7a0b\u566a\u58f0\nR = jnp.eye(2) * 4.0 # \u6d4b\u91cf\u566a\u58f0\uff08\u6709\u566a\u58f0\u7684\u68c0\u6d4b\u5668\uff09\n\n# \u6a21\u62df\u771f\u5b9e\u8f68\u8ff9\uff1a\u5706\u5468\u8fd0\u52a8\nn_steps = 50\nt = jnp.linspace(0, 2 * jnp.pi, n_steps)\ntrue_x = 10 * jnp.cos(t) + 20\ntrue_y = 10 * jnp.sin(t) + 20\n\n# \u5e26\u566a\u58f0\u7684\u89c2\u6d4b\nkey = jax.random.PRNGKey(42)\nnoise = jax.random.normal(key, (n_steps, 2)) * 2.0\nobs_x = true_x + noise[:, 0]\nobs_y = true_y + noise[:, 1]\n\n# \u8fd0\u884c\u5361\u5c14\u66fc\u6ee4\u6ce2\u5668\nx = jnp.array([obs_x[0], obs_y[0], 0.0, 0.0]) # \u521d\u59cb\u72b6\u6001\nP = jnp.eye(4) * 10.0 # \u521d\u59cb\u4e0d\u786e\u5b9a\u6027\n\nkalman_x, kalman_y = [], []\nfor i in range(n_steps):\n x, P = kalman_predict(x, P, F, Q)\n z = jnp.array([obs_x[i], obs_y[i]])\n x, P = kalman_update(x, P, z, H, R)\n kalman_x.append(x[0])\n kalman_y.append(x[1])\n\nkalman_x = jnp.array(kalman_x)\nkalman_y = jnp.array(kalman_y)\n\n# \u53ef\u89c6\u5316\nplt.figure(figsize=(8, 8))\nplt.plot(true_x, true_y, 'k-', linewidth=2, label='\u771f\u5b9e\u8f68\u8ff9')\nplt.scatter(obs_x, obs_y, c='#e74c3c', s=20, alpha=0.5, label='\u5e26\u566a\u58f0\u7684\u89c2\u6d4b')\nplt.plot(kalman_x, kalman_y, '#3498db', linewidth=2, label='\u5361\u5c14\u66fc\u6ee4\u6ce2')\nplt.legend(); plt.grid(alpha=0.3)\nplt.title('\u5361\u5c14\u66fc\u6ee4\u6ce2\u8ddf\u8e2a')\nplt.xlabel('x'); plt.ylabel('y')\nplt.axis('equal'); plt.show()\n\nobs_error = jnp.mean(jnp.sqrt((obs_x - true_x)**2 + (obs_y - true_y)**2))\nkalman_error = jnp.mean(jnp.sqrt((kalman_x - true_x)**2 + (kalman_y - true_y)**2))\nprint(f\"\u89c2\u6d4bRMSE: {obs_error:.2f}\")\nprint(f\"\u5361\u5c14\u66fc\u6ee4\u6ce2RMSE: {kalman_error:.2f}\")\nprint(f\"\u8bef\u5dee\u964d\u4f4e: {(1 - kalman_error/obs_error) * 100:.1f}%\")\n \u5b9e\u73b0\u4e00\u4e2a\u7b80\u5316\u7684NeRF\u98ce\u683c\u4f53\u6e32\u67d3\u7ba1\u7ebf\u3002\u901a\u8fc7\u4e00\u4e2a\u7b80\u5355\u76843D\u573a\u666f\uff08\u5df2\u77e5\u989c\u8272\u548c\u5bc6\u5ea6\u7684\u7403\u4f53\uff09\u6295\u5c04\u5c04\u7ebf\uff0c\u5e76\u6cbf\u6bcf\u6761\u5c04\u7ebf\u79ef\u5206\u6765\u6e32\u67d3\u56fe\u50cf\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef render_ray(origin, direction, spheres, n_samples=64, t_near=1.0, t_far=6.0):\n \"\"\"\u7a7f\u8fc7\u7403\u4f53\u573a\u666f\u5bf9\u5355\u6761\u5c04\u7ebf\u8fdb\u884c\u4f53\u6e32\u67d3\u3002\"\"\"\n t_vals = jnp.linspace(t_near, t_far, n_samples)\n deltas = jnp.concatenate([jnp.diff(t_vals), jnp.array([1e-3])])\n\n colour = jnp.zeros(3)\n transmittance = 1.0\n\n for i in range(n_samples):\n point = origin + t_vals[i] * direction\n\n # \u8ba1\u7b97\u8be5\u70b9\u7684\u5bc6\u5ea6\u548c\u989c\u8272\n density = 0.0\n point_colour = jnp.zeros(3)\n\n for center, radius, col, sigma in spheres:\n dist = jnp.linalg.norm(point - center)\n # \u8f6f\u7403\u4f53\uff1a\u5bc6\u5ea6\u968f\u8ddd\u8868\u9762\u7684\u8ddd\u79bb\u6307\u6570\u8870\u51cf\n d = jnp.exp(-jnp.maximum(0, dist - radius) * sigma) * sigma\n density += d\n point_colour += d * jnp.array(col)\n\n # \u6309\u603b\u5bc6\u5ea6\u5f52\u4e00\u5316\u989c\u8272\n point_colour = jnp.where(density > 1e-6, point_colour / density, point_colour)\n\n # \u4f53\u6e32\u67d3\u65b9\u7a0b\n alpha = 1.0 - jnp.exp(-density * deltas[i])\n colour += transmittance * alpha * point_colour\n transmittance *= (1.0 - alpha)\n\n return colour\n\n# \u573a\u666f\uff1a\u4e09\u4e2a\u5f69\u8272\u7403\u4f53\nspheres = [\n (jnp.array([0.0, 0.0, 4.0]), 0.8, [1.0, 0.2, 0.2], 5.0), # \u7ea2\u8272\n (jnp.array([1.5, 0.5, 5.0]), 0.6, [0.2, 1.0, 0.2], 5.0), # \u7eff\u8272\n (jnp.array([-1.0, -0.5, 3.5]), 0.5, [0.2, 0.2, 1.0], 5.0), # \u84dd\u8272\n]\n\n# \u76f8\u673a\u8bbe\u7f6e\nimg_h, img_w = 64, 64\nfocal = 60.0\norigin = jnp.array([0.0, 0.0, 0.0])\n\nimage = jnp.zeros((img_h, img_w, 3))\nfor i in range(img_h):\n for j in range(img_w):\n # \u8ba1\u7b97\u5c04\u7ebf\u65b9\u5411\n px = (j - img_w / 2) / focal\n py = -(i - img_h / 2) / focal\n direction = jnp.array([px, py, 1.0])\n direction = direction / jnp.linalg.norm(direction)\n\n colour = render_ray(origin, direction, spheres)\n image = image.at[i, j].set(jnp.clip(colour, 0, 1))\n\nplt.figure(figsize=(6, 6))\nplt.imshow(image)\nplt.title('NeRF\u98ce\u683c\u4f53\u6e32\u67d3\\n(3\u4e2a\u7403\u4f53)')\nplt.axis('off')\nplt.tight_layout(); plt.show()\nprint(f\"\u56fe\u50cf\u5f62\u72b6: {image.shape}\")\nprint(f\"\u6e32\u67d3\u4e86 {img_h * img_w} \u6761\u5c04\u7ebf\uff0c\u6bcf\u6761 {64} \u4e2a\u91c7\u6837\u70b9\")\n \u6570\u5b57\u4fe1\u53f7\u5904\u7406\u5c06\u539f\u59cb\u97f3\u9891\u6ce2\u5f62\u8f6c\u6362\u4e3a\u7ed3\u6784\u5316\u8868\u793a\uff0c\u673a\u5668\u5b66\u4e60\u6a21\u578b\u53ef\u4ee5\u4ece\u4e2d\u5b66\u4e60\u3002\u672c\u6587\u6db5\u76d6\u58f0\u97f3\u7269\u7406\u5b66\u3001\u91c7\u6837\u4e0e\u91cf\u5316\u3001\u5085\u91cc\u53f6\u53d8\u6362\uff08DFT\u3001FFT\uff09\u3001\u8bed\u8c31\u56fe\u3001\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\u3001MFCC \u548c\u52a0\u7a97\uff0c\u4ee5\u53ca\u6240\u6709\u8bed\u97f3\u548c\u97f3\u9891 AI \u6240\u9700\u7684\u7279\u5f81\u63d0\u53d6\u6d41\u6c34\u7ebf\u3002
\u58f0\u97f3\u662f\u4e00\u79cd\u901a\u8fc7\u4ecb\u8d28\uff08\u7a7a\u6c14\u3001\u6c34\u3001\u56fa\u4f53\uff09\u4f20\u64ad\u7684\u538b\u529b\u6ce2\u3002\u632f\u52a8\u7269\u4f53\uff08\u58f0\u5e26\u3001\u5409\u4ed6\u5f26\u3001\u626c\u58f0\u5668\u7eb8\u76c6\uff09\u63a8\u62c9\u7a7a\u6c14\u5206\u5b50\uff0c\u4ea7\u751f\u4ea4\u66ff\u7684\u9ad8\u538b\u533a\u57df\uff08\u538b\u7f29\uff09\u548c\u4f4e\u538b\u533a\u57df\uff08\u7a00\u758f\uff09\u3002
\u8fd9\u4e9b\u538b\u529b\u53d8\u5316\u4ee5\u5927\u7ea6 343 m/s \u7684\u901f\u5ea6\u5728\u7a7a\u6c14\u4e2d\u5411\u5916\u4f20\u64ad\uff0c\u5230\u8fbe\u4f60\u7684\u8033\u6735\u540e\uff0c\u4f7f\u8033\u819c\u632f\u52a8\u5e76\u8f6c\u6362\u4e3a\u795e\u7ecf\u4fe1\u53f7\u3002
\u53ef\u4ee5\u628a\u58f0\u97f3\u60f3\u8c61\u6210\u5411\u5e73\u9759\u7684\u6c34\u9762\u6295\u4e0b\u4e00\u5757\u77f3\u5934\uff1a\u77f3\u5934\u662f\u632f\u52a8\u6e90\uff0c\u6d9f\u6f2a\u662f\u538b\u529b\u6ce2\uff0c\u6c34\u9762\u6f02\u6d6e\u7684\u8f6f\u6728\u585e\u5c31\u662f\u9ea6\u514b\u98ce\u6216\u8033\u819c\uff0c\u5b83\u54cd\u5e94\u7740\u6ce2\u7684\u5230\u6765\u3002
\u8f6f\u6728\u585e\u4e0a\u4e0b\u6d6e\u52a8\u7684\u5e45\u5ea6\u662f\u632f\u5e45\uff0c\u6bcf\u79d2\u6d6e\u52a8\u7684\u6b21\u6570\u662f\u9891\u7387\uff0c\u6ce2\u5230\u8fbe\u65f6\u8f6f\u6728\u585e\u662f\u5904\u4e8e\u6d6e\u52a8\u7684\u6700\u9ad8\u70b9\u8fd8\u662f\u6700\u4f4e\u70b9\u5219\u662f\u76f8\u4f4d\u3002
\u6ce2\u5f62\u662f\u538b\u529b\uff08\u6216\u7535\u538b\uff0c\u5728\u9ea6\u514b\u98ce\u5c06\u58f0\u97f3\u8f6c\u6362\u4e3a\u7535\u4fe1\u53f7\u540e\uff09\u968f\u65f6\u95f4\u53d8\u5316\u7684\u66f2\u7ebf\u56fe\u3002\u6700\u7b80\u5355\u7684\u6ce2\u5f62\u662f\u7eaf\u97f3\uff0c\u5373\u5355\u4e00\u6b63\u5f26\u6ce2\uff1a
\u5176\u4e2d\uff1a
\u5468\u671f \\(T = 1/f\\)\uff0c\u662f\u4e00\u4e2a\u5b8c\u6574\u5468\u671f\u6301\u7eed\u7684\u65f6\u957f\u3002
\u632f\u5e45\u51b3\u5b9a\u4e86\u611f\u77e5\u5230\u7684\u54cd\u5ea6\u3002\u632f\u5e45\u52a0\u500d\uff0c\u529f\u7387\u53d8\u4e3a\u56db\u500d\uff08\u56e0\u4e3a\u529f\u7387\u4e0e\u632f\u5e45\u7684\u5e73\u65b9\u6210\u6b63\u6bd4\uff09\u3002
\u4eba\u8033\u7684\u542c\u89c9\u8303\u56f4\u8986\u76d6\u6781\u5927\u7684\u632f\u5e45\u8de8\u5ea6\uff0c\u56e0\u6b64\u6211\u4eec\u4f7f\u7528\u5bf9\u6570\u523b\u5ea6\uff1a\u5206\u8d1d\uff08dB\uff09\u3002\u58f0\u538b\u7ea7\u7684\u8ba1\u7b97\u65b9\u5f0f\u4e3a\uff1a
\u5176\u4e2d \\(A_\\text{ref}\\) \u662f\u53c2\u8003\u632f\u5e45\uff08\u901a\u5e38\u53d6\u542c\u9608\uff0c\\(20 \\mu\\text{Pa}\\)\uff09\u3002\u8033\u8bed\u7ea6\u4e3a 30 dB\uff0c\u6b63\u5e38\u5bf9\u8bdd 60 dB\uff0c\u6447\u6eda\u97f3\u4e50\u4f1a 110 dB\u3002\u6bcf\u589e\u52a0 6 dB\uff0c\u632f\u5e45\u5927\u7ea6\u7ffb\u500d\uff1b\u6bcf\u589e\u52a0 10 dB\uff0c\u611f\u77e5\u54cd\u5ea6\u5927\u7ea6\u7ffb\u500d\u3002\u6b64\u5904\u7684\u5bf9\u6570\u4e0e\u7b2c 03 \u7ae0\u4e2d\u7684\u5bf9\u6570\u51fd\u6570\u76f8\u540c\u3002
\u9891\u7387\u51b3\u5b9a\u97f3\u9ad8\u3002\u4f4e\u9891\uff0820\u2013250 Hz\uff09\u542c\u8d77\u6765\u4f4e\u6c89\uff1b\u9ad8\u9891\uff082000\u201320000 Hz\uff09\u542c\u8d77\u6765\u5c16\u9510\u3002\u4eba\u8033\u542c\u89c9\u8303\u56f4\u5927\u81f4\u4e3a 20 Hz \u5230 20 kHz\u3002\u97f3\u4e50\u4f1a\u6807\u51c6\u97f3 A \u4e3a 440 Hz\u3002\u9891\u7387\u52a0\u500d\uff0c\u97f3\u9ad8\u5347\u9ad8\u4e00\u4e2a\u516b\u5ea6\u3002
\u5927\u591a\u6570\u81ea\u7136\u58f0\u97f3\u4e0d\u662f\u7eaf\u97f3\uff0c\u800c\u662f\u8bb8\u591a\u9891\u7387\u7684\u590d\u6742\u6df7\u5408\u2014\u2014\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u94a2\u7434\u548c\u5c0f\u63d0\u7434\u6f14\u594f\u540c\u4e00\u4e2a\u97f3\u7b26\u65f6\u542c\u8d77\u6765\u4e0d\u540c\uff1a\u5b83\u4eec\u5171\u4eab\u76f8\u540c\u7684\u57fa\u9891\uff0c\u4f46\u8c10\u6ce2\uff08\u57fa\u9891\u7684\u6574\u6570\u500d\uff09\u53ca\u5176\u76f8\u5bf9\u632f\u5e45\uff08\u97f3\u8272\uff09\u4e0d\u540c\u3002
\u76f8\u4f4d\u51b3\u5b9a\u4e86\u6ce2\u4ece\u5176\u5468\u671f\u4e2d\u7684\u54ea\u4e2a\u8d77\u70b9\u5f00\u59cb\u3002\u4e24\u4e2a\u632f\u5e45\u548c\u9891\u7387\u76f8\u540c\u4f46\u76f8\u4f4d\u4e0d\u540c\u7684\u6ce2\u53ef\u4ee5\u53d1\u751f\u76f8\u957f\u5e72\u6d89\uff08\u76f8\u4f4d\u5bf9\u9f50\uff0c\u632f\u5e45\u76f8\u52a0\uff09\u6216\u76f8\u6d88\u5e72\u6d89\uff08\u76f8\u4f4d\u76f8\u53cd\uff0c\u632f\u5e45\u62b5\u6d88\uff09\u3002
\u76f8\u4f4d\u5728\u7acb\u4f53\u58f0\u97f3\u9891\u548c\u6ce2\u675f\u6210\u5f62\u4e2d\u81f3\u5173\u91cd\u8981\uff0c\u4f46\u5728\u8bb8\u591a\u8bed\u97f3\u5904\u7406\u6d41\u6c34\u7ebf\u4e2d\u57fa\u672c\u4e0a\u88ab\u4e22\u5f03\uff0c\u56e0\u4e3a\u4eba\u7c7b\u5bf9\u97f3\u9ad8\u548c\u97f3\u8272\u7684\u611f\u77e5\u5927\u591a\u4e0e\u76f8\u4f4d\u65e0\u5173\u3002
\u73b0\u5b9e\u4e16\u754c\u7684\u97f3\u9891\u4fe1\u53f7\u662f\u65f6\u95f4\u7684\u8fde\u7eed\u51fd\u6570\uff0c\u4f46\u8ba1\u7b97\u673a\u5904\u7406\u7684\u662f\u79bb\u6563\u6570\u503c\u3002\u91c7\u6837\u901a\u8fc7\u4ee5\u56fa\u5b9a\u95f4\u9694\u6d4b\u91cf\u4fe1\u53f7\u503c\uff0c\u5c06\u8fde\u7eed\u4fe1\u53f7\u8f6c\u6362\u4e3a\u79bb\u6563\u5e8f\u5217\u3002
\u91c7\u6837\u7387 \\(f_s\\) \u662f\u6bcf\u79d2\u7684\u6d4b\u91cf\u6b21\u6570\u3002CD \u97f3\u9891\u4f7f\u7528 \\(f_s = 44{,}100\\) Hz\uff1b\u7535\u8bdd\u901a\u4fe1\u4f7f\u7528 8000 Hz\uff1b\u73b0\u4ee3\u8bed\u97f3\u6a21\u578b\u901a\u5e38\u4f7f\u7528 16000 Hz\u3002
\u5948\u594e\u65af\u7279-\u9999\u519c\u91c7\u6837\u5b9a\u7406\u6307\u51fa\uff1a\u5f53\u4e14\u4ec5\u5f53\u91c7\u6837\u7387\u81f3\u5c11\u662f\u4fe1\u53f7\u4e2d\u6700\u9ad8\u9891\u7387\u7684\u4e24\u500d\u65f6\uff0c\u8fde\u7eed\u4fe1\u53f7\u624d\u80fd\u4ece\u5176\u6837\u672c\u4e2d\u5b8c\u7f8e\u91cd\u5efa\uff1a
\u9891\u7387 \\(f_s / 2\\) \u79f0\u4e3a\u5948\u594e\u65af\u7279\u9891\u7387\u3002\u5982\u679c\u4fe1\u53f7\u4e2d\u5305\u542b\u9ad8\u4e8e\u5948\u594e\u65af\u7279\u9891\u7387\u7684\u9891\u7387\u6210\u5206\uff0c\u8fd9\u4e9b\u9891\u7387\u4f1a\u6298\u53e0\u56de\u6709\u6548\u8303\u56f4\u5185\uff0c\u8868\u73b0\u4e3a\u865a\u5047\u7684\u4f4e\u9891\u6210\u5206\u3002\u8fd9\u79cd\u73b0\u8c61\u79f0\u4e3a\u6df7\u53e0\u3002\u6df7\u53e0\u662f\u4e0d\u53ef\u9006\u7684\uff1a\u4e00\u65e6\u53d1\u751f\uff0c\u5c31\u65e0\u6cd5\u4ece\u6837\u672c\u4e2d\u6062\u590d\u539f\u59cb\u4fe1\u53f7\u3002
\u6df7\u53e0\u7684\u65e5\u5e38\u7c7b\u6bd4\u662f\u7535\u5f71\u4e2d\u7684\u9a6c\u8f66\u8f6e\u6548\u5e94\uff1a\u8f66\u8f6e\u8f6c\u901f\u521a\u597d\u9ad8\u4e8e\u5e27\u7387\u65f6\uff0c\u770b\u8d77\u6765\u50cf\u662f\u5728\u7f13\u6162\u5730\u5012\u8f6c\uff0c\u56e0\u4e3a\u6444\u50cf\u673a\u5bf9\u65cb\u8f6c\u7684\u91c7\u6837\u4e0d\u8db3\u3002\u5728\u97f3\u9891\u4e2d\uff0c\u4e00\u4e2a 15 kHz \u7684\u97f3\u8c03\u4ee5 16 kHz \u91c7\u6837\uff08\\(f_\\text{\u5948\u594e\u65af\u7279} = 8\\) kHz\uff09\u65f6\uff0c\u4f1a\u6df7\u53e0\u4e3a \\(16 - 15 = 1\\) kHz\uff0c\u4e00\u4e2a\u5b8c\u5168\u4e0d\u540c\u7684\u97f3\u9ad8\u3002
\u4e3a\u9632\u6b62\u6df7\u53e0\uff0c\u6297\u6df7\u53e0\u6ee4\u6ce2\u5668\uff08\u4e00\u4e2a\u4f4e\u901a\u6ee4\u6ce2\u5668\uff09\u5728\u91c7\u6837\u524d\u6ee4\u9664\u6240\u6709\u9ad8\u4e8e \\(f_s/2\\) \u7684\u9891\u7387\u3002\u8fd9\u4e00\u6b65\u7531\u6a21\u6570\u8f6c\u6362\u5668\uff08ADC\uff09\u786c\u4ef6\u5728\u4fe1\u53f7\u6570\u5b57\u5316\u4e4b\u524d\u5b8c\u6210\u3002
\u91cf\u5316\u5c06\u6bcf\u4e2a\u8fde\u7eed\u53d6\u503c\u7684\u6837\u672c\u6620\u5c04\u5230\u6709\u9650\u7535\u5e73\u96c6\u5408\u4e2d\u7684\u6700\u8fd1\u503c\u3002\u4e00\u4e2a \\(n\\) \u4f4d\u91cf\u5316\u5668\u6709 \\(2^n\\) \u4e2a\u7535\u5e73\u3002CD \u97f3\u9891\u4f7f\u7528 16 \u4f4d\u91cf\u5316\uff08\\(2^{16} = 65{,}536\\) \u4e2a\u7535\u5e73\uff09\uff1b\u7535\u8bdd\u901a\u4fe1\u901a\u5e38\u4f7f\u7528 8 \u4f4d\u914d\u5408 \\(\\mu\\) \u5f8b\u6216 A \u5f8b\u538b\u6269\uff08\u4e00\u79cd\u975e\u7ebf\u6027\u6620\u5c04\uff0c\u4e3a\u5c0f\u632f\u5e45\u5206\u914d\u66f4\u591a\u7535\u5e73\uff0c\u4ee5\u5339\u914d\u4eba\u7c7b\u611f\u77e5\uff09\u3002\u91cf\u5316\u4f1a\u5f15\u5165\u91cf\u5316\u566a\u58f0\uff0c\u8fd9\u662f\u4e00\u79cd\u820d\u5165\u8bef\u5dee\uff0c\u5176\u65b9\u5dee\u4e3a \\(\\Delta^2/12\\)\uff0c\u5176\u4e2d \\(\\Delta\\) \u662f\u76f8\u90bb\u7535\u5e73\u4e4b\u95f4\u7684\u6b65\u957f\u3002
\u65f6\u57df\u5206\u6790\u76f4\u63a5\u4ece\u6ce2\u5f62\u4e2d\u63d0\u53d6\u7279\u5f81\uff0c\u65e0\u9700\u53d8\u6362\u5230\u5176\u4ed6\u57df\u3002\u8fd9\u4e9b\u7279\u5f81\u7b80\u5355\u3001\u8ba1\u7b97\u5feb\u901f\uff0c\u80fd\u591f\u6355\u6349\u4fe1\u53f7\u7684\u57fa\u672c\u6027\u8d28\u3002
\u80fd\u91cf\u8861\u91cf\u4e00\u5e27\uff08\u5171 \\(N\\) \u4e2a\u6837\u672c\uff09\u7684\u6574\u4f53\u54cd\u5ea6\uff1a
\u8bed\u97f3\u6bb5\u80fd\u91cf\u9ad8\uff1b\u9759\u97f3\u6bb5\u80fd\u91cf\u4f4e\u3002\u80fd\u91cf\u662f\u7b2c 01 \u7ae0\u4e2d\u5e73\u65b9 \\(\\ell_2\\) \u8303\u6570\u5728\u4fe1\u53f7\u5411\u91cf\u4e0a\u7684\u5e94\u7528\u3002
\u8fc7\u96f6\u7387\uff08ZCR\uff09\u7edf\u8ba1\u4e00\u5e27\u5185\u4fe1\u53f7\u6539\u53d8\u7b26\u53f7\u7684\u6b21\u6570\uff1a
\u9ad8 ZCR \u8868\u660e\u9ad8\u9891\u6210\u5206\u6216\u566a\u58f0\uff1b\u4f4e ZCR \u8868\u660e\u4f4e\u9891\u6210\u5206\u6216\u6d4a\u97f3\uff08\u58f0\u5e26\u5468\u671f\u6027\u632f\u52a8\u65f6\uff09\u3002ZCR \u662f\u4e00\u79cd\u7c97\u7565\u7684\u9891\u7387\u4f30\u8ba1\u65b9\u6cd5\uff1a\u4e00\u4e2a \\(f\\) Hz \u7684\u7eaf\u97f3\u6bcf\u79d2\u8fc7\u96f6 \\(2f\\) \u6b21\u3002
\u81ea\u76f8\u5173\u8861\u91cf\u4fe1\u53f7\u4e0e\u5176\u5ef6\u8fdf\u526f\u672c\u4e4b\u95f4\u7684\u76f8\u4f3c\u5ea6\uff1a
\u5728\u5ef6\u8fdf \\(k = 0\\) \u5904\uff0c\u81ea\u76f8\u5173\u7b49\u4e8e\u80fd\u91cf\u3002\u5bf9\u4e8e\u5468\u671f\u4fe1\u53f7\uff0c\u81ea\u76f8\u5173\u5728\u7b49\u4e8e\u5468\u671f\u53ca\u5176\u6574\u6570\u500d\u7684\u5ef6\u8fdf\u5904\u51fa\u73b0\u5cf0\u503c\u3002\u8fd9\u662f\u57fa\u97f3\u68c0\u6d4b\u7684\u6807\u51c6\u6280\u672f\uff1a\u627e\u51fa \\(R[k]\\) \u5728 \\(k=0\\) \u4e4b\u540e\u7684\u7b2c\u4e00\u4e2a\u663e\u8457\u5cf0\u503c\uff0c\u5219\u57fa\u97f3\u9891\u7387\u4e3a \\(f_s / k_\\text{\u5cf0\u503c}\\)\u3002\u81ea\u76f8\u5173\u4e0e\u7b2c 01 \u7ae0\u7684\u70b9\u79ef\u76f8\u5173\uff1a\\(R[k]\\) \u662f\u4fe1\u53f7\u4e0e\u5176 \\(k\\) \u4f4d\u79fb\u7248\u672c\u7684\u70b9\u79ef\u3002
\u9891\u57df\u5206\u6790\u63ed\u793a\u4fe1\u53f7\u7684\u9891\u8c31\u5185\u5bb9\uff0c\u8fd9\u4e9b\u4fe1\u606f\u5728\u6ce2\u5f62\u4e2d\u4e0d\u53ef\u89c1\u3002\u6838\u5fc3\u5de5\u5177\u662f\u79bb\u6563\u5085\u91cc\u53f6\u53d8\u6362\uff08DFT\uff09\uff0c\u5b83\u5c06 \\(N\\) \u4e2a\u6837\u672c\u7684\u4fe1\u53f7\u5206\u89e3\u4e3a \\(N\\) \u4e2a\u590d\u6570\u503c\u7684\u9891\u7387\u5206\u91cf\uff1a
\u6bcf\u4e2a \\(X[k]\\) \u662f\u4e00\u4e2a\u590d\u6570\uff0c\u5176\u5e45\u5ea6 \\(|X[k]|\\) \u7ed9\u51fa\u9891\u7387 \\(f_k = k \\cdot f_s / N\\) Hz \u5904\u7684\u632f\u5e45\uff0c\u76f8\u4f4d \\(\\angle X[k]\\) \u7ed9\u51fa\u76f8\u4f4d\u504f\u79fb\u3002DFT \u662f\u4ece\u65f6\u57df\u57fa\uff08\u5355\u4f4d\u8109\u51b2\uff09\u5230\u9891\u57df\u57fa\uff08\u590d\u6307\u6570\uff09\u7684\u57fa\u53d8\u6362\uff0c\u8fd9\u662f\u7b2c 02 \u7ae0\u57fa\u6982\u5ff5\u7684\u76f4\u63a5\u5e94\u7528\u3002DFT \u53ef\u4ee5\u5199\u4e3a\u77e9\u9635\u4e58\u6cd5 \\(\\mathbf{X} = W \\mathbf{x}\\)\uff0c\u5176\u4e2d \\(W\\) \u662f \\(N \\times N\\) \u7684 DFT \u77e9\u9635\uff0c\u5176\u5143\u7d20\u4e3a \\(W_{kn} = e^{-j2\\pi kn/N}\\)\u3002
\u5feb\u901f\u5085\u91cc\u53f6\u53d8\u6362\uff08FFT\uff09\u662f\u4e00\u79cd\u4ee5 \\(O(N \\log N)\\) \u6b21\u8fd0\u7b97\u8ba1\u7b97 DFT \u7684\u7b97\u6cd5\uff08\u800c\u975e\u6734\u7d20\u7684 \\(O(N^2)\\)\uff09\uff0c\u5176\u539f\u7406\u662f\u5c06\u95ee\u9898\u9012\u5f52\u5730\u62c6\u5206\u4e3a\u5076\u6570\u7d22\u5f15\u548c\u5947\u6570\u7d22\u5f15\u7684\u5b50\u95ee\u9898\uff08\u5e93\u5229-\u56fe\u57fa\u7b97\u6cd5\uff09\u3002\u8fd9\u79cd\u52a0\u901f\u4f7f\u5f97\u5b9e\u65f6\u9891\u8c31\u5206\u6790\u6210\u4e3a\u53ef\u80fd\u3002FFT \u662f\u6574\u4e2a\u8ba1\u7b97\u9886\u57df\u6700\u91cd\u8981\u7684\u7b97\u6cd5\u4e4b\u4e00\u3002
\u529f\u7387\u8c31 \\(|X[k]|^2\\) \u663e\u793a\u80fd\u91cf\u5728\u5404\u9891\u7387\u4e0a\u7684\u5206\u5e03\u3002\u5e45\u5ea6\u8c31 \\(|X[k]|\\) \u663e\u793a\u632f\u5e45\u3002\u7ed8\u5236\u8fd9\u4e9b\u8c31\u56fe\u53ef\u4ee5\u63ed\u793a\u54ea\u4e9b\u9891\u7387\u4e3b\u5bfc\u4e86\u4fe1\u53f7\uff1a\u5143\u97f3\u5728\u57fa\u9891\u7684\u6574\u6570\u500d\u5904\u6709\u5f3a\u8c10\u6ce2\uff1b\u64e6\u97f3\uff08\u5982\"s\"\uff09\u5728\u5bbd\u9ad8\u9891\u8303\u56f4\u5185\u6709\u80fd\u91cf\u5206\u5e03\u3002
\u8bed\u8c31\u56fe\u662f\u4fe1\u53f7\u9891\u7387\u5185\u5bb9\u968f\u65f6\u95f4\u53d8\u5316\u7684\u53ef\u89c6\u5316\u8868\u793a\u3002\u5b83\u662f\u5c06\u4fe1\u53f7\u5207\u5206\u6210\u77ed\u7684\u3001\u91cd\u53e0\u7684\u5e27\uff0c\u5bf9\u6bcf\u5e27\u8ba1\u7b97 FFT\uff0c\u7136\u540e\u5c06\u5f97\u5230\u7684\u5e45\u5ea6\u8c31\u5e76\u6392\u653e\u7f6e\u3002\u6a2a\u8f74\u662f\u65f6\u95f4\uff0c\u7eb5\u8f74\u662f\u9891\u7387\uff0c\u6bcf\u4e2a\u70b9\u7684\u989c\u8272\uff08\u6216\u4eae\u5ea6\uff09\u4ee3\u8868\u5e45\u5ea6\u3002\u8bed\u8c31\u56fe\u662f\u97f3\u9891\u5904\u7406\u4e2d\u6700\u91cd\u8981\u7684\u5355\u4e00\u53ef\u89c6\u5316\u5de5\u5177\u3002
\u5176\u9006\u53d8\u6362\u4e3a \\(f = 700(10^{m/2595} - 1)\\)\u3002\u6885\u5c14\u523b\u5ea6\u89e3\u91ca\u4e86\u4e3a\u4ec0\u4e48\u97f3\u4e50\u4e2d\u7684\u534a\u97f3\u5728\u5bf9\u6570\u9891\u7387\u8f74\u4e0a\u7b49\u95f4\u8ddd\u6392\u5217\uff1aA4\uff08440 Hz\uff09\u5230 A5\uff08880 Hz\uff09\u548c A5 \u5230 A6\uff081760 Hz\uff09\u542c\u8d77\u6765\u90fd\u662f\"\u5411\u4e0a\u4e00\u4e2a\u516b\u5ea6\"\uff0c\u5c3d\u7ba1\u4ee5 Hz \u4e3a\u5355\u4f4d\u7684\u95f4\u9694\u5206\u522b\u662f 440 \u548c 880\u3002
\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\u662f\u4e00\u7ec4\u5728\u6885\u5c14\u523b\u5ea6\u4e0a\u5747\u5300\u5206\u5e03\u7684\u4e09\u89d2\u5f62\u5e26\u901a\u6ee4\u6ce2\u5668\u3002\u6bcf\u4e2a\u6ee4\u6ce2\u5668\u8986\u76d6\u4e00\u4e2a\u9891\u5e26\uff0c\u5bf9\u8be5\u9891\u5e26\u5185\u7684\u9891\u8c31\u80fd\u91cf\u8fdb\u884c\u6c42\u548c\uff0c\u4ea7\u751f\u4e00\u4e2a\u6570\u503c\u3002\u5178\u578b\u7684\u8bed\u97f3\u7cfb\u7edf\u4f7f\u7528 40\u201380 \u4e2a\u6885\u5c14\u6ee4\u6ce2\u5668\u3002\u4f4e\u9891\u6ee4\u6ce2\u5668\u7a84\uff08\u5728\u4eba\u7c7b\u611f\u77e5\u654f\u611f\u7684\u9891\u7387\u5206\u8fa8\u7387\u9ad8\u7684\u533a\u57df\uff09\uff0c\u9ad8\u9891\u6ee4\u6ce2\u5668\u5bbd\uff08\u5728\u4eba\u7c7b\u4e0d\u654f\u611f\u7684\u4f4e\u5206\u8fa8\u7387\u533a\u57df\uff09\u3002\u8fd9\u6a21\u4eff\u4e86\u4eba\u8033\u8033\u8717\u7684\u9891\u7387\u5206\u8fa8\u7387\u3002
\u6885\u5c14\u9891\u7387\u5012\u8c31\u7cfb\u6570\uff08MFCC\uff09\u662f\u8bed\u97f3\u548c\u97f3\u9891\u7684\u7ecf\u5178\u7279\u5f81\u8868\u793a\u3002\u5b83\u4eec\u5c06\u6885\u5c14\u8c31\u538b\u7f29\u4e3a\u5c11\u91cf\u53bb\u76f8\u5173\u5316\u7684\u7cfb\u6570\uff0c\u6355\u6349\u8c31\u5305\u7edc\u7684\u5f62\u72b6\uff08\u7f16\u7801\u58f0\u9053\u914d\u7f6e\uff0c\u4ece\u800c\u7f16\u7801\u8bed\u97f3\u8eab\u4efd\uff09\uff0c\u540c\u65f6\u4e22\u5f03\u7cbe\u7ec6\u7684\u8c31\u7ec6\u8282\uff08\u7f16\u7801\u97f3\u9ad8\u548c\u76f8\u4f4d\uff09\u3002
MFCC \u6d41\u6c34\u7ebf\uff1a
\u7b2c 7 \u6b65\u4e2d\u7684 DCT \u672c\u8d28\u4e0a\u662f\"\u9891\u8c31\u7684\u5085\u91cc\u53f6\u53d8\u6362\"\uff08\u56e0\u6b64\u5f97\u540d\u5012\u8c31 cepstrum = spectrum \u7684\u5b57\u6bcd\u91cd\u6392\uff09\u3002\u4f4e\u9636\u5012\u8c31\u7cfb\u6570\u6355\u6349\u5bbd\u6cdb\u7684\u8c31\u5f62\u72b6\uff08\u58f0\u9053\u8c10\u632f\uff0c\u79f0\u4e3a\u5171\u632f\u5cf0\uff09\uff0c\u800c\u9ad8\u9636\u7cfb\u6570\u6355\u6349\u7cbe\u7ec6\u7684\u8c31\u7ec6\u8282\uff08\u97f3\u9ad8\u8c10\u6ce2\uff09\u3002\u901a\u8fc7\u53ea\u4fdd\u7559\u524d 13 \u4e2a\u7cfb\u6570\uff0c\u6211\u4eec\u4fdd\u7559\u4e86\u5171\u632f\u5cf0\u4fe1\u606f\u5e76\u4e22\u5f03\u4e86\u97f3\u9ad8\u7ec6\u8282\u3002
Delta \u548c delta-delta MFCC\uff08MFCC \u7684\u4e00\u9636\u548c\u4e8c\u9636\u65f6\u95f4\u5bfc\u6570\uff0c\u901a\u8fc7\u76f8\u90bb\u5e27\u4e4b\u95f4\u7684\u6709\u9650\u5dee\u5206\u8ba1\u7b97\uff09\u6355\u6349\u8c31\u5f62\u72b6\u7684\u52a8\u6001\u53d8\u5316\uff0c\u589e\u52a0\u65f6\u95f4\u4e0a\u4e0b\u6587\u3002\u5b8c\u6574\u7684 MFCC \u7279\u5f81\u5411\u91cf\u901a\u5e38\u662f 39 \u7ef4\u7684\uff1a13 \u4e2a\u9759\u6001 + 13 \u4e2a delta + 13 \u4e2a delta-delta\u3002
\u73b0\u4ee3\u795e\u7ecf\u7f51\u7edc\u6a21\u578b\uff08\u7b2c 06 \u7ae0\uff09\u5df2\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u7528\u5b66\u4e60\u5230\u7684\u7279\u5f81\u53d6\u4ee3\u4e86 MFCC\uff1a\u5bf9\u6570\u6885\u5c14\u8bed\u8c31\u56fe\uff08\u7b2c 6 \u6b65\u7684\u8f93\u51fa\uff0c\u8df3\u8fc7 DCT\uff09\u662f\u6df1\u5ea6\u5b66\u4e60 ASR \u548c\u97f3\u9891\u5206\u7c7b\u7684\u6807\u51c6\u8f93\u5165\u3002\u6a21\u578b\u5b66\u4e60\u81ea\u5df1\u7684\u53bb\u76f8\u5173\u5316\u3002\u5c3d\u7ba1\u5982\u6b64\uff0cMFCC \u5728\u4f4e\u8d44\u6e90\u573a\u666f\u3001\u7ecf\u5178 ML \u6d41\u6c34\u7ebf\u4ee5\u53ca\u7406\u89e3\u4fe1\u53f7\u5904\u7406\u57fa\u7840\u65b9\u9762\u4ecd\u7136\u5f88\u91cd\u8981\u3002
\u52a0\u7a97\u662f\u5728\u8ba1\u7b97 FFT \u4e4b\u524d\u5bf9\u4fe1\u53f7\u5e27\u4e58\u4ee5\u5e73\u6ed1\u7a97\u53e3\u51fd\u6570\u7684\u8fc7\u7a0b\u3002\u4e0d\u52a0\u7a97\u65f6\uff0cFFT \u5047\u8bbe\u5e27\u65e0\u9650\u91cd\u590d\uff1b\u5e27\u7684\u7a81\u7136\u5f00\u59cb\u548c\u7ed3\u675f\u4f1a\u521b\u5efa\u4eba\u5de5\u7684\u4e0d\u8fde\u7eed\u6027\uff0c\u4f7f\u80fd\u91cf\u6269\u6563\u5230\u6240\u6709\u9891\u7387\uff0c\u8fd9\u79cd\u4f2a\u5f71\u79f0\u4e3a\u9891\u8c31\u6cc4\u6f0f\u3002
\u77e9\u5f62\u7a97 \\(w[n] = 1\\) \u5bf9\u6240\u6709 \\(n\\)\uff1a\u65e0\u6e10\u51cf\uff0c\u6cc4\u6f0f\u6700\u5927\uff0c\u4f46\u4e3b\u74e3\u6700\u5bbd\uff08\u5728\u7ed9\u5b9a\u5e27\u957f\u4e0b\u9891\u7387\u5206\u8fa8\u7387\u6700\u4f73\uff09\u3002\u5b9e\u8df5\u4e2d\u5f88\u5c11\u4f7f\u7528\u3002
\u6c49\u660e\u7a97\uff1a\\(w[n] = 0.54 - 0.46 \\cos(2\\pi n / (N-1))\\)\u3002\u5728\u8fb9\u7f18\u5904\u6e10\u51cf\u5230\u63a5\u8fd1\u96f6\uff0c\u5927\u5927\u51cf\u5c11\u6cc4\u6f0f\u3002\u662f\u8bed\u97f3\u5904\u7406\u7684\u6807\u51c6\u9009\u62e9\u3002
\u6c49\u5b81\u7a97\uff08\u4e5f\u79f0\u4e3a Hanning \u7a97\uff09\uff1a\\(w[n] = 0.5 - 0.5 \\cos(2\\pi n / (N-1))\\)\u3002\u5728\u8fb9\u7f18\u5904\u7cbe\u786e\u6e10\u51cf\u5230\u96f6\u3002\u4e0e\u6c49\u660e\u7a97\u975e\u5e38\u76f8\u4f3c\uff0c\u4f46\u65c1\u74e3\u6291\u5236\u7565\u597d\u3002
\u5e03\u83b1\u514b\u66fc\u7a97\uff1a\\(w[n] = 0.42 - 0.5 \\cos(2\\pi n / (N-1)) + 0.08 \\cos(4\\pi n / (N-1))\\)\u3002\u65c1\u74e3\u6291\u5236\u66f4\u597d\uff0c\u4f46\u4e3b\u74e3\u66f4\u5bbd\uff08\u9891\u7387\u5206\u8fa8\u7387\u66f4\u5dee\uff09\u3002\u5f53\u65c1\u74e3\u4f2a\u5f71\u7279\u522b\u4e25\u91cd\u65f6\u4f7f\u7528\u3002
\u5b58\u5728\u4e00\u4e2a\u6839\u672c\u6027\u7684\u6743\u8861\uff1a\u6cc4\u6f0f\u8d8a\u5c11\u7684\u7a97\u53e3\uff0c\u4e3b\u74e3\u8d8a\u5bbd\uff0c\u610f\u5473\u7740\u5b83\u4eec\u65e0\u6cd5\u5206\u8fa8\u4e24\u4e2a\u95f4\u9694\u5f88\u8fd1\u7684\u9891\u7387\u3002\u8fd9\u5c31\u662f\u9891\u8c31\u5206\u8fa8\u7387\u4e0e\u6cc4\u6f0f\u7684\u6743\u8861\uff0c\u662f\u7b2c 03 \u7ae0\u4e0d\u786e\u5b9a\u539f\u7406\u7684\u7ed3\u679c\u3002
\u91cd\u53e0\u76f8\u52a0\uff08OLA\uff09\u662f\u4e00\u79cd\u4ece\u52a0\u7a97\u3001\u5904\u7406\u540e\u7684\u5e27\u91cd\u5efa\u4fe1\u53f7\u7684\u6280\u672f\u3002\u5e27\u4e4b\u95f4\u6709\u91cd\u53e0\uff08\u901a\u5e38 50\u201375%\uff09\uff0c\u5904\u7406\u540e\u5c06\u52a0\u7a97\u540e\u7684\u8f93\u51fa\u76f8\u52a0\u3002\u5982\u679c\u7a97\u53e3\u548c\u91cd\u53e0\u9009\u62e9\u5f97\u5f53\uff08\u4f8b\u5982\uff0c\u6c49\u5b81\u7a97\u914d\u5408 50% \u91cd\u53e0\uff09\uff0c\u91cd\u53e0\u7684\u7a97\u53e3\u76f8\u52a0\u4e3a\u5e38\u6570\uff0c\u53ef\u5b9e\u73b0\u5b8c\u7f8e\u91cd\u5efa\u3002\u8fd9\u5bf9\u4efb\u4f55\u57fa\u4e8e\u5e27\u7684\u97f3\u9891\u4fee\u6539\uff08\u964d\u566a\u3001\u53d8\u8c03\u3001\u53d8\u901f\uff09\u90fd\u81f3\u5173\u91cd\u8981\u3002
\u77ed\u65f6\u5085\u91cc\u53f6\u53d8\u6362\uff08STFT\uff09\u662f\u8bed\u8c31\u56fe\u80cc\u540e\u7684\u6b63\u5f0f\u6846\u67b6\u3002\u5b83\u5bf9\u4fe1\u53f7\u7684\u6bcf\u4e2a\u52a0\u7a97\u5e27\u5e94\u7528 DFT\uff1a
\u5176\u4e2d \\(m\\) \u662f\u5e27\u7d22\u5f15\uff0c\\(H\\) \u662f\u6b65\u8fdb\u5927\u5c0f\uff08\u8fde\u7eed\u5e27\u4e4b\u95f4\u7684\u6837\u672c\u6570\uff09\uff0c\\(w[n]\\) \u662f\u7a97\u53e3\u51fd\u6570\uff0c\\(N\\) \u662f FFT \u5927\u5c0f\u3002\u8f93\u51fa\u662f\u4e00\u4e2a\u4e8c\u7ef4\u590d\u6570\u503c\u77e9\u9635\uff1a\u4fe1\u53f7\u7684\u65f6\u9891\u8868\u793a\u3002
STFT \u4f53\u73b0\u4e86\u6839\u672c\u7684\u65f6\u9891\u6743\u8861\uff1a
\u5178\u578b\u8bed\u97f3 STFT \u53c2\u6570\uff1a25 ms \u5e27\u957f\uff08\u5728 16 kHz \u4e0b \\(N = 400\\)\uff09\uff0c10 ms \u6b65\u8fdb\uff08\\(H = 160\\)\uff09\uff0c\u6c49\u660e\u7a97\uff0c512 \u70b9 FFT\uff08\u4ece 400 \u8fdb\u884c\u96f6\u586b\u5145\u4ee5\u63d0\u9ad8\u6548\u7387\u548c\u9891\u8c31\u63d2\u503c\u5e73\u6ed1\u5ea6\uff09\u3002
\u6ee4\u6ce2\u901a\u8fc7\u653e\u5927\u67d0\u4e9b\u9891\u7387\u548c\u8870\u51cf\u5176\u4ed6\u9891\u7387\u6765\u4fee\u6539\u4fe1\u53f7\u7684\u9891\u7387\u5185\u5bb9\u3002\u6ee4\u6ce2\u5668\u662f\u4e00\u4e2a\u63a5\u53d7\u8f93\u5165\u4fe1\u53f7\u5e76\u4ea7\u751f\u8f93\u51fa\u4fe1\u53f7\u7684\u7cfb\u7edf\u3002\u6ee4\u6ce2\u5668\u7531\u5176\u9891\u7387\u54cd\u5e94 \\(H(f)\\) \u8868\u5f81\uff0c\u5b83\u63cf\u8ff0\u4e86\u6bcf\u4e2a\u9891\u7387\u4e0a\u6240\u65bd\u52a0\u7684\u589e\u76ca\u548c\u76f8\u4f4d\u504f\u79fb\u3002
\u4f4e\u901a\u6ee4\u6ce2\u5668\uff1a\u901a\u8fc7\u4f4e\u4e8e\u622a\u6b62\u9891\u7387 \\(f_c\\) \u7684\u9891\u7387\uff0c\u8870\u51cf\u9ad8\u4e8e \\(f_c\\) \u7684\u9891\u7387\u3002\u7528\u4e8e\u53bb\u9664\u9ad8\u9891\u566a\u58f0\u548c\u7ec6\u8282\u3002\u91c7\u6837\u524d\u7684\u6297\u6df7\u53e0\u6ee4\u6ce2\u5668\u5c31\u662f\u4f4e\u901a\u6ee4\u6ce2\u5668\u3002
\u9ad8\u901a\u6ee4\u6ce2\u5668\uff1a\u901a\u8fc7\u9ad8\u4e8e \\(f_c\\) \u7684\u9891\u7387\uff0c\u8870\u51cf\u4f4e\u4e8e \\(f_c\\) \u7684\u9891\u7387\u3002\u7528\u4e8e\u53bb\u9664\u4f4e\u9891\u9686\u9686\u58f0\u548c\u76f4\u6d41\u504f\u79fb\u3002MFCC \u63d0\u53d6\u4e2d\u7684\u9884\u52a0\u91cd\u6ee4\u6ce2\u5668\uff08\\(y[n] = x[n] - 0.97 x[n-1]\\)\uff09\u5c31\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u9ad8\u901a\u6ee4\u6ce2\u5668\u3002
\u5e26\u901a\u6ee4\u6ce2\u5668\uff1a\u901a\u8fc7\u8303\u56f4 \\([f_1, f_2]\\) \u5185\u7684\u9891\u7387\uff0c\u8870\u51cf\u8303\u56f4\u5916\u7684\u9891\u7387\u3002\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\u4e2d\u7684\u6bcf\u4e2a\u4e09\u89d2\u5f62\u5c31\u662f\u4e00\u4e2a\u5e26\u901a\u6ee4\u6ce2\u5668\u3002
\u5e26\u963b\uff08\u9677\u6ce2\uff09\u6ee4\u6ce2\u5668\uff1a\u8870\u51cf\u7279\u5b9a\u7684\u7a84\u9891\u8303\u56f4\u3002\u7528\u4e8e\u53bb\u9664\u7279\u5b9a\u5e72\u6270\uff08\u4f8b\u5982 50/60 Hz \u7684\u7535\u6e90\u7ebf\u55e1\u55e1\u58f0\uff09\u3002
\u6709\u9650\u51b2\u6fc0\u54cd\u5e94\uff08FIR\uff09\u6ee4\u6ce2\u5668\u5c06\u6bcf\u4e2a\u8f93\u51fa\u6837\u672c\u8ba1\u7b97\u4e3a\u5f53\u524d\u548c\u8fc7\u53bb\u8f93\u5165\u6837\u672c\u7684\u52a0\u6743\u548c\uff1a
\u6743\u91cd \\(b_k\\) \u662f\u6ee4\u6ce2\u5668\u7cfb\u6570\uff08\u4e5f\u79f0\u4e3a\u62bd\u5934\uff09\u3002\u6ee4\u6ce2\u5668\u7684\u9636\u6570\u4e3a \\(M\\)\u3002FIR \u6ee4\u6ce2\u5668\u59cb\u7ec8\u7a33\u5b9a\uff08\u8f93\u51fa\u4e0d\u4f1a\u53d1\u6563\uff09\uff0c\u5e76\u4e14\u53ef\u4ee5\u8bbe\u8ba1\u4e3a\u5177\u6709\u5b8c\u7f8e\u7684\u7ebf\u6027\u76f8\u4f4d\uff08\u6240\u6709\u9891\u7387\u7684\u5ef6\u8fdf\u76f8\u540c\uff0c\u4ece\u800c\u4fdd\u6301\u6ce2\u5f62\u5f62\u72b6\uff09\u3002\u5176\u7f3a\u70b9\u662f\u5b9e\u73b0\u9661\u5ced\u7684\u622a\u6b62\u9700\u8981\u5927\u91cf\u62bd\u5934\uff08\u9ad8 \\(M\\)\uff09\uff0c\u589e\u52a0\u4e86\u8ba1\u7b97\u91cf\u3002\u8f93\u51fa\u662f\u8f93\u5165\u4e0e\u7cfb\u6570\u5411\u91cf\u7684\u5377\u79ef\uff0c\u6b63\u662f\u7b2c 06 \u7ae0\u4e2d\u7684\u4e00\u7ef4\u5377\u79ef\u8fd0\u7b97\u3002
\u65e0\u9650\u51b2\u6fc0\u54cd\u5e94\uff08IIR\uff09\u6ee4\u6ce2\u5668\u4f7f\u7528\u53cd\u9988\uff1a\u8f93\u51fa\u65e2\u4f9d\u8d56\u4e8e\u8fc7\u53bb\u7684\u8f93\u5165\uff0c\u4e5f\u4f9d\u8d56\u4e8e\u8fc7\u53bb\u7684\u8f93\u51fa\uff1a
\u53cd\u9988\u9879 \\(a_k\\) \u521b\u5efa\u4e86\u4e00\u4e2a\u9012\u5f52\u7ed3\u6784\uff0c\u5176\u51b2\u6fc0\u54cd\u5e94\u7406\u8bba\u4e0a\u6301\u7eed\u65e0\u9650\u957f\u3002IIR \u6ee4\u6ce2\u5668\u53ef\u4ee5\u7528\u6bd4 FIR \u6ee4\u6ce2\u5668\u5c11\u5f97\u591a\u7684\u7cfb\u6570\u5b9e\u73b0\u9661\u5ced\u7684\u622a\u6b62\uff0c\u4f46\u53ef\u80fd\u4e0d\u7a33\u5b9a\uff08\u5982\u679c\u4f20\u9012\u51fd\u6570\u7684\u6781\u70b9\u4f4d\u4e8e\u5355\u4f4d\u5706\u4e4b\u5916\uff0c\u8f93\u51fa\u5c06\u65e0\u754c\u589e\u957f\u2014\u2014\u8fd9\u662f \\(z\\) \u53d8\u6362\u4e2d\u7684\u6982\u5ff5\uff09\u3002\u5b83\u4eec\u8fd8\u5177\u6709\u975e\u7ebf\u6027\u76f8\u4f4d\uff0c\u53ef\u80fd\u4f7f\u6ce2\u5f62\u5f62\u72b6\u5931\u771f\u3002\u7ecf\u5178\u6ee4\u6ce2\u5668\u8bbe\u8ba1\uff08\u5df4\u7279\u6c83\u65af\u3001\u5207\u6bd4\u96ea\u592b\u3001\u692d\u5706\u6ee4\u6ce2\u5668\uff09\u90fd\u662f IIR \u7684\u3002
\u4f20\u9012\u51fd\u6570\u901a\u8fc7 \\(z\\) \u53d8\u6362\u83b7\u5f97\uff1a
\u5206\u5b50\u7684\u6839\u79f0\u4e3a\u96f6\u70b9\uff0c\u5206\u6bcd\u7684\u6839\u79f0\u4e3a\u6781\u70b9\u3002\u6781\u96f6\u70b9\u56fe\u5b8c\u5168\u523b\u753b\u4e86\u6ee4\u6ce2\u5668\u7684\u884c\u4e3a\u3002\u5355\u4f4d\u5706\u9644\u8fd1\u7684\u6781\u70b9\u653e\u5927\u9644\u8fd1\u7684\u9891\u7387\uff1b\u5355\u4f4d\u5706\u9644\u8fd1\u7684\u96f6\u70b9\u8870\u51cf\u5b83\u4eec\u3002FIR \u6ee4\u6ce2\u5668\u53ea\u6709\u96f6\u70b9\uff08\u5206\u6bcd\u4e3a 1\uff09\u3002\u8fd9\u4e0e\u7b2c 02 \u7ae0\u548c\u7b2c 03 \u7ae0\u4e2d\u7684\u7279\u5f81\u503c\u548c\u6c42\u6839\u6982\u5ff5\u76f8\u8054\u7cfb\u3002
\u5377\u79ef\u5b9a\u7406\uff1a\u65f6\u57df\u4e2d\u7684\u5377\u79ef\u7b49\u4e8e\u9891\u57df\u4e2d\u7684\u9010\u5143\u7d20\u4e58\u6cd5\u3002\u8fd9\u610f\u5473\u7740\u6ee4\u6ce2\u65e2\u53ef\u4ee5\u901a\u8fc7\u5c06\u4fe1\u53f7\u4e0e\u6ee4\u6ce2\u5668\u7684\u51b2\u6fc0\u54cd\u5e94\u76f4\u63a5\u5377\u79ef\u6765\u5b9e\u73b0\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u5c06\u5b83\u4eec\u7684\u5085\u91cc\u53f6\u53d8\u6362\u76f8\u4e58\u518d\u9006\u53d8\u6362\u6765\u5b9e\u73b0\u3002\u5bf9\u4e8e\u957f\u6ee4\u6ce2\u5668\uff0c\u9891\u57df\u65b9\u6cd5\uff08\u4f7f\u7528 FFT\uff09\u66f4\u5feb\uff1a\\(O(N \\log N)\\) \u5bf9\u6bd4 \\(O(NM)\\)\u3002
\u9006 STFT\uff08iSTFT\uff09\u4ece\u5176 STFT \u8868\u793a\u91cd\u5efa\u65f6\u57df\u4fe1\u53f7\u3002\u8fd9\u5bf9\u4e8e\u4efb\u4f55\u5728\u9891\u57df\u4e2d\u4fee\u6539\u97f3\u9891\u7684\u7cfb\u7edf\uff08\u964d\u566a\u3001\u6e90\u5206\u79bb\u3001\u8bed\u97f3\u8f6c\u6362\uff09\u90fd\u81f3\u5173\u91cd\u8981\u3002\u91cd\u5efa\u4f7f\u7528\u91cd\u53e0\u76f8\u52a0\uff1a
\u5206\u6bcd\u5bf9\u7a97\u53e3\u91cd\u53e0\u8fdb\u884c\u5f52\u4e00\u5316\uff0c\u786e\u4fdd\u5f53\u5408\u6210\u7a97\u53e3\u4e0e\u5206\u6790\u7a97\u53e3\u5339\u914d\u4e14\u91cd\u53e0\u8db3\u591f\u65f6\u5b9e\u73b0\u5b8c\u7f8e\u91cd\u5efa\u3002
\u8bed\u97f3 DSP \u6d41\u6c34\u7ebf\u603b\u7ed3\uff1a\u539f\u59cb\u97f3\u9891\u4ee5 16 kHz \u91c7\u6837\u3001\u9884\u52a0\u91cd\u3001\u5207\u5206\u4e3a 25 ms \u7684\u6c49\u660e\u7a97\u5e27\uff08\u6b65\u8fdb 10 ms\uff09\uff0c\u6bcf\u5e27\u8fdb\u884c FFT \u53d8\u6362\uff0c\u901a\u8fc7\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\uff0c\u8fdb\u884c\u5bf9\u6570\u538b\u7f29\uff0c\u7136\u540e\u8981\u4e48\u4fdd\u7559\u4e3a\u5bf9\u6570\u6885\u5c14\u7279\u5f81\uff08\u7528\u4e8e\u795e\u7ecf\u7f51\u7edc\u6a21\u578b\uff09\uff0c\u8981\u4e48\u8fdb\u884c DCT \u53d8\u6362\u751f\u6210 MFCC\uff08\u7528\u4e8e\u7ecf\u5178\u6a21\u578b\uff09\u3002\u6574\u4e2a\u6d41\u6c34\u7ebf\u5c06\u4e00\u7ef4\u65f6\u57df\u4fe1\u53f7\u8f6c\u6362\u4e3a\u9002\u5408\u4e0b\u6e38\u673a\u5668\u5b66\u4e60\u7684\u4e8c\u7ef4\u65f6\u9891\u8868\u793a\uff0c\u8fd9\u5c06\u662f\u6587\u4ef6 02 \u7684\u4e3b\u9898\u3002
\u751f\u6210\u4e00\u4e2a\u6b63\u5f26\u6ce2\uff0c\u4ee5\u4e0d\u540c\u91c7\u6837\u7387\u91c7\u6837\uff0c\u6f14\u793a\u6df7\u53e0\u73b0\u8c61\u3002\u7ed8\u5236\u8fde\u7eed\u4fe1\u53f7\u3001\u6b63\u786e\u91c7\u6837\u7248\u672c\u548c\u6b20\u91c7\u6837\uff08\u6df7\u53e0\uff09\u7248\u672c\u7684\u5bf9\u6bd4\u56fe\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u53c2\u6570\nf_signal = 5.0 # 5 Hz \u4fe1\u53f7\nduration = 1.0 # 1 \u79d2\n\n# \"\u8fde\u7eed\"\u4fe1\u53f7\uff08\u975e\u5e38\u9ad8\u7684\u91c7\u6837\u7387\uff09\nt_cont = jnp.linspace(0, duration, 10000)\nx_cont = jnp.sin(2 * jnp.pi * f_signal * t_cont)\n\n# \u6b63\u786e\u91c7\u6837\uff08fs = 50 Hz\uff0c\u8fdc\u9ad8\u4e8e\u5948\u594e\u65af\u7279\u9891\u7387 10 Hz\uff09\nfs_good = 50\nt_good = jnp.arange(0, duration, 1.0 / fs_good)\nx_good = jnp.sin(2 * jnp.pi * f_signal * t_good)\n\n# \u6b20\u91c7\u6837\uff08fs = 7 Hz\uff0c\u4f4e\u4e8e\u5948\u594e\u65af\u7279\u9891\u7387 10 Hz\uff09-> \u6df7\u53e0\nfs_bad = 7\nt_bad = jnp.arange(0, duration, 1.0 / fs_bad)\nx_bad = jnp.sin(2 * jnp.pi * f_signal * t_bad)\n\n# \u6df7\u53e0\u540e\u7684\u9891\u7387\uff1a|f_signal - fs_bad| = |5 - 7| = 2 Hz\nf_alias = abs(f_signal - fs_bad)\nx_alias_cont = jnp.sin(2 * jnp.pi * f_alias * t_cont)\n\nfig, axes = plt.subplots(3, 1, figsize=(12, 9))\n\n# \u56fe 1\uff1a\u539f\u59cb\u4fe1\u53f7\naxes[0].plot(t_cont, x_cont, color='#3498db', linewidth=1.5, label=f'\u539f\u59cb {f_signal} Hz \u4fe1\u53f7')\naxes[0].set_title(f'\u539f\u59cb {f_signal} Hz \u4fe1\u53f7')\naxes[0].set_xlabel('\u65f6\u95f4 (s)'); axes[0].set_ylabel('\u632f\u5e45')\naxes[0].legend(); axes[0].grid(True, alpha=0.3)\n\n# \u56fe 2\uff1a\u6b63\u786e\u91c7\u6837\naxes[1].plot(t_cont, x_cont, color='#3498db', linewidth=1, alpha=0.4, label='\u539f\u59cb\u4fe1\u53f7')\naxes[1].stem(t_good, x_good, linefmt='#27ae60', markerfmt='o', basefmt='k-',\n label=f'\u4ee5 {fs_good} Hz \u91c7\u6837\uff08\u9ad8\u4e8e\u5948\u594e\u65af\u7279\u9891\u7387\uff09')\naxes[1].set_title(f'\u6b63\u786e\u91c7\u6837\uff1afs = {fs_good} Hz > 2 x {f_signal} Hz')\naxes[1].set_xlabel('\u65f6\u95f4 (s)'); axes[1].set_ylabel('\u632f\u5e45')\naxes[1].legend(); axes[1].grid(True, alpha=0.3)\n\n# \u56fe 3\uff1a\u6df7\u53e0\u91c7\u6837\naxes[2].plot(t_cont, x_cont, color='#3498db', linewidth=1, alpha=0.4, label='\u539f\u59cb\u4fe1\u53f7')\naxes[2].stem(t_bad, x_bad, linefmt='#e74c3c', markerfmt='o', basefmt='k-',\n label=f'\u4ee5 {fs_bad} Hz \u91c7\u6837\uff08\u4f4e\u4e8e\u5948\u594e\u65af\u7279\u9891\u7387\uff09')\naxes[2].plot(t_cont, x_alias_cont, color='#f39c12', linewidth=1.5, linestyle='--',\n label=f'\u6df7\u53e0\u4fe1\u53f7\u8868\u73b0\u4e3a {f_alias} Hz')\naxes[2].set_title(f'\u6df7\u53e0\u91c7\u6837\uff1afs = {fs_bad} Hz < 2 x {f_signal} Hz')\naxes[2].set_xlabel('\u65f6\u95f4 (s)'); axes[2].set_ylabel('\u632f\u5e45')\naxes[2].legend(); axes[2].grid(True, alpha=0.3)\n\nplt.tight_layout(); plt.show()\n \u8ba1\u7b97\u5e76\u53ef\u89c6\u5316\u7531\u591a\u4e2a\u6b63\u5f26\u6ce2\u7ec4\u6210\u7684\u4fe1\u53f7\u7684 FFT\u3002\u663e\u793a\u5e45\u5ea6\u8c31\u5e76\u8bc6\u522b\u7ec4\u6210\u9891\u7387\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u521b\u5efa\u590d\u5408\u4fe1\u53f7\uff1a220 Hz + 440 Hz + 880 Hz\uff08A3 + A4 + A5\uff09\nfs = 8000 # 8 kHz \u91c7\u6837\u7387\nduration = 0.1 # 100 ms\nt = jnp.arange(0, duration, 1.0 / fs)\nn_samples = len(t)\n\n# \u4e09\u4e2a\u9891\u7387\u5206\u91cf\uff0c\u4e0d\u540c\u632f\u5e45\nx = 1.0 * jnp.sin(2 * jnp.pi * 220 * t) + \\\n 0.6 * jnp.sin(2 * jnp.pi * 440 * t) + \\\n 0.3 * jnp.sin(2 * jnp.pi * 880 * t)\n\n# \u8ba1\u7b97 FFT\nX = jnp.fft.fft(x)\nfreqs = jnp.fft.fftfreq(n_samples, d=1.0 / fs)\nmagnitude = jnp.abs(X) / n_samples # \u5f52\u4e00\u5316\n\n# \u53ea\u7ed8\u5236\u6b63\u9891\u7387\u90e8\u5206\npos_mask = freqs >= 0\nfreqs_pos = freqs[pos_mask]\nmag_pos = magnitude[pos_mask] * 2 # \u7ffb\u500d\u4ee5\u8865\u507f\u8d1f\u9891\u7387\u7684\u80fd\u91cf\n\nfig, axes = plt.subplots(2, 1, figsize=(12, 7))\n\n# \u65f6\u57df\naxes[0].plot(t * 1000, x, color='#3498db', linewidth=1)\naxes[0].set_title('\u590d\u5408\u4fe1\u53f7\uff1a220 Hz + 440 Hz + 880 Hz')\naxes[0].set_xlabel('\u65f6\u95f4 (ms)'); axes[0].set_ylabel('\u632f\u5e45')\naxes[0].grid(True, alpha=0.3)\n\n# \u9891\u57df\naxes[1].plot(freqs_pos, mag_pos, color='#e74c3c', linewidth=1.5)\naxes[1].set_title('\u5e45\u5ea6\u8c31\uff08FFT\uff09')\naxes[1].set_xlabel('\u9891\u7387 (Hz)'); axes[1].set_ylabel('\u5e45\u5ea6')\naxes[1].set_xlim(0, 1500)\n# \u6807\u6ce8\u5cf0\u503c\nfor f_peak, amp in [(220, 1.0), (440, 0.6), (880, 0.3)]:\n axes[1].annotate(f'{f_peak} Hz', xy=(f_peak, amp), fontsize=10,\n ha='center', va='bottom', color='#9b59b6',\n arrowprops=dict(arrowstyle='->', color='#9b59b6'))\naxes[1].grid(True, alpha=0.3)\n\nplt.tight_layout(); plt.show()\n \u5728 JAX \u4e2d\u4ece\u5934\u6784\u5efa\u5b8c\u6574\u7684 MFCC \u6d41\u6c34\u7ebf\uff1a\u9884\u52a0\u91cd\u3001\u5206\u5e27\u3001\u52a0\u7a97\u3001FFT\u3001\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\u3001\u5bf9\u6570\u3001DCT\u3002\u53ef\u89c6\u5316\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\u548c\u751f\u6210\u7684 MFCC \u70ed\u529b\u56fe\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# --- \u751f\u6210\u4e00\u4e2a\u5408\u6210\u7c7b\u8bed\u97f3\u4fe1\u53f7 ---\nkey = jax.random.PRNGKey(42)\nfs = 16000\nduration = 1.0\nt = jnp.arange(0, duration, 1.0 / fs)\n\n# \u6a21\u62df\u6d4a\u97f3\u8bed\u97f3\uff1a\u57fa\u9891 + \u8c10\u6ce2\uff0c\u632f\u5e45\u8870\u51cf\nf0 = 150.0 # \u57fa\u9891\nx = sum(jnp.sin(2 * jnp.pi * f0 * k * t) / k for k in range(1, 8))\n# \u6dfb\u52a0\u4e00\u4e9b\u566a\u58f0\nx = x + 0.1 * jax.random.normal(key, t.shape)\nx = x / jnp.max(jnp.abs(x)) # \u5f52\u4e00\u5316\n\n# --- \u7b2c 1 \u6b65\uff1a\u9884\u52a0\u91cd ---\nalpha = 0.97\nx_pre = jnp.concatenate([x[:1], x[1:] - alpha * x[:-1]])\n\n# --- \u7b2c 2 \u6b65\uff1a\u5206\u5e27 ---\nframe_len = int(0.025 * fs) # 25 ms = 400 \u4e2a\u6837\u672c\nhop_len = int(0.010 * fs) # 10 ms = 160 \u4e2a\u6837\u672c\nn_frames = (len(x_pre) - frame_len) // hop_len + 1\nframes = jnp.stack([x_pre[i * hop_len : i * hop_len + frame_len]\n for i in range(n_frames)])\n\n# --- \u7b2c 3 \u6b65\uff1a\u6c49\u660e\u7a97 ---\nhamming = 0.54 - 0.46 * jnp.cos(2 * jnp.pi * jnp.arange(frame_len) / (frame_len - 1))\nwindowed = frames * hamming\n\n# --- \u7b2c 4 \u6b65\uff1aFFT ---\nn_fft = 512\nspectra = jnp.fft.rfft(windowed, n=n_fft)\npower_spectra = jnp.abs(spectra) ** 2 / n_fft\n\n# --- \u7b2c 5 \u6b65\uff1a\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4 ---\nn_mels = 40\nf_min, f_max = 0.0, fs / 2.0\n\ndef hz_to_mel(f):\n return 2595 * jnp.log10(1 + f / 700)\n\ndef mel_to_hz(m):\n return 700 * (10 ** (m / 2595) - 1)\n\nmel_min = hz_to_mel(f_min)\nmel_max = hz_to_mel(f_max)\nmel_points = jnp.linspace(mel_min, mel_max, n_mels + 2)\nhz_points = mel_to_hz(mel_points)\n\nfreq_bins = jnp.floor((n_fft + 1) * hz_points / fs).astype(jnp.int32)\nn_freqs = n_fft // 2 + 1\nfilterbank = jnp.zeros((n_mels, n_freqs))\n\nfor m in range(n_mels):\n f_left = freq_bins[m]\n f_center = freq_bins[m + 1]\n f_right = freq_bins[m + 2]\n # \u4e0a\u5347\u6cbf\n for k in range(int(f_left), int(f_center)):\n if f_center != f_left:\n filterbank = filterbank.at[m, k].set((k - f_left) / (f_center - f_left))\n # \u4e0b\u964d\u6cbf\n for k in range(int(f_center), int(f_right)):\n if f_right != f_center:\n filterbank = filterbank.at[m, k].set((f_right - k) / (f_right - f_center))\n\n# \u5e94\u7528\u6ee4\u6ce2\u5668\u7ec4\nmel_spectra = jnp.dot(power_spectra, filterbank.T)\n\n# --- \u7b2c 6 \u6b65\uff1a\u5bf9\u6570 ---\nlog_mel = jnp.log(mel_spectra + 1e-10)\n\n# --- \u7b2c 7 \u6b65\uff1aDCT\uff08\u7b2c\u4e8c\u7c7b\uff09 ---\nn_mfcc = 13\nn_mel_channels = log_mel.shape[1]\ndct_matrix = jnp.zeros((n_mfcc, n_mel_channels))\nfor i in range(n_mfcc):\n for j in range(n_mel_channels):\n dct_matrix = dct_matrix.at[i, j].set(\n jnp.cos(jnp.pi * i * (j + 0.5) / n_mel_channels)\n )\nmfccs = jnp.dot(log_mel, dct_matrix.T)\n\n# --- \u53ef\u89c6\u5316 ---\nfig, axes = plt.subplots(3, 1, figsize=(14, 11))\n\n# \u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\nfreq_axis = jnp.linspace(0, fs / 2, n_freqs)\nfor m in range(n_mels):\n color = '#3498db' if m % 2 == 0 else '#e74c3c'\n axes[0].plot(freq_axis, filterbank[m], color=color, alpha=0.6, linewidth=0.8)\naxes[0].set_title(f'\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\uff08{n_mels} \u4e2a\u6ee4\u6ce2\u5668\uff09')\naxes[0].set_xlabel('\u9891\u7387 (Hz)'); axes[0].set_ylabel('\u6743\u91cd')\naxes[0].grid(True, alpha=0.3)\n\n# \u5bf9\u6570\u6885\u5c14\u8bed\u8c31\u56fe\nim1 = axes[1].imshow(log_mel.T, aspect='auto', origin='lower',\n extent=[0, duration, 0, n_mels], cmap='viridis')\naxes[1].set_title('\u5bf9\u6570\u6885\u5c14\u8bed\u8c31\u56fe')\naxes[1].set_xlabel('\u65f6\u95f4 (s)'); axes[1].set_ylabel('\u6885\u5c14\u9891\u5e26')\nplt.colorbar(im1, ax=axes[1], label='\u5bf9\u6570\u80fd\u91cf')\n\n# MFCC\nim2 = axes[2].imshow(mfccs.T, aspect='auto', origin='lower',\n extent=[0, duration, 0, n_mfcc], cmap='coolwarm')\naxes[2].set_title(f'MFCC\uff08\u524d {n_mfcc} \u4e2a\u7cfb\u6570\uff09')\naxes[2].set_xlabel('\u65f6\u95f4 (s)'); axes[2].set_ylabel('MFCC \u7d22\u5f15')\nplt.colorbar(im2, ax=axes[2], label='\u7cfb\u6570\u503c')\n\nplt.tight_layout(); plt.show()\n \u5b9e\u73b0 FIR \u4f4e\u901a\u548c\u9ad8\u901a\u6ee4\u6ce2\u5668\uff0c\u5e76\u53ef\u89c6\u5316\u5b83\u4eec\u5bf9\u5305\u542b\u4f4e\u9891\u548c\u9ad8\u9891\u5206\u91cf\u4fe1\u53f7\u7684\u5f71\u54cd\u3002\u540c\u65f6\u663e\u793a\u65f6\u57df\u548c\u9891\u57df\u7684\u89c6\u56fe\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u521b\u5efa\u5305\u542b\u4f4e\u9891\uff08100 Hz\uff09\u548c\u9ad8\u9891\uff082000 Hz\uff09\u5206\u91cf\u7684\u4fe1\u53f7\nfs = 8000\nduration = 0.05 # 50 ms\uff0c\u4fbf\u4e8e\u6e05\u6670\u663e\u793a\nt = jnp.arange(0, duration, 1.0 / fs)\n\nx_low = jnp.sin(2 * jnp.pi * 100 * t)\nx_high = 0.5 * jnp.sin(2 * jnp.pi * 2000 * t)\nx = x_low + x_high\n\n# \u4f7f\u7528\u7a97\u51fd\u6570\u6cd5\u8bbe\u8ba1\u7b80\u5355\u7684 FIR \u4f4e\u901a\u6ee4\u6ce2\u5668\ndef fir_lowpass(cutoff_hz, fs, n_taps=51):\n \"\"\"\u4f7f\u7528\u7a97\u51fd\u6570\u6cd5\u8bbe\u8ba1 FIR \u4f4e\u901a\u6ee4\u6ce2\u5668\u3002\"\"\"\n fc = cutoff_hz / fs # \u5f52\u4e00\u5316\u622a\u6b62\u9891\u7387\n n = jnp.arange(n_taps)\n mid = (n_taps - 1) / 2.0\n # Sinc \u51fd\u6570\uff08\u7406\u60f3\u4f4e\u901a\u51b2\u6fc0\u54cd\u5e94\uff09\n h = jnp.where(n == mid, 2 * fc,\n jnp.sin(2 * jnp.pi * fc * (n - mid)) / (jnp.pi * (n - mid)))\n # \u5e94\u7528\u6c49\u660e\u7a97\n window = 0.54 - 0.46 * jnp.cos(2 * jnp.pi * n / (n_taps - 1))\n h = h * window\n h = h / jnp.sum(h) # \u5f52\u4e00\u5316\u5230\u76f4\u6d41\u589e\u76ca\u4e3a 1\n return h\n\ndef apply_filter(x, h):\n \"\"\"\u901a\u8fc7\u5377\u79ef\u5e94\u7528 FIR \u6ee4\u6ce2\u5668\u3002\"\"\"\n return jnp.convolve(x, h, mode='same')\n\n# 500 Hz \u4f4e\u901a\u6ee4\u6ce2\u5668\uff08\u901a\u8fc7 100 Hz\uff0c\u963b\u585e 2000 Hz\uff09\nh_lp = fir_lowpass(500, fs, n_taps=51)\nx_lp = apply_filter(x, h_lp)\n\n# \u9ad8\u901a = \u51b2\u6fc0 - \u4f4e\u901a\uff08\u9891\u8c31\u53cd\u8f6c\uff09\ndelta = jnp.zeros(51)\ndelta = delta.at[25].set(1.0)\nh_hp = delta - h_lp\nx_hp = apply_filter(x, h_hp)\n\n# \u8ba1\u7b97\u6240\u6709\u4fe1\u53f7\u7684\u9891\u8c31\ndef compute_spectrum(signal, fs):\n X = jnp.fft.rfft(signal)\n freqs = jnp.fft.rfftfreq(len(signal), d=1.0 / fs)\n mag = jnp.abs(X) / len(signal) * 2\n return freqs, mag\n\nfig, axes = plt.subplots(3, 2, figsize=(14, 10))\n\n# \u65f6\u57df\u56fe\nfor i, (sig, title, color) in enumerate([\n (x, '\u539f\u59cb\u4fe1\u53f7\uff08100 Hz + 2000 Hz\uff09', '#3498db'),\n (x_lp, '\u4f4e\u901a\u6ee4\u6ce2\u540e\uff08< 500 Hz\uff09', '#27ae60'),\n (x_hp, '\u9ad8\u901a\u6ee4\u6ce2\u540e\uff08> 500 Hz\uff09', '#e74c3c')\n]):\n axes[i, 0].plot(t * 1000, sig[:len(t)], color=color, linewidth=1)\n axes[i, 0].set_title(f'\u65f6\u57df\uff1a{title}')\n axes[i, 0].set_xlabel('\u65f6\u95f4 (ms)'); axes[i, 0].set_ylabel('\u632f\u5e45')\n axes[i, 0].grid(True, alpha=0.3)\n\n# \u9891\u57df\u56fe\nfor i, (sig, title, color) in enumerate([\n (x, '\u539f\u59cb\u4fe1\u53f7', '#3498db'),\n (x_lp, '\u4f4e\u901a', '#27ae60'),\n (x_hp, '\u9ad8\u901a', '#e74c3c')\n]):\n freqs, mag = compute_spectrum(sig, fs)\n axes[i, 1].plot(freqs, mag, color=color, linewidth=1.5)\n axes[i, 1].set_title(f'\u9891\u8c31\uff1a{title}')\n axes[i, 1].set_xlabel('\u9891\u7387 (Hz)'); axes[i, 1].set_ylabel('\u5e45\u5ea6')\n axes[i, 1].set_xlim(0, 3000)\n axes[i, 1].axvline(x=500, color='#f39c12', linestyle='--', alpha=0.7,\n label='\u622a\u6b62\u9891\u7387\uff08500 Hz\uff09')\n axes[i, 1].legend(); axes[i, 1].grid(True, alpha=0.3)\n\nplt.tight_layout(); plt.show()\n \u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\u5c06\u53e3\u8bed\u97f3\u9891\u8f6c\u6362\u4e3a\u4e66\u9762\u6587\u672c\uff0c\u5f25\u5408\u4eba\u7c7b\u8bed\u97f3\u4e0e\u673a\u5668\u53ef\u8bfb\u8bed\u8a00\u4e4b\u95f4\u7684\u9e3f\u6c9f\u3002\u672c\u6587\u6db5\u76d6 GMM-HMM\u3001CTC \u635f\u5931\u3001RNN-\u8f6c\u5bfc\u5668\u3001\u57fa\u4e8e\u6ce8\u610f\u529b\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u578b\uff08LAS\uff09\u3001Whisper \u4ee5\u53ca\u7aef\u5230\u7aef ASR\uff0c\u4ece\u7ecf\u5178\u6d41\u6c34\u7ebf\u5230\u73b0\u4ee3\u795e\u7ecf\u67b6\u6784\u3002
\u81ea\u52a8\u8bed\u97f3\u8bc6\u522b\uff08ASR\uff09\u662f\u5c06\u53e3\u8bed\u97f3\u9891\u8f6c\u6362\u4e3a\u4e66\u9762\u6587\u672c\u7684\u4efb\u52a1\u3002\u5b83\u662f AI \u9886\u57df\u6700\u53e4\u8001\u7684\u95ee\u9898\u4e4b\u4e00\uff0820 \u4e16\u7eaa 50 \u5e74\u4ee3\u7684\u7b2c\u4e00\u6279\u7cfb\u7edf\u5c31\u80fd\u8bc6\u522b\u5355\u4e2a\u6570\u5b57\uff09\uff0c\u4e5f\u662f\u5546\u4e1a\u90e8\u7f72\u6700\u5e7f\u6cdb\u7684\u4efb\u52a1\u4e4b\u4e00\uff08\u8bed\u97f3\u52a9\u624b\u3001\u8f6c\u5f55\u670d\u52a1\u3001\u5b57\u5e55\u751f\u6210\uff09\u3002
\u96be\u70b9\u5728\u4e8e\u8bed\u97f3\u7684\u5de8\u5927\u53d8\u5f02\u6027\uff1a\u4e0d\u540c\u7684\u8bf4\u8bdd\u4eba\u3001\u53e3\u97f3\u3001\u8bed\u901f\u3001\u80cc\u666f\u566a\u58f0\u3001\u9ea6\u514b\u98ce\u7279\u6027\uff0c\u4ee5\u53ca\u5c06\u8fde\u7eed\u58f0\u5b66\u4fe1\u53f7\u6620\u5c04\u5230\u79bb\u6563\u5355\u8bcd\u8fd9\u4e00\u6839\u672c\u6027\u6b67\u4e49\u95ee\u9898\u3002
\u53ef\u4ee5\u628a ASR \u60f3\u8c61\u6210\u6cd5\u5ead\u901f\u8bb0\u5458\u3002\u901f\u8bb0\u5458\u542c\u5230\u8fde\u7eed\u7684\u58f0\u97f3\u6d41\uff0c\u5728\u5fc3\u7406\u4e0a\u5c06\u5176\u5206\u5272\u6210\u5355\u8bcd\uff0c\u5229\u7528\u4e0a\u4e0b\u6587\u89e3\u51b3\u6b67\u4e49\uff08\u5982\"they're\" vs \"their\" vs \"there\"\uff09\uff0c\u7136\u540e\u6253\u51fa\u7ed3\u679c\u3002ASR \u7cfb\u7edf\u505a\u540c\u6837\u7684\u4e8b\u60c5\uff0c\u4f46\u5206\u9636\u6bb5\u8fdb\u884c\uff0c\u6bcf\u4e2a\u9636\u6bb5\u53ef\u4ee5\u72ec\u7acb\u6216\u8054\u5408\u4f18\u5316\u3002
\u7ecf\u5178 ASR \u6d41\u6c34\u7ebf\u901a\u8fc7\u4e00\u7cfb\u5217\u4e0d\u540c\u9636\u6bb5\u5904\u7406\u97f3\u9891\uff1a\u539f\u59cb\u97f3\u9891\u88ab\u8f6c\u6362\u4e3a\u7279\u5f81\uff08MFCC \u6216\u5bf9\u6570\u6885\u5c14\u9891\u8c31\u56fe\uff0c\u89c1\u6587\u4ef6 01\uff09\uff0c\u58f0\u5b66\u6a21\u578b\u8bc4\u4f30\u6bcf\u4e2a\u7279\u5f81\u5e27\u4e0e\u6bcf\u4e2a\u8bed\u97f3\u5355\u5143\u7684\u5339\u914d\u7a0b\u5ea6\uff0c\u53d1\u97f3\u6a21\u578b\uff08\u8bcd\u5178\uff09\u5c06\u8bed\u97f3\u5355\u5143\u6620\u5c04\u4e3a\u5355\u8bcd\uff0c\u8bed\u8a00\u6a21\u578b\u8bc4\u4f30\u8bcd\u5e8f\u5217\u7684\u5408\u7406\u7a0b\u5ea6\uff0c\u89e3\u7801\u5668\u641c\u7d22\u4f7f\u8054\u5408\u5f97\u5206\u6700\u5927\u5316\u7684\u8bcd\u5e8f\u5217\u3002\u6bcf\u4e2a\u7ec4\u4ef6\u5206\u522b\u8bad\u7ec3\u548c\u8c03\u4f18\u3002
\u97f3\u7d20\u662f\u8bed\u8a00\u4e2d\u533a\u5206\u5355\u8bcd\u7684\u6700\u5c0f\u58f0\u97f3\u5355\u4f4d\u3002\u82f1\u8bed\u5927\u7ea6\u6709 39-44 \u4e2a\u97f3\u7d20\uff08\u5177\u4f53\u6570\u91cf\u53d6\u51b3\u4e8e\u65b9\u8a00\u548c\u6240\u7528\u97f3\u7d20\u5e93\uff09\u3002\u4f8b\u5982\uff0c\"bat\"\u548c\"pat\"\u76f8\u5dee\u4e00\u4e2a\u97f3\u7d20\uff08/b/ vs /p/\uff09\u3002\u5927\u591a\u6570 ASR \u7cfb\u7edf\u5efa\u6a21\u7684\u662f\u4e0a\u4e0b\u6587\u76f8\u5173\u97f3\u7d20\uff0c\u79f0\u4e3a\u4e09\u97f3\u7d20\uff1a\u7531\u5176\u5de6\u90bb\u548c\u53f3\u90bb\u5171\u540c\u5b9a\u4e49\u7684\u97f3\u7d20\uff08\u4f8b\u5982\uff0c\"b_t\"\u4e0a\u4e0b\u6587\u4e2d\u7684\"a\"\u4e0e\"c_t\"\u4e0a\u4e0b\u6587\u4e2d\u7684\"a\"\u662f\u4e0d\u540c\u7684\u5355\u5143\uff09\uff0c\u56e0\u4e3a\u97f3\u7d20\u7684\u58f0\u5b66\u5b9e\u73b0\u53d7\u5176\u90bb\u63a5\u97f3\u7d20\u7684\u5f3a\u70c8\u5f71\u54cd\uff08\u8fd9\u79f0\u4e3a\u534f\u540c\u53d1\u97f3\uff09\u3002
\u53ef\u80fd\u7684\u4e09\u97f3\u7d20\u6570\u91cf\u5de8\u5927\uff0840 \u4e2a\u97f3\u7d20\u7684\u4e09\u6b21\u65b9 = 64,000\uff09\uff0c\u56e0\u6b64\u51b3\u7b56\u6811\u805a\u7c7b\u5c06\u58f0\u5b66\u4e0a\u76f8\u4f3c\u7684\u4e09\u97f3\u7d20\u5206\u7ec4\u4e3a\u58f0\u5b66\u72b6\u6001\uff08\u901a\u5e38\u4e3a 2000-10,000 \u4e2a\u7c7b\u522b\uff09\u3002\u6bcf\u4e2a\u58f0\u5b66\u72b6\u6001\u62e5\u6709\u81ea\u5df1\u7684\u58f0\u5b66\u6a21\u578b\u3002\u8fd9\u79cd\u805a\u7c7b\u662f\u7b2c 06 \u7ae0\u4e2d\u51b3\u7b56\u6811\u7b97\u6cd5\u7684\u4e00\u79cd\u5e94\u7528\u5f62\u5f0f\u3002
GMM-HMM\uff08\u9ad8\u65af\u6df7\u5408\u6a21\u578b-\u9690\u9a6c\u5c14\u53ef\u592b\u6a21\u578b\uff09\u662f\u4ece 20 \u4e16\u7eaa 80 \u5e74\u4ee3\u5230 21 \u4e16\u7eaa\u521d\u4e3b\u5bfc\u7684\u58f0\u5b66\u5efa\u6a21\u65b9\u6cd5\u3002HMM\uff08\u89c1\u7b2c 05 \u7ae0\uff09\u5bf9\u8bed\u97f3\u7684\u65f6\u95f4\u7ed3\u6784\u8fdb\u884c\u5efa\u6a21\uff1a\u6bcf\u4e2a\u97f3\u7d20\u662f\u4e00\u4e2a\u4ece\u5de6\u5230\u53f3\u7684 HMM\uff0c\u6709 3-5 \u4e2a\u72b6\u6001\uff0c\u6bcf\u4e2a\u72b6\u6001\u4ee3\u8868\u4e00\u4e2a\u5b50\u97f3\u7d20\u6bb5\uff08\u8d77\u59cb\u3001\u4e2d\u95f4\u3001\u7ed3\u675f\uff09\u3002\u72b6\u6001\u95f4\u7684\u8f6c\u79fb\u9690\u5f0f\u5730\u5efa\u6a21\u65f6\u957f\u3002
\u5728\u6bcf\u4e2a HMM \u72b6\u6001\uff0c\u53d1\u5c04\u6982\u7387\uff08\u7ed9\u5b9a\u72b6\u6001\u4e0b\u7279\u5b9a\u7279\u5f81\u5411\u91cf\u7684\u53ef\u80fd\u6027\uff09\u7531\u9ad8\u65af\u6df7\u5408\u6a21\u578b\uff08GMM\uff09\u5efa\u6a21\uff1a\u591a\u5143\u9ad8\u65af\u5206\u5e03\u7684\u52a0\u6743\u548c\uff08\u89c1\u7b2c 05 \u7ae0\uff09\uff1a
\u5176\u4e2d \\(\\mathbf{x}\\) \u662f\u7279\u5f81\u5411\u91cf\uff08\u4f8b\u5982 39 \u7ef4 MFCC\uff09\uff0c\\(s\\) \u662f HMM \u72b6\u6001\uff0c\\(M\\) \u662f\u6df7\u5408\u5206\u91cf\u6570\uff08\u901a\u5e38\u4e3a 8-64\uff09\uff0c\\(w_m\\) \u662f\u6df7\u5408\u6743\u91cd\uff0c\\(\\boldsymbol{\\mu}_m\\) \u548c \\(\\boldsymbol{\\Sigma}_m\\) \u662f\u6bcf\u4e2a\u9ad8\u65af\u5206\u91cf\u7684\u5747\u503c\u548c\u534f\u65b9\u5dee\u3002\u534f\u65b9\u5dee\u77e9\u9635\u901a\u5e38\u4f7f\u7528\u5bf9\u89d2\u5f62\u5f0f\u4ee5\u63d0\u9ad8\u8ba1\u7b97\u6548\u7387\uff08\u5047\u8bbe\u7279\u5f81\u7ef4\u5ea6\u72ec\u7acb\uff0c\u5bf9\u4e8e MFCC \u800c\u8a00\u7531\u4e8e DCT \u53bb\u76f8\u5173\u6027\uff0c\u8fd9\u4e00\u5047\u8bbe\u8fd1\u4f3c\u6210\u7acb\uff09\u3002
\u8bad\u7ec3\u4f7f\u7528 Baum-Welch \u7b97\u6cd5\uff08EM \u7b97\u6cd5\u7684\u7279\u4f8b\uff0c\u89c1\u7b2c 05 \u7ae0\uff09\u4ece\u6709\u6807\u6ce8\u7684\u8bed\u97f3\u6570\u636e\u4e2d\u8fed\u4ee3\u4f30\u8ba1 GMM \u53c2\u6570\u548c HMM \u8f6c\u79fb\u6982\u7387\u3002\u89e3\u7801\uff08\u5bfb\u627e\u6700\u53ef\u80fd\u7684\u72b6\u6001\u5e8f\u5217\uff09\u4f7f\u7528 Viterbi \u7b97\u6cd5\uff08\u52a8\u6001\u89c4\u5212\uff0c\u89c1\u7b2c 05 \u7ae0\uff09\uff1a
\u5176\u4e2d \\(\\delta_t(j)\\) \u662f\u5728\u65f6\u95f4 \\(t\\) \u4ee5\u72b6\u6001 \\(j\\) \u7ed3\u675f\u7684\u6700\u4f73\u8def\u5f84\u7684\u6982\u7387\uff0c\\(a_{ij}\\) \u662f\u4ece\u72b6\u6001 \\(i\\) \u5230\u72b6\u6001 \\(j\\) \u7684\u8f6c\u79fb\u6982\u7387\uff0c\\(b_j(\\mathbf{x}_t)\\) \u662f\u5728\u72b6\u6001 \\(j\\) \u4e0b\u7279\u5f81 \\(\\mathbf{x}_t\\) \u7684\u53d1\u5c04\u6982\u7387\u3002
DNN-HMM\uff08Hinton \u7b49\u4eba\uff0c2012\uff09\u7528\u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\uff08DNN\uff0c\u89c1\u7b2c 06 \u7ae0\uff09\u53d6\u4ee3\u4e86 GMM \u53d1\u5c04\u6a21\u578b\uff0c\u4ece\u7279\u5f81\u5e27\u7a97\u53e3\u4e2d\u9884\u6d4b\u58f0\u5b66\u72b6\u6001\u540e\u9a8c\u6982\u7387 \\(p(s | \\mathbf{x})\\)\u3002HMM \u4ecd\u7136\u5904\u7406\u65f6\u95f4\u7ed3\u6784\u548c\u5e8f\u5217\u5316\uff0c\u4f46\u795e\u7ecf\u7f51\u7edc\u63d0\u4f9b\u4e86\u66f4\u5177\u5224\u522b\u529b\u7684\u53d1\u5c04\u5206\u6570\u3002\u8fd9\u79cd\u6df7\u5408\u65b9\u6cd5\u76f8\u5bf9\u4e8e GMM \u5c06\u8bcd\u9519\u8bef\u7387\u964d\u4f4e\u4e86 20-30%\uff0c\u5e76\u5728 2012-2016 \u5e74\u95f4\u5360\u636e\u4e3b\u5bfc\u5730\u4f4d\u3002
WFST \u89e3\u7801\uff08\u52a0\u6743\u6709\u9650\u72b6\u6001\u6362\u5bfc\u5668\uff09\u662f\u4f20\u7edf ASR \u7684\u6807\u51c6\u89e3\u7801\u6846\u67b6\u3002\u6bcf\u4e2a\u7ec4\u4ef6\uff08HMM \u62d3\u6251 H\u3001\u4e0a\u4e0b\u6587\u4f9d\u8d56 C\u3001\u8bcd\u5178 L\u3001\u8bed\u6cd5/\u8bed\u8a00\u6a21\u578b G\uff09\u90fd\u8868\u793a\u4e3a\u52a0\u6743\u6709\u9650\u72b6\u6001\u6362\u5bfc\u5668\uff0c\u5b83\u4eec\u88ab\u7ec4\u5408\u6210\u5355\u4e2a\u641c\u7d22\u56fe \\(H \\circ C \\circ L \\circ G\\)\u3002\u7136\u540e Viterbi \u641c\u7d22\u5728\u6b64\u7ec4\u5408\u56fe\u4e2d\u5bfb\u627e\u6700\u4f4e\u6210\u672c\u8def\u5f84\u3002WFST \u5141\u8bb8\u77e5\u8bc6\u6e90\u7684\u6a21\u5757\u5316\u7ec4\u5408\u548c\u9ad8\u6548\u7684\u52a8\u6001\u89c4\u5212\u641c\u7d22\u3002\u5176\u6570\u5b66\u6846\u67b6\u6765\u81ea\u6709\u9650\u81ea\u52a8\u673a\u7406\u8bba\uff08\u4e0e\u7b2c 05 \u7ae0\u4e2d\u7684\u72b6\u6001\u673a\u76f8\u5173\uff09\u3002
\u7aef\u5230\u7aef ASR \u6d88\u9664\u4e86\u72ec\u7acb\u7684\u7ec4\u4ef6\uff08\u53d1\u97f3\u6a21\u578b\u3001\u97f3\u7d20\u5e93\u3001WFST \u89e3\u7801\u5668\uff09\uff0c\u8bad\u7ec3\u4e00\u4e2a\u76f4\u63a5\u5c06\u97f3\u9891\u7279\u5f81\u6620\u5c04\u5230\u5b57\u7b26\u6216\u5b50\u8bcd\u7684\u5355\u4e00\u795e\u7ecf\u7f51\u7edc\u3002\u5173\u952e\u6311\u6218\u662f\u5bf9\u9f50\u95ee\u9898\uff1a\u8f93\u5165\uff08\u6bcf\u79d2\u6570\u767e\u4e2a\u7279\u5f81\u5e27\uff09\u548c\u8f93\u51fa\uff08\u6bcf\u79d2\u51e0\u4e2a\u5b57\u7b26\uff09\u7684\u957f\u5ea6\u76f8\u5dee\u5f88\u5927\uff0c\u4e14\u8bad\u7ec3\u65f6\u5b83\u4eec\u4e4b\u95f4\u7684\u5bf9\u9f50\u5173\u7cfb\u662f\u672a\u77e5\u7684\u3002
\u8fde\u63a5\u4e3b\u4e49\u65f6\u5e8f\u5206\u7c7b\uff08CTC\uff09\uff08Graves \u7b49\u4eba\uff0c2006\uff09\u901a\u8fc7\u5f15\u5165\u4e00\u4e2a\u7279\u6b8a\u7684\u7a7a\u767d\u6807\u8bb0\u89e3\u51b3\u4e86\u5bf9\u9f50\u95ee\u9898\uff0c\u5141\u8bb8\u7f51\u7edc\u8f93\u51fa\u4efb\u610f\u957f\u5ea6\u7684\u5b57\u7b26\u548c\u7a7a\u767d\u5e8f\u5217\uff0c\u53ea\u8981\u901a\u8fc7\u5408\u5e76\u8fde\u7eed\u91cd\u590d\u548c\u79fb\u9664\u7a7a\u767d\u540e\u80fd\u5f97\u5230\u6b63\u786e\u7684\u8f6c\u5f55\u6587\u672c\u3002\u4f8b\u5982\uff0c\u8f6c\u5f55\u6587\u672c\"cat\"\u53ef\u4ee5\u7531\u8f93\u51fa\u5e8f\u5217\"--cc-aa-t--\"\u4ea7\u751f\uff08\u5176\u4e2d\"-\"\u662f\u7a7a\u767d\uff09\u3002
\u5f62\u5f0f\u4e0a\uff0cCTC \u5b9a\u4e49\u4e86\u4e00\u4e2a\u591a\u5bf9\u4e00\u6620\u5c04 \\(\\mathcal{B}\\)\uff0c\u4ece\u6240\u6709\u957f\u5ea6\u4e3a \\(T\\) \u7684\u8f93\u51fa\u5e8f\u5217\uff08\u4f7f\u7528\u5b57\u6bcd\u8868\u52a0\u4e0a\u7a7a\u767d\uff09\u5230\u6807\u7b7e\u5e8f\u5217\u3002\u6807\u7b7e\u5e8f\u5217 \\(\\mathbf{y}\\) \u7684\u6982\u7387\u662f\u6240\u6709\u80fd\u7ea6\u7b80\u5230\u5b83\u7684\u5bf9\u9f50\u8def\u5f84\u7684\u6982\u7387\u4e4b\u548c\uff1a
\u76f4\u63a5\u8ba1\u7b97\u6b64\u548c\u9700\u8981\u679a\u4e3e\u6307\u6570\u6570\u91cf\u7684\u5bf9\u9f50\u8def\u5f84\uff0c\u4f46 CTC \u524d\u5411-\u540e\u5411\u7b97\u6cd5\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u5728 \\(O(T \\cdot |\\mathbf{y}|)\\) \u65f6\u95f4\u5185\u9ad8\u6548\u8ba1\u7b97\uff0c\u7c7b\u4f3c\u4e8e\u7b2c 05 \u7ae0\u4e2d\u7684 HMM \u524d\u5411-\u540e\u5411\u7b97\u6cd5\u3002
CTC \u505a\u4e86\u4e00\u4e2a\u6761\u4ef6\u72ec\u7acb\u6027\u5047\u8bbe\uff1a\u7ed9\u5b9a\u8f93\u5165\uff0c\u6bcf\u4e2a\u65f6\u95f4\u6b65\u7684\u8f93\u51fa\u72ec\u7acb\u4e8e\u6240\u6709\u5176\u4ed6\u8f93\u51fa\u3002\u8fd9\u610f\u5473\u7740 CTC \u65e0\u6cd5\u5efa\u6a21\u8f93\u51fa\u4e4b\u95f4\u7684\u4f9d\u8d56\u5173\u7cfb\uff08\u4f8b\u5982\uff0c\u5b83\u65e0\u6cd5\u5b66\u4e60\u5230\"q\"\u51e0\u4e4e\u603b\u662f\u540e\u8ddf\"u\"\uff09\u3002\u5fc5\u987b\u4f7f\u7528\u5916\u90e8\u8bed\u8a00\u6a21\u578b\u6765\u5904\u7406\u6b64\u7c7b\u4f9d\u8d56\u5173\u7cfb\u3002
CTC \u89e3\u7801\u9009\u9879\uff1a
RNN-\u8f6c\u5bfc\u5668\uff08RNN-T\uff09\uff08Graves\uff0c2012\uff09\u901a\u8fc7\u6dfb\u52a0\u4e00\u4e2a\u663e\u5f0f\u7684\u9884\u6d4b\u7f51\u7edc\uff08\u7c7b\u8bed\u8a00\u6a21\u578b\u7684 RNN\uff09\u6269\u5c55\u4e86 CTC\uff0c\u4f7f\u6bcf\u4e2a\u8f93\u51fa\u4ee5\u4e4b\u524d\u7684\u8f93\u51fa\u4e3a\u6761\u4ef6\uff0c\u4ece\u800c\u6d88\u9664\u4e86\u6761\u4ef6\u72ec\u7acb\u6027\u5047\u8bbe\u3002RNN-T \u6709\u4e09\u4e2a\u7ec4\u4ef6\uff1a
RNN-T \u53ef\u4ee5\u5728\u6bcf\u4e2a\u65f6\u95f4\u6b65\u53d1\u5c04\u96f6\u4e2a\u6216\u591a\u4e2a\u6807\u7b7e\uff08\u901a\u8fc7\u5148\u53d1\u5c04\u975e\u7a7a\u767d\u6807\u8bb0\u518d\u524d\u8fdb\u5230\u4e0b\u4e00\u4e2a\u65f6\u95f4\u6b65\uff0c\u6216\u53d1\u5c04\u7a7a\u767d\u524d\u8fdb\u4f46\u4e0d\u8f93\u51fa\uff09\u3002\u8bad\u7ec3\u4f7f\u7528\u4e8c\u7ef4\uff08\u65f6\u95f4\uff0c\u6807\u7b7e\uff09\u7f51\u683c\u4e0a\u7684\u524d\u5411-\u540e\u5411\u7b97\u6cd5\uff0c\u590d\u6742\u5ea6\u4e3a \\(O(T \\cdot U)\\)\uff0c\u5176\u4e2d \\(U\\) \u662f\u8f93\u51fa\u957f\u5ea6\u3002RNN-T \u662f\u8bbe\u5907\u7aef\u6d41\u5f0f ASR \u7684\u4e3b\u5bfc\u67b6\u6784\uff08\u7528\u4e8e Google Pixel \u624b\u673a\u548c\u7c7b\u4f3c\u4ea7\u54c1\uff09\uff0c\u56e0\u4e3a\u5b83\u5929\u7136\u652f\u6301\u6d41\u5f0f\u5904\u7406\uff1a\u7f16\u7801\u5668\u4ece\u5de6\u5230\u53f3\u5904\u7406\u97f3\u9891\uff0c\u9884\u6d4b\u7f51\u7edc\u589e\u91cf\u751f\u6210\u8f93\u51fa\u3002
Listen, Attend and Spell\uff08LAS\uff09\uff08Chan \u7b49\u4eba\uff0c2016\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u6ce8\u610f\u529b\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u578b\uff08\u5e8f\u5217\u5230\u5e8f\u5217\u67b6\u6784\uff0c\u89c1\u7b2c 06 \u7ae0\uff09\u3002\u5b83\u6709\u4e09\u4e2a\u7ec4\u4ef6\uff1a
LAS \u53d6\u5f97\u4e86\u5f88\u5f3a\u7684\u7ed3\u679c\uff0c\u4f46\u9700\u8981\u5b8c\u6574\u7684\u8bed\u97f3\u7247\u6bb5\u624d\u80fd\u5f00\u59cb\u89e3\u7801\uff08\u56e0\u4e3a\u6ce8\u610f\u529b\u9700\u8981\u5173\u6ce8\u6240\u6709\u7f16\u7801\u5668\u72b6\u6001\uff09\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u6d41\u5f0f\u5e94\u7528\u3002\u6b64\u5916\uff0c\u5b83\u5728\u5904\u7406\u8d85\u957f\u8bed\u97f3\u7247\u6bb5\u65f6\u8868\u73b0\u4e0d\u4f73\uff0c\u56e0\u4e3a\u957f\u5e8f\u5217\u4e0a\u7684\u6ce8\u610f\u529b\u4f1a\u53d8\u5f97\u5f25\u6563\u3002
Conformer\uff08Gulati \u7b49\u4eba\uff0c2020\uff09\u5c06\u5377\u79ef\u7684\u5c40\u90e8\u6a21\u5f0f\u6355\u6349\u80fd\u529b\u4e0e\u81ea\u6ce8\u610f\u529b\u7684\u5168\u5c40\u4f9d\u8d56\u5efa\u6a21\u80fd\u529b\u76f8\u7ed3\u5408\u3002\u6bcf\u4e2a Conformer \u5757\u4ee5\u4e09\u660e\u6cbb\u7ed3\u6784\u5305\u542b\u56db\u4e2a\u6a21\u5757\uff1a
\u8f93\u51fa\u4e3a\uff1a\\(\\mathbf{y} = \\text{LayerNorm}(\\mathbf{x} + \\frac{1}{2}\\text{FFN}_1 + \\text{MHSA} + \\text{Conv} + \\frac{1}{2}\\text{FFN}_2)\\)\u3002\u5b9e\u9a8c\u8bc1\u660e\u8fd9\u79cd\u9a6c\u5361\u9f99\u5f0f\u7ed3\u6784\uff08FFN-\u6ce8\u610f\u529b-\u5377\u79ef-FFN\uff09\u914d\u5408\u534a\u6b65\u6b8b\u5dee\u4f18\u4e8e\u5176\u4ed6\u6392\u5e8f\u65b9\u5f0f\u3002Conformer \u5df2\u6210\u4e3a CTC \u548c RNN-T \u7cfb\u7edf\u7684\u9ed8\u8ba4\u7f16\u7801\u5668\uff0c\u6027\u80fd\u4f18\u4e8e\u7eaf Transformer \u548c\u7eaf LSTM \u7f16\u7801\u5668\u3002
Whisper\uff08Radford \u7b49\u4eba\uff0c2023\uff09\u662f OpenAI \u7684\u5927\u89c4\u6a21\u57fa\u4e8e\u6ce8\u610f\u529b\u7684 ASR \u6a21\u578b\u3002\u5b83\u4f7f\u7528\u6807\u51c6\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668 Transformer \u67b6\u6784\uff08\u6765\u81ea\u7b2c 07 \u7ae0\uff09\uff0c\u5728\u4ece\u4e92\u8054\u7f51\u6293\u53d6\u7684 68 \u4e07\u5c0f\u65f6\u5f31\u76d1\u7763\u6570\u636e\uff08\u97f3\u9891\u4e0e\u8fd1\u4f3c\u8f6c\u5f55\u6587\u672c\u914d\u5bf9\uff09\u4e0a\u8fdb\u884c\u8bad\u7ec3\u3002\u5173\u952e\u8bbe\u8ba1\u9009\u62e9\uff1a
wav2vec 2.0\uff08Baevski \u7b49\u4eba\uff0c2020\uff09\u662f\u4e00\u79cd\u7528\u4e8e\u8bed\u97f3\u8868\u793a\u7684\u81ea\u76d1\u7763\u9884\u8bad\u7ec3\u6846\u67b6\u3002\u6838\u5fc3\u601d\u60f3\u662f\u4ece\u5927\u91cf\u672a\u6807\u6ce8\u7684\u97f3\u9891\u4e2d\u5b66\u4e60\u8bed\u97f3\u8868\u793a\uff0c\u7136\u540e\u7528\u5c11\u91cf\u6807\u6ce8\u6570\u636e\u8fdb\u884c\u5fae\u8c03\u3002\u8fd9\u9075\u5faa\u4e86\u4e0e BERT\uff08\u6765\u81ea\u7b2c 07 \u7ae0\uff09\u76f8\u540c\u7684\u81ea\u76d1\u7763\u8303\u5f0f\uff0c\u4f46\u9488\u5bf9\u8fde\u7eed\u97f3\u9891\u4fe1\u53f7\u8fdb\u884c\u4e86\u9002\u914d\u3002
wav2vec 2.0 \u67b6\u6784\u5305\u542b\u4e09\u4e2a\u90e8\u5206\uff1a
\u5176\u4e2d \\(\\text{sim}\\) \u662f\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff0c\\(\\kappa\\) \u662f\u6e29\u5ea6\u53c2\u6570\uff0c\\(Q_t\\) \u5305\u62ec\u771f\u5b9e\u91cf\u5316\u76ee\u6807\u548c\u5e72\u6270\u9879\u3002\u989d\u5916\u7684\u591a\u6837\u6027\u635f\u5931\u9f13\u52b1\u5747\u8861\u4f7f\u7528\u6240\u6709\u7801\u672c\u6761\u76ee\u3002\u8be5\u635f\u5931\u672c\u8d28\u4e0a\u662f InfoNCE \u5bf9\u6bd4\u635f\u5931\uff0c\u4e0e\u89c6\u89c9\u81ea\u76d1\u7763\u5b66\u4e60\u4e2d\u4f7f\u7528\u7684\u5bf9\u6bd4\u76ee\u6807\u51fd\u6570\u5c5e\u4e8e\u540c\u4e00\u65cf\u3002
\u9884\u8bad\u7ec3\u540e\uff0c\u5728\u5176\u4e0a\u6dfb\u52a0\u7ebf\u6027\u6295\u5f71\u548c CTC \u5934\u90e8\uff0c\u7136\u540e\u5728\u6807\u6ce8\u6570\u636e\u4e0a\u8fdb\u884c\u5fae\u8c03\u3002wav2vec 2.0 \u4ec5\u4f7f\u7528 10 \u5206\u949f\u6807\u6ce8\u6570\u636e\uff08\u4f7f\u7528 53,000 \u5c0f\u65f6\u672a\u6807\u6ce8\u97f3\u9891\u8fdb\u884c\u9884\u8bad\u7ec3\uff09\u5373\u8fbe\u5230\u4e86\u63a5\u8fd1\u6700\u4f18\u7684\u7ed3\u679c\uff0c\u5c55\u793a\u4e86\u81ea\u76d1\u7763\u5b66\u4e60\u5728\u4f4e\u8d44\u6e90\u8bed\u97f3\u8bc6\u522b\u4e2d\u7684\u5f3a\u5927\u80fd\u529b\u3002
HuBERT\uff08Hsu \u7b49\u4eba\uff0c2021\uff09\u662f\u53e6\u4e00\u79cd\u81ea\u76d1\u7763\u65b9\u6cd5\uff0c\u7528\u63a9\u7801\u9884\u6d4b\u76ee\u6807\uff08\u9884\u6d4b\u63a9\u7801\u5e27\u7684\u79bb\u6563\u805a\u7c7b\u5206\u914d\uff09\u66ff\u4ee3\u5bf9\u6bd4\u76ee\u6807\u3002\u76ee\u6807\u7531\u79bb\u7ebf\u805a\u7c7b\u6b65\u9aa4\u4ea7\u751f\uff08\u7b2c\u4e00\u6b21\u8fed\u4ee3\u4f7f\u7528 MFCC \u7684 k-means\uff0c\u540e\u7eed\u8fed\u4ee3\u4f7f\u7528 HuBERT \u7279\u5f81\u7684 k-means\uff09\u3002\u4e0e wav2vec 2.0 \u76f8\u6bd4\uff0cHuBERT \u7b80\u5316\u4e86\u8bad\u7ec3\u6d41\u7a0b\uff08\u65e0\u9700\u91cf\u5316\u6a21\u5757\u6216\u5bf9\u6bd4\u91c7\u6837\uff09\uff0c\u4e14\u8fbe\u5230\u76f8\u5f53\u6216\u66f4\u597d\u7684\u7ed3\u679c\u3002
Fast Conformer\uff08Rekesh \u7b49\u4eba\uff0c2023\uff0cNVIDIA NeMo\uff09\u7528\u4e0b\u91c7\u6837\u6ce8\u610f\u529b\u673a\u5236\u66ff\u4ee3\u6807\u51c6 Conformer \u4e2d\u7684\u4e8c\u6b21\u81ea\u6ce8\u610f\u529b\uff1a\u8f93\u5165\u5e8f\u5217\u5728\u8ba1\u7b97\u6ce8\u610f\u529b\u4e4b\u524d\u88ab\u538b\u7f29\uff08\u901a\u5e38\u901a\u8fc7\u6b65\u8fdb\u5377\u79ef\u5b9e\u73b0 8 \u500d\u538b\u7f29\uff09\uff0c\u7136\u540e\u518d\u6269\u5c55\u56de\u6765\u3002\u8fd9\u5c06\u6ce8\u610f\u529b\u6210\u672c\u4ece \\(O(T^2)\\) \u964d\u4f4e\u5230 \\(O(T^2/64)\\)\uff0c\u540c\u65f6\u4fdd\u7559\u5168\u5c40\u4e0a\u4e0b\u6587\uff0c\u4f7f\u8bad\u7ec3\u8d85\u957f\u8bed\u97f3\u7247\u6bb5\uff08\u957f\u8fbe\u51e0\u5206\u949f\uff09\u4e0d\u4f1a\u51fa\u73b0\u5185\u5b58\u95ee\u9898\u3002Fast Conformer \u662f NVIDIA NeMo \u5de5\u5177\u5305\u4e2d\u7684\u9ed8\u8ba4\u7f16\u7801\u5668\uff0c\u6784\u6210\u4e86\u5176\u751f\u4ea7\u7ea7\u6a21\u578b\u7684\u57fa\u7840\u67b6\u6784\u3002
Parakeet\uff08NVIDIA\uff0c2024\uff09\u662f\u4e00\u7cfb\u5217\u57fa\u4e8e Fast Conformer \u7f16\u7801\u5668\u7684\u9ad8\u7cbe\u5ea6\u82f1\u6587 ASR \u6a21\u578b\uff0c\u914d\u5907 CTC \u548c RNN-T \u89e3\u7801\u5668\uff0c\u5728 64,000 \u5c0f\u65f6\u82f1\u8bed\u8bed\u97f3\u4e0a\u8bad\u7ec3\u3002Parakeet \u6a21\u578b\uff080.6B \u548c 1.1B \u53c2\u6570\uff09\u5728\u53d1\u5e03\u65f6\u4e8e\u6807\u51c6\u57fa\u51c6\u4e0a\u53d6\u5f97\u4e86\u6700\u4f4e\u7684\u8bcd\u9519\u8bef\u7387\uff0c\u5728\u5927\u591a\u6570\u82f1\u8bed\u6d4b\u8bd5\u96c6\u4e0a\u8d85\u8d8a\u4e86 Whisper large-v3\u3002\u5173\u952e\u8981\u7d20\u662f\u9ad8\u6548\u7684 Fast Conformer \u67b6\u6784\u3001\u6fc0\u8fdb\u7684\u6570\u636e\u589e\u5f3a\uff08SpecAugment\u3001\u901f\u5ea6\u6270\u52a8\u3001\u566a\u58f0\u6df7\u5408\uff09\u548c\u5927\u89c4\u6a21\u76d1\u7763\u8bad\u7ec3\u6570\u636e\u2014\u2014\u8fd9\u8868\u660e\u5bf9\u5df2\u77e5\u7ec4\u4ef6\u7684\u7cbe\u5fc3\u5de5\u7a0b\u5316\u4ecd\u80fd\u63a8\u52a8\u6280\u672f\u524d\u6cbf\u3002
Canary\uff08NVIDIA\uff0c2024\uff09\u5c06 NeMo \u6846\u67b6\u6269\u5c55\u5230\u591a\u8bed\u8a00\u548c\u591a\u4efb\u52a1 ASR\u3002\u5b83\u4f7f\u7528 Fast Conformer \u7f16\u7801\u5668\u914d\u5408\u57fa\u4e8e\u6ce8\u610f\u529b\u7684\u89e3\u7801\u5668\uff08\u800c\u975e CTC \u6216 RNN-T\uff09\uff0c\u5728\u5355\u4e2a\u6a21\u578b\u4e2d\u5904\u7406\u591a\u79cd\u8bed\u8a00\u7684\u8f6c\u5f55\u548c\u7ffb\u8bd1\uff08\u7c7b\u4f3c\u4e8e Whisper \u7684\u591a\u4efb\u52a1\u8bbe\u8ba1\uff0c\u4f46\u4f7f\u7528\u66f4\u9ad8\u6548\u7684 Fast Conformer \u9aa8\u5e72\u7f51\u7edc\uff09\u3002Canary \u6a21\u578b\u652f\u6301\u82f1\u8bed\u3001\u5fb7\u8bed\u3001\u897f\u73ed\u7259\u8bed\u548c\u6cd5\u8bed\uff0c\u5177\u6709\u7ade\u4e89\u6027\u7684\u51c6\u786e\u7387\u3002
Moonshine\uff08Useful Sensors\uff0c2024\uff09\u662f\u4e00\u7cfb\u5217\u9488\u5bf9\u8bbe\u5907\u7aef\u548c\u8fb9\u7f18\u90e8\u7f72\u4e13\u95e8\u4f18\u5316\u7684 ASR \u6a21\u578b\u3002\u7f16\u7801\u5668\u4f7f\u7528\u6df7\u5408\u67b6\u6784\uff0c\u5c06\u521d\u59cb\u7684 Transformer/Conformer \u5c42\u66ff\u6362\u4e3a\u5c0f\u578b CNN \u540e\u63a5\u5c11\u91cf Transformer \u5c42\uff0c\u5927\u5e45\u7f29\u5c0f\u4e86\u6a21\u578b\u4f53\u79ef\uff08\u57fa\u7840\u6a21\u578b\u4e0d\u5230 3000 \u4e07\u53c2\u6570\uff09\u3002Moonshine \u9762\u5411 CPU \u548c\u4f4e\u529f\u8017\u8bbe\u5907\u4e0a\u7684\u5b9e\u65f6\u6d41\u5f0f\u5904\u7406\uff0c\u5728\u8fd9\u4e9b\u573a\u666f\u4e0b Whisper \u8fc7\u5927\u8fc7\u6162\uff0cMoonshine \u4ee5\u5c11\u91cf\u7cbe\u5ea6\u6362\u53d6 5-10 \u500d\u7684\u66f4\u4f4e\u5ef6\u8fdf\u548c\u5185\u5b58\u5360\u7528\u3002
Distil-Whisper\uff08Gandhi \u7b49\u4eba\uff0c2023\uff09\u5e94\u7528\u77e5\u8bc6\u84b8\u998f\uff08\u7b2c 06 \u7ae0\uff09\u5c06 Whisper \u538b\u7f29\u4e3a\u66f4\u5c0f\u66f4\u5feb\u7684\u6a21\u578b\u3002\u5b66\u751f\u6a21\u578b\u4ec5\u4f7f\u7528 2 \u4e2a\u89e3\u7801\u5668\u5c42\uff08\u76f8\u6bd4\u4e4b\u4e0b Whisper \u6709 32 \u5c42\uff09\uff0c\u540c\u65f6\u4fdd\u7559\u5b8c\u6574\u7684\u7f16\u7801\u5668\uff0c\u5e76\u8bad\u7ec3\u4ee5\u5339\u914d Whisper \u7684\u8f93\u51fa\u5206\u5e03\u3002Distil-Whisper \u5728 WER \u4e0a\u4e0e\u6559\u5e08\u6a21\u578b\u5dee\u8ddd\u5728 1% \u4ee5\u5185\uff0c\u540c\u65f6\u901f\u5ea6\u5feb\u4e86 6 \u500d\uff0c\u4f7f\u5176\u5728\u5168\u5c3a\u5bf8 Whisper \u6a21\u578b\u8fc7\u6162\u7684\u5b9e\u65f6\u5e94\u7528\u4e2d\u53d8\u5f97\u5b9e\u7528\u3002
\u901a\u7528\u8bed\u97f3\u6a21\u578b\uff08USM\uff09\uff08Zhang \u7b49\u4eba\uff0c2023\uff0cGoogle\uff09\u5c06\u81ea\u76d1\u7763\u9884\u8bad\u7ec3\u6269\u5c55\u5230 1200 \u4e07\u5c0f\u65f6\u8de8 300 \u591a\u79cd\u8bed\u8a00\u7684\u672a\u6807\u6ce8\u97f3\u9891\uff0c\u968f\u540e\u8fdb\u884c\u76d1\u7763\u5fae\u8c03\u3002USM \u8bc1\u660e\u4e86 wav2vec 2.0 / \u81ea\u76d1\u7763\u8303\u5f0f\u53ef\u4ee5\u6269\u5c55\u5230\u771f\u6b63\u5927\u89c4\u6a21\u7684\u6570\u636e\u8303\u56f4\uff0c\u5728\u6807\u6ce8\u6570\u636e\u975e\u5e38\u6709\u9650\u7684\u4f4e\u8d44\u6e90\u8bed\u8a00\u4e0a\u53d6\u5f97\u4e86\u5f3a\u6027\u80fd\u3002
\u5927\u89c4\u6a21\u591a\u8bed\u8a00\u8bed\u97f3\uff08MMS\uff09\uff08Pratap \u7b49\u4eba\uff0c2023\uff0cMeta\uff09\u5c06 wav2vec 2.0 \u9884\u8bad\u7ec3\u6269\u5c55\u5230\u8d85\u8fc7 1,100 \u79cd\u8bed\u8a00\uff0c\u5229\u7528\u5b97\u6559\u5f55\u97f3\u548c\u5176\u4ed6\u6765\u6e90\u7684\u591a\u8bed\u8a00\u97f3\u9891\u3002MMS \u8986\u76d6\u7684\u8bed\u8a00\u6570\u91cf\u8fdc\u8d85\u4e4b\u524d\u7684\u4efb\u4f55 ASR \u7cfb\u7edf\uff0c\u9996\u6b21\u4e3a\u8bb8\u591a\u8d44\u6e90\u532e\u4e4f\u7684\u8bed\u8a00\u63d0\u4f9b\u4e86\u8bed\u97f3\u8bc6\u522b\u80fd\u529b\u3002
\u73b0\u4ee3 ASR \u7684\u683c\u5c40\u6b63\u8d8b\u4e8e\u51e0\u4e2a\u4e3b\u5bfc\u8303\u5f0f\uff1a\uff081\uff09Conformer \u65cf\u7f16\u7801\u5668\u914d\u5408 CTC \u6216 RNN-T \u7528\u4e8e\u6d41\u5f0f\u5904\u7406\uff0c\uff082\uff09\u7f16\u7801\u5668-\u89e3\u7801\u5668 Transformer \u7528\u4e8e\u79bb\u7ebf/\u591a\u4efb\u52a1\uff0c\uff083\uff09\u81ea\u76d1\u7763\u9884\u8bad\u7ec3\u7528\u4e8e\u4f4e\u8d44\u6e90\u573a\u666f\uff0c\uff084\uff09\u89c4\u6a21\u5316\u2014\u2014\u66f4\u591a\u7684\u6570\u636e\u548c\u66f4\u5927\u7684\u6a21\u578b\u6301\u7eed\u63d0\u5347\u51c6\u786e\u7387\u3002\u8fd9\u4e9b\u9009\u62e9\u53d6\u51b3\u4e8e\u90e8\u7f72\u7ea6\u675f\uff1a\u5ef6\u8fdf\u9884\u7b97\u3001\u53ef\u7528\u7b97\u529b\u3001\u8bed\u8a00\u6570\u91cf\uff0c\u4ee5\u53ca\u5e94\u7528\u662f\u6d41\u5f0f\u8fd8\u662f\u6279\u5904\u7406\u3002
\u8bed\u8a00\u6a21\u578b\u96c6\u6210\u901a\u8fc7\u5f15\u5165\u58f0\u5b66\u6a21\u578b\u65e0\u6cd5\u6355\u6349\u7684\u8bed\u8a00\u77e5\u8bc6\u6765\u6539\u8fdb ASR\u3002\u57fa\u672c\u601d\u60f3\u662f\u5728\u89e3\u7801\u65f6\u5c06\u58f0\u5b66\u6a21\u578b\u5f97\u5206 \\(p(\\mathbf{x} | \\mathbf{y})\\)\uff08\u97f3\u9891\u4e0e\u8f6c\u5f55\u6587\u672c\u7684\u5339\u914d\u7a0b\u5ea6\uff09\u4e0e\u8bed\u8a00\u6a21\u578b\u5f97\u5206 \\(p(\\mathbf{y})\\)\uff08\u8f6c\u5f55\u6587\u672c\u4f5c\u4e3a\u53e5\u5b50\u7684\u5408\u7406\u6027\uff09\u76f8\u7ed3\u5408\u3002
\u6d45\u878d\u5408\u5728\u675f\u641c\u7d22\u65f6\u7ed3\u5408\u5f97\u5206\uff1a
\u5176\u4e2d \\(\\lambda\\) \u662f\u53ef\u8c03\u6743\u91cd\uff0c\\(p_\\text{LM}\\) \u662f\u5916\u90e8\u8bed\u8a00\u6a21\u578b\uff08\u901a\u5e38\u662f n-gram \u6216\u795e\u7ecf\u8bed\u8a00\u6a21\u578b\uff0c\u6765\u81ea\u7b2c 07 \u7ae0\uff09\u3002\u8fd9\u79cd\u65b9\u6cd5\u7b80\u5355\u6709\u6548\uff0c\u4f46\u8981\u6c42 LM \u4f7f\u7528\u4e0e ASR \u6a21\u578b\u76f8\u540c\u7684\u6807\u8bb0\u8bcd\u6c47\u8868\u3002
\u6df1\u5ea6\u878d\u5408\uff08Gulcehre \u7b49\u4eba\uff0c2015\uff09\u5c06\u8bed\u8a00\u6a21\u578b\u96c6\u6210\u5230\u89e3\u7801\u5668\u7f51\u7edc\u5185\u90e8\uff1aLM \u9690\u85cf\u72b6\u6001\u4e0e\u89e3\u7801\u5668\u9690\u85cf\u72b6\u6001\u62fc\u63a5\uff0c\u901a\u8fc7\u95e8\u63a7\u673a\u5236\u540e\u8fdb\u5165\u8f93\u51fa\u6295\u5f71\u5c42\u3002\u6574\u4e2a\u7cfb\u7edf\uff08\u5305\u62ec\u9884\u8bad\u7ec3\u7684 LM\uff09\u88ab\u8054\u5408\u5fae\u8c03\u3002\u8fd9\u79cd\u65b9\u6cd5\u96c6\u6210\u66f4\u6df1\u5165\uff0c\u4f46\u8bad\u7ec3\u66f4\u590d\u6742\u3002
\u51b7\u878d\u5408\uff08Sriram \u7b49\u4eba\uff0c2018\uff09\u4e0e\u6df1\u5ea6\u878d\u5408\u7c7b\u4f3c\uff0c\u4f46 ASR \u89e3\u7801\u5668\u4ece\u5934\u5f00\u59cb\u4e0e\u96c6\u6210\u8bed\u8a00\u6a21\u578b\u4e00\u8d77\u8bad\u7ec3\uff0c\u800c\u975e\u5fae\u8c03\u9884\u8bad\u7ec3\u7684\u89e3\u7801\u5668\u3002\u8fd9\u8feb\u4f7f\u58f0\u5b66\u6a21\u578b\u5b66\u4e60\u4e92\u8865\u4fe1\u606f\uff0c\u800c\u975e\u91cd\u590d LM \u5df2\u7ecf\u77e5\u9053\u7684\u5185\u5bb9\u3002
\u91cd\u6253\u5206\uff08N-best \u91cd\u6253\u5206\uff09\u662f\u4e00\u79cd\u4e24\u904d\u65b9\u6cd5\uff1a\u9996\u5148\u4f7f\u7528\u675f\u641c\u7d22\u751f\u6210 \\(N\\) \u4e2a\u5019\u9009\u8f6c\u5f55\u6587\u672c\uff0c\u7136\u540e\u4f7f\u7528\u66f4\u5f3a\u5927\u7684\u8bed\u8a00\u6a21\u578b\uff08\u4f8b\u5982\uff0c\u5927\u578b Transformer LM\uff09\u5bf9\u5b83\u4eec\u91cd\u65b0\u6392\u5e8f\u3002\u8fd9\u79cd\u65b9\u6cd5\u5b9e\u73b0\u7b80\u5355\uff0c\u4e14\u5141\u8bb8\u4f7f\u7528\u5bf9\u7b2c\u4e00\u904d\u89e3\u7801\u6765\u8bf4\u592a\u6162\u7684\u975e\u5e38\u5927\u7684 LM\u3002
\u5185\u90e8\u8bed\u8a00\u6a21\u578b\u4f30\u8ba1\uff08ILME\uff09\u89e3\u51b3\u4e86\u4e00\u4e2a\u5fae\u5999\u7684\u95ee\u9898\uff1a\u7aef\u5230\u7aef\u6a21\u578b\u4ece\u8bad\u7ec3\u8f6c\u5f55\u6587\u672c\u4e2d\u9690\u5f0f\u5b66\u4e60\u4e86\u4e00\u4e2a\u5185\u90e8 LM\uff0c\u8fd9\u5728\u6d45\u878d\u5408\u65f6\u53ef\u80fd\u4e0e\u5916\u90e8 LM \u51b2\u7a81\uff08\u672c\u8d28\u4e0a\u662f\u5bf9\u8bed\u8a00\u5148\u9a8c\u8fdb\u884c\u4e86\u53cc\u91cd\u8ba1\u6570\uff09\u3002ILME \u4f30\u8ba1\u5185\u90e8 LM \u5e76\u5728\u878d\u5408\u65f6\u51cf\u53bb\u5176\u5f97\u5206\uff1a
\u6d41\u5f0f vs. \u79bb\u7ebf ASR \u662f\u4e00\u4e2a\u57fa\u672c\u7684\u67b6\u6784\u9009\u62e9\u3002\u79bb\u7ebf\uff08\u6216\u6279\u5904\u7406\uff09ASR \u5728\u5904\u7406\u5b8c\u6574\u4e2a\u8bed\u97f3\u7247\u6bb5\u540e\u624d\u4ea7\u751f\u8f93\u51fa\u3002\u6d41\u5f0f ASR \u5728\u97f3\u9891\u5230\u8fbe\u65f6\u589e\u91cf\u4ea7\u751f\u8f93\u51fa\uff0c\u5177\u6709\u6709\u754c\u5ef6\u8fdf\u3002
\u6d41\u5f0f\u5904\u7406\u5bf9\u5b9e\u65f6\u5e94\u7528\u81f3\u5173\u91cd\u8981\uff1a\u5b9e\u65f6\u5b57\u5e55\u3001\u8bed\u97f3\u52a9\u624b\uff08\u7528\u6237\u5728\u8bf4\u5b8c\u4e4b\u524d\u5c31\u671f\u671b\u5f97\u5230\u54cd\u5e94\uff09\u3001\u7535\u8bdd\u901a\u8bdd\u8f6c\u5f55\u3002\u6311\u6218\u5728\u4e8e\u67d0\u4e9b\u672a\u6765\u4e0a\u4e0b\u6587\u6709\u52a9\u4e8e\u8bc6\u522b\uff08\u77e5\u9053\u4e0b\u4e00\u4e2a\u8bcd\u662f\"York\"\u6709\u52a9\u4e8e\u6d88\u6b67\"New\"\uff09\uff0c\u4f46\u6d41\u5f0f\u7cfb\u7edf\u4e0d\u80fd\u65e0\u9650\u7b49\u5f85\u672a\u6765\u7684\u4e0a\u4e0b\u6587\u3002
\u5355\u5411\u7f16\u7801\u5668\uff08\u4ece\u5de6\u5230\u53f3 LSTM\u3001\u56e0\u679c\u5377\u79ef\u3001\u56e0\u679c Transformer\uff09\u5929\u7136\u652f\u6301\u6d41\u5f0f\u5904\u7406\uff0c\u56e0\u4e3a\u6bcf\u4e2a\u8f93\u51fa\u4ec5\u4f9d\u8d56\u4e8e\u8fc7\u53bb\u548c\u5f53\u524d\u7684\u8f93\u5165\u3002\u53cc\u5411\u7f16\u7801\u5668\uff08\u67e5\u770b\u672a\u6765\u4e0a\u4e0b\u6587\uff09\u4e0d\u80fd\u76f4\u63a5\u652f\u6301\u6d41\u5f0f\u5904\u7406\u3002
\u5206\u5757\u6ce8\u610f\u529b\uff08\u4e5f\u79f0\u4e3a\u9010\u5757\u6216\u5206\u6bb5\u6ce8\u610f\u529b\uff09\u5c06\u8f93\u5165\u5212\u5206\u4e3a\u56fa\u5b9a\u957f\u5ea6\u7684\u5757\uff0c\u4ec5\u5728\u6bcf\u4e2a\u5757\u5185\uff08\u4ee5\u53ca\u53ef\u9009\u7684\u524d\u9762\u51e0\u4e2a\u5757\uff09\u5e94\u7528\u81ea\u6ce8\u610f\u529b\u3002\u8fd9\u5c06\u5ef6\u8fdf\u9650\u5236\u5728\u5757\u5927\u5c0f\u52a0\u4e0a\u5904\u7406\u65f6\u95f4\uff0c\u540c\u65f6\u5728\u6bcf\u4e2a\u5757\u5185\u4ecd\u5141\u8bb8\u4e00\u5b9a\u7684\u5c40\u90e8\u53cc\u5411\u4e0a\u4e0b\u6587\u3002\u5176\u6743\u8861\u662f\uff1a\u5757\u8d8a\u5c0f\uff0c\u51c6\u786e\u7387\u4e0b\u964d\u8d8a\u591a\u3002
\u524d\u77bb\u5141\u8bb8\u6d41\u5f0f\u7f16\u7801\u5668\u5728\u5f53\u524d\u5e27\u4ea7\u751f\u8f93\u51fa\u4e4b\u524d\uff0c\u7aa5\u89c6\u5c11\u91cf\u7684\u672a\u6765\u5e27\uff08\u4f8b\u5982 300-900 ms\uff09\u3002\u8fd9\u662f\u901a\u8fc7\u5728\u5355\u5411\u8ba1\u7b97\u4e2d\u6dfb\u52a0\u5c11\u91cf\u53f3\u4e0a\u4e0b\u6587\u6765\u5b9e\u73b0\u7684\u3002\u524d\u77bb\u7a97\u53e3\u589e\u52a0\u4e86\u5ef6\u8fdf\uff0c\u4f46\u663e\u8457\u63d0\u5347\u4e86\u51c6\u786e\u7387\u3002
\u6d41\u5f0f ASR \u4e2d\u7684\u5ef6\u8fdf\u5305\u542b\u51e0\u4e2a\u7ec4\u6210\u90e8\u5206\uff1a
ASR \u7684\u8bc4\u4f30\u6307\u6807\uff1a
\u8bcd\u9519\u8bef\u7387\uff08WER\uff09\u662f\u4e3b\u8981\u6307\u6807\u3002\u901a\u8fc7\u5c06\u7cfb\u7edf\u8f93\u51fa\uff08\u5047\u8bbe\uff09\u4e0e\u53c2\u8003\u6587\u672c\uff08\u771f\u5b9e\u8f6c\u5f55\u6587\u672c\uff09\u8fdb\u884c\u5bf9\u9f50\u8ba1\u7b97\uff0c\u4f7f\u7528\u7f16\u8f91\u8ddd\u79bb\uff08\u5c06\u4e00\u4e2a\u8f6c\u6362\u4e3a\u53e6\u4e00\u4e2a\u6240\u9700\u7684\u6700\u5c11\u66ff\u6362\u3001\u63d2\u5165\u548c\u5220\u9664\u6b21\u6570\uff09\uff0c\u7136\u540e\uff1a
\u5176\u4e2d \\(S\\) \u662f\u66ff\u6362\u6570\uff0c\\(D\\) \u662f\u5220\u9664\u6570\uff0c\\(I\\) \u662f\u63d2\u5165\u6570\uff0c\\(N\\) \u662f\u53c2\u8003\u6587\u672c\u4e2d\u7684\u603b\u8bcd\u6570\u3002\u5982\u679c\u63d2\u5165\u8fc7\u591a\uff0cWER \u53ef\u80fd\u8d85\u8fc7 100%\u30025% \u7684 WER \u88ab\u8ba4\u4e3a\u5927\u81f4\u76f8\u5f53\u4e8e\u4eba\u7c7b\u5728\u6e05\u6670\u6717\u8bfb\u8bed\u97f3\u4e0a\u7684\u6c34\u5e73\uff1b\u5bf9\u8bdd\u6216\u566a\u58f0\u73af\u5883\u4e0b\u7684\u8bed\u97f3\u5219\u56f0\u96be\u5f97\u591a\uff0810-20%+\uff09\u3002
\u5b57\u7b26\u9519\u8bef\u7387\uff08CER\uff09\u662f\u76f8\u540c\u7684\u516c\u5f0f\u5e94\u7528\u4e8e\u5b57\u7b26\u7ea7\u522b\u800c\u975e\u8bcd\u7ea7\u522b\u3002CER \u5bf9\u4e8e\u6ca1\u6709\u660e\u786e\u8bcd\u8fb9\u754c\u7684\u8bed\u8a00\uff08\u5982\u4e2d\u6587\u3001\u65e5\u8bed\uff09\u4ee5\u53ca\u8bc4\u4f30\u8fd1\u4f3c\u6b63\u786e\u60c5\u51b5\u7684\u63a5\u8fd1\u7a0b\u5ea6\uff08\"cat\" vs \"bat\" \u662f 100% WER \u4f46 33% CER\uff09\u66f4\u6709\u53c2\u8003\u4ef7\u503c\u3002
\u8bcd\u4fe1\u606f\u635f\u5931\uff08WIL\uff09\u548c\u8bcd\u4fe1\u606f\u4fdd\u7559\uff08WIP\uff09\u662f\u4fe1\u606f\u8bba\u66ff\u4ee3\u6307\u6807\uff0c\u6bd4 WER \u66f4\u7cbe\u786e\u5730\u8003\u8651\u4e86\u53c2\u8003\u6587\u672c\u4e0e\u5047\u8bbe\u4e4b\u95f4\u7684\u76f8\u5173\u6027\uff0c\u4f46\u4f7f\u7528\u8f83\u5c11\u3002
\u5b9e\u65f6\u56e0\u5b50\uff08RTF\uff09\u8861\u91cf\u8ba1\u7b97\u6548\u7387\uff1a\u5904\u7406\u65f6\u95f4\u4e0e\u97f3\u9891\u65f6\u957f\u7684\u6bd4\u503c\u3002RTF < 1 \u8868\u793a\u7cfb\u7edf\u8fd0\u884c\u901f\u5ea6\u5feb\u4e8e\u5b9e\u65f6\uff1bRTF > 1 \u8868\u793a\u7cfb\u7edf\u65e0\u6cd5\u8ddf\u4e0a\u5b9e\u65f6\u97f3\u9891\u3002\u6d41\u5f0f\u7cfb\u7edf\u5fc5\u987b\u4fdd\u6301 RTF < 1\u3002
\u6570\u636e\u589e\u5f3a\u5bf9\u9c81\u68d2 ASR \u81f3\u5173\u91cd\u8981\u3002\u5e38\u89c1\u6280\u672f\uff1a
ASR \u7684\u5206\u8bcd\u51b3\u5b9a\u4e86\u6a21\u578b\u7684\u8f93\u51fa\u8bcd\u6c47\u8868\u3002\u9009\u9879\u5305\u62ec\uff1a
ASR \u7684\u6f14\u8fdb\u53ef\u4ee5\u6982\u62ec\u4e3a\uff1a\u4ece\u9ad8\u5ea6\u5de5\u7a0b\u5316\u7684\u6a21\u5757\u5316\u7cfb\u7edf\uff08GMM-HMM + WFST \u89e3\u7801\uff0c1990 \u5e74\u4ee3-2010 \u5e74\u4ee3\uff09\u5230\u6df7\u5408\u7cfb\u7edf\uff08DNN-HMM\uff0c2012-2016\uff09\uff0c\u518d\u5230\u5c06\u6d41\u6c34\u7ebf\u8d8a\u6765\u8d8a\u591a\u5730\u5438\u6536\u5230\u5355\u4e00\u795e\u7ecf\u7f51\u7edc\u4e2d\u7684\u7aef\u5230\u7aef\u7cfb\u7edf\uff08CTC\u3001RNN-T\u3001LAS\uff0c2016-2020\uff09\uff0c\u6700\u540e\u5230\u5229\u7528\u6d77\u91cf\u672a\u6807\u6ce8\u6216\u5f31\u6807\u6ce8\u6570\u636e\u7684\u5927\u578b\u9884\u8bad\u7ec3\u6a21\u578b\uff08wav2vec 2.0\u3001Whisper\uff0c2020 \u81f3\u4eca\uff09\u3002\u6bcf\u4e00\u6b21\u8f6c\u53d8\u90fd\u5728\u63d0\u5347\u51c6\u786e\u7387\u7684\u540c\u65f6\u7b80\u5316\u4e86\u5de5\u7a0b\u590d\u6742\u5ea6\uff0c\u9075\u5faa\u4e86\u673a\u5668\u5b66\u4e60\u4e2d\u4ece\u624b\u5de5\u8bbe\u8ba1\u7279\u5f81\u5230\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u8868\u793a\u7684\u66f4\u5e7f\u6cdb\u8d8b\u52bf\uff08\u7b2c 06 \u7ae0\u4e2d CNN \u66ff\u4ee3\u56fe\u50cf\u7279\u5f81\u3001\u7b2c 07 \u7ae0\u4e2d Transformer \u66ff\u4ee3 NLP \u7279\u5f81\u4e5f\u662f\u5982\u6b64\uff09\u3002
\u5728 JAX \u4e2d\u4ece\u5934\u5b9e\u73b0 CTC \u635f\u5931\u3002\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u77ed\u5e8f\u5217 logits \u548c\u76ee\u6807\u6807\u7b7e\u7684\u73a9\u5177\u793a\u4f8b\uff0c\u8ba1\u7b97 CTC \u524d\u5411\u7b97\u6cd5\u5f97\u5230\u603b\u6982\u7387\uff0c\u5e76\u8ba1\u7b97\u8d1f\u5bf9\u6570\u4f3c\u7136\u635f\u5931\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef ctc_forward(log_probs, targets):\n \"\"\"\n CTC \u524d\u5411\u7b97\u6cd5\uff08\u5bf9\u6570\u57df\uff0c\u6570\u503c\u7a33\u5b9a\u6027\uff09\u3002\n log_probs: (T, V) \u8bcd\u6c47\u8868\u4e0a\u7684\u5bf9\u6570\u6982\u7387\uff08\u7d22\u5f15 0 = \u7a7a\u767d\uff09\n targets: (U,) \u76ee\u6807\u6807\u7b7e\u7d22\u5f15\uff08\u4e0d\u542b\u7a7a\u767d\uff09\n \u8fd4\u56de\uff1a\u76ee\u6807\u5e8f\u5217\u5728 CTC \u4e0b\u7684\u5bf9\u6570\u6982\u7387\u3002\n \"\"\"\n T, V = log_probs.shape\n U = len(targets)\n\n # \u6784\u5efa\u5e26\u6709\u7a7a\u767d\u7684\u6269\u5c55\u6807\u7b7e\u5e8f\u5217\uff1a[blank, y1, blank, y2, ..., yU, blank]\n S = 2 * U + 1\n labels = jnp.zeros(S, dtype=jnp.int32) # \u5168\u90e8\u4e3a\u7a7a\u767d\n for i in range(U):\n labels = labels.at[2 * i + 1].set(targets[i])\n\n # \u521d\u59cb\u5316 alpha\uff08\u5bf9\u6570\u57df\uff09\n NEG_INF = -1e30\n alpha = jnp.full((T, S), NEG_INF)\n alpha = alpha.at[0, 0].set(log_probs[0, labels[0]]) # \u4ee5\u7a7a\u767d\u5f00\u59cb\n alpha = alpha.at[0, 1].set(log_probs[0, labels[1]]) # \u6216\u7b2c\u4e00\u4e2a\u6807\u7b7e\n\n # \u524d\u5411\u586b\u5145\n for t in range(1, T):\n for s in range(S):\n # \u540c\u4e00\u72b6\u6001\n a = alpha[t - 1, s]\n # \u4ece\u524d\u4e00\u72b6\u6001\u6765\n if s > 0:\n a = jnp.logaddexp(a, alpha[t - 1, s - 1])\n # \u8df3\u8fc7\u7a7a\u767d\uff08\u5982\u679c\u5f53\u524d\u6807\u7b7e\u4e0e\u4e24\u6b65\u524d\u7684\u6807\u7b7e\u4e0d\u540c\uff09\n if s > 1 and labels[s] != 0 and labels[s] != labels[s - 2]:\n a = jnp.logaddexp(a, alpha[t - 1, s - 2])\n alpha = alpha.at[t, s].set(a + log_probs[t, labels[s]])\n\n # \u603b\u5bf9\u6570\u6982\u7387\uff1a\u6700\u540e\u65f6\u95f4\u6b65\u7684\u6700\u540e\u4e24\u4e2a\u72b6\u6001\u4e4b\u548c\n log_prob = jnp.logaddexp(alpha[T - 1, S - 1], alpha[T - 1, S - 2])\n return log_prob, alpha\n\n# --- \u73a9\u5177\u793a\u4f8b ---\nT = 12 # \u8f93\u5165\u957f\u5ea6\uff08\u65f6\u95f4\u6b65\uff09\nV = 5 # \u8bcd\u6c47\u8868\u5927\u5c0f\uff080=\u7a7a\u767d\uff0c1='c'\uff0c2='a'\uff0c3='t'\uff0c4='x'\uff09\ntargets = jnp.array([1, 2, 3]) # \"c\", \"a\", \"t\"\n\n# \u521b\u5efa\u968f\u673a logits \u5e76\u8f6c\u6362\u4e3a\u5bf9\u6570\u6982\u7387\nkey = jax.random.PRNGKey(42)\nlogits = jax.random.normal(key, (T, V))\nlog_probs = jax.nn.log_softmax(logits, axis=-1)\n\nlog_prob, alpha = ctc_forward(log_probs, targets)\nctc_loss = -log_prob\n\nprint(f\"\u76ee\u6807\u5e8f\u5217: {targets.tolist()} ('c', 'a', 't')\")\nprint(f\"\u8f93\u5165\u957f\u5ea6 T={T}, \u8bcd\u6c47\u8868\u5927\u5c0f V={V}\")\nprint(f\"CTC \u5bf9\u6570\u6982\u7387: {log_prob:.4f}\")\nprint(f\"CTC \u635f\u5931\uff08\u8d1f\u5bf9\u6570\u6982\u7387\uff09: {ctc_loss:.4f}\")\n\n# \u53ef\u89c6\u5316\u524d\u5411\u53d8\u91cf\uff08alpha\uff09\u7f51\u683c\nfig, ax = plt.subplots(figsize=(12, 5))\n# \u5c06\u5bf9\u6570\u8f6c\u6362\u4e3a\u7ebf\u6027\u4ee5\u4fbf\u53ef\u89c6\u5316\nalpha_linear = jnp.exp(alpha - jnp.max(alpha)) # \u5f52\u4e00\u5316\u4ee5\u4fbf\u89c2\u5bdf\nim = ax.imshow(alpha_linear.T, aspect='auto', origin='lower', cmap='viridis')\nax.set_xlabel('\u65f6\u95f4\u6b65 (t)')\nax.set_ylabel('\u6269\u5c55\u6807\u7b7e\u7d22\u5f15 (s)')\n\nlabel_names = ['_', 'c', '_', 'a', '_', 't', '_'] # _ = \u7a7a\u767d\nax.set_yticks(range(len(label_names)))\nax.set_yticklabels(label_names)\nax.set_title(f'CTC \u524d\u5411\u53d8\u91cf\uff08alpha \u7f51\u683c\uff09| \u635f\u5931 = {ctc_loss:.2f}')\nplt.colorbar(im, ax=ax, label='\u5f52\u4e00\u5316\u6982\u7387')\nplt.tight_layout(); plt.show()\n \u5728 JAX \u4e2d\u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u57fa\u4e8e\u6ce8\u610f\u529b\u7684 ASR \u6a21\u578b\uff08\u6700\u5c0f\u5316\u7684 LAS \u7c7b\u67b6\u6784\uff09\u3002\u4f7f\u7528\u4e00\u7ef4\u5377\u79ef\u7f16\u7801\u5668\u548c\u5e26\u6709\u70b9\u79ef\u6ce8\u610f\u529b\u7684\u5355\u5c42\u89e3\u7801\u5668\u3002\u5728\u5408\u6210\u6570\u636e\u4e0a\u8fd0\u884c\u5e76\u53ef\u89c6\u5316\u6ce8\u610f\u529b\u6743\u91cd\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# --- \u6700\u5c0f\u5316\u7684\u57fa\u4e8e\u6ce8\u610f\u529b\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668 ASR \u6a21\u578b ---\n\ndef init_params(key, input_dim, hidden_dim, vocab_size):\n \"\"\"\u521d\u59cb\u5316\u5c0f\u578b LAS \u7c7b\u6a21\u578b\u7684\u53c2\u6570\u3002\"\"\"\n keys = jax.random.split(key, 8)\n scale = 0.1\n params = {\n # \u7f16\u7801\u5668\uff1a\u7b80\u5355\u7684\u7ebf\u6027\u6295\u5f71\uff08\u6a21\u62df\u5377\u79ef\u8f93\u51fa\uff09\n 'enc_w': jax.random.normal(keys[0], (input_dim, hidden_dim)) * scale,\n 'enc_b': jnp.zeros(hidden_dim),\n # \u6ce8\u610f\u529b\uff1a\u67e5\u8be2\u3001\u952e\u3001\u503c\u6295\u5f71\n 'attn_q': jax.random.normal(keys[1], (hidden_dim, hidden_dim)) * scale,\n 'attn_k': jax.random.normal(keys[2], (hidden_dim, hidden_dim)) * scale,\n 'attn_v': jax.random.normal(keys[3], (hidden_dim, hidden_dim)) * scale,\n # \u89e3\u7801\u5668 RNN\uff08\u4e3a\u6f14\u793a\u4f7f\u7528\u7b80\u5355 Elman RNN\uff09\n 'dec_wh': jax.random.normal(keys[4], (hidden_dim, hidden_dim)) * scale,\n 'dec_wx': jax.random.normal(keys[5], (vocab_size, hidden_dim)) * scale,\n 'dec_wc': jax.random.normal(keys[6], (hidden_dim, hidden_dim)) * scale,\n 'dec_b': jnp.zeros(hidden_dim),\n # \u8f93\u51fa\u6295\u5f71\n 'out_w': jax.random.normal(keys[7], (hidden_dim, vocab_size)) * scale,\n 'out_b': jnp.zeros(vocab_size),\n }\n return params\n\ndef encode(params, x):\n \"\"\"\u7f16\u7801\u5668\uff1a\u7ebf\u6027\u6295\u5f71\uff08\u5360\u4f4d\u7b26\uff0c\u4ee3\u8868\u5377\u79ef/LSTM \u5806\u53e0\uff09\u3002\"\"\"\n return jnp.tanh(x @ params['enc_w'] + params['enc_b'])\n\ndef attend(params, query, enc_out):\n \"\"\"\u5728\u7f16\u7801\u5668\u8f93\u51fa\u4e0a\u7684\u70b9\u79ef\u6ce8\u610f\u529b\u3002\"\"\"\n q = query @ params['attn_q'] # (hidden,)\n k = enc_out @ params['attn_k'] # (T_enc, hidden)\n v = enc_out @ params['attn_v'] # (T_enc, hidden)\n d_k = q.shape[-1]\n scores = (k @ q) / jnp.sqrt(d_k) # (T_enc,)\n weights = jax.nn.softmax(scores) # (T_enc,)\n context = weights @ v # (hidden,)\n return context, weights\n\ndef decode_step(params, h_prev, y_prev_onehot, enc_out):\n \"\"\"\u5355\u6b65\u89e3\u7801\uff1aRNN + \u6ce8\u610f\u529b\u3002\"\"\"\n # \u5d4c\u5165\u524d\u4e00\u4e2a\u6807\u8bb0\n y_emb = y_prev_onehot @ params['dec_wx'] # (hidden,)\n # \u6ce8\u610f\u529b\u5230\u7f16\u7801\u5668\n context, attn_w = attend(params, h_prev, enc_out)\n # RNN \u66f4\u65b0\n h = jnp.tanh(h_prev @ params['dec_wh'] + y_emb + context @ params['dec_wc']\n + params['dec_b'])\n # \u8f93\u51fa logits\n logits = h @ params['out_w'] + params['out_b']\n return h, logits, attn_w\n\n# --- \u8bbe\u7f6e ---\nkey = jax.random.PRNGKey(0)\ninput_dim = 40 # \u4f8b\u5982 40 \u4e2a\u6885\u5c14\u9891\u5e26\nhidden_dim = 64\nvocab_size = 10 # \u7528\u4e8e\u6f14\u793a\u7684\u5c0f\u8bcd\u6c47\u8868\nT_enc = 30 # \u7f16\u7801\u5668\u65f6\u95f4\u6b65\nT_dec = 8 # \u89e3\u7801\u5668\u6b65\u6570\n\nparams = init_params(key, input_dim, hidden_dim, vocab_size)\n\n# \u5408\u6210\u8f93\u5165\uff1a\u968f\u673a\u6885\u5c14\u7c7b\u7279\u5f81\nkey, subkey = jax.random.split(key)\nx = jax.random.normal(subkey, (T_enc, input_dim))\n\n# \u7f16\u7801\nenc_out = encode(params, x)\n\n# \u89e3\u7801\uff08\u4f7f\u7528\u968f\u673a\u76ee\u6807\u7684\u6559\u5e08\u5f3a\u5236\uff09\nkey, subkey = jax.random.split(key)\ntargets = jax.random.randint(subkey, (T_dec,), 0, vocab_size)\n\nh = jnp.zeros(hidden_dim)\nall_logits = []\nall_attn = []\n\nfor t in range(T_dec):\n y_prev = jax.nn.one_hot(targets[t] if t > 0 else 0, vocab_size)\n h, logits, attn_w = decode_step(params, h, y_prev, enc_out)\n all_logits.append(logits)\n all_attn.append(attn_w)\n\nall_attn = jnp.stack(all_attn) # (T_dec, T_enc)\nall_logits = jnp.stack(all_logits) # (T_dec, vocab_size)\n\n# --- \u53ef\u89c6\u5316\u6ce8\u610f\u529b\u6743\u91cd ---\nfig, axes = plt.subplots(1, 2, figsize=(14, 5))\n\nim = axes[0].imshow(all_attn, aspect='auto', cmap='Blues', origin='lower')\naxes[0].set_xlabel('\u7f16\u7801\u5668\u65f6\u95f4\u6b65')\naxes[0].set_ylabel('\u89e3\u7801\u5668\u6b65')\naxes[0].set_title('\u6ce8\u610f\u529b\u6743\u91cd\uff08\u89e3\u7801\u5668 -> \u7f16\u7801\u5668\uff09')\nplt.colorbar(im, ax=axes[0])\n\n# \u663e\u793a\u6bcf\u4e2a\u89e3\u7801\u6b65\u7684\u9884\u6d4b\u6807\u8bb0\u5206\u5e03\nim2 = axes[1].imshow(jax.nn.softmax(all_logits, axis=-1), aspect='auto',\n cmap='Oranges', origin='lower')\naxes[1].set_xlabel('\u8bcd\u6c47\u8868\u7d22\u5f15')\naxes[1].set_ylabel('\u89e3\u7801\u5668\u6b65')\naxes[1].set_title('\u8f93\u51fa\u6807\u8bb0\u6982\u7387')\nplt.colorbar(im2, ax=axes[1])\n\nplt.suptitle('\u6700\u5c0f\u5316\u7684\u57fa\u4e8e\u6ce8\u610f\u529b\u7684 ASR \u6a21\u578b\uff08\u672a\u8bad\u7ec3\uff09')\nplt.tight_layout(); plt.show()\n \u4f7f\u7528\u52a8\u6001\u89c4\u5212\uff08\u7f16\u8f91\u8ddd\u79bb\uff09\u4ece\u5934\u8ba1\u7b97\u8bcd\u9519\u8bef\u7387\uff08WER\uff09\uff0c\u5e76\u9488\u5bf9\u4e00\u4e2a\u53c2\u8003\u6587\u672c\u8bc4\u4f30\u591a\u4e2a\u5047\u8bbe\u3002\u53ef\u89c6\u5316\u7f16\u8f91\u8ddd\u79bb\u77e9\u9635\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\nimport numpy as np\n\ndef compute_wer(reference, hypothesis):\n \"\"\"\n \u4f7f\u7528\u52a8\u6001\u89c4\u5212\uff08\u8bcd\u7ea7\u522b\u7684 Levenshtein \u8ddd\u79bb\uff09\u8ba1\u7b97 WER\u3002\n \u8fd4\u56de WER\u3001\u66ff\u6362\u6570\u3001\u5220\u9664\u6570\u3001\u63d2\u5165\u6570\u548c DP \u77e9\u9635\u3002\n \"\"\"\n ref_words = reference.split()\n hyp_words = hypothesis.split()\n N = len(ref_words)\n M = len(hyp_words)\n\n # DP \u77e9\u9635\uff1ad[i][j] = ref[:i] \u548c hyp[:j] \u4e4b\u95f4\u7684\u7f16\u8f91\u8ddd\u79bb\n d = np.zeros((N + 1, M + 1), dtype=np.int32)\n # \u56de\u6eaf\u77e9\u9635\u7528\u4e8e\u7edf\u8ba1 S, D, I\n ops = np.zeros((N + 1, M + 1, 3), dtype=np.int32) # [sub, del, ins]\n\n for i in range(N + 1):\n d[i][0] = i # \u5168\u90e8\u5220\u9664\n for j in range(M + 1):\n d[0][j] = j # \u5168\u90e8\u63d2\u5165\n\n for i in range(1, N + 1):\n for j in range(1, M + 1):\n if ref_words[i - 1] == hyp_words[j - 1]:\n sub_cost = d[i - 1][j - 1] # \u5339\u914d\uff0c\u65e0\u9700\u7f16\u8f91\n else:\n sub_cost = d[i - 1][j - 1] + 1 # \u66ff\u6362\n del_cost = d[i - 1][j] + 1 # \u5220\u9664\n ins_cost = d[i][j - 1] + 1 # \u63d2\u5165\n\n d[i][j] = min(sub_cost, del_cost, ins_cost)\n\n # \u56de\u6eaf\u7edf\u8ba1\u64cd\u4f5c\u6b21\u6570\n i, j = N, M\n S, D, I = 0, 0, 0\n while i > 0 or j > 0:\n if i > 0 and j > 0 and d[i][j] == d[i-1][j-1] and ref_words[i-1] == hyp_words[j-1]:\n i -= 1; j -= 1 # \u6b63\u786e\n elif i > 0 and j > 0 and d[i][j] == d[i-1][j-1] + 1:\n S += 1; i -= 1; j -= 1 # \u66ff\u6362\n elif i > 0 and d[i][j] == d[i-1][j] + 1:\n D += 1; i -= 1 # \u5220\u9664\n elif j > 0 and d[i][j] == d[i][j-1] + 1:\n I += 1; j -= 1 # \u63d2\u5165\n else:\n break\n\n wer = (S + D + I) / N if N > 0 else 0.0\n return wer, S, D, I, d\n\n# --- \u6d4b\u8bd5\u7528\u4f8b ---\nreference = \"the cat sat on the mat\"\nhypotheses = [\n \"the cat sat on the mat\", # \u5b8c\u7f8e\n \"the cat sit on the mat\", # 1 \u6b21\u66ff\u6362\n \"the cat on the mat\", # 1 \u6b21\u5220\u9664\n \"the big cat sat on the mat\", # 1 \u6b21\u63d2\u5165\n \"a dog sat in a rug\", # \u591a\u5904\u9519\u8bef\n]\n\nprint(f\"\u53c2\u8003\u6587\u672c: '{reference}'\\n\")\nprint(f\"{'\u5047\u8bbe':<40s} {'WER':>6s} {'S':>3s} {'D':>3s} {'I':>3s}\")\nprint(\"-\" * 60)\nresults = []\nfor hyp in hypotheses:\n wer, S, D, I, dp = compute_wer(reference, hyp)\n results.append((hyp, wer, S, D, I, dp))\n print(f\"'{hyp}':<40s} {wer:>6.1%} {S:>3d} {D:>3d} {I:>3d}\")\n\n# \u53ef\u89c6\u5316\u6700\u5dee\u60c5\u51b5\u7684 DP \u77e9\u9635\nworst = results[-1]\nhyp_words = worst[0].split()\nref_words = reference.split()\ndp_matrix = worst[5]\n\nfig, axes = plt.subplots(1, 2, figsize=(14, 5))\n\n# DP \u77e9\u9635\nim = axes[0].imshow(dp_matrix, cmap='YlOrRd', origin='upper')\naxes[0].set_xticks(range(len(hyp_words) + 1))\naxes[0].set_xticklabels([''] + hyp_words, rotation=45, ha='right', fontsize=9)\naxes[0].set_yticks(range(len(ref_words) + 1))\naxes[0].set_yticklabels([''] + ref_words, fontsize=9)\naxes[0].set_xlabel('\u5047\u8bbe\u8bcd')\naxes[0].set_ylabel('\u53c2\u8003\u8bcd')\naxes[0].set_title(f'\u7f16\u8f91\u8ddd\u79bb\u77e9\u9635\\nWER = {worst[1]:.1%}')\nfor i in range(dp_matrix.shape[0]):\n for j in range(dp_matrix.shape[1]):\n axes[0].text(j, i, str(dp_matrix[i, j]), ha='center', va='center', fontsize=8)\nplt.colorbar(im, ax=axes[0])\n\n# WER \u6bd4\u8f83\u67f1\u72b6\u56fe\nnames = [f'Hyp {i+1}' for i in range(len(results))]\nwers = [r[1] * 100 for r in results]\ncolors = ['#27ae60' if w == 0 else '#f39c12' if w < 30 else '#e74c3c' for w in wers]\naxes[1].barh(names, wers, color=colors)\naxes[1].set_xlabel('WER (%)')\naxes[1].set_title('\u8bcd\u9519\u8bef\u7387\u6bd4\u8f83')\nfor i, (w, r) in enumerate(zip(wers, results)):\n axes[1].text(w + 1, i, f'{w:.0f}% (S={r[2]}, D={r[3]}, I={r[4]})',\n va='center', fontsize=9)\naxes[1].set_xlim(0, max(wers) * 1.4)\n\nplt.tight_layout(); plt.show()\n \u5728\u5bf9\u6570\u6885\u5c14\u9891\u8c31\u56fe\u4e0a\u5b9e\u73b0 SpecAugment\uff08\u9891\u7387\u63a9\u7801\u548c\u65f6\u95f4\u63a9\u7801\uff09\uff0c\u5e76\u53ef\u89c6\u5316\u539f\u59cb\u7248\u672c\u4e0e\u589e\u5f3a\u7248\u672c\u3002\u4ece\u5408\u6210\u4fe1\u53f7\u751f\u6210\u9891\u8c31\u56fe\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# --- \u751f\u6210\u5408\u6210\u5bf9\u6570\u6885\u5c14\u9891\u8c31\u56fe ---\nkey = jax.random.PRNGKey(42)\nfs = 16000\nduration = 2.0\nt = jnp.arange(0, duration, 1.0 / fs)\n\n# \u6a21\u62df\u8bed\u97f3\uff1a\u5e26\u8c10\u6ce2\u7684\u5541\u557e\u4fe1\u53f7\nf0 = 120.0\nx = sum(jnp.sin(2 * jnp.pi * f0 * k * t * (1 + 0.1 * t)) / k for k in range(1, 10))\nkey, subkey = jax.random.split(key)\nx = x + 0.05 * jax.random.normal(subkey, t.shape)\n\n# \u8ba1\u7b97\u5bf9\u6570\u6885\u5c14\u9891\u8c31\u56fe\uff08\u7b80\u5316\u7248\uff09\nframe_len = 400 # 25 ms\nhop_len = 160 # 10 ms\nn_fft = 512\nn_mels = 80\n\nn_frames = (len(x) - frame_len) // hop_len + 1\nhamming = 0.54 - 0.46 * jnp.cos(2 * jnp.pi * jnp.arange(frame_len) / (frame_len - 1))\n\nframes = jnp.stack([x[i * hop_len : i * hop_len + frame_len] for i in range(n_frames)])\nwindowed = frames * hamming\nspectra = jnp.abs(jnp.fft.rfft(windowed, n=n_fft)) ** 2\n\n# \u7b80\u5355\u7684\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\ndef hz_to_mel(f): return 2595 * jnp.log10(1 + f / 700)\ndef mel_to_hz(m): return 700 * (10 ** (m / 2595) - 1)\n\nmel_points = jnp.linspace(hz_to_mel(0), hz_to_mel(fs / 2), n_mels + 2)\nhz_pts = mel_to_hz(mel_points)\nbins = jnp.floor((n_fft + 1) * hz_pts / fs).astype(jnp.int32)\n\nn_freqs = n_fft // 2 + 1\nfb = jnp.zeros((n_mels, n_freqs))\nfor m in range(n_mels):\n lo, mid, hi = int(bins[m]), int(bins[m+1]), int(bins[m+2])\n for k in range(lo, mid):\n if mid != lo:\n fb = fb.at[m, k].set((k - lo) / (mid - lo))\n for k in range(mid, hi):\n if hi != mid:\n fb = fb.at[m, k].set((hi - k) / (hi - mid))\n\nlog_mel = jnp.log(spectra @ fb.T + 1e-10)\n\n# --- SpecAugment ---\ndef spec_augment(spec, key, n_freq_masks=2, freq_mask_width=15,\n n_time_masks=2, time_mask_width=25):\n \"\"\"\u5e94\u7528 SpecAugment\uff1a\u9891\u7387\u63a9\u7801\u548c\u65f6\u95f4\u63a9\u7801\u3002\"\"\"\n augmented = spec.copy()\n T, F = spec.shape\n\n # \u9891\u7387\u63a9\u7801\n for _ in range(n_freq_masks):\n key, k1, k2 = jax.random.split(key, 3)\n f_width = jax.random.randint(k1, (), 1, freq_mask_width + 1)\n f_start = jax.random.randint(k2, (), 0, max(1, F - freq_mask_width))\n mask = (jnp.arange(F) >= f_start) & (jnp.arange(F) < f_start + f_width)\n augmented = jnp.where(mask[None, :], 0.0, augmented)\n\n # \u65f6\u95f4\u63a9\u7801\n for _ in range(n_time_masks):\n key, k1, k2 = jax.random.split(key, 3)\n t_width = jax.random.randint(k1, (), 1, time_mask_width + 1)\n t_start = jax.random.randint(k2, (), 0, max(1, T - time_mask_width))\n mask = (jnp.arange(T) >= t_start) & (jnp.arange(T) < t_start + t_width)\n augmented = jnp.where(mask[:, None], 0.0, augmented)\n\n return augmented\n\nkey, subkey = jax.random.split(key)\nlog_mel_aug = spec_augment(log_mel, subkey)\n\n# --- \u53ef\u89c6\u5316 ---\nfig, axes = plt.subplots(2, 1, figsize=(14, 8))\n\nim0 = axes[0].imshow(log_mel.T, aspect='auto', origin='lower', cmap='inferno',\n extent=[0, duration, 0, n_mels])\naxes[0].set_title('\u539f\u59cb\u5bf9\u6570\u6885\u5c14\u9891\u8c31\u56fe')\naxes[0].set_xlabel('\u65f6\u95f4 (s)'); axes[0].set_ylabel('\u6885\u5c14\u9891\u5e26')\nplt.colorbar(im0, ax=axes[0], label='\u5bf9\u6570\u80fd\u91cf')\n\nim1 = axes[1].imshow(log_mel_aug.T, aspect='auto', origin='lower', cmap='inferno',\n extent=[0, duration, 0, n_mels])\naxes[1].set_title('SpecAugment \u540e\uff08\u9891\u7387 + \u65f6\u95f4\u63a9\u7801\uff09')\naxes[1].set_xlabel('\u65f6\u95f4 (s)'); axes[1].set_ylabel('\u6885\u5c14\u9891\u5e26')\nplt.colorbar(im1, ax=axes[1], label='\u5bf9\u6570\u80fd\u91cf')\n\nplt.tight_layout(); plt.show()\n \u8bed\u97f3\u5408\u6210\uff08Text-to-Speech Synthesis\uff09\u9006\u5411\u6267\u884c ASR \u6d41\u6c34\u7ebf\uff0c\u4ece\u4e66\u9762\u6587\u672c\u751f\u6210\u81ea\u7136\u542c\u611f\u7684\u97f3\u9891\u3002\u672c\u6587\u6db5\u76d6 TTS \u6d41\u6c34\u7ebf\uff08\u6587\u672c\u89c4\u8303\u5316\u3001G2P\u3001\u58f0\u5b66\u6a21\u578b\u3001\u58f0\u7801\u5668\uff09\u3001Tacotron\u3001WaveNet\u3001HiFi-GAN\u3001\u58f0\u97f3\u514b\u9686\u3001\u58f0\u97f3\u8f6c\u6362\u4ee5\u53ca\u8bed\u97f3\u6d3b\u52a8\u68c0\u6d4b\uff08VAD\uff09\u3002
\u5728\u6587\u4ef6 01 \u4e2d\uff0c\u6211\u4eec\u6784\u5efa\u4e86\u4fe1\u53f7\u5904\u7406\u5de5\u5177\u5305\uff1a\u6ce2\u5f62\u3001\u8bed\u8c31\u56fe\u3001\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\u548c MFCC\u3002\u5728\u6587\u4ef6 02 \u4e2d\uff0c\u6211\u4eec\u5c06\u8bed\u97f3\u8f6c\u6362\u4e3a\u6587\u672c\u3002\u73b0\u5728\u6211\u4eec\u53cd\u65b9\u5411\u64cd\u4f5c\uff1a\u7ed9\u5b9a\u6587\u672c\uff0c\u5408\u6210\u81ea\u7136\u542c\u611f\u7684\u8bed\u97f3\u3002\u8fd9\u5c31\u662f\u8bed\u97f3\u5408\u6210\uff08TTS\uff09\uff0c\u4e00\u4e2a\u540c\u6837\u901a\u5411\u58f0\u97f3\u8f6c\u6362\u3001\u58f0\u97f3\u514b\u9686\u548c\u8bed\u97f3\u6d3b\u52a8\u68c0\u6d4b\u7684\u95ee\u9898\u3002
\u5c06 TTS \u60f3\u8c61\u6210\u4e00\u573a\u821e\u53f0\u8868\u6f14\u3002\u5267\u672c\u5c31\u662f\u6587\u672c\u8f93\u5165\u3002\u5bfc\u6f14\uff08\u58f0\u5b66\u6a21\u578b\uff09\u51b3\u5b9a\u6bcf\u53e5\u53f0\u8bcd\u5e94\u8be5\u5982\u4f55\u53d1\u97f3\u2014\u2014\u97f3\u9ad8\u3001\u65f6\u957f\u3001\u91cd\u97f3\u3002\u7ba1\u5f26\u4e50\u961f\uff08\u58f0\u7801\u5668\uff09\u968f\u540e\u6f14\u594f\u4e50\u8c31\uff0c\u4ea7\u751f\u542c\u4f17\u5b9e\u9645\u542c\u5230\u7684\u58f0\u6ce2\u3002\u73b0\u4ee3\u795e\u7ecf TTS \u7528\u5ab2\u7f8e\u4eba\u7c7b\u8bf4\u8bdd\u8005\u7684\u6f14\u7ece\uff0c\u53d6\u4ee3\u4e86\u57fa\u4e8e\u89c4\u5219\u7cfb\u7edf\u90a3\u79cd\u50f5\u786c\u3001\u673a\u68b0\u7684\u53d1\u97f3\u3002
\u8bed\u97f3\u5408\u6210\u6d41\u6c34\u7ebf \u6807\u51c6 TTS \u6d41\u6c34\u7ebf\u5305\u542b\u56db\u4e2a\u9636\u6bb5\uff1a(1) \u6587\u672c\u89c4\u8303\u5316\uff0c(2) \u97f3\u7d20\u8f6c\u6362\uff0c(3) \u58f0\u5b66\u6a21\u578b\uff0c(4) \u58f0\u7801\u5668\u3002\u4e00\u4e9b\u73b0\u4ee3\u7cfb\u7edf\u5c06\u9636\u6bb5 3 \u548c 4 \u5408\u5e76\u4e3a\u4e00\u4e2a\u7aef\u5230\u7aef\u6a21\u578b\uff0c\u4f46\u8fd9\u79cd\u6982\u5ff5\u5206\u89e3\u4ecd\u7136\u6709\u7528\u3002
\u6587\u672c\u89c4\u8303\u5316 \u5c06\u539f\u59cb\u6587\u672c\u8f6c\u6362\u4e3a\u53ef\u53d1\u97f3\u7684\u5f62\u5f0f\u3002\u7f29\u5199\u5c55\u5f00\uff08\"Dr.\"\u53d8\u4e3a\"Doctor\"\uff09\u3001\u6570\u5b57\u53d8\u4e3a\u8bcd\u8bed\uff08\"1984\"\u53d8\u4e3a\"nineteen eighty-four\"\uff09\u3001\u8d27\u5e01\u7b26\u53f7\u88ab\u53e3\u5934\u53d1\u97f3\uff08\"$5\"\u53d8\u4e3a\"five dollars\"\uff09\uff0c\u4ee5\u53ca\u5904\u7406 URL \u6216\u7279\u6b8a\u5b57\u7b26\u3002\u8fd9\u4e00\u9636\u6bb5\u901a\u5e38\u57fa\u4e8e\u89c4\u5219\u548c\u8bed\u8a00\u7279\u5b9a\u6587\u6cd5\uff0c\u4e0d\u8fc7\u4e5f\u5b58\u5728\u795e\u7ecf\u89c4\u8303\u5316\u6a21\u578b\u3002\u6b64\u5904\u7684\u9519\u8bef\u4f1a\u4f20\u64ad\u5230\u6240\u6709\u4e0b\u6e38\u9636\u6bb5\uff1a\u5982\u679c\"St.\"\u88ab\u8bfb\u4f5c\"saint\"\u800c\u4e0d\u662f\"street\"\uff0c\u6574\u4e2a\u53d1\u97f3\u5c31\u9519\u4e86\u3002
\u5b57\u7d20\u5230\u97f3\u7d20\uff08G2P\uff09\u8f6c\u6362 \u5c06\u89c4\u8303\u5316\u6587\u672c\u6620\u5c04\u4e3a\u97f3\u7d20\u5e8f\u5217\u3002\u82f1\u8bed\u5c24\u5176\u4e0d\u89c4\u5219\uff08\"though\"\u3001\"through\"\u3001\"tough\"\u4e2d\u7684\"ough\"\u53d1\u97f3\u5404\u4e0d\u76f8\u540c\uff09\uff0c\u56e0\u6b64\u8bcd\u5178\u67e5\u627e\uff08CMU \u53d1\u97f3\u8bcd\u5178\uff09\u5904\u7406\u5e38\u89c1\u8bcd\u8bed\uff0c\u800c\u795e\u7ecf\u5e8f\u5217\u5230\u5e8f\u5217\u6a21\u578b\uff08\u7b2c 06 \u7ae0\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6216\u7b2c 07 \u7ae0\u7684 Transformer\uff09\u5904\u7406\u8bcd\u6c47\u8868\u5916\u7684\u8bcd\u8bed\u3002\u6d45\u5c42\u6b63\u5b57\u6cd5\u8bed\u8a00\uff08\u897f\u73ed\u7259\u8bed\u3001\u82ac\u5170\u8bed\uff09\u9700\u8981\u66f4\u7b80\u5355\u7684 G2P\u3002\u8f93\u51fa\u901a\u5e38\u662f IPA\uff08\u56fd\u9645\u97f3\u6807\uff09\u5e8f\u5217\u6216\u7b49\u6548\u7684\u5185\u90e8\u97f3\u7d20\u96c6\u5408\u3002
\u58f0\u5b66\u6a21\u578b \u63a5\u6536\u97f3\u7d20\u5e8f\u5217\u5e76\u4ea7\u751f\u4e2d\u95f4\u58f0\u5b66\u8868\u793a\uff0c\u51e0\u4e4e\u603b\u662f\u6885\u5c14\u8bed\u8c31\u56fe\uff08\u6587\u4ef6 01\uff09\u3002\u6885\u5c14\u8bed\u8c31\u56fe\u6355\u83b7\u6bcf\u4e2a\u65f6\u95f4\u5e27\u7684\u9891\u8c31\u5305\u7edc\uff0c\u7f16\u7801\u4e86\u58f0\u7801\u5668\u91cd\u6784\u6ce2\u5f62\u6240\u9700\u7684\u611f\u77e5\u76f8\u5173\u4fe1\u606f\u3002\u58f0\u5b66\u6a21\u578b\u5fc5\u987b\u51b3\u5b9a\u65f6\u957f\uff08\u6bcf\u4e2a\u97f3\u7d20\u6301\u7eed\u591a\u4e45\uff09\u3001\u97f3\u9ad8\uff08\u57fa\u9891 \\(F_0\\)\uff09\u548c\u80fd\u91cf\uff08\u54cd\u5ea6\uff09\u3002
\u58f0\u7801\u5668 \u63a5\u6536\u6885\u5c14\u8bed\u8c31\u56fe\u5e76\u4ea7\u751f\u539f\u59cb\u97f3\u9891\u6ce2\u5f62\u3002\u8fd9\u662f\u4e00\u4e2a\u4e0d\u9002\u5b9a\u7684\u53cd\u6f14\u95ee\u9898\uff1a\u7531\u4e8e\u76f8\u4f4d\u4fe1\u606f\u5df2\u88ab\u4e22\u5f03\uff0c\u8bb8\u591a\u6ce2\u5f62\u53ef\u4ee5\u4ea7\u751f\u76f8\u540c\u7684\u8bed\u8c31\u56fe\u3002\u7ecf\u5178\u58f0\u7801\u5668\uff08Griffin-Lim\u3001WORLD\uff09\u4f7f\u7528\u8fed\u4ee3\u6216\u4fe1\u53f7\u6a21\u578b\u65b9\u6cd5\uff0c\u4f46\u795e\u7ecf\u58f0\u7801\u5668\u73b0\u5728\u5728\u8d28\u91cf\u4e0a\u5360\u4e3b\u5bfc\u5730\u4f4d\u3002
\u58f0\u7801\u5668\uff1aWaveNet\uff08van den Oord \u7b49\u4eba\uff0c2016\uff09\u662f\u7b2c\u4e00\u4e2a\u751f\u6210\u51e0\u4e4e\u4e0e\u4eba\u7c7b\u5f55\u97f3\u65e0\u6cd5\u533a\u5206\u7684\u8bed\u97f3\u7684\u795e\u7ecf\u58f0\u7801\u5668\u3002\u5b83\u81ea\u56de\u5f52\u5730\u5bf9\u6ce2\u5f62\u5efa\u6a21\uff0c\u9884\u6d4b\u6bcf\u4e2a\u6837\u672c \\(x_t\\) \u7684\u6761\u4ef6\u6982\u7387\u4f9d\u8d56\u4e8e\u6240\u6709\u5148\u524d\u6837\u672c\uff1a
\u5176\u4e2d \\(c\\) \u662f\u6761\u4ef6\u4fe1\u53f7\uff08\u6885\u5c14\u8bed\u8c31\u56fe\uff09\u3002\u6bcf\u4e2a\u6837\u672c\u662f 16 \u4f4d\uff0c\u56e0\u6b64\u5bf9 65536 \u4e2a\u503c\u8fdb\u884c\u6734\u7d20 softmax \u662f\u4e0d\u5207\u5b9e\u9645\u7684\u3002WaveNet \u4f7f\u7528 \u03bc-law \u538b\u6269 \u51cf\u5c11\u5230 256 \u4e2a\u91cf\u5316\u7ea7\u522b\uff0c\u6216\u8005\u540e\u6765\u7684\u53d8\u4f53\u4f7f\u7528 logistics \u6df7\u5408\u5206\u5e03\u3002
WaveNet \u7684\u6838\u5fc3\u6784\u5efa\u6a21\u5757\u662f\u6269\u5f20\u56e0\u679c\u5377\u79ef\u3002\u56e0\u679c\u610f\u5473\u7740\u6ee4\u6ce2\u5668\u6743\u91cd\u53ea\u770b\u8fc7\u53bb\u6837\u672c\uff08\u65e0\u672a\u6765\u6cc4\u9732\uff09\u3002\u6269\u5f20\u610f\u5473\u7740\u6ee4\u6ce2\u5668\u4ee5\u6307\u6570\u589e\u957f\u7684\u95f4\u9694\u8df3\u8fc7\u6837\u672c\uff1a\u6269\u5f20\u56e0\u5b50 \\(1, 2, 4, 8, \\ldots, 512\\)\u3002\u8fd9\u63d0\u4f9b\u4e86\u6307\u6570\u7ea7\u5927\u7684\u611f\u53d7\u91ce\uff0c\u540c\u65f6\u4fdd\u6301\u53c2\u6570\u91cf\u7ebf\u6027\u589e\u957f\u3002
\u6bcf\u5c42\u7684\u95e8\u63a7\u6fc0\u6d3b\u51fd\u6570\u4e3a\uff1a
\u5176\u4e2d \\(W_f\\) \u548c \\(W_g\\) \u662f\u6ee4\u6ce2\u5668\u548c\u95e8\u63a7\u5377\u79ef\u6743\u91cd\uff0c\\(\\ast\\) \u8868\u793a\u6269\u5f20\u56e0\u679c\u5377\u79ef\uff0c\\(\\odot\\) \u662f\u9010\u5143\u7d20\u4e58\u6cd5\u3002\u8fd9\u79cd\u95e8\u63a7\u673a\u5236\uff08\u6765\u81ea\u7b2c 06 \u7ae0\u7684 LSTM\uff09\u5141\u8bb8\u7f51\u7edc\u63a7\u5236\u4fe1\u606f\u6d41\u3002
WaveNet \u4ea7\u751f\u5353\u8d8a\u7684\u8d28\u91cf\uff0c\u4f46\u63a8\u7406\u901f\u5ea6\u6781\u6162\uff1a\u751f\u6210\u4e00\u79d2 24 kHz \u97f3\u9891\u9700\u8981 24000 \u6b21\u987a\u5e8f\u524d\u5411\u4f20\u64ad\u3002\u8fd9\u63a8\u52a8\u4e86\u6240\u6709\u540e\u7eed\u58f0\u7801\u5668\u7814\u7a76\u3002
WaveRNN\uff08Kalchbrenner \u7b49\u4eba\uff0c2018\uff09\u7528\u5355\u5c42\u5faa\u73af\u7f51\u7edc\u53d6\u4ee3\u4e86 WaveNet \u7684\u6df1\u5c42\u5377\u79ef\u5806\u53e0\u3002\u5b83\u5c06\u6bcf\u4e2a 16 \u4f4d\u6837\u672c\u62c6\u5206\u4e3a\u7c97\uff08\u9ad8 8 \u4f4d\uff09\u548c\u7ec6\uff08\u4f4e 8 \u4f4d\uff09\u5206\u91cf\uff0c\u4f7f\u7528 GRU\uff08\u7b2c 06 \u7ae0\uff09\u9884\u6d4b\u6bcf\u4e2a\u5206\u91cf\u3002\u8fd9\u79cd\u53cc softmax \u65b9\u6cd5\u663e\u8457\u51cf\u5c11\u4e86\u8ba1\u7b97\u91cf\uff0c\u540c\u65f6\u4fdd\u6301\u4e86\u9ad8\u8d28\u91cf\u3002\u7ecf\u8fc7\u7cbe\u5fc3\u5185\u6838\u4f18\u5316\u540e\uff0cWaveRNN \u5728\u79fb\u52a8 CPU \u4e0a\u8db3\u4ee5\u5b9e\u73b0\u5b9e\u65f6\u8fd0\u884c\u3002
WaveGlow\uff08Prenger \u7b49\u4eba\uff0c2019\uff09\u662f\u4e00\u79cd\u57fa\u4e8e\u6d41\u7684\u58f0\u7801\u5668\uff0c\u5b8c\u5168\u907f\u514d\u4e86\u81ea\u56de\u5f52\u751f\u6210\u3002\u5b83\u4f7f\u7528\u4e00\u7cfb\u5217\u53ef\u9006\u53d8\u6362\uff08\u4eff\u5c04\u8026\u5408\u5c42\uff0c\u7b2c 06 \u7ae0\u7684\u6b63\u5219\u5316\u6d41\uff09\u5c06\u7b80\u5355\u9ad8\u65af\u5206\u5e03\u6620\u5c04\u5230\u6ce2\u5f62\u5206\u5e03\u3002\u8bad\u7ec3\u4f7f\u7528\u53d8\u91cf\u53d8\u6362\u516c\u5f0f\u6700\u5927\u5316\u7cbe\u786e\u5bf9\u6570\u4f3c\u7136\uff1a
\u5176\u4e2d \\(z = f(x)\\) \u662f\u901a\u8fc7\u5c06 \\(x\\) \u4f20\u9012\u7ecf\u6d41\u5f97\u5230\u7684\u6f5c\u5728\u53d8\u91cf\u3002\u63a8\u7406\u65f6\uff0c\u62bd\u53d6\u6837\u672c \\(z \\sim \\mathcal{N}(0, I)\\) \u5e76\u901a\u8fc7\u9006\u6d41\u4ee5\u5355\u6b21\u5e76\u884c\u524d\u5411\u4f20\u64ad\u63a8\u51fa\u3002WaveGlow \u7528\u6a21\u578b\u5927\u5c0f\uff08\u8026\u5408\u5c42\u7684\u5927\u7f51\u7edc\uff09\u6362\u53d6\u751f\u6210\u901f\u5ea6\u3002
HiFi-GAN\uff08Kong \u7b49\u4eba\uff0c2020\uff09\u4f7f\u7528\u751f\u6210\u5bf9\u6297\u7f51\u7edc\u4ece\u6885\u5c14\u8bed\u8c31\u56fe\u5408\u6210\u6ce2\u5f62\u3002\u751f\u6210\u5668\u901a\u8fc7\u4e00\u7cfb\u5217\u8f6c\u7f6e\u5377\u79ef\u5bf9\u6885\u5c14\u8bed\u8c31\u56fe\u8fdb\u884c\u4e0a\u91c7\u6837\uff0c\u6bcf\u4e2a\u5377\u79ef\u540e\u8ddf\u4e00\u4e2a\u591a\u611f\u53d7\u91ce\u878d\u5408\uff08MRF\uff09\u6a21\u5757\u3002MRF \u6a21\u5757\u5e76\u884c\u5e94\u7528\u591a\u4e2a\u5177\u6709\u4e0d\u540c\u6838\u5927\u5c0f\u548c\u6269\u5f20\u7387\u7684\u6b8b\u5dee\u5757\uff0c\u7136\u540e\u5c06\u5b83\u4eec\u7684\u8f93\u51fa\u6c42\u548c\u3002\u8fd9\u4f7f\u5f97\u751f\u6210\u5668\u80fd\u591f\u540c\u65f6\u6355\u83b7\u591a\u4e2a\u65f6\u95f4\u5c3a\u5ea6\u7684\u6a21\u5f0f\u3002
HiFi-GAN \u4f7f\u7528\u4e24\u79cd\u9274\u522b\u5668\u7c7b\u578b\u3002\u591a\u5468\u671f\u9274\u522b\u5668\uff08MPD\uff09\u901a\u8fc7\u4ee5\u4e0d\u540c\u5468\u671f\uff082\u30013\u30015\u30017\u300111\uff09\u6298\u53e0\u4e00\u7ef4\u6ce2\u5f62\uff0c\u5c06\u5176\u91cd\u5851\u4e3a\u4e8c\u7ef4\uff0c\u7136\u540e\u5e94\u7528\u4e8c\u7ef4\u5377\u79ef\u3002\u8fd9\u6355\u83b7\u4e86\u4e0d\u540c\u57fa\u9891\u4e0b\u7684\u5468\u671f\u7ed3\u6784\u3002\u591a\u5c3a\u5ea6\u9274\u522b\u5668\uff08MSD\uff09\u5728\u539f\u59cb\u6ce2\u5f62\u30012 \u500d\u964d\u91c7\u6837\u548c 4 \u500d\u964d\u91c7\u6837\u7248\u672c\u4e0a\u64cd\u4f5c\uff0c\u6355\u83b7\u4e0d\u540c\u65f6\u95f4\u5206\u8fa8\u7387\u4e0b\u7684\u6a21\u5f0f\u3002
\u8bad\u7ec3\u76ee\u6807\u7ed3\u5408\u4e86\u5bf9\u6297\u635f\u5931\u3001\u6885\u5c14\u8bed\u8c31\u56fe\u91cd\u6784\u635f\u5931\uff08\u5408\u6210\u97f3\u9891\u4e0e\u771f\u5b9e\u97f3\u9891\u7684\u6885\u5c14\u8bed\u8c31\u56fe\u4e4b\u95f4\u7684 L1 \u8ddd\u79bb\uff09\u548c\u7279\u5f81\u5339\u914d\u635f\u5931\uff08\u4e2d\u95f4\u9274\u522b\u5668\u7279\u5f81\u4e4b\u95f4\u7684 L1 \u8ddd\u79bb\uff09\uff1a
HiFi-GAN \u5b9e\u73b0\u4e86\u4e0e WaveNet \u76f8\u5f53\u7684\u5408\u6210\u8d28\u91cf\uff0c\u540c\u65f6\u901f\u5ea6\u63d0\u5347\u8d85\u8fc7 1000 \u500d\uff0c\u53ef\u5728\u5355\u4e2a GPU \u4e0a\u5b9e\u73b0\u5b9e\u65f6\u751f\u6210\u3002
\u795e\u7ecf\u6e90-\u6ee4\u6ce2\u5668\uff08NSF\uff09\u6a21\u578b\u5c06\u4f20\u7edf\u4fe1\u53f7\u5904\u7406\u4e0e\u795e\u7ecf\u7f51\u7edc\u76f8\u7ed3\u5408\u3002\u5728\u7ecf\u5178\u6e90-\u6ee4\u6ce2\u5668\u6a21\u578b\u4e2d\uff0c\u6d4a\u97f3\u7531\u58f0\u6e90\u6fc0\u52b1\uff08\u57fa\u9891 \\(F_0\\) \u5904\u7684\u5468\u671f\u8109\u51b2\u5e8f\u5217\uff09\u901a\u8fc7\u58f0\u9053\u6ee4\u6ce2\u5668\uff08\u9891\u8c31\u5305\u7edc\uff09\u4ea7\u751f\u3002NSF \u6a21\u578b\u7528\u795e\u7ecf\u7f51\u7edc\u66ff\u4ee3\u624b\u5de5\u8bbe\u8ba1\u7684\u6ee4\u6ce2\u5668\uff0c\u540c\u65f6\u4fdd\u7559\u663e\u5f0f\u6e90\u4fe1\u53f7\u3002\u8f93\u5165\u7684 \\(F_0\\) \u8f6e\u5ed3\u63d0\u4f9b\u4e86\u7eaf\u6570\u636e\u9a71\u52a8\u58f0\u7801\u5668\u6709\u65f6\u96be\u4ee5\u5904\u7406\u7684\u7cbe\u7ec6\u97f3\u9ad8\u63a7\u5236\u3002
\u58f0\u5b66\u6a21\u578b\uff1aTacotron\uff08Wang \u7b49\u4eba\uff0c2017\uff09\u662f\u7b2c\u4e00\u4e2a\u76f4\u63a5\u5c06\u5b57\u7b26\u5e8f\u5217\u8f6c\u6362\u4e3a\u6885\u5c14\u8bed\u8c31\u56fe\u7684\u7aef\u5230\u7aef\u795e\u7ecf TTS \u7cfb\u7edf\u3002\u5b83\u4f7f\u7528\u5e26\u6ce8\u610f\u529b\u673a\u5236\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u67b6\u6784\uff08\u7b2c 07 \u7ae0\uff09\u3002\u7f16\u7801\u5668\u4f7f\u7528\u5377\u79ef\u5e93\u3001\u9ad8\u901f\u7f51\u7edc\u548c\u53cc\u5411 GRU \u5904\u7406\u5b57\u7b26/\u97f3\u7d20\u5e8f\u5217\u3002\u89e3\u7801\u5668\u662f\u4e00\u4e2a\u81ea\u56de\u5f52 GRU\uff0c\u9010\u4e2a\u9884\u6d4b\u6885\u5c14\u5e27\uff0c\u4f7f\u7528\u524d\u4e00\u5e27\u548c\u6ce8\u610f\u529b\u4e0a\u4e0b\u6587\u4f5c\u4e3a\u8f93\u5165\u3002
Tacotron 2\uff08Shen \u7b49\u4eba\uff0c2018\uff09\u663e\u8457\u6539\u8fdb\u4e86\u67b6\u6784\u3002\u7f16\u7801\u5668\u662f\u4e00\u4e2a 3 \u5c42\u4e00\u7ef4\u5377\u79ef\u5806\u53e0\u540e\u8ddf\u53cc\u5411 LSTM\uff08\u7b2c 06 \u7ae0\uff09\u3002\u89e3\u7801\u5668\u662f\u4e00\u4e2a 2 \u5c42 LSTM\uff0c\u5e26\u4f4d\u7f6e\u654f\u611f\u6ce8\u610f\u529b\uff0c\u8be5\u6ce8\u610f\u529b\u673a\u5236\u4e0d\u4ec5\u57fa\u4e8e\u7f16\u7801\u5668\u8f93\u51fa\u548c\u89e3\u7801\u5668\u72b6\u6001\uff0c\u8fd8\u57fa\u4e8e\u5148\u524d\u6b65\u9aa4\u7d2f\u79ef\u7684\u6ce8\u610f\u529b\u6743\u91cd\u6765\u6761\u4ef6\u5316\u3002\u8fd9\u9632\u6b62\u4e86\u6ce8\u610f\u529b\u8df3\u8fc7\u6216\u91cd\u590d\u8bcd\u8bed\u7684\u5e38\u89c1\u5931\u8d25\u6a21\u5f0f\u3002
\u5176\u4e2d \\(s_{i-1}\\) \u662f\u524d\u4e00\u4e2a\u89e3\u7801\u5668\u72b6\u6001\uff0c\\(h_j\\) \u662f\u4f4d\u7f6e \\(j\\) \u5904\u7684\u7f16\u7801\u5668\u8f93\u51fa\uff0c\\(f_{i,j}\\) \u662f\u901a\u8fc7\u5c06\u7d2f\u79ef\u6ce8\u610f\u529b\u6743\u91cd \\(\\sum_{k<i} \\alpha_{k,j}\\) \u4e0e\u4e00\u7ef4\u5377\u79ef\u6ee4\u6ce2\u5668\u5377\u79ef\u5f97\u5230\u7684\u4f4d\u7f6e\u7279\u5f81\u3002\u6ce8\u610f\u529b\u6743\u91cd\u4e3a \\(\\alpha_{i,j} = \\text{softmax}(e_{i,j})\\)\u3002
Tacotron 2 \u7684\u89e3\u7801\u5668\u8fd8\u5728\u6bcf\u4e2a\u6b65\u9aa4\u9884\u6d4b\u4e00\u4e2a\u505c\u6b62\u6807\u8bb0\u6982\u7387\uff0c\u6307\u793a\u6885\u5c14\u8bed\u8c31\u56fe\u4f55\u65f6\u5b8c\u6210\u3002\u8f93\u51fa\u7684\u6885\u5c14\u8bed\u8c31\u56fe\u968f\u540e\u4f20\u9012\u7ed9\u58f0\u7801\u5668\uff08\u6700\u521d\u662f WaveNet\uff0c\u540e\u6765\u88ab HiFi-GAN \u6216\u7c7b\u4f3c\u6a21\u578b\u53d6\u4ee3\uff09\u3002
Tacotron 2 \u7684\u81ea\u56de\u5f52\u7279\u6027\u610f\u5473\u7740\u5408\u6210\u901f\u5ea6\u53d7\u9650\u4e8e\u6885\u5c14\u5e27\u7684\u6570\u91cf\u3002\u5bf9\u4e8e\u5178\u578b\u7684\u6bcf\u79d2 80 \u5e27\u7684\u6885\u5c14\u8bed\u8c31\u56fe\uff0c\u4e00\u4e2a 5 \u79d2\u7684\u53d1\u97f3\u9700\u8981 400 \u4e2a\u987a\u5e8f\u89e3\u7801\u6b65\u9aa4\u3002
FastSpeech\uff08Ren \u7b49\u4eba\uff0c2019\uff09\u4f7f\u7528\u975e\u81ea\u56de\u5f52\u58f0\u5b66\u6a21\u578b\u89e3\u51b3\u4e86\u901f\u5ea6\u95ee\u9898\u3002FastSpeech \u4e0d\u662f\u987a\u5e8f\u751f\u6210\u6885\u5c14\u5e27\uff0c\u800c\u662f\u5e76\u884c\u751f\u6210\u6240\u6709\u5e27\u3002\u5173\u952e\u6311\u6218\u5728\u4e8e\u786e\u5b9a\u6bcf\u4e2a\u97f3\u7d20\u5e94\u8be5\u4ea7\u751f\u591a\u5c11\u6885\u5c14\u5e27\uff0cFastSpeech \u901a\u8fc7\u65f6\u957f\u9884\u6d4b\u5668\u6765\u5904\u7406\u3002
\u65f6\u957f\u9884\u6d4b\u5668\u662f\u4e00\u4e2a\u5c0f\u578b\u5377\u79ef\u7f51\u7edc\uff0c\u9884\u6d4b\u6bcf\u4e2a\u97f3\u7d20\u7684\u6574\u6570\u65f6\u957f\uff08\u6885\u5c14\u5e27\u6570\uff09\u3002\u8bad\u7ec3\u671f\u95f4\uff0c\u771f\u5b9e\u65f6\u957f\u4f7f\u7528\u5176\u6ce8\u610f\u529b\u5bf9\u9f50\u4ece\u9884\u8bad\u7ec3\u7684\u81ea\u56de\u5f52\u6559\u5e08\u6a21\u578b\uff08Tacotron 2\uff09\u4e2d\u63d0\u53d6\u3002\u63a8\u7406\u671f\u95f4\uff0c\u4f7f\u7528\u9884\u6d4b\u65f6\u957f\u901a\u8fc7\u957f\u5ea6\u8c03\u8282\u5668\u5c06\u97f3\u7d20\u7ea7\u9690\u85cf\u5e8f\u5217\u6269\u5c55\u5230\u5e27\u7ea7\uff0c\u8be5\u8c03\u8282\u5668\u7b80\u5355\u5730\u5c06\u6bcf\u4e2a\u97f3\u7d20\u7684\u9690\u85cf\u8868\u793a\u91cd\u590d\u9884\u6d4b\u7684\u5e27\u6570\u3002
FastSpeech 2\uff08Ren \u7b49\u4eba\uff0c2021\uff09\u901a\u8fc7\u79fb\u9664\u6559\u5e08-\u5b66\u751f\u84b8\u998f\u6539\u8fdb\u4e86 FastSpeech\u3002\u5b83\u76f4\u63a5\u4f7f\u7528\u5f3a\u5236\u5bf9\u9f50\uff08\u6765\u81ea\u6587\u4ef6 02 \u7684\u58f0\u5b66\u6a21\u578b\u6846\u67b6\uff09\u63d0\u53d6\u771f\u5b9e\u65f6\u957f\uff0c\u5e76\u5728\u65f6\u957f\u4e4b\u5916\u6dfb\u52a0\u4e86\u663e\u5f0f\u7684\u97f3\u9ad8\uff08\\(F_0\\)\uff09\u548c\u80fd\u91cf\u65b9\u5dee\u9002\u914d\u5668\u3002\u6bcf\u4e2a\u9002\u914d\u5668\u662f\u4e00\u4e2a\u5c0f\u578b\u5377\u79ef\u9884\u6d4b\u5668\uff0c\u5176\u8f93\u51fa\u6761\u4ef6\u5316\u89e3\u7801\u5668\uff1a
\u5176\u4e2d \\(h_i\\) \u662f\u97f3\u7d20 \\(i\\) \u7684\u7f16\u7801\u5668\u9690\u85cf\u72b6\u6001\u3002\u8bad\u7ec3\u65f6\u4f7f\u7528\u771f\u5b9e\u503c\uff1b\u63a8\u7406\u65f6\uff0c\u9884\u6d4b\u503c\u63d0\u4f9b\u5bf9\u97f5\u5f8b\u7684\u663e\u5f0f\u63a7\u5236\u3002\u8fd9\u79cd\u53ef\u63a7\u6027\u662f FastSpeech 2 \u7684\u4e3b\u8981\u4f18\u52bf\uff1a\u8c03\u6574\u97f3\u9ad8\u3001\u901f\u5ea6\u6216\u80fd\u91cf\u5c31\u50cf\u7f29\u653e\u9884\u6d4b\u5668\u8f93\u51fa\u4e00\u6837\u7b80\u5355\u3002
FastSpeech 2 \u5728\u63a8\u7406\u65f6\u901a\u5e38\u6bd4 Tacotron 2 \u5feb 10-20 \u500d\uff0c\u5e76\u907f\u514d\u4e86\u5e38\u89c1\u7684\u81ea\u56de\u5f52\u5931\u8d25\u6a21\u5f0f\uff0c\u5982\u8bcd\u8bed\u8df3\u8fc7\u3001\u91cd\u590d\u548c\u6ce8\u610f\u529b\u5d29\u584c\u3002
VITS\uff08Kim \u7b49\u4eba\uff0c2021\uff09\u662f\u4e00\u4e2a\u7aef\u5230\u7aef TTS \u6a21\u578b\uff0c\u76f4\u63a5\u4ece\u6587\u672c\u751f\u6210\u6ce2\u5f62\uff0c\u6d88\u9664\u4e86\u72ec\u7acb\u7684\u58f0\u7801\u5668\u9636\u6bb5\u3002VITS \u7ed3\u5408\u4e86\u6761\u4ef6\u53d8\u5206\u81ea\u7f16\u7801\u5668\uff08\u7b2c 06 \u7ae0\uff09\u3001\u6b63\u5219\u5316\u6d41\u548c\u5bf9\u6297\u8bad\u7ec3\u3002\u540e\u9a8c\u7f16\u7801\u5668\u5c06\u771f\u5b9e\u6885\u5c14\u8bed\u8c31\u56fe\u6620\u5c04\u5230\u6f5c\u5728\u7a7a\u95f4\uff0c\u5148\u9a8c\u7f16\u7801\u5668\u5c06\u97f3\u7d20\uff08\u901a\u8fc7\u57fa\u4e8e Transformer \u7684\u6587\u672c\u7f16\u7801\u5668\u548c\u65f6\u957f\u9884\u6d4b\u5668\uff09\u6620\u5c04\u5230\u540c\u4e00\u6f5c\u5728\u7a7a\u95f4\uff0c\u89e3\u7801\u5668\uff08\u57fa\u4e8e HiFi-GAN\uff09\u4ece\u6f5c\u5728\u6837\u672c\u751f\u6210\u6ce2\u5f62\u3002
VITS \u7684\u8bad\u7ec3\u76ee\u6807\u7ed3\u5408\u4e86\uff1a
VITS \u6bd4\u4e24\u9636\u6bb5\u7cfb\u7edf\uff08FastSpeech 2 + HiFi-GAN\uff09\u4ea7\u751f\u66f4\u9ad8\u8d28\u91cf\uff0c\u56e0\u4e3a\u58f0\u5b66\u6a21\u578b\u548c\u58f0\u7801\u5668\u88ab\u8054\u5408\u4f18\u5316\uff0c\u907f\u514d\u4e86\u9884\u6d4b\u6885\u5c14\u8bed\u8c31\u56fe\u4e0e\u771f\u5b9e\u6885\u5c14\u8bed\u8c31\u56fe\u4e4b\u95f4\u7684\u4e0d\u5339\u914d\uff0c\u8fd9\u79cd\u4e0d\u5339\u914d\u4f1a\u964d\u4f4e\u4e24\u9636\u6bb5\u7cfb\u7edf\u7684\u6027\u80fd\u3002
VALL-E\uff08Wang \u7b49\u4eba\uff0c2023\uff09\u4ece\u6839\u672c\u4e0a\u5c06 TTS \u91cd\u6784\u4e3a\u79bb\u6563\u97f3\u9891\u4ee4\u724c\u4e0a\u7684\u8bed\u8a00\u5efa\u6a21\u95ee\u9898\u3002\u5b83\u4f7f\u7528\u795e\u7ecf\u97f3\u9891\u7f16\u89e3\u7801\u5668\uff08EnCodec\uff09\u5c06\u8bed\u97f3\u8868\u793a\u4e3a\u6765\u81ea\u591a\u4e2a\u7801\u672c\u7ea7\u7684\u4e00\u7cfb\u5217\u79bb\u6563\u7801\u3002\u7ed9\u5b9a\u6587\u672c\u63d0\u793a\u548c\u4e00\u4e2a 3 \u79d2\u7684\u6ce8\u518c\u8bdd\u8bed\uff08\u4e5f\u7f16\u7801\u4e3a\u79bb\u6563\u4ee4\u724c\uff09\uff0cVALL-E \u4f7f\u7528 Transformer \u8bed\u8a00\u6a21\u578b\u81ea\u56de\u5f52\u5730\u9884\u6d4b\u97f3\u9891\u4ee4\u724c\u3002
VALL-E \u4f7f\u7528\u4e24\u4e2a\u6a21\u578b\uff1a\u4e00\u4e2a\u81ea\u56de\u5f52\uff08AR\uff09\u6a21\u578b\u9010\u4e2a\u4ee4\u724c\u5730\u751f\u6210\u7b2c\u4e00\u4e2a\u7801\u672c\u7ea7\uff0c\u4ee5\u53ca\u4e00\u4e2a\u975e\u81ea\u56de\u5f52\uff08NAR\uff09\u6a21\u578b\u5e76\u884c\u9884\u6d4b\u5269\u4f59\u7684\u7801\u672c\u7ea7\uff0c\u4ee5\u7b2c\u4e00\u4e2a\u7ea7\u522b\u548c\u5f7c\u6b64\u4e3a\u6761\u4ef6\u3002\u8fd9\u79cd\u7f16\u89e3\u7801\u5668\u8bed\u8a00\u6a21\u578b\u65b9\u6cd5\u5b9e\u73b0\u4e86\u5353\u8d8a\u7684\u96f6\u6837\u672c\u58f0\u97f3\u514b\u9686\uff1a3 \u79d2\u6837\u672c\u8db3\u4ee5\u91cd\u73b0\u8bf4\u8bdd\u4eba\u7684\u58f0\u97f3\u3001\u97f3\u8272\uff0c\u751a\u81f3\u60c5\u611f\u57fa\u8c03\u3002
StyleTTS\uff08Li \u7b49\u4eba\uff0c2022\uff09\u548c StyleTTS 2 \u5c06\u8bed\u97f3\u89e3\u8026\u4e3a\u5185\u5bb9\u548c\u98ce\u683c\u7ec4\u4ef6\u3002\u98ce\u683c\u7f16\u7801\u5668\u4ece\u53c2\u8003\u97f3\u9891\u4e2d\u63d0\u53d6\u98ce\u683c\u5411\u91cf\uff0c\u6355\u83b7\u8bf4\u8bdd\u4eba\u8eab\u4efd\u3001\u97f5\u5f8b\u548c\u5f55\u97f3\u6761\u4ef6\u3002\u63a8\u7406\u65f6\uff0c\u98ce\u683c\u53ef\u4ee5\u4ece\u5b66\u4e60\u7684\u5148\u9a8c\u5206\u5e03\u4e2d\u91c7\u6837\uff0c\u6216\u4ece\u53c2\u8003\u8bdd\u8bed\u4e2d\u8fc1\u79fb\u3002StyleTTS 2 \u4f7f\u7528\u6269\u6563\u6a21\u578b\uff08\u7b2c 08 \u7ae0\uff09\u4f5c\u4e3a\u98ce\u683c\u5148\u9a8c\uff0c\u751f\u6210\u591a\u6837\u5316\u4e14\u81ea\u7136\u7684\u97f5\u5f8b\u3002
Kokoro\uff082024\uff09\u662f\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u3001\u9ad8\u8d28\u91cf\u7684\u5f00\u653e\u6e90\u7801 TTS \u6a21\u578b\uff0c\u4ee5\u5176\u5c0f\u5de7\u7684\u89c4\u6a21\uff08\u7ea6 82M \u53c2\u6570\uff09\u548c\u4ee4\u4eba\u5370\u8c61\u6df1\u523b\u7684\u81ea\u70ed\u5ea6\u800c\u8457\u79f0\u3002\u5b83\u91c7\u7528\u53d7 StyleTTS 2 \u542f\u53d1\u7684\u67b6\u6784\uff0c\u5305\u542b\u57fa\u4e8e\u6269\u6563\u7684\u98ce\u683c\u5148\u9a8c\u548c\u5fae\u8c03\u7684 ISTFTNet \u58f0\u7801\u5668\uff0c\u8be5\u58f0\u7801\u5668\u76f4\u63a5\u9884\u6d4b STFT \u7cfb\u6570\uff08\u6765\u81ea\u6587\u4ef6 01\uff09\u800c\u4e0d\u662f\u539f\u59cb\u6ce2\u5f62\u6837\u672c\u3002\u5c3d\u7ba1\u6a21\u578b\u5927\u5c0f\u4ec5\u4e3a VALL-E \u7b49\u6a21\u578b\u7684\u4e00\u5c0f\u90e8\u5206\uff0cKokoro \u5728\u82f1\u8bed\u3001\u65e5\u8bed\u3001\u6cd5\u8bed\u3001\u97e9\u8bed\u548c\u4e2d\u6587\u4e0a\u5b9e\u73b0\u4e86\u63a5\u8fd1\u4eba\u7c7b\u7684\u81ea\u7136\u5ea6\uff0c\u8bc1\u660e\u4e86\u7cbe\u5fc3\u7b56\u5212\u7684\u8bad\u7ec3\u6570\u636e\u548c\u9ad8\u6548\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u4e0e\u66b4\u529b\u89c4\u6a21\u76f8\u6297\u8861\u3002Kokoro \u7684\u5c0f\u4f53\u79ef\u4f7f\u5176\u975e\u5e38\u9002\u5408\u672c\u5730\u548c\u8fb9\u7f18\u90e8\u7f72\u3002
Orpheus\uff08Canopy Labs\uff0c2025\uff09\u662f\u4e00\u4e2a\u5f00\u653e\u6e90\u7801 TTS \u6a21\u578b\u7cfb\u5217\uff081B \u548c 3B \u53c2\u6570\uff09\uff0c\u6784\u5efa\u5728 VALL-E \u5f00\u521b\u7684\u7f16\u89e3\u7801\u5668\u8bed\u8a00\u6a21\u578b\u8303\u5f0f\u4e4b\u4e0a\u3002Orpheus \u66f4\u8fdb\u4e00\u6b65\uff0c\u4f7f\u7528 LLM \u9aa8\u5e72\u7f51\u7edc\uff08\u5fae\u8c03\u7684 Llama 3\uff09\u76f4\u63a5\u751f\u6210 SNAC \u97f3\u9891\u7f16\u89e3\u7801\u5668\u4ee4\u724c\u3002\u5176\u7a81\u51fa\u7279\u70b9\u662f\u7c7b\u4f3c\u4eba\u7c7b\u7684\u60c5\u611f\u8868\u8fbe\u80fd\u529b\uff1a\u5b83\u80fd\u591f\u4ee5\u5353\u8d8a\u7684\u81ea\u7136\u5ea6\u5904\u7406\u7b11\u58f0\u3001\u53f9\u606f\u3001\u72b9\u8c6b\u548c\u60c5\u611f\u97f5\u5f8b\u3002Orpheus \u53ef\u4ee5\u901a\u8fc7\u5728\u8f93\u5165\u6587\u672c\u4e2d\u4f7f\u7528 [laugh] \u6216 [sigh] \u7b49\u6807\u7b7e\u8fdb\u884c\u63d0\u793a\uff0c\u4ece\u800c\u5bf9\u526f\u8bed\u8a00\u8868\u8fbe\u8fdb\u884c\u7ec6\u7c92\u5ea6\u63a7\u5236\u3002
Dia\uff08Nari Labs\uff0c2025\uff09\u662f\u4e00\u4e2a\u5f00\u653e\u6e90\u7801\u5bf9\u8bdd TTS \u6a21\u578b\uff0c\u4ece\u5355\u4e2a\u6587\u672c\u8f6c\u5f55\u751f\u6210\u903c\u771f\u7684\u591a\u8bf4\u8bdd\u4eba\u5bf9\u8bdd\u3002Dia \u6784\u5efa\u5728 1.6B \u53c2\u6570\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668 Transformer \u4e4b\u4e0a\uff0c\u5904\u7406\u5bf9\u8bdd\u4e2d\u7684\u8bdd\u8f6e\u8f6c\u6362\u3001\u8bf4\u8bdd\u4eba\u7279\u5b9a\u58f0\u97f3\u548c\u975e\u8bed\u8a00\u7ebf\u7d22\uff08\u7b11\u58f0\u3001\u505c\u987f\uff09\u3002\u5b83\u8fd8\u652f\u6301\u4ece\u7b80\u77ed\u97f3\u9891\u63d0\u793a\u8fdb\u884c\u58f0\u97f3\u514b\u9686\uff0c\u4ece\u800c\u5728\u5bf9\u8bdd\u4e0a\u4e0b\u6587\u4e2d\u5b9e\u73b0\u96f6\u6837\u672c\u8bf4\u8bdd\u4eba\u751f\u6210\u3002
Sesame CSM\uff08\u4f1a\u8bdd\u8bed\u97f3\u6a21\u578b\uff0c2025\uff09\u4e13\u6ce8\u4e8e\u81ea\u7136\u7684\u591a\u4eba\u8f6e\u6362\u4f1a\u8bdd\u8bed\u97f3\u3002Sesame \u4e0d\u662f\u4e3a\u4e86\u4f18\u5316\u6717\u8bfb\u5f0f TTS\uff0c\u800c\u662f\u5bf9\u771f\u5b9e\u5bf9\u8bdd\u7684\u52a8\u6001\u8fdb\u884c\u5efa\u6a21\uff1a\u53cd\u9988\u8bcd\uff08\"\u55ef\u54fc\"\uff09\u3001\u6253\u65ad\u3001\u8bf4\u8bdd\u4eba\u4e4b\u95f4\u7684\u8282\u594f\u53d8\u5316\u548c\u60c5\u611f\u54cd\u5e94\u3002\u8be5\u6a21\u578b\u4f7f\u7528\u4ee5\u5bf9\u8bdd\u4e0a\u4e0b\u6587\uff08\u6587\u672c\u548c\u97f3\u9891\u5386\u53f2\uff09\u4e3a\u6761\u4ef6\u7684 Transformer \u9aa8\u5e72\u7f51\u7edc\uff0c\u751f\u6210\u7684\u8bed\u97f3\u98ce\u683c\u80fd\u9002\u5e94\u5bf9\u8bdd\u7684\u6d41\u7a0b\u3002
Fish Speech\uff08Fish Audio\uff0c2024\uff09\u662f\u4e00\u4e2a\u5f00\u653e\u6e90\u7801 TTS \u7cfb\u7edf\uff0c\u4f7f\u7528\u53cc\u81ea\u56de\u5f52\u67b6\u6784\uff1a\u4e00\u4e2a\u5927\u8bed\u8a00\u6a21\u578b\u4ece\u6587\u672c\u751f\u6210\u8bed\u4e49\u4ee4\u724c\uff0c\u4e00\u4e2a\u8f83\u5c0f\u6a21\u578b\u5c06\u8fd9\u4e9b\u8f6c\u6362\u4e3a VQGAN \u58f0\u5b66\u4ee4\u724c\uff0c\u518d\u7531\u58f0\u7801\u5668\u89e3\u7801\u4e3a\u6ce2\u5f62\u3002Fish Speech \u652f\u6301\u4ece 10-15 \u79d2\u53c2\u8003\u97f3\u9891\u8fdb\u884c\u96f6\u6837\u672c\u58f0\u97f3\u514b\u9686\uff0c\u5e76\u5b9e\u73b0\u9002\u5408\u5b9e\u65f6\u5e94\u7528\u7684\u4f4e\u5ef6\u8fdf\u3002\u5176\u6a21\u5757\u5316\u8bbe\u8ba1\u5141\u8bb8\u72ec\u7acb\u66ff\u6362\u7ec4\u4ef6\uff08\u4f8b\u5982\uff0c\u4e0d\u540c\u7684\u58f0\u7801\u5668\uff09\u3002
ChatTTS\uff082024\uff09\u662f\u4e00\u4e2a\u5f00\u653e\u6e90\u7801\u4f1a\u8bdd TTS \u6a21\u578b\uff0c\u4e13\u4e3a\u804a\u5929\u673a\u5668\u4eba\u548c\u865a\u62df\u52a9\u624b\u7b49\u5bf9\u8bdd\u5e94\u7528\u8bbe\u8ba1\u3002\u5b83\u901a\u8fc7\u5728\u6587\u672c\u8f93\u5165\u4e2d\u5d4c\u5165\u7279\u6b8a\u4ee4\u724c\uff0c\u751f\u6210\u81ea\u7136\u3001\u4f1a\u8bdd\u98ce\u683c\u7684\u8bed\u97f3\uff0c\u5e76\u5bf9\u97f5\u5f8b\u7279\u5f81\uff08\u7b11\u58f0\u3001\u505c\u987f\u3001\u586b\u5145\u8bcd\uff09\u8fdb\u884c\u7ec6\u7c92\u5ea6\u63a7\u5236\u3002ChatTTS \u652f\u6301\u4e2d\u82f1\u6df7\u5408\u5408\u6210\u548c\u591a\u8bf4\u8bdd\u4eba\u751f\u6210\u3002
Bark\uff08Suno\uff0c2023\uff09\u662f\u4e00\u4e2a\u57fa\u4e8e Transformer \u7684\u5f00\u653e\u6e90\u7801\u6a21\u578b\uff0c\u4ece\u6587\u672c\u63d0\u793a\u751f\u6210\u8bed\u97f3\u3001\u97f3\u4e50\u548c\u97f3\u6548\u3002\u5b83\u4f7f\u7528\u4e09\u4e2a\u9636\u6bb5\u7684 Transformer \u6a21\u578b\u6d41\u6c34\u7ebf\uff08\u6587\u672c \u2192 \u8bed\u4e49\u4ee4\u724c \u2192 \u7c97\u58f0\u5b66\u4ee4\u724c \u2192 \u7ec6\u58f0\u5b66\u4ee4\u724c\uff09\uff0c\u5e76\u652f\u6301\u58f0\u97f3\u514b\u9686\u3001\u591a\u8bed\u8a00\u5408\u6210\u4ee5\u53ca\u97f3\u4e50\u548c\u73af\u5883\u97f3\u7b49\u975e\u8bed\u97f3\u97f3\u9891\u3002Bark \u7684\u901a\u7528\u6027\u4ee5\u53ef\u63a7\u6027\u4e3a\u4ee3\u4ef7\u2014\u2014\u5b83\u4e0d\u5982\u4e13\u7528 TTS \u7cfb\u7edf\u7cbe\u786e\uff0c\u4f46\u66f4\u7075\u6d3b\u3002
Parler-TTS\uff08Hugging Face\uff0c2024\uff09\u91c7\u7528\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\u65b9\u5f0f\u8fdb\u884c\u58f0\u97f3\u63a7\u5236\uff1a\u7528\u6237\u65e0\u9700\u63d0\u4f9b\u53c2\u8003\u97f3\u9891\u7247\u6bb5\u6765\u63a7\u5236\u98ce\u683c\uff0c\u800c\u662f\u63d0\u4f9b\u6587\u672c\u63cf\u8ff0\uff0c\u4f8b\u5982\"\u4e00\u4f4d\u5973\u6027\u8bf4\u8bdd\u8005\uff0c\u58f0\u97f3\u6e29\u6696\u3001\u5bcc\u6709\u8868\u73b0\u529b\uff0c\u5728\u5b89\u9759\u7684\u623f\u95f4\u4e2d\u3002\"Parler-TTS \u5728\u5e26\u6ce8\u91ca\u7684\u8bed\u97f3\u6570\u636e\u4e0a\u8bad\u7ec3\uff0c\u5176\u4e2d\u6bcf\u4e2a\u8bdd\u8bed\u90fd\u914d\u6709\u4e00\u4e2a\u63cf\u8ff0\u8bf4\u8bdd\u98ce\u683c\u7684\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\uff0c\u4ece\u800c\u65e0\u9700\u4efb\u4f55\u53c2\u8003\u97f3\u9891\u5373\u53ef\u5b9e\u73b0\u76f4\u89c2\u63a7\u5236\u3002
Neuphonic \u662f\u4e00\u4e2a\u57fa\u4e8e API \u7684 TTS \u5e73\u53f0\uff0c\u9488\u5bf9\u8d85\u4f4e\u5ef6\u8fdf\u8bed\u97f3\u5408\u6210\u8fdb\u884c\u4e86\u4f18\u5316\uff0c\u9762\u5411\u5b9e\u65f6\u8bed\u97f3\u4ee3\u7406\u548c\u4f1a\u8bdd AI \u5e94\u7528\u3002\u5b83\u901a\u8fc7\u6d41\u5f0f\u67b6\u6784\u5b9e\u73b0\u4f4e\u4e8e 100 \u6beb\u79d2\u7684\u9996\u97f3\u65f6\u95f4\uff0c\u5728\u5b8c\u6574\u8f93\u5165\u6587\u672c\u53ef\u7528\u4e4b\u524d\u5c31\u5f00\u59cb\u751f\u6210\u97f3\u9891\u3002Neuphonic \u4e13\u6ce8\u4e8e\u90e8\u7f72\u548c\u5ef6\u8fdf\u4f18\u5316\u5c42\u9762\uff0c\u800c\u4e0d\u662f\u65b0\u9896\u7684\u6a21\u578b\u67b6\u6784\uff0c\u56f4\u7ed5\u73b0\u4ee3\u795e\u7ecf TTS \u63d0\u4f9b\u751f\u4ea7\u7ea7\u57fa\u7840\u8bbe\u65bd\u3002
KittenTTS \u662f\u4e00\u4e2a\u7d27\u51d1\u3001\u5feb\u901f\u7684 TTS \u6a21\u578b\uff0c\u4e13\u4e3a\u6548\u7387\u4f4e\u8d44\u6e90\u90e8\u7f72\u8bbe\u8ba1\u3002\u5b83\u4f18\u5148\u8003\u8651\u6700\u5c0f\u5ef6\u8fdf\u548c\u5c0f\u6a21\u578b\u5927\u5c0f\uff0c\u9002\u7528\u4e8e\u8fb9\u7f18\u548c\u5d4c\u5165\u5f0f\u5e94\u7528\uff0c\u4ee5\u727a\u7272\u4e00\u5b9a\u81ea\u7136\u5ea6\u6362\u53d6\u5728 CPU \u548c\u79fb\u52a8\u8bbe\u5907\u4e0a\u7684\u5b9e\u65f6\u6027\u80fd\u3002
\u73b0\u4ee3 TTS \u683c\u5c40\u6b63\u5728\u5206\u5316\u4e3a\u4e24\u79cd\u8303\u5f0f\uff1a(1) \u7f16\u89e3\u7801\u5668\u8bed\u8a00\u6a21\u578b\uff08VALL-E\u3001Orpheus\u3001Fish Speech\uff09\uff0c\u5c06\u8bed\u97f3\u751f\u6210\u89c6\u4e3a\u79bb\u6563\u97f3\u9891\u7801\u4e0a\u7684\u4e0b\u4e00\u4e2a\u4ee4\u724c\u9884\u6d4b\uff0c\u5229\u7528 LLM \u7684\u6269\u5c55\u89c4\u5f8b\uff1b\u4ee5\u53ca (2) \u6d41/\u6269\u6563\u6a21\u578b\uff08VITS\u3001StyleTTS 2\u3001Kokoro\uff09\uff0c\u901a\u8fc7\u8fed\u4ee3\u7ec6\u5316\u751f\u6210\u8fde\u7eed\u6885\u5c14\u8bed\u8c31\u56fe\u6216\u6ce2\u5f62\u3002\u7f16\u89e3\u7801\u5668\u8bed\u8a00\u6a21\u578b\u5728\u96f6\u6837\u672c\u514b\u9686\u548c\u8868\u73b0\u529b\u65b9\u9762\u8868\u73b0\u51fa\u8272\uff1b\u6d41/\u6269\u6563\u6a21\u578b\u901a\u5e38\u66f4\u5c0f\u3001\u66f4\u5feb\u3002\u4e24\u8005\u90fd\u5728\u5feb\u901f\u5411\u4eba\u7c7b\u7ea7\u522b\u7684\u81ea\u7136\u5ea6\u6536\u655b\u3002
\u97f5\u5f8b\u5efa\u6a21\u63a7\u5236\u8bed\u97f3\u7684\"\u97f3\u4e50\"\uff1a\u97f3\u9ad8\u3001\u65f6\u957f\u3001\u80fd\u91cf\u3001\u8282\u594f\u548c\u8bed\u8c03\u3002\u6ca1\u6709\u826f\u597d\u7684\u97f5\u5f8b\uff0c\u5373\u4f7f\u5355\u4e2a\u97f3\u7d20\u6e05\u6670\uff0c\u5408\u6210\u8bed\u97f3\u542c\u8d77\u6765\u4e5f\u5e73\u6de1\u4e14\u673a\u68b0\u3002\u53ef\u4ee5\u628a\u97f5\u5f8b\u60f3\u8c61\u6210\u5355\u8c03\u7684 GPS \u8bed\u97f3\u4e0e\u5bcc\u6709\u8868\u73b0\u529b\u7684\u6709\u58f0\u8bfb\u7269\u65c1\u767d\u4e4b\u95f4\u7684\u533a\u522b\u3002
\u97f3\u9ad8\uff08\u57fa\u9891 \\(F_0\\)\uff09\u662f\u8bed\u97f3\u611f\u77e5\u7684\u9ad8\u4f4e\u7a0b\u5ea6\u3002\u5b83\u5728\u95ee\u53e5\u672b\u5c3e\u4e0a\u5347\uff0c\u5728\u9648\u8ff0\u53e5\u672b\u5c3e\u4e0b\u964d\uff0c\u5e76\u5728\u60c5\u611f\u6027\u8bed\u97f3\u4e2d\u8fde\u7eed\u53d8\u5316\u3002\\(F_0\\) \u4f7f\u7528 CREPE\uff08\u4e00\u79cd\u795e\u7ecf\u97f3\u9ad8\u8ffd\u8e2a\u5668\uff09\u6216 YIN\uff08\u57fa\u4e8e\u81ea\u76f8\u5173\uff0c\u6765\u81ea\u6587\u4ef6 01\uff09\u7b49\u7b97\u6cd5\u4ece\u97f3\u9891\u4e2d\u63d0\u53d6\u3002\u5728 TTS \u4e2d\uff0c\u97f3\u9ad8\u7531\u58f0\u5b66\u6a21\u578b\u9884\u6d4b\uff08FastSpeech 2 \u7684\u97f3\u9ad8\u9884\u6d4b\u5668\uff09\u6216\u9690\u5f0f\u5b66\u4e60\uff08Tacotron 2\uff09\u3002
\u65f6\u957f\u51b3\u5b9a\u4e86\u8bed\u901f\u548c\u8282\u594f\u3002\u91cd\u8bfb\u97f3\u8282\u66f4\u957f\uff0c\u529f\u80fd\u8bcd\u7f29\u77ed\uff0c\u505c\u987f\u6807\u8bb0\u77ed\u8bed\u8fb9\u754c\u3002\u65f6\u957f\u5efa\u6a21\u5728\u975e\u81ea\u56de\u5f52\u6a21\u578b\uff08FastSpeech\uff09\u4e2d\u662f\u663e\u5f0f\u7684\uff0c\u5728\u81ea\u56de\u5f52\u6a21\u578b\uff08Tacotron \u7684\u6ce8\u610f\u529b\u5bf9\u9f50\u51b3\u5b9a\u65f6\u957f\uff09\u4e2d\u662f\u9690\u5f0f\u7684\u3002
\u80fd\u91cf\uff08\u54cd\u5ea6\uff09\u627f\u8f7d\u7740\u91cd\u97f3\u3002\"\u6211\u6ca1\u8bf4\u4ed6\u5077\u4e86\" vs \"\u6211\u6ca1\u8bf4\u4ed6\u5077\u4e86\"\u5177\u6709\u5b8c\u5168\u4e0d\u540c\u7684\u542b\u4e49\uff0c\u5b8c\u5168\u901a\u8fc7\u80fd\u91cf\u6a21\u5f0f\u4f20\u8fbe\u3002
\u98ce\u683c\u5d4c\u5165\u6355\u83b7\u66f4\u9ad8\u7ea7\u7684\u97f5\u5f8b\u6a21\u5f0f\u3002\u5168\u5c40\u98ce\u683c\u4ee4\u724c\uff08GST\uff09\u6846\u67b6\uff08Wang \u7b49\u4eba\uff0c2018\uff09\u5b66\u4e60\u4e00\u4e2a\u98ce\u683c\u4ee4\u724c\u5e93\uff08\u5bf9\u4e00\u7ec4\u5b66\u4e60\u5230\u7684\u5d4c\u5165\u8fdb\u884c\u8f6f\u6ce8\u610f\u529b\uff09\uff0c\u6355\u83b7\"\u5174\u594b\"\u3001\"\u60b2\u4f24\"\u6216\"\u4f4e\u8bed\"\u7b49\u8bf4\u8bdd\u98ce\u683c\u3002\u98ce\u683c\u5d4c\u5165\u4ece\u53c2\u8003\u8bdd\u8bed\u4e2d\u63d0\u53d6\u5e76\u6dfb\u52a0\u5230\u7f16\u7801\u5668\u8f93\u51fa\u4e2d\uff0c\u5141\u8bb8\u5728\u63a8\u7406\u65f6\u8fdb\u884c\u98ce\u683c\u8fc1\u79fb\u3002
\u58f0\u97f3\u8f6c\u6362\uff08VC\uff09\u6539\u53d8\u8bdd\u8bed\u7684\u8bf4\u8bdd\u4eba\u8eab\u4efd\uff0c\u540c\u65f6\u4fdd\u7559\u8bed\u8a00\u5185\u5bb9\u3002\u60f3\u8c61\u4e00\u4e0b\u5f55\u4e0b\u81ea\u5df1\u7684\u58f0\u97f3\uff0c\u7136\u540e\u8ba9\u8f93\u51fa\u542c\u8d77\u6765\u50cf\u67d0\u4e2a\u7279\u5b9a\u7684\u76ee\u6807\u8bf4\u8bdd\u4eba\u3002VC \u9700\u8981\u5c06\u8bf4\u8bdd\u4eba\u8eab\u4efd\u4e0e\u5185\u5bb9\u89e3\u8026\u3002
\u8bf4\u8bdd\u4eba\u5d4c\u5165\uff08\u5728\u6587\u4ef6 04 \u4e2d\u8fdb\u4e00\u6b65\u8be6\u8ff0\uff09\u5c06\u8bf4\u8bdd\u4eba\u8eab\u4efd\u7f16\u7801\u4e3a\u56fa\u5b9a\u7ef4\u5ea6\u7684\u5411\u91cf\u3002\u8fd9\u4e9b\u53ef\u4ee5\u6765\u81ea\u9884\u8bad\u7ec3\u7684\u8bf4\u8bdd\u4eba\u9a8c\u8bc1\u6a21\u578b\uff08x-vectors\u3001ECAPA-TDNN\uff09\u3002\u5728 VC \u4e2d\uff0c\u6e90\u8bed\u97f3\u88ab\u7f16\u7801\u4e3a\u4e0e\u8bf4\u8bdd\u4eba\u65e0\u5173\u7684\u5185\u5bb9\u8868\u793a\uff0c\u7136\u540e\u4f7f\u7528\u76ee\u6807\u8bf4\u8bdd\u4eba\u5d4c\u5165\u8fdb\u884c\u89e3\u7801\u3002
\u89e3\u8026\u8868\u793a\u5c06\u8bed\u97f3\u5206\u79bb\u4e3a\u72ec\u7acb\u56e0\u7d20\uff1a\u5185\u5bb9\uff08\u97f3\u7d20\uff09\u3001\u8bf4\u8bdd\u4eba\u8eab\u4efd\u3001\u97f3\u9ad8\u548c\u8282\u594f\u3002\u65b9\u6cd5\u5305\u62ec\uff1a
\u58f0\u97f3\u514b\u9686\u4ee5\u76ee\u6807\u8bf4\u8bdd\u4eba\u7684\u58f0\u97f3\u5408\u6210\u8bed\u97f3\u3002\u591a\u8bf4\u8bdd\u4eba TTS\u5728\u6765\u81ea\u8bb8\u591a\u8bf4\u8bdd\u4eba\u7684\u6570\u636e\u4e0a\u8bad\u7ec3\uff0c\u4ee5\u8bf4\u8bdd\u4eba\u5d4c\u5165\u6761\u4ef6\u5316\u6a21\u578b\u3002\u63a8\u7406\u65f6\uff0c\u4ece\u6ce8\u518c\u97f3\u9891\u4e2d\u63d0\u53d6\u65b0\u8bf4\u8bdd\u4eba\u7684\u5d4c\u5165\uff0c\u5e76\u7528\u4e8e\u6761\u4ef6\u5316\u751f\u6210\u3002
\u5c11\u6837\u672c\u58f0\u97f3\u514b\u9686\u4f7f\u7528\u5c11\u91cf\u6570\u636e\uff08\u51e0\u5206\u949f\uff09\u9002\u5e94\u65b0\u8bf4\u8bdd\u4eba\u3002\u8bf4\u8bdd\u4eba\u7f16\u7801\u5668\u4ece\u6ce8\u518c\u97f3\u9891\u4e2d\u63d0\u53d6\u5d4c\u5165\uff0cTTS \u6a21\u578b\u4ee5\u6b64\u5d4c\u5165\u4e3a\u6761\u4ef6\u751f\u6210\u8bed\u97f3\u3002\u8fd9\u662f SV2TTS\uff08Jia \u7b49\u4eba\uff0c2018\uff09\u4e2d\u4f7f\u7528\u7684\u65b9\u6cd5\uff1a\u4e00\u4e2a\u5355\u72ec\u8bad\u7ec3\u7684\u8bf4\u8bdd\u4eba\u7f16\u7801\u5668\u3001\u4e00\u4e2a\u4ee5\u8bf4\u8bdd\u4eba\u5d4c\u5165\u4e3a\u6761\u4ef6\u7684 Tacotron 2 \u5408\u6210\u5668\uff0c\u4ee5\u53ca\u4e00\u4e2a WaveRNN \u58f0\u7801\u5668\u3002
\u96f6\u6837\u672c\u58f0\u97f3\u514b\u9686\u5b8c\u5168\u4e0d\u9700\u8981\u9002\u5e94\uff1a\u4e00\u4e2a\u7b80\u77ed\u7684\u8bdd\u8bed\uff083-30 \u79d2\uff09\u5c31\u8db3\u591f\u4e86\u3002VALL-E \u901a\u8fc7\u5c06\u6ce8\u518c\u97f3\u9891\u4f5c\u4e3a\u8bed\u8a00\u6a21\u578b\u7684\u63d0\u793a\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002\u8be5\u6a21\u578b\u5b66\u4f1a\u4ee5\u76f8\u540c\u7684\u58f0\u97f3\u7ee7\u7eed\u751f\u6210\uff0c\u56e0\u4e3a\u5b83\u662f\u5728\u5927\u89c4\u6a21\u591a\u8bf4\u8bdd\u4eba\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\uff0c\u5176\u4e2d\u8bdd\u8bed\u5185\u58f0\u97f3\u4e00\u81f4\u6027\u662f\u7edf\u8ba1\u4e0a\u7684\u5e38\u6001\u3002
\u8bed\u97f3\u6d3b\u52a8\u68c0\u6d4b\uff08VAD\uff09\u5728\u6bcf\u4e2a\u65f6\u95f4\u5e27\u56de\u7b54\u4e00\u4e2a\u7b80\u5355\u7684\u4e8c\u503c\u95ee\u9898\uff1a\u662f\u5426\u6709\u4eba\u5728\u8bf4\u8bdd\uff1f\u5c3d\u7ba1\u7b80\u5355\uff0cVAD \u662f ASR\uff08\u6587\u4ef6 02\uff09\u3001\u8bf4\u8bdd\u4eba\u65e5\u5fd7\uff08\u6587\u4ef6 04\uff09\u548c\u964d\u566a\uff08\u6587\u4ef6 05\uff09\u7684\u5173\u952e\u9884\u5904\u7406\u6b65\u9aa4\u3002\u597d\u7684 VAD \u901a\u8fc7\u8df3\u8fc7\u9759\u97f3\u51cf\u5c11\u8ba1\u7b97\u91cf\uff0c\u5e76\u901a\u8fc7\u9632\u6b62\u566a\u58f0\u88ab\u4f5c\u4e3a\u8bed\u97f3\u5904\u7406\u6765\u63d0\u9ad8\u51c6\u786e\u6027\u3002
\u7ecf\u5178 VAD \u4f7f\u7528\u80fd\u91cf\u9608\u503c\u6cd5\uff08\u8bed\u97f3\u6bd4\u9759\u97f3\u54cd\u4eae\uff09\u3001\u8fc7\u96f6\u7387\uff08\u8bed\u97f3\u5177\u6709\u7279\u5f81\u6027\u7684\u8fc7\u96f6\u6a21\u5f0f\uff09\u548c\u9891\u8c31\u7279\u5f81\u3002\u8fd9\u4e9b\u5728\u4fe1\u566a\u6bd4\u8f83\u4f4e\u7684\u5608\u6742\u73af\u5883\u4e2d\u4f1a\u5931\u6548\u3002
\u795e\u7ecf VAD\u6a21\u578b\u5c06\u95ee\u9898\u89c6\u4e3a\u5e27\u7ea7\u4e8c\u5206\u7c7b\u3002\u5c0f\u578b RNN \u6216 CNN \u63a5\u6536\u58f0\u5b66\u7279\u5f81\uff08\u6765\u81ea\u6587\u4ef6 01 \u7684\u5bf9\u6570\u6885\u5c14\u80fd\u91cf\uff09\u5e76\u9884\u6d4b\u8bed\u97f3/\u975e\u8bed\u97f3\u6982\u7387\u3002
WebRTC VAD\uff08Google\uff09\u662f\u4e00\u4e2a\u7ecf\u5178\u8f7b\u91cf\u7ea7 VAD\uff0c\u4f7f\u7528\u57fa\u4e8e GMM \u7684\u5206\u7c7b\u5668\u5bf9\u7b80\u5355\u7684\u9891\u8c31\u7279\u5f81\u8fdb\u884c\u5206\u7c7b\u3002\u5b83\u4ee5\u56db\u4e2a\u6fc0\u8fdb\u7ea7\u522b\uff080-3\uff09\u8fd0\u884c\uff0c\u901f\u5ea6\u6781\u5feb\uff0c\u4f46\u5728\u97f3\u4e50\u3001\u975e\u8bed\u97f3\u53d1\u58f0\u548c\u4f4e SNR \u73af\u5883\u4e2d\u8868\u73b0\u4e0d\u4f73\u3002\u7531\u4e8e\u5176\u96f6\u4f9d\u8d56\u7684\u7b80\u5355\u6027\uff0c\u5b83\u4ecd\u7136\u88ab\u5e7f\u6cdb\u7528\u4f5c\u57fa\u7ebf\u3002
Silero VAD\uff08Silero Team\uff0c2021\uff09\u662f\u751f\u4ea7\u73af\u5883\u4e2d\u7684\u4e8b\u5b9e\u6807\u51c6\u795e\u7ecf VAD\u3002\u5176\u67b6\u6784\u662f\u4e00\u4e2a\u5c0f\u578b\u6df1\u5ea6\u53ef\u5206\u79bb\u4e00\u7ef4\u5377\u79ef\u5806\u53e0\uff08\u7b2c 08 \u7ae0\u7684 MobileNet \u601d\u8def\u5e94\u7528\u4e8e\u97f3\u9891\uff09\uff0c\u540e\u8ddf\u4e00\u4e2a\u7528\u4e8e\u65f6\u95f4\u4e0a\u4e0b\u6587\u7684\u5355\u5c42 LSTM\uff0c\u6700\u540e\u662f\u4e00\u4e2a\u7ebf\u6027\u5934\u4ea7\u751f\u6bcf\u5e27\u7684\u8bed\u97f3\u6982\u7387\u3002\u6574\u4e2a\u6a21\u578b\u5c0f\u4e8e 2MB\uff08\u7ea6 1M \u53c2\u6570\uff09\uff0c\u4ee5 30-100 ms \u5757\u5904\u7406\u97f3\u9891\u3002
\u58f0\u5b66\u6d3b\u52a8\u68c0\u6d4b\uff08AAD\uff09\u5c06 VAD \u6cdb\u5316\u4e3a\u68c0\u6d4b\u4efb\u4f55\u58f0\u5b66\u6d3b\u52a8\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u8bed\u97f3\u3002\u8fd9\u5728\u667a\u80fd\u5bb6\u5c45\u8bbe\u5907\u3001\u5b89\u9632\u7cfb\u7edf\u548c\u91ce\u751f\u52a8\u7269\u76d1\u6d4b\u4e2d\u5f88\u6709\u7528\u3002AAD \u6a21\u578b\u68c0\u6d4b\u8bf8\u5982\u73bb\u7483\u7834\u788e\u3001\u72d7\u53eb\u6216\u8b66\u62a5\u7b49\u4e8b\u4ef6\uff0c\u901a\u5e38\u4f7f\u7528\u6587\u4ef6 04 \u4e2d\u63cf\u8ff0\u7684\u97f3\u9891\u5206\u7c7b\u6846\u67b6\u3002
TTS \u8bc4\u4f30\u6307\u6807\u8861\u91cf\u5ba2\u89c2\u8d28\u91cf\u548c\u4e3b\u89c2\u81ea\u7136\u5ea6\uff1a
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u751f\u6210\u5408\u6210\u6ce2\u5f62\uff08\u6a21\u62df\u5143\u97f3\u7684\u8c10\u6ce2\u4e4b\u548c\uff09\nsr = 16000\nduration = 1.0\nt = jnp.linspace(0, duration, int(sr * duration))\nf0 = 220.0 # \u57fa\u9891\nwaveform = (\n 0.6 * jnp.sin(2 * jnp.pi * f0 * t) +\n 0.3 * jnp.sin(2 * jnp.pi * 2 * f0 * t) +\n 0.1 * jnp.sin(2 * jnp.pi * 3 * f0 * t)\n)\n\n# \u8ba1\u7b97 STFT\nn_fft = 1024\nhop_length = 256\nwindow = jnp.hanning(n_fft)\n\ndef stft(signal, n_fft, hop_length, window):\n \"\"\"\u8ba1\u7b97\u77ed\u65f6\u5085\u91cc\u53f6\u53d8\u6362\u3002\"\"\"\n n_frames = 1 + (len(signal) - n_fft) // hop_length\n frames = jnp.stack([\n signal[i * hop_length : i * hop_length + n_fft] * window\n for i in range(n_frames)\n ])\n return jnp.fft.rfft(frames, n=n_fft)\n\ndef istft(stft_matrix, hop_length, window, length):\n \"\"\"\u4f7f\u7528\u91cd\u53e0\u76f8\u52a0\u6cd5\u8ba1\u7b97\u9006 STFT\u3002\"\"\"\n n_fft = (stft_matrix.shape[1] - 1) * 2\n n_frames = stft_matrix.shape[0]\n frames = jnp.fft.irfft(stft_matrix, n=n_fft)\n frames = frames * window[None, :]\n output = jnp.zeros(length)\n for i in range(n_frames):\n start = i * hop_length\n end = start + n_fft\n if end <= length:\n output = output.at[start:end].add(frames[i])\n return output\n\n# \u6b63\u5411 STFT\nS = stft(waveform, n_fft, hop_length, window)\nmagnitude = jnp.abs(S)\n\n# \u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\nn_mels = 80\nmel_low = 0.0\nmel_high = 2595 * jnp.log10(1 + (sr / 2) / 700)\nmel_points = jnp.linspace(mel_low, mel_high, n_mels + 2)\nhz_points = 700 * (10 ** (mel_points / 2595) - 1)\nfreq_bins = jnp.floor((n_fft + 1) * hz_points / sr).astype(int)\n\nmel_filterbank = jnp.zeros((n_mels, n_fft // 2 + 1))\nfor m in range(n_mels):\n f_left = freq_bins[m]\n f_center = freq_bins[m + 1]\n f_right = freq_bins[m + 2]\n for k in range(f_left, f_center):\n mel_filterbank = mel_filterbank.at[m, k].set(\n (k - f_left) / max(f_center - f_left, 1)\n )\n for k in range(f_center, f_right):\n mel_filterbank = mel_filterbank.at[m, k].set(\n (f_right - k) / max(f_right - f_center, 1)\n )\n\n# \u8f6c\u5230\u6885\u5c14\u5e76\u8fd4\u56de\uff08\u4f2a\u9006\uff09\nmel_spec = magnitude @ mel_filterbank.T\nmagnitude_reconstructed = mel_spec @ jnp.linalg.pinv(mel_filterbank.T)\nmagnitude_reconstructed = jnp.maximum(magnitude_reconstructed, 1e-7)\n\n# Griffin-Lim \u7b97\u6cd5\ndef griffin_lim(magnitude, n_iter, hop_length, window, signal_length):\n \"\"\"\u8fed\u4ee3\u76f8\u4f4d\u91cd\u6784\u3002\"\"\"\n n_fft = (magnitude.shape[1] - 1) * 2\n key = jax.random.PRNGKey(42)\n phase = jax.random.uniform(key, magnitude.shape, minval=-jnp.pi, maxval=jnp.pi)\n\n for _ in range(n_iter):\n complex_spec = magnitude * jnp.exp(1j * phase)\n signal = istft(complex_spec, hop_length, window, signal_length)\n reanalysis = stft(signal, n_fft, hop_length, window)\n phase = jnp.angle(reanalysis)\n\n complex_spec = magnitude * jnp.exp(1j * phase)\n return istft(complex_spec, hop_length, window, signal_length)\n\nreconstructed = griffin_lim(magnitude_reconstructed, n_iter=60, hop_length=hop_length,\n window=window, signal_length=len(waveform))\n\n# \u7ed8\u5236\u5bf9\u6bd4\u56fe\nfig, axes = plt.subplots(3, 1, figsize=(12, 8))\n\naxes[0].plot(t[:1000], waveform[:1000], color='#3498db', linewidth=0.8)\naxes[0].set_title('\u539f\u59cb\u6ce2\u5f62')\naxes[0].set_ylabel('\u632f\u5e45')\n\naxes[1].imshow(jnp.log1p(mel_spec.T), aspect='auto', origin='lower', cmap='magma')\naxes[1].set_title('\u6885\u5c14\u8bed\u8c31\u56fe\uff08\u4e2d\u95f4\u8868\u793a\uff09')\naxes[1].set_ylabel('\u6885\u5c14\u9891\u5e26')\n\naxes[2].plot(t[:1000], reconstructed[:1000], color='#e74c3c', linewidth=0.8)\naxes[2].set_title('Griffin-Lim \u91cd\u6784\u6ce2\u5f62\uff0860 \u6b21\u8fed\u4ee3\uff09')\naxes[2].set_xlabel('\u65f6\u95f4 (\u79d2)')\naxes[2].set_ylabel('\u632f\u5e45')\n\nplt.tight_layout()\nplt.show()\n\n# \u6d4b\u91cf\u91cd\u6784\u8bef\u5dee\nmse = jnp.mean((waveform[:len(reconstructed)] - reconstructed[:len(waveform)]) ** 2)\nprint(f\"\u539f\u59cb\u4e0e\u91cd\u6784\u4e4b\u95f4\u7684 MSE\uff1a{mse:.6f}\")\nprint(\"\u6ce8\u610f\uff1a\u901a\u8fc7\u6885\u5c14\u53cd\u6f14\u5bfc\u81f4\u7684\u76f8\u4f4d\u4fe1\u606f\u4e22\u5931\u4f1a\u5f15\u8d77\u4f2a\u5f71\u3002\")\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# \u6a21\u62df\u5e26\u771f\u5b9e\u65f6\u957f\u7684\u97f3\u7d20\u5e8f\u5217\n# \u5728\u771f\u5b9e TTS \u4e2d\uff0c\u65f6\u957f\u6765\u81ea\u5f3a\u5236\u5bf9\u9f50\u6216\u6559\u5e08\u6ce8\u610f\u529b\ndef generate_synthetic_data(key, n_samples=200, max_phonemes=30, embed_dim=64):\n \"\"\"\u751f\u6210\u5408\u6210\u97f3\u7d20\u5d4c\u5165\u548c\u65f6\u957f\u3002\"\"\"\n keys = jr.split(key, 4)\n lengths = jr.randint(keys[0], (n_samples,), 5, max_phonemes)\n\n all_embeddings = []\n all_durations = []\n all_masks = []\n\n for i in range(n_samples):\n L = int(lengths[i])\n emb = jr.normal(keys[1], (max_phonemes, embed_dim))\n # \u65f6\u957f\uff1a\u5143\u97f3\uff08\u5076\u6570\u7d22\u5f15\uff09\u8f83\u957f\uff0c\u8f85\u97f3\u8f83\u77ed\n base_dur = jnp.where(jnp.arange(max_phonemes) % 2 == 0, 8.0, 4.0)\n noise = jr.normal(jr.fold_in(keys[2], i), (max_phonemes,)) * 1.5\n dur = jnp.clip(base_dur + noise, 1.0, 20.0).astype(jnp.float32)\n mask = (jnp.arange(max_phonemes) < L).astype(jnp.float32)\n\n all_embeddings.append(emb)\n all_durations.append(dur * mask)\n all_masks.append(mask)\n\n return (jnp.stack(all_embeddings), jnp.stack(all_durations),\n jnp.stack(all_masks))\n\nkey = jr.PRNGKey(42)\nembeddings, durations, masks = generate_synthetic_data(key)\n\n# \u65f6\u957f\u9884\u6d4b\u5668\uff1a2 \u5c42\u4e00\u7ef4\u5377\u79ef + \u7ebf\u6027\u6295\u5f71\ndef init_duration_predictor(key, embed_dim=64, hidden_dim=128, kernel_size=3):\n \"\"\"\u521d\u59cb\u5316\u65f6\u957f\u9884\u6d4b\u5668\u6743\u91cd\u3002\"\"\"\n keys = jr.split(key, 4)\n scale1 = jnp.sqrt(2.0 / (embed_dim * kernel_size))\n scale2 = jnp.sqrt(2.0 / (hidden_dim * kernel_size))\n params = {\n 'conv1_w': jr.normal(keys[0], (kernel_size, embed_dim, hidden_dim)) * scale1,\n 'conv1_b': jnp.zeros(hidden_dim),\n 'conv2_w': jr.normal(keys[1], (kernel_size, hidden_dim, hidden_dim)) * scale2,\n 'conv2_b': jnp.zeros(hidden_dim),\n 'linear_w': jr.normal(keys[2], (hidden_dim, 1)) * jnp.sqrt(2.0 / hidden_dim),\n 'linear_b': jnp.zeros(1),\n }\n return params\n\ndef duration_predictor(params, x):\n \"\"\"\u4ece\u97f3\u7d20\u5d4c\u5165\u9884\u6d4b\u5bf9\u6570\u65f6\u957f\u3002x: (batch, seq, embed)\u3002\"\"\"\n # \u5377\u79ef\u5c42 1 \u52a0 ReLU\n h = jax.lax.conv_general_dilated(\n x.transpose(0, 2, 1), # (batch, embed, seq)\n params['conv1_w'].transpose(2, 1, 0), # (out, in, kernel)\n window_strides=(1,), padding='SAME'\n ).transpose(0, 2, 1) + params['conv1_b'] # \u56de\u5230 (batch, seq, hidden)\n h = jax.nn.relu(h)\n\n # \u5377\u79ef\u5c42 2 \u52a0 ReLU\n h = jax.lax.conv_general_dilated(\n h.transpose(0, 2, 1),\n params['conv2_w'].transpose(2, 1, 0),\n window_strides=(1,), padding='SAME'\n ).transpose(0, 2, 1) + params['conv2_b']\n h = jax.nn.relu(h)\n\n # \u7ebf\u6027\u6295\u5f71\u5230\u6807\u91cf\n log_dur = (h @ params['linear_w'] + params['linear_b']).squeeze(-1)\n return log_dur\n\n# \u635f\u5931\uff1a\u5bf9\u6570\u65f6\u957f\u7684 MSE\uff08FastSpeech \u4e2d\u7684\u6807\u51c6\u505a\u6cd5\uff09\ndef loss_fn(params, embeddings, durations, masks):\n log_dur_pred = duration_predictor(params, embeddings)\n log_dur_true = jnp.log(jnp.clip(durations, 1.0, None))\n sq_err = (log_dur_pred - log_dur_true) ** 2 * masks\n return jnp.sum(sq_err) / jnp.sum(masks)\n\ngrad_fn = jax.jit(jax.value_and_grad(loss_fn))\n\n# \u8bad\u7ec3\u5faa\u73af\nparams = init_duration_predictor(jr.PRNGKey(0))\nlr = 1e-3\nlosses = []\n\nfor epoch in range(300):\n loss_val, grads = grad_fn(params, embeddings, durations, masks)\n params = jax.tree.map(lambda p, g: p - lr * g, params, grads)\n losses.append(float(loss_val))\n\n# \u5728\u4e00\u4e2a\u6837\u672c\u4e0a\u8bc4\u4f30\nlog_dur_pred = duration_predictor(params, embeddings[:1])\ndur_pred = jnp.exp(log_dur_pred[0])\ndur_true = durations[0]\nmask = masks[0]\nvalid_len = int(jnp.sum(mask))\n\nfig, axes = plt.subplots(1, 2, figsize=(14, 5))\n\naxes[0].plot(losses, color='#3498db', linewidth=1.5)\naxes[0].set_xlabel('\u8f6e\u6b21')\naxes[0].set_ylabel('MSE \u635f\u5931\uff08\u5bf9\u6570\u65f6\u957f\uff09')\naxes[0].set_title('\u65f6\u957f\u9884\u6d4b\u5668\u8bad\u7ec3')\naxes[0].set_yscale('log')\n\nx_pos = jnp.arange(valid_len)\nwidth = 0.35\naxes[1].bar(x_pos - width/2, dur_true[:valid_len], width, color='#27ae60',\n label='\u771f\u5b9e\u503c', alpha=0.8)\naxes[1].bar(x_pos + width/2, dur_pred[:valid_len], width, color='#e74c3c',\n label='\u9884\u6d4b\u503c', alpha=0.8)\naxes[1].set_xlabel('\u97f3\u7d20\u7d22\u5f15')\naxes[1].set_ylabel('\u65f6\u957f\uff08\u5e27\uff09')\naxes[1].set_title('\u65f6\u957f\u9884\u6d4b\u4e0e\u771f\u5b9e\u503c\u5bf9\u6bd4')\naxes[1].legend()\n\nplt.tight_layout()\nplt.show()\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\ndef init_residual_block(key, channels, kernel_size, dilation):\n \"\"\"\u521d\u59cb\u5316\u6269\u5f20\u6b8b\u5dee\u5377\u79ef\u5757\u3002\"\"\"\n k1, k2 = jr.split(key)\n scale = jnp.sqrt(2.0 / (channels * kernel_size))\n return {\n 'conv1_w': jr.normal(k1, (kernel_size, channels, channels)) * scale,\n 'conv1_b': jnp.zeros(channels),\n 'conv2_w': jr.normal(k2, (kernel_size, channels, channels)) * scale,\n 'conv2_b': jnp.zeros(channels),\n 'dilation': dilation\n }\n\ndef residual_block(params, x):\n \"\"\"x: (batch, time, channels)\u3002\u5e26 LeakyReLU \u7684\u6269\u5f20\u5377\u79ef\u6b8b\u5dee\u5757\u3002\"\"\"\n h = jax.nn.leaky_relu(x, negative_slope=0.1)\n # \u7b80\u5316\uff1a\u4f7f\u7528\u6807\u51c6\u5377\u79ef\uff08\u6269\u5f20\u5728\u6982\u5ff5\u4e0a\u5904\u7406\uff09\n h = jax.lax.conv_general_dilated(\n h.transpose(0, 2, 1),\n params['conv1_w'].transpose(2, 1, 0),\n window_strides=(1,),\n padding='SAME',\n rhs_dilation=(params['dilation'],)\n ).transpose(0, 2, 1) + params['conv1_b']\n h = jax.nn.leaky_relu(h, negative_slope=0.1)\n h = jax.lax.conv_general_dilated(\n h.transpose(0, 2, 1),\n params['conv2_w'].transpose(2, 1, 0),\n window_strides=(1,),\n padding='SAME'\n ).transpose(0, 2, 1) + params['conv2_b']\n return x + h\n\ndef init_generator(key, n_mels=80, upsample_rates=(8, 8, 4),\n channels=128):\n \"\"\"\u521d\u59cb\u5316\u6700\u5c0f\u5316\u7684 HiFi-GAN \u98ce\u683c\u751f\u6210\u5668\u3002\"\"\"\n keys = jr.split(key, 10)\n params = {}\n\n # \u8f93\u5165\u6295\u5f71\uff1a\u6885\u5c14\u9891\u5e26 -> \u901a\u9053\n params['input_w'] = jr.normal(keys[0], (7, n_mels, channels)) * 0.02\n params['input_b'] = jnp.zeros(channels)\n\n # \u4e0a\u91c7\u6837\u5757\uff08\u8f6c\u7f6e\u5377\u79ef\uff09\n in_ch = channels\n for i, rate in enumerate(upsample_rates):\n k_size = rate * 2\n scale = jnp.sqrt(2.0 / (in_ch * k_size))\n out_ch = in_ch // 2\n params[f'up{i}_w'] = jr.normal(keys[i+1], (k_size, in_ch, out_ch)) * scale\n params[f'up{i}_b'] = jnp.zeros(out_ch)\n # \u6bcf\u4e2a\u5c3a\u5ea6\u4e0b\u7684\u6b8b\u5dee\u5757\n params[f'res{i}_0'] = init_residual_block(jr.fold_in(keys[i+4], 0),\n out_ch, 3, 1)\n params[f'res{i}_1'] = init_residual_block(jr.fold_in(keys[i+4], 1),\n out_ch, 3, 3)\n in_ch = out_ch\n\n # \u8f93\u51fa\u6295\u5f71\u5230\u5355\u58f0\u9053\u6ce2\u5f62\n params['output_w'] = jr.normal(keys[8], (7, in_ch, 1)) * 0.02\n params['output_b'] = jnp.zeros(1)\n params['upsample_rates'] = upsample_rates\n\n return params\n\ndef generator_forward(params, mel):\n \"\"\"mel: (batch, time, n_mels) -> waveform: (batch, time * prod(rates), 1)\u3002\"\"\"\n # \u8f93\u5165\u6295\u5f71\n h = jax.lax.conv_general_dilated(\n mel.transpose(0, 2, 1),\n params['input_w'].transpose(2, 1, 0),\n window_strides=(1,), padding='SAME'\n ).transpose(0, 2, 1) + params['input_b']\n\n for i, rate in enumerate(params['upsample_rates']):\n h = jax.nn.leaky_relu(h, negative_slope=0.1)\n # \u901a\u8fc7\u8f6c\u7f6e\u5377\u79ef\u4e0a\u91c7\u6837\n k_size = rate * 2\n h = jax.lax.conv_transpose(\n h.transpose(0, 2, 1),\n params[f'up{i}_w'].transpose(2, 1, 0),\n strides=(rate,),\n padding='SAME'\n ).transpose(0, 2, 1) + params[f'up{i}_b']\n # \u6b8b\u5dee\u5757\n h = residual_block(params[f'res{i}_0'], h)\n h = residual_block(params[f'res{i}_1'], h)\n\n h = jax.nn.leaky_relu(h, negative_slope=0.1)\n out = jax.lax.conv_general_dilated(\n h.transpose(0, 2, 1),\n params['output_w'].transpose(2, 1, 0),\n window_strides=(1,), padding='SAME'\n ).transpose(0, 2, 1) + params['output_b']\n\n return jnp.tanh(out)\n\n# \u521b\u5efa\u4e00\u4e2a\u5408\u6210\u6885\u5c14\u8bed\u8c31\u56fe\uff08\u6a21\u62df\u5143\u97f3\uff09\nn_mels = 80\nn_frames = 50\nmel = jnp.zeros((1, n_frames, n_mels))\n# \u5728\u4f4e\u9891\u6885\u5c14\u9891\u5e26\u4e2d\u6dfb\u52a0\u80fd\u91cf\uff08\u6a21\u62df\u5171\u632f\u5cf0\uff09\nmel = mel.at[:, :, 5:15].set(1.0)\nmel = mel.at[:, :, 20:25].set(0.6)\n\n# \u521d\u59cb\u5316\u5e76\u8fd0\u884c\u751f\u6210\u5668\nkey = jr.PRNGKey(42)\nparams = init_generator(key, n_mels=n_mels, upsample_rates=(8, 8, 4),\n channels=128)\nwaveform = generator_forward(params, mel)\n\nprint(f\"\u8f93\u5165\u6885\u5c14\u5f62\u72b6\uff1a{mel.shape}\")\nprint(f\"\u8f93\u51fa\u6ce2\u5f62\u5f62\u72b6\uff1a{waveform.shape}\")\nprint(f\"\u4e0a\u91c7\u6837\u56e0\u5b50\uff1a{8 * 8 * 4} = {8*8*4}x\")\n\nfig, axes = plt.subplots(2, 1, figsize=(12, 6))\n\naxes[0].imshow(mel[0].T, aspect='auto', origin='lower', cmap='magma')\naxes[0].set_title('\u8f93\u5165\u6885\u5c14\u8bed\u8c31\u56fe')\naxes[0].set_ylabel('\u6885\u5c14\u9891\u5e26')\naxes[0].set_xlabel('\u5e27')\n\nwaveform_np = waveform[0, :, 0]\naxes[1].plot(waveform_np[:2000], color='#9b59b6', linewidth=0.5)\naxes[1].set_title('\u751f\u6210\u5668\u8f93\u51fa\u6ce2\u5f62\uff08\u672a\u7ecf\u8bad\u7ec3 - \u968f\u673a\u566a\u58f0\uff09')\naxes[1].set_ylabel('\u632f\u5e45')\naxes[1].set_xlabel('\u6837\u672c')\n\nplt.tight_layout()\nplt.show()\nprint(\"\u6ce8\u610f\uff1a\u8f93\u51fa\u662f\u566a\u58f0\uff0c\u56e0\u4e3a\u751f\u6210\u5668\u672a\u7ecf\u8bad\u7ec3\u3002\")\nprint(\"\u5728\u5b9e\u8df5\u4e2d\uff0c\u5bf9\u6297\u635f\u5931 + \u6885\u5c14\u635f\u5931\u8bad\u7ec3\u4f1a\u5c06\u5176\u5851\u9020\u6210\u8bed\u97f3\u3002\")\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# \u751f\u6210\u5408\u6210\u5bf9\u6570\u6885\u5c14\u80fd\u91cf\u7279\u5f81\u53ca\u8bed\u97f3/\u9759\u97f3\u6807\u7b7e\ndef generate_vad_data(key, n_sequences=100, n_frames=200, n_features=40):\n \"\"\"\u6a21\u62df\u5bf9\u6570\u6885\u5c14\u7279\u5f81\uff1a\u8bed\u97f3\u533a\u57df\u80fd\u91cf\u66f4\u9ad8\u4e14\u5177\u6709\u7ed3\u6784\u3002\"\"\"\n keys = jr.split(key, 5)\n all_features = []\n all_labels = []\n\n for i in range(n_sequences):\n k = jr.fold_in(keys[0], i)\n k1, k2, k3 = jr.split(k, 3)\n\n # \u968f\u673a\u8bed\u97f3/\u9759\u97f3\u6a21\u5f0f\n label = jnp.zeros(n_frames)\n n_segments = jr.randint(k1, (), 2, 6)\n for seg in range(int(n_segments)):\n start = jr.randint(jr.fold_in(k2, seg), (), 0, n_frames - 20)\n length = jr.randint(jr.fold_in(k3, seg), (), 10, 50)\n end = jnp.minimum(start + length, n_frames)\n label = label.at[int(start):int(end)].set(1.0)\n\n # \u7279\u5f81\uff1a\u8bed\u97f3\u5e27\u5177\u6709\u66f4\u9ad8\u80fd\u91cf + \u9891\u8c31\u7ed3\u6784\n noise = jr.normal(jr.fold_in(keys[1], i), (n_frames, n_features)) * 0.3\n speech_pattern = jnp.outer(label, jnp.exp(-jnp.arange(n_features) / 15.0))\n features = speech_pattern * 2.0 + noise + 0.1\n\n all_features.append(features)\n all_labels.append(label)\n\n return jnp.stack(all_features), jnp.stack(all_labels)\n\nkey = jr.PRNGKey(123)\nfeatures, labels = generate_vad_data(key)\ntrain_features, train_labels = features[:80], labels[:80]\ntest_features, test_labels = features[80:], labels[80:]\n\n# \u57fa\u4e8e GRU \u7684\u7b80\u5355 VAD \u6a21\u578b\ndef init_vad_model(key, input_dim=40, hidden_dim=64):\n keys = jr.split(key, 6)\n scale_ih = jnp.sqrt(2.0 / input_dim)\n scale_hh = jnp.sqrt(2.0 / hidden_dim)\n return {\n 'W_z': jr.normal(keys[0], (input_dim, hidden_dim)) * scale_ih,\n 'U_z': jr.normal(keys[1], (hidden_dim, hidden_dim)) * scale_hh,\n 'b_z': jnp.zeros(hidden_dim),\n 'W_r': jr.normal(keys[2], (input_dim, hidden_dim)) * scale_ih,\n 'U_r': jr.normal(keys[3], (hidden_dim, hidden_dim)) * scale_hh,\n 'b_r': jnp.zeros(hidden_dim),\n 'W_h': jr.normal(keys[4], (input_dim, hidden_dim)) * scale_ih,\n 'U_h': jr.normal(keys[5], (hidden_dim, hidden_dim)) * scale_hh,\n 'b_h': jnp.zeros(hidden_dim),\n 'W_out': jr.normal(jr.fold_in(keys[0], 99), (hidden_dim, 1)) * 0.1,\n 'b_out': jnp.zeros(1),\n }\n\ndef gru_step(params, h, x):\n \"\"\"\u5355\u6b65 GRU\u3002\"\"\"\n z = jax.nn.sigmoid(x @ params['W_z'] + h @ params['U_z'] + params['b_z'])\n r = jax.nn.sigmoid(x @ params['W_r'] + h @ params['U_r'] + params['b_r'])\n h_tilde = jnp.tanh(x @ params['W_h'] + (r * h) @ params['U_h'] + params['b_h'])\n h_new = (1 - z) * h + z * h_tilde\n return h_new\n\ndef vad_forward(params, x):\n \"\"\"x: (batch, time, features) -> logits: (batch, time)\u3002\"\"\"\n batch_size, n_frames, _ = x.shape\n hidden_dim = params['W_z'].shape[1]\n h = jnp.zeros((batch_size, hidden_dim))\n\n outputs = []\n for t in range(n_frames):\n h = gru_step(params, h, x[:, t, :])\n logit = (h @ params['W_out'] + params['b_out']).squeeze(-1)\n outputs.append(logit)\n\n return jnp.stack(outputs, axis=1)\n\ndef bce_loss(params, features, labels):\n \"\"\"VAD \u7684\u4e8c\u5143\u4ea4\u53c9\u71b5\u635f\u5931\u3002\"\"\"\n logits = vad_forward(params, features)\n probs = jax.nn.sigmoid(logits)\n probs = jnp.clip(probs, 1e-7, 1 - 1e-7)\n loss = -(labels * jnp.log(probs) + (1 - labels) * jnp.log(1 - probs))\n return jnp.mean(loss)\n\ngrad_fn = jax.jit(jax.value_and_grad(bce_loss))\n\n# \u8bad\u7ec3\nparams = init_vad_model(jr.PRNGKey(0))\nlr = 5e-3\nlosses = []\n\nfor epoch in range(200):\n loss_val, grads = grad_fn(params, train_features, train_labels)\n params = jax.tree.map(lambda p, g: p - lr * g, params, grads)\n losses.append(float(loss_val))\n if epoch % 50 == 0:\n print(f\"\u8f6e\u6b21 {epoch}\uff1a\u635f\u5931 = {loss_val:.4f}\")\n\n# \u5728\u6d4b\u8bd5\u96c6\u4e0a\u8bc4\u4f30\ntest_logits = vad_forward(params, test_features)\ntest_preds = (jax.nn.sigmoid(test_logits) > 0.5).astype(jnp.float32)\naccuracy = jnp.mean(test_preds == test_labels)\nprint(f\"\\n\u6d4b\u8bd5\u51c6\u786e\u7387\uff1a{accuracy:.4f}\")\n\n# \u53ef\u89c6\u5316\u4e00\u4e2a\u6d4b\u8bd5\u793a\u4f8b\nidx = 0\nfig, axes = plt.subplots(3, 1, figsize=(14, 7))\n\naxes[0].imshow(test_features[idx].T, aspect='auto', origin='lower', cmap='magma')\naxes[0].set_title('\u5bf9\u6570\u6885\u5c14\u80fd\u91cf\u7279\u5f81')\naxes[0].set_ylabel('\u6885\u5c14\u9891\u5e26')\n\naxes[1].fill_between(range(200), test_labels[idx], alpha=0.4, color='#27ae60',\n label='\u771f\u5b9e\u503c')\naxes[1].plot(jax.nn.sigmoid(test_logits[idx]), color='#e74c3c',\n linewidth=1.5, label='\u9884\u6d4b\u6982\u7387')\naxes[1].axhline(0.5, color='gray', linestyle='--', linewidth=0.8)\naxes[1].set_ylabel('\u8bed\u97f3\u6982\u7387')\naxes[1].legend()\naxes[1].set_title('VAD \u9884\u6d4b')\n\naxes[2].fill_between(range(200), test_labels[idx], alpha=0.4, color='#27ae60',\n label='\u771f\u5b9e\u503c')\naxes[2].fill_between(range(200), test_preds[idx], alpha=0.4, color='#f39c12',\n label='\u9884\u6d4b\uff08\u9608\u503c=0.5\uff09')\naxes[2].set_ylabel('\u8bed\u97f3 / \u9759\u97f3')\naxes[2].set_xlabel('\u5e27')\naxes[2].legend()\naxes[2].set_title('VAD \u4e8c\u503c\u51b3\u7b56')\n\nplt.tight_layout()\nplt.show()\n"},{"location":"chapter%2009%3A%20audio%20and%20speech/04.%20speaker%20and%20audio%20analysis/","title":"\u8bf4\u8bdd\u4eba\u4e0e\u97f3\u9891\u5206\u6790","text":"\u8bf4\u8bdd\u4eba\u4e0e\u97f3\u9891\u5206\u6790\u8bc6\u522b\u8c01\u5728\u8bf4\u8bdd\u3001\u4f55\u65f6\u8bf4\u8bdd\u4ee5\u53ca\u5b58\u5728\u54ea\u4e9b\u975e\u8bed\u8a00\u58f0\u97f3\u3002\u672c\u6587\u6db5\u76d6\u8bf4\u8bdd\u4eba\u786e\u8ba4\u4e0e\u8bc6\u522b\u3001i\u5411\u91cf\u3001d\u5411\u91cf\u3001x\u5411\u91cf\u3001\u8bf4\u8bdd\u4eba\u65e5\u5fd7\u3001\u97f3\u9891\u4e8b\u4ef6\u5206\u7c7b\u3001\u97f3\u4e50\u4fe1\u606f\u68c0\u7d22\u4ee5\u53ca\u8bed\u97f3\u60c5\u611f\u8bc6\u522b\u3002
\u5728\u6587\u4ef6 01 \u4e2d\uff0c\u6211\u4eec\u6784\u5efa\u4e86\u4fe1\u53f7\u5904\u7406\u57fa\u7840\uff1a\u8bed\u8c31\u56fe\u3001MFCC \u548c\u6885\u5c14\u6ee4\u6ce2\u5668\u7ec4\u3002\u5728\u6587\u4ef6 02 \u4e2d\uff0c\u6211\u4eec\u8bc6\u522b\u4e86\u6240\u8bf4\u7684\u5185\u5bb9\u3002\u73b0\u5728\u6211\u4eec\u8981\u95ee\uff1a\u662f\u8c01\u8bf4\u7684\u3001\u4f55\u65f6\u8bf4\u7684\u3001\u4ee5\u53ca\u97f3\u9891\u4e2d\u8fd8\u5728\u53d1\u751f\u4ec0\u4e48\u3002\u8bf4\u8bdd\u4eba\u8bc6\u522b\u3001\u8bf4\u8bdd\u4eba\u65e5\u5fd7\u3001\u97f3\u9891\u5206\u7c7b\u548c\u97f3\u4e50\u5206\u6790\u90fd\u5171\u4eab\u4e00\u6761\u4e3b\u7ebf\uff1a\u5b66\u4e60\u80fd\u591f\u4e3a\u5f53\u524d\u4efb\u52a1\u6355\u6349\u6b63\u786e\u4e0d\u53d8\u6027\u7684\u7d27\u51d1\u5d4c\u5165\uff0c\u8fd9\u4e0e\u7b2c 06 \u7ae0\u4e2d\u7684\u5d4c\u5165\u601d\u60f3\u4e00\u8109\u76f8\u627f\u3002
\u53ef\u4ee5\u628a\u8bf4\u8bdd\u4eba\u8bc6\u522b\u60f3\u8c61\u6210\u5728\u7535\u8bdd\u4e2d\u8fa8\u8ba4\u670b\u53cb\u7684\u58f0\u97f3\u3002\u4f60\u4e0d\u9700\u8981\u7406\u89e3\u8bcd\u6c47\uff1b\u67d0\u79cd\u5173\u4e8e\u97f3\u8272\u3001\u8bed\u901f\u548c\u55d3\u97f3\u7279\u8d28\u7684\u4e1c\u897f\u5bf9\u8fd9\u4e2a\u4eba\u6765\u8bf4\u662f\u72ec\u4e00\u65e0\u4e8c\u7684\u3002\u8bf4\u8bdd\u4eba\u8bc6\u522b\u7cfb\u7edf\u5b66\u4f1a\u4ece\u539f\u59cb\u97f3\u9891\u4e2d\u63d0\u53d6\u8fd9\u79cd\"\u58f0\u7eb9\"\uff0c\u5ffd\u7565\u8bf4\u7684\u662f\u4ec0\u4e48\uff0c\u4e13\u6ce8\u4e8e\u600e\u4e48\u8bf4\u7684\u3002
\u8bf4\u8bdd\u4eba\u8bc6\u522b\u662f\u4e24\u7c7b\u76f8\u5173\u4efb\u52a1\u7684\u603b\u79f0\uff1a
\u4e24\u79cd\u4efb\u52a1\u5171\u4eab\u76f8\u540c\u7684\u5e95\u5c42\u8868\u793a\uff1a\u4e00\u4e2a\u56fa\u5b9a\u7ef4\u5ea6\u7684\u8bf4\u8bdd\u4eba\u5d4c\u5165\uff0c\u5b83\u6355\u6349\u8bf4\u8bdd\u4eba\u7684\u8eab\u4efd\u7279\u5f81\u800c\u4e0e\u6240\u8bf4\u5185\u5bb9\u65e0\u5173\u3002\u533a\u522b\u4ec5\u5728\u4e8e\u51b3\u7b56\u9636\u6bb5\uff1a\u786e\u8ba4\u6bd4\u8f83\u4e24\u4e2a\u5d4c\u5165\uff0c\u8bc6\u522b\u5219\u5728\u5019\u9009\u5d4c\u5165\u4e2d\u627e\u5230\u6700\u8fd1\u90bb\u3002
\u4f59\u5f26\u76f8\u4f3c\u5ea6\u662f\u6bd4\u8f83\u8bf4\u8bdd\u4eba\u5d4c\u5165\u7684\u6807\u51c6\u5ea6\u91cf\u3002\u7ed9\u5b9a\u6ce8\u518c\u5d4c\u5165 \\(e\\) \u548c\u6d4b\u8bd5\u5d4c\u5165 \\(t\\)\uff1a
\u9608\u503c \\(\\theta\\) \u51b3\u5b9a\u63a5\u53d7/\u62d2\u7edd\u51b3\u7b56\uff1a\u82e5 \\(s > \\theta\\)\uff0c\u5219\u63a5\u53d7\u3002\u9608\u503c\u5728\u9519\u8bef\u63a5\u53d7\u7387\uff08FAR\uff09\u548c\u9519\u8bef\u62d2\u7edd\u7387\uff08FRR\uff09\u4e4b\u95f4\u6743\u8861\u3002\u7b49\u9519\u8bef\u7387\uff08EER\uff09\uff0c\u5373 FAR = FRR \u65f6\u7684\u503c\uff0c\u662f\u6807\u51c6\u8bc4\u4f30\u6307\u6807\u3002EER \u8d8a\u4f4e\u8868\u793a\u6027\u80fd\u8d8a\u597d\u3002\u6700\u5148\u8fdb\u7684\u7cfb\u7edf\u5728\u6807\u51c6\u57fa\u51c6\uff08VoxCeleb\uff09\u4e0a\u53ef\u5b9e\u73b0\u4f4e\u4e8e 1% \u7684 EER\u3002
i\u5411\u91cf\uff08Dehak \u7b49\u4eba\uff0c2010\uff09\u662f\u6df1\u5ea6\u5b66\u4e60\u4e4b\u524d\u4e3b\u5bfc\u6027\u7684\u8bf4\u8bdd\u4eba\u5d4c\u5165\u65b9\u6cd5\u3002\u5176\u601d\u60f3\u6e90\u4e8e\u56e0\u5b50\u5206\u6790\uff08\u7b2c 02 \u7ae0\u7684\u77e9\u9635\u5206\u89e3\u548c\u7b2c 04 \u7ae0\u7684\u964d\u7ef4\uff09\u3002\u4e00\u4e2a\u901a\u7528\u80cc\u666f\u6a21\u578b\uff08UBM\uff09\u2014\u2014\u57fa\u4e8e\u591a\u6837\u672c\u8bf4\u8bdd\u4eba\u8bad\u7ec3\u7684\u5927\u578b GMM\u2014\u2014\u5b9a\u4e49\u4e86\u4e00\u4e2a\u8d85\u5411\u91cf\u7a7a\u95f4\u3002\u6bcf\u6761\u8bed\u97f3\u7684 GMM \u8d85\u5411\u91cf\u88ab\u6295\u5f71\u5230\u4f4e\u7ef4\u7684\u5168\u53ef\u53d8\u6027\u7a7a\u95f4\uff1a
\u5176\u4e2d \\(M\\) \u662f\u8be5\u8bed\u97f3\u7684 GMM \u8d85\u5411\u91cf\uff0c\\(m\\) \u662f UBM \u5747\u503c\u8d85\u5411\u91cf\uff0c\\(T\\) \u662f\u5168\u53ef\u53d8\u6027\u77e9\u9635\uff08\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u5f97\u5230\uff09\uff0c\\(w\\) \u662f i \u5411\u91cf\uff0c\u4e00\u4e2a\u4f4e\u7ef4\uff08\u901a\u5e38\u4e3a 400-600 \u7ef4\uff09\u8868\u793a\uff0c\u540c\u65f6\u6355\u6349\u8bf4\u8bdd\u4eba\u53d8\u5f02\u548c\u4fe1\u9053\u53d8\u5f02\u3002
\u4e3a\u4e86\u4ece i \u5411\u91cf\u4e2d\u53bb\u9664\u4fe1\u9053\u53d8\u5f02\uff0c\u6982\u7387\u7ebf\u6027\u5224\u522b\u5206\u6790\uff08PLDA\uff09\u5c06 i \u5411\u91cf\u5efa\u6a21\u4e3a\u8bf4\u8bdd\u4eba\u7279\u5b9a\u6f5c\u53d8\u91cf\u548c\u4fe1\u9053\u7279\u5b9a\u6f5c\u53d8\u91cf\u4e4b\u548c\u3002PLDA \u4e3a\u786e\u8ba4\u4efb\u52a1\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6709\u539f\u5219\u7684\u5bf9\u6570\u4f3c\u7136\u6bd4\u5206\u6570\uff1a
d\u5411\u91cf\uff08Variani \u7b49\u4eba\uff0c2014\uff09\u662f\u7b2c\u4e00\u4e2a\u795e\u7ecf\u8bf4\u8bdd\u4eba\u5d4c\u5165\u3002\u4e00\u4e2a\u4e3a\u8bf4\u8bdd\u4eba\u5206\u7c7b\u8bad\u7ec3\u7684 DNN \u5904\u7406\u5e27\u7ea7\u7279\u5f81\uff0c\u901a\u8fc7\u5bf9\u6574\u6761\u8bed\u97f3\u4e2d\u6700\u540e\u4e00\u5c42\u9690\u85cf\u5c42\u6fc0\u6d3b\u503c\u6c42\u5e73\u5747\uff0c\u63d0\u53d6\u51fa\u56fa\u5b9a\u7ef4\u5ea6\u7684\u8868\u793a\u3002\u867d\u7136\u7b80\u5355\u4f46\u6709\u6548\uff0cd\u5411\u91cf\u8bc1\u660e\u4e86\u795e\u7ecf\u7f51\u7edc\u53ef\u4ee5\u5728\u6ca1\u6709 i \u5411\u91cf\u590d\u6742\u7edf\u8ba1\u673a\u5236\u7684\u60c5\u51b5\u4e0b\u5b66\u4e60\u5230\u8bf4\u8bdd\u4eba\u5224\u522b\u6027\u7279\u5f81\u3002
x\u5411\u91cf\uff08Snyder \u7b49\u4eba\uff0c2018\uff09\u4f7f\u7528\u65f6\u5ef6\u795e\u7ecf\u7f51\u7edc\uff08TDNN\uff09\u67b6\u6784\u663e\u8457\u63a8\u8fdb\u4e86\u795e\u7ecf\u8bf4\u8bdd\u4eba\u5d4c\u5165\u3002TDNN \u662f\u5177\u6709\u7279\u5b9a\u4e0a\u4e0b\u6587\u7a97\u53e3\u7684 1D \u5377\u79ef\uff0c\u4e0e\u6587\u4ef6 03 \u4e2d WaveNet \u7684\u6269\u5f20\u5377\u79ef\u6709\u5173\uff0c\u4f46\u5e94\u7528\u4e8e\u5e27\u7ea7\u7279\u5f81\u800c\u975e\u539f\u59cb\u6ce2\u5f62\u6837\u672c\u3002
\u5176\u4e2d \\(h_t\\) \u662f\u65f6\u95f4 \\(t\\) \u7684\u5e27\u7ea7\u8f93\u51fa\u3002\u62fc\u63a5 \\([\\mu; \\sigma]\\) \u5373\u4e3a\u6c60\u5316\u540e\u7684\u8868\u793a\u3002
x\u5411\u91cf\u4f7f\u7528\u8bf4\u8bdd\u4eba\u8eab\u4efd\u4e0a\u7684\u6807\u51c6\u4ea4\u53c9\u71b5\u635f\u5931\u8fdb\u884c\u8bad\u7ec3\u3002\u5c3d\u7ba1\u662f\u4e3a\u5206\u7c7b\u4efb\u52a1\u8bad\u7ec3\u7684\uff0c\u4f46\u5b66\u4e60\u5230\u7684\u4e2d\u95f4\u8868\u793a\uff08x\u5411\u91cf\uff09\u80fd\u5f88\u597d\u5730\u6cdb\u5316\u5230\u672a\u89c1\u8fc7\u7684\u8bf4\u8bdd\u4eba\uff0c\u56e0\u4e3a\u7f51\u7edc\u5b66\u4e60\u7684\u662f\u63d0\u53d6\u8bf4\u8bdd\u4eba\u5224\u522b\u6027\u7279\u5f81\uff0c\u800c\u975e\u8bb0\u5fc6\u7279\u5b9a\u8bf4\u8bdd\u4eba\u3002
ECAPA-TDNN\uff08Desplanques \u7b49\u4eba\uff0c2020\uff09\u662f\u76ee\u524d\u6700\u5148\u8fdb\u7684\u57fa\u4e8e TDNN \u7684\u8bf4\u8bdd\u4eba\u8bc6\u522b\u67b6\u6784\u3002\u5b83\u5728 x \u5411\u91cf\u57fa\u7840\u4e0a\u5f15\u5165\u4e86\u4e09\u9879\u6539\u8fdb\uff1a
\u5176\u4e2d \\(f\\) \u662f\u4e00\u4e2a\u5c0f\u578b\u795e\u7ecf\u7f51\u7edc\uff0c\\(v\\) \u662f\u4e00\u4e2a\u5b66\u4e60\u5230\u7684\u6ce8\u610f\u529b\u5411\u91cf\u3002\u6ce8\u610f\u529b\u52a0\u6743\u7684\u5747\u503c\u548c\u6807\u51c6\u5dee\u53d8\u4e3a \\(\\tilde{\\mu} = \\sum_t \\alpha_t h_t\\) \u548c \\(\\tilde{\\sigma} = \\sqrt{\\sum_t \\alpha_t (h_t - \\tilde{\\mu})^2}\\)\u3002
ECAPA-TDNN \u901a\u5e38\u4f7f\u7528 AAM-Softmax\uff08\u9644\u52a0\u89d2\u5ea6\u95f4\u9694 Softmax\uff09\u8fdb\u884c\u8bad\u7ec3\uff0c\u5b83\u5728\u5206\u7c7b\u635f\u5931\u4e2d\u6dfb\u52a0\u4e86\u89d2\u5ea6\u95f4\u9694\u60e9\u7f5a\uff0c\u5c06\u540c\u4e00\u8bf4\u8bdd\u4eba\u7684\u5d4c\u5165\u63a8\u5f97\u66f4\u8fd1\uff0c\u4e0d\u540c\u8bf4\u8bdd\u4eba\u7684\u5d4c\u5165\u5728\u8d85\u7403\u9762\u4e0a\u63a8\u5f97\u66f4\u8fdc\uff1a
\u5176\u4e2d \\(\\theta_{y_i}\\) \u662f\u5d4c\u5165\u4e0e\u771f\u5b9e\u7c7b\u522b\u6743\u91cd\u5411\u91cf\u4e4b\u95f4\u7684\u5939\u89d2\uff0c\\(m\\) \u662f\u95f4\u9694\uff08\u901a\u5e38\u4e3a 0.2\uff09\uff0c\\(s\\) \u662f\u7f29\u653e\u56e0\u5b50\uff08\u901a\u5e38\u4e3a 30\uff09\u3002\u8be5\u635f\u5931\u51fd\u6570\u6765\u81ea\u4eba\u8138\u8bc6\u522b\uff08\u7b2c 08 \u7ae0\u7684 ArcFace\uff09\uff0c\u5728\u8bf4\u8bdd\u4eba\u786e\u8ba4\u4e2d\u975e\u5e38\u6709\u6548\u3002
\u8bf4\u8bdd\u4eba\u65e5\u5fd7\u56de\u7b54\u4e86\u591a\u65b9\u5f55\u97f3\u4e2d\"\u8c01\u5728\u4ec0\u4e48\u65f6\u5019\u8bf4\u8bdd\"\u7684\u95ee\u9898\u3002\u53ef\u4ee5\u628a\u8fd9\u60f3\u8c61\u6210\u7ed9\u65f6\u95f4\u7ebf\u4e0a\u8272\uff1a\u6bcf\u79cd\u989c\u8272\u4ee3\u8868\u4e00\u4e2a\u4e0d\u540c\u7684\u8bf4\u8bdd\u4eba\uff0c\u7cfb\u7edf\u5fc5\u987b\u786e\u5b9a\u6bcf\u4e2a\u8bf4\u8bdd\u4eba\u4f55\u65f6\u6d3b\u8dc3\uff0c\u5305\u62ec\u91cd\u53e0\u8bed\u97f3\u7684\u60c5\u51b5\u3002
\u57fa\u4e8e\u805a\u7c7b\u7684\u8bf4\u8bdd\u4eba\u65e5\u5fd7\u662f\u4f20\u7edf\u7684\u6d41\u6c34\u7ebf\u65b9\u6cd5\uff1a
\u8bf4\u8bdd\u4eba\u6570\u91cf\u901a\u5e38\u4e8b\u5148\u672a\u77e5\uff0c\u8fd9\u4f7f\u5f97\u8be5\u95ee\u9898\u6bd4\u6807\u51c6\u805a\u7c7b\u66f4\u56f0\u96be\u3002\u4f7f\u7528\u57fa\u4e8e\u7279\u5f81\u503c\u9608\u503c\u786e\u5b9a \\(k\\) \u7684\u8c31\u805a\u7c7b\u662f\u53e6\u4e00\u79cd\u5e38\u89c1\u65b9\u6cd5\u3002
\u7aef\u5230\u7aef\u795e\u7ecf\u8bf4\u8bdd\u4eba\u65e5\u5fd7\uff08EEND\uff09\uff08Fujita \u7b49\u4eba\uff0c2019\uff09\u5c06\u8bf4\u8bdd\u4eba\u65e5\u5fd7\u6846\u67b6\u5316\u4e3a\u4e00\u4e2a\u591a\u6807\u7b7e\u5206\u7c7b\u95ee\u9898\u3002\u4e00\u4e2a\u795e\u7ecf\u7f51\u7edc\uff08\u901a\u5e38\u662f\u57fa\u4e8e\u81ea\u6ce8\u610f\u529b\u7684\u6a21\u578b\uff0c\u7b2c 07 \u7ae0\u7684 transformer\uff09\u5c06\u6574\u6bb5\u5f55\u97f3\u4f5c\u4e3a\u8f93\u5165\uff0c\u4e3a\u6bcf\u4e00\u5e27\u8f93\u51fa\u6bcf\u4e2a\u8bf4\u8bdd\u4eba\u7684\u4e8c\u5143\u6d3b\u52a8\u6807\u7b7e\u3002\u8fd9\u76f4\u63a5\u5904\u7406\u4e86\u91cd\u53e0\u8bed\u97f3\uff0c\u800c\u8fd9\u662f\u57fa\u4e8e\u805a\u7c7b\u65b9\u6cd5\u7684\u4e3b\u8981\u5f31\u70b9\u3002
EEND \u5bf9 \\(S\\) \u4e2a\u8bf4\u8bdd\u4eba\u5728\u5e27 \\(t\\) \u7684\u8f93\u51fa\u4e3a\uff1a
\u5176\u4e2d \\(h_t\\) \u662f\u5e27 \\(t\\) \u5904\u7684 transformer \u8f93\u51fa\uff0c\\(f_s\\) \u662f\u8bf4\u8bdd\u4eba \\(s\\) \u7684\u7ebf\u6027\u6295\u5f71\u3002\u8bad\u7ec3\u635f\u5931\u662f\u5728\u8bf4\u8bdd\u4eba\u548c\u5e27\u4e0a\u6c42\u548c\u5f97\u5230\u7684\u4e8c\u5143\u4ea4\u53c9\u71b5\u3002\u4e00\u4e2a\u5173\u952e\u6311\u6218\u662f\u8bf4\u8bdd\u4eba\u6570\u91cf\u5fc5\u987b\u56fa\u5b9a\uff0c\u6216\u8005\u4f7f\u7528\u53ef\u53d8\u8f93\u51fa\u67b6\u6784\uff08EEND-EDA \u4f7f\u7528\u5e26\u5438\u5f15\u5b50\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\uff09\u6765\u5904\u7406\u3002
\u7f6e\u6362\u4e0d\u53d8\u8bad\u7ec3\uff08PIT\uff09\u7528\u4e8e\u5904\u7406\u8bf4\u8bdd\u4eba\u65e5\u5fd7\u4e2d\u7684\u6807\u7b7e\u6b67\u4e49\u95ee\u9898\uff1a\u7531\u4e8e\u8bf4\u8bdd\u4eba\u6ca1\u6709\u56fa\u6709\u987a\u5e8f\uff0c\u9700\u8981\u5bf9\u6240\u6709\u53ef\u80fd\u7684\u8bf4\u8bdd\u4eba\u5230\u8f93\u51fa\u5206\u914d\u8ba1\u7b97\u635f\u5931\uff0c\u5e76\u53d6\u6700\u5c0f\u503c\uff08\u8fd9\u4e0e\u6587\u4ef6 05 \u4e2d\u6e90\u5206\u79bb\u4f7f\u7528\u7684 PIT \u76f8\u540c\uff09\u3002
\u97f3\u9891\u5206\u7c7b\u4e3a\u6574\u6bb5\u97f3\u9891\u7247\u6bb5\u5206\u914d\u4e00\u4e2a\u6807\u7b7e\u3002\u4e0e\u8f6c\u5f55\u8bed\u97f3\u7684 ASR\uff08\u6587\u4ef6 02\uff09\u4e0d\u540c\uff0c\u97f3\u9891\u5206\u7c7b\u6db5\u76d6\u66f4\u5e7f\u7684\u8303\u56f4\uff1a\u73af\u5883\u58f0\u97f3\uff08\u8b66\u7b1b\u3001\u96e8\u58f0\u3001\u72d7\u5420\uff09\u3001\u97f3\u4e50\u6d41\u6d3e\uff08\u6447\u6eda\u3001\u7235\u58eb\u3001\u53e4\u5178\uff09\u4ee5\u53ca\u4e00\u822c\u97f3\u9891\u4e8b\u4ef6\u3002
\u6807\u51c6\u65b9\u6cd5\u9075\u5faa\u7b2c 08 \u7ae0\u7684\u56fe\u50cf\u5206\u7c7b\u8303\u5f0f\uff1a\u5c06\u97f3\u9891\u8868\u793a\u4e3a\u8bed\u8c31\u56fe\uff08\u4e00\u4e2a\u4e8c\u7ef4\u65f6\u95f4-\u9891\u7387\u56fe\u50cf\uff09\uff0c\u7136\u540e\u5e94\u7528 CNN \u6216 transformer \u5206\u7c7b\u5668\u3002\u8fd9\u79cd\u8c31\u56fe-\u56fe\u50cf\u65b9\u6cd5\u5229\u7528\u4e86\u8ba1\u7b97\u673a\u89c6\u89c9\u51e0\u5341\u5e74\u6765\u7684\u8fdb\u5c55\u3002
\u73af\u5883\u58f0\u97f3\u5206\u7c7b\uff08ESC\uff09\u4f7f\u7528 ESC-50\uff0850 \u7c7b\uff0c2000 \u4e2a\u7247\u6bb5\uff09\u548c UrbanSound8K \u7b49\u6570\u636e\u96c6\u3002\u5178\u578b\u67b6\u6784\u662f\u5e94\u7528\u4e8e\u5bf9\u6570\u6885\u5c14\u8bed\u8c31\u56fe\u7684 CNN\uff08\u7b2c 06 \u7ae0\uff09\u3002\u6570\u636e\u589e\u5f3a\u81f3\u5173\u91cd\u8981\uff1a\u65f6\u95f4\u62c9\u4f38\u3001\u97f3\u9ad8\u504f\u79fb\u3001\u6dfb\u52a0\u80cc\u666f\u566a\u58f0\u4ee5\u53ca SpecAugment\uff08\u6587\u4ef6 02 \u7684\u63a9\u7801\u65b9\u6cd5\u5e94\u7528\u4e8e\u8bed\u8c31\u56fe\uff09\u90fd\u80fd\u63d0\u5347\u6cdb\u5316\u80fd\u529b\u3002
\u97f3\u9891\u4e8b\u4ef6\u68c0\u6d4b\uff08\u58f0\u97f3\u4e8b\u4ef6\u68c0\u6d4b\uff0cSED\uff09\u662f\u5206\u7c7b\u7684\u65f6\u95f4\u7ef4\u5ea6\u5bf9\u5e94\u4efb\u52a1\uff1a\u4e0d\u4ec5\u4ec5\u8981\u77e5\u9053\u5b58\u5728\u54ea\u4e9b\u4e8b\u4ef6\uff0c\u8fd8\u8981\u77e5\u9053\u5b83\u4eec\u4f55\u65f6\u5f00\u59cb\u548c\u7ed3\u675f\u3002AudioSet\uff08Gemmeke \u7b49\u4eba\uff0c2017\uff09\u662f\u5927\u89c4\u6a21\u57fa\u51c6\uff0c\u5305\u542b 527 \u4e2a\u4e8b\u4ef6\u7c7b\u522b\u548c\u8d85\u8fc7 200 \u4e07\u4e2a\u6765\u81ea YouTube \u7684 10 \u79d2\u7247\u6bb5\uff0c\u6bcf\u4e2a\u7247\u6bb5\u90fd\u6709\u5f31\u6807\u6ce8\uff08\u7247\u6bb5\u7ea7\u6807\u7b7e\uff0c\u800c\u975e\u5e27\u7ea7\uff09\u3002
\u5f31\u76d1\u7763 SED \u5fc5\u987b\u4ece\u7247\u6bb5\u7ea7\u6807\u7b7e\u5b66\u4e60\u5e27\u7ea7\u9884\u6d4b\u3002\u6807\u51c6\u65b9\u6cd5\u4f7f\u7528 CNN \u4ea7\u751f\u5e27\u7ea7\u7c7b\u522b\u6982\u7387\uff0c\u7136\u540e\u901a\u8fc7\u6ce8\u610f\u529b\u6c60\u5316\u805a\u5408\u6210\u7247\u6bb5\u7ea7\u9884\u6d4b\uff1a
\u5176\u4e2d \\(f_{t,c}\\) \u662f\u7c7b\u522b \\(c\\) \u5728\u65f6\u95f4 \\(t\\) \u7684\u5e27\u7ea7 logit\uff0c\\(\\alpha_{t,c}\\) \u662f\u6ce8\u610f\u529b\u6743\u91cd\u3002\u7247\u6bb5\u7ea7\u9884\u6d4b \\(\\hat{Y}_c\\) \u6839\u636e\u7247\u6bb5\u7ea7\u6807\u7b7e\u8fdb\u884c\u8bad\u7ec3\u3002
\u58f0\u5b66\u573a\u666f\u5206\u7c7b\uff08ASC\uff09\u5bf9\u6574\u4f53\u73af\u5883\u8fdb\u884c\u5206\u7c7b\uff1a\"\u673a\u573a\"\u3001\"\u516c\u56ed\"\u3001\"\u5730\u94c1\u7ad9\"\u3001\"\u529e\u516c\u5ba4\"\u3002\u8fd9\u662f\u4e00\u4e2a\u6574\u4f53\u6027\u4efb\u52a1\uff1a\u6a21\u578b\u5fc5\u987b\u6355\u6349\u4e00\u822c\u7684\u58f0\u5b66\u7eb9\u7406\u800c\u975e\u7279\u5b9a\u4e8b\u4ef6\u3002DCASE \u6311\u6218\u7cfb\u5217\u6bcf\u5e74\u5bf9 ASC \u8fdb\u884c\u57fa\u51c6\u6d4b\u8bd5\uff0c\u83b7\u5956\u7cfb\u7edf\u901a\u5e38\u4f7f\u7528\u591a\u5206\u8fa8\u7387\u8bed\u8c31\u56fe\u4e0a\u7684 CNN \u96c6\u6210\u3002
\u97f3\u9891\u5d4c\u5165\u662f\u4ece\u5927\u89c4\u6a21\u97f3\u9891\u6570\u636e\u4e2d\u5b66\u4e60\u5230\u7684\u901a\u7528\u8868\u793a\uff0c\u7c7b\u4f3c\u4e8e\u53ef\u8fc1\u79fb\u5230\u4e0b\u6e38\u4efb\u52a1\u7684\u8bcd\u5d4c\u5165\uff08\u7b2c 07 \u7ae0\uff09\u6216\u56fe\u50cf\u7279\u5f81\uff08\u7b2c 08 \u7ae0\uff09\u3002
VGGish\uff08Hershey \u7b49\u4eba\uff0c2017\uff09\u5c06 VGG \u56fe\u50cf\u5206\u7c7b\u7f51\u7edc\uff08\u7b2c 08 \u7ae0\uff09\u9002\u914d\u5230\u97f3\u9891\u9886\u57df\u3002\u5b83\u901a\u8fc7\u4e00\u4e2a\u5728 AudioSet \u4e0a\u9884\u8bad\u7ec3\u7684\u7c7b VGG CNN \u5904\u7406 0.96 \u79d2\u7684\u5bf9\u6570\u6885\u5c14\u8bed\u8c31\u56fe\u5757\uff0c\u6bcf\u5757\u4ea7\u751f\u4e00\u4e2a 128 \u7ef4\u5d4c\u5165\u3002VGGish \u5d4c\u5165\u53ef\u4f5c\u4e3a\u4e0b\u6e38\u4efb\u52a1\u7684\u901a\u7528\u97f3\u9891\u7279\u5f81\uff0c\u7c7b\u4f3c\u4e8e ImageNet \u9884\u8bad\u7ec3 CNN \u63d0\u4f9b\u89c6\u89c9\u7279\u5f81\u7684\u65b9\u5f0f\u3002
PANNs\uff08\u9884\u8bad\u7ec3\u97f3\u9891\u795e\u7ecf\u7f51\u7edc\uff0cKong \u7b49\u4eba\uff0c2020\uff09\u662f\u4e00\u7cfb\u5217 CNN \u67b6\u6784\uff08CNN6\u3001CNN10\u3001CNN14\uff09\uff0c\u5728\u5b8c\u6574\u7684 AudioSet \u4e0a\u4e3a\u97f3\u9891\u6807\u8bb0\u4efb\u52a1\u8bad\u7ec3\u3002CNN14 \u4f7f\u7528\u6700\u5e7f\u6cdb\uff0c\u662f\u4e00\u4e2a 14 \u5c42 CNN\uff0c\u5c06\u5bf9\u6570\u6885\u5c14\u8bed\u8c31\u56fe\u4f5c\u4e3a\u8f93\u5165\uff0c\u4f7f\u7528 \\(3 \\times 3\\) \u5377\u79ef\u3002PANNs \u4ea7\u751f 2048 \u7ef4\u5d4c\u5165\uff0c\u5728\u591a\u79cd\u97f3\u9891\u4efb\u52a1\u4e0a\u5b9e\u73b0\u4e86\u6700\u5148\u8fdb\u7684\u8fc1\u79fb\u5b66\u4e60\u6027\u80fd\u3002
\u97f3\u9891\u8bed\u8c31\u56fe Transformer\uff08AST\uff09\uff08Gong \u7b49\u4eba\uff0c2021\uff09\u5c06\u89c6\u89c9 Transformer\uff08ViT\uff0c\u7b2c 08 \u7ae0\uff09\u67b6\u6784\u76f4\u63a5\u5e94\u7528\u4e8e\u97f3\u9891\u8bed\u8c31\u56fe\u3002\u8bed\u8c31\u56fe\u88ab\u5206\u5272\u6210 \\(16 \\times 16\\) \u7684\u5757\uff08\u5c31\u50cf ViT \u5206\u5272\u56fe\u50cf\u4e00\u6837\uff09\uff0c\u6bcf\u4e2a\u5757\u88ab\u7ebf\u6027\u6295\u5f71\u4e3a\u4ee4\u724c\u5d4c\u5165\uff0c\u6dfb\u52a0\u4f4d\u7f6e\u5d4c\u5165\uff0c\u7136\u540e\u7531\u6807\u51c6 Transformer \u7f16\u7801\u5668\uff08\u7b2c 07 \u7ae0\uff09\u5904\u7406\u5e8f\u5217\u3002[CLS] \u4ee4\u724c\u7684\u8f93\u51fa\u7528\u4e8e\u5206\u7c7b\u3002
AST \u53d7\u76ca\u4e8e ImageNet \u9884\u8bad\u7ec3\uff1a\u7531\u4e8e\u8bed\u8c31\u56fe\u662f 2D \u56fe\u50cf\uff0cAST \u4ece ImageNet \u56fe\u50cf\u4e0a\u9884\u8bad\u7ec3\u7684 ViT \u521d\u59cb\u5316\uff0c\u7136\u540e\u5728\u97f3\u9891\u4e0a\u5fae\u8c03\u3002\u8fd9\u79cd\u8de8\u6a21\u6001\u8fc1\u79fb\u51fa\u5947\u5730\u6709\u6548\uff0c\u56e0\u4e3a\u4e24\u4e2a\u57df\u5171\u4eab\u4f4e\u7ea7\u7279\u5f81\uff08\u8fb9\u7f18\u3001\u7eb9\u7406\uff09\uff0c\u5e76\u4e14\u4f4d\u7f6e\u5d4c\u5165\u53ef\u4ee5\u63d2\u503c\u4ee5\u5904\u7406\u4e0d\u540c\u5927\u5c0f\u7684\u8bed\u8c31\u56fe\u3002
HTS-AT\uff08Chen \u7b49\u4eba\uff0c2022\uff09\u4f7f\u7528\u5206\u5c42 Swin Transformer \u67b6\u6784\uff08\u7b2c 08 \u7ae0\u7684\u79fb\u4f4d\u7a97\u53e3\u6ce8\u610f\u529b\uff09\u6539\u8fdb\u4e86 AST\uff0c\u5728\u964d\u4f4e\u8ba1\u7b97\u6210\u672c\u7684\u540c\u65f6\u901a\u8fc7\u591a\u5c3a\u5ea6\u7279\u5f81\u63d0\u53d6\u63d0\u5347\u4e86\u6027\u80fd\u3002
BEATs\uff08Chen \u7b49\u4eba\uff0c2023\uff09\u4f7f\u7528\u4e86\u4e00\u79cd\u97f3\u9891\u7279\u5b9a\u7684\u9884\u8bad\u7ec3\u7b56\u7565\uff1a\u4f7f\u7528\u79bb\u6563\u6807\u8bb0\u5668\u8fdb\u884c\u8fed\u4ee3\u63a9\u7801\u9884\u6d4b\uff08\u7c7b\u4f3c\u4e8e\u6587\u4ef6 02 \u4e2d wav2vec 2.0 \u7684\u65b9\u6cd5\uff0c\u4f46\u5e94\u7528\u4e8e\u901a\u7528\u97f3\u9891\uff09\u3002\u6807\u8bb0\u5668\u9010\u6b65\u7ec6\u5316\uff0c\u521b\u5efa\u8d8a\u6765\u8d8a\u5177\u6709\u8bed\u4e49\u610f\u4e49\u7684\u79bb\u6563\u97f3\u9891\u4ee4\u724c\u3002
\u57fa\u4e8e\u5d4c\u5165\u7684\u8bf4\u8bdd\u4eba\u65e5\u5fd7\u7ed3\u5408\u4e86\u8bf4\u8bdd\u4eba\u5d4c\u5165\u4e0e\u65f6\u5e8f\u5efa\u6a21\u3002\u50cf Pyannote.audio \u8fd9\u6837\u7684\u73b0\u4ee3\u7cfb\u7edf\u4f7f\u7528\u4e09\u9636\u6bb5\u6d41\u6c34\u7ebf\uff1a(1) \u68c0\u6d4b\u8bf4\u8bdd\u4eba\u5207\u6362\u548c\u91cd\u53e0\u8bed\u97f3\u7684\u795e\u7ecf\u5206\u5272\u6a21\u578b\uff0c(2) \u5e94\u7528\u4e8e\u6bcf\u4e2a\u68c0\u6d4b\u5230\u7684\u7247\u6bb5\u7684\u5d4c\u5165\u63d0\u53d6\u9636\u6bb5\uff08ECAPA-TDNN\uff09\uff0c\u4ee5\u53ca (3) \u805a\u7c7b\u4ee5\u5728\u6574\u4e2a\u5f55\u97f3\u4e2d\u5206\u914d\u8bf4\u8bdd\u4eba\u8eab\u4efd\u3002
\u97f3\u4e50\u4fe1\u606f\u68c0\u7d22\uff08MIR\uff09\u5c06\u97f3\u9891\u5206\u6790\u5e94\u7528\u4e8e\u97f3\u4e50\u3002\u6587\u4ef6 01 \u4e2d\u7684\u8c31\u56fe\u8868\u793a\u5728\u8fd9\u91cc\u5c24\u5176\u6709\u7528\uff0c\u56e0\u4e3a\u97f3\u4e50\u5177\u6709\u4e30\u5bcc\u7684\u548c\u58f0\u7ed3\u6784\u3002
\u8282\u62cd\u8ddf\u8e2a\u68c0\u6d4b\u97f3\u4e50\u7684\u8282\u594f\u8109\u51b2\u3002\u6807\u51c6\u65b9\u6cd5\u4ece\u8bed\u8c31\u56fe\u8ba1\u7b97\u8d77\u59cb\u5f3a\u5ea6\u5305\u7edc\uff08\u68c0\u6d4b\u8868\u793a\u97f3\u7b26\u8d77\u59cb\u7684\u80fd\u91cf\u589e\u52a0\uff09\uff0c\u7136\u540e\u4f7f\u7528\u81ea\u76f8\u5173\u6216\u8282\u62cd\u56fe\u8c31\u627e\u5230\u8282\u594f\uff0c\u6700\u540e\u4f7f\u7528\u52a8\u6001\u89c4\u5212\u8ddf\u8e2a\u5355\u4e2a\u8282\u62cd\u4f4d\u7f6e\uff0c\u627e\u5230\u6700\u80fd\u5339\u914d\u8d77\u59cb\u5305\u7edc\u540c\u65f6\u4fdd\u6301\u7a33\u5b9a\u8282\u594f\u7684\u8282\u62cd\u65f6\u95f4\u5e8f\u5217\u3002
\u548c\u5f26\u8bc6\u522b\u8bc6\u522b\u968f\u65f6\u95f4\u53d8\u5316\u7684\u548c\u58f0\u5185\u5bb9\u3002\u8f93\u5165\u901a\u5e38\u662f\u8272\u5ea6\u56fe\uff08\u4e5f\u79f0\u4e3a\u97f3\u9ad8\u7c7b\u522b\u5206\u5e03\u56fe\uff09\uff1a\u4e00\u4e2a 12 \u7ef4\u8868\u793a\uff0c\u5c06\u6240\u6709\u516b\u5ea6\u6298\u53e0\u5728\u4e00\u8d77\uff0c\u663e\u793a 12 \u4e2a\u97f3\u9ad8\u7c7b\u522b\uff08C\u3001C#\u3001D\u3001\u2026\u3001B\uff09\u4e2d\u6bcf\u4e2a\u7c7b\u522b\u7684\u80fd\u91cf\u3002CNN \u6216 RNN\uff08\u7b2c 06 \u7ae0\uff09\u5c06\u6bcf\u4e2a\u65f6\u95f4\u5e27\u5206\u7c7b\u5230\u6807\u51c6\u548c\u5f26\u6807\u7b7e\u4e4b\u4e00\uff08C \u5927\u8c03\u3001A \u5c0f\u8c03\u3001G7 \u7b49\uff09\u3002
\u8272\u5ea6\u56fe\u901a\u8fc7\u5c06\u6bcf\u4e2a\u9891\u7387\u533a\u95f4\u6620\u5c04\u5230\u5176\u97f3\u9ad8\u7c7b\u522b\uff0c\u4ece STFT\uff08\u6587\u4ef6 01\uff09\u8ba1\u7b97\u5f97\u5230\uff1a
\u5176\u4e2d \\(p \\in \\{0, 1, \\ldots, 11\\}\\) \u662f\u97f3\u9ad8\u7c7b\u522b\uff0c\\(\\text{pitch}(k)\\) \u5c06\u9891\u7387\u533a\u95f4 \\(k\\) \u6620\u5c04\u5230\u5176 MIDI \u97f3\u7b26\u7f16\u53f7\u3002
\u6e90\u5206\u79bb\u57fa\u7840\uff08\u8be6\u89c1\u6587\u4ef6 05\uff09\u5c06\u97f3\u4e50\u5f55\u97f3\u5206\u79bb\u4e3a\u5355\u72ec\u7684\u4e50\u5668\uff08\u4eba\u58f0\u3001\u9f13\u3001\u8d1d\u65af\u3001\u5176\u4ed6\uff09\u3002\u8fd9\u662f\u6df7\u97f3\u3001\u5361\u62c9 OK \u548c\u97f3\u4e50\u8f6c\u5f55\u7b49 MIR \u5e94\u7528\u7684\u6838\u5fc3\u3002\u50cf Demucs\uff08\u6587\u4ef6 05\uff09\u8fd9\u6837\u7684\u6a21\u578b\u5728\u6807\u51c6 MUSDB18 \u57fa\u51c6\u4e0a\u8fbe\u5230\u4e86\u975e\u5e38\u597d\u7684\u5206\u79bb\u8d28\u91cf\u3002
\u97f3\u4e50\u6807\u8bb0\u4e3a\u6b4c\u66f2\u5206\u914d\u6807\u7b7e\uff08\u6d41\u6d3e\u3001\u60c5\u611f\u3001\u4e50\u5668\u3001\u65f6\u4ee3\uff09\u3002\u5b83\u672c\u8d28\u4e0a\u662f\u5e94\u7528\u4e8e\u97f3\u4e50\u7684\u97f3\u9891\u5206\u7c7b\uff0c\u4f7f\u7528\u76f8\u540c\u7684 CNN-\u8bed\u8c31\u56fe\u65b9\u6cd5\u3002Million Song Dataset \u548c MagnaTagATune \u662f\u6807\u51c6\u57fa\u51c6\u3002
\u97f3\u9891\u6307\u7eb9\u4ece\u77ed\u7247\u6bb5\u4e2d\u8bc6\u522b\u7279\u5b9a\u5f55\u97f3\uff0c\u5373\u4f7f\u5b58\u5728\u566a\u58f0\u3001\u6df7\u54cd\u6216\u538b\u7f29\u4f2a\u5f71\u3002\u7ecf\u5178\u7cfb\u7edf\u662f Shazam\uff0c\u5b83\u5bf9\u661f\u5ea7\u56fe\uff08\u8bed\u8c31\u56fe\u4e2d\u7684\u663e\u8457\u5cf0\u503c\uff09\u8fdb\u884c\u54c8\u5e0c\u5904\u7406\u3002\u795e\u7ecf\u65b9\u6cd5\u5b66\u4e60\u5bf9\u58f0\u5b66\u9000\u5316\u5177\u6709\u4e0d\u53d8\u6027\u3001\u540c\u65f6\u5bf9\u4e0d\u540c\u5f55\u97f3\u4fdd\u6301\u5224\u522b\u6027\u7684\u9c81\u68d2\u5d4c\u5165\uff0c\u8fd9\u4e0e\u7b2c 06 \u7ae0\u548c\u7b2c 08 \u7ae0\u4e2d\u7684\u4e0d\u53d8\u7279\u5f81\u5b66\u4e60\u4e00\u8109\u76f8\u627f\u3002
import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# Simulate frame-level MFCC features for multiple speakers\ndef generate_speaker_data(key, n_speakers=5, utterances_per_speaker=20,\n n_frames=100, n_features=40):\n \"\"\"Generate synthetic speaker data with speaker-dependent patterns.\"\"\"\n keys = jr.split(key, 3)\n all_features = []\n all_labels = []\n\n # Each speaker has a characteristic spectral pattern\n speaker_patterns = jr.normal(keys[0], (n_speakers, n_features)) * 0.5\n\n for spk in range(n_speakers):\n for utt in range(utterances_per_speaker):\n k = jr.fold_in(keys[1], spk * utterances_per_speaker + utt)\n noise = jr.normal(k, (n_frames, n_features)) * 0.3\n features = speaker_patterns[spk][None, :] + noise\n all_features.append(features)\n all_labels.append(spk)\n\n perm = jr.permutation(keys[2], len(all_features))\n features = jnp.stack(all_features)[perm]\n labels = jnp.array(all_labels)[perm]\n return features, labels\n\nkey = jr.PRNGKey(42)\nfeatures, labels = generate_speaker_data(key)\nn_speakers = 5\nn_features = 40\n\n# x-vector-style model\ndef init_xvector(key, n_features=40, hidden=128, embed_dim=64, n_speakers=5):\n keys = jr.split(key, 8)\n params = {\n # TDNN layer 1: context [-2, 2]\n 'tdnn1_w': jr.normal(keys[0], (5, n_features, hidden)) * jnp.sqrt(2.0 / (5 * n_features)),\n 'tdnn1_b': jnp.zeros(hidden),\n # TDNN layer 2: context [-2, 2]\n 'tdnn2_w': jr.normal(keys[1], (5, hidden, hidden)) * jnp.sqrt(2.0 / (5 * hidden)),\n 'tdnn2_b': jnp.zeros(hidden),\n # TDNN layer 3: context [-3, 3]\n 'tdnn3_w': jr.normal(keys[2], (7, hidden, hidden)) * jnp.sqrt(2.0 / (7 * hidden)),\n 'tdnn3_b': jnp.zeros(hidden),\n # Segment-level layers (after pooling: 2*hidden -> embed_dim)\n 'seg1_w': jr.normal(keys[3], (2 * hidden, embed_dim)) * jnp.sqrt(2.0 / (2 * hidden)),\n 'seg1_b': jnp.zeros(embed_dim),\n # Classification head\n 'cls_w': jr.normal(keys[4], (embed_dim, n_speakers)) * jnp.sqrt(2.0 / embed_dim),\n 'cls_b': jnp.zeros(n_speakers),\n }\n return params\n\ndef xvector_forward(params, x, return_embedding=False):\n \"\"\"x: (batch, frames, features) -> logits or embeddings.\"\"\"\n # TDNN layers (1D convolutions)\n h = jax.lax.conv_general_dilated(\n x.transpose(0, 2, 1), params['tdnn1_w'].transpose(2, 1, 0),\n window_strides=(1,), padding='SAME'\n ).transpose(0, 2, 1) + params['tdnn1_b']\n h = jax.nn.relu(h)\n\n h = jax.lax.conv_general_dilated(\n h.transpose(0, 2, 1), params['tdnn2_w'].transpose(2, 1, 0),\n window_strides=(1,), padding='SAME'\n ).transpose(0, 2, 1) + params['tdnn2_b']\n h = jax.nn.relu(h)\n\n h = jax.lax.conv_general_dilated(\n h.transpose(0, 2, 1), params['tdnn3_w'].transpose(2, 1, 0),\n window_strides=(1,), padding='SAME'\n ).transpose(0, 2, 1) + params['tdnn3_b']\n h = jax.nn.relu(h)\n\n # Statistics pooling: mean and std over time\n mu = jnp.mean(h, axis=1)\n sigma = jnp.std(h, axis=1)\n pooled = jnp.concatenate([mu, sigma], axis=-1)\n\n # Segment-level layer -> embedding\n embedding = jax.nn.relu(pooled @ params['seg1_w'] + params['seg1_b'])\n\n if return_embedding:\n return embedding\n\n # Classification\n logits = embedding @ params['cls_w'] + params['cls_b']\n return logits\n\ndef cross_entropy_loss(params, features, labels):\n logits = xvector_forward(params, features)\n one_hot = jax.nn.one_hot(labels, n_speakers)\n log_probs = jax.nn.log_softmax(logits)\n return -jnp.mean(jnp.sum(one_hot * log_probs, axis=-1))\n\ngrad_fn = jax.jit(jax.value_and_grad(cross_entropy_loss))\n\n# Train\nparams = init_xvector(jr.PRNGKey(0))\nlr = 1e-3\nlosses = []\n\nfor epoch in range(300):\n loss_val, grads = grad_fn(params, features, labels)\n params = jax.tree.map(lambda p, g: p - lr * g, params, grads)\n losses.append(float(loss_val))\n\n# Extract embeddings and visualise with t-SNE-style 2D projection (using PCA)\nembeddings = xvector_forward(params, features, return_embedding=True)\n\n# Simple PCA to 2D\nemb_centered = embeddings - jnp.mean(embeddings, axis=0)\n_, _, Vt = jnp.linalg.svd(emb_centered, full_matrices=False)\nproj_2d = emb_centered @ Vt[:2].T\n\nfig, axes = plt.subplots(1, 2, figsize=(14, 5))\n\naxes[0].plot(losses, color='#3498db', linewidth=1.5)\naxes[0].set_xlabel('Epoch')\naxes[0].set_ylabel('Cross-Entropy Loss')\naxes[0].set_title('Speaker Classification Training')\naxes[0].set_yscale('log')\n\ncolors = ['#3498db', '#e74c3c', '#27ae60', '#f39c12', '#9b59b6']\nfor spk in range(n_speakers):\n mask = labels == spk\n axes[1].scatter(proj_2d[mask, 0], proj_2d[mask, 1], c=colors[spk],\n label=f'Speaker {spk}', alpha=0.7, s=30)\naxes[1].set_xlabel('PC 1')\naxes[1].set_ylabel('PC 2')\naxes[1].set_title('Speaker Embeddings (PCA projection)')\naxes[1].legend()\n\nplt.tight_layout()\nplt.show()\n\n# Verification demo: cosine similarity\nemb_norm = embeddings / jnp.linalg.norm(embeddings, axis=-1, keepdims=True)\nsim_matrix = emb_norm @ emb_norm.T\nprint(f\"Embedding shape: {embeddings.shape}\")\nprint(f\"Avg same-speaker similarity: {jnp.mean(sim_matrix[labels[:, None] == labels[None, :]]):.4f}\")\nprint(f\"Avg diff-speaker similarity: {jnp.mean(sim_matrix[labels[:, None] != labels[None, :]]):.4f}\")\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\ndef generate_verification_pairs(key, n_speakers=20, dim=64, n_pairs=2000):\n \"\"\"Generate speaker embeddings and verification trial pairs.\"\"\"\n keys = jr.split(key, 5)\n\n # Speaker centroids with some variance\n centroids = jr.normal(keys[0], (n_speakers, dim))\n centroids = centroids / jnp.linalg.norm(centroids, axis=-1, keepdims=True)\n\n # Generate enrollment and test embeddings with intra-speaker variance\n enroll_embs = []\n test_embs = []\n trial_labels = [] # 1 = same speaker (target), 0 = different (impostor)\n\n for i in range(n_pairs):\n k1, k2, k3 = jr.split(jr.fold_in(keys[1], i), 3)\n is_target = jr.bernoulli(k1).astype(int)\n\n spk1 = jr.randint(k2, (), 0, n_speakers)\n emb1 = centroids[spk1] + jr.normal(jr.fold_in(k3, 0), (dim,)) * 0.15\n\n if is_target:\n spk2 = spk1\n else:\n spk2 = (spk1 + jr.randint(jr.fold_in(k3, 1), (), 1, n_speakers)) % n_speakers\n\n emb2 = centroids[spk2] + jr.normal(jr.fold_in(k3, 2), (dim,)) * 0.15\n\n enroll_embs.append(emb1)\n test_embs.append(emb2)\n trial_labels.append(int(is_target))\n\n return (jnp.stack(enroll_embs), jnp.stack(test_embs),\n jnp.array(trial_labels))\n\nkey = jr.PRNGKey(42)\nenroll, test, labels = generate_verification_pairs(key)\n\n# Compute cosine similarity scores\nenroll_norm = enroll / jnp.linalg.norm(enroll, axis=-1, keepdims=True)\ntest_norm = test / jnp.linalg.norm(test, axis=-1, keepdims=True)\nscores = jnp.sum(enroll_norm * test_norm, axis=-1)\n\n# Compute FAR and FRR at various thresholds\nthresholds = jnp.linspace(-1.0, 1.0, 500)\n\ntarget_scores = scores[labels == 1]\nimpostor_scores = scores[labels == 0]\n\nfars = []\nfrrs = []\nfor thresh in thresholds:\n far = jnp.mean(impostor_scores >= thresh) # false accepts\n frr = jnp.mean(target_scores < thresh) # false rejects\n fars.append(float(far))\n frrs.append(float(frr))\n\nfars = jnp.array(fars)\nfrrs = jnp.array(frrs)\n\n# Find EER: where FAR \u2248 FRR\neer_idx = jnp.argmin(jnp.abs(fars - frrs))\neer = float((fars[eer_idx] + frrs[eer_idx]) / 2)\neer_threshold = float(thresholds[eer_idx])\n\nprint(f\"Equal Error Rate (EER): {eer:.4f} ({eer*100:.2f}%)\")\nprint(f\"EER threshold: {eer_threshold:.4f}\")\n\nfig, axes = plt.subplots(1, 3, figsize=(18, 5))\n\n# Score distributions\nbins = jnp.linspace(-0.5, 1.0, 60)\naxes[0].hist(target_scores, bins=bins, alpha=0.6, color='#27ae60',\n label='Target (same speaker)', density=True)\naxes[0].hist(impostor_scores, bins=bins, alpha=0.6, color='#e74c3c',\n label='Impostor (different speaker)', density=True)\naxes[0].axvline(eer_threshold, color='#f39c12', linestyle='--', linewidth=2,\n label=f'EER threshold = {eer_threshold:.3f}')\naxes[0].set_xlabel('Cosine Similarity Score')\naxes[0].set_ylabel('Density')\naxes[0].set_title('Score Distributions')\naxes[0].legend()\n\n# FAR vs FRR\naxes[1].plot(thresholds, fars, color='#e74c3c', linewidth=2, label='FAR')\naxes[1].plot(thresholds, frrs, color='#3498db', linewidth=2, label='FRR')\naxes[1].axvline(eer_threshold, color='#f39c12', linestyle='--', linewidth=1.5)\naxes[1].scatter([eer_threshold], [eer], color='#f39c12', s=100, zorder=5,\n label=f'EER = {eer:.4f}')\naxes[1].set_xlabel('Threshold')\naxes[1].set_ylabel('Error Rate')\naxes[1].set_title('FAR and FRR vs Threshold')\naxes[1].legend()\n\n# DET curve (FAR vs FRR)\naxes[2].plot(fars, frrs, color='#9b59b6', linewidth=2)\naxes[2].plot([0, 1], [0, 1], 'k--', alpha=0.3)\naxes[2].scatter([eer], [eer], color='#f39c12', s=100, zorder=5,\n label=f'EER = {eer:.4f}')\naxes[2].set_xlabel('False Acceptance Rate')\naxes[2].set_ylabel('False Rejection Rate')\naxes[2].set_title('DET Curve')\naxes[2].set_xlim([0, 0.5])\naxes[2].set_ylim([0, 0.5])\naxes[2].legend()\naxes[2].set_aspect('equal')\n\nplt.tight_layout()\nplt.show()\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# Generate a synthetic spectrogram (harmonic structure + noise)\ndef generate_spectrogram(key, n_time=128, n_freq=128):\n \"\"\"Create a synthetic spectrogram with harmonic patterns.\"\"\"\n k1, k2 = jr.split(key)\n spec = jr.normal(k1, (n_time, n_freq)) * 0.1\n\n # Add harmonic bands (simulating speech formants)\n for f0 in [15, 30, 45, 70]:\n width = 3\n envelope = jnp.exp(-0.5 * ((jnp.arange(n_freq) - f0) / width) ** 2)\n time_mod = 0.5 + 0.5 * jnp.sin(2 * jnp.pi * jnp.arange(n_time) / 40)\n spec += jnp.outer(time_mod, envelope)\n\n return jnp.clip(spec, 0, None)\n\nkey = jr.PRNGKey(42)\nspectrogram = generate_spectrogram(key)\nn_time, n_freq = spectrogram.shape\n\n# Patch extraction parameters\npatch_h = 16 # time\npatch_w = 16 # frequency\nstride_h = 16\nstride_w = 16\nembed_dim = 192 # ViT-Small dimension\n\nn_patches_h = n_time // stride_h\nn_patches_w = n_freq // stride_w\nn_patches = n_patches_h * n_patches_w\n\nprint(f\"Spectrogram: {n_time} x {n_freq}\")\nprint(f\"Patch size: {patch_h} x {patch_w}\")\nprint(f\"Number of patches: {n_patches_h} x {n_patches_w} = {n_patches}\")\n\n# Extract patches\ndef extract_patches(spec, patch_h, patch_w, stride_h, stride_w):\n \"\"\"Extract non-overlapping patches from spectrogram.\"\"\"\n patches = []\n positions = []\n for i in range(0, spec.shape[0] - patch_h + 1, stride_h):\n for j in range(0, spec.shape[1] - patch_w + 1, stride_w):\n patch = spec[i:i+patch_h, j:j+patch_w]\n patches.append(patch.flatten())\n positions.append((i, j))\n return jnp.stack(patches), positions\n\npatches, positions = extract_patches(spectrogram, patch_h, patch_w, stride_h, stride_w)\nprint(f\"Patches shape: {patches.shape}\") # (n_patches, patch_h * patch_w)\n\n# Linear projection (patch embedding)\npatch_dim = patch_h * patch_w\nk1, k2 = jr.split(jr.PRNGKey(0))\nW_embed = jr.normal(k1, (patch_dim, embed_dim)) * jnp.sqrt(2.0 / patch_dim)\nb_embed = jnp.zeros(embed_dim)\n\n# Learnable positional embeddings\npos_embed = jr.normal(k2, (n_patches + 1, embed_dim)) * 0.02 # +1 for CLS\n\n# CLS token\ncls_token = jnp.zeros((1, embed_dim))\n\n# Forward pass\npatch_tokens = patches @ W_embed + b_embed # (n_patches, embed_dim)\ntokens = jnp.concatenate([cls_token, patch_tokens], axis=0) # (n_patches+1, embed_dim)\ntokens = tokens + pos_embed # Add positional embeddings\n\nprint(f\"Token sequence shape: {tokens.shape}\")\nprint(f\"Each token has dimension: {embed_dim}\")\n\n# Visualisation\nfig, axes = plt.subplots(2, 2, figsize=(14, 10))\n\n# Original spectrogram with patch grid\naxes[0, 0].imshow(spectrogram.T, aspect='auto', origin='lower', cmap='magma')\nfor i in range(0, n_time + 1, stride_h):\n axes[0, 0].axvline(i - 0.5, color='white', linewidth=0.5, alpha=0.5)\nfor j in range(0, n_freq + 1, stride_w):\n axes[0, 0].axhline(j - 0.5, color='white', linewidth=0.5, alpha=0.5)\naxes[0, 0].set_title(f'Spectrogram with {patch_h}x{patch_w} Patch Grid')\naxes[0, 0].set_xlabel('Time frame')\naxes[0, 0].set_ylabel('Frequency bin')\n\n# Individual patches visualised\nn_show = min(16, n_patches)\npatch_grid = patches[:n_show].reshape(n_show, patch_h, patch_w)\ncombined = jnp.concatenate([patch_grid[i] for i in range(min(8, n_show))], axis=1)\naxes[0, 1].imshow(combined.T, aspect='auto', origin='lower', cmap='magma')\naxes[0, 1].set_title(f'First {min(8, n_show)} Patches (concatenated)')\naxes[0, 1].set_xlabel('Patch index (horizontal)')\naxes[0, 1].set_ylabel('Frequency within patch')\n\n# Token embeddings similarity matrix\ntoken_norms = tokens / jnp.linalg.norm(tokens, axis=-1, keepdims=True)\nsim = token_norms @ token_norms.T\nim = axes[1, 0].imshow(sim, cmap='RdBu_r', vmin=-1, vmax=1)\naxes[1, 0].set_title('Token Similarity Matrix (cosine)')\naxes[1, 0].set_xlabel('Token index')\naxes[1, 0].set_ylabel('Token index')\nplt.colorbar(im, ax=axes[1, 0], fraction=0.046)\n\n# Positional embedding similarity\npos_norms = pos_embed / jnp.linalg.norm(pos_embed, axis=-1, keepdims=True)\npos_sim = pos_norms @ pos_norms.T\nim2 = axes[1, 1].imshow(pos_sim, cmap='RdBu_r', vmin=-1, vmax=1)\naxes[1, 1].set_title('Positional Embedding Similarity')\naxes[1, 1].set_xlabel('Position index')\naxes[1, 1].set_ylabel('Position index')\nplt.colorbar(im2, ax=axes[1, 1], fraction=0.046)\n\nplt.tight_layout()\nplt.show()\n import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# Generate a synthetic musical signal: C major chord -> G major chord\nsr = 16000\nduration = 2.0\nt = jnp.linspace(0, duration, int(sr * duration))\n\n# C major (C4=261.6, E4=329.6, G4=392.0) for first half\n# G major (G3=196.0, B3=246.9, D4=293.7) for second half\nhalf = len(t) // 2\n\nc_major = (0.5 * jnp.sin(2 * jnp.pi * 261.63 * t[:half]) +\n 0.4 * jnp.sin(2 * jnp.pi * 329.63 * t[:half]) +\n 0.3 * jnp.sin(2 * jnp.pi * 392.00 * t[:half]))\n\ng_major = (0.5 * jnp.sin(2 * jnp.pi * 196.00 * t[:half]) +\n 0.4 * jnp.sin(2 * jnp.pi * 246.94 * t[:half]) +\n 0.3 * jnp.sin(2 * jnp.pi * 293.66 * t[:half]))\n\nsignal = jnp.concatenate([c_major, g_major])\n\n# Compute STFT\nn_fft = 4096 # high resolution for pitch accuracy\nhop_length = 512\nwindow = jnp.hanning(n_fft)\n\ndef stft(signal, n_fft, hop_length, window):\n n_frames = 1 + (len(signal) - n_fft) // hop_length\n frames = jnp.stack([\n signal[i * hop_length : i * hop_length + n_fft] * window\n for i in range(n_frames)\n ])\n return jnp.fft.rfft(frames, n=n_fft)\n\nS = stft(signal, n_fft, hop_length, window)\npower_spec = jnp.abs(S) ** 2\nfreqs = jnp.fft.rfftfreq(n_fft, 1.0 / sr)\n\n# Compute chromagram by mapping frequency bins to pitch classes\n# MIDI note number from frequency: 69 + 12 * log2(f / 440)\nnote_names = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']\n\ndef freq_to_chroma(freq):\n \"\"\"Map frequency to pitch class (0-11). Returns -1 for freq <= 0.\"\"\"\n midi = 69 + 12 * jnp.log2(jnp.clip(freq, 1e-10, None) / 440.0)\n return jnp.round(midi).astype(int) % 12\n\n# Build chromagram: sum power spectrum energy for each pitch class\nchromagram = jnp.zeros((power_spec.shape[0], 12))\nvalid_freqs = freqs[1:] # skip DC\nvalid_power = power_spec[:, 1:]\n\nfor p in range(12):\n # Find frequency bins belonging to this pitch class\n chroma_bins = freq_to_chroma(valid_freqs)\n mask = (chroma_bins == p).astype(jnp.float32)\n chromagram = chromagram.at[:, p].set(\n jnp.sum(valid_power * mask[None, :], axis=1)\n )\n\n# Normalise each frame\nchromagram = chromagram / (jnp.max(chromagram, axis=1, keepdims=True) + 1e-8)\n\n# Visualisation\nfig, axes = plt.subplots(3, 1, figsize=(14, 10))\n\n# Waveform\naxes[0].plot(t[:3000], signal[:3000], color='#3498db', linewidth=0.5,\n label='C major')\naxes[0].plot(t[half:half+3000], signal[half:half+3000], color='#e74c3c',\n linewidth=0.5, label='G major')\naxes[0].set_title('Waveform: C major \u2192 G major')\naxes[0].set_ylabel('Amplitude')\naxes[0].set_xlabel('Time (s)')\naxes[0].legend()\n\n# Spectrogram (log scale)\ntime_axis = jnp.arange(power_spec.shape[0]) * hop_length / sr\naxes[1].imshow(jnp.log1p(power_spec[:, :500].T), aspect='auto', origin='lower',\n cmap='magma', extent=[0, time_axis[-1], 0, freqs[500]])\naxes[1].set_title('Power Spectrogram')\naxes[1].set_ylabel('Frequency (Hz)')\naxes[1].set_xlabel('Time (s)')\n\n# Chromagram\nim = axes[2].imshow(chromagram.T, aspect='auto', origin='lower', cmap='YlOrRd',\n extent=[0, time_axis[-1], -0.5, 11.5])\naxes[2].set_yticks(range(12))\naxes[2].set_yticklabels(note_names)\naxes[2].set_title('Chromagram (pitch class energy over time)')\naxes[2].set_ylabel('Pitch class')\naxes[2].set_xlabel('Time (s)')\nplt.colorbar(im, ax=axes[2], fraction=0.046, label='Normalised energy')\n\n# Mark expected active pitch classes\nmid_frame = chromagram.shape[0] // 2\nprint(f\"C major region - expected: C, E, G\")\nprint(f\" Chroma values: {dict(zip(note_names, [f'{v:.2f}' for v in chromagram[mid_frame//2]]))}\")\nprint(f\"G major region - expected: G, B, D\")\nprint(f\" Chroma values: {dict(zip(note_names, [f'{v:.2f}' for v in chromagram[mid_frame + mid_frame//2]]))}\")\n\nplt.tight_layout()\nplt.show()\n"},{"location":"chapter%2009%3A%20audio%20and%20speech/05.%20source%20separation%20and%20noise/","title":"\u6e90\u5206\u79bb\u4e0e\u964d\u566a","text":"\u6e90\u5206\u79bb\u4e0e\u964d\u566a\u4ece\u6df7\u5408\u97f3\u9891\u4e2d\u6062\u590d\u5355\u4e2a\u4fe1\u53f7\uff1b\u5373\u8ba1\u7b97\u5c42\u9762\u7684\"\u9e21\u5c3e\u9152\u4f1a\u95ee\u9898\"\u3002\u672c\u6587\u6db5\u76d6ICA\u3001NMF\u3001\u65f6\u9891\u63a9\u853d\u3001\u6ce2\u675f\u6210\u5f62\u3001\u6df1\u5ea6\u5b66\u4e60\u5206\u79bb\u7f51\u7edc\uff08Conv-TasNet\u3001SepFormer\uff09\u3001\u8bed\u97f3\u589e\u5f3a\u4ee5\u53ca\u81ea\u9002\u5e94\u964d\u566a\u3002
\u60f3\u8c61\u4e00\u4e0b\u4f60\u7ad9\u5728\u4e00\u4e2a\u62e5\u6324\u7684\u9e21\u5c3e\u9152\u4f1a\u4e0a\u3002\u6570\u5341\u4eba\u540c\u65f6\u5728\u4ea4\u8c08\uff0c\u97f3\u4e50\u5728\u64ad\u653e\uff0c\u9152\u676f\u5728\u78b0\u649e\uff0c\u4f46\u4f60\u5374\u80fd\u4e13\u6ce8\u4e8e\u4e00\u6bb5\u5bf9\u8bdd\u5e76\u6e05\u6670\u5730\u8ddf\u4e0a\u5b83\u3002\u8fd9\u79cd\u975e\u51e1\u7684\u80fd\u529b\u88ab\u79f0\u4e3a\u9e21\u5c3e\u9152\u4f1a\u95ee\u9898\uff08Cherry, 1953\uff09\uff0c\u4eba\u7c7b\u542c\u89c9\u7cfb\u7edf\u53ef\u4ee5\u6beb\u4e0d\u8d39\u529b\u5730\u505a\u5230\uff0c\u4f46\u673a\u5668\u5374\u89c9\u5f97\u5f02\u5e38\u56f0\u96be\u3002\u672c\u6587\u6db5\u76d6\u4e86\u5c1d\u8bd5\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\u7684\u7b97\u6cd5\uff1a\u5206\u79bb\u6df7\u5408\u97f3\u9891\u6e90\u3001\u6d88\u9664\u4e0d\u5fc5\u8981\u7684\u566a\u58f0\u4ee5\u53ca\u5728\u4e0d\u5229\u6761\u4ef6\u4e0b\u589e\u5f3a\u8bed\u97f3\u3002
\u6587\u4ef601\u4e2d\u7684\u4fe1\u53f7\u5904\u7406\u57fa\u7840\uff08STFT\u3001\u8bed\u8c31\u56fe\u3001\u6ee4\u6ce2\u5668\u7ec4\uff09\u652f\u6491\u4e86\u8fd9\u91cc\u7684\u6bcf\u4e00\u79cd\u65b9\u6cd5\u3002\u7b2c02\u7ae0\u4e2d\u7684\u77e9\u9635\u5206\u89e3\u6280\u672f\uff08NMF\u3001ICA\u3001SVD\uff09\u63d0\u4f9b\u4e86\u7ecf\u5178\u5de5\u5177\u96c6\u3002\u7b2c06\u7ae0\u4e2d\u7684\u6df1\u5ea6\u5b66\u4e60\u67b6\u6784\uff08CNN\u3001RNN\u3001\u6ce8\u610f\u529b\u673a\u5236\uff09\u4ee5\u53ca\u7b2c04/05\u7ae0\u4e2d\u7684\u6982\u7387\u8bba\u5219\u4e3a\u73b0\u4ee3\u65b9\u6cd5\u63d0\u4f9b\u4e86\u7406\u8bba\u57fa\u7840\u3002
\u5176\u4e2d \\(s_c(t)\\) \u662f\u7b2c \\(c\\) \u4e2a\u6e90\u4fe1\u53f7\uff0c\\(n(t)\\) \u662f\u80cc\u666f\u566a\u58f0\u3002\u76ee\u6807\u662f\u4ece \\(x(t)\\) \u4e2d\u6062\u590d\u51fa\u5404\u4e2a \\(s_c(t)\\)\u3002\u5728\u5355\u9ea6\u514b\u98ce\u60c5\u51b5\u4e0b\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e25\u91cd\u6b20\u5b9a\u7684\u95ee\u9898\uff1a\u4e00\u4e2a\u65b9\u7a0b\uff0c\\(C\\) \u4e2a\u672a\u77e5\u6570\u3002\u9700\u8981\u989d\u5916\u7684\u5047\u8bbe\uff08\u7edf\u8ba1\u72ec\u7acb\u6027\u3001\u9891\u8c31\u7ed3\u6784\u3001\u5b66\u4e60\u5148\u9a8c\uff09\u624d\u80fd\u4f7f\u95ee\u9898\u53d8\u5f97\u53ef\u89e3\u3002
\u5728\u9891\u57df\u4e2d\uff08\u901a\u8fc7\u6587\u4ef601\u4e2d\u7684STFT\uff09\uff0c\u6df7\u5408\u4fe1\u53f7\u53d8\u4e3a\uff1a
\u72ec\u7acb\u6210\u5206\u5206\u6790\uff08ICA\uff09 \u662f\u9ea6\u514b\u98ce\u6570\u91cf\u7b49\u4e8e\u6216\u8d85\u8fc7\u6e90\u6570\u91cf\u65f6\u7684\u7ecf\u5178\u65b9\u6cd5\u3002ICA\uff08\u7b2c02\u7ae0\uff09\u5bfb\u627e\u4e00\u4e2a\u7ebf\u6027\u89e3\u6df7\u77e9\u9635 \\(W\\)\uff0c\u4f7f\u5f97 \\(\\hat{s} = Wx\\)\uff0c\u5176\u4e2d\u6062\u590d\u7684\u6e90 \\(\\hat{s}\\) \u5728\u7edf\u8ba1\u4e0a\u6700\u5927\u9650\u5ea6\u5730\u72ec\u7acb\u3002\u5173\u952e\u5047\u8bbe\u662f\u6e90\u4fe1\u53f7\u662f\u975e\u9ad8\u65af\u4e14\u72ec\u7acb\u7684\uff0c\u8fd9\u5bf9\u4e8e\u8bed\u97f3\u548c\u97f3\u4e50\u901a\u5e38\u662f\u6210\u7acb\u7684\u3002
\u5bf9\u4e8e\u591a\u9ea6\u514b\u98ce\u77ac\u65f6\u6df7\u53e0\u6a21\u578b \\(x = As\\)\uff08\u5176\u4e2d \\(A\\) \u662f\u6df7\u53e0\u77e9\u9635\uff09\uff0cICA \u901a\u8fc7\u6700\u5927\u5316\u8f93\u51fa\u7684\u975e\u9ad8\u65af\u6027\uff08FastICA \u4f7f\u7528\u8d1f\u71b5\uff09\u6216\u6700\u5c0f\u5316\u4e92\u4fe1\u606f\u6765\u6062\u590d \\(W \\approx A^{-1}\\)\u3002ICA \u5728\u53d7\u63a7\u73af\u5883\u4e2d\u8868\u73b0\u826f\u597d\uff0c\u4f46\u5f53\u6df7\u53e0\u6d89\u53ca\u5377\u79ef\uff08\u623f\u95f4\u6df7\u54cd\uff09\u3001\u6e90\u6570\u91cf\u8d85\u8fc7\u9ea6\u514b\u98ce\u6570\u91cf\u6216\u72ec\u7acb\u6027\u5047\u8bbe\u88ab\u8fdd\u53cd\u65f6\u5219\u4f1a\u5931\u8d25\u3002
\u975e\u8d1f\u77e9\u9635\u5206\u89e3\uff08NMF\uff09 \u5c06\u5e45\u5ea6\u8bed\u8c31\u56fe \\(V \\in \\mathbb{R}_+^{F \\times T}\\) \u5206\u89e3\u4e3a\u4e24\u4e2a\u975e\u8d1f\u77e9\u9635\u7684\u4e58\u79ef\uff08\u7b2c02\u7ae0\uff09\uff1a
\u5176\u4e2d \\(W \\in \\mathbb{R}_+^{F \\times K}\\) \u662f\u5305\u542b \\(K\\) \u4e2a\u9891\u8c31\u57fa\u5411\u91cf\u7684\u5b57\u5178\uff0c\\(H \\in \\mathbb{R}_+^{K \\times T}\\) \u5305\u542b\u968f\u65f6\u95f4\u53d8\u5316\u7684\u6fc0\u6d3b\u7cfb\u6570\u3002\u975e\u8d1f\u7ea6\u675f\u5177\u6709\u7269\u7406\u52a8\u673a\uff1a\u5e45\u5ea6\u662f\u975e\u8d1f\u7684\uff0c\u4e14\u58f0\u97f3\u662f\u52a0\u6027\u7ec4\u5408\u7684\u3002
\u5bf9\u4e8e\u6e90\u5206\u79bb\uff0cNMF \u4e3a\u6bcf\u4e2a\u6e90\u5b66\u4e60\u72ec\u7acb\u7684\u5b57\u5178\uff1a\\(W_{\\text{\u8bed\u97f3}}\\) \u6355\u6349\u8bed\u97f3\u7684\u9891\u8c31\u6a21\u5f0f\uff08\u5171\u632f\u5cf0\u7ed3\u6784\uff09\uff0c\u800c \\(W_{\\text{\u566a\u58f0}}\\) \u6355\u6349\u566a\u58f0\u6a21\u5f0f\u3002\u6df7\u5408\u4fe1\u53f7\u88ab\u5206\u89e3\u4e3a \\(V \\approx W_{\\text{\u8bed\u97f3}} H_{\\text{\u8bed\u97f3}} + W_{\\text{\u566a\u58f0}} H_{\\text{\u566a\u58f0}}\\)\uff0c\u6bcf\u4e2a\u6e90\u901a\u8fc7\u63a9\u853d\u6765\u6062\u590d\u3002NMF \u4f7f\u7528\u4e58\u6cd5\u66f4\u65b0\u89c4\u5219\u8fdb\u884c\u6700\u5c0f\u5316\uff0c\u4ee3\u4ef7\u51fd\u6570\u53ef\u4ee5\u662f Frobenius \u8303\u6570\u6216 KL \u6563\u5ea6\uff1a
\u6765\u81ea\u76ee\u6807\u65b9\u5411\u7684\u4fe1\u53f7\u76f8\u5e72\u76f8\u52a0\uff0c\u800c\u6765\u81ea\u5176\u4ed6\u65b9\u5411\u7684\u4fe1\u53f7\u975e\u76f8\u5e72\u76f8\u52a0\uff0c\u4ece\u800c\u5b9e\u73b0\u7a7a\u95f4\u6ee4\u6ce2\u3002\u9635\u5217\u7684\u51e0\u4f55\u5f62\u72b6\u51b3\u5b9a\u4e86\u7a7a\u95f4\u5206\u8fa8\u7387\uff1a\u66f4\u5927\u7684\u9635\u5217\u4ea7\u751f\u66f4\u7a84\u7684\u6ce2\u675f\u3002
\u6700\u5c0f\u65b9\u5dee\u65e0\u5931\u771f\u54cd\u5e94\uff08MVDR\uff09 \u6ce2\u675f\u6210\u5f62\u4f18\u5316\u6743\u91cd\uff0c\u4ee5\u6700\u5c0f\u5316\u603b\u8f93\u51fa\u529f\u7387\uff0c\u540c\u65f6\u4fdd\u8bc1\u76ee\u6807\u65b9\u5411\u65e0\u5931\u771f\u5730\u901a\u8fc7\uff1a
MVDR \u901a\u8fc7\u4f7f\u7528\u4f30\u8ba1\u7684\u566a\u58f0\u534f\u65b9\u5dee\u81ea\u9002\u5e94\u5730\u9002\u5e94\u566a\u58f0\u73af\u5883\uff0c\u6bd4\u5ef6\u8fdf\u6c42\u548c\u63d0\u4f9b\u66f4\u597d\u7684\u5e72\u6270\u6291\u5236\u80fd\u529b\u3002\u5b83\u5e7f\u6cdb\u7528\u4e8e\u52a9\u542c\u5668\u3001\u667a\u80fd\u97f3\u7bb1\u548c\u8fdc\u7a0b\u4f1a\u8bae\u7cfb\u7edf\u3002
\u6df1\u5ea6\u5b66\u4e60\u7528\u4e8e\u6e90\u5206\u79bb\u663e\u8457\u63d0\u5347\u4e86\u6027\u80fd\uff0c\u7279\u522b\u662f\u5728\u7ecf\u5178\u65b9\u6cd5\u96be\u4ee5\u5904\u7406\u7684\u5355\u9ea6\u514b\u98ce\u60c5\u51b5\u4e0b\u3002\u4e00\u822c\u8303\u5f0f\u662f\uff1a\u7f16\u7801\u6df7\u5408\u4fe1\u53f7\uff0c\u901a\u8fc7\u795e\u7ecf\u7f51\u7edc\u4f30\u8ba1\u63a9\u853d\u6216\u6e90\u8868\u793a\uff0c\u7136\u540e\u89e3\u7801\u4ee5\u6062\u590d\u5404\u4e2a\u6e90\u3002
\u6df1\u5ea6\u805a\u7c7b\uff08Hershey \u7b49\uff0c2016\uff09\u5c06\u6bcf\u4e2a\u65f6\u9891\u5355\u5143\u5d4c\u5165\u5230\u4e00\u4e2a\u9ad8\u7ef4\u7a7a\u95f4\u4e2d\uff0c\u4f7f\u5f97\u5c5e\u4e8e\u540c\u4e00\u6e90\u7684\u5355\u5143\u5f7c\u6b64\u9760\u8fd1\uff0c\u800c\u6765\u81ea\u4e0d\u540c\u6e90\u7684\u5355\u5143\u5219\u8fdc\u79bb\u3002\u4e00\u4e2a\u53cc\u5411 LSTM\uff08\u7b2c06\u7ae0\uff09\u5c06\u6bcf\u4e2a\u65f6\u9891\u5355\u5143 \\((t, f)\\) \u6620\u5c04\u4e3a\u4e00\u4e2a\u5d4c\u5165\u5411\u91cf \\(v_{t,f} \\in \\mathbb{R}^D\\)\u3002\u8bad\u7ec3\u76ee\u6807\u4e3a\uff1a
\u5176\u4e2d \\(V\\) \u662f\u5d4c\u5165\u77e9\u9635\uff0c\\(Y\\) \u662f\u6e90\u5206\u914d\u7684\u5355\u70ed\u77e9\u9635\u3002\u4e58\u79ef \\(VV^T\\) \u662f\u4e00\u4e2a\u4eb2\u548c\u77e9\u9635\uff08\u4e24\u4e2a\u5355\u5143\u7684\u5d4c\u5165\u6709\u591a\u76f8\u4f3c\uff09\uff0c\u800c \\(YY^T\\) \u662f\u7406\u60f3\u7684\u4eb2\u548c\u5ea6\uff08\u82e5\u5c5e\u4e8e\u540c\u4e00\u6e90\u5219\u4e3a1\uff0c\u5426\u5219\u4e3a0\uff09\u3002\u63a8\u7406\u65f6\uff0c\u5bf9\u5d4c\u5165\u8fdb\u884c K-means \u805a\u7c7b\u4ea7\u751f\u4e8c\u503c\u63a9\u853d\u3002
Conv-TasNet\uff08Luo \u548c Mesgarani\uff0c2019\uff09\u5b8c\u5168\u5728\u65f6\u57df\u4e2d\u64cd\u4f5c\uff0c\u7ed5\u8fc7\u4e86 STFT\u3002\u5b83\u5305\u542b\u4e09\u4e2a\u7ec4\u4ef6\uff1a
\u7f16\u7801\u5668\uff1a\u4e00\u4e2a\u4e00\u7ef4\u5377\u79ef\u5c06\u6df7\u5408\u6ce2\u5f62\u7684\u77ed\u7247\u6bb5\u6620\u5c04\u4e3a\u6f5c\u5728\u8868\u793a\u3002\u5bf9\u4e8e\u6df7\u5408\u4fe1\u53f7 \\(x \\in \\mathbb{R}^T\\)\uff0c\u7f16\u7801\u5668\u8f93\u51fa\u4e3a \\(w = \\text{ReLU}(U \\ast x) \\in \\mathbb{R}^{N \\times L}\\)\uff0c\u5176\u4e2d \\(U\\) \u662f\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684\u57fa\uff08\u7c7b\u4f3c\u4e8e STFT \u57fa\u4f46\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\uff09\uff0c\\(N\\) \u662f\u57fa\u51fd\u6570\u7684\u6570\u91cf\uff0c\\(L\\) \u662f\u7247\u6bb5\u6570\u3002\u7f16\u7801\u5668\u6838\u5927\u5c0f\u548c\u6b65\u957f\uff08\u901a\u5e38\u4e3a2ms\u548c1ms\uff09\u51b3\u5b9a\u4e86\u65f6\u95f4\u5206\u8fa8\u7387\u3002
\u5206\u79bb\u5668\uff1a\u4e00\u4e2a\u65f6\u57df\u5377\u79ef\u7f51\u7edc\uff08TCN\uff09\u5904\u7406\u7f16\u7801\u540e\u7684\u6df7\u5408\u4fe1\u53f7\u5e76\u8f93\u51fa \\(C\\) \u4e2a\u63a9\u853d\u3002TCN \u5806\u53e0\u4e86\u6269\u5f20\u4e00\u7ef4\u6df1\u5ea6\u53ef\u5206\u79bb\u5377\u79ef\uff08\u6765\u81ea\u7b2c08\u7ae0\u7684\u9ad8\u6548\u5377\u79ef\uff09\uff0c\u8fd9\u4e9b\u5377\u79ef\u4ee5\u6307\u6570\u589e\u957f\u7684\u6269\u5f20\u56e0\u5b50 \\(1, 2, 4, \\ldots, 2^{B-1}\\) \u6392\u5217\u6210\u5757\uff0c\u91cd\u590d \\(R\\) \u6b21\u3002\u8fd9\u63d0\u4f9b\u4e86\u975e\u5e38\u5927\u7684\u611f\u53d7\u91ce\uff0c\u540c\u65f6\u4fdd\u6301\u8ba1\u7b97\u9ad8\u6548\u3002
\u89e3\u7801\u5668\uff1a\u4e00\u4e2a\u8f6c\u7f6e\u4e00\u7ef4\u5377\u79ef\uff08\u4f7f\u7528\u53ef\u5b66\u4e60\u57fa \\(V\\)\uff09\u5c06\u6bcf\u4e2a\u63a9\u853d\u540e\u7684\u8868\u793a\u8f6c\u6362\u56de\u65f6\u57df\uff1a\\(\\hat{s}_c = V^T (M_c \\odot w)\\)\u3002
Conv-TasNet \u663e\u8457\u4f18\u4e8e\u57fa\u4e8e\u8bed\u8c31\u56fe\u7684\u65b9\u6cd5\uff0c\u56e0\u4e3a\u5b66\u4e60\u5230\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u57fa\u53ef\u4ee5\u6355\u6349 STFT \u5e45\u5ea6\u6240\u4e22\u5f03\u7684\u4fe1\u606f\uff08\u7279\u522b\u662f\u76f8\u4f4d\uff09\u3002
\u53cc\u8def\u5f84 RNN\uff08DPRNN\uff09\uff08Luo \u7b49\uff0c2020\uff09\u89e3\u51b3\u4e86\u5206\u79bb\u4e2d\u7684\u957f\u5e8f\u5217\u5efa\u6a21\u95ee\u9898\u3002DPRNN \u4e0d\u662f\u7528\u5355\u4e2a RNN \u6216 TCN \u5904\u7406\u6574\u4e2a\u7f16\u7801\u5e8f\u5217\uff0c\u800c\u662f\u5c06\u5e8f\u5217\u5206\u5272\u6210\u91cd\u53e0\u7684\u5757\uff0c\u5e76\u6cbf\u7740\u4e24\u6761\u8def\u5f84\u5e94\u7528 RNN\uff1a\u5757\u5185\u8def\u5f84\uff08\u5bf9\u6bcf\u4e2a\u5757\u5185\u7684\u5c40\u90e8\u6a21\u5f0f\u5efa\u6a21\uff09\u548c\u5757\u95f4\u8def\u5f84\uff08\u5bf9\u8de8\u5757\u7684\u5168\u5c40\u6a21\u5f0f\u5efa\u6a21\uff09\u3002\u8fd9\u4f7f RNN \u5e8f\u5217\u957f\u5ea6\u4ece \\(L\\) \u964d\u4f4e\u5230\u6bcf\u4e2a\u7ef4\u5ea6\u4e0a\u7684 \\(\\sqrt{L}\\)\uff1a
\u5176\u4e2d \\(k\\) \u7d22\u5f15\u5757\uff0c\\(n\\) \u7d22\u5f15\u5757\u5185\u7684\u4f4d\u7f6e\u3002\u5757\u5185 LSTM \u5bf9\u56fa\u5b9a \\(k\\) \u7684\u5404 \\(n\\) \u5904\u7406\uff1b\u5757\u95f4 LSTM \u5bf9\u56fa\u5b9a \\(n\\) \u7684\u5404 \\(k\\) \u5904\u7406\u3002
SepFormer\uff08Subakan \u7b49\uff0c2021\uff09\u7528 Transformer\uff08\u7b2c07\u7ae0\uff09\u66ff\u6362\u4e86\u53cc\u8def\u5f84\u6846\u67b6\u4e2d\u7684 RNN\u3002\u5757\u5185 Transformer \u901a\u8fc7\u81ea\u6ce8\u610f\u529b\u6355\u6349\u5c40\u90e8\u4f9d\u8d56\u5173\u7cfb\uff0c\u5757\u95f4 Transformer \u6355\u6349\u5168\u5c40\u4f9d\u8d56\u5173\u7cfb\u3002\u591a\u5934\u6ce8\u610f\u529b\u80fd\u591f\u5efa\u6a21\u957f\u7a0b\u4f9d\u8d56\u5173\u7cfb\u800c\u4e0d\u4f1a\u51fa\u73b0\u68af\u5ea6\u6d88\u5931\u95ee\u9898\uff08\u7b2c06\u7ae0\uff09\uff0c\u8fd9\u4f7f\u5f97 SepFormer \u5bf9\u4e8e\u957f\u5f55\u97f3\u7279\u522b\u6709\u6548\u3002SepFormer \u5728 WSJ0-2mix \u57fa\u51c6\u4e0a\u8fbe\u5230\u4e86\u6700\u5148\u8fdb\u7684\u7ed3\u679c\u3002
\u7f6e\u6362\u4e0d\u53d8\u8bad\u7ec3\uff08PIT\uff09 \u89e3\u51b3\u4e86\u76d1\u7763\u5f0f\u6e90\u5206\u79bb\u4e2d\u7684\u4e00\u4e2a\u57fa\u672c\u95ee\u9898\uff1a\u6807\u7b7e\u5206\u914d\u6b67\u4e49\u3002\u5982\u679c\u7f51\u7edc\u6709\u4e24\u4e2a\u8f93\u51fa\uff08\u5bf9\u5e94\u4e24\u4e2a\u8bf4\u8bdd\u4eba\uff09\uff0c\u54ea\u4e2a\u8f93\u51fa\u5e94\u8be5\u5bf9\u5e94\u54ea\u4e2a\u8bf4\u8bdd\u4eba\uff1f\u6ca1\u6709\u81ea\u7136\u7684\u6392\u5e8f\u3002PIT \u8ba1\u7b97\u6240\u6709\u53ef\u80fd\u5206\u914d\u7684\u635f\u5931\u5e76\u53d6\u6700\u5c0f\u503c\uff1a
\u5176\u4e2d \\(\\mathcal{P}\\) \u662f \\(\\{1, \\ldots, C\\}\\) \u7684\u6240\u6709\u6392\u5217\u96c6\u5408\uff0c\\(\\ell\\) \u662f\u6bcf\u4e2a\u6e90\u7684\u635f\u5931\uff08\u901a\u5e38\u662f\u5c3a\u5ea6\u4e0d\u53d8\u4fe1\u53f7\u5931\u771f\u6bd4 SI-SDR\uff09\u3002\u5bf9\u4e8e \\(C = 2\\) \u4e2a\u6e90\u53ea\u67092\u79cd\u6392\u5217\uff1b\u5bf9\u4e8e \\(C = 3\\) \u67096\u79cd\u3002\u5bf9\u4e8e\u66f4\u5927\u7684 \\(C\\)\uff0c\u53ef\u4ee5\u4f7f\u7528\u5308\u7259\u5229\u7b97\u6cd5\u9ad8\u6548\u8ba1\u7b97\u3002
\u5c3a\u5ea6\u4e0d\u53d8\u4fe1\u53f7\u5931\u771f\u6bd4\uff08SI-SDR\uff09 \u662f\u6e90\u5206\u79bb\u7684\u6807\u51c6\u8bc4\u4f30\u6307\u6807\uff1a
\u5176\u4e2d \\(\\hat{s}\\) \u662f\u4f30\u8ba1\u7684\u6e90\uff0c\\(s\\) \u662f\u771f\u5b9e\u503c\u3002SI-SDR \u5bf9\u4f30\u8ba1\u7684\u603b\u4f53\u5c3a\u5ea6\u4e0d\u53d8\uff0c\u8fd9\u662f\u671f\u671b\u7684\u7279\u6027\uff0c\u56e0\u4e3a\u7edd\u5bf9\u97f3\u91cf\u4e0d\u5982\u5206\u79bb\u8d28\u91cf\u91cd\u8981\u3002\u8f83\u9ad8\u7684 SI-SDR\uff08\u4ee5 dB \u4e3a\u5355\u4f4d\uff09\u66f4\u597d\u3002\u6700\u5148\u8fdb\u7684\u7cfb\u7edf\u5728 WSJ0-2mix \u4e0a\u5b9e\u73b0\u4e86\u7ea6 20-22 dB \u7684 SI-SDR \u6539\u8fdb\u3002
\u97f3\u4e50\u6e90\u5206\u79bb\u5c06\u97f3\u4e50\u5f55\u97f3\u5206\u79bb\u6210\u58f0\u90e8\uff1a\u4eba\u58f0\u3001\u9f13\u3001\u8d1d\u65af\u548c\u5176\u4ed6\u4e50\u5668\u3002\u8fd9\u5b9e\u73b0\u4e86\u5361\u62c9OK\uff08\u53bb\u9664\u4eba\u58f0\uff09\u3001\u91cd\u65b0\u6df7\u97f3\uff08\u8c03\u6574\u4e50\u5668\u7535\u5e73\uff09\u548c\u8f6c\u5f55\uff08\u4e00\u6b21\u5206\u6790\u4e00\u79cd\u4e50\u5668\uff09\u7b49\u5e94\u7528\u3002
Open-Unmix\uff08Stoter \u7b49\uff0c2019\uff09\u662f\u4e00\u4e2a\u53c2\u8003\u57fa\u7ebf\uff0c\u4f7f\u7528\u4e09\u5c42\u53cc\u5411 LSTM \u5728\u5e45\u5ea6 STFT \u57df\u4e2d\u4e3a\u6bcf\u4e2a\u6e90\u9884\u6d4b\u8f6f\u63a9\u853d\u3002\u5b83\u4f7f\u7528\u4e13\u7528\u6a21\u578b\u72ec\u7acb\u5904\u7406\u6bcf\u4e2a\u6e90\u3002Open-Unmix \u867d\u7b80\u5355\u4f46\u6709\u6548\uff0c\u5728 MUSDB18 \u4e0a\u5efa\u7acb\u4e86\u53ef\u91cd\u590d\u7684\u57fa\u51c6\u3002
Demucs\uff08Defossez \u7b49\uff0c2019\uff1b2021\u5e74\u66f4\u65b0\u4e3a Hybrid Demucs\uff09\u4f7f\u7528\u76f4\u63a5\u5728\u6ce2\u5f62\u4e0a\u64cd\u4f5c\u7684 U-Net \u67b6\u6784\uff08\u7b2c08\u7ae0\uff09\u3002\u7f16\u7801\u5668\u901a\u8fc7\u6b65\u957f\u5377\u79ef\u538b\u7f29\u6df7\u5408\u4fe1\u53f7\uff0c\u89e3\u7801\u5668\u901a\u8fc7\u8f6c\u7f6e\u5377\u79ef\u548c\u8df3\u8dc3\u8fde\u63a5\u5c06\u5176\u6269\u5c55\u56de\u6765\uff0c\u6bcf\u4e2a\u6e90\u6709\u5404\u81ea\u7684\u89e3\u7801\u5668\u5934\u3002Hybrid Demucs \u7ed3\u5408\u4e86\u65f6\u57df\u548c\u9891\u57df\u5904\u7406\uff1a\u7f16\u7801\u5668\u5177\u6709\u5e76\u884c\u7684\u65f6\u57df\u548c STFT \u5206\u652f\uff0c\u5176\u7279\u5f81\u5728\u89e3\u7801\u5668\u4e4b\u524d\u878d\u5408\u3002\u8fd9\u540c\u65f6\u6355\u6349\u4e86\u7cbe\u7ec6\u7684\u65f6\u95f4\u7ec6\u8282\u548c\u9891\u8c31\u7ed3\u6784\u3002
Demucs \u5728 MUSDB18 \u4e0a\u8fbe\u5230\u4e86\u6700\u5148\u8fdb\u7684\u5206\u79bb\u8d28\u91cf\uff0c\u7279\u522b\u662f\u4eba\u58f0\u5206\u79bb\u65b9\u9762\u3002\u5176 U-Net \u67b6\u6784\u8ba9\u4eba\u8054\u60f3\u5230\u7b2c08\u7ae0\u4e2d\u7684\u56fe\u50cf\u5206\u5272\u67b6\u6784\uff0c\u5c06\u5206\u79bb\u95ee\u9898\u89c6\u4e3a\u4e00\u79cd\"\u97f3\u9891\u5206\u5272\"\u5f62\u5f0f\u3002
\u4e3b\u52a8\u964d\u566a\uff08ANC\uff09 \u901a\u8fc7\u751f\u6210\u4e00\u4e2a\u4e0e\u566a\u58f0\u76f8\u6d88\u5e72\u6d89\u7684\u53cd\u566a\u58f0\u4fe1\u53f7\u6765\u51cf\u5c11\u4e0d\u9700\u8981\u7684\u58f0\u97f3\u3002\u60f3\u8c61\u4e00\u4e0b\u964d\u566a\u8033\u673a\uff1a\u9ea6\u514b\u98ce\u62fe\u53d6\u73af\u5883\u566a\u58f0\uff0cANC \u7cfb\u7edf\u751f\u6210\u4e00\u4e2a\u53cd\u76f8\u7248\u672c\uff0c\u6df7\u5408\u4fe1\u53f7\uff08\u566a\u58f0 + \u53cd\u566a\u58f0\uff09\u7406\u60f3\u60c5\u51b5\u4e0b\u62b5\u6d88\u4e3a\u9759\u97f3\u3002
\u7269\u7406\u539f\u7406\u5f88\u7b80\u5355\uff1a\u5982\u679c\u566a\u58f0\u662f \\(n(t)\\)\uff0c\u5728\u7a7a\u95f4\u540c\u4e00\u70b9\u751f\u6210 \\(-n(t)\\) \u5219\u4ea7\u751f\u9759\u97f3\uff1a\\(n(t) + (-n(t)) = 0\\)\u3002\u6311\u6218\u5728\u4e8e\u53cd\u566a\u58f0\u5fc5\u987b\u5728\u65f6\u95f4\u3001\u5e45\u5ea6\u548c\u76f8\u4f4d\u4e0a\u7cbe\u786e\u5bf9\u9f50\u3002\u5373\u4f7f\u5f88\u5c0f\u7684\u8bef\u5dee\u4e5f\u4f1a\u4ea7\u751f\u6b8b\u7559\u566a\u58f0\u6216\u4f2a\u5f71\u3002
\u524d\u9988\u5f0f ANC \u4f7f\u7528\u4e00\u4e2a\u53c2\u8003\u9ea6\u514b\u98ce\uff0c\u5728\u566a\u58f0\u5230\u8fbe\u542c\u8005\u4e4b\u524d\u62fe\u53d6\u566a\u58f0\u3002\u7cfb\u7edf\u6709\u65f6\u95f4\u5904\u7406\u566a\u58f0\u5e76\u751f\u6210\u53cd\u566a\u58f0\u3002\u53c2\u8003\u4fe1\u53f7\u901a\u8fc7\u4e00\u4e2a\u81ea\u9002\u5e94\u6ee4\u6ce2\u5668\uff0c\u5176\u8f93\u51fa\u5728\u8bef\u5dee\u9ea6\u514b\u98ce\uff08\u9760\u8fd1\u542c\u8005\uff09\u5904\u4ece\u566a\u58f0\u4e2d\u51cf\u53bb\u3002\u8fd9\u9002\u7528\u4e8e\u53ef\u9884\u6d4b\u7684\u5bbd\u5e26\u566a\u58f0\uff08\u5f15\u64ce\u55e1\u55e1\u58f0\u3001\u98ce\u6247\u566a\u58f0\uff09\u3002
\u53cd\u9988\u5f0f ANC \u4ec5\u4f7f\u7528\u542c\u8005\u8033\u8fb9\u7684\u8bef\u5dee\u9ea6\u514b\u98ce\u3002\u7cfb\u7edf\u4ece\u6b8b\u4f59\u4fe1\u53f7\uff08\u542c\u8005\u5b9e\u9645\u542c\u5230\u7684\uff09\u4e2d\u4f30\u8ba1\u566a\u58f0\u5e76\u8c03\u6574\u53cd\u566a\u58f0\u3002\u53cd\u9988\u5f0f ANC \u66f4\u7b80\u5355\uff08\u4e0d\u9700\u8981\u53c2\u8003\u9ea6\u514b\u98ce\uff09\uff0c\u4f46\u5e26\u5bbd\u6709\u9650\u4e14\u53ef\u80fd\u53d8\u5f97\u4e0d\u7a33\u5b9a\u3002
\u81ea\u9002\u5e94\u6ee4\u6ce2\u662f ANC \u80cc\u540e\u7684\u6570\u5b66\u5f15\u64ce\u3002\u6ee4\u6ce2\u5668\u7cfb\u6570\u5fc5\u987b\u4e0d\u65ad\u9002\u5e94\u53d8\u5316\u7684\u566a\u58f0\u73af\u5883\u3002\u6700\u5e38\u7528\u7684\u7b97\u6cd5\u662f\u6700\u5c0f\u5747\u65b9\uff08LMS\uff09\u6ee4\u6ce2\u5668\u3002
\u5176\u4e2d \\(\\mu\\) \u662f\u6b65\u957f\uff08\u5b66\u4e60\u7387\uff09\u3002\u8fd9\u662f\u5bf9\u5747\u65b9\u8bef\u5dee \\(E[e^2(n)]\\) \u7684\u4e00\u4e2a\u968f\u673a\u68af\u5ea6\u4e0b\u964d\u6b65\u9aa4\uff0c\u4f7f\u7528\u77ac\u65f6\u68af\u5ea6\u4f30\u8ba1 \\(-2 e(n) \\mathbf{x}(n)\\) \u4ee3\u66ff\u771f\u5b9e\u68af\u5ea6\uff08\u7b2c03\u7ae0\u7684\u68af\u5ea6\u4e0b\u964d\u548c\u7b2c06\u7ae0\u7684 SGD\uff09\u3002
\u6b65\u957f \\(\\mu\\) \u63a7\u5236\u6536\u655b\u901f\u5ea6\u4e0e\u7a33\u6001\u8bef\u5dee\u4e4b\u95f4\u7684\u6743\u8861\u3002\u8fc7\u5927\u5219\u6ee4\u6ce2\u5668\u632f\u8361\u6216\u53d1\u6563\uff1b\u8fc7\u5c0f\u5219\u81ea\u9002\u5e94\u901f\u5ea6\u8fdf\u7f13\u3002\u7a33\u5b9a\u6761\u4ef6\u4e3a \\(0 < \\mu < 2 / (\\lambda_{\\max})\\)\uff0c\u5176\u4e2d \\(\\lambda_{\\max}\\) \u662f\u8f93\u5165\u81ea\u76f8\u5173\u77e9\u9635 \\(R = E[\\mathbf{x}\\mathbf{x}^T]\\) \u7684\u6700\u5927\u7279\u5f81\u503c\u3002
\u5f52\u4e00\u5316 LMS\uff08NLMS\uff09 \u901a\u8fc7\u8f93\u5165\u529f\u7387\u5bf9\u6b65\u957f\u8fdb\u884c\u5f52\u4e00\u5316\uff0c\u4f7f\u6536\u655b\u4e0e\u4fe1\u53f7\u7535\u5e73\u65e0\u5173\uff1a
\u5176\u4e2d \\(\\epsilon\\) \u662f\u4e00\u4e2a\u5c0f\u7684\u6b63\u5219\u5316\u5e38\u6570\uff0c\u4ee5\u9632\u6b62\u9664\u96f6\u3002NLMS \u6bd4 LMS \u66f4\u53ef\u9760\u5730\u6536\u655b\uff0c\u56e0\u4e3a\u6709\u6548\u6b65\u957f\u81ea\u9002\u5e94\u5730\u9002\u5e94\u8f93\u5165\u529f\u7387\u3002
\u9012\u5f52\u6700\u5c0f\u4e8c\u4e58\uff08RLS\uff09 \u662f\u4e00\u79cd\u6536\u655b\u66f4\u5feb\u7684\u66ff\u4ee3\u65b9\u6cd5\uff0c\u5b83\u6700\u5c0f\u5316\u52a0\u6743\u6700\u5c0f\u4e8c\u4e58\u4ee3\u4ef7 \\(\\sum_{k=1}^{n} \\lambda^{n-k} e^2(k)\\)\uff0c\u5176\u4e2d \\(\\lambda \\in (0, 1]\\) \u662f\u9057\u5fd8\u56e0\u5b50\u3002RLS \u7ef4\u62a4\u9006\u81ea\u76f8\u5173\u77e9\u9635\u7684\u4f30\u8ba1\u5e76\u9012\u5f52\u66f4\u65b0\uff0c\u4ee5\u6bcf\u4e2a\u6837\u672c \\(O(L^2)\\) \u7684\u8ba1\u7b97\u6210\u672c\uff08\u76f8\u5bf9\u4e8e LMS \u7684 \\(O(L)\\)\uff09\u5b9e\u73b0\u6700\u4f18\u6536\u655b\u3002
\u964d\u566a\u4e0e\u8bed\u97f3\u589e\u5f3a\u65e8\u5728\u63d0\u9ad8\u5608\u6742\u5f55\u97f3\u4e2d\u7684\u8bed\u97f3\u8d28\u91cf\u548c\u53ef\u61c2\u5ea6\u3002\u4e0e\u6e90\u5206\u79bb\uff08\u5206\u79bb\u4e0d\u540c\u7684\u6e90\uff09\u4e0d\u540c\uff0c\u8bed\u97f3\u589e\u5f3a\u4e13\u95e8\u9488\u5bf9\u8bed\u97f3\u52a0\u566a\u58f0\u7684\u60c5\u51b5\uff0c\u4ece\u5e26\u566a\u89c2\u6d4b\u4e2d\u6062\u590d\u5e72\u51c0\u7684\u8bed\u97f3\u3002
\u8c31\u51cf\u6cd5\u662f\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u3002\u5728\u7eaf\u566a\u58f0\u5e27\uff08\u7531\u6587\u4ef603\u4e2d\u7684 VAD \u68c0\u6d4b\uff09\u671f\u95f4\uff0c\u4f30\u8ba1\u566a\u58f0\u9891\u8c31 \\(|\\hat{N}(f)|^2\\)\u3002\u7136\u540e\u5c06\u5176\u4ece\u6bcf\u4e2a\u5e27\u4e2d\u51cf\u53bb\uff1a
\u5176\u4e2d \\(\\alpha\\) \u662f\u8fc7\u51cf\u56e0\u5b50\uff08\u901a\u5e38\u4e3a1-4\uff0c\u6fc0\u8fdb\u7684\u51cf\u6cd5\u53bb\u9664\u66f4\u591a\u566a\u58f0\u4f46\u5f15\u5165\u66f4\u591a\u4f2a\u5f71\uff09\uff0c\\(\\beta\\) \u662f\u9891\u8c31\u5730\u677f\uff0c\u9632\u6b62\u51fa\u73b0\u8d1f\u503c\u5e76\u51cf\u5c11\"\u97f3\u4e50\u566a\u58f0\"\u4f2a\u5f71\uff08\u542c\u8d77\u6765\u50cf\u968f\u673a\u97f3\u7b26\u7684\u5b64\u7acb\u97f3\u8c03\u6b8b\u7559\uff09\u3002
\u7ef4\u7eb3\u6ee4\u6ce2\u63d0\u4f9b\u4e86\u5e72\u51c0\u8bed\u97f3\u9891\u8c31\u7684\u6700\u5c0f\u5747\u65b9\u8bef\u5dee\u4f30\u8ba1\uff1a
\u7ef4\u7eb3\u589e\u76ca \\(G(t, f) = \\text{SNR}(t, f) / (1 + \\text{SNR}(t, f))\\) \u7684\u8303\u56f4\u4ece0\uff08\u7eaf\u566a\u58f0\uff09\u52301\uff08\u7eaf\u8bed\u97f3\uff09\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u8f6f\u63a9\u853d\u3002\u6311\u6218\u5728\u4e8e\u4f30\u8ba1\u8bed\u97f3\u548c\u566a\u58f0\u7684\u529f\u7387\u8c31\u3002\u5148\u9a8c SNR \\(\\xi(t, f) = |S(t,f)|^2 / |N(t,f)|^2\\) \u4f7f\u7528\"\u51b3\u7b56\u5bfc\u5411\"\u65b9\u6cd5\u4f30\u8ba1\uff1a\u5f53\u524d\u5e27\u4f30\u8ba1\u4e0e\u524d\u4e00\u5e27\u7ef4\u7eb3\u6ee4\u6ce2\u8f93\u51fa\u7684\u5e73\u6ed1\u7ec4\u5408\u3002
\u795e\u7ecf\u8bed\u97f3\u589e\u5f3a\u4f7f\u7528\u6df1\u5ea6\u5b66\u4e60\u6765\u4f30\u8ba1\u63a9\u853d\uff08\u5982\u7ef4\u7eb3\u589e\u76ca\uff09\u6216\u76f4\u63a5\u4f30\u8ba1\u5e72\u51c0\u8bed\u8c31\u56fe\u3002\u67b6\u6784\u4ece\u7b80\u5355\u7684\u524d\u9988\u7f51\u7edc\u5230 U-Net\uff08\u7b2c08\u7ae0\uff09\u3001CRN\uff08\u5377\u79ef\u9012\u5f52\u7f51\u7edc\uff09\u548c Transformer\u3002
DCCRN\uff08\u6df1\u5ea6\u590d\u6570\u5377\u79ef\u9012\u5f52\u7f51\u7edc\uff09\u5728\u590d\u6570 STFT\uff08\u5e45\u5ea6\u548c\u76f8\u4f4d\uff09\u4e0a\u64cd\u4f5c\uff0c\u4f7f\u7528\u81ea\u7136\u5904\u7406\u5b9e\u90e8\u548c\u865a\u90e8\u7684\u590d\u6570\u503c\u5377\u79ef\u3002\u8fd9\u907f\u514d\u4e86\u4ec5\u5e45\u5ea6\u65b9\u6cd5\u6240\u56f0\u6270\u7684\u76f8\u4f4d\u4f30\u8ba1\u95ee\u9898\u3002
FullSubNet \u4f7f\u7528\u53cc\u8def\u5f84\u67b6\u6784\uff0c\u5305\u542b\u4e00\u4e2a\u5168\u9891\u5e26\u6a21\u578b\uff08\u6355\u6349\u5168\u5c40\u9891\u8c31\u6a21\u5f0f\uff09\u548c\u4e00\u4e2a\u5b50\u9891\u5e26\u6a21\u578b\uff08\u6355\u6349\u5c40\u90e8\u8c10\u6ce2\u7ec6\u8282\uff09\u3002\u5168\u9891\u5e26\u6a21\u578b\u5904\u7406\u6574\u4e2a\u9891\u8c31\uff0c\u800c\u5b50\u9891\u5e26\u6a21\u578b\u5904\u7406\u4ee5\u6bcf\u4e2a\u9891\u7387\u5355\u5143\u4e3a\u4e2d\u5fc3\u7684\u7a84\u9891\u5e26\u3002\u5b83\u4eec\u7684\u8f93\u51fa\u88ab\u7ec4\u5408\u7528\u4e8e\u6700\u7ec8\u7684\u63a9\u853d\u4f30\u8ba1\u3002
DNS\uff08\u6df1\u5ea6\u566a\u58f0\u6291\u5236\uff09\u6311\u6218\u8d5b\u7531\u5fae\u8f6f\u6bcf\u5e74\u4e3e\u529e\uff0c\u5bf9\u8bed\u97f3\u589e\u5f3a\u7cfb\u7edf\u8fdb\u884c\u57fa\u51c6\u6d4b\u8bd5\u3002\u83b7\u80dc\u8005\u901a\u5e38\u4f7f\u7528\u5927\u89c4\u6a21\u8bad\u7ec3\uff0c\u5305\u542b\u591a\u79cd\u566a\u58f0\u7c7b\u578b\u3001\u6570\u636e\u589e\u5f3a\uff08\u4ee5\u5404\u79cd SNR \u6dfb\u52a0\u566a\u58f0\u3001\u6df7\u54cd\u3001\u7f16\u89e3\u7801\u5668\u4f2a\u5f71\uff09\u4ee5\u53ca\u652f\u6301\u5b9e\u65f6\u5904\u7406\u7684\u67b6\u6784\u3002
\u56de\u58f0\u6d88\u9664\u5728\u53cc\u5411\u901a\u4fe1\u4e2d\u53bb\u9664\u58f0\u5b66\u56de\u58f0\u3002\u5f53\u4f60\u5728\u7535\u8bdd\u901a\u8bdd\u4e2d\u65f6\uff0c\u8fdc\u7aef\u8bf4\u8bdd\u4eba\u7684\u58f0\u97f3\u901a\u8fc7\u4f60\u7684\u626c\u58f0\u5668\u64ad\u653e\uff0c\u5728\u623f\u95f4\u5185\u53cd\u5f39\uff0c\u5e76\u88ab\u4f60\u7684\u9ea6\u514b\u98ce\u62fe\u53d6\uff0c\u4ea7\u751f\u8fdc\u7aef\u8bf4\u8bdd\u4eba\u542c\u5230\u7684\u56de\u58f0\u3002\u58f0\u5b66\u56de\u58f0\u6d88\u9664\uff08AEC\uff09 \u5bf9\u4ece\u626c\u58f0\u5668\u5230\u9ea6\u514b\u98ce\u7684\u58f0\u5b66\u8def\u5f84\u8fdb\u884c\u5efa\u6a21\u5e76\u51cf\u53bb\u9884\u6d4b\u7684\u56de\u58f0\u3002
\u58f0\u5b66\u8def\u5f84\u88ab\u5efa\u6a21\u4e3a\u4e00\u4e2a\u81ea\u9002\u5e94 FIR \u6ee4\u6ce2\u5668\uff08\u4f7f\u7528 LMS \u6216 NLMS\uff09\uff0c\u4ee5\u8fdc\u7aef\u4fe1\u53f7\u4e3a\u8f93\u5165\u3002\u6ee4\u6ce2\u5668\u5bf9\u623f\u95f4\u8109\u51b2\u54cd\u5e94\u8fdb\u884c\u5efa\u6a21\uff0c\u5305\u62ec\u76f4\u8fbe\u8def\u5f84\u3001\u65e9\u671f\u53cd\u5c04\u548c\u665a\u671f\u6df7\u54cd\u3002\u623f\u95f4\u8109\u51b2\u54cd\u5e94\u53ef\u80fd\u957f\u8fbe\u6570\u767e\u6beb\u79d2\uff0c\u9700\u8981\u6570\u5343\u4e2a\u62bd\u5934\u7684\u6ee4\u6ce2\u5668\u3002
\u53cc\u8bb2\u68c0\u6d4b\u5bf9 AEC \u81f3\u5173\u91cd\u8981\uff1a\u5f53\u8fd1\u7aef\u548c\u8fdc\u7aef\u8bf4\u8bdd\u4eba\u540c\u65f6\u8bf4\u8bdd\u65f6\uff0c\u81ea\u9002\u5e94\u6ee4\u6ce2\u5668\u5fc5\u987b\u51bb\u7ed3\uff08\u505c\u6b62\u66f4\u65b0\uff09\uff0c\u4ee5\u9632\u6b62\u5176\u62b5\u6d88\u8fd1\u7aef\u8bf4\u8bdd\u4eba\u7684\u58f0\u97f3\u3002\u53cc\u8bb2\u68c0\u6d4b\u5668\u5c06\u8bef\u5dee\u4fe1\u53f7\u7684\u80fd\u91cf\u4e0e\u8fdc\u7aef\u4fe1\u53f7\u80fd\u91cf\u8fdb\u884c\u6bd4\u8f83\uff1b\u65e0\u6cd5\u7528\u8fdc\u7aef\u4fe1\u53f7\u89e3\u91ca\u7684\u8bef\u5dee\u80fd\u91cf\u7a81\u7136\u589e\u52a0\u8868\u660e\u5b58\u5728\u8fd1\u7aef\u8bed\u97f3\u3002
\u8fdc\u7aef\u4fe1\u53f7 \\(x(n)\\) \u4e0e\u9ea6\u514b\u98ce\u4fe1\u53f7 \\(d(n)\\) \u4e4b\u95f4\u7684\u5f52\u4e00\u5316\u4e92\u76f8\u5173\u63d0\u4f9b\u4e86\u4e00\u4e2a\u53cc\u8bb2\u6307\u793a\u7b26\uff1a
\u5728\u5355\u8bb2\u671f\u95f4\uff08\u4ec5\u8fdc\u7aef\uff09\uff0c\\(\\xi\\) \u8f83\u9ad8\uff0c\u56e0\u4e3a \\(d\\) \u4e3b\u8981\u662f \\(x\\) \u7684\u56de\u58f0\u3002\u5728\u53cc\u8bb2\u671f\u95f4\uff0c\\(\\xi\\) \u4e0b\u964d\uff0c\u56e0\u4e3a\u8fd1\u7aef\u8bed\u97f3\u4e0e \\(x\\) \u4e0d\u76f8\u5173\u3002
\u73b0\u4ee3 AEC \u7cfb\u7edf\u5c06\u81ea\u9002\u5e94\u6ee4\u6ce2\u4e0e\u795e\u7ecf\u7f51\u7edc\u76f8\u7ed3\u5408\uff1a\u81ea\u9002\u5e94\u6ee4\u6ce2\u5668\u63d0\u4f9b\u521d\u59cb\u56de\u58f0\u4f30\u8ba1\uff0c\u795e\u7ecf\u7f51\u7edc\uff08\u7c7b\u4f3c\u4e8e\u4e0a\u8ff0\u8bed\u97f3\u589e\u5f3a\u6a21\u578b\uff09\u6e05\u7406\u6b8b\u4f59\u56de\u58f0\u5e76\u5904\u7406\u7ebf\u6027\u6ee4\u6ce2\u5668\u65e0\u6cd5\u6355\u6349\u7684\u975e\u7ebf\u6027\uff08\u626c\u58f0\u5668\u5931\u771f\uff09\u3002
\u5206\u79bb\u4e0e\u589e\u5f3a\u7684\u8bc4\u4f30\u6307\u6807\uff1a
import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# \u751f\u6210\u4e24\u4e2a\u6e90\u4fe1\u53f7\nsr = 8000\nduration = 1.0\nt = jnp.linspace(0, duration, int(sr * duration))\n\n# \u6e90 1\uff1a\u6b63\u5f26\u6ce2\uff08\u7c7b\u4f3c\u97f3\u8c03\uff09\ns1 = jnp.sin(2 * jnp.pi * 440 * t) + 0.3 * jnp.sin(2 * jnp.pi * 880 * t)\n\n# \u6e90 2\uff1a\u952f\u9f7f\u6ce2\uff08\u4e30\u5bcc\u7684\u8c10\u6ce2\uff09\ns2 = 2 * (t * 200 % 1) - 1 # 200 Hz \u952f\u9f7f\u6ce2\n\n# \u5f52\u4e00\u5316\u6e90\u4fe1\u53f7\ns1 = s1 / jnp.max(jnp.abs(s1))\ns2 = s2 / jnp.max(jnp.abs(s2))\nsources = jnp.stack([s1, s2]) # (2, T)\n\n# \u6df7\u53e0\u77e9\u9635\uff08\u7b97\u6cd5\u672a\u77e5\uff09\nA = jnp.array([[0.8, 0.4],\n [0.3, 0.9]])\nmixtures = A @ sources # (2, T)\n\n# FastICA \u5b9e\u73b0\ndef whiten(X):\n \"\"\"\u6570\u636e\u4e2d\u5fc3\u5316\u4e0e\u767d\u5316\u3002\"\"\"\n X_centered = X - jnp.mean(X, axis=1, keepdims=True)\n cov = (X_centered @ X_centered.T) / X_centered.shape[1]\n eigvals, eigvecs = jnp.linalg.eigh(cov)\n D_inv_sqrt = jnp.diag(1.0 / jnp.sqrt(eigvals + 1e-8))\n whitening = D_inv_sqrt @ eigvecs.T\n return whitening @ X_centered, whitening\n\ndef fastica(X, n_components=2, max_iter=200, tol=1e-6):\n \"\"\"\u4f7f\u7528 tanh \u975e\u7ebf\u6027\u7684 FastICA\uff08\u8d1f\u71b5\u8fd1\u4f3c\uff09\u3002\"\"\"\n X_white, whitening = whiten(X)\n n, T = X_white.shape\n\n key = jr.PRNGKey(42)\n W = jr.normal(key, (n_components, n))\n # \u6b63\u4ea4\u5316 W\n U, _, Vt = jnp.linalg.svd(W, full_matrices=False)\n W = U @ Vt\n\n for iteration in range(max_iter):\n W_old = W.copy()\n\n # \u5bf9\u6bcf\u4e2a\u5206\u91cf\n for i in range(n_components):\n w = W[i]\n # w^T X_white: (T,)\n wx = w @ X_white # (T,)\n\n # g(u) = tanh(u), g'(u) = 1 - tanh^2(u)\n g_wx = jnp.tanh(wx)\n g_prime_wx = 1 - g_wx ** 2\n\n # Newton \u66f4\u65b0: w_new = E[X * g(w^T X)] - E[g'(w^T X)] * w\n w_new = jnp.mean(X_white * g_wx[None, :], axis=1) - \\\n jnp.mean(g_prime_wx) * w\n\n # \u4e0e\u4e4b\u524d\u7684\u5206\u91cf\u53bb\u76f8\u5173\uff08\u6d88\u53bb\u6cd5\uff09\n for j in range(i):\n w_new = w_new - jnp.dot(w_new, W[j]) * W[j]\n\n w_new = w_new / jnp.linalg.norm(w_new)\n W = W.at[i].set(w_new)\n\n # \u68c0\u67e5\u6536\u655b\n convergence = jnp.min(jnp.abs(jnp.diag(W @ W_old.T)))\n if convergence > 1 - tol:\n print(f\"FastICA \u5728 {iteration + 1} \u6b21\u8fed\u4ee3\u540e\u6536\u655b\")\n break\n\n # \u89e3\u6df7\u77e9\u9635\n unmixing = W @ whitening\n recovered = unmixing @ X\n return recovered, unmixing\n\nrecovered, W_unmix = fastica(mixtures)\n\n# \u4fee\u590d\u7b26\u53f7\u6b67\u4e49\uff08ICA \u53ef\u80fd\u7ffb\u8f6c\u7b26\u53f7\uff09\nfor i in range(2):\n if jnp.corrcoef(recovered[i], sources[i])[0, 1] < -0.5:\n recovered = recovered.at[i].set(-recovered[i])\n\n# \u5982\u679c\u6e90\u88ab\u4ea4\u6362\uff0c\u4fee\u590d\u6392\u5217\ncorr_00 = jnp.abs(jnp.corrcoef(recovered[0], sources[0])[0, 1])\ncorr_01 = jnp.abs(jnp.corrcoef(recovered[0], sources[1])[0, 1])\nif corr_01 > corr_00:\n recovered = recovered[::-1]\n\n# \u5f52\u4e00\u5316\u4ee5\u4fbf\u663e\u793a\nrecovered = recovered / jnp.max(jnp.abs(recovered), axis=1, keepdims=True)\n\nfig, axes = plt.subplots(3, 2, figsize=(14, 9))\n\naxes[0, 0].plot(t[:1000], s1[:1000], color='#3498db', linewidth=0.8)\naxes[0, 0].set_title('\u6e90\u4fe1\u53f7 1\uff08\u539f\u59cb\uff09')\naxes[0, 0].set_ylabel('\u5e45\u5ea6')\n\naxes[0, 1].plot(t[:1000], s2[:1000], color='#e74c3c', linewidth=0.8)\naxes[0, 1].set_title('\u6e90\u4fe1\u53f7 2\uff08\u539f\u59cb\uff09')\n\naxes[1, 0].plot(t[:1000], mixtures[0, :1000], color='#9b59b6', linewidth=0.8)\naxes[1, 0].set_title('\u6df7\u5408\u4fe1\u53f7 1\uff08\u9ea6\u514b\u98ce 1\uff09')\naxes[1, 0].set_ylabel('\u5e45\u5ea6')\n\naxes[1, 1].plot(t[:1000], mixtures[1, :1000], color='#9b59b6', linewidth=0.8)\naxes[1, 1].set_title('\u6df7\u5408\u4fe1\u53f7 2\uff08\u9ea6\u514b\u98ce 2\uff09')\n\naxes[2, 0].plot(t[:1000], recovered[0, :1000], color='#27ae60', linewidth=0.8)\naxes[2, 0].set_title('\u6062\u590d\u7684\u6e90\u4fe1\u53f7 1\uff08FastICA\uff09')\naxes[2, 0].set_ylabel('\u5e45\u5ea6')\naxes[2, 0].set_xlabel('\u65f6\u95f4 (s)')\n\naxes[2, 1].plot(t[:1000], recovered[1, :1000], color='#f39c12', linewidth=0.8)\naxes[2, 1].set_title('\u6062\u590d\u7684\u6e90\u4fe1\u53f7 2\uff08FastICA\uff09')\naxes[2, 1].set_xlabel('\u65f6\u95f4 (s)')\n\nplt.tight_layout()\nplt.show()\n\n# \u62a5\u544a\u4e0e\u539f\u59cb\u4fe1\u53f7\u7684\u76f8\u5173\u6027\nfor i in range(2):\n corr = jnp.corrcoef(recovered[i], sources[i])[0, 1]\n print(f\"\u6e90 {i+1} \u6062\u590d\u76f8\u5173\u6027: {corr:.4f}\")\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# \u751f\u6210\u4e24\u4e2a\u5177\u6709\u4e0d\u540c\u9891\u8c31\u7279\u5f81\u7684\u4fe1\u53f7\nsr = 8000\nduration = 1.0\nt = jnp.linspace(0, duration, int(sr * duration))\n\n# \u6e90 1\uff1a\u4f4e\u9891\u8c10\u6ce2\uff08\u6a21\u62df\u8d1d\u65af\uff09\nsrc1 = (jnp.sin(2 * jnp.pi * 100 * t) +\n 0.5 * jnp.sin(2 * jnp.pi * 200 * t) +\n 0.3 * jnp.sin(2 * jnp.pi * 300 * t))\n\n# \u6e90 2\uff1a\u9ad8\u9891\u8c10\u6ce2\uff08\u6a21\u62df\u957f\u7b1b\uff09\nsrc2 = (jnp.sin(2 * jnp.pi * 800 * t) +\n 0.4 * jnp.sin(2 * jnp.pi * 1600 * t))\n\n# \u65f6\u53d8\u5e45\u5ea6\uff08\u6e90\u5728\u4e0d\u540c\u65f6\u95f4\u6fc0\u6d3b\uff09\nenv1 = jnp.where(t < 0.5, 1.0, 0.3)\nenv2 = jnp.where(t > 0.3, 1.0, 0.2)\nsrc1 = src1 * env1\nsrc2 = src2 * env2\n\nmixture = src1 + src2\n\n# \u8ba1\u7b97\u5e45\u5ea6\u8bed\u8c31\u56fe\uff08STFT\uff09\nn_fft = 512\nhop = 128\nwindow = jnp.hanning(n_fft)\n\ndef compute_stft(signal, n_fft, hop, window):\n n_frames = 1 + (len(signal) - n_fft) // hop\n frames = jnp.stack([\n signal[i * hop : i * hop + n_fft] * window\n for i in range(n_frames)\n ])\n return jnp.fft.rfft(frames, n=n_fft)\n\nS_mix = compute_stft(mixture, n_fft, hop, window)\nV = jnp.abs(S_mix).T # (F, T) - \u9891\u7387 x \u65f6\u95f4\nphase = jnp.angle(S_mix).T\n\nF, T = V.shape\nprint(f\"\u8bed\u8c31\u56fe\u5f62\u72b6: {F} \u4e2a\u9891\u7387 bin x {T} \u4e2a\u65f6\u95f4\u5e27\")\n\n# NMF: V \u2248 WH \u4f7f\u7528\u4e58\u6cd5\u66f4\u65b0\u89c4\u5219\ndef nmf(V, K, n_iter=200, key=jr.PRNGKey(0)):\n \"\"\"\u4f7f\u7528 Frobenius \u8303\u6570\u7684\u975e\u8d1f\u77e9\u9635\u5206\u89e3\u3002\"\"\"\n k1, k2 = jr.split(key)\n W = jnp.abs(jr.normal(k1, (F, K))) * 0.1 + 0.01 # (F, K)\n H = jnp.abs(jr.normal(k2, (K, T))) * 0.1 + 0.01 # (K, T)\n\n costs = []\n for i in range(n_iter):\n # H \u7684\u4e58\u6cd5\u66f4\u65b0\n WtV = W.T @ V\n WtWH = W.T @ W @ H + 1e-8\n H = H * (WtV / WtWH)\n\n # W \u7684\u4e58\u6cd5\u66f4\u65b0\n VHt = V @ H.T\n WHHt = W @ H @ H.T + 1e-8\n W = W * (VHt / WHHt)\n\n cost = jnp.sum((V - W @ H) ** 2)\n costs.append(float(cost))\n\n return W, H, costs\n\n# \u8fd0\u884c K=2 \u4e2a\u5206\u91cf\u7684 NMF\nK = 2\nW, H, costs = nmf(V, K, n_iter=300)\n\n# \u4f7f\u7528\u8f6f\u63a9\u853d\u91cd\u5efa\u6bcf\u4e2a\u6e90\nV_hat = W @ H\nmask1 = (W[:, 0:1] @ H[0:1, :]) / (V_hat + 1e-8)\nmask2 = (W[:, 1:2] @ H[1:2, :]) / (V_hat + 1e-8)\n\nV_src1 = mask1 * V\nV_src2 = mask2 * V\n\n# \u53ef\u89c6\u5316\nfig, axes = plt.subplots(3, 2, figsize=(14, 10))\n\n# \u6df7\u5408\u4fe1\u53f7\u8bed\u8c31\u56fe\naxes[0, 0].imshow(jnp.log1p(V), aspect='auto', origin='lower', cmap='magma')\naxes[0, 0].set_title('\u6df7\u5408\u4fe1\u53f7\u8bed\u8c31\u56fe |X|')\naxes[0, 0].set_ylabel('\u9891\u7387 bin')\n\n# NMF \u6536\u655b\naxes[0, 1].plot(costs, color='#3498db', linewidth=1.5)\naxes[0, 1].set_title('NMF \u6536\u655b\u66f2\u7ebf')\naxes[0, 1].set_xlabel('\u8fed\u4ee3\u6b21\u6570')\naxes[0, 1].set_ylabel('Frobenius \u4ee3\u4ef7')\naxes[0, 1].set_yscale('log')\n\n# \u9891\u8c31\u57fa\u5411\u91cf W\nfreq_hz = jnp.arange(F) * sr / n_fft\naxes[1, 0].plot(freq_hz, W[:, 0], color='#27ae60', linewidth=1.5,\n label='\u57fa 1\uff08\u4f4e\u9891\uff09')\naxes[1, 0].plot(freq_hz, W[:, 1], color='#e74c3c', linewidth=1.5,\n label='\u57fa 2\uff08\u9ad8\u9891\uff09')\naxes[1, 0].set_title('\u5b66\u4e60\u5230\u7684\u9891\u8c31\u57fa W')\naxes[1, 0].set_xlabel('\u9891\u7387 (Hz)')\naxes[1, 0].set_ylabel('\u5e45\u5ea6')\naxes[1, 0].legend()\n\n# \u65f6\u57df\u6fc0\u6d3b H\ntime_s = jnp.arange(T) * hop / sr\naxes[1, 1].plot(time_s, H[0], color='#27ae60', linewidth=1.5,\n label='\u6fc0\u6d3b 1')\naxes[1, 1].plot(time_s, H[1], color='#e74c3c', linewidth=1.5,\n label='\u6fc0\u6d3b 2')\naxes[1, 1].set_title('\u65f6\u57df\u6fc0\u6d3b H')\naxes[1, 1].set_xlabel('\u65f6\u95f4 (s)')\naxes[1, 1].set_ylabel('\u6fc0\u6d3b\u503c')\naxes[1, 1].legend()\n\n# \u5206\u79bb\u540e\u7684\u8bed\u8c31\u56fe\naxes[2, 0].imshow(jnp.log1p(V_src1), aspect='auto', origin='lower', cmap='magma')\naxes[2, 0].set_title('\u5206\u79bb\u540e\u7684\u6e90\u4fe1\u53f7 1\uff08\u4f4e\u9891\uff09')\naxes[2, 0].set_ylabel('\u9891\u7387 bin')\naxes[2, 0].set_xlabel('\u65f6\u95f4\u5e27')\n\naxes[2, 1].imshow(jnp.log1p(V_src2), aspect='auto', origin='lower', cmap='magma')\naxes[2, 1].set_title('\u5206\u79bb\u540e\u7684\u6e90\u4fe1\u53f7 2\uff08\u9ad8\u9891\uff09')\naxes[2, 1].set_xlabel('\u65f6\u95f4\u5e27')\n\nplt.tight_layout()\nplt.show()\n\nprint(f\"\u91cd\u5efa\u8bef\u5dee: {jnp.sum((V - W @ H)**2):.2f}\")\nprint(f\"NMF \u5b66\u4e60\u5230\u7684\u9891\u8c31\u57fa\u80fd\u591f\u6355\u6349\u6bcf\u4e2a\u6e90\u7684\u9891\u7387\u7279\u5f81\u3002\")\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# \u6a21\u62df\u56de\u58f0\u6d88\u9664\u573a\u666f\n# \u8fdc\u7aef\u4fe1\u53f7 -> \u623f\u95f4\u8109\u51b2\u54cd\u5e94 -> \u9ea6\u514b\u98ce\u5904\u7684\u56de\u58f0\n# \u8fd1\u7aef\u8bed\u97f3\u662f\u6211\u4eec\u5e0c\u671b\u4fdd\u7559\u7684\u76ee\u6807\u4fe1\u53f7\n\nsr = 8000\nduration = 2.0\nn_samples = int(sr * duration)\nkey = jr.PRNGKey(42)\nkeys = jr.split(key, 5)\n\n# \u8fdc\u7aef\u4fe1\u53f7\uff08\u53c2\u8003\uff09\uff1a\u968f\u673a\u7684\u7c7b\u8bed\u97f3\u4fe1\u53f7\nfar_end = jr.normal(keys[0], (n_samples,)) * 0.5\n\n# \u623f\u95f4\u8109\u51b2\u54cd\u5e94\uff08\u7b97\u6cd5\u672a\u77e5\uff09\nrir_length = 64\nrir = jnp.zeros(rir_length)\nrir = rir.at[0].set(0.8) # \u76f4\u8fbe\u8def\u5f84\nrir = rir.at[5].set(0.3) # \u65e9\u671f\u53cd\u5c04\nrir = rir.at[12].set(-0.2) # \u53cd\u5c04\nrir = rir.at[25].set(0.1) # \u665a\u671f\u53cd\u5c04\nrir = rir.at[40].set(-0.05)\n\n# \u56de\u58f0\uff1a\u8fdc\u7aef\u4fe1\u53f7\u4e0e RIR \u7684\u5377\u79ef\necho = jnp.convolve(far_end, rir)[:n_samples]\n\n# \u8fd1\u7aef\u8bed\u97f3\uff08\u5728\u4fe1\u53f7\u7684\u4e00\u90e8\u5206\u4e2d\u6d3b\u8dc3\uff09\nnear_end = jnp.zeros(n_samples)\nstart, end = n_samples // 3, 2 * n_samples // 3\nnear_speech = 0.3 * jnp.sin(\n 2 * jnp.pi * 300 * jnp.linspace(0, (end - start) / sr, end - start)\n)\nnear_end = near_end.at[start:end].set(near_speech)\n\n# \u9ea6\u514b\u98ce\u4fe1\u53f7\uff1a\u56de\u58f0 + \u8fd1\u7aef + \u566a\u58f0\nnoise = jr.normal(keys[1], (n_samples,)) * 0.01\nmic_signal = echo + near_end + noise\n\n# LMS \u81ea\u9002\u5e94\u6ee4\u6ce2\u5668\ndef lms_filter(reference, desired, filter_length, mu):\n \"\"\"\u6807\u51c6 LMS \u81ea\u9002\u5e94\u6ee4\u6ce2\u5668\u3002\"\"\"\n n = len(reference)\n w = jnp.zeros(filter_length)\n output = jnp.zeros(n)\n error = jnp.zeros(n)\n w_history = []\n\n for i in range(filter_length, n):\n x = reference[max(0, i-filter_length+1):i+1][::-1]\n\n y = jnp.dot(w, x)\n e = desired[i] - y\n w = w + mu * e * x\n\n output = output.at[i].set(y)\n error = error.at[i].set(e)\n\n if i % 500 == 0:\n w_history.append(w.copy())\n\n return output, error, w_history\n\n# NLMS \u81ea\u9002\u5e94\u6ee4\u6ce2\u5668\ndef nlms_filter(reference, desired, filter_length, mu, eps=1e-6):\n \"\"\"\u5f52\u4e00\u5316 LMS \u81ea\u9002\u5e94\u6ee4\u6ce2\u5668\u3002\"\"\"\n n = len(reference)\n w = jnp.zeros(filter_length)\n output = jnp.zeros(n)\n error = jnp.zeros(n)\n\n for i in range(filter_length, n):\n x = reference[max(0, i-filter_length+1):i+1][::-1]\n\n y = jnp.dot(w, x)\n e = desired[i] - y\n norm_factor = jnp.dot(x, x) + eps\n w = w + (mu / norm_factor) * e * x\n\n output = output.at[i].set(y)\n error = error.at[i].set(e)\n\n return output, error\n\n# \u4f7f\u7528\u4e0d\u540c\u6b65\u957f\u8fd0\u884c LMS\nfilter_len = 64\nmu_values = [0.001, 0.01, 0.05]\ncolors_mu = ['#3498db', '#e74c3c', '#27ae60']\n\nfig, axes = plt.subplots(2, 2, figsize=(14, 10))\n\n# \u539f\u59cb\u4fe1\u53f7\nt = jnp.arange(n_samples) / sr\naxes[0, 0].plot(t, mic_signal, color='#9b59b6', linewidth=0.5, alpha=0.7,\n label='\u9ea6\u514b\u98ce\uff08\u56de\u58f0 + \u8fd1\u7aef\uff09')\naxes[0, 0].plot(t, echo, color='#e74c3c', linewidth=0.5, alpha=0.7,\n label='\u56de\u58f0\uff08\u5f85\u6d88\u9664\uff09')\naxes[0, 0].plot(t, near_end, color='#27ae60', linewidth=0.8,\n label='\u8fd1\u7aef\u8bed\u97f3\uff08\u9700\u4fdd\u7559\uff09')\naxes[0, 0].set_title('\u4fe1\u53f7\u5206\u91cf')\naxes[0, 0].set_xlabel('\u65f6\u95f4 (s)')\naxes[0, 0].set_ylabel('\u5e45\u5ea6')\naxes[0, 0].legend(fontsize=8)\n\n# \u4e0d\u540c\u6b65\u957f\u4e0b\u7684 LMS \u6536\u655b\nfor mu, color in zip(mu_values, colors_mu):\n _, err, _ = lms_filter(far_end, mic_signal, filter_len, mu)\n # \u5e73\u6ed1\u540e\u7684\u5e73\u65b9\u8bef\u5dee\n sq_err = err ** 2\n window_size = 200\n smoothed = jnp.convolve(sq_err, jnp.ones(window_size)/window_size,\n mode='valid')\n axes[0, 1].plot(smoothed, color=color, linewidth=1.2,\n label=f'mu={mu}')\n\naxes[0, 1].set_title('LMS \u6536\u655b\u66f2\u7ebf\uff08\u5e73\u6ed1 MSE\uff09')\naxes[0, 1].set_xlabel('\u6837\u672c')\naxes[0, 1].set_ylabel('\u5e73\u65b9\u8bef\u5dee')\naxes[0, 1].set_yscale('log')\naxes[0, 1].legend()\n\n# \u6700\u4f73 LMS \u7ed3\u679c\n_, err_lms, w_hist = lms_filter(far_end, mic_signal, filter_len, 0.01)\naxes[1, 0].plot(t, mic_signal, color='#9b59b6', linewidth=0.5, alpha=0.4,\n label='\u6d88\u9664\u524d')\naxes[1, 0].plot(t, err_lms, color='#3498db', linewidth=0.5, alpha=0.8,\n label='LMS \u6d88\u9664\u540e')\naxes[1, 0].plot(t, near_end, color='#27ae60', linewidth=0.8, alpha=0.5,\n label='\u771f\u5b9e\u8fd1\u7aef')\naxes[1, 0].set_title('LMS \u56de\u58f0\u6d88\u9664\u7ed3\u679c (mu=0.01)')\naxes[1, 0].set_xlabel('\u65f6\u95f4 (s)')\naxes[1, 0].set_ylabel('\u5e45\u5ea6')\naxes[1, 0].legend(fontsize=8)\n\n# NLMS \u7ed3\u679c\n_, err_nlms = nlms_filter(far_end, mic_signal, filter_len, 0.5)\naxes[1, 1].plot(t, mic_signal, color='#9b59b6', linewidth=0.5, alpha=0.4,\n label='\u6d88\u9664\u524d')\naxes[1, 1].plot(t, err_nlms, color='#f39c12', linewidth=0.5, alpha=0.8,\n label='NLMS \u6d88\u9664\u540e')\naxes[1, 1].plot(t, near_end, color='#27ae60', linewidth=0.8, alpha=0.5,\n label='\u771f\u5b9e\u8fd1\u7aef')\naxes[1, 1].set_title('NLMS \u56de\u58f0\u6d88\u9664\u7ed3\u679c (mu=0.5)')\naxes[1, 1].set_xlabel('\u65f6\u95f4 (s)')\naxes[1, 1].set_ylabel('\u5e45\u5ea6')\naxes[1, 1].legend(fontsize=8)\n\nplt.tight_layout()\nplt.show()\n\n# \u6d4b\u91cf\u56de\u58f0\u8870\u51cf\necho_power = jnp.mean(echo ** 2)\nlms_residual = jnp.mean(err_lms[n_samples//2:] ** 2) # \u6536\u655b\u540e\nnlms_residual = jnp.mean(err_nlms[n_samples//2:] ** 2)\nprint(f\"\u56de\u58f0\u529f\u7387: {10*jnp.log10(echo_power):.1f} dB\")\nprint(f\"LMS \u6b8b\u5dee: {10*jnp.log10(lms_residual):.1f} dB \"\n f\"(ERLE: {10*jnp.log10(echo_power/lms_residual):.1f} dB)\")\nprint(f\"NLMS \u6b8b\u5dee: {10*jnp.log10(nlms_residual):.1f} dB \"\n f\"(ERLE: {10*jnp.log10(echo_power/nlms_residual):.1f} dB)\")\n import jax\nimport jax.numpy as jnp\nimport jax.random as jr\nimport matplotlib.pyplot as plt\n\n# \u521b\u5efa\u5408\u6210\u7684\"\u8bed\u97f3\"\u548c\"\u566a\u58f0\"\u4fe1\u53f7\nsr = 8000\nduration = 2.0\nt = jnp.linspace(0, duration, int(sr * duration))\n\n# \u8bed\u97f3\uff1a\u5177\u6709\u65f6\u53d8\u5e45\u5ea6\u7684\u8c10\u6ce2\u5e8f\u5217\uff08\u6a21\u62df\u8bed\u97f3\uff09\nspeech = jnp.zeros_like(t)\nfor f0 in [150, 300, 450, 600, 900]:\n amp_env = 0.5 + 0.5 * jnp.sin(2 * jnp.pi * 2.0 * t) # 2 Hz \u8c03\u5236\n speech = speech + (0.5 / (f0/150)) * amp_env * jnp.sin(2 * jnp.pi * f0 * t)\nspeech = speech / jnp.max(jnp.abs(speech))\n\n# \u566a\u58f0\uff1a\u9650\u5e26\u566a\u58f0\nkey = jr.PRNGKey(42)\nnoise_raw = jr.normal(key, t.shape) * 0.4\n\n# \u5728\u7ed9\u5b9a SNR \u4e0b\u6df7\u5408\nsnr_db = 5.0\nspeech_power = jnp.mean(speech ** 2)\nnoise_power = jnp.mean(noise_raw ** 2)\nnoise_scale = jnp.sqrt(speech_power / (noise_power * 10 ** (snr_db / 10)))\nnoise = noise_raw * noise_scale\nmixture = speech + noise\n\n# STFT\nn_fft = 512\nhop = 128\nwindow = jnp.hanning(n_fft)\n\ndef stft(signal, n_fft, hop, window):\n n_frames = 1 + (len(signal) - n_fft) // hop\n frames = jnp.stack([\n signal[i * hop : i * hop + n_fft] * window\n for i in range(n_frames)\n ])\n return jnp.fft.rfft(frames, n=n_fft)\n\ndef istft(S, hop, window, length):\n n_fft = (S.shape[1] - 1) * 2\n n_frames = S.shape[0]\n frames = jnp.fft.irfft(S, n=n_fft) * window[None, :]\n output = jnp.zeros(length)\n window_sum = jnp.zeros(length)\n for i in range(n_frames):\n start = i * hop\n end = start + n_fft\n if end <= length:\n output = output.at[start:end].add(frames[i])\n window_sum = window_sum.at[start:end].add(window ** 2)\n window_sum = jnp.maximum(window_sum, 1e-8)\n return output / window_sum\n\nS_speech = stft(speech, n_fft, hop, window)\nS_noise = stft(noise, n_fft, hop, window)\nS_mix = stft(mixture, n_fft, hop, window)\n\nmag_speech = jnp.abs(S_speech)\nmag_noise = jnp.abs(S_noise)\nmag_mix = jnp.abs(S_mix)\nphase_mix = jnp.angle(S_mix)\n\n# \u65b9\u6cd5 1\uff1a\u7406\u60f3\u6bd4\u7387\u63a9\u853d\uff08oracle - \u7406\u8bba\u4e0a\u9650\uff09\nirm = mag_speech ** 2 / (mag_speech ** 2 + mag_noise ** 2 + 1e-8)\nS_irm = (irm * mag_mix) * jnp.exp(1j * phase_mix)\nenhanced_irm = istft(S_irm, hop, window, len(mixture))\n\n# \u65b9\u6cd5 2\uff1a\u8c31\u51cf\u6cd5\n# \u4ece\u524d 0.2s \u4f30\u8ba1\u566a\u58f0\uff08\u5047\u8bbe\u4e3a\u9759\u97f3\u6bb5\uff09\nnoise_frames = int(0.2 * sr / hop)\nnoise_est = jnp.mean(mag_mix[:noise_frames] ** 2, axis=0, keepdims=True)\nalpha = 2.0 # \u8fc7\u51cf\u56e0\u5b50\nbeta = 0.02 # \u9891\u8c31\u5730\u677f\nmag_sub = jnp.maximum(mag_mix ** 2 - alpha * noise_est, beta * mag_mix ** 2)\nmag_sub = jnp.sqrt(mag_sub)\nS_sub = mag_sub * jnp.exp(1j * phase_mix)\nenhanced_sub = istft(S_sub, hop, window, len(mixture))\n\n# \u65b9\u6cd5 3\uff1a\u7ef4\u7eb3\u6ee4\u6ce2\u5668\nsnr_est = mag_mix ** 2 / (noise_est + 1e-8)\nwiener_gain = snr_est / (1 + snr_est)\nS_wiener = (wiener_gain * mag_mix) * jnp.exp(1j * phase_mix)\nenhanced_wiener = istft(S_wiener, hop, window, len(mixture))\n\n# \u8ba1\u7b97\u6bcf\u79cd\u65b9\u6cd5\u7684 SI-SDR\ndef si_sdr(estimate, reference):\n \"\"\"\u5c3a\u5ea6\u4e0d\u53d8\u4fe1\u53f7\u5931\u771f\u6bd4\u3002\"\"\"\n ref = reference[:len(estimate)]\n est = estimate[:len(reference)]\n s_target = (jnp.dot(est, ref) / (jnp.dot(ref, ref) + 1e-8)) * ref\n e_noise = est - s_target\n return 10 * jnp.log10(jnp.dot(s_target, s_target) /\n (jnp.dot(e_noise, e_noise) + 1e-8))\n\nsi_sdr_mix = si_sdr(mixture, speech)\nsi_sdr_irm_val = si_sdr(enhanced_irm, speech)\nsi_sdr_sub_val = si_sdr(enhanced_sub, speech)\nsi_sdr_wiener_val = si_sdr(enhanced_wiener, speech)\n\n# \u53ef\u89c6\u5316\nfig, axes = plt.subplots(3, 2, figsize=(14, 12))\n\n# \u8bed\u8c31\u56fe\naxes[0, 0].imshow(jnp.log1p(mag_speech.T), aspect='auto', origin='lower',\n cmap='magma')\naxes[0, 0].set_title('\u5e72\u51c0\u8bed\u97f3\u8bed\u8c31\u56fe')\naxes[0, 0].set_ylabel('\u9891\u7387 bin')\n\naxes[0, 1].imshow(jnp.log1p(mag_mix.T), aspect='auto', origin='lower',\n cmap='magma')\naxes[0, 1].set_title(f'\u5e26\u566a\u6df7\u5408 ({snr_db:.0f} dB SNR)')\n\n# \u63a9\u853d\naxes[1, 0].imshow(irm.T, aspect='auto', origin='lower', cmap='RdYlGn')\naxes[1, 0].set_title('\u7406\u60f3\u6bd4\u7387\u63a9\u853d\uff08Oracle\uff09')\naxes[1, 0].set_ylabel('\u9891\u7387 bin')\n\naxes[1, 1].imshow(wiener_gain.T, aspect='auto', origin='lower', cmap='RdYlGn',\n vmin=0, vmax=1)\naxes[1, 1].set_title('\u4f30\u8ba1\u7684\u7ef4\u7eb3\u589e\u76ca')\n\n# \u589e\u5f3a\u540e\u7684\u6ce2\u5f62\u5bf9\u6bd4\nn_show = 3000\naxes[2, 0].plot(t[:n_show], speech[:n_show], color='#27ae60', linewidth=0.8,\n alpha=0.5, label='\u5e72\u51c0')\naxes[2, 0].plot(t[:n_show], mixture[:n_show], color='#e74c3c', linewidth=0.5,\n alpha=0.4, label='\u5e26\u566a')\naxes[2, 0].plot(t[:n_show], enhanced_irm[:n_show], color='#3498db',\n linewidth=0.8, label='IRM \u589e\u5f3a')\naxes[2, 0].set_title('\u6ce2\u5f62\u5bf9\u6bd4\uff08IRM\uff09')\naxes[2, 0].set_xlabel('\u65f6\u95f4 (s)')\naxes[2, 0].set_ylabel('\u5e45\u5ea6')\naxes[2, 0].legend(fontsize=8)\n\n# SI-SDR \u67f1\u72b6\u56fe\nmethods = ['\u6df7\u5408\u4fe1\u53f7', '\u8c31\u51cf\u6cd5', '\u7ef4\u7eb3\u6ee4\u6ce2\u5668', '\u7406\u60f3\u6bd4\u7387\u63a9\u853d']\nsdr_values = [float(si_sdr_mix), float(si_sdr_sub_val),\n float(si_sdr_wiener_val), float(si_sdr_irm_val)]\nbar_colors = ['#e74c3c', '#f39c12', '#9b59b6', '#27ae60']\nbars = axes[2, 1].bar(methods, sdr_values, color=bar_colors, alpha=0.8)\naxes[2, 1].set_ylabel('SI-SDR (dB)')\naxes[2, 1].set_title('\u589e\u5f3a\u8d28\u91cf\u5bf9\u6bd4')\nfor bar, val in zip(bars, sdr_values):\n axes[2, 1].text(bar.get_x() + bar.get_width()/2., bar.get_height() + 0.3,\n f'{val:.1f}', ha='center', fontsize=10)\naxes[2, 1].axhline(0, color='gray', linestyle='--', linewidth=0.8)\n\nplt.tight_layout()\nplt.show()\n\nprint(f\"SI-SDR\uff08\u5e26\u566a\u6df7\u5408\uff09: {si_sdr_mix:.2f} dB\")\nprint(f\"SI-SDR\uff08\u8c31\u51cf\u6cd5\uff09: {si_sdr_sub_val:.2f} dB\")\nprint(f\"SI-SDR\uff08\u7ef4\u7eb3\u6ee4\u6ce2\u5668\uff09: {si_sdr_wiener_val:.2f} dB\")\nprint(f\"SI-SDR\uff08\u7406\u60f3\u6bd4\u7387\u63a9\u853d\uff09: {si_sdr_irm_val:.2f} dB\uff08oracle \u7406\u8bba\u4e0a\u9650\uff09\")\n"},{"location":"chapter%2010%3A%20multimodal%20learning/01.%20multimodal%20representations/","title":"\u591a\u6a21\u6001\u8868\u5f81","text":"\u591a\u6a21\u6001\u8868\u5f81\u5c06\u89c6\u89c9\u3001\u8bed\u8a00\u548c\u97f3\u9891\u6865\u63a5\u5230\u5171\u4eab\u5d4c\u5165\u7a7a\u95f4\u4e2d\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u878d\u5408\u7b56\u7565\u3001CLIP\u3001ALIGN\u3001SigLIP\u3001\u5bf9\u6bd4\u635f\u5931\u51fd\u6570\uff08InfoNCE\u3001NT-Xent\uff09\u3001\u96f6\u6837\u672c\u5206\u7c7b\u548c\u68c0\u7d22\u8bc4\u4f30\u3002
\u60f3\u8c61\u4f60\u5750\u5728\u4e00\u5bb6\u5496\u5561\u9986\u91cc\u3002\u4f60\u770b\u5230\u684c\u4e0a\u5192\u70ed\u6c14\u7684\u6c34\u676f\uff0c\u542c\u5230\u9676\u74f7\u7684\u53ee\u5f53\u58f0\uff0c\u95fb\u5230\u70d8\u7119\u5496\u5561\u8c46\u7684\u9999\u6c14\uff0c\u611f\u53d7\u5230\u4ece\u9a6c\u514b\u676f\u4f20\u6765\u7684\u6696\u610f\u3002\u6ca1\u6709\u54ea\u4e00\u79cd\u611f\u5b98\u80fd\u544a\u8bc9\u4f60\u4e00\u5207\uff1a\u4f60\u7684\u5927\u8111\u5c06\u8fd9\u4e9b\u4fe1\u53f7\u878d\u5408\u6210\u4e00\u4e2a\u7edf\u4e00\u7684\u611f\u77e5\u2014\u2014\"\u70ed\u5496\u5561\"\u3002\u591a\u6a21\u6001\u5b66\u4e60 \u5bf9\u673a\u5668\u505a\u4e86\u540c\u6837\u7684\u4e8b\uff1a\u5b83\u7ed3\u5408\u6765\u81ea\u591a\u79cd\u6a21\u6001\uff08\u89c6\u89c9\u3001\u8bed\u8a00\u3001\u97f3\u9891\u7b49\uff09\u7684\u4fe1\u606f\uff0c\u6784\u5efa\u51fa\u6bd4\u4efb\u4f55\u5355\u4e00\u6a21\u6001\u5355\u72ec\u63d0\u4f9b\u7684\u8868\u5f81\u66f4\u4e30\u5bcc\u3001\u66f4\u9c81\u68d2\u7684\u8868\u5f81\u3002
\u6a21\u6001\uff08modality\uff09 \u662f\u4e00\u79cd\u72ec\u7279\u7684\u4fe1\u606f\u901a\u9053\u3002\u5728\u673a\u5668\u5b66\u4e60\u4e2d\uff0c\u6700\u5e38\u89c1\u7684\u6a21\u6001\u5305\u62ec\u56fe\u50cf\uff08\u50cf\u7d20\u7f51\u683c\uff09\u3001\u6587\u672c\uff08\u8bcd\u5143\u5e8f\u5217\uff09\u3001\u97f3\u9891\uff08\u6ce2\u5f62\u6216\u8bed\u8c31\u56fe\uff0c\u5982\u7b2c9\u7ae0\u6240\u8ff0\uff09\u3001\u89c6\u9891\uff08\u5e27\u5e8f\u5217\uff09\u548c\u7ed3\u6784\u5316\u6570\u636e\uff08\u8868\u683c\u3001\u56fe\uff09\u3002\u6bcf\u79cd\u6a21\u6001\u90fd\u6709\u5176\u81ea\u8eab\u7684\u7edf\u8ba1\u7ed3\u6784\uff1a\u56fe\u50cf\u5177\u6709\u7a7a\u95f4\u8fde\u8d2f\u6027\uff0c\u6587\u672c\u662f\u5e8f\u5217\u5316\u548c\u79bb\u6563\u7684\uff0c\u97f3\u9891\u662f\u65f6\u95f4\u6027\u7684\u548c\u8fde\u7eed\u7684\u3002\u591a\u6a21\u6001\u5b66\u4e60\u7684\u6311\u6218\u5728\u4e8e\u6865\u63a5\u8fd9\u4e9b\u6839\u672c\u4e0d\u540c\u7684\u6570\u636e\u7c7b\u578b\u3002
\u4e3a\u4ec0\u4e48\u8981\u8d39\u5fc3\u7ed3\u5408\u591a\u79cd\u6a21\u6001\uff1f\u56e0\u4e3a\u5b83\u4eec\u63d0\u4f9b\u4e92\u8865\u7684\u4fe1\u606f\u3002\u4e00\u5f20\u72d7\u7684\u7167\u7247\u544a\u8bc9\u4f60\u5b83\u7684\u54c1\u79cd\u548c\u989c\u8272\uff0c\u4f46\u4e0d\u4f1a\u544a\u8bc9\u4f60\u540d\u5b57\u3002\u50cf\"\u6211\u7684\u91d1\u6bdb\u72ac Max\"\u8fd9\u6837\u7684\u63cf\u8ff0\u544a\u8bc9\u4f60\u540d\u5b57\u548c\u54c1\u79cd\uff0c\u4f46\u4e0d\u4f1a\u544a\u8bc9\u4f60\u786e\u5207\u59ff\u6001\u3002\u56fe\u50cf\u548c\u6587\u672c\u7ed3\u5408\u8d77\u6765\uff0c\u6bd4\u4efb\u4f55\u5355\u72ec\u4e00\u4e2a\u7ed9\u51fa\u7684\u753b\u9762\u90fd\u66f4\u5b8c\u6574\u3002\u8fd9\u79cd\u4e92\u8865\u6027\u662f\u5176\u6838\u5fc3\u52a8\u673a\uff1a\u591a\u6a21\u6001\u6a21\u578b\u53ef\u4ee5\u56de\u7b54\u90a3\u4e9b\u5355\u6a21\u6001\u6a21\u578b\u65e0\u6cd5\u56de\u7b54\u7684\u95ee\u9898\u3001\u751f\u6210\u5185\u5bb9\u5e76\u505a\u51fa\u51b3\u7b56\u3002
\u60f3\u8c61\u4e00\u4e2a\u5c0f\u7ec4\u9879\u76ee\u3002\u4f60\u6709\u4e24\u79cd\u7ec4\u5408\u60f3\u6cd5\u7684\u65b9\u5f0f\uff1a\u6bcf\u4e2a\u4eba\u4ece\u4e00\u5f00\u59cb\u5c31\u5728\u540c\u4e00\u4e2a\u623f\u95f4\u91cc\u4e00\u8d77\u5de5\u4f5c\uff08\u5171\u4eab\u539f\u59cb\u7b14\u8bb0\u548c\u8349\u7a3f\uff09\uff0c\u6216\u8005\u6bcf\u4e2a\u4eba\u72ec\u7acb\u64b0\u5199\u81ea\u5df1\u7684\u90e8\u5206\uff0c\u6700\u540e\u5408\u5e76\u6700\u7ec8\u6587\u6863\u3002\u8fd9\u5206\u522b\u5bf9\u5e94\u4e8e\u591a\u6a21\u6001\u5b66\u4e60\u4e2d\u7684\u65e9\u671f\u878d\u5408\uff08early fusion\uff09 \u548c\u665a\u671f\u878d\u5408\uff08late fusion\uff09\u3002
\u65e9\u671f\u878d\u5408\uff08\u4e5f\u79f0\u4e3a\u7279\u5f81\u7ea7\u878d\u5408\uff09\u5728\u4efb\u4f55\u9ad8\u7ea7\u5904\u7406\u4e4b\u524d\uff0c\u5bf9\u6765\u81ea\u4e0d\u540c\u6a21\u6001\u7684\u539f\u59cb\u6216\u4f4e\u7ea7\u7279\u5f81\u8fdb\u884c\u62fc\u63a5\u6216\u6df7\u5408\u3002\u4f8b\u5982\uff0c\u4f60\u53ef\u4ee5\u5c06\u56fe\u50cf\u7684\u50cf\u7d20\u7279\u5f81\u4e0e\u6587\u672c\u7684\u8bcd\u5143\u5d4c\u5165\u62fc\u63a5\u8d77\u6765\uff0c\u5c06\u7ec4\u5408\u540e\u7684\u5e8f\u5217\u8f93\u5165\u5230\u4e00\u4e2a\u5355\u4e00\u7684 Transformer \u4e2d\u3002\u6a21\u578b\u53ef\u4ee5\u4ece\u4e00\u5f00\u59cb\u5c31\u5b66\u4e60\u7ec6\u7c92\u5ea6\u7684\u8de8\u6a21\u6001\u4ea4\u4e92\uff0c\u4f46\u8f93\u5165\u7a7a\u95f4\u5f88\u5927\uff0c\u4e14\u6a21\u578b\u5fc5\u987b\u5b66\u4f1a\u540c\u65f6\u5904\u7406\u622a\u7136\u4e0d\u540c\u7684\u6570\u636e\u7c7b\u578b\u3002
\u5f62\u5f0f\u5316\u5730\uff0c\u7ed9\u5b9a\u6765\u81ea\u4e24\u79cd\u6a21\u6001\u7684\u7279\u5f81\u5411\u91cf \\(x_{\\\\text{img}} \\\\in \\\\mathbb{R}^{d_1}\\) \u548c \\(x_{\\\\text{txt}} \\\\in \\\\mathbb{R}^{d_2}\\)\uff0c\u65e9\u671f\u878d\u5408\u7b80\u5355\u5730\u62fc\u63a5\u5b83\u4eec\uff1a
\u8fd9\u4e2a\u62fc\u63a5\u540e\u7684\u5411\u91cf\u7531\u5171\u4eab\u7f51\u7edc\u5904\u7406\u3002\u5176\u4f18\u52bf\u5728\u4e8e\u6a21\u578b\u53ef\u4ee5\u5728\u6bcf\u4e00\u5c42\u53d1\u73b0\u8de8\u6a21\u6001\u76f8\u5173\u6027\u3002\u7f3a\u70b9\u662f\u8ba1\u7b97\u6210\u672c\u9ad8\uff0c\u4e14\u96be\u4ee5\u5bf9\u9f50\u975e\u5e38\u4e0d\u540c\u7684\u7279\u5f81\u7c7b\u578b\uff08\u5bc6\u96c6\u7684\u50cf\u7d20\u503c\u4e0e\u7a00\u758f\u7684\u8bcd\u5143\u7d22\u5f15\uff09\u3002
\u665a\u671f\u878d\u5408\uff08\u4e5f\u79f0\u4e3a\u51b3\u7b56\u7ea7\u878d\u5408\uff09\u901a\u8fc7\u5404\u81ea\u7684\u7f16\u7801\u5668\u72ec\u7acb\u5904\u7406\u6bcf\u79cd\u6a21\u6001\uff0c\u4e3a\u6bcf\u79cd\u6a21\u6001\u751f\u6210\u4e00\u4e2a\u9ad8\u5c42\u8868\u5f81\u751a\u81f3\u6700\u7ec8\u7684\u9884\u6d4b\u7ed3\u679c\u3002\u8fd9\u4e9b\u8f93\u51fa\u968f\u540e\u88ab\u7ec4\u5408\uff0c\u901a\u5e38\u901a\u8fc7\u5e73\u5747\u5206\u6570\u3001\u6295\u7968\u6216\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684\u7ec4\u5408\u5c42\u3002\u665a\u671f\u878d\u5408\u66f4\u7b80\u5355\uff0c\u4e14\u5141\u8bb8\u4f60\u76f4\u63a5\u590d\u7528\u9884\u8bad\u7ec3\u7684\u5355\u6a21\u6001\u6a21\u578b\uff0c\u4f46\u5b83\u65e0\u6cd5\u6355\u6349\u4f4e\u5c42\u7684\u8de8\u6a21\u6001\u4ea4\u4e92\uff0c\u56e0\u4e3a\u5404\u6a21\u6001\u4ece\u672a\"\u770b\u5230\"\u5f7c\u6b64\u7684\u539f\u59cb\u7279\u5f81\u3002
\u7ed9\u5b9a\u6a21\u6001\u7279\u5b9a\u7684\u9884\u6d4b\u503c \\(\\hat{y}_1\\) \u548c \\(\\hat{y}_2\\)\uff0c\u4e00\u4e2a\u7b80\u5355\u7684\u665a\u671f\u878d\u5408\u89c4\u5219\u662f\uff1a
\u5176\u4e2d \\(\\\\alpha \\\\in [0, 1]\\) \u662f\u4e00\u4e2a\u53ef\u5b66\u4e60\u6216\u624b\u52a8\u8c03\u8282\u7684\u6df7\u5408\u6743\u91cd\u3002
\u4e2d\u95f4\u878d\u5408\uff08middle fusion\uff09\uff08\u4e5f\u79f0\u4e3a\u4e2d\u95f4\u878d\u5408 intermediate fusion\uff09\u662f\u5927\u591a\u6570\u73b0\u4ee3\u7cfb\u7edf\u4f7f\u7528\u7684\u5b9e\u7528\u6298\u4e2d\u65b9\u6848\u3002\u6bcf\u79cd\u6a21\u6001\u5148\u7531\u5176\u81ea\u8eab\u7684\u7f16\u7801\u5668\u5904\u7406\uff08\u63d0\u53d6\u6a21\u6001\u7279\u5b9a\u7684\u7279\u5f81\uff09\uff0c\u7136\u540e\u5728\u7f51\u7edc\u4e2d\u95f4\u90e8\u5206\u901a\u8fc7\u8de8\u6ce8\u610f\u529b\u5c42\u7b49\u65b9\u5f0f\u7ec4\u5408\u7f16\u7801\u540e\u7684\u8868\u5f81\u3002\u8fd9\u4f7f\u5f97\u6bcf\u4e2a\u7f16\u7801\u5668\u53ef\u4ee5\u4e13\u6ce8\u4e8e\u81ea\u8eab\u7684\u6a21\u6001\uff0c\u540c\u65f6\u4ecd\u80fd\u5b9e\u73b0\u4e30\u5bcc\u7684\u8de8\u6a21\u6001\u4ea4\u4e92\u3002Flamingo\u3001LLaVA \u548c\u5927\u591a\u6570\u89c6\u89c9-\u8bed\u8a00\u6a21\u578b\uff08\u6587\u4ef6 02\uff09\u90fd\u4f7f\u7528\u4e2d\u95f4\u878d\u5408\u3002
\u60f3\u8c61\u4e00\u4e2a\u901a\u7528\u7ffb\u8bd1\u5668\uff0c\u5b83\u53ef\u4ee5\u5c06\u4efb\u4f55\u8bed\u8a00\u7684\u4efb\u4f55\u53e5\u5b50\u6620\u5c04\u5230\u540c\u4e00\u4e2a\u5171\u4eab\"\u610f\u4e49\u7a7a\u95f4\"\u4e2d\u7684\u540c\u4e00\u70b9\u3002\u7528\u82f1\u8bed\u3001\u6cd5\u8bed\u6216\u65e5\u8bed\u8bf4\u7684\"a dog on a beach\"\u90fd\u4f1a\u843d\u5728\u540c\u4e00\u4e2a\u5750\u6807\u4e0a\u3002\u8054\u5408\u5d4c\u5165\u7a7a\u95f4 \u8de8\u6a21\u6001\u505a\u4e86\u5b8c\u5168\u76f8\u540c\u7684\u4e8b\uff1a\u4e00\u5f20\u6c99\u6ee9\u4e0a\u7684\u72d7\u7684\u56fe\u50cf\u548c\u6587\u672c\"a dog on a beach\"\u5e94\u8be5\u6620\u5c04\u5230\u540c\u4e00\u5411\u91cf\u7a7a\u95f4\u4e2d\u7684\u90bb\u8fd1\u70b9\u3002
\u5f62\u5f0f\u5316\u5730\uff0c\u6211\u4eec\u5b66\u4e60\u4e24\u4e2a\u7f16\u7801\u5668\u51fd\u6570\uff1a\u6a21\u6001 1\uff08\u5982\u56fe\u50cf\uff09\u7684 \\(f_\\\\theta : \\\\mathcal{X}_1 \\\\to \\\\mathbb{R}^d\\) \u548c\u6a21\u6001 2\uff08\u5982\u6587\u672c\uff09\u7684 \\(g_\\\\phi : \\\\mathcal{X}_2 \\\\to \\\\mathbb{R}^d\\)\u3002\u4e24\u8005\u90fd\u5c06\u8f93\u5165\u6620\u5c04\u5230\u76f8\u540c\u7684 \\(d\\) \u7ef4\u7a7a\u95f4\u3002\u8bad\u7ec3\u76ee\u6807\u786e\u4fdd\u8bed\u4e49\u5339\u914d\u7684\u5bf9 \\((x_1, x_2)\\) \u7684\u5d4c\u5165 \\(f_\\\\theta(x_1)\\) \u548c \\(g_\\\\phi(x_2)\\) \u5f7c\u6b64\u63a5\u8fd1\uff08\u9ad8\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff09\uff0c\u800c\u4e0d\u5339\u914d\u7684\u5bf9\u5219\u76f8\u8ddd\u5f88\u8fdc\u3002
\u8fd9\u662f\u7b2c 7 \u7ae0\u4e2d\u8bcd\u5d4c\u5165\u7a7a\u95f4\u7684\u76f4\u63a5\u63a8\u5e7f\u3002\u56de\u5fc6\u4e00\u4e0b\uff0cWord2Vec \u548c GloVe \u5c06\u8bed\u4e49\u76f8\u4f3c\u7684\u8bcd\u653e\u7f6e\u5728\u5411\u91cf\u7a7a\u95f4\u4e2d\u5f7c\u6b64\u9760\u8fd1\u3002\u8054\u5408\u5d4c\u5165\u7a7a\u95f4\u5c06\u8fd9\u4e00\u601d\u60f3\u6269\u5c55\u5230\u8de8\u6a21\u6001\uff1a\u4e0d\u662f\u8861\u91cf\u8bcd\u4e0e\u8bcd\u7684\u76f8\u4f3c\u6027\uff0c\u800c\u662f\u8861\u91cf\u56fe\u50cf\u5230\u6587\u672c\u7684\u76f8\u4f3c\u6027\u3001\u97f3\u9891\u5230\u6587\u672c\u7684\u76f8\u4f3c\u6027\uff0c\u751a\u81f3\u56fe\u50cf\u5230\u97f3\u9891\u7684\u76f8\u4f3c\u6027\u3002
\u76f8\u4f3c\u5ea6\u5ea6\u91cf\u51e0\u4e4e\u603b\u662f\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff08\u7b2c 1 \u7ae0\uff09\uff1a
\u60f3\u8c61\u4e00\u4e2a\u8bfe\u5802\u7ec3\u4e60\uff1a\u5b66\u751f\u4eec\u62ff\u5230\u6253\u4e71\u7684\u7167\u7247\u548c\u63cf\u8ff0\u5bf9\uff0c\u9700\u8981\u5c06\u6bcf\u5f20\u7167\u7247\u4e0e\u5176\u6b63\u786e\u7684\u63cf\u8ff0\u914d\u5bf9\u3002\u8981\u51fa\u8272\u5730\u5b8c\u6210\u8fd9\u9879\u4efb\u52a1\uff0c\u4f60\u9700\u8981\u540c\u65f6\u7406\u89e3\u89c6\u89c9\u5185\u5bb9\u4e0e\u8bed\u8a00\uff0c\u5e76\u77e5\u9053\u5b83\u4eec\u5982\u4f55\u5173\u8054\u3002\u5bf9\u6bd4\u5b66\u4e60 \u6b63\u662f\u4ee5\u8fd9\u79cd\u65b9\u5f0f\u8bad\u7ec3\u6a21\u578b\uff1a\u7ed9\u5b9a\u4e00\u6279 (\u56fe\u50cf, \u6587\u672c) \u5bf9\uff0c\u6a21\u578b\u5fc5\u987b\u627e\u51fa\u54ea\u5f20\u56fe\u50cf\u5bf9\u5e94\u54ea\u6bb5\u6587\u672c\u3002
\u6b63\u5982\u6211\u4eec\u5728\u7b2c 8 \u7ae0\uff08\u6587\u4ef6 04\uff09\u4e2d\u770b\u5230\u7684\uff0c\u5355\u6a21\u6001\u73af\u5883\u4e0b\u7684\u5bf9\u6bd4\u5b66\u4e60\uff08SimCLR\u3001MoCo\uff09\u5c06\u540c\u4e00\u56fe\u50cf\u7684\u4e0d\u540c\u589e\u5e7f\u89c6\u56fe\u62c9\u8fd1\uff0c\u5c06\u4e0d\u540c\u56fe\u50cf\u7684\u89c6\u56fe\u63a8\u8fdc\u3002\u591a\u6a21\u6001\u5bf9\u6bd4\u5b66\u4e60\u5c06\"\u589e\u5e7f\u89c6\u56fe\"\u66ff\u6362\u4e3a\"\u5339\u914d\u7684\u6a21\u6001\"\uff1a\u56fe\u50cf\u53ca\u5176\u63cf\u8ff0\u6784\u6210\u6b63\u6837\u672c\u5bf9\uff1b\u8be5\u56fe\u50cf\u4e0e\u6279\u6b21\u4e2d\u4efb\u4f55\u5176\u4ed6\u63cf\u8ff0\u7684\u914d\u5bf9\u6784\u6210\u8d1f\u6837\u672c\u5bf9\u3002
CLIP\uff08Contrastive Language-Image Pre-training\uff0c\u5bf9\u6bd4\u8bed\u8a00-\u56fe\u50cf\u9884\u8bad\u7ec3\uff0cRadford \u7b49\uff0c2021\uff09\u662f\u591a\u6a21\u6001\u5bf9\u6bd4\u5b66\u4e60\u7684\u57fa\u7840\u6a21\u578b\u3002\u5b83\u5728\u4ece\u4e92\u8054\u7f51\u4e0a\u6293\u53d6\u7684 4 \u4ebf\u4e2a (\u56fe\u50cf, \u6587\u672c) \u5bf9\u4e0a\u8054\u5408\u8bad\u7ec3\u4e00\u4e2a\u56fe\u50cf\u7f16\u7801\u5668\uff08ViT \u6216 ResNet\uff0c\u7b2c 8 \u7ae0\uff09\u548c\u4e00\u4e2a\u6587\u672c\u7f16\u7801\u5668\uff08Transformer\uff0c\u7b2c 7 \u7ae0\uff09\u3002
\u7ed9\u5b9a\u4e00\u6279 \\(N\\) \u4e2a\u56fe\u50cf-\u6587\u672c\u5bf9\uff0cCLIP \u8ba1\u7b97\u6240\u6709\u56fe\u50cf\u5d4c\u5165\u4e0e\u6240\u6709\u6587\u672c\u5d4c\u5165\u4e4b\u95f4\u7684 \\(N \\\\times N\\) \u4f59\u5f26\u76f8\u4f3c\u5ea6\u77e9\u9635\u3002\u5bf9\u89d2\u7ebf\u4e0a\u7684\u6761\u76ee\u662f\u5339\u914d\u7684\u5bf9\uff08\u6b63\u6837\u672c\uff09\uff1b\u6240\u6709\u975e\u5bf9\u89d2\u7ebf\u6761\u76ee\u662f\u4e0d\u5339\u914d\u7684\uff08\u8d1f\u6837\u672c\uff09\u3002\u8bad\u7ec3\u635f\u5931\u4fc3\u4f7f\u5bf9\u89d2\u7ebf\u6761\u76ee\u5347\u9ad8\uff0c\u975e\u5bf9\u89d2\u7ebf\u6761\u76ee\u964d\u4f4e\u3002
\u8be5\u635f\u5931\u662f\u5bf9\u79f0\u4ea4\u53c9\u71b5\u3002\u5bf9\u4e8e\u56fe\u50cf \\(i\\) \u4e0e\u6587\u672c \\(j = i\\) \u7684\u914d\u5bf9\uff0c\u56fe\u50cf\u5230\u6587\u672c\u7684\u635f\u5931\u4e3a\uff1a
CLIP \u7684\u56fe\u50cf\u7f16\u7801\u5668\u901a\u5e38\u662f ViT-L/14\uff08\u5927\u578b Vision Transformer\uff0c14x14 \u5757\uff0c\u7b2c 8 \u7ae0\u6587\u4ef6 04\uff09\u3002\u6587\u672c\u7f16\u7801\u5668\u662f\u4e00\u4e2a 12 \u5c42\u5e26\u6709\u56e0\u679c\u63a9\u7801\u7684 Transformer\uff08\u7c7b\u4f3c GPT\uff0c\u7b2c 7 \u7ae0\u6587\u4ef6 04\uff09\u3002\u4e24\u4e2a\u7f16\u7801\u5668\u90fd\u901a\u8fc7\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684\u7ebf\u6027\u6295\u5f71\u5c06\u5176\u8f93\u51fa\u6620\u5c04\u5230\u5171\u4eab\u7684 512 \u6216 768 \u7ef4\u7a7a\u95f4\uff0c\u968f\u540e\u8fdb\u884c \\(L_2\\) \u5f52\u4e00\u5316\u3002
CLIP \u6700\u5f15\u4eba\u6ce8\u76ee\u7684\u7279\u6027\u662f\u96f6\u6837\u672c\u56fe\u50cf\u5206\u7c7b\u3002\u8981\u5c06\u56fe\u50cf\u5206\u7c7b\u5230 \\(K\\) \u4e2a\u7c7b\u522b\u4e4b\u4e00\uff0c\u4f60\u521b\u5efa \\(K\\) \u4e2a\u6587\u672c\u63d0\u793a\uff0c\u5982\"a photo of a {class name}\"\uff0c\u7528\u6587\u672c\u7f16\u7801\u5668\u5d4c\u5165\u6bcf\u4e2a\u63d0\u793a\uff0c\u7528\u56fe\u50cf\u7f16\u7801\u5668\u5d4c\u5165\u56fe\u50cf\uff0c\u7136\u540e\u9009\u62e9\u6587\u672c\u5d4c\u5165\u4e0e\u56fe\u50cf\u5d4c\u5165\u4f59\u5f26\u76f8\u4f3c\u5ea6\u6700\u9ad8\u7684\u7c7b\u522b\u3002\u5728 ImageNet \u4e0a\uff0cCLIP \u5728\u4ece\u672a\u89c1\u8fc7\u4efb\u4f55 ImageNet \u8bad\u7ec3\u6837\u672c\u7684\u60c5\u51b5\u4e0b\u53d6\u5f97\u4e86\u5177\u6709\u7ade\u4e89\u529b\u7684\u51c6\u786e\u7387\u3002
SigLIP\uff08Sigmoid Loss for Language-Image Pre-training\uff0cSigmoid \u635f\u5931\u8bed\u8a00-\u56fe\u50cf\u9884\u8bad\u7ec3\uff0cZhai \u7b49\uff0c2023\uff09\u7528\u66f4\u7b80\u5355\u7684 sigmoid \u635f\u5931\u53d6\u4ee3\u4e86 CLIP \u57fa\u4e8e softmax \u7684\u5bf9\u6bd4\u635f\u5931\u3002SigLIP \u4e0d\u5c06 \\(N \\\\times N\\) \u76f8\u4f3c\u5ea6\u77e9\u9635\u89c6\u4e3a\u5206\u7c7b\u95ee\u9898\uff08\u6bcf\u884c\u662f\u4e00\u4e2a\u5217\u4e0a\u7684 softmax\uff09\uff0c\u800c\u662f\u5c06\u6bcf\u4e2a\u6761\u76ee\u72ec\u7acb\u89c6\u4e3a\u4e8c\u5206\u7c7b\u95ee\u9898\uff1a\u8fd9\u4e2a (\u56fe\u50cf, \u6587\u672c) \u5bf9\u662f\u5426\u5339\u914d\uff1f
\u5355\u4e2a\u5bf9 \\((i, j)\\) \u7684 SigLIP \u635f\u5931\u662f\uff1a
\u5176\u4e2d \\(y_{ij} = 1\\) \u5982\u679c \\(i = j\\)\uff08\u5339\u914d\uff09\uff0c\u5426\u5219 \\(y_{ij} = 0\\)\uff0c\\(\\\\sigma\\) \u662f sigmoid \u51fd\u6570\u3002
SigLIP \u7684\u5173\u952e\u4f18\u52bf\u5728\u4e8e\u5b83\u6d88\u9664\u4e86\u8de8\u6574\u4e2a\u6279\u6b21\u8fdb\u884c\u5168\u5c40 softmax \u5f52\u4e00\u5316\u7684\u9700\u8981\u3002\u5728 CLIP \u4e2d\uff0csoftmax \u5206\u6bcd\u9700\u8981\u6536\u96c6\u6240\u6709\u8bbe\u5907\u4e0a\u7684\u6240\u6709\u5d4c\u5165\uff0c\u8fd9\u5728\u5206\u5e03\u5f0f\u8bad\u7ec3\u4e2d\u662f\u4e00\u4e2a\u901a\u4fe1\u74f6\u9888\u3002SigLIP \u7684\u9010\u5bf9 sigmoid \u635f\u5931\u53ef\u4ee5\u5728\u672c\u5730\u8ba1\u7b97\uff0c\u4ece\u800c\u80fd\u591f\u66f4\u9ad8\u6548\u5730\u6269\u5c55\u5230\u975e\u5e38\u5927\u7684\u6279\u6b21\u3002SigLIP \u4ee5\u66f4\u4f4e\u7684\u8bad\u7ec3\u6210\u672c\u8fbe\u5230\u4e86\u4e0e CLIP \u76f8\u5f53\u7684\u8d28\u91cf\u3002
\u6e29\u5ea6 \\(\\\\tau\\) \u662f\u5bf9\u6bd4\u5b66\u4e60\u4e2d\u6700\u91cd\u8981\u7684\u8d85\u53c2\u6570\u4e4b\u4e00\u3002\u4e3a\u4e86\u5efa\u7acb\u76f4\u89c9\uff0c\u53ef\u4ee5\u4ece\u7269\u7406\u610f\u4e49\u4e0a\u8003\u8651\u6e29\u5ea6\uff1a\u5728\u9ad8\u6e29\u4e0b\uff0c\u5206\u5b50\u968f\u673a\u8fd0\u52a8\uff08softmax \u662f\u5e73\u5766\u7684\uff0c\u6240\u6709\u8d1f\u6837\u672c\u770b\u8d77\u6765\u4e00\u6837\u5dee\uff09\uff1b\u5728\u4f4e\u6e29\u4e0b\uff0c\u5206\u5b50\u6c89\u964d\u4e3a\u521a\u6027\u7ed3\u6784\uff08softmax \u662f\u5c16\u9510\u7684\uff0c\u53ea\u6709\u6700\u96be\u7684\u8d1f\u6837\u672c\u624d\u91cd\u8981\uff09\u3002
\u5f62\u5f0f\u5316\u5730\uff0c\u5f53 \\(\\\\tau \\\\to 0\\) \u65f6\uff0csoftmax \u8d8b\u8fd1\u4e8e\u786c argmax\uff0c\u53ea\u9009\u62e9\u6700\u5355\u4e00\u7684\u56f0\u96be\u8d1f\u6837\u672c\u3002\u5f53 \\(\\\\tau \\\\to \\\\infty\\) \u65f6\uff0c\u6240\u6709\u8d1f\u6837\u672c\u7684\u8d21\u732e\u76f8\u7b49\u3002\u5728\u5b9e\u8df5\u4e2d\uff0c\\(\\\\tau \\\\in [0.01, 0.1]\\) \u5bf9\u5f52\u4e00\u5316\u5d4c\u5165\u6548\u679c\u826f\u597d\u3002\u6e29\u5ea6\u8fc7\u4f4e\u4f1a\u5bfc\u81f4\u8bad\u7ec3\u4e0d\u7a33\u5b9a\uff08\u56f0\u96be\u8d1f\u6837\u672c\u7684\u68af\u5ea6\u53d8\u5f97\u975e\u5e38\u5927\uff09\uff1b\u6e29\u5ea6\u8fc7\u9ad8\u4f1a\u4f7f\u635f\u5931\u5bf9\u8fdd\u53cd\u60c5\u51b5\u4e0d\u654f\u611f\u3002
CLIP \u521d\u59cb\u5316 \\(\\\\tau = 0.07\\) \u5e76\u5c06\u5176\u4f5c\u4e3a\u5bf9\u6570\u53c2\u6570\u5316\u7684\u6807\u91cf \\(\\\\tau = \\\\exp(t)\\) \u5b66\u4e60\uff0c\u5176\u4e2d \\(t\\) \u4e0e\u6a21\u578b\u6743\u91cd\u4e00\u8d77\u901a\u8fc7\u68af\u5ea6\u4e0b\u964d\u66f4\u65b0\u3002\u8fd9\u4f7f\u5f97\u6a21\u578b\u80fd\u591f\u5728\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\u81ea\u52a8\u8c03\u6574\u5bf9\u6bd4\u4efb\u52a1\u7684\u96be\u5ea6\u3002
\u5176\u4e2d \\(m\\) \u662f\u4e00\u4e2a\u95f4\u9694\uff0c\u786e\u4fdd\u6b63\u6837\u672c\u81f3\u5c11\u6bd4\u8d1f\u6837\u672c\u8fd1 \\(m\\)\u3002\u4e09\u5143\u7ec4\u635f\u5931\u64cd\u4f5c\u5728\u5355\u4e2a\u4e09\u5143\u7ec4\u4e0a\u800c\u975e\u6279\u6b21\u4e0a\uff0c\u56e0\u6b64\u6837\u672c\u6548\u7387\u4f4e\u4e8e InfoNCE\u3002\u5b83\u8fd8\u5bf9\u6316\u6398\u7b56\u7565\u654f\u611f\uff1a\u968f\u673a\u8d1f\u6837\u672c\u901a\u5e38\u8fc7\u4e8e\u7b80\u5355\uff08\u635f\u5931\u4e3a\u96f6\uff09\uff0c\u56e0\u6b64\u56f0\u96be\u8d1f\u6837\u672c\u6316\u6398\uff08hard negative mining\uff0c\u9009\u62e9\u6700\u63a5\u8fd1\u7684\u4e0d\u6b63\u786e\u5339\u914d\uff09\u6216\u534a\u56f0\u96be\u6316\u6398\uff08semi-hard mining\uff0c\u9009\u62e9\u95f4\u9694\u5185\u7684\u8d1f\u6837\u672c\uff09\u81f3\u5173\u91cd\u8981\u3002
InfoNCE \u5728\u6574\u4e2a\u6279\u6b21\u4e2d\u9690\u5f0f\u5730\u6267\u884c\u56f0\u96be\u8d1f\u6837\u672c\u6316\u6398\uff0c\u8fd9\u662f\u5b83\u5728\u89c4\u6a21\u4e0a\u4f18\u4e8e\u4e09\u5143\u7ec4\u635f\u5931\u7684\u539f\u56e0\u4e4b\u4e00\u3002InfoNCE \u4e2d\u7684 softmax \u5f52\u4e00\u5316\u81ea\u52a8\u63d0\u9ad8\u56f0\u96be\u8d1f\u6837\u672c\uff08\u4e0e\u951a\u70b9\u76f8\u4f3c\u5ea6\u9ad8\u7684\u8d1f\u6837\u672c\uff09\u7684\u6743\u91cd\uff0c\u5728\u65e0\u9700\u663e\u5f0f\u6316\u6398\u7684\u60c5\u51b5\u4e0b\u63d0\u4f9b\u4e86\u81ea\u7136\u7684\u8bfe\u7a0b\u5b66\u4e60\u3002
\u4e00\u65e6\u4f60\u6709\u4e86\u8bad\u7ec3\u597d\u7684\u8054\u5408\u5d4c\u5165\u7a7a\u95f4\uff0c\u5c31\u53ef\u4ee5\u6267\u884c\u56fe\u50cf-\u6587\u672c\u68c0\u7d22\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u56fe\u50cf\u67e5\u8be2\uff0c\u4ece\u6570\u636e\u5e93\u4e2d\u627e\u51fa\u6700\u76f8\u5173\u7684\u6587\u672c\uff08\u56fe\u50cf\u5230\u6587\u672c\u68c0\u7d22\uff09\uff0c\u6216\u8005\u7ed9\u5b9a\u4e00\u4e2a\u6587\u672c\u67e5\u8be2\uff0c\u627e\u51fa\u6700\u76f8\u5173\u7684\u56fe\u50cf\uff08\u6587\u672c\u5230\u56fe\u50cf\u68c0\u7d22\uff09\u3002\u8fd9\u4ec5\u4ec5\u662f\u5171\u4eab\u5d4c\u5165\u7a7a\u95f4\u4e2d\u7684\u6700\u8fd1\u90bb\u641c\u7d22\u3002
\u60f3\u8c61\u4e00\u4e2a\u56fe\u4e66\u7ba1\u7406\u5458\uff0c\u53ef\u4ee5\u5373\u65f6\u6bd4\u8f83\u4e00\u767e\u4e07\u6761\u76ee\u5f55\u4e2d\u7684\u4efb\u4f55\u7167\u7247\u4e0e\u4efb\u4f55\u63cf\u8ff0\u3002\u4ed6\u4eec\u4e0d\u9700\u8981\u4e8b\u5148\u7406\u89e3\u6bcf\u4e00\u4e2a\u53ef\u80fd\u7684\u7c7b\u522b\uff1b\u53ea\u9700\u6d4b\u91cf\u6bcf\u5f20\u7167\u7247\u4e0e\u6bcf\u6761\u63cf\u8ff0\u6709\u591a\"\u63a5\u8fd1\"\u3002\u8fd9\u5c31\u662f CLIP \u98ce\u683c\u7684\u6a21\u578b\u6267\u884c\u68c0\u7d22\u548c\u96f6\u6837\u672c\u5206\u7c7b\u7684\u65b9\u5f0f\u3002
\u96f6\u6837\u672c\u5206\u7c7b\u662f\u6587\u672c\u5230\u56fe\u50cf\u68c0\u7d22\u7684\u4e00\u4e2a\u7279\u4f8b\u3002\u7ed9\u5b9a \\(K\\) \u4e2a\u7c7b\u522b\u540d\u79f0\uff0c\u4f60\u6784\u5efa\u6587\u672c\u63d0\u793a \\(\\\\{t_1, \\\\ldots, t_K\\\\}\\)\uff08\u4f8b\u5982\uff0c\"a photo of a cat\"\u3001\"a photo of a dog\"\uff09\u5e76\u5bf9\u5176\u8fdb\u884c\u5d4c\u5165\u3002\u5bf9\u4e8e\u4e00\u5f20\u65b0\u56fe\u50cf \\(x\\)\uff0c\u9884\u6d4b\u7684\u7c7b\u522b\u4e3a\uff1a
\u5173\u952e\u6d1e\u5bdf\u5728\u4e8e\uff0c\u6587\u672c\u7f16\u7801\u5668\u5145\u5f53\u4e86\u4e00\u4e2a\u7075\u6d3b\u7684\u5206\u7c7b\u5668\u5934\u3002\u4f60\u4e0d\u9700\u8981\u4e3a\u6bcf\u4e2a\u4e0b\u6e38\u4efb\u52a1\u8bad\u7ec3\u65b0\u7684\u7ebf\u6027\u5c42\uff0c\u53ea\u9700\u7528\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\u4efb\u52a1\u3002\u8fd9\u5c31\u662f CLIP \u6cdb\u5316\u80fd\u529b\u5982\u6b64\u4e4b\u5f3a\u7684\u539f\u56e0\uff1a\u6587\u672c\u7f16\u7801\u5668\u5728\u9884\u8bad\u7ec3\u671f\u95f4\u89c1\u8fc7\u6570\u767e\u4e07\u79cd\u4e0d\u540c\u7684\u63cf\u8ff0\u3002
\u63d0\u793a\u5de5\u7a0b\uff08prompt engineering\uff09 \u5f88\u91cd\u8981\u3002CLIP \u5728 ImageNet \u4e0a\u7684\u96f6\u6837\u672c\u51c6\u786e\u7387\u4ece 63.2% \u63d0\u5347\u5230 68.4%\uff0c\u4ec5\u4ec5\u662f\u5c06\u63d0\u793a\u6a21\u677f\u4ece \"{class name}\" \u6539\u4e3a \"a photo of a {class name}.\" \u66f4\u597d\u7684\u662f\uff0c\u63d0\u793a\u96c6\u6210\uff08prompt ensembling\uff09 \u901a\u8fc7\u5e73\u5747\u591a\u4e2a\u6a21\u677f\u7684\u6587\u672c\u5d4c\u5165\uff08\u4f8b\u5982\uff0c\"a photo of a {class name}\"\u3001\"a good photo of a {class name}\"\u3001\"a drawing of a {class name}\"\uff09\u6765\u4ea7\u751f\u66f4\u9c81\u68d2\u7684\u6587\u672c\u8868\u5f81\u3002
\u95ed\u4e0a\u773c\u775b\uff0c\u542c\u67d0\u4eba\u62cd\u7bee\u7403\u3002\u4f60\u80fd\u4ece\u8282\u594f\u6027\u7684\u7830\u7830\u58f0\u4e2d\u5224\u65ad\u7403\u4f55\u65f6\u843d\u5730\u3002\u73b0\u5728\u7741\u5f00\u773c\u775b\uff1a\u89c6\u89c9\u4e0a\u7684\u5f39\u8df3\u4e0e\u6bcf\u6b21\u7830\u58f0\u5b8c\u7f8e\u5bf9\u9f50\u3002\u8fd9\u79cd\u97f3\u9891\u4e0e\u89c6\u89c9\u4e8b\u4ef6\u4e4b\u95f4\u7684\u7d27\u5bc6\u5bf9\u5e94\u5173\u7cfb\u662f\u4e00\u79cd\u673a\u5668\u53ef\u4ee5\u5b66\u4e60\u7684\u514d\u8d39\u76d1\u7763\u4fe1\u53f7\u3002\u97f3\u89c6\u9891\u5bf9\u5e94\u5b66\u4e60\uff08audio-visual correspondence learning\uff09 \u8bad\u7ec3\u6a21\u578b\u5c06\u58f0\u97f3\u4e0e\u5176\u89c6\u89c9\u6765\u6e90\u5173\u8054\u8d77\u6765\uff0c\u65e0\u9700\u4efb\u4f55\u4eba\u5de5\u6807\u6ce8\u3002
\u8fd9\u4e2a\u60f3\u6cd5\u4e0e CLIP \u60ca\u4eba\u5730\u76f8\u4f3c\uff0c\u53ea\u662f\u5c06\u6587\u672c\u66ff\u6362\u4e3a\u97f3\u9891\u3002\u7ed9\u5b9a\u914d\u5bf9\u7684\u89c6\u9891\u5e27\u548c\u97f3\u9891\u7247\u6bb5\uff0c\u6a21\u578b\u5b66\u4e60\u4e00\u4e2a\u5d4c\u5165\u7a7a\u95f4\uff0c\u5176\u4e2d\u65f6\u95f4\u4e0a\u5bf9\u9f50\u7684\u97f3\u89c6\u9891\u5bf9\u5f7c\u6b64\u63a5\u8fd1\uff0c\u800c\u9519\u4f4d\u7684\u5bf9\u5219\u76f8\u8ddd\u5f88\u8fdc\u3002
\u97f3\u89c6\u9891\u5d4c\u5165\uff08Audio-Visual Embedding, AVE\uff09 \u65b9\u6cd5\uff08Arandjelovic \u548c Zisserman\uff0c2017\uff09\u4f7f\u7528\u5bf9\u6bd4\u635f\u5931\u5728\u89c6\u9891\u6570\u636e\u4e0a\u8bad\u7ec3\u4e00\u4e2a\u89c6\u89c9\u7f16\u7801\u5668 \\(f\\) \u548c\u4e00\u4e2a\u97f3\u9891\u7f16\u7801\u5668 \\(g\\)\u3002\u6b63\u6837\u672c\u5bf9\u662f\uff08\u89c6\u9891\u5e27\uff0c\u6765\u81ea\u540c\u4e00\u65f6\u523b\u7684\u97f3\u9891\u7247\u6bb5\uff09\uff0c\u8d1f\u6837\u672c\u662f\u6765\u81ea\u4e0d\u540c\u89c6\u9891\u6216\u4e0d\u540c\u65f6\u523b\u7684\u97f3\u9891\u7247\u6bb5\u3002\u6a21\u578b\u5b66\u4f1a\u72d7\u53eb\u58f0\u5bf9\u5e94\u72d7\u7684\u56fe\u50cf\uff0c\u5409\u4ed6\u58f0\u5bf9\u5e94\u5409\u4ed6\u7684\u56fe\u50cf\uff0c\u6240\u6709\u8fd9\u4e9b\u90fd\u4e0d\u9700\u8981\u6807\u7b7e\u3002
\u97f3\u9891\u7f16\u7801\u5668\u901a\u5e38\u4f7f\u7528 CNN \u6216\u97f3\u9891 Transformer \u5904\u7406\u5bf9\u6570\u6885\u5c14\u8bed\u8c31\u56fe\uff08log-mel spectrograms\uff09\uff08\u7b2c 9 \u7ae0\u6587\u4ef6 01\uff09\uff0c\u751f\u6210\u56fa\u5b9a\u5927\u5c0f\u7684\u5d4c\u5165\u3002\u89c6\u89c9\u7f16\u7801\u5668\u4f7f\u7528\u6807\u51c6\u56fe\u50cf\u9aa8\u5e72\u7f51\u7edc\uff08ResNet\u3001ViT\uff09\u5904\u7406\u89c6\u9891\u5e27\u3002\u4e24\u8005\u90fd\u6295\u5f71\u5230\u5171\u4eab\u7684 \\(d\\) \u7ef4\u7a7a\u95f4\uff0c\u8bad\u7ec3\u4f7f\u7528\u4e0e CLIP \u76f8\u540c\u7684 InfoNCE \u635f\u5931\uff1a
\u97f3\u89c6\u9891\u5b66\u4e60\u7684\u5e94\u7528\u5305\u62ec\uff1a\u58f0\u6e90\u5b9a\u4f4d\uff08\u56fe\u50cf\u4e2d\u58f0\u97f3\u6765\u81ea\u4f55\u5904\uff1f\uff09\u3001\u97f3\u89c6\u9891\u8bed\u97f3\u8bc6\u522b\uff08\u7ed3\u5408\u5634\u5507\u8fd0\u52a8\u548c\u97f3\u9891\uff0c\u5982\u7b2c 9 \u7ae0\u6587\u4ef6 02\uff09\u3001\u97f3\u89c6\u9891\u6e90\u5206\u79bb\uff08\u901a\u8fc7\u770b\u7740\u5bf9\u65b9\u7684\u8138\u6765\u9694\u79bb\u4e00\u4e2a\u4eba\u7684\u58f0\u97f3\u2014\u2014\u7b2c 9 \u7ae0\u6587\u4ef6 05 \u4e2d\u7684\"\u9e21\u5c3e\u9152\u4f1a\"\u95ee\u9898\uff09\uff0c\u4ee5\u53ca\u57fa\u4e8e\u97f3\u9891\u7684\u89c6\u9891\u751f\u6210\u3002
ImageBind\uff08Girdhar \u7b49\uff0c2023\uff09\u5c06\u5176\u6269\u5c55\u5230\u516d\u79cd\u6a21\u6001\uff1a\u56fe\u50cf\u3001\u6587\u672c\u3001\u97f3\u9891\u3001\u6df1\u5ea6\u3001\u70ed\u6210\u50cf\u548c IMU \u6570\u636e\u3002\u5173\u952e\u6d1e\u5bdf\u5728\u4e8e\uff0c\u4f60\u4e0d\u9700\u8981\u6bcf\u4e2a\u7ec4\u5408\u90fd\u6709\u914d\u5bf9\u6570\u636e\u3002\u901a\u8fc7\u5c06\u6bcf\u79cd\u6a21\u6001\u4e0e\u56fe\u50cf\u5bf9\u9f50\uff08\u6587\u672c\u901a\u8fc7\u56fe\u50cf-\u6587\u672c\u5bf9\uff0c\u97f3\u9891\u901a\u8fc7\u56fe\u50cf-\u97f3\u9891\u5bf9\u7b49\uff09\uff0c\u6240\u6709\u6a21\u6001\u901a\u8fc7\u5171\u4eab\u7684\u56fe\u50cf\u5d4c\u5165\u7a7a\u95f4\u9690\u5f0f\u5bf9\u9f50\u3002\u8fd9\u79cd\u901a\u8fc7\u516c\u5171\u951a\u70b9\u6a21\u6001\u7684\"\u7ed1\u5b9a\"\u4ea7\u751f\u4e86\u6d8c\u73b0\u5f0f\u5bf9\u9f50\uff1a\u97f3\u9891\u548c\u6587\u672c\u53d8\u5f97\u76f8\u4f3c\uff0c\u5373\u4f7f\u5b83\u4eec\u4ece\u672a\u88ab\u76f4\u63a5\u4e00\u8d77\u8bad\u7ec3\u8fc7\u3002
\u96f6\u6837\u672c\u8bc4\u4f30\u8861\u91cf\u6a21\u578b\u662f\u5426\u80fd\u591f\u6267\u884c\u4ece\u672a\u88ab\u660e\u786e\u8bad\u7ec3\u8fc7\u7684\u4efb\u52a1\u3002\u6700\u5e38\u7528\u7684\u57fa\u51c6\u662fImageNet \u96f6\u6837\u672c\u51c6\u786e\u7387\uff1a\u5c06\u6240\u6709 1,000 \u4e2a ImageNet \u7c7b\u522b\u540d\u79f0\u4f5c\u4e3a\u6587\u672c\u5d4c\u5165\uff0c\u5d4c\u5165\u6bcf\u4e2a\u6d4b\u8bd5\u56fe\u50cf\uff0c\u6839\u636e\u4f59\u5f26\u76f8\u4f3c\u5ea6\u6d4b\u91cf top-1 \u548c top-5 \u5206\u7c7b\u51c6\u786e\u7387\u3002CLIP ViT-L/14 \u5728\u96f6\u6837\u672c\u4e0b\u8fbe\u5230 75.5% \u7684 top-1 \u51c6\u786e\u7387\uff0c\u4e0e\u5728 ImageNet \u4e0a\u8bad\u7ec3\u7684\u76d1\u7763\u5f0f ResNet-50 \u76f8\u5f53\u3002
\u5176\u4ed6\u96f6\u6837\u672c\u57fa\u51c6\u5305\u62ec\uff1aCIFAR-10/100\u3001STL-10\u3001Food-101\u3001Oxford Pets \u548c Flowers-102\u3002\u5728\u591a\u4e2a\u6570\u636e\u96c6\u4e0a\u8bc4\u4f30\u53ef\u4ee5\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u771f\u6b63\u5177\u6709\u901a\u7528\u7684\u89c6\u89c9\u7406\u89e3\u80fd\u529b\uff0c\u8fd8\u662f\u4ec5\u4ec5\u662f\u8bb0\u4f4f\u4e86\u9884\u8bad\u7ec3\u6570\u636e\u4e2d\u7684\u6a21\u5f0f\u3002
\u7ebf\u6027\u63a2\u6d4b\uff08linear probe\uff09 \u8bc4\u4f30\u662f\u4e00\u79cd\u4e92\u8865\u7684\u6d4b\u8bd5\u3002\u4f60\u51bb\u7ed3\u9884\u8bad\u7ec3\u7684\u56fe\u50cf\u7f16\u7801\u5668\uff0c\u4e3a\u6807\u6ce8\u6570\u636e\u96c6\u63d0\u53d6\u7279\u5f81\uff0c\u7136\u540e\u5728\u5176\u4e0a\u8bad\u7ec3\u4e00\u4e2a\u7b80\u5355\u7684\u7ebf\u6027\u5206\u7c7b\u5668\u3002\u8fd9\u72ec\u7acb\u4e8e\u96f6\u6837\u672c\u68c0\u7d22\u673a\u5236\u6765\u5ea6\u91cf\u5b66\u4e60\u5230\u7684\u8868\u5f81\u7684\u8d28\u91cf\u3002CLIP \u7684\u7279\u5f81\u662f\u6781\u597d\u7684\u7ebf\u6027\u63a2\u6d4b\u7279\u5f81\uff0c\u901a\u5e38\u8fbe\u5230\u6216\u8d85\u8fc7\u76d1\u7763\u9884\u8bad\u7ec3\u3002
\u5bf9\u4e8e\u68c0\u7d22\u4efb\u52a1\uff08\u56fe\u50cf\u5230\u6587\u672c\u548c\u6587\u672c\u5230\u56fe\u50cf\uff09\uff0c\u6807\u51c6\u5ea6\u91cf\u662f Recall@K\uff08R@K\uff09\uff1a\u6b63\u786e\u5339\u914d\u51fa\u73b0\u5728\u524d \\(K\\) \u4e2a\u68c0\u7d22\u7ed3\u679c\u4e2d\u7684\u67e5\u8be2\u6bd4\u4f8b\u3002\u5e38\u7528\u7684\u53d6\u503c\u4e3a R@1\u3001R@5 \u548c R@10\u3002
\u5f62\u5f0f\u5316\u5730\uff0c\u5bf9\u4e8e\u4e00\u7ec4 \\(Q\\) \u4e2a\u67e5\u8be2\uff1a
\u5176\u4e2d \\(\\\\text{rank}(q)\\) \u662f\u67e5\u8be2 \\(q\\) \u7684\u6392\u5e8f\u68c0\u7d22\u5217\u8868\u4e2d\u6b63\u786e\u5339\u914d\u7684\u4f4d\u7f6e\u3002
\u6807\u51c6\u7684\u68c0\u7d22\u57fa\u51c6\u5305\u62ec Flickr30K\uff0831,000 \u5f20\u56fe\u50cf\uff0c\u6bcf\u5f20 5 \u6761\u63cf\u8ff0\uff09\u548c MS-COCO\uff08123,000 \u5f20\u56fe\u50cf\uff0c\u6bcf\u5f20 5 \u6761\u63cf\u8ff0\uff09\u3002\u5728\u6d4b\u8bd5\u96c6\u4e0a\u8bc4\u4f30\uff1a\u7ed9\u5b9a\u4e00\u5f20\u56fe\u50cf\uff0c\u4ece\u5168\u90e8\u6d4b\u8bd5\u96c6\u4e2d\u68c0\u7d22\u6b63\u786e\u7684\u63cf\u8ff0\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002
\u4e2d\u4f4d\u6570\u6392\u540d\uff08Median Rank, MedR\uff09 \u662f\u4e00\u79cd\u8865\u5145\u5ea6\u91cf\uff1a\u6240\u6709\u67e5\u8be2\u4e2d\u6b63\u786e\u5339\u914d\u7684\u4e2d\u4f4d\u6570\u4f4d\u7f6e\u3002\u5b8c\u7f8e\u6a21\u578b\u7684 MedR = 1\u3002\u6570\u503c\u8d8a\u5c0f\u8d8a\u597d\u3002
\u9664\u4e86\u68c0\u7d22\uff0c\u591a\u6a21\u6001\u6a21\u578b\u8fd8\u5728\u7ec4\u5408\u7406\u89e3\u57fa\u51c6\u4e0a\u8fdb\u884c\u8bc4\u4f30\uff0c\u5982 Winoground\uff08\u6d4b\u8bd5\u6a21\u578b\u80fd\u5426\u533a\u5206\"a mug in a dog\"\u548c\"a dog in a mug\"\uff09\u548c ARO\uff08\u5c5e\u6027\u3001\u5173\u7cfb\u3001\u987a\u5e8f\uff09\uff0c\u8fd9\u4e9b\u57fa\u51c6\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u771f\u6b63\u7406\u89e3\u8bed\u8a00\u7684\u7ed3\u6784\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u5339\u914d\u8bcd\u888b\u3002CLIP \u98ce\u683c\u7684\u6a21\u578b\u901a\u5e38\u5728\u8fd9\u4e9b\u4efb\u52a1\u4e0a\u8868\u73b0\u4e0d\u4f73\uff0c\u8fd9\u63ed\u793a\u4e86\u4e00\u4e2a\u57fa\u672c\u7684\u5c40\u9650\uff1a\u5bf9\u6bd4\u9884\u8bad\u7ec3\u5bf9\u9f50\u4e86\u5168\u5c40\u8bed\u4e49\uff0c\u4f46\u53ef\u80fd\u65e0\u6cd5\u6355\u6349\u7ec6\u7c92\u5ea6\u7684\u7ec4\u5408\u7ed3\u6784\u3002
\u672c\u6587\u4ef6\u6db5\u76d6\u7684\u591a\u6a21\u6001\u8868\u5f81\u6784\u6210\u4e86\u672c\u7ae0\u540e\u7eed\u6240\u6709\u5185\u5bb9\u7684\u57fa\u7840\u3002CLIP \u53ca\u5176\u540e\u7ee7\u6a21\u578b\u8bad\u7ec3\u7684\u8054\u5408\u5d4c\u5165\u7a7a\u95f4\u662f\u8fde\u63a5\u89c6\u89c9\u548c\u8bed\u8a00\u7684\"\u80f6\u6c34\"\u3002\u6587\u4ef6 02 \u5728\u6b64\u57fa\u7840\u4e4b\u4e0a\uff0c\u6784\u5efa\u4e86\u8d85\u8d8a\u68c0\u7d22\u3001\u80fd\u591f\u751f\u6210\u5173\u4e8e\u56fe\u50cf\u6587\u672c\u7684\u89c6\u89c9-\u8bed\u8a00\u6a21\u578b\u3002\u6587\u4ef6 03 \u63a2\u8ba8\u4e86\u5982\u4f55\u5728\u5e8f\u5217\u6a21\u578b\u4e2d\u5bf9\u56fe\u50cf\u548c\u89c6\u9891\u8fdb\u884c\u5206\u8bcd\u3002\u6587\u4ef6 04 \u6db5\u76d6\u8de8\u6a21\u6001\u751f\u6210\uff08\u6587\u672c\u5230\u56fe\u50cf\u3001\u6587\u672c\u5230\u89c6\u9891\uff09\u3002\u6587\u4ef6 05 \u7814\u7a76\u4e86\u5728\u5355\u4e00\u6a21\u578b\u4e2d\u5904\u7406\u591a\u79cd\u6a21\u6001\u7684\u7edf\u4e00\u67b6\u6784\u3002
\u6838\u5fc3\u8981\u70b9\uff1a\u5728\u914d\u5bf9\u6570\u636e\u4e0a\u8fdb\u884c\u5bf9\u6bd4\u5b66\u4e60\u4ea7\u751f\u4e86\u5d4c\u5165\u7a7a\u95f4\uff0c\u4f7f\u5f97\u4e0d\u540c\u6a21\u6001\u4e4b\u95f4\u53ef\u4ee5\u4e92\u6362\u3002\u56fe\u50cf\u5d4c\u5165\u548c\u6587\u672c\u5d4c\u5165\u53d8\u6210\u4e86\"\u540c\u4e00\u79cd\u4e1c\u897f\"\uff0c\u4ece\u800c\u5b9e\u73b0\u96f6\u6837\u672c\u5206\u7c7b\u3001\u68c0\u7d22\u4ee5\u53ca\u65e0\u7f1d\u96c6\u6210\u5230\u66f4\u5927\u7684\u7cfb\u7edf\u4e2d\u3002\u8fd9\u4e2a\u60f3\u6cd5\u2014\u2014\u5c06\u5339\u914d\u7684\u5bf9\u62c9\u8fd1\u3001\u4e0d\u5339\u914d\u7684\u5bf9\u63a8\u8fdc\u2014\u2014\u7684\u7b80\u5355\u6027\u63a9\u76d6\u4e86\u5176\u975e\u51e1\u7684\u6709\u6548\u6027\u3002
\u4ece\u5934\u5b9e\u73b0 CLIP \u5bf9\u6bd4\u635f\u5931\u3002\u521b\u5efa\u968f\u673a\u56fe\u50cf\u548c\u6587\u672c\u5d4c\u5165\uff0c\u8ba1\u7b97\u76f8\u4f3c\u5ea6\u77e9\u9635\uff0c\u5e76\u8ba1\u7b97\u5bf9\u79f0\u4ea4\u53c9\u71b5\u635f\u5931\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef clip_loss(image_embeds, text_embeds, temperature=0.07):\n \"\"\"\u8ba1\u7b97\u5bf9\u79f0 CLIP \u5bf9\u6bd4\u635f\u5931\u3002\"\"\"\n # L2 \u5f52\u4e00\u5316\u5d4c\u5165\n image_embeds = image_embeds / jnp.linalg.norm(image_embeds, axis=1, keepdims=True)\n text_embeds = text_embeds / jnp.linalg.norm(text_embeds, axis=1, keepdims=True)\n\n # \u8ba1\u7b97\u4f59\u5f26\u76f8\u4f3c\u5ea6\u77e9\u9635 (N x N)\n logits = image_embeds @ text_embeds.T / temperature # (N, N)\n\n # \u6807\u7b7e\uff1a\u5bf9\u89d2\u7ebf\uff08\u7b2c i \u5f20\u56fe\u50cf\u5339\u914d\u7b2c i \u6bb5\u6587\u672c\uff09\n N = logits.shape[0]\n labels = jnp.arange(N)\n\n # \u5bf9\u79f0\u4ea4\u53c9\u71b5\uff1a\u56fe\u50cf\u5230\u6587\u672c + \u6587\u672c\u5230\u56fe\u50cf\n loss_i2t = -jnp.mean(jax.nn.log_softmax(logits, axis=1)[jnp.arange(N), labels])\n loss_t2i = -jnp.mean(jax.nn.log_softmax(logits, axis=0)[labels, jnp.arange(N)])\n return (loss_i2t + loss_t2i) / 2, logits * temperature\n\n# \u6a21\u62df\u4e00\u6279 8 \u4e2a\u56fe\u50cf-\u6587\u672c\u5bf9\uff0c64 \u7ef4\u7a7a\u95f4\nkey = jax.random.PRNGKey(42)\nk1, k2 = jax.random.split(key)\nN, D = 8, 64\nimage_embeds = jax.random.normal(k1, (N, D))\ntext_embeds = jax.random.normal(k2, (N, D))\n\nloss, sim_matrix = clip_loss(image_embeds, text_embeds)\nprint(f\"CLIP loss (random embeddings): {loss:.4f}\")\n\n# \u53ef\u89c6\u5316\u76f8\u4f3c\u5ea6\u77e9\u9635\nfig, ax = plt.subplots(figsize=(6, 5))\nim = ax.imshow(sim_matrix, cmap='coolwarm', vmin=-1, vmax=1)\nax.set_xlabel(\"Text index\"); ax.set_ylabel(\"Image index\")\nax.set_title(f\"Cosine Similarity Matrix (loss={loss:.3f})\")\nplt.colorbar(im); plt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\u6539\u53d8\u6e29\u5ea6 (0.01, 0.1, 1.0) \u5e76\u89c2\u5bdf\u635f\u5931\u5982\u4f55\u53d8\u5316\n# \u5c1d\u8bd5\u4f7f\u5339\u914d\u5bf9\u76f8\u4f3c\uff1a\u5c06 text_embeds \u8bbe\u7f6e\u4e3a image_embeds + \u5c0f\u566a\u58f0\n \u6784\u5efa\u4e00\u4e2a\u73a9\u5177\u8054\u5408\u5d4c\u5165\u6a21\u578b\uff0c\u5b66\u4e60\u4f7f\u7528 InfoNCE \u635f\u5931\u548c\u68af\u5ea6\u4e0b\u964d\u6765\u5bf9\u9f50 2D\"\u56fe\u50cf\"\uff08\u968f\u673a\u5411\u91cf\uff09\u4e0e\"\u63cf\u8ff0\"\uff08\u4e0d\u540c\u7684\u968f\u673a\u5411\u91cf\uff09\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef info_nce_loss(img_enc, txt_enc, img_data, txt_data, tau=0.1):\n \"\"\"\u5728\u4e00\u6279\u914d\u5bf9\u7684 (\u56fe\u50cf, \u6587\u672c) \u6570\u636e\u4e0a\u8ba1\u7b97 InfoNCE\u3002\"\"\"\n z_img = img_data @ img_enc # (N, D)\n z_txt = txt_data @ txt_enc # (N, D)\n # L2 \u5f52\u4e00\u5316\n z_img = z_img / jnp.linalg.norm(z_img, axis=1, keepdims=True)\n z_txt = z_txt / jnp.linalg.norm(z_txt, axis=1, keepdims=True)\n logits = z_img @ z_txt.T / tau\n labels = jnp.arange(logits.shape[0])\n return -jnp.mean(jax.nn.log_softmax(logits, axis=1)[jnp.arange(len(labels)), labels])\n\n# \u521b\u5efa 32 \u4e2a\u914d\u5bf9\u6837\u672c\uff1a\u56fe\u50cf\u5728 R^8 \u4e2d\uff0c\u6587\u672c\u5728 R^6 \u4e2d\uff0c\u5d4c\u5165\u5230 R^4\nkey = jax.random.PRNGKey(0)\nk1, k2, k3, k4 = jax.random.split(key, 4)\nN, d_img, d_txt, d_embed = 32, 8, 6, 4\n\nimg_data = jax.random.normal(k1, (N, d_img))\ntxt_data = jax.random.normal(k2, (N, d_txt))\n\n# \u53ef\u5b66\u4e60\u7684\u6295\u5f71\u77e9\u9635\nimg_enc = jax.random.normal(k3, (d_img, d_embed)) * 0.1\ntxt_enc = jax.random.normal(k4, (d_txt, d_embed)) * 0.1\n\ngrad_fn = jax.jit(jax.grad(info_nce_loss, argnums=(0, 1)))\nlr = 0.05\nlosses = []\n\nfor step in range(300):\n loss = info_nce_loss(img_enc, txt_enc, img_data, txt_data)\n losses.append(float(loss))\n g_img, g_txt = grad_fn(img_enc, txt_enc, img_data, txt_data)\n img_enc = img_enc - lr * g_img\n txt_enc = txt_enc - lr * g_txt\n\nprint(f\"Initial loss: {losses[0]:.3f}, Final loss: {losses[-1]:.3f}\")\nprint(f\"Random baseline (log N): {jnp.log(N):.3f}\")\n\nplt.figure(figsize=(8, 4))\nplt.plot(losses, color='#2c3e50')\nplt.axhline(y=0, color='green', linestyle='--', alpha=0.5, label='Perfect alignment')\nplt.axhline(y=float(jnp.log(N)), color='red', linestyle='--', alpha=0.5, label='Random (log N)')\nplt.xlabel(\"Step\"); plt.ylabel(\"InfoNCE Loss\")\nplt.title(\"Learning a Joint Embedding Space\")\nplt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()\n# \u4fee\u6539 d_embed\uff08\u5c1d\u8bd5 2, 4, 16\uff09\u89c2\u5bdf\u5d4c\u5165\u7ef4\u5ea6\u5982\u4f55\u5f71\u54cd\u5bf9\u9f50\n \u4f7f\u7528\u9884\u8ba1\u7b97\u7684\u5d4c\u5165\u5b9e\u73b0\u96f6\u6837\u672c\u5206\u7c7b\u3002\u6a21\u62df\u7c7b\"\u539f\u578b\"\u4f5c\u4e3a\u6587\u672c\u5d4c\u5165\uff0c\u901a\u8fc7\u6700\u8fd1\u90bb\u67e5\u627e\u5bf9\u65b0\u56fe\u50cf\u8fdb\u884c\u5206\u7c7b\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u6a21\u62df 5 \u4e2a\u7c7b\uff0c\u6bcf\u4e2a\u7c7b\u6709\u4e00\u4e2a\u539f\u578b\u6587\u672c\u5d4c\u5165\u5728 R^32 \u4e2d\nkey = jax.random.PRNGKey(42)\nn_classes, d = 5, 32\nclass_names = [\"cat\", \"dog\", \"car\", \"plane\", \"ship\"]\n\n# \u7c7b\u539f\u578b\uff08\u60f3\u8c61\u8fd9\u4e9b\u6765\u81ea\u6587\u672c\u7f16\u7801\u5668\uff09\nk1, k2 = jax.random.split(key)\nclass_prototypes = jax.random.normal(k1, (n_classes, d))\nclass_prototypes = class_prototypes / jnp.linalg.norm(class_prototypes, axis=1, keepdims=True)\n\n# \u751f\u6210 200 \u4e2a\u6d4b\u8bd5\"\u56fe\u50cf\"\uff08\u5728\u5176\u7c7b\u539f\u578b\u9644\u8fd1\u52a0\u4e0a\u566a\u58f0\u7684\u5d4c\u5165\uff09\nn_per_class = 40\ntrue_labels = jnp.repeat(jnp.arange(n_classes), n_per_class)\nkeys = jax.random.split(k2, n_classes * n_per_class)\n\nimage_embeds = []\nfor i in range(n_classes):\n noise = jax.random.normal(keys[i], (n_per_class, d)) * 0.5\n cluster = class_prototypes[i] + noise\n image_embeds.append(cluster)\nimage_embeds = jnp.concatenate(image_embeds, axis=0)\nimage_embeds = image_embeds / jnp.linalg.norm(image_embeds, axis=1, keepdims=True)\n\n# \u96f6\u6837\u672c\u5206\u7c7b\uff1a\u4e0e\u6bcf\u4e2a\u539f\u578b\u7684\u4f59\u5f26\u76f8\u4f3c\u5ea6\nsimilarities = image_embeds @ class_prototypes.T # (200, 5)\npredicted_labels = jnp.argmax(similarities, axis=1)\naccuracy = jnp.mean(predicted_labels == true_labels)\nprint(f\"Zero-shot accuracy: {accuracy:.1%}\")\n\n# \u6df7\u6dc6\u77e9\u9635\nconf = jnp.zeros((n_classes, n_classes), dtype=jnp.int32)\nfor true, pred in zip(true_labels, predicted_labels):\n conf = conf.at[true, pred].add(1)\n\nfig, ax = plt.subplots(figsize=(6, 5))\nim = ax.imshow(conf, cmap='Blues')\nax.set_xticks(range(n_classes)); ax.set_xticklabels(class_names, rotation=45)\nax.set_yticks(range(n_classes)); ax.set_yticklabels(class_names)\nax.set_xlabel(\"Predicted\"); ax.set_ylabel(\"True\")\nfor i in range(n_classes):\n for j in range(n_classes):\n ax.text(j, i, int(conf[i, j]), ha='center', va='center', fontsize=11)\nax.set_title(f\"Zero-Shot Confusion Matrix (acc={accuracy:.1%})\")\nplt.colorbar(im); plt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\u589e\u52a0\u566a\u58f0\uff080.5 -> 1.0 -> 2.0\uff09\u89c2\u5bdf\u51c6\u786e\u7387\u4e0b\u964d\n# \u5c1d\u8bd5\u63d0\u793a\u96c6\u6210\uff1a\u5e73\u5747\u6bcf\u4e2a\u539f\u578b\u7684 3 \u4e2a\u566a\u58f0\u526f\u672c\n \u89c6\u89c9\u8bed\u8a00\u6a21\u578b\u5171\u540c\u7406\u89e3\u56fe\u50cf\u548c\u6587\u672c\uff0c\u5b9e\u73b0\u89c6\u89c9\u95ee\u7b54\u3001\u56fe\u50cf\u63cf\u8ff0\u548c\u89c6\u89c9\u63a8\u7406\u3002\u672c\u6587\u4ef6\u6db5\u76d6 VQA\u3001\u56fe\u50cf\u63cf\u8ff0\u3001\u89c6\u89c9\u5b9a\u4f4d\uff0c\u4ee5\u53ca VisualBERT\u3001BLIP\u3001LLaVA\u3001Flamingo\u3001PaLI \u548c Qwen-VL \u7b49\u5c06\u89c6\u89c9\u7f16\u7801\u5668\u4e0e\u5927\u578b\u8bed\u8a00\u6a21\u578b\u878d\u5408\u7684\u67b6\u6784\u3002
\u60f3\u8c61\u4e00\u4f4d\u535a\u7269\u9986\u5bfc\u89c8\u5458\uff0c\u4ed6\u80fd\u770b\u7740\u4e00\u5e45\u753b\u5e76\u6e05\u6670\u63cf\u8ff0\u753b\u4e2d\u7684\u4e00\u5207\uff1a\u6709\u54ea\u4e9b\u7269\u4f53\u3001\u8bb2\u8ff0\u4e86\u4ec0\u4e48\u6545\u4e8b\u3001\u4f20\u8fbe\u4e86\u600e\u6837\u7684\u60c5\u611f\uff0c\u8fd8\u80fd\u56de\u7b54\u53c2\u89c2\u8005\u7684\u4efb\u4f55\u95ee\u9898\u3002\u89c6\u89c9\u8bed\u8a00\u6a21\u578b\uff08VLM\uff09 \u5c31\u662f\u8ba1\u7b97\u9886\u57df\u7684\u7b49\u4ef7\u7269\u2014\u2014\u4e00\u4e2a\u80fd\u540c\u65f6\u7406\u89e3\u56fe\u50cf\u548c\u6587\u672c\u7684\u7cfb\u7edf\uff0c\u80fd\u591f\u63cf\u8ff0\u89c6\u89c9\u573a\u666f\u3001\u56de\u7b54\u76f8\u5173\u95ee\u9898\u3001\u6267\u884c\u89c6\u89c9\u6307\u4ee4\uff0c\u751a\u81f3\u6839\u636e\u81ea\u7136\u8bed\u8a00\u67e5\u8be2\u5728\u56fe\u50cf\u4e2d\u5b9a\u4f4d\u7279\u5b9a\u7269\u4f53\u3002
VLM \u4f4d\u4e8e\u4f60\u5728\u7b2c 8 \u7ae0\u5b66\u5230\u7684\u89c6\u89c9\u7f16\u7801\u5668\u548c\u7b2c 7 \u7ae0\u7684\u8bed\u8a00\u6a21\u578b\u7684\u4ea4\u6c47\u70b9\u3002\u6838\u5fc3\u5de5\u7a0b\u6311\u6218\u5728\u4e8e\u6865\u63a5\u4e24\u4e2a\u622a\u7136\u4e0d\u540c\u7684\u8868\u5f81\u4e16\u754c\uff1a\u89c6\u89c9\u9aa8\u5e72\u7f51\u7edc\u4ea7\u751f\u7684\u7a7a\u95f4\u5316\u3001\u8fde\u7eed\u7684 feature map\uff0c\u4e0e\u8bed\u8a00\u6a21\u578b\u4ea7\u751f\u7684\u5e8f\u5217\u5316\u3001\u79bb\u6563\u7684 token \u5d4c\u5165\u3002\u672c\u6587\u4ef6\u4e2d\u7684\u6bcf\u4e00\u79cd\u67b6\u6784\uff0c\u672c\u8d28\u4e0a\u90fd\u662f\u5bf9\u540c\u4e00\u4e2a\u95ee\u9898\u7684\u4e0d\u540c\u56de\u7b54\uff1a\u5982\u4f55\u878d\u5408\u89c6\u89c9\u548c\u8bed\u8a00\uff1f
\u60f3\u8c61\u6709\u4eba\u5411\u4f60\u5c55\u793a\u4e00\u5f20\u7167\u7247\u5e76\u95ee\uff1a\"\u516c\u56ed\u91cc\u6709\u51e0\u53ea\u72d7\uff1f\"\u4f60\u6beb\u4e0d\u8d39\u529b\u5730\u89e3\u6790\u56fe\u50cf\u3001\u5b9a\u4f4d\u72d7\u3001\u6570\u51fa\u6570\u91cf\u5e76\u7ed9\u51fa\u7b54\u6848\u3002\u89c6\u89c9\u95ee\u7b54\uff08VQA\uff09 \u5c06\u8fd9\u4e00\u8fc7\u7a0b\u5f62\u5f0f\u5316\uff1a\u7ed9\u5b9a\u4e00\u5f20\u56fe\u50cf \\(I\\) \u548c\u4e00\u4e2a\u81ea\u7136\u8bed\u8a00\u95ee\u9898 \\(q\\)\uff0c\u9884\u6d4b\u7b54\u6848 \\(a\\)\u3002
\u8be5\u4efb\u52a1\u53ef\u4ee5\u6709\u591a\u79cd\u5b9a\u4e49\u65b9\u5f0f\u3002\u6700\u5e38\u89c1\u7684\u65b9\u5f0f\u5c06 VQA \u89c6\u4e3a\u5f00\u653e\u5f0f\u5206\u7c7b\uff1a\u6a21\u578b\u4ece\u6700\u5e38\u89c1\u7684\u7b54\u6848\u6784\u6210\u7684\u56fa\u5b9a\u8bcd\u6c47\u8868\u4e2d\u9009\u62e9\uff08\u4f8b\u5982 VQA v2 \u4e2d\u6392\u540d\u524d 3,129 \u7684\u7b54\u6848\uff09\u3002\u53e6\u4e00\u79cd\u65b9\u5f0f\u662f\u751f\u6210\u5f0f\u56de\u7b54\uff0c\u6a21\u578b\u751f\u6210\u81ea\u7531\u5f62\u5f0f\u7684\u6587\u672c\u5b57\u7b26\u4e32\u2014\u2014\u8fd9\u662f\u73b0\u4ee3 VLM \u91c7\u7528\u7684\u65b9\u6cd5\u3002
\u5f62\u5f0f\u4e0a\uff0c\u4f60\u9700\u8981\u5b66\u4e60\u4e00\u4e2a\u6700\u5927\u5316\u6b63\u786e\u7b54\u6848\u4f3c\u7136\u7684\u51fd\u6570 \\(f(I, q) \\to a\\)\u3002\u5728\u5206\u7c7b\u8bbe\u7f6e\u4e2d\uff0c\u8fd9\u53d8\u4e3a\uff1a
\u5176\u4e2d \\(v\\) \u662f\u89c6\u89c9\u7279\u5f81\u5411\u91cf\uff08\u6765\u81ea CNN \u6216 ViT\uff09\uff0c\\(h\\) \u662f\u95ee\u9898\u7f16\u7801\uff08\u6765\u81ea LSTM \u6216 Transformer\uff09\uff0c\\(g\\) \u662f\u878d\u5408\u51fd\u6570\u3002\\(g\\) \u7684\u8bbe\u8ba1\u6b63\u662f\u771f\u6b63\u7684\u67b6\u6784\u521b\u9020\u529b\u6240\u5728\u3002
VQA v1\uff08Antol \u7b49\u4eba\uff0c2015\uff09\u5f15\u5165\u4e86\u8be5\u57fa\u51c6\uff0c\u5305\u542b\u6765\u81ea MS COCO \u7684 204,000 \u5f20\u56fe\u50cf\u4e0a\u7684 614,000 \u4e2a\u95ee\u9898\u3002\u7814\u7a76\u4eba\u5458\u5f88\u5feb\u53d1\u73b0\uff0c\u6a21\u578b\u53ef\u4ee5\u901a\u8fc7\u5229\u7528\u8bed\u8a00\u5148\u9a8c\u8fbe\u5230\u60ca\u4eba\u9ad8\u7684\u51c6\u786e\u7387\u2014\u2014\u5bf9\"\u591a\u5c11\u4e2a\"\u95ee\u9898\u56de\u7b54\"2\"\uff0c\u5bf9\"\u6709\u6ca1\u6709\"\u95ee\u9898\u56de\u7b54\"\u662f\"\uff0c\u751a\u81f3\u4e0d\u9700\u8981\u770b\u56fe\u50cf\u3002
VQA v2\uff08Goyal \u7b49\u4eba\uff0c2017\uff09\u901a\u8fc7\u4e3a\u6bcf\u4e2a\u95ee\u9898\u914d\u5bf9\u4e0d\u540c\u7b54\u6848\u7684\u4e24\u5f20\u76f8\u4f3c\u56fe\u50cf\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u8fd9\u8feb\u4f7f\u6a21\u578b\u771f\u6b63\u5c06\u5176\u63a8\u7406\u5efa\u7acb\u5728\u89c6\u89c9\u5185\u5bb9\u4e4b\u4e0a\u3002\u5e73\u8861\u914d\u5bf9\u8bbe\u7f6e\u4f7f\u6570\u636e\u96c6\u89c4\u6a21\u5927\u7ea6\u7ffb\u500d\uff0c\u5e76\u4f7f\u7eaf\u8bed\u8a00\u6377\u5f84\u7684\u6548\u679c\u5927\u6253\u6298\u6263\u3002
\u5176\u4ed6\u91cd\u8981\u7684 VQA \u6570\u636e\u96c6\u5305\u62ec GQA\uff08Hudson & Manning\uff0c2019\uff09\uff0c\u5305\u542b\u9700\u8981\u591a\u6b65\u63a8\u7406\u7684\u7ec4\u5408\u6027\u95ee\u9898\uff1bOK-VQA\uff08Marino \u7b49\u4eba\uff0c2019\uff09\uff0c\u9700\u8981\u8d85\u51fa\u56fe\u50cf\u8303\u56f4\u7684\u5916\u90e8\u77e5\u8bc6\uff1b\u4ee5\u53ca TextVQA\uff08Singh \u7b49\u4eba\uff0c2019\uff09\uff0c\u7b54\u6848\u4f9d\u8d56\u4e8e\u8bfb\u53d6\u56fe\u50cf\u4e2d\u7684\u6587\u5b57\u3002
\u65e9\u671f\u7684 VQA \u6a21\u578b\u4f7f\u7528\u7b80\u5355\u7b56\u7565\uff1a\u4ece\u9884\u8bad\u7ec3 CNN \u4e2d\u63d0\u53d6\u56fe\u50cf\u7279\u5f81\uff08\u901a\u5e38\u662f\u7b2c 8 \u7ae0\u4e2d ResNet \u6216 VGGNet \u7684\u5012\u6570\u7b2c\u4e8c\u5c42\uff09\uff0c\u7528 LSTM\uff08\u7b2c 6 \u7ae0\uff09\u5bf9\u95ee\u9898\u8fdb\u884c\u7f16\u7801\uff0c\u7136\u540e\u5c06\u5b83\u4eec\u7ec4\u5408\u3002\u7ec4\u5408\u51fd\u6570 \\(g\\) \u6f14\u53d8\u8fc5\u901f\uff1a\u4ece\u7b80\u5355\u7684\u9010\u5143\u7d20\u4e58\u6cd5\uff0c\u5230\u53cc\u7ebf\u6027\u6c60\u5316\uff0c\u518d\u5230\u591a\u6a21\u6001 Tucker \u5206\u89e3\u3002\u53cc\u7ebf\u6027\u6ce8\u610f\u529b\u8ba1\u7b97 \\(v^T W h\\)\uff0c\u5176\u4e2d \\(W\\) \u662f\u53ef\u5b66\u4e60\u7684\u4ea4\u4e92\u77e9\u9635\uff0c\u4f46\u5b8c\u6574\u7684\u53cc\u7ebf\u6027\u5f62\u5f0f\u6709 \\(O(d_v \\times d_h)\\) \u4e2a\u53c2\u6570\uff0c\u89c4\u6a21\u8fc7\u5927\u3002MLB\uff08\u591a\u6a21\u6001\u4f4e\u79e9\u53cc\u7ebf\u6027\u6c60\u5316\uff09\u5c06\u5176\u5206\u89e3\u4e3a\u4e24\u4e2a\u4f4e\u79e9\u6295\u5f71\uff0c\u4f7f\u5176\u53d8\u5f97\u53ef\u884c\u3002
VQA \u7684\u7a81\u7834\u662f\u6ce8\u610f\u529b\u673a\u5236\u3002\u5806\u53e0\u6ce8\u610f\u529b\u7f51\u7edc\uff08Yang \u7b49\u4eba\uff0c2016\uff09\u4f7f\u7528\u95ee\u9898\u7f16\u7801\u5728\u7a7a\u95f4\u56fe\u50cf\u533a\u57df\u4e0a\u65bd\u52a0\u6ce8\u610f\u529b\uff0c\u8fed\u4ee3\u5f0f\u5730\u7cbe\u70bc\u9700\u8981\u5173\u6ce8\u7684\u56fe\u50cf\u90e8\u5206\u3002\u8fd9\u4e2a\u601d\u60f3\u2014\u2014\u8ba9\u95ee\u9898\"\u5173\u6ce8\"\u76f8\u5173\u56fe\u50cf\u533a\u57df\u2014\u2014\u6210\u4e3a\u4e86\u6807\u51c6\u505a\u6cd5\u3002
\u60f3\u8c61\u4e00\u4f4d\u670b\u53cb\u770b\u7740\u4f60\u7684\u5ea6\u5047\u7167\u7247\u5e76\u53d9\u8ff0\u4ed6\u4eec\u6240\u770b\u5230\u7684\uff1a\"\u4e00\u53ea\u91d1\u6bdb\u730e\u72ac\u5728\u9633\u5149\u660e\u5a9a\u7684\u6c99\u6ee9\u4e0a\u63a5\u98de\u76d8\u3002\"\u56fe\u50cf\u63cf\u8ff0\u662f\u751f\u6210\u56fe\u50cf\u7684\u81ea\u7136\u8bed\u8a00\u63cf\u8ff0\u7684\u4efb\u52a1\u3002\u4e0e VQA \u4e0d\u540c\uff0c\u8fd9\u91cc\u6ca1\u6709\u63d0\u95ee\u2014\u2014\u6a21\u578b\u5fc5\u987b\u81ea\u884c\u51b3\u5b9a\u54ea\u4e9b\u5185\u5bb9\u503c\u5f97\u63cf\u8ff0\u3002
Show and Tell\uff08Vinyals \u7b49\u4eba\uff0c2015\uff09\u5efa\u7acb\u4e86\u63cf\u8ff0\u4efb\u52a1\u7684\u6807\u51c6\u7f16\u7801\u5668-\u89e3\u7801\u5668\u67b6\u6784\u3002CNN \u7f16\u7801\u5668\uff08\u5982 Inception \u6216 ResNet\uff09\u751f\u6210\u4e00\u4e2a\u5355\u4e00\u56fe\u50cf\u7279\u5f81\u5411\u91cf \\(v\\)\u3002\u8be5\u5411\u91cf\u88ab\u7528\u4f5c LSTM \u89e3\u7801\u5668\u7684\u521d\u59cb\u9690\u85cf\u72b6\u6001\uff0c\u7136\u540e\u9010\u8bcd\u81ea\u56de\u5f52\u5730\u751f\u6210\u63cf\u8ff0\uff1a
\u6574\u4e2a\u6a21\u578b\u901a\u8fc7\u6700\u5927\u5316\u771f\u5b9e\u63cf\u8ff0\u7684\u5bf9\u6570\u4f3c\u7136\u8fdb\u884c\u7aef\u5230\u7aef\u8bad\u7ec3\u3002\u63a8\u7406\u65f6\u4f7f\u7528\u675f\u641c\u7d22\uff08\u7b2c 7 \u7ae0\uff09\u6765\u627e\u5230\u9ad8\u6982\u7387\u7684\u63cf\u8ff0\u3002
Show and Tell \u7684\u95ee\u9898\u5728\u4e8e\u6574\u5f20\u56fe\u50cf\u88ab\u538b\u7f29\u6210\u4e00\u4e2a\u5355\u4e00\u5411\u91cf\u3002\u5bf9\u4e8e\u590d\u6742\u573a\u666f\uff0c\u5355\u4e00\u5411\u91cf\u65e0\u6cd5\u6355\u6349\u6240\u6709\u76f8\u5173\u7ec6\u8282\u3002\u4f60\u4f1a\u4e22\u5931\u7a7a\u95f4\u4fe1\u606f\u2014\u2014\u6a21\u578b\u5728\u751f\u6210\u4e0d\u540c\u8bcd\u8bed\u65f6\u65e0\u6cd5\"\u56de\u770b\"\u56fe\u50cf\u7684\u7279\u5b9a\u533a\u57df\u3002
Show, Attend and Tell\uff08Xu \u7b49\u4eba\uff0c2015\uff09\u901a\u8fc7\u5f15\u5165\u56fe\u50cf\u533a\u57df\u4e0a\u7684\u6ce8\u610f\u529b\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002\u6a21\u578b\u4e0d\u662f\u5c06\u56fe\u50cf\u7f16\u7801\u4e3a\u4e00\u4e2a\u5411\u91cf\uff0c\u800c\u662f\u7531 CNN \u4ea7\u751f\u4e00\u4e2a\u7a7a\u95f4\u7279\u5f81\u7f51\u683c\uff08\u4f8b\u5982\u6765\u81ea VGGNet \u6700\u540e\u4e00\u4e2a\u5377\u79ef\u5c42\u7684 \\(14 \\times 14 \\times 512\\)\uff09\u3002\u5728\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\uff0c\u6a21\u578b\u8ba1\u7b97\u8fd9\u4e9b\u7a7a\u95f4\u4f4d\u7f6e\u4e0a\u7684\u6ce8\u610f\u529b\u6743\u91cd\uff0c\u751f\u6210\u4e00\u4e2a\u7a81\u51fa\u5f53\u524d\u8bcd\u8bed\u6700\u76f8\u5173\u533a\u57df\u7684\u4e0a\u4e0b\u6587\u5411\u91cf\u3002
\u56de\u987e\u7b2c 6 \u7ae0\u7684\u6ce8\u610f\u529b\u673a\u5236\uff1a\u89e3\u7801\u5668\u9690\u85cf\u72b6\u6001\u5145\u5f53\u67e5\u8be2\uff0c\u7a7a\u95f4\u7279\u5f81\u5145\u5f53\u952e\u548c\u503c\uff0c\u6ce8\u610f\u529b\u6743\u91cd\u544a\u8bc9\u6a21\u578b\u5e94\u8be5\u770b\u54ea\u91cc\u3002\u4f5c\u8005\u63d0\u51fa\u4e86\u4e24\u79cd\u53d8\u4f53\uff1a\u8f6f\u6ce8\u610f\u529b\uff08\u53ef\u5fae\u5206\uff0c\u6240\u6709\u533a\u57df\u7684\u52a0\u6743\u5e73\u5747\uff09\u548c\u786c\u6ce8\u610f\u529b\uff08\u5bf9\u5355\u4e2a\u533a\u57df\u8fdb\u884c\u968f\u673a\u91c7\u6837\uff0c\u4f7f\u7528 REINFORCE \u8bad\u7ec3\uff09\u3002
\u8fd9\u4e9b\u6a21\u578b\u4ea7\u751f\u7684\u6ce8\u610f\u529b\u56fe\u5177\u6709\u663e\u8457\u7684\u53ef\u89e3\u91ca\u6027\uff1a\u751f\u6210\"\u72d7\"\u65f6\uff0c\u6ce8\u610f\u529b\u96c6\u4e2d\u5728\u72d7\u7684\u533a\u57df\uff1b\u751f\u6210\"\u6d77\u6ee9\"\u65f6\uff0c\u6ce8\u610f\u529b\u8f6c\u79fb\u5230\u6c99\u5b50\u548c\u6c34\u9762\u3002\u8fd9\u662f\u6ce8\u610f\u529b\u673a\u5236\u63d0\u4f9b\u5185\u7f6e\u53ef\u89e3\u91ca\u6027\u7684\u6700\u65e9\u4ee4\u4eba\u4fe1\u670d\u7684\u6f14\u793a\u4e4b\u4e00\u3002
CIDEr\uff08Vedantam \u7b49\u4eba\uff0c2015\uff09\u3001METEOR\u3001BLEU \u548c SPICE \u662f\u6807\u51c6\u63cf\u8ff0\u8bc4\u4f30\u6307\u6807\u3002CIDEr \u8ba1\u7b97\u751f\u6210\u63cf\u8ff0\u4e0e\u53c2\u8003\u63cf\u8ff0\u4e4b\u95f4\u7684 TF-IDF \u52a0\u6743 n-gram \u76f8\u4f3c\u5ea6\uff0c\u4e13\u95e8\u4e3a\u63cf\u8ff0\u8bc4\u4f30\u8bbe\u8ba1\u3002\u73b0\u4ee3 VLM \u901a\u5e38\u5728 MS COCO Captions \u548c NoCaps \u7b49\u63cf\u8ff0\u57fa\u51c6\u4e0a\u7528 CIDEr \u8fdb\u884c\u8bc4\u4f30\u3002
\u540e\u6765\u7684\u63cf\u8ff0\u6a21\u578b\u5f15\u5165\u4e86\u81ea\u5e95\u5411\u4e0a\u6ce8\u610f\u529b\uff08Anderson \u7b49\u4eba\uff0c2018\uff09\uff0c\u5176\u4e2d\u76ee\u6807\u68c0\u6d4b\u5668\uff08Faster R-CNN\uff0c\u7b2c 8 \u7ae0\uff09\u9996\u5148\u63d0\u51fa\u663e\u8457\u7684\u56fe\u50cf\u533a\u57df\uff0c\u7136\u540e\u63cf\u8ff0\u6a21\u578b\u5728\u8fd9\u4e9b\u533a\u57df\u7279\u5f81\u800c\u975e\u5747\u5300\u7f51\u683c\u4e0a\u65bd\u52a0\u6ce8\u610f\u529b\u3002\u5728\u57fa\u4e8e ViT \u7684\u7f16\u7801\u5668\u63a5\u7ba1\u4e4b\u524d\uff0c\u8fd9\u662f\u4e3b\u5bfc\u65b9\u6cd5\u3002
\u60f3\u8c61\u4e24\u4f4d\u72ec\u7acb\u5de5\u4f5c\u7684\u8bd1\u8005\u2014\u2014\u4e00\u4f4d\u8bfb\u6cd5\u8bed\u6587\u4ef6\uff0c\u53e6\u4e00\u4f4d\u8bfb\u82f1\u8bed\u6587\u4ef6\u2014\u2014\u4ed6\u4eec\u5404\u81ea\u7528\u4e00\u79cd\u5171\u4eab\u7684\"\u901a\u7528\u8bed\u8a00\"\u751f\u6210\u6458\u8981\u3002\u4ed6\u4eec\u5728\u7ffb\u8bd1\u8fc7\u7a0b\u4e2d\u4ece\u4e0d\u4ea4\u6d41\uff0c\u4f46\u4ed6\u4eec\u7684\u6458\u8981\u53ef\u4ee5\u76f4\u63a5\u6bd4\u8f83\u3002\u8fd9\u5c31\u662f\u53cc\u7f16\u7801\u5668\u6a21\u5f0f\u3002
\u89c6\u89c9\u7f16\u7801\u5668 \\(f_v\\) \u548c\u6587\u672c\u7f16\u7801\u5668 \\(f_t\\) \u72ec\u7acb\u5730\u5c06\u5404\u81ea\u7684\u8f93\u5165\u6620\u5c04\u5230\u4e00\u4e2a\u7ef4\u5ea6\u4e3a \\(d\\) \u7684\u5171\u4eab\u5d4c\u5165\u7a7a\u95f4\u3002\u56fe\u50cf\u5d4c\u5165\u4e3a \\(v = f_v(I) \\in \\mathbb{R}^d\\)\uff0c\u6587\u672c\u5d4c\u5165\u4e3a \\(t = f_t(q) \\in \\mathbb{R}^d\\)\u3002\u76f8\u4f3c\u5ea6\u901a\u8fc7\u70b9\u79ef\u6216\u4f59\u5f26\u76f8\u4f3c\u5ea6\u8ba1\u7b97\uff1a\\(\\text{sim}(I, q) = v^T t / (\\|v\\| \\|t\\|)\\)\u3002
CLIP\uff08Radford \u7b49\u4eba\uff0c2021\uff09\uff0c\u5728\u524d\u4e00\u7bc7\u5173\u4e8e\u591a\u6a21\u6001\u8868\u793a\u7684\u6587\u4ef6\u4e2d\u5df2\u4ecb\u7ecd\uff0c\u662f\u5178\u578b\u7684\u53cc\u7f16\u7801\u5668\u3002\u5b83\u5728\u4ece\u4e92\u8054\u7f51\u6293\u53d6\u7684 4 \u4ebf\u56fe\u50cf-\u6587\u672c\u5bf9\u4e0a\u4f7f\u7528\u5bf9\u6bd4\u76ee\u6807\u51fd\u6570\uff08InfoNCE\uff09\u8fdb\u884c\u8bad\u7ec3\u3002\u7531\u4e8e\u7f16\u7801\u5668\u76f8\u4e92\u72ec\u7acb\uff0c\u4f60\u53ef\u4ee5\u9884\u8ba1\u7b97\u5e76\u7f13\u5b58\u6240\u6709\u56fe\u50cf\u5d4c\u5165\uff0c\u4f7f\u68c0\u7d22\u6781\u5176\u9ad8\u6548\u2014\u2014\u641c\u7d22\u65f6\u53ea\u9700\u5bf9\u67e5\u8be2\u6587\u672c\u8fdb\u884c\u7f16\u7801\u3002
\u53cc\u7f16\u7801\u5668\u7684\u7f3a\u70b9\u5728\u4e8e\u89c6\u89c9\u548c\u8bed\u8a00\u4ece\u672a\u5728\u7279\u5f81\u5c42\u9762\u8fdb\u884c\u4ea4\u4e92\u3002\u6a21\u578b\u65e0\u6cd5\u8fdb\u884c\u7ec6\u7c92\u5ea6\u7684\u8de8\u6a21\u6001\u63a8\u7406\uff1a\u4f8b\u5982\uff0c\u5b83\u65e0\u6cd5\u786e\u5b9a\u63cf\u8ff0\u4e2d\u7684\u7279\u5b9a\u8bcd\u662f\u5426\u5bf9\u5e94\u56fe\u50cf\u4e2d\u7684\u7279\u5b9a\u533a\u57df\u3002\u8fd9\u9650\u5236\u4e86\u5b83\u5728 VQA \u6216 grounded \u63cf\u8ff0\u7b49\u4efb\u52a1\u4e2d\u7684\u5b9e\u7528\u6027\u3002
\u73b0\u5728\u60f3\u8c61\u4e24\u4f4d\u8bd1\u8005\u5171\u5904\u4e00\u5ba4\uff0c\u79ef\u6781\u8ba8\u8bba\u4e24\u7bc7\u6587\u4ef6\u3002\u4ed6\u4eec\u53ef\u4ee5\u6307\u5411\u7279\u5b9a\u6bb5\u843d\u3001\u4e92\u76f8\u63d0\u95ee\uff0c\u5e76\u5efa\u7acb\u5171\u540c\u7684\u7406\u89e3\u3002\u8fd9\u5c31\u662f\u878d\u5408\u7f16\u7801\u5668\u6a21\u5f0f\u3002
\u4e24\u79cd\u6a21\u6001\u90fd\u88ab\u7f16\u7801\uff0c\u7136\u540e\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\u5c42\u8fdb\u884c\u878d\u5408\uff0c\u5176\u4e2d\u4e00\u79cd\u6a21\u6001\u7684 token \u5173\u6ce8\u53e6\u4e00\u79cd\u6a21\u6001\u7684 token\u3002\u56fe\u50cf\u9996\u5148\u7531\u89c6\u89c9\u7f16\u7801\u5668\u5904\u7406\u4e3a\u4e00\u7cfb\u5217 patch \u6216\u533a\u57df token \\(V = [v_1, \\ldots, v_N]\\)\u3002\u6587\u672c\u88ab\u5206\u8bcd\u5316\u4e3a \\(T = [t_1, \\ldots, t_M]\\)\u3002\u5728\u878d\u5408\u5c42\u4e2d\uff0c\u6587\u672c token \u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\u5173\u6ce8\u56fe\u50cf token\uff1a
\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u5f0f\u5c06\u89c6\u89c9\u7f16\u7801\u5668\u4e0e\u81ea\u56de\u5f52\u751f\u6210\u8f93\u51fa token \u7684\u6587\u672c\u89e3\u7801\u5668\u76f8\u7ed3\u5408\uff0c\u7c7b\u4f3c\u4e8e\u7b2c 7 \u7ae0\u4e2d\u7684 seq2seq \u6a21\u578b\u3002\u89c6\u89c9\u7f16\u7801\u5668\u4ea7\u751f\u4e0a\u4e0b\u6587\u56fe\u50cf\u8868\u5f81\uff0c\u6587\u672c\u89e3\u7801\u5668\u5728\u751f\u6210\u8f93\u51fa\u6587\u672c\u65f6\u5bf9\u5176\u6267\u884c\u4ea4\u53c9\u6ce8\u610f\u529b\u3002
\u8fd9\u79cd\u6a21\u5f0f\u5929\u7136\u652f\u6301\u751f\u6210\u5f0f\u4efb\u52a1\uff1a\u56fe\u50cf\u63cf\u8ff0\u3001\u81ea\u7531\u5f62\u5f0f\u7b54\u6848\u7684 VQA \u4ee5\u53ca\u89c6\u89c9\u5bf9\u8bdd\u3002GIT\uff08Generative Image-to-text Transformer\uff0cWang \u7b49\u4eba\uff0c2022\uff09\u3001CoCa\uff08Contrastive Captioner\uff0cYu \u7b49\u4eba\uff0c2022\uff09\u548c PaLI \u4f7f\u7528\u8fd9\u79cd\u67b6\u6784\u3002CoCa \u5de7\u5999\u5730\u5c06\u53cc\u7f16\u7801\u5668\u548c\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u5f0f\u7ed3\u5408\u8d77\u6765\uff1a\u6587\u672c\u89e3\u7801\u5668\u7684\u524d\u534a\u90e8\u5206\u4f5c\u4e3a\u5355\u6a21\u6001\u6587\u672c\u7f16\u7801\u5668\uff08\u7528\u4e8e\u5bf9\u6bd4\u5b66\u4e60\uff09\uff0c\u800c\u540e\u534a\u90e8\u5206\u5bf9\u56fe\u50cf\u7279\u5f81\u6267\u884c\u4ea4\u53c9\u6ce8\u610f\u529b\uff08\u7528\u4e8e\u751f\u6210\u5f0f\u63cf\u8ff0\uff09\uff0c\u517c\u5f97\u4e24\u8005\u4e4b\u4f18\u52bf\u3002
\u8fd9\u4e09\u79cd\u6a21\u5f0f\u7684\u9009\u62e9\u53d6\u51b3\u4e8e\u76ee\u6807\u4efb\u52a1\u3002\u53cc\u7f16\u7801\u5668\u6700\u9002\u5408\u5927\u89c4\u6a21\u68c0\u7d22\u3002\u878d\u5408\u7f16\u7801\u5668\u6700\u9002\u5408\u7ec6\u7c92\u5ea6\u7406\u89e3\u4efb\u52a1\u3002\u7f16\u7801\u5668-\u89e3\u7801\u5668\u5bf9\u4e8e\u751f\u6210\u4efb\u52a1\u6700\u4e3a\u901a\u7528\u3002\u73b0\u4ee3\u6700\u5148\u8fdb\u7684 VLM \u8d8a\u6765\u8d8a\u591a\u5730\u91c7\u7528\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6216\u4ec5\u89e3\u7801\u5668\u8303\u5f0f\uff0c\u5c06\u6bcf\u9879\u89c6\u89c9\u8bed\u8a00\u4efb\u52a1\u90fd\u89c6\u4e3a\u6587\u672c\u751f\u6210\u3002
\u60f3\u8c61\u4e00\u4f4d\u7ecf\u9a8c\u4e30\u5bcc\u7684\u4e13\u5bb6\uff0c\u7ecf\u8fc7\u591a\u5e74\u5bf9\u827a\u672f\u548c\u6587\u5b66\u7684\u7814\u7a76\uff0c\u53ea\u9700\u8981\u770b\u4e00\u4e24\u4e2a\u4f8b\u5b50\u5c31\u80fd\u4f18\u96c5\u5730\u63cf\u8ff0\u4e00\u79cd\u5168\u65b0\u7684\u7ed8\u753b\u98ce\u683c\u3002Flamingo\uff08Alonso \u7b49\u4eba\uff0c2022\uff0cDeepMind\uff09\u57fa\u4e8e\u76f8\u540c\u539f\u7406\u6784\u5efa\uff1a\u5b83\u5229\u7528\u5f3a\u5927\u7684\u9884\u8bad\u7ec3\u8bed\u8a00\u6a21\u578b\u548c\u9884\u8bad\u7ec3\u89c6\u89c9\u7f16\u7801\u5668\uff0c\u901a\u8fc7\u8f7b\u91cf\u7ea7\u67b6\u6784\u7ec4\u4ef6\u5c06\u5176\u8fde\u63a5\uff0c\u5b9e\u73b0\u591a\u6a21\u6001\u4efb\u52a1\u4e0a\u7684\u5c11\u6837\u672c\u5b66\u4e60\u3002
Flamingo \u7684\u8bbe\u8ba1\u7406\u5ff5\u4fdd\u5b88\u800c\u6709\u6548\uff1a\u4fdd\u6301\u9884\u8bad\u7ec3\u7684\u89c6\u89c9\u7f16\u7801\u5668\uff08NFNet\uff09\u548c\u8bed\u8a00\u6a21\u578b\uff08Chinchilla\uff09\u51bb\u7ed3\uff0c\u4ec5\u5b66\u4e60\u8fde\u63a5\u5b83\u4eec\u7684\"\u80f6\u6c34\"\u3002\u8fd9\u79cd\u80f6\u6c34\u7531\u4e24\u4e2a\u7ec4\u4ef6\u7ec4\u6210\uff1aPerceiver \u91cd\u91c7\u6837\u5668\u548c\u95e8\u63a7\u4ea4\u53c9\u6ce8\u610f\u529b\u5c42\u3002
Perceiver \u91cd\u91c7\u6837\u5668\u5c06\u89c6\u89c9\u7f16\u7801\u5668\u7684\u53d8\u957f\u8f93\u51fa\uff08\u53d6\u51b3\u4e8e\u56fe\u50cf\u5206\u8fa8\u7387\uff09\u538b\u7f29\u4e3a\u4e00\u7ec4\u56fa\u5b9a\u6570\u91cf\u7684 \\(N\\) \u4e2a\u89c6\u89c9 token\uff08\u901a\u5e38 \\(N = 64\\)\uff09\u3002\u5b83\u7684\u5de5\u4f5c\u539f\u7406\u662f\u521d\u59cb\u5316\u4e00\u7ec4 \\(N\\) \u4e2a\u53ef\u5b66\u4e60\u7684\u67e5\u8be2\u5411\u91cf\uff0c\u5e76\u4f7f\u7528\u4ea4\u53c9\u6ce8\u610f\u529b\u8ba9\u8fd9\u4e9b\u67e5\u8be2\u5173\u6ce8\u5b8c\u6574\u7684\u89c6\u89c9\u7f16\u7801\u5668\u8f93\u51fa\u3002\u8fd9\u672c\u8d28\u4e0a\u662f Perceiver \u67b6\u6784\uff08Jaegle \u7b49\u4eba\uff0c2021\uff09\u4f5c\u4e3a\u74f6\u9888\u7684\u5e94\u7528\u2014\u2014\u65e0\u8bba\u8f93\u5165\u56fe\u50cf\u5927\u5c0f\u5982\u4f55\uff0c\u5b83\u90fd\u80fd\u751f\u6210\u7d27\u51d1\u7684\u3001\u56fa\u5b9a\u5927\u5c0f\u7684\u89c6\u89c9\u8868\u793a\u3002
Flamingo \u539f\u751f\u652f\u6301\u4ea4\u9519\u56fe\u50cf-\u6587\u672c\u5e8f\u5217\u3002\u4f60\u53ef\u4ee5\u5411\u5b83\u8f93\u5165\u5305\u542b\u591a\u5f20\u56fe\u50cf\u7a7f\u63d2\u6587\u672c\u7684\u63d0\u793a\uff0c\u4f8b\u5982\uff1a\"[\u56fe\u50cf 1] \u8fd9\u662f\u4e00\u53ea\u732b\u3002[\u56fe\u50cf 2] \u8fd9\u662f\u4e00\u53ea\u72d7\u3002[\u56fe\u50cf 3] \u8fd9\u662f\u4e00\u4e2a ___\u3002\"\u6a21\u578b\u5c06\u6bcf\u5f20\u56fe\u50cf\u901a\u8fc7\u89c6\u89c9\u7f16\u7801\u5668\u548c Perceiver \u91cd\u91c7\u6837\u5668\u5904\u7406\uff0c\u5f97\u5230\u7684\u89c6\u89c9 token \u63d2\u5165\u5230\u6587\u672c\u5e8f\u5217\u4e2d\u7684\u5bf9\u5e94\u4f4d\u7f6e\u3002\u8bed\u8a00\u6a21\u578b\u7684\u56e0\u679c\u6ce8\u610f\u529b\u63a9\u7801\u786e\u4fdd\u6bcf\u4e2a\u6587\u672c token \u53ea\u80fd\u5173\u6ce8\u5f53\u524d\u53ca\u4e4b\u524d\u56fe\u50cf\u7684\u89c6\u89c9 token\u3002
\u8fd9\u79cd\u4ea4\u9519\u673a\u5236\u5b9e\u73b0\u4e86\u5f3a\u5927\u7684\u5c11\u6837\u672c\u591a\u6a21\u6001\u5b66\u4e60\u3002\u901a\u8fc7\u5728\u4e0a\u4e0b\u6587\u4e2d\u63d0\u4f9b\u5c11\u91cf\u56fe\u50cf-\u6587\u672c\u793a\u4f8b\uff0cFlamingo \u53ef\u4ee5\u5728\u6ca1\u6709\u4efb\u4f55\u68af\u5ea6\u66f4\u65b0\u7684\u60c5\u51b5\u4e0b\u6267\u884c\u65b0\u4efb\u52a1\u3002\u5728 VQAv2\u3001OK-VQA \u548c\u63cf\u8ff0\u7b49\u57fa\u51c6\u4e0a\uff0c\u5177\u6709 800 \u4ebf\u53c2\u6570\u7684 Flamingo \u5b9e\u73b0\u4e86\u6700\u5148\u8fdb\u7684\u5c11\u6837\u672c\u6027\u80fd\uff0c\u4ec5\u9700 4 \u5230 32 \u4e2a\u793a\u4f8b\u5373\u53ef\u5339\u914d\u751a\u81f3\u8d85\u8d8a\u7ecf\u8fc7\u5fae\u8c03\u7684\u4e13\u5bb6\u6a21\u578b\u3002
\u60f3\u8c61\u4f60\u6709\u4e00\u4f4d\u51fa\u8272\u7684\u8bed\u8a00\u4e13\u5bb6\uff08\u4e00\u4e2a LLM\uff09\u548c\u4e00\u4f4d\u51fa\u8272\u7684\u827a\u672f\u8bc4\u8bba\u5bb6\uff08\u4e00\u4e2a\u89c6\u89c9\u7f16\u7801\u5668\uff09\u3002\u5982\u679c\u4f60\u80fd\u6559\u4f1a\u827a\u672f\u8bc4\u8bba\u5bb6\"\u8bf4\u8bed\u8a00\u4e13\u5bb6\u7684\u8bed\u8a00\"\uff0c\u4ed6\u4eec\u5c31\u53ef\u4ee5\u65e0\u7f1d\u534f\u4f5c\u3002LLaVA\uff08Large Language and Vision Assistant\uff0cLiu \u7b49\u4eba\uff0c2023\uff09\u6b63\u662f\u8fd9\u6837\u505a\u7684\uff1a\u5b83\u4f7f\u7528\u4e00\u4e2a\u7b80\u5355\u7684\u7ebf\u6027\u5c42\u5c06\u89c6\u89c9\u7279\u5f81\u6295\u5f71\u5230 LLM \u7684 token \u5d4c\u5165\u7a7a\u95f4\uff0c\u7136\u540e\u5728\u6307\u4ee4\u9075\u5faa\u6570\u636e\u4e0a\u5fae\u8c03\u6574\u4e2a\u7cfb\u7edf\u3002
LLaVA \u7684\u67b6\u6784\u51fa\u5947\u5730\u7b80\u5355\u3002\u56fe\u50cf\u7531\u4e00\u4e2a\u9884\u8bad\u7ec3\u7684 CLIP ViT-L/14 \u89c6\u89c9\u7f16\u7801\u5668\u7f16\u7801\u4e3a\u4e00\u4e2a patch \u7279\u5f81\u7f51\u683c \\(V \\in \\mathbb{R}^{N \\times d_v}\\)\uff0c\u5176\u4e2d \\(N = 256\\) \u4e2a patch\uff08\u5bf9\u4e8e 336px \u56fe\u50cf\u548c 14px patch\uff09\u3002\u4e00\u4e2a\u6295\u5f71\u5c42 \\(W\\) \u5c06\u8fd9\u4e9b\u89c6\u89c9\u7279\u5f81\u6620\u5c04\u5230 LLM \u7684\u5d4c\u5165\u7ef4\u5ea6\uff1a
\u89c6\u89c9\u6307\u4ee4\u5fae\u8c03\u662f LLaVA \u7684\u5173\u952e\u8bad\u7ec3\u521b\u65b0\u3002\u4f5c\u8005\u4f7f\u7528 GPT-4 \u4ece COCO \u56fe\u50cf\u751f\u6210\u4e86 158,000 \u4e2a\u591a\u6a21\u6001\u6307\u4ee4\u9075\u5faa\u793a\u4f8b\u3002\u6bcf\u4e2a\u793a\u4f8b\u5305\u542b\u4e00\u5f20\u56fe\u50cf\u548c\u4e00\u4e2a\u5bf9\u8bdd\u5f0f\u6307\u4ee4\uff08\u4f8b\u5982\"\u8be6\u7ec6\u63cf\u8ff0\u8fd9\u5f20\u56fe\u50cf\"\u3001\"\u8fd9\u5f20\u56fe\u50cf\u6709\u4ec0\u4e48\u4e0d\u5bfb\u5e38\u4e4b\u5904\uff1f\"\u3001\"\u5982\u679c\u6211\u662f\u4e00\u540d\u6e38\u5ba2\u53c2\u89c2\u8fd9\u4e2a\u5730\u65b9\uff0c\u6211\u5e94\u8be5\u77e5\u9053\u4ec0\u4e48\uff1f\"\uff09\u3002\u6a21\u578b\u63a5\u53d7\u8bad\u7ec3\uff0c\u6839\u636e\u56fe\u50cf\u548c\u6307\u4ee4\u751f\u6210 GPT-4 \u64b0\u5199\u7684\u56de\u7b54\u3002
\u8bad\u7ec3\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5\u3002\u9636\u6bb5 1\uff08\u9884\u8bad\u7ec3\uff09\uff1a\u4ec5\u8bad\u7ec3\u6295\u5f71\u5c42 \\(W\\)\uff0c\u4f7f\u7528\u56fe\u50cf-\u63cf\u8ff0\u5bf9\uff08\u6765\u81ea CC3M \u7684 595K \u6570\u636e\uff09\uff0c\u89c6\u89c9\u7f16\u7801\u5668\u548c LLM \u90fd\u4fdd\u6301\u51bb\u7ed3\u3002\u8fd9\u6559\u4f1a \\(W\\) \u5c06\u89c6\u89c9\u7279\u5f81\u4e0e LLM \u7684\u5d4c\u5165\u7a7a\u95f4\u5bf9\u9f50\u3002\u9636\u6bb5 2\uff08\u5fae\u8c03\uff09\uff1a\u6295\u5f71\u5c42\u548c LLM \u5728\u6307\u4ee4\u9075\u5faa\u6570\u636e\u4e0a\u8054\u5408\u5fae\u8c03\uff0c\u89c6\u89c9\u7f16\u7801\u5668\u4fdd\u6301\u51bb\u7ed3\u3002\u8fd9\u6559\u4f1a\u6a21\u578b\u9075\u5faa\u590d\u6742\u7684\u89c6\u89c9\u6307\u4ee4\u3002
LLaVA-1.5 \u901a\u8fc7\u4e09\u9879\u5173\u952e\u66f4\u6539\u6539\u8fdb\u4e86\u539f\u59cb\u7248\u672c\uff1a\u5c06\u5355\u5c42\u7ebf\u6027\u6295\u5f71\u66ff\u6362\u4e3a\u4e24\u5c42 MLP\uff08\u66f4\u5177\u8868\u73b0\u529b\u7684\u6620\u5c04\uff09\uff0c\u4f7f\u7528\u66f4\u9ad8\u5206\u8fa8\u7387\u7684\u56fe\u50cf\uff08336px \u800c\u975e 224px\uff0c\u4ea7\u751f\u66f4\u591a patch token\uff09\uff0c\u4ee5\u53ca\u5728\u8bad\u7ec3\u6df7\u5408\u6570\u636e\u4e2d\u52a0\u5165\u5b66\u672f VQA \u6570\u636e\u96c6\u3002\u8fd9\u4e9b\u770b\u4f3c\u7ec6\u5fae\u7684\u4fee\u6539\u5e26\u6765\u4e86\u57fa\u51c6\u6027\u80fd\u7684\u5927\u5e45\u63d0\u5347\u3002
LLaVA \u7684\u65b9\u6cd5\u8bc1\u660e\uff0c\u4f60\u4e0d\u9700\u8981\u50cf Flamingo \u7684 Perceiver \u91cd\u91c7\u6837\u5668\u6216\u95e8\u63a7\u4ea4\u53c9\u6ce8\u610f\u529b\u90a3\u6837\u590d\u6742\u7684\u67b6\u6784\u521b\u65b0\u3002\u4e00\u4e2a\u7b80\u5355\u7684\u7ebf\u6027\u6295\u5f71\uff0c\u7ed3\u5408\u9ad8\u8d28\u91cf\u7684\u6307\u4ee4\u5fae\u8c03\u6570\u636e\uff0c\u5c31\u8db3\u4ee5\u6709\u6548\u5730\u5c06\u89c6\u89c9\u7f16\u7801\u5668\u8fde\u63a5\u5230 LLM\u3002\u8fd9\u79cd\u7b80\u6d01\u6027\u4f7f\u5f97 LLaVA \u6781\u5177\u5f71\u54cd\u529b\u2014\u2014\u540e\u7eed\u5927\u591a\u6570\u5f00\u6e90 VLM \u90fd\u9075\u5faa\u7c7b\u4f3c\u7684\u65b9\u6848\u3002
PaLI\uff08Pathways Language and Image model\uff0cChen \u7b49\u4eba\uff0c2022\uff0cGoogle\uff09\u540c\u65f6\u6269\u5c55\u89c6\u89c9\u7f16\u7801\u5668\u548c\u8bed\u8a00\u6a21\u578b\u3002PaLI \u4f7f\u7528 ViT-e\uff0840 \u4ebf\u53c2\u6570\uff09\u4f5c\u4e3a\u89c6\u89c9\u7f16\u7801\u5668\uff0cmT5\uff08130 \u4ebf\u53c2\u6570\uff09\u4f5c\u4e3a\u8bed\u8a00\u6a21\u578b\uff0c\u603b\u8ba1 170 \u4ebf\u53c2\u6570\u3002\u56fe\u50cf\u88ab\u7f16\u7801\u4e3a\u4e00\u7cfb\u5217 patch token\uff0c\u62fc\u63a5\u5728\u6587\u672c token \u4e4b\u524d\uff0c\u8f93\u5165\u5230\u7f16\u7801\u5668-\u89e3\u7801\u5668\u67b6\u6784\u7684 mT5\u3002
PaLI \u7684\u5173\u952e\u6d1e\u89c1\u662f\u6269\u5c55\u89c6\u89c9\u7f16\u7801\u5668\u4e0e\u6269\u5c55\u8bed\u8a00\u6a21\u578b\u540c\u6837\u91cd\u8981\u3002\u5148\u524d\u7684\u5de5\u4f5c\u901a\u5e38\u4f7f\u7528\u56fa\u5b9a\u7684\u3001\u4e2d\u7b49\u89c4\u6a21\u7684\u89c6\u89c9\u9aa8\u5e72\u7f51\u7edc\uff08\u5982 ViT-B \u6216 ViT-L\uff09\uff0c\u5c06\u53c2\u6570\u9884\u7b97\u5168\u90e8\u6295\u5165 LLM\u3002PaLI \u8868\u660e\uff0c\u4e00\u4e2a 40 \u4ebf\u53c2\u6570\u7684 ViT-e\uff0c\u5728 JFT-4B\uff0840 \u4ebf\u5f20\u6807\u6ce8\u56fe\u50cf\uff09\u4e0a\u9884\u8bad\u7ec3\u540e\uff0c\u80fd\u591f\u663e\u8457\u63d0\u5347 OCR \u548c\u7a7a\u95f4\u63a8\u7406\u7b49\u7ec6\u7c92\u5ea6\u89c6\u89c9\u4efb\u52a1\u7684\u6027\u80fd\u3002
PaLI \u5728 WebLI\uff08\u4e00\u4e2a\u5305\u542b 109 \u79cd\u8bed\u8a00\u3001100 \u4ebf\u56fe\u50cf-\u6587\u672c\u5bf9\u7684\u6570\u636e\u96c6\uff09\u4e0a\u8bad\u7ec3\uff0c\u56e0\u6b64\u5929\u7136\u5177\u5907\u591a\u8bed\u8a00\u80fd\u529b\u3002\u6a21\u578b\u901a\u8fc7\u6df7\u5408\u4efb\u52a1\u8fdb\u884c\u9884\u8bad\u7ec3\uff1a\u56fe\u50cf\u63cf\u8ff0\u3001VQA \u548c\u56fe\u50cf-\u6587\u672c\u5339\u914d\uff0c\u5168\u90e8\u4f5c\u4e3a\u6587\u672c\u5230\u6587\u672c\u751f\u6210\u4efb\u52a1\uff08\u9075\u5faa\u7b2c 7 \u7ae0\u7684 T5 \u8303\u5f0f\uff09\u3002PaLI-X\uff08550 \u4ebf\u53c2\u6570\uff09\u548c PaLI-3\uff0850 \u4ebf\uff0c\u4f7f\u7528 SigLIP \u4f5c\u4e3a\u89c6\u89c9\u7f16\u7801\u5668\uff09\u662f\u540e\u7eed\u8fed\u4ee3\u7248\u672c\u3002
Qwen-VL\uff08Bai \u7b49\u4eba\uff0c2023\uff0c\u963f\u91cc\u5df4\u5df4\uff09\u5728 Qwen LLM \u57fa\u7840\u4e0a\u589e\u52a0\u4e86\u4e00\u4e2a ViT \u89c6\u89c9\u7f16\u7801\u5668\u548c\u4e00\u4e2a\u5355\u5c42\u4ea4\u53c9\u6ce8\u610f\u529b\u6a21\u5757\uff08\u7c7b\u4f3c\u4e8e Flamingo \u7684 Perceiver \u91cd\u91c7\u6837\u5668\uff09\uff0c\u5c06\u89c6\u89c9\u7f16\u7801\u5668\u7684\u8f93\u51fa\u538b\u7f29\u4e3a\u4e00\u7ec4\u56fa\u5b9a\u7684 256 \u4e2a\u89c6\u89c9 token\u3002\u89c6\u89c9 token \u4e0e\u6587\u672c token \u62fc\u63a5\u540e\u7531 Qwen LLM \u5904\u7406\u3002
Qwen-VL \u7684\u8bad\u7ec3\u91c7\u7528\u4e09\u9636\u6bb5\u65b9\u6848\u3002\u9636\u6bb5 1\uff1a\u5728 14 \u4ebf\u4e2a\u5f31\u76d1\u7763\u56fe\u50cf-\u6587\u672c\u5bf9\u4e0a\u9884\u8bad\u7ec3\uff0c\u4ec5\u89e3\u51bb\u89c6\u89c9\u7f16\u7801\u5668\u3002\u9636\u6bb5 2\uff1a\u5728\u66f4\u9ad8\u8d28\u91cf\u7684\u6570\u636e\u4e0a\u8fdb\u884c\u591a\u4efb\u52a1\u9884\u8bad\u7ec3\uff0c\u5305\u62ec VQA\u3001\u63cf\u8ff0\u3001\u5b9a\u4f4d\u548c OCR \u6570\u636e\u96c6\uff0c\u6574\u4e2a\u6a21\u578b\u89e3\u51bb\u3002\u9636\u6bb5 3\uff1a\u5728\u6307\u4ee4\u9075\u5faa\u548c\u5bf9\u8bdd\u6570\u636e\u4e0a\u8fdb\u884c\u76d1\u7763\u5fae\u8c03\u3002\u8fd9\u79cd\u4ece\u566a\u58f0\u7f51\u7edc\u6570\u636e\u5230\u7cbe\u9009\u6307\u4ee4\u6570\u636e\u7684\u6e10\u8fdb\u5f0f\u7cbe\u70bc\uff0c\u662f\u5927\u591a\u6570\u73b0\u4ee3 VLM \u5171\u4eab\u7684\u6a21\u5f0f\u3002
Qwen2-VL\uff082024\uff09\u5f15\u5165\u4e86\u52a8\u6001\u5206\u8fa8\u7387\u652f\u6301\uff1a\u6a21\u578b\u4e0d\u662f\u5c06\u6240\u6709\u56fe\u50cf\u7f29\u653e\u5230\u56fa\u5b9a\u5927\u5c0f\uff0c\u800c\u662f\u901a\u8fc7\u52a8\u6001\u8c03\u6574\u89c6\u89c9 token \u6570\u91cf\u4ee5\u539f\u59cb\u5206\u8fa8\u7387\u5904\u7406\u56fe\u50cf\u3002\u66f4\u9ad8\u5206\u8fa8\u7387\u7684\u56fe\u50cf\u4ea7\u751f\u66f4\u591a token\uff0c\u66f4\u4f4e\u5206\u8fa8\u7387\u7684\u56fe\u50cf\u4ea7\u751f\u66f4\u5c11 token\u3002\u8fd9\u5728\u4e0d\u6d6a\u8d39\u4f4e\u5206\u8fa8\u7387\u8f93\u5165\u8ba1\u7b97\u91cf\u7684\u524d\u63d0\u4e0b\uff0c\u63d0\u5347\u4e86\u6587\u6863\u7406\u89e3\u548c\u7ec6\u7c92\u5ea6\u8bc6\u522b\u7b49\u5bf9\u7ec6\u8282\u654f\u611f\u7684\u4efb\u52a1\u7684\u6027\u80fd\u3002
InternVL\uff08Chen \u7b49\u4eba\uff0c2024\uff0c\u4e0a\u6d77\u4eba\u5de5\u667a\u80fd\u5b9e\u9a8c\u5ba4\uff09\u6fc0\u8fdb\u5730\u6269\u5c55\u4e86\u89c6\u89c9\u7f16\u7801\u5668\uff0c\u4f7f\u7528 InternViT-6B\u2014\u2014\u4e00\u4e2a 60 \u4ebf\u53c2\u6570\u7684\u89c6\u89c9 Transformer\u2014\u2014\u4e0e\u8bed\u8a00\u6a21\u578b\u914d\u5bf9\u3002\u5173\u952e\u7684\u67b6\u6784\u8d21\u732e\u662f\u52a8\u6001\u9ad8\u5206\u8fa8\u7387\u5904\u7406\uff1a\u56fe\u50cf\u88ab\u5206\u5272\u4e3a 448x448 \u50cf\u7d20\u7684\u56fe\u5757\uff0c\u6bcf\u4e2a\u56fe\u5757\u7531\u89c6\u89c9\u7f16\u7801\u5668\u72ec\u7acb\u5904\u7406\uff0c\u5f97\u5230\u7684\u56fe\u5757\u7279\u5f81\u4e0e\u5b8c\u6574\u56fe\u50cf\u7684\u7f29\u7565\u56fe\u7279\u5f81\u62fc\u63a5\u3002\u8fd9\u4f7f\u5f97\u6a21\u578b\u80fd\u591f\u5904\u7406\u4efb\u610f\u5bbd\u9ad8\u6bd4\u548c\u5206\u8fa8\u7387\u7684\u56fe\u50cf\u3002
InternVL-2 \u8fdb\u4e00\u6b65\u5f15\u5165\u4e86\u6e10\u8fdb\u5bf9\u9f50\u8bad\u7ec3\uff1a\u9996\u5148\u7528\u5bf9\u6bd4\u76ee\u6807\uff08\u5982 CLIP\uff09\u5bf9\u9f50\u89c6\u89c9\u7f16\u7801\u5668\uff0c\u7136\u540e\u901a\u8fc7\u8f7b\u91cf\u7ea7 MLP \u8fde\u63a5\u5668\u5c06\u5176\u8fde\u63a5\u5230 LLM\uff0c\u6700\u540e\u5728\u6307\u4ee4\u6570\u636e\u4e0a\u8fdb\u884c\u7aef\u5230\u7aef\u5fae\u8c03\u3002\u8fd9\u79cd\u6e10\u8fdb\u7b56\u7565\u9632\u6b62\u4e86\u89c6\u89c9\u7f16\u7801\u5668\u9884\u8bad\u7ec3\u8868\u793a\u7684\u707e\u96be\u6027\u9057\u5fd8\u3002
\u60f3\u8c61\u4f60\u5728\u4eba\u7fa4\u4e2d\u6307\u7740\u4e00\u4e2a\u4eba\u8bf4\"\u6234\u7ea2\u5e3d\u5b50\u7684\u5973\u58eb\"\u3002\u4f60\u5728\u7528\u8bed\u8a00\u6307\u4ee3\u4e00\u4e2a\u7279\u5b9a\u7684\u7a7a\u95f4\u533a\u57df\u3002\u89c6\u89c9\u5b9a\u4f4d\u662f\u76f8\u53cd\u7684\u8fc7\u7a0b\uff1a\u7ed9\u5b9a\u4e00\u5f20\u56fe\u50cf\u548c\u4e00\u4e2a\u81ea\u7136\u8bed\u8a00\u8868\u8ff0\uff0c\u6a21\u578b\u5fc5\u987b\u8bc6\u522b\uff08\u5b9a\u4f4d\uff09\u6240\u6307\u7684\u5bf9\u8c61\u3002\u6307\u4ee3\u8868\u8fbe\u7406\u89e3\u4ea7\u751f\u8fb9\u754c\u6846\uff1b\u6307\u4ee3\u8868\u8fbe\u5206\u5272\u4ea7\u751f\u50cf\u7d20\u63a9\u7801\u3002
\u5f62\u5f0f\u4e0a\uff0c\u7ed9\u5b9a\u4e00\u5f20\u56fe\u50cf \\(I\\) \u548c\u4e00\u4e2a\u6307\u4ee3\u8868\u8fbe \\(r\\)\uff08\u4f8b\u5982\"\u5de6\u8fb9\u90a3\u53ea\u5927\u578b\u68d5\u8272\u72d7\"\uff09\uff0c\u6a21\u578b\u9884\u6d4b\u4e00\u4e2a\u8fb9\u754c\u6846 \\(b = (x, y, w, h)\\) \u6216\u4e00\u7ec4\u5b9a\u4f4d\u6240\u5f15\u7528\u5bf9\u8c61\u7684\u5750\u6807\u3002\u6570\u636e\u96c6\u5305\u62ec RefCOCO\u3001RefCOCO+ \u548c RefCOCOg\uff0c\u6bcf\u4e2a\u6570\u636e\u96c6\u5305\u542b\u5177\u6709\u591a\u4e2a\u5bf9\u8c61\u7684\u56fe\u50cf\u4ee5\u53ca\u6bcf\u4e2a\u5bf9\u8c61\u7684\u660e\u786e\u6307\u4ee3\u8868\u8fbe\u3002
\u65e9\u671f\u7684\u5b9a\u4f4d\u6a21\u578b\u4f7f\u7528\u4e24\u9636\u6bb5\u65b9\u6cd5\uff1a\u9996\u5148\u751f\u6210\u533a\u57df\u63d0\u8bae\uff08\u4f7f\u7528 Faster R-CNN \u6216\u7c7b\u4f3c\u65b9\u6cd5\uff09\uff0c\u7136\u540e\u4f7f\u7528\u878d\u5408\u6a21\u578b\u5bf9\u6bcf\u4e2a\u63d0\u8bae\u4e0e\u8bed\u8a00\u67e5\u8be2\u8fdb\u884c\u8bc4\u5206\u3002\u8bc4\u5206\u6700\u9ad8\u7684\u533a\u57df\u5373\u4e3a\u9884\u6d4b\u7ed3\u679c\u3002\u8fd9\u79cd\u65b9\u6cd5\u8ba1\u7b97\u4ee3\u4ef7\u9ad8\u6602\uff0c\u4e14\u53d7\u9650\u4e8e\u63d0\u8bae\u7684\u8d28\u91cf\u3002
\u73b0\u4ee3 VLM \u5c06\u5b9a\u4f4d\u76f4\u63a5\u6574\u5408\u5230\u751f\u6210\u5f0f\u6846\u67b6\u4e2d\u3002\u5173\u952e\u601d\u60f3\u662f\u5c06\u8fb9\u754c\u6846\u5750\u6807\u8868\u793a\u4e3a\u6587\u672c token\u3002\u4f60\u5c06\u8fde\u7eed\u7684\u5750\u6807\u7a7a\u95f4\u79bb\u6563\u5316\u4e3a\u69fd\u4f4d\uff08\u4f8b\u5982 \\(x, y, w, h\\) \u5404 1000 \u4e2a\u69fd\u4f4d\uff09\uff0c\u5e76\u5411\u8bcd\u6c47\u8868\u4e2d\u6dfb\u52a0\u7279\u6b8a\u7684\u4f4d\u7f6e token\uff0c\u5982 <loc_342>\u3002\u7136\u540e\u6a21\u578b\u901a\u8fc7\u8f93\u51fa\u4e00\u7cfb\u5217\u4f4d\u7f6e token \u6765\u751f\u6210\u8fb9\u754c\u6846\uff1a
\u8fd9\u79cd token \u5316\u6280\u5de7\u4f7f\u5f97\u4efb\u4f55\u81ea\u56de\u5f52\u8bed\u8a00\u6a21\u578b\u65e0\u9700\u67b6\u6784\u66f4\u6539\u5373\u53ef\u6267\u884c\u5b9a\u4f4d\u2014\u2014\u5b83\u53ea\u9700\u5b66\u4f1a\"\u8bf4\u5750\u6807\"\u3002Pix2Seq\uff08Chen \u7b49\u4eba\uff0c2022\uff09\u7387\u5148\u5c06\u8fd9\u79cd\u65b9\u6cd5\u7528\u4e8e\u76ee\u6807\u68c0\u6d4b\uff0c\u800c Qwen-VL\u3001Ferret \u548c Kosmos-2 \u7b49\u6a21\u578b\u5c06\u5176\u6269\u5c55\u5230\u6307\u4ee3\u8868\u8fbe\u7406\u89e3\u548c\u77ed\u8bed\u5b9a\u4f4d\u3002
Kosmos-2\uff08Peng \u7b49\u4eba\uff0c2023\uff0cMicrosoft\uff09\u901a\u8fc7\u5c06\u7a7a\u95f4\u4f4d\u7f6e\u8868\u793a\u4e3a\u5d4c\u5165\u5728\u751f\u6210\u6587\u672c\u4e2d\u7684\u7279\u6b8a token\uff0c\u4e3a\u591a\u6a21\u6001 LLM \u589e\u52a0\u4e86\u5b9a\u4f4d\u80fd\u529b\u3002\u4f8b\u5982\uff0c\u5b83\u53ef\u4ee5\u751f\u6210\uff1a\"\u4e00\u53ea <phrase> \u91d1\u6bdb\u730e\u72ac </phrase> <box> <loc_102> <loc_215> <loc_487> <loc_398> </box> \u6b63\u5728\u63a5\u98de\u76d8\u3002\"\u8fd9\u79cd\u6587\u672c\u548c\u7a7a\u95f4 token \u7684\u4ea4\u9519\u878d\u5408\u5b9e\u73b0\u4e86\u540c\u6b65\u63cf\u8ff0\u548c\u5b9a\u4f4d\u3002
\u4f20\u7edf\u7684\u6587\u6863\u7406\u89e3\u6d41\u6c34\u7ebf\u5f88\u590d\u6742\uff1a\u9996\u5148\u8fd0\u884c OCR \u5f15\u64ce\u63d0\u53d6\u6587\u672c\u548c\u5e03\u5c40\uff0c\u7136\u540e\u5c06\u63d0\u53d6\u7684\u6587\u672c\u8f93\u5165\u8bed\u8a00\u6a21\u578b\u3002\u8fd9\u79cd\u591a\u9636\u6bb5\u65b9\u6cd5\u5f88\u8106\u5f31\u2014\u2014OCR \u9519\u8bef\u5411\u4e0b\u6e38\u4f20\u64ad\uff0c\u7a7a\u95f4\u5e03\u5c40\u4fe1\u606f\u5e38\u5e38\u4e22\u5931\u6216\u8868\u5f81\u4e0d\u826f\u3002\u5982\u679c\u6a21\u578b\u80fd\u50cf\u4eba\u7c7b\u4e00\u6837\u76f4\u63a5\u4ece\u50cf\u7d20\u4e2d\u8bfb\u53d6\u4fe1\u606f\u5462\uff1f
Donut\uff08Document Understanding Transformer\uff0cKim \u7b49\u4eba\uff0c2022\uff09\u5b8c\u5168\u6d88\u9664\u4e86 OCR\u3002\u5b83\u4f7f\u7528 Swin Transformer\uff08\u7b2c 8 \u7ae0\uff09\u4f5c\u4e3a\u89c6\u89c9\u7f16\u7801\u5668\u5904\u7406\u6587\u6863\u56fe\u50cf\uff0c\u5e76\u4f7f\u7528 BART \u98ce\u683c\u7684 Transformer \u89e3\u7801\u5668\u76f4\u63a5\u4ece\u89c6\u89c9\u7279\u5f81\u751f\u6210\u7ed3\u6784\u5316\u6587\u672c\u8f93\u51fa\u3002\u89e3\u7801\u5668\u53ef\u4ee5\u6839\u636e\u4efb\u52a1\u751f\u6210 JSON\u3001\u952e\u503c\u5bf9\u6216\u7eaf\u6587\u672c\u3002
Donut \u7684\u8bad\u7ec3\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5\u3002\u9884\u8bad\u7ec3\uff1a\u6a21\u578b\u901a\u8fc7\u6267\u884c\u5408\u6210 OCR \u6765\u5b66\u4e60\u9605\u8bfb\u2014\u2014\u7ed9\u5b9a\u4e00\u5f20\u6587\u6863\u56fe\u50cf\uff0c\u751f\u6210\u5b8c\u6574\u7684\u6587\u672c\u5185\u5bb9\u3002\u8fd9\u5728\u4ece\u6587\u672c\u8bed\u6599\u5e93\u6e32\u67d3\u7684\u6570\u767e\u4e07\u5f20\u5408\u6210\u6587\u6863\u56fe\u50cf\u4e0a\u8fdb\u884c\u8bad\u7ec3\uff0c\u6559\u4f1a\u89c6\u89c9\u7f16\u7801\u5668\u8bc6\u522b\u5b57\u7b26\u3001\u5b57\u4f53\u548c\u5e03\u5c40\u3002\u5fae\u8c03\uff1a\u6a21\u578b\u901a\u8fc7\u8bad\u7ec3\u751f\u6210\u7279\u5b9a\u4e8e\u4efb\u52a1\u7684\u7ed3\u6784\u5316\u8f93\u51fa\uff0c\u9002\u5e94\u7279\u5b9a\u7684\u4e0b\u6e38\u4efb\u52a1\uff0c\u5982\u6536\u636e\u89e3\u6790\u3001\u8868\u683c\u7406\u89e3\u6216\u6587\u6863\u5206\u7c7b\u3002
Donut \u89e3\u7801\u5668\u4f7f\u7528\u7279\u6b8a\u7684\u63d0\u793a\u65b9\u6848\uff1a\u4efb\u52a1\u7531\u63d0\u793a token \u6307\u5b9a\uff08\u4f8b\u5982\u5206\u7c7b\u7528 <doc_class>\uff0c\u6536\u636e\u89e3\u6790\u7528 <parse_receipt>\uff09\uff0c\u6a21\u578b\u6839\u636e\u6b64\u63d0\u793a\u751f\u6210\u8f93\u51fa\u3002\u8fd9\u79cd\u7edf\u4e00\u63a5\u53e3\u4f7f\u5f97\u5355\u4e2a\u6a21\u578b\u53ef\u4ee5\u5904\u7406\u591a\u79cd\u6587\u6863\u7406\u89e3\u4efb\u52a1\u3002
Pix2Struct\uff08Lee \u7b49\u4eba\uff0c2023\uff0cGoogle\uff09\u5c06\u514d OCR \u601d\u60f3\u5e94\u7528\u4e8e\u7f51\u9875\u7406\u89e3\u548c\u56fe\u8868/\u56fe\u5f62\u7406\u89e3\u3002\u5173\u952e\u7684\u9884\u8bad\u7ec3\u76ee\u6807\u662f\u622a\u56fe\u89e3\u6790\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u7f51\u9875\u7684\u5e26\u63a9\u7801\u622a\u56fe\uff0c\u6a21\u578b\u751f\u6210\u4ea7\u751f\u53ef\u89c1\u533a\u57df\u7684\u5e95\u5c42 HTML\u3002\u8fd9\u6559\u4f1a\u6a21\u578b\u7406\u89e3\u89c6\u89c9\u5448\u73b0\u4e0e\u7ed3\u6784\u5316\u6807\u8bb0\u4e4b\u95f4\u7684\u5173\u7cfb\u3002
Pix2Struct \u5f15\u5165\u4e86\u53ef\u53d8\u5206\u8fa8\u7387\u8f93\u5165\u5904\u7406\uff1a\u5b83\u5e76\u4e0d\u662f\u5c06\u6240\u6709\u56fe\u50cf\u7f29\u653e\u5230\u56fa\u5b9a\u5927\u5c0f\uff08\u8fd9\u4f1a\u626d\u66f2\u5bbd\u9ad8\u6bd4\u5e76\u7834\u574f\u7cbe\u7ec6\u6587\u5b57\uff09\uff0c\u800c\u662f\u5728\u4fdd\u6301\u539f\u59cb\u5bbd\u9ad8\u6bd4\u7684\u540c\u65f6\u5c06\u56fe\u50cf\u6253\u5305\u4e3a\u56fa\u5b9a\u6570\u91cf\u7684 patch\u3002\u4e00\u4e2a\u9ad8\u800c\u7a84\u7684\u6587\u6863\u4ea7\u751f\u4e00\u4e2a\u9ad8\u800c\u7a84\u7684 patch \u7f51\u683c\u3002\u8fd9\u5bf9\u4e8e\u6587\u6863\u7406\u89e3\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u5bbd\u9ad8\u6bd4\u643a\u5e26\u7740\u8bed\u4e49\u4fe1\u606f\uff08\u6536\u636e\u7a84\u800c\u9ad8\uff1b\u8868\u683c\u5bbd\u800c\u77ed\uff09\u3002
Nougat\uff08Blecher \u7b49\u4eba\uff0c2023\uff0cMeta\uff09\u5c06 Donut \u67b6\u6784\u4e13\u95e8\u5e94\u7528\u4e8e\u5b66\u672f\u8bba\u6587\uff0c\u76f4\u63a5\u4ece PDF \u9875\u9762\u56fe\u50cf\u751f\u6210\u5b8c\u6574\u7684 LaTeX \u6807\u8bb0\u3002\u5b83\u53ef\u4ee5\u5904\u7406\u590d\u6742\u7684\u6570\u5b66\u65b9\u7a0b\u3001\u8868\u683c\u548c\u56fe\u5f62\u2014\u2014\u8fd9\u4e9b\u4efb\u52a1\u6b63\u662f\u4f20\u7edf OCR \u6d41\u6c34\u7ebf\u96be\u4ee5\u5e94\u4ed8\u7684\u3002\u8be5\u6a21\u578b\u5728 PDF \u9875\u9762\u56fe\u50cf\u53ca\u5176\u5bf9\u5e94\u7684 LaTeX \u6e90\u4ee3\u7801\u5bf9\u4e0a\u8fdb\u884c\u8bad\u7ec3\u3002
\u514d OCR \u6a21\u578b\u7684\u6210\u529f\u5c55\u793a\u4e86\u6df1\u5ea6\u5b66\u4e60\u4e2d\u7684\u4e00\u4e2a\u66f4\u5e7f\u6cdb\u539f\u5219\uff1a\u76f4\u63a5\u4ece\u539f\u59cb\u8f93\u5165\uff08\u50cf\u7d20\uff09\u5b66\u4e60\u7684\u7aef\u5230\u7aef\u6a21\u578b\u901a\u5e38\u4f18\u4e8e\u590d\u6742\u7684\u591a\u9636\u6bb5\u6d41\u6c34\u7ebf\uff0c\u56e0\u4e3a\u5b83\u4eec\u53ef\u4ee5\u8054\u5408\u4f18\u5316\u6240\u6709\u7ec4\u4ef6\uff0c\u5e76\u5b66\u4e60\u4e13\u95e8\u9488\u5bf9\u6700\u7ec8\u4efb\u52a1\u5b9a\u5236\u7684\u8868\u793a\u3002\u4e2d\u95f4\u7684 OCR \u6b65\u9aa4\u662f\u4e00\u4e2a\u74f6\u9888\uff0c\u9650\u5236\u4e86\u6a21\u578b\u80fd\u591f\u5b66\u4e60\u7684\u5185\u5bb9\u3002
\u65e0\u8bba\u67b6\u6784\u5bb6\u65cf\u5982\u4f55\uff0c\u6bcf\u4e2a VLM \u90fd\u5fc5\u987b\u5c06\u56fe\u50cf\u8f6c\u6362\u4e3a\u8bed\u8a00\u6a21\u578b\u53ef\u4ee5\u5904\u7406\u7684\u4e00\u7cfb\u5217 token\u3002\u7406\u89e3\u8fd9\u4e00\u6d41\u6c34\u7ebf\u81f3\u5173\u91cd\u8981\u3002\u4e0d\u540c\u6a21\u578b\u7684\u5904\u7406\u8fc7\u7a0b\u6709\u6240\u5dee\u5f02\uff0c\u4f46\u603b\u4f53\u6d41\u7a0b\u5982\u4e0b\uff1a
\u7b2c 1 \u6b65\uff1aPatch \u63d0\u53d6\u3002 \u56fe\u50cf\uff08\u9ad8\u5ea6 \\(H\\)\uff0c\u5bbd\u5ea6 \\(W\\)\uff09\u88ab\u5212\u5206\u4e3a\u4e0d\u91cd\u53e0\u7684\u3001\u5927\u5c0f\u4e3a \\(P \\times P\\) \u7684 patch\uff0c\u4ea7\u751f \\(N = HW / P^2\\) \u4e2a patch\u3002\u5bf9\u4e8e 336x336 \u56fe\u50cf\u548c 14x14 patch\uff0c\\(N = 576\\)\u3002
\u7b2c 2 \u6b65\uff1a\u89c6\u89c9\u7f16\u7801\u3002 \u6bcf\u4e2a patch \u7ecf\u8fc7\u7ebf\u6027\u6295\u5f71\u5e76\u901a\u8fc7\u89c6\u89c9\u7f16\u7801\u5668\uff08\u901a\u5e38\u662f ViT\uff09\u3002\u8f93\u51fa\u662f\u4e00\u7cfb\u5217\u4e0a\u4e0b\u6587 patch \u5d4c\u5165 \\(V = [v_1, \\ldots, v_N] \\in \\mathbb{R}^{N \\times d_v}\\)\u3002\u8fd9\u4e9b\u5d4c\u5165\u65e2\u643a\u5e26\u5c40\u90e8\u5916\u89c2\u4fe1\u606f\uff0c\u4e5f\u643a\u5e26\u5168\u5c40\u4e0a\u4e0b\u6587\uff08\u6765\u81ea\u81ea\u6ce8\u610f\u529b\uff09\u3002
\u7b2c 3 \u6b65\uff1aToken \u538b\u7f29\uff08\u53ef\u9009\uff09\u3002 \u4e00\u4e9b\u6a21\u578b\u5c06 \\(N\\) \u4e2a\u89c6\u89c9 token \u538b\u7f29\u4e3a\u66f4\u5c11\u7684 \\(M \\ll N\\) \u4e2a token\uff0c\u4ee5\u51cf\u5c11\u8bed\u8a00\u6a21\u578b\u7684\u8ba1\u7b97\u8d1f\u62c5\u3002Flamingo \u4f7f\u7528 Perceiver \u91cd\u91c7\u6837\u5668\uff08\\(M = 64\\)\uff09\uff1bQwen-VL \u4f7f\u7528\u4ea4\u53c9\u6ce8\u610f\u529b\uff08\\(M = 256\\)\uff09\uff1bQ-Former\uff08\u5728 BLIP-2 \u4e2d\u4f7f\u7528\uff0cLi \u7b49\u4eba\uff0c2023\uff09\u4f7f\u7528\u4e00\u7ec4 \\(M = 32\\) \u4e2a\u53ef\u5b66\u4e60\u67e5\u8be2 token\uff0c\u5bf9\u89c6\u89c9\u7f16\u7801\u5668\u7684\u8f93\u51fa\u6267\u884c\u4ea4\u53c9\u6ce8\u610f\u529b\u3002
\u7b2c 4 \u6b65\uff1a\u6295\u5f71\u3002 \u89c6\u89c9 token\uff08\u5168\u90e8\u6216\u538b\u7f29\u540e\u7684\u96c6\u5408\uff09\u901a\u8fc7\u7ebf\u6027\u5c42\u6216 MLP \u6295\u5f71\u5230\u8bed\u8a00\u6a21\u578b\u7684\u5d4c\u5165\u7a7a\u95f4\u3002\u6295\u5f71\u540e\uff0c\u89c6\u89c9 token \u4e0e\u6587\u672c token \u5d4c\u5165\u5177\u6709\u76f8\u540c\u7ef4\u5ea6\uff0c\u53ef\u4ee5\u4e0e\u5b83\u4eec\u62fc\u63a5\u3002
\u7b2c 5 \u6b65\uff1a\u6ce8\u5165 LLM\u3002 \u6295\u5f71\u540e\u7684\u89c6\u89c9 token \u5728\u7279\u6b8a <image> \u5360\u4f4d\u7b26 token \u7684\u4f4d\u7f6e\u63d2\u5165\u5230 token \u5e8f\u5217\u4e2d\uff0c\u7ec4\u5408\u540e\u7684\u5e8f\u5217\u7531\u8bed\u8a00\u6a21\u578b\u5904\u7406\u3002LLM \u7684\u81ea\u6ce8\u610f\u529b\u4f7f\u6587\u672c token \u80fd\u591f\u5173\u6ce8\u89c6\u89c9 token\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002
\u89c6\u89c9 token \u7684\u6570\u91cf\u76f4\u63a5\u5f71\u54cd\u8ba1\u7b97\u6210\u672c\u3002\u6bcf\u4e2a\u89c6\u89c9 token \u53c2\u4e0e LLM \u7684\u81ea\u6ce8\u610f\u529b\uff0c\u5176\u590d\u6742\u5ea6\u4e0e\u5e8f\u5217\u957f\u5ea6\u7684\u5e73\u65b9\u6210\u6b63\u6bd4\u3002\u5177\u6709\u591a\u4e2a patch \u7684\u9ad8\u5206\u8fa8\u7387\u56fe\u50cf\u53ef\u80fd\u4ea7\u751f\u6570\u767e\u6216\u6570\u5343\u4e2a\u89c6\u89c9 token\uff0c\u5360\u636e LLM \u4e0a\u4e0b\u6587\u7a97\u53e3\u7684\u4e3b\u5bfc\u5730\u4f4d\u3002\u8fd9\u5c31\u662f token \u538b\u7f29\u7684\u91cd\u8981\u6027\u6240\u5728\uff1a\u5c06 576 \u4e2a\u89c6\u89c9 token \u51cf\u5c11\u5230 64 \u4e2a\uff0c\u53ef\u5c06\u89c6\u89c9\u90e8\u5206\u5728\u6ce8\u610f\u529b\u4e2d\u7684\u8d21\u732e\u51cf\u5c11\u7ea6 9 \u500d\u3002
BLIP-2\uff08Li \u7b49\u4eba\uff0c2023\uff09\u4ee5\u5176\u9ad8\u6548\u7684\u6865\u63a5\u7b56\u7565\u800c\u95fb\u540d\u3002\u5b83\u5f15\u5165\u4e86\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u7684 Q-Former\uff08\u4e00\u4e2a\u5e26\u6709\u53ef\u5b66\u4e60\u67e5\u8be2\u7684\u5c0f\u578b Transformer\uff09\uff0c\u4f4d\u4e8e\u51bb\u7ed3\u7684\u89c6\u89c9\u7f16\u7801\u5668\u548c\u51bb\u7ed3\u7684 LLM \u4e4b\u95f4\u3002Q-Former \u662f\u552f\u4e00\u53ef\u8bad\u7ec3\u7684\u7ec4\u4ef6\u2014\u2014\u89c6\u89c9\u7f16\u7801\u5668\u548c LLM \u90fd\u4fdd\u6301\u51bb\u7ed3\u3002\u5b83\u7684\u9884\u8bad\u7ec3\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5\uff1a\u9996\u5148\u662f\u56fe\u50cf-\u6587\u672c\u5bf9\u6bd4\u5b66\u4e60\u3001\u5339\u914d\u548c\u63cf\u8ff0\u76ee\u6807\uff08\u8fde\u63a5\u89c6\u89c9\u7f16\u7801\u5668\uff09\uff0c\u7136\u540e\u662f\u8bed\u8a00\u751f\u6210\u76ee\u6807\uff08\u8fde\u63a5 LLM\uff09\u3002\u8fd9\u79cd\u6a21\u5757\u5316\u8bbe\u8ba1\u4f7f\u5f97 BLIP-2 \u53ef\u4ee5\u5c06\u4efb\u4f55\u89c6\u89c9\u7f16\u7801\u5668\u63d2\u5165\u5230\u4efb\u4f55 LLM \u4e2d\u3002
VLM \u4f7f\u7528\u591a\u79cd\u76ee\u6807\u7684\u7ec4\u5408\u8fdb\u884c\u8bad\u7ec3\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u67b6\u6784\u6a21\u5f0f\uff1a
\u56fe\u50cf-\u6587\u672c\u5bf9\u6bd4\u635f\u5931\uff08ITC\uff09\uff1a \u5728\u5171\u4eab\u5d4c\u5165\u7a7a\u95f4\u4e2d\u5bf9\u9f50\u56fe\u50cf\u548c\u6587\u672c\u8868\u793a\uff0c\u5982 CLIP \u4e2d\u6240\u793a\u3002\u8fd9\u662f\u53cc\u7f16\u7801\u5668\u7684\u4e3b\u8981\u76ee\u6807\uff0c\u4e5f\u5e38\u88ab\u7528\u4f5c\u878d\u5408\u6a21\u578b\u7684\u9884\u8bad\u7ec3\u76ee\u6807\u3002\u8be5\u635f\u5931\u5c31\u662f\u4e0a\u4e00\u7bc7\u6587\u4ef6\u4e2d\u7684 InfoNCE \u635f\u5931\u3002
\u56fe\u50cf-\u6587\u672c\u5339\u914d\uff08ITM\uff09\uff1a \u4e00\u4e2a\u4e8c\u5206\u7c7b\u76ee\u6807\u2014\u2014\u7ed9\u5b9a\u56fe\u50cf\u548c\u6587\u672c\uff0c\u9884\u6d4b\u5b83\u4eec\u662f\u5426\u5339\u914d\u3002\u56f0\u96be\u8d1f\u6837\u672c\uff08\u4e0e\u4e0d\u540c\u56fe\u50cf\u914d\u5bf9\u7684\u76f8\u4f3c\u6587\u672c\uff09\u4f7f\u8fd9\u9879\u4efb\u52a1\u5177\u6709\u6311\u6218\u6027\uff0c\u8feb\u4f7f\u6a21\u578b\u5b66\u4e60\u7ec6\u7c92\u5ea6\u7684\u5bf9\u9f50\u3002
\u8bed\u8a00\u5efa\u6a21\uff08LM\uff09\uff1a \u6807\u51c6\u7684\u81ea\u56de\u5f52\u8bed\u8a00\u5efa\u6a21\u76ee\u6807\u2014\u2014\u7ed9\u5b9a\u4e4b\u524d\u7684\u6240\u6709 token \u9884\u6d4b\u4e0b\u4e00\u4e2a token\u3002\u5bf9\u4e8e VLM\uff0c\"\u4e4b\u524d\u7684 token\" \u5305\u62ec\u89c6\u89c9 token\uff0c\u56e0\u6b64\u6a21\u578b\u5b66\u4e60\u5728\u89c6\u89c9\u8f93\u5165\u6761\u4ef6\u4e0b\u751f\u6210\u6587\u672c\u3002\u8fd9\u662f\u7f16\u7801\u5668-\u89e3\u7801\u5668\u548c\u4ec5\u89e3\u7801\u5668 VLM \u7684\u4e3b\u8981\u76ee\u6807\u3002
\u524d\u7f00\u8bed\u8a00\u5efa\u6a21\uff1a \u4e00\u79cd\u53d8\u4f53\uff0c\u5176\u4e2d\u56fe\u50cf\u548c\u6587\u672c\u524d\u7f00\u4f5c\u4e3a\u4e0a\u4e0b\u6587\u63d0\u4f9b\uff08\u4e0d\u8fdb\u884c\u8bad\u7ec3\uff09\uff0c\u6a21\u578b\u4ec5\u8bad\u7ec3\u751f\u6210\u540e\u7eed\u90e8\u5206\u3002\u8fd9\u7528\u4e8e PaLI \u548c SimVLM \u7b49\u6a21\u578b\u3002
\u5927\u591a\u6570\u73b0\u4ee3 VLM \u5728\u9884\u8bad\u7ec3\u671f\u95f4\u7ed3\u5408\u591a\u4e2a\u76ee\u6807\uff08\u4f8b\u5982 BLIP \u4e2d\u7684 ITC + ITM + LM\uff0cCoCa \u4e2d\u7684 ITC + LM\uff09\uff0c\u7136\u540e\u5728\u6307\u4ee4\u6570\u636e\u4e0a\u4f7f\u7528\u7eaf LM \u76ee\u6807\u8fdb\u884c\u5fae\u8c03\u3002
\u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684\u57fa\u4e8e\u6ce8\u610f\u529b\u7684\u56fe\u50cf\u63cf\u8ff0\u89e3\u7801\u5668\u3002\u4f7f\u7528\u968f\u673a\u7684\"\u56fe\u50cf\u7279\u5f81\"\u4f5c\u4e3a\u7f16\u7801\u5668\u8f93\u51fa\uff0c\u8bad\u7ec3\u89e3\u7801\u5668\u751f\u6210\u56fa\u5b9a\u7684\u63cf\u8ff0\uff0c\u89c2\u5bdf\u6ce8\u610f\u529b\u6743\u91cd\u5728\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\u5982\u4f55\u8de8\u7a7a\u95f4\u4f4d\u7f6e\u79fb\u52a8\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u6a21\u62df 4x4 \u7a7a\u95f4\u7f51\u683c\u7684\u56fe\u50cf\u7279\u5f81\uff0816 \u4e2a\u533a\u57df\uff0cdim=32\uff09\nkey = jax.random.PRNGKey(42)\nk1, k2, k3 = jax.random.split(key, 3)\nimg_features = jax.random.normal(k1, (16, 32)) # 16 \u4e2a\u7a7a\u95f4\u533a\u57df\uff0c32 \u7ef4\n\n# \u8bcd\u6c47\u8868\uff1a0=<start>, 1=\"a\", 2=\"red\", 3=\"car\", 4=<end>\nvocab_size, embed_dim, hidden_dim = 5, 16, 32\nW_embed = jax.random.normal(k2, (vocab_size, embed_dim)) * 0.1\nW_attn_q = jax.random.normal(k3, (hidden_dim, 32)) * 0.1 # \u67e5\u8be2\u6295\u5f71\n\ndef attend(h, img_feats, W_q):\n \"\"\"\u5728\u7ed9\u5b9a\u89e3\u7801\u5668\u72b6\u6001 h \u7684\u60c5\u51b5\u4e0b\u8ba1\u7b97\u56fe\u50cf\u7279\u5f81\u4e0a\u7684\u8f6f\u6ce8\u610f\u529b\u3002\"\"\"\n query = h @ W_q # (32,)\n scores = img_feats @ query # (16,)\n weights = jax.nn.softmax(scores) # (16,)\n context = weights @ img_feats # (32,)\n return context, weights\n\n# \u7b80\u5355\u7684 GRU \u98ce\u683c\u6b65\u9aa4\uff08\u4e3a\u8bf4\u660e\u76ee\u7684\uff0c\u4ec5\u7528\u7ebf\u6027 + tanh\uff09\nW_h = jax.random.normal(jax.random.PRNGKey(0), (embed_dim + 32, hidden_dim)) * 0.1\n\ndef decode_step(h, word_idx, img_feats):\n context, attn_weights = attend(h, img_feats, W_attn_q)\n word_emb = W_embed[word_idx] # (16,)\n inp = jnp.concatenate([word_emb, context]) # (48,)\n h_new = jnp.tanh(inp @ W_h) # (32,)\n return h_new, attn_weights\n\n# \u8fd0\u884c\u89e3\u7801\u5e8f\u5217\uff1a<start> -> \"a\" -> \"red\" -> \"car\" -> <end>\ntarget_seq = [0, 1, 2, 3, 4]\nh = jnp.zeros(hidden_dim)\nall_attn = []\nfor word_idx in target_seq[:-1]:\n h, attn_w = decode_step(h, word_idx, img_features)\n all_attn.append(attn_w)\n\n# \u53ef\u89c6\u5316\u6bcf\u4e00\u6b65\u7684\u6ce8\u610f\u529b\u56fe\uff08\u91cd\u5851\u4e3a 4x4 \u7f51\u683c\uff09\nwords = [\"<start>\", \"a\", \"red\", \"car\"]\nfig, axes = plt.subplots(1, 4, figsize=(14, 3))\nfor i, (ax, w) in enumerate(zip(axes, words)):\n ax.imshow(all_attn[i].reshape(4, 4), cmap='viridis')\n ax.set_title(f'\u751f\u6210\"{w}\"\u540e\\n\u5173\u6ce8\u7684\u533a\u57df')\n ax.axis('off')\nplt.suptitle('\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\u7684\u56fe\u50cf\u533a\u57df\u6ce8\u610f\u529b')\nplt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\u4fee\u6539 img_features\uff0c\u89c2\u5bdf\u6ce8\u610f\u529b\u6a21\u5f0f\u5982\u4f55\u53d8\u5316\uff01\n \u6a21\u62df\u89c6\u89c9 token \u6d41\u6c34\u7ebf\uff1a\u5c06\u56fe\u50cf\u5212\u5206\u4e3a patch\uff0c\u5c06 patch \u6295\u5f71\u5230\u5d4c\u5165\u7a7a\u95f4\uff0c\u4e0e\u6587\u672c token \u5d4c\u5165\u62fc\u63a5\uff0c\u5e76\u5728\u7ec4\u5408\u5e8f\u5217\u4e0a\u8fd0\u884c\u5355\u5c42\u81ea\u6ce8\u610f\u529b\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nkey = jax.random.PRNGKey(7)\n\n# \u521b\u5efa\u4e00\u4e2a\u5408\u6210\u7684 8x8 \"\u56fe\u50cf\"\uff0c3 \u4e2a\u901a\u9053\nk1, k2, k3, k4 = jax.random.split(key, 4)\nimage = jax.random.uniform(k1, (8, 8, 3))\n\n# \u7b2c 1 \u6b65\uff1a\u5212\u5206\u4e3a 4x4 patch -> 4 \u4e2a patch\npatch_size = 4\npatches = image.reshape(2, patch_size, 2, patch_size, 3)\npatches = patches.transpose(0, 2, 1, 3, 4).reshape(4, patch_size * patch_size * 3) # (4, 48)\nprint(f\"Patch \u6570\u91cf: {patches.shape[0]}, Patch \u7ef4\u5ea6: {patches.shape[1]}\")\n\n# \u7b2c 2 \u6b65\uff1a\u5c06 patch \u6295\u5f71\u5230\u5d4c\u5165\u7ef4\u5ea6 (d=16)\nd_model = 16\nW_patch = jax.random.normal(k2, (patches.shape[1], d_model)) * 0.1\nvisual_tokens = patches @ W_patch # (4, 16)\n\n# \u7b2c 3 \u6b65\uff1a\u521b\u5efa\u6587\u672c token \u5d4c\u5165\uff08\u6a21\u62df 3 \u4e2a\u6587\u672c token\uff09\ntext_tokens = jax.random.normal(k3, (3, d_model)) * 0.1\n\n# \u7b2c 4 \u6b65\uff1a\u62fc\u63a5\u89c6\u89c9 + \u6587\u672c token\ncombined = jnp.concatenate([visual_tokens, text_tokens], axis=0) # (7, 16)\nprint(f\"\u7ec4\u5408\u5e8f\u5217\u957f\u5ea6: {combined.shape[0]} (4 \u4e2a\u89c6\u89c9 + 3 \u4e2a\u6587\u672c)\")\n\n# \u7b2c 5 \u6b65\uff1a\u5728\u7ec4\u5408\u5e8f\u5217\u4e0a\u8fd0\u884c\u5355\u5934\u81ea\u6ce8\u610f\u529b\nW_Q = jax.random.normal(k4, (d_model, d_model)) * 0.1\nk5, k6 = jax.random.split(k4)\nW_K = jax.random.normal(k5, (d_model, d_model)) * 0.1\nW_V = jax.random.normal(k6, (d_model, d_model)) * 0.1\n\nQ = combined @ W_Q\nK = combined @ W_K\nV = combined @ W_V\nattn_scores = (Q @ K.T) / jnp.sqrt(d_model)\nattn_weights = jax.nn.softmax(attn_scores, axis=-1) # (7, 7)\n\noutput = attn_weights @ V # (7, 16)\n\n# \u53ef\u89c6\u5316\u8de8\u6a21\u6001\u6ce8\u610f\u529b\u6a21\u5f0f\nlabels = ['V1', 'V2', 'V3', 'V4', 'T1', 'T2', 'T3']\nfig, ax = plt.subplots(figsize=(6, 5))\nim = ax.imshow(attn_weights, cmap='Blues')\nax.set_xticks(range(7)); ax.set_xticklabels(labels)\nax.set_yticks(range(7)); ax.set_yticklabels(labels)\nax.set_xlabel('\u952e'); ax.set_ylabel('\u67e5\u8be2')\nax.set_title('\u81ea\u6ce8\u610f\u529b\uff1a\u89c6\u89c9\uff08V\uff09\u548c\u6587\u672c\uff08T\uff09Token')\nplt.colorbar(im, ax=ax); plt.tight_layout(); plt.show()\n# \u89c2\u5bdf\uff1a\u6587\u672c token \u5173\u6ce8\u89c6\u89c9 token\uff08\u8de8\u6a21\u6001\u6ce8\u610f\u529b\uff09\uff01\n \u5b9e\u73b0\u7528\u4e8e\u89c6\u89c9\u5b9a\u4f4d\u7684\u5750\u6807 token \u5316\u3002\u7ed9\u5b9a\u4e00\u4e2a\u8fb9\u754c\u6846\uff0c\u5c06\u5176\u8f6c\u6362\u4e3a\u79bb\u6563 token\uff1b\u7ed9\u5b9a\u79bb\u6563 token\uff0c\u91cd\u6784\u8fb9\u754c\u6846\u3002\u5728\u4e0d\u540c\u69fd\u4f4d\u5206\u8fa8\u7387\u4e0b\u53ef\u89c6\u5316\u91cf\u5316\u8bef\u5dee\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef encode_bbox(bbox, num_bins=1000):\n \"\"\"\u5c06\u8fde\u7eed\u7684\u8fb9\u754c\u6846 (x, y, w, h)\uff08\u5728 [0,1] \u8303\u56f4\u5185\uff09\u8f6c\u6362\u4e3a\u79bb\u6563 token\u3002\"\"\"\n tokens = jnp.round(jnp.array(bbox) * (num_bins - 1)).astype(jnp.int32)\n return tokens\n\ndef decode_bbox(tokens, num_bins=1000):\n \"\"\"\u5c06\u79bb\u6563 token \u8f6c\u6362\u56de\u8fde\u7eed\u7684\u8fb9\u754c\u6846\u3002\"\"\"\n return tokens.astype(jnp.float32) / (num_bins - 1)\n\n# \u771f\u5b9e\u8fb9\u754c\u6846\uff08\u5f52\u4e00\u5316\u5230 [0, 1]\uff09\ngt_bbox = jnp.array([0.123, 0.456, 0.333, 0.222])\n\n# \u6d4b\u8bd5\u4e0d\u540c\u69fd\u4f4d\u5206\u8fa8\u7387\u4e0b\u7684\u91cf\u5316\nbin_sizes = [10, 50, 100, 500, 1000]\nerrors = []\nfor n_bins in bin_sizes:\n tokens = encode_bbox(gt_bbox, n_bins)\n reconstructed = decode_bbox(tokens, n_bins)\n error = jnp.max(jnp.abs(gt_bbox - reconstructed))\n errors.append(float(error))\n print(f\"\u69fd\u4f4d\u6570={n_bins:>5d} | Token={tokens} | \"\n f\"\u91cd\u6784={reconstructed} | \u6700\u5927\u8bef\u5dee={error:.6f}\")\n\nfig, ax = plt.subplots(figsize=(8, 4))\nax.plot(bin_sizes, errors, 'o-', color='#e74c3c', linewidth=2, markersize=8)\nax.set_xlabel('\u69fd\u4f4d\u6570'); ax.set_ylabel('\u6700\u5927\u91cf\u5316\u8bef\u5dee')\nax.set_title('\u8fb9\u754c\u6846\u91cf\u5316\u8bef\u5dee vs \u69fd\u4f4d\u5206\u8fa8\u7387')\nax.set_xscale('log'); ax.set_yscale('log')\nax.grid(True, alpha=0.3); plt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\uff1a\u69fd\u4f4d\u975e\u5e38\u5c11\u65f6\uff08\u5982 5\uff09\u4f1a\u53d1\u751f\u4ec0\u4e48\uff1f\u8bef\u5dee\u5728\u4f55\u65f6\u662f\u53ef\u63a5\u53d7\u7684\uff1f\n \u56fe\u50cf\u4e0e\u89c6\u9891\u8bcd\u5143\u5316\u5c06\u8fde\u7eed\u7684\u89c6\u89c9\u6570\u636e\u8f6c\u6362\u4e3a\u79bb\u6563\u7684\u8bcd\u5143\u5e8f\u5217\uff0c\u4f7f Transformer \u80fd\u591f\u50cf\u5904\u7406\u6587\u672c\u4e00\u6837\u5904\u7406\u5b83\u4eec\u3002\u672c\u8282\u6db5\u76d6 VQ-VAE\u3001VQ-GAN\u3001\u7801\u672c\u5b66\u4e60\u3001DALL-E \u7684 dVAE\u3001\u89c6\u9891\u8bcd\u5143\u5316\u4ee5\u53ca\u514d\u67e5\u8be2\u8bcd\u5143\u5316\u3002
"},{"location":"chapter%2010%3A%20multimodal%20learning/03.%20image%20and%20video%20tokenisation/#_2","title":"\u4e3a\u4ec0\u4e48\u8981\u5bf9\u56fe\u50cf\u8fdb\u884c\u8bcd\u5143\u5316","text":"\u628a\u8bed\u8a00\u60f3\u8c61\u6210\u4e00\u4e2a\u6709\u9650\u7684\u5b57\u6bcd\u8868\uff1a\u82f1\u8bed\u5927\u7ea6\u6709 26 \u4e2a\u5b57\u6bcd\uff0c\u73b0\u4ee3\u8bed\u8a00\u6a21\u578b\u5c06\u6587\u672c\u5207\u5206\u4e3a 30,000 \u5230 100,000 \u4e2a\u5b50\u8bcd\u8bcd\u5143\u3002\u6bcf\u4e2a\u53e5\u5b50\u90fd\u53d8\u6210\u4e00\u4e32\u79bb\u6563\u7b26\u53f7\uff0cTransformer \u53ef\u4ee5\u9010\u4e2a\u9884\u6d4b\u3002\u800c\u56fe\u50cf\u5b58\u5728\u4e8e\u8fde\u7eed\u7684\u9ad8\u7ef4\u7a7a\u95f4\u4e2d\uff1a\u4e00\u5f20 256\u00d7256 \u7684 RGB \u56fe\u50cf\u5c31\u662f \\(\\mathbb{R}^{256 \\times 256 \\times 3} \\approx \\mathbb{R}^{196{,}608}\\) \u4e2d\u7684\u4e00\u4e2a\u70b9\u3002\u5982\u679c\u4f60\u5e0c\u671b\u8bed\u8a00\u6a21\u578b\u7528\u4e0e\u8bf4\u82f1\u8bed\u540c\u6837\u7684\u673a\u5236\u6765\"\u8bf4\"\u56fe\u50cf\uff0c\u5c31\u9700\u8981\u5c06\u8fd9\u4e9b\u8fde\u7eed\u7684\u50cf\u7d20\u6570\u7ec4\u8f6c\u6362\u4e3a\u4e00\u4e32\u53ef\u7ba1\u7406\u7684\u79bb\u6563\u8bcd\u5143\uff0c\u8fd9\u4e9b\u8bcd\u5143\u6765\u81ea\u4e00\u4e2a\u6709\u9650\u7684\u8bcd\u6c47\u8868\u3002\u8fd9\u79cd\u8f6c\u6362\u5c31\u662f\u56fe\u50cf\u8bcd\u5143\u5316\u3002
\u60f3\u8c61\u4f60\u662f\u4e00\u4f4d\u9a6c\u8d5b\u514b\u827a\u672f\u5bb6\u3002\u4f60\u6ca1\u6709\u65e0\u9650\u591a\u79cd\u74f7\u7816\u8272\u8c03\uff0c\u53ea\u6709\u4e00\u4e2a\u56fa\u5b9a\u7684\u8c03\u8272\u677f\uff0c\u6bd4\u5982\u8bf4 8192 \u79cd\u4e0d\u540c\u7684\u74f7\u7816\u989c\u8272\u3002\u8981\u518d\u73b0\u4e00\u5f20\u7167\u7247\u4f5c\u4e3a\u9a6c\u8d5b\u514b\uff0c\u4f60\u5fc5\u987b (1) \u786e\u5b9a\u6bcf\u4e2a\u74f7\u7816\u4ee3\u8868\u7167\u7247\u7684\u54ea\u4e2a\u533a\u57df\uff0c(2) \u4e3a\u6bcf\u4e2a\u533a\u57df\u9009\u62e9\u6700\u63a5\u8fd1\u7684\u74f7\u7816\u989c\u8272\uff0c(3) \u63a5\u53d7\u4e00\u4e9b\u7ec6\u8282\u7684\u4e22\u5931\uff0c\u4f46\u6574\u4f53\u753b\u9762\u4ecd\u7136\u53ef\u8fa8\u8ba4\u3002\u56fe\u50cf\u8bcd\u5143\u5316\u505a\u7684\u6b63\u662f\u8fd9\u4ef6\u4e8b\uff1a\u7f16\u7801\u5668\u5c06\u7a7a\u95f4\u5757\u538b\u7f29\u4e3a\u6f5c\u5728\u5411\u91cf\uff0c\u7801\u672c\u5c06\u6bcf\u4e2a\u5411\u91cf\u6620\u5c04\u5230\u5176\u6700\u8fd1\u7684\u6761\u76ee\uff0c\u7ed3\u679c\u662f\u4e00\u4e2a\u6574\u6570\u7d22\u5f15\u7f51\u683c\uff08\u6bcf\u4e2a\u5757\u5bf9\u5e94\u4e00\u4e2a\u7d22\u5f15\uff09\uff0c\u79bb\u6563\u6a21\u578b\u53ef\u4ee5\u5904\u7406\u5b83\u3002
\u8bcd\u5143\u5316\u7684\u597d\u5904\u6709\u4e09\u65b9\u9762\u3002\u9996\u5148\uff0c\u5b83\u5927\u5e45\u538b\u7f29\u4e86\u56fe\u50cf\uff1a\u4e00\u5f20 256\u00d7256 \u7684\u56fe\u50cf\u53ef\u80fd\u53d8\u6210\u4e00\u4e2a 16\u00d716 \u7684\u8bcd\u5143\u7f51\u683c\uff0c\u5e8f\u5217\u957f\u5ea6\u4ece 65,536 \u4e2a\u50cf\u7d20\u51cf\u5c11\u5230 256 \u4e2a\u8bcd\u5143\uff0c\u8fd9\u5bf9\u4e8e\u6210\u672c\u968f\u5e8f\u5217\u957f\u5ea6\u5448\u4e8c\u6b21\u65b9\u589e\u957f\u7684\u6ce8\u610f\u529b\u6a21\u578b\u6765\u8bf4\u662f\u53ef\u884c\u7684\u3002\u5176\u6b21\uff0c\u5b83\u7edf\u4e00\u4e86\u8868\u793a\u5f62\u5f0f\uff1a\u6587\u672c\u8bcd\u5143\u548c\u56fe\u50cf\u8bcd\u5143\u4f4d\u4e8e\u540c\u4e00\u4e2a\u79bb\u6563\u8bcd\u6c47\u8868\u4e2d\uff0c\u4f7f\u5f97\u5355\u4e2a\u81ea\u56de\u5f52 Transformer \u53ef\u4ee5\u751f\u6210\u4ea4\u7ec7\u7684\u6587\u672c\u548c\u56fe\u50cf\u3002\u7b2c\u4e09\uff0c\u5b83\u65bd\u52a0\u4e86\u4e00\u4e2a\u6709\u7528\u7684\u74f6\u9888\uff0c\u8feb\u4f7f\u6a21\u578b\u5b66\u4e60\u8bed\u4e49\u4e0a\u6709\u610f\u4e49\u7684\u7f16\u7801\uff0c\u800c\u4e0d\u662f\u8bb0\u5fc6\u50cf\u7d20\u566a\u58f0\u3002
\u6b63\u5982\u6211\u4eec\u5728\u7b2c 6 \u7ae0\u4e2d\u770b\u5230\u7684\uff0c\u6807\u51c6\u53d8\u5206\u81ea\u7f16\u7801\u5668\uff08VAE\uff09\u5c06\u8f93\u5165\u7f16\u7801\u4e3a\u8fde\u7eed\u6f5c\u5728\u5206\u5e03\uff0c\u5e76\u4ece\u8be5\u5206\u5e03\u4e2d\u91c7\u6837\u518d\u89e3\u7801\u4e3a\u91cd\u5efa\u7ed3\u679c\u3002\u6f5c\u5728\u7a7a\u95f4\u662f\u8fde\u7eed\u7684\uff0c\u8fd9\u4f7f\u5f97\u5c06\u5176\u8f93\u5165\u79bb\u6563\u5e8f\u5217\u6a21\u578b\u53d8\u5f97\u56f0\u96be\u3002\u5411\u91cf\u91cf\u5316\u53d8\u5206\u81ea\u7f16\u7801\u5668\uff08VQ-VAE\uff09\uff0c\u7531 van den Oord \u7b49\u4eba\uff082017\uff09\u63d0\u51fa\uff0c\u901a\u8fc7\u5f15\u5165\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684\u5d4c\u5165\u5411\u91cf\u7801\u672c\uff0c\u5e76\u5c06\u6bcf\u4e2a\u7f16\u7801\u5668\u8f93\u51fa\u6620\u5c04\u5230\u5176\u6700\u8fd1\u7684\u7801\u672c\u6761\u76ee\uff0c\u7528\u79bb\u6563\u6f5c\u5728\u8868\u793a\u53d6\u4ee3\u4e86\u8fde\u7eed\u6f5c\u5728\u8868\u793a\u3002
\u60f3\u8c61\u4e00\u4e2a\u85cf\u4e66\u5ba4\uff0c\u91cc\u9762\u6709\u6070\u597d \\(K\\) \u4e2a\u8d34\u6709\u6807\u7b7e\u7684\u4e66\u67b6\u3002\u5f53\u4e00\u672c\u65b0\u4e66\uff08\u7f16\u7801\u5668\u8f93\u51fa\uff09\u5230\u8fbe\u65f6\uff0c\u56fe\u4e66\u7ba1\u7406\u5458\u5c06\u5b83\u653e\u5728\u4e0e\u5176\u73b0\u6709\u4e66\u7c4d\uff08\u7801\u672c\u5411\u91cf\uff09\u6700\u76f8\u4f3c\u7684\u4e66\u67b6\u4e0a\uff0c\u5e76\u8bb0\u5f55\u4e0b\u4e66\u67b6\u7f16\u53f7\u3002\u4e4b\u540e\uff0c\u8981\u53d6\u56de\u8fd9\u672c\u4e66\uff0c\u4f60\u53ea\u9700\u8981\u4e66\u67b6\u7f16\u53f7\uff1a\u90a3\u4e2a\u4e66\u67b6\u4e0a\u7684\u7801\u672c\u6761\u76ee\u5c31\u662f\u4e00\u4e2a\u8db3\u591f\u597d\u7684\u66ff\u4ee3\u3002\u8fd9\u5c31\u662f\u5411\u91cf\u91cf\u5316\u3002
\u5f62\u5f0f\u4e0a\uff0cVQ-VAE \u6709\u4e09\u4e2a\u7ec4\u4ef6\uff1a
\u7f16\u7801\u5668 \\(E\\)\uff0c\u5c06\u8f93\u5165\u56fe\u50cf \\(\\mathbf{x} \\in \\mathbb{R}^{H \\times W \\times 3}\\) \u6620\u5c04\u5230\u8fde\u7eed\u6f5c\u5728\u5411\u91cf\u7684\u7a7a\u95f4\u7f51\u683c \\(\\mathbf{z}_e = E(\\mathbf{x}) \\in \\mathbb{R}^{h \\times w \\times d}\\)\uff0c\u5176\u4e2d \\(h \\times w\\) \u662f\u964d\u91c7\u6837\u540e\u7684\u7a7a\u95f4\u5206\u8fa8\u7387\uff0c\\(d\\) \u662f\u5d4c\u5165\u7ef4\u5ea6\u3002
\u7801\u672c \\(\\mathcal{C} = \\{\\mathbf{e}_1, \\mathbf{e}_2, \\ldots, \\mathbf{e}_K\\} \\subset \\mathbb{R}^d\\)\uff0c\u5305\u542b \\(K\\) \u4e2a\u53ef\u5b66\u4e60\u7684\u5d4c\u5165\u5411\u91cf\u3002\u5178\u578b\u7801\u672c\u5927\u5c0f\u8303\u56f4\u4e3a 512 \u5230 16,384 \u4e2a\u6761\u76ee\u3002
\u89e3\u7801\u5668 \\(D\\)\uff0c\u4ece\u91cf\u5316\u540e\u7684\u6f5c\u5728\u8868\u793a\u91cd\u5efa\u56fe\u50cf\u3002
\u91cf\u5316\u6b65\u9aa4\u5c06\u6bcf\u4e2a\u7f16\u7801\u5668\u8f93\u51fa \\(\\mathbf{z}_e(\\mathbf{x})\\) \u5728\u7a7a\u95f4\u4f4d\u7f6e \\((i, j)\\) \u5904\u66ff\u6362\u4e3a\u6700\u8fd1\u7684\u7801\u672c\u6761\u76ee\uff1a
\u5176\u4e2d \\(\\text{sg}(\\cdot)\\) \u662f\u505c\u6b62\u68af\u5ea6\u7b97\u5b50\u3002\u5728\u524d\u5411\u4f20\u64ad\u4e2d\uff0c\u8ba1\u7b97\u7ed3\u679c\u4e3a \\(\\mathbf{z}_q\\)\uff1b\u5728\u53cd\u5411\u4f20\u64ad\u4e2d\uff0c\u68af\u5ea6\u4ec5\u6d41\u7ecf \\(\\mathbf{z}_e\\) \u9879\u3002
\u5b8c\u6574\u7684 VQ-VAE \u635f\u5931\u5305\u542b\u4e09\u9879\uff1a
\u91cd\u5efa\u635f\u5931\u8bad\u7ec3\u7f16\u7801\u5668\u548c\u89e3\u7801\u5668\u5fe0\u5b9e\u5730\u518d\u73b0\u8f93\u5165\u3002\u7801\u672c\u635f\u5931\uff08\u4e5f\u79f0\u4e3a VQ \u635f\u5931\uff09\u5c06\u7801\u672c\u5411\u91cf\u62c9\u5411\u7f16\u7801\u5668\u8f93\u51fa\uff1b\u6ce8\u610f \\(\\text{sg}(\\mathbf{z}_e)\\) \u610f\u5473\u7740\u7f16\u7801\u5668\u4e0d\u4f1a\u4ece\u8fd9\u4e00\u9879\u63a5\u6536\u68af\u5ea6\uff0c\u56e0\u6b64\u5b83\u53ea\u66f4\u65b0\u7801\u672c\u3002\u627f\u8bfa\u635f\u5931\u5219\u76f8\u53cd\uff1a\u5b83\u9f13\u52b1\u7f16\u7801\u5668\u8f93\u51fa\u4fdd\u6301\u63a5\u8fd1\u7801\u672c\u5411\u91cf\uff0c\u9632\u6b62\u7f16\u7801\u5668\"\u8fdc\u79bb\"\u7801\u672c\u3002\u8d85\u53c2\u6570 \\(\\beta\\)\uff08\u901a\u5e38\u4e3a 0.25\uff09\u63a7\u5236\u7801\u672c\u635f\u5931\u548c\u627f\u8bfa\u635f\u5931\u4e4b\u95f4\u7684\u5e73\u8861\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u7801\u672c\u901a\u5e38\u4f7f\u7528\u6307\u6570\u79fb\u52a8\u5e73\u5747\uff08EMA\uff09\u800c\u4e0d\u662f\u68af\u5ea6\u4e0b\u964d\u6765\u66f4\u65b0\uff0c\u8fd9\u6837\u66f4\u7a33\u5b9a\u3002\u4ee4 \\(\\mathbf{n}_k\\) \u4e3a\u5206\u914d\u7ed9\u7801\u672c\u6761\u76ee \\(k\\) \u7684\u7f16\u7801\u5668\u8f93\u51fa\u8ba1\u6570\uff0c\\(\\mathbf{s}_k\\) \u4e3a\u5b83\u4eec\u7684\u548c\u3002EMA \u66f4\u65b0\u4e3a\uff1a
VQ-VAE \u4e00\u4e2a\u81ed\u540d\u662d\u8457\u7684\u5931\u8d25\u6a21\u5f0f\u662f\u7801\u672c\u574d\u584c\uff08\u4e5f\u79f0\u4e3a\u7d22\u5f15\u574d\u584c\uff09\uff1a\u6a21\u578b\u53ea\u5b66\u4f1a\u4f7f\u7528 \\(K\\) \u4e2a\u7801\u672c\u6761\u76ee\u4e2d\u7684\u4e00\u5c0f\u90e8\u5206\uff0c\u5bfc\u81f4\u5927\u591a\u6570\u6761\u76ee\"\u6b7b\u4ea1\"\u3002\u60f3\u8c61\u4e00\u4e2a\u56fe\u4e66\u9986\uff0c90% \u7684\u4e66\u67b6\u662f\u7a7a\u7684\uff0c\u56e0\u4e3a\u56fe\u4e66\u7ba1\u7406\u5458\u603b\u662f\u628a\u4e66\u9001\u5230\u540c\u6837\u7684\u51e0\u4e2a\u70ed\u95e8\u4e66\u67b6\u4e0a\u3002\u8fd9\u6d6a\u8d39\u4e86\u8868\u793a\u80fd\u529b\u3002
\u7801\u672c\u574d\u584c\u7684\u53d1\u751f\u662f\u56e0\u4e3a\u7f16\u7801\u5668\u3001\u7801\u672c\u548c\u89e3\u7801\u5668\u5728\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\u5171\u540c\u9002\u5e94\u3002\u5982\u679c\u4e00\u4e2a\u6761\u76ee\u5728\u51e0\u4e2a\u6279\u6b21\u4e2d\u90fd\u6ca1\u6709\u88ab\u9009\u4e2d\uff0c\u5b83\u5c31\u4f1a\u6f02\u79bb\u7f16\u7801\u5668\u6d41\u5f62\uff0c\u4f7f\u5176\u66f4\u4e0d\u53ef\u80fd\u88ab\u9009\u4e2d\uff0c\u4ece\u800c\u5f62\u6210\u6b63\u53cd\u9988\u5faa\u73af\u3002
\u7f13\u89e3\u7801\u672c\u574d\u584c\u7684\u51e0\u79cd\u6280\u672f\uff1a
VQ-VAE \u80fd\u4ea7\u751f\u4e0d\u9519\u7684\u91cd\u5efa\u6548\u679c\uff0c\u4f46\u50cf\u7d20\u7ea7\u7684 \\(\\ell_2\\) \u635f\u5931\u5f80\u5f80\u4f1a\u4ea7\u751f\u6a21\u7cca\u7684\u8f93\u51fa\uff0c\u56e0\u4e3a\u5b83\u5bf9\u6bcf\u4e2a\u50cf\u7d20\u504f\u5dee\u90fd\u540c\u7b49\u60e9\u7f5a\uff0c\u5728\u5408\u7406\u7684\u7ec6\u8282\u4e0a\u53d6\u5e73\u5747\u800c\u4e0d\u662f\u9009\u62e9\u6e05\u6670\u7684\u7ec6\u8282\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u8981\u6c42\u67d0\u4eba\u753b\u4e00\u5f20\u8138\uff0c\u4f7f\u5f97\u4e0e\u6240\u6709\u53ef\u80fd\u7684\u8138\u7684\u5e73\u5747\u5dee\u5f02\u6700\u5c0f\u2014\u2014\u4ed6\u4eec\u4f1a\u753b\u51fa\u4e00\u5f20\u6a21\u7cca\u7684\u5e73\u5747\u8138\uff0c\u800c\u4e0d\u662f\u4e00\u5f20\u6e05\u6670\u7684\u7279\u5b9a\u4eba\u8138\u3002
VQ-GAN\uff08Esser \u7b49\u4eba\uff0c2021\uff09\u901a\u8fc7\u5c06 VQ-VAE \u6846\u67b6\u4e0e\u751f\u6210\u5bf9\u6297\u7f51\u7edc\uff08\u7b2c 6 \u7ae0\uff09\u4e2d\u7684\u5224\u522b\u5668\u76f8\u7ed3\u5408\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002\u5224\u522b\u5668\u662f\u4e00\u4e2a\u57fa\u4e8e\u5757\u7684\u5377\u79ef\u7f51\u7edc\uff0c\u7528\u4e8e\u5224\u65ad\u5c40\u90e8\u56fe\u50cf\u5757\u662f\u771f\uff08\u6765\u81ea\u8bad\u7ec3\u6570\u636e\uff09\u8fd8\u662f\u5047\uff08\u6765\u81ea\u89e3\u7801\u5668\uff09\u3002\u8fd9\u79cd\u5bf9\u6297\u635f\u5931\u9f13\u52b1\u89e3\u7801\u5668\u4ea7\u751f\u611f\u77e5\u4e0a\u6e05\u6670\u3001\u903c\u771f\u7684\u7eb9\u7406\uff0c\u800c\u4e0d\u662f\u50cf\u7d20\u7ea7\u7684\u5e73\u5747\u503c\u3002
VQ-GAN \u76ee\u6807\u51fd\u6570\u5728 VQ-VAE \u635f\u5931\u7684\u57fa\u7840\u4e0a\u589e\u52a0\u4e86\u4e24\u9879\uff1a
\u5176\u4e2d \\(\\phi_l\\) \u8868\u793a\u9884\u8bad\u7ec3\u7f51\u7edc\u5728\u7b2c \\(l\\) \u5c42\u7684\u7279\u5f81\u56fe\u3002\u8fd9\u4e2a\u635f\u5931\u6355\u6349\u7684\u662f\u9ad8\u5c42\u7ed3\u6784\u76f8\u4f3c\u6027\uff0c\u800c\u975e\u50cf\u7d20\u7ea7\u7cbe\u5ea6\u3002
\u6743\u91cd \\(\\lambda_\\text{adv}\\) \u88ab\u81ea\u9002\u5e94\u5730\u8bbe\u7f6e\uff0c\u4f7f\u5f97\u5bf9\u6297\u68af\u5ea6\u548c\u91cd\u5efa\u68af\u5ea6\u4fdd\u6301\u5e73\u8861\uff0c\u9632\u6b62\u5728\u8bad\u7ec3\u65e9\u671f\u91cd\u5efa\u6548\u679c\u8fd8\u5f88\u5dee\u65f6\u5bf9\u6297\u635f\u5931\u5360\u4e3b\u5bfc\u3002
\u5355\u4e2a\u7801\u672c\u5bf9\u91cd\u5efa\u8d28\u91cf\u65bd\u52a0\u4e86\u4e00\u4e2a\u786c\u4e0a\u9650\uff1a\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u6070\u597d\u7531\u4e00\u4e2a\u7801\u672c\u5411\u91cf\u8868\u793a\uff0c\u4efb\u4f55\u6bd4\u7801\u672c\u6240\u80fd\u8868\u8fbe\u7684\u66f4\u7cbe\u7ec6\u7684\u7ec6\u8282\u90fd\u4f1a\u4e22\u5931\u3002\u60f3\u8c61\u7528\u56fa\u5b9a\u8c03\u8272\u677f\u4e2d\u7684\u4e00\u4e2a\u8bcd\u6765\u63cf\u8ff0\u4e00\u79cd\u989c\u8272\uff1a\"\u9752\u8272\"\u5f88\u63a5\u8fd1\u4f46\u4e0d\u7cbe\u786e\u3002\u5982\u679c\u4f60\u80fd\u6dfb\u52a0\u4e00\u4e2a\u7ec6\u5316\u63cf\u8ff0\u2014\u2014\"\u9752\u8272\uff0c\u4f46\u7a0d\u5fae\u504f\u84dd\u4e00\u70b9\uff0c\u4eae\u4e00\u70b9\"\u2014\u2014\u4f60\u5c31\u80fd\u5f97\u5230\u66f4\u63a5\u8fd1\u7684\u7ed3\u679c\u3002
\u6b8b\u5dee\u91cf\u5316\uff08RQ\uff09\u8fed\u4ee3\u5730\u5e94\u7528\u4e86\u8fd9\u4e00\u601d\u60f3\u3002\u5728\u7b2c\u4e00\u6b21\u91cf\u5316\u6b65\u9aa4\u4ea7\u751f \\(\\mathbf{z}_q^{(1)}\\) \u4e4b\u540e\uff0c\u8ba1\u7b97\u6b8b\u5dee \\(\\mathbf{r}^{(1)} = \\mathbf{z}_e - \\mathbf{z}_q^{(1)}\\)\uff0c\u7136\u540e\u5bf9\u6b8b\u5dee\u4f7f\u7528\u7b2c\u4e8c\u4e2a\u7801\u672c\u8fdb\u884c\u91cf\u5316\u5f97\u5230 \\(\\mathbf{z}_q^{(2)}\\)\uff0c\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5171 \\(T\\) \u4e2a\u5c42\u7ea7\uff1a
\u6700\u7ec8\u7684\u91cf\u5316\u8868\u793a\u4e3a \\(\\hat{\\mathbf{z}} = \\sum_{t=1}^{T} \\mathbf{z}_q^{(t)}\\)\u3002\u4f7f\u7528 \\(T\\) \u4e2a\u5c42\u7ea7\uff0c\u6bcf\u4e2a\u5c42\u7ea7\u7801\u672c\u5927\u5c0f\u4e3a \\(K\\)\uff0c\u6709\u6548\u8bcd\u6c47\u8868\u5927\u5c0f\u4e3a \\(K^T\\)\uff0c\u4f46\u4f60\u53ea\u9700\u8981\u5b58\u50a8 \\(T \\times K\\) \u4e2a\u5411\u91cf\uff0c\u800c\u4e0d\u662f \\(K^T\\) \u4e2a\u3002\u4f8b\u5982\uff0c8 \u4e2a\u5c42\u7ea7\uff0c\\(K = 1024\\)\uff0c\u6709\u6548\u6761\u76ee\u6570\u4e3a \\(1024^8 \\approx 10^{24}\\)\uff0c\u800c\u53ea\u5b58\u50a8\u4e86 8192 \u4e2a\u5411\u91cf\u3002
\u6bcf\u4e2a\u540e\u7eed\u5c42\u7ea7\u6355\u6349\u66f4\u7cbe\u7ec6\u7684\u7ec6\u8282\uff1a\u7b2c\u4e00\u4e2a\u7801\u672c\u6355\u6349\u7c97\u7565\u7ed3\u6784\uff0c\u7b2c\u4e8c\u4e2a\u6355\u6349\u4e2d\u9891\u4fee\u6b63\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002\u8fd9\u7c7b\u4f3c\u4e8e JPEG \u4e2d\u7684\u9010\u6b21\u903c\u8fd1\u6216\u7f51\u9875\u56fe\u50cf\u4e2d\u7684\u6e10\u8fdb\u5f0f\u6e32\u67d3\uff0c\u5148\u51fa\u73b0\u7c97\u7565\u7248\u672c\uff0c\u7136\u540e\u9010\u6b65\u586b\u5145\u7ec6\u8282\u3002
\u591a\u5c3a\u5ea6\u7801\u672c\u901a\u8fc7\u5728\u4e0d\u540c\u7a7a\u95f4\u5206\u8fa8\u7387\u4e0a\u64cd\u4f5c\u6765\u6269\u5c55\u8fd9\u4e00\u601d\u60f3\u3002\u4e0d\u662f\u91cd\u590d\u91cf\u5316\u540c\u4e00\u4e2a\u7a7a\u95f4\u7f51\u683c\uff0c\u800c\u662f\u5728\u591a\u4e2a\u5c3a\u5ea6\u4e0a\u8fdb\u884c\u91cf\u5316\uff1a\u7c97\u7c92\u5ea6\u7f51\u683c\u6355\u6349\u5168\u5c40\u7ed3\u6784\uff0c\u7ec6\u7c92\u5ea6\u7f51\u683c\u6355\u6349\u5c40\u90e8\u7ec6\u8282\u3002\u8fd9\u4e0e\u7b2c 8 \u7ae0\u76ee\u6807\u68c0\u6d4b\u90e8\u5206\u4e2d\u7684\u7279\u5f81\u91d1\u5b57\u5854\u601d\u60f3\u76f8\u5173\uff0c\u5176\u4e2d\u4e0d\u540c\u5c3a\u5ea6\u7684\u7279\u5f81\u6355\u6349\u4e0d\u540c\u5c42\u6b21\u7684\u7ec6\u8282\u3002
\u4e58\u79ef\u91cf\u5316\u662f\u4e00\u79cd\u76f8\u5173\u6280\u672f\uff0c\u5c06 \\(d\\) \u7ef4\u6f5c\u5728\u5411\u91cf\u62c6\u5206\u4e3a \\(M\\) \u4e2a\u7ef4\u5ea6\u4e3a \\(d/M\\) \u7684\u5b50\u5411\u91cf\uff0c\u6bcf\u4e2a\u5b50\u5411\u91cf\u4f7f\u7528\u81ea\u5df1\u7684\u7801\u672c\u72ec\u7acb\u91cf\u5316\u3002\u8fd9\u4f7f\u5f97\u6709\u6548\u8bcd\u6c47\u8868\u8fbe\u5230 \\(K^M\\)\uff0c\u540c\u65f6\u53ea\u5b58\u50a8 \\(M \\times K\\) \u4e2a\u5411\u91cf\u3002\u4e58\u79ef\u91cf\u5316\u5e7f\u6cdb\u5e94\u7528\u4e8e\u8fd1\u4f3c\u6700\u8fd1\u90bb\u641c\u7d22\uff08\u7b2c 13 \u7ae0\uff09\uff0c\u5e76\u5df2\u88ab\u9002\u914d\u7528\u4e8e\u56fe\u50cf\u8bcd\u5143\u5316\u3002
\u6709\u9650\u6807\u91cf\u91cf\u5316\uff08FSQ\uff09\uff0c\u7531 Mentzer \u7b49\u4eba\uff082023\uff09\u63d0\u51fa\uff0c\u91c7\u53d6\u4e86\u4e00\u79cd\u5b8c\u5168\u4e0d\u540c\u7684\u65b9\u6cd5\uff1a\u4e0d\u662f\u5b66\u4e60\u4e00\u4e2a\u7801\u672c\uff0c\u800c\u662f\u7b80\u5355\u5730\u5c06\u6f5c\u5728\u5411\u91cf\u7684\u6bcf\u4e2a\u7ef4\u5ea6\u56db\u820d\u4e94\u5165\u5230\u4e00\u7ec4\u56fa\u5b9a\u6574\u6570\u7ea7\u522b\u4e2d\u7684\u4e00\u4e2a\uff08\u4f8b\u5982 \\(\\{-2, -1, 0, 1, 2\\}\\)\uff09\u3002\u6bcf\u7ef4 \\(L\\) \u4e2a\u7ea7\u522b\uff0c\\(d\\) \u4e2a\u7ef4\u5ea6\uff0c\u9690\u542b\u7801\u672c\u5927\u5c0f\u4e3a \\(L^d\\)\u3002FSQ \u5b8c\u5168\u907f\u514d\u4e86\u7801\u672c\u574d\u584c\uff0c\u56e0\u4e3a\u6ca1\u6709\u53ef\u5b66\u4e60\u7684\u7801\u672c\u5411\u91cf\uff0c\u53ea\u6709\u88ab\u786e\u5b9a\u6027\u56db\u820d\u4e94\u5165\u7684\u53ef\u5b66\u4e60\u7f16\u7801\u5668\u8f93\u51fa\u3002\u76f4\u901a\u4f30\u8ba1\u5668\u5904\u7406\u4e86\u56db\u820d\u4e94\u5165\u7684\u4e0d\u53ef\u5fae\u6027\u3002
\u89c6\u9891\u5728\u56fe\u50cf\u7684\u4e8c\u7ef4\u7a7a\u95f4\u7ef4\u5ea6\u4e0a\u589e\u52a0\u4e86\u7b2c\u4e09\u4e2a\u8f74\u2014\u2014\u65f6\u95f4\u3002\u89c6\u9891\u662f\u4e00\u7cfb\u5217\u5e27\uff0c\u901a\u5e38\u4e3a\u6bcf\u79d2 24\u201330 \u5e27\uff0c\u76f8\u90bb\u5e27\u4e4b\u95f4\u9ad8\u5ea6\u5197\u4f59\uff0c\u56e0\u4e3a\u5728 33 \u6beb\u79d2\u5185\u89c6\u89c9\u4e16\u754c\u4e0d\u4f1a\u53d1\u751f\u5267\u70c8\u53d8\u5316\u3002\u89c6\u9891\u8bcd\u5143\u5316\u5229\u7528\u8fd9\u79cd\u65f6\u95f4\u5197\u4f59\u6765\u5b9e\u73b0\u6bd4\u72ec\u7acb\u8bcd\u5143\u5316\u6bcf\u5e27\u9ad8\u5f97\u591a\u7684\u538b\u7f29\u7387\u3002
\u628a\u89c6\u9891\u538b\u7f29\u60f3\u8c61\u6210\u4e00\u5e45\u7ffb\u9875\u4e66\u3002\u5982\u679c\u6bcf\u4e00\u9875\u90fd\u4ece\u5934\u753b\u8d77\uff0c\u4f60\u9700\u8981\u6570\u5343\u5f20\u7cbe\u7ec6\u7684\u7ed8\u56fe\u3002\u4f46\u5927\u591a\u6570\u9875\u9762\u4e0e\u76f8\u90bb\u9875\u9762\u51e0\u4e4e\u76f8\u540c\uff0c\u6240\u4ee5\u4f60\u53ef\u4ee5\u6bcf 10 \u9875\u753b\u4e00\u4e2a\u5b8c\u6574\u7684\"\u5173\u952e\u5e27\"\uff0c\u53ea\u8bb0\u5f55\u4e2d\u95f4\u9875\u9762\u4e0a\u7684\u5fae\u5c0f\u53d8\u5316\u3002\u89c6\u9891\u8bcd\u5143\u5316\u5668\u81ea\u52a8\u5b66\u4f1a\u4e86\u8fd9\u4e2a\u6280\u5de7\u3002
\u5c06 VQ-VAE \u6269\u5c55\u5230\u89c6\u9891\u7684\u6700\u76f4\u63a5\u65b9\u5f0f\u662f 3D VQ-VAE\uff0c\u5b83\u5c06\u7f16\u7801\u5668\u548c\u89e3\u7801\u5668\u4e2d\u7684 2D \u5377\u79ef\u66ff\u6362\u4e3a\u540c\u65f6\u5728\u7a7a\u95f4\u548c\u65f6\u95f4\u7ef4\u5ea6\u4e0a\u64cd\u4f5c\u7684 3D \u5377\u79ef\u3002\u5982\u679c\u7f16\u7801\u5668\u5728\u7a7a\u95f4\u4e0a\u964d\u91c7\u6837 \\(f_s\\) \u500d\uff0c\u5728\u65f6\u95f4\u4e0a\u964d\u91c7\u6837 \\(f_t\\) \u500d\uff0c\u5219 \\(T \\times H \\times W\\) \u7684\u89c6\u9891\u7247\u6bb5\u53d8\u4e3a \\((T/f_t) \\times (H/f_s) \\times (W/f_s)\\) \u7684\u8bcd\u5143\u7f51\u683c\u3002
\u4f8b\u5982\uff0c\\(f_s = 16\\) \u4e14 \\(f_t = 4\\) \u65f6\uff0c\u4e00\u4e2a 16 \u5e27\u7684 256\u00d7256 \u89c6\u9891\u7247\u6bb5\u53d8\u4e3a \\(4 \\times 16 \\times 16 = 1024\\) \u7684\u8bcd\u5143\u5e8f\u5217\u3002\u8fd9\u5bf9 Transformer \u8fdb\u884c\u81ea\u56de\u5f52\u5efa\u6a21\u6765\u8bf4\u5df2\u7ecf\u8db3\u591f\u7d27\u51d1\uff0c\u800c\u539f\u59cb\u50cf\u7d20\u6570\u5c06\u662f \\(16 \\times 256 \\times 256 \\times 3 \\approx 310\\) \u4e07\u4e2a\u6570\u503c\u3002
3D \u5377\u79ef\u8054\u5408\u5b66\u4e60\u7a7a\u95f4\u548c\u65f6\u95f4\u7279\u5f81\u3002\u65e9\u671f\u5c42\u6355\u6349\u5c40\u90e8\u8fd0\u52a8\uff08\u5e27\u95f4\u79fb\u52a8\u7684\u8fb9\u7f18\uff09\uff0c\u800c\u66f4\u6df1\u5c42\u6355\u6349\u9ad8\u5c42\u52a8\u6001\uff08\u7269\u4f53\u7684\u51fa\u73b0\u3001\u6d88\u5931\u6216\u5f62\u72b6\u53d8\u5316\uff09\u3002\u8fd9\u4e0e\u7b2c 8 \u7ae0\u5377\u79ef\u7f51\u7edc\u4e2d\u7684\u5c42\u6b21\u5316\u7279\u5f81\u63d0\u53d6\u539f\u7406\u76f8\u540c\uff0c\u53ea\u662f\u6cbf\u65f6\u95f4\u8f74\u8fdb\u884c\u4e86\u6269\u5c55\u3002
\u6807\u51c6 3D \u5377\u79ef\u4f1a\u540c\u65f6\u67e5\u770b\u8fc7\u53bb\u3001\u5f53\u524d\u548c\u672a\u6765\u7684\u5e27\uff0c\u8fd9\u610f\u5473\u7740\u5728\u8bcd\u5143\u5316\u4efb\u4f55\u5e27\u4e4b\u524d\u9700\u8981\u6574\u4e2a\u89c6\u9891\u7247\u6bb5\u3002\u56e0\u679c\u89c6\u9891\u8bcd\u5143\u5316\u5668\u7ea6\u675f\u65f6\u95f4\u5377\u79ef\uff0c\u4f7f\u6bcf\u4e2a\u8f93\u51fa\u4ec5\u4f9d\u8d56\u4e8e\u5f53\u524d\u5e27\u548c\u4e4b\u524d\u7684\u5e27\uff0c\u4ece\u4e0d\u4f9d\u8d56\u4e8e\u672a\u6765\u7684\u5e27\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u81ea\u56de\u5f52 Transformer\uff08\u7b2c 7 \u7ae0\uff09\u4e2d\u7684\u56e0\u679c\u63a9\u7801\uff1a\u4fe1\u606f\u5728\u65f6\u95f4\u4e0a\u5411\u524d\u6d41\u52a8\uff0c\u4f46\u7edd\u4e0d\u5411\u540e\u3002
\u56e0\u679c\u8bcd\u5143\u5316\u5bf9\u4e8e\u4e24\u79cd\u4f7f\u7528\u573a\u666f\u81f3\u5173\u91cd\u8981\u3002\u9996\u5148\uff0c\u6d41\u5f0f\u5904\u7406\uff1a\u4f60\u53ef\u4ee5\u5728\u5e27\u5230\u8fbe\u65f6\u5b9e\u65f6\u8bcd\u5143\u5316\u89c6\u9891\uff0c\u800c\u65e0\u9700\u7f13\u51b2\u672a\u6765\u7684\u5e27\u3002\u5176\u6b21\uff0c\u81ea\u56de\u5f52\u751f\u6210\uff1a\u5f53 Transformer \u9010\u5e27\u751f\u6210\u89c6\u9891\u65f6\uff0c\u7b2c \\(t\\) \u5e27\u7684\u8bcd\u5143\u5fc5\u987b\u5728\u4e0d\u77e5\u9053\u7b2c \\(t+1\\) \u5e27\u7684\u60c5\u51b5\u4e0b\u53ef\u8ba1\u7b97\uff0c\u56e0\u4e3a\u7b2c \\(t+1\\) \u5e27\u5c1a\u672a\u751f\u6210\u3002
\u56e0\u679c\u7ea6\u675f\u901a\u8fc7\u975e\u5bf9\u79f0\u586b\u5145\u65f6\u95f4\u5377\u79ef\u6765\u5b9e\u73b0\uff1a\u65f6\u95f4\u5927\u5c0f\u4e3a \\(k\\) \u7684\u6838\u5728\u8fc7\u53bb\u4e00\u4fa7\u586b\u5145 \\(k-1\\) \u4e2a\u96f6\uff0c\u672a\u6765\u4e00\u4fa7\u586b\u5145\u96f6\u4e2a\u96f6\uff0c\u786e\u4fdd\u65f6\u95f4 \\(t\\) \u7684\u8f93\u51fa\u4ec5\u4f9d\u8d56\u4e8e\u65f6\u95f4 \\(t-k+1, \\ldots, t\\) \u7684\u8f93\u5165\u3002
\u56e0\u679c\u89c6\u9891\u8bcd\u5143\u5316\u5668\u7684\u4e00\u4e2a\u4f18\u96c5\u7279\u6027\u662f\u5b83\u4eec\u53ef\u4ee5\u8bcd\u5143\u5316\u5355\u5f20\u56fe\u50cf\uff08\"\u89c6\u9891\"\u53ea\u6709\u4e00\u5e27\uff09\u800c\u65e0\u9700\u7279\u6b8a\u5904\u7406\u3002\u7b2c\u4e00\u5e27\u6ca1\u6709\u5386\u53f2\u4e0a\u4e0b\u6587\uff0c\u56e0\u6b64\u5176\u8bcd\u5143\u4ec5\u4ece\u8be5\u5e27\u672c\u8eab\u8ba1\u7b97\u3002\u8fd9\u79cd\u56fe\u50cf-\u89c6\u9891\u7edf\u4e00\u610f\u5473\u7740\u5355\u4e2a\u8bcd\u5143\u5316\u5668\u53ef\u4ee5\u670d\u52a1\u4e8e\u4e24\u79cd\u6a21\u6001\uff0c\u7b80\u5316\u4e86\u67b6\u6784\uff0c\u5e76\u4f7f\u6a21\u578b\u80fd\u591f\u4f7f\u7528\u540c\u4e00\u4e2a\u89e3\u7801\u5668\u751f\u6210\u56fe\u50cf\u548c\u89c6\u9891\u3002
\u4e0d\u540c\u7684\u5e94\u7528\u9700\u8981\u4e0d\u540c\u7684\u65f6\u95f4\u538b\u7f29\u6bd4\u3002\u5bf9\u4e8e\u52a8\u4f5c\u8bc6\u522b\uff08\u5176\u4e2d\u7ec6\u5fae\u8fd0\u52a8\u5f88\u91cd\u8981\uff09\uff0c\u6e29\u548c\u538b\u7f29\uff08\\(f_t = 2\\)\uff09\u53ef\u4ee5\u4fdd\u7559\u65f6\u95f4\u7ec6\u8282\u3002\u5bf9\u4e8e\u957f\u89c6\u9891\u751f\u6210\uff08\u5b58\u50a8\u6570\u5343\u5e27\u662f\u4e0d\u53ef\u884c\u7684\uff09\uff0c\u9700\u8981\u6fc0\u8fdb\u538b\u7f29\uff08\\(f_t = 8\\) \u6216\u66f4\u9ad8\uff09\u3002
\u67d0\u4e9b\u8bcd\u5143\u5316\u5668\u4f7f\u7528\u5206\u89e3\u538b\u7f29\uff1a\u7a7a\u95f4\u548c\u65f6\u95f4\u538b\u7f29\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u3002\u9996\u5148\uff0c2D \u7f16\u7801\u5668\u72ec\u7acb\u538b\u7f29\u6bcf\u5e27\uff0c\u4ea7\u751f\u6bcf\u5e27\u7684\u6f5c\u5728\u7f51\u683c\u3002\u7136\u540e\uff0c1D \u65f6\u95f4\u7f16\u7801\u5668\u8de8\u65f6\u95f4\u7ef4\u5ea6\u8fdb\u884c\u538b\u7f29\u3002\u8fd9\u79cd\u5206\u89e3\u5728\u8ba1\u7b97\u4e0a\u6bd4\u5b8c\u6574\u7684 3D \u5377\u79ef\u66f4\u4fbf\u5b9c\uff0c\u5e76\u5141\u8bb8\u7a7a\u95f4\u548c\u65f6\u95f4\u91c7\u7528\u4e0d\u540c\u7684\u538b\u7f29\u6bd4\u3002\u5176\u4ee3\u4ef7\u662f\u5b83\u4e0d\u80fd\u50cf\u8054\u5408 3D \u7f16\u7801\u90a3\u6837\u9ad8\u6548\u5730\u6355\u6349\u65f6\u7a7a\u6a21\u5f0f\uff08\u5982\u5bf9\u89d2\u7ebf\u8fd0\u52a8\u7684\u7403\uff09\u3002
\u65f6\u95f4\u63d2\u503c\u8bcd\u5143\u662f\u4e00\u9879\u6700\u8fd1\u7684\u521b\u65b0\uff0c\u8bcd\u5143\u5316\u5668\u4ec5\u5b8c\u6574\u7f16\u7801\u5173\u952e\u5e27\uff0c\u5e76\u5c06\u4e2d\u95f4\u5e27\u8868\u793a\u4e3a\u8f7b\u91cf\u7ea7\u7684\u63d2\u503c\u7f16\u7801\uff0c\u63cf\u8ff0\u5982\u4f55\u5728\u5173\u952e\u5e27\u4e4b\u95f4\u53d8\u5f62\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u7ecf\u5178\u89c6\u9891\u538b\u7f29\uff08H.264/HEVC \u4e2d\u7684 I \u5e27\u548c P \u5e27\uff09\uff0c\u4f46\u5728\u5b66\u4e60\u5230\u7684\u6f5c\u5728\u7a7a\u95f4\u4e2d\u8fdb\u884c\u3002
\u5e76\u975e\u6bcf\u4e2a\u4e0b\u6e38\u6a21\u578b\u90fd\u9700\u8981\u79bb\u6563\u8bcd\u5143\u3002\u6269\u6563\u6a21\u578b\uff08\u7b2c 10 \u7ae0\uff0c\u6587\u4ef6 04\uff09\u539f\u751f\u4f7f\u7528\u8fde\u7eed\u503c\u2014\u2014\u5b83\u4eec\u8fed\u4ee3\u5730\u53bb\u566a\u9ad8\u65af\u6837\u672c\uff0c\u5176\u635f\u5931\u51fd\u6570\uff08\u53bb\u566a\u5f97\u5206\u5339\u914d\uff09\u5b9a\u4e49\u5728\u8fde\u7eed\u7a7a\u95f4\u4e0a\u3002\u5bf9\u4e8e\u6269\u6563\u540e\u7aef\uff0c\u8bcd\u5143\u5316\u5668\u7f16\u7801\u5668\u4ea7\u751f\u8fde\u7eed\u6f5c\u5728\u5411\u91cf\uff0c\u4ece\u4e0d\u8fdb\u884c\u91cf\u5316\u3002\u6f5c\u5728\u6269\u6563\u6a21\u578b\uff08Stable Diffusion\u3001DALL-E 3\u3001Flux\uff09\u4f7f\u7528\u7c7b\u4f3c VQ-GAN \u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\uff0c\u4f46\u5b8c\u5168\u8df3\u8fc7\u4e86\u7801\u672c\uff0c\u5728\u8fde\u7eed\u6f5c\u5728\u7a7a\u95f4\u4e2d\u64cd\u4f5c\u3002
\u800c\u81ea\u56de\u5f52\u6a21\u578b\uff08GPT \u98ce\u683c\uff09\u5219\u4f7f\u7528 \\(K\\) \u7c7b\u4e0a\u7684 softmax \u4ece\u6709\u9650\u8bcd\u6c47\u8868\u4e2d\u9884\u6d4b\u4e0b\u4e00\u4e2a\u8bcd\u5143\u3002\u5b83\u4eec\u4ece\u6839\u672c\u4e0a\u9700\u8981\u79bb\u6563\u8bcd\u5143\u3002\u6bcf\u4e2a\u4f7f\u7528\u81ea\u56de\u5f52 Transformer \u7684\u56fe\u50cf\u751f\u6210\u7cfb\u7edf\uff08DALL-E\u3001Parti\u3001LlamaGen\u3001Chameleon\uff09\u90fd\u4f9d\u8d56\u79bb\u6563\u8bcd\u5143\u5316\u5668\u3002
\u56e0\u6b64\uff0c\u8fde\u7eed\u8bcd\u5143\u548c\u79bb\u6563\u8bcd\u5143\u4e4b\u95f4\u7684\u9009\u62e9\u7531\u751f\u6210\u540e\u7aef\u51b3\u5b9a\uff1a
\u5728\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u4f7f\u7528\u79bb\u6563\u8bcd\u5143\uff1a\u6a21\u578b\u662f\u81ea\u56de\u5f52\u7684\uff08\u4f7f\u7528\u4ea4\u53c9\u71b5\u635f\u5931\u7684\u4e0b\u4e00\u4e2a\u8bcd\u5143\u9884\u6d4b\uff09\uff0c\u4f60\u60f3\u4e0e\u6587\u672c\u8bcd\u5143\u5171\u4eab\u8bcd\u6c47\u8868\u4ee5\u5b9e\u73b0\u7edf\u4e00\u7684\u591a\u6a21\u6001\u6a21\u578b\uff0c\u6216\u8005\u4f60\u9700\u8981\u7cbe\u786e\u7684\u8bcd\u5143\u7ea7\u63a7\u5236\uff08\u4f8b\u5982\uff0c\u901a\u8fc7\u8bcd\u5143\u66ff\u6362\u8fdb\u884c\u68c0\u7d22\u6216\u7f16\u8f91\uff09\u3002
\u5728\u4ee5\u4e0b\u60c5\u51b5\u4e0b\u4f7f\u7528\u8fde\u7eed\u8bcd\u5143\uff1a\u6a21\u578b\u662f\u6269\u6563\u6a21\u578b\u6216\u6d41\u5339\u914d\u6a21\u578b\uff0c\u4efb\u52a1\u9700\u8981\u975e\u5e38\u9ad8\u7684\u4fdd\u771f\u5ea6\u91cd\u5efa\uff08\u8fde\u7eed\u6f5c\u5728\u8868\u793a\u5b8c\u5168\u907f\u514d\u4e86\u91cf\u5316\u8bef\u5dee\uff09\uff0c\u6216\u8005\u4f60\u60f3\u4f7f\u7528\u4f5c\u7528\u4e8e\u5b9e\u503c\u5411\u91cf\u7684\u56de\u5f52\u635f\u5931\u3002
\u4e00\u4e9b\u6700\u8fd1\u7684\u67b6\u6784\u652f\u6301\u4e24\u79cd\u6a21\u5f0f\u3002\u4f8b\u5982\uff0cCosmos \u8bcd\u5143\u5316\u5668\u53ef\u4ee5\u4ece\u540c\u4e00\u4e2a\u7f16\u7801\u5668\u8f93\u51fa\u8fde\u7eed\u6f5c\u5728\u8868\u793a\uff08\u7528\u4e8e\u5176\u6269\u6563\u6a21\u5f0f\uff09\u6216 FSQ \u79bb\u6563\u5316\u8bcd\u5143\uff08\u7528\u4e8e\u5176\u81ea\u56de\u5f52\u6a21\u5f0f\uff09\uff0c\u53ea\u9700\u4e00\u4e2a\u53ef\u4ee5\u6253\u5f00\u6216\u5173\u95ed\u7684\u8f7b\u91cf\u7ea7\u91cf\u5316\u5934\u3002
\u8f6f\u91cf\u5316\u662f\u4e00\u4e2a\u4e2d\u95f4\u5730\u5e26\uff1a\u4e0d\u662f\u786c \\(\\arg\\min\\) \u5206\u914d\uff0c\u800c\u662f\u8ba1\u7b97 top-\\(k\\) \u6700\u8fd1\u7801\u672c\u6761\u76ee\u7684\u52a0\u6743\u5e73\u5747\uff0c\u6743\u91cd\u7531\u8d1f\u8ddd\u79bb\u4e0a\u7684 softmax \u7ed9\u51fa\u3002\u8fd9\u6bd4\u786c\u91cf\u5316\u4fdd\u7559\u4e86\u66f4\u591a\u4fe1\u606f\uff0c\u540c\u65f6\u4ecd\u7136\u8fd1\u4f3c\u79bb\u6563\u3002\u6709\u4e9b\u7cfb\u7edf\u5728\u8bad\u7ec3\u65f6\u4f7f\u7528\u8f6f\u91cf\u5316\uff0c\u5728\u63a8\u7406\u65f6\u4f7f\u7528\u786c\u91cf\u5316\u3002
\u4e00\u65e6\u56fe\u50cf\u53d8\u6210\u79bb\u6563\u8bcd\u5143\u5e8f\u5217\uff0c\u4f60\u5c31\u53ef\u4ee5\u8bad\u7ec3\u6807\u51c6\u7684\u81ea\u56de\u5f52 Transformer \u6765\u5efa\u6a21\u5b83\u4eec\u3002\u56fe\u50cf\u8bcd\u5143\u88ab\u5c55\u5e73\u4e3a\u4e00\u7ef4\u5e8f\u5217\uff08\u901a\u5e38\u6309\u5149\u6805\u626b\u63cf\u987a\u5e8f\uff1a\u4ece\u5de6\u5230\u53f3\u3001\u4ece\u4e0a\u5230\u4e0b\uff09\uff0cTransformer \u5b66\u4e60 \\(p(\\text{\u8bcd\u5143}_i \\mid \\text{\u8bcd\u5143}_1, \\ldots, \\text{\u8bcd\u5143}_{i-1})\\)\uff0c\u4f7f\u7528\u6807\u51c6\u4ea4\u53c9\u71b5\u635f\u5931\u3002\u5728\u751f\u6210\u65f6\uff0c\u8bcd\u5143\u88ab\u9010\u4e2a\u91c7\u6837\uff0c\u5b8c\u6574\u7684\u7f51\u683c\u901a\u8fc7\u8bcd\u5143\u5316\u5668\u7684\u89e3\u7801\u5668\u8f6c\u6362\u4e3a\u50cf\u7d20\u3002
\u6587\u672c\u6761\u4ef6\u5316\u5f88\u7b80\u5355\uff1a\u5728\u56fe\u50cf\u8bcd\u5143\u5e8f\u5217\u524d\u6dfb\u52a0\u6587\u672c\u8bcd\u5143\uff0c\u4f7f\u6a21\u578b\u5b66\u4e60 \\(p(\\text{\u56fe\u50cf\u8bcd\u5143} \\mid \\text{\u6587\u672c\u8bcd\u5143})\\)\u3002\u8fd9\u6b63\u662f DALL-E\u3001Parti \u548c LlamaGen \u6267\u884c\u6587\u751f\u56fe\u7684\u65b9\u5f0f\u3002\u6587\u672c\u8bcd\u5143\u548c\u56fe\u50cf\u8bcd\u5143\u5171\u4eab\u540c\u4e00\u4e2a Transformer\u3001\u540c\u4e00\u4e2a\u6ce8\u610f\u529b\u673a\u5236\uff0c\u5e76\u4e14\u901a\u5e38\u5171\u4eab\u540c\u4e00\u4e2a\u5d4c\u5165\u8868\uff08\u6587\u672c\u8bcd\u5143\u548c\u56fe\u50cf\u8bcd\u5143\u5360\u636e\u4e0d\u540c\u7684\u7d22\u5f15\u8303\u56f4\uff09\u3002
\u5149\u6805\u626b\u63cf\u987a\u5e8f\u5f15\u5165\u4e86\u4e00\u79cd\u4eba\u4e3a\u7684\u975e\u5bf9\u79f0\u6027\uff1a\u56fe\u50cf\u7684\u5de6\u4e0a\u89d2\u662f\u5728\u6ca1\u6709\u4efb\u4f55\u5173\u4e8e\u53f3\u4e0b\u89d2\u4e0a\u4e0b\u6587\u7684\u60c5\u51b5\u4e0b\u9996\u5148\u751f\u6210\u7684\u3002\u4e00\u4e9b\u5de5\u4f5c\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002\u63a9\u7801\u56fe\u50cf\u5efa\u6a21\uff08MaskGIT\uff09\u8bad\u7ec3\u4e86\u4e00\u4e2a\u53cc\u5411 Transformer\uff0c\u540c\u65f6\u751f\u6210\u6240\u6709\u8bcd\u5143\u4f46\u7f6e\u4fe1\u5ea6\u4e0d\u540c\uff0c\u8fed\u4ee3\u5730\u89e3\u5f00\u6700\u81ea\u4fe1\u7684\u8bcd\u5143\u3002\u591a\u5c3a\u5ea6\u751f\u6210\u9996\u5148\u751f\u6210\u7c97\u7c92\u5ea6\u8bcd\u5143\uff08\u6355\u6349\u5168\u5c40\u6784\u56fe\uff09\uff0c\u7136\u540e\u7528\u6b8b\u5dee\u8bcd\u5143\u8fdb\u884c\u7ec6\u5316\u3002\u8fd9\u4e9b\u65b9\u6cd5\u7528\u7eaf\u4ece\u5de6\u5230\u53f3\u751f\u6210\u7684\u7b80\u5355\u6027\u6362\u53d6\u4e86\u66f4\u597d\u7684\u5168\u5c40\u8fde\u8d2f\u6027\u3002
\u56fe\u50cf\u8bcd\u5143\u5316\u6700\u6df1\u523b\u7684\u52a8\u673a\u662f\u7edf\u4e00\uff1a\u5c06\u89c6\u89c9\u548c\u8bed\u8a00\u7f6e\u4e8e\u76f8\u540c\u7684\u8868\u793a\u683c\u5f0f\u4e2d\uff0c\u4f7f\u5f97\u5355\u4e2a\u6a21\u578b\u67b6\u6784\u53ef\u4ee5\u540c\u65f6\u5904\u7406\u4e24\u8005\u3002\u6b63\u5982\u6211\u4eec\u5728\u7b2c 7 \u7ae0\u4e2d\u8ba8\u8bba\u7684\uff0c\u8bed\u8a00\u6a21\u578b\u662f\u6781\u5176\u5f3a\u5927\u7684\u5e8f\u5217\u5230\u5e8f\u5217\u673a\u5668\u3002\u901a\u8fc7\u5c06\u56fe\u50cf\u8868\u793a\u4e3a\u8bcd\u5143\u5e8f\u5217\uff0c\u6211\u4eec\u514d\u8d39\u7ee7\u627f\u4e86\u8bed\u8a00\u5efa\u6a21\u7684\u6240\u6709\u57fa\u7840\u8bbe\u65bd\u2014\u2014\u9884\u8bad\u7ec3\u914d\u65b9\u3001\u7f29\u653e\u5b9a\u5f8b\u3001RLHF\u3001\u4e0a\u4e0b\u6587\u957f\u5ea6\u6269\u5c55\u3002
Chameleon\uff08Meta\uff0c2024\uff09\u662f\u4e00\u4e2a\u7a81\u51fa\u7684\u4f8b\u5b50\uff1a\u5b83\u4f7f\u7528\u5177\u6709 8192 \u4e2a\u7801\u672c\u6761\u76ee\u7684 VQ-GAN \u8bcd\u5143\u5316\u5668\u5c06\u56fe\u50cf\u8f6c\u6362\u4e3a\u8bcd\u5143\uff0c\u8fd9\u4e9b\u8bcd\u5143\u4e0e\u6587\u672c\u8bcd\u5143\u4ea4\u7ec7\u5728\u4e00\u4e2a\u7ea6 65,000 \u4e2a\u6761\u76ee\uff08\u6587\u672c + \u56fe\u50cf\uff09\u7684\u5355\u4e00\u8bcd\u6c47\u8868\u4e2d\u3002\u6807\u51c6\u7684 Transformer \u5728\u6df7\u5408\u6587\u672c-\u56fe\u50cf\u5e8f\u5217\u4e0a\u8fdb\u884c\u8bad\u7ec3\uff0c\u4f7f\u5176\u80fd\u591f\u6839\u636e\u56fe\u50cf\u751f\u6210\u6587\u672c\u3001\u6839\u636e\u6587\u672c\u751f\u6210\u56fe\u50cf\u6216\u751f\u6210\u4ea4\u7ec7\u7684\u6587\u672c\u548c\u56fe\u50cf\u5185\u5bb9\uff0c\u5168\u90e8\u4f7f\u7528\u540c\u4e00\u6b21\u524d\u5411\u4f20\u64ad\u3002
Gemini\uff08Google\uff0c2024\uff09\u5728\u5927\u89c4\u6a21\u4e0a\u91c7\u53d6\u4e86\u7c7b\u4f3c\u7684\u65b9\u6cd5\uff0c\u539f\u751f\u5730\u5728\u5355\u4e2a Transformer \u4e2d\u7406\u89e3\u5e76\u751f\u6210\u56fe\u50cf\u3001\u97f3\u9891\u548c\u6587\u672c\uff0c\u7531\u7279\u5b9a\u6a21\u6001\u7684\u8bcd\u5143\u5316\u5668\u9988\u9001\u5230\u5171\u4eab\u5e8f\u5217\u4e2d\u3002
\u7edf\u4e00\u6a21\u578b\u4e2d\u7684\u5173\u952e\u5de5\u7a0b\u6311\u6218\u662f\u8bcd\u6c47\u8868\u5e73\u8861\uff1a\u5982\u679c 65,000 \u4e2a\u8bcd\u6c47\u8868\u6761\u76ee\u4e2d\u6709 8192 \u4e2a\u662f\u56fe\u50cf\u8bcd\u5143\uff0c\u6a21\u578b\u53ef\u80fd\u4f1a\u5206\u914d\u4e0d\u8db3\u7684\u80fd\u529b\u7ed9\u89c6\u89c9\u3002\u89e3\u51b3\u65b9\u6848\u5305\u62ec\u4e3a\u6bcf\u79cd\u6a21\u6001\u4f7f\u7528\u72ec\u7acb\u7684\u5d4c\u5165\u5c42\uff08\u4ec5\u5728\u6ce8\u610f\u529b\u5c42\u9762\u5171\u4eab\uff09\u3001\u7279\u5b9a\u6a21\u6001\u7684\u635f\u5931\u52a0\u6743\uff0c\u4ee5\u53ca\u9884\u8bad\u7ec3\u671f\u95f4\u4ed4\u7ec6\u7684\u6570\u636e\u6df7\u5408\u6bd4\u4f8b\u3002
\u5728 JAX \u4e2d\u5b9e\u73b0\u4e00\u4e2a\u6700\u5c0f VQ \u5c42\uff1a\u7ed9\u5b9a\u4e00\u6279\u7f16\u7801\u5668\u8f93\u51fa\u5411\u91cf\uff0c\u6267\u884c\u6700\u8fd1\u90bb\u7801\u672c\u67e5\u627e\u5e76\u8ba1\u7b97 VQ-VAE \u635f\u5931\uff08\u91cd\u5efa + \u7801\u672c + \u627f\u8bfa\uff09\u3002\u5c06\u7801\u672c\u5229\u7528\u7387\u53ef\u89c6\u5316\u4e3a\u76f4\u65b9\u56fe\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# --- \u6700\u5c0f VQ \u5c42 ---\nkey = jax.random.PRNGKey(42)\nd = 8 # \u5d4c\u5165\u7ef4\u5ea6\nK = 64 # \u7801\u672c\u5927\u5c0f\nn_vectors = 256 # \u4e00\u6279\u7f16\u7801\u5668\u8f93\u51fa\n\n# \u968f\u673a\u7f16\u7801\u5668\u8f93\u51fa\u548c\u7801\u672c\nk1, k2 = jax.random.split(key)\nz_e = jax.random.normal(k1, (n_vectors, d)) # \u7f16\u7801\u5668\u8f93\u51fa\ncodebook = jax.random.normal(k2, (K, d)) * 0.1 # \u7801\u672c\uff08\u5c0f\u521d\u59cb\u5316\uff09\n\n# \u6700\u8fd1\u90bb\u67e5\u627e\uff1a\u4e3a\u6bcf\u4e2a z_e \u627e\u5230\u6700\u8fd1\u7684\u7801\u672c\u6761\u76ee\n# distances[i, k] = ||z_e[i] - codebook[k]||^2\ndistances = (\n jnp.sum(z_e ** 2, axis=1, keepdims=True)\n - 2 * z_e @ codebook.T\n + jnp.sum(codebook ** 2, axis=1, keepdims=True).T\n)\nindices = jnp.argmin(distances, axis=1) # \u8bcd\u5143\u7d22\u5f15\nz_q = codebook[indices] # \u91cf\u5316\u5411\u91cf\n\n# VQ-VAE \u635f\u5931\u9879\nbeta = 0.25\nloss_codebook = jnp.mean((jax.lax.stop_gradient(z_e) - z_q) ** 2)\nloss_commit = jnp.mean((z_e - jax.lax.stop_gradient(z_q)) ** 2)\nloss_total = loss_codebook + beta * loss_commit\nprint(f\"\u7801\u672c\u635f\u5931: {loss_codebook:.4f}, \u627f\u8bfa\u635f\u5931: {loss_commit:.4f}\")\n\n# \u7801\u672c\u5229\u7528\u7387\nunique, counts = jnp.unique(indices, return_counts=True, size=K, fill_value=-1)\nplt.figure(figsize=(10, 4))\nplt.bar(range(K), counts, color='#3498db', alpha=0.8)\nplt.xlabel('\u7801\u672c\u7d22\u5f15'); plt.ylabel('\u5206\u914d\u8ba1\u6570')\nplt.title(f'\u7801\u672c\u5229\u7528\u7387\uff08\u5df2\u4f7f\u7528 {jnp.sum(counts > 0)}/{K} \u4e2a\u6761\u76ee\uff09')\nplt.grid(True, alpha=0.3); plt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\uff1a\u5c06 K \u589e\u52a0\u5230 512 \u5e76\u89c2\u5bdf\u574d\u584c\u3002\u7136\u540e\u6dfb\u52a0\u7801\u672c\u91cd\u7f6e\u903b\u8f91\u3002\n \u6784\u5efa\u4e00\u4e2a\u73a9\u5177 2D \u5411\u91cf\u91cf\u5316\u5668\uff0c\u5b66\u4e60\u5bf9 2D \u5206\u5e03\u8fdb\u884c\u5212\u5206\u3002\u751f\u6210\u968f\u673a 2D \u70b9\uff0c\u901a\u8fc7 EMA \u66f4\u65b0\u5b66\u4e60\u7801\u672c\uff0c\u5e76\u5c06 Voronoi \u533a\u57df\u53ef\u89c6\u5316\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u4ece\u9ad8\u65af\u6df7\u5408\u751f\u6210 2D \u6570\u636e\nkey = jax.random.PRNGKey(0)\nn_points = 2000\nK = 16 # \u7801\u672c\u6761\u76ee\u6570\ngamma = 0.99 # EMA \u8870\u51cf\n\n# \u56db\u4e2a\u7c07\nkeys = jax.random.split(key, 5)\ncentres = jnp.array([[2, 2], [-2, 2], [-2, -2], [2, -2]], dtype=jnp.float32)\ndata = jnp.concatenate([\n jax.random.normal(keys[i], (n_points // 4, 2)) * 0.5 + centres[i]\n for i in range(4)\n])\n\n# \u4ece\u968f\u673a\u6570\u636e\u70b9\u521d\u59cb\u5316\u7801\u672c\nidx = jax.random.choice(keys[4], n_points, (K,), replace=False)\ncodebook = data[idx]\nema_count = jnp.ones(K)\nema_sum = codebook.copy()\n\n# \u8fd0\u884c\u591a\u4e2a epoch \u7684\u57fa\u4e8e EMA \u7684\u7801\u672c\u5b66\u4e60\nfor epoch in range(30):\n # \u5c06\u6bcf\u4e2a\u70b9\u5206\u914d\u7ed9\u6700\u8fd1\u7684\u7801\u672c\u6761\u76ee\n dists = jnp.sum((data[:, None, :] - codebook[None, :, :]) ** 2, axis=2)\n assignments = jnp.argmin(dists, axis=1)\n # EMA \u66f4\u65b0\n for k in range(K):\n mask = (assignments == k)\n count_k = jnp.sum(mask)\n ema_count = ema_count.at[k].set(gamma * ema_count[k] + (1 - gamma) * count_k)\n if count_k > 0:\n sum_k = jnp.sum(data[mask], axis=0)\n ema_sum = ema_sum.at[k].set(gamma * ema_sum[k] + (1 - gamma) * sum_k)\n codebook = ema_sum / ema_count[:, None]\n\n# \u53ef\u89c6\u5316\u5206\u914d\u548c\u7801\u672c\nfig, ax = plt.subplots(1, 1, figsize=(8, 8))\ncolors = plt.cm.tab20(jnp.linspace(0, 1, K))\nfor k in range(K):\n mask = assignments == k\n ax.scatter(data[mask, 0], data[mask, 1], c=[colors[k]], s=5, alpha=0.3)\nax.scatter(codebook[:, 0], codebook[:, 1], c='black', s=120, marker='X',\n edgecolors='white', linewidths=1.5, zorder=10, label='\u7801\u672c')\nax.set_title(f'\u5728 2D \u6570\u636e\u4e0a\u5b66\u5f97\u7684 VQ \u7801\u672c\uff08{K} \u4e2a\u6761\u76ee\uff09')\nax.legend(); ax.set_aspect('equal'); ax.grid(True, alpha=0.3)\nplt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\uff1a\u5c06 K \u589e\u52a0\u5230 64 \u5e76\u89c2\u5bdf\u66f4\u7cbe\u7ec6\u7684\u5212\u5206\u3002\u51cf\u5c0f gamma \u5e76\u89c2\u5bdf\u4e0d\u7a33\u5b9a\u6027\u3002\n \u6f14\u793a\u6b8b\u5dee\u91cf\u5316\uff1a\u7528 \\(T\\) \u4e2a\u8fde\u7eed\u7684\u91cf\u5316\u9636\u6bb5\u5bf9\u4e00\u6279\u5411\u91cf\u8fdb\u884c\u7f16\u7801\uff0c\u5e76\u6d4b\u91cf\u6bcf\u4e2a\u5c42\u7ea7\u91cd\u5efa\u8bef\u5dee\u7684\u4e0b\u964d\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nkey = jax.random.PRNGKey(7)\nd = 16 # \u5d4c\u5165\u7ef4\u5ea6\nK = 32 # \u6bcf\u4e2a\u5c42\u7ea7\u7684\u7801\u672c\u5927\u5c0f\nT = 8 # \u6b8b\u5dee\u5c42\u7ea7\u6570\nn_vectors = 512\n\n# \u5f85\u91cf\u5316\u7684\u968f\u673a\u6570\u636e\nk1, *cb_keys = jax.random.split(key, T + 1)\nz = jax.random.normal(k1, (n_vectors, d))\n\n# \u6bcf\u4e2a\u5c42\u7ea7\u7684\u72ec\u7acb\u968f\u673a\u7801\u672c\ncodebooks = [jax.random.normal(cb_keys[t], (K, d)) * (0.5 ** t)\n for t in range(T)]\n\n# \u6b8b\u5dee\u91cf\u5316\u5faa\u73af\nresidual = z.copy()\nz_hat = jnp.zeros_like(z)\nerrors = []\n\nfor t in range(T):\n cb = codebooks[t]\n dists = (jnp.sum(residual ** 2, axis=1, keepdims=True)\n - 2 * residual @ cb.T\n + jnp.sum(cb ** 2, axis=1, keepdims=True).T)\n indices = jnp.argmin(dists, axis=1)\n z_q_t = cb[indices]\n z_hat = z_hat + z_q_t\n residual = residual - z_q_t\n mse = jnp.mean(jnp.sum((z - z_hat) ** 2, axis=1))\n errors.append(float(mse))\n print(f\"\u5c42\u7ea7 {t+1}: MSE = {mse:.4f}\")\n\nplt.figure(figsize=(8, 5))\nplt.plot(range(1, T + 1), errors, 'o-', color='#e74c3c', linewidth=2, markersize=8)\nplt.xlabel('\u6b8b\u5dee\u91cf\u5316\u5c42\u7ea7')\nplt.ylabel('\u91cd\u5efa MSE')\nplt.title('\u6b8b\u5dee\u91cf\u5316\u7684\u8bef\u5dee\u964d\u4f4e')\nplt.xticks(range(1, T + 1)); plt.grid(True, alpha=0.3)\nplt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\uff1a\u4f7f\u7528\u5927\u5c0f\u4e3a K*T \u7684\u5355\u4e2a\u7801\u672c\u5e76\u4e0e RQ \u6bd4\u8f83\u3002\u54ea\u4e2a\u66f4\u597d\uff1f\n \u6a21\u62df\u4e00\u4e2a\u7b80\u5355\u7684 1D\"\u89c6\u9891\u8bcd\u5143\u5316\u5668\"\uff1a\u751f\u6210\u4e00\u7cfb\u5217 1D \u4fe1\u53f7\uff08\u6a21\u62df\u89c6\u9891\u5e27\uff09\uff0c\u5e94\u7528\u56e0\u679c\u65f6\u95f4\u538b\u7f29\uff0c\u5e76\u4e0e\u65e0\u56e0\u679c\u538b\u7f29\u5728\u91cd\u5efa\u8d28\u91cf\u65b9\u9762\u8fdb\u884c\u6bd4\u8f83\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nkey = jax.random.PRNGKey(99)\nn_frames = 16\nframe_len = 64\n\n# \u751f\u6210\u4e00\u4e2a\"\u89c6\u9891\"\uff1a\u5728\u5e27\u95f4\u7f13\u6162\u79fb\u52a8\u7684\u9ad8\u65af\u51f8\u8d77\nx_axis = jnp.linspace(-3, 3, frame_len)\nframes = jnp.stack([\n jnp.exp(-0.5 * (x_axis - (-2 + 4 * t / n_frames)) ** 2)\n for t in range(n_frames)\n]) # \u5f62\u72b6: (n_frames, frame_len)\n\n# \u56e0\u679c\u65f6\u95f4\u538b\u7f29\uff1a\u6bcf\u5e27\u7684\u7f16\u7801\u4ec5\u4f9d\u8d56\u4e8e\u8fc7\u53bb\u7684\u5e27\n# \u7b80\u5355\u65b9\u6cd5\uff1a\u4f7f\u7528\u8fc7\u53bb\u5e27\u7684\u6307\u6570\u8870\u51cf\u5bf9\u5f53\u524d\u5e27\u8fdb\u884c\u5e73\u5747\nalpha_causal = 0.6\ncausal_codes = jnp.zeros_like(frames)\ncausal_codes = causal_codes.at[0].set(frames[0])\nfor t in range(1, n_frames):\n causal_codes = causal_codes.at[t].set(\n alpha_causal * frames[t] + (1 - alpha_causal) * causal_codes[t - 1]\n )\n\n# \u65e0\u56e0\u679c\uff1a\u540c\u65f6\u5e73\u5747\u8fc7\u53bb\u548c\u672a\u6765\uff08\u53cc\u8fb9\u5e73\u6ed1\uff09\nkernel = jnp.array([0.2, 0.6, 0.2]) # \u8fc7\u53bb, \u5f53\u524d, \u672a\u6765\npadded = jnp.concatenate([frames[:1], frames, frames[-1:]], axis=0)\nnoncausal_codes = jnp.stack([\n kernel[0] * padded[t] + kernel[1] * padded[t+1] + kernel[2] * padded[t+2]\n for t in range(n_frames)\n])\n\n# \u91cd\u5efa\u8bef\u5dee\nmse_causal = jnp.mean((frames - causal_codes) ** 2)\nmse_noncausal = jnp.mean((frames - noncausal_codes) ** 2)\nprint(f\"\u56e0\u679c MSE: {mse_causal:.6f}, \u65e0\u56e0\u679c MSE: {mse_noncausal:.6f}\")\n\nfig, axes = plt.subplots(1, 3, figsize=(15, 5))\nfor ax, data, title in zip(axes,\n [frames, causal_codes, noncausal_codes],\n ['\u539f\u59cb\u5e27', f'\u56e0\u679c (MSE={mse_causal:.5f})',\n f'\u65e0\u56e0\u679c (MSE={mse_noncausal:.5f})']):\n ax.imshow(data, aspect='auto', cmap='viridis', origin='lower')\n ax.set_xlabel('\u7a7a\u95f4\u4f4d\u7f6e'); ax.set_ylabel('\u5e27\u7d22\u5f15')\n ax.set_title(title)\nplt.tight_layout(); plt.show()\n# \u5c1d\u8bd5\uff1a\u6539\u53d8 alpha_causal \u548c\u6838\u6743\u91cd\u3002alpha=1.0 \u65f6\u4f1a\u53d1\u751f\u4ec0\u4e48\uff1f\n \u8de8\u6a21\u6001\u751f\u6210\uff08cross-modal generation\uff09\u662f\u6307\u4ee5\u67d0\u4e00\u6a21\u6001\u7684\u8f93\u5165\u4e3a\u6761\u4ef6\uff0c\u751f\u6210\u53e6\u4e00\u6a21\u6001\u7684\u8f93\u51fa\u2014\u2014\u4ece\u6587\u751f\u56fe\u3001\u56fe\u751f\u6587\u3001\u6587\u751f\u97f3\u9891\uff0c\u4e43\u81f3\u66f4\u591a\u3002\u672c\u7ae0\u6db5\u76d6 DALL\u00b7E\u3001Stable Diffusion\u3001\u65e0\u5206\u7c7b\u5668\u5f15\u5bfc\u3001ControlNet\u3001\u56fe\u50cf\u63cf\u8ff0\u3001\u6587\u751f\u89c6\u9891\uff08Sora\uff09\u4ee5\u53ca\u6587\u751f\u97f3\u9891\u751f\u6210\u3002
\u5728\u672c\u7ae0\u7684\u6587\u4ef6 01-03 \u4e2d\uff0c\u4f60\u5df2\u7ecf\u5b66\u4e60\u4e86\u5982\u4f55\u8868\u793a\u3001\u5bf9\u9f50\u548c\u5206\u8bcd\u4e0d\u540c\u6a21\u6001\u3002\u73b0\u5728\u8f6e\u5230\u521b\u9020\u6027\u7684\u73af\u8282\u4e86\uff1a\u4ece\u4e00\u4e2a\u6a21\u6001\u751f\u6210\u53e6\u4e00\u4e2a\u6a21\u6001\u3002\u8de8\u6a21\u6001\u751f\u6210\u662f\u6587\u751f\u56fe\u5de5\u5177\u3001\u89c6\u9891\u5408\u6210\u7cfb\u7edf\u3001\u97f3\u4e50\u521b\u4f5c\u6a21\u578b\u548c\u56fe\u50cf\u63cf\u8ff0\u80cc\u540e\u7684\u5f15\u64ce\u3002\u53ef\u4ee5\u5c06\u5176\u7406\u89e3\u4e3a\u6559\u4f1a\u673a\u5668\u6210\u4e3a\u591a\u5a92\u4f53\u827a\u672f\u5bb6\u2014\u2014\u4f60\u7528\u6587\u5b57\u63cf\u8ff0\u4f60\u60f3\u8981\u7684\u5185\u5bb9\uff0c\u673a\u5668\u5219\u8d1f\u8d23\u7ed8\u753b\u3001\u52a8\u753b\u6216\u4f5c\u66f2\u3002
\u6838\u5fc3\u601d\u60f3\u662f\u6761\u4ef6\u751f\u6210\uff08conditional generation\uff09\uff1a\u7ed9\u5b9a\u6765\u81ea\u6a21\u6001 \\(A\\)\uff08\u4f8b\u5982\u6587\u672c\uff09\u7684\u8f93\u5165\uff0c\u751f\u6210\u6a21\u6001 \\(B\\)\uff08\u4f8b\u5982\u56fe\u50cf\uff09\u7684\u8f93\u51fa\u3002\u5f62\u5f0f\u4e0a\uff0c\u6211\u4eec\u5b66\u4e60\u6a21\u578b \\(p_\\theta(y \\mid x)\\)\uff0c\u5176\u4e2d \\(x\\) \u662f\u6761\u4ef6\u4fe1\u53f7\uff0c\\(y\\) \u662f\u751f\u6210\u7684\u8f93\u51fa\u3002\u6311\u6218\u5728\u4e8e\u8fd9\u4e2a\u6761\u4ef6\u5206\u5e03\u6781\u5176\u590d\u6742\u4e14\u7ef4\u5ea6\u6781\u9ad8\u2014\u2014\u4e00\u5f20 512x512 \u7684\u56fe\u50cf\u5b58\u5728\u4e8e \\(\\mathbb{R}^{786432}\\) \u4e2d\uff0c\u800c\u5bf9\u4e8e\u540c\u4e00\u4e2a\u6587\u672c\u63d0\u793a\uff0c\u53ef\u80fd\u6709\u65e0\u6570\u5f20\u5408\u7406\u7684\u56fe\u50cf\u3002
DALL\u00b7E\uff08Ramesh \u7b49\u4eba\uff0c2021\uff09\u5c06\u56fe\u50cf\u751f\u6210\u89c6\u4e3a\u4e00\u4e2a\u5e8f\u5217\u9884\u6d4b\u95ee\u9898\u2014\u2014\u8fd9\u6b63\u662f\u8bed\u8a00\u6a21\u578b\u6240\u91c7\u7528\u7684\u8303\u5f0f\uff08\u89c1\u7b2c 07 \u7ae0\uff09\u3002\u5176\u5173\u952e\u6d1e\u5bdf\u662f\uff1a\u5982\u679c\u4f60\u80fd\u5c06\u56fe\u50cf\u8868\u793a\u4e3a\u79bb\u6563 token\uff08\u56de\u987e\u6587\u4ef6 03 \u4e2d\u7684 VQ-VAE\uff09\uff0c\u90a3\u4e48\u751f\u6210\u56fe\u50cf\u5c31\u53ea\u662f\u9010\u4e2a\u751f\u6210 token \u5e8f\u5217\u7684\u8fc7\u7a0b\u3002
\u5176\u6d41\u7a0b\u5206\u4e3a\u4e24\u4e2a\u9636\u6bb5\u3002\u9996\u5148\uff0c\u4e00\u4e2a\u79bb\u6563 VAE\uff08dVAE\uff09\u5c06 256x256 \u7684\u56fe\u50cf\u538b\u7f29\u6210 32x32 \u7684\u79bb\u6563 token \u7f51\u683c\uff0c\u7801\u672c\u5927\u5c0f\u4e3a 8192\uff0c\u5c06\u56fe\u50cf\u7b80\u5316\u4e3a 1024 \u4e2a token \u7684\u5e8f\u5217\u3002\u5176\u6b21\uff0c\u4e00\u4e2aTransformer \u89e3\u7801\u5668\u88ab\u8bad\u7ec3\u6765\u5efa\u6a21 256 \u4e2a\u6587\u672c token\uff08BPE \u7f16\u7801\uff09\u4e0e 1024 \u4e2a\u56fe\u50cf token \u62fc\u63a5\u540e\u7684\u8054\u5408\u5206\u5e03\uff0c\u603b\u8ba1 1280 \u4e2a token\uff1a
\u5728\u751f\u6210\u65f6\uff0c\u8f93\u5165\u6587\u672c token\uff0c\u6a21\u578b\u81ea\u56de\u5f52\u5730\u9010\u4e2a\u91c7\u6837\u56fe\u50cf token\u3002\u8fd9\u79cd\u65b9\u6cd5\u4f18\u96c5\u4e4b\u5904\u5728\u4e8e\u5b83\u590d\u7528\u4e86\u8bed\u8a00\u5efa\u6a21\u7684\u5b8c\u6574\u673a\u5236\u2014\u2014\u6ce8\u610f\u529b\u3001\u56e0\u679c\u63a9\u7801\u3001top-k \u91c7\u6837\u2014\u2014\u6765\u5b8c\u6210\u56fe\u50cf\u5408\u6210\u3002
\u7f3a\u70b9\u662f\u81ea\u56de\u5f52\u751f\u6210\u672c\u8d28\u4e0a\u662f\u4e32\u884c\u7684\uff1a\u9010\u4e2a\u751f\u6210 1024 \u4e2a token \u901f\u5ea6\u5f88\u6162\uff0c\u800c\u4e14\u5e8f\u5217\u65e9\u671f\u7684\u4efb\u4f55\u9519\u8bef\u90fd\u4f1a\u88ab\u653e\u5927\u3002DALL\u00b7E \u901a\u8fc7\u751f\u6210\u5927\u91cf\u5019\u9009\u56fe\u50cf\u5e76\u7528 CLIP\uff08\u6765\u81ea\u6587\u4ef6 01\uff09\u8fdb\u884c\u91cd\u6392\u5e8f\u6765\u7f13\u89e3\u8fd9\u4e00\u95ee\u9898\uff0c\u4ee5\u627e\u5230\u4e0e\u6587\u672c\u63d0\u793a\u6700\u5339\u914d\u7684\u7ed3\u679c\u3002
Stable Diffusion\uff08Rombach \u7b49\u4eba\uff0c2022\uff09\u91c7\u7528\u4e86\u4e00\u79cd\u6839\u672c\u4e0d\u540c\u7684\u65b9\u6cd5\u3002\u5b83\u4e0d\u662f\u9010\u4e2a\u9884\u6d4b token\uff0c\u800c\u662f\u4ece\u7eaf\u566a\u58f0\u5f00\u59cb\uff0c\u5728\u6587\u672c\u63d0\u793a\u7684\u5f15\u5bfc\u4e0b\u9010\u6b65\u5c06\u566a\u58f0\u53bb\u566a\u6210\u56fe\u50cf\u3002\u56de\u987e\u7b2c 8 \u7ae0\u4e2d\u7684\u6269\u6563\u6a21\u578b\u2014\u2014Stable Diffusion \u5728\u538b\u7f29\u540e\u7684\u9690\u7a7a\u95f4\uff08latent space\uff09\u800c\u975e\u50cf\u7d20\u7a7a\u95f4\u4e2d\u8fd0\u884c\uff0c\u56e0\u6b64\u6548\u7387\u5927\u5e45\u63d0\u5347\u3002
\u5176\u67b6\u6784\u7531\u4e09\u4e2a\u7ec4\u4ef6\u534f\u540c\u5de5\u4f5c\u3002VAE \u7f16\u7801\u5668\u5c06\u56fe\u50cf\u4ece\u50cf\u7d20\u7a7a\u95f4\uff08\\(512 \\times 512 \\times 3\\)\uff09\u538b\u7f29\u4e3a\u9690\u7a7a\u95f4\u8868\u793a\uff08\\(64 \\times 64 \\times 4\\)\uff09\uff0c\u5c06\u7ef4\u5ea6\u964d\u4f4e\u4e86 48 \u500d\u3002\u6587\u672c\u7f16\u7801\u5668\uff08\u901a\u5e38\u4e3a CLIP \u6216 OpenCLIP\uff09\u5c06\u6587\u672c\u63d0\u793a\u8f6c\u6362\u4e3a\u5d4c\u5165\u5411\u91cf\u5e8f\u5217\u3002U-Net \u53bb\u566a\u5668\u63a5\u6536\u542b\u566a\u9690\u53d8\u91cf\u3001\u65f6\u95f4\u6b65\u548c\u6587\u672c\u5d4c\u5165\uff0c\u5e76\u9884\u6d4b\u6bcf\u4e00\u6b65\u9700\u8981\u51cf\u53bb\u7684\u566a\u58f0\u3002\u6587\u672c\u6761\u4ef6\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\uff08cross-attention\uff09\u5c42\u8fdb\u5165 U-Net\uff1a
\u5176\u4e2d \\(Q\\) \u6765\u81ea\u542b\u566a\u56fe\u50cf\u7279\u5f81\uff0c\\(K\\) \u548c \\(V\\) \u6765\u81ea\u6587\u672c\u5d4c\u5165\u3002\u8fd9\u4f7f\u5f97\u6a21\u578b\u80fd\u591f\u5728\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u4e0a\u5173\u6ce8\u76f8\u5173\u7684\u8bcd\u8bed\u2014\u2014\u5f53\u53bb\u566a\"\u7ea2\u7403\"\u5e94\u8be5\u51fa\u73b0\u7684\u533a\u57df\u65f6\uff0c\u6a21\u578b\u4f1a\u5173\u6ce8\"\u7ea2\"\u548c\"\u7403\"\u8fd9\u4e24\u4e2a token\u3002
\u5728\u63a8\u7406\u65f6\uff0c\u4f60\u5728\u9690\u7a7a\u95f4\u4e2d\u91c7\u6837 \\(z_T \\sim \\mathcal{N}(0, I)\\)\uff0c\u5229\u7528 U-Net \u8fed\u4ee3\u53bb\u566a \\(T\\) \u6b65\uff08\u901a\u5e38\u4f7f\u7528 DDIM \u8c03\u5ea6\u4e3a 20-50 \u6b65\uff09\uff0c\u7136\u540e\u7528 VAE \u89e3\u7801\u5668\u5c06\u5e72\u51c0\u7684\u9690\u53d8\u91cf \\(z_0\\) \u89e3\u7801\u56de\u50cf\u7d20\u7a7a\u95f4\u3002\u6574\u4e2a\u524d\u5411\u8fc7\u7a0b\u5728\u6d88\u8d39\u7ea7 GPU \u4e0a\u4ec5\u9700\u6570\u79d2\u5373\u53ef\u751f\u6210\u4e00\u5f20 512x512 \u7684\u56fe\u50cf\u3002
\u5176\u4e2d \\(s\\) \u662f\u5f15\u5bfc\u5c3a\u5ea6\u3002\u53ef\u4ee5\u5c06 \\((\\epsilon_\\theta(x_t, c) - \\epsilon_\\theta(x_t, \\varnothing))\\) \u7406\u89e3\u4e3a\"\u671d\u5411\u63d0\u793a\u7684\u65b9\u5411\"\u2014\u2014\u5b83\u6355\u6349\u4e86\u6709\u6761\u4ef6\u9884\u6d4b\u4e0e\u65e0\u6761\u4ef6\u9884\u6d4b\u4e4b\u95f4\u7684\u5dee\u5f02\u3002\u4e58\u4ee5 \\(s > 1\\) \u4f1a\u653e\u5927\u8fd9\u4e2a\u65b9\u5411\uff0c\u5c06\u56fe\u50cf\u63a8\u8fd1\u6587\u672c\u63cf\u8ff0\uff0c\u4f46\u4ee3\u4ef7\u662f\u591a\u6837\u6027\u964d\u4f4e\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0cStable Diffusion \u7684\u5e38\u7528\u9ed8\u8ba4\u503c\u4e3a \\(s = 7.5\\)\u3002\u5f53 \\(s = 1.0\\) \u65f6\u5f97\u5230\u6a21\u578b\u7684\u539f\u59cb\u8f93\u51fa\uff08\u591a\u6837\u4f46\u4ec5\u677e\u6563\u5339\u914d\u63d0\u793a\uff09\u3002\u5f53 \\(s \\geq 20\\) \u65f6\u56fe\u50cf\u53d8\u5f97\u8fc7\u9971\u548c\u4e14\u91cd\u590d\uff0c\u4f46\u4e0e\u6587\u672c\u9ad8\u5ea6\u4e00\u81f4\u3002\u6700\u4f18 \\(s\\) \u503c\u53d6\u51b3\u4e8e\u5e94\u7528\u573a\u666f\uff1a\u521b\u610f\u63a2\u7d22\u503e\u5411\u4e8e\u8f83\u4f4e\u7684\u5f15\u5bfc\u503c\uff0c\u800c\u7cbe\u786e\u9075\u5faa\u63d0\u793a\u5219\u9700\u8981\u66f4\u9ad8\u7684\u5f15\u5bfc\u503c\u3002
Imagen\uff08Saharia \u7b49\u4eba\uff0c2022\uff09\u8bc1\u660e\u4e86\u5f3a\u5927\u7684\u6587\u672c\u7f16\u7801\u5668\u6bd4\u66f4\u5927\u7684\u56fe\u50cf\u6a21\u578b\u66f4\u91cd\u8981\u3002Imagen \u6ca1\u6709\u4f7f\u7528 CLIP\uff0c\u800c\u662f\u91c7\u7528\u4e00\u4e2a\u51bb\u7ed3\u7684 T5-XXL \u8bed\u8a00\u6a21\u578b\uff08\u6765\u81ea\u7b2c 07 \u7ae0\uff09\u4f5c\u4e3a\u6587\u672c\u7f16\u7801\u5668\uff0c\u8be5\u6a21\u578b\u5bf9\u8bed\u8a00\u8bed\u4e49\u3001\u7ec4\u5408\u6027\u548c\u7a7a\u95f4\u5173\u7cfb\uff08\u5982\"\u7ea2\u8272\u7403\u4f53\u4e0a\u7684\u84dd\u8272\u65b9\u5757\"\uff09\u6709\u7740\u66f4\u4e30\u5bcc\u7684\u7406\u89e3\u3002
Imagen \u4f7f\u7528\u4e86\u7ea7\u8054\u6269\u6563\uff08cascaded diffusion\uff09\u65b9\u6cd5\uff1a\u57fa\u7840\u6269\u6563\u6a21\u578b\u751f\u6210 64x64 \u7684\u56fe\u50cf\uff0c\u7b2c\u4e00\u4e2a\u8d85\u5206\u8fa8\u7387\u6a21\u578b\u653e\u5927\u5230 256x256\uff0c\u7b2c\u4e8c\u4e2a\u8d85\u5206\u8fa8\u7387\u6a21\u578b\u8fbe\u5230 1024x1024\u3002\u6bcf\u4e2a\u9636\u6bb5\u90fd\u662f\u72ec\u7acb\u7684\u6269\u6563\u6a21\u578b\uff0c\u4ee5\u6587\u672c\u548c\uff08\u5bf9\u4e8e\u4e0a\u91c7\u6837\u5668\uff09\u4f4e\u5206\u8fa8\u7387\u56fe\u50cf\u4e3a\u6761\u4ef6\u3002\u8fd9\u79cd\u7ea7\u8054\u65b9\u5f0f\u907f\u514d\u4e86\u5728\u57fa\u7840\u5206\u8fa8\u7387\u4e0a\u5efa\u6a21\u7cbe\u7ec6\u7ec6\u8282\uff0c\u4f7f\u57fa\u7840\u6a21\u578b\u80fd\u591f\u4e13\u6ce8\u4e8e\u6784\u56fe\u548c\u8bed\u4e49\uff0c\u800c\u4e0a\u91c7\u6837\u5668\u5219\u8d1f\u8d23\u5904\u7406\u7eb9\u7406\u548c\u6e05\u6670\u5ea6\u3002
Imagen \u8fd8\u5f15\u5165\u4e86\u52a8\u6001\u9608\u503c\uff08dynamic thresholding\uff09\uff1a\u5728\u6bcf\u4e2a\u53bb\u566a\u6b65\u9aa4\u4e2d\uff0c\u9884\u6d4b\u7684\u50cf\u7d20\u503c\u88ab\u88c1\u526a\u5230\u57fa\u4e8e\u767e\u5206\u4f4d\u6570\u7684\u8303\u56f4\uff0c\u800c\u4e0d\u662f\u56fa\u5b9a\u7684 \\([-1, 1]\\) \u8303\u56f4\u3002\u8fd9\u53ef\u4ee5\u9632\u6b62\u5728\u9ad8\u5f15\u5bfc\u5c3a\u5ea6\u4e0b\u51fa\u73b0\u9971\u548c\u4f2a\u5f71\uff0c\u8fd9\u662f\u6269\u6563\u6a21\u578b\u4e2d\u7684\u5e38\u89c1\u95ee\u9898\u3002
Parti\uff08Pathways Autoregressive Text-to-Image\uff0cYu \u7b49\u4eba\uff0c2022\uff09\u4ee5\u8d85\u5927\u5c3a\u5ea6\u590d\u5174\u4e86\u81ea\u56de\u5f52\u65b9\u6cd5\u3002\u4e0e DALL\u00b7E \u7c7b\u4f3c\uff0c\u5b83\u5c06\u56fe\u50cf\u8f6c\u6362\u4e3a\u79bb\u6563 token\uff08\u4f7f\u7528 ViT-VQGAN\uff09\uff0c\u5e76\u7528 Transformer \u987a\u5e8f\u751f\u6210\u3002\u4f46 Parti \u4f7f\u7528\u4e86 200 \u4ebf\u53c2\u6570\u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668 Transformer\uff08\u57fa\u4e8e Pathways \u67b6\u6784\uff09\uff0c\u5e76\u8bc1\u660e\u4e86\u81ea\u56de\u5f52\u6a21\u578b\u5728\u5145\u5206\u6269\u5c55\u540e\u53ef\u4ee5\u8fbe\u5230\u6269\u6563\u6a21\u578b\u7684\u8d28\u91cf\u3002
Parti \u7684\u7f16\u7801\u5668-\u89e3\u7801\u5668\u67b6\u6784\u662f\u4e0e DALL\u00b7E \u7eaf\u89e3\u7801\u5668\u8bbe\u8ba1\u7684\u5173\u952e\u533a\u522b\u3002\u6587\u672c\u901a\u8fc7\u7f16\u7801\u5668\u5904\u7406\uff1b\u89e3\u7801\u5668\u5728\u751f\u6210\u56fe\u50cf token \u65f6\uff0c\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\u5173\u6ce8\u7f16\u7801\u540e\u7684\u6587\u672c\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u673a\u5668\u7ffb\u8bd1\uff08\u7b2c 07 \u7ae0\uff09\u2014\u2014\u4f60\u4ece\"\u6587\u672c\u8bed\u8a00\"\u7ffb\u8bd1\u5230\"\u56fe\u50cf\u8bed\u8a00\"\u3002
\u6269\u6563 Transformer\uff08DiT\uff09\uff08Peebles \u548c Xie\uff0c2023\uff09\u7528\u7eaf Transformer \u66ff\u6362\u4e86\u6269\u6563\u6a21\u578b\u4e2d\u7684 U-Net \u4e3b\u5e72\u7f51\u7edc\u3002\u6bcf\u4e2a\u542b\u566a\u9690\u7a7a\u95f4\u5757\u88ab\u5f53\u4f5c\u4e00\u4e2a token\uff08\u7c7b\u4f3c\u4e8e\u7b2c 8 \u7ae0\u4e2d\u7684 ViT\uff09\uff0cTransformer \u901a\u8fc7\u81ea\u6ce8\u610f\u529b\u548c\u5bf9\u6587\u672c\u6761\u4ef6\u7684\u4ea4\u53c9\u6ce8\u610f\u529b\u6765\u5904\u7406\u8fd9\u4e9b token\u3002DiT \u8868\u660e\uff0c\u5728\u6269\u6563\u4efb\u52a1\u4e2d\uff0cTransformer \u7684\u53ef\u6269\u5c55\u6027\u6bd4 U-Net \u66f4\u5177\u53ef\u9884\u6d4b\u6027\u2014\u2014\u8ba1\u7b97\u91cf\u6bcf\u7ffb\u4e00\u500d\uff0cFID \u5206\u6570\u5c31\u4f1a\u53ef\u9760\u5730\u51cf\u534a\u3002
\u6d41\u5339\u914d\uff08flow matching\uff09\uff08\u56de\u987e\u7b2c 8 \u7ae0\uff09\u5df2\u6210\u4e3a\u6269\u6563\u566a\u58f0\u9884\u6d4b\u8303\u5f0f\u4e4b\u5916\u7684\u4e00\u79cd\u66ff\u4ee3\u65b9\u6848\u3002\u6a21\u578b\u4e0d\u518d\u9884\u6d4b\u9700\u8981\u51cf\u53bb\u7684\u566a\u58f0 \\(\\epsilon\\)\uff0c\u800c\u662f\u9884\u6d4b\u4e00\u4e2a\u901f\u5ea6\u573a \\(v_\\theta(x_t, t)\\)\uff0c\u8be5\u901f\u5ea6\u573a\u6cbf\u76f4\u7ebf\u8def\u5f84\u5c06\u6837\u672c\u4ece\u566a\u58f0\u4f20\u8f93\u5230\u6570\u636e\u3002Stable Diffusion 3 \u548c Flux \u91c7\u7528\u6d41\u5339\u914d\u548c\u591a\u6a21\u6001 DiT\uff08MM-DiT\uff09\u67b6\u6784\uff0c\u5176\u4e2d\u6587\u672c\u548c\u56fe\u50cf token \u7531 Transformer \u5757\u901a\u8fc7\u53cc\u5411\u6ce8\u610f\u529b\u8054\u5408\u5904\u7406\u2014\u2014\u4e24\u79cd\u6a21\u6001\u4e92\u76f8\u5173\u6ce8\uff0c\u800c\u4e0d\u662f\u6587\u672c\u4ec5\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\u4f5c\u4e3a\u56fe\u50cf\u7279\u5f81\u7684\u6761\u4ef6\u3002
Make-A-Video\uff08Singer \u7b49\u4eba\uff0c2022\uff09\u91c7\u7528\u4e86\u4e00\u79cd\u52a1\u5b9e\u7684\u65b9\u6cd5\uff1a\u4ece\u9884\u8bad\u7ec3\u7684\u6587\u751f\u56fe\u6a21\u578b\u5f00\u59cb\uff0c\u6dfb\u52a0\u65f6\u95f4\u5c42\u3002\u5173\u952e\u6d1e\u5bdf\u662f\uff0c\u4f60\u5df2\u7ecf\u62e5\u6709\u4e86\u57fa\u4e8e\u6570\u5341\u4ebf\u56fe\u6587\u5bf9\u8bad\u7ec3\u7684\u5f3a\u5927\u6587\u751f\u56fe\u6a21\u578b\uff0c\u4f60\u53ea\u9700\u8981\u4ece\uff08\u672a\u6807\u6ce8\u7684\uff09\u89c6\u9891\u6570\u636e\u4e2d\u5b66\u4e60\u8fd0\u52a8\u3002
Make-A-Video \u5728\u9884\u8bad\u7ec3\u7684\u7a7a\u95f4 U-Net \u4e2d\u63d2\u5165\u4e86\u65f6\u95f4\u6ce8\u610f\u529b\uff08temporal attention\uff09\u548c\u65f6\u95f4\u5377\u79ef\uff08temporal convolution\uff09\u5c42\u3002\u7a7a\u95f4\u5c42\uff08\u5728\u56fe\u50cf\u4e0a\u9884\u8bad\u7ec3\uff09\u8d1f\u8d23\u5916\u89c2\uff0c\u800c\u65b0\u7684\u65f6\u95f4\u5c42\uff08\u5728\u89c6\u9891\u4e0a\u8bad\u7ec3\uff09\u8d1f\u8d23\u8fd0\u52a8\u3002\u7a7a\u95f4\u81ea\u6ce8\u610f\u529b\u5728\u6bcf\u5e27\u5185\u90e8\u64cd\u4f5c\uff1b\u65f6\u95f4\u6ce8\u610f\u529b\u5728\u6bcf\u4e2a\u7a7a\u95f4\u4f4d\u7f6e\u4e0a\u8de8\u5e27\u64cd\u4f5c\u3002\u8fd9\u79cd\u5206\u89e3\u662f\u9ad8\u6548\u7684\uff0c\u56e0\u4e3a\u65f6\u95f4\u548c\u7a7a\u95f4\u6a21\u5f0f\u5728\u5f88\u5927\u7a0b\u5ea6\u4e0a\u662f\u53ef\u5206\u79bb\u7684\u3002
\u751f\u6210\u6d41\u7a0b\u4e0e Imagen \u7684\u7ea7\u8054\u65b9\u5f0f\u7c7b\u4f3c\uff1a\u57fa\u7840\u6a21\u578b\u751f\u6210 64x64 \u7684 16 \u5e27\uff0c\u7136\u540e\u7a7a\u95f4\u548c\u65f6\u95f4\u8d85\u5206\u8fa8\u7387\u6a21\u578b\u5c06\u5206\u8fa8\u7387\u5347\u7ea7\u5230\u6700\u7ec8\u5927\u5c0f\u548c\u5e27\u7387\u3002\u5e27\u63d2\u503c\u7f51\u7edc\u7528\u4e8e\u63d0\u9ad8\u65f6\u95f4\u5e73\u6ed1\u6027\u3002
VideoPoet\uff08Kondratyuk \u7b49\u4eba\uff0c2024\uff09\u5c06\u89c6\u9891\u751f\u6210\u7edf\u4e00\u5230\u8bed\u8a00\u5efa\u6a21\u8303\u5f0f\u4e4b\u4e0b\u3002\u6240\u6709\u6a21\u6001\u2014\u2014\u6587\u672c\u3001\u56fe\u50cf\u3001\u89c6\u9891\u3001\u97f3\u9891\u2014\u2014\u90fd\u88ab token \u5316\u4e3a\u79bb\u6563\u5e8f\u5217\uff0c\u4e00\u4e2a\u5355\u4e00\u7684\u5927\u8bed\u8a00\u6a21\u578b\uff08LLM\uff09\u88ab\u8bad\u7ec3\u6765\u8de8\u6240\u6709\u6a21\u6001\u81ea\u56de\u5f52\u5730\u9884\u6d4b token\u3002\u8fd9\u4f7f\u5f97\u96f6\u6837\u672c\u80fd\u529b\u6210\u4e3a\u53ef\u80fd\uff1a\u6587\u751f\u89c6\u9891\u3001\u56fe\u751f\u89c6\u9891\u3001\u89c6\u9891\u751f\u97f3\u9891\u3001\u89c6\u9891\u7f16\u8f91\u548c\u89c6\u9891\u4fee\u8865\u90fd\u53ef\u4ee5\u4ece\u540c\u4e00\u4e2a\u6a21\u578b\u4e2d\u6d8c\u73b0\u3002
VideoPoet \u4f7f\u7528 MAGVIT-v2 \u7f16\u7801\u5668\uff08\u4e00\u4e2a\u6765\u81ea\u6587\u4ef6 03 \u7684 3D VQ-VAE\uff09\u5bf9\u89c6\u9891\u8fdb\u884c token \u5316\uff0c\u8be5\u7f16\u7801\u5668\u8054\u5408\u538b\u7f29\u7a7a\u95f4\u548c\u65f6\u95f4\u7ef4\u5ea6\u3002\u97f3\u9891\u4f7f\u7528 SoundStream \u8fdb\u884c token \u5316\u3002LLM \u4e3b\u5e72\u5728\u6587\u672c\u4e0a\u9884\u8bad\u7ec3\uff0c\u7136\u540e\u5728\u591a\u6a21\u6001 token \u5e8f\u5217\u4e0a\u5fae\u8c03\uff0c\u5b66\u4e60\u8de8\u6a21\u6001\u7684\u8054\u5408\u5206\u5e03\u3002
Sora\uff08OpenAI\uff0c2024\uff09\u51ed\u501f\u5176\u751f\u6210\u957f\u65f6\u95f4\u3001\u8fde\u8d2f\u3001\u7269\u7406\u5408\u7406\u7684\u89c6\u9891\u7684\u80fd\u529b\uff0c\u5c06\u65f6\u95f4\u6269\u6563\u5e26\u5165\u4e86\u4e3b\u6d41\u89c6\u91ce\u3002\u867d\u7136\u5b8c\u6574\u7684\u67b6\u6784\u7ec6\u8282\u5c1a\u672a\u516c\u5f00\uff0c\u4f46\u5176\u5173\u952e\u601d\u60f3\u662f\u5c06 DiT \u6269\u5c55\u5230\u65f6\u7a7a\u9886\u57df\uff1a\u89c6\u9891\u5e27\u88ab\u5206\u89e3\u4e3a\u65f6\u7a7a\u5757\uff08spacetime patches\uff09\uff08\u8de8\u8d8a\u9ad8\u5ea6\u3001\u5bbd\u5ea6\u548c\u65f6\u95f4\u7684\u4e09\u7ef4\u5757\uff09\uff0c\u8fd9\u4e9b\u5757\u88ab\u5f53\u4f5c\u5927\u578b Transformer \u7684 token \u6765\u5904\u7406\u3002
\u65f6\u7a7a\u5757\u65b9\u6cd5\u610f\u5473\u7740\u6a21\u578b\u5c06\u89c6\u9891\u4f5c\u4e3a\u539f\u751f\u7684 3D \u4fe1\u53f7\u6765\u5904\u7406\uff0c\u800c\u4e0d\u662f\u4e00\u7cfb\u5217 2D \u5e27\u3002\u8fd9\u4f7f\u5f97\u6a21\u578b\u80fd\u591f\u6355\u83b7\u957f\u7a0b\u7684\u65f6\u95f4\u4f9d\u8d56\u5173\u7cfb\u2014\u2014\u6a21\u578b\u53ef\u4ee5\"\u63d0\u524d\u89c4\u5212\"\u6574\u4e2a\u89c6\u9891\u65f6\u957f\uff0c\u800c\u4e0d\u662f\u9010\u5e27\u751f\u6210\u3002
Sora \u53ef\u4ee5\u901a\u8fc7\u8c03\u6574\u65f6\u7a7a\u5757\u7684\u6570\u91cf\u6765\u5904\u7406\u53ef\u53d8\u7684\u65f6\u957f\u3001\u5206\u8fa8\u7387\u548c\u5bbd\u9ad8\u6bd4\u3002\u4ee5\u6570\u636e\u539f\u751f\u5206\u8fa8\u7387\u8fdb\u884c\u8bad\u7ec3\uff08\u800c\u4e0d\u662f\u5c06\u6240\u6709\u56fe\u50cf\u88c1\u526a\u4e3a\u6b63\u65b9\u5f62\uff09\u53ef\u4ee5\u63d0\u9ad8\u6784\u56fe\u548c\u53d6\u666f\u8d28\u91cf\u3002
Wan\uff08Wan \u7b49\u4eba\uff0c2025\uff09\u662f\u4e00\u4e2a\u5f00\u6e90\u89c6\u9891\u751f\u6210\u6a21\u578b\u7cfb\u5217\uff081.3B \u548c 14B \u53c2\u6570\uff09\uff0c\u57fa\u4e8e DiT \u4e3b\u5e72\u548c 3D VAE \u65f6\u95f4\u538b\u7f29\u3002Wan \u91c7\u7528\u6d41\u5339\u914d\u800c\u4e0d\u662f\u4f20\u7edf\u7684 DDPM \u98ce\u683c\u6269\u6563\uff0c\u5b66\u4e60\u4ece\u566a\u58f0\u5230\u89c6\u9891\u9690\u7a7a\u95f4\u7684\u76f4\u7ebf\u4f20\u8f93\u8def\u5f84\u30023D VAE \u5728\u7a7a\u95f4\u548c\u65f6\u95f4\u4e0a\u538b\u7f29\u89c6\u9891\uff084 \u500d\u65f6\u95f4\u538b\u7f29\uff09\uff0cDiT \u4ee5\u5168 3D \u6ce8\u610f\u529b\u5904\u7406\u751f\u6210\u7684\u65f6\u7a7a\u9690\u7a7a\u95f4 token\u3002
Wan \u652f\u6301\u6587\u751f\u89c6\u9891\u3001\u56fe\u751f\u89c6\u9891\uff08\u5c06\u9759\u6001\u56fe\u50cf\u52a8\u753b\u5316\uff09\u548c\u89c6\u9891\u7f16\u8f91\u300214B \u6a21\u578b\u53ef\u4ee5\u751f\u6210\u957f\u8fbe 5 \u79d2\u3001720p \u5206\u8fa8\u7387\u7684\u8fde\u8d2f\u89c6\u9891\uff0c\u8868\u660e\u5f53\u67b6\u6784\u548c\u8bad\u7ec3\u65b9\u6848\u9009\u62e9\u6070\u5f53\u65f6\uff0c\u5f00\u6e90\u6a21\u578b\u53ef\u4ee5\u63a5\u8fd1\u4e13\u6709\u7cfb\u7edf\u7684\u8d28\u91cf\u3002
AudioLM\uff08Borsos \u7b49\u4eba\uff0c2023\uff09\u901a\u8fc7\u81ea\u56de\u5f52\u9884\u6d4b\u79bb\u6563\u97f3\u9891 token \u6765\u751f\u6210\u97f3\u9891\uff0c\u91c7\u7528\u4e86\u4e0e DALL\u00b7E \u4e3a\u56fe\u50cf\u6240\u7528\u7684\u76f8\u540c\u8bed\u8a00\u5efa\u6a21\u8303\u5f0f\u3002\u5b83\u4f7f\u7528\u5206\u5c42 token \u7ed3\u6784\uff1a\u8bed\u4e49 token\uff08\u6765\u81ea\u81ea\u76d1\u7763\u6a21\u578b\u5982 w2v-BERT\uff0c\u56de\u987e\u7b2c 9 \u7ae0\uff09\u6355\u83b7\u9ad8\u5c42\u6b21\u5185\u5bb9\uff08\u8bf4\u4e86\u4ec0\u4e48\u6216\u6f14\u594f\u4e86\u4ec0\u4e48\uff09\uff0c\u800c\u58f0\u5b66 token\uff08\u6765\u81ea SoundStream\uff0c\u4e00\u79cd\u795e\u7ecf\u97f3\u9891\u7f16\u89e3\u7801\u5668\uff09\u6355\u83b7\u7ec6\u7c92\u5ea6\u7684\u58f0\u5b66\u7ec6\u8282\uff08\u542c\u8d77\u6765\u5982\u4f55\u2014\u2014\u97f3\u8272\u3001\u5f55\u97f3\u8d28\u91cf\uff09\u3002
\u751f\u6210\u5206\u4e24\u4e2a\u9636\u6bb5\u8fdb\u884c\u3002\u9996\u5148\uff0c\u4e00\u4e2a Transformer \u5728\u7ed9\u5b9a\u53ef\u9009\u97f3\u9891\u63d0\u793a\u7684\u60c5\u51b5\u4e0b\u9884\u6d4b\u8bed\u4e49 token\uff0c\u5efa\u7acb\u9ad8\u5c42\u6b21\u7684\"\u5185\u5bb9\u89c4\u5212\"\u3002\u5176\u6b21\uff0c\u53e6\u4e00\u4e2a Transformer \u4ee5\u8bed\u4e49 token \u4e3a\u6761\u4ef6\u9884\u6d4b\u58f0\u5b66 token\uff0c\u586b\u5145\u58f0\u5b66\u7ec6\u8282\u3002\u8fd9\u79cd\u5c42\u6b21\u7ed3\u6784\u7c7b\u4f3c\u4e8e\u6587\u751f\u8bed\u97f3\u6d41\u7a0b\uff08\u7b2c 9 \u7ae0\uff09\u2014\u2014\u8bed\u4e49 token \u626e\u6f14\u97f3\u7d20\u7684\u89d2\u8272\uff0c\u58f0\u5b66 token \u626e\u6f14\u6885\u5c14\u9891\u8c31\u56fe\u5e27\u7684\u89d2\u8272\u3002
AudioLM \u53ef\u4ee5\u751f\u6210\u8bed\u97f3\u63a5\u7eed\uff08\u7ed9\u5b9a 3 \u79d2\u8bed\u97f3\uff0c\u751f\u6210\u63a5\u4e0b\u6765\u7684 10 \u79d2\uff09\u3001\u97f3\u4e50\u63a5\u7eed\u548c\u97f3\u6548\uff0c\u6240\u6709\u8fd9\u4e9b\u90fd\u6765\u81ea\u4e00\u4e2a\u4ec5\u5728\u97f3\u9891\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\u6a21\u578b\uff08\u9884\u8bad\u7ec3\u4e0d\u9700\u8981\u6587\u672c\u6807\u7b7e\uff09\u3002
MusicLM\uff08Agostinelli \u7b49\u4eba\uff0c2023\uff09\u5c06 AudioLM \u6269\u5c55\u5230\u6587\u672c\u6761\u4ef6\u4e0b\u7684\u97f3\u4e50\u751f\u6210\u3002\u5b83\u6dfb\u52a0\u4e86\u4e00\u4e2a\u6587\u672c-\u97f3\u9891\u8054\u5408\u5d4c\u5165\uff08\u6765\u81ea MuLan\uff0c\u4e00\u4e2a\u5728\u97f3\u4e50-\u6587\u672c\u5bf9\u4e0a\u8bad\u7ec3\u7684\u7c7b CLIP \u6a21\u578b\uff09\u6765\u6761\u4ef6\u5316\u751f\u6210\u3002MuLan \u5d4c\u5165\u6355\u83b7\u6587\u672c\u63cf\u8ff0\u7684\u8bed\u4e49\u542b\u4e49\uff08\"\u5e26\u6709\u8428\u514b\u65af\u72ec\u594f\u7684\u6b22\u5feb\u7235\u58eb\u4e50\"\uff09\u5e76\u6307\u5bfc\u5206\u5c42 token \u751f\u6210\u3002
MusicLM \u4ee5 24 kHz \u7684\u9891\u7387\u751f\u6210\u4efb\u610f\u65f6\u957f\u7684\u97f3\u4e50\uff0c\u5728\u6570\u5206\u949f\u957f\u7684\u4f5c\u54c1\u4e2d\u4fdd\u6301\u65cb\u5f8b\u548c\u8282\u594f\u7684\u8fde\u8d2f\u6027\u3002\u5b83\u8fd8\u53ef\u4ee5\u7528\u54fc\u5531\u7684\u65cb\u5f8b\uff08\u7531\u97f3\u9ad8\u8ffd\u8e2a\u5668\u63d0\u53d6\u7684\u65cb\u5f8b token\uff09\u52a0\u4e0a\u6587\u672c\u63cf\u8ff0\u4f5c\u4e3a\u6761\u4ef6\uff0c\u751f\u6210\u5b8c\u6574\u7684\u7f16\u66f2\uff0c\u65e2\u9075\u5faa\u54fc\u5531\u7684\u66f2\u8c03\uff0c\u53c8\u7b26\u5408\u6587\u672c\u63cf\u8ff0\u7684\u98ce\u683c\u3002
MusicGen\uff08Copet \u7b49\u4eba\uff0c2023\uff09\u7b80\u5316\u4e86\u591a\u9636\u6bb5\u65b9\u6cd5\u3002MusicGen \u4e0d\u4f7f\u7528\u72ec\u7acb\u7684\u8bed\u4e49\u548c\u58f0\u5b66\u6a21\u578b\uff0c\u800c\u662f\u4f7f\u7528\u4e00\u4e2a\u5355\u4e00\u7684\u81ea\u56de\u5f52 Transformer\uff0c\u76f4\u63a5\u751f\u6210\u6765\u81ea\u97f3\u9891\u7f16\u89e3\u7801\u5668\u7684\u591a\u4e2a\u7801\u672c\u5c42\u7ea7\u3002\u5173\u952e\u521b\u65b0\u662f\u4ea4\u7ec7\u7801\u672c\u6a21\u5f0f\uff08interleaved codebook pattern\uff09\uff1aMusicGen \u5e76\u975e\u5728\u8fdb\u5165\u4e0b\u4e00\u4e2a\u65f6\u95f4\u6b65\u4e4b\u524d\u751f\u6210\u8be5\u65f6\u95f4\u6b65\u7684\u6240\u6709\u7801\u672c\u5c42\u7ea7\uff0c\u800c\u662f\u4ee5\u67d0\u79cd\u6a21\u5f0f\u8de8\u7801\u672c\u548c\u65f6\u95f4\u6b65\u4ea4\u7ec7 token\uff0c\u4ece\u800c\u5141\u8bb8\u5bf9\u67d0\u4e9b\u7801\u672c\u5c42\u7ea7\u8fdb\u884c\u5e76\u884c\u89e3\u7801\u3002
\u6761\u4ef6\u5316\u76f4\u63a5\u660e\u4e86\uff1a\u6587\u672c\u7531 T5 \u7f16\u7801\u5668\u7f16\u7801\uff0c\u6587\u672c\u5d4c\u5165\u88ab\u524d\u7f6e\u5230\u97f3\u9891 token \u5e8f\u5217\u4e4b\u524d\uff08\u50cf\u8bed\u8a00\u6a21\u578b\u4e2d\u7684\u524d\u7f00\u63d0\u793a\uff09\u6216\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\u6ce8\u5165\u3002MusicGen \u8fd8\u652f\u6301\u65cb\u5f8b\u6761\u4ef6\u5316\uff1a\u53c2\u8003\u65cb\u5f8b\u7684\u8272\u8c31\u56fe\uff08chromagram\uff0c\u6765\u81ea\u7b2c 9 \u7ae0\u4e2d\u8ba8\u8bba\u7684\u9891\u8c31\u56fe\u7279\u5f81\uff09\u88ab\u7f16\u7801\u540e\u4e0e\u6587\u672c\u6761\u4ef6\u4e00\u8d77\u4f7f\u7528\u3002
\u5176\u4e2d \\(w_l\\) \u662f\u63cf\u8ff0\u4e2d\u7684\u8bcd\u8bed\uff0c\\(I\\) \u662f\u56fe\u50cf\u8868\u793a\u3002\u4ea4\u53c9\u6ce8\u610f\u529b\u5c06\u6587\u672c\u89e3\u7801\u5668\u4e0e\u56fe\u50cf\u7279\u5f81\u8fde\u63a5\u8d77\u6765\uff0c\u4f7f\u6a21\u578b\u5728\u751f\u6210\u4e0d\u540c\u8bcd\u8bed\u65f6\u80fd\u591f\"\u67e5\u770b\"\u56fe\u50cf\u7684\u4e0d\u540c\u533a\u57df\u2014\u2014\u751f\u6210\"\u72d7\"\u65f6\u5173\u6ce8\u72d7\u7684\u533a\u57df\uff0c\u751f\u6210\"\u516c\u56ed\"\u65f6\u5173\u6ce8\u516c\u56ed\u7684\u533a\u57df\u3002
CoCa\uff08Contrastive Captioners\uff0cYu \u7b49\u4eba\uff0c2022\uff09\u5728\u4e00\u4e2a\u5355\u4e00\u6a21\u578b\u4e2d\u7edf\u4e00\u4e86\u5bf9\u6bd4\u5b66\u4e60\uff08\u6587\u4ef6 01 \u4e2d\u7684 CLIP \u98ce\u683c\u76ee\u6807\uff09\u548c\u56fe\u50cf\u63cf\u8ff0\u3002\u56fe\u50cf\u7f16\u7801\u5668\u751f\u6210\u7684\u7279\u5f81\u65e2\u7528\u4e8e\u4e0e\u6587\u672c\u8fdb\u884c\u5bf9\u6bd4\u5bf9\u9f50\uff0c\u4e5f\u7528\u4e8e\u63cf\u8ff0\u89e3\u7801\u5668\u4e2d\u7684\u4ea4\u53c9\u6ce8\u610f\u529b\u3002\u8fd9\u79cd\u591a\u4efb\u52a1\u8bad\u7ec3\u4f7f CoCa \u540c\u65f6\u5177\u6709\u5f3a\u5927\u7684\u96f6\u6837\u672c\u8bc6\u522b\u80fd\u529b\uff08\u6765\u81ea\u5bf9\u6bd4\u5b66\u4e60\uff09\u548c\u5f3a\u5927\u7684\u751f\u6210\u80fd\u529b\uff08\u6765\u81ea\u56fe\u50cf\u63cf\u8ff0\uff09\u3002
\u73b0\u4ee3\u65b9\u6cd5\u901a\u5e38\u4f7f\u7528\u5927\u578b\u591a\u6a21\u6001\u6a21\u578b\uff08\u6587\u4ef6 02\uff09\u6765\u8fdb\u884c\u56fe\u50cf\u63cf\u8ff0\u3002LLaVA\u3001Qwen-VL \u548c GPT-4V \u7b49\u6a21\u578b\u5c06\u56fe\u50cf\u63cf\u8ff0\u89c6\u4e3a\u89c6\u89c9\u95ee\u7b54\u7684\u4e00\u79cd\u7279\u6b8a\u60c5\u51b5\u2014\u2014\"\u95ee\u9898\"\u9690\u5f0f\u5730\u5c31\u662f\"\u63cf\u8ff0\u8fd9\u5f20\u56fe\u50cf\"\u3002\u89c6\u89c9\u7f16\u7801\u5668\uff08CLIP ViT \u6216 SigLIP\uff09\u751f\u6210\u5757 token\uff0c\u8fd9\u4e9b token \u88ab\u6295\u5f71\u5230 LLM \u7684\u5d4c\u5165\u7a7a\u95f4\u4e2d\uff0c\u7136\u540e LLM \u751f\u6210\u81ea\u7531\u5f62\u5f0f\u7684\u63cf\u8ff0\u3002
\u57fa\u4e8e LLM \u7684\u63cf\u8ff0\u76f8\u8f83\u4e8e\u4e13\u7528\u7f16\u7801\u5668-\u89e3\u7801\u5668\u6a21\u578b\u7684\u4f18\u52bf\u5728\u4e8e\u6307\u4ee4\u9075\u5faa\uff08instruction following\uff09\uff1a\u4f60\u53ef\u4ee5\u8981\u6c42\u4e0d\u540c\u8be6\u7ec6\u7a0b\u5ea6\uff08\"\u7528\u4e00\u53e5\u8bdd\u63cf\u8ff0\"\u5bf9\u6bd4\"\u63d0\u4f9b\u8be6\u7ec6\u6bb5\u843d\"\uff09\uff0c\u5173\u6ce8\u7279\u5b9a\u65b9\u9762\uff08\"\u63cf\u8ff0\u989c\u8272\"\uff09\uff0c\u6216\u751f\u6210\u7ed3\u6784\u5316\u8f93\u51fa\uff08\"\u5217\u51fa\u6240\u6709\u7269\u4f53\u53ca\u5176\u4f4d\u7f6e\"\uff09\u3002\u8fd9\u79cd\u7075\u6d3b\u6027\u6765\u6e90\u4e8e LLM \u7684\u6307\u4ee4\u5fae\u8c03\uff08\u7b2c 07 \u7ae0\uff09\u3002
\u6838\u5fc3\u6311\u6218\u662f\u65f6\u95f4\u540c\u6b65\uff08temporal synchronisation\uff09\uff1a\u51fb\u9f13\u7684\u97f3\u9891\u5fc5\u987b\u4e0e\u9f13\u69cc\u51fb\u9f13\u7684\u89c6\u89c9\u5e27\u7cbe\u786e\u91cd\u5408\u3002\u8fd9\u9700\u8981\u4e00\u4e2a\u4e24\u79cd\u6a21\u6001\u90fd\u80fd\u5f15\u7528\u7684\u5171\u4eab\u65f6\u95f4\u8868\u793a\u3002
\u4e00\u79cd\u65b9\u6cd5\u662f\u4ece\u5171\u4eab\u7684\u6f5c\u5728\u65f6\u95f4\u7ebf\u751f\u6210\u89c6\u9891\u548c\u97f3\u9891\u3002\u50cf CoDi\uff08Composable Diffusion\uff0cTang \u7b49\u4eba\uff0c2023\uff09\u8fd9\u6837\u7684\u6a21\u578b\u5bf9\u6bcf\u79cd\u6a21\u6001\u4f7f\u7528\u72ec\u7acb\u7684\u6269\u6563\u6a21\u578b\uff0c\u4f46\u901a\u8fc7\u5171\u4eab\u7684\u9690\u7a7a\u95f4\u8fdb\u884c\u5bf9\u9f50\u3002\u5728\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\uff0c\u8de8\u6a21\u6001\u6ce8\u610f\u529b\u5c42\u5b66\u4e60\u5728\u6bcf\u4e2a\u65f6\u95f4\u6b65\u540c\u6b65\u89c6\u89c9\u548c\u97f3\u9891\u7279\u5f81\u3002\u5728\u751f\u6210\u8fc7\u7a0b\u4e2d\uff0c\u4e24\u79cd\u6269\u6563\u8fc7\u7a0b\u540c\u65f6\u8fd0\u884c\uff0c\u901a\u8fc7\u5171\u4eab\u5bf9\u9f50\u76f8\u4e92\u6761\u4ef6\u5316\u3002
\u524d\u9762\u8ba8\u8bba\u7684 VideoPoet \u91c7\u7528\u4e86\u4e00\u79cd\u66f4\u7edf\u4e00\u7684\u65b9\u6cd5\uff1a\u7531\u4e8e\u6240\u6709\u6a21\u6001\u90fd\u88ab token \u5316\u4e3a\u5355\u4e00\u5e8f\u5217\uff0cLLM \u81ea\u7136\u5730\u5b66\u4e60\u4e86\u89c6\u9891 token \u548c\u97f3\u9891 token \u4e4b\u95f4\u7684\u65f6\u95f4\u5bf9\u5e94\u5173\u7cfb\u3002\u4e00\u6bb5\u72d7\u53eb\u7684\u89c6\u9891\u7247\u6bb5\u540e\u9762\u8ddf\u968f\u7740\u76f8\u5e94\u7684\u97f3\u9891 token\uff0c\u6559\u4f1a\u6a21\u578b\u5c06\u89c6\u89c9\u4e0a\u7684\u72d7\u53eb\u52a8\u4f5c\u4e0e\u72d7\u53eb\u58f0\u5173\u8054\u8d77\u6765\u3002
\u65f6\u95f4\u5bf9\u9f50\u635f\u5931\uff08temporal alignment loss\uff09\u51fd\u6570\u663e\u5f0f\u5730\u5f3a\u5236\u540c\u6b65\u3002\u4e00\u79cd\u5f62\u5f0f\u662f\u5728\u5e27\u7ea7\u522b\u4f7f\u7528\u5bf9\u6bd4\u5b66\u4e60\uff1a\u65f6\u95f4 \\(t\\) \u7684\u97f3\u9891\u6bb5\u5e94\u8be5\u4e0e\u65f6\u95f4 \\(t\\) \u7684\u89c6\u9891\u5e27\u6bd4\u5176\u4ed6\u65f6\u523b\u7684\u5e27\u66f4\u76f8\u4f3c\uff1a
InstructPix2Pix\uff08Brooks \u7b49\u4eba\uff0c2023\uff09\u8bad\u7ec3\u4e86\u4e00\u4e2a\u6761\u4ef6\u6269\u6563\u6a21\u578b\uff0c\u8be5\u6a21\u578b\u63a5\u6536\u8f93\u5165\u56fe\u50cf\u548c\u6587\u672c\u6307\u4ee4\uff0c\u7136\u540e\u751f\u6210\u7f16\u8f91\u540e\u7684\u56fe\u50cf\u3002\u5de7\u5999\u4e4b\u5904\u5728\u4e8e\u8bad\u7ec3\u6570\u636e\u7684\u521b\u5efa\u65b9\u5f0f\uff1aGPT-3 \u751f\u6210\u7f16\u8f91\u6307\u4ee4\uff08\"\u53d8\u6210\u51ac\u5929\"\u3001\"\u628a\u732b\u53d8\u6210\u72d7\"\uff09\u4ee5\u53ca\u8f93\u5165-\u8f93\u51fa\u6587\u672c\u63cf\u8ff0\u5bf9\uff0c\u7136\u540e\u6587\u751f\u56fe\u6a21\u578b\uff08Stable Diffusion\uff09\u751f\u6210\u76f8\u5e94\u7684\u56fe\u50cf\u5bf9\u3002
\u6a21\u578b\u662f\u4e00\u4e2a\u4fee\u6539\u540e\u7684 Stable Diffusion U-Net\uff0c\u540c\u65f6\u63a5\u6536\u6587\u672c\u6307\u4ee4\uff08\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\uff09\u548c\u8f93\u5165\u56fe\u50cf\u7684\u9690\u8868\u793a\uff08\u4e0e\u542b\u566a\u9690\u53d8\u91cf\u6309\u901a\u9053\u62fc\u63a5\uff09\u3002\u5b83\u4f7f\u7528\u53cc\u65e0\u5206\u7c7b\u5668\u5f15\u5bfc\uff08dual classifier-free guidance\uff09\uff0c\u5305\u542b\u4e24\u4e2a\u5f15\u5bfc\u5c3a\u5ea6\u2014\u2014\u4e00\u4e2a\u7528\u4e8e\u6587\u672c\u6307\u4ee4\uff08\\(s_T\\)\uff09\uff0c\u4e00\u4e2a\u7528\u4e8e\u8f93\u5165\u56fe\u50cf\uff08\\(s_I\\)\uff09\uff1a
SDEdit\uff08Meng \u7b49\u4eba\uff0c2022\uff09\u63d0\u4f9b\u4e86\u4e00\u79cd\u66f4\u7b80\u5355\u7684\u7f16\u8f91\u65b9\u6cd5\uff0c\u4e0d\u9700\u8981\u7279\u6b8a\u8bad\u7ec3\u3002\u4f60\u5bf9\u8f93\u5165\u56fe\u50cf\u6dfb\u52a0\u566a\u58f0\uff08\u8fd0\u884c\u524d\u5411\u6269\u6563\u8fc7\u7a0b\u5230\u4e2d\u95f4\u65f6\u95f4\u6b65 \\(t_0\\)\uff09\uff0c\u7136\u540e\u7528\u63cf\u8ff0\u6240\u9700\u8f93\u51fa\u7684\u6587\u672c\u63d0\u793a\u8fdb\u884c\u53bb\u566a\u3002\u566a\u58f0\u91cf\u63a7\u5236\u7f16\u8f91\u5f3a\u5ea6\uff1a\u4f4e\u566a\u58f0\u4fdd\u7559\u7ed3\u6784\uff08\u989c\u8272\u53d8\u5316\u3001\u98ce\u683c\u8fc1\u79fb\uff09\uff0c\u800c\u9ad8\u566a\u58f0\u5141\u8bb8\u5927\u5e45\u91cd\u6784\uff08\u7269\u4f53\u66ff\u6362\u3001\u5e03\u5c40\u6539\u53d8\uff09\u3002
\u8fd9\u662f\u4e00\u4e2a\u7cbe\u786e\u7684\u6743\u8861\uff1a\u5728\u65f6\u95f4\u6b65 \\(t_0\\)\uff0c\u542b\u566a\u56fe\u50cf\u4fdd\u7559\u4e86\u539f\u59cb\u4fe1\u53f7\u7684 \\(\\bar{\\alpha}_{t_0}\\) \u6bd4\u4f8b\u3002\u53bb\u566a\u8fc7\u7a0b\u6839\u636e\u65b0\u7684\u6587\u672c\u63d0\u793a\u586b\u5145\u88ab\u7834\u574f\u7684\u7ec6\u8282\u3002\u8fd9\u5728\u6570\u5b66\u4e0a\u662f\u4e25\u8c28\u7684\uff1a\u6269\u6563\u6a21\u578b\u4ece\u540e\u9a8c\u5206\u5e03 \\(p(x_0 \\mid x_{t_0}, c)\\) \u4e2d\u91c7\u6837\uff0c\u5176\u4e2d \\(x_{t_0}\\) \u5c06\u751f\u6210\u7ed3\u679c\u7ea6\u675f\u4e3a\"\u63a5\u8fd1\"\u539f\u59cb\u56fe\u50cf\u3002
ControlNet\uff08Zhang \u7b49\u4eba\uff0c2023\uff09\u4e3a\u6587\u751f\u56fe\u6269\u6563\u589e\u52a0\u4e86\u7ec6\u7c92\u5ea6\u7684\u7a7a\u95f4\u63a7\u5236\u3002\u9884\u8bad\u7ec3 U-Net \u7f16\u7801\u5668\u7684\u526f\u672c\u88ab\u8bad\u7ec3\u6765\u63a5\u53d7\u989d\u5916\u7684\u8f93\u5165\u6761\u4ef6\u2014\u2014\u8fb9\u7f18\u56fe\uff08Canny \u8fb9\u7f18\uff09\u3001\u6df1\u5ea6\u56fe\u3001\u59ff\u6001\u9aa8\u67b6\u3001\u5206\u5272\u56fe\u2014\u2014\u800c\u539f\u59cb U-Net \u6743\u91cd\u88ab\u51bb\u7ed3\u3002ControlNet \u7f16\u7801\u5668\u7684\u8f93\u51fa\u901a\u8fc7\u96f6\u5377\u79ef\uff08zero convolutions\uff09\uff08\u521d\u59cb\u5316\u4e3a\u96f6\u7684 1x1 \u5377\u79ef\uff09\u6dfb\u52a0\u5230\u51bb\u7ed3\u7684 U-Net \u7684\u8df3\u8dc3\u8fde\u63a5\u4e2d\uff0c\u786e\u4fdd\u8bad\u7ec3\u4ece\u9884\u8bad\u7ec3\u6a21\u578b\u7684\u884c\u4e3a\u5f00\u59cb\uff0c\u9010\u6b65\u5b66\u4e60\u65b0\u7684\u6761\u4ef6\u3002
\u8fd9\u79cd\u67b6\u6784\u8ba9\u4f60\u53ef\u4ee5\u63d0\u4f9b\u8349\u56fe\u3001\u6df1\u5ea6\u56fe\u6216\u4eba\u4f53\u59ff\u6001\u4f5c\u4e3a\u7ed3\u6784\u6307\u5bfc\uff0c\u6587\u672c\u63d0\u793a\u5219\u8d1f\u8d23\u586b\u5145\u5916\u89c2\u3002\u9884\u8bad\u7ec3\u6743\u91cd\u5904\u7406\u903c\u771f\u5ea6\u548c\u6587\u672c\u7406\u89e3\uff1bControlNet \u5c42\u5904\u7406\u5bf9\u6761\u4ef6\u7a7a\u95f4\u4fdd\u771f\u5ea6\u7684\u4fdd\u6301\u3002
Frechet Inception Distance\uff08FID\uff09\uff08Heusel \u7b49\u4eba\uff0c2017\uff09\u8861\u91cf\u751f\u6210\u56fe\u50cf\u5206\u5e03\u4e0e\u771f\u5b9e\u56fe\u50cf\u5206\u5e03\u4e4b\u95f4\u5728\u9884\u8bad\u7ec3 Inception \u7f51\u7edc\u7279\u5f81\u7a7a\u95f4\u4e2d\u7684\u8ddd\u79bb\u3002\u53ef\u4ee5\u5c06\u5176\u7406\u89e3\u4e3a\u6bd4\u8f83\u4e24\u4e2a\u56fe\u50cf\u96c6\u5408\u7684\"\u6307\u7eb9\"\uff0c\u800c\u4e0d\u662f\u6bd4\u8f83\u5355\u4e2a\u56fe\u50cf\u3002
\u771f\u5b9e\u56fe\u50cf\u96c6\u548c\u751f\u6210\u56fe\u50cf\u96c6\u90fd\u901a\u8fc7 Inception-v3 \u5904\u7406\uff0c\u6536\u96c6\u5012\u6570\u7b2c\u4e8c\u5c42\u7684\u6fc0\u6d3b\u503c\u3002\u8fd9\u4e9b\u6fc0\u6d3b\u503c\u88ab\u5efa\u6a21\u4e3a\u591a\u5143\u9ad8\u65af\u5206\u5e03 \\(\\mathcal{N}(\\mu_r, \\Sigma_r)\\) \u548c \\(\\mathcal{N}(\\mu_g, \\Sigma_g)\\)\u3002FID \u5c31\u662f\u8fd9\u4e9b\u9ad8\u65af\u5206\u5e03\u4e4b\u95f4\u7684 Frechet \u8ddd\u79bb\uff08Wasserstein-2 \u8ddd\u79bb\uff09\uff1a
FID \u8d8a\u4f4e\u8d8a\u597d\u3002FID = 0 \u610f\u5473\u7740\u5206\u5e03\u5b8c\u5168\u76f8\u540c\u3002FID \u540c\u65f6\u6355\u6349\u8d28\u91cf\uff08\u5982\u679c\u751f\u6210\u7684\u56fe\u50cf\u6a21\u7cca\uff0c\u5176\u7279\u5f81\u5c06\u4e0e\u771f\u5b9e\u56fe\u50cf\u4e0d\u540c\uff09\u548c\u591a\u6837\u6027\uff08\u5982\u679c\u6a21\u578b\u906d\u53d7\u6a21\u5f0f\u574d\u584c\uff0c\\(\\Sigma_g\\) \u5c06\u5c0f\u4e8e \\(\\Sigma_r\\)\uff09\u3002\u5728 ImageNet 256x256 \u4e0a\uff0c\u5f53\u524d\u7684\u5148\u8fdb\u6c34\u5e73\u4e3a FID < 2.0\u3002
FID \u5b58\u5728\u5df2\u77e5\u5c40\u9650\u6027\uff1a\u5b83\u5047\u8bbe\u7279\u5f81\u5206\u5e03\u662f\u9ad8\u65af\u5206\u5e03\uff08\u8fd9\u53ea\u662f\u4e00\u4e2a\u8fd1\u4f3c\uff09\uff0c\u9700\u8981\u6570\u5343\u4e2a\u6837\u672c\u624d\u80fd\u83b7\u5f97\u7a33\u5b9a\u4f30\u8ba1\uff0c\u5e76\u4e14\u4f7f\u7528 Inception \u7279\u5f81\uff08\u53ef\u80fd\u65e0\u6cd5\u6355\u6349\u6240\u6709\u611f\u77e5\u4e0a\u76f8\u5173\u7684\u5dee\u5f02\uff09\u3002
\u5176\u4e2d \\(E_I\\) \u548c \\(E_T\\) \u662f CLIP \u7684\u56fe\u50cf\u548c\u6587\u672c\u7f16\u7801\u5668\u3002CLIPScore \u65e0\u9700\u53c2\u8003\u2014\u2014\u5b83\u4e0d\u9700\u8981\u771f\u5b9e\u56fe\u50cf\uff0c\u53ea\u9700\u8981\u6587\u672c\u63d0\u793a\u3002\u5b83\u4e0e\u4eba\u7c7b\u5bf9\u6587\u672c-\u56fe\u50cf\u5bf9\u9f50\u7684\u5224\u65ad\u9ad8\u5ea6\u76f8\u5173\uff0c\u5df2\u6210\u4e3a\u8bc4\u4f30\u6587\u751f\u56fe\u6a21\u578b\u63d0\u793a\u4fdd\u771f\u5ea6\u7684\u6807\u51c6\u6307\u6807\u3002
\u5982\u679c\u9700\u8981\u4e0e\u53c2\u8003\u63cf\u8ff0\u8fdb\u884c\u6bd4\u8f83\uff0cRefCLIPScore \u4f1a\u7eb3\u5165\u53c2\u8003\u56fe\u50cf\uff1a
\u6df1\u5ea6\u4f2a\u9020\uff08Deepfakes\uff09\u662f\u6307\u65e8\u5728\u63cf\u7ed8\u4ece\u672a\u53d1\u751f\u4e8b\u4ef6\u7684\u751f\u6210\u6216\u64cd\u7eb5\u5a92\u4f53\u3002\u6587\u751f\u56fe\u548c\u6587\u751f\u89c6\u9891\u6a21\u578b\u53ef\u4ee5\u521b\u5efa\u4ee4\u4eba\u4fe1\u670d\u7684\u516c\u4f17\u4eba\u7269\u5047\u7167\u7247\u3001\u634f\u9020\u7684\u8bc1\u636e\u548c\u8bef\u5bfc\u6027\u7684\u65b0\u95fb\u56fe\u50cf\u3002\u5371\u9669\u4e0d\u4ec5\u5728\u4e8e\u4f2a\u9020\u7684\u5b58\u5728\uff0c\u8fd8\u5728\u4e8e\u5b83\u4eec\u7684\u5b58\u5728\u524a\u5f31\u4e86\u5bf9\u6240\u6709\u5a92\u4f53\u7684\u4fe1\u4efb\u2014\u2014\u5982\u679c\u4efb\u4f55\u56fe\u50cf\u90fd\u53ef\u80fd\u662f\u5047\u7684\uff0c\u90a3\u4e48\u5c31\u6ca1\u6709\u56fe\u50cf\u662f\u503c\u5f97\u5b8c\u5168\u4fe1\u4efb\u7684\u3002
\u68c0\u6d4b\u65b9\u6cd5\u5305\u62ec\u8bad\u7ec3\u5206\u7c7b\u5668\u533a\u5206\u771f\u5b9e\u548c\u751f\u6210\u7684\u56fe\u50cf\u3001\u5206\u6790\u7edf\u8ba1\u4f2a\u5f71\uff08GAN \u751f\u6210\u7684\u56fe\u50cf\u5177\u6709\u5fae\u5999\u7684\u9891\u8c31\u7279\u5f81\uff09\u4ee5\u53ca\u5d4c\u5165\u4e0d\u53ef\u89c1\u6c34\u5370\uff08Stable Diffusion \u7684\u4e0d\u53ef\u89c1\u6c34\u5370\u3001Google \u7684 SynthID\uff09\u3002\u7136\u800c\uff0c\u68c0\u6d4b\u662f\u4e00\u573a\u519b\u5907\u7ade\u8d5b\uff1a\u968f\u7740\u751f\u6210\u5668\u7684\u6539\u8fdb\uff0c\u68c0\u6d4b\u5668\u5fc5\u987b\u4e0d\u65ad\u66f4\u65b0\u3002
\u5728\u4e92\u8054\u7f51\u89c4\u6a21\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\u6a21\u578b\u4f1a\u7ee7\u627f\u5e76\u653e\u5927\u793e\u4f1a\u504f\u89c1\u3002\u6587\u751f\u56fe\u6a21\u578b\u4f1a\u4e0d\u6210\u6bd4\u4f8b\u5730\u751f\u6210\u80a4\u8272\u8f83\u6d45\u7684\u9762\u5b54\uff0c\u5c06\u67d0\u4e9b\u804c\u4e1a\u4e0e\u7279\u5b9a\u6027\u522b\u5173\u8054\u8d77\u6765\uff0c\u5e76\u5728\u63d0\u793a\u4e0d\u591f\u660e\u786e\u65f6\u9ed8\u8ba4\u91c7\u7528\u897f\u65b9\u6587\u5316\u89c4\u8303\u3002\u8fd9\u4e9b\u504f\u89c1\u6839\u690d\u4e8e\u8bad\u7ec3\u6570\u636e\u5206\u5e03\u4ee5\u53ca CLIP/T5 \u6587\u672c\u7f16\u7801\u5668\u4e2d\uff0c\u540e\u8005\u4ece\u5176\u81ea\u8eab\u7684\u8bad\u7ec3\u8bed\u6599\u5e93\u4e2d\u7f16\u7801\u4e86\u504f\u89c1\u3002
\u7f13\u89e3\u7b56\u7565\u5305\u62ec\uff1a\u7b56\u5212\u66f4\u5177\u4ee3\u8868\u6027\u7684\u8bad\u7ec3\u6570\u636e\u3001\u5bf9\u6587\u672c\u7f16\u7801\u5668\u5e94\u7528\u53bb\u504f\u6280\u672f\u3001\u4f7f\u7528\u5b89\u5168\u5206\u7c7b\u5668\u8fc7\u6ee4\u6709\u95ee\u9898\u7684\u8f93\u51fa\uff0c\u4ee5\u53ca\u8ba9\u7528\u6237\u80fd\u591f\u63a7\u5236\u4eba\u53e3\u7edf\u8ba1\u5c5e\u6027\u3002\u8fd9\u4e9b\u90fd\u4e0d\u662f\u5b8c\u6574\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u6301\u7eed\u7684\u5ba1\u6838\u81f3\u5173\u91cd\u8981\u3002
\u8d1f\u8d23\u4efb\u7684\u90e8\u7f72\u9700\u8981\u591a\u5c42\u4fdd\u62a4\u3002\u8f93\u5165\u8fc7\u6ee4\u5728\u751f\u6210\u4e4b\u524d\u963b\u6b62\u6709\u5bb3\u63d0\u793a\u3002\u8f93\u51fa\u8fc7\u6ee4\u5bf9\u751f\u6210\u5185\u5bb9\u8fdb\u884c\u5206\u7c7b\u5e76\u62d2\u7edd\u6709\u5bb3\u6750\u6599\u3002NSFW \u5206\u7c7b\u5668\u68c0\u6d4b\u9732\u9aa8\u8272\u60c5\u3001\u66b4\u529b\u6216\u5176\u4ed6\u6709\u5bb3\u5185\u5bb9\u3002\u4f8b\u5982\uff0cStable Diffusion \u7684\u5b89\u5168\u68c0\u67e5\u5668\u8ba1\u7b97\u751f\u6210\u56fe\u50cf\u7684 CLIP \u5d4c\u5165\u4e0e\u4e00\u7ec4\u9884\u5b9a\u4e49\u7684\u6709\u5bb3\u6982\u5ff5\u5d4c\u5165\u4e4b\u95f4\u7684\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff0c\u6807\u8bb0\u8d85\u8fc7\u9608\u503c\u7684\u56fe\u50cf\u3002
\u8bb8\u591a\u751f\u6210\u6a21\u578b\uff08Stable Diffusion\u3001Wan\uff09\u7684\u5f00\u6e90\u6027\u8d28\u5728\u666e\u53ca\u8bbf\u95ee\u548c\u9632\u6b62\u6ee5\u7528\u4e4b\u95f4\u5f62\u6210\u4e86\u5f20\u529b\u3002\u4e00\u65e6\u6a21\u578b\u6743\u91cd\u53d1\u5e03\uff0c\u5185\u5bb9\u8fc7\u6ee4\u5c31\u53ef\u4ee5\u88ab\u7ed5\u8fc7\u3002\u8fd9\u5f15\u53d1\u4e86\u5173\u4e8e\u9002\u5f53\u7684\u5f00\u653e\u7a0b\u5ea6\u4ee5\u53ca\u6a21\u578b\u5f00\u53d1\u8005\u8d23\u4efb\u7684\u8ba8\u8bba\u3002
\u4e3a\u4e00\u4e2a\u73a9\u5177 2D \u6269\u6563\u6a21\u578b\u5b9e\u73b0\u65e0\u5206\u7c7b\u5668\u5f15\u5bfc\u3002\u5728 2D \u6570\u636e\u96c6\uff08\u4f8b\u5982\u6807\u6ce8\u7684\u805a\u7c7b\uff09\u4e0a\u8bad\u7ec3\u4e00\u4e2a\u6761\u4ef6\u6269\u6563\u6a21\u578b\uff0c\u7136\u540e\u4f7f\u7528\u4e0d\u540c\u7684\u5f15\u5bfc\u5c3a\u5ea6\u8fdb\u884c\u91c7\u6837\uff0c\u89c2\u5bdf\u8d28\u91cf\u4e0e\u591a\u6837\u6027\u7684\u6743\u8861\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# Toy 2D conditional diffusion with classifier-free guidance\ndef noise_schedule(T):\n betas = jnp.linspace(1e-4, 0.02, T)\n alphas = 1.0 - betas\n return jnp.cumprod(alphas)\n\ndef forward_diffuse(x0, t, alpha_bars, key):\n noise = jax.random.normal(key, x0.shape)\n return jnp.sqrt(alpha_bars[t]) * x0 + jnp.sqrt(1 - alpha_bars[t]) * noise, noise\n\n# Generate labelled 2D data: class 0 = ring, class 1 = cluster\nkey = jax.random.PRNGKey(42)\nk1, k2, k3 = jax.random.split(key, 3)\ntheta = jax.random.uniform(k1, (200,)) * 2 * jnp.pi\nring = jnp.stack([jnp.cos(theta), jnp.sin(theta)], axis=1) * 2\nring += jax.random.normal(k2, ring.shape) * 0.1\ncluster = jax.random.normal(k3, (200, 2)) * 0.3\n\ndata = jnp.concatenate([ring, cluster])\nlabels = jnp.concatenate([jnp.zeros(200), jnp.ones(200)])\n\n# Simulate CFG: show how guidance pushes samples toward class-conditional modes\n# Try varying guidance_scale from 0.0 to 5.0 and observe results\nguidance_scales = [0.0, 1.0, 3.0, 7.0]\nfig, axes = plt.subplots(1, 4, figsize=(16, 4))\nfor ax, s in zip(axes, guidance_scales):\n ax.scatter(ring[:, 0], ring[:, 1], s=8, alpha=0.4, label='Ring (c=0)')\n ax.scatter(cluster[:, 0], cluster[:, 1], s=8, alpha=0.4, label='Cluster (c=1)')\n ax.set_title(f'Guidance scale s={s}')\n ax.set_xlim(-4, 4); ax.set_ylim(-4, 4)\n ax.set_aspect('equal'); ax.legend(fontsize=7)\nplt.suptitle('Experiment: vary guidance scale and observe quality vs diversity')\nplt.tight_layout(); plt.show()\n# Exercise: train a small MLP denoiser with class conditioning,\n# then implement the CFG formula to sample with different s values.\n \u4f7f\u7528\u5b8c\u6574\u7684 Frechet \u8ddd\u79bb\u516c\u5f0f\u8ba1\u7b97\u4e24\u7ec4 2D \u6837\u672c\u4e4b\u95f4\u7684 FID\u3002\u6539\u53d8\u751f\u6210\u5206\u5e03\uff0c\u89c2\u5bdf FID \u5982\u4f55\u53d8\u5316\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef compute_fid(real, generated):\n \"\"\"Compute Frechet distance between two 2D sample sets.\"\"\"\n mu_r, mu_g = jnp.mean(real, axis=0), jnp.mean(generated, axis=0)\n sigma_r = jnp.cov(real.T)\n sigma_g = jnp.cov(generated.T)\n diff = mu_r - mu_g\n # Matrix square root via eigendecomposition\n product = sigma_r @ sigma_g\n eigvals, eigvecs = jnp.linalg.eigh(product)\n sqrt_product = eigvecs @ jnp.diag(jnp.sqrt(jnp.maximum(eigvals, 0))) @ eigvecs.T\n fid = jnp.sum(diff ** 2) + jnp.trace(sigma_r + sigma_g - 2 * sqrt_product)\n return fid\n\nkey = jax.random.PRNGKey(0)\nk1, k2, k3, k4 = jax.random.split(key, 4)\n\n# Real distribution: standard 2D Gaussian\nreal = jax.random.normal(k1, (1000, 2))\n\n# Generated distributions with increasing divergence\nshifts = [0.0, 0.5, 1.0, 2.0, 4.0]\nfig, axes = plt.subplots(1, len(shifts), figsize=(18, 3.5))\nfor ax, shift in zip(axes, shifts):\n gen = jax.random.normal(k2, (1000, 2)) * (1 + shift * 0.2) + shift\n fid = compute_fid(real, gen)\n ax.scatter(real[:, 0], real[:, 1], s=3, alpha=0.3, label='Real')\n ax.scatter(gen[:, 0], gen[:, 1], s=3, alpha=0.3, label='Generated')\n ax.set_title(f'Shift={shift}\\nFID={fid:.2f}')\n ax.set_xlim(-5, 8); ax.set_ylim(-5, 8)\n ax.set_aspect('equal'); ax.legend(fontsize=7)\nplt.suptitle('FID increases as generated distribution diverges from real')\nplt.tight_layout(); plt.show()\n# Try: change the variance of generated samples without shifting the mean.\n# How does FID respond to a diversity mismatch vs a location mismatch?\n \u4f7f\u7528\u968f\u673a\u6295\u5f71\u4f5c\u4e3a CLIP \u7684\u66ff\u4ee3\uff0c\u5b9e\u73b0\u6587\u672c\u548c\u56fe\u50cf\u5d4c\u5165\u4e4b\u95f4\u7684 CLIPScore \u8ba1\u7b97\u3002\u89c2\u5bdf\u5f53\u4f60\u6539\u53d8\u6a21\u6001\u4e4b\u95f4\u7684\"\u5bf9\u9f50\u5ea6\"\u65f6\uff0c\u4f59\u5f26\u76f8\u4f3c\u5ea6\u5982\u4f55\u53d8\u5316\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef cosine_similarity(a, b):\n return jnp.dot(a, b) / (jnp.linalg.norm(a) * jnp.linalg.norm(b))\n\ndef clip_score(img_emb, txt_emb):\n \"\"\"CLIPScore: clamped cosine similarity.\"\"\"\n return jnp.maximum(0.0, cosine_similarity(img_emb, txt_emb))\n\nkey = jax.random.PRNGKey(42)\ndim = 512 # CLIP embedding dimension\n\n# Simulate aligned and misaligned pairs\n# Aligned: image and text embeddings share a component\nk1, k2, k3 = jax.random.split(key, 3)\nshared = jax.random.normal(k1, (dim,))\nshared = shared / jnp.linalg.norm(shared)\n\nnoise_levels = jnp.linspace(0, 5, 20)\nscores = []\nfor noise in noise_levels:\n noise_vec = jax.random.normal(k2, (dim,)) * noise\n img_emb = shared + noise_vec * 0.3\n txt_emb = shared + jax.random.normal(k3, (dim,)) * noise * 0.3\n scores.append(float(clip_score(img_emb, txt_emb)))\n\nplt.figure(figsize=(8, 4))\nplt.plot(noise_levels, scores, 'o-', color='#2c3e50')\nplt.xlabel('Noise level (misalignment)')\nplt.ylabel('CLIPScore')\nplt.title('CLIPScore decreases as text-image alignment degrades')\nplt.grid(True, alpha=0.3)\nplt.tight_layout(); plt.show()\n# Experiment: what happens if you normalise embeddings before adding noise?\n# How does dimensionality affect the score distribution?\n \u7edf\u4e00\u591a\u6a21\u6001\u67b6\u6784\u7528\u5355\u4e00\u7cfb\u7edf\u53d6\u4ee3\u4e86\u5404\u81ea\u4e3a\u653f\u7684\u4e13\u5bb6\u6a21\u578b\uff0c\u8fd9\u4e2a\u7cfb\u7edf\u80fd\u591f\u8de8\u8d8a\u6587\u672c\u3001\u56fe\u50cf\u3001\u97f3\u9891\u548c\u89c6\u9891\u8fdb\u884c\u8bfb\u53d6\u3001\u63a8\u7406\u548c\u751f\u6210\u3002\u672c\u6587\u6db5\u76d6\u4e86\u4efb\u610f\u5230\u4efb\u610f\u6a21\u578b\uff08CoDi\u3001NExT-GPT\uff09\u3001\u539f\u751f\u591a\u6a21\u6001\u5927\u8bed\u8a00\u6a21\u578b\uff08Gemini\u3001GPT-4o\uff09\u3001\u591a\u6a21\u6001\u5206\u8bcd\u7b56\u7565\uff0c\u4ee5\u53ca\u7edf\u4e00\u5316\u6240\u5e26\u6765\u7684\u67b6\u6784\u6743\u8861\u3002
"},{"location":"chapter%2010%3A%20multimodal%20learning/05.%20unified%20multimodal%20architectures/#_2","title":"\u7edf\u4e00\u5316\u7684\u7406\u7531","text":"\u60f3\u8c61\u4e00\u4f4d\u4f1a\u8bf4\u4e94\u79cd\u8bed\u8a00\u3001\u80fd\u5728\u53e5\u5b50\u4e2d\u95f4\u65e0\u505c\u987f\u5730\u5207\u6362\u8bed\u79cd\u7684\u7ffb\u8bd1\u3002\u65e9\u671f\u7684\u591a\u6a21\u6001\u7cfb\u7edf\u66f4\u50cf\u662f\u4e94\u4e2a\u5750\u5728\u4e0d\u540c\u623f\u95f4\u7684\u7ffb\u8bd1\uff0c\u6bcf\u4eba\u5904\u7406\u4e00\u79cd\u8bed\u8a00\uff0c\u901a\u8fc7\u5899\u4e0a\u7684\u5c0f\u7f1d\u9699\u4f20\u9012\u7eb8\u6761\u3002\u800c\u7edf\u4e00\u591a\u6a21\u6001\u67b6\u6784\u5c31\u662f\u90a3\u4e00\u4f4d\u591a\u8bed\u8a00\u8005\uff1a\u4e00\u4e2a\u5171\u4eab\u6743\u91cd\u7684\u6a21\u578b\uff0c\u5728\u5355\u6b21\u524d\u5411\u4f20\u64ad\u4e2d\u5373\u53ef\u8de8\u6587\u672c\u3001\u56fe\u50cf\u3001\u97f3\u9891\u3001\u89c6\u9891\u751a\u81f3\u52a8\u4f5c\u8fdb\u884c\u8bfb\u53d6\u3001\u4e66\u5199\u548c\u63a8\u7406\u3002
\u5176\u52a8\u673a\u65e2\u6709\u5b9e\u7528\u5c42\u9762\u7684\u4e5f\u6709\u7406\u8bba\u5c42\u9762\u7684\u3002\u5728\u5b9e\u7528\u5c42\u9762\uff0c\u7ef4\u62a4\u6bcf\u5bf9\u6a21\u6001\u7684\u4e13\u7528\u4e13\u5bb6\u6a21\u578b\uff08\u6587\u672c\u5230\u56fe\u50cf\u3001\u56fe\u50cf\u5230\u6587\u672c\u3001\u97f3\u9891\u5230\u6587\u672c\u7b49\uff09\u4f1a\u5bfc\u81f4\u7ec4\u5408\u7206\u70b8\uff1a\\(k\\) \u79cd\u6a21\u6001\u9700\u8981\u6700\u591a \\(k(k-1)\\) \u4e2a\u6709\u5411\u6d41\u6c34\u7ebf\u3002\u4e00\u4e2a\u7edf\u4e00\u6a21\u578b\u5c06\u6240\u6709\u8fd9\u7c7b\u6d41\u6c34\u7ebf\u574d\u7f29\u4e3a\u5355\u4e00\u7cfb\u7edf\u3002\u5728\u7406\u8bba\u5c42\u9762\uff0c\u4eba\u7c7b\u8ba4\u77e5\u5e76\u975e\u5728\u9694\u79bb\u7684\u6a21\u5757\u4e2d\u5904\u7406\u89c6\u89c9\u548c\u8bed\u8a00\uff1b\u8de8\u6a21\u6001\u7ed1\u5b9a\u53d1\u751f\u5f97\u65e9\u4e14\u6df1\uff0c\u7edf\u4e00\u5316\u5c1d\u8bd5\u6a21\u4eff\u8fd9\u4e00\u70b9\u3002
\u5171\u4eab\u6743\u91cd\u9f13\u52b1\u8de8\u6a21\u6001\u8fc1\u79fb\u3002\u4e00\u4e2a\u5df2\u5728\u6587\u672c\u4e2d\u5b66\u5230\u65f6\u95f4\u6a21\u5f0f\uff08\u4e3b\u8bed\u5728\u52a8\u8bcd\u524d\u3001\u539f\u56e0\u5728\u7ed3\u679c\u524d\uff09\u7684 Transformer\uff0c\u53ef\u4ee5\u5c06\u540c\u6837\u7684\u6ce8\u610f\u529b\u7535\u8def\u91cd\u65b0\u7528\u4e8e\u89c6\u9891\u4e2d\u7684\u65f6\u95f4\u6a21\u5f0f\uff08\u5bf9\u8c61\u51fa\u73b0\u5728\u79fb\u52a8\u4e4b\u524d\uff09\u6216\u97f3\u9891\u4e2d\u7684\u65f6\u95f4\u6a21\u5f0f\uff08\u8d77\u97f3\u5728\u6301\u7eed\u4e4b\u524d\uff09\u3002\u8fd9\u662f\u8fc1\u79fb\u5b66\u4e60\u7684\u591a\u6a21\u6001\u7c7b\u6bd4\u2014\u2014\u4f60\u66fe\u5728\u7b2c 7 \u7ae0\u7684\u8bed\u8a00\u6a21\u578b\u5fae\u8c03\u4e2d\u548c\u7b2c 8 \u7ae0\u7684 ImageNet \u9884\u8bad\u7ec3\u4e2d\u89c1\u5230\u8fc7\u3002
\u5f62\u5f0f\u4e0a\uff0c\u4ee4 \\(\\mathcal{M} = \\{m_1, m_2, \\ldots, m_k\\}\\) \u4e3a\u4e00\u7ec4\u6a21\u6001\u3002\u7edf\u4e00\u6a21\u578b\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5355\u4e00\u53c2\u6570\u5316\u51fd\u6570 \\(f_\\theta\\)\uff0c\u5b83\u5c06\u4efb\u610f\u8f93\u5165\u6a21\u6001\u5b50\u96c6\u6620\u5c04\u5230\u4efb\u610f\u8f93\u51fa\u6a21\u6001\u5b50\u96c6\uff1a
\u60f3\u8c61\u4e00\u4e2a\u901a\u7528\u9065\u63a7\u5668\uff0c\u53ef\u4ee5\u901a\u8fc7\u540c\u4e00\u4e2a\u754c\u9762\u64cd\u4f5c\u4f60\u7684\u7535\u89c6\u3001\u7a7a\u8c03\u548c\u97f3\u54cd\u7cfb\u7edf\u3002\u4efb\u610f\u5230\u4efb\u610f\u6a21\u578b\u5c31\u662f AI \u4e2d\u7684\u7b49\u4ef7\u7269\uff1a\u5b83\u4eec\u63a5\u6536\u4efb\u610f\u6a21\u6001\u7ec4\u5408\u4f5c\u4e3a\u8f93\u5165\uff0c\u5e76\u4ea7\u751f\u4efb\u610f\u7ec4\u5408\u4f5c\u4e3a\u8f93\u51fa\u3002
CoDi\uff08Composable Diffusion\uff0c\u53ef\u7ec4\u5408\u6269\u6563\uff09\u901a\u8fc7\u8bad\u7ec3\u6a21\u6001\u7279\u5b9a\u7684\u6269\u6563\u6a21\u578b\uff0c\u7136\u540e\u901a\u8fc7\u5171\u4eab\u6761\u4ef6\u673a\u5236\u5bf9\u9f50\u5b83\u4eec\u7684\u6f5c\u5728\u7a7a\u95f4\u6765\u5b9e\u73b0\u4efb\u610f\u5230\u4efb\u610f\u751f\u6210\u3002\u6bcf\u79cd\u6a21\u6001\u90fd\u6709\u5176\u81ea\u8eab\u7684\u6269\u6563\u8fc7\u7a0b\uff08\u56de\u987e\u672c\u7ae0\u6587\u4ef6 04 \u4e2d\u7684\u6269\u6563\u6a21\u578b\uff09\uff0c\u4f46\u566a\u58f0\u9884\u6d4b\u7f51\u7edc\u88ab\u6761\u4ef6\u5316\u5728\u4e00\u4e2a\u8054\u5408\u4ea4\u53c9\u6ce8\u610f\u529b\u5c42\u4e0a\uff0c\u8be5\u5c42\u540c\u65f6\u770b\u5230\u6240\u6709\u8f93\u5165\u6a21\u6001\u7684\u5d4c\u5165\u3002\u8fd9\u8ba9 CoDi \u80fd\u591f\u5728\u5355\u6b21\u524d\u5411\u4f20\u64ad\u4e2d\uff0c\u4f8b\u5982\u4ece\u4e00\u4e2a\u6587\u672c\u63d0\u793a\u751f\u6210\u56fe\u50cf\u548c\u5339\u914d\u7684\u97f3\u9891\u3002
NExT-GPT \u91c7\u7528\u4e86\u4e0d\u540c\u7684\u67b6\u6784\u65b9\u6cd5\u3002\u5b83\u5c06 LLM \u4e3b\u5e72\uff08\"\u5927\u8111\"\uff09\u901a\u8fc7\u8f7b\u91cf\u7ea7\u7684\u6295\u5f71\u5c42\u8fde\u63a5\u5230\u8f93\u5165\u4fa7\u7684\u6a21\u6001\u7279\u5b9a\u7f16\u7801\u5668\u548c\u8f93\u51fa\u4fa7\u7684\u6a21\u6001\u7279\u5b9a\u89e3\u7801\u5668\u3002\u8f93\u5165\u7f16\u7801\u5668\uff08\u4f8b\u5982\u6765\u81ea CLIP \u7684\u56fe\u50cf\u7f16\u7801\u5668\u3001\u6765\u81ea CLAP \u7684\u97f3\u9891\u7f16\u7801\u5668\uff09\u5c06\u6bcf\u79cd\u6a21\u6001\u7ffb\u8bd1\u6210 LLM \u7684\u5d4c\u5165\u7a7a\u95f4\u3002LLM \u5bf9\u7ec4\u5408\u540e\u7684 token \u5e8f\u5217\u8fdb\u884c\u63a8\u7406\uff0c\u5e76\u53d1\u51fa\u7279\u6b8a\u7684\"\u6a21\u6001\u4fe1\u53f7 token\"\u6765\u5c06\u4fe1\u606f\u8def\u7531\u5230\u9002\u5f53\u7684\u89e3\u7801\u5668\uff08\u4f8b\u5982\u7528\u4e8e\u56fe\u50cf\u7684 Stable Diffusion\u3001\u7528\u4e8e\u97f3\u9891\u7684 AudioLDM\uff09\u3002\u53ea\u6709\u6295\u5f71\u5c42\u88ab\u8bad\u7ec3\uff1bLLM \u548c\u4e13\u5bb6\u7f16\u89e3\u7801\u5668\u4fdd\u6301\u51bb\u7ed3\u3002
Gemini\uff08Google DeepMind\uff09\u4ece\u9884\u8bad\u7ec3\u9636\u6bb5\u8d77\u5c31\u662f\u539f\u751f\u591a\u6a21\u6001\u7684\u3002\u4e0e NExT-GPT \u7684\u5373\u63d2\u5373\u7528\u65b9\u6cd5\u4e0d\u540c\uff0cGemini \u7684 Transformer \u4ece\u5934\u5f00\u59cb\u5c31\u5728\u6587\u672c\u3001\u56fe\u50cf\u3001\u97f3\u9891\u548c\u89c6\u9891 token \u7684\u4ea4\u9519\u5e8f\u5217\u4e0a\u8fdb\u884c\u8bad\u7ec3\u3002\u8fd9\u610f\u5473\u7740\u8de8\u6a21\u6001\u6ce8\u610f\u529b\u6a21\u5f0f\u5728\u9884\u8bad\u7ec3\u671f\u95f4\u6709\u673a\u5730\u53d1\u5c55\uff0c\u800c\u4e0d\u662f\u4e8b\u540e\u624d\u62fc\u63a5\u4e0a\u53bb\u3002\u8be5\u6a21\u578b\u5bf9\u6587\u672c\u4f7f\u7528 SentencePiece tokenizer\uff0c\u5e76\u5b66\u4e60\u4e86\u4e00\u79cd\u7c7b\u4f3c\u4e8e\u672c\u7ae0\u6587\u4ef6 03 \u4e2d\u8ba8\u8bba\u7684 VQ \u65b9\u6cd5\u7684\u89c6\u89c9 tokenizer\u3002
GPT-4o\uff08\"o\"\u4ee3\u8868\"omni\"\uff0c\u5168\u6a21\u6001\uff09\u4ee3\u8868\u4e86\u53e6\u4e00\u79cd\u6a21\u5f0f\uff1a\u4e00\u4e2a\u7aef\u5230\u7aef\u6a21\u578b\uff0c\u5176\u4e2d\u6240\u6709\u6a21\u6001\u5171\u4eab\u540c\u4e00\u4e2a Transformer \u548c\u540c\u4e00\u4e2a\u4e0b\u4e00 token \u9884\u6d4b\u76ee\u6807\u3002\u97f3\u9891\u8f93\u5165\u4f5c\u4e3a\u9891\u8c31 token \u5904\u7406\uff0c\u56fe\u50cf\u4f5c\u4e3a\u5757 token\uff0c\u6587\u672c\u4f5c\u4e3a\u5b50\u8bcd token\uff0c\u5168\u90e8\u9001\u5165\u5355\u4e00\u5e8f\u5217\u3002\u6a21\u578b\u751f\u6210\u7684\u8f93\u51fa token \u7531\u6a21\u6001\u7279\u5b9a\u7684\u5934\u90e8\u89e3\u7801\u3002\u5173\u952e\u521b\u65b0\u5728\u4e8e\u4f4e\u5ef6\u8fdf\u2014\u2014\u901a\u8fc7\u6d88\u9664\u65e9\u671f\u7cfb\u7edf\uff08\u5982 GPT-4V\uff09\u6240\u4f9d\u8d56\u7684\u72ec\u7acb ASR\u3001LLM \u548c TTS \u7ea7\u8054\u800c\u5b9e\u73b0\u3002
\u8fd9\u4e9b\u6a21\u578b\u5904\u4e8e\u96c6\u6210\u6df1\u5ea6\u8c31\u7cfb\u7684\u4e0d\u540c\u4f4d\u7f6e\uff1a
\u60f3\u8c61\u4e00\u5bb6\u5de5\u5382\u6709\u4e00\u6761\u603b\u88c5\u7ebf\uff08\u5171\u4eab\u4e3b\u5e72\uff09\uff0c\u4f46\u6709\u4e0d\u540c\u7684\u539f\u6599\u88c5\u5378\u7801\u5934\uff08\u7f16\u7801\u5668\uff09\u548c\u4e0d\u540c\u7684\u6210\u54c1\u53d1\u8fd0\u90e8\u95e8\uff08\u89e3\u7801\u5668\uff09\u3002\u6bcf\u4e2a\u7801\u5934\u4e13\u7cbe\u4e8e\u5176\u8d27\u7269\uff0c\u4f46\u4e00\u65e6\u8fdb\u5165\u5de5\u5382\u5185\u90e8\uff0c\u6240\u6709\u4e1c\u897f\u90fd\u5728\u540c\u4e00\u6761\u4f20\u9001\u5e26\u4e0a\u79fb\u52a8\u3002
\u7edf\u4e00\u6a21\u578b\u7684\u4e3b\u5bfc\u67b6\u6784\u6a21\u5f0f\u91c7\u7528\u8fd9\u79cd\u4e09\u90e8\u5206\u7ed3\u6784\uff1a
\u5bf9\u4e8e\u6587\u672c\uff0c\u7f16\u7801\u5668\u901a\u5e38\u662f\u4e00\u4e2a\u5d4c\u5165\u67e5\u627e\u8868 \\(E_\\text{text}(w) = \\mathbf{W}_e[w]\\)\uff0c\u5176\u4e2d \\(w\\) \u662f token \u7d22\u5f15\uff0c\u4e0e\u4f60\u5728\u7b2c 7 \u7ae0 Transformer \u4e2d\u770b\u5230\u7684\u76f8\u540c\u3002\u5bf9\u4e8e\u56fe\u50cf\uff0c\u7f16\u7801\u5668\u901a\u5e38\u662f\u89c6\u89c9 Transformer\uff08ViT\uff09\uff0c\u5b83\u5c06\u56fe\u50cf\u5206\u5272\u6210\u5757\u5e76\u5c06\u6bcf\u4e2a\u5757\u7ebf\u6027\u6295\u5f71\uff0c\u5982\u7b2c 8 \u7ae0\u6240\u8ff0\u3002\u5bf9\u4e8e\u97f3\u9891\uff0c\u7f16\u7801\u5668\u8ba1\u7b97\u6885\u5c14\u9891\u8c31\u56fe\uff0c\u7136\u540e\u7528\u5377\u79ef\u524d\u7aef\u6216\u97f3\u9891\u9891\u8c31\u56fe Transformer\uff08AST\uff09\u5904\u7406\uff0c\u5982\u7b2c 9 \u7ae0\u6240\u8ff0\u3002
\u5171\u4eab\u4e3b\u5e72\u662f\u4e00\u4e2a\u6807\u51c6 Transformer\uff0c\u5bf9\u6240\u6709\u6a21\u6001 token \u8fdb\u884c\u81ea\u6ce8\u610f\u529b\u3002\u7ed9\u5b9a\u4e00\u4e2a\u62fc\u63a5\u8f93\u5165\u5e8f\u5217 \\(\\mathbf{H} = [\\mathbf{h}_1^{m_1}, \\ldots, \\mathbf{h}_{n_1}^{m_1}, \\mathbf{h}_1^{m_2}, \\ldots, \\mathbf{h}_{n_2}^{m_2}]\\)\uff0c\u81ea\u6ce8\u610f\u529b\u5141\u8bb8\u6bcf\u4e2a token \u5173\u6ce8\u6240\u6709\u5176\u4ed6 token\uff0c\u65e0\u8bba\u5176\u6a21\u6001\u5982\u4f55\uff1a
\u8fd9\u4e0e\u7b2c 7 \u7ae0\u4e2d\u7684\u6ce8\u610f\u529b\u516c\u5f0f\u76f8\u540c\uff0c\u4f46\u73b0\u5728 \\(\\mathbf{Q}\\)\u3001\\(\\mathbf{K}\\) \u548c \\(\\mathbf{V}\\) \u5305\u542b\u6765\u81ea\u591a\u79cd\u6a21\u6001\u7684 token\u3002\u56fe\u50cf\u5757 token \u53ef\u4ee5\u5173\u6ce8\u6587\u672c token\uff0c\u4ece\u800c\u65e0\u9700\u5355\u72ec\u7684\u4ea4\u53c9\u6ce8\u610f\u529b\u6a21\u5757\u5373\u53ef\u5b9e\u73b0\u8de8\u6a21\u6001\u63a8\u7406\u3002
\u6a21\u6001\u5d4c\u5165\u88ab\u6dfb\u52a0\u5230\u6bcf\u4e2a token \u4e0a\uff0c\u4ee5\u4fbf\u4e3b\u5e72\u77e5\u9053 token \u6765\u81ea\u54ea\u79cd\u6a21\u6001\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u4f4d\u7f6e\u5d4c\u5165\uff0c\u4f46\u7f16\u7801\u7684\u662f\u6a21\u6001\u8eab\u4efd\u800c\u975e\u5e8f\u5217\u4f4d\u7f6e\u3002\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684\u5411\u91cf \\(\\mathbf{e}_m \\in \\mathbb{R}^d\\) \u88ab\u6dfb\u52a0\u5230\u6bcf\u4e2a\u6765\u81ea\u6a21\u6001 \\(m\\) \u7684 token \u4e0a\uff1a
\u60f3\u8c61\u4f60\u5728\u5199\u4e00\u5c01\u4fe1\uff0c\u4fe1\u4e2d\u65e2\u6709\u82f1\u6587\u6587\u672c\u53c8\u6709\u624b\u7ed8\u8349\u56fe\u3002\u4f60\u53ef\u80fd\u5199\u4e00\u4e2a\u53e5\u5b50\uff0c\u753b\u4e00\u4e2a\u56fe\u8868\uff0c\u518d\u5199\u4e00\u4e2a\u5f15\u7528\u8be5\u56fe\u8868\u7684\u53e5\u5b50\uff0c\u7136\u540e\u8d34\u4e0a\u4e00\u6bb5\u4e50\u8c31\u3002\u8fd9\u5c01\u4fe1\u5c31\u662f\u4e00\u4e2a\u7ebf\u6027\u6d41\uff0c\u4ea4\u9519\u7740\u4e0d\u540c\u7684\"\u6a21\u6001\"\u3002\u591a\u6a21\u6001\u5206\u8bcd\u505a\u7684\u6b63\u662f\u8fd9\u4ef6\u4e8b\uff1a\u5b83\u5c06\u6587\u672c\u3001\u56fe\u50cf\u3001\u97f3\u9891\u548c\u89c6\u9891\u8f6c\u6362\u6210\u5355\u4e00\u7684\u6241\u5e73 token \u5e8f\u5217\uff0c\u7531 Transformer \u4ece\u5de6\u5230\u53f3\u5904\u7406\u3002
\u5bf9\u4e8e\u6587\u672c\uff0c\u5206\u8bcd\u6280\u672f\u5df2\u7ecf\u5f88\u6210\u719f\uff1a\u5b57\u8282\u5bf9\u7f16\u7801\uff08BPE\uff09\u6216 SentencePiece \u4ea7\u751f\u5b50\u8bcd token \u7684\u8bcd\u6c47\u8868\uff0c\u5982\u7b2c 7 \u7ae0\u6240\u8ff0\u3002\u6311\u6218\u5728\u4e8e\u5c06\u8fd9\u4e00\u601d\u60f3\u6269\u5c55\u5230\u8fde\u7eed\u6a21\u6001\u3002
\u5bf9\u4e8e\u56fe\u50cf\uff0c\u6709\u4e24\u79cd\u4e3b\u8981\u65b9\u6cd5\u3002\u79bb\u6563\u65b9\u6cd5\u4f7f\u7528 VQ-VAE \u6216 VQ-GAN\uff08\u8be6\u89c1\u672c\u7ae0\u6587\u4ef6 03\uff09\u5c06\u6bcf\u5e45\u56fe\u50cf\u6620\u5c04\u4e3a\u7801\u672c\u7d22\u5f15\u5e8f\u5217\u3002\u5982\u679c\u7801\u672c\u6709 \\(|\\mathcal{C}|\\) \u4e2a\u6761\u76ee\u4e14\u4e00\u5e45\u56fe\u50cf\u7f16\u7801\u4e3a \\(n\\) \u4e2a\u7801\u5b57\uff0c\u5219\u8be5\u56fe\u50cf\u53d8\u4e3a \\(n\\) \u4e2a\u79bb\u6563 token\uff0c\u53d6\u81ea\u5927\u5c0f\u4e3a \\(|\\mathcal{C}|\\) \u7684\u8bcd\u6c47\u8868\uff0c\u76f4\u63a5\u4e0e\u6587\u672c\u8bcd\u6c47\u8868\u517c\u5bb9\u3002\u8fde\u7eed\u65b9\u6cd5\u4f7f\u7528 ViT \u6216 CNN \u7f16\u7801\u5668\u4ea7\u751f \\(n\\) \u4e2a\u8fde\u7eed\u5d4c\u5165\u5411\u91cf\uff0c\u7136\u540e\u7ebf\u6027\u6295\u5f71\u5230 Transformer \u7684\u5d4c\u5165\u7ef4\u5ea6\u4e2d\u3002Gemini \u548c GPT-4o \u4f7f\u7528\u8fde\u7eed\u65b9\u6cd5\u7684\u53d8\u4f53\uff1b\u81ea\u56de\u5f52\u56fe\u50cf\u751f\u6210\u5668\u5982 Parti \u548c LlamaGen \u5219\u504f\u597d\u79bb\u6563\u8def\u7ebf\u3002
\u5bf9\u4e8e\u97f3\u9891\uff0c\u4fe1\u53f7\u901a\u5e38\u88ab\u8f6c\u6362\u4e3a\u6885\u5c14\u9891\u8c31\u56fe\uff0c\u7136\u540e\u8981\u4e48\u901a\u8fc7\u795e\u7ecf\u97f3\u9891\u7f16\u89e3\u7801\u5668\uff08\u4f8b\u5982 EnCodec\u3001SoundStream\uff0c\u5b83\u4eec\u4ea7\u751f\u5c42\u6b21\u5316\u7684\u79bb\u6563 token\uff09\u8fdb\u884c\u79bb\u6563\u5316\uff0c\u8981\u4e48\u901a\u8fc7\u5b66\u4e60\u7684\u7f16\u7801\u5668\u8fdb\u884c\u8fde\u7eed\u6295\u5f71\u3002\u4f8b\u5982\uff0cAudioLM \u5c06\u97f3\u9891\u8868\u793a\u4e3a\u6765\u81ea\u591a\u4e2a\u7801\u672c\u5c42\u6b21\u7684\u79bb\u6563 token \u5e8f\u5217\uff0c\u7136\u540e\u4ee5\u81ea\u56de\u5f52\u65b9\u5f0f\u5bf9\u5176\u8fdb\u884c\u5efa\u6a21\u3002
\u5bf9\u4e8e\u89c6\u9891\uff0c\u5206\u8bcd\u5efa\u7acb\u5728\u56fe\u50cf\u5206\u8bcd\u7684\u57fa\u7840\u4e0a\uff0c\u4f46\u8fd8\u5fc5\u987b\u538b\u7f29\u65f6\u95f4\u7ef4\u5ea6\u3002\u4e00\u79cd\u5e38\u89c1\u7b56\u7565\u4f7f\u75283D VQ-VAE\uff08\u5982\u6587\u4ef6 03 \u4e2d\u7684 VideoGPT \u6216 Cosmos Tokenizer\uff09\u5c06\u65f6\u7a7a\u5757\u91cf\u5316\u4e3a\u79bb\u6563 token\u3002\u65f6\u95f4\u538b\u7f29\u56e0\u5b50\u81f3\u5173\u91cd\u8981\uff1a\u672a\u7ecf\u6fc0\u8fdb\u7684\u65f6\u95f4\u4e0b\u91c7\u6837\uff0c24 fps \u7684\u539f\u59cb\u89c6\u9891\u6bcf\u79d2\u4ea7\u751f\u7684 token \u6570\u91cf\u592a\u591a\u3002
\u4e00\u65e6\u6240\u6709\u6a21\u6001\u90fd\u88ab\u5206\u8bcd\u5316\uff0c\u5b83\u4eec\u5c31\u88ab\u4ea4\u9519\u6210\u5355\u4e00\u5e8f\u5217\uff0c\u5e76\u5e26\u6709\u6807\u8bb0\u6a21\u6001\u8fb9\u754c\u7684\u7279\u6b8a\u5206\u9694 token\u3002\u4e00\u4e2a\u5178\u578b\u683c\u5f0f\u5982\u4e0b\uff1a
[TEXT] \u732b\u5750\u5728\u57ab\u5b50\u4e0a [/TEXT] [IMAGE] <img_tok_1> <img_tok_2> ... <img_tok_n> [/IMAGE] [AUDIO] <aud_tok_1> ... <aud_tok_m> [/AUDIO]\n \u4f60\u4e0d\u4f1a\u5728\u6559\u5b69\u5b50\u7b97\u672f\u4e4b\u524d\u5c31\u6559\u4ed6\u5fae\u79ef\u5206\u3002\u540c\u6837\uff0c\u4f60\u4e0d\u80fd\u4ece\u968f\u673a\u521d\u59cb\u5316\u5f00\u59cb\uff0c\u5728\u6240\u6709\u6a21\u6001\u4e0a\u540c\u65f6\u8bad\u7ec3\u4e00\u4e2a\u7edf\u4e00\u591a\u6a21\u6001\u6a21\u578b\uff0c\u5e76\u671f\u671b\u5b83\u80fd\u5f88\u597d\u5730\u6536\u655b\u3002\u4e3b\u5bfc\u65b9\u6cd5\u662f\u5206\u9636\u6bb5\u8bad\u7ec3\uff0c\u5176\u4e2d\u6a21\u578b\u5728\u7cbe\u5fc3\u6392\u5e8f\u7684\u9636\u6bb5\u4e2d\u9010\u6b65\u5b66\u4e60\u8d8a\u6765\u8d8a\u590d\u6742\u7684\u8de8\u6a21\u6001\u80fd\u529b\u3002
\u9636\u6bb5 1\uff1a\u5355\u6a21\u6001\u9884\u8bad\u7ec3\u3002 \u6bcf\u4e2a\u6a21\u6001\u7f16\u7801\u5668\u5728\u5927\u578b\u5355\u6a21\u6001\u6570\u636e\u96c6\u4e0a\u72ec\u7acb\u8bad\u7ec3\u3002\u6587\u672c\u4e3b\u5e72\u4f7f\u7528\u6807\u51c6\u8bed\u8a00\u5efa\u6a21\u76ee\u6807\uff08\u4e0b\u4e00 token \u9884\u6d4b\uff09\u5728\u6570\u4e07\u4ebf\u6587\u672c token \u4e0a\u8fdb\u884c\u9884\u8bad\u7ec3\uff0c\u6b63\u5982\u7b2c 7 \u7ae0\u4e00\u6837\u3002\u89c6\u89c9\u7f16\u7801\u5668\u5728\u56fe\u50cf\u5206\u7c7b\u6216\u81ea\u76d1\u7763\u76ee\u6807\uff08MAE\u3001DINO\uff09\u4e0a\u9884\u8bad\u7ec3\uff0c\u5982\u7b2c 8 \u7ae0\u6240\u8ff0\u3002\u97f3\u9891\u7f16\u7801\u5668\u5728\u8bed\u97f3\u8bc6\u522b\u6216\u97f3\u9891\u5206\u7c7b\u6570\u636e\u4e0a\u9884\u8bad\u7ec3\uff0c\u5982\u7b2c 9 \u7ae0\u6240\u8ff0\u3002\u8fd9\u4e00\u9636\u6bb5\u4ea7\u751f\u4e86\u5f3a\u5927\u7684\u5355\u6a21\u6001\u7279\u5f81\u63d0\u53d6\u5668\u3002
\u9636\u6bb5 2\uff1a\u8de8\u6a21\u6001\u5bf9\u9f50\u3002 \u9884\u8bad\u7ec3\u7684\u7f16\u7801\u5668\u8fde\u63a5\u5230\u5171\u4eab\u4e3b\u5e72\uff0c\u6a21\u578b\u5728\u6210\u5bf9\u7684\u591a\u6a21\u6001\u6570\u636e\uff08\u56fe\u50cf-\u63cf\u8ff0\u5bf9\u3001\u97f3\u9891-\u6587\u672c\u5bf9\uff09\u4e0a\u4f7f\u7528\u5bf9\u6bd4\u6216\u751f\u6210\u76ee\u6807\u8fdb\u884c\u8bad\u7ec3\u3002\u5728\u6b64\u9636\u6bb5\uff0c\u7f16\u7801\u5668\u6743\u91cd\u53ef\u80fd\u88ab\u51bb\u7ed3\uff08\u4ee5\u4fdd\u7559\u5355\u6a21\u6001\u77e5\u8bc6\uff09\uff0c\u4ec5\u66f4\u65b0\u6295\u5f71\u5c42\u548c\u4e3b\u5e72\u3002\u8fd9\u662f\u6765\u81ea\u672c\u7ae0\u6587\u4ef6 01 \u7684 CLIP \u98ce\u683c\u5bf9\u9f50\u88ab\u7eb3\u5165\u7edf\u4e00\u6a21\u578b\u7684\u9636\u6bb5\u3002
\u9636\u6bb5 3\uff1a\u8054\u5408\u591a\u6a21\u6001\u9884\u8bad\u7ec3\u3002 \u6240\u6709\u53c2\u6570\uff08\u6216\u5927\u90e8\u5206\uff09\u88ab\u89e3\u51bb\uff0c\u6a21\u578b\u5728\u5355\u6a21\u6001\u548c\u591a\u6a21\u6001\u6570\u636e\u7684\u6df7\u5408\u4e0a\u8bad\u7ec3\uff0c\u4f7f\u7528\u5bf9\u6240\u6709\u6a21\u6001 token \u7684\u5355\u4e00\u4e0b\u4e00 token \u9884\u6d4b\u76ee\u6807\u3002\u635f\u5931\u51fd\u6570\u4e3a\uff1a
\u5176\u4e2d \\(x_t\\) \u53ef\u4ee5\u662f\u6587\u672c token\u3001\u56fe\u50cf token \u6216\u97f3\u9891 token\u3002\u6a21\u578b\u5fc5\u987b\u5b66\u4f1a\u9884\u6d4b\u4e0b\u4e00\u4e2a token\uff0c\u65e0\u8bba\u5176\u6a21\u6001\u5982\u4f55\uff0c\u8fd9\u8feb\u4f7f\u5b83\u53d1\u5c55\u771f\u6b63\u7684\u8de8\u6a21\u6001\u7406\u89e3\u3002
\u9636\u6bb5 4\uff1a\u6307\u4ee4\u5fae\u8c03\u4e0e\u5bf9\u9f50\u3002 \u9884\u8bad\u7ec3\u6a21\u578b\u5728\u7cbe\u5fc3\u7b56\u5212\u7684\u6307\u4ee4\u9075\u5faa\u6570\u636e\u96c6\u4e0a\u8fdb\u884c\u5fae\u8c03\uff0c\u8fd9\u4e9b\u6570\u636e\u96c6\u5305\u62ec\u591a\u6a21\u6001\u6307\u4ee4\uff08\u4f8b\u5982\uff0c\"\u8be6\u7ec6\u63cf\u8ff0\u8fd9\u5e45\u56fe\u50cf\"\u3001\"\u8fd9\u6bb5\u89c6\u9891\u53d1\u51fa\u4ec0\u4e48\u58f0\u97f3\uff1f\"\u3001\"\u751f\u6210\u4e00\u5f20 X \u7684\u56fe\u50cf\"\uff09\u3002\u8fd9\u4e00\u9636\u6bb5\u901a\u5e38\u4f7f\u7528\u57fa\u4e8e\u4eba\u7c7b\u53cd\u9988\u7684\u5f3a\u5316\u5b66\u4e60\uff08RLHF\uff09\u6216\u76f4\u63a5\u504f\u597d\u4f18\u5316\uff08DPO\uff09\u6765\u4f7f\u6a21\u578b\u7684\u8f93\u51fa\u4e0e\u4eba\u7c7b\u504f\u597d\u5bf9\u9f50\u3002
\u6a21\u6001\u7279\u5b9a\u70ed\u8eab\u662f\u4e00\u79cd\u5728\u9636\u6bb5\u5185\u90e8\u4f7f\u7528\u7684\u6280\u672f\uff0c\u7528\u4e8e\u9632\u6b62\u6a21\u6001\u574d\u7f29\u3002\u5982\u679c\u4e00\u79cd\u6a21\u6001\uff08\u901a\u5e38\u662f\u6587\u672c\uff0c\u56e0\u4e3a\u5b83\u62e5\u6709\u6700\u591a\u7684\u8bad\u7ec3\u6570\u636e\uff09\u4e3b\u5bfc\u4e86\u68af\u5ea6\u4fe1\u53f7\uff0c\u6a21\u578b\u53ef\u80fd\u4f1a\"\u9057\u5fd8\"\u8f83\u5f31\u7684\u6a21\u6001\u3002\u70ed\u8eab\u7b56\u7565\u5305\u62ec\uff1a
\u5f53\u4f60\u89e3\u51b3\u4e00\u4e2a\u51e0\u4f55\u95ee\u9898\u65f6\uff0c\u4f60\u53ef\u80fd\u4f1a\u753b\u4e00\u4e2a\u793a\u610f\u56fe\uff0c\u6807\u6ce8\u89d2\u5ea6\uff0c\u5199\u51fa\u65b9\u7a0b\uff0c\u7136\u540e\u9010\u6b65\u6c42\u89e3\u3002\u4f60\u4e0d\u4f1a\u76f4\u63a5\u4ece\u95ee\u9898\u9648\u8ff0\u8df3\u5230\u7b54\u6848\u3002\u591a\u6a21\u6001\u601d\u7ef4\u94fe\uff08CoT\uff09\u63a8\u7406\u4f7f\u6a21\u578b\u80fd\u591f\u505a\u540c\u6837\u7684\u4e8b\u60c5\uff1a\u5728\u5f97\u51fa\u6700\u7ec8\u7b54\u6848\u4e4b\u524d\u751f\u6210\u53ef\u80fd\u6d89\u53ca\u6587\u672c\u3001\u89c6\u89c9\u6ce8\u91ca\u751a\u81f3\u751f\u6210\u56fe\u8868\u7684\u4e2d\u95f4\u63a8\u7406\u6b65\u9aa4\u3002
\u5728\u7eaf\u6587\u672c CoT \u4e2d\uff08\u5982\u7b2c 7 \u7ae0\u63d0\u793a\u7b56\u7565\u7684\u8ba8\u8bba\u4e2d\u6240\u63a2\u8ba8\u7684\uff09\uff0c\u6a21\u578b\u4ee5\u81ea\u7136\u8bed\u8a00\u751f\u6210\u63a8\u7406\u6b65\u9aa4\u5e8f\u5217\u3002\u591a\u6a21\u6001 CoT \u6269\u5c55\u4e86\u8fd9\u4e00\u80fd\u529b\uff0c\u5141\u8bb8\u4e2d\u95f4\u6b65\u9aa4\u5f15\u7528\u6216\u751f\u6210\u89c6\u89c9\u5185\u5bb9\u3002\u4f8b\u5982\uff0c\u7ed9\u5b9a\u4e00\u5f20\u56fe\u8868\u56fe\u50cf\u548c\u95ee\u9898\"\u54ea\u4e00\u5e74\u9500\u552e\u989d\u6700\u9ad8\uff1f\"\uff0c\u591a\u6a21\u6001 CoT \u6a21\u578b\u53ef\u80fd\u9996\u5148\u63cf\u8ff0\u56fe\u8868\uff08\"\u8be5\u56fe\u8868\u663e\u793a 2018 \u5e74\u81f3 2023 \u5e74\u7684\u9500\u552e\u989d\u2026\u2026\"\uff09\uff0c\u7136\u540e\u8bc6\u522b\u76f8\u5173\u7684\u89c6\u89c9\u7279\u5f81\uff08\"\u6700\u9ad8\u7684\u6761\u5f62\u51fa\u73b0\u5728 2021 \u5e74\u2026\u2026\"\uff09\uff0c\u6700\u540e\u8f93\u51fa\u7b54\u6848\uff08\"2021 \u5e74\"\uff09\u3002
\u5f62\u5f0f\u4e0a\uff0c\u4ee4 \\(\\mathbf{x}\\) \u4e3a\u591a\u6a21\u6001\u8f93\u5165\uff0c\\(y\\) \u4e3a\u76ee\u6807\u7b54\u6848\u3002\u6807\u51c6\u9884\u6d4b\u6a21\u578b\u76f4\u63a5\u5efa\u6a21 \\(p(y \\mid \\mathbf{x})\\)\u3002\u601d\u7ef4\u94fe\u5f15\u5165\u4e86\u4e2d\u95f4\u63a8\u7406 \\(\\mathbf{r} = (r_1, r_2, \\ldots, r_L)\\) \u5e76\u5c06\u9884\u6d4b\u5206\u89e3\u4e3a\uff1a
\u5728\u5b9e\u8df5\u4e2d\uff0c\u6c42\u548c\u901a\u8fc7\u8d2a\u5fc3\u6216\u675f\u641c\u7d22\u89e3\u7801\u5728\u63a8\u7406\u94fe\u4e0a\u8fd1\u4f3c\u3002\u63a8\u7406\u6b65\u9aa4 \\(r_i\\) \u53ef\u4ee5\u662f\u6587\u672c token\u3001\u5bf9\u56fe\u50cf\u533a\u57df\u7684\u5f15\u7528\uff0c\u751a\u81f3\u662f\u751f\u6210\u7684\u89c6\u89c9 token\uff08\u4f8b\u5982\uff0c\u53e0\u52a0\u5728\u8f93\u5165\u56fe\u50cf\u4e0a\u7684\u8fb9\u754c\u6846\u6ce8\u91ca\uff09\u3002
\u8bad\u7ec3\u591a\u6a21\u6001 CoT \u901a\u5e38\u6d89\u53ca\u7b56\u5212\u6570\u636e\u96c6\uff0c\u5176\u4e2d\u4eba\u7c7b\u6807\u6ce8\u8005\u63d0\u4f9b\u9010\u6b65\u7684\u591a\u6a21\u6001\u63a8\u7406\u8f68\u8ff9\uff0c\u7136\u540e\u5728\u6b64\u7c7b\u8f68\u8ff9\u4e0a\u5fae\u8c03\u6a21\u578b\u3002\u4e00\u4e9b\u65b9\u6cd5\u4ece\u66f4\u5927\u7684\u6559\u5e08\u6a21\u578b\u4e2d\u84b8\u998f CoT \u80fd\u529b\uff1a\u6559\u5e08\u4e3a\u5927\u578b\u6570\u636e\u96c6\u751f\u6210\u63a8\u7406\u8f68\u8ff9\uff0c\u8f83\u5c0f\u7684\u5b66\u751f\u6a21\u578b\u5219\u5728\u8f93\u5165\u548c\u6559\u5e08\u7684\u8f68\u8ff9\u4e0a\u8fdb\u884c\u8bad\u7ec3\u3002
\u591a\u6a21\u6001 CoT \u5bf9\u4e8e\u9700\u8981\u7a7a\u95f4\u63a8\u7406\uff08\u4f8b\u5982\uff0c\"\u7ea2\u8272\u7403\u5728\u84dd\u8272\u7acb\u65b9\u4f53\u7684\u5de6\u8fb9\u5417\uff1f\"\uff09\u3001\u5bf9\u56fe\u8868\u7684\u6570\u5b66\u63a8\u7406\uff08\u4f8b\u5982\uff0c\u51e0\u4f55\u95ee\u9898\uff09\u548c\u591a\u6b65\u89c6\u89c9\u95ee\u7b54\uff08\u7b54\u6848\u4f9d\u8d56\u4e8e\u7ec4\u5408\u56fe\u50cf\u591a\u4e2a\u533a\u57df\u7684\u4fe1\u606f\uff09\u7684\u4efb\u52a1\u5c24\u5176\u5f3a\u5927\u3002
\u60f3\u8c61\u53a8\u623f\u91cc\u7684\u4e00\u4e2a\u673a\u5668\u4eba\u53a8\u5e08\u3002\u5b83\u67e5\u770b\u53f0\u9762\u4e0a\u7684\u98df\u6750\uff08\u89c6\u89c9\uff09\uff0c\u9605\u8bfb\u5e73\u677f\u4e0a\u7684\u98df\u8c31\uff08\u6587\u672c\uff09\uff0c\u542c\u8ba1\u65f6\u5668\u7684\u54d4\u54d4\u58f0\uff08\u97f3\u9891\uff09\uff0c\u7136\u540e\u7269\u7406\u4e0a\u62ff\u8d77\u5200\u5e76\u5207\u6d0b\u8471\uff08\u52a8\u4f5c\uff09\u3002\u591a\u6a21\u6001\u667a\u80fd\u4f53\u5c31\u662f\u6570\u5b57\u7248\uff1a\u4e00\u4e2a\u901a\u8fc7\u591a\u79cd\u6a21\u6001\u611f\u77e5\u4e16\u754c\u3001\u63a8\u7406\u8be5\u505a\u4ec0\u4e48\u3001\u5e76\u6267\u884c\u57fa\u4e8e\u5176\u611f\u77e5\u7684\u52a8\u4f5c\u7684\u6a21\u578b\u3002
\u667a\u80fd\u4f53\u5faa\u73af\u9075\u5faa\u7ecf\u5178\u7684\u89c2\u5bdf-\u63a8\u7406-\u884c\u52a8\u5468\u671f\uff1a
\u5de5\u5177\u4f7f\u7528\u662f\u591a\u6a21\u6001\u667a\u80fd\u4f53\u7684\u4e00\u4e2a\u5173\u952e\u80fd\u529b\u3002\u6a21\u578b\u88ab\u8bad\u7ec3\u8bc6\u522b\u4f55\u65f6\u65e0\u6cd5\u76f4\u63a5\u56de\u7b54\u95ee\u9898\uff0c\u800c\u5fc5\u987b\u8c03\u7528\u5916\u90e8\u5de5\u5177\uff1a\u8ba1\u7b97\u5668\u3001\u4ee3\u7801\u89e3\u91ca\u5668\u3001\u7f51\u9875\u6d4f\u89c8\u5668\u6216\u641c\u7d22\u5f15\u64ce\u3002\u6a21\u578b\u5728\u5176\u8f93\u51fa token \u5e8f\u5217\u4e2d\u751f\u6210\u7ed3\u6784\u5316\u7684\u5de5\u5177\u8c03\u7528\uff08\u4f8b\u5982\uff0csearch(\"\u4f26\u6566\u5f53\u524d\u5929\u6c14\")\uff09\uff0c\u7cfb\u7edf\u6267\u884c\u8c03\u7528\uff0c\u5e76\u5c06\u7ed3\u679c\u4f5c\u4e3a\u989d\u5916\u7684\u8f93\u5165 token \u53cd\u9988\u7ed9\u6a21\u578b\u5904\u7406\u3002
\u89c6\u89c9\u63a5\u5730\u5c06\u8bed\u8a00\u8fde\u63a5\u5230\u56fe\u50cf\u6216\u89c6\u9891\u4e2d\u7684\u7279\u5b9a\u533a\u57df\u3002\u5f53\u667a\u80fd\u4f53\u8bf4\"\u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u84dd\u8272\u6309\u94ae\"\u65f6\uff0c\u5b83\u5fc5\u987b\u5c06\u77ed\u8bed\"\u53f3\u4e0a\u89d2\u7684\u84dd\u8272\u6309\u94ae\"\u63a5\u5730\u5230\u50cf\u7d20\u5750\u6807\u3002\u5728\u67b6\u6784\u4e0a\uff0c\u8fd9\u662f\u901a\u8fc7\u8bad\u7ec3\u6a21\u578b\u5c06\u8fb9\u754c\u6846\u5750\u6807\u4f5c\u4e3a\u7279\u6b8a token \u8f93\u51fa\uff0c\u6216\u8ba9\u6a21\u578b\u5728\u56fe\u50cf\u4e0a\u751f\u6210\u6307\u793a\u6240\u6307\u533a\u57df\u7684\u70ed\u56fe\u6765\u5b9e\u73b0\u7684\u3002\u8fd9\u5c06\u672c\u7ae0\u6587\u4ef6 02\uff08\u89c6\u89c9\u8bed\u8a00\u6a21\u578b\uff09\u4e2d\u8ba8\u8bba\u7684\u63a5\u5730\u548c\u6307\u4ee3\u5de5\u4f5c\u6269\u5c55\u5230\u4e86\u52a8\u4f5c\u9886\u57df\u3002
Web \u667a\u80fd\u4f53\u5982 WebVoyager \u548c SeeAct \u5c55\u793a\u4e86\u591a\u6a21\u6001\u667a\u80fd\u4f53\u5728\u7f51\u7ad9\u4e0a\u5bfc\u822a\u3002\u667a\u80fd\u4f53\u63a5\u6536\u7f51\u9875\u622a\u56fe\uff0c\u8bc6\u522b\u4ea4\u4e92\u5143\u7d20\uff08\u6309\u94ae\u3001\u6587\u672c\u5b57\u6bb5\u3001\u94fe\u63a5\uff09\uff0c\u5e76\u8f93\u51fa\u52a8\u4f5c\uff08\u70b9\u51fb\u3001\u6253\u5b57\u3001\u6eda\u52a8\uff09\u4ee5\u5b8c\u6210\u7528\u6237\u6307\u5b9a\u7684\u76ee\u6807\u3002\u5173\u952e\u6311\u6218\u5728\u4e8e\u5de8\u5927\u7684\u52a8\u4f5c\u7a7a\u95f4\uff1a\u4e00\u4e2a\u5178\u578b\u7f51\u9875\u53ef\u80fd\u6709\u6570\u767e\u4e2a\u53ef\u70b9\u51fb\u76ee\u6807\u3002
\u5177\u8eab\u667a\u80fd\u4f53\u5c06\u5176\u6269\u5c55\u5230\u7269\u7406\u73af\u5883\u3002\u5e26\u6709\u6444\u50cf\u5934\u548c\u9ea6\u514b\u98ce\u7684\u673a\u5668\u4eba\u63a5\u6536\u89c6\u89c9\u548c\u97f3\u9891\u8f93\u5165\uff0c\u901a\u8fc7\u7edf\u4e00\u6a21\u578b\u5904\u7406\uff0c\u5e76\u8f93\u51fa\u7535\u673a\u6307\u4ee4\u3002\u50cf PaLM-E\uff08Google\uff09\u8fd9\u6837\u7684\u9879\u76ee\u5c06\u673a\u5668\u4eba\u4f20\u611f\u5668\u6570\u636e\u76f4\u63a5\u5d4c\u5165\u8bed\u8a00\u6a21\u578b\u7684 token \u5e8f\u5217\u4e2d\uff0c\u4f7f\u673a\u5668\u4eba\u80fd\u591f\u901a\u8fc7\u5c06\u6307\u4ee4\u63a5\u5730\u5230\u5176\u89c6\u89c9\u89c2\u5bdf\u4e2d\u5e76\u751f\u6210\u4e00\u7cfb\u5217\u7535\u673a\u52a8\u4f5c\uff0c\u6765\u9075\u5faa\u8bf8\u5982\"\u62ff\u8d77\u7897\u9644\u8fd1\u7684\u7eff\u8272\u65b9\u5757\"\u4e4b\u7c7b\u7684\u6307\u4ee4\u3002
\u667a\u80fd\u4f53\u7684\u8bad\u7ec3\u914d\u65b9\u5728\u6807\u51c6\u5206\u9636\u6bb5\u9884\u8bad\u7ec3\u4e4b\u4e0a\u6dfb\u52a0\u4e86\u4e00\u4e2a\u5f3a\u5316\u5b66\u4e60\uff08RL\uff09\u9636\u6bb5\u3002\u667a\u80fd\u4f53\u4e0e\u73af\u5883\uff08\u6a21\u62df\u684c\u9762\u3001\u7f51\u9875\u6d4f\u89c8\u5668\u3001\u673a\u5668\u4eba\u6a21\u62df\u5668\uff09\u4ea4\u4e92\uff0c\u56e0\u5b8c\u6210\u4efb\u52a1\u800c\u83b7\u5f97\u5956\u52b1\uff0c\u5e76\u4f7f\u7528 PPO \u6216 REINFORCE \u7b49\u7b97\u6cd5\u66f4\u65b0\u5176\u7b56\u7565\u3002\u5956\u52b1\u4fe1\u53f7\u901a\u5e38\u662f\u7a00\u758f\u7684\uff08\u4efb\u52a1\u6210\u529f\u4e3a 1\uff0c\u5426\u5219\u4e3a 0\uff09\uff0c\u4f7f\u5f97\u8fd9\u4e00\u4f18\u5316\u5177\u6709\u6311\u6218\u6027\uff0c\u5e76\u4e14\u9ad8\u5ea6\u4f9d\u8d56\u4e8e\u591a\u6a21\u6001\u9884\u8bad\u7ec3\u7684\u5f3a\u5148\u9a8c\u3002
\u8bc4\u4f30\u4e00\u4e2a\u80fd\u770b\u89c1\u3001\u542c\u89c1\u3001\u9605\u8bfb\u548c\u884c\u52a8\u7684\u6a21\u578b\u9700\u8981\u4e00\u5957\u591a\u6837\u5316\u7684\u57fa\u51c6\u6d4b\u8bd5\u3002\u6ca1\u6709\u5355\u4e00\u6307\u6807\u80fd\u591f\u6355\u6349\u591a\u6a21\u6001\u80fd\u529b\uff0c\u56e0\u6b64\u8be5\u9886\u57df\u4f9d\u8d56\u4e8e\u4e00\u7ec4\u4e13\u95e8\u8bc4\u4f30\u7684\u96c6\u5408\u3002
MMLU\uff08\u5927\u89c4\u6a21\u591a\u4efb\u52a1\u8bed\u8a00\u7406\u89e3\uff09\u6d4b\u8bd5 57 \u4e2a\u5b66\u672f\u79d1\u76ee\u7684\u77e5\u8bc6\u3002\u867d\u7136\u6700\u521d\u662f\u7eaf\u6587\u672c\u7684\uff0c\u4f46\u5b83\u4f5c\u4e3a\u57fa\u7ebf\uff1a\u4e00\u4e2a\u7edf\u4e00\u591a\u6a21\u6001\u6a21\u578b\u5728\u83b7\u5f97\u89c6\u89c9\u80fd\u529b\u65f6\u4e0d\u5e94\u4e22\u5931\u7eaf\u6587\u672c\u6027\u80fd\u3002\u591a\u6a21\u6001\u8bad\u7ec3\u540e MMLU \u7684\u4e0b\u964d\u6807\u5fd7\u7740\u707e\u96be\u6027\u9057\u5fd8\u3002
MMBench \u8bc4\u4f30\u8de8 20 \u4e2a\u7ec6\u7c92\u5ea6\u80fd\u529b\u7ef4\u5ea6\u7684\u89c6\u89c9\u8bed\u8a00\u7406\u89e3\uff0c\u5305\u62ec\u5c5e\u6027\u8bc6\u522b\u3001\u7a7a\u95f4\u5173\u7cfb\u7406\u89e3\u548c OCR\u3002\u6bcf\u4e2a\u95ee\u9898\u5448\u73b0\u4e00\u5e45\u56fe\u50cf\u548c\u4e00\u4e2a\u591a\u9879\u9009\u62e9\u9898\u3002\u8be5\u57fa\u51c6\u7cfb\u7edf\u5730\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u771f\u6b63\u7406\u89e3\u56fe\u50cf\uff0c\u8fd8\u662f\u4f9d\u8d56\u4e8e\u7eaf\u6587\u672c\u7684\u6377\u5f84\u3002
SEED-Bench \u63d0\u4f9b 19,000 \u4e2a\u591a\u9879\u9009\u62e9\u9898\uff0c\u8de8\u8d8a\u56fe\u50cf\u548c\u89c6\u9891\u7406\u89e3\u7684 12 \u4e2a\u8bc4\u4f30\u7ef4\u5ea6\u3002\u5b83\u7279\u522b\u6d4b\u8bd5\u65f6\u95f4\u7406\u89e3\uff08\u7ed9\u5b9a\u5e27\u4e4b\u524d/\u4e4b\u540e\u53d1\u751f\u4e86\u4ec0\u4e48\uff09\u548c\u7ec4\u5408\u63a8\u7406\uff08\u7ec4\u5408\u591a\u4e2a\u89c6\u89c9\u5c5e\u6027\uff09\u3002
MM-Vet \u901a\u8fc7\u8981\u6c42\u6a21\u578b\u540c\u65f6\u4f7f\u7528\u591a\u79cd\u6280\u80fd\u6765\u8bc4\u4f30\u96c6\u6210\u7684\u591a\u6a21\u6001\u80fd\u529b\uff1a\u8bc6\u522b\u3001OCR\u3001\u7a7a\u95f4\u610f\u8bc6\u3001\u8bed\u8a00\u751f\u6210\u548c\u77e5\u8bc6\u68c0\u7d22\uff0c\u5168\u90e8\u5728\u5355\u4e00\u95ee\u9898\u4e2d\u3002
MathVista \u6d4b\u8bd5\u5bf9\u89c6\u89c9\u8f93\u5165\u7684\u6570\u5b66\u63a8\u7406\uff1a\u51e0\u4f55\u56fe\u3001\u7edf\u8ba1\u56fe\u8868\u3001\u51fd\u6570\u56fe\u548c\u79d1\u5b66\u56fe\u5f62\u3002\u8be5\u57fa\u51c6\u4e13\u95e8\u9488\u5bf9\u591a\u6a21\u6001\u601d\u7ef4\u94fe\u80fd\u529b\u3002
\u97f3\u89c6\u9891\u57fa\u51c6\u5982 AVQA\uff08\u97f3\u89c6\u9891\u95ee\u7b54\uff09\u6d4b\u8bd5\u6a21\u578b\u662f\u5426\u80fd\u63a8\u7406\u5b83\u4eec\u6240\u770b\u5230\u548c\u6240\u542c\u5230\u4e4b\u95f4\u7684\u5173\u7cfb\u3002\u4f8b\u5982\uff1a\"\u8bf4\u8bdd\u7684\u4eba\u662f\u5de6\u8fb9\u7684\u8fd8\u662f\u53f3\u8fb9\u7684\uff1f\"
\u667a\u80fd\u4f53\u57fa\u51c6\u5982 WebArena\u3001OSWorld \u548c SWE-bench \u8bc4\u4f30\u5728\u4ea4\u4e92\u5f0f\u73af\u5883\u4e2d\u7684\u4efb\u52a1\u5b8c\u6210\u60c5\u51b5\u3002\u6307\u6807\u901a\u5e38\u662f\u6210\u529f\u7387\uff1a\u667a\u80fd\u4f53\u6b63\u786e\u5b8c\u6210\u4efb\u52a1\u7684\u5360\u6bd4\u662f\u591a\u5c11\uff1f\u8fd9\u4e9b\u57fa\u51c6\u7279\u522b\u5177\u6709\u6311\u6218\u6027\uff0c\u56e0\u4e3a\u5b83\u4eec\u9700\u8981\u957f\u89c6\u91ce\u89c4\u5212\u548c\u9519\u8bef\u6062\u590d\u3002
\u5168\u9762\u8bc4\u4f30\u6846\u67b6\u5982 LMSYS Chatbot Arena \u4f7f\u7528\u4eba\u5728\u5934\u5bf9\u5934\u683c\u5f0f\u4e2d\u7684\u504f\u597d\u5224\u65ad\u3002\u4e24\u4e2a\u6a21\u578b\u88ab\u5c55\u793a\u76f8\u540c\u7684\u591a\u6a21\u6001\u8f93\u5165\uff0c\u4eba\u7c7b\u8bc4\u59d4\u9009\u62e9\u54ea\u4e2a\u54cd\u5e94\u66f4\u597d\u3002Elo \u8bc4\u5206\u4ece\u6570\u5343\u6b21\u8fd9\u6837\u7684\u6bd4\u8f83\u4e2d\u8ba1\u7b97\u5f97\u51fa\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u4e0e\u6574\u4f53\u6a21\u578b\u8d28\u91cf\u9ad8\u5ea6\u76f8\u5173\u7684\u5355\u4e00\u6807\u91cf\u3002
\u591a\u6a21\u6001\u8bc4\u4f30\u4e2d\u7684\u4e00\u4e2a\u6301\u7eed\u6311\u6218\u662f\u6570\u636e\u6c61\u67d3\uff1a\u56e0\u4e3a\u8fd9\u4e9b\u6a21\u578b\u662f\u5728\u4e92\u8054\u7f51\u89c4\u6a21\u7684\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\uff0c\u57fa\u51c6\u56fe\u50cf\u548c\u95ee\u9898\u53ef\u80fd\u51fa\u73b0\u5728\u8bad\u7ec3\u96c6\u4e2d\u3002\u4ed4\u7ec6\u7684\u53bb\u91cd\u548c\u521b\u5efa\u4fdd\u7559\u6d4b\u8bd5\u96c6\u662f\u5fc5\u8981\u4f46\u4e0d\u5b8c\u7f8e\u7684\u4fdd\u969c\u63aa\u65bd\u3002
\u60f3\u8c61\u95ed\u4e0a\u773c\u775b\uff0c\u60f3\u8c61\u5982\u679c\u4f60\u628a\u4e00\u4e2a\u73bb\u7483\u676f\u63a8\u4e0b\u684c\u5b50\u8fb9\u7f18\u4f1a\u53d1\u751f\u4ec0\u4e48\u3002\u4f60\"\u770b\u5230\"\u5b83\u843d\u4e0b\uff0c\"\u542c\u5230\"\u7834\u788e\u58f0\uff0c\u5e76\"\u611f\u89c9\"\u5230\u90a3\u5c06\u662f\u4e2a\u574f\u4e3b\u610f\u3002\u4f60\u7684\u5927\u8111\u6b63\u5728\u8fd0\u884c\u4e00\u4e2a\u4e16\u754c\u6a21\u578b\uff1a\u5bf9\u73af\u5883\u7684\u7269\u7406\u548c\u56e0\u679c\u7ed3\u6784\u7684\u5185\u90e8\u6a21\u62df\uff0c\u80fd\u591f\u8de8\u591a\u79cd\u6a21\u6001\u9884\u6d4b\u672a\u6765\u72b6\u6001\u3002
\u5728 AI \u8bed\u5883\u4e2d\uff0c\u4e16\u754c\u6a21\u578b\u662f\u4e00\u4e2a\u5b66\u4e60\u5230\u7684\u51fd\u6570\uff0c\u6839\u636e\u5f53\u524d\u72b6\u6001\u548c\u52a8\u4f5c\u9884\u6d4b\u4e16\u754c\u7684\u4e0b\u4e00\u4e2a\u72b6\u6001\uff1a
\u5176\u4e2d \\(s_t\\) \u662f\u5f53\u524d\u72b6\u6001\u8868\u793a\uff08\u53ef\u80fd\u5305\u542b\u89c6\u89c9\u3001\u542c\u89c9\u548c\u672c\u4f53\u611f\u89c9\u4fe1\u606f\uff09\uff0c\\(a_t\\) \u662f\u4e00\u4e2a\u52a8\u4f5c\uff0c\\(\\hat{s}_{t+1}\\) \u662f\u9884\u6d4b\u7684\u4e0b\u4e00\u4e2a\u72b6\u6001\u3002\u72b6\u6001 \\(s_t\\) \u5b58\u5728\u4e8e\u5b66\u4e60\u5230\u7684\u6f5c\u5728\u7a7a\u95f4\u4e2d\uff0c\u800c\u975e\u539f\u59cb\u50cf\u7d20\u7a7a\u95f4\uff0c\u4f7f\u5f97\u9884\u6d4b\u95ee\u9898\u53ef\u89e3\u3002
\u89c6\u9891\u9884\u6d4b\u6a21\u578b\u5982 Sora\uff08OpenAI\uff09\u548c Genie\uff08Google DeepMind\uff09\u4ee3\u8868\u4e86\u8fc8\u5411\u4e16\u754c\u6a21\u578b\u7684\u91cd\u8981\u4e00\u6b65\u3002\u5b83\u4eec\u5b66\u4e60\u751f\u6210\u4ee5\u6587\u672c\u63d0\u793a\u548c/\u6216\u52a8\u4f5c\u5e8f\u5217\u4e3a\u6761\u4ef6\u7684\u3001\u65f6\u95f4\u4e0a\u8fde\u8d2f\u7684\u89c6\u9891\u5e27\u3002\u867d\u7136\u5b83\u4eec\u901a\u5e38\u88ab\u4f5c\u4e3a\u89c6\u9891\u751f\u6210\u5668\u8ba8\u8bba\uff0c\u4f46\u5e95\u5c42\u7684\u6280\u672f\u80fd\u529b\u66f4\u63a5\u8fd1\u4e8e\u4e16\u754c\u6a21\u62df\uff1a\u6a21\u578b\u5df2\u7ecf\u5185\u5316\u4e86\u8db3\u591f\u7684\u7269\u7406\u77e5\u8bc6\uff08\u91cd\u529b\u3001\u78b0\u649e\u3001\u906e\u6321\u3001\u6d41\u4f53\u52a8\u529b\u5b66\uff09\u6765\u6e32\u67d3\u5408\u7406\u7684\u672a\u6765\u573a\u666f\u3002
\u4e0e\u591a\u6a21\u6001\u67b6\u6784\u7684\u8054\u7cfb\u5f88\u6df1\u3002\u4e00\u4e2a\u53ea\u9884\u6d4b\u50cf\u7d20\u7684\u4e16\u754c\u6a21\u578b\u662f\u6709\u9650\u7684\uff1b\u4e00\u4e2a\u771f\u6b63\u6709\u7528\u7684\u4e16\u754c\u6a21\u578b\u5e94\u8be5\u8de8\u6a21\u6001\u9884\u6d4b\u3002\u5982\u679c\u4f60\u63a8\u73bb\u7483\u676f\uff0c\u4e16\u754c\u6a21\u578b\u5e94\u8be5\u9884\u6d4b\u89c6\u89c9\u8f68\u8ff9\uff08\u73bb\u7483\u676f\u843d\u4e0b\uff09\u3001\u542c\u89c9\u4e8b\u4ef6\uff08\u73bb\u7483\u676f\u7834\u788e\uff09\u548c\u8bed\u4e49\u540e\u679c\uff08\u73b0\u5728\u5730\u677f\u4e0a\u6709\u788e\u73bb\u7483\uff09\u3002\u7edf\u4e00\u591a\u6a21\u6001\u67b6\u6784\u662f\u4e16\u754c\u6a21\u578b\u7684\u5929\u7136\u540e\u9009\u8005\uff0c\u56e0\u4e3a\u5b83\u4eec\u5df2\u7ecf\u5728\u5171\u4eab\u7a7a\u95f4\u4e2d\u8868\u793a\u6240\u6709\u6a21\u6001\u3002
\u5f62\u5f0f\u4e0a\uff0c\u591a\u6a21\u6001\u4e16\u754c\u6a21\u578b\u4f18\u5316\uff1a
\u635f\u5931\u51fd\u6570\u6bd4\u8f83\u7684\u662f\u5d4c\u5165\u800c\u975e\u539f\u59cb\u89c2\u6d4b\uff0c\u8fd9\u5bf9\u611f\u77e5\u6df7\u53e0\uff08\u8bb8\u591a\u4e0d\u540c\u7684\u50cf\u7d20\u914d\u7f6e\u53ef\u80fd\u4ee3\u8868\u76f8\u540c\u7684\u8bed\u4e49\u72b6\u6001\uff09\u66f4\u52a0\u9c81\u68d2\u3002\u8fd9\u79cd\u65b9\u6cd5\u5bf9\u591a\u6a21\u6001\u4e16\u754c\u6a21\u578b\u5c24\u5176\u6709\u524d\u666f\uff0c\u56e0\u4e3a\u5b83\u81ea\u7136\u5730\u8fd0\u884c\u5728\u7edf\u4e00\u67b6\u6784\u5df2\u7ecf\u63d0\u4f9b\u7684\u5171\u4eab\u5d4c\u5165\u7a7a\u95f4\u4e2d\u3002
\u4e16\u754c\u6a21\u578b\u6709\u8d85\u8d8a\u5b66\u672f\u5174\u8da3\u7684\u5b9e\u9645\u5e94\u7528\u3002\u5728\u57fa\u4e8e\u6a21\u578b\u7684\u5f3a\u5316\u5b66\u4e60\u4e2d\uff0c\u667a\u80fd\u4f53\u5728\u91c7\u53d6\u884c\u52a8\u4e4b\u524d\u4f7f\u7528\u5176\u4e16\u754c\u6a21\u578b\u6765\"\u60f3\u8c61\"\u884c\u52a8\u7684\u540e\u679c\uff0c\u5927\u5927\u51cf\u5c11\u4e86\u6240\u9700\u7684\u771f\u5b9e\u4e16\u754c\u4ea4\u4e92\u6b21\u6570\uff08\u56de\u987e\u7b2c 11 \u7ae0\u5bf9\u57fa\u4e8e\u6a21\u578b RL \u7684\u8ba8\u8bba\uff09\u3002\u5728\u81ea\u52a8\u9a7e\u9a76\u4e2d\uff0c\u4e16\u754c\u6a21\u578b\u9884\u6d4b\u5728\u7ed9\u5b9a\u4e0d\u540c\u8f6c\u5411\u51b3\u7b56\u540e\u573a\u666f\u5728\u672a\u6765\u51e0\u79d2\u5185\u5c06\u5982\u4f55\u6f14\u53d8\u3002\u5728\u673a\u5668\u4eba\u5b66\u4e2d\uff0c\u4e16\u754c\u6a21\u578b\u5141\u8bb8\u673a\u5668\u4eba\u5728\u6267\u884c\u64cd\u4f5c\u5e8f\u5217\u4e4b\u524d\u5728\u5934\u8111\u4e2d\u8fdb\u884c\u6392\u7ec3\u3002
\u4e16\u754c\u6a21\u578b\u7814\u7a76\u7684\u524d\u6cbf\u6b63\u671d\u7740\u4ea4\u4e92\u5f0f\u4e16\u754c\u6a21\u578b\u53d1\u5c55\uff0c\u8fd9\u4e9b\u6a21\u578b\u5b9e\u65f6\u8fd0\u884c\uff0c\u54cd\u5e94\u4efb\u610f\u7528\u6237\u52a8\u4f5c\uff0c\u672c\u8d28\u4e0a\u6210\u4e3a\u5b8c\u5168\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u5f97\u5230\u7684\u901a\u7528\u6a21\u62df\u5668\u3002Genie 2\uff08Google DeepMind\uff09\u4e3a 3D \u73af\u5883\u6f14\u793a\u4e86\u8fd9\u4e00\u70b9\uff1a\u7ed9\u5b9a\u4e00\u5f20\u56fe\u50cf\uff0c\u5b83\u751f\u6210\u4e00\u4e2a\u4ea4\u4e92\u5f0f\u7684\u3001\u53ef\u63a7\u7684 3D \u4e16\u754c\uff0c\u7528\u6237\u53ef\u4ee5\u63a2\u7d22\u3002\u4e16\u754c\u6a21\u578b\u4e0e\u7edf\u4e00\u591a\u6a21\u6001\u67b6\u6784\u7684\u878d\u5408\u8868\u660e\uff0c\u672a\u6765\u4e00\u4e2a\u5355\u4e00\u6a21\u578b\u80fd\u591f\u8de8\u6240\u6709\u6a21\u6001\u8fdb\u884c\u611f\u77e5\u3001\u9884\u6d4b\u3001\u6a21\u62df\u548c\u884c\u52a8\u3002
\u4efb\u52a1 1\uff1a\u6784\u5efa\u4e00\u4e2a\u6700\u5c0f\u5316\u7684\u591a\u6a21\u6001 token \u4ea4\u9519\u5668
import jax\nimport jax.numpy as jnp\n\n# \u6a21\u62df\u591a\u6a21\u6001\u5206\u8bcd\uff1a\u6587\u672c token + \"\u56fe\u50cf\u5757\" token\ndef interleave_modalities(text_tokens, image_patches, embed_dim=32, key=jax.random.PRNGKey(0)):\n \"\"\"\u5c06\u6587\u672c\u548c\u56fe\u50cf token \u4e0e\u5b66\u4e60\u5230\u7684\u6a21\u6001\u5d4c\u5165\u4ea4\u9519\u3002\"\"\"\n k1, k2, k3 = jax.random.split(key, 3)\n n_text = text_tokens.shape[0]\n n_img = image_patches.shape[0]\n # \u968f\u673a\u6295\u5f71\u77e9\u9635\uff08\u66ff\u4ee3\u771f\u5b9e\u7f16\u7801\u5668\uff09\n W_text = jax.random.normal(k1, (text_tokens.shape[-1], embed_dim)) * 0.02\n W_img = jax.random.normal(k2, (image_patches.shape[-1], embed_dim)) * 0.02\n # \u6a21\u6001\u5d4c\u5165\uff1a\u4e00\u4e2a\u7528\u4e8e\u6587\u672c\uff0c\u4e00\u4e2a\u7528\u4e8e\u56fe\u50cf\n mod_emb = jax.random.normal(k3, (2, embed_dim)) * 0.02\n text_embs = text_tokens @ W_text + mod_emb[0] # (n_text, embed_dim)\n img_embs = image_patches @ W_img + mod_emb[1] # (n_img, embed_dim)\n # \u4ea4\u9519\uff1a[IMG] token \u5728\u524d\uff0c\u7136\u540e\u662f [TEXT] token\uff08\u50cf LLaVA\uff09\n combined = jnp.concatenate([img_embs, text_embs], axis=0)\n print(f\"\u7ec4\u5408\u5e8f\u5217: {n_img} \u56fe\u50cf + {n_text} \u6587\u672c = {combined.shape[0]} tokens\")\n return combined\n\n# \u5c1d\u8bd5\uff1a5 \u4e2a\u6587\u672c token\uff08dim 16\uff09\u548c 4 \u4e2a\u56fe\u50cf\u5757\uff08dim 64\uff09\ntext = jax.random.normal(jax.random.PRNGKey(1), (5, 16))\nimage = jax.random.normal(jax.random.PRNGKey(2), (4, 64))\nseq = interleave_modalities(text, image)\n# \u5b9e\u9a8c\uff1a\u6539\u53d8 embed_dim\uff0c\u4ea4\u6362\u4ea4\u9519\u987a\u5e8f\uff0c\u6dfb\u52a0\u7b2c\u4e09\u4e2a\u6a21\u6001\n \u4efb\u52a1 2\uff1a\u53ef\u89c6\u5316\u8de8\u6a21\u6001\u6ce8\u610f\u529b\u6a21\u5f0f
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef cross_modal_attention(n_text=6, n_img=4, d=32, key=jax.random.PRNGKey(42)):\n \"\"\"\u8ba1\u7b97\u5e76\u53ef\u89c6\u5316\u6587\u672c\u548c\u56fe\u50cf token \u4e4b\u95f4\u7684\u6ce8\u610f\u529b\u3002\"\"\"\n k1, k2, k3 = jax.random.split(key, 3)\n # \u6a21\u62df\u4e24\u79cd\u6a21\u6001\u7684 token \u5d4c\u5165\n text_embs = jax.random.normal(k1, (n_text, d))\n img_embs = jax.random.normal(k2, (n_img, d))\n seq = jnp.concatenate([img_embs, text_embs], axis=0) # (n_img+n_text, d)\n # \u5b66\u4e60\u5230\u7684 Q, K \u6295\u5f71\n Wq = jax.random.normal(k3, (d, d)) * 0.1\n Wk = jax.random.normal(jax.random.PRNGKey(99), (d, d)) * 0.1\n Q, K = seq @ Wq, seq @ Wk\n scores = Q @ K.T / jnp.sqrt(d)\n attn = jax.nn.softmax(scores, axis=-1)\n # \u7ed8\u56fe\n labels = [f\"img_{i}\" for i in range(n_img)] + [f\"txt_{i}\" for i in range(n_text)]\n fig, ax = plt.subplots(figsize=(7, 6))\n ax.imshow(attn, cmap=\"viridis\")\n ax.set_xticks(range(len(labels))); ax.set_xticklabels(labels, rotation=45, fontsize=8)\n ax.set_yticks(range(len(labels))); ax.set_yticklabels(labels, fontsize=8)\n ax.set_xlabel(\"Key\uff08\u88ab\u5173\u6ce8\u7684\uff09\"); ax.set_ylabel(\"Query\uff08\u53d1\u8d77\u7684\uff09\")\n ax.set_title(\"\u8de8\u6a21\u6001\u81ea\u6ce8\u610f\u529b\u56fe\")\n plt.colorbar(ax.images[0], ax=ax, shrink=0.8)\n plt.tight_layout(); plt.show()\n\ncross_modal_attention()\n# \u5b9e\u9a8c\uff1a\u589e\u5927 d\uff0c\u6dfb\u52a0\u56e0\u679c\u63a9\u7801\uff0c\u89c2\u5bdf\u6ce8\u610f\u529b\u6a21\u5f0f\u5982\u4f55\u53d8\u5316\n \u4efb\u52a1 3\uff1a\u6a21\u62df\u5e26\u6709\u6a21\u6001\u7279\u5b9a\u635f\u5931\u6743\u91cd\u7684\u5206\u9636\u6bb5\u8bad\u7ec3
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef staged_training_sim(steps=200, key=jax.random.PRNGKey(7)):\n \"\"\"\u6a21\u62df\u5177\u6709\u53ef\u8c03\u8282\u6a21\u6001\u635f\u5931\u6743\u91cd\u7684\u591a\u6a21\u6001\u8bad\u7ec3\u3002\"\"\"\n # \u4e24\u79cd\"\u6a21\u6001\"\uff0c\u635f\u5931\u5c3a\u5ea6\u4e0d\u540c\uff08\u6587\u672c\u635f\u5931\u6bd4\u56fe\u50cf\u635f\u5931\u5927\u7ea6 10 \u500d\uff09\n losses_text, losses_img = [], []\n param = jnp.array([0.0, 0.0]) # \u4e24\u79cd\u6a21\u6001\u635f\u5931\u5171\u540c\u66f4\u65b0\u7684\u5171\u4eab\u53c2\u6570\n lr = 0.05\n # \u5c1d\u8bd5\u66f4\u6539\u8fd9\u4e9b\u6743\u91cd\u4ee5\u89c2\u5bdf\u5bf9\u6536\u655b\u5e73\u8861\u7684\u5f71\u54cd\n lambda_text, lambda_img = 1.0, 5.0 # \u5bf9\u8f83\u5f31\u6a21\u6001\u52a0\u5927\u6743\u91cd\n\n for step in range(steps):\n k1, k2, key = jax.random.split(key, 3)\n noise_t = jax.random.normal(k1, ()) * 0.3\n noise_i = jax.random.normal(k2, ()) * 0.1\n loss_t = (param[0] - 3.0) ** 2 + noise_t # \u6587\u672c\u76ee\u6807 = 3.0\n loss_i = 0.1 * (param[1] - 1.0) ** 2 + noise_i # \u56fe\u50cf\u76ee\u6807 = 1.0\uff08\u5c3a\u5ea6\u66f4\u5c0f\uff09\n # \u52a0\u6743\u7ec4\u5408\u68af\u5ea6\n grad_t = lambda_text * 2 * (param[0] - 3.0)\n grad_i = lambda_img * 0.2 * (param[1] - 1.0)\n param = param - lr * jnp.array([grad_t, grad_i])\n losses_text.append(float(loss_t)); losses_img.append(float(loss_i))\n\n fig, ax = plt.subplots(figsize=(8, 4))\n ax.plot(losses_text, label=f\"\u6587\u672c\u635f\u5931 (\u6743\u91cd={lambda_text})\", alpha=0.7)\n ax.plot(losses_img, label=f\"\u56fe\u50cf\u635f\u5931 (\u6743\u91cd={lambda_img})\", alpha=0.7)\n ax.set_xlabel(\"\u8bad\u7ec3\u6b65\u6570\"); ax.set_ylabel(\"\u635f\u5931\"); ax.legend()\n ax.set_title(\"\u5206\u9636\u6bb5\u8bad\u7ec3\u4e2d\u7684\u6a21\u6001\u635f\u5931\u5e73\u8861\")\n plt.tight_layout(); plt.show()\n\nstaged_training_sim()\n# \u5b9e\u9a8c\uff1a\u8bbe\u7f6e lambda_img=1.0\uff0c\u89c2\u5bdf\u56fe\u50cf\u635f\u5931\u6536\u655b\u6162\u5f97\u591a\n"},{"location":"chapter%2011%3A%20autonomous%20systems/01.%20perception/","title":"\u611f\u77e5","text":"\u611f\u77e5\u662f\u81ea\u4e3b\u7cfb\u7edf\u611f\u77e5\u548c\u89e3\u91ca\u7269\u7406\u4e16\u754c\u7684\u65b9\u5f0f\u3002\u672c\u7ae0\u6db5\u76d6\u4f20\u611f\u5668\u6a21\u6001\u3001\u6807\u5b9a\u3001\u4f20\u611f\u5668\u878d\u5408\u30013D\u76ee\u6807\u68c0\u6d4b\u3001\u6df1\u5ea6\u4f30\u8ba1\u3001\u5360\u636e\u7f51\u7edc\u3001\u8f66\u9053\u68c0\u6d4b\u548c\u8bed\u4e49\u5efa\u56fe\u2014\u2014\u8fd9\u662f\u6bcf\u4e2a\u673a\u5668\u4eba\u3001\u65e0\u4eba\u673a\u548c\u81ea\u52a8\u9a7e\u9a76\u6c7d\u8f66\u8d56\u4ee5\u6784\u5efa\u7684\u611f\u77e5\u57fa\u7840\u3002
\u5bf9\u4eba\u7c7b\u800c\u8a00\uff0c\u611f\u77e5\u4e16\u754c\u6beb\u4e0d\u8d39\u529b\uff1a\u4f60\u770b\u5230\u4e00\u8f86\u8f66\u9a76\u8fd1\uff0c\u542c\u5230\u5f15\u64ce\u58f0\uff0c\u611f\u53d7\u5230\u811a\u4e0b\u7684\u5730\u9762\uff0c\u77ac\u95f4\u5728\u8111\u6d77\u4e2d\u6784\u5efa\u51fa\u5468\u56f4\u73af\u5883\u7684\u5fc3\u667a\u6a21\u578b\u3002\u81ea\u4e3b\u7cfb\u7edf\u4e5f\u5fc5\u987b\u505a\u5230\u540c\u6837\u7684\u4e8b\uff0c\u4f46\u5b83\u4f7f\u7528\u7684\u662f\u7535\u5b50\u4f20\u611f\u5668\u548c\u7b97\u6cd5\uff0c\u800c\u975e\u773c\u775b\u548c\u8033\u6735\u3002
\u6839\u672c\u6027\u6311\u6218\u5728\u4e8e\uff1a\u4f20\u611f\u5668\u63d0\u4f9b\u7684\u662f\u539f\u59cb\u6570\u5b57\uff08\u50cf\u7d20\u5f3a\u5ea6\u3001\u70b9\u4e91\u3001\u4fe1\u53f7\u53cd\u5c04\uff09\uff0c\u7cfb\u7edf\u5fc5\u987b\u5c06\u8fd9\u4e9b\u6570\u5b57\u8f6c\u5316\u4e3a\u7ed3\u6784\u5316\u7684\u7406\u89e3\uff1a\"\u524d\u65b912\u7c73\u5904\u6709\u4e00\u4e2a\u884c\u4eba\uff0c\u4ee51.5\u7c73/\u79d2\u7684\u901f\u5ea6\u5411\u5de6\u79fb\u52a8\u3002\"\u8fd9\u5c31\u662f\u611f\u77e5\u95ee\u9898\u3002
\u4e0b\u6e38\u7684\u6240\u6709\u4efb\u52a1\uff08\u9884\u6d4b\u3001\u89c4\u5212\u3001\u63a7\u5236\uff09\u90fd\u4f9d\u8d56\u4e8e\u611f\u77e5\u3002\u4e00\u4e2a\u62e5\u6709\u5b8c\u7f8e\u89c4\u5212\u5668\u4f46\u611f\u77e5\u80fd\u529b\u5dee\u7684\u81ea\u52a8\u9a7e\u9a76\u6c7d\u8f66\u4ecd\u7136\u4f1a\u649e\u8f66\u3002\u611f\u77e5\u662f\u74f6\u9888\u3002
\u76f8\u673a\u4ee5\u9ad8\u5206\u8fa8\u7387\u6355\u83b7\u5bc6\u96c6\u7684\u989c\u8272\u4fe1\u606f\u3002\u5355\u5f20\u56fe\u50cf\u5305\u542b\u6570\u767e\u4e07\u50cf\u7d20\uff0c\u6bcf\u4e2a\u50cf\u7d20\u8bb0\u5f55RGB\u503c\uff08\u5982\u6211\u4eec\u5728\u7b2c8\u7ae0\u6240\u89c1\uff09\u3002\u76f8\u673a\u4ef7\u683c\u4f4e\u5ec9\u3001\u91cd\u91cf\u8f7b\uff0c\u63d0\u4f9b\u4e30\u5bcc\u7684\u7eb9\u7406\u548c\u989c\u8272\u4fe1\u606f\uff0c\u8fd9\u5bf9\u8bc6\u522b\u6807\u724c\u3001\u68c0\u6d4b\u4ea4\u901a\u4fe1\u53f7\u706f\u548c\u8bc6\u522b\u7269\u4f53\u81f3\u5173\u91cd\u8981\u3002
\u76f8\u673a\u7c7b\u578b\u5305\u62ec\u5355\u76ee\uff08\u5355\u4e2a\u955c\u5934\uff0c\u65e0\u539f\u751f\u6df1\u5ea6\uff09\u3001\u7acb\u4f53\uff08\u4e24\u4e2a\u955c\u5934\u76f8\u9694\u4e00\u4e2a\u57fa\u7ebf\uff0c\u901a\u8fc7\u89c6\u5dee\u8ba1\u7b97\u6df1\u5ea6\uff0c\u8be6\u89c1\u7b2c8\u7ae0\uff09\u548c\u9c7c\u773c\uff08\u8d85\u5bbd\u89c6\u573a\u89d2\uff0c180\u00b0\u4ee5\u4e0a\uff0c\u5177\u6709\u4e25\u91cd\u5f84\u5411\u7578\u53d8\uff0c\u7528\u4e8e\u73af\u7ed5\u89c6\u56fe\u6cca\u8f66\u7cfb\u7edf\uff09\u3002
\u76f8\u673a\u7684\u4e3b\u8981\u5f31\u70b9\u662f\u6295\u5f71\u8fc7\u7a0b\u4e2d\u4e22\u5931\u6df1\u5ea6\u4fe1\u606f\u30023D\u573a\u666f\u901a\u8fc7\u9488\u5b54\u76f8\u673a\u6a21\u578b\u6620\u5c04\u52302D\u56fe\u50cf\u5e73\u9762\uff08\u56de\u987e\u7b2c8\u7ae0\u7684\u5185\u53c2\u77e9\u9635\\(K\\)\uff09\uff1a
\u9664\u4ee5\\(Z\\)\u7684\u8fc7\u7a0b\u4e22\u5f03\u4e86\u7edd\u5bf9\u6df1\u5ea6\u3002\u4e24\u4e2a\u4e0d\u540c\u5927\u5c0f\u3001\u4e0d\u540c\u8ddd\u79bb\u7684\u7269\u4f53\u53ef\u80fd\u4ea7\u751f\u5b8c\u5168\u76f8\u540c\u7684\u6295\u5f71\u3002\u4ece\u5355\u5f20\u56fe\u50cf\u6062\u590d\u6df1\u5ea6\u662f\u75c5\u6001\u95ee\u9898\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u9700\u8981\u7acb\u4f53\u76f8\u673a\u6216\u5b66\u4e60\u578b\u5355\u76ee\u6df1\u5ea6\u6a21\u578b\u3002
\u76f8\u673a\u5728\u6076\u52a3\u6761\u4ef6\u4e0b\u4e5f\u4f1a\u53d7\u5230\u5f71\u54cd\uff1a\u76f4\u5c04\u9633\u5149\u4ea7\u751f\u7729\u5149\uff0c\u9ed1\u6697\u964d\u4f4e\u4fe1\u53f7\uff0c\u96e8\u96fe\u6563\u5c04\u5149\u7ebf\u3002
LiDAR\uff08\u5149\u63a2\u6d4b\u4e0e\u6d4b\u8ddd\uff09\u53d1\u5c04\u6fc0\u5149\u8109\u51b2\u5e76\u6d4b\u91cf\u6bcf\u4e2a\u8109\u51b2\u8fd4\u56de\u7684\u65f6\u95f4\u3002\u7531\u4e8e\u5149\u901f\u5df2\u77e5\uff08\\(c \\\\approx 3 \\\\times 10^8\\) m/s\uff09\uff0c\u6bcf\u4e2a\u53cd\u5c04\u70b9\u7684\u8ddd\u79bb\u4e3a\uff1a
\u56e0\u5b502\u8003\u8651\u4e86\u5f80\u8fd4\u884c\u7a0b\uff08\u53bb\u7a0b\u548c\u56de\u7a0b\uff09\u3002\u901a\u8fc7\u5c06\u6fc0\u5149\u626b\u8fc7\u573a\u666f\uff0cLiDAR\u6784\u5efa\u4e86\u4e00\u4e2a\u70b9\u4e91\uff1a\u4e00\u7ec43D\u5750\u6807\\((x, y, z)\\)\uff0c\u901a\u5e38\u5e26\u6709\u5f3a\u5ea6\uff08\u53cd\u5c04\u7387\uff09\u503c\u3002
\u65cb\u8f6c\u5f0fLiDAR\uff08\u5982Velodyne\uff09\u65cb\u8f6c\u6fc0\u5149\u9635\u5217360\u00b0\u4ee5\u63d0\u4f9b\u5b8c\u6574\u7684\u73af\u89c6\u89c6\u56fe\u3002\u5178\u578b\u8bbe\u5907\u6bcf\u79d2\u751f\u6210\u8d85\u8fc730\u4e07\u4e2a\u70b9\uff0c\u8986\u76d664-128\u4e2a\u5782\u76f4\u901a\u9053\u3002\u7ed3\u679c\u662f\u573a\u666f\u7684\u7a00\u758f\u4f46\u51e0\u4f55\u7cbe\u5ea6\u9ad8\u76843D\u8868\u793a\u3002
\u56fa\u6001LiDAR\u6ca1\u6709\u8fd0\u52a8\u90e8\u4ef6\uff0c\u4f7f\u7528\u5149\u5b66\u76f8\u63a7\u9635\u6216MEMS\u955c\u9762\u3002\u8fd9\u4f7f\u5f97\u5b83\u4eec\u66f4\u4fbf\u5b9c\u3001\u66f4\u7d27\u51d1\u3001\u66f4\u53ef\u9760\uff0c\u4f46\u901a\u5e38\u89c6\u573a\u89d2\u8f83\u7a84\uff08120\u00b0 vs 360\u00b0\uff09\u3002
LiDAR\u63d0\u4f9b\u7cbe\u786e\u7684\u6df1\u5ea6\uff0c\u4f46\u751f\u6210\u7684\u662f\u7a00\u758f\u6570\u636e\uff08\"\u50cf\u7d20\"\u6570\u91cf\u8fdc\u5c11\u4e8e\u76f8\u673a\uff09\uff0c\u6ca1\u6709\u989c\u8272\u4fe1\u606f\uff0c\u4e14\u4ef7\u683c\u6602\u8d35\u3002\u5728\u5927\u96e8\u3001\u96ea\u6216\u7070\u5c18\u4e2d\uff0c\u7c92\u5b50\u4f1a\u6563\u5c04\u6fc0\u5149\u8109\u51b2\uff0c\u5176\u6027\u80fd\u4e5f\u4f1a\u4e0b\u964d\u3002
\u96f7\u8fbe\uff08\u65e0\u7ebf\u7535\u63a2\u6d4b\u4e0e\u6d4b\u8ddd\uff09\u57fa\u4e8e\u4e0eLiDAR\u76f8\u540c\u7684\u98de\u884c\u65f6\u95f4\u539f\u7406\uff0c\u4f46\u4f7f\u7528\u65e0\u7ebf\u7535\u6ce2\uff08\u6beb\u7c73\u6ce2\uff0c\u6c7d\u8f66\u9886\u57df\u901a\u5e38\u4e3a77 GHz\uff09\u3002\u65e0\u7ebf\u7535\u6ce2\u7a7f\u900f\u96e8\u3001\u96fe\u3001\u5c18\u548c\u96ea\u7684\u80fd\u529b\u8fdc\u4f18\u4e8e\u5149\uff0c\u4f7f\u96f7\u8fbe\u6210\u4e3a\u6700\u8010\u5929\u6c14\u7684\u4f20\u611f\u5668\u3002
\u96f7\u8fbe\u8fd8\u80fd\u901a\u8fc7\u591a\u666e\u52d2\u6548\u5e94\u76f4\u63a5\u6d4b\u91cf\u901f\u5ea6\u3002\u5f53\u7269\u4f53\u5411\u4f20\u611f\u5668\u79fb\u52a8\u65f6\uff0c\u53cd\u5c04\u6ce2\u88ab\u538b\u7f29\uff08\u9891\u7387\u5347\u9ad8\uff09\uff1b\u5f53\u8fdc\u79bb\u65f6\uff0c\u53cd\u5c04\u6ce2\u88ab\u62c9\u4f38\uff08\u9891\u7387\u964d\u4f4e\uff09\u3002\u901f\u5ea6\u516c\u5f0f\u4e3a\uff1a
\u5176\u4e2d\\(\\\\Delta f\\)\u662f\u9891\u79fb\uff0c\\(f_0\\)\u662f\u53d1\u5c04\u9891\u7387\u3002\u8fd9\u63d0\u4f9b\u4e86\u77ac\u65f6\u5f84\u5411\u901f\u5ea6\uff0c\u65e0\u9700\u4efb\u4f55\u8ddf\u8e2a\u6216\u5e27\u95f4\u8ba1\u7b97\u3002
\u6298\u4e2d\u662f\u5206\u8fa8\u7387\uff1a\u96f7\u8fbe\u7684\u89d2\u5206\u8fa8\u7387\u8fdc\u4f4e\u4e8e\u76f8\u673a\u6216LiDAR\uff0c\u96be\u4ee5\u533a\u5206\u90bb\u8fd1\u7269\u4f53\u6216\u68c0\u6d4b\u7cbe\u7ec6\u7ec6\u8282\u3002\u4f46\u5b83\u5728\u4efb\u4f55\u5929\u6c14\u6761\u4ef6\u4e0b\u90fd\u80fd\u51fa\u8272\u5730\u63a2\u6d4b\u8fdc\u8ddd\u79bb\uff08200\u7c73\u4ee5\u4e0a\uff09\u7684\u8f66\u8f86\u3002
\u8d85\u58f0\u6ce2\u4f20\u611f\u5668\u53d1\u5c04\u9ad8\u9891\u58f0\u8109\u51b2\uff0840-70 kHz\uff09\u5e76\u6d4b\u91cf\u56de\u6ce2\u8fd4\u56de\u65f6\u95f4\u3002\u5b83\u4eec\u5de5\u4f5c\u5728\u6781\u77ed\u8ddd\u79bb\uff080.2-5\u7c73\uff09\uff0c\u4e3b\u8981\u7528\u4e8e\u6cca\u8f66\u8f85\u52a9\u3002\u5176\u7269\u7406\u539f\u7406\u4e0eLiDAR\u76f8\u540c\uff0c\u53ea\u662f\u7528\u58f0\u97f3\u4ee3\u66ff\u5149\uff0c\u56e0\u6b64\\(d = \\\\frac{v_{\\\\text{\u58f0}} \\\\cdot \\\\Delta t}{2}\\)\uff0c\u5176\u4e2d\\(v_{\\\\text{\u58f0}} \\\\approx 343\\) m/s\u3002
IMU\uff08\u60ef\u6027\u6d4b\u91cf\u5355\u5143\uff09\u5305\u542b\u52a0\u901f\u5ea6\u8ba1\u548c\u9640\u87ba\u4eea\uff0c\u5206\u522b\u6d4b\u91cf\u7ebf\u52a0\u901f\u5ea6\u548c\u89d2\u901f\u5ea6\u3002IMU\u63d0\u4f9b\u9ad8\u9891\u8fd0\u52a8\u6570\u636e\uff08\u901a\u5e38200-1000 Hz\uff09\uff0c\u586b\u8865\u4e86\u8f83\u6162\u4f20\u611f\u5668\u66f4\u65b0\u4e4b\u95f4\u7684\u7a7a\u767d\u3002\u5b83\u4eec\u4e0d\u76f4\u63a5\u611f\u77e5\u73af\u5883\uff0c\u800c\u662f\u8ddf\u8e2a\u673a\u5668\u4eba\u81ea\u8eab\u7684\u8fd0\u52a8\uff0c\u56e0\u6b64\u5bf9\u822a\u4f4d\u63a8\u7b97\u548c\u72b6\u6001\u4f30\u8ba1\u81f3\u5173\u91cd\u8981\u3002
IMU\u5b58\u5728\u6f02\u79fb\u95ee\u9898\uff1a\u5c0f\u7684\u6d4b\u91cf\u8bef\u5dee\u968f\u65f6\u95f4\u7d2f\u79ef\uff0c\u5bfc\u81f4\u4f30\u8ba1\u4f4d\u7f6e\u504f\u79bb\u771f\u5b9e\u4f4d\u7f6e\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48IMU\u51e0\u4e4e\u603b\u662f\u4e0e\u5176\u4ed6\u4f20\u611f\u5668\uff08\u76f8\u673a\u3001GPS\u3001LiDAR\uff09\u878d\u5408\u4f7f\u7528\uff0c\u800c\u975e\u5355\u72ec\u4f7f\u7528\u3002
GNSS\uff08\u5168\u7403\u5bfc\u822a\u536b\u661f\u7cfb\u7edf\uff0c\u5305\u62ecGPS\uff09\u901a\u8fc7\u4e09\u89d2\u6d4b\u91cf\u6765\u81ea\u591a\u9897\u536b\u661f\u7684\u4fe1\u53f7\uff0c\u63d0\u4f9b\u5730\u7403\u8868\u9762\u7684\u7edd\u5bf9\u4f4d\u7f6e\u3002\u6807\u51c6GPS\u7cbe\u5ea6\u4e3a2-5\u7c73\uff0c\u4e0d\u8db3\u4ee5\u8fdb\u884c\u8f66\u9053\u7ea7\u9a7e\u9a76\u3002RTK-GPS\uff08\u5b9e\u65f6\u52a8\u6001\u5dee\u5206GPS\uff09\u4f7f\u7528\u56fa\u5b9a\u57fa\u7ad9\u6821\u6b63\u8bef\u5dee\uff0c\u8fbe\u5230\u5398\u7c73\u7ea7\u7cbe\u5ea6\uff0c\u4f46\u9700\u8981\u6e05\u6670\u7684\u5929\u7a7a\u89c6\u91ce\u548c\u57fa\u7ad9\u57fa\u7840\u8bbe\u65bd\u3002
\u5728\u4f20\u611f\u5668\u534f\u540c\u5de5\u4f5c\u4e4b\u524d\uff0c\u5fc5\u987b\u8fdb\u884c\u6807\u5b9a\uff1a\u5c06\u6bcf\u4e2a\u4f20\u611f\u5668\u7684\u6d4b\u91cf\u503c\u4e0e\u5171\u540c\u5750\u6807\u7cfb\u5173\u8054\u8d77\u6765\u3002
\u5185\u53c2\u6807\u5b9a\u786e\u5b9a\u4f20\u611f\u5668\u7684\u5185\u90e8\u53c2\u6570\u3002\u5bf9\u4e8e\u76f8\u673a\uff0c\u8fd9\u610f\u5473\u7740\u7126\u8ddd\u3001\u4e3b\u70b9\u548c\u7578\u53d8\u7cfb\u6570\uff08\u5982\u7b2c8\u7ae0\u6240\u8ff0\uff09\u3002\u5bf9\u4e8eLiDAR\uff0c\u8fd9\u610f\u5473\u7740\u6fc0\u5149\u675f\u4e4b\u95f4\u7684\u7cbe\u786e\u89d2\u5ea6\u504f\u79fb\u3002\u5e38\u7528\u7684\u65b9\u6cd5\u662f\u5f20\u6c0f\u68cb\u76d8\u683c\u6807\u5b9a\u6cd5\uff0c\u5373\u4ece\u591a\u4e2a\u89d2\u5ea6\u89c2\u5bdf\u5df2\u77e5\u5e73\u9762\u56fe\u6848\uff0c\u6c42\u89e3\u5185\u53c2\u77e9\u9635\u3002
\u5916\u53c2\u6807\u5b9a\u786e\u5b9a\u4e24\u4e2a\u4f20\u611f\u5668\u4e4b\u95f4\u7684\u521a\u4f53\u53d8\u6362\uff08\u65cb\u8f6c\\(R\\)\u548c\u5e73\u79fb\\(\\\\mathbf{t}\\)\uff09\u3002\u5982\u679c\u76f8\u673a\u548cLiDAR\u5b89\u88c5\u5728\u540c\u4e00\u8f86\u8f66\u4e0a\uff0c\u5916\u53c2\u6807\u5b9a\u4f1a\u627e\u5230\u4e00\u4e2a\\(4 \\\\times 4\\)\u53d8\u6362\u77e9\u9635\uff0c\u5c06LiDAR\u5750\u6807\u4e2d\u7684\u70b9\u6620\u5c04\u5230\u76f8\u673a\u5750\u6807\uff1a
\u8fd9\u662f\u9f50\u6b21\u5750\u6807\u4e2d\u7684\u4eff\u5c04\u53d8\u6362\uff0c\u6b63\u662f\u6211\u4eec\u5728\u7b2c2\u7ae0\uff08\u7ebf\u6027\u53d8\u6362\uff09\u4e2d\u7814\u7a76\u8fc7\u7684\u90a3\u79cd\u3002\u5982\u679c\u8fd9\u4e2a\u77e9\u9635\u51fa\u9519\uff0cLiDAR\u70b9\u5c06\u6295\u5f71\u5230\u9519\u8bef\u7684\u50cf\u7d20\u4e0a\uff0c\u6574\u4e2a\u878d\u5408\u6d41\u7a0b\u5c31\u4f1a\u5d29\u6e83\u3002
\u65f6\u95f4\u6807\u5b9a\u540c\u6b65\u4f20\u611f\u5668\u65f6\u949f\u3002\u4ee530 Hz\u5de5\u4f5c\u7684\u76f8\u673a\u548c\u4ee510 Hz\u5de5\u4f5c\u7684LiDAR\u5728\u4e0d\u540c\u65f6\u95f4\u6233\u4ea7\u751f\u6570\u636e\u3002\u5982\u679c\u6c7d\u8f66\u4ee530 m/s\uff08\u9ad8\u901f\u516c\u8def\u901f\u5ea6\uff09\u884c\u9a76\uff0c10\u6beb\u79d2\u7684\u65f6\u95f4\u8bef\u5dee\u5bf9\u5e9430\u5398\u7c73\u7684\u7a7a\u95f4\u8bef\u5dee\u3002\u786c\u4ef6\u89e6\u53d1\uff08\u5171\u4eab\u65f6\u949f\u8109\u51b2\uff09\u6216\u8f6f\u4ef6\u540c\u6b65\uff08\u65f6\u95f4\u6233\u4e4b\u95f4\u7684\u63d2\u503c\uff09\u81f3\u5173\u91cd\u8981\u3002
\u6ca1\u6709\u54ea\u79cd\u4f20\u611f\u5668\u80fd\u8986\u76d6\u6240\u6709\u6761\u4ef6\u3002\u76f8\u673a\u770b\u5f97\u5230\u989c\u8272\u548c\u7eb9\u7406\u4f46\u4e22\u5931\u6df1\u5ea6\u3002LiDAR\u7cbe\u786e\u6d4b\u91cf\u6df1\u5ea6\u4f46\u7a00\u758f\u4e14\u8272\u76f2\u3002\u96f7\u8fbe\u5728\u4efb\u4f55\u5929\u6c14\u4e0b\u90fd\u80fd\u5de5\u4f5c\u4f46\u5206\u8fa8\u7387\u4f4e\u3002\u4f20\u611f\u5668\u878d\u5408\u7ed3\u5408\u5404\u81ea\u7684\u4f18\u52bf\uff0c\u5f25\u8865\u5404\u81ea\u7684\u5f31\u70b9\u3002
\u65e9\u671f\u878d\u5408\uff08\u6570\u636e\u7ea7\u878d\u5408\uff09\u5728\u8fdb\u884c\u4efb\u4f55\u5904\u7406\u4e4b\u524d\u5408\u5e76\u539f\u59cb\u4f20\u611f\u5668\u6570\u636e\u3002\u4f8b\u5982\uff0c\u5c06LiDAR\u70b9\u6295\u5f71\u5230\u76f8\u673a\u56fe\u50cf\u4e0a\uff0c\u521b\u5efaRGBD\u8868\u793a\uff08\u6bcf\u50cf\u7d20\u7684\u989c\u8272+\u6df1\u5ea6\uff09\uff0c\u6216\u8005\u4e3a\u6bcf\u4e2aLiDAR\u70b9\u8d4b\u4e88\u5176\u6295\u5f71\u5230\u7684\u76f8\u673a\u50cf\u7d20\u7684\u989c\u8272\u3002\u8fd9\u79cd\u65b9\u5f0f\u4fdd\u7559\u4e86\u6700\u591a\u7684\u4fe1\u606f\uff0c\u4f46\u9700\u8981\u7cbe\u786e\u7684\u6807\u5b9a\uff0c\u4e14\u5bf9\u672a\u5bf9\u51c6\u975e\u5e38\u654f\u611f\u3002
\u540e\u671f\u878d\u5408\uff08\u51b3\u7b56\u7ea7\u878d\u5408\uff09\u6bcf\u4e2a\u4f20\u611f\u5668\u72ec\u7acb\u8fd0\u884c\u5404\u81ea\u7684\u68c0\u6d4b\u6d41\u7a0b\uff0c\u7136\u540e\u5408\u5e76\u6700\u7ec8\u8f93\u51fa\uff08\u8fb9\u754c\u6846\u3001\u7c7b\u522b\u6807\u7b7e\u3001\u7f6e\u4fe1\u5ea6\u5206\u6570\uff09\u3002\u6bcf\u4e2a\u4f20\u611f\u5668\u6295\u7968\uff0c\u878d\u5408\u6a21\u5757\u534f\u8c03\u5206\u6b67\u3002\u8fd9\u79cd\u65b9\u5f0f\u66f4\u7b80\u5355\u3001\u66f4\u6a21\u5757\u5316\uff0c\u4f46\u6bcf\u4e2a\u6d41\u7a0b\u65e0\u6cd5\u4ece\u5176\u4ed6\u4f20\u611f\u5668\u7684\u539f\u59cb\u6570\u636e\u4e2d\u83b7\u76ca\u3002
\u4e2d\u7ea7\u878d\u5408\u5728\u4e2d\u95f4\u7279\u5f81\u8868\u793a\u5c42\u9762\u8fdb\u884c\u64cd\u4f5c\u3002\u6bcf\u4e2a\u4f20\u611f\u5668\u7684\u539f\u59cb\u6570\u636e\u88ab\u7f16\u7801\u5230\u5b66\u4e60\u5230\u7684\u7279\u5f81\u7a7a\u95f4\uff08\u4f7f\u7528CNN\u6216transformer\uff09\uff0c\u7136\u540e\u7279\u5f81\u88ab\u5408\u5e76\u3002\u8fd9\u662f\u73b0\u4ee3\u7cfb\u7edf\u7684\u4e3b\u6d41\u65b9\u6cd5\uff0c\u56e0\u4e3a\u5b83\u8ba9\u7f51\u7edc\u5b66\u4e60\u4ece\u6bcf\u79cd\u6a21\u6001\u4e2d\u63d0\u53d6\u4ec0\u4e48\u3002
BEVFusion\u662f\u4e00\u79cd\u4ee3\u8868\u6027\u7684\u4e2d\u7ea7\u878d\u5408\u67b6\u6784\u3002\u5b83\u5c06\u76f8\u673a\u7279\u5f81\u548cLiDAR\u7279\u5f81\u6295\u5f71\u5230\u4e00\u4e2a\u5171\u540c\u7684\u9e1f\u77b0\u56fe\uff08BEV\uff09\u8868\u793a\u4e2d\uff0c\u5373\u573a\u666f\u7684\u4fef\u89c6\u7f51\u683c\u3002\u76f8\u673a\u7279\u5f81\u901a\u8fc7\u9884\u6d4b\u7684\u6df1\u5ea6\u5206\u5e03\u88ab\"\u63d0\u5347\"\u52303D\uff0c\u7136\u540e\u6563\u5e03\u5230BEV\u7f51\u683c\u4e0a\u3002LiDAR\u7279\u5f81\u5df2\u7ecf\u662f3D\u7684\uff0c\u76f4\u63a5\u88ab\u4f53\u7d20\u5316\u5230\u540c\u4e00\u4e2a\u7f51\u683c\u4e0a\u3002\u878d\u5408\u540e\u7684BEV\u7279\u5f81\u968f\u540e\u7531\u68c0\u6d4b\u5934\u5904\u7406\u3002
BEV\u8868\u793a\u4e4b\u6240\u4ee5\u5f3a\u5927\uff0c\u662f\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7edf\u4e00\u7684\u3001\u5ea6\u91cf\u5c3a\u5ea6\u7684\u5750\u6807\u6846\u67b6\uff0c\u7a7a\u95f4\u63a8\u7406\uff08\u8ddd\u79bb\u3001\u5c3a\u5bf8\u3001\u91cd\u53e0\uff09\u5728\u5176\u4e2d\u53d8\u5f97\u76f4\u89c2\u3002\u5728\u76f8\u673a\u56fe\u50cf\u4e2d\uff0c\u4e00\u8f86\u8fd1\u5904\u7684\u81ea\u884c\u8f66\u548c\u4e00\u8f86\u8fdc\u5904\u7684\u5361\u8f66\u53ef\u80fd\u5360\u636e\u76f8\u540c\u6570\u91cf\u7684\u50cf\u7d20\u3002\u800c\u5728BEV\u4e2d\uff0c\u5b83\u4eec\u7684\u771f\u5b9e\u5927\u5c0f\u548c\u4f4d\u7f6e\u4e00\u76ee\u4e86\u7136\u3002
\u611f\u77e5\u7684\u6838\u5fc3\u4efb\u52a1\u662f\u57283D\u7a7a\u95f4\u4e2d\u68c0\u6d4b\u7269\u4f53\uff1a\u5b83\u4eec\u5728\u54ea\u91cc\uff0c\u6709\u591a\u5927\uff0c\u662f\u4ec0\u4e48\uff0c\u671d\u5411\u4f55\u65b9\uff1f\u6bcf\u6b21\u68c0\u6d4b\u5f97\u5230\u4e00\u4e2a3D\u8fb9\u754c\u6846\uff0c\u5305\u62ec\u4f4d\u7f6e\\((x, y, z)\\)\u3001\u5c3a\u5bf8\\((l, w, h)\\)\u3001\u822a\u5411\u89d2\\(\\\\theta\\)\u3001\u7c7b\u522b\u6807\u7b7e\u548c\u7f6e\u4fe1\u5ea6\u5206\u6570\u3002
\u57fa\u4e8eLiDAR\u7684\u68c0\u6d4b\u76f4\u63a5\u5728\u70b9\u4e91\u4e0a\u64cd\u4f5c\u3002\u6311\u6218\u5728\u4e8e\u70b9\u4e91\u662f\u65e0\u5e8f\u7684\u3001\u4e0d\u89c4\u5219\u7684\uff0c\u4e14\u5bc6\u5ea6\u53d8\u5316\u5927\uff08\u8fd1\u5904\u7269\u4f53\u6709\u6570\u5343\u4e2a\u70b9\uff0c\u8fdc\u5904\u7269\u4f53\u53ea\u6709\u51e0\u4e2a\uff09\u3002\u56de\u987e\u7b2c8\u7ae0\uff0cPointNet\u901a\u8fc7\u5171\u4eabMLP\u548c\u7f6e\u6362\u4e0d\u53d8\u7684\u805a\u5408\uff08\u6700\u5927\u6c60\u5316\uff09\u6765\u5904\u7406\u8fd9\u4e00\u95ee\u9898\u3002
PointPillars\u901a\u8fc7\u5c06\u5730\u9762\u5e73\u9762\u79bb\u6563\u5316\u4e3a\u5782\u76f4\u67f1\uff08\"pillars\"\uff09\u7684\u7f51\u683c\uff0c\u5c06\u70b9\u4e91\u8f6c\u5316\u4e3a\u7ed3\u6784\u5316\u8868\u793a\u3002\u6bcf\u4e2apillar\u5185\u7684\u6240\u6709\u70b9\u7531\u4e00\u4e2a\u5c0f\u578bPointNet\u7f16\u7801\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684\u7279\u5f81\u5411\u91cf\u3002\u7ed3\u679c\u662f\u4e00\u4e2a2D\u4f2a\u56fe\u50cf\uff0c\u53ef\u4ee5\u7531\u6807\u51c6\u76842D CNN\u4e3b\u5e72\u7f51\u7edc\u5904\u7406\uff0c\u7136\u540e\u662f\u68c0\u6d4b\u5934\uff08\u5982\u7b2c8\u7ae0\u4e2d\u7684SSD\u67b6\u6784\uff09\u3002\u8fd9\u79cd\u65b9\u6cd5\u5feb\u901f\u4e14\u6709\u6548\u3002
CenterPoint\u5c06\u7269\u4f53\u68c0\u6d4b\u4e3a\u70b9\u800c\u975e\u8fb9\u754c\u6846\u3002\u5b83\u5728BEV\u4e2d\u9884\u6d4b\u7269\u4f53\u4e2d\u5fc3\u7684\u70ed\u56fe\uff0c\u7136\u540e\u5728\u6bcf\u4e2a\u5cf0\u503c\u5904\u56de\u5f52\u8fb9\u754c\u6846\u5c5e\u6027\uff08\u5c3a\u5bf8\u3001\u9ad8\u5ea6\u3001\u822a\u5411\u3001\u901f\u5ea6\uff09\u3002\u8fd9\u662fCenterNet\uff08\u7b2c8\u7ae0\uff09\u76843D\u7c7b\u6bd4\uff1a\u65e0\u951a\u70b9\uff0c\u8bad\u7ec3\u65f6\u65e0\u9700NMS\uff0c\u5e76\u901a\u8fc7\u8de8\u5e27\u5173\u8054\u4e2d\u5fc3\u70b9\u81ea\u7136\u6269\u5c55\u5230\u8ddf\u8e2a\u3002
\u7eaf\u76f8\u673a3D\u68c0\u6d4b\u5fc5\u987b\u4ece2D\u56fe\u50cf\u63a8\u65ad\u6df1\u5ea6\uff0c\u8fd9\u4ece\u6839\u672c\u4e0a\u66f4\u96be\u3002\u73b0\u4ee3\u65b9\u6cd5\u5982BEVDet\u548cBEVFormer\u4f7f\u7528transformer\u67b6\u6784\u5c062D\u56fe\u50cf\u7279\u5f81\"\u63d0\u5347\"\u52303D\u3002BEVFormer\u4f7f\u7528\u7a7a\u95f4\u4ea4\u53c9\u6ce8\u610f\u529b\uff1aBEV\u67e5\u8be2\u5173\u6ce8\u6295\u5f71\u5230\u6bcf\u4e2a\u76f8\u673a\u56fe\u50cf\u4e0a\u7684\u7279\u5b9a3D\u53c2\u8003\u70b9\uff0c\u4ece\u76f8\u5173\u4f4d\u7f6e\u63d0\u53d6\u7279\u5f81\u3002
\u57fa\u4e8eLiDAR\u548c\u57fa\u4e8e\u76f8\u673a\u76843D\u68c0\u6d4b\u4e4b\u95f4\u7684\u7cbe\u5ea6\u5dee\u8ddd\u6b63\u5728\u8fc5\u901f\u7f29\u5c0f\uff0c\u8fd9\u5f97\u76ca\u4e8e\u66f4\u597d\u7684\u6df1\u5ea6\u4f30\u8ba1\u3001\u66f4\u5927\u7684\u6a21\u578b\u548c\u65f6\u95f4\u878d\u5408\uff08\u5229\u7528\u591a\u5e27\u7d2f\u79ef\u6df1\u5ea6\u7ebf\u7d22\uff0c\u7c7b\u4f3c\u7acb\u4f53\u5339\u914d\u4f46\u8de8\u65f6\u95f4\u8fdb\u884c\uff09\u3002
\u6df1\u5ea6\u4f30\u8ba1\u662f\u4e3a\u6bcf\u4e2a\u50cf\u7d20\u6216\u70b9\u5206\u914d\u8ddd\u79bb\u503c\u7684\u95ee\u9898\u3002
\u7acb\u4f53\u5339\u914d\u4f7f\u7528\u4e24\u4e2a\u76f8\u9694\u5df2\u77e5\u57fa\u7ebf\\(b\\)\u7684\u76f8\u673a\u3002\u540c\u4e00\u4e2a3D\u70b9\u5728\u4e24\u5e45\u56fe\u50cf\u4e2d\u7684\u6c34\u5e73\u4f4d\u7f6e\u7565\u6709\u4e0d\u540c\uff0c\u5f62\u6210\u89c6\u5dee\\(d\\)\u3002\u6df1\u5ea6\u8ba1\u7b97\u516c\u5f0f\u4e3a\uff08\u6765\u81ea\u7b2c8\u7ae0\uff09\uff1a
\u5176\u4e2d\\(f\\)\u662f\u7126\u8ddd\u3002\u6311\u6218\u5728\u4e8e\u627e\u5230\u4e24\u5e45\u56fe\u50cf\u4e4b\u95f4\u7684\u6b63\u786e\u5bf9\u5e94\u5173\u7cfb\uff0c\u7279\u522b\u662f\u5728\u65e0\u7eb9\u7406\u533a\u57df\u3001\u906e\u6321\u533a\u57df\u548c\u91cd\u590d\u56fe\u6848\u4e2d\u3002\u73b0\u4ee3\u7acb\u4f53\u7f51\u7edc\uff08\u5982RAFT-Stereo\uff09\u4f7f\u7528\u5e26\u6709\u76f8\u5173\u4f53\u79ef\u7684\u8fed\u4ee3\u7cbe\u5316\u65b9\u6cd5\u3002
\u5355\u76ee\u6df1\u5ea6\u4f30\u8ba1\u4ece\u5355\u5f20\u56fe\u50cf\u9884\u6d4b\u6df1\u5ea6\u3002\u7531\u4e8e\u8fd9\u662f\u75c5\u6001\u95ee\u9898\uff08\u65e0\u9650\u591a\u4e2a3D\u573a\u666f\u53ef\u4ee5\u4ea7\u751f\u76f8\u540c\u7684\u56fe\u50cf\uff09\uff0c\u7f51\u7edc\u5fc5\u987b\u5b66\u4e60\u7edf\u8ba1\u5148\u9a8c\uff1a\"\u5730\u9762\u662f\u5e73\u7684\"\u3001\"\u7269\u4f53\u968f\u8ddd\u79bb\u589e\u5927\u800c\u53d8\u5c0f\"\u3001\"\u7eb9\u7406\u68af\u5ea6\u8868\u660e\u8868\u9762\u5728\u540e\u9000\"\u3002
Depth Anything\uff08\u7b2c8\u7ae0\u4e2d\u4ecb\u7ecd\u8fc7\uff09\u901a\u8fc7\u5728\u5927\u89c4\u6a21\u65e0\u6807\u6ce8\u6570\u636e\u96c6\u4e0a\u8fdb\u884c\u81ea\u76d1\u7763\u8bad\u7ec3\uff0c\u7136\u540e\u5728\u6807\u6ce8\u6570\u636e\u4e0a\u8fdb\u884c\u5fae\u8c03\uff0c\u5b9e\u73b0\u4e86\u5f3a\u5927\u7684\u5355\u76ee\u6df1\u5ea6\u4f30\u8ba1\u3002\u5173\u952e\u6d1e\u5bdf\u5728\u4e8e\u5c3a\u5ea6\u4e0d\u53d8\u635f\u5931\u5904\u7406\u4e86\u56fa\u6709\u4e0d\u660e\u786e\u6027\uff1a\u6a21\u578b\u9884\u6d4b\u7684\u662f\u76f8\u5bf9\u6df1\u5ea6\uff08\u6392\u5e8f\uff09\u800c\u975e\u7edd\u5bf9\u7c73\u6570\u3002
LiDAR-\u76f8\u673a\u6df1\u5ea6\u878d\u5408\u5c06\u7a00\u758f\u7684LiDAR\u6df1\u5ea6\u6d4b\u91cf\u503c\u6295\u5f71\u5230\u76f8\u673a\u56fe\u50cf\u4e0a\u4f5c\u4e3a\u76d1\u7763\u4fe1\u53f7\u3002\u7f51\u7edc\u5b66\u4e60\"\u586b\u5145\"\u7a00\u758f\u70b9\u4e4b\u95f4\u7684\u7a7a\u767d\uff0c\u751f\u6210\u7ed3\u5408LiDAR\u7cbe\u5ea6\u548c\u76f8\u673a\u5206\u8fa8\u7387\u7684\u5bc6\u96c6\u6df1\u5ea6\u56fe\u3002
\u5360\u636e\u7f51\u7edc\u5c06\u573a\u666f\u8868\u793a\u4e3a\u5bc6\u96c6\u76843D\u4f53\u7d20\u7f51\u683c\u3002\u6bcf\u4e2a\u4f53\u7d20\uff08\u4e00\u4e2a\u5c0f\u7acb\u65b9\u4f53\u7a7a\u95f4\uff0c\u4f8b\u59820.2m \u00d7 0.2m \u00d7 0.2m\uff09\u88ab\u5206\u7c7b\u4e3a\u7a7a\u95f2\u3001\u5360\u636e\u6216\u672a\u77e5\uff0c\u5e76\u53ef\u9009\u62e9\u8d4b\u4e88\u8bed\u4e49\u6807\u7b7e\uff08\u9053\u8def\u3001\u4eba\u884c\u9053\u3001\u8f66\u8f86\u3001\u690d\u88ab\u7b49\uff09\u3002
\u8fd9\u610f\u5473\u7740\u4ece\u4ee5\u7269\u4f53\u4e3a\u4e2d\u5fc3\u7684\u611f\u77e5\uff08\"\u68c0\u6d4b\u6c7d\u8f66\"\uff09\u8f6c\u5411\u4ee5\u573a\u666f\u4e3a\u4e2d\u5fc3\u7684\u611f\u77e5\uff08\"3D\u7a7a\u95f4\u7684\u54ea\u4e9b\u90e8\u5206\u88ab\u5360\u636e\uff1f\"\uff09\u3002\u4f18\u52bf\u5728\u4e8e\u901a\u7528\u6027\uff1a\u7cfb\u7edf\u4e0d\u9700\u8981\u9884\u5b9a\u4e49\u5bf9\u8c61\u7c7b\u522b\u5217\u8868\u6765\u907f\u514d\u4e0e\u4efb\u610f\u969c\u788d\u7269\u78b0\u649e\u3002
\u4ece\u67b6\u6784\u4e0a\u770b\uff0c\u5360\u636e\u7f51\u7edc\u63a5\u6536\u4f20\u611f\u5668\u8f93\u5165\uff08\u76f8\u673a\u3001LiDAR\u6216\u4e24\u8005\uff09\uff0c\u5c06\u5176\u7f16\u7801\u4e3a3D\u7279\u5f81\u4f53\u79ef\uff0c\u5e76\u9884\u6d4b\u6bcf\u4e2a\u4f53\u7d20\u7684\u6807\u7b7e\u30023D\u7279\u5f81\u4f53\u79ef\u901a\u5e38\u901a\u8fc7\u5c062D\u7279\u5f81\u63d0\u5347\u52303D\uff08\u7c7b\u4f3c\u4e8eBEV\u6784\u5efa\u4f46\u6269\u5c55\u5230\u5782\u76f4\u65b9\u5411\uff09\u6765\u6784\u5efa\uff0c\u7136\u540e\u4f7f\u75283D\u5377\u79ef\u6216\u7a00\u758f\u5377\u79ef\u8fdb\u884c\u5904\u7406\u3002
TPVFormer\uff08\u4e09\u89c6\u89d2\uff09\u901a\u8fc7\u5c063D\u4f53\u79ef\u5206\u89e3\u4e3a\u4e09\u4e2a\u6b63\u4ea4\u5e73\u9762\uff08\u4fef\u89c6\u56fe\u3001\u524d\u89c6\u56fe\u3001\u4fa7\u89c6\u56fe\uff09\u6765\u907f\u514d\u5b8c\u65743D\u6ce8\u610f\u529b\u7684\u7acb\u65b9\u7ea7\u8ba1\u7b97\u6210\u672c\u3002\u6bcf\u4e2a\u5e73\u9762\u4f7f\u75282D\u6ce8\u610f\u529b\uff0c\u5176\u7279\u5f81\u5728\u6bcf\u4e2a\u4f53\u7d20\u5904\u7ec4\u5408\u3002\u8fd9\u8ba9\u4eba\u60f3\u8d77SVD\u5982\u4f55\u5c06\u77e9\u9635\u5206\u89e3\u4e3a\u66f4\u7b80\u5355\u7684\u56e0\u5b50\uff08\u7b2c2\u7ae0\uff09\uff1a\u5c06\u4e00\u4e2a\u56f0\u96be\u76843D\u95ee\u9898\u5206\u89e3\u4e3a\u53ef\u7ba1\u7406\u76842D\u90e8\u5206\u3002
\u8f93\u51fa\u7684\u4f53\u7d20\u7f51\u683c\u76f4\u63a5\u544a\u8bc9\u89c4\u5212\u5668\u54ea\u4e9b\u7a7a\u95f4\u533a\u57df\u662f\u5b89\u5168\u7684\u3001\u54ea\u4e9b\u4e0d\u662f\uff0c\u4f7f\u5176\u6210\u4e3a\u611f\u77e5\u548c\u89c4\u5212\u4e4b\u95f4\u7684\u81ea\u7136\u63a5\u53e3\u3002
\u5bf9\u4e8e\u5728\u7ed3\u6784\u5316\u9053\u8def\u4e0a\u884c\u9a76\u7684\u8f66\u8f86\uff0c\u7406\u89e3\u8f66\u9053\u51e0\u4f55\u81f3\u5173\u91cd\u8981\u3002\u7cfb\u7edf\u5fc5\u987b\u77e5\u9053\u8f66\u9053\u5728\u54ea\u91cc\u3001\u5982\u4f55\u5f2f\u66f2\u3001\u5728\u54ea\u91cc\u5408\u5e76\u548c\u5206\u53c9\uff0c\u4ee5\u53ca\u8f66\u8f86\u5904\u4e8e\u54ea\u6761\u8f66\u9053\u3002
\u7ecf\u5178\u65b9\u6cd5\u5c06\u53c2\u6570\u66f2\u7ebf\u62df\u5408\u5230\u68c0\u6d4b\u5230\u7684\u8f66\u9053\u6807\u7ebf\u4e0a\u3002\u5e38\u7528\u7684\u6a21\u578b\u662f\u4e09\u6b21\u591a\u9879\u5f0f\uff1a
\u5176\u4e2d\\(y\\)\u662f\u524d\u65b9\u7eb5\u5411\u8ddd\u79bb\uff0c\\(x\\)\u662f\u6a2a\u5411\u504f\u79fb\u3002\u8fd9\u662f\u591a\u9879\u5f0f\u8fd1\u4f3c\uff08\u56de\u987e\u7b2c3\u7ae0\u7684\u6cf0\u52d2\u7ea7\u6570\uff09\uff0c\u9009\u62e9\u5b83\u662f\u56e0\u4e3a\u9053\u8def\u662f\u5e73\u6ed1\u66f2\u7ebf\uff0c\u5f88\u597d\u5730\u7531\u4f4e\u6b21\u591a\u9879\u5f0f\u63cf\u8ff0\u3002\u7cfb\u6570\u901a\u8fc7\u68c0\u6d4b\u5230\u7684\u8f66\u9053\u70b9\u4e0a\u7684\u6700\u5c0f\u4e8c\u4e58\u56de\u5f52\u4f30\u8ba1\u5f97\u51fa\u3002
\u73b0\u4ee3\u65b9\u6cd5\u4f7f\u7528\u795e\u7ecf\u7f51\u7edc\u76f4\u63a5\u68c0\u6d4b\u8f66\u9053\u3002LaneNet\u5c06\u6bcf\u6761\u8f66\u9053\u89c6\u4e3a\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u4f7f\u7528\u5d4c\u5165\u5206\u652f\u5bf9\u5c5e\u4e8e\u540c\u4e00\u6761\u8f66\u9053\u7684\u50cf\u7d20\u8fdb\u884c\u5206\u7ec4\uff0c\u7136\u540e\u8fdb\u884c\u66f2\u7ebf\u62df\u5408\u3002GANet\u4f7f\u7528\u57fa\u4e8e\u56fe\u7684\u65b9\u6cd5\uff0c\u5c06\u8f66\u9053\u62d3\u6251\u8868\u793a\u4e3a\u6709\u5411\u56fe\uff0c\u5176\u4e2d\u8282\u70b9\u662f\u8f66\u9053\u70b9\uff0c\u8fb9\u7f16\u7801\u8fde\u63a5\u5173\u7cfb\uff08\u54ea\u4e9b\u8f66\u9053\u5728\u4ea4\u53c9\u53e3\u5408\u5e76\u3001\u5206\u53c9\u6216\u8fde\u63a5\uff09\u3002
\u9053\u8def\u62d3\u6251\u8d85\u8d8a\u4e86\u5355\u4e2a\u8f66\u9053\u66f2\u7ebf\uff0c\u6355\u83b7\u5b8c\u6574\u7ed3\u6784\uff1a\u8f66\u9053\u4e4b\u95f4\u5982\u4f55\u8fde\u63a5\uff0c\u54ea\u4e9b\u8f66\u9053\u5141\u8bb8\u5de6\u8f6c\uff0c\u9ad8\u901f\u516c\u8def\u5165\u53e3\u531d\u9053\u5728\u54ea\u91cc\u6c47\u5165\u3002\u8fd9\u88ab\u5efa\u6a21\u4e3a\u6709\u5411\u56fe\uff0c\u4ea4\u53c9\u53e3\u662f\u8282\u70b9\uff0c\u8f66\u9053\u6bb5\u662f\u5e26\u6709\u5c5e\u6027\uff08\u9650\u901f\u3001\u8f66\u9053\u7c7b\u578b\u3001\u8f6c\u5f2f\u9650\u5236\uff09\u7684\u8fb9\u3002
\u56fe\u7ed3\u6784\u5bf9\u8def\u7ebf\u89c4\u5212\u81f3\u5173\u91cd\u8981\uff1a\u89c4\u5212\u5668\u9700\u8981\u77e5\u9053\u7684\u4e0d\u4ec5\u662f\"\u8f66\u9053\u5728\u54ea\u91cc\"\uff0c\u8fd8\u6709\"\u54ea\u6761\u8f66\u9053\u5e8f\u5217\u80fd\u5230\u8fbe\u76ee\u7684\u5730\"\u3002
\u611f\u77e5\u5e76\u4e0d\u6b62\u4e8e\u68c0\u6d4b\u5355\u5e27\u4e2d\u7684\u7269\u4f53\u3002\u968f\u7740\u65f6\u95f4\u7684\u63a8\u79fb\uff0c\u81ea\u4e3b\u7cfb\u7edf\u6784\u5efa\u4e00\u4e2a\u8bed\u4e49\u5730\u56fe\uff1a\u5bf9\u5176\u73af\u5883\u7684\u6301\u4e45\u5316\u3001\u7ed3\u6784\u5316\u8868\u793a\uff0c\u79ef\u7d2f\u6765\u81ea\u591a\u6b21\u89c2\u6d4b\u7684\u4fe1\u606f\u3002
\u6700\u7b80\u5355\u7684\u60c5\u51b5\u4e0b\uff0c\u8bed\u4e49\u5730\u56fe\u662f\u4e00\u4e2a2D\u7f51\u683c\uff08\u5360\u636e\u7f51\u683c\uff09\uff0c\u6bcf\u4e2a\u5355\u5143\u5b58\u50a8\u88ab\u5360\u636e\u7684\u6982\u7387\u3002\u968f\u7740\u673a\u5668\u4eba\u79fb\u52a8\u5e76\u901a\u8fc7\u4f20\u611f\u5668\u626b\u63cf\uff0c\u5b83\u4f7f\u7528\u8d1d\u53f6\u65af\u66f4\u65b0\u6765\u66f4\u65b0\u8fd9\u4e9b\u6982\u7387\uff1a
\u5bf9\u6570\u51e0\u7387\u76f8\u52a0\u7b49\u4ef7\u4e8e\u6982\u7387\u76f8\u4e58\uff08\u56de\u987e\\(\\\\log(ab) = \\\\log a + \\\\log b\\)\uff09\uff0c\u7d2f\u52a0\u548c\u81ea\u7136\u5730\u968f\u65f6\u95f4\u79ef\u7d2f\u8bc1\u636e\u3002
\u66f4\u4e30\u5bcc\u7684\u5730\u56fe\u4e3a\u6bcf\u4e2a\u5355\u5143\u5206\u914d\u8bed\u4e49\u6807\u7b7e\uff08\u9053\u8def\u3001\u4eba\u884c\u9053\u3001\u5efa\u7b51\u3001\u690d\u88ab\uff09\uff0c\u5e76\u53ef\u6269\u5c55\u52303D\u3002\u8fd9\u4e0e\u5360\u636e\u7f51\u7edc\u5bc6\u5207\u76f8\u5173\uff0c\u4f46\u5f3a\u8c03\u6301\u4e45\u6027\u548c\u65f6\u95f4\u805a\u5408\u800c\u975e\u5355\u5e27\u9884\u6d4b\u3002
SLAM\uff08\u540c\u65f6\u5b9a\u4f4d\u4e0e\u5efa\u56fe\uff09\uff0c\u5728\u7b2c8\u7ae0\u4e2d\u4ecb\u7ecd\u8fc7\uff0c\u662f\u5728\u6784\u5efa\u5730\u56fe\u7684\u540c\u65f6\u8ddf\u8e2a\u673a\u5668\u4eba\u5728\u5730\u56fe\u4e2d\u7684\u4f4d\u7f6e\u7684\u7b97\u6cd5\u3002\u89c6\u89c9-\u60ef\u6027SLAM\u878d\u5408\u76f8\u673a\u548cIMU\u6570\u636e\uff1bLiDAR SLAM\u4f7f\u7528\u70b9\u4e91\u914d\u51c6\u3002\u611f\u77e5\u6d41\u7a0b\u5c06\u68c0\u6d4b\u7ed3\u679c\u548c\u6df1\u5ea6\u4f30\u8ba1\u8f93\u5165SLAM\u7cfb\u7edf\uff0c\u7531\u540e\u8005\u7ef4\u62a4\u5168\u5c40\u5730\u56fe\u3002
\u73b0\u4ee3\u65b9\u6cd5\u8d8a\u6765\u8d8a\u591a\u5730\u4f7f\u7528\u795e\u7ecf\u9690\u5f0f\u8868\u793a\uff08\u5982\u7b2c8\u7ae0\u4e2d\u7684NeRF\uff09\u6765\u6784\u5efa\u53ef\u5728\u4efb\u4f553D\u70b9\u67e5\u8be2\u7684\u5bc6\u96c6\u3001\u903c\u771f\u5730\u56fe\u3002\u8fd9\u4e9b\u795e\u7ecf\u5730\u56fe\u5c06\u6574\u4e2a\u573a\u666f\u7684\u538b\u7f29\u8868\u793a\u5b58\u50a8\u5728\u7f51\u7edc\u6743\u91cd\u4e2d\uff0c\u652f\u6301\u65b0\u89c6\u89d2\u5408\u6210\u548c\u8be6\u7ec6\u7a7a\u95f4\u67e5\u8be2\u7b49\u4efb\u52a1\u3002
\u4f7f\u7528\u6295\u5f71\u77e9\u9635\u5c063D LiDAR\u70b9\u6295\u5f71\u52302D\u76f8\u673a\u56fe\u50cf\u4e0a\u3002\u53ef\u89c6\u5316\u54ea\u4e9b\u70b9\u843d\u5728\u56fe\u50cf\u8fb9\u754c\u5185\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u6a21\u62df3D LiDAR\u70b9\uff08x=\u5411\u524d\uff0cy=\u5411\u5de6\uff0cz=\u5411\u4e0a\uff09\nrng = jax.random.PRNGKey(0)\npoints_3d = jax.random.uniform(rng, (200, 3), minval=jnp.array([5, -10, -2]),\n maxval=jnp.array([50, 10, 3]))\n\n# \u76f8\u673a\u5185\u53c2\u77e9\u9635\uff08\u7126\u8ddd500\uff0c\u56fe\u50cf\u4e2d\u5fc3320x240\uff09\nK = jnp.array([[500, 0, 320],\n [0, 500, 240],\n [0, 0, 1.0]])\n\n# \u5916\u53c2\uff1aLiDAR\u5230\u76f8\u673a\uff08\u5355\u4f4d\u65cb\u8f6c\uff0c\u5c0f\u5e73\u79fb\uff09\nR = jnp.eye(3)\nt = jnp.array([0.0, 0.0, -0.5])\n\n# \u6295\u5f71\uff1ap_cam = K @ (R @ p_lidar + t)\np_cam = (R @ points_3d.T).T + t\np_img = (K @ p_cam.T).T\np_img = p_img[:, :2] / p_img[:, 2:3] # \u9664\u4ee5Z\n\n# \u8fc7\u6ee4\u76f8\u673a\u524d\u65b9\u4e14\u5728\u56fe\u50cf\u5185\u7684\u70b9\nmask = (p_cam[:, 2] > 0) & (p_img[:, 0] > 0) & (p_img[:, 0] < 640) & \\\n (p_img[:, 1] > 0) & (p_img[:, 1] < 480)\ndepth = p_cam[mask, 2]\n\nplt.figure(figsize=(8, 5))\nplt.scatter(p_img[mask, 0], p_img[mask, 1], c=depth, cmap=\"viridis\", s=5)\nplt.colorbar(label=\"\u6df1\u5ea6 (\u7c73)\")\nplt.xlim(0, 640); plt.ylim(480, 0)\nplt.title(\"\u6295\u5f71\u5230\u76f8\u673a\u56fe\u50cf\u4e0a\u7684LiDAR\u70b9\")\nplt.xlabel(\"u (\u50cf\u7d20)\"); plt.ylabel(\"v (\u50cf\u7d20)\")\nplt.show()\n \u4f7f\u7528\u8d1d\u53f6\u65af\u5bf9\u6570\u51e0\u7387\u66f4\u65b0\u6784\u5efa\u4e00\u4e2a\u7b80\u5355\u76842D\u5360\u636e\u7f51\u683c\u3002\u6a21\u62df\u4e00\u4e2a\u8ddd\u79bb\u4f20\u611f\u5668\u626b\u63cf\u73af\u5883\uff0c\u89c2\u5bdf\u5730\u56fe\u7684\u751f\u6210\u8fc7\u7a0b\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u7f51\u683c\u8bbe\u7f6e\uff1a50x50\u4e2a\u5355\u5143\uff0c\u6bcf\u4e2a0.2\u7c73\ngrid_size = 50\nlog_odds = jnp.zeros((grid_size, grid_size))\n\n# \u4f20\u611f\u5668\u6a21\u578b\uff1a\u5bf9\u6570\u51e0\u7387\u66f4\u65b0\u503c\nl_occ = 0.85 # \u547d\u4e2d\u610f\u5473\u7740\u5360\u636e\u7684\u7f6e\u4fe1\u5ea6\nl_free = -0.4 # \u7a7f\u8fc7\u610f\u5473\u7740\u7a7a\u95f2\u7684\u7f6e\u4fe1\u5ea6\n\n# \u6a21\u62df\u969c\u788d\u7269\uff1a\u4ece(5,20)\u5230(5,30)\u7684\u5899\uff08\u7f51\u683c\u5750\u6807\uff09\nwall_y = jnp.arange(20, 30)\n\n# \u673a\u5668\u4eba\u5728(25, 25)\uff0c\u5411\u5916\u626b\u63cf\nrobot = jnp.array([25, 25])\n\nfor angle_deg in range(0, 360, 5):\n angle = jnp.radians(angle_deg)\n direction = jnp.array([jnp.cos(angle), jnp.sin(angle)])\n\n for step in range(1, 25):\n cell = (robot + direction * step).astype(int)\n r, c = int(cell[0]), int(cell[1])\n if r < 0 or r >= grid_size or c < 0 or c >= grid_size:\n break\n\n # \u68c0\u67e5\u6b64\u5355\u5143\u662f\u5426\u4e3a\u5899\n is_wall = (r == 5) and (c >= 20) and (c < 30)\n if is_wall:\n log_odds = log_odds.at[r, c].add(l_occ)\n break\n else:\n log_odds = log_odds.at[r, c].add(l_free)\n\n# \u5c06\u5bf9\u6570\u51e0\u7387\u8f6c\u6362\u4e3a\u6982\u7387\nprob = 1.0 / (1.0 + jnp.exp(-log_odds))\n\nplt.figure(figsize=(6, 6))\nplt.imshow(prob.T, origin=\"lower\", cmap=\"RdYlGn_r\", vmin=0, vmax=1)\nplt.colorbar(label=\"P(\u88ab\u5360\u636e)\")\nplt.plot(25, 25, \"b*\", markersize=10, label=\"\u673a\u5668\u4eba\")\nplt.legend()\nplt.title(\"\u8d1d\u53f6\u65af\u66f4\u65b0\u751f\u6210\u76842D\u5360\u636e\u7f51\u683c\")\nplt.show()\n \u4f7f\u7528\u89c6\u5dee\u4ece\u7acb\u4f53\u56fe\u50cf\u5bf9\u8ba1\u7b97\u6df1\u5ea6\u3002\u6a21\u62df\u4e24\u4e2a\u76f8\u673a\u89c6\u89d2\u4e0b\u76843D\u70b9\uff0c\u8ba1\u7b97\u89c6\u5dee\u5e76\u6062\u590d\u6df1\u5ea6\u3002
import jax\nimport jax.numpy as jnp\n\n# \u76f8\u673a\u53c2\u6570\nf = 500.0 # \u7126\u8ddd\uff08\u50cf\u7d20\uff09\nb = 0.12 # \u57fa\u7ebf\uff08\u7c73\uff0c12\u5398\u7c73\uff09\n\n# \u5df2\u77e5\u6df1\u5ea6\u76843D\u70b9\ndepths_true = jnp.array([5.0, 10.0, 20.0, 50.0, 100.0])\n\n# \u89c6\u5dee = f * b / Z\ndisparities = f * b / depths_true\n\n# \u4ece\u89c6\u5dee\u6062\u590d\u6df1\u5ea6\ndepths_recovered = f * b / disparities\n\nfor z, d, z_r in zip(depths_true, disparities, depths_recovered):\n print(f\"\u771f\u5b9e\u6df1\u5ea6: {z:6.1f}\u7c73 \u89c6\u5dee: {d:6.2f}\u50cf\u7d20 \u6062\u590d\u503c: {z_r:6.1f}\u7c73\")\n\n# \u6ce8\u610f\uff1a\u89c6\u5dee\u4e0e\u6df1\u5ea6\u6210\u53cd\u6bd4\n# \u8fd1\u5904\u7269\u4f53\u89c6\u5dee\u5927\uff0c\u8fdc\u5904\u7269\u4f53\u89c6\u5dee\u5c0f\n# \u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u7acb\u4f53\u89c6\u89c9\u5728\u8fd1\u8ddd\u79bb\u6700\u51c6\u786e\n \u673a\u5668\u4eba\u5b66\u4e60\u5f25\u5408\u4e86\u7b97\u6cd5\u4e0e\u7269\u7406\u884c\u52a8\u4e4b\u95f4\u7684\u9e3f\u6c9f\u3002\u672c\u7ae0\u6db5\u76d6\u8fd0\u52a8\u5b66\u3001\u52a8\u529b\u5b66\u3001\u7ecf\u5178\u63a7\u5236\u3001\u6a21\u4eff\u5b66\u4e60\u3001\u4eff\u771f\u5230\u73b0\u5b9e\u8fc1\u79fb\u3001\u64cd\u4f5c\u3001\u79fb\u52a8\u548c\u5b89\u5168\u2014\u2014\u8fd9\u4e9b\u6280\u672f\u8d4b\u4e88\u673a\u5668\u4eba\u5728\u73b0\u5b9e\u4e16\u754c\u4e2d\u79fb\u52a8\u3001\u6293\u53d6\u3001\u884c\u8d70\u548c\u4ea4\u4e92\u7684\u80fd\u529b\u3002
\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u7814\u7a76\u4e86\u5982\u4f55\u611f\u77e5\u4e16\u754c\uff08\u7b2c8\u7ae0\uff0c\u7b2c11\u7ae0\u6587\u4ef61\uff09\u4ee5\u53ca\u5982\u4f55\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\uff08\u7b2c6\u7ae0\uff09\u3002\u4f46\u611f\u77e5\u548c\u5b66\u4e60\u8fd8\u4e0d\u591f\u3002\u673a\u5668\u4eba\u5fc5\u987b\u884c\u52a8\uff1a\u79fb\u52a8\u624b\u81c2\u6293\u53d6\u676f\u5b50\u3001\u5728\u4e0d\u5e73\u5766\u7684\u5730\u5f62\u4e0a\u884c\u8d70\u3001\u6216\u5728\u4ed3\u5e93\u4e2d\u5bfc\u822a\u3002\u8fd9\u5c31\u662f\u673a\u5668\u4eba\u5b66\u4e60\u7684\u7528\u6b66\u4e4b\u5730\u3002
\u6838\u5fc3\u6311\u6218\u5728\u4e8e\u7269\u7406\u4e16\u754c\u662f\u8fde\u7eed\u7684\u3001\u9ad8\u7ef4\u7684\u3001\u63a5\u89e6\u4e30\u5bcc\u7684\u4e14\u4e0d\u5bbd\u5bb9\u7684\u3002\u56fe\u50cf\u8bc6\u522b\u4e2d\u7684\u5206\u7c7b\u9519\u8bef\u53ea\u662f\u6807\u7b7e\u9519\u8bef\uff0c\u800c\u673a\u5668\u4eba\u5b66\u4e2d\u7684\u63a7\u5236\u9519\u8bef\u5219\u610f\u5473\u7740\u673a\u5668\u4eba\u635f\u574f\u6216\u7269\u4f53\u6389\u843d\u3002\u4e24\u8005\u7684\u4ee3\u4ef7\u622a\u7136\u4e0d\u540c\u3002
\u8fd0\u52a8\u5b66\u63cf\u8ff0\u8fd0\u52a8\u7684\u51e0\u4f55\u5173\u7cfb\uff0c\u4e0d\u8003\u8651\u529b\u3002\u673a\u5668\u4eba\u624b\u81c2\u662f\u7531\u5173\u8282\u8fde\u63a5\u7684\u521a\u6027\u8fde\u6746\u7ec4\u6210\u7684\u94fe\u6761\u3002\u6bcf\u4e2a\u5173\u8282\u6709\u4e00\u4e2a\u81ea\u7531\u5ea6\uff08DoF\uff09\uff1a\u8981\u4e48\u65cb\u8f6c\uff08\u65cb\u8f6c\u5173\u8282\uff09\uff0c\u8981\u4e48\u6ed1\u52a8\uff08\u68f1\u67f1\u5173\u8282\uff09\u3002
\u673a\u5668\u4eba\u7684\u6784\u578b\u662f\u6240\u6709\u5173\u8282\u89d2\u5ea6\uff08\u6216\u4f4d\u79fb\uff09\u7684\u96c6\u5408 \\(\\\\mathbf{q} = [q_1, q_2, \\\\ldots, q_n]^T\\)\u3002\u8fd9\u4e2a\u5411\u91cf\u4f4d\u4e8e\u5173\u8282\u7a7a\u95f4\uff08\u6216\u6784\u578b\u7a7a\u95f4\uff09\u4e2d\uff0c\u8fd9\u662f\u4e00\u4e2a\\(n\\)\u7ef4\u7a7a\u95f4\uff0c\u6bcf\u4e2a\u8f74\u5bf9\u5e94\u4e00\u4e2a\u5173\u8282\u3002\u4e00\u4e2a6\u81ea\u7531\u5ea6\u673a\u5668\u4eba\u624b\u81c2\u6709\u4e00\u4e2a6\u7ef4\u6784\u578b\u7a7a\u95f4\u3002
\u6b63\u5411\u8fd0\u52a8\u5b66\uff08FK\uff09\u6839\u636e\u7ed9\u5b9a\u7684\u5173\u8282\u89d2\u5ea6\u8ba1\u7b97\u672b\u7aef\u6267\u884c\u5668\uff08\"\u624b\"\uff09\u7684\u4f4d\u7f6e\u548c\u59ff\u6001\u3002\u8fd9\u662f\u4e00\u4e2a\u4ece\u5173\u8282\u7a7a\u95f4\u6620\u5c04\u5230\u4efb\u52a1\u7a7a\u95f4\uff08\u672b\u7aef\u6267\u884c\u5668\u76843D\u4f4d\u7f6e\u548c\u59ff\u6001\uff0c\u4e5f\u79f0\u4e3a\u7b1b\u5361\u5c14\u7a7a\u95f4\uff09\u7684\u51fd\u6570 \\(\\\\mathbf{x} = f(\\\\mathbf{q})\\)\u3002
\u6bcf\u4e2a\u5173\u8282\u7531\u4e00\u4e2a\\(4 \\\\times 4\\)\u9f50\u6b21\u53d8\u6362\u77e9\u9635\u63cf\u8ff0\uff08\u56de\u987e\u7b2c2\u7ae0\u7684\u4eff\u5c04\u53d8\u6362\uff09\u3002Denavit-Hartenberg\uff08DH\uff09\u7ea6\u5b9a\u7528\u56db\u4e2a\u53c2\u6570\u53c2\u6570\u5316\u6bcf\u4e2a\u5173\u8282\uff1a\u8fde\u6746\u957f\u5ea6\\(a\\)\u3001\u8fde\u6746\u626d\u8f6c\u89d2\\(\\\\alpha\\)\u3001\u8fde\u6746\u504f\u79fb\\(d\\)\u548c\u5173\u8282\u89d2\u5ea6\\(\\\\theta\\)\u3002\u5173\u8282\\(i\\)\u7684\u53d8\u6362\u4e3a\uff1a
\u5b8c\u6574\u7684\u6b63\u5411\u8fd0\u52a8\u5b66\u662f\u6240\u6709\u5173\u8282\u53d8\u6362\u7684\u4e58\u79ef\uff1a\\(T_{0 \\\\to n} = T_1 T_2 \\\\cdots T_n\\)\u3002\u8fd9\u662f\u77e9\u9635\u4e58\u6cd5\u94fe\u5f0f\u53d8\u6362\uff08\u7b2c2\u7ae0\uff09\uff1a\u6bcf\u4e2a\u5173\u8282\u7684\u53d8\u6362\u4f9d\u6b21\u5e94\u7528\uff0c\u5c06\u5750\u6807\u7cfb\u4ece\u57fa\u5ea7\u65cb\u8f6c\u548c\u5e73\u79fb\u5230\u672b\u7aef\u6267\u884c\u5668\u3002
\u9006\u5411\u8fd0\u52a8\u5b66\uff08IK\uff09\u662f\u53cd\u5411\u95ee\u9898\uff1a\u7ed9\u5b9a\u671f\u671b\u7684\u672b\u7aef\u6267\u884c\u5668\u59ff\u6001\\(\\\\mathbf{x}^*\\)\uff0c\u6c42\u5173\u8282\u89d2\u5ea6\\(\\\\mathbf{q}\\)\u4f7f\u5f97\\(f(\\\\mathbf{q}) = \\\\mathbf{x}^*\\)\u3002\u8fd9\u8981\u96be\u5f97\u591a\uff0c\u56e0\u4e3a\uff1a
\u89e3\u6790\u89e3\u53ea\u5b58\u5728\u4e8e\u7279\u5b9a\u7684\u673a\u5668\u4eba\u51e0\u4f55\u6784\u578b\u4e2d\u3002\u5bf9\u4e8e\u901a\u7528\u673a\u5668\u4eba\uff0cIK\u4f7f\u7528\u96c5\u53ef\u6bd4\u77e9\u9635\u8fed\u4ee3\u6c42\u89e3\u3002\u96c5\u53ef\u6bd4\u77e9\u9635\\(J(\\\\mathbf{q})\\)\u5c06\u5173\u8282\u89d2\u5ea6\u7684\u5fae\u5c0f\u53d8\u5316\u4e0e\u672b\u7aef\u6267\u884c\u5668\u4f4d\u7f6e\u7684\u5fae\u5c0f\u53d8\u5316\u8054\u7cfb\u8d77\u6765\uff08\u56de\u987e\u7b2c3\u7ae0\u7684\u96c5\u53ef\u6bd4\u77e9\u9635\uff09\uff1a
\u8981\u5c06\u672b\u7aef\u6267\u884c\u5668\u79fb\u52a8\u4e00\u4e2a\u5c0f\u7684\u91cf\\(\\\\Delta \\\\mathbf{x}\\)\uff0c\u6211\u4eec\u9700\u8981\\(\\\\Delta \\\\mathbf{q} = J^{-1} \\\\Delta \\\\mathbf{x}\\)\uff08\u5f53\\(J\\)\u4e0d\u662f\u65b9\u9635\u65f6\u4f7f\u7528\u4f2a\u9006\\(J^+ \\\\Delta \\\\mathbf{x}\\)\uff09\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u8fed\u4ee3\u8fdb\u884c\uff0c\u76f4\u5230\u672b\u7aef\u6267\u884c\u5668\u5230\u8fbe\u76ee\u6807\uff0c\u672c\u8d28\u4e0a\u5c31\u662f\u5c06\u725b\u987f\u6cd5\uff08\u7b2c3\u7ae0\uff09\u5e94\u7528\u4e8e\u8fd0\u52a8\u5b66\u65b9\u7a0b\u3002
\u5728\u5947\u5f02\u70b9\u9644\u8fd1\uff0c\u96c5\u53ef\u6bd4\u77e9\u9635\u7684\u79e9\u4e0b\u964d\uff08\u67d0\u4e9b\u5217\u53d8\u5f97\u7ebf\u6027\u76f8\u5173\uff0c\u5982\u6211\u4eec\u5728\u7b2c2\u7ae0\u4e2d\u7814\u7a76\u7684\uff09\u3002\u7269\u7406\u4e0a\u8fd9\u610f\u5473\u7740\u673a\u5668\u4eba\u5931\u53bb\u4e00\u4e2a\u81ea\u7531\u5ea6\uff1a\u65e0\u8bba\u5173\u8282\u79fb\u52a8\u591a\u5feb\uff0c\u672b\u7aef\u6267\u884c\u5668\u90fd\u65e0\u6cd5\u5728\u67d0\u4e9b\u65b9\u5411\u4e0a\u79fb\u52a8\u3002\u4f2a\u9006\u5728\u5947\u5f02\u70b9\u9644\u8fd1\u4f1a\u7206\u70b8\uff0c\u56e0\u6b64\u4f7f\u7528\u963b\u5c3c\u6700\u5c0f\u4e8c\u4e58\u6cd5\uff08\u52a0\u5165\u6b63\u5219\u5316\u9879\\(\\\\lambda^2 I\\)\uff09\uff1a
\u5176\u4e2d\\(M(\\\\mathbf{q})\\)\u662f\u8d28\u91cf\uff08\u60ef\u6027\uff09\u77e9\u9635\uff0c\\(C(\\\\mathbf{q}, \\\\dot{\\\\mathbf{q}})\\)\u6355\u83b7\u79d1\u91cc\u5965\u5229\u529b\u548c\u79bb\u5fc3\u529b\u6548\u5e94\uff0c\\(\\\\mathbf{g}(\\\\mathbf{q})\\)\u662f\u91cd\u529b\u5411\u91cf\uff0c\\(\\\\boldsymbol{\\\\tau}\\)\u662f\u5173\u8282\u529b\u77e9\u5411\u91cf\uff08\u63a7\u5236\u8f93\u5165\uff09\u3002\u8fd9\u662f\u4e00\u4e2a\u4e8c\u9636\u5fae\u5206\u65b9\u7a0b\u7ec4\uff0c\u6bcf\u4e2a\u5173\u8282\u4e00\u4e2a\u65b9\u7a0b\u3002
\u8d28\u91cf\u77e9\u9635\\(M\\)\u603b\u662f\u5bf9\u79f0\u6b63\u5b9a\u7684\uff08\u56de\u987e\u7b2c2\u7ae0\uff0c\u6b63\u5b9a\u77e9\u9635\u4fdd\u8bc1\u552f\u4e00\u6700\u5c0f\u503c\uff0c\u5728\u8fd9\u91cc\u5b83\u786e\u4fdd\u7cfb\u7edf\u5bf9\u65bd\u52a0\u7684\u529b\u77e9\u6709\u53ef\u9884\u6d4b\u7684\u54cd\u5e94\uff09\u3002
PID\u63a7\u5236\u662f\u673a\u5668\u4eba\u5b66\u4e2d\u4f7f\u7528\u6700\u5e7f\u6cdb\u7684\u63a7\u5236\u5668\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u5173\u8282\uff0c\u5b83\u6839\u636e\u8bef\u5dee\\(e(t) = q_{\\\\text{\u671f\u671b}}(t) - q_{\\\\text{\u5b9e\u9645}}(t)\\)\u8ba1\u7b97\u529b\u77e9\uff1a
\u8c03\u6574\\(K_p, K_i, K_d\\)\u662f\u4e00\u79cd\u5e73\u8861\uff1a\\(K_p\\)\u592a\u5927\u4f1a\u5f15\u8d77\u9707\u8361\uff0c\\(K_d\\)\u592a\u5927\u4f1a\u4f7f\u7cfb\u7edf\u53cd\u5e94\u8fdf\u949d\uff0c\\(K_i\\)\u592a\u5927\u4f1a\u5bfc\u81f4\u79ef\u5206\u9971\u548c\uff08\u5728\u6301\u7eed\u8bef\u5dee\u671f\u95f4\u79ef\u5206\u65e0\u9650\u589e\u957f\uff09\u3002
\u6a21\u578b\u9884\u6d4b\u63a7\u5236\uff08MPC\uff09\u5177\u6709\u524d\u77bb\u6027\u3002\u5728\u6bcf\u4e2a\u65f6\u95f4\u6b65\uff0c\u5b83\u6c42\u89e3\u4e00\u4e2a\u4f18\u5316\u95ee\u9898\uff1a\u627e\u5230\u672a\u6765\u63a7\u5236\u5e8f\u5217\uff0c\u5728\u6709\u9650\u65f6\u57df\u5185\u6700\u5c0f\u5316\u4ee3\u4ef7\u51fd\u6570\uff08\u4f8b\u5982\uff0c\u8ddf\u8e2a\u8bef\u5dee+\u63a7\u5236\u80fd\u91cf\uff09\uff0c\u5e76\u6ee1\u8db3\u52a8\u529b\u5b66\u6a21\u578b\u548c\u7ea6\u675f\u6761\u4ef6\u3002\u53ea\u5e94\u7528\u7b2c\u4e00\u4e2a\u63a7\u5236\u91cf\uff0c\u7136\u540e\u5728\u4e0b\u4e00\u4e2a\u65f6\u95f4\u6b65\u91cd\u590d\u8be5\u8fc7\u7a0b\u3002
\u8fd9\u91cc\\(\\\\|\\\\mathbf{x}\\\\|_Q^2 = \\\\mathbf{x}^T Q \\\\mathbf{x}\\)\u662f\u4f7f\u7528\u6b63\u5b9a\u77e9\u9635\\(Q\\)\uff08\u7b2c2\u7ae0\uff09\u7684\u52a0\u6743\u8303\u6570\uff0c\u5141\u8bb8\u5bf9\u4e0d\u540c\u72b6\u6001\u8bef\u5dee\u8fdb\u884c\u4e0d\u540c\u60e9\u7f5a\u3002MPC\u81ea\u7136\u5730\u5904\u7406\u7ea6\u675f\uff08\u5173\u8282\u9650\u4f4d\u3001\u529b\u77e9\u9650\u4f4d\u3001\u907f\u969c\uff09\uff0c\u56e0\u4e3a\u5b83\u4eec\u88ab\u663e\u5f0f\u5730\u5305\u542b\u5728\u4f18\u5316\u4e2d\u3002
\u963b\u6297\u63a7\u5236\u8c03\u8282\u529b\u4e0e\u8fd0\u52a8\u4e4b\u95f4\u7684\u5173\u7cfb\uff0c\u800c\u4e0d\u662f\u8ddf\u8e2a\u521a\u6027\u8f68\u8ff9\u3002\u5b83\u4e0d\u547d\u4ee4\"\u5230\u8fbe\u4f4d\u7f6e\\(x\\)\"\uff0c\u800c\u662f\u547d\u4ee4\"\u8868\u73b0\u5f97\u50cf\u4e00\u4e2a\u4ee5\\(x\\)\u4e3a\u4e2d\u5fc3\u7684\u5f39\u7c27-\u963b\u5c3c\u7cfb\u7edf\"\uff1a
\u6211\u4eec\u53ef\u4ee5\u4ece\u793a\u8303\u4e2d\u5b66\u4e60\u63a7\u5236\u7b56\u7565\uff0c\u800c\u4e0d\u662f\u624b\u5de5\u8bbe\u8ba1\u63a7\u5236\u5668\u3002\u4eba\u7c7b\u6267\u884c\u4efb\u52a1\uff0c\u673a\u5668\u4eba\u89c2\u5bdf\uff0c\u5b66\u4e60\u7b97\u6cd5\u63d0\u53d6\u7b56\u7565\u3002\u8fd9\u5c31\u662f\u6a21\u4eff\u5b66\u4e60\uff08\u6216\u4ece\u793a\u8303\u4e2d\u5b66\u4e60\uff09\u3002
\u884c\u4e3a\u514b\u9686\uff08BC\uff09\u662f\u6700\u7b80\u5355\u7684\u65b9\u6cd5\uff1a\u5c06\u793a\u8303\u89c6\u4e3a\u76d1\u7763\u5b66\u4e60\u6570\u636e\u96c6\u3002\u7ed9\u5b9a\u6765\u81ea\u4e13\u5bb6\u7684\u89c2\u6d4b-\u52a8\u4f5c\u5bf9\\(\\\\{(\\\\mathbf{o}_t, \\\\mathbf{a}_t)\\\\}\\)\uff0c\u8bad\u7ec3\u7b56\u7565\\(\\\\pi_\\\\theta(\\\\mathbf{a} \\\\mid \\\\mathbf{o})\\)\u4ece\u89c2\u6d4b\u4e2d\u9884\u6d4b\u4e13\u5bb6\u7684\u52a8\u4f5c\u3002\u8fd9\u662f\u6807\u51c6\u7684\u76d1\u7763\u5b66\u4e60\uff08\u7b2c6\u7ae0\uff09\uff1a\u6700\u5c0f\u5316\u635f\u5931\uff1a
\u95ee\u9898\u662f\u5206\u5e03\u504f\u79fb\uff08\u4e5f\u79f0\u4e3a\u590d\u5408\u8bef\u5dee\u95ee\u9898\uff09\u3002\u5728\u8bad\u7ec3\u671f\u95f4\uff0c\u7b56\u7565\u770b\u5230\u7684\u662f\u4e13\u5bb6\u7684\u72b6\u6001\u3002\u5728\u90e8\u7f72\u671f\u95f4\uff0c\u7b56\u7565\u81ea\u8eab\u7684\u5c0f\u8bef\u5dee\u5c06\u5176\u63a8\u5165\u4e13\u5bb6\u4ece\u672a\u8bbf\u95ee\u8fc7\u7684\u72b6\u6001\u3002\u8fd9\u4e9b\u4e0d\u719f\u6089\u7684\u72b6\u6001\u5bfc\u81f4\u66f4\u5dee\u7684\u52a8\u4f5c\uff0c\u8fdb\u800c\u5bfc\u81f4\u66f4\u4e0d\u719f\u6089\u7684\u72b6\u6001\uff0c\u8bef\u5dee\u8fc5\u901f\u7d2f\u79ef\u653e\u5927\u3002
\u60f3\u8c61\u4e00\u4e0b\u901a\u8fc7\u89c2\u770b\u5b8c\u7f8e\u9a7e\u9a76\u5458\u6765\u5b66\u4e60\u5f00\u8f66\u3002\u4f60\u4ece\u672a\u89c1\u8fc7\u5c0f\u5e45\u504f\u79fb\u540e\u4f1a\u53d1\u751f\u4ec0\u4e48\uff0c\u56e0\u4e3a\u4e13\u5bb6\u4ece\u672a\u504f\u79fb\u8fc7\u3002\u7b2c\u4e00\u6b21\u4f60\u7a0d\u4e3a\u504f\u79bb\u65f6\uff0c\u4f60\u5b8c\u5168\u4e0d\u77e5\u9053\u5982\u4f55\u6062\u590d\u3002
DAgger\uff08\u6570\u636e\u96c6\u805a\u5408\uff09\u901a\u8fc7\u8fed\u4ee3\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff1a
\u7ecf\u8fc7\u591a\u6b21\u8fed\u4ee3\uff0c\u6570\u636e\u96c6\u8986\u76d6\u4e86\u5b66\u4e60\u7b56\u7565\u5b9e\u9645\u8bbf\u95ee\u7684\u72b6\u6001\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u4e13\u5bb6\u7684\u8f68\u8ff9\u3002\u7b56\u7565\u5f97\u5230\u4e86\u6539\u5584\uff0c\u56e0\u4e3a\u5b83\u5df2\u7ecf\u770b\u5230\u5e76\u5b66\u4f1a\u4e86\u4ece\u81ea\u5df1\u7684\u9519\u8bef\u4e2d\u6062\u590d\u3002
\u4f7f\u7528Transformer\u7684\u52a8\u4f5c\u5206\u5757\uff08ACT\uff09\u662f\u4e00\u79cd\u73b0\u4ee3\u65b9\u6cd5\uff0c\u7b56\u7565\u9884\u6d4b\u4e00\u7cfb\u5217\u672a\u6765\u52a8\u4f5c\uff08\u4e00\u4e2a\"\u5757\"\uff09\uff0c\u800c\u4e0d\u662f\u4e00\u6b21\u9884\u6d4b\u4e00\u4e2a\u52a8\u4f5c\u3002\u5b83\u4f7f\u7528\u5e26\u6709transformer\u4e3b\u5e72\u7684 conditional VAE \u5b9e\u73b0\u3002\u9884\u6d4b\u52a8\u4f5c\u5757\u66f4\u9c81\u68d2\uff0c\u56e0\u4e3a\u5b83\u6355\u83b7\u4e86\u65f6\u95f4\u76f8\u5173\u6027\uff1a\u4f38\u624b\u52a8\u4f5c\u7684\u5e73\u6ed1\u6027\u7f16\u7801\u5728\u5757\u4e2d\uff0c\u800c\u4e0d\u662f\u4f9d\u8d56\u4e8e\u53ef\u80fd\u6f02\u79fb\u7684\u81ea\u56de\u5f52\u5355\u6b65\u9884\u6d4b\u3002
\u6269\u6563\u7b56\u7565\u5c06\u6269\u6563\u6a21\u578b\uff08\u7b2c8\u7ae0\uff09\u5e94\u7528\u4e8e\u52a8\u4f5c\u751f\u6210\u3002\u5b83\u4e0d\u9884\u6d4b\u5355\u4e2a\u52a8\u4f5c\uff0c\u800c\u662f\u5efa\u6a21\u4ee5\u89c2\u6d4b\u4e3a\u6761\u4ef6\u7684\u5b8c\u6574\u52a8\u4f5c\u5206\u5e03\u3002\u4ece\u566a\u58f0\u5f00\u59cb\uff0c\u5b83\u8fed\u4ee3\u5730\u53bb\u566a\u4ee5\u751f\u6210\u52a8\u4f5c\u5e8f\u5217\u3002\u8fd9\u81ea\u7136\u5730\u5904\u7406\u4e86\u591a\u6a21\u6001\u6027\uff1a\u5f53\u6709\u591a\u4e2a\u6709\u6548\u65b9\u5f0f\u5b8c\u6210\u4efb\u52a1\u65f6\uff08\u4ece\u5de6\u8fb9\u6216\u53f3\u8fb9\u4f38\u624b\uff09\uff0c\u6269\u6563\u6a21\u578b\u53ef\u4ee5\u8868\u793a\u4e24\u79cd\u6a21\u5f0f\uff0c\u800c\u56de\u5f52\u7b56\u7565\u4f1a\u5e73\u5747\u5b83\u4eec\uff08\u5230\u8fbe\u4e2d\u95f4\u67d0\u5904\uff0c\u53ef\u80fd\u4e24\u79cd\u90fd\u65e0\u6548\uff09\u3002
\u5728\u73b0\u5b9e\u4e16\u754c\u4e2d\u8bad\u7ec3\u673a\u5668\u4eba\u662f\u6602\u8d35\u3001\u7f13\u6162\u4e14\u5371\u9669\u7684\u3002\u4e00\u4e2a\u901a\u8fc7\u8bd5\u9519\u5b66\u4e60\u6293\u53d6\u7684\u673a\u5668\u4eba\u53ef\u80fd\u9700\u8981\u6570\u5343\u6b21\u5c1d\u8bd5\uff0c\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u635f\u574f\u7269\u4f53\u548c\u81ea\u8eab\u3002\u4eff\u771f\u63d0\u4f9b\u4e86\u65e0\u9650\u3001\u5b89\u5168\u3001\u5feb\u901f\u7684\u4f53\u9a8c\u3002\u4f46\u4eff\u771f\u5668\u5e76\u975e\u5b8c\u7f8e\uff1a\u7269\u7406\u8fd1\u4f3c\u3001\u89c6\u89c9\u5408\u6210\u3001\u63a5\u89e6\u7b80\u5316\u3002
\u4eff\u771f\u5230\u73b0\u5b9e\u5dee\u8ddd\u662f\u4eff\u771f\u6027\u80fd\u4e0e\u771f\u5b9e\u6027\u80fd\u4e4b\u95f4\u7684\u5dee\u5f02\u3002\u5728\u4eff\u771f\u4e2d\u5b8c\u7f8e\u8fd0\u884c\u7684\u7b56\u7565\u53ef\u80fd\u5728\u771f\u5b9e\u673a\u5668\u4eba\u4e0a\u5b8c\u5168\u5931\u8d25\uff0c\u56e0\u4e3a\u5b83\u8fc7\u5ea6\u62df\u5408\u4e86\u4eff\u771f\u5668\u7684\u7279\u5b9a\u7ec6\u8282\u3002
\u57df\u968f\u673a\u5316\u901a\u8fc7\u5728\u5e7f\u6cdb\u7684\u4eff\u771f\u5668\u8bbe\u7f6e\u4e0a\u8fdb\u884c\u8bad\u7ec3\u6765\u5e94\u5bf9\u8fd9\u4e00\u95ee\u9898\u3002\u4e0d\u662f\u4f7f\u7528\u4e00\u79cd\u4eff\u771f\uff0c\u800c\u662f\u4f7f\u7528\u6570\u5343\u79cd\u5177\u6709\u968f\u673a\u5316\u53c2\u6570\u7684\u4eff\u771f\uff1a
\u5176\u601d\u60f3\u662f\uff0c\u5982\u679c\u7b56\u7565\u5728\u6240\u6709\u8fd9\u4e9b\u53d8\u5316\u4e0b\u90fd\u80fd\u5de5\u4f5c\uff0c\u90a3\u4e48\u73b0\u5b9e\u4e16\u754c\u53ea\u662f\u5206\u5e03\u4e2d\u7684\"\u53e6\u4e00\u79cd\u53d8\u5316\"\u3002\u7b56\u7565\u5b66\u4e60\u5bf9\u968f\u673a\u5316\u5c5e\u6027\u4e0d\u53d8\u7684\u7279\u5f81\uff0c\u8fd9\u4e9b\u4e0d\u53d8\u7279\u5f81\u80fd\u591f\u8fc1\u79fb\u3002
\u7cfb\u7edf\u8fa8\u8bc6\u91c7\u53d6\u76f8\u53cd\u7684\u65b9\u6cd5\uff1a\u4e0d\u662f\u968f\u673a\u5316\u6240\u6709\u5185\u5bb9\uff0c\u800c\u662f\u4ed4\u7ec6\u6d4b\u91cf\u771f\u5b9e\u7cfb\u7edf\u7684\u7269\u7406\u53c2\u6570\u5e76\u5c06\u4eff\u771f\u5668\u8c03\u8c10\u5230\u5339\u914d\u3002\u8fd9\u63d0\u4f9b\u4e86\u66f4\u7cbe\u786e\u7684\u4eff\u771f\uff0c\u4f46\u4e5f\u66f4\u8106\u5f31\uff08\u4efb\u4f55\u672a\u5efa\u6a21\u7684\u6548\u5e94\u90fd\u4f1a\u5bfc\u81f4\u5dee\u8ddd\uff09\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u6700\u597d\u7684\u7ed3\u679c\u662f\u5c06\u4e24\u8005\u7ed3\u5408\uff1a\u4f7f\u7528\u7cfb\u7edf\u8fa8\u8bc6\u4f7f\u4eff\u771f\u5668\u5408\u7406\u63a5\u8fd1\uff0c\u7136\u540e\u4f7f\u7528\u57df\u968f\u673a\u5316\u8986\u76d6\u5269\u4f59\u7684\u4e0d\u786e\u5b9a\u6027\u3002
\u901a\u8fc7\u5fae\u8c03\u7684\u4eff\u771f\u5230\u73b0\u5b9e\u8fc1\u79fb\u4e3b\u8981\u5728\u4eff\u771f\u4e2d\u8bad\u7ec3\uff0c\u7136\u540e\u8fdb\u884c\u5c11\u91cf\u7684\u771f\u5b9e\u4e16\u754c\u5fae\u8c03\u3002\u4eff\u771f\u63d0\u4f9b\u4e86\u826f\u597d\u7684\u521d\u59cb\u5316\uff0c\u771f\u5b9e\u4e16\u754c\u6570\u636e\u7ea0\u6b63\u4e86\u4eff\u771f\u5668\u7279\u5b9a\u7684\u504f\u5dee\u3002\u8fd9\u9700\u8981\u7684\u771f\u5b9e\u4e16\u754c\u6570\u636e\u8fdc\u5c11\u4e8e\u4ece\u5934\u8bad\u7ec3\u3002
\u4e0a\u8ff0\u6240\u6709\u5f3a\u5316\u5b66\u4e60\u548c\u6a21\u4eff\u5b66\u4e60\u65b9\u6cd5\u90fd\u662f\u65e0\u6a21\u578b\u7684\uff1a\u7b56\u7565\u901a\u8fc7\u76f4\u63a5\u4ea4\u4e92\uff08\u6216\u793a\u8303\uff09\u5b66\u4e60\u884c\u52a8\uff0c\u800c\u4e0d\u663e\u5f0f\u5efa\u6a21\u4e16\u754c\u5982\u4f55\u8fd0\u4f5c\u3002\u53e6\u4e00\u79cd\u662f\u57fa\u4e8e\u6a21\u578b\u7684\u5b66\u4e60\uff1a\u9996\u5148\u5b66\u4e60\u73af\u5883\u52a8\u529b\u5b66\u6a21\u578b\uff0c\u7136\u540e\u4f7f\u7528\u8be5\u6a21\u578b\u8fdb\u884c\u89c4\u5212\u6216\u751f\u6210\u5408\u6210\u7ecf\u9a8c\u3002
\u4e16\u754c\u6a21\u578b\u5b66\u4e60\u8f6c\u79fb\u51fd\u6570\\(p(s_{t+1} \\\\mid s_t, a_t)\\)\uff1a\u7ed9\u5b9a\u5f53\u524d\u72b6\u6001\u548c\u52a8\u4f5c\uff0c\u9884\u6d4b\u4e0b\u4e00\u72b6\u6001\uff08\u5982\u7b2c10\u7ae0\u6240\u8ff0\uff09\u3002\u5728\u673a\u5668\u4eba\u5b66\u4e2d\uff0c\u8fd9\u610f\u5473\u7740\u9884\u6d4b\u5982\u679c\u673a\u5668\u4eba\u91c7\u53d6\u7279\u5b9a\u52a8\u4f5c\u4f1a\u53d1\u751f\u4ec0\u4e48\uff1a\"\u5982\u679c\u6211\u5411\u5de6\u63a8\u8fd9\u4e2a\u65b9\u5757\uff0c\u5b83\u4f1a\u6ed1\u52a83\u5398\u7c73\uff0c\u5b83\u540e\u9762\u7684\u676f\u5b50\u4f1a\u5012\u4e0b\u3002\"
\u5176\u5438\u5f15\u529b\u5728\u4e8e\u6837\u672c\u6548\u7387\u3002\u73b0\u5b9e\u4e16\u754c\u7684\u673a\u5668\u4eba\u4ea4\u4e92\u6210\u672c\u9ad8\u6602\u3002\u5982\u679c\u673a\u5668\u4eba\u80fd\u4ece\u9002\u91cf\u7684\u771f\u5b9e\u6570\u636e\u4e2d\u5b66\u4e60\u4e00\u4e2a\u4e16\u754c\u6a21\u578b\uff0c\u5b83\u5c31\u53ef\u4ee5\u901a\u8fc7\u5728\u5927\u8111\u4e2d\u6eda\u52a8\u6a21\u578b\u6765\"\u60f3\u8c61\"\u6570\u5343\u6761\u8f68\u8ff9\uff0c\u5728\u4e0d\u52a8\u7528\u7269\u7406\u4e16\u754c\u7684\u60c5\u51b5\u4e0b\u89c4\u5212\u548c\u5b8c\u5584\u7b56\u7565\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u68cb\u624b\u901a\u8fc7\u5728\u8111\u6d77\u4e2d\u6a21\u62df\u8d70\u68cb\u6765\u601d\u8003\u3002
DreamerV3\u662f\u4e00\u4e2a\u901a\u7528\u7684\u57fa\u4e8e\u6a21\u578b\u7684\u5f3a\u5316\u5b66\u4e60\u667a\u80fd\u4f53\u3002\u5b83\u8054\u5408\u5b66\u4e60\u4e09\u4e2a\u7ec4\u4ef6\uff1a
\u7136\u540e\u667a\u80fd\u4f53\u901a\u8fc7\u5728\u6f5c\u5728\u7a7a\u95f4\u4e2d\u5c55\u5f00\u8f6c\u79fb\u6a21\u578b\u591a\u6b65\u6765\u8fdb\u884c\"\u505a\u68a6\"\uff0c\u5728\u8fd9\u4e9b\u60f3\u8c61\u7684\u8f68\u8ff9\u4e0a\u8bad\u7ec3\u7b56\u7565\uff0c\u5e76\u5c06\u7b56\u7565\u8f6c\u79fb\u5230\u771f\u5b9e\u73af\u5883\u3002\u5173\u952e\u521b\u65b0\u5728\u4e8e\u6240\u6709\u60f3\u8c61\u90fd\u5728\u6f5c\u5728\u7a7a\u95f4\uff08\u7d27\u51d1\u7684\u5b66\u4e60\u8868\u793a\uff09\u4e2d\u8fdb\u884c\uff0c\u800c\u4e0d\u662f\u5728\u50cf\u7d20\u7a7a\u95f4\u4e2d\uff0c\u4f7f\u5176\u8ba1\u7b97\u53ef\u884c\u3002
\u8f6c\u79fb\u6a21\u578b\\(f_\\\\theta\\)\u548c\u5956\u52b1\u6a21\u578b\\(g_\\\\theta\\)\u5728\u771f\u5b9e\u7ecf\u9a8c\u4e0a\u8bad\u7ec3\uff0c\u7b56\u7565\u5728\u60f3\u8c61\u7684\u5c55\u5f00\u4e0a\u8bad\u7ec3\u3002\u8fd9\u5c06\u6570\u636e\u6536\u96c6\u4e0e\u7b56\u7565\u4f18\u5316\u89e3\u8026\u3002
\u5bf9\u4e8e\u673a\u5668\u4eba\u64cd\u4f5c\uff0c\u4e16\u754c\u6a21\u578b\u5b9e\u73b0\u4e86\u5fc3\u7406\u6392\u7ec3\u3002\u5728\u5c1d\u8bd5\u6293\u53d6\u4e4b\u524d\uff0c\u673a\u5668\u4eba\u53ef\u4ee5\u5728\u5176\u5b66\u4e60\u6a21\u578b\u4e0a\u6a21\u62df\u591a\u79cd\u65b9\u6cd5\uff0c\u5e76\u9009\u62e9\u6700\u53ef\u80fd\u6210\u529f\u7684\u4e00\u79cd\u3002\u8fd9\u5bf9\u4e8e\u63a5\u89e6\u5bc6\u96c6\u578b\u4efb\u52a1\u5c24\u5176\u6709\u4ef7\u503c\uff0c\u56e0\u4e3a\u5728\u8fd9\u4e9b\u4efb\u52a1\u4e2d\u73b0\u5b9e\u4e16\u754c\u7684\u8bd5\u9519\u65e2\u6162\u53c8\u5371\u9669\u3002
\u4e16\u754c\u6a21\u578b\u4e5f\u81ea\u7136\u5730\u4e0e\u4eff\u771f\u5230\u73b0\u5b9e\u8fc1\u79fb\u76f8\u5173\u8054\uff1a\u5728\u771f\u5b9e\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\u4e16\u754c\u6a21\u578b\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u81ea\u52a8\u6355\u83b7\u771f\u5b9e\u4e16\u754c\u7269\u7406\u7684\u5b66\u4e60\u578b\u4eff\u771f\u5668\uff0c\u5b8c\u5168\u7ed5\u8fc7\u4e86\u4eff\u771f\u5230\u73b0\u5b9e\u5dee\u8ddd\u3002\u5bf9\u4e8e\u7406\u89e3\u826f\u597d\u7684\u573a\u666f\uff0c\u5b83\u53ef\u80fd\u4e0d\u5982\u624b\u5de5\u6784\u5efa\u7684\u4eff\u771f\u5668\u7cbe\u786e\uff0c\u4f46\u5b83\u6355\u83b7\u4e86\u624b\u5de5\u4eff\u771f\u5668\u5e38\u5e38\u51fa\u9519\u7684\u6548\u679c\uff08\u6469\u64e6\u3001\u5f62\u53d8\u3001\u63a5\u89e6\u52a8\u529b\u5b66\uff09\u3002
JEPA\uff08\u8054\u5408\u5d4c\u5165\u9884\u6d4b\u67b6\u6784\uff0c\u5728\u7b2c10\u7ae0\u4e2d\u4ecb\u7ecd\uff09\u63d0\u4f9b\u4e86\u50cf\u7d20\u7ea7\u9884\u6d4b\u7684\u66ff\u4ee3\u65b9\u6848\u3002JEPA\u4e0d\u5728\u50cf\u7d20\u7a7a\u95f4\u9884\u6d4b\u7cbe\u786e\u7684\u672a\u6765\u89c2\u6d4b\uff0c\u800c\u662f\u5728\u5d4c\u5165\u7a7a\u95f4\u4e2d\u9884\u6d4b\uff1a\"\u4e0b\u4e00\u72b6\u6001\u7684\u6f5c\u5728\u8868\u793a\u5c06\u63a5\u8fd1\u8be5\u5411\u91cf\u3002\"\u8fd9\u907f\u514d\u4e86\u9884\u6d4b\u50cf\u7d20\u7ea7\u5b8c\u7f8e\u672a\u6765\u7684\u56f0\u96be\uff08\u65e2\u65e0\u5fc5\u8981\u53c8\u8ba1\u7b97\u6d6a\u8d39\uff09\uff0c\u5e76\u4e13\u6ce8\u4e8e\u9884\u6d4b\u5bf9\u51b3\u7b56\u91cd\u8981\u7684\u672a\u6765\u65b9\u9762\u3002
\u4e16\u754c\u6a21\u578b\u7684\u5c40\u9650\u6027\u5728\u4e8e\u590d\u5408\u9884\u6d4b\u8bef\u5dee\u3002\u8f6c\u79fb\u6a21\u578b\u4e2d\u7684\u5fae\u5c0f\u4e0d\u51c6\u786e\u6027\u5728\u957f\u7a0b\u5c55\u5f00\u4e2d\u79ef\u7d2f\uff0c\u5bfc\u81f4\u60f3\u8c61\u7684\u8f68\u8ff9\u504f\u79bb\u73b0\u5b9e\u3002\u7f13\u89e3\u63aa\u65bd\u5305\u62ec\uff1a\u77ed\u60f3\u8c61\u65f6\u57df\u3001\u96c6\u6210\u6a21\u578b\uff08\u4f7f\u7528\u4e0d\u786e\u5b9a\u6027\u68c0\u6d4b\u9884\u6d4b\u4f55\u65f6\u53d8\u5f97\u4e0d\u53ef\u9760\uff09\u3001\u4ee5\u53ca\u5b9a\u671f\u7528\u65b0\u7684\u771f\u5b9e\u4e16\u754c\u6570\u636e\u6821\u51c6\u6a21\u578b\u3002
\u64cd\u4f5c\u662f\u4f7f\u7528\u673a\u5668\u4eba\u672b\u7aef\u6267\u884c\u5668\u4e0e\u7269\u4f53\u4ea4\u4e92\u7684\u827a\u672f\uff1a\u6293\u53d6\u3001\u653e\u7f6e\u3001\u63a8\u3001\u63d2\u5165\u3001\u7ec4\u88c5\u3002
\u6293\u53d6\u662f\u57fa\u7840\u7684\u64cd\u4f5c\u6280\u80fd\u3002\u76ee\u6807\u662f\u627e\u5230\u4e00\u4e2a\u7a33\u5b9a\u7684\u6293\u53d6\u59ff\u6001\uff1a\u5939\u722a\u7684\u4f4d\u7f6e\u548c\u65b9\u5411\uff0c\u80fd\u591f\u7262\u56fa\u5730\u6293\u4f4f\u7269\u4f53\u3002
\u89e3\u6790\u6293\u53d6\u89c4\u5212\u4f7f\u7528\u7269\u7406\u5b66\u3002\u5982\u679c\u63a5\u89e6\u529b\u80fd\u591f\u62b5\u6297\u5916\u90e8\u6273\u624b\uff08\u529b\u548c\u529b\u77e9\uff09\uff0c\u5219\u6293\u53d6\u662f\u7a33\u5b9a\u7684\u3002\u5bf9\u4e8e\u5e73\u884c\u5939\u722a\uff0c\u6700\u7b80\u5355\u7684\u6807\u51c6\u662f\u529b\u95ed\u5408\u6761\u4ef6\uff1a\u63a5\u89e6\u6cd5\u7ebf\u5fc5\u987b\u8de8\u8d8a\u6240\u6709\u529b\u7684\u65b9\u5411\uff0c\u4f7f\u6293\u53d6\u80fd\u591f\u62b5\u6297\u4efb\u4f55\u6270\u52a8\u3002\u8fd9\u6d89\u53ca\u68c0\u67e5\u6293\u53d6\u6273\u624b\u77e9\u9635\u7684\u79e9\uff0c\u662f\u7b2c2\u7ae0\u79e9\u6982\u5ff5\u7684\u76f4\u63a5\u5e94\u7528\u3002
\u6570\u636e\u9a71\u52a8\u7684\u6293\u53d6\u5b66\u4e60\u4ece\u611f\u5b98\u8f93\u5165\u9884\u6d4b\u6293\u53d6\u6210\u529f\u3002\u7ed9\u5b9a\u684c\u5b50\u4e0a\u7269\u4f53\u7684\u6df1\u5ea6\u56fe\u50cf\uff0c\u7f51\u7edc\u9884\u6d4b\u6bcf\u4e2a\u5019\u9009\u5939\u722a\u59ff\u6001\u7684\u6293\u53d6\u8d28\u91cf\u5206\u6570\u3002GraspNet\u548c\u7c7b\u4f3c\u67b6\u6784\u4f7f\u7528\u70b9\u4e91\u7f16\u7801\u5668\uff08PointNet\u98ce\u683c\uff0c\u7b2c8\u7ae0\uff09\u6765\u9884\u6d4b\u5e26\u6709\u7f6e\u4fe1\u5ea6\u5206\u6570\u76846\u81ea\u7531\u5ea6\u6293\u53d6\u59ff\u6001\uff08\u4f4d\u7f6e+\u65b9\u5411\uff09\u3002
\u7075\u5de7\u64cd\u4f5c\u8d85\u8d8a\u4e86\u7b80\u5355\u7684\u6293\u53d6\u548c\u653e\u7f6e\u3002\u591a\u6307\u624b\u5177\u670920+\u81ea\u7531\u5ea6\uff0c\u53ef\u4ee5\u6267\u884c\u624b\u4e2d\u65cb\u8f6c\uff08\u5728\u624b\u6307\u95f4\u65cb\u8f6c\u7b14\uff09\u3001\u5de5\u5177\u4f7f\u7528\u548c\u7cbe\u7ec6\u7ec4\u88c5\u7b49\u4efb\u52a1\u3002\u72b6\u6001\u7a7a\u95f4\u5de8\u5927\u4e14\u63a5\u89e6\u590d\u6742\uff0c\u4f7f\u5176\u6210\u4e3a\u673a\u5668\u4eba\u5b66\u4e2d\u6700\u56f0\u96be\u7684\u95ee\u9898\u4e4b\u4e00\u3002
\u5b66\u4e60\u7075\u5de7\u64cd\u4f5c\u901a\u5e38\u4f7f\u7528\u5e26\u6709\u5927\u91cf\u57df\u968f\u673a\u5316\u7684\u4eff\u771f\u4e2d\u7684\u5f3a\u5316\u5b66\u4e60\uff08\u7b2c6\u7ae0\uff09\u3002OpenAI\u7528Shadow\u624b\u89e3\u51b3\u9b54\u65b9\u7684\u5de5\u4f5c\u5c31\u662f\u5728\u4eff\u771f\u4e2d\u4f7f\u7528\u968f\u673a\u5316\u7269\u7406\u8bad\u7ec3PPO\u7b56\u7565\uff0c\u6700\u7ec8\u5b9e\u73b0\u4e86\u5411\u771f\u5b9e\u673a\u5668\u4eba\u624b\u7684\u8fc1\u79fb\u3002
\u63a5\u89e6\u5bc6\u96c6\u578b\u4efb\u52a1\u5982\u9500\u9489\u5165\u5b54\u6216\u64e6\u62ed\u8868\u9762\uff0c\u8981\u6c42\u673a\u5668\u4eba\u4e0e\u73af\u5883\u4fdd\u6301\u53d7\u63a7\u63a5\u89e6\u3002\u8fd9\u4e9b\u4efb\u52a1\u9700\u8981\u529b\u4f20\u611f\u548c\u67d4\u987a\u63a7\u5236\uff08\u963b\u6297\u63a7\u5236\uff09\uff0c\u5e76\u4e14\u96be\u4ee5\u51c6\u786e\u4eff\u771f\uff0c\u56e0\u4e3a\u63a5\u89e6\u7269\u7406\u4f17\u6240\u5468\u77e5\u5730\u96be\u4ee5\u5efa\u6a21\u3002
\u79fb\u52a8\u662f\u8ba9\u673a\u5668\u4eba\u7684\u8eab\u4f53\u5728\u4e16\u754c\u4e2d\u79fb\u52a8\uff1a\u884c\u8d70\u3001\u5954\u8dd1\u3001\u6500\u722c\u3001\u6e38\u6cf3\u3002\u4e0e\u64cd\u4f5c\u7684\u5173\u952e\u533a\u522b\u5728\u4e8e\u673a\u5668\u4eba\u5fc5\u987b\u5728\u79fb\u52a8\u65f6\u4fdd\u6301\u5e73\u8861\uff0c\u5e76\u4e14\u4e0e\u5730\u9762\u7684\u63a5\u89e6\u70b9\u968f\u65f6\u95f4\u53d8\u5316\u3002
\u817f\u5f0f\u79fb\u52a8\u5177\u6709\u6311\u6218\u6027\uff0c\u56e0\u4e3a\u5b83\u672c\u8d28\u4e0a\u662f\u4e0d\u7a33\u5b9a\u7684\u3002\u5355\u6b65\u7ad9\u7acb\u7684\u53cc\u8db3\u673a\u5668\u4eba\uff08\u7c7b\u4eba\u673a\u5668\u4eba\uff09\u5c31\u50cf\u4e00\u4e2a\u5012\u7acb\u6446\u3002\u8d28\u5fc3\u5fc5\u987b\u4fdd\u6301\u5728\u652f\u6491\u591a\u8fb9\u5f62\uff08\u4e0e\u5730\u9762\u63a5\u89e6\u7684\u811a\u7684\u51f8\u5305\uff09\u4e0a\u65b9\uff0c\u5426\u5219\u673a\u5668\u4eba\u4f1a\u6454\u5012\u3002
\u96f6\u529b\u77e9\u70b9\uff08ZMP\uff09\u662f\u5730\u9762\u4e0a\u91cd\u529b\u548c\u60ef\u6027\u529b\u4ea7\u751f\u7684\u51c0\u529b\u77e9\u4e3a\u96f6\u7684\u70b9\u3002\u5982\u679cZMP\u4fdd\u6301\u5728\u652f\u6491\u591a\u8fb9\u5f62\u5185\uff0c\u673a\u5668\u4eba\u5c31\u4e0d\u4f1a\u7ffb\u5012\u3002\u4f20\u7edf\u7684\u4eba\u5f62\u673a\u5668\u4eba\u63a7\u5236\u5668\uff08\u5982\u672c\u7530ASIMO\uff09\u89c4\u5212\u4f7fZMP\u4fdd\u6301\u5728\u8fb9\u754c\u5185\u7684\u8f68\u8ff9\u3002
\u4e2d\u592e\u6a21\u5f0f\u53d1\u751f\u5668\uff08CPG\uff09\u662f\u53d7\u751f\u7269\u5b66\u542f\u53d1\u7684\u57fa\u4e8e\u632f\u8361\u5668\u7684\u63a7\u5236\u5668\u3002\u52a8\u7269\u4f7f\u7528\u810a\u9ad3\u4e2d\u7684\u795e\u7ecf\u56de\u8def\u4ea7\u751f\u6709\u8282\u594f\u7684\u79fb\u52a8\u6a21\u5f0f\uff08\u884c\u8d70\u3001\u5c0f\u8dd1\u3001\u5954\u8dd1\uff09\uff0c\u65e0\u9700\u5927\u8111\u6301\u7eed\u53c2\u4e0e\u3002CPG\u6a21\u578b\u4f7f\u7528\u8026\u5408\u5fae\u5206\u65b9\u7a0b\uff1a
\u5176\u4e2d\\(\\\\phi_i\\)\u662f\u632f\u8361\u5668\\(i\\)\u7684\u76f8\u4f4d\uff0c\\(\\\\omega_i\\)\u662f\u81ea\u7136\u9891\u7387\uff0c\\(w_{ij}\\)\u662f\u8026\u5408\u5f3a\u5ea6\uff0c\\(\\\\psi_{ij}\\)\u662f\u671f\u671b\u7684\u76f8\u4f4d\u504f\u79fb\u3002\u4e0d\u540c\u7684\u76f8\u4f4d\u5173\u7cfb\u4ea7\u751f\u4e0d\u540c\u7684\u6b65\u6001\uff1a\u6240\u6709\u817f\u540c\u6b65\uff08\u8df3\u8dc3\uff09\u3001\u4ea4\u66ff\u914d\u5bf9\uff08\u5c0f\u8dd1\uff09\u3001\u987a\u5e8f\uff08\u884c\u8d70\uff09\u3002\u6b63\u5f26\u8026\u5408\u81ea\u7136\u5730\u540c\u6b65\u632f\u8361\u5668\uff0c\u7c7b\u4f3c\u4e8e\u5085\u91cc\u53f6\u7ea7\u6570\uff08\u7b2c3\u7ae0\uff09\u5982\u4f55\u5c06\u8fd0\u52a8\u5206\u89e3\u4e3a\u9891\u7387\u5206\u91cf\u3002
\u7528\u4e8e\u79fb\u52a8\u7684\u5f3a\u5316\u5b66\u4e60\u5df2\u6210\u4e3a\u654f\u6377\u56db\u8db3\u548c\u7c7b\u4eba\u673a\u5668\u4eba\u7684\u4e3b\u8981\u65b9\u6cd5\u3002\u673a\u5668\u4eba\u5728\u4eff\u771f\u4e2d\u901a\u8fc7\u8bd5\u9519\u5b66\u4e60\u7b56\u7565\\(\\\\pi(\\\\mathbf{a} \\\\mid \\\\mathbf{o})\\)\uff08\u7b2c6\u7ae0\uff09\uff0c\u5956\u52b1\u5305\u62ec\u524d\u8fdb\u901f\u5ea6\u3001\u7a33\u5b9a\u6027\u548c\u80fd\u6548\uff0c\u60e9\u7f5a\u5305\u62ec\u6454\u5012\u3001\u5173\u8282\u9650\u4f4d\u8fdd\u89c4\u548c\u6296\u52a8\u8fd0\u52a8\u3002
\u8fd1\u671f\u5de5\u4f5c\uff08\u5982Agility Robotics\u3001Boston Dynamics\u548c\u5b66\u672f\u5b9e\u9a8c\u5ba4\uff09\u7684\u5173\u952e\u6d1e\u89c1\u662f\uff0cRL\u8bad\u7ec3\u7684\u79fb\u52a8\u7b56\u7565\u8fdc\u4f18\u4e8e\u624b\u5de5\u8bbe\u8ba1\u7684\u63a7\u5236\u5668\u3002\u5b83\u4eec\u81ea\u7136\u5b66\u4f1a\u4ece\u63a8\u52a8\u4e2d\u6062\u590d\u3001\u9002\u5e94\u5730\u5f62\u53d8\u5316\uff0c\u5e76\u5904\u7406\u6ca1\u6709\u5de5\u7a0b\u5e08\u80fd\u9884\u6599\u5230\u7684\u60c5\u51b5\u3002\u8bad\u7ec3\u901a\u5e38\u4f7f\u7528PPO\uff08\u7b2c6\u7ae0\uff09\u7ed3\u5408\u57df\u968f\u673a\u5316\u3002
\u56db\u8db3\u673a\u5668\u4eba\uff08\u5982Boston Dynamics Spot\u6216Unitree Go2\uff09\u5df2\u6210\u4e3a\u817f\u5f0f\u673a\u5668\u4eba\u7684\u4e3b\u529b\u3002\u56db\u6761\u817f\u63d0\u4f9b\u56fa\u6709\u7a33\u5b9a\u6027\uff08\u4e09\u6761\u817f\u7684\u4e09\u89d2\u652f\u6491\u603b\u80fd\u5728\u4e00\u6761\u817f\u79fb\u52a8\u65f6\u652f\u6491\u8eab\u4f53\uff09\u3002\u56db\u8db3\u673a\u5668\u4eba\u7684RL\u7b56\u7565\u5b9e\u73b0\u4e86\u4ee4\u4eba\u5370\u8c61\u6df1\u523b\u7684\u7ed3\u679c\uff1a\u4ee53+\u7c73/\u79d2\u5954\u8dd1\u3001\u722c\u697c\u68af\u3001\u5728\u5ca9\u77f3\u5730\u5f62\u4e0a\u5bfc\u822a\u4ee5\u53ca\u4ece\u8e22\u51fb\u4e2d\u6062\u590d\u3002
\u7c7b\u4eba\u673a\u5668\u4eba\u79fb\u52a8\u66f4\u96be\uff0c\u56e0\u4e3a\u53cc\u8db3\u673a\u5668\u4eba\u6709\u66f4\u5c0f\u7684\u652f\u6491\u591a\u8fb9\u5f62\u548c\u66f4\u9ad8\u7684\u8d28\u5fc3\u3002\u6700\u8fd1\u7684\u8fdb\u5c55\uff08Tesla Optimus\u3001Figure\u3001Unitree H1\uff09\u4f7f\u7528\u5728\u4eff\u771f\u4e2d\u8bad\u7ec3\u7684RL\uff0c\u914d\u4ee5\u7cbe\u5fc3\u7684\u5956\u52b1\u5851\u9020\u3002\u7c7b\u4eba\u673a\u5668\u4eba\u5fc5\u987b\u5b66\u4f1a\u7684\u4e0d\u4ec5\u4ec5\u662f\u884c\u8d70\uff0c\u8fd8\u8981\u534f\u8c03\u624b\u81c2\u6446\u52a8\u4ee5\u4fdd\u6301\u5e73\u8861\u3001\u5728\u4e0d\u5e73\u5766\u8868\u9762\u4e0a\u5bfc\u822a\u4ee5\u53ca\u4ece\u6270\u52a8\u4e2d\u6062\u590d\u3002
\u4e00\u4e2a\u4e3a\u4e86\u5b66\u4e60\u800c\u968f\u673a\u63a2\u7d22\u7684\u673a\u5668\u4eba\uff08\u5982\u5728RL\u4e2d\uff09\u53ef\u80fd\u4f1a\u635f\u574f\u81ea\u8eab\u3001\u73af\u5883\u6216\u9644\u8fd1\u7684\u4eba\u7c7b\u3002\u5b89\u5168\u7684\u673a\u5668\u4eba\u5b66\u4e60\u7ea6\u675f\u63a2\u7d22\u4ee5\u907f\u514d\u707e\u96be\u6027\u540e\u679c\u3002
\u7ea6\u675fRL\u5411MDP\uff08\u7b2c6\u7ae0\uff09\u6dfb\u52a0\u5b89\u5168\u7ea6\u675f\u3002\u76ee\u6807\u53d8\u4e3a\uff1a\u5728\u6ee1\u8db3\\(J_c(\\\\pi) \\\\leq d\\)\u7684\u6761\u4ef6\u4e0b\u6700\u5927\u5316\u5956\u52b1\uff0c\u5176\u4e2d\\(J_c\\)\u662f\u671f\u671b\u7684\u7d2f\u79ef\u4ee3\u4ef7\uff08\u5982\u78b0\u649e\u4e8b\u4ef6\uff09\uff0c\\(d\\)\u662f\u6700\u5927\u5141\u8bb8\u4ee3\u4ef7\u3002\u50cf\u7ea6\u675f\u7b56\u7565\u4f18\u5316\uff08CPO\uff09\u8fd9\u6837\u7684\u7b97\u6cd5\u6269\u5c55\u4e86PPO\u4ee5\u5904\u7406\u8fd9\u4e9b\u7ea6\u675f\u3002
\u5b89\u5168\u5305\u7edc\u5b9a\u4e49\u4e86\u673a\u5668\u4eba\u7edd\u4e0d\u80fd\u8d8a\u8fc7\u7684\u786c\u8fb9\u754c\uff0c\u65e0\u8bba\u5b66\u4e60\u7b56\u7565\u5982\u4f55\u8f93\u51fa\u3002\u4e00\u4e2a\u5b89\u5168\u63a7\u5236\u5668\u76d1\u63a7\u673a\u5668\u4eba\u72b6\u6001\uff0c\u5e76\u5728\u5373\u5c06\u8fdd\u53cd\u7ea6\u675f\u65f6\u8986\u76d6\u5b66\u4e60\u7b56\u7565\uff08\u4f8b\u5982\uff0c\u63a5\u8fd1\u5173\u8282\u9650\u4f4d\u3001\u5728\u4eba\u7c7b\u9644\u8fd1\u79fb\u52a8\u8fc7\u5feb\u3001\u6216\u8d85\u8fc7\u529b\u9608\u503c\uff09\u3002\u8fd9\u662f\u4e00\u79cd\u5206\u5c42\u67b6\u6784\uff1a\u5b66\u4e60\u7b97\u6cd5\u5904\u7406\u6027\u80fd\uff0c\u5b89\u5168\u5c42\u5904\u7406\u7ea6\u675f\u3002
\u98ce\u9669\u611f\u77e5\u89c4\u5212\u663e\u5f0f\u5730\u5efa\u6a21\u73af\u5883\u548c\u673a\u5668\u4eba\u81ea\u8eab\u72b6\u6001\u4f30\u8ba1\u4e2d\u7684\u4e0d\u786e\u5b9a\u6027\u3002\u5b83\u4e0d\u662f\u4e3a\u6700\u53ef\u80fd\u7684\u7ed3\u679c\u8fdb\u884c\u89c4\u5212\uff0c\u800c\u662f\u5728\u7f6e\u4fe1\u533a\u95f4\u5185\u4e3a\u6700\u574f\u60c5\u51b5\u8fdb\u884c\u89c4\u5212\u3002\u8fd9\u4e0e\u6761\u4ef6\u6570\u6982\u5ff5\uff08\u7b2c2\u7ae0\uff09\u76f8\u5173\uff1a\u826f\u6001\u7cfb\u7edf\u5bf9\u6270\u52a8\u5177\u6709\u9c81\u68d2\u6027\uff0c\u98ce\u9669\u611f\u77e5\u89c4\u5212\u5bfb\u6c42\u5728\u6270\u52a8\u4e0b\u4ecd\u4fdd\u6301\u5b89\u5168\u7684\u63a7\u5236\u7b56\u7565\u3002
\u5b9e\u73b0\u4e00\u4e2a\u7b80\u53552\u8fde\u6746\u5e73\u9762\u673a\u5668\u4eba\u624b\u81c2\u7684\u6b63\u5411\u8fd0\u52a8\u5b66\u3002\u8ba1\u7b97\u5e76\u53ef\u89c6\u5316\u4e0d\u540c\u5173\u8282\u89d2\u5ea6\u4e0b\u7684\u672b\u7aef\u6267\u884c\u5668\u4f4d\u7f6e\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ndef forward_kinematics(q1, q2, l1=1.0, l2=0.8):\n \"\"\"\u8ba1\u7b972\u8fde\u6746\u624b\u81c2\u7684\u5173\u8282\u548c\u672b\u7aef\u6267\u884c\u5668\u4f4d\u7f6e\u3002\"\"\"\n x1 = l1 * jnp.cos(q1)\n y1 = l1 * jnp.sin(q1)\n x2 = x1 + l2 * jnp.cos(q1 + q2)\n y2 = y1 + l2 * jnp.sin(q1 + q2)\n return jnp.array([0, x1, x2]), jnp.array([0, y1, y2])\n\nfig, ax = plt.subplots(figsize=(6, 6))\nconfigs = [(0.5, 0.3), (1.0, -0.5), (1.5, 1.0), (2.0, -1.5)]\ncolors = [\"#e74c3c\", \"#3498db\", \"#27ae60\", \"#9b59b6\"]\n\nfor (q1, q2), c in zip(configs, colors):\n xs, ys = forward_kinematics(q1, q2)\n ax.plot(xs, ys, \"o-\", color=c, linewidth=2, markersize=6,\n label=f\"q=({q1:.1f}, {q2:.1f})\")\n\nax.set_xlim(-2, 2); ax.set_ylim(-2, 2)\nax.set_aspect(\"equal\"); ax.grid(True); ax.legend()\nax.set_title(\"2\u8fde\u6746\u673a\u5668\u4eba\u624b\u81c2\uff1a\u6b63\u5411\u8fd0\u52a8\u5b66\")\nplt.show()\n \u4f7f\u7528\u96c5\u53ef\u6bd4\u4f2a\u9006\u5b9e\u73b0\u9006\u5411\u8fd0\u52a8\u5b66\u3002\u4ece\u968f\u673a\u6784\u578b\u5f00\u59cb\uff0c\u8fed\u4ee3\u5730\u5c06\u672b\u7aef\u6267\u884c\u5668\u79fb\u52a8\u5230\u76ee\u6807\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nl1, l2 = 1.0, 0.8\n\ndef end_effector(q):\n x = l1 * jnp.cos(q[0]) + l2 * jnp.cos(q[0] + q[1])\n y = l1 * jnp.sin(q[0]) + l2 * jnp.sin(q[0] + q[1])\n return jnp.array([x, y])\n\njacobian_fn = jax.jacobian(end_effector)\n\ntarget = jnp.array([0.5, 1.2])\nq = jnp.array([0.1, 0.1])\ntrajectory = [end_effector(q)]\n\nfor _ in range(50):\n pos = end_effector(q)\n error = target - pos\n if jnp.linalg.norm(error) < 1e-4:\n break\n J = jacobian_fn(q)\n # \u963b\u5c3c\u4f2a\u9006\u5904\u7406\u63a5\u8fd1\u5947\u5f02\u70b9\u7684\u60c5\u51b5\n dq = J.T @ jnp.linalg.solve(J @ J.T + 0.01 * jnp.eye(2), error)\n q = q + dq\n trajectory.append(end_effector(q))\n\ntraj = jnp.stack(trajectory)\nplt.plot(traj[:, 0], traj[:, 1], \"b.-\", label=\"\u672b\u7aef\u6267\u884c\u5668\u8def\u5f84\")\nplt.plot(*target, \"r*\", markersize=15, label=\"\u76ee\u6807\u70b9\")\nplt.gca().set_aspect(\"equal\"); plt.grid(True); plt.legend()\nplt.title(f\"IK\u5728{len(trajectory)-1}\u6b65\u5185\u6536\u655b\")\nplt.show()\n \u6a21\u62df\u4e00\u4e2a\u7b80\u5355\u7684PID\u63a7\u5236\u5668\u8ddf\u8e2a\u671f\u671b\u7684\u5173\u8282\u8f68\u8ff9\u3002\u89c2\u5bdf\u8c03\u53c2\u5bf9\u589e\u76ca\u7684\u5f71\u54cd\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u671f\u671b\u8f68\u8ff9\uff1a\u5e73\u6ed1\u6b63\u5f26\u8fd0\u52a8\ndt = 0.01\nt = jnp.arange(0, 5, dt)\nq_desired = jnp.sin(2 * t)\n\n# \u6a21\u62df\u4e8c\u9636\u52a8\u529b\u5b66\uff1am * q_ddot + b * q_dot = tau\nm, b_damp = 1.0, 0.5\n\nfor Kp, Kd, Ki, label in [(10, 5, 0, \"\u4ec5PD\"), (10, 5, 2, \"PID\"), (50, 10, 2, \"\u6fc0\u8fdbPID\")]:\n q, q_dot, integral = 0.0, 0.0, 0.0\n qs = []\n for i in range(len(t)):\n error = q_desired[i] - q\n integral += error * dt\n d_error = -q_dot # \u8bef\u5dee\u5bfc\u6570\uff08\u6b64\u5904\u7b80\u5316\uff0c\u5df2\u77e5\u671f\u671b\u901f\u5ea6\uff09\n tau = Kp * error + Kd * d_error + Ki * integral\n q_ddot = (tau - b_damp * q_dot) / m\n q_dot += q_ddot * dt\n q += q_dot * dt\n qs.append(float(q))\n\n plt.plot(t, qs, label=label)\n\nplt.plot(t, q_desired, \"k--\", label=\"\u671f\u671b\u503c\", linewidth=2)\nplt.xlabel(\"\u65f6\u95f4 (\u79d2)\"); plt.ylabel(\"\u5173\u8282\u89d2\u5ea6\")\nplt.legend(); plt.title(\"PID\u63a7\u5236\u5668\u8ddf\u8e2a\")\nplt.show()\n \u89c6\u89c9-\u8bed\u8a00-\u52a8\u4f5c\u6a21\u578b\uff08VLA\uff09\u5c06\u89c6\u89c9\u7406\u89e3\u3001\u8bed\u8a00\u7406\u89e3\u548c\u884c\u52a8\u63a7\u5236\u7edf\u4e00\u5230\u5355\u4e2a\u795e\u7ecf\u7f51\u7edc\u4e2d\u3002\u672c\u7ae0\u6db5\u76d6VLA\u67b6\u6784\u3001\u52a8\u4f5c\u6807\u8bb0\u5316\u3001RT-2\u3001Octo\u3001OpenVLA\u3001\u9884\u8bad\u7ec3\u7b56\u7565\u3001\u6cdb\u5316\u80fd\u529b\u3001\u4e0e\u5177\u4f53\u5f62\u6001\u65e0\u5173\u7684\u6a21\u578b\u4ee5\u53ca\u57fa\u51c6\u6d4b\u8bd5\u3002
\u5728\u524d\u9762\u7684\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u6db5\u76d6\u4e86\u611f\u77e5\uff08\u611f\u77e5\u4e16\u754c\uff09\u548c\u673a\u5668\u4eba\u5b66\u4e60\uff08\u63a7\u5236\u8eab\u4f53\uff09\u3002\u4f20\u7edf\u4e0a\uff0c\u8fd9\u4e9b\u662f\u72ec\u7acb\u7684\u6d41\u7a0b\uff1a\u611f\u77e5\u6a21\u5757\u68c0\u6d4b\u7269\u4f53\uff0c\u8bed\u8a00\u6a21\u5757\u89e3\u91ca\u6307\u4ee4\uff0c\u63a7\u5236\u6a21\u5757\u751f\u6210\u52a8\u4f5c\u3002\u6bcf\u4e2a\u6a21\u5757\u72ec\u7acb\u8bbe\u8ba1\u3001\u8bad\u7ec3\u548c\u8c03\u8bd5\u3002
\u89c6\u89c9-\u8bed\u8a00-\u52a8\u4f5c\u6a21\u578b\uff08VLA\uff09\u5c06\u8fd9\u4e00\u6d41\u7a0b\u538b\u7f29\u4e3a\u5355\u4e2a\u795e\u7ecf\u7f51\u7edc\u3002\u6a21\u578b\u63a5\u6536\u56fe\u50cf\uff08\u89c6\u89c9\uff09\u548c\u81ea\u7136\u8bed\u8a00\u6307\u4ee4\uff08\u8bed\u8a00\uff09\uff0c\u5e76\u8f93\u51fa\u7535\u673a\u547d\u4ee4\uff08\u52a8\u4f5c\uff09\u3002\u4e00\u4e2a\u6a21\u578b\uff0c\u7aef\u5230\u7aef\u3002
\u8fd9\u6cbf\u88ad\u4e86\u6211\u4eec\u5728\u7b2c10\u7ae0\u770b\u5230\u7684\u7edf\u4e00\u8d8b\u52bf\uff1a\u6b63\u5982\u591a\u6a21\u6001\u6a21\u578b\u5c06\u89c6\u89c9\u548c\u8bed\u8a00\u7406\u89e3\u5408\u5e76\u5230\u4e00\u4e2a\u67b6\u6784\u4e2d\u4e00\u6837\uff0cVLA\u5c06\u8fd9\u4e00\u8d8b\u52bf\u6269\u5c55\u5230\u7269\u7406\u884c\u52a8\u3002\u5173\u952e\u6d1e\u89c1\u5728\u4e8e\uff0c\u8bed\u8a00\u4e3a\u6307\u5b9a\u4efb\u52a1\u63d0\u4f9b\u4e86\u81ea\u7136\u3001\u7075\u6d3b\u7684\u63a5\u53e3\uff08\"\u62ff\u8d77\u7ea2\u8272\u676f\u5b50\u653e\u5230\u67b6\u5b50\u4e0a\"\uff09\uff0c\u800c\u5927\u89c4\u6a21\u9884\u8bad\u7ec3\u7684\u89c6\u89c9-\u8bed\u8a00\u6a21\u578b\u5df2\u7ecf\u7406\u89e3\u56fe\u50cf\u548c\u6307\u4ee4\u3002
\u56de\u987e\u7b2c10\u7ae0\uff0c\u89c6\u89c9-\u8bed\u8a00\u6a21\u578b\uff08VLM\uff09\u5982LLaVA\u548cFlamingo\u63a5\u6536\u56fe\u50cf\u548c\u6587\u672c\u4f5c\u4e3a\u8f93\u5165\uff0c\u5e76\u751f\u6210\u6587\u672c\u4f5c\u4e3a\u8f93\u51fa\u3002\u5b83\u4eec\u7406\u89e3\u573a\u666f\u3001\u56de\u7b54\u95ee\u9898\u3001\u9075\u5faa\u6307\u4ee4\u2014\u2014\u5168\u90e8\u901a\u8fc7\u8bed\u8a00\u5b8c\u6210\u3002
VLA\u63d0\u51fa\u7684\u95ee\u9898\u662f\uff1a\u5982\u679c\u8f93\u51fa\u4e0d\u662f\u6587\u672c\u800c\u662f\u673a\u5668\u4eba\u52a8\u4f5c\u5462\uff1f\u6a21\u578b\u4e0d\u518d\u751f\u6210\"\u7ea2\u8272\u676f\u5b50\u5728\u684c\u5b50\u7684\u5de6\u4fa7\"\uff0c\u800c\u662f\u751f\u6210\u4e00\u7cfb\u5217\u7535\u673a\u547d\u4ee4\uff0c\u9a71\u52a8\u624b\u81c2\u53bb\u6293\u53d6\u90a3\u4e2a\u676f\u5b50\u3002
\u5173\u952e\u7684\u67b6\u6784\u6d1e\u89c1\u662f\uff0c\u52a8\u4f5c\u53ef\u4ee5\u50cf\u5355\u8bcd\u4e00\u6837\u8868\u793a\u4e3a\u6807\u8bb0\u3002\u5982\u679cVLM\u4f7f\u7528\u4e0b\u4e00\u4e2a\u6807\u8bb0\u9884\u6d4b\u9010\u4e2a\u751f\u6210\u8bed\u8a00\u6807\u8bb0\uff0c\u90a3\u4e48VLA\u4ee5\u540c\u6837\u7684\u65b9\u5f0f\u751f\u6210\u52a8\u4f5c\u6807\u8bb0\u3002Transformer\u4ece\u6839\u672c\u4e0a\u5e76\u4e0d\u5173\u5fc3\u8f93\u51fa\u6807\u8bb0\u8868\u793a\"\u676f\u5b50\"\u8fd8\u662f\"\u5c06\u5939\u722a\u5411\u524d\u79fb\u52a82\u5398\u7c73\"\u3002
\u8fd9\u91cd\u65b0\u5b9a\u4e49\u4e86\u673a\u5668\u4eba\u63a7\u5236\u4e3a\u5e8f\u5217\u5efa\u6a21\u95ee\u9898\uff0c\u8fd9\u6b63\u662ftransformer\u64c5\u957f\u7684\uff08\u7b2c7\u7ae0\uff09\u3002\u6a21\u578b\u5b66\u4e60\u6620\u5c04\uff1a\uff08\u56fe\u50cf\u89c2\u6d4b\uff0c\u8bed\u8a00\u6307\u4ee4\uff09\\(\\\\to\\)\uff08\u52a8\u4f5c\u6807\u8bb0\u5e8f\u5217\uff09\u3002
\u5178\u578b\u7684VLA\u6709\u4e09\u4e2a\u7ec4\u4ef6\uff1a
\u89c6\u89c9\u7f16\u7801\u5668\uff1a\u5c06\u76f8\u673a\u56fe\u50cf\u5904\u7406\u4e3a\u89c6\u89c9\u6807\u8bb0\u3002\u901a\u5e38\u662f\u9884\u8bad\u7ec3\u7684ViT\uff08\u7b2c8\u7ae0\uff09\u6216SigLIP\u7f16\u7801\u5668\uff08\u7b2c10\u7ae0\uff09\u3002\u56fe\u50cf\u88ab\u5206\u5272\u6210\u5757\uff0c\u6bcf\u4e2a\u5757\u5d4c\u5165\u4e3a\u4e00\u4e2a\u6807\u8bb0\uff0c\u4e0e\u6807\u51c6\u89c6\u89c9transformer\u5b8c\u5168\u4e00\u6837\u3002
\u8bed\u8a00\u6a21\u578b\u4e3b\u5e72\u7f51\u7edc\uff1a\u4e00\u4e2a\u9884\u8bad\u7ec3\u7684LLM\uff08\u4f8b\u5982LLaMA\u3001PaLM\uff09\uff0c\u5904\u7406\u4ea4\u9519\u7684\u89c6\u89c9\u6807\u8bb0\u548c\u8bed\u8a00\u6807\u8bb0\u5e8f\u5217\u3002\u8fd9\u5c31\u662f\u63a8\u7406\u53d1\u751f\u7684\u5730\u65b9\uff1a\u6a21\u578b\u901a\u8fc7\u540c\u65f6\u5173\u6ce8\u6307\u4ee4\u548c\u89c6\u89c9\u7279\u5f81\u6765\u7406\u89e3\"\u62ff\u8d77\u7ea2\u8272\u676f\u5b50\"\u3002
\u52a8\u4f5c\u5934\uff1a\u5c06LLM\u7684\u8f93\u51fa\u6620\u5c04\u5230\u673a\u5668\u4eba\u52a8\u4f5c\u3002\u53ef\u4ee5\u662f\u4e00\u4e2a\u7b80\u5355\u7684MLP\uff0c\u5c06\u6700\u540e\u7684\u9690\u85cf\u72b6\u6001\u6620\u5c04\u5230\u8fde\u7eed\u52a8\u4f5c\u503c\uff0c\u6216\u8005\u662f\u4e00\u79cd\u5c06\u52a8\u4f5c\u8f6c\u6362\u4e3a\u79bb\u6563\u6807\u8bb0\u7684\u65b9\u6848\uff0c\u7531LLM\u7684\u73b0\u6709\u8bcd\u6c47\u8868\u6765\u9884\u6d4b\u3002
\u67b6\u6784\u770b\u8d77\u6765\u50cf\uff1a
\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u662f\u5747\u5300\u79bb\u6563\u5316\u3002\u6bcf\u4e2a\u52a8\u4f5c\u7ef4\u5ea6\u88ab\u5212\u5206\u4e3a\\(N\\)\u4e2a\u7bb1\uff0c\u8986\u76d6\u6709\u6548\u503c\u8303\u56f4\u3002\u4f8b\u5982\uff0c\u5982\u679cx\u65b9\u5411\u901f\u5ea6\u8303\u56f4\u4ece-0.1\u52300.1\u7c73/\u79d2\uff0c\u4f7f\u7528256\u4e2a\u7bb1\uff0c\u6bcf\u4e2a\u7bb1\u4ee3\u8868\\(\\\\frac{0.2}{256} \\\\approx 0.8\\)\u6beb\u7c73/\u79d2\u3002\u52a8\u4f5c\u503c\u88ab\u6620\u5c04\u5230\u6700\u8fd1\u7684\u7bb1\u7d22\u5f15\uff0c\u8be5\u7d22\u5f15\u6210\u4e3a\u4e00\u4e2a\u6807\u8bb0\u3002
\u5bf9\u4e8e7\u4e2a\u52a8\u4f5c\u7ef4\u5ea6\uff086\u81ea\u7531\u5ea6+\u5939\u722a\uff09\u548c\u6bcf\u4e2a\u7ef4\u5ea6256\u4e2a\u7bb1\uff0c\u52a8\u4f5c\u8bcd\u6c47\u8868\u6709\\(7 \\\\times 256 = 1792\\)\u4e2a\u6807\u8bb0\u3002\u8fd9\u4e9b\u88ab\u6dfb\u52a0\u5230LLM\u73b0\u6709\u7684\u6587\u672c\u8bcd\u6c47\u8868\u4e2d\u3002\u6a21\u578b\u6bcf\u4e2a\u7ef4\u5ea6\u751f\u6210\u4e00\u4e2a\u52a8\u4f5c\u6807\u8bb0\uff0c\u81ea\u56de\u5f52\u5730\uff0c\u5c31\u50cf\u751f\u6210\u5355\u8bcd\u4e00\u6837\u3002
\u52a8\u4f5c\u5206\u5757\u4e00\u6b21\u9884\u6d4b\u591a\u4e2a\u672a\u6765\u65f6\u95f4\u6b65\uff0c\u800c\u4e0d\u662f\u5355\u4e2a\u52a8\u4f5c\u3002\u5982\u679c\u5757\u5927\u5c0f\u4e3a\\(H\\)\uff0c\u6a21\u578b\u8f93\u51fa\\(H \\\\times d\\)\u4e2a\u6807\u8bb0\uff08\u5176\u4e2d\\(d\\)\u662f\u52a8\u4f5c\u7ef4\u5ea6\uff09\u3002\u8fd9\u5bf9\u4e8e\u5e73\u6ed1\u3001\u65f6\u95f4\u8fde\u8d2f\u7684\u8fd0\u52a8\u81f3\u5173\u91cd\u8981\u3002\u4e00\u6b21\u9884\u6d4b\u4e00\u6b65\u4f1a\u4ea7\u751f\u6296\u52a8\u884c\u4e3a\uff0c\u56e0\u4e3a\u6bcf\u6b21\u9884\u6d4b\u90fd\u662f\u72ec\u7acb\u7684\u3002\u5206\u5757\u8feb\u4f7f\u6a21\u578b\u89c4\u5212\u4e00\u4e2a\u77ed\u8f68\u8ff9\uff0c\u6355\u83b7\u65f6\u95f4\u7ed3\u6784\u3002
\u66f4\u590d\u6742\u7684\u65b9\u6cd5\u4f7f\u7528\u5b66\u4e60\u578b\u6807\u8bb0\u5316\uff0c\u901a\u8fc7VQ-VAE\uff08\u7b2c10\u7ae0\uff09\u3002VQ-VAE\u7f16\u7801\u5668\u5c06\u8fde\u7eed\u52a8\u4f5c\u5e8f\u5217\u6620\u5c04\u5230\u79bb\u6563\u7801\u672c\u7d22\u5f15\u5e8f\u5217\uff0c\u89e3\u7801\u5668\u4ece\u8fd9\u4e9b\u7d22\u5f15\u91cd\u5efa\u8fde\u7eed\u52a8\u4f5c\u3002LLM\u7136\u540e\u751f\u6210\u7801\u672c\u7d22\u5f15\uff0c\u800c\u4e0d\u662f\u5747\u5300\u5206\u7bb1\u7684\u503c\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u56fe\u50cf\u5206\u8bcd\u5668\uff08\u7b2c10\u7ae0\uff09\u5982\u4f55\u5c06\u89c6\u89c9\u4fe1\u606f\u538b\u7f29\u4e3a\u7d27\u51d1\u7684\u79bb\u6563\u7f16\u7801\u3002
RT-2\uff08\u673a\u5668\u4ebaTransformer 2\uff0cGoogle DeepMind\uff09\u662f\u7b2c\u4e00\u4e2a\u5927\u89c4\u6a21VLA\u3002\u5b83\u4f7f\u7528\u9884\u8bad\u7ec3\u7684VLM\uff08PaLM-E\u6216PaLI-X\uff0c\u53c2\u6570\u9ad8\u8fbe55B\uff09\u5e76\u5728\u673a\u5668\u4eba\u793a\u8303\u6570\u636e\u4e0a\u5fae\u8c03\u3002\u52a8\u4f5c\u8868\u793a\u4e3a\u6587\u672c\u5b57\u7b26\u4e32\uff1a\u6807\u8bb0\u5e8f\u5217\"1 128 91 241 5 101 127\"\u7f16\u7801\u4e86\u4e00\u4e2a7\u7ef4\u52a8\u4f5c\uff08\u6bcf\u4e2a\u6570\u5b57\u662f\u7bb1\u7d22\u5f15\uff09\u3002
RT-2\u5c55\u793a\u4e86\u4e00\u4e2a\u663e\u8457\u7279\u6027\uff1a\u6765\u81eaVLM\u4e3b\u5e72\u7f51\u7edc\u7684\u6d8c\u73b0\u80fd\u529b\u8fc1\u79fb\u5230\u4e86\u673a\u5668\u4eba\u9886\u57df\u3002\u6a21\u578b\u53ef\u4ee5\u9075\u5faa\u6d89\u53ca\u4ece\u672a\u5728\u673a\u5668\u4eba\u6570\u636e\u4e2d\u89c1\u8fc7\u7684\u6982\u5ff5\u7684\u6307\u4ee4\uff08\u4f8b\u5982\uff0c\"\u5c06\u9999\u8549\u79fb\u52a8\u5230\u4ee5A\u5f00\u5934\u7684\u56fd\u5bb6\"\u9700\u8981\u89c6\u89c9\u7269\u4f53\u8bc6\u522b+\u4e16\u754c\u77e5\u8bc6+\u884c\u52a8\uff09\u3002VLM\u7684\u8bed\u8a00\u7406\u89e3\u548c\u89c6\u89c9\u63a8\u7406\"\u514d\u8d39\"\u83b7\u5f97\u3002
RT-2\u7684\u5c40\u9650\u6027\u5728\u4e8e\u5b83\u662f\u5728\u5355\u4e2a\u673a\u5668\u4eba\u5f62\u6001\uff08\u7279\u5b9a\u7684\u624b\u81c2\u548c\u7279\u5b9a\u7684\u5939\u722a\uff09\u7684\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\u3002\u5b83\u4e0d\u80fd\u6cdb\u5316\u5230\u4e0d\u540c\u7684\u673a\u5668\u4eba\u3002
Octo\uff08\u52a0\u5dde\u5927\u5b66\u4f2f\u514b\u5229\u5206\u6821\uff09\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u3001\u4e0e\u5177\u4f53\u5f62\u6001\u65e0\u5173\u7684VLA\uff0c\u8bbe\u8ba1\u7528\u4e8e\u8de8\u4e0d\u540c\u673a\u5668\u4eba\u5e73\u53f0\u5de5\u4f5c\u3002\u5173\u952e\u521b\u65b0\u5305\u62ec\uff1a
- **\u7075\u6d3b\u7684\u89c2\u6d4b\u548c\u52a8\u4f5c\u7a7a\u95f4**\uff1aOcto\u4e3a\u4e0d\u540c\u7684\u673a\u5668\u4eba\u914d\u7f6e\u4f7f\u7528\u7279\u5b9a\u4e8e\u4efb\u52a1\u7684\u6807\u8bb0\u5316\u5668\u3002\u5b83\u5728Open X-Embodiment\u6570\u636e\u96c6\u4e0a\u9884\u8bad\u7ec3\uff0c\u8be5\u6570\u636e\u96c6\u5305\u542b\u6765\u81ea22\u79cd\u4e0d\u540c\u673a\u5668\u4eba\u5f62\u6001\u7684\u793a\u8303\u3002\n\n- **\u9ad8\u6548\u5fae\u8c03**\uff1aOcto\u53ea\u9700100\u4e2a\u793a\u8303\u5c31\u53ef\u4ee5\u5fae\u8c03\u5230\u65b0\u673a\u5668\u4eba\uff0c\u4f7f\u5176\u9002\u7528\u4e8e\u6570\u636e\u6709\u9650\u7684\u5b9e\u9a8c\u5ba4\u3002\n OpenVLA\uff08\u65af\u5766\u798f\u5927\u5b66\u3001\u52a0\u5dde\u5927\u5b66\u4f2f\u514b\u5229\u5206\u6821\uff09\u91c7\u7528\u5fae\u8c03\u73b0\u6709\u5f00\u6e90VLM\uff08\u57fa\u4e8eLlama\uff09\u7528\u4e8e\u673a\u5668\u4eba\u6280\u672f\u7684\u65b9\u6cd5\u3002\u5b83\u4f7f\u75287B\u53c2\u6570\u4e3b\u5e72\u7f51\u7edc\u3001\u5747\u5300\u52a8\u4f5c\u6807\u8bb0\u5316\uff08\u6bcf\u4e2a\u7ef4\u5ea6256\u4e2a\u7bb1\uff09\uff0c\u5e76\u5728Open X-Embodiment\u6570\u636e\u4e0a\u8bad\u7ec3\u3002\u5176\u4f18\u52bf\u5728\u4e8e\u7b80\u5355\u6027\uff1a\u67b6\u6784\u662f\u6807\u51c6\u7684VLM\uff0c\u52a8\u4f5c\u6807\u8bb0\u88ab\u9644\u52a0\u5230\u8bcd\u6c47\u8868\u4e2d\uff0c\u4f7f\u5176\u6613\u4e8e\u4f7f\u7528\u73b0\u6709\u7684LLM\u57fa\u7840\u8bbe\u65bd\u8fdb\u884c\u8bad\u7ec3\u548c\u90e8\u7f72\u3002
\\(\\\\pi_0\\)\uff08Physical Intelligence\uff09\u4ee3\u8868\u4e86\u5f53\u524d\u6700\u9ad8\u6c34\u5e73\u3002\u5b83\u4f7f\u7528\u9884\u8bad\u7ec3\u7684VLM\u4e3b\u5e72\u7f51\u7edc\u548c\u6d41\u5339\u914d\u52a8\u4f5c\u5934\uff08\u7b2c8\u7ae0\uff09\u3002\u6d41\u5339\u914d\u901a\u8fc7\u5b66\u4e60\u4e00\u4e2a\u901f\u5ea6\u573a\u5c06\u566a\u58f0\u4f20\u8f93\u5230\u52a8\u4f5c\u5206\u5e03\u6765\u751f\u6210\u52a8\u4f5c\uff0c\u4ea7\u751f\u5e73\u6ed1\u3001\u65f6\u95f4\u8fde\u8d2f\u7684\u52a8\u4f5c\u8f68\u8ff9\u3002\\(\\\\pi_0\\)\u5c55\u793a\u4e86\u5353\u8d8a\u7684\u901a\u7528\u6027\uff0c\u5728\u591a\u79cd\u673a\u5668\u4eba\u5f62\u6001\uff08\u5305\u62ec\u53cc\u81c2\u64cd\u4f5c\u548c\u7075\u5de7\u624b\u63a7\u5236\uff09\u4e0a\u6267\u884c\u4efb\u52a1\u3002
VLA\u6781\u5927\u5730\u53d7\u76ca\u4e8e\u9884\u8bad\u7ec3\u7684VLM\u4e3b\u5e72\u7f51\u7edc\uff0c\u8fd9\u4e9b\u7f51\u7edc\u5df2\u7ecf\u7406\u89e3\u89c6\u89c9\u573a\u666f\u548c\u8bed\u8a00\u3002\u8bad\u7ec3\u6d41\u7a0b\u901a\u5e38\u5206\u4e3a\u51e0\u4e2a\u9636\u6bb5\uff1a
VLM\u9884\u8bad\u7ec3\uff1a\u5728\u6570\u5341\u4ebf\u6765\u81ea\u4e92\u8054\u7f51\u7684\u56fe\u50cf-\u6587\u672c\u5bf9\uff08CLIP\u3001SigLIP\u3001LLaVA\u98ce\u683c\u7684\u8bad\u7ec3\uff0c\u5982\u7b2c10\u7ae0\u6240\u8ff0\uff09\u4e0a\u8bad\u7ec3\uff08\u6216\u4f7f\u7528\u73b0\u6210\u7684\uff09\u89c6\u89c9-\u8bed\u8a00\u6a21\u578b\u3002
\u673a\u5668\u4eba\u6570\u636e\u534f\u540c\u8bad\u7ec3\uff1a\u5728\u4e92\u8054\u7f51\u6570\u636e\u548c\u673a\u5668\u4eba\u793a\u8303\u6570\u636e\u7684\u6df7\u5408\u4e0a\u5fae\u8c03VLM\u3002\u4e92\u8054\u7f51\u6570\u636e\u9632\u6b62\u89c6\u89c9\u548c\u8bed\u8a00\u7406\u89e3\u7684\u707e\u96be\u6027\u9057\u5fd8\uff0c\u800c\u673a\u5668\u4eba\u6570\u636e\u6559\u6388\u52a8\u4f5c\u751f\u6210\u3002\u6df7\u5408\u6bd4\u4f8b\u5f88\u91cd\u8981\uff1a\u673a\u5668\u4eba\u6570\u636e\u8fc7\u591a\u4f1a\u964d\u4f4e\u8bed\u8a00\u7406\u89e3\uff0c\u8fc7\u5c11\u5219\u65e0\u6cd5\u5b66\u4e60\u52a8\u4f5c\u3002
\u7279\u5b9a\u4efb\u52a1\u5fae\u8c03\uff1a\u53ef\u9009\u5730\u5728\u7279\u5b9a\u4efb\u52a1\u6216\u673a\u5668\u4eba\u7684\u793a\u8303\u4e0a\u8fdb\u884c\u5fae\u8c03\uff0c\u901a\u5e38\u4f7f\u7528LoRA\uff08\u7b2c10\u7ae0\uff09\u4fdd\u6301\u53ef\u8bad\u7ec3\u53c2\u6570\u6570\u91cf\u8f83\u5c11\u3002
\u673a\u5668\u4eba\u6570\u636e\u7684\u6570\u91cf\u6bd4\u4e92\u8054\u7f51\u6570\u636e\u5c11\u6570\u4e2a\u6570\u91cf\u7ea7\u3002VLM\u53ef\u80fd\u5728\u4e0a\u6570\u5341\u4ebf\u5f20\u56fe\u50cf\u4e0a\u9884\u8bad\u7ec3\uff0c\u4f46\u6700\u5927\u7684\u673a\u5668\u4eba\u6570\u636e\u96c6\uff08Open X-Embodiment\uff09\u5728\u6240\u6709\u5f62\u6001\u4e0a\u53ea\u6709\u6570\u767e\u4e07\u5e27\u3002\u8fd9\u79cd\u6570\u636e\u7a00\u7f3a\u6027\u6b63\u662f\u4ece\u9884\u8bad\u7ec3VLM\u5f00\u59cb\u81f3\u5173\u91cd\u8981\u7684\u539f\u56e0\uff1a\u89c6\u89c9\u548c\u8bed\u8a00\u8868\u793a\u53ef\u4ee5\u8fc1\u79fb\uff0c\u53ea\u6709\u52a8\u4f5c\u6620\u5c04\u9700\u8981\u4ece\u6709\u9650\u7684\u673a\u5668\u4eba\u6570\u636e\u4e2d\u5b66\u4e60\u3002
VLA\u7684\u627f\u8bfa\u662f\u6cdb\u5316\uff1a\u6267\u884c\u8bad\u7ec3\u4e2d\u672a\u89c1\u7684\u4efb\u52a1\uff0c\u4f7f\u7528\u672a\u89c1\u8fc7\u7684\u7269\u4f53\uff0c\u5728\u672a\u89c1\u8fc7\u7684\u73af\u5883\u4e2d\uff0c\u9075\u5faa\u672a\u89c1\u8fc7\u7684\u6307\u4ee4\u3002
VLA\u6cbf\u591a\u4e2a\u8f74\u8fdb\u884c\u6cdb\u5316\uff1a
\u65b0\u9896\u7269\u4f53\uff1aVLM\u4e3b\u5e72\u7f51\u7edc\u4ece\u4e92\u8054\u7f51\u9884\u8bad\u7ec3\u4e2d\u8bc6\u522b\u7269\u4f53\u3002\u5982\u679c\u6a21\u578b\u4ece\u7f51\u7edc\u56fe\u50cf\u4e2d\u77e5\u9053\"\u87ba\u4e1d\u5200\"\u957f\u4ec0\u4e48\u6837\uff0c\u5373\u4f7f\u6ca1\u6709\u673a\u5668\u4eba\u793a\u8303\u6d89\u53ca\u87ba\u4e1d\u5200\uff0c\u5b83\u4e5f\u80fd\u64cd\u4f5c\u87ba\u4e1d\u5200\u3002
\u65b0\u9896\u6307\u4ee4\uff1a\u7ec4\u5408\u8bed\u8a00\u7406\u89e3\u4f7f\u6a21\u578b\u80fd\u591f\u9075\u5faa\u5df2\u77e5\u6982\u5ff5\u7684\u65b0\u7ec4\u5408\u3002\"\u5c06\u84dd\u8272\u65b9\u5757\u5806\u53e0\u5728\u7eff\u8272\u65b9\u5757\u4e0a\"\u5373\u4f7f\u8bad\u7ec3\u53ea\u5c55\u793a\u4e86\u5806\u53e0\u7ea2\u8272\u65b9\u5757\u4e5f\u80fd\u5de5\u4f5c\uff0c\u56e0\u4e3a\u6a21\u578b\u4ece\u8bed\u8a00\u9884\u8bad\u7ec3\u4e2d\u7406\u89e3\u4e86\u989c\u8272\u5f62\u5bb9\u8bcd\u3002
\u65b0\u9896\u73af\u5883\uff1a\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\uff0cVLA\u8de8\u89c6\u89c9\u57df\uff08\u4e0d\u540c\u7684\u684c\u5b50\u3001\u5149\u7167\u3001\u80cc\u666f\uff09\u8fc1\u79fb\uff0c\u56e0\u4e3a\u89c6\u89c9\u7f16\u7801\u5668\u5728\u591a\u6837\u5316\u7684\u7f51\u7edc\u56fe\u50cf\u4e0a\u9884\u8bad\u7ec3\u3002\u4f46\u8fd9\u6709\u5c40\u9650\u6027\uff1a\u5728\u5b9e\u9a8c\u5ba4\u8bad\u7ec3\u7684\u673a\u5668\u4eba\u53ef\u80fd\u5728\u6742\u4e71\u53a8\u623f\u4e2d\u9047\u5230\u56f0\u96be\u3002
\u65b0\u9896\u5f62\u6001\uff1a\u8fd9\u662f\u6700\u96be\u7684\u8f74\u3002\u4e0d\u540c\u673a\u5668\u4eba\u6709\u4e0d\u540c\u7684\u52a8\u4f5c\u7a7a\u95f4\uff08\u5173\u8282\u89d2\u5ea6 vs. \u672b\u7aef\u6267\u884c\u5668\u901f\u5ea6\uff09\u3001\u4e0d\u540c\u7684\u4f20\u611f\u5668\uff08\u8155\u90e8\u76f8\u673a vs. \u5934\u9876\u76f8\u673a\uff09\u548c\u4e0d\u540c\u7684\u7269\u7406\u80fd\u529b\u3002\u4e0e\u5f62\u6001\u65e0\u5173\u7684\u6a21\u578b\u5982Octo\u548c\\(\\\\pi_0\\)\u901a\u8fc7\u7075\u6d3b\u7684\u6807\u8bb0\u5316\u5668\u548c\u8de8\u591a\u79cd\u673a\u5668\u4eba\u7c7b\u578b\u7684\u9884\u8bad\u7ec3\u6765\u89e3\u51b3\u8fd9\u4e00\u95ee\u9898\u3002
\u6cdb\u5316\u80fd\u529b\u901a\u8fc7\u4fdd\u7559\u4efb\u52a1\u8fdb\u884c\u8bc4\u4f30\uff1a\u673a\u5668\u4eba\u88ab\u8981\u6c42\u6267\u884c\u4ece\u672a\u8bad\u7ec3\u8fc7\u7684\u4efb\u52a1\u3002\u5728\u65b0\u9896\u4efb\u52a1\u4e0a50-80%\u7684\u6210\u529f\u7387\u88ab\u8ba4\u4e3a\u662f\u5f3a\u52b2\u7684\u7ed3\u679c\uff0c\u800c\u5728\u5206\u5e03\u5185\u4efb\u52a1\u4e0a\u6210\u529f\u7387\u901a\u5e38>90%\u3002\u968f\u7740\u6a21\u578b\u89c4\u6a21\u6269\u5927\u548c\u673a\u5668\u4eba\u6570\u636e\u96c6\u589e\u957f\uff0c\u8fd9\u4e00\u5dee\u8ddd\u6b63\u5728\u7f29\u5c0f\u3002
\u8be5\u9886\u57df\u6b63\u671d\u7740\"\u4e00\u4e2a\u6a21\u578b\uff0c\u591a\u79cd\u673a\u5668\u4eba\"\u7684\u65b9\u5411\u53d1\u5c55\u3002\u4e0d\u518d\u4e3a\u6bcf\u4e2a\u673a\u5668\u4eba\u8bad\u7ec3\u5355\u72ec\u7684\u7b56\u7565\uff0c\u800c\u662f\u5355\u4e2aVLA\u5904\u7406\u591a\u79cd\u5f62\u6001\u3002
\u8fd9\u9700\u8981\u89e3\u51b3\u52a8\u4f5c\u7a7a\u95f4\u4e0d\u5339\u914d\u95ee\u9898\u3002\u4e00\u4e2a7\u81ea\u7531\u5ea6\u624b\u81c2\u5e26\u5e73\u884c\u5939\u722a\u67097\u4e2a\u52a8\u4f5c\u7ef4\u5ea6\u3002\u53cc\u81c2\u8bbe\u7f6e\u662f14\u4e2a\u3002\u56db\u8db3\u673a\u5668\u4eba\u670912\u4e2a\u3002\u7c7b\u4eba\u673a\u5668\u4eba\u670930\u4e2a\u4ee5\u4e0a\u3002\u52a8\u4f5c\u6807\u8bb0\u5316\u5fc5\u987b\u8db3\u591f\u7075\u6d3b\u4ee5\u5904\u7406\u6240\u6709\u8fd9\u4e9b\u3002
\u89e3\u51b3\u65b9\u6848\u5305\u62ec\uff1a
\u5171\u4eab\u4e3b\u5e72\u7f51\u7edc\u5b66\u4e60\u901a\u7528\u7684\u89c6\u89c9\u548c\u8bed\u8a00\u7406\u89e3\uff0c\u52a0\u4e0a\u901a\u7528\u7684\u64cd\u4f5c\u7b56\u7565\uff08\u4ece\u4e0a\u65b9\u63a5\u8fd1\u3001\u5bf9\u9f50\u7269\u4f53\u3001\u95ed\u5408\u5939\u722a\uff09\u3002\u7279\u5b9a\u4e8e\u5f62\u6001\u7684\u7ec4\u4ef6\u53ea\u9700\u8981\u5c06\u8fd9\u4e9b\u9ad8\u5c42\u7b56\u7565\u8f6c\u5316\u4e3a\u5177\u4f53\u7684\u7535\u673a\u547d\u4ee4\u3002
\u8bc4\u4f30VLA\u5177\u6709\u72ec\u7279\u7684\u6311\u6218\u6027\uff0c\u56e0\u4e3a\u5b83\u9700\u8981\u7269\u7406\u673a\u5668\u4eba\u5b9e\u9a8c\uff08\u6216\u9ad8\u4fdd\u771f\u4eff\u771f\uff09\u3002
SIMPLER\uff08\u673a\u5668\u4eba\u5b66\u4e60\u6a21\u62df\u64cd\u4f5c\u7b56\u7565\u8bc4\u4f30\uff09\u63d0\u4f9b\u4e86\u6807\u51c6\u5316\u7684\u4eff\u771f\u73af\u5883\uff0c\u65e0\u9700\u7269\u7406\u786c\u4ef6\u5373\u53ef\u6bd4\u8f83VLA\u6027\u80fd\u3002\u5b83\u4e0e\u73b0\u5b9e\u4e16\u754c\u7684\u6210\u529f\u7387\u76f8\u5173\u6027\u826f\u597d\uff0c\u5e76\u5b9e\u73b0\u4e86\u53ef\u590d\u73b0\u7684\u57fa\u51c6\u6d4b\u8bd5\u3002
\u73b0\u5b9e\u4e16\u754c\u8bc4\u4f30\u4ecd\u7136\u662f\u91d1\u6807\u51c6\u3002\u5178\u578b\u534f\u8bae\uff1a
Open X-Embodiment\u6570\u636e\u96c6\u548c\u57fa\u51c6\u6d4b\u8bd5\u6c47\u603b\u4e86\u6765\u81ea22\u4e2a\u673a\u6784\u3001\u8de8\u8d8a\u591a\u4e2a\u673a\u5668\u4eba\u5e73\u53f0\u7684\u673a\u5668\u4eba\u6570\u636e\u3002\u5b83\u63d0\u4f9b\u4e86\u5171\u4eab\u793a\u8303\u7684\u6807\u51c6\u683c\u5f0f\u548c\u7528\u4e8e\u8de8\u5f62\u6001\u8fc1\u79fb\u7684\u901a\u7528\u8bc4\u4f30\u5957\u4ef6\u3002
\u5b9e\u73b0\u52a8\u4f5c\u6807\u8bb0\u5316\uff1a\u5c06\u8fde\u7eed\u52a8\u4f5c\u79bb\u6563\u5316\u4e3a\u7bb1\u5e76\u91cd\u5efa\u3002\u89c2\u5bdf\u91cf\u5316\u8bef\u5dee\u968f\u7bb1\u6570\u91cf\u7684\u53d8\u5316\u3002
import jax.numpy as jnp\n\n# \u8fde\u7eed\u52a8\u4f5c\uff1a7\u4e2a\u7ef4\u5ea6\uff086\u81ea\u7531\u5ea6+\u5939\u722a\uff09\naction_true = jnp.array([0.023, -0.051, 0.012, 0.1, -0.03, 0.005, 0.8])\naction_min = jnp.array([-0.1, -0.1, -0.1, -0.5, -0.5, -0.5, 0.0])\naction_max = jnp.array([ 0.1, 0.1, 0.1, 0.5, 0.5, 0.5, 1.0])\n\nfor n_bins in [16, 64, 256, 1024]:\n # \u6807\u8bb0\u5316\uff1a\u5c06\u8fde\u7eed\u503c\u6620\u5c04\u4e3a\u7bb1\u7d22\u5f15\n normalised = (action_true - action_min) / (action_max - action_min)\n tokens = jnp.clip((normalised * n_bins).astype(int), 0, n_bins - 1)\n\n # \u53bb\u6807\u8bb0\u5316\uff1a\u5c06\u7bb1\u7d22\u5f15\u6620\u5c04\u56de\u8fde\u7eed\u503c\n reconstructed = (tokens + 0.5) / n_bins * (action_max - action_min) + action_min\n\n error = jnp.linalg.norm(action_true - reconstructed)\n print(f\"\u7bb1\u6570={n_bins:4d} \u6807\u8bb0={tokens} \u8bef\u5dee={error:.6f}\")\n \u6a21\u62df\u52a8\u4f5c\u5206\u5757\u4e0e\u5355\u6b65\u9884\u6d4b\u7684\u6bd4\u8f83\u3002\u751f\u6210\u5e73\u6ed1\u8f68\u8ff9\uff0c\u5411\u5355\u6b65\u9884\u6d4b\u6dfb\u52a0\u566a\u58f0\uff0c\u5e76\u4e0e\u5206\u5757\u9884\u6d4b\u6bd4\u8f83\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u771f\u5b9e\u5e73\u6ed1\u8f68\u8ff9\uff08\u4f8b\u5982\uff0c\u4f38\u624b\u52a8\u4f5c\uff09\nt = jnp.linspace(0, 2 * jnp.pi, 100)\ngt_x = jnp.sin(t)\ngt_y = 1 - jnp.cos(t)\n\n# \u5355\u6b65\uff1a\u6bcf\u6b21\u9884\u6d4b\u6709\u72ec\u7acb\u566a\u58f0\nrng = jax.random.PRNGKey(42)\nnoise_ss = jax.random.normal(rng, (100, 2)) * 0.05\nsingle_step = jnp.stack([gt_x, gt_y], axis=1) + noise_ss\n# \u5355\u6b65\u8bef\u5dee\u7d2f\u79ef\u6f02\u79fb\nsingle_step_cumulative = jnp.cumsum(noise_ss, axis=0) * 0.3 + jnp.stack([gt_x, gt_y], axis=1)\n\n# \u5206\u5757\uff08\u5757\u5927\u5c0f=10\uff09\uff1a\u5757\u5185\u566a\u58f0\u5173\u8054\uff0c\u66f4\u5e73\u6ed1\nchunk_size = 10\nrng2 = jax.random.PRNGKey(7)\nchunks = []\nfor i in range(0, 100, chunk_size):\n chunk_noise = jax.random.normal(jax.random.fold_in(rng2, i), (2,)) * 0.05\n chunk = jnp.stack([gt_x[i:i+chunk_size], gt_y[i:i+chunk_size]], axis=1)\n chunks.append(chunk + chunk_noise)\nchunked = jnp.concatenate(chunks, axis=0)\n\nplt.figure(figsize=(8, 4))\nplt.plot(gt_x, gt_y, \"k-\", linewidth=2, label=\"\u771f\u5b9e\u8f68\u8ff9\")\nplt.plot(single_step_cumulative[:, 0], single_step_cumulative[:, 1],\n \"r-\", alpha=0.7, label=\"\u5355\u6b65\uff08\u6f02\u79fb\uff09\")\nplt.plot(chunked[:, 0], chunked[:, 1], \"b-\", alpha=0.7, label=\"\u5206\u5757\uff08\u7a33\u5b9a\uff09\")\nplt.legend(); plt.axis(\"equal\"); plt.grid(True)\nplt.title(\"\u52a8\u4f5c\u5206\u5757 vs \u5355\u6b65\u9884\u6d4b\")\nplt.show()\n \u53ef\u89c6\u5316VLA\u52a8\u4f5c\u5206\u5e03\u5982\u4f55\u662f\u591a\u6a21\u6001\u7684\u3002\u4f7f\u7528\u7b80\u5355\u76842D\u9ad8\u65af\u6df7\u5408\u6765\u5c55\u793a\u4e3a\u4ec0\u4e48\u6269\u6563/\u6d41\u5339\u914d\u52a8\u4f5c\u5934\u4f18\u4e8e\u56de\u5f52\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u7ed5\u8fc7\u969c\u788d\u7269\u7684\u4e24\u79cd\u6709\u6548\u65b9\u5f0f\uff1a\u5de6\u8fb9\u6216\u53f3\u8fb9\nrng = jax.random.PRNGKey(0)\nk1, k2 = jax.random.split(rng)\n\nmode1 = jax.random.normal(k1, (200, 2)) * 0.15 + jnp.array([-1.0, 0.5])\nmode2 = jax.random.normal(k2, (200, 2)) * 0.15 + jnp.array([ 1.0, 0.5])\nsamples = jnp.concatenate([mode1, mode2])\n\n# \u56de\u5f52\u9884\u6d4b\u5747\u503c = \u6a21\u6001\u7684\u5747\u503c\uff08\u65e0\u6548\uff01\uff09\nmean_pred = samples.mean(axis=0)\n\nplt.figure(figsize=(6, 5))\nplt.scatter(samples[:, 0], samples[:, 1], s=5, alpha=0.5, label=\"\u771f\u5b9e\u52a8\u4f5c\u5206\u5e03\")\nplt.plot(*mean_pred, \"rx\", markersize=15, markeredgewidth=3, label=\"\u56de\u5f52\u5747\u503c\uff08\u65e0\u6548\uff01\uff09\")\nplt.plot(-1, 0.5, \"g^\", markersize=12, label=\"\u6a21\u60011\uff08\u5411\u5de6\uff09\")\nplt.plot(1, 0.5, \"b^\", markersize=12, label=\"\u6a21\u60012\uff08\u5411\u53f3\uff09\")\nplt.legend(); plt.grid(True)\nplt.title(\"\u591a\u6a21\u6001\u52a8\u4f5c\uff1a\u4e3a\u4ec0\u4e48\u56de\u5f52\u5931\u8d25\")\nplt.xlabel(\"\u52a8\u4f5c\u7ef4\u5ea61\"); plt.ylabel(\"\u52a8\u4f5c\u7ef4\u5ea62\")\nplt.show()\n \u81ea\u52a8\u9a7e\u9a76\u6c7d\u8f66\u662f\u5546\u4e1a\u4e0a\u6700\u5148\u8fdb\u7684\u81ea\u4e3b\u7cfb\u7edf\uff0c\u5c06\u611f\u77e5\u3001\u9884\u6d4b\u3001\u89c4\u5212\u548c\u63a7\u5236\u96c6\u6210\u5230\u5355\u4e2a\u8f66\u8f86\u4e2d\u3002\u672c\u7ae0\u6db5\u76d6\u81ea\u52a8\u9a7e\u9a76\u5806\u6808\u3001\u9ad8\u7cbe\u5730\u56fe\u3001\u8fd0\u52a8\u9884\u6d4b\u3001\u89c4\u5212\u3001\u7aef\u5230\u7aef\u9a7e\u9a76\u3001\u4eff\u771f\u3001\u5b89\u5168\u6807\u51c6\u548c\u81ea\u4e3b\u7b49\u7ea7\u3002
\u81ea\u52a8\u9a7e\u9a76\u6c7d\u8f66\u53ef\u4ee5\u8bf4\u662f\u6b63\u5728\u5927\u89c4\u6a21\u5c1d\u8bd5\u7684\u6700\u56f0\u96be\u7684\u673a\u5668\u4eba\u95ee\u9898\u3002\u4e0e\u5728\u53d7\u63a7\u73af\u5883\u4e2d\u8fd0\u884c\u7684\u5de5\u5382\u673a\u5668\u4eba\u4e0d\u540c\uff0c\u81ea\u52a8\u9a7e\u9a76\u6c7d\u8f66\u5fc5\u987b\u5904\u7406\u4e00\u4e2a\u5f00\u653e\u4e16\u754c\uff1a\u4e0d\u53ef\u9884\u6d4b\u7684\u4eba\u7c7b\u9a7e\u9a76\u5458\u3001\u4e71\u7a7f\u9a6c\u8def\u7684\u884c\u4eba\u3001\u4e00\u591c\u4e4b\u95f4\u51fa\u73b0\u7684\u65bd\u5de5\u533a\u57df\u4ee5\u53ca\u6bcf\u5206\u949f\u90fd\u5728\u53d8\u5316\u7684\u5929\u6c14\u3002
\u5176\u98ce\u9669\u4e5f\u5f02\u5e38\u4e4b\u9ad8\u3002\u81ea\u52a8\u9a7e\u9a76\u6c7d\u8f66\u5728\u9ad8\u901f\u516c\u8def\u4e0a\u884c\u9a76\uff0c\u5468\u56f4\u662f\u8106\u5f31\u7684\u9053\u8def\u4f7f\u7528\u8005\u3002\u5bf9\u4e8e\u5b89\u5168\u5173\u952e\u7684\u6545\u969c\uff0c\u8bef\u5dee\u5bb9\u9650\u51e0\u4e4e\u4e3a\u96f6\u3002
\u611f\u77e5\uff08\u672c\u7ae0\u6587\u4ef61\u4e2d\u5df2\u4ecb\u7ecd\uff09\u5c06\u539f\u59cb\u4f20\u611f\u5668\u6570\u636e\u5904\u7406\u4e3a\u7ed3\u6784\u5316\u7684\u573a\u666f\u8868\u793a\uff1a\u5e26\u67093D\u4f4d\u7f6e\u3001\u901f\u5ea6\u548c\u7c7b\u522b\u6807\u7b7e\u7684\u68c0\u6d4b\u7269\u4f53\uff1b\u8f66\u9053\u6807\u7ebf\uff1b\u4ea4\u901a\u4fe1\u53f7\u706f\uff1b\u53ef\u884c\u9a76\u8868\u9762\u8fb9\u754c\u3002
\u9884\u6d4b\u9884\u6d4b\u5176\u4ed6\u4ea4\u901a\u53c2\u4e0e\u8005\uff08\u8f66\u8f86\u3001\u884c\u4eba\u3001\u9a91\u884c\u8005\uff09\u672a\u6765\u5c06\u5982\u4f55\u79fb\u52a8\u3002\u7ed9\u5b9a\u573a\u666f\u7684\u5f53\u524d\u72b6\u6001\uff0c\u9884\u6d4b\u6a21\u5757\u4e3a\u6bcf\u4e2a\u4ea4\u901a\u53c2\u4e0e\u8005\u8f93\u51fa\u672a\u6765\u4e00\u6bb5\u65f6\u95f4\uff08\u901a\u5e383-8\u79d2\uff09\u7684\u8f68\u8ff9\u3002
\u89c4\u5212\u51b3\u5b9a\u4e3b\u8f66\u5e94\u8be5\u505a\u4ec0\u4e48\uff1a\u8d70\u54ea\u6761\u8def\u5f84\u3001\u4f55\u65f6\u53d8\u9053\u3001\u4f55\u65f6\u8ba9\u884c\u3001\u4f55\u65f6\u52a0\u901f\u6216\u5239\u8f66\u3002\u5b83\u63a5\u6536\u9884\u6d4b\u7684\u573a\u666f\uff0c\u4e3a\u4e3b\u8f66\u751f\u6210\u4e00\u6761\u5b89\u5168\u3001\u8212\u9002\u4e14\u5411\u76ee\u7684\u5730\u524d\u8fdb\u7684\u8f68\u8ff9\u3002
\u63a7\u5236\u5c06\u89c4\u5212\u7684\u8f68\u8ff9\u8f6c\u5316\u4e3a\u6267\u884c\u5668\u547d\u4ee4\uff1a\u8f6c\u5411\u89d2\u3001\u6cb9\u95e8\u548c\u5239\u8f66\u3002\u8fd9\u662f\u6700\u5e95\u5c42\uff0c\u5c06\u62bd\u8c61\u8f68\u8ff9\u8f6c\u5316\u4e3a\u7269\u7406\u8fd0\u52a8\u3002
\u6a21\u5757\u5316\u8bbe\u8ba1\u6709\u660e\u786e\u7684\u5de5\u7a0b\u4f18\u52bf\uff1a\u6bcf\u4e2a\u6a21\u5757\u53ef\u4ee5\u72ec\u7acb\u5f00\u53d1\u3001\u6d4b\u8bd5\u548c\u6539\u8fdb\u3002\u4f46\u5b83\u4e5f\u6709\u5f31\u70b9\uff1a\u8bef\u5dee\u5411\u4e0b\u6e38\u4f20\u64ad\uff08\u6f0f\u68c0\u5bf9\u89c4\u5212\u5668\u662f\u4e0d\u53ef\u89c1\u7684\uff09\uff0c\u5e76\u4e14\u4fe1\u606f\u5728\u6bcf\u4e2a\u63a5\u53e3\u5904\u4e22\u5931\uff08\u89c4\u5212\u5668\u770b\u5230\u7684\u662f\u8fb9\u754c\u6846\uff0c\u800c\u4e0d\u662f\u4ea7\u751f\u5b83\u4eec\u7684\u4e30\u5bcc\u4f20\u611f\u5668\u6570\u636e\uff09\u3002
\u9ad8\u7cbe\uff08HD\uff09\u5730\u56fe\u662f\u8be6\u7ec6\u3001\u5398\u7c73\u7ea7\u7cbe\u5ea6\u7684\u6570\u5b57\u5730\u56fe\uff0c\u7f16\u7801\u9053\u8def\u7ed3\u6784\uff1a\u8f66\u9053\u8fb9\u754c\u3001\u8f66\u9053\u8fde\u901a\u6027\uff08\u54ea\u4e2a\u8f66\u9053\u5728\u4ea4\u53c9\u53e3\u8fde\u63a5\u5230\u54ea\u4e2a\uff09\u3001\u4ea4\u901a\u6807\u5fd7\u4f4d\u7f6e\u3001\u9650\u901f\u3001\u4eba\u884c\u6a2a\u9053\u4f4d\u7f6e\u548c\u8def\u9762\u9ad8\u7a0b\u3002
\u9ad8\u7cbe\u5730\u56fe\u4e3a\u9a7e\u9a76\u4efb\u52a1\u63d0\u4f9b\u4e86\u5f3a\u6709\u529b\u7684\u5148\u9a8c\u3002\u611f\u77e5\u6a21\u5757\u4e0d\u9700\u8981\u6bcf\u5e27\u4ece\u5934\u53d1\u73b0\u8f66\u9053\u8fb9\u754c\uff1b\u5b83\u53ea\u9700\u8981\u5c06\u8f66\u8f86\u5728\u5730\u56fe\u4e2d\u8fdb\u884c\u5b9a\u4f4d\uff0c\u5e76\u9a8c\u8bc1\u73b0\u5b9e\u662f\u5426\u4e0e\u5b58\u50a8\u7684\u7ed3\u6784\u5339\u914d\u3002\u8fd9\u6781\u5927\u5730\u7b80\u5316\u4e86\u89c4\u5212\u3002
\u6784\u5efa\u9ad8\u7cbe\u5730\u56fe\u9700\u8981\u914d\u5907\u9ad8\u7aefLiDAR\u3001\u76f8\u673a\u548cRTK-GPS\u7684\u4e13\u4e1a\u6d4b\u91cf\u8f66\u8f86\u3002\u5730\u56fe\u5fc5\u987b\u968f\u7740\u9053\u8def\u53d8\u5316\u800c\u7ef4\u62a4\u548c\u66f4\u65b0\u3002\u8fd9\u5f88\u6602\u8d35\uff0c\u4e14\u4e0d\u5bb9\u6613\u6269\u5c55\u5230\u5730\u7403\u4e0a\u7684\u6bcf\u6761\u9053\u8def\u3002
\u65e0\u56fe\u9a7e\u9a76\uff08\u4e5f\u79f0\u4e3a\"\u5728\u7ebf\u5730\u56fe\u6784\u5efa\"\uff09\u65e8\u5728\u6d88\u9664\u5bf9\u9884\u5efa\u9ad8\u7cbe\u5730\u56fe\u7684\u4f9d\u8d56\u3002\u8f66\u8f86\u4ece\u4f20\u611f\u5668\u5b9e\u65f6\u6784\u5efa\u5c40\u90e8\u5730\u56fe\u3002\u50cfMapTR\u548cMapTRv2\u8fd9\u6837\u7684\u6a21\u578b\u4f7f\u7528transformer\u67b6\u6784\u76f4\u63a5\u4ece\u76f8\u673a\u56fe\u50cf\u9884\u6d4b\u77e2\u91cf\u5316\u5730\u56fe\u5143\u7d20\uff08\u8f66\u9053\u4e2d\u5fc3\u7ebf\u3001\u9053\u8def\u8fb9\u754c\u3001\u4eba\u884c\u6a2a\u9053\uff09\uff0c\u5c06\u591a\u6bb5\u7ebf\u8f93\u51fa\u4e3a\u6709\u5e8f\u70b9\u5e8f\u5217\u3002
\u65e0\u56fe\u65b9\u6cd5\u7528\u5730\u56fe\u7cbe\u5ea6\u6362\u53d6\u53ef\u6269\u5c55\u6027\uff1a\u4efb\u4f55\u6c7d\u8f66\u80fd\u884c\u9a76\u7684\u9053\u8def\uff0c\u5b83\u90fd\u80fd\u5efa\u56fe\u3002\u4f46\u5b83\u8981\u6c42\u611f\u77e5\u7cfb\u7edf\u8db3\u591f\u9c81\u68d2\uff0c\u80fd\u591f\u5b9e\u65f6\u68c0\u6d4b\u6240\u6709\u76f8\u5173\u7684\u9053\u8def\u7ed3\u6784\uff0c\u5305\u62ec\u5728\u590d\u6742\u4ea4\u53c9\u53e3\u3001\u9ad8\u901f\u516c\u8def\u531d\u9053\u548c\u65bd\u5de5\u533a\u57df\u4e2d\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u8bb8\u591a\u7cfb\u7edf\u91c7\u7528\u6df7\u5408\u65b9\u6cd5\uff1a\u8f7b\u91cf\u7ea7\u5730\u56fe\u5305\u542b\u7c97\u7565\u7684\u9053\u8def\u62d3\u6251\uff08\u6765\u81ea\u73b0\u6709\u5730\u56fe\u63d0\u4f9b\u5546\uff09\uff0c\u5e76\u901a\u8fc7\u8f66\u8f86\u7684\u4f20\u611f\u5668\u5b9e\u65f6\u4e30\u5bcc\u3002
\u9884\u6d4b\u5176\u4ed6\u9053\u8def\u4f7f\u7528\u8005\u5c06\u53bb\u54ea\u91cc\u662f\u81ea\u52a8\u9a7e\u9a76\u4e2d\u6700\u56f0\u96be\u7684\u5b50\u95ee\u9898\u4e4b\u4e00\u3002\u4eba\u7c7b\u4e0d\u53ef\u9884\u6d4b\uff0c\u610f\u56fe\u662f\u9690\u85cf\u7684\uff0c\u672a\u6765\u53ef\u80fd\u6027\u7684\u7a7a\u95f4\u8fc5\u901f\u5206\u53c9\u3002
\u9884\u6d4b\u6a21\u578b\u7684\u8f93\u5165\u662f\u573a\u666f\u4e0a\u4e0b\u6587\uff1a\u6240\u6709\u68c0\u6d4b\u5230\u7684\u53c2\u4e0e\u8005\u5728\u8fd1\u671f\u8fc7\u53bb\uff08\u901a\u5e381-2\u79d2\u7684\u5386\u53f2\uff09\u7684\u4f4d\u7f6e\u548c\u901f\u5ea6\uff0c\u52a0\u4e0a\u9759\u6001\u4e0a\u4e0b\u6587\uff08\u8f66\u9053\u51e0\u4f55\u3001\u4ea4\u901a\u4fe1\u53f7\u3001\u9053\u8def\u8fb9\u754c\uff09\u3002
\u8f93\u51fa\u662f\u6bcf\u4e2a\u53c2\u4e0e\u8005\u7684\u4e00\u7ec4\u9884\u6d4b\u8f68\u8ff9\uff0c\u901a\u5e38\u8986\u76d6\u672a\u67653-8\u79d2\u3002\u7531\u4e8e\u672a\u6765\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u597d\u7684\u9884\u6d4b\u6a21\u578b\u8f93\u51fa\u591a\u6761\u53ef\u80fd\u7684\u8f68\u8ff9\u53ca\u5176\u76f8\u5173\u6982\u7387\uff0c\u800c\u4e0d\u662f\u5355\u4e00\u7684\u70b9\u4f30\u8ba1\u3002
\u8f68\u8ff9\u9884\u6d4b\u4f5c\u4e3a\u4e00\u4e2a\u56de\u5f52\u95ee\u9898\uff1a\u9884\u6d4b\u6bcf\u4e2a\u53c2\u4e0e\u8005\u5728\u79bb\u6563\u672a\u6765\u65f6\u95f4\u6b65\u7684\\((x, y)\\)\u5750\u6807\u3002\u635f\u5931\u901a\u5e38\u662f\\(K\\)\u6761\u9884\u6d4b\u8f68\u8ff9\u4e0a\u7684\u6700\u5c0f\u5e73\u5747\u4f4d\u79fb\u8bef\u5dee\uff08minADE\uff09\uff1a
\u8fd9\u662f\u4e00\u4e2a\"\u6700\u4f73\\(K\\)\u4e2a\"\u6307\u6807\uff1a\u5982\u679c\u6a21\u578b\u7684\\(K\\)\u4e2a\u9884\u6d4b\u4e2d\u6709\u4e00\u4e2a\u63a5\u8fd1\u771f\u5b9e\u503c\uff0c\u6a21\u578b\u5c31\u5f97\u5206\u3002\u8fd9\u9f13\u52b1\u591a\u6837\u5316\u7684\u591a\u6a21\u6001\u9884\u6d4b\u3002
\u793e\u4f1a\u529b\u6a21\u578b\u5c06\u884c\u4eba\u884c\u4e3a\u5efa\u6a21\u4e3a\u52a8\u529b\u7cfb\u7edf\uff0c\u5176\u4e2d\u6bcf\u4e2a\u4eba\u53d7\u5230\u5438\u5f15\u529b\uff08\u671d\u5411\u76ee\u6807\uff09\u548c\u6392\u65a5\u529b\uff08\u8fdc\u79bb\u5176\u4ed6\u884c\u4eba\u548c\u969c\u788d\u7269\uff09\u3002\u884c\u4eba\\(i\\)\u7684\u52a0\u901f\u5ea6\u4e3a\uff1a
\u8fd9\u662f\u4e00\u4e2a\u4e0e\u672c\u7ae0\u6587\u4ef62\u4e2d\u7684\u673a\u5668\u4eba\u52a8\u529b\u5b66\u65b9\u7a0b\u7c7b\u4f3c\u7684\u5fae\u5206\u65b9\u7a0b\u7ec4\u3002\u8be5\u6a21\u578b\u4f18\u96c5\u4f46\u4f9d\u8d56\u4e8e\u624b\u5de5\u8c03\u8c10\u7684\u529b\u53c2\u6570\uff0c\u5e76\u4e14\u5728\u590d\u6742\u591a\u667a\u80fd\u4f53\u4ea4\u4e92\u4e2d\u8868\u73b0\u4e0d\u4f73\u3002
\u56fe\u795e\u7ecf\u7f51\u7edc\uff08GNN\uff09\u7528\u4e8e\u9884\u6d4b\u65f6\u5c06\u573a\u666f\u5efa\u6a21\u4e3a\u56fe\uff1a\u6bcf\u4e2a\u53c2\u4e0e\u8005\u662f\u4e00\u4e2a\u8282\u70b9\uff0c\u8fb9\u8868\u793a\u7a7a\u95f4\u5173\u7cfb\uff08\u90bb\u8fd1\u5ea6\u3001\u5171\u4eab\u8f66\u9053\uff09\u3002\u8282\u70b9\u4e4b\u95f4\u7684\u6d88\u606f\u4f20\u9012\u6355\u83b7\u4ea4\u4e92\uff1a\"\u8fd9\u8f86\u8f66\u6b63\u5728\u7ed9\u90a3\u4e2a\u884c\u4eba\u8ba9\u884c\"\u6216\"\u8fd9\u4e24\u8f86\u8f66\u6b63\u5728\u6c47\u5165\u540c\u4e00\u6761\u8f66\u9053\u3002\"
\u73b0\u4ee3\u9884\u6d4b\u67b6\u6784\uff08\u4f8b\u5982MTR\u3001QCNet\uff09\u4f7f\u7528\u57fa\u4e8etransformer\u7684\u6a21\u578b\uff0c\u8054\u5408\u63a8\u7406\u53c2\u4e0e\u8005\u5386\u53f2\u3001\u5730\u56fe\u4e0a\u4e0b\u6587\u548c\u53c2\u4e0e\u8005\u4e4b\u95f4\u7684\u4ea4\u4e92\u3002\u53c2\u4e0e\u8005\u901a\u8fc7\u4ea4\u53c9\u6ce8\u610f\u529b\u5173\u6ce8\u76f8\u5173\u7684\u5730\u56fe\u7279\u5f81\uff08\u5f53\u524d\u8f66\u9053\u3001\u5373\u5c06\u5230\u6765\u7684\u4ea4\u53c9\u53e3\uff09\u548c\u5176\u4ed6\u53c2\u4e0e\u8005\uff08\u524d\u8f66\u3001\u4eba\u884c\u6a2a\u9053\u4e0a\u7684\u884c\u4eba\uff09\u3002\u8f93\u51fa\u662f\u4e00\u7ec4\u901a\u8fc7\u81ea\u56de\u5f52\u751f\u6210\u6216\u6df7\u5408\u6a21\u578b\u4ea7\u751f\u7684\u8f68\u8ff9\u5047\u8bbe\u3002
\u76ee\u6807\u6761\u4ef6\u9884\u6d4b\u9996\u5148\u9884\u6d4b\u53c2\u4e0e\u8005\u53ef\u80fd\u53bb\u54ea\u91cc\uff08\u4e00\u7ec4\u5019\u9009\u76ee\u6807\u70b9\uff0c\u5982\u8f66\u9053\u7aef\u70b9\u6216\u4ea4\u53c9\u53e3\u51fa\u53e3\uff09\uff0c\u7136\u540e\u9884\u6d4b\u5230\u8fbe\u6bcf\u4e2a\u76ee\u6807\u7684\u8f68\u8ff9\u3002\u8fd9\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\"\u53bb\u54ea\u91cc\"\uff08\u79bb\u6563\u7684\u3001\u53ef\u7ba1\u7406\u7684\uff09\u548c\"\u600e\u4e48\u53bb\"\uff08\u7ed9\u5b9a\u76ee\u6807\u7684\u8fde\u7eed\u8def\u5f84\uff09\uff0c\u4f7f\u591a\u6a21\u6001\u9884\u6d4b\u95ee\u9898\u66f4\u52a0\u53ef\u89e3\u3002
\u7ed9\u5b9a\u9884\u6d4b\u7684\u573a\u666f\uff0c\u89c4\u5212\u5668\u5fc5\u987b\u4e3a\u4e3b\u8f66\u751f\u6210\u4e00\u6761\u8f68\u8ff9\u3002\u8fd9\u662f\u4e00\u4e2a\u7ea6\u675f\u4f18\u5316\u95ee\u9898\uff1a\u627e\u5230\u4e00\u6761\u5b89\u5168\u3001\u8212\u9002\u3001\u9ad8\u6548\u4e14\u5408\u6cd5\u7684\u8f68\u8ff9\u3002
\u57fa\u4e8e\u89c4\u5219\u7684\u89c4\u5212\u5668\u5c06\u9a7e\u9a76\u884c\u4e3a\u7f16\u7801\u4e3a\u4e00\u7ec4if-then\u89c4\u5219\uff1a\"\u5982\u679c\u884c\u4eba\u5728\u4eba\u884c\u6a2a\u9053\u4e0a\uff0c\u8ba9\u884c\"\u3001\"\u5982\u679c\u4e0e\u524d\u8f66\u8ddd\u79bb\u5c0f\u4e8e2\u79d2\uff0c\u4e0d\u53d8\u9053\"\u3001\"\u5982\u679c\u63a5\u8fd1\u7ea2\u706f\uff0c\u51cf\u901f\u505c\u5728\u505c\u6b62\u7ebf\u5904\u3002\"\u8fd9\u4e9b\u89c4\u5219\u662f\u53ef\u89e3\u91ca\u548c\u53ef\u5ba1\u8ba1\u7684\uff0c\u4f46\u5bf9\u4e8e\u590d\u6742\u573a\u666f\uff08\u6570\u5343\u6761\u89c4\u5219\u3001\u8bb8\u591a\u8fb9\u7f18\u60c5\u51b5\u3001\u89c4\u5219\u95f4\u7684\u4ea4\u4e92\uff09\uff0c\u5b83\u4eec\u53d8\u5f97\u96be\u4ee5\u7ba1\u7406\u3002
\u57fa\u4e8e\u4f18\u5316\u7684\u89c4\u5212\u5668\u5c06\u9a7e\u9a76\u5f62\u5f0f\u5316\u4e3a\u8f68\u8ff9\u4f18\u5316\u3002\u4e3b\u8f66\u8f68\u8ff9\u88ab\u53c2\u6570\u5316\uff08\u4f8b\u5982\uff0c\u4f5c\u4e3a\u672a\u6765\u65f6\u95f4\u6b65\u7684\\((x, y, \\\\theta, v)\\)\u72b6\u6001\u5e8f\u5217\uff09\uff0c\u5e76\u6700\u5c0f\u5316\u4e00\u4e2a\u76ee\u6807\u51fd\u6570\uff1a
\u8fdb\u5ea6\u9879\u60e9\u7f5a\u504f\u79bb\u671f\u671b\u8def\u7ebf\u3002\u8212\u9002\u9879\u60e9\u7f5a\u9ad8\u6a2a\u5411\u52a0\u901f\u5ea6\u3001\u52a0\u52a0\u901f\u5ea6\uff08\u52a0\u901f\u5ea6\u7684\u5bfc\u6570\uff09\u548c\u7a81\u7136\u8f6c\u5411\uff0c\u56e0\u4e3a\u4e58\u5ba2\u80fd\u611f\u53d7\u5230\u8fd9\u4e9b\u3002\u5b89\u5168\u9879\u60e9\u7f5a\u4e0e\u5176\u4ed6\u4ea4\u901a\u53c2\u4e0e\u8005\u7684\u63a5\u8fd1\u7a0b\u5ea6\uff0c\u4f7f\u7528\u9884\u6d4b\u8f68\u8ff9\u8bc4\u4f30\u78b0\u649e\u98ce\u9669\u3002
\u8fd9\u662f\u7ea6\u675f\u4f18\u5316\uff08\u7b2c3\u7ae0\uff09\uff1a\u5728\u4e0d\u7b49\u5f0f\u7ea6\u675f\u4e0b\u6700\u5c0f\u5316\u4ee3\u4ef7\u51fd\u6570\u3002\u6743\u91cd\\(w_1, w_2, w_3\\)\u6743\u8861\u7ade\u4e89\u76ee\u6807\uff08\u6fc0\u8fdb\u9a7e\u9a76\u66f4\u5feb\u4f46\u66f4\u4e0d\u8212\u9002\u4e14\u66f4\u4e0d\u5b89\u5168\uff09\u3002
\u57fa\u4e8e\u5b66\u4e60\u7684\u89c4\u5212\u5668\u4f7f\u7528\u5728\u4eba\u7c7b\u9a7e\u9a76\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\u795e\u7ecf\u7f51\u7edc\u751f\u6210\u8f68\u8ff9\u3002\u6a21\u578b\u89c2\u5bdf\u573a\u666f\u5e76\u76f4\u63a5\u8f93\u51fa\u89c4\u5212\u7684\u8f68\u8ff9\uff0c\u4ece\u4e13\u5bb6\u4eba\u7c7b\u9a7e\u9a76\u793a\u4f8b\u4e2d\u9690\u5f0f\u5b66\u4e60\u590d\u6742\u7684\u6743\u8861\u3002
\u4f18\u52bf\u5728\u4e8e\u4eba\u7c7b\u9a7e\u9a76\u884c\u4e3a\u88ab\u6574\u4f53\u6355\u83b7\uff0c\u5305\u62ec\u90a3\u4e9b\u5fae\u5999\u4e14\u96be\u4ee5\u5f62\u5f0f\u5316\u7684\u65b9\u9762\uff1a\u4f55\u65f6\u6fc0\u8fdb\u5730\u5408\u6d41\u3001\u4f55\u65f6\u5728\u4ea4\u53c9\u53e3\u524d\u5fae\u5fae\u524d\u79fb\u3001\u7ed9\u9a91\u884c\u8005\u7559\u51fa\u591a\u5c11\u7a7a\u95f4\u3002\u7f3a\u70b9\u662f\u6765\u81ea\u6a21\u4eff\u5b66\u4e60\uff08\u6587\u4ef62\uff09\u7684\u76f8\u540c\u5206\u5e03\u504f\u79fb\u95ee\u9898\uff1a\u6a21\u578b\u5728\u8bad\u7ec3\u6570\u636e\u4e2d\u672a\u5145\u5206\u4ee3\u8868\u7684\u60c5\u51b5\u4e0b\u53ef\u80fd\u8868\u73b0\u4e0d\u53ef\u9884\u6d4b\u3002
\u7aef\u5230\u7aef\u9a7e\u9a76\u5b8c\u5168\u6d88\u9664\u4e86\u6a21\u5757\u8fb9\u754c\u3002\u5355\u4e2a\u795e\u7ecf\u7f51\u7edc\u63a5\u6536\u539f\u59cb\u4f20\u611f\u5668\u8f93\u5165\uff08\u76f8\u673a\u56fe\u50cf\u3001LiDAR\u70b9\u4e91\uff09\u5e76\u76f4\u63a5\u8f93\u51fa\u9a7e\u9a76\u547d\u4ee4\uff08\u8f6c\u5411\u3001\u6cb9\u95e8\u3001\u5239\u8f66\uff09\u6216\u89c4\u5212\u8f68\u8ff9\u3002\u6ca1\u6709\u72ec\u7acb\u7684\u611f\u77e5\u3001\u9884\u6d4b\u6216\u89c4\u5212\u6a21\u5757\u3002
\u5176\u5438\u5f15\u529b\u5728\u4e8e\u6574\u4e2a\u7cfb\u7edf\u9488\u5bf9\u6700\u7ec8\u4efb\u52a1\uff08\u5b89\u5168\u9a7e\u9a76\uff09\u8fdb\u884c\u8054\u5408\u4f18\u5316\uff0c\u56e0\u6b64\u6ca1\u6709\u4fe1\u606f\u5728\u6a21\u5757\u8fb9\u754c\u4e22\u5931\u3002\u611f\u77e5\u6a21\u5757\u5b66\u4e60\u7cbe\u786e\u63d0\u53d6\u89c4\u5212\u5668\u6240\u9700\u7684\u7279\u5f81\uff0c\u800c\u4e0d\u662f\u901a\u7528\u7684\u76ee\u6807\u68c0\u6d4b\u7ed3\u679c\uff0c\u540e\u8005\u53ef\u80fd\u4e0d\u6355\u83b7\u4efb\u52a1\u76f8\u5173\u7684\u7ec6\u8282\u3002
UniAD\uff08\u7edf\u4e00\u81ea\u52a8\u9a7e\u9a76\uff09\u662f\u4e00\u4e2a\u91cc\u7a0b\u7891\u5f0f\u7684\u7aef\u5230\u7aef\u67b6\u6784\u3002\u5b83\u901a\u8fc7BEV\u7f16\u7801\u5668\u5904\u7406\u591a\u76f8\u673a\u56fe\u50cf\uff0c\u7136\u540e\u5e94\u7528\u4e00\u7cfb\u5217\u57fa\u4e8etransformer\u7684\u6a21\u5757\uff1a\u8ddf\u8e2a\u3001\u5728\u7ebf\u5efa\u56fe\u3001\u8fd0\u52a8\u9884\u6d4b\u3001\u5360\u636e\u9884\u6d4b\u548c\u89c4\u5212\u3002\u867d\u7136\u5b83\u6709\u5185\u90e8\u6a21\u5757\uff0c\u4f46\u5b83\u4eec\u90fd\u662f\u53ef\u5fae\u7684\uff0c\u5e76\u7aef\u5230\u7aef\u8054\u5408\u8bad\u7ec3\uff0c\u89c4\u5212\u635f\u5931\u901a\u8fc7\u6574\u4e2a\u7f51\u7edc\u53cd\u5411\u4f20\u64ad\u3002
UniAD\u4e2d\u7684\u89c4\u5212\u6a21\u5757\u901a\u8fc7\u5173\u6ce8\u9884\u6d4b\u7684BEV\u7279\u5f81\u3001\u9884\u6d4b\u7684\u53c2\u4e0e\u8005\u8f68\u8ff9\u548c\u9884\u6d4b\u7684\u5360\u636e\u6765\u751f\u6210\u672a\u6765\u4e3b\u8f66\u8def\u5f84\u70b9\u3002\u8fd9\u5c31\u662f\u591a\u5143\u94fe\u5f0f\u6cd5\u5219\uff08\u7b2c3\u7ae0\uff09\u7684\u5b9e\u9645\u5e94\u7528\uff1a\u68af\u5ea6\u4ece\u89c4\u5212\u635f\u5931\u4e00\u76f4\u6d41\u56de\u56fe\u50cf\u7f16\u7801\u5668\uff0c\u544a\u8bc9\u611f\u77e5\u7279\u5f81\u5982\u4f55\u5bf9\u89c4\u5212\u66f4\u6709\u7528\u3002
\u66f4\u8fd1\u671f\u7aef\u5230\u7aef\u65b9\u6cd5\u4f7f\u7528VLA\u98ce\u683c\u7684\u67b6\u6784\uff08\u672c\u7ae0\u6587\u4ef63\uff09\u3002\u50cfDriveVLM\u8fd9\u6837\u7684\u6a21\u578b\u63a5\u6536\u76f8\u673a\u56fe\u50cf\u548c\u5bfc\u822a\u6307\u4ee4\uff08\u6216\u8def\u7ebf\uff09\uff0c\u5e76\u4f7f\u7528VLM\u4e3b\u5e72\u7f51\u7edc\u4ea7\u751f\u9a7e\u9a76\u52a8\u4f5c\u3002\u8fd9\u5e26\u6765\u4e86\u5927\u89c4\u6a21\u9884\u8bad\u7ec3\uff08\u89c6\u89c9\u7406\u89e3\u3001\u63a8\u7406\uff09\u7684\u597d\u5904\uff0c\u76f4\u63a5\u878d\u5165\u9a7e\u9a76\u5806\u6808\u3002
\u7aef\u5230\u7aef\u9a7e\u9a76\u4e2d\u7684\u5f20\u529b\u662f\u53ef\u89e3\u91ca\u6027\u3002\u6a21\u5757\u5316\u7cfb\u7edf\u53ef\u4ee5\u62a5\u544a\"\u6211\u68c0\u6d4b\u5230\u884c\u4eba\u5728(x,y)\u5904\uff0c\u9884\u6d4b\u4ed6\u4eec\u4f1a\u6a2a\u7a7f\"\u2014\u2014\u6545\u969c\u6a21\u5f0f\u662f\u53ef\u8bca\u65ad\u7684\u3002\u7aef\u5230\u7aef\u7cfb\u7edf\u662f\u4e00\u4e2a\u4ea7\u751f\u8f6c\u5411\u89d2\u7684\u9ed1\u76d2\u3002\u5f53\u5b83\u5931\u8d25\u65f6\uff0c\u8bca\u65ad\u539f\u56e0\u5f88\u56f0\u96be\uff0c\u8fd9\u5bf9\u5b89\u5168\u8ba4\u8bc1\u662f\u4e00\u4e2a\u4e25\u91cd\u95ee\u9898\u3002
\u4e16\u754c\u6a21\u578b\u5b66\u4e60\u5728\u7ed9\u5b9a\u5f53\u524d\u72b6\u6001\u548c\u4e3b\u8f66\u52a8\u4f5c\u7684\u60c5\u51b5\u4e0b\u9884\u6d4b\u9a7e\u9a76\u573a\u666f\u7684\u672a\u6765\u72b6\u6001\uff1a\\(p(s_{t+1} \\\\mid s_t, a_t)\\)\uff08\u5982\u7b2c10\u7ae0\u6240\u8ff0\uff09\u3002\u5728\u9a7e\u9a76\u4e2d\uff0c\u8fd9\u610f\u5473\u7740\u751f\u6210\u903c\u771f\u7684\u672a\u6765\u5e27\u6216BEV\u5e03\u5c40\uff1a\"\u5982\u679c\u6211\u52a0\u901f\u5e76\u5de6\u8f6c\uff0c3\u79d2\u540e\u7684\u573a\u666f\u4f1a\u662f\u8fd9\u6837\u3002\"
\u4e16\u754c\u6a21\u578b\u4e3a\u81ea\u52a8\u9a7e\u9a76\u63d0\u4f9b\u4e86\u4e24\u79cd\u5f3a\u5927\u80fd\u529b\uff1a
\u57fa\u4e8e\u60f3\u8c61\u7684\u89c4\u5212\uff1a\u89c4\u5212\u5668\u4e0d\u662f\u5148\u6267\u884c\u4e00\u4e2a\u52a8\u4f5c\u518d\u770b\u7ed3\u679c\uff0c\u800c\u662f\u53ef\u4ee5\u901a\u8fc7\u4e16\u754c\u6a21\u578b\"\u60f3\u8c61\"\u591a\u6761\u5019\u9009\u8f68\u8ff9\uff0c\u8bc4\u4f30\u6bcf\u6761\u7684\u5b89\u5168\u6027\u548c\u8212\u9002\u6027\uff0c\u7136\u540e\u9009\u62e9\u6700\u4f73\u7684\u4e00\u6761\u3002\u8fd9\u662f\u57fa\u4e8e\u6a21\u578b\u7684RL\uff08\u672c\u7ae0\u6587\u4ef62\u4e2d\u4ecb\u7ecd\uff09\u5e94\u7528\u4e8e\u9a7e\u9a76\u3002
\u5b66\u4e60\u578b\u4eff\u771f\uff1a\u5728\u771f\u5b9e\u9a7e\u9a76\u6570\u636e\u4e0a\u8bad\u7ec3\u7684\u4e16\u754c\u6a21\u578b\u5b9e\u9645\u4e0a\u662f\u4e00\u4e2a\u6570\u636e\u9a71\u52a8\u7684\u4eff\u771f\u5668\u3002\u5b83\u751f\u6210\u903c\u771f\u7684\u573a\u666f\uff08\u5305\u62ec\u7f55\u89c1\u7684\u8fb9\u7f18\u60c5\u51b5\uff09\uff0c\u65e0\u9700\u624b\u5de5\u6784\u5efa\u4eff\u771f\u5668\u7684\u5de5\u4f5c\u3002\u5173\u952e\u662f\uff0c\u5b83\u6355\u83b7\u4e86\u771f\u5b9e\u9a7e\u9a76\u7684\u7edf\u8ba1\u6a21\u5f0f\uff1a\u5176\u4ed6\u9a7e\u9a76\u5458\u5b9e\u9645\u5982\u4f55\u8868\u73b0\u3001\u5149\u7167\u5982\u4f55\u53d8\u5316\u3001\u96e8\u6c34\u5982\u4f55\u5f71\u54cd\u53ef\u89c1\u5ea6\u3002
GAIA-1\uff08Wayve\uff09\u662f\u4e00\u4e2a\u7528\u4e8e\u9a7e\u9a76\u7684\u751f\u6210\u5f0f\u4e16\u754c\u6a21\u578b\u3002\u7ed9\u5b9a\u8fc7\u53bb\u76f8\u673a\u5e27\u548c\u4e3b\u8f66\u52a8\u4f5c\u7684\u5e8f\u5217\uff0c\u5b83\u81ea\u56de\u5f52\u5730\u751f\u6210\u672a\u6765\u89c6\u9891\u5e27\u3002\u5b83\u4f7f\u7528\u4ee5\u52a8\u4f5c\u4e3a\u6761\u4ef6\u7684\u89c6\u9891\u6269\u6563\u67b6\u6784\u3002\u6a21\u578b\u5b66\u4e60\u751f\u6210\u5408\u7406\u7684\u672a\u6765\uff1a\u9075\u5b88\u4ea4\u901a\u89c4\u5219\u7684\u8f66\u8f86\u3001\u5728\u4eba\u884c\u9053\u4e0a\u884c\u8d70\u7684\u884c\u4eba\u4ee5\u53ca\u6b63\u786e\u53d8\u5316\u7684\u4ea4\u901a\u4fe1\u53f7\u706f\u2014\u2014\u90fd\u4ece\u8bad\u7ec3\u6570\u636e\u4e2d\u6d8c\u73b0\uff0c\u800c\u975e\u7f16\u7a0b\u89c4\u5219\u3002
DriveDreamer\u548cGenAD\u91c7\u53d6\u7c7b\u4f3c\u65b9\u6cd5\uff0c\u4f46\u5728BEV\u7a7a\u95f4\u800c\u975e\u50cf\u7d20\u7a7a\u95f4\u4e2d\u64cd\u4f5c\u3002\u9884\u6d4b\u672a\u6765BEV\u5e03\u5c40\u6bd4\u751f\u6210\u5b8c\u6574\u89c6\u9891\u5e27\u66f4\u7d27\u51d1\uff08\u7c7b\u4f3c\u4e8e\u673a\u5668\u4eba\u5b66\u4e2d\u7684DreamerV3\u5728\u6f5c\u5728\u7a7a\u95f4\u800c\u975e\u50cf\u7d20\u7a7a\u95f4\u4e2d\u8fdb\u884c\u9884\u6d4b\uff0c\u5982\u6587\u4ef62\u6240\u8ff0\uff09\u3002BEV\u4e16\u754c\u6a21\u578b\u9884\u6d4b\u6240\u6709\u53c2\u4e0e\u8005\u7684\u4f4d\u7f6e\u3001\u9053\u8def\u7ed3\u6784\u7684\u6837\u5b50\u4ee5\u53ca\u81ea\u7531\u7a7a\u95f4\u7684\u4f4d\u7f6e\uff0c\u89c4\u5212\u5668\u76f4\u63a5\u4f7f\u7528\u8fd9\u4e9b\u4fe1\u606f\u3002
\u795e\u7ecf\u95ed\u73af\u4eff\u771f\u4f7f\u7528\u4e16\u754c\u6a21\u578b\u66ff\u4ee3\u624b\u5de5\u6784\u5efa\u7684\u4eff\u771f\u5668\u8fdb\u884c\u6d4b\u8bd5\u3002\u7ed9\u5b9a\u771f\u5b9e\u9a7e\u9a76\u65e5\u5fd7\u4f5c\u4e3a\u8d77\u70b9\uff0c\u4e16\u754c\u6a21\u578b\u751f\u6210\u5982\u679c\u4e3b\u8f66\u91c7\u53d6\u4e86\u4e0d\u540c\u52a8\u4f5c\u4f1a\u53d1\u751f\u4ec0\u4e48\u3002\u8fd9\u4f7f\u5f97\u53cd\u4e8b\u5b9e\u8bc4\u4f30\u6210\u4e3a\u53ef\u80fd\uff1a\"\u5982\u679c\u6211\u5239\u8f66\u665a\u4e860.5\u79d2\u4f1a\u600e\u6837\uff1f\"\u800c\u65e0\u9700\u5b9e\u9645\u91cd\u73b0\u573a\u666f\u3002
\u4e0eJEPA\u6846\u67b6\uff08\u7b2c10\u7ae0\uff09\u7684\u8054\u7cfb\u5728\u8fd9\u91cc\u5f88\u81ea\u7136\u3002\u9a7e\u9a76\u4e16\u754c\u6a21\u578b\u4e0d\u9700\u8981\u9884\u6d4b\u50cf\u7d20\u7ea7\u5b8c\u7f8e\u7684\u672a\u6765\uff08\u6bcf\u4e2a\u50cf\u7d20\u7684\u7cbe\u786eRGB\u503c\uff09\u3002\u5b83\u4eec\u9700\u8981\u9884\u6d4b\u5bf9\u89c4\u5212\u91cd\u8981\u7684\u65b9\u9762\uff1a\u53c2\u4e0e\u8005\u5728\u54ea\u3001\u79fb\u52a8\u901f\u5ea6\u591a\u5feb\u3001\u81ea\u7531\u7a7a\u95f4\u5728\u54ea\u3002\u5d4c\u5165\u7a7a\u95f4\u9884\u6d4b\uff08JEPA\u98ce\u683c\uff09\u6355\u83b7\u8fd9\u4e9b\u8bed\u4e49\u4e0a\u6709\u610f\u4e49\u7684\u5c5e\u6027\uff0c\u800c\u65e0\u9700\u6d6a\u8d39\u5bb9\u91cf\u5728\u65e0\u5173\u7684\u89c6\u89c9\u7ec6\u8282\u4e0a\uff0c\u5982\u786e\u5207\u7684\u4e91\u7eb9\u7406\u3002
\u4e3b\u8981\u6311\u6218\u662f\u957f\u65f6\u7a0b\u4fdd\u771f\u5ea6\u3002\u4e16\u754c\u6a21\u578b\u968f\u65f6\u95f4\u7d2f\u79ef\u8bef\u5dee\uff1a\u7b2c2\u5e27\u7684\u4e00\u4e2a\u5c0f\u9519\u8bef\u4f1a\u504f\u79fb\u6240\u6709\u540e\u7eed\u5e27\u3002\u5bf9\u4e8e\u9a7e\u9a76\uff0c3\u79d2\u7684\u9884\u6d4b\u65f6\u57df\u5bf9\u6218\u672f\u51b3\u7b56\u6709\u7528\uff08\u6211\u5e94\u8be5\u73b0\u5728\u5408\u6d41\u5417\uff1f\uff09\uff0c\u4f4630\u79d2\u7684\u65f6\u57df\uff08\u7528\u4e8e\u8def\u7ebf\u89c4\u5212\u7b49\u6218\u7565\u51b3\u7b56\u6240\u9700\uff09\u4ecd\u7136\u4e0d\u53ef\u9760\u3002\u5f53\u524d\u5de5\u4f5c\u901a\u8fc7\u91cd\u65b0\u951a\u5b9a\uff08\u5b9a\u671f\u7528\u771f\u5b9e\u89c2\u6d4b\u91cd\u7f6e\u6a21\u578b\uff09\u548c\u4e0d\u786e\u5b9a\u6027\u4f30\u8ba1\uff08\u5728\u9884\u6d4b\u53d8\u5f97\u4e0d\u53ef\u9760\u65f6\u6807\u8bb0\uff09\u6765\u7f13\u89e3\u8fd9\u4e00\u95ee\u9898\u3002
\u901a\u8fc7\u5728\u771f\u5b9e\u9053\u8def\u4e0a\u9a7e\u9a76\u6765\u6d4b\u8bd5\u81ea\u52a8\u9a7e\u9a76\u6c7d\u8f66\u662f\u5fc5\u8981\u7684\uff0c\u4f46\u8fd8\u4e0d\u591f\u3002\u5371\u9669\u573a\u666f\uff08\u8fd1\u78b0\u649e\u3001\u8fb9\u7f18\u60c5\u51b5\uff09\u5f88\u5c11\u89c1\uff0c\u56e0\u6b64\u901a\u8fc7\u884c\u9a76\u91cc\u7a0b\u6765\u6d4b\u8bd5\u6548\u7387\u4f4e\u4e0b\u3002\u4e00\u8f86\u8f66\u9700\u8981\u884c\u9a76\u6570\u4ebf\u82f1\u91cc\u624d\u80fd\u4ee5\u7edf\u8ba1\u5b66\u65b9\u5f0f\u8bc1\u660e\u5b89\u5168\u6027\uff0c\u8fd9\u662f\u4e0d\u53ef\u884c\u7684\u3002
\u4eff\u771f\u63d0\u4f9b\u4e86\u65e0\u9650\u3001\u53ef\u63a7\u4e14\u5b89\u5168\u7684\u6d4b\u8bd5\u3002\u5728\u73b0\u5b9e\u4e16\u754c\u4e2d\u7f55\u89c1\u7684\u573a\u666f\uff08\u4e00\u4e2a\u5b69\u5b50\u8dd1\u4e0a\u9a6c\u8def\u3001\u8f6e\u80ce\u7206\u80ce\u3001\u7a81\u7136\u7684\u969c\u788d\u7269\uff09\u53ef\u4ee5\u5728\u4eff\u771f\u4e2d\u6d4b\u8bd5\u6570\u767e\u4e07\u6b21\u3002
CARLA\u662f\u4e00\u4e2a\u57fa\u4e8eUnreal Engine\u6784\u5efa\u7684\u5f00\u6e90\u9a7e\u9a76\u4eff\u771f\u5668\u3002\u5b83\u63d0\u4f9b\u903c\u771f\u7684\u57ce\u5e02\u73af\u5883\u3001\u52a8\u6001\u5929\u6c14\u3001\u4ea4\u901a\u53c2\u4e0e\u8005\u4ee5\u53ca\u4f20\u611f\u5668\u4eff\u771f\uff08\u76f8\u673a\u3001LiDAR\u3001\u96f7\u8fbe\uff09\u3002\u7814\u7a76\u4eba\u5458\u4f7f\u7528CARLA\u8bad\u7ec3\u57fa\u4e8eRL\u7684\u9a7e\u9a76\u667a\u80fd\u4f53\u5e76\u8bc4\u4f30\u611f\u77e5\u7b97\u6cd5\u3002
nuPlan\uff08Motional\uff09\u662f\u4e00\u4e2a\u95ed\u73af\u89c4\u5212\u57fa\u51c6\u6d4b\u8bd5\u3002\u4e0e\u5f00\u73af\u8bc4\u4f30\uff08\u91cd\u653e\u8bb0\u5f55\u6570\u636e\uff0c\u6bd4\u8f83\u89c4\u5212\u5668\u7684\u8f93\u51fa\u4e0e\u4eba\u7c7b\u9a7e\u9a76\u5458\u7684\u5b9e\u9645\u8f68\u8ff9\uff09\u4e0d\u540c\uff0c\u95ed\u73af\u8bc4\u4f30\u5141\u8bb8\u89c4\u5212\u5668\u7684\u51b3\u7b56\u5f71\u54cd\u4eff\u771f\uff1a\u5982\u679c\u89c4\u5212\u5668\u51b3\u5b9a\u53d8\u9053\uff0c\u4eff\u771f\u4f1a\u76f8\u5e94\u5730\u6f14\u53d8\u3002\u8fd9\u6d4b\u8bd5\u4e86\u53cd\u5e94\u6027\u884c\u4e3a\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u8f68\u8ff9\u76f8\u4f3c\u6027\u3002
\u5f00\u73af\u548c\u95ed\u73af\u8bc4\u4f30\u4e4b\u95f4\u7684\u533a\u522b\u81f3\u5173\u91cd\u8981\uff1a
\u5f00\u73af\uff1a\u91cd\u653e\u8bb0\u5f55\u7684\u573a\u666f\uff0c\u8ba1\u7b97\u6a21\u578b\u8f93\u51fa\u4e0e\u4eba\u7c7b\u9a7e\u9a76\u5458\u52a8\u4f5c\u7684\u76f8\u4f3c\u5ea6\u3002\u8fd9\u5bb9\u6613\u8bbe\u7f6e\u4f46\u5177\u6709\u8bef\u5bfc\u6027\uff1a\u4e00\u4e2a\u603b\u662f\u9884\u6d4b\"\u76f4\u884c\"\u7684\u6a21\u578b\u5728\u9ad8\u901f\u516c\u8def\u4e0a\u8bef\u5dee\u53ef\u80fd\u5f88\u4f4e\uff0c\u4f46\u5728\u7b2c\u4e00\u4e2a\u8f6c\u5f2f\u5904\u5c31\u4f1a\u649e\u8f66\u3002
\u95ed\u73af\uff1a\u6a21\u578b\u7684\u52a8\u4f5c\u6539\u53d8\u4eff\u771f\u72b6\u6001\uff0c\u4eff\u771f\u76f8\u5e94\u5730\u6f14\u53d8\u3002\u8fd9\u6d4b\u8bd5\u4e86\u6a21\u578b\u4ece\u81ea\u8eab\u9519\u8bef\u4e2d\u6062\u590d\u548c\u54cd\u5e94\u52a8\u6001\u60c5\u51b5\u7684\u80fd\u529b\u3002\u5b83\u6602\u8d35\u5f97\u591a\uff0c\u4f46\u66f4\u6709\u610f\u4e49\u3002
\u573a\u666f\u751f\u6210\u521b\u5efa\u5bf9\u7cfb\u7edf\u8fdb\u884c\u538b\u529b\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002\u5bf9\u6297\u6027\u573a\u666f\uff08\u8f66\u8f86\u7a81\u7136\u5239\u8f66\u3001\u884c\u4eba\u9690\u85cf\u5728\u505c\u653e\u7684\u6c7d\u8f66\u540e\u9762\uff09\u901a\u8fc7\u4f18\u5316\u4f7f\u81ea\u52a8\u9a7e\u9a76\u7cfb\u7edf\u8868\u73b0\u6700\u5dee\u7684\u60c5\u51b5\u6765\u751f\u6210\u3002\u8fd9\u4e0eML\u4e2d\u7684\u5bf9\u6297\u8bad\u7ec3\uff08\u7b2c6\u7ae0\uff09\u6709\u5173\uff1a\u5bfb\u627e\u6700\u5927\u5316\u635f\u5931\u7684\u8f93\u5165\u3002
\u81ea\u52a8\u9a7e\u9a76\u4e2d\u7684\u5b89\u5168\u6027\u7531\u5de5\u7a0b\u6807\u51c6\u800c\u975e\u4ec5ML\u6307\u6807\u6765\u7ba1\u7406\u3002
ISO 26262\uff08\u529f\u80fd\u5b89\u5168\uff09\u662f\u5b89\u5168\u5173\u952e\u7535\u5b50\u7cfb\u7edf\u7684\u6c7d\u8f66\u6807\u51c6\u3002\u5b83\u6839\u636e\u6f5c\u5728\u5371\u5bb3\u7684\u4e25\u91cd\u6027\u3001\u66b4\u9732\u5ea6\u548c\u53ef\u63a7\u6027\u5b9a\u4e49\u4e86\u6c7d\u8f66\u5b89\u5168\u5b8c\u6574\u6027\u7b49\u7ea7\uff08ASIL\uff09\uff0c\u4eceA\uff08\u6700\u4f4e\uff09\u5230D\uff08\u6700\u9ad8\uff09\u3002\u81ea\u52a8\u9a7e\u9a76\u7cfb\u7edf\u7684\u611f\u77e5\u548c\u89c4\u5212\u7ec4\u4ef6\u901a\u5e38\u4e3aASIL-D\uff0c\u5373\u6700\u9ad8\u7b49\u7ea7\uff0c\u9700\u8981\u5e7f\u6cdb\u7684\u9a8c\u8bc1\u3001\u5197\u4f59\u548c\u6545\u969c\u5b89\u5168\u8bbe\u8ba1\u3002
SOTIF\uff08\u9884\u671f\u529f\u80fd\u5b89\u5168\uff0cISO 21448\uff09\u5904\u7406\u53e6\u4e00\u7c7b\u5371\u5bb3\uff1a\u4e0d\u662f\u786c\u4ef6\u6545\u969c\uff08ISO 26262\u8986\u76d6\u7684\uff09\uff0c\u800c\u662f\u7cfb\u7edf\u6309\u8bbe\u8ba1\u5de5\u4f5c\u4f46\u4ecd\u4ea7\u751f\u4e0d\u5b89\u5168\u7ed3\u679c\u7684\u60c5\u51b5\u3002\u4e00\u4e2a\u5c06\u767d\u8272\u5361\u8f66\u8bef\u5206\u7c7b\u4e3a\u5929\u7a7a\u7684\u611f\u77e5\u6a21\u578b\uff08\u771f\u5b9e\u4e8b\u4ef6\uff09\u662fSOTIF\u95ee\u9898\uff1a\u786c\u4ef6\u5de5\u4f5c\u6b63\u5e38\uff0c\u4f46\u7b97\u6cd5\u7684\u5c40\u9650\u6027\u5bfc\u81f4\u4e86\u5371\u5bb3\u3002
\u8fd0\u884c\u8bbe\u8ba1\u57df\uff08ODD\uff09\u5b9a\u4e49\u4e86\u81ea\u52a8\u9a7e\u9a76\u7cfb\u7edf\u8bbe\u8ba1\u7528\u4e8e\u8fd0\u884c\u7684\u6761\u4ef6\uff1a\u7279\u5b9a\u7684\u5730\u7406\u533a\u57df\u3001\u9053\u8def\u7c7b\u578b\uff08\u4ec5\u9ad8\u901f\u3001\u57ce\u5e02\u9053\u8def\u3001\u4e24\u8005\u517c\u6709\uff09\u3001\u5929\u6c14\u6761\u4ef6\uff08\u65e0\u5927\u96ea\uff09\u3001\u901f\u5ea6\u8303\u56f4\u548c\u65f6\u95f4\u6bb5\u3002\u4e0d\u5141\u8bb8\u5728ODD\u4e4b\u5916\u8fd0\u884c\uff1a\u5982\u679c\u7cfb\u7edf\u4e0d\u80fd\u5904\u7406\u96ea\uff0c\u5c31\u4e0d\u80fd\u5728\u96ea\u4e2d\u9a7e\u9a76\u3002
\u6545\u969c\u5b89\u5168 vs \u6545\u969c\u53ef\u64cd\u4f5c\u8bbe\u8ba1\uff1a
\u5197\u4f59\u662f\u57fa\u7840\u3002\u5173\u952e\u611f\u77e5\u4f20\u611f\u5668\u88ab\u590d\u5236\uff1a\u591a\u4e2a\u76f8\u673a\u8986\u76d6\u91cd\u53e0\u89c6\u573a\u3001LiDAR\u548c\u96f7\u8fbe\u540c\u65f6\u63d0\u4f9b\u72ec\u7acb\u7684\u6df1\u5ea6\u6d4b\u91cf\u3001\u53cc\u8ba1\u7b97\u5e73\u53f0\u8fd0\u884c\u76f8\u540c\u7684\u8f6f\u4ef6\u3002\u5982\u679c\u4efb\u4f55\u5355\u4e2a\u7ec4\u4ef6\u53d1\u751f\u6545\u969c\uff0c\u5176\u4ed6\u7ec4\u4ef6\u63d0\u4f9b\u8db3\u591f\u7684\u4fe1\u606f\u6765\u5b89\u5168\u9a7e\u9a76\u3002
SAE J3016\u6807\u51c6\u5b9a\u4e49\u4e86\u516d\u4e2a\u9a7e\u9a76\u81ea\u52a8\u5316\u7b49\u7ea7\uff0c\u4ece0\uff08\u65e0\u81ea\u52a8\u5316\uff09\u52305\uff08\u5b8c\u5168\u81ea\u52a8\u5316\uff09\uff1a
\u7b49\u7ea70\uff08\u65e0\u81ea\u52a8\u5316\uff09\uff1a\u4eba\u7c7b\u505a\u6240\u6709\u4e8b\u60c5\u3002\u7cfb\u7edf\u53ef\u80fd\u63d0\u4f9b\u8b66\u544a\uff08\u8f66\u9053\u504f\u79bb\u8b66\u62a5\uff09\u4f46\u4e0d\u63a7\u5236\u8f66\u8f86\u3002
\u7b49\u7ea71\uff08\u9a7e\u9a76\u8f85\u52a9\uff09\uff1a\u7cfb\u7edf\u63a7\u5236\u8f6c\u5411\u6216\u901f\u5ea6\uff0c\u4f46\u4e0d\u80fd\u540c\u65f6\u63a7\u5236\u4e24\u8005\u3002\u81ea\u9002\u5e94\u5de1\u822a\u63a7\u5236\uff08\u4fdd\u6301\u901f\u5ea6\u548c\u8ddf\u8f66\u8ddd\u79bb\uff09\u6216\u8f66\u9053\u4fdd\u6301\u8f85\u52a9\uff08\u4f7f\u8f66\u8f86\u4fdd\u6301\u5728\u8f66\u9053\u4e2d\u592e\uff09\u5c5e\u4e8e\u7b49\u7ea71\u3002
\u7b49\u7ea72\uff08\u90e8\u5206\u81ea\u52a8\u5316\uff09\uff1a\u7cfb\u7edf\u540c\u65f6\u63a7\u5236\u8f6c\u5411\u548c\u901f\u5ea6\uff0c\u4f46\u4eba\u7c7b\u5fc5\u987b\u65f6\u523b\u76d1\u63a7\u5e76\u51c6\u5907\u63a5\u7ba1\u3002\u7279\u65af\u62c9Autopilot\u3001GM Super Cruise\u548c\u5927\u591a\u6570\u5f53\u524d\u7684\"\u81ea\u52a8\u9a7e\u9a76\"\u529f\u80fd\u5c5e\u4e8e\u7b49\u7ea72\u3002\u4eba\u7c7b\u4ecd\u7136\u662f\u8d1f\u8d23\u7684\u9a7e\u9a76\u5458\u3002
\u7b49\u7ea73\uff08\u6761\u4ef6\u81ea\u52a8\u5316\uff09\uff1a\u7cfb\u7edf\u9a7e\u9a76\u5e76\u76d1\u63a7\u73af\u5883\uff0c\u4f46\u4ec5\u5728\u7279\u5b9a\u6761\u4ef6\u4e0b\uff08ODD\u5185\uff09\u3002\u4eba\u7c7b\u53ef\u4ee5\u8131\u79bb\u5173\u6ce8\uff0c\u4f46\u5fc5\u987b\u51c6\u5907\u597d\u5728\u7cfb\u7edf\u8bf7\u6c42\u65f6\u63a5\u7ba1\uff08\u6709\u65f6\u95f4\u7f13\u51b2\uff0c\u901a\u5e3810\u79d2\u4ee5\u4e0a\uff09\u3002Mercedes Drive Pilot\uff08\u7279\u5b9a\u9ad8\u901f\u516c\u8def\u4e0a\uff0c\u4f4e\u4e8e60\u516c\u91cc/\u5c0f\u65f6\uff09\u662f\u7b2c\u4e00\u4e2a\u7ecf\u8ba4\u8bc1\u7684\u7b49\u7ea73\u7cfb\u7edf\u3002
\u7b49\u7ea74\uff08\u9ad8\u5ea6\u81ea\u52a8\u5316\uff09\uff1a\u7cfb\u7edf\u5728ODD\u5185\u9a7e\u9a76\u5e76\u5904\u7406\u6240\u6709\u60c5\u51b5\uff0c\u65e0\u9700\u4eba\u7c7b\u5e72\u9884\u3002\u5982\u679c\u9047\u5230ODD\u4e4b\u5916\u7684\u60c5\u51b5\uff0c\u5b83\u53ef\u4ee5\u5b89\u5168\u5730\u81ea\u5df1\u505c\u8f66\u3002Waymo\u7684\u673a\u5668\u4eba\u51fa\u79df\u8f66\u670d\u52a1\u5728\u7279\u5b9a\u5730\u7406\u533a\u57df\u5185\u4ee5\u7b49\u7ea74\u8fd0\u884c\u3002
\u7b49\u7ea75\uff08\u5b8c\u5168\u81ea\u52a8\u5316\uff09\uff1a\u7cfb\u7edf\u80fd\u5728\u4eba\u7c7b\u80fd\u53bb\u7684\u4e00\u5207\u5730\u65b9\u3001\u4e00\u5207\u6761\u4ef6\u4e0b\u9a7e\u9a76\u3002\u65e0\u9700\u65b9\u5411\u76d8\u6216\u8e0f\u677f\u3002\u8fd9\u76ee\u524d\u8fd8\u4e0d\u5b58\u5728\u3002
\u5173\u952e\u533a\u522b\u5728\u4e8e\u8c01\u5bf9\u5b89\u5168\u8d1f\u8d23\u3002\u5728\u7b49\u7ea70-2\uff0c\u4eba\u7c7b\u8d1f\u8d23\u3002\u5728\u7b49\u7ea73-5\uff0c\u7cfb\u7edf\u8d1f\u8d23\uff08\u5728\u5176ODD\u5185\uff09\u3002\u8fd9\u5177\u6709\u6df1\u8fdc\u7684\u6cd5\u5f8b\u3001\u4fdd\u9669\u548c\u4f26\u7406\u5f71\u54cd\u3002
\u5f53\u524d\u884c\u4e1a\u72b6\u6001\u662f\u7b49\u7ea72\uff08\u5e7f\u6cdb\u90e8\u7f72\uff09\u3001\u7b49\u7ea73\uff08\u5f00\u59cb\u90e8\u7f72\uff09\u548c\u7b49\u7ea74\uff08\u6709\u9650\u5730\u7406\u90e8\u7f72\uff09\u7684\u6df7\u5408\u3002\u7b49\u7ea75\u4ecd\u7136\u662f\u4e00\u4e2a\u957f\u671f\u7814\u7a76\u76ee\u6807\u3002
\u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684\u8f68\u8ff9\u4f18\u5316\u89c4\u5212\u5668\u3002\u7ed9\u5b9a\u8d77\u59cb\u4f4d\u7f6e\u3001\u76ee\u6807\u548c\u969c\u788d\u7269\uff0c\u4f7f\u7528\u68af\u5ea6\u4e0b\u964d\u627e\u5230\u6700\u5e73\u6ed1\u7684\u65e0\u78b0\u649e\u8def\u5f84\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u8f68\u8ff9\uff1aN\u4e2a\u8def\u5f84\u70b9\uff0c\u6bcf\u4e2a(x, y)\nN = 20\nstart = jnp.array([0.0, 0.0])\ngoal = jnp.array([10.0, 0.0])\nobstacle = jnp.array([5.0, 0.0])\nobs_radius = 1.5\n\n# \u521d\u59cb\u5316\uff1a\u4ece\u8d77\u70b9\u5230\u7ec8\u70b9\u7684\u76f4\u7ebf\nwaypoints_init = jnp.linspace(start, goal, N)\n\ndef cost(waypoints):\n wp = jnp.concatenate([start[None], waypoints, goal[None]], axis=0)\n\n # \u5e73\u6ed1\u5ea6\uff1a\u60e9\u7f5a\u52a0\u901f\u5ea6\uff08\u4e8c\u9636\u5dee\u5206\uff09\n accel = wp[2:] - 2 * wp[1:-1] + wp[:-2]\n smooth_cost = jnp.sum(accel ** 2)\n\n # \u907f\u969c\uff1a\u60e9\u7f5a\u63a5\u8fd1\u5ea6\n dists = jnp.linalg.norm(wp - obstacle, axis=1)\n collision_cost = jnp.sum(jnp.maximum(0, obs_radius + 0.5 - dists) ** 2)\n\n return 10 * smooth_cost + 100 * collision_cost\n\ngrad_cost = jax.grad(cost)\n\n# \u4f18\u5316\u5185\u90e8\u8def\u5f84\u70b9\nwaypoints = waypoints_init[1:-1]\nlr = 0.01\nfor _ in range(500):\n g = grad_cost(waypoints)\n waypoints = waypoints - lr * g\n\n# \u7ed8\u56fe\nfull_path = jnp.concatenate([start[None], waypoints, goal[None]], axis=0)\ntheta = jnp.linspace(0, 2 * jnp.pi, 100)\n\nplt.figure(figsize=(10, 4))\nplt.plot(full_path[:, 0], full_path[:, 1], \"b.-\", label=\"\u4f18\u5316\u540e\u8def\u5f84\")\nplt.plot(waypoints_init[:, 0], waypoints_init[:, 1], \"r--\", alpha=0.5, label=\"\u521d\u59cb\uff08\u76f4\u7ebf\uff09\")\nplt.fill(obstacle[0] + obs_radius * jnp.cos(theta),\n obstacle[1] + obs_radius * jnp.sin(theta), alpha=0.3, color=\"red\", label=\"\u969c\u788d\u7269\")\nplt.plot(*start, \"go\", markersize=10); plt.plot(*goal, \"g*\", markersize=15)\nplt.legend(); plt.axis(\"equal\"); plt.grid(True)\nplt.title(\"\u8f68\u8ff9\u4f18\u5316\uff1a\u5e73\u6ed1\u65e0\u78b0\u649e\u8def\u5f84\")\nplt.show()\n \u6a21\u62df\u4e00\u4e2a\u5300\u901f\u8fd0\u52a8\u9884\u6d4b\u6a21\u578b\uff0c\u5e76\u4e0e\u8f6c\u5f2f\u8f66\u8f86\u7684\u771f\u5b9e\u503c\u6bd4\u8f83\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u771f\u5b9e\u503c\uff1a\u8f66\u8f86\u53f3\u8f6c\ndt = 0.1\nT = 40 # 4\u79d2\nv = 10.0 # \u7c73/\u79d2\nomega = 0.3 # \u5f27\u5ea6/\u79d2\uff08\u8f6c\u5f2f\u901f\u7387\uff09\n\n# \u771f\u5b9e\u8f68\u8ff9\uff08\u6052\u5b9a\u8f6c\u5f2f\u901f\u7387\uff09\nt = jnp.arange(T) * dt\ntheta = omega * t\ngt_x = (v / omega) * jnp.sin(theta)\ngt_y = (v / omega) * (1 - jnp.cos(theta))\n\n# \u4ecet=0\u5f00\u59cb\u7684\u5300\u901f\u9884\u6d4b\n# \u5047\u8bbe\u8f66\u8f86\u6cbf\u5f53\u524d\u822a\u5411\u7ee7\u7eed\u76f4\u884c\nobs_steps = 10 # \u89c2\u5bdf\u524d1\u79d2\nvx0 = v * jnp.cos(theta[obs_steps - 1])\nvy0 = v * jnp.sin(theta[obs_steps - 1])\npred_t = jnp.arange(T - obs_steps) * dt\npred_x = gt_x[obs_steps - 1] + vx0 * pred_t\npred_y = gt_y[obs_steps - 1] + vy0 * pred_t\n\nplt.figure(figsize=(8, 6))\nplt.plot(gt_x[:obs_steps], gt_y[:obs_steps], \"ko-\", label=\"\u5df2\u89c2\u6d4b\")\nplt.plot(gt_x[obs_steps:], gt_y[obs_steps:], \"g-\", linewidth=2, label=\"\u771f\u5b9e\u672a\u6765\")\nplt.plot(pred_x, pred_y, \"r--\", linewidth=2, label=\"\u5300\u901f\u9884\u6d4b\")\nplt.legend(); plt.axis(\"equal\"); plt.grid(True)\nplt.xlabel(\"x (\u7c73)\"); plt.ylabel(\"y (\u7c73)\")\nplt.title(\"\u5300\u901f\u9884\u6d4b vs \u8f6c\u5f2f\u8f66\u8f86\")\nplt.show()\n \u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684\u57fa\u4e8e\u89c4\u5219\u7684\u89c4\u5212\u5668\uff0c\u6839\u636e\u68c0\u6d4b\u5230\u7684\u969c\u788d\u7269\u51b3\u5b9a\u4fdd\u6301\u8f66\u9053\u8fd8\u662f\u505c\u8f66\u3002
import jax.numpy as jnp\n\ndef rule_based_planner(ego_speed, obstacles, speed_limit=13.9):\n \"\"\"\n \u7b80\u5355\u7684\u57fa\u4e8e\u89c4\u5219\u7684\u89c4\u5212\u5668\u3002\n ego_speed: \u5f53\u524d\u901f\u5ea6\uff08\u7c73/\u79d2\uff09\n obstacles: \u524d\u65b9\u8f66\u8f86\u7684\uff08\u8ddd\u79bb\uff0c\u901f\u5ea6\uff09\u5143\u7ec4\u5217\u8868\n speed_limit: \u6700\u9ad8\u5141\u8bb8\u901f\u5ea6\uff08\u7c73/\u79d2\uff09\uff0c\u9ed8\u8ba4\u7ea650\u516c\u91cc/\u5c0f\u65f6\n\n \u8fd4\u56de\uff1a(\u76ee\u6807\u901f\u5ea6\uff0c\u52a8\u4f5c\u6807\u7b7e)\n \"\"\"\n min_following_distance = 2.0 * ego_speed # 2\u79d2\u89c4\u5219\n emergency_distance = 5.0 # \u7c73\n\n if not obstacles:\n return speed_limit, \"\u5de1\u822a\"\n\n # \u627e\u5230\u6700\u8fd1\u7684\u524d\u65b9\u969c\u788d\u7269\n closest_dist, closest_speed = min(obstacles, key=lambda o: o[0])\n\n if closest_dist < emergency_distance:\n return 0.0, \"\u7d27\u6025\u505c\u8f66\"\n elif closest_dist < min_following_distance:\n # \u5339\u914d\u524d\u8f66\u901f\u5ea6\n target = min(closest_speed, speed_limit)\n return target, \"\u8ddf\u968f\"\n else:\n return speed_limit, \"\u5de1\u822a\"\n\n# \u6d4b\u8bd5\u573a\u666f\nscenarios = [\n (13.9, [], \"\u7a7a\u65f7\u9053\u8def\"),\n (13.9, [(30.0, 10.0)], \"\u524d\u65b9\u6709\u8f83\u6162\u8f66\u8f86\"),\n (13.9, [(3.0, 0.0)], \"\u524d\u65b9\u6709\u505c\u9760\u8f66\u8f86\uff0c\u8ddd\u79bb\u6781\u8fd1\"),\n (13.9, [(50.0, 13.9)], \"\u524d\u65b9\u8f66\u8f86\u540c\u901f\u884c\u9a76\"),\n]\n\nfor speed, obs, desc in scenarios:\n target, action = rule_based_planner(speed, obs)\n print(f\"{desc:30s} \u2192 {action:15s} \u76ee\u6807\u901f\u5ea6={target:.1f} \u7c73/\u79d2 ({target*3.6:.0f} \u516c\u91cc/\u5c0f\u65f6)\")\n \u592a\u7a7a\u548c\u6781\u7aef\u73af\u5883\u673a\u5668\u4eba\u5c06\u81ea\u4e3b\u6027\u63a8\u5411\u6781\u9650\u2014\u2014\u901a\u4fe1\u5ef6\u8fdf\u3001\u8f90\u5c04\u548c\u975e\u7ed3\u6784\u5316\u5730\u5f62\u8981\u6c42\u673a\u5668\u4eba\u81ea\u5df1\u601d\u8003\u3002\u672c\u7ae0\u6db5\u76d6\u884c\u661f\u6f2b\u6e38\u8f66\u3001\u5728\u8f68\u670d\u52a1\u3001\u901a\u4fe1\u53d7\u9650\u81ea\u4e3b\u6027\u3001\u6297\u8f90\u5c04\u8ba1\u7b97\u3001\u6c34\u4e0b\u673a\u5668\u4eba\u3001\u641c\u7d22\u6551\u63f4\u3001\u7fa4\u4f53\u673a\u5668\u4eba\u548c\u4eba\u673a\u4ea4\u4e92\u3002
\u5728\u672c\u7ae0\u4e2d\uff0c\u6211\u4eec\u7814\u7a76\u4e86\u5728\u76f8\u5bf9\u6e29\u548c\u73af\u5883\u4e2d\u8fd0\u884c\u7684\u81ea\u4e3b\u7cfb\u7edf\uff1a\u6709\u8f66\u9053\u6807\u7ebf\u7684\u9053\u8def\u3001\u6709\u5e73\u5766\u5730\u677f\u7684\u5730\u677f\u3001\u6709\u5df2\u77e5\u7269\u4f53\u7c7b\u522b\u7684\u53a8\u623f\u3002\u4f46\u673a\u5668\u4eba\u6280\u672f\u7684\u4e00\u4e9b\u6700\u5177\u5f71\u54cd\u529b\u7684\u5e94\u7528\u662f\u5728\u4eba\u7c7b\u65e0\u6cd5\u5230\u8fbe\u7684\u73af\u5883\uff0c\u6216\u8005\u4eba\u7c7b\u5b58\u5728\u7684\u6210\u672c\u6781\u9ad8\u7684\u73af\u5883\uff1a\u706b\u661f\u8868\u9762\u3001\u6df1\u6d77\u6d77\u5e95\u3001\u6838\u707e\u96be\u73b0\u573a\u548c\u71c3\u70e7\u7684\u5efa\u7b51\u3002
\u8fd9\u4e9b\u6781\u7aef\u73af\u5883\u9762\u4e34\u7740\u5171\u540c\u7684\u6311\u6218\uff1a\u901a\u4fe1\u53d7\u9650\u6216\u6709\u5ef6\u8fdf\u3001\u5730\u5f62\u975e\u7ed3\u6784\u5316\u4e14\u4e0d\u53ef\u9884\u6d4b\u3001\u786c\u4ef6\u5fc5\u987b\u5728\u6076\u52a3\u6761\u4ef6\u4e0b\u751f\u5b58\u3001\u800c\u4e14\u9644\u8fd1\u6ca1\u6709\u4eba\u80fd\u5728\u51fa\u73b0\u95ee\u9898\u65f6\u4fee\u7406\u3002\u673a\u5668\u4eba\u5fc5\u987b\u771f\u6b63\u81ea\u4e3b\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\"\u6709\u4eba\u5728\u5c4f\u5e55\u524d\u76d1\u63a7\u7684\u81ea\u4e3b\"\u3002
\u592a\u7a7a\u662f\u7ec8\u6781\u7684\u6781\u7aef\u73af\u5883\u3002\u6ca1\u6709\u7a7a\u6c14\uff0c\u6e29\u5ea6\u5728-170\u00b0C\u5230+120\u00b0C\u4e4b\u95f4\u6446\u52a8\uff0c\u8f90\u5c04\u8f70\u51fb\u7535\u5b50\u8bbe\u5907\uff0c\u800c\u63f4\u52a9\u5728\u6570\u767e\u4e07\u516c\u91cc\u4e4b\u5916\u3002\u592a\u7a7a\u673a\u5668\u4eba\u5fc5\u987b\u5f02\u5e38\u53ef\u9760\u3001\u8282\u80fd\u4e14\u81ea\u4e3b\u3002
\u884c\u661f\u6f2b\u6e38\u8f66\u662f\u5728\u5176\u4ed6\u4e16\u754c\u8868\u9762\u63a2\u7d22\u7684\u79fb\u52a8\u673a\u5668\u4eba\u3002NASA\u7684\u706b\u661f\u6f2b\u6e38\u8f66\uff08\u52c7\u6c14\u53f7\u3001\u673a\u9047\u53f7\u3001\u597d\u5947\u53f7\u3001\u6bc5\u529b\u53f7\uff09\u662f\u6700\u8457\u540d\u7684\u4f8b\u5b50\u3002\u6bcf\u4e00\u4ee3\u90fd\u6bd4\u4e0a\u4e00\u4ee3\u66f4\u52a0\u81ea\u4e3b\u3002
\u6839\u672c\u9650\u5236\u662f\u901a\u4fe1\u5ef6\u8fdf\u3002\u706b\u661f\u8ddd\u5730\u74034-24\u5206\u949f\u7684\u65e0\u7ebf\u7535\u8ddd\u79bb\uff08\u53d6\u51b3\u4e8e\u8f68\u9053\u4f4d\u7f6e\uff09\uff0c\u56e0\u6b64\u5f80\u8fd4\u901a\u4fe1\u9700\u89818-48\u5206\u949f\u3002\u6f2b\u6e38\u8f66\u4e0d\u80fd\u5b9e\u65f6\u64cd\u63a7\u3002\u5982\u679c\u9047\u5230\u5ca9\u77f3\uff0c\u5b83\u4e0d\u80fd\u5411\u5730\u7403\u6c42\u52a9\u5e76\u7b49\u5f85\u56de\u5e94\u3002\u5b83\u5fc5\u987b\u81ea\u5df1\u51b3\u5b9a\u3002
\u65e9\u671f\u7684\u6f2b\u6e38\u8f66\uff08\u52c7\u6c14\u53f7\u3001\u673a\u9047\u53f7\uff09\u4e25\u91cd\u4f9d\u8d56\u5730\u9762\u53c2\u4e0e\u7684\u89c4\u5212\uff1a\u4eba\u7c7b\u7814\u7a76\u56fe\u50cf\u3001\u89c4\u5212\u8def\u5f84\u3001\u4e0a\u4f20\u547d\u4ee4\uff0c\u6f2b\u6e38\u8f66\u6267\u884c\u547d\u4ee4\u3002\u4e00\u4e2a\u9a7e\u9a76\u5468\u671f\u9700\u8981\u4e00\u4e2a\u5b8c\u6574\u7684\u706b\u661f\u65e5\u3002\u6f2b\u6e38\u8f66\u6bcf\u5929\u5927\u7ea6\u80fd\u884c\u8fdb50-100\u7c73\u3002
\u597d\u5947\u53f7\u548c\u6bc5\u529b\u53f7\u4e0a\u7684AutoNav\uff08\u81ea\u4e3b\u5bfc\u822a\uff09\u6781\u5927\u5730\u63d0\u9ad8\u4e86\u81ea\u4e3b\u6027\u3002\u6f2b\u6e38\u8f66\u4f7f\u7528\u7acb\u4f53\u76f8\u673a\u6784\u5efa\u5c40\u90e83D\u5730\u56fe\uff08\u56de\u987e\u7b2c8\u7ae0\u7684\u7acb\u4f53\u6df1\u5ea6\uff09\uff0c\u8bc4\u4f30\u5730\u5f62\u53ef\u901a\u8fc7\u6027\uff08\u5761\u5ea6\u3001\u7c97\u7cd9\u5ea6\u3001\u5ca9\u77f3\u5927\u5c0f\uff09\uff0c\u5e76\u4f7f\u7528\u57fa\u4e8e\u7f51\u683c\u7684\u89c4\u5212\u5668\u548c\u53ef\u901a\u8fc7\u6027\u4ee3\u4ef7\u56fe\u89c4\u5212\u5b89\u5168\u8def\u5f84\u3002\u6f2b\u6e38\u8f66\u5728\u4eba\u7c7b\u56e2\u961f\u7761\u7720\u65f6\u81ea\u4e3b\u884c\u9a76\uff0c\u5c06\u6bcf\u65e5\u884c\u8fdb\u8ddd\u79bb\u63d0\u9ad8\u5230100\u7c73\u4ee5\u4e0a\u3002
\u706b\u661f\u6f2b\u6e38\u8f66\u4e0a\u7684\u611f\u77e5\u6d41\u7a0b\u53d7\u5230\u6297\u8f90\u5c04\u5904\u7406\u5668\u7684\u9650\u5236\uff0c\u8fd9\u4e9b\u5904\u7406\u5668\u6bd4\u6d88\u8d39\u7ea7\u786c\u4ef6\u6162\u51e0\u4e2a\u6570\u91cf\u7ea7\uff08\u4e0b\u6587\u8ba8\u8bba\uff09\u3002\u7b97\u6cd5\u5fc5\u987b\u8ba1\u7b97\u8282\u4fed\uff1a\u7ecf\u5178\u7684\u7acb\u4f53\u5339\u914d\u800c\u975e\u6df1\u5ea6\u795e\u7ecf\u7f51\u7edc\uff0c\u7b80\u5355\u7684\u4ee3\u4ef7\u56fe\u89c4\u5212\u5668\u800c\u975e\u5b66\u4e60\u578b\u7b56\u7565\u3002
\u5728\u8f68\u670d\u52a1\u6d89\u53ca\u5728\u8f68\u9053\u4e0a\u68c0\u67e5\u3001\u4fee\u7406\u3001\u52a0\u6cb9\u6216\u4f7f\u536b\u661f\u8131\u79bb\u8f68\u9053\u7684\u673a\u5668\u4eba\u3002\u968f\u7740\u592a\u7a7a\u53d8\u5f97\u66f4\u52a0\u62e5\u6324\uff0c\u8fd9\u662f\u4e00\u4e2a\u4e0d\u65ad\u589e\u957f\u7684\u9886\u57df\u3002OSAM-1\uff08NASA\uff09\u548c\u5546\u4e1a\u4f01\u4e1a\uff08Astroscale\u3001Northrop Grumman MEV\uff09\u7b49\u4efb\u52a1\u4f7f\u7528\u673a\u68b0\u81c2\u548c\u5bf9\u63a5\u673a\u6784\u6765\u670d\u52a1\u536b\u661f\u3002
\u6311\u6218\u5728\u4e8e\u8fd1\u8ddd\u79bb\u64cd\u4f5c\uff1a\u670d\u52a1\u822a\u5929\u5668\u5fc5\u987b\u63a5\u8fd1\u76ee\u6807\u536b\u661f\uff08\u53ef\u80fd\u6b63\u5728\u7ffb\u6eda\u3001\u4e0d\u5408\u4f5c\u4e14\u7f3a\u4e4f\u5bf9\u63a5\u63a5\u53e3\uff09\uff0c\u5e76\u5728\u5fae\u91cd\u529b\u4e0b\u6267\u884c\u7cbe\u786e\u64cd\u4f5c\u3002\u57fa\u4e8e\u89c6\u89c9\u7684\u4f4d\u59ff\u4f30\u8ba1\uff08\u4ece\u76f8\u673a\u56fe\u50cf\u786e\u5b9a\u76ee\u6807\u76843D\u4f4d\u7f6e\u548c\u65b9\u5411\uff09\u81f3\u5173\u91cd\u8981\u3002\u8fd9\u4f7f\u7528\u4e86\u7b2c8\u7ae0\u7684\u6280\u672f\uff1a\u7279\u5f81\u68c0\u6d4b\u3001PnP\uff08\u900f\u89c6n\u70b9\uff09\u6c42\u89e3\uff0c\u4ee5\u53ca\u6700\u8fd1\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684\u4f4d\u59ff\u4f30\u8ba1\u5668\u3002
\u536b\u661f\u68c0\u67e5\u4f7f\u7528\u5c0f\u578b\u822a\u5929\u5668\u76ee\u89c6\u68c0\u67e5\u5176\u4ed6\u536b\u661f\u662f\u5426\u6709\u635f\u574f\u6216\u5f02\u5e38\u3002\u68c0\u67e5\u8005\u5fc5\u987b\u81ea\u4e3b\u7ed5\u76ee\u6807\u5bfc\u822a\u3001\u907f\u514d\u78b0\u649e\u5e76\u4ece\u6700\u4f73\u89c6\u89d2\u6355\u83b7\u9ad8\u5206\u8fa8\u7387\u56fe\u50cf\u3002\u8fd9\u662f\u4e00\u4e2a\u89c4\u5212\u95ee\u9898\uff1a\u627e\u5230\u8986\u76d6\u6240\u6709\u68c0\u67e5\u70b9\u4e14\u6ee1\u8db3\u71c3\u6599\u7ea6\u675f\u3001\u5149\u7167\u6761\u4ef6\u548c\u907f\u78b0\u8981\u6c42\u7684\u8f68\u8ff9\u3002
\u5728\u592a\u7a7a\u4e2d\uff0c\u901a\u4fe1\u53d7\u5230\u5149\u901f\u3001\u53ef\u7528\u5e26\u5bbd\u548c\u8f68\u9053\u51e0\u4f55\u7684\u9650\u5236\uff08\u706b\u661f\u80cc\u9762\u7684\u6f2b\u6e38\u8f66\u5728\u6ca1\u6709\u4e2d\u7ee7\u536b\u661f\u7684\u60c5\u51b5\u4e0b\u6839\u672c\u65e0\u6cd5\u4e0e\u5730\u7403\u901a\u4fe1\uff09\u3002
\u8fd9\u4e9b\u9650\u5236\u4ece\u6839\u672c\u4e0a\u6539\u53d8\u4e86\u81ea\u4e3b\u6027\u67b6\u6784\u3002\u5728\u5730\u7403\u4e0a\uff0c\u673a\u5668\u4eba\u53ef\u4ee5\u5c06\u9ad8\u6e05\u89c6\u9891\u6d41\u4f20\u8f93\u5230\u4e91\u670d\u52a1\u5668\uff0c\u5728GPU\u96c6\u7fa4\u4e0a\u8fd0\u884c\u63a8\u7406\uff0c\u5e76\u5728\u6beb\u79d2\u5185\u63a5\u6536\u6307\u4ee4\u3002\u5728\u592a\u7a7a\u4e2d\uff0c\u673a\u5668\u4eba\u5fc5\u987b\u5728\u98de\u884c\u5668\u4e0a\u5b8c\u6210\u6240\u6709\u5de5\u4f5c\u3002
\u9ad8\u5ef6\u8fdf\u610f\u5473\u7740\u673a\u5668\u4eba\u5fc5\u987b\u5728\u6ca1\u6709\u5b9e\u65f6\u4eba\u7c7b\u6307\u5bfc\u7684\u60c5\u51b5\u4e0b\u89c4\u5212\u548c\u884c\u52a8\u3002\u81ea\u4e3b\u8f6f\u4ef6\u5fc5\u987b\u5904\u7406\u5e38\u89c4\u64cd\u4f5c\u3001\u68c0\u6d4b\u5f02\u5e38\u5e76\u54cd\u5e94\u5371\u9669\uff0c\u800c\u65e0\u9700\u7b49\u5f85\u4eba\u7c7b\u8f93\u5165\u3002\u8fd9\u9700\u8981\u9c81\u68d2\u7684\u677f\u8f7d\u72b6\u6001\u4f30\u8ba1\u3001\u6545\u969c\u68c0\u6d4b\u548c\u5e94\u6025\u89c4\u5212\u3002
\u6709\u9650\u5e26\u5bbd\u610f\u5473\u7740\u673a\u5668\u4eba\u65e0\u6cd5\u4f20\u8f93\u539f\u59cb\u4f20\u611f\u5668\u6570\u636e\u3002\u4e00\u5f20\u9ad8\u5206\u8fa8\u7387\u56fe\u50cf\u53ef\u80fd\u6709\u51e0\u5146\u5b57\u8282\uff0c\u4f46\u706b\u661f\u5230\u5730\u7403\u7684\u6570\u636e\u901f\u7387\u901a\u8fc7\u76f4\u63a5\u5bf9\u5730\u94fe\u8def\u53ea\u6709\u6bcf\u79d2\u51e0\u5343\u6bd4\u7279\uff08\u901a\u8fc7\u8f68\u9053\u4e2d\u7ee7\u66f4\u9ad8\uff0c\u4f46\u4ecd\u7136\u6709\u9650\uff09\u3002\u673a\u5668\u4eba\u5fc5\u987b\u79ef\u6781\u538b\u7f29\u6570\u636e\u3001\u4f18\u5148\u51b3\u5b9a\u53d1\u9001\u54ea\u4e9b\u6570\u636e\uff0c\u5e76\u5728\u672c\u5730\u505a\u51fa\u5927\u90e8\u5206\u51b3\u7b56\u3002
\u901a\u4fe1\u7a97\u53e3\u662f\u95f4\u6b47\u6027\u7684\u3002\u706b\u661f\u6f2b\u6e38\u8f66\u53ea\u80fd\u5728\u7279\u5b9a\u8f68\u9053\u51e0\u4f55\u5f62\u72b6\u671f\u95f4\u4e0e\u5730\u7403\u901a\u4fe1\uff0c\u901a\u5e38\u6bcf\u4e2a\u706b\u661f\u65e5\u901a\u8fc7\u4e2d\u7ee7\u536b\u661f\u53ea\u6709\u51e0\u5c0f\u65f6\u3002\u5728\u8fd9\u4e9b\u7a97\u53e3\u4e4b\u5916\uff0c\u6f2b\u6e38\u8f66\u5b8c\u5168\u9760\u81ea\u5df1\u3002
\u5bf9AI\u7684\u5f71\u54cd\u662f\u677f\u8f7d\u81ea\u4e3b\u6027\u5fc5\u987b\u975e\u5e38\u53ef\u9760\u3002\u7cfb\u7edf\u9700\u8981\u68c0\u6d4b\u662f\u5426\u51fa\u4e86\u95ee\u9898\uff08\u8f6e\u5b50\u5361\u4f4f\u4e86\u3001\u4f20\u611f\u5668\u6545\u969c\u4e86\u3001\u524d\u65b9\u5730\u5f62\u65e0\u6cd5\u901a\u884c\uff09\uff0c\u51b3\u5b9a\u5b89\u5168\u54cd\u5e94\uff0c\u5e76\u7ee7\u7eed\u8fd0\u884c\u76f4\u5230\u4e0b\u4e00\u4e2a\u901a\u4fe1\u7a97\u53e3\uff0c\u5c4a\u65f6\u5b83\u53ef\u4ee5\u62a5\u544a\u5e76\u63a5\u6536\u66f4\u65b0\u6307\u4ee4\u3002
\u592a\u7a7a\u4e2d\u5145\u6ee1\u4e86\u7535\u79bb\u8f90\u5c04\uff1a\u5b87\u5b99\u5c04\u7ebf\u3001\u592a\u9633\u7c92\u5b50\u4e8b\u4ef6\u4ee5\u53ca\u884c\u661f\u78c1\u573a\u4e2d\u7684\u6355\u83b7\u8f90\u5c04\u3002\u9ad8\u80fd\u7c92\u5b50\u53ef\u4ee5\u7ffb\u8f6c\u5b58\u50a8\u5668\u4e2d\u7684\u6bd4\u7279\uff08\u5355\u7c92\u5b50\u7ffb\u8f6c\uff0cSEU\uff09\uff0c\u6c38\u4e45\u635f\u574f\u6676\u4f53\u7ba1\uff08\u603b\u7535\u79bb\u5242\u91cf\uff0cTID\uff09\uff0c\u6216\u5728\u7535\u8def\u4e2d\u5f15\u8d77\u7834\u574f\u6027\u95e9\u9501\u3002
\u6297\u8f90\u5c04\u5904\u7406\u5668\u88ab\u8bbe\u8ba1\u4e3a\u627f\u53d7\u8fd9\u79cd\u73af\u5883\u3002\u5b83\u4eec\u4f7f\u7528\u66f4\u5927\u7684\u6676\u4f53\u7ba1\u51e0\u4f55\u5c3a\u5bf8\u3001\u5197\u4f59\u903b\u8f91\uff08\u4e09\u6a21\u5197\u4f59\uff1a\u6bcf\u4e2a\u7535\u8def\u6709\u4e09\u4e2a\u526f\u672c\u5bf9\u8f93\u51fa\u8fdb\u884c\u6295\u7968\uff09\u548c\u4e13\u95e8\u7684\u5236\u9020\u5de5\u827a\u3002\u4ee3\u4ef7\u662f\u6027\u80fd\uff1a\u6700\u5148\u8fdb\u7684\u6297\u8f90\u5c04\u5904\u7406\u5668\u53ef\u80fd\u63d0\u4f9b200 MIPS\uff0c\u800c\u6d88\u8d39\u7ea7GPU\u6bcf\u79d2\u53ef\u6267\u884c\u6570\u5341\u4ebf\u6b21\u64cd\u4f5c\u3002
RAD750\uff08BAE Systems\uff09\u4e3a\u597d\u5947\u53f7\u548c\u8bb8\u591a\u5176\u4ed6\u822a\u5929\u5668\u63d0\u4f9b\u52a8\u529b\u3002\u5b83\u4ee5200 MHz\u8fd0\u884c\uff0c\u7ea6400 MIPS\u7684\u5904\u7406\u80fd\u529b\uff0c\u76f8\u5f53\u4e8e1990\u5e74\u4ee3\u4e2d\u671f\u7684\u53f0\u5f0f\u7535\u8111\u3002\u6bc5\u529b\u53f7\u4f7f\u7528\u7c7b\u4f3c\u7b49\u7ea7\u7684\u5904\u7406\u5668\u3002\u5728\u73b0\u4ee3\u795e\u7ecf\u7f51\u7edc\u4e0a\u8fd0\u884c\uff08\u6570\u767e\u4e07\u53c2\u6570\u3001\u6570\u5341\u4ebf\u6b21\u4e58\u52a0\u8fd0\u7b97\uff09\u5728\u8fd9\u6837\u7684\u786c\u4ef6\u4e0a\u662f\u4e0d\u53ef\u884c\u7684\u3002
\u6a21\u578b\u538b\u7f29\u53d8\u5f97\u81f3\u5173\u91cd\u8981\u3002\u7b2c6\u7ae0\u7684\u6280\u672f\uff08\u91cf\u5316\u3001\u526a\u679d\u3001\u77e5\u8bc6\u84b8\u998f\uff09\u7528\u4e8e\u7f29\u5c0f\u795e\u7ecf\u7f51\u7edc\u4ee5\u9002\u5e94\u6781\u7aef\u7684\u8ba1\u7b97\u9884\u7b97\u3002\u5728\u7b14\u8bb0\u672c\u7535\u8111GPU\u4e0a\u6beb\u79d2\u7ea7\u8fd0\u884c\u7684\u6a21\u578b\u53ef\u80fd\u5728\u6297\u8f90\u5c04\u5904\u7406\u5668\u4e0a\u9700\u8981\u6570\u5206\u949f\uff0c\u6216\u8005\u6839\u672c\u65e0\u6cd5\u88c5\u5165\u5185\u5b58\u3002
\u53e6\u4e00\u79cd\u65b9\u6cd5\u4f7f\u7528\u5546\u7528\u73b0\u8d27\u5904\u7406\u5668\uff0c\u914d\u5408\u8f6f\u4ef6\u4e2d\u7684\u8f90\u5c04\u7f13\u89e3\u63aa\u65bd\uff1a\u7ea0\u9519\u7801\u3001\u770b\u95e8\u72d7\u5b9a\u65f6\u5668\u3001\u5b9a\u671f\u5185\u5b58\u6e05\u7406\u548c\u4f18\u96c5\u964d\u7ea7\u7b56\u7565\u3002\u4e00\u4e9b\u73b0\u4ee3\u4efb\u52a1\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u4ee5\u83b7\u5f97\u66f4\u5f3a\u5927\u7684\u8ba1\u7b97\u80fd\u529b\uff0c\u4ee3\u4ef7\u662f\u589e\u52a0\u4e86\u8f6f\u4ef6\u590d\u6742\u6027\u548c\u98ce\u9669\u3002
\u672a\u6765\u7684\u884c\u661f\u4efb\u52a1\u6b63\u5728\u63a2\u7d22FPGA\u548c\u4e13\u95e8\u7684AI\u52a0\u901f\u5668\uff0c\u5b83\u4eec\u53ef\u4ee5\u5177\u6709\u8010\u8f90\u5c04\u6027\uff0c\u540c\u65f6\u63d0\u4f9b\u6bd4\u4f20\u7edf\u6297\u8f90\u5c04CPU\u591a\u5f97\u591a\u7684\u8ba1\u7b97\u80fd\u529b\uff0c\u53ef\u80fd\u9996\u6b21\u5b9e\u73b0\u677f\u8f7d\u6df1\u5ea6\u5b66\u4e60\u3002
\u5728\u5730\u7403\u4e0a\uff0c\u9053\u8def\u5e73\u5766\u3001\u6807\u8bb0\u6e05\u6670\u4e14\u6709\u5730\u56fe\u3002\u5728\u706b\u661f\u3001\u6708\u7403\u6216\u707e\u96be\u73b0\u573a\uff0c\u6ca1\u6709\u9053\u8def\u3002\u5730\u5f62\u662f\u975e\u7ed3\u6784\u5316\u7684\uff1a\u5ca9\u77f3\u3001\u659c\u5761\u3001\u6c99\u5730\u3001\u88c2\u7f1d\u548c\u53ef\u80fd\u65e0\u6cd5\u652f\u6491\u673a\u5668\u4eba\u91cd\u91cf\u7684\u8868\u9762\u3002
\u5730\u5f62\u5206\u7c7b\u8bc4\u4f30\u6bcf\u5757\u5730\u9762\u662f\u5426\u5b89\u5168\u901a\u884c\u3002\u7279\u5f81\u5305\u62ec\u5761\u5ea6\uff08\u6765\u81ea3D\u91cd\u5efa\uff09\u3001\u7c97\u7cd9\u5ea6\uff08\u8868\u9762\u6cd5\u7ebf\u7684\u65b9\u5dee\uff09\u3001\u5ca9\u77f3\u5bc6\u5ea6\u548c\u571f\u58e4\u7c7b\u578b\u3002\u7ecf\u5178\u65b9\u6cd5\u4ece\u7acb\u4f53\u6df1\u5ea6\u56fe\u8ba1\u7b97\u8fd9\u4e9b\u7279\u5f81\uff1b\u73b0\u4ee3\u65b9\u6cd5\u5728\u89c6\u89c9\u548c\u51e0\u4f55\u7279\u5f81\u4e0a\u4f7f\u7528\u5b66\u4e60\u578b\u5206\u7c7b\u5668\u3002
\u89c6\u89c9-\u60ef\u6027\u91cc\u7a0b\u8ba1\uff08VIO\uff09\u901a\u8fc7\u8ddf\u8e2a\u8de8\u76f8\u673a\u5e27\u7684\u89c6\u89c9\u7279\u5f81\u5e76\u4e0eIMU\u6d4b\u91cf\u878d\u5408\u6765\u4f30\u8ba1\u673a\u5668\u4eba\u7684\u8fd0\u52a8\u3002\u8fd9\u662fSLAM\u7684\u6838\u5fc3\u7ec4\u4ef6\uff08\u7b2c8\u7ae0\uff09\uff0c\u9488\u5bf9\u6781\u7aef\u6761\u4ef6\u8fdb\u884c\u4e86\u8c03\u6574\u3002\u5728\u706b\u661f\u4e0a\uff0cVIO\u5fc5\u987b\u5904\u7406\uff1a\u65e0\u7279\u5f81\u7684\u6c99\u5730\u5730\u5f62\uff08\u51e0\u4e4e\u6ca1\u6709\u53ef\u8ddf\u8e2a\u7684\u89c6\u89c9\u7279\u5f81\uff09\u3001\u5f3a\u70c8\u7684\u5149\u7167\uff08\u6781\u7aef\u9634\u5f71\uff09\u548c\u6709\u9650\u7684\u8ba1\u7b97\u80fd\u529b\u3002
\u4f30\u8ba1\u8fc7\u7a0b\u4f7f\u7528\u6269\u5c55\u5361\u5c14\u66fc\u6ee4\u6ce2\uff08EKF\uff09\u6216\u56e0\u5b50\u56fe\u4f18\u5316\u878d\u5408\u89c6\u89c9\u548c\u60ef\u6027\u6570\u636e\u3002\u72b6\u6001\u5411\u91cf\u5305\u62ec\u4f4d\u7f6e\u3001\u901f\u5ea6\u3001\u65b9\u5411\u548cIMU\u504f\u5dee\u3002\u9884\u6d4b\u6b65\u9aa4\u4f7f\u7528IMU\u79ef\u5206\uff1a
\u5176\u4e2d\\(\\\\mathbf{u}_t\\)\u662fIMU\u6d4b\u91cf\u503c\uff08\u52a0\u901f\u5ea6\u548c\u89d2\u901f\u5ea6\uff09\u3002\u66f4\u65b0\u6b65\u9aa4\u4f7f\u7528\u89c6\u89c9\u7279\u5f81\u89c2\u6d4b\u6765\u6821\u6b63\u9884\u6d4b\u3002\u8fd9\u662f\u8d1d\u53f6\u65af\u4f30\u8ba1\uff08\u7b2c5\u7ae0\uff09\uff1aIMU\u63d0\u4f9b\u5148\u9a8c\uff0c\u89c6\u89c9\u89c2\u6d4b\u66f4\u65b0\u4fe1\u5ff5\u3002
\u5371\u9669\u89c4\u907f\u5728\u884c\u661f\u7740\u9646\u8fc7\u7a0b\u4e2d\u81f3\u5173\u91cd\u8981\u3002\u5f53\u822a\u5929\u5668\u4e0b\u964d\u5411\u8868\u9762\u65f6\uff0c\u5b83\u5fc5\u987b\u4f7f\u7528\u677f\u8f7d\u76f8\u673a\u6216LiDAR\u5b9e\u65f6\u8bc6\u522b\u5b89\u5168\u7684\u7740\u9646\u533a\u3002NASA\u6bc5\u529b\u53f7\u4e0a\u7684\u5730\u5f62\u76f8\u5bf9\u5bfc\u822a\uff08TRN\uff09\u7cfb\u7edf\u5c06\u677f\u8f7d\u76f8\u673a\u56fe\u50cf\u4e0e\u9884\u52a0\u8f7d\u7684\u8f68\u9053\u5730\u56fe\u8fdb\u884c\u6bd4\u8f83\uff0c\u4ee5\u786e\u5b9a\u4e0b\u964d\u8fc7\u7a0b\u4e2d\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u907f\u5f00\u5371\u9669\u5730\u5f62\u3002\u8fd9\u4f7f\u5f97\u5728Jezero\u9668\u77f3\u5751\u7740\u9646\u6210\u4e3a\u53ef\u80fd\u2014\u2014\u4e00\u4e2a\u79d1\u5b66\u4e30\u5bcc\u4f46\u5730\u5f62\u5371\u9669\u7684\u7ad9\u70b9\uff0c\u5bf9\u4e8e\u4ee5\u524d\u7684 missions \u6765\u8bf4\u98ce\u9669\u592a\u5927\u3002
\u6df1\u6d77\u4e0e\u592a\u7a7a\u4e00\u6837\u964c\u751f\uff1a\u538b\u788e\u6027\u538b\u529b\uff08\u5168\u6d77\u6df11000+\u4e2a\u5927\u6c14\u538b\uff09\u3001\u63a5\u8fd1\u96f6\u80fd\u89c1\u5ea6\u3001\u65e0GPS\u548c\u6709\u9650\u7684\u901a\u4fe1\u3002\u6c34\u4e0b\u673a\u5668\u4eba\u5bf9\u6d77\u6d0b\u79d1\u5b66\u3001\u8fd1\u6d77\u57fa\u7840\u8bbe\u65bd\u68c0\u67e5\u3001\u6df1\u6d77\u91c7\u77ff\u548c\u641c\u7d22\u64cd\u4f5c\u81f3\u5173\u91cd\u8981\u3002
AUV\uff08\u81ea\u4e3b\u6c34\u4e0b\u822a\u884c\u5668\uff09\u65e0\u7f06\u8fd0\u884c\uff0c\u643a\u5e26\u81ea\u5df1\u7684\u7535\u529b\u548c\u8ba1\u7b97\u8d44\u6e90\u3002\u5b83\u4eec\u9075\u5faa\u9884\u8bbe\u7684\u6d4b\u91cf\u6a21\u5f0f\u6216\u4f7f\u7528\u677f\u8f7d\u667a\u80fd\u6765\u9002\u5e94\u53d1\u73b0\u3002AUV\u7528\u4e8e\u6d77\u5e95\u6d4b\u7ed8\u3001\u7ba1\u9053\u68c0\u67e5\u548c\u73af\u5883\u76d1\u6d4b\u3002
ROV\uff08\u9065\u63a7\u6c34\u4e0b\u822a\u884c\u5668\uff09\u901a\u8fc7\u7535\u7f06\u8fde\u63a5\u5230\u6c34\u9762\u8239\u53ea\uff0c\u63d0\u4f9b\u7535\u529b\u548c\u901a\u4fe1\u3002\u5b83\u4eec\u7528\u4e8e\u9700\u8981\u5b9e\u65f6\u4eba\u7c7b\u63a7\u5236\u7684\u4efb\u52a1\uff1a\u6df1\u6d77\u64cd\u4f5c\u3001\u5efa\u9020\u548c\u4fee\u7406\u3002\u7f06\u7ebf\u6d88\u9664\u4e86\u901a\u4fe1\u9650\u5236\uff0c\u4f46\u9650\u5236\u4e86\u8303\u56f4\u5e76\u589e\u52a0\u4e86\u64cd\u4f5c\u590d\u6742\u6027\u3002
\u58f0\u5b66\u901a\u4fe1\u662f\u4e3b\u8981\u7684\u6c34\u4e0b\u901a\u4fe1\u65b9\u6cd5\uff08\u65e0\u7ebf\u7535\u6ce2\u5728\u6c34\u4e2d\u8fc5\u901f\u8870\u51cf\uff09\u3002\u58f0\u5b66\u8c03\u5236\u89e3\u8c03\u5668\u5728\u51e0\u516c\u91cc\u8303\u56f4\u5185\u8fbe\u52301-10 kbps\u7684\u6570\u636e\u901f\u7387\uff0c\u800c\u9646\u5730\u4e0a\u65e0\u7ebf\u7535\u53ef\u8fbe\u5409\u6bd4\u7279\u6bcf\u79d2\u3002\u8fd9\u751a\u81f3\u6bd4\u706b\u661f\u901a\u4fe1\u66f4\u52a0\u53d7\u9650\uff0c\u8feb\u4f7fAUV\u9ad8\u5ea6\u81ea\u4e3b\u3002
\u6c34\u4e0bSLAM\u5c24\u5176\u5177\u6709\u6311\u6218\u6027\u3002\u58f0\u7eb3\u63d0\u4f9b\u8ddd\u79bb\u6d4b\u91cf\uff0c\u4f46\u89d2\u5206\u8fa8\u7387\u5dee\u4e14\u566a\u58f0\u5927\uff08\u6765\u81ea\u6d77\u5e95\u548c\u6c34\u9762\u7684\u591a\u5f84\u53cd\u5c04\uff09\u3002\u76f8\u673a\u53ea\u80fd\u5728\u975e\u5e38\u77ed\u7684\u8ddd\u79bb\u5185\u5de5\u4f5c\uff08\u6e05\u6f88\u6c34\u4e2d\u51e0\u7c73\uff0c\u6d51\u6d4a\u6761\u4ef6\u4e0b\u66f4\u77ed\uff09\u3002\u57fa\u4e8e\u7279\u5f81\u7684\u53ef\u89c6SLAM\uff08\u7b2c8\u7ae0\uff09\u5fc5\u987b\u9488\u5bf9\u6c34\u4e0b\u573a\u666f\u7684\u72ec\u7279\u89c6\u89c9\u7279\u5f81\u8fdb\u884c\u8c03\u6574\uff1a\u989c\u8272\u8870\u51cf\uff08\u7ea2\u5149\u9996\u5148\u88ab\u5438\u6536\uff09\u3001\u53cd\u5411\u6563\u5c04\u4ee5\u53ca\u4ea7\u751f\u4eae\u6591\u548c\u6df1\u5f71\u7684\u4eba\u5de5\u7167\u660e\u3002
\u65e0GPS\u5bfc\u822a\u4f7f\u7528\u822a\u4f4d\u63a8\u7b97\uff08\u79ef\u5206\u6765\u81ea\u591a\u666e\u52d2\u6d4b\u901f\u4eeaDVL\u7684\u901f\u5ea6\uff0c\u8be5\u4eea\u5668\u5229\u7528\u58f0\u5b66\u591a\u666e\u52d2\u9891\u79fb\u6d4b\u91cf\u76f8\u5bf9\u4e8e\u6d77\u5e95\u7684\u901f\u5ea6\uff09\uff0c\u8f85\u4ee5\u5076\u5c14\u6d6e\u51fa\u6c34\u9762\u83b7\u53d6GPS\u5b9a\u4f4d\u6216\u6765\u81ea\u6c34\u9762\u5e94\u7b54\u5668\u7684\u58f0\u5b66\u5b9a\u4f4d\u3002\u8fd9\u4e0e\u4ec5IMU\u5bfc\u822a\u76f8\u540c\u7684\u6f02\u79fb\u95ee\u9898\uff1a\u5c0f\u7684\u901f\u5ea6\u8bef\u5dee\u5728\u957f\u4efb\u52a1\u4e2d\u7d2f\u79ef\u3002
\u5728\u5730\u9707\u3001\u5efa\u7b51\u7269\u5012\u584c\u6216\u5de5\u4e1a\u4e8b\u6545\u540e\uff0c\u673a\u5668\u4eba\u53ef\u4ee5\u8fdb\u5165\u5bf9\u4eba\u7c7b\u6551\u63f4\u4eba\u5458\u592a\u5371\u9669\u7684\u533a\u57df\uff1a\u7ed3\u6784\u4e0d\u7a33\u5b9a\u7684\u5efa\u7b51\u7269\u3001\u6709\u6bd2\u73af\u5883\u3001\u706b\u573a\u6216\u5bc6\u95ed\u7a7a\u95f4\u3002
\u9700\u6c42\u662f\uff1a\u5feb\u901f\u90e8\u7f72\uff08\u51e0\u5206\u949f\u800c\u975e\u51e0\u5c0f\u65f6\uff09\u3001\u5728GPS\u53d7\u9650\u73af\u5883\u4e2d\u8fd0\u884c\uff08\u5efa\u7b51\u7269\u5185\u90e8\u3001\u5730\u4e0b\uff09\u3001\u901a\u8fc7\u5899\u58c1\u548c\u74e6\u783e\u7684\u9c81\u68d2\u901a\u4fe1\uff0c\u4ee5\u53ca\u5bfc\u822a\u9ad8\u5ea6\u6742\u4e71\u3001\u90e8\u5206\u574d\u584c\u7a7a\u95f4\u7684\u80fd\u529b\uff0c\u8fd9\u4e9b\u7a7a\u95f4\u5145\u6ee1\u788e\u7247\u3001\u7070\u5c18\u548c\u4e0d\u826f\u7167\u660e\u3002
\u591a\u673a\u5668\u4eba\u534f\u8c03\u5728\u641c\u7d22\u6551\u63f4\u4e2d\u5f88\u6709\u4ef7\u503c\uff0c\u56e0\u4e3a\u4e00\u652f\u673a\u5668\u4eba\u56e2\u961f\u53ef\u4ee5\u6bd4\u5355\u4e2a\u673a\u5668\u4eba\u66f4\u5feb\u5730\u8986\u76d6\u5927\u9762\u79ef\u3002\u6311\u6218\u5728\u4e8e\u534f\u8c03\uff1a\u673a\u5668\u4eba\u5fc5\u987b\u5212\u5206\u641c\u7d22\u533a\u57df\u3001\u907f\u514d\u91cd\u590d\u5de5\u4f5c\u5e76\u5171\u4eab\u53d1\u73b0\u3002
\u524d\u6cbf\u63a2\u7d22\u5c06\u673a\u5668\u4eba\u5206\u914d\u5230\u5df2\u63a2\u7d22\u548c\u672a\u63a2\u7d22\u7a7a\u95f4\u4e4b\u95f4\u7684\u8fb9\u754c\uff08\"\u524d\u6cbf\"\uff09\u3002\u6bcf\u4e2a\u673a\u5668\u4eba\u5bfc\u822a\u5230\u6700\u8fd1\u7684\u672a\u63a2\u7d22\u524d\u6cbf\u3001\u7ed8\u5236\u5730\u56fe\u5e76\u7ee7\u7eed\u524d\u8fdb\u3002\u4e2d\u592e\u6216\u5206\u5e03\u5f0f\u89c4\u5212\u5668\u5c06\u524d\u6cbf\u5206\u914d\u7ed9\u673a\u5668\u4eba\u4ee5\u6700\u5c0f\u5316\u603b\u63a2\u7d22\u65f6\u95f4\u3002\u8fd9\u662f\u4e00\u4e2a\u8986\u76d6\u4f18\u5316\u95ee\u9898\u3002
\u901a\u8fc7\u74e6\u783e\u7684\u901a\u4fe1\u4e0d\u53ef\u9760\u3002\u673a\u5668\u4eba\u53ef\u80fd\u5931\u53bb\u4e0e\u63a7\u5236\u53f0\u548c\u5f7c\u6b64\u7684\u8054\u7cfb\u3002\u7cfb\u7edf\u5fc5\u987b\u5bf9\u95f4\u6b47\u901a\u4fe1\u5177\u6709\u9c81\u68d2\u6027\uff1a\u6bcf\u4e2a\u673a\u5668\u4eba\u5e94\u80fd\u72ec\u7acb\u8fd0\u884c\uff0c\u6784\u5efa\u81ea\u5df1\u7684\u5c40\u90e8\u5730\u56fe\u5e76\u505a\u51fa\u81ea\u5df1\u7684\u51b3\u7b56\uff0c\u7136\u540e\u5728\u901a\u4fe1\u6062\u590d\u65f6\u5408\u5e76\u4fe1\u606f\u3002
\u7fa4\u4f53\u673a\u5668\u4eba\u4f7f\u7528\u5927\u91cf\u7b80\u5355\u3001\u4f4e\u6210\u672c\u7684\u673a\u5668\u4eba\uff0c\u901a\u8fc7\u5c40\u90e8\u4ea4\u4e92\u5b9e\u73b0\u590d\u6742\u7684\u96c6\u4f53\u884c\u4e3a\u3002\u6ca1\u6709\u5355\u4e2a\u673a\u5668\u4eba\u5355\u72ec\u5177\u5907\u80fd\u529b\uff0c\u4f46\u6574\u4e2a\u7fa4\u4f53\u53ef\u4ee5\u6267\u884c\u5355\u4e2a\u673a\u5668\u4eba\u65e0\u6cd5\u5b8c\u6210\u7684\u4efb\u52a1\u3002
\u7075\u611f\u6765\u81ea\u751f\u7269\u7fa4\u4f53\uff1a\u8682\u8681\u7528\u8eab\u4f53\u642d\u6865\u3001\u871c\u8702\u96c6\u4f53\u51b3\u5b9a\u5de2\u7a74\u4f4d\u7f6e\u3001\u9c7c\u7fa4\u901a\u8fc7\u534f\u8c03\u8fd0\u52a8\u8eb2\u907f\u6355\u98df\u8005\u3002\u5728\u6bcf\u79cd\u60c5\u51b5\u4e0b\uff0c\u7b80\u5355\u7684\u5c40\u90e8\u89c4\u5219\uff08\u8ddf\u968f\u90bb\u5c45\u3001\u907f\u514d\u78b0\u649e\u3001\u5411\u98df\u7269\u79fb\u52a8\uff09\u4ea7\u751f\u590d\u6742\u7684\u5168\u5c40\u884c\u4e3a\u3002
\u53bb\u4e2d\u5fc3\u5316\u63a7\u5236\u610f\u5473\u7740\u6ca1\u6709\u4e2d\u592e\u6307\u6325\u5b98\u3002\u6bcf\u4e2a\u673a\u5668\u4eba\u9075\u5faa\u76f8\u540c\u7684\u5c40\u90e8\u89c4\u5219\uff0c\u4ec5\u5bf9\u5176\u90bb\u5c45\u548c\u5373\u65f6\u73af\u5883\u4f5c\u51fa\u53cd\u5e94\u3002\u5168\u5c40\u884c\u4e3a\u4ece\u8fd9\u4e9b\u5c40\u90e8\u4ea4\u4e92\u4e2d\u6d8c\u73b0\u3002\u8fd9\u4f7f\u5f97\u7fa4\u4f53\u5177\u6709\u56fa\u6709\u7684\u9c81\u68d2\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u673a\u5668\u4eba\u5931\u6548\uff0c\u7fa4\u4f53\u7ee7\u7eed\u8fd0\u884c\u3002\u6ca1\u6709\u5355\u70b9\u6545\u969c\u3002
\u5171\u8bc6\u7b97\u6cd5\u4f7f\u7fa4\u4f53\u80fd\u591f\u4ec5\u901a\u8fc7\u5c40\u90e8\u901a\u4fe1\u5c31\u96c6\u4f53\u51b3\u7b56\u8fbe\u6210\u4e00\u81f4\uff08\u4f8b\u5982\uff0c\u5411\u54ea\u4e2a\u65b9\u5411\u79fb\u52a8\u3001\u4f18\u5148\u5904\u7406\u54ea\u4e2a\u4efb\u52a1\uff09\u3002\u4e00\u4e2a\u7b80\u5355\u7684\u5171\u8bc6\u534f\u8bae\u8ba9\u6bcf\u4e2a\u673a\u5668\u4eba\u4e0e\u5176\u90bb\u5c45\u5e73\u5747\u5176\u503c\uff1a
\u7fa4\u96c6\u7b97\u6cd5\uff08Reynolds\u89c4\u5219\uff09\u901a\u8fc7\u6bcf\u4e2a\u673a\u5668\u4eba\u7684\u4e09\u4e2a\u7b80\u5355\u89c4\u5219\u4ea7\u751f\u534f\u8c03\u7684\u7fa4\u4f53\u8fd0\u52a8\uff1a
\u6bcf\u4e2a\u89c4\u5219\u662f\u673a\u5668\u4eba\u901f\u5ea6\u7684\u4e00\u4e2a\u5411\u91cf\u8d21\u732e\u3002\u8fd9\u4e9b\u5411\u91cf\u7684\u52a0\u6743\u548c\u4ea7\u751f\u81ea\u7136\u4e3b\u4e49\u7684\u7fa4\u96c6\u884c\u4e3a\u3002\u8fd9\u662f\u4e00\u4e2a\u5411\u91cf\u7684\u7ebf\u6027\u7ec4\u5408\uff08\u7b2c1\u7ae0\uff09\uff0c\u5176\u4e2d\u6743\u91cd\u63a7\u5236\u6bcf\u4e2a\u884c\u4e3a\u7684\u76f8\u5bf9\u91cd\u8981\u6027\u3002
\u7fa4\u4f53\u673a\u5668\u4eba\u7684\u5e94\u7528\u5305\u62ec\u73af\u5883\u76d1\u6d4b\uff08\u5728\u5927\u8303\u56f4\u5185\u5206\u5e03\u4f20\u611f\u5668\uff09\u3001\u7cbe\u51c6\u519c\u4e1a\uff08\u534f\u8c03\u65e0\u4eba\u673a\u8fdb\u884c\u4f5c\u7269\u55b7\u6d12\uff09\u3001\u5efa\u9020\uff08\u673a\u5668\u4eba\u96c6\u4f53\u7ec4\u88c5\u7ed3\u6784\uff09\u548c\u641c\u7d22\u64cd\u4f5c\uff08\u9ad8\u6548\u8986\u76d6\u5927\u9762\u79ef\uff09\u3002
\u5171\u4eab\u81ea\u4e3b\u6df7\u5408\u4e86\u4eba\u548c\u673a\u5668\u4eba\u7684\u63a7\u5236\u3002\u4e0d\u662f\u5b8c\u5168\u9065\u63a7\u64cd\u4f5c\uff08\u4eba\u7c7b\u63a7\u5236\u4e00\u5207\uff09\u6216\u5b8c\u5168\u81ea\u4e3b\uff08\u673a\u5668\u4eba\u63a7\u5236\u4e00\u5207\uff09\uff0c\u800c\u662f\u5171\u4eab\u81ea\u4e3b\u8ba9\u4eba\u7c7b\u63d0\u4f9b\u9ad8\u5c42\u610f\u56fe\uff0c\u540c\u65f6\u673a\u5668\u4eba\u5904\u7406\u5e95\u5c42\u6267\u884c\u3002\u4f8b\u5982\uff0c\u4eba\u7c7b\u53ef\u80fd\u6307\u5411\u4e00\u4e2a\u7269\u4f53\u8bf4\"\u6361\u8d77\u6765\"\uff0c\u7136\u540e\u673a\u5668\u4eba\u81ea\u4e3b\u89c4\u5212\u6293\u53d6\u548c\u624b\u81c2\u8fd0\u52a8\u3002
\u6570\u5b66\u4e0a\uff0c\u5171\u4eab\u81ea\u4e3b\u53ef\u4ee5\u5efa\u6a21\u4e3a\u4eba\u7c7b\u8f93\u5165\\(\\\\mathbf{u}_h\\)\u548c\u673a\u5668\u4eba\u81ea\u4e3b\u52a8\u4f5c\\(\\\\mathbf{u}_r\\)\u7684\u6df7\u5408\uff1a
\u5176\u4e2d\\(\\\\alpha \\\\in [0, 1]\\)\u662f\u6df7\u5408\u53c2\u6570\u3002\u5f53\\(\\\\alpha = 1\\)\u65f6\uff0c\u4eba\u7c7b\u5b8c\u5168\u63a7\u5236\uff08\u9065\u63a7\u64cd\u4f5c\uff09\u3002\u5f53\\(\\\\alpha = 0\\)\u65f6\uff0c\u673a\u5668\u4eba\u5b8c\u5168\u81ea\u4e3b\u3002\u81ea\u9002\u5e94\u5171\u4eab\u81ea\u4e3b\u6839\u636e\u60c5\u51b5\u8c03\u6574\\(\\\\alpha\\)\uff1a\u673a\u5668\u4eba\u5728\u81ea\u4fe1\u65f6\u63a5\u7ba1\u66f4\u591a\u63a7\u5236\uff0c\u5728\u4e0d\u786e\u5b9a\u6216\u60c5\u51b5\u65b0\u9896\u65f6\u8ba9\u51fa\u63a7\u5236\u3002
\u9065\u63a7\u64cd\u4f5c\u5bf9\u4e8e\u8d85\u51fa\u5f53\u524d\u81ea\u4e3b\u80fd\u529b\u7684\u4efb\u52a1\u4ecd\u7136\u5f88\u91cd\u8981\u3002\u4eba\u7c7b\u64cd\u4f5c\u5458\u901a\u8fc7\u673a\u5668\u4eba\u7684\u76f8\u673a\u8fdc\u7a0b\u67e5\u770b\u573a\u666f\u5e76\u63a7\u5236\u673a\u5668\u4eba\u3002\u6311\u6218\u662f\u5ef6\u8fdf\uff1a\u5373\u4f7f100\u6beb\u79d2\u7684\u5ef6\u8fdf\u4e5f\u4f1a\u4f7f\u9065\u63a7\u64cd\u4f5c\u53d8\u5f97\u56f0\u96be\uff0c\u800c\u592a\u7a7a\u4e2d\u7684\u591a\u79d2\u5ef6\u8fdf\u4f7f\u5176\u5bf9\u7cbe\u7ec6\u64cd\u4f5c\u51e0\u4e4e\u4e0d\u53ef\u80fd\u3002\u9884\u6d4b\u663e\u793a\uff08\u663e\u793a\u673a\u5668\u4eba\u9884\u6d4b\u7684\u672a\u6765\u72b6\u6001\uff09\u548c\u865a\u62df\u5939\u5177\uff08\u9632\u6b62\u64cd\u4f5c\u5458\u547d\u4ee4\u5371\u9669\u8fd0\u52a8\u7684\u8f6f\u4ef6\u5f15\u5bfc\uff09\u6709\u52a9\u4e8e\u5f25\u8865\u3002
\u4fe1\u4efb\u6821\u51c6\u662f\u786e\u4fdd\u4eba\u7c7b\u5bf9\u673a\u5668\u4eba\u6709\u9002\u5f53\u4fe1\u4efb\u7684\u95ee\u9898\uff1a\u4e0d\u8981\u592a\u591a\uff08\u8fc7\u5ea6\u4fe1\u4efb\u5bfc\u81f4\u81ea\u6ee1\uff0c\u5728\u9700\u8981\u65f6\u672a\u80fd\u5e72\u9884\uff09\uff0c\u4e5f\u4e0d\u8981\u592a\u5c11\uff08\u4fe1\u4efb\u4e0d\u8db3\u5bfc\u81f4\u4e0d\u5fc5\u8981\u5e72\u9884\u548c\u5229\u7528\u4e0d\u8db3\uff09\u3002\u4fe1\u4efb\u5e94\u8be5\u6821\u51c6\u5230\u673a\u5668\u4eba\u7684\u5b9e\u9645\u80fd\u529b\uff1a\u5728\u5b83\u5904\u7406\u5f97\u597d\u7684\u60c5\u51b5\u4e0b\u4fe1\u4efb\u5b83\uff0c\u5728\u63a5\u8fd1\u5176\u80fd\u529b\u8fb9\u7f18\u7684\u60c5\u51b5\u4e0b\u4fdd\u6301\u6000\u7591\u3002
\u7814\u7a76\u8868\u660e\uff0c\u4fe1\u4efb\u53d7\u4ee5\u4e0b\u56e0\u7d20\u7684\u5f71\u54cd\uff1a\u673a\u5668\u4eba\u7684\u900f\u660e\u5ea6\uff08\u5b83\u662f\u5426\u89e3\u91ca\u5176\u51b3\u7b56\uff1f\uff09\u3001\u53ef\u9760\u6027\uff08\u5b83\u662f\u53ef\u9884\u6d4b\u5730\u5931\u8d25\u8fd8\u662f\u968f\u673a\u5730\u5931\u8d25\uff1f\uff09\u4ee5\u53ca\u6c9f\u901a\uff08\u5b83\u662f\u5426\u8868\u8fbe\u4e0d\u786e\u5b9a\u6027\uff1f\uff09\u3002\u4e00\u4e2a\u8bf4\"\u6211\u5bf9\u6b64\u8def\u5f84\u53ea\u670940%\u7684\u7f6e\u4fe1\u5ea6\uff0c\u662f\u5426\u7ee7\u7eed\uff1f\"\u7684\u673a\u5668\u4eba\u6bd4\u4e00\u4e2a\u9ed8\u9ed8\u5411\u524d\u9a7e\u9a76\u7684\u673a\u5668\u4eba\u80fd\u505a\u51fa\u66f4\u597d\u7684\u4eba\u7c7b\u51b3\u7b56\u3002
\u673a\u5668\u4eba\u8fd0\u52a8\u4e2d\u7684\u53ef\u8bfb\u6027\u610f\u5473\u7740\u673a\u5668\u4eba\u4ee5\u4f20\u8fbe\u5176\u610f\u56fe\u7684\u65b9\u5f0f\u8fd0\u52a8\u7ed9\u9644\u8fd1\u7684\u4eba\u7c7b\u3002\u5982\u679c\u673a\u5668\u4eba\u4f38\u624b\u53bb\u62ff\u4e00\u4e2a\u7269\u4f53\uff0c\u5b83\u7684\u8def\u5f84\u5e94\u8be5\u4f7f\u5176\u76ee\u6807\u5bf9\u8c61\u663e\u800c\u6613\u89c1\uff0c\u5373\u4f7f\u5b83\u8fd8\u672a\u5230\u8fbe\u3002\u8fd9\u6d89\u53ca\u89c4\u5212\u6700\u5927\u5316\u89c2\u5bdf\u8005\u65e9\u671f\u63a8\u65ad\u76ee\u6807\u7684\u8f68\u8ff9\uff0c\u53ef\u4ee5\u5f62\u5f0f\u5316\u4e3a\u7ed9\u5b9a\u89c2\u5bdf\u5230\u7684\u90e8\u5206\u8f68\u8ff9\u65f6\u771f\u5b9e\u76ee\u6807\u7684\u540e\u9a8c\u6982\u7387\u6700\u5927\u5316\uff1a
\u6a21\u62df\u673a\u5668\u4eba\u7fa4\u4f53\u5c31\u76ee\u6807\u4f4d\u7f6e\u8fbe\u6210\u4e00\u81f4\u7684\u5171\u8bc6\u7b97\u6cd5\u3002\u4ece\u968f\u673a\u521d\u59cb\u4f4d\u7f6e\u5f00\u59cb\uff0c\u89c2\u5bdf\u6536\u655b\u8fc7\u7a0b\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nn_robots = 10\nrng = jax.random.PRNGKey(0)\npositions = jax.random.uniform(rng, (n_robots, 2), minval=-5, maxval=5)\n\n# \u901a\u4fe1\u56fe\uff1a\u6bcf\u4e2a\u673a\u5668\u4eba\u4e0e\u6700\u8fd1\u76843\u4e2a\u90bb\u5c45\u901a\u4fe1\ndef get_neighbours(positions, k=3):\n dists = jnp.linalg.norm(positions[:, None] - positions[None, :], axis=-1)\n # \u5bf9\u6bcf\u4e2a\u673a\u5668\u4eba\uff0c\u627e\u6700\u8fd1\u7684k\u4e2a\uff08\u6392\u9664\u81ea\u8eab\uff09\n neighbours = jnp.argsort(dists, axis=1)[:, 1:k+1]\n return neighbours\n\nhistory = [positions.copy()]\n\nfor step in range(30):\n neighbours = get_neighbours(positions)\n new_positions = jnp.zeros_like(positions)\n for i in range(n_robots):\n nbr_pos = positions[neighbours[i]]\n new_positions = new_positions.at[i].set(\n (positions[i] + nbr_pos.sum(axis=0)) / (len(neighbours[i]) + 1)\n )\n positions = new_positions\n history.append(positions.copy())\n\n# \u7ed8\u5236\u6536\u655b\u8fc7\u7a0b\nfig, axes = plt.subplots(1, 3, figsize=(15, 4))\nfor ax, step_idx, title in zip(axes, [0, 10, 29], [\"\u521d\u59cb\", \"\u7b2c10\u6b65\", \"\u6700\u7ec8\"]):\n h = history[step_idx]\n ax.scatter(h[:, 0], h[:, 1], s=50)\n ax.set_xlim(-6, 6); ax.set_ylim(-6, 6)\n ax.set_aspect(\"equal\"); ax.grid(True); ax.set_title(title)\nplt.suptitle(\"\u7fa4\u4f53\u5171\u8bc6\uff1a\u673a\u5668\u4eba\u6536\u655b\u5230\u4e00\u81f4\u6027\")\nplt.tight_layout()\nplt.show()\n \u5b9e\u73b0Reynolds\u7fa4\u96c6\u89c4\u5219\uff08\u5206\u79bb\u3001\u5bf9\u9f50\u3001\u5185\u805a\uff09\u5e76\u6a21\u62df\u4e00\u4e2a\u7fa4\u4f53\u4e00\u8d77\u79fb\u52a8\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nn = 30\nrng = jax.random.PRNGKey(1)\nk1, k2 = jax.random.split(rng)\npos = jax.random.uniform(k1, (n, 2), minval=-5, maxval=5)\nvel = jax.random.uniform(k2, (n, 2), minval=-0.5, maxval=0.5)\n\ndt = 0.1\nseparation_radius = 1.0\nneighbour_radius = 3.0\n\ntrajectories = [pos.copy()]\n\nfor _ in range(200):\n new_vel = jnp.zeros_like(vel)\n for i in range(n):\n diffs = pos - pos[i]\n dists = jnp.linalg.norm(diffs, axis=1)\n\n # \u534a\u5f84\u5185\u7684\u90bb\u5c45\uff08\u6392\u9664\u81ea\u8eab\uff09\n nbr_mask = (dists < neighbour_radius) & (dists > 0)\n sep_mask = (dists < separation_radius) & (dists > 0)\n\n # \u5206\u79bb\uff1a\u8fdc\u79bb\u975e\u5e38\u8fd1\u7684\u90bb\u5c45\n if sep_mask.any():\n sep = -diffs[sep_mask].sum(axis=0)\n else:\n sep = jnp.zeros(2)\n\n # \u5bf9\u9f50\uff1a\u5339\u914d\u90bb\u5c45\u7684\u5e73\u5747\u901f\u5ea6\n if nbr_mask.any():\n align = vel[nbr_mask].mean(axis=0) - vel[i]\n else:\n align = jnp.zeros(2)\n\n # \u5185\u805a\uff1a\u671d\u5411\u90bb\u5c45\u7684\u5e73\u5747\u4f4d\u7f6e\n if nbr_mask.any():\n cohesion = pos[nbr_mask].mean(axis=0) - pos[i]\n else:\n cohesion = jnp.zeros(2)\n\n new_vel = new_vel.at[i].set(vel[i] + 1.5 * sep + 0.5 * align + 0.3 * cohesion)\n\n # \u9650\u5236\u901f\u5ea6\n speeds = jnp.linalg.norm(new_vel, axis=1, keepdims=True)\n vel = jnp.where(speeds > 2.0, new_vel / speeds * 2.0, new_vel)\n pos = pos + vel * dt\n trajectories.append(pos.copy())\n\n# \u7ed8\u5236\u5feb\u7167\nfig, axes = plt.subplots(1, 3, figsize=(15, 4))\nfor ax, idx, title in zip(axes, [0, 50, 199], [\"\u5f00\u59cb\", \"\u7b2c50\u6b65\", \"\u7b2c200\u6b65\"]):\n p = trajectories[idx]\n v = vel if idx == 199 else jnp.zeros_like(vel)\n ax.scatter(p[:, 0], p[:, 1], s=20, c=\"blue\")\n ax.set_aspect(\"equal\"); ax.grid(True); ax.set_title(title)\n lim = max(abs(p).max() + 1, 6)\n ax.set_xlim(-lim, lim); ax.set_ylim(-lim, lim)\nplt.suptitle(\"Reynolds\u7fa4\u96c6\uff1a\u5206\u79bb+\u5bf9\u9f50+\u5185\u805a\")\nplt.tight_layout()\nplt.show()\n \u6a21\u62df\u5171\u4eab\u81ea\u4e3b\u6df7\u5408\uff1a\u4eba\u7c7b\u63d0\u4f9b\u5e26\u566a\u58f0\u7684\u65b9\u5411\u8f93\u5165\uff0c\u673a\u5668\u4eba\u7684\u81ea\u4e3b\u7cfb\u7edf\u63d0\u4f9b\u5230\u76ee\u6807\u7684\u5e73\u6ed1\u8def\u5f84\u3002\u7528\u4e0d\u540c\u7684alpha\u503c\u8fdb\u884c\u6df7\u5408\u3002
import jax\nimport jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\ngoal = jnp.array([10.0, 5.0])\npos = jnp.array([0.0, 0.0])\ndt = 0.1\n\nrng = jax.random.PRNGKey(3)\n\nfig, axes = plt.subplots(1, 3, figsize=(15, 4))\nfor ax, alpha in zip(axes, [1.0, 0.5, 0.0]):\n pos = jnp.array([0.0, 0.0])\n path = [pos.copy()]\n\n for step in range(150):\n # \u673a\u5668\u4eba\u81ea\u4e3b\uff1a\u5230\u76ee\u6807\u7684\u5e73\u6ed1\u8def\u5f84\n direction = goal - pos\n u_robot = direction / (jnp.linalg.norm(direction) + 1e-6) * 1.0\n\n # \u4eba\u7c7b\u8f93\u5165\uff1a\u5927\u81f4\u6b63\u786e\u7684\u65b9\u5411\u4f46\u6709\u566a\u58f0\n noise = jax.random.normal(jax.random.fold_in(rng, step), (2,)) * 0.5\n u_human = u_robot + noise\n\n # \u6df7\u5408\n u = alpha * u_human + (1 - alpha) * u_robot\n pos = pos + u * dt\n path.append(pos.copy())\n\n if jnp.linalg.norm(pos - goal) < 0.3:\n break\n\n path = jnp.stack(path)\n ax.plot(path[:, 0], path[:, 1], \"b-\", alpha=0.7)\n ax.plot(*goal, \"r*\", markersize=15)\n ax.plot(0, 0, \"go\", markersize=10)\n ax.set_title(f\"\u03b1={alpha:.1f} ({'\u4eba\u7c7b' if alpha==1 else '\u673a\u5668\u4eba' if alpha==0 else '\u5171\u4eab'})\")\n ax.set_xlim(-1, 12); ax.set_ylim(-3, 8)\n ax.set_aspect(\"equal\"); ax.grid(True)\n\nplt.suptitle(\"\u5171\u4eab\u81ea\u4e3b\uff1a\u6df7\u5408\u4eba\u7c7b\u4e0e\u673a\u5668\u4eba\u63a7\u5236\")\nplt.tight_layout()\nplt.show()\n \u51e0\u4f55\u6df1\u5ea6\u5b66\u4e60\u662f\u63ed\u793aCNN\u3001Transformer\u548cGNN\u7686\u9075\u5faa\u540c\u4e00\u539f\u7406\u2014\u2014\u5229\u7528\u5bf9\u79f0\u6027\u2014\u2014\u7684\u7edf\u4e00\u6846\u67b6\u3002\u672c\u7ae0\u6db5\u76d6\u5bf9\u79f0\u7fa4\u3001\u7fa4\u4f5c\u7528\u3001\u4e0d\u53d8\u6027\u3001\u7b49\u53d8\u6027\u3001\u4e94\u4e2a\u51e0\u4f55\u57df\u4ee5\u53ca\u5c3a\u5ea6\u5206\u79bb
\u5728\u672c\u4e66\u4e2d\uff0c\u6211\u4eec\u5df2\u7ecf\u5b66\u4e60\u4e86\u591a\u79cd\u67b6\u6784\uff1a\u56fe\u50cf\u7684CNN\uff08\u7b2c8\u7ae0\uff09\u3001\u8bed\u8a00\u7684Transformer\uff08\u7b2c7\u7ae0\uff09\u4ee5\u53ca\u5e8f\u5217\u51b3\u7b56\u7684RL\u7b56\u7565\uff08\u7b2c6\u7ae0\uff09\u3002\u5b83\u4eec\u770b\u4e0a\u53bb\u50cf\u662f\u4e3a\u5b8c\u5168\u4e0d\u540c\u7684\u95ee\u9898\u8bbe\u8ba1\u7684\u5b8c\u5168\u4e0d\u540c\u7684\u6a21\u578b\u3002\u4f46\u80cc\u540e\u5b58\u5728\u4e00\u4e2a\u66f4\u6df1\u5c42\u7684\u6a21\u5f0f\u3002
\u51e0\u4f55\u6df1\u5ea6\u5b66\u4e60\u63ed\u793a\u51fa\u6240\u6709\u8fd9\u4e9b\u67b6\u6784\u90fd\u662f\u540c\u4e00\u4e2a\u601d\u60f3\u7684\u5b9e\u4f8b\uff1a\u6784\u5efa\u5c0a\u91cd\u6570\u636e\u5bf9\u79f0\u6027\u7684\u7f51\u7edc\u3002CNN\u5229\u7528\u56fe\u50cf\u4e2d\u7684\u5e73\u79fb\u5bf9\u79f0\u6027\u3002Transformer\u5229\u7528\u5e8f\u5217\u4e2d\u7684\u7f6e\u6362\u5bf9\u79f0\u6027\uff08\u6ce8\u610f\u529b\u4e0d\u4f9d\u8d56\u4e8e\u7edd\u5bf9\u4f4d\u7f6e\uff09\u3002GNN\u5229\u7528\u56fe\u4e2d\u7684\u7f6e\u6362\u5bf9\u79f0\u6027\u3002\u4e00\u65e6\u770b\u6e05\u8fd9\u4e00\u70b9\uff0c\u4f17\u591a\u67b6\u6784\u5c31\u53d8\u6210\u4e86\u4e00\u4e2a\u7edf\u4e00\u7684\u8fde\u8d2f\u6846\u67b6\u3002
\u4e00\u4e2a\u5bf9\u8c61\u7684\u5bf9\u79f0\u6027\u662f\u4f7f\u5176\u4fdd\u6301\u4e0d\u53d8\u7684\u53d8\u6362\u3002\u6b63\u65b9\u5f62\u67098\u79cd\u5bf9\u79f0\u6027\uff1a4\u79cd\u65cb\u8f6c\uff080\u00b0\u300190\u00b0\u3001180\u00b0\u3001270\u00b0\uff09\u548c4\u79cd\u53cd\u5c04\u3002\u5706\u6709\u65e0\u9650\u591a\u79cd\uff1a\u4efb\u4f55\u7ed5\u5176\u4e2d\u5fc3\u7684\u65cb\u8f6c\u3002\u5173\u952e\u6d1e\u5bdf\u5728\u4e8e\uff0c\u5bf9\u79f0\u6027\u544a\u8bc9\u4f60\u4ec0\u4e48\u662f\u4e0d\u91cd\u8981\u7684\uff0c\u800c\u77e5\u9053\u4ec0\u4e48\u4e0d\u91cd\u8981\u7684\u5bf9\u4e8e\u5b66\u4e60\u6765\u8bf4\u6781\u4e3a\u5f3a\u5927\u3002
\u7528\u673a\u5668\u5b66\u4e60\u7684\u672f\u8bed\u6765\u8bf4\uff1a\u5982\u679c\u4e00\u4e2a\u4efb\u52a1\u5177\u6709\u5bf9\u79f0\u6027\uff0c\u90a3\u4e48\u65e0\u8bba\u770b\u5230\u8f93\u5165\u7684\u54ea\u79cd\"\u7248\u672c\"\uff0c\u6a21\u578b\u90fd\u5e94\u7ed9\u51fa\u76f8\u540c\u7684\u7b54\u6848\u3002\u732b\u68c0\u6d4b\u5668\u65e0\u8bba\u732b\u5728\u56fe\u50cf\u7684\u5de6\u4e0a\u89d2\u8fd8\u662f\u53f3\u4e0b\u89d2\u90fd\u5e94\u80fd\u5de5\u4f5c\u3002\u8fd9\u5c31\u662f\u5e73\u79fb\u5bf9\u79f0\u6027\u3002
\u5bf9\u79f0\u6027\u901a\u8fc7\u7fa4\u6765\u5f62\u5f0f\u5316\u3002\u4e00\u4e2a\u7fa4 \\(G\\) \u662f\u4e00\u4e2a\u5177\u6709\u56db\u4e2a\u6027\u8d28\u7684\u53d8\u6362\u96c6\u5408\uff1a
\u8fd9\u4e9b\u516c\u7406\u4e0e\u5411\u91cf\u7a7a\u95f4\uff08\u7b2c1\u7ae0\uff09\u7684\u516c\u7406\u76f8\u540c\uff0c\u4f46\u5e94\u7528\u4e8e\u53d8\u6362\u800c\u975e\u5411\u91cf\u3002\u5176\u8054\u7cfb\u5341\u5206\u6df1\u523b\uff1a\u7fa4\u4f5c\u7528\u4e8e\u5411\u91cf\u7a7a\u95f4\uff0c\u800c\u795e\u7ecf\u7f51\u7edc\u5fc5\u987b\u5c0a\u91cd\u8fd9\u79cd\u4f5c\u7528\u3002
\u6df1\u5ea6\u5b66\u4e60\u4e2d\u51fa\u73b0\u7684\u5173\u952e\u7fa4\uff1a
\u7fa4\u4f5c\u7528\u63cf\u8ff0\u4e86\u7fa4\u5982\u4f55\u53d8\u6362\u6570\u636e\u3002\u5982\u679c \\(G\\) \u662f\u4e00\u4e2a\u7fa4\uff0c\\(X\\) \u662f\u6570\u636e\u7a7a\u95f4\uff0c\u5219\u4f5c\u7528 \\(\\rho: G \\times X \\to X\\) \u5c06\u6bcf\u4e2a\u7fa4\u5143\u7d20 \\(g\\) \u548c\u6570\u636e\u70b9 \\(x\\) \u6620\u5c04\u5230\u4e00\u4e2a\u53d8\u6362\u540e\u7684\u70b9 \\(\\rho(g, x)\\)\u3002\u5bf9\u4e8e\u56fe\u50cf\uff0c\u5e73\u79fb\u7fa4\u901a\u8fc7\u5e73\u79fb\u50cf\u7d20\u5750\u6807\u6765\u4f5c\u7528\u3002\u5bf9\u4e8e\u56fe\uff0c\u5bf9\u79f0\u7fa4\u901a\u8fc7\u91cd\u65b0\u6807\u8bb0\u8282\u70b9\u6765\u4f5c\u7528\u3002
\u7ed9\u5b9a\u4e00\u4e2a\u5bf9\u79f0\u7fa4\uff0c\u51fd\u6570\u53ef\u4ee5\u901a\u8fc7\u4e24\u79cd\u91cd\u8981\u65b9\u5f0f\u4e0e\u4e4b\u5173\u8054\uff1a
\u51fd\u6570 \\(f\\) \u5bf9\u7fa4 \\(G\\) \u662f\u4e0d\u53d8\u7684\uff0c\u5982\u679c\u8f93\u5165\u53d8\u6362\u540e\u8f93\u51fa\u4e0d\u53d8\uff1a
\u793a\u4f8b\uff1a\u56fe\u50cf\u7684\u603b\u4f53\u4eae\u5ea6\u4e0d\u56e0\u5e73\u79fb\u800c\u6539\u53d8\u3002\u56fe\u50cf\u5206\u7c7b\u5e94\u662f\u5e73\u79fb\u4e0d\u53d8\u7684\uff1a\"\u732b\"\u7684\u7c7b\u522b\u65e0\u8bba\u732b\u5728\u4f55\u5904\u90fd\u662f\u4e00\u6837\u7684\u3002
\u51fd\u6570 \\(f\\) \u5bf9\u7fa4 \\(G\\) \u662f\u7b49\u53d8\u7684\uff0c\u5982\u679c\u53d8\u6362\u8f93\u5165\u4f1a\u5bf9\u7b49\u5730\u53d8\u6362\u8f93\u51fa\uff1a
\u533a\u5206\u4e24\u8005\u7684\u91cd\u8981\u6027\u5728\u4e8e\uff1a\u4e2d\u95f4\u5c42\u901a\u5e38\u5e94\u662f\u7b49\u53d8\u7684\uff08\u4e3a\u4e0b\u6e38\u5c42\u4fdd\u7559\u7ed3\u6784\uff09\uff0c\u800c\u6700\u7ec8\u8f93\u51fa\u5e94\u662f\u4e0d\u53d8\u7684\uff08\u7b54\u6848\u4e0d\u5e94\u4f9d\u8d56\u4e8e\u53d8\u6362\uff09\u3002CNN\u901a\u8fc7\u5806\u53e0\u7b49\u53d8\u5377\u79ef\u5c42\uff0c\u7136\u540e\u5728\u672b\u5c3e\u5e94\u7528\u5168\u5c40\u6c60\u5316\uff08\u5b83\u662f\u4e0d\u53d8\u7684\uff09\u6765\u5b9e\u73b0\u8fd9\u4e00\u70b9\u3002
\u5c06\u7b49\u53d8\u6027\u6784\u5efa\u5230\u67b6\u6784\u4e2d\u6bd4\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u5b83\u8981\u9ad8\u6548\u5f97\u591a\u3002\u4e00\u4e2a\u5177\u6709\u6743\u91cd\u5171\u4eab\u7684\u5e73\u79fb\u7b49\u53d8CNN\u6240\u9700\u7684\u53c2\u6570\u8fdc\u5c11\u4e8e\u4e00\u4e2a\u5fc5\u987b\u72ec\u7acb\u5b66\u4e60\"\u4f4d\u7f6e(10,10)\u5904\u7684\u732b\"\u548c\"\u4f4d\u7f6e(200,150)\u5904\u7684\u732b\"\u7684\u5168\u8fde\u63a5\u7f51\u7edc\u3002\u5bf9\u79f0\u6027\u7ea6\u675f\u6307\u6570\u7ea7\u5730\u7f29\u5c0f\u4e86\u5047\u8bbe\u7a7a\u95f4\u3002
1. \u7f51\u683c\uff08\u6b27\u51e0\u91cc\u5f97\u6570\u636e\uff09\uff1a\u56fe\u50cf\u3001\u97f3\u9891\u9891\u8c31\u56fe\u3001\u4f53\u6570\u636e\u3002\u5e95\u5c42\u7ed3\u6784\u662f\u5177\u6709\u5e73\u79fb\u5bf9\u79f0\u6027\u7684\u89c4\u5219\u7f51\u683c\u3002\u7fa4\u662f\u5e73\u79fb\u7fa4\uff08\u53ef\u80fd\u518d\u52a0\u4e0a\u65cb\u8f6c\u548c\u53cd\u5c04\uff09\u3002\u5229\u7528\u8fd9\u79cd\u5bf9\u79f0\u6027\u7684\u67b6\u6784\u662fCNN\uff1a\u5377\u79ef\u6b63\u662f\u5e73\u79fb\u7b49\u53d8\u7684\u64cd\u4f5c\u3002\u7a7a\u95f4\u4f4d\u7f6e\u4e0a\u7684\u6743\u91cd\u5171\u4eab\u5c31\u662f\u5e73\u79fb\u7b49\u53d8\u6027\u7684\u5177\u4f53\u5b9e\u73b0\u3002
2. \u96c6\u5408\uff08\u65e0\u5e8f\u96c6\u5408\uff09\uff1a\u70b9\u4e91\u3001\u7c92\u5b50\u7cfb\u7edf\u3002\u5bf9\u79f0\u6027\u662f\u7f6e\u6362\u4e0d\u53d8\u6027\uff1a\u5143\u7d20\u7684\u987a\u5e8f\u65e0\u5173\u7d27\u8981\u3002\u67b6\u6784\u662fDeepSets\uff08\u4ee5\u53ca\u7b2c8\u7ae0\u7684PointNet\uff09\uff1a\u5bf9\u6bcf\u4e2a\u5143\u7d20\u5e94\u7528\u5171\u4eab\u51fd\u6570\uff0c\u7136\u540e\u7528\u7f6e\u6362\u4e0d\u53d8\u64cd\u4f5c\uff08\u6c42\u548c\u3001\u5747\u503c\u6216\u53d6\u6700\u5927\u503c\uff09\u8fdb\u884c\u805a\u5408\u3002\u5f62\u5f0f\u4e0a\uff0c\\(f(\\{x_1, \\ldots, x_n\\}) = \\phi\\left(\\sum_i \\psi(x_i)\\right)\\)\u3002
3. \u5e8f\u5217\uff08\u6709\u5e8f\u6570\u636e\uff09\uff1a\u6587\u672c\u3001\u65f6\u95f4\u5e8f\u5217\u3002\u5e8f\u5217\u662f\u4e00\u7ef4\u7f51\u683c\uff0c\u4f46\u6709\u4e00\u4e2a\u5fae\u5999\u4e4b\u5904\uff1a\u5bf9\u79f0\u6027\u66f4\u52a0\u7ec6\u81f4\u3002\u7edd\u5bf9\u4f4d\u7f6e\u53ef\u80fd\u91cd\u8981\u4e5f\u53ef\u80fd\u4e0d\u91cd\u8981\u3002RNN\u4ee5\u81ea\u56de\u5f52\u65b9\u5f0f\u5904\u7406\u5e8f\u5217\u3002\u5e26\u4f4d\u7f6e\u7f16\u7801\u7684Transformer\u53ef\u4ee5\u5173\u6ce8\u4efb\u4f55\u4f4d\u7f6e\uff0c\u5176\u81ea\u6ce8\u610f\u529b\u5728\u52a0\u5165\u4f4d\u7f6e\u7f16\u7801\u4e4b\u524d\u662f\u7f6e\u6362\u7b49\u53d8\u7684\u3002\u8fd9\u5c31\u662fTransformer\u6cdb\u5316\u80fd\u529b\u5982\u6b64\u4e4b\u5f3a\u7684\u539f\u56e0\uff1a\u5b83\u4eec\u4ece\u7f6e\u6362\u7b49\u53d8\u5f00\u59cb\uff0c\u7136\u540e\u4ec5\u6dfb\u52a0\u5fc5\u8981\u7684\u4f4d\u7f6e\u7ed3\u6784\u3002
4. \u56fe\uff08\u5173\u7cfb\u6570\u636e\uff09\uff1a\u793e\u4ea4\u7f51\u7edc\u3001\u5206\u5b50\u3001\u77e5\u8bc6\u56fe\u8c31\u3002\u5bf9\u79f0\u6027\u662f\u8282\u70b9\u7684\u7f6e\u6362\uff1a\u91cd\u65b0\u6807\u8bb0\u8282\u70b9\u4e0d\u5e94\u6539\u53d8\u56fe\u7684\u6027\u8d28\u3002\u67b6\u6784\u662fGNN\uff1a\u8fde\u63a5\u8282\u70b9\u4e4b\u95f4\u4f20\u9012\u6d88\u606f\uff0c\u4f7f\u7528\u4e0d\u4f9d\u8d56\u4e8e\u8282\u70b9\u987a\u5e8f\u7684\u5171\u4eab\u51fd\u6570\u3002\u8fd9\u662f\u672c\u7ae0\u5269\u4f59\u90e8\u5206\u7684\u91cd\u70b9\u3002
5. \u6d41\u5f62\u548c\u7f51\u683c\uff1a\u66f2\u9762\u30013D\u5f62\u72b6\u3002\u5bf9\u79f0\u6027\u5305\u62ec\u5fae\u5206\u540c\u80da\uff08\u5149\u6ed1\u53d8\u5f62\uff09\u3002\u67b6\u6784\u4f7f\u7528\u5185\u5728\u7b97\u5b50\uff08\u4f8b\u5982\u62c9\u666e\u62c9\u65af-\u8d1d\u5c14\u7279\u62c9\u7c73\u7b97\u5b50\uff09\uff0c\u8fd9\u4e9b\u7b97\u5b50\u7531\u66f2\u9762\u51e0\u4f55\u672c\u8eab\u5b9a\u4e49\uff0c\u4e0e\u66f2\u9762\u5728\u7a7a\u95f4\u4e2d\u7684\u5d4c\u5165\u65b9\u5f0f\u65e0\u5173\u3002\u8fd9\u8054\u7cfb\u5230\u5fae\u5206\u51e0\u4f55\uff0c\u5e76\u9002\u7528\u4e8e\u5f62\u72b6\u5206\u6790\u3001\u7403\u9762\u4e0a\u7684\u6c14\u5019\u5efa\u6a21\u548c\u86cb\u767d\u8d28\u8868\u9762\u5206\u6790\u3002
\u8fd9\u4e2a\u6846\u67b6\u7684\u5f3a\u5927\u4e4b\u5904\u5728\u4e8e\u5176\u7edf\u4e00\u6027\u3002CNN\u662f\u7f51\u683c\u56fe\u4e0a\u7684GNN\u3002Transformer\u662f\u5b8c\u5168\u8fde\u63a5\u56fe\u4e0a\u7684GNN\u3002DeepSets\u662f\u6ca1\u6709\u8fb9\u7684GNN\u3002\u5c06\u8fd9\u4e9b\u89c6\u4e3a\u540c\u4e00\u539f\u7406\u7684\u5b9e\u4f8b\uff0c\u6307\u5bfc\u7740\u65b0\u67b6\u6784\u7684\u8bbe\u8ba1\uff1a\u8bc6\u522b\u6570\u636e\u7684\u5bf9\u79f0\u6027\uff0c\u7136\u540e\u6784\u5efa\u4e00\u4e2a\u5c0a\u91cd\u5b83\u7684\u7f51\u7edc\u3002
\u771f\u5b9e\u4e16\u754c\u7684\u6570\u636e\u5177\u6709\u591a\u5c3a\u5ea6\u7ed3\u6784\u3002\u4e00\u5e45\u56fe\u50cf\u6709\u7ec6\u7c92\u5ea6\u7eb9\u7406\uff08\u50cf\u7d20\u7ea7\uff09\u3001\u5c40\u90e8\u6a21\u5f0f\uff08\u8fb9\u7f18\u3001\u89d2\u70b9\uff09\u3001\u7269\u4f53\u90e8\u4ef6\uff08\u8f66\u8f6e\u3001\u7a97\u6237\uff09\u548c\u5168\u5c40\u7ed3\u6784\uff08\u6574\u4e2a\u573a\u666f\uff09\u3002\u4e00\u4e2a\u5206\u5b50\u6709\u539f\u5b50\u7ea7\u7279\u5f81\u3001\u5b98\u80fd\u56e2\u548c\u6574\u4f53\u5206\u5b50\u5f62\u72b6\u3002
\u5c3a\u5ea6\u5206\u79bb\u662f\u8fd9\u6837\u4e00\u4e2a\u539f\u7406\uff1a\u8fd9\u4e9b\u7ec6\u8282\u5c42\u6b21\u53ef\u4ee5\u5206\u5c42\u5904\u7406\u2014\u2014\u5148\u6355\u83b7\u5c40\u90e8\u7ed3\u6784\uff0c\u7136\u540e\u9010\u6b65\u805a\u5408\u6210\u66f4\u7c97\u7c92\u5ea6\u7684\u8868\u793a\u3002\u8fd9\u5c31\u662f\u7c97\u5316\u6216\u6c60\u5316\u3002
\u5728CNN\u4e2d\uff0c\u6c60\u5316\u5c42\uff08\u6700\u5927\u6c60\u5316\u3001\u5e73\u5747\u6c60\u5316\uff09\u5bf9\u7a7a\u95f4\u5206\u8fa8\u7387\u8fdb\u884c\u4e0b\u91c7\u6837\uff0c\u8feb\u4f7f\u9ad8\u5c42\u6355\u83b7\u66f4\u5927\u5c3a\u5ea6\u7684\u6a21\u5f0f\u3002\u5728\u611f\u53d7\u91ce\u89c6\u89d2\uff08\u7b2c8\u7ae0\uff09\u4e2d\uff0c\u66f4\u6df1\u5c42\u80fd\"\u770b\u5230\"\u66f4\u591a\u7684\u56fe\u50cf\u3002\u8fd9\u5c31\u662f\u5c3a\u5ea6\u5206\u79bb\u7684\u5b9e\u9645\u5e94\u7528\u3002
\u5728\u56fe\uff08graph\uff09\u4e2d\uff0c\u7c97\u5316\u610f\u5473\u7740\u5c06\u8282\u70b9\u7fa4\u805a\u4e3a\"\u8d85\u8282\u70b9\"\uff0c\u751f\u6210\u4e00\u4e2a\u4fdd\u7559\u57fa\u672c\u7ed3\u6784\u7684\u66f4\u5c0f\u56fe\u3002\u8fd9\u5c31\u662f\u56fe\u6c60\u5316\uff0c\u6211\u4eec\u5c06\u5728\u6587\u4ef63\u4e2d\u8be6\u7ec6\u8ba8\u8bba\u3002\u5b83\u4e0e\u56fe\u50cf\u6c60\u5316\u76f4\u63a5\u7c7b\u4f3c\uff1a\u964d\u4f4e\u5206\u8fa8\u7387\u7684\u540c\u65f6\u4fdd\u7559\u91cd\u8981\u7279\u5f81\u3002
\u5728\u5e8f\u5217\u4e2d\uff0c\u5206\u5c42\u5904\u7406\uff08\u4f8b\u5982\u53e5\u5b50\u2192\u6bb5\u843d\u2192\u6587\u6863\uff09\u5728\u4e0d\u540c\u65f6\u95f4\u6216\u8bed\u4e49\u5c3a\u5ea6\u6355\u83b7\u7ed3\u6784\u3002Swin Transformer\uff08\u7b2c8\u7ae0\uff09\u901a\u8fc7\u5176\u79fb\u4f4d\u7a97\u53e3\u5c42\u6b21\u7ed3\u6784\u5c06\u8fd9\u4e00\u601d\u60f3\u5e94\u7528\u4e8e\u56fe\u50cf\u3002
\u6570\u5b66\u4e0a\uff0c\u7c97\u5316\u5b9a\u4e49\u4e86\u4e00\u4e2a\u9010\u6e10\u62bd\u8c61\u7684\u8868\u793a\u5c42\u6b21\uff1a
\u5728\u6bcf\u4e2a\u5c42\u6b21\uff0c\u8868\u793a\u76f8\u5bf9\u4e8e\u8be5\u5c42\u6b21\u7684\u5bf9\u79f0\u7fa4\u662f\u7b49\u53d8\u7684\u3002\u6700\u540e\u7684\u5168\u5c40\u8868\u793a\u662f\u4e0d\u53d8\u7684\uff0c\u6355\u83b7\u4e86\u8f93\u5165\u7684\u672c\u8d28\u800c\u4e0d\u53d7\u65e0\u5173\u53d8\u6362\u7684\u5f71\u54cd\u3002
\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5bf9\u4e8e\u7ed3\u6784\u5316\u6570\u636e\uff0c\u6df1\u5c42\u7f51\u7edc\u6bd4\u6d45\u5c42\u7f51\u7edc\u6548\u679c\u66f4\u597d\uff1a\u6bcf\u4e00\u5c42\u589e\u52a0\u4e00\u4e2a\u62bd\u8c61\u5c42\u6b21\uff0c\u591a\u4e2a\u7b49\u53d8\u5c42\u7684\u7ec4\u5408\u4ece\u7b80\u5355\u7684\u5c40\u90e8\u7279\u5f81\u6784\u5efa\u51fa\u590d\u6742\u7684\u4e0d\u53d8\u7279\u5f81\u3002
\u9a8c\u8bc1\u5377\u79ef\u7684\u5e73\u79fb\u7b49\u53d8\u6027\u3002\u5bf9\u56fe\u50cf\u5e94\u7528\u5377\u79ef\uff0c\u7136\u540e\u5e73\u79fb\u56fe\u50cf\u518d\u6b21\u5377\u79ef\u3002\u68c0\u67e5\u8f93\u51fa\u662f\u5426\u4e92\u4e3a\u5e73\u79fb\u7248\u672c\u3002
import jax\nimport jax.numpy as jnp\n\n# \u4e00\u7ef4\u4fe1\u53f7\u548c\u4e00\u4e2a\u7b80\u5355\u6ee4\u6ce2\u5668\nsignal = jnp.array([0, 0, 0, 1, 2, 3, 2, 1, 0, 0, 0], dtype=float)\nkernel = jnp.array([1, 0, -1], dtype=float)\n\n# \u5148\u5377\u79ef\u518d\u5e73\u79fb\nconv_result = jnp.convolve(signal, kernel, mode=\"same\")\nshifted_signal = jnp.roll(signal, 3)\nconv_shifted = jnp.convolve(shifted_signal, kernel, mode=\"same\")\nshifted_conv = jnp.roll(conv_result, 3)\n\nprint(f\"\u5148\u5377\u79ef\u518d\u5e73\u79fb: {shifted_conv}\")\nprint(f\"\u5148\u5e73\u79fb\u518d\u5377\u79ef: {conv_shifted}\")\nprint(f\"\u7b49\u53d8\u6027: {jnp.allclose(shifted_conv, conv_shifted, atol=1e-5)}\")\n \u9a8c\u8bc1DeepSets\u98ce\u683c\u805a\u5408\u7684\u7f6e\u6362\u4e0d\u53d8\u6027\u3002\u5bf9\u96c6\u5408\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u5e94\u7528\u5171\u4eab\u51fd\u6570\uff0c\u6c42\u548c\u7ed3\u679c\uff0c\u5e76\u68c0\u67e5\u8f93\u51fa\u662f\u5426\u4e0d\u4f9d\u8d56\u4e8e\u5143\u7d20\u987a\u5e8f\u3002
import jax\nimport jax.numpy as jnp\n\n# 4\u4e2a\u5411\u91cf\u7684\"\u96c6\u5408\"\uff08\u987a\u5e8f\u5e94\u65e0\u5173\u7d27\u8981\uff09\nx = jnp.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0], [7.0, 8.0]])\n\n# \u7b80\u5355\u7684\u5171\u4eab\u51fd\u6570\uff1a\u9010\u5143\u7d20\u5e73\u65b9\npsi = lambda v: v ** 2\n\n# \u901a\u8fc7\u6c42\u548c\u805a\u5408\ndef deepsets(points):\n return jnp.sum(jax.vmap(psi)(points), axis=0)\n\n# \u539f\u59cb\u987a\u5e8f\nresult1 = deepsets(x)\n\n# \u7f6e\u6362\u540e\u7684\u987a\u5e8f\nperm = jnp.array([2, 0, 3, 1])\nresult2 = deepsets(x[perm])\n\nprint(f\"\u539f\u59cb\u987a\u5e8f: {result1}\")\nprint(f\"\u7f6e\u6362\u987a\u5e8f: {result2}\")\nprint(f\"\u4e0d\u53d8\u6027: {jnp.allclose(result1, result2)}\")\n \u63a2\u7d22\u7fa4\u7ed3\u6784\u3002\u901a\u8fc7\u68c0\u67e5\u5c01\u95ed\u6027\u3001\u7ed3\u5408\u5f8b\u3001\u5355\u4f4d\u5143\u548c\u9006\u5143\uff0c\u9a8c\u8bc1\u4e8c\u7ef4\u65cb\u8f6c\u77e9\u9635\u6784\u6210\u7fa4\u3002
import jax.numpy as jnp\n\ndef rot2d(theta):\n return jnp.array([[jnp.cos(theta), -jnp.sin(theta)],\n [jnp.sin(theta), jnp.cos(theta)]])\n\nR1 = rot2d(jnp.pi / 6)\nR2 = rot2d(jnp.pi / 4)\nR3 = rot2d(jnp.pi / 3)\n\n# \u5c01\u95ed\u6027\uff1a\u4e24\u4e2a\u65cb\u8f6c\u7684\u4e58\u79ef\u8fd8\u662f\u4e00\u4e2a\u65cb\u8f6c\nR12 = R1 @ R2\nprint(f\"\u5c01\u95ed\u6027 (\u884c\u5217\u5f0f=1, \u6b63\u4ea4): det={jnp.linalg.det(R12):.4f}, \"\n f\"R^T R = I: {jnp.allclose(R12.T @ R12, jnp.eye(2), atol=1e-5)}\")\n\n# \u7ed3\u5408\u5f8b\nprint(f\"\u7ed3\u5408\u5f8b: {jnp.allclose((R1 @ R2) @ R3, R1 @ (R2 @ R3), atol=1e-5)}\")\n\n# \u5355\u4f4d\u5143\nI = rot2d(0.0)\nprint(f\"\u5355\u4f4d\u5143: {jnp.allclose(R1 @ I, R1, atol=1e-5)}\")\n\n# \u9006\u5143\nR1_inv = rot2d(-jnp.pi / 6)\nprint(f\"\u9006\u5143: {jnp.allclose(R1 @ R1_inv, jnp.eye(2), atol=1e-5)}\")\n \u56fe\u8bba\u4e3a\u63cf\u8ff0\u5b9e\u4f53\u95f4\u5173\u7cfb\u63d0\u4f9b\u4e86\u6570\u5b66\u8bed\u8a00\u3002\u672c\u7ae0\u6db5\u76d6\u8282\u70b9\u3001\u8fb9\u3001\u90bb\u63a5\u77e9\u9635\u3001\u56fe\u7c7b\u578b\u3001\u5ea6\u548c\u8fde\u901a\u6027\u3001\u56fe\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u3001\u8c31\u56fe\u7406\u8bba\u4ee5\u53ca\u73b0\u5b9e\u4e16\u754c\u7684\u56fe\u5e94\u7528\u3002\u6211\u4eec\u5c06\u5728\u7eaf\u8ba1\u7b97\u673a\u79d1\u5b66\u7ae0\u8282\u4e2d\u66f4\u6df1\u5165\u5730\u8ba8\u8bba\u56fe
\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u672c\u4e66\u4e2d\u7684\u6570\u636e\u90fd\u5b58\u5728\u4e8e\u89c4\u5219\u7ed3\u6784\u4e0a\uff1a\\(\\mathbb{R}^n\\) \u4e2d\u7684\u5411\u91cf\uff08\u7b2c1\u7ae0\uff09\u3001\u6570\u5b57\u7f51\u683c\u5f62\u5f0f\u7684\u77e9\u9635\uff08\u7b2c2\u7ae0\uff09\u3001\u50cf\u7d20\u7f51\u683c\u5f62\u5f0f\u7684\u56fe\u50cf\uff08\u7b2c8\u7ae0\uff09\u3001\u6709\u5e8f\u5217\u8868\u5f62\u5f0f\u7684\u5e8f\u5217\uff08\u7b2c7\u7ae0\uff09\u3002\u4f46\u8bb8\u591a\u73b0\u5b9e\u4e16\u754c\u7684\u7cfb\u7edf\u662f\u4e0d\u89c4\u5219\u7684\uff1a\u793e\u4ea4\u7f51\u7edc\u6ca1\u6709\u7f51\u683c\u7ed3\u6784\uff0c\u5206\u5b50\u6ca1\u6709\u4ece\u5de6\u5230\u53f3\u7684\u987a\u5e8f\uff0c\u9053\u8def\u7f51\u7edc\u4e5f\u4e0d\u80fd\u6574\u9f50\u5730\u5e73\u94fa\u6210\u884c\u548c\u5217\u3002
\u56fe\uff08Graph\uff09 \u662f\u8868\u793a\u8fd9\u4e9b\u4e0d\u89c4\u5219\u5173\u7cfb\u7ed3\u6784\u7684\u6570\u5b66\u5de5\u5177\u3002\u56fe\u6355\u83b7\u4e86\u5b9e\u4f53\uff08\u8282\u70b9\uff09\u53ca\u5b83\u4eec\u4e4b\u95f4\u7684\u5173\u7cfb\uff08\u8fb9\uff09\u3002\u4e00\u65e6\u6570\u636e\u88ab\u8868\u793a\u4e3a\u56fe\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5e94\u7528\u6587\u4ef61\u4e2d\u7684\u51e0\u4f55\u6df1\u5ea6\u5b66\u4e60\u539f\u7406\u6765\u4ece\u4e2d\u5b66\u4e60\u3002
\u4e00\u4e2a\u56fe \\(G = (V, E)\\) \u7531\u4e00\u7ec4\u8282\u70b9\uff08\u6216\u9876\u70b9\uff09\\(V = \\{v_1, v_2, \\ldots, v_n\\}\\) \u548c\u4e00\u7ec4\u8fde\u63a5\u8282\u70b9\u5bf9\u7684\u8fb9 \\(E \\subseteq V \\times V\\) \u7ec4\u6210\u3002
\u8282\u70b9\u4ee3\u8868\u5b9e\u4f53\uff1a\u4eba\u3001\u539f\u5b50\u3001\u57ce\u5e02\u3001\u7f51\u9875\u3001\u795e\u7ecf\u5143\u3002\u8fb9\u4ee3\u8868\u5173\u7cfb\uff1a\u53cb\u8c0a\u3001\u5316\u5b66\u952e\u3001\u9053\u8def\u3001\u8d85\u94fe\u63a5\u3001\u7a81\u89e6\u3002
\u90bb\u63a5\u77e9\u9635 \\(A\\) \u662f\u56fe\u7684\u77e9\u9635\u8868\u793a\u3002\u5bf9\u4e8e\u4e00\u4e2a\u6709 \\(n\\) \u4e2a\u8282\u70b9\u7684\u56fe\uff0c\\(A\\) \u662f\u4e00\u4e2a \\(n \\times n\\) \u77e9\u9635\uff0c\u5176\u4e2d\u5982\u679c\u5b58\u5728\u4ece\u8282\u70b9 \\(i\\) \u5230\u8282\u70b9 \\(j\\) \u7684\u8fb9\uff0c\u5219 \\(A_{ij} = 1\\)\uff0c\u5426\u5219 \\(A_{ij} = 0\\)\u3002
\u4f8b\u5982\uff0c\u4e00\u4e2a\u4e09\u89d2\u5f62\u56fe\uff083\u4e2a\u8282\u70b9\uff0c\u5168\u90e8\u76f8\u8fde\uff09\uff1a
\u5bf9\u89d2\u7ebf\u4e3a\u96f6\uff0c\u56e0\u4e3a\u8282\u70b9\u9ed8\u8ba4\u4e0d\u4e0e\u81ea\u8eab\u76f8\u8fde\uff08\u65e0\u81ea\u73af\uff09\u3002\u90bb\u63a5\u77e9\u9635\u662f\u6211\u4eec\u5728\u7b2c2\u7ae0\u4e2d\u7814\u7a76\u7684\u5e03\u5c14\u77e9\u9635\u7684\u76f4\u63a5\u5e94\u7528\uff1a\u6bcf\u4e2a\u6761\u76ee\u90fd\u662f\u4e00\u4e2a\u4e8c\u5143\u5173\u7cfb\u3002
\u90bb\u63a5\u77e9\u9635\u5b8c\u6574\u5730\u7f16\u7801\u4e86\u56fe\u7684\u7ed3\u6784\u3002\u5bf9 \\(A\\) \u7684\u77e9\u9635\u8fd0\u7b97\u63ed\u793a\u4e86\u56fe\u7684\u6027\u8d28\uff1a\\(A^2_{ij}\\) \u8ba1\u7b97\u8282\u70b9 \\(i\\) \u548c \\(j\\) \u4e4b\u95f4\u957f\u5ea6\u4e3a2\u7684\u8def\u5f84\u6570\u91cf\uff08\u56de\u987e\u7b2c2\u7ae0\u4e2d\u7684\u77e9\u9635\u4e58\u6cd5\uff1a\u6bcf\u4e2a\u6761\u76ee\u662f\u7ecf\u8fc7\u4e2d\u95f4\u8282\u70b9\u7684\u4e58\u79ef\u4e4b\u548c\uff09\u3002\u66f4\u4e00\u822c\u5730\uff0c\\(A^k_{ij}\\) \u8ba1\u7b97\u957f\u5ea6\u4e3a \\(k\\) \u7684\u8def\u5f84\u6570\u91cf\u3002
\u6bcf\u4e2a\u8282\u70b9\u53ef\u4ee5\u643a\u5e26\u4e00\u4e2a\u7279\u5f81\u5411\u91cf \\(\\mathbf{x}_i \\in \\mathbb{R}^d\\)\u3002\u5bf9\u4e8e\u793e\u4ea4\u7f51\u7edc\uff0c\u8fd9\u53ef\u80fd\u662f\u7528\u6237\u7684\u4e2a\u4eba\u4fe1\u606f\u3002\u5bf9\u4e8e\u5206\u5b50\uff0c\u5b83\u7f16\u7801\u539f\u5b50\u7c7b\u578b\u3001\u7535\u8377\u548c\u5176\u4ed6\u5c5e\u6027\u3002\u5168\u90e8\u8282\u70b9\u7279\u5f81\u7684\u96c6\u5408\u662f\u4e00\u4e2a\u77e9\u9635 \\(X \\in \\mathbb{R}^{n \\times d}\\)\uff0c\u5176\u4e2d\u6bcf\u4e00\u884c\u662f\u4e00\u4e2a\u8282\u70b9\u7684\u7279\u5f81\u3002
\u8fb9\u4e5f\u53ef\u4ee5\u643a\u5e26\u7279\u5f81\uff1a\u5206\u5b50\u4e2d\u7684\u952e\u7c7b\u578b\u3001\u7a7a\u95f4\u56fe\u4e2d\u7684\u8ddd\u79bb\u3001\u77e5\u8bc6\u56fe\u8c31\u4e2d\u7684\u5173\u7cfb\u7c7b\u578b\u3002\u8fb9 \\((i, j)\\) \u7684\u8fb9\u7279\u5f81\u662f\u4e00\u4e2a\u5411\u91cf \\(\\mathbf{e}_{ij} \\in \\mathbb{R}^{d_e}\\)\u3002
\u65e0\u5411\u56fe\u5177\u6709\u5bf9\u79f0\u7684\u8fb9\uff1a\u5982\u679c \\(i\\) \u8fde\u63a5\u5230 \\(j\\)\uff0c\u5219 \\(j\\) \u4e5f\u8fde\u63a5\u5230 \\(i\\)\u3002\u90bb\u63a5\u77e9\u9635\u662f\u5bf9\u79f0\u7684\uff1a\\(A = A^T\\)\uff08\u4e00\u4e2a\u5bf9\u79f0\u77e9\u9635\uff0c\u89c1\u7b2c2\u7ae0\uff09\u3002\u53cb\u8c0a\u548c\u5316\u5b66\u952e\u662f\u65e0\u5411\u7684\u3002
\u6709\u5411\u56fe\uff08digraph\uff09\u5177\u6709\u5e26\u65b9\u5411\u7684\u8fb9\uff1a\u4ece \\(i\\) \u5230 \\(j\\) \u7684\u8fb9\u4e0d\u610f\u5473\u7740\u4ece \\(j\\) \u5230 \\(i\\) \u7684\u8fb9\u3002\u90bb\u63a5\u77e9\u9635\u662f\u975e\u5bf9\u79f0\u7684\u3002Twitter\u5173\u6ce8\u3001\u7f51\u9875\u8d85\u94fe\u63a5\u548c\u5f15\u6587\u7f51\u7edc\u662f\u6709\u5411\u7684\u3002
\u52a0\u6743\u56fe\u4e3a\u6bcf\u6761\u8fb9\u5206\u914d\u4e00\u4e2a\u6570\u503c\u6743\u91cd\u3002\u90bb\u63a5\u77e9\u9635\u5177\u6709\u5b9e\u6570\u503c\u800c\u975e\u4e8c\u8fdb\u5236\u503c\uff1a\\(A_{ij} = w_{ij}\\)\u3002\u9053\u8def\u7f51\u7edc\u4e2d\u7684\u8ddd\u79bb\u3001\u5927\u8111\u8fde\u901a\u6027\u4e2d\u7684\u76f8\u5173\u5f3a\u5ea6\u4ee5\u53ca\u793e\u4ea4\u7f51\u7edc\u4e2d\u7684\u4ea4\u4e92\u9891\u7387\u662f\u52a0\u6743\u7684\u3002
\u4e8c\u5206\u56fe\u5177\u6709\u4e24\u4e2a\u4e0d\u76f8\u4ea4\u7684\u8282\u70b9\u96c6\u5408\uff0c\u8fb9\u53ea\u5b58\u5728\u4e8e\u96c6\u5408\u4e4b\u95f4\uff08\u96c6\u5408\u5185\u90e8\u6ca1\u6709\u8fb9\uff09\u3002\u7528\u6237\u548c\u4ea7\u54c1\u6784\u6210\u4e00\u4e2a\u4e8c\u5206\u56fe\uff1a\u7528\u6237\u8bc4\u4ef7\u4ea7\u54c1\uff0c\u4f46\u7528\u6237\u4e4b\u95f4\u4e0d\u76f8\u4e92\u8bc4\u4ef7\u3002\u4e8c\u5206\u56fe\u7684\u90bb\u63a5\u77e9\u9635\u5177\u6709\u5757\u7ed3\u6784\uff1a
\u5176\u4e2d \\(B\\) \u662f\u4e24\u4e2a\u8282\u70b9\u96c6\u4e4b\u95f4\u7684\u4e8c\u5206\u90bb\u63a5\u77e9\u9635\u3002
\u591a\u91cd\u56fe\u5141\u8bb8\u540c\u4e00\u5bf9\u8282\u70b9\u4e4b\u95f4\u5b58\u5728\u591a\u6761\u8fb9\u548c/\u6216\u81ea\u73af\u3002\u77e5\u8bc6\u56fe\u8c31\u901a\u5e38\u662f\u591a\u91cd\u56fe\uff1a\u4e24\u4e2a\u5b9e\u4f53\u4e4b\u95f4\u53ef\u4ee5\u6709\u591a\u79cd\u5173\u7cfb\uff08\u4f8b\u5982\"\u51fa\u751f\u4e8e\"\u3001\"\u5c45\u4f4f\u4e8e\"\u3001\"\u5de5\u4f5c\u4e8e\"\uff09\u3002
\u8d85\u56fe\u5c06\u8fb9\u63a8\u5e7f\u4e3a\u4e00\u6b21\u8fde\u63a5\u4e24\u4e2a\u4ee5\u4e0a\u8282\u70b9\u3002\u4e00\u6761\u8d85\u8fb9\u8fde\u63a5\u4e00\u7ec4\u8282\u70b9\uff0c\u8868\u793a\u9ad8\u9636\u5173\u7cfb\u3002\u4e00\u7bc7\u7531\u4e94\u4eba\u5408\u8457\u7684\u7814\u7a76\u8bba\u6587\u662f\u4e00\u6761\u8fde\u63a5\u4e94\u4e2a\u4f5c\u8005\u8282\u70b9\u7684\u8d85\u8fb9\u3002
\u5b8c\u5168\u56fe \\(K_n\\) \u5728\u6bcf\u4e00\u5bf9\u8282\u70b9\u4e4b\u95f4\u90fd\u6709\u8fb9\u3002\u8fd9\u662f\u5168\u8fde\u63a5\u5c42\u7684\u56fe\u7c7b\u6bd4\uff0c\u4e5f\u662fTransformer\u64cd\u4f5c\u7684\u7ed3\u6784\uff08\u6bcf\u4e2a\u6807\u8bb0\u5173\u6ce8\u6bcf\u4e2a\u5176\u4ed6\u6807\u8bb0\uff09\u3002
\u4e00\u4e2a\u8282\u70b9\u7684\u5ea6\u662f\u4e0e\u5b83\u76f8\u8fde\u7684\u8fb9\u7684\u6570\u91cf\u3002\u5728\u65e0\u5411\u56fe\u4e2d\uff0c\u8282\u70b9 \\(i\\) \u7684\u5ea6\u4e3a \\(d_i = \\sum_j A_{ij}\\)\u3002\u9ad8\u5ea6\u8282\u70b9\u662f\u62e5\u6709\u5927\u91cf\u8fde\u63a5\u7684\"\u67a2\u7ebd\"\u3002
\u5ea6\u77e9\u9635 \\(D\\) \u662f\u4e00\u4e2a\u5bf9\u89d2\u7ebf\u5143\u7d20\u4e3a\u5ea6\u7684\u5bf9\u89d2\u77e9\u9635\uff1a\\(D_{ii} = d_i\\)\u3002\u8fd9\u4e2a\u77e9\u9635\u51fa\u73b0\u5728\u6574\u4e2a\u56fe\u8bba\u548cGNN\u516c\u5f0f\u4e2d\u3002
\u4e24\u4e2a\u8282\u70b9\u4e4b\u95f4\u7684\u8def\u5f84\u662f\u8fde\u63a5\u5b83\u4eec\u7684\u8fb9\u5e8f\u5217\u3002\\(i\\) \u548c \\(j\\) \u4e4b\u95f4\u7684\u6700\u77ed\u8def\u5f84\uff08\u6216\u6d4b\u5730\u7ebf\uff09\u662f\u8fb9\u6570\u6700\u5c11\uff08\u6216\u5728\u52a0\u6743\u56fe\u4e2d\u603b\u6743\u91cd\u6700\u5c0f\uff09\u7684\u8def\u5f84\u3002\u8fea\u6770\u65af\u7279\u62c9\u7b97\u6cd5\uff08Dijkstra's algorithm\uff09\u5728 \\(O((|V| + |E|) \\log |V|)\\) \u65f6\u95f4\u5185\u627e\u5230\u6700\u77ed\u8def\u5f84\u3002
\u5982\u679c\u6bcf\u5bf9\u8282\u70b9\u4e4b\u95f4\u90fd\u5b58\u5728\u8def\u5f84\uff0c\u5219\u56fe\u662f\u8fde\u901a\u7684\u3002\u5426\u5219\uff0c\u56fe\u6709\u591a\u4e2a\u8fde\u901a\u5206\u91cf\uff1a\u76f8\u4e92\u4e4b\u95f4\u6ca1\u6709\u8fb9\u7684\u5b64\u7acb\u5b50\u56fe\u3002
\u56fe\u7684\u76f4\u5f84\u662f\u4efb\u610f\u4e00\u5bf9\u8282\u70b9\u4e4b\u95f4\u6700\u957f\u6700\u77ed\u8def\u5f84\u7684\u957f\u5ea6\u3002\u5b83\u8861\u91cf\u56fe\"\u5206\u6563\"\u7684\u7a0b\u5ea6\u3002\u793e\u4ea4\u7f51\u7edc\u4ee5\u76f4\u5f84\u5c0f\u800c\u95fb\u540d\uff08\"\u516d\u5ea6\u5206\u9694\"\uff09\u3002
\u73af\u662f\u8d77\u70b9\u548c\u7ec8\u70b9\u5728\u540c\u4e00\u8282\u70b9\u7684\u8def\u5f84\u3002\u6ca1\u6709\u73af\u7684\u56fe\u662f\u6811\u3002\u6811\u662f\u6700\u7b80\u5355\u7684\u8fde\u901a\u56fe\uff1a\\(n\\) \u4e2a\u8282\u70b9\u548c\u6070\u597d \\(n-1\\) \u6761\u8fb9\u3002
\u4e2d\u5fc3\u6027\u8861\u91cf\u8282\u70b9\u7684\u91cd\u8981\u6027\u3002\u5ea6\u4e2d\u5fc3\u6027\u5c31\u662f\u5ea6\u6570\u3002\u4ecb\u6570\u4e2d\u5fc3\u6027\u8ba1\u7b97\u901a\u8fc7\u4e00\u4e2a\u8282\u70b9\u7684\u6700\u77ed\u8def\u5f84\u6570\u91cf\u3002\u7279\u5f81\u5411\u91cf\u4e2d\u5fc3\u6027\u6839\u636e\u8282\u70b9\u90bb\u5c45\u7684\u91cd\u8981\u6027\u5206\u914d\u91cd\u8981\u6027\uff0c\u5f97\u5230\u7279\u5f81\u5411\u91cf\u65b9\u7a0b \\(A\\mathbf{x} = \\lambda \\mathbf{x}\\)\uff08\u7b2c2\u7ae0\uff09\u3002\u8c37\u6b4c\u7684PageRank\u662f\u7279\u5f81\u5411\u91cf\u4e2d\u5fc3\u6027\u5728\u6709\u5411\u56fe\u4e0a\u7684\u53d8\u4f53\u3002
\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u5177\u6709\u663e\u8457\u7684\u6027\u8d28\uff1a
- \u8fd9\u4e2a\u4e8c\u6b21\u5f62\u5f0f\u5ea6\u91cf\u56fe\u4e0a\u7684\u4fe1\u53f7 $\\mathbf{x}$ \u5728\u8fb9\u4e0a\u7684\u53d8\u5316\u7a0b\u5ea6\u3002\u5982\u679c\u76f8\u90bb\u8282\u70b9\u503c\u76f8\u8fd1\uff0c\u5219 $\\mathbf{x}^T L \\mathbf{x}$ \u8f83\u5c0f\u3002\u5982\u679c\u5b83\u4eec\u5dee\u5f02\u5f88\u5927\uff0c\u5219\u8f83\u5927\u3002\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u5ea6\u91cf\u56fe\u4e0a\u4fe1\u53f7\u7684**\u5e73\u6ed1\u5ea6**\u3002\n\n- \u6700\u5c0f\u7279\u5f81\u503c\u59cb\u7ec8\u4e3a0\uff0c\u7279\u5f81\u5411\u91cf\u4e3a $\\mathbf{1} = [1, 1, \\ldots, 1]^T$\uff08\u5e38\u6570\u4fe1\u53f7\u6ca1\u6709\u53d8\u5316\uff09\u3002\u96f6\u7279\u5f81\u503c\u7684\u6570\u91cf\u7b49\u4e8e\u8fde\u901a\u5206\u91cf\u7684\u6570\u91cf\u3002\n\n- \u7b2c\u4e8c\u5c0f\u7279\u5f81\u503c $\\lambda_2$ \u662f**\u4ee3\u6570\u8fde\u901a\u5ea6**\uff08Fiedler\u503c\uff09\u3002\u5b83\u8861\u91cf\u56fe\u7684\u8fde\u901a\u7a0b\u5ea6\uff1a$\\lambda_2 = 0$ \u8868\u793a\u56fe\u4e0d\u8fde\u901a\uff0c\u5927\u7684 $\\lambda_2$ \u8868\u793a\u56fe\u7d27\u5bc6\u8fde\u901a\u3002\n \u56fe\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u7684\u7279\u5f81\u503c\u548c\u7279\u5f81\u5411\u91cf\u5b9a\u4e49\u4e86\u56fe\u7684\u8c31\uff0c\u5b83\u4eec\u5145\u5f53\u56fe\u4e0a\u7684\u5085\u91cc\u53f6\u53d8\u6362\u7684\u7c7b\u4f3c\u7269\u3002
\u5728\u7ecf\u5178\u4fe1\u53f7\u5904\u7406\u4e2d\uff0c\u5085\u91cc\u53f6\u53d8\u6362\u5c06\u4fe1\u53f7\u5206\u89e3\u4e3a\u9891\u7387\u5206\u91cf\uff08\u6b63\u5f26\u548c\u4f59\u5f26\uff09\u3002\u5728\u56fe\u4e0a\uff0c\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u7684\u7279\u5f81\u5411\u91cf\u626e\u6f14\u8fd9\u4e9b\u9891\u7387\u57fa\u7684\u89d2\u8272\u3002\u5c0f\u7279\u5f81\u503c\u7684\u7279\u5f81\u5411\u91cf\u5728\u56fe\u4e0a\u53d8\u5316\u7f13\u6162\uff08\u4f4e\u9891\u3001\u5e73\u6ed1\uff09\uff0c\u800c\u5927\u7279\u5f81\u503c\u7684\u7279\u5f81\u5411\u91cf\u53d8\u5316\u8fc5\u901f\uff08\u9ad8\u9891\u3001\u632f\u8361\uff09\u3002
\u4fe1\u53f7 \\(\\mathbf{x}\\) \u5728\u56fe\u4e0a\u7684\u56fe\u5085\u91cc\u53f6\u53d8\u6362\uff08GFT\uff09 \u4e3a\uff1a
\u5176\u4e2d \\(U\\) \u662f\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u7279\u5f81\u5411\u91cf\u7684\u77e9\u9635\uff08\u56de\u987e\u7b2c2\u7ae0\u4e2d\u7684\u7279\u5f81\u5206\u89e3\uff1a\\(L = U \\Lambda U^T\\)\uff09\u3002\u9006\u53d8\u6362\u4e3a \\(\\mathbf{x} = U \\hat{\\mathbf{x}}\\)\u3002
\u8c31\u57df\u4e2d\u7684\u56fe\u5377\u79ef\u662f\u9891\u57df\u4e2d\u7684\u9010\u70b9\u4e58\u6cd5\uff0c\u6b63\u5982\u7a7a\u95f4\u57df\u4e2d\u7684\u5377\u79ef\u5bf9\u5e94\u4e8e\u5085\u91cc\u53f6\u57df\u4e2d\u7684\u4e58\u6cd5\uff08\u5377\u79ef\u5b9a\u7406\uff0c\u89c1\u7b2c8\u7ae0\uff09\uff1a
\u6ee4\u6ce2\u5668 \\(\\hat{g}_\\theta\\) \u662f\u7279\u5f81\u503c\u7684\u53ef\u5b66\u4e60\u51fd\u6570\u3002\u8fd9\u662f\u8c31\u57dfGNN\u7684\u57fa\u7840\uff0c\u6211\u4eec\u5c06\u5728\u6587\u4ef63\u4e2d\u5c06\u5176\u7b80\u5316\u4e3a\u5b9e\u7528\u7684GCN\u3002
\u8ba1\u7b97\u74f6\u9888\u662f\u5bf9 \\(L\\) \u8fdb\u884c\u7279\u5f81\u5206\u89e3\uff0c\u5bf9\u4e8e\u6709 \\(n\\) \u4e2a\u8282\u70b9\u7684\u56fe\u9700\u8981 \\(O(n^3)\\) \u65f6\u95f4\u3002\u8fd9\u5bf9\u4e8e\u5927\u578b\u56fe\uff08\u6570\u767e\u4e07\u8282\u70b9\uff09\u662f\u4e0d\u53ef\u884c\u7684\u3002\u591a\u9879\u5f0f\u8fd1\u4f3c\uff08\u5207\u6bd4\u96ea\u592b\u591a\u9879\u5f0f\uff09\u5b8c\u5168\u907f\u514d\u4e86\u7279\u5f81\u5206\u89e3\uff0c\u800c\u8fd9\u79cd\u8fd1\u4f3c\u76f4\u63a5\u5bfc\u81f4\u4e86GCN\u3002
\u8bb8\u591a\u73b0\u5b9e\u4e16\u754c\u7684\u56fe\u5177\u6709\u793e\u533a\u7ed3\u6784\uff1a\u7d27\u5bc6\u8fde\u63a5\u7684\u8282\u70b9\u7c07\uff0c\u7c07\u4e4b\u95f4\u8fde\u63a5\u7a00\u758f\u3002\u793e\u4ea4\u7f51\u7edc\u6709\u597d\u53cb\u7fa4\u7ec4\uff0c\u751f\u7269\u7f51\u7edc\u6709\u529f\u80fd\u6a21\u5757\uff0c\u5f15\u6587\u7f51\u7edc\u6709\u7814\u7a76\u9886\u57df\u3002
\u8c31\u805a\u7c7b\u4f7f\u7528\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u7279\u5f81\u5411\u91cf\u6765\u5bfb\u627e\u793e\u533a\u3002\u601d\u8def\uff1a\u4f7f\u7528 \\(L\\) \u7684 \\(k\\) \u4e2a\u6700\u5c0f\u7684\u975e\u5e73\u51e1\u7279\u5f81\u5411\u91cf\u5bf9\u6bcf\u4e2a\u8282\u70b9\u8fdb\u884c\u5d4c\u5165\uff0c\u7136\u540e\u5728\u8fd9\u4e2a\u5d4c\u5165\u7a7a\u95f4\u4e2d\u5e94\u7528k-means\uff08\u7b2c6\u7ae0\uff09\u3002\u540c\u4e00\u793e\u533a\u4e2d\u7684\u8282\u70b9\u5728\u8c31\u5d4c\u5165\u4e2d\u6700\u7ec8\u5f7c\u6b64\u9760\u8fd1\u3002
\u8fd9\u662f\u53ef\u884c\u7684\uff0c\u56e0\u4e3aFiedler\u5411\u91cf\uff08\\(\\lambda_2\\) \u7684\u7279\u5f81\u5411\u91cf\uff09\u81ea\u7136\u5730\u5c06\u56fe\u5206\u6210\u4e24\u7ec4\uff1a\u6b63\u503c\u7684\u8282\u70b9\u548c\u8d1f\u503c\u7684\u8282\u70b9\uff0c\u6cbf\u7740\u6700\u7a00\u758f\u7684\u8fde\u63a5\u5207\u5f00\u3002\u66f4\u9ad8\u7684\u7279\u5f81\u5411\u91cf\u8fdb\u4e00\u6b65\u7ec6\u5206\u4e3a\u66f4\u591a\u7ec4\u3002
\u6a21\u5757\u5ea6 \\(Q\\) \u8861\u91cf\u793e\u533a\u5212\u5206\u7684\u8d28\u91cf\u3002\u5b83\u5c06\u793e\u533a\u5185\u8fb9\u7684\u6570\u91cf\u4e0e\u968f\u673a\u56fe\u4e2d\u7684\u671f\u671b\u6570\u91cf\u8fdb\u884c\u6bd4\u8f83\uff1a
\u793e\u4ea4\u7f51\u7edc\uff1a\u8282\u70b9\u662f\u4eba\uff0c\u8fb9\u662f\u53cb\u8c0a\u6216\u4e92\u52a8\u3002Facebook\u6709\u6570\u5341\u4ebf\u8282\u70b9\u548c\u6570\u5343\u4ebf\u6761\u8fb9\u3002\u8fd9\u4e9b\u56fe\u901a\u5e38\u662f\u7a00\u758f\u7684\uff08\u6bcf\u4e2a\u4eba\u6709\u51e0\u767e\u4e2a\u670b\u53cb\uff0c\u800c\u4e0d\u662f\u51e0\u5341\u4ebf\uff09\uff0c\u5177\u6709\u5c0f\u4e16\u754c\u6027\u8d28\uff08\u77ed\u7684\u5e73\u5747\u8def\u5f84\u957f\u5ea6\uff09\uff0c\u4ee5\u53ca\u91cd\u5c3e\u5ea6\u5206\u5e03\uff08\u5c11\u6570\u62e5\u6709\u6570\u767e\u4e07\u8fde\u63a5\u7684\u67a2\u7ebd\u8282\u70b9\uff09\u3002
\u5206\u5b50\u56fe\uff1a\u8282\u70b9\u662f\u539f\u5b50\uff0c\u8fb9\u662f\u5316\u5b66\u952e\u3002\u6bcf\u4e2a\u539f\u5b50\u6709\u7279\u5f81\uff08\u5143\u7d20\u7c7b\u578b\u3001\u7535\u8377\u3001\u6742\u5316\u65b9\u5f0f\uff09\uff0c\u6bcf\u6761\u952e\u6709\u7279\u5f81\uff08\u5355\u952e\u3001\u53cc\u952e\u3001\u4e09\u952e\u3001\u82b3\u9999\u952e\uff09\u3002\u5206\u5b50\u56fe\u5f88\u5c0f\uff08\u6570\u5341\u5230\u6570\u767e\u4e2a\u8282\u70b9\uff09\u4f46\u9ad8\u5ea6\u7ed3\u6784\u5316\u3002\u4ece\u56fe\u7ed3\u6784\u9884\u6d4b\u5206\u5b50\u6027\u8d28\u662fGNN\u7684\u4e00\u4e2a\u91cd\u8981\u5e94\u7528\u3002
\u77e5\u8bc6\u56fe\u8c31\uff1a\u8282\u70b9\u662f\u5b9e\u4f53\uff08\u4eba\u3001\u5730\u70b9\u3001\u6982\u5ff5\uff09\uff0c\u8fb9\u662f\u7c7b\u578b\u5316\u7684\u5173\u7cfb\uff08\"\u51fa\u751f\u4e8e\"\u3001\"\u9996\u90fd\u662f\"\u3001\"\u662f\u2026\u2026\u7684\u5b9e\u4f8b\"\uff09\u3002\u77e5\u8bc6\u56fe\u8c31\u4e3a\u641c\u7d22\u5f15\u64ce\u3001\u63a8\u8350\u7cfb\u7edf\u548c\u95ee\u7b54\u7cfb\u7edf\u63d0\u4f9b\u652f\u6301\u3002\u5b83\u4eec\u901a\u5e38\u662f\u5177\u6709\u6570\u767e\u4e07\u5b9e\u4f53\u548c\u6570\u5341\u4ebf\u5173\u7cfb\u7684\u6709\u591a\u91cd\u56fe\u3002
\u5f15\u6587\u7f51\u7edc\uff1a\u8282\u70b9\u662f\u8bba\u6587\uff0c\u8fb9\u662f\u5f15\u7528\uff08\u6709\u5411\u7684\uff09\u3002\u805a\u7c7b\u63ed\u793a\u7814\u7a76\u793e\u533a\u3002\u8282\u70b9\u7279\u5f81\u5305\u62ec\u6807\u9898\u3001\u6458\u8981\u548c\u51fa\u7248\u5e74\u4efd\u3002
\u86cb\u767d\u8d28\u76f8\u4e92\u4f5c\u7528\u7f51\u7edc\uff1a\u8282\u70b9\u662f\u86cb\u767d\u8d28\uff0c\u8fb9\u8868\u793a\u7269\u7406\u76f8\u4e92\u4f5c\u7528\u6216\u529f\u80fd\u5173\u8054\u3002\u7406\u89e3\u8fd9\u4e9b\u56fe\u6709\u52a9\u4e8e\u8bc6\u522b\u836f\u7269\u9776\u70b9\u548c\u75be\u75c5\u673a\u5236\u3002
\u9053\u8def\u7f51\u7edc\u4e0e\u4ea4\u901a\uff1a\u8282\u70b9\u662f\u4ea4\u53c9\u8def\u53e3\uff0c\u8fb9\u662f\u5177\u6709\u8ddd\u79bb/\u65f6\u95f4\u6743\u91cd\u7684\u9053\u8def\u6bb5\u3002\u8fd9\u4e9b\u56fe\u4e0a\u7684\u6700\u77ed\u8def\u5f84\u7b97\u6cd5\u4e3a\u5bfc\u822a\u7cfb\u7edf\u63d0\u4f9b\u52a8\u529b\u3002\u81ea\u52a8\u9a7e\u9a76\u8fd0\u52a8\u9884\u6d4b\uff08\u7b2c11\u7ae0\uff09\u5c06\u667a\u80fd\u4f53\u4ea4\u4e92\u8868\u793a\u4e3a\u56fe\u3002
\u6784\u5efa\u4e00\u4e2a\u5c0f\u578b\u56fe\u7684\u90bb\u63a5\u77e9\u9635\uff0c\u8ba1\u7b97\u57fa\u672c\u6027\u8d28\uff1a\u6bcf\u4e2a\u8282\u70b9\u7684\u5ea6\u3001\u957f\u5ea6\u4e3a2\u7684\u8def\u5f84\u6570\u91cf\u4ee5\u53ca\u56fe\u662f\u5426\u8fde\u901a\u3002
import jax.numpy as jnp\n\n# \u4e00\u4e2a\u7b80\u5355\u56fe\uff1a5\u4e2a\u8282\u70b9\n# 0-1, 0-2, 1-2, 2-3, 3-4\nA = jnp.array([[0, 1, 1, 0, 0],\n [1, 0, 1, 0, 0],\n [1, 1, 0, 1, 0],\n [0, 0, 1, 0, 1],\n [0, 0, 0, 1, 0]], dtype=float)\n\n# \u5ea6\ndegrees = A.sum(axis=1)\nprint(f\"\u5ea6\u6570: {degrees}\")\n\n# \u957f\u5ea6\u4e3a2\u7684\u8def\u5f84\nA2 = A @ A\nprint(f\"\u957f\u5ea6\u4e3a2\u7684\u8def\u5f84\uff08\u8282\u70b90\u52303\uff09: {int(A2[0, 3])}\")\n\n# \u662f\u5426\u8fde\u901a\uff1f\u68c0\u67e5 A^(n-1) \u662f\u5426\u6240\u6709\u6761\u76ee\u975e\u96f6\nAn = jnp.linalg.matrix_power(A + jnp.eye(5), 4) # (A+I)^4 \u7528\u4e8e\u53ef\u8fbe\u6027\nconnected = jnp.all(An > 0)\nprint(f\"\u8fde\u901a: {connected}\")\n \u8ba1\u7b97\u56fe\u62c9\u666e\u62c9\u65af\u7b97\u5b50\u53ca\u5176\u7279\u5f81\u503c\u3002\u9a8c\u8bc1\u6700\u5c0f\u7279\u5f81\u503c\u4e3a0\u4e14\u5bf9\u5e94\u7684\u7279\u5f81\u5411\u91cf\u4e3a\u5e38\u6570\u3002
import jax.numpy as jnp\n\nA = jnp.array([[0, 1, 1, 0, 0],\n [1, 0, 1, 0, 0],\n [1, 1, 0, 1, 0],\n [0, 0, 1, 0, 1],\n [0, 0, 0, 1, 0]], dtype=float)\n\nD = jnp.diag(A.sum(axis=1))\nL = D - A\n\neigenvalues, eigenvectors = jnp.linalg.eigh(L)\nprint(f\"\u7279\u5f81\u503c: {eigenvalues}\")\nprint(f\"\u6700\u5c0f\u7279\u5f81\u5411\u91cf: {eigenvectors[:, 0]}\")\nprint(f\"Fiedler\u503c\uff08\u4ee3\u6570\u8fde\u901a\u5ea6\uff09: {eigenvalues[1]:.4f}\")\n\n# \u9a8c\u8bc1: x^T L x \u5ea6\u91cf\u5e73\u6ed1\u5ea6\nx = jnp.array([1.0, 1.0, 1.0, -1.0, -1.0]) # \u4e24\u4e2a\u7ec4\nsmoothness = x @ L @ x\nprint(f\"\u4e24\u7ec4\u4fe1\u53f7\u7684\u5e73\u6ed1\u5ea6: {smoothness:.2f}\")\n \u5bf9\u5177\u6709\u4e24\u4e2a\u793e\u533a\u7684\u56fe\u6267\u884c\u8c31\u805a\u7c7b\u3002\u4f7f\u7528Fiedler\u5411\u91cf\u5d4c\u5165\u8282\u70b9\uff0c\u5e76\u6309\u7b26\u53f7\u5206\u79bb\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u4e24\u4e2a\u793e\u533a\uff0c\u54045\u4e2a\u8282\u70b9\uff0c\u5f31\u8fde\u63a5\nA = jnp.zeros((10, 10))\n# \u793e\u533a1\uff1a\u8282\u70b90-4\uff08\u5bc6\u96c6\uff09\nfor i in range(5):\n for j in range(i+1, 5):\n A = A.at[i, j].set(1).at[j, i].set(1)\n# \u793e\u533a2\uff1a\u8282\u70b95-9\uff08\u5bc6\u96c6\uff09\nfor i in range(5, 10):\n for j in range(i+1, 10):\n A = A.at[i, j].set(1).at[j, i].set(1)\n# \u4e00\u6761\u6865\u63a5\u8fb9\nA = A.at[2, 7].set(1).at[7, 2].set(1)\n\nD = jnp.diag(A.sum(axis=1))\nL = D - A\neigenvalues, eigenvectors = jnp.linalg.eigh(L)\n\n# Fiedler\u5411\u91cf\uff08\u7b2c\u4e8c\u5c0f\u7279\u5f81\u503c\uff09\nfiedler = eigenvectors[:, 1]\ncommunities = (fiedler > 0).astype(int)\n\nprint(f\"Fiedler\u5411\u91cf: {fiedler}\")\nprint(f\"\u805a\u7c7b: {communities}\")\n\nplt.bar(range(10), fiedler, color=[\"#3498db\" if c == 0 else \"#e74c3c\" for c in communities])\nplt.xlabel(\"\u8282\u70b9\"); plt.ylabel(\"Fiedler\u5411\u91cf\u503c\")\nplt.title(\"\u901a\u8fc7Fiedler\u5411\u91cf\u8fdb\u884c\u8c31\u805a\u7c7b\")\nplt.show()\n \u56fe\u795e\u7ecf\u7f51\u7edc\u901a\u8fc7\u5728\u8fde\u63a5\u8282\u70b9\u4e4b\u95f4\u4f20\u9012\u6d88\u606f\u6765\u5b66\u4e60\u56fe\u7ed3\u6784\u6570\u636e\u3002\u672c\u7ae0\u6db5\u76d6\u6d88\u606f\u4f20\u9012\u6846\u67b6\u3001GCN\u3001GraphSAGE\u3001GIN\u3001\u8fc7\u5e73\u6ed1\u3001\u56fe\u6c60\u5316\u4ee5\u53ca\u8282\u70b9/\u8fb9/\u56fe\u7ea7\u522b\u7684\u4efb\u52a1\uff1b\u652f\u6491\u5206\u5b50\u6027\u8d28\u9884\u6d4b\u3001\u793e\u4ea4\u7f51\u7edc\u5206\u6790\u548c\u63a8\u8350\u7cfb\u7edf\u7684\u6838\u5fc3\u67b6\u6784\u3002
\u5728\u524d\u9762\u7684\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u5efa\u7acb\u4e86\u6570\u5b66\u57fa\u7840\uff1a\u51e0\u4f55\u6df1\u5ea6\u5b66\u4e60\uff08\u6587\u4ef61\uff09\u544a\u8bc9\u6211\u4eec\u5229\u7528\u5bf9\u79f0\u6027\uff0c\u56fe\u8bba\uff08\u6587\u4ef62\uff09\u63d0\u4f9b\u4e86\u8282\u70b9\u3001\u8fb9\u548c\u90bb\u63a5\u7684\u8bed\u8a00\u3002\u73b0\u5728\u6211\u4eec\u6784\u5efa\u76f4\u63a5\u5728\u56fe\uff08graph\uff09\u4e0a\u64cd\u4f5c\u7684\u795e\u7ecf\u7f51\u7edc\u3002
\u6838\u5fc3\u6311\u6218\uff1a\u56fe\u6570\u636e\u662f\u4e0d\u89c4\u5219\u7684\u3002\u4e0e\u56fe\u50cf\uff08\u56fa\u5b9a\u7f51\u683c\uff09\u6216\u5e8f\u5217\uff08\u56fa\u5b9a\u987a\u5e8f\uff09\u4e0d\u540c\uff0c\u56fe\u5177\u6709\u53ef\u53d8\u6570\u91cf\u7684\u8282\u70b9\u3001\u53ef\u53d8\u7684\u8fde\u901a\u6027\uff0c\u5e76\u4e14\u6ca1\u6709\u89c4\u8303\u7684\u8282\u70b9\u987a\u5e8f\u3002\u7528\u4e8e\u56fe\u7684\u795e\u7ecf\u7f51\u7edc\u5fc5\u987b\u5904\u7406\u6240\u6709\u8fd9\u4e9b\u60c5\u51b5\uff0c\u540c\u65f6\u4fdd\u6301\u7f6e\u6362\u7b49\u53d8\u6027\uff08\u91cd\u65b0\u6807\u8bb0\u8282\u70b9\u4e0d\u5e94\u6539\u53d8\u8f93\u51fa\uff09\u3002
\u51e0\u4e4e\u6240\u6709\u7684GNN\u90fd\u9075\u5faa\u540c\u6837\u7684\u6a21\u5f0f\uff0c\u79f0\u4e3a\u6d88\u606f\u4f20\u9012\uff08\u4e5f\u79f0\u4e3a\u90bb\u57df\u805a\u5408\uff09\u3002\u8fd9\u4e2a\u60f3\u6cd5\u7b80\u5355\u800c\u4f18\u96c5\uff1a\u6bcf\u4e2a\u8282\u70b9\u901a\u8fc7\u4ece\u90bb\u5c45\u6536\u96c6\u4fe1\u606f\u6765\u66f4\u65b0\u5176\u8868\u793a\u3002
\u5728\u6bcf\u4e2a\u5c42 \\(l\\)\uff0c\u6bcf\u4e2a\u8282\u70b9 \\(i\\) \u505a\u4e09\u4ef6\u4e8b\uff1a
\u5f62\u5f0f\u4e0a\uff1a
\u805a\u5408\u64cd\u4f5c \\(\\bigoplus\\) \u5fc5\u987b\u662f\u7f6e\u6362\u4e0d\u53d8\u7684\uff08\u90bb\u5c45\u5904\u7406\u7684\u987a\u5e8f\u65e0\u5173\u7d27\u8981\uff09\uff0c\u4ee5\u786e\u4fdd\u6574\u4e2a\u51fd\u6570\u662f\u7f6e\u6362\u7b49\u53d8\u7684\u3002\u8fd9\u76f4\u63a5\u5b9e\u73b0\u4e86\u6587\u4ef61\u4e2d\u7684\u5bf9\u79f0\u6027\u539f\u7406\u3002
\u7ecf\u8fc7 \\(k\\) \u5c42\u6d88\u606f\u4f20\u9012\u540e\uff0c\u6bcf\u4e2a\u8282\u70b9\u7684\u8868\u793a\u7f16\u7801\u4e86\u5176 \\(k\\) \u8df3\u90bb\u57df\u7684\u4fe1\u606f\uff1a\u6240\u6709\u5728 \\(k\\) \u6761\u8fb9\u5185\u53ef\u8fbe\u7684\u8282\u70b9\u3002\u7b2c1\u5c42\u770b\u5230\u76f4\u63a5\u90bb\u5c45\uff0c\u7b2c2\u5c42\u770b\u5230\u90bb\u5c45\u7684\u90bb\u5c45\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002\u8fd9\u5c31\u662f\u5c40\u90e8\u4fe1\u606f\u4f20\u64ad\u4ee5\u5efa\u7acb\u5168\u5c40\u7406\u89e3\u7684\u65b9\u5f0f\u3002
GNN\u7684\u611f\u53d7\u91ce\u968f\u6df1\u5ea6\u589e\u957f\uff0c\u5c31\u50cfCNN\u7684\u611f\u53d7\u91ce\u968f\u5c42\u6570\u589e\u957f\u4e00\u6837\uff08\u7b2c8\u7ae0\uff09\u3002\u4f46\u4e0e\u89c4\u5219\u7f51\u683c\u4e0a\u7684CNN\u4e0d\u540c\uff0c\u611f\u53d7\u91ce\u7684\u5f62\u72b6\u6839\u636e\u56fe\u62d3\u6251\u7ed3\u6784\u5728\u6bcf\u4e2a\u8282\u70b9\u4e0a\u6709\u6240\u4e0d\u540c\u3002
GCN\uff08Kipf & Welling\uff0c2017\uff09\u662f\u57fa\u7840\u6027\u7684GNN\u67b6\u6784\u3002\u5b83\u5c06\u8c31\u57df\u56fe\u5377\u79ef\uff08\u6765\u81ea\u6587\u4ef62\uff09\u7b80\u5316\u4e3a\u4e00\u4e2a\u4f18\u96c5\u3001\u9ad8\u6548\u7684\u516c\u5f0f\u3002
\u4ece\u8c31\u57df\u5377\u79ef \\(g_\\theta \\star \\mathbf{x} = U \\, \\text{diag}(\\hat{g}_\\theta) \\, U^T \\mathbf{x}\\) \u51fa\u53d1\uff0cKipf\u548cWelling\u7528\u4e00\u9636\u5207\u6bd4\u96ea\u592b\u591a\u9879\u5f0f\u8fd1\u4f3c\u8c31\u57df\u6ee4\u6ce2\u5668\uff0c\u8fd9\u5b8c\u5168\u907f\u514d\u4e86\u8ba1\u7b97\u7279\u5f81\u5206\u89e3\u3002\u7b80\u5316\u540e\uff0c\u9010\u5c42\u66f4\u65b0\u53d8\u4e3a\uff1a
\u5176\u4e2d\uff1a
\u77e9\u9635\u4e58\u6cd5 \\(\\hat{A} H^{(l)}\\) \u662f\u805a\u5408\u6b65\u9aa4\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u8282\u70b9\uff0c\u5b83\u8ba1\u7b97\u5176\u90bb\u5c45\u7279\u5f81\uff08\u52a0\u4e0a\u81ea\u8eab\u7279\u5f81\uff0c\u901a\u8fc7\u81ea\u73af\uff09\u7684\u52a0\u6743\u5e73\u5747\u3002\u6743\u91cd\u77e9\u9635 \\(W^{(l)}\\) \u662f\u53ef\u5b66\u4e60\u7684\u53d8\u6362\uff0c\u5728\u6240\u6709\u8282\u70b9\u95f4\u5171\u4eab\u3002\u6fc0\u6d3b\u51fd\u6570\u589e\u52a0\u4e86\u975e\u7ebf\u6027\u3002
\u8fd9\u975e\u5e38\u7b80\u5355\uff1a\u5b83\u53ea\u662f\u77e9\u9635\u4e58\u6cd5\u540e\u63a5\u4e00\u4e2a\u5b66\u4e60\u5230\u7684\u7ebf\u6027\u6620\u5c04\u548c\u6fc0\u6d3b\u51fd\u6570\u3002\u6574\u4e2aGCN\u5c42\u53ef\u4ee5\u7528\u4e00\u884c\u4ee3\u7801\u5b9e\u73b0\u3002\u901a\u8fc7 \\(\\tilde{D}^{-1/2}\\) \u7684\u5f52\u4e00\u5316\u9632\u6b62\u5177\u6709\u8bb8\u591a\u90bb\u5c45\u7684\u8282\u70b9\u5360\u4e3b\u5bfc\u5730\u4f4d\uff1a\u9ad8\u5ea6\u8282\u70b9\u7684\u6d88\u606f\u88ab\u6309\u6bd4\u4f8b\u7f29\u5c0f\u3002
\u5728\u6d88\u606f\u4f20\u9012\u6846\u67b6\u4e2d\uff0cGCN\u4f7f\u7528\uff1a
GCN\u662f\u76f4\u63a8\u5f0f\u7684\uff1a\u5b83\u5728\u8bad\u7ec3\u65f6\u9700\u8981\u5b8c\u6574\u7684\u56fe\uff0c\u65e0\u6cd5\u5904\u7406\u65b0\u51fa\u73b0\u7684\u672a\u77e5\u8282\u70b9\u3002\u5982\u679c\u65b0\u7528\u6237\u52a0\u5165\u793e\u4ea4\u7f51\u7edc\uff0cGCN\u5fc5\u987b\u5bf9\u6574\u4e2a\u56fe\u91cd\u65b0\u8bad\u7ec3\u3002GraphSAGE\uff08Hamilton\u7b49\uff0c2017\uff09\u901a\u8fc7\u5f52\u7eb3\u5f0f\u65b9\u6cd5\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002
\u5173\u952e\u601d\u60f3\u662f\u90bb\u57df\u91c7\u6837\uff1a\u4e0d\u662f\u4f7f\u7528\u6240\u6709\u90bb\u5c45\uff0c\u800c\u662f\u91c7\u6837\u4e00\u4e2a\u56fa\u5b9a\u5927\u5c0f\u7684\u5b50\u96c6\u3002\u8fd9\u4f7f\u5f97\u8ba1\u7b97\u72ec\u7acb\u4e8e\u5b8c\u6574\u7684\u56fe\u7ed3\u6784\uff0c\u5e76\u5141\u8bb8\u63a8\u5e7f\u5230\u672a\u89c1\u8fc7\u7684\u8282\u70b9\u548c\u56fe\u3002
\u8282\u70b9 \\(i\\) \u7684GraphSAGE\u66f4\u65b0\uff1a
\u5176\u4e2d \\(\\mathcal{S}(i)\\) \u662f\u4e00\u4e2a\u91c7\u6837\u7684\u90bb\u5c45\u5b50\u96c6\uff08\u4f8b\u5982\uff0c\u4ece500\u4e2a\u90bb\u5c45\u4e2d\u968f\u673a\u91c7\u683710\u4e2a\uff09\u3002CONCAT\u64cd\u4f5c\u663e\u5f0f\u5730\u5c06\u8282\u70b9\u81ea\u8eab\u7684\u7279\u5f81\u4e0e\u805a\u5408\u540e\u7684\u90bb\u5c45\u7279\u5f81\u5206\u5f00\uff0c\u8ba9\u7f51\u7edc\u5b66\u4e60\"\u81ea\u8eab\"\u548c\"\u90bb\u57df\"\u7684\u4e0d\u540c\u53d8\u6362\u3002
GraphSAGE\u652f\u6301\u591a\u79cd\u805a\u5408\u51fd\u6570\uff1a
\u91c7\u6837\u7b56\u7565\u4f7fGraphSAGE\u53ef\u6269\u5c55\u5230\u975e\u5e38\u5927\u7684\u56fe\u3002\u8bad\u7ec3\u4f7f\u7528\u8282\u70b9\u7684\u5c0f\u6279\u91cf\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u76ee\u6807\u8282\u70b9\uff0c\u5728\u7b2c1\u5c42\u91c7\u6837 \\(k_1\\) \u4e2a\u90bb\u5c45\uff0c\u7136\u540e\u5bf9\u4e8e\u5176\u4e2d\u6bcf\u4e2a\u90bb\u5c45\u5728\u7b2c2\u5c42\u91c7\u6837 \\(k_2\\) \u4e2a\u90bb\u5c45\u3002\u4f7f\u7528 \\(k_1 = k_2 = 10\\) \u548c2\u5c42\uff0c\u6bcf\u4e2a\u8282\u70b9\u7684\u8ba1\u7b97\u6811\u6700\u591a\u6709 \\(10 \\times 10 = 100\\) \u4e2a\u8282\u70b9\uff0c\u4e0e\u56fe\u7684\u5927\u5c0f\u65e0\u5173\u3002
\u4e0d\u540c\u7684GNN\u67b6\u6784\u5177\u6709\u4e0d\u540c\u7684\u8868\u8fbe\u80fd\u529b\uff1a\u5b83\u4eec\u533a\u5206\u7ed3\u6784\u4e0d\u540c\u4e4b\u56fe\u7684\u80fd\u529b\u3002GCN\u548cGraphSAGE\u867d\u7136\u5728\u5b9e\u8df5\u4e2d\u6709\u6548\uff0c\u4f46\u7406\u8bba\u4e0a\u5728\u80fd\u533a\u5206\u54ea\u4e9b\u56fe\u7ed3\u6784\u65b9\u9762\u662f\u53d7\u9650\u7684\u3002
\u8861\u91cfGNN\u8868\u8fbe\u80fd\u529b\u7684\u7406\u8bba\u5de5\u5177\u662fWeisfeiler-Lehman\uff08WL\uff09\u6d4b\u8bd5\uff0c\u8fd9\u662f\u4e00\u4e2a\u7528\u4e8e\u6d4b\u8bd5\u56fe\u540c\u6784\uff08\u4e24\u4e2a\u56fe\u662f\u5426\u7ed3\u6784\u76f8\u540c\uff09\u7684\u7ecf\u5178\u7b97\u6cd5\u3002WL\u6d4b\u8bd5\u901a\u8fc7\u5c06\u6bcf\u4e2a\u8282\u70b9\u7684\u6807\u7b7e\u4e0e\u5176\u90bb\u5c45\u6807\u7b7e\u7684\u591a\u91cd\u96c6\u4e00\u8d77\u54c8\u5e0c\uff0c\u8fed\u4ee3\u5730\u7cbe\u70bc\u8282\u70b9\u6807\u7b7e\u3002
GIN\uff08Xu\u7b49\uff0c2019\uff09\u88ab\u8bbe\u8ba1\u4e3a\u5177\u6709\u4e0eWL\u6d4b\u8bd5\u540c\u7b49\u7684\u8868\u8fbe\u80fd\u529b\uff0c\u4f7f\u5176\u6210\u4e3a\u6700\u5f3a\u5927\u7684\u6d88\u606f\u4f20\u9012GNN\uff08\u5728\u6d88\u606f\u4f20\u9012\u7684\u7406\u8bba\u9650\u5236\u5185\uff09\u3002\u5173\u952e\u6d1e\u5bdf\uff1a\u805a\u5408\u51fd\u6570\u5fc5\u987b\u5728\u591a\u91cd\u96c6\u4e0a\u662f\u5355\u5c04\u7684\uff08\u4e0d\u540c\u7684\u90bb\u5c45\u7279\u5f81\u591a\u91cd\u96c6\u5fc5\u987b\u4ea7\u751f\u4e0d\u540c\u7684\u805a\u5408\u503c\uff09\u3002
\u6c42\u548c\u805a\u5408\u5728\u591a\u91cd\u96c6\u4e0a\u662f\u5355\u5c04\u7684\uff08\u6c42\u548c \\(\\{1, 1, 2\\}\\) \u5f97\u52304\uff0c\u800c \\(\\{1, 3\\}\\) \u4e5f\u5f97\u52304\uff0c\u4f46\u5728\u5177\u6709\u8db3\u591f\u7ef4\u5ea6\u7684\u7279\u5f81\u5411\u91cf\u4e0a\uff0c\u4e0d\u540c\u591a\u91cd\u96c6\u7684\u548c\u4e00\u822c\u800c\u8a00\u662f\u4e0d\u540c\u7684\uff09\u3002\u5747\u503c\u548c\u53d6\u6700\u5927\u503c\u4e0d\u662f\u5355\u5c04\u7684\uff1a\u5747\u503c\u65e0\u6cd5\u533a\u5206 \\(\\{1, 1\\}\\) \u548c \\(\\{2, 2\\}\\)\uff0c\u53d6\u6700\u5927\u503c\u65e0\u6cd5\u533a\u5206 \\(\\{1, 2, 3\\}\\) \u548c \\(\\{1, 1, 3\\}\\)\u3002
GIN\u66f4\u65b0\uff1a
\u5176\u673a\u5236\u662f\u76f4\u89c2\u7684\u3002\u6bcf\u4e2a\u6d88\u606f\u4f20\u9012\u5c42\u5c06\u8282\u70b9\u7684\u7279\u5f81\u4e0e\u5176\u90bb\u5c45\u7684\u7279\u5f81\u8fdb\u884c\u5e73\u5747\u3002\u7ecf\u8fc7\u591a\u8f6e\u5e73\u5747\u540e\uff0c\u6bcf\u4e2a\u8282\u70b9\u5df2\u7ecf\"\u770b\u5230\"\uff08\u5e76\u6df7\u5408\u4e86\uff09\u5176\u8fde\u901a\u5206\u91cf\u4e2d\u7684\u6bcf\u4e2a\u5176\u4ed6\u8282\u70b9\u3002\u8fd9\u4e9b\u7279\u5f81\u53d8\u6210\u4e86\u7edf\u4e00\u7684\u5e73\u5747\u503c\uff0c\u76f8\u5f53\u4e8e\u5c06\u56fe\u50cf\u6a21\u7cca\u592a\u591a\u6b21\u76f4\u5230\u53d8\u6210\u7eaf\u8272\u7684\u56fe\u7c7b\u6bd4\u3002
\u5f62\u5f0f\u4e0a\uff0c\u91cd\u590d\u5e94\u7528\u5f52\u4e00\u5316\u90bb\u63a5\u77e9\u9635 \\(\\hat{A}\\) \u6536\u655b\u5230\u4e00\u4e2a\u79e9\u4e3a1\u7684\u77e9\u9635\uff08\u6bcf\u4e00\u884c\u90fd\u53d8\u5f97\u4e0e\u56fe\u4e0a\u968f\u673a\u6e38\u8d70\u7684\u5e73\u7a33\u5206\u5e03\u6210\u6b63\u6bd4\uff09\u3002\u8fd9\u4e0e\u5e42\u8fed\u4ee3\u6536\u655b\u5230\u4e3b\u7279\u5f81\u5411\u91cf\u7684\u8fc7\u7a0b\u76f8\u540c\uff08\u7b2c2\u7ae0\uff09\u3002
\u8fc7\u5e73\u6ed1\u5c06GNN\u9650\u5236\u5728\u5f88\u6d45\u7684\u6df1\u5ea6\uff08\u901a\u5e382-4\u5c42\uff09\uff0c\u800cCNN\u548cTransformer\u53ef\u4ee5\u4ece\u51e0\u5341\u6216\u6570\u767e\u5c42\u4e2d\u53d7\u76ca\u3002\u8fd9\u610f\u5473\u7740\u6bcf\u4e2a\u8282\u70b9\u53ea\u80fd\u770b\u5230\u6709\u9650\u7684\u90bb\u57df\uff0c\u8fd9\u5bf9\u4e8e\u9700\u8981\u957f\u8ddd\u79bb\u4fe1\u606f\u7684\u4efb\u52a1\u6765\u8bf4\u662f\u6709\u95ee\u9898\u7684\u3002
\u7f13\u89e3\u65b9\u6cd5\u5305\u62ec\uff1a
\u5bf9\u4e8e\u56fe\u7ea7\u522b\u4efb\u52a1\uff08\u9884\u6d4b\u6574\u4e2a\u56fe\u7684\u5c5e\u6027\uff0c\u5982\u5206\u5b50\u7684\u6bd2\u6027\uff09\uff0c\u6211\u4eec\u9700\u8981\u5c06\u6240\u6709\u8282\u70b9\u8868\u793a\u6298\u53e0\u6210\u4e00\u4e2a\u5355\u4e00\u7684\u56fe\u7ea7\u522b\u5411\u91cf\u3002\u8fd9\u5c31\u662f\u56fe\u6c60\u5316\uff0c\u662fCNN\u4e2d\u5168\u5c40\u5e73\u5747\u6c60\u5316\u7684\u56fe\u7c7b\u6bd4\uff08\u7b2c8\u7ae0\uff09\u3002
\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u662f\u8bfb\u51fa\uff08readout\uff09\uff1a\u5bf9\u6240\u6709\u8282\u70b9\u7279\u5f81\u5e94\u7528\u4e00\u4e2a\u7f6e\u6362\u4e0d\u53d8\u51fd\u6570\uff1a
\u8fd9\u5c31\u662f\u6587\u4ef61\u4e2d\u7684DeepSets\u805a\u5408\uff0c\u5e94\u7528\u4e8e\u6700\u7ec8\u7684GNN\u5c42\u4e4b\u540e\u3002\u6c42\u548c\u4fdd\u7559\u4e86\u5927\u5c0f\u4fe1\u606f\uff08\u4e00\u4e2a\u6709100\u4e2a\u8282\u70b9\u7684\u56fe\u4f1a\u6bd4\u53ea\u670910\u4e2a\u8282\u70b9\u7684\u56fe\u5177\u6709\u66f4\u5927\u7684\u548c\uff09\uff0c\u800c\u5747\u503c\u5bf9\u5927\u5c0f\u8fdb\u884c\u4e86\u5f52\u4e00\u5316\u3002
\u5206\u5c42\u6c60\u5316\u9010\u6b65\u7c97\u5316\u56fe\uff0c\u6a21\u4effCNN\u9010\u6b65\u4e0b\u91c7\u6837\u56fe\u50cf\u7684\u65b9\u5f0f\u3002\u5728\u6bcf\u4e2a\u5c42\u7ea7\uff0c\u8282\u70b9\u7ec4\u88ab\u5408\u5e76\u4e3a\"\u8d85\u8282\u70b9\"\uff1a
DiffPool\uff08\u53ef\u5fae\u5206\u6c60\u5316\uff09\u5b66\u4e60\u4e00\u4e2a\u8f6f\u5206\u914d\u77e9\u9635 \\(S^{(l)} \\in \\mathbb{R}^{n_l \\times n_{l+1}}\\)\uff0c\u5c06\u6bcf\u4e2a\u8282\u70b9\u5206\u914d\u5230\u4e00\u4e2a\u7c07\uff1a
\u5206\u914d\u77e9\u9635\u7531\u4e00\u4e2a\u5355\u72ec\u7684GNN\u9884\u6d4b\uff0c\u4f7f\u805a\u7c7b\u53d8\u5f97\u7aef\u5230\u7aef\u53ef\u5fae\u5206\u3002\u8fd9\u521b\u5efa\u4e86\u4e00\u4e2a\u5c42\u6b21\u7ed3\u6784\uff1a\u539f\u59cb\u56fe \u2192 \u5177\u6709\u8f83\u5c11\u8282\u70b9\u7684\u7c97\u5316\u56fe \u2192 \u66f4\u7c97\u7684\u56fe \u2192 \u5355\u4e2a\u8282\u70b9\uff08\u56fe\u8868\u793a\uff09\u3002
TopKPool\u91c7\u7528\u66f4\u7b80\u5355\u7684\u65b9\u6cd5\uff1a\u4e3a\u6bcf\u4e2a\u8282\u70b9\u5b66\u4e60\u4e00\u4e2a\u6807\u91cf\u5206\u6570\uff0c\u4fdd\u7559\u5f97\u5206\u6700\u9ad8\u7684 top-\\(k\\) \u4e2a\u8282\u70b9\uff0c\u4e22\u5f03\u5176\u4f59\u8282\u70b9\u3002\u8fd9\u662f\u4e00\u79cd\u786c\u9009\u62e9\uff08\u800c\u975e\u8f6f\u5206\u914d\uff09\uff0c\u8ba1\u7b97\u4e0a\u6bd4DiffPool\u66f4\u5ec9\u4ef7\u3002
\u622a\u81f3\u76ee\u524d\u7684\u6240\u6709GNN\u90fd\u5047\u8bbe\u4e00\u4e2a\u540c\u6784\u56fe\uff1a\u4e00\u79cd\u8282\u70b9\u7c7b\u578b\uff0c\u4e00\u79cd\u8fb9\u7c7b\u578b\u3002\u4f46\u5927\u591a\u6570\u73b0\u5b9e\u4e16\u754c\u7684\u56fe\u662f\u5f02\u6784\u7684\uff1a\u591a\u79cd\u8282\u70b9\u7c7b\u578b\u548c\u591a\u79cd\u8fb9\u7c7b\u578b\u3002\u77e5\u8bc6\u56fe\u8c31\u6709\u4eba\u7269\u8282\u70b9\u3001\u7ec4\u7ec7\u8282\u70b9\u548c\u4f4d\u7f6e\u8282\u70b9\uff0c\u7531\"\u5de5\u4f5c\u4e8e\"\u3001\"\u51fa\u751f\u4e8e\"\u548c\"\u4f4d\u4e8e\"\u8fb9\u8fde\u63a5\u3002\u63a8\u8350\u7cfb\u7edf\u6709\u7528\u6237\u8282\u70b9\u548c\u7269\u54c1\u8282\u70b9\uff0c\u7531\"\u5df2\u8d2d\u4e70\"\u3001\"\u5df2\u6d4f\u89c8\"\u548c\"\u5df2\u8bc4\u4ef7\"\u8fb9\u8fde\u63a5\u3002
\u5f02\u6784\u56fe\u6709\u4e00\u4e2a\u6a21\u5f0f\uff08\u4e5f\u79f0\u4e3a\u5143\u56fe\uff09\uff0c\u5b9a\u4e49\u4e86\u5141\u8bb8\u7684\u8282\u70b9\u7c7b\u578b\u548c\u8fb9\u7c7b\u578b\u3002\u6bcf\u4e2a\u8fb9\u7c7b\u578b\u8fde\u63a5\u7279\u5b9a\u7684\u6e90\u7c7b\u578b\u5230\u7279\u5b9a\u7684\u76ee\u6807\u7c7b\u578b\u3002\u4f8b\u5982\uff0c\"\u5de5\u4f5c\u4e8e\"\u8fde\u63a5 Person \u2192 Organisation\u3002
\u5173\u7cfbGCN\uff08R-GCN\uff09\uff08Schlichtkrull\u7b49\uff0c2018\uff09\u901a\u8fc7\u4e3a\u6bcf\u79cd\u8fb9\u7c7b\u578b\u4f7f\u7528\u5355\u72ec\u7684\u6743\u91cd\u77e9\u9635\u6765\u5904\u7406\u5f02\u6784\u8fb9\uff1a
\u5176\u4e2d \\(\\mathcal{R}\\) \u662f\u8fb9\u7c7b\u578b\u7684\u96c6\u5408\uff0c\\(\\mathcal{N}_r(i)\\) \u662f\u901a\u8fc7\u5173\u7cfb \\(r\\) \u8fde\u63a5\u5230\u8282\u70b9 \\(i\\) \u7684\u90bb\u5c45\u96c6\u5408\uff0c\\(W_r\\) \u662f\u5173\u7cfb \\(r\\) \u7279\u6709\u7684\u6743\u91cd\u77e9\u9635\u3002\u81ea\u8fde\u63a5 \\(W_0\\) \u5355\u72ec\u5904\u7406\u8282\u70b9\u81ea\u8eab\u7684\u7279\u5f81\u3002
\u95ee\u9898\uff1a\u5f53\u5173\u7cfb\u7c7b\u578b\u5f88\u591a\u65f6\uff0c\u53c2\u6570\u6570\u91cf\u7206\u70b8\uff08\u6bcf\u79cd\u5173\u7cfb\u4e00\u4e2a \\(d \\times d\\) \u77e9\u9635\uff09\u3002R-GCN\u901a\u8fc7\u57fa\u5206\u89e3\u7f13\u89e3\u8fd9\u4e00\u95ee\u9898\uff1a\\(W_r = \\sum_{b=1}^{B} a_{rb} V_b\\)\uff0c\u5176\u4e2d \\(V_b\\) \u662f\u5171\u4eab\u7684\u57fa\u77e9\u9635\uff0c\\(a_{rb}\\) \u662f\u6bcf\u4e2a\u5173\u7cfb\u7684\u6807\u91cf\u7cfb\u6570\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u4f4e\u79e9\u5206\u89e3\uff08\u7b2c2\u7ae0\uff09\uff1a\u5173\u7cfb\u7279\u5b9a\u7684\u77e9\u9635\u751f\u6d3b\u5728\u4e00\u4e2a\u4f4e\u7ef4\u5b50\u7a7a\u95f4\u4e2d\u3002
\u5f02\u6784\u56fe\u8868Transformer\uff08HGT\uff09\uff08Hu\u7b49\uff0c2020\uff09\u5c06\u6ce8\u610f\u529b\u673a\u5236\u5e94\u7528\u4e8e\u5f02\u6784\u56fe\u3002\u5173\u952e\u6d1e\u5bdf\uff1a\u6ce8\u610f\u529b\u5e94\u540c\u65f6\u4f9d\u8d56\u4e8e\u8282\u70b9\u7c7b\u578b\u548c\u8fde\u63a5\u5b83\u4eec\u7684\u8fb9\u7c7b\u578b\u3002HGT\u4e3a\u67e5\u8be2\u3001\u952e\u548c\u503c\u4f7f\u7528\u7c7b\u578b\u7279\u5b9a\u7684\u6295\u5f71\u77e9\u9635\uff1a
\u5176\u4e2d \\(\\tau(i)\\) \u662f\u8282\u70b9 \\(i\\) \u7684\u7c7b\u578b\uff0c\\(\\phi(i,j)\\) \u662f\u5b83\u4eec\u4e4b\u95f4\u7684\u8fb9\u7c7b\u578b\u3002\u8fd9\u786e\u4fdd\u4e86\u6a21\u578b\u5bf9\u4e0d\u540c\u7684\u5173\u7cfb\u7c7b\u578b\u4f7f\u7528\u4e0d\u540c\u7684\u6ce8\u610f\u529b\u6743\u91cd\uff1a\u4e00\u7bc7\u8bba\u6587\u5173\u6ce8\u5176\u4f5c\u8005\u65f6\uff0c\u5e94\u4f7f\u7528\u4e0e\u5173\u6ce8\u5176\u53c2\u8003\u6587\u732e\u65f6\u4e0d\u540c\u7684\u6ce8\u610f\u529b\u6743\u91cd\u3002
\u57fa\u4e8e\u5143\u8def\u5f84\u7684\u65b9\u6cd5\u5b9a\u4e49\u901a\u8fc7\u6a21\u5f0f\u7684\u542b\u4e49\u8def\u5f84\uff08\u4f8b\u5982\uff0c\u4f5c\u8005 \u2192 \u8bba\u6587 \u2192 \u4f5c\u8005\u8868\u793a\u5408\u8457\u5173\u7cfb\uff09\uff0c\u5e76\u6cbf\u7740\u8fd9\u4e9b\u8def\u5f84\u805a\u5408\u4fe1\u606f\u3002HAN\uff08\u5f02\u6784\u56fe\u6ce8\u610f\u529b\u7f51\u7edc\uff09\u5728\u4e24\u4e2a\u5c42\u6b21\u5e94\u7528\u6ce8\u610f\u529b\uff1a\u5728\u6bcf\u4e2a\u5143\u8def\u5f84\u5185\uff08\u6cbf\u6b64\u8def\u5f84\u54ea\u4e9b\u90bb\u5c45\u91cd\u8981\uff1f\uff09\u548c\u8de8\u5143\u8def\u5f84\uff08\u54ea\u4e9b\u5173\u7cfb\u6a21\u5f0f\u91cd\u8981\uff1f\uff09\u3002
\u94fe\u63a5\u9884\u6d4b\u63d0\u51fa\u7684\u95ee\u9898\u662f\uff1a\u7ed9\u5b9a\u73b0\u6709\u8fb9\uff0c\u54ea\u4e9b\u7f3a\u5931\u7684\u8fb9\u53ef\u80fd\u5b58\u5728\uff1f\u8fd9\u662f\u77e5\u8bc6\u56fe\u8c31\u8865\u5168\uff08\u9884\u6d4b\u7f3a\u5931\u7684\u4e8b\u5b9e\uff09\u3001\u63a8\u8350\uff08\u9884\u6d4b\u7528\u6237\u4f1a\u559c\u6b22\u54ea\u4e9b\u7269\u54c1\uff09\u548c\u793e\u4ea4\u7f51\u7edc\u5206\u6790\uff08\u9884\u6d4b\u672a\u6765\u7684\u53cb\u8c0a\uff09\u7684\u6838\u5fc3\u4efb\u52a1\u3002
\u57fa\u4e8e\u5d4c\u5165\u7684\u65b9\u6cd5\u4e3a\u6bcf\u4e2a\u5b9e\u4f53\u5b66\u4e60\u4e00\u4e2a\u5411\u91cf\uff0c\u4e3a\u6bcf\u4e2a\u5173\u7cfb\u5b66\u4e60\u4e00\u4e2a\u53d8\u6362\uff0c\u7136\u540e\u901a\u8fc7\u5b9e\u4f53\u548c\u5173\u7cfb\u7684\u5339\u914d\u7a0b\u5ea6\u5bf9\u6f5c\u5728\u8fb9\u8fdb\u884c\u8bc4\u5206\uff1a
TransE\u5c06\u5173\u7cfb\u5efa\u6a21\u4e3a\u5d4c\u5165\u7a7a\u95f4\u4e2d\u7684\u5e73\u79fb\uff1a\u5982\u679c \\((h, r, t)\\) \u662f\u4e00\u4e2a\u6709\u6548\u7684\u4e09\u5143\u7ec4\uff08\u5934\u5b9e\u4f53\uff0c\u5173\u7cfb\uff0c\u5c3e\u5b9e\u4f53\uff09\uff0c\u90a3\u4e48 \\(\\mathbf{h} + \\mathbf{r} \\approx \\mathbf{t}\\)\u3002\u8bc4\u5206\u51fd\u6570\u4e3a \\(f(h, r, t) = -\\|\\mathbf{h} + \\mathbf{r} - \\mathbf{t}\\|\\)\u3002\u76f4\u89c2\u5730\u8bf4\uff0c\u5173\u7cfb\u5411\u91cf\u5728\u5d4c\u5165\u7a7a\u95f4\u4e2d\u5c06\u5934\u5b9e\u4f53\"\u79fb\u52a8\"\u5230\u5c3e\u5b9e\u4f53\u3002
RotatE\u5c06\u5173\u7cfb\u5efa\u6a21\u4e3a\u590d\u7a7a\u95f4\u4e2d\u7684\u65cb\u8f6c\uff1a\\(\\mathbf{t} = \\mathbf{h} \\circ \\mathbf{r}\\)\uff0c\u5176\u4e2d \\(\\circ\\) \u662f\u9010\u5143\u7d20\u590d\u6570\u4e58\u6cd5\uff0c\\(|\\mathbf{r}_i| = 1\\)\uff08\u5355\u4f4d\u590d\u6570\u5c31\u662f\u65cb\u8f6c\uff09\u3002\u8fd9\u53ef\u4ee5\u5efa\u6a21TransE\u65e0\u6cd5\u5904\u7406\u7684\u5bf9\u79f0\u6027\u3001\u53cd\u5bf9\u79f0\u6027\u3001\u53cd\u8f6c\u548c\u590d\u5408\u6a21\u5f0f\u3002
ComplEx\u4f7f\u7528\u590d\u6570\u503c\u5d4c\u5165\u548c\u57c3\u5c14\u7c73\u7279\u70b9\u79ef\uff0c\u4f7f\u5176\u80fd\u591f\u5efa\u6a21\u975e\u5bf9\u79f0\u5173\u7cfb\uff08\u5982\u679cA\u662fB\u7684\u8001\u677f\uff0cB\u4e0d\u662fA\u7684\u8001\u677f\uff09\u3002
\u57fa\u4e8eGNN\u7684\u94fe\u63a5\u9884\u6d4b\u901a\u8fc7\u6d88\u606f\u4f20\u9012\u8ba1\u7b97\u8282\u70b9\u5d4c\u5165\uff0c\u7136\u540e\u4f7f\u7528\u7aef\u70b9\u5d4c\u5165\u5bf9\u8fb9\u8fdb\u884c\u8bc4\u5206\u3002\u8fd9\u7ed3\u5408\u4e86GNN\u7684\u7ed3\u6784\u63a8\u7406\u80fd\u529b\u548c\u5d4c\u5165\u65b9\u6cd5\u7684\u5173\u7cfb\u5efa\u6a21\u80fd\u529b\u3002GNN\u7f16\u7801\u5668\u6355\u83b7\u4e86\u5355\u5d4c\u5165\u65b9\u6cd5\u6240\u9057\u6f0f\u7684\u591a\u8df3\u90bb\u57df\u7ed3\u6784\u3002
GNN\u89e3\u51b3\u4e09\u7c7b\u4efb\u52a1\uff1a
\u8282\u70b9\u7ea7\u522b\u4efb\u52a1\uff1a\u4e3a\u6bcf\u4e2a\u8282\u70b9\u9884\u6d4b\u4e00\u4e2a\u5c5e\u6027\u3002\u793a\u4f8b\uff1a\u5bf9\u793e\u4ea4\u7f51\u7edc\u4e2d\u7684\u7528\u6237\u8fdb\u884c\u5206\u7c7b\uff08\u673a\u5668\u4eba\u8fd8\u662f\u4eba\u7c7b\uff09\uff0c\u9884\u6d4b\u76f8\u4e92\u4f5c\u7528\u7f51\u7edc\u4e2d\u6bcf\u4e2a\u86cb\u767d\u8d28\u7684\u529f\u80fd\uff0c\u534a\u76d1\u7763\u8282\u70b9\u5206\u7c7b\uff08\u6807\u8bb0\u5c11\u6570\u8282\u70b9\uff0c\u9884\u6d4b\u5176\u4f59\u8282\u70b9\uff09\u3002\u8f93\u51fa\u662f\u8282\u70b9\u5d4c\u5165 \\(\\mathbf{h}_i^{(L)}\\) \u7ecf\u8fc7\u4e00\u4e2a\u5206\u7c7b\u5668\u3002
\u8fb9\u7ea7\u522b\u4efb\u52a1\uff1a\u4e3a\u6bcf\u6761\u8fb9\u9884\u6d4b\u4e00\u4e2a\u5c5e\u6027\u6216\u9884\u6d4b\u8fb9\u662f\u5426\u5b58\u5728\u3002\u793a\u4f8b\uff1a\u94fe\u63a5\u9884\u6d4b\uff08\u8fd9\u4e24\u4e2a\u7528\u6237\u4f1a\u6210\u4e3a\u670b\u53cb\u5417\uff1f\uff09\uff0c\u77e5\u8bc6\u56fe\u8c31\u8865\u5168\uff08\u8fd9\u4e2a\u5173\u7cfb\u5728\u8fd9\u4e9b\u5b9e\u4f53\u95f4\u6210\u7acb\u5417\uff1f\uff09\uff0c\u836f\u7269-\u836f\u7269\u76f8\u4e92\u4f5c\u7528\u9884\u6d4b\u3002\u8f93\u51fa\u901a\u5e38\u4f7f\u7528\u4e24\u4e2a\u7aef\u70b9\u8282\u70b9\u7684\u5d4c\u5165\uff1a\\(\\hat{y}_{ij} = f(\\mathbf{h}_i, \\mathbf{h}_j)\\)\uff0c\u5176\u4e2d \\(f\\) \u662f\u70b9\u79ef\u3001\u62fc\u63a5+MLP\u6216\u5176\u4ed6\u7ec4\u5408\u3002
\u56fe\u7ea7\u522b\u4efb\u52a1\uff1a\u4e3a\u6574\u4e2a\u56fe\u9884\u6d4b\u4e00\u4e2a\u5c5e\u6027\u3002\u793a\u4f8b\uff1a\u5206\u5b50\u6027\u8d28\u9884\u6d4b\uff08\u8fd9\u4e2a\u5206\u5b50\u6709\u6bd2\u5417\uff1f\uff09\uff0c\u56fe\u5206\u7c7b\uff08\u8fd9\u4e2a\u793e\u4ea4\u7f51\u7edc\u662f\u673a\u5668\u4eba\u7f51\u7edc\u5417\uff1f\uff09\uff0c\u56fe\u751f\u6210\uff08\u8bbe\u8ba1\u4e00\u4e2a\u5177\u6709\u671f\u671b\u6027\u8d28\u7684\u5206\u5b50\uff09\u3002\u8f93\u51fa\u4f7f\u7528\u56fe\u6c60\u5316\u4ea7\u751f \\(\\mathbf{h}_G\\)\uff0c\u7136\u540e\u8fdb\u884c\u5206\u7c7b\u6216\u56de\u5f52\u3002
\u4f7f\u7528\u5f52\u4e00\u5316\u90bb\u63a5\u77e9\u9635\u4ece\u5934\u5b9e\u73b0\u4e00\u4e2a\u5355\u5c42GCN\u3002\u5e94\u7528\u4e8e\u4e00\u4e2a\u5c0f\u578b\u56fe\uff0c\u89c2\u5bdf\u8282\u70b9\u7279\u5f81\u5982\u4f55\u88ab\u5e73\u6ed1\u3002
import jax\nimport jax.numpy as jnp\n\n# \u56fe\uff1a5\u4e2a\u8282\u70b9\uff0c\u7b80\u5355\u94fe\u5e26\u5206\u652f\nA = jnp.array([[0, 1, 0, 0, 0],\n [1, 0, 1, 0, 0],\n [0, 1, 0, 1, 1],\n [0, 0, 1, 0, 0],\n [0, 0, 1, 0, 0]], dtype=float)\n\n# \u6dfb\u52a0\u81ea\u73af\nA_hat = A + jnp.eye(5)\nD_hat = jnp.diag(A_hat.sum(axis=1))\nD_inv_sqrt = jnp.diag(1.0 / jnp.sqrt(A_hat.sum(axis=1)))\nA_norm = D_inv_sqrt @ A_hat @ D_inv_sqrt\n\n# \u8282\u70b9\u7279\u5f81\uff1aone-hot \u5355\u4f4d\u9635\nH = jnp.eye(5)\n\n# \u6743\u91cd\u77e9\u9635\uff08\u968f\u673a\u521d\u59cb\u5316\uff09\nrng = jax.random.PRNGKey(0)\nW = jax.random.normal(rng, (5, 3)) * 0.5\n\n# GCN\u5c42\uff1aH' = ReLU(A_norm @ H @ W)\nH_new = jax.nn.relu(A_norm @ H @ W)\n\nprint(\"\u539f\u59cb\u7279\u5f81\uff08one-hot\uff09:\")\nprint(H)\nprint(\"\\n\u7ecf\u8fc7GCN\u5c42\u540e:\")\nprint(jnp.round(H_new, 3))\nprint(\"\\n\u6ce8\u610f\uff1a\u8fde\u63a5\u7684\u8282\u70b9\u73b0\u5728\u5177\u6709\u76f8\u4f3c\u7684\u8868\u793a\")\n \u5b9e\u73b0\u5177\u6709\u6c42\u548c\u805a\u5408\uff08GIN\u98ce\u683c\uff09\u548c\u5747\u503c\u805a\u5408\uff08GCN\u98ce\u683c\uff09\u7684\u6d88\u606f\u4f20\u9012\u3002\u5c55\u793a\u6c42\u548c\u80fd\u533a\u5206\u5747\u503c\u65e0\u6cd5\u533a\u5206\u7684\u591a\u91cd\u96c6\u3002
import jax.numpy as jnp\n\n# \u4e24\u4e2a\u5177\u6709\u76f8\u540c\u5747\u503c\u7684\u4e0d\u540c\u90bb\u5c45\u591a\u91cd\u96c6\n# \u8282\u70b9A\uff1a\u90bb\u5c45\u7279\u5f81\u4e3a [1, 1, 1, 1] \uff08\u56db\u4e2a\u90bb\u5c45\uff0c\u90fd\u662f1\uff09\n# \u8282\u70b9B\uff1a\u90bb\u5c45\u7279\u5f81\u4e3a [2, 2] \uff08\u4e24\u4e2a\u90bb\u5c45\uff0c\u90fd\u662f2\uff09\n\nneighbours_A = jnp.array([[1.0], [1.0], [1.0], [1.0]])\nneighbours_B = jnp.array([[2.0], [2.0]])\n\n# \u5747\u503c\u805a\u5408\nmean_A = neighbours_A.mean(axis=0)\nmean_B = neighbours_B.mean(axis=0)\nprint(f\"\u5747\u503c A: {mean_A}, \u5747\u503c B: {mean_B}, \u76f8\u540c: {jnp.allclose(mean_A, mean_B)}\")\n\n# \u6c42\u548c\u805a\u5408\nsum_A = neighbours_A.sum(axis=0)\nsum_B = neighbours_B.sum(axis=0)\nprint(f\"\u6c42\u548c A: {sum_A}, \u6c42\u548c B: {sum_B}, \u76f8\u540c: {jnp.allclose(sum_A, sum_B)}\")\nprint(\"\\n\u6c42\u548c\u80fd\u533a\u5206\u8fd9\u4e9b\u591a\u91cd\u96c6\uff1b\u5747\u503c\u4e0d\u80fd\uff01\")\n \u6f14\u793a\u8fc7\u5e73\u6ed1\u3002\u91cd\u590d\u5e94\u7528\u5f52\u4e00\u5316\u90bb\u63a5\u77e9\u9635\uff0c\u89c2\u5bdf\u8282\u70b9\u7279\u5f81\u6536\u655b\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u968f\u673a\u56fe\nA = jnp.array([[0,1,1,0,0,0],\n [1,0,1,0,0,0],\n [1,1,0,1,0,0],\n [0,0,1,0,1,1],\n [0,0,0,1,0,1],\n [0,0,0,1,1,0]], dtype=float)\n\nA_hat = A + jnp.eye(6)\nD_inv_sqrt = jnp.diag(1.0 / jnp.sqrt(A_hat.sum(axis=1)))\nA_norm = D_inv_sqrt @ A_hat @ D_inv_sqrt\n\n# \u521d\u59cb\u7279\u5f81\uff1a\u6bcf\u4e2a\u8282\u70b9\u5404\u4e0d\u76f8\u540c\nH = jnp.array([[1,0], [0,1], [1,1], [-1,0], [0,-1], [-1,-1]], dtype=float)\n\ndistances = []\nfor k in range(20):\n H = A_norm @ H\n # \u8861\u91cf\u7279\u5f81\u7684\u533a\u522b\u7a0b\u5ea6\uff08\u8282\u70b9\u95f4\u7684\u6807\u51c6\u5dee\uff09\n spread = jnp.std(H, axis=0).mean()\n distances.append(float(spread))\n\nplt.plot(distances, \"o-\")\nplt.xlabel(\"\u6d88\u606f\u4f20\u9012\u8f6e\u6570\")\nplt.ylabel(\"\u7279\u5f81\u5206\u6563\u5ea6\uff08\u8282\u70b9\u95f4\u6807\u51c6\u5dee\uff09\")\nplt.title(\"\u8fc7\u5e73\u6ed1\uff1a\u7279\u5f81\u968f\u6df1\u5ea6\u589e\u52a0\u800c\u6536\u655b\")\nplt.show()\n \u56fe\u6ce8\u610f\u529b\u7f51\u7edc\u5c06\u5747\u5300\u7684\u90bb\u5c45\u805a\u5408\u66ff\u6362\u4e3a\u5b66\u4e60\u5230\u7684\u3001\u4f9d\u8d56\u6570\u636e\u7684\u52a0\u6743\u3002\u672c\u7ae0\u6db5\u76d6GAT\u3001\u591a\u5934\u56fe\u6ce8\u610f\u529b\u3001GATv2\u3001\u56feTransformer\u3001\u4f4d\u7f6e\u548c\u7ed3\u6784\u7f16\u7801\u4ee5\u53ca\u53ef\u6269\u5c55\u6027
\u5728GCN\uff08\u6587\u4ef63\uff09\u4e2d\uff0c\u6bcf\u4e2a\u8282\u70b9\u4f7f\u7528\u7531\u56fe\u7ed3\u6784\u786e\u5b9a\u7684\u56fa\u5b9a\u6743\u91cd\uff08\u5f52\u4e00\u5316\u90bb\u63a5\u77e9\u9635\uff09\u805a\u5408\u5176\u90bb\u5c45\u7279\u5f81\u3002\u4e00\u4e2a\u6709\u4e09\u4e2a\u90bb\u5c45\u7684\u8282\u70b9\u4f1a\u7ed9\u6bcf\u4e2a\u90bb\u5c45\u5927\u81f4\u76f8\u7b49\u7684\u6743\u91cd\uff08\\(\\approx 1/3\\)\uff09\u3002\u4f46\u5e76\u975e\u6240\u6709\u90bb\u5c45\u90fd\u540c\u7b49\u91cd\u8981\uff1a\u6765\u81ea\u5bc6\u5207\u5408\u4f5c\u8005\u7684\u6d88\u606f\u5e94\u6bd4\u6765\u81ea\u8fdc\u65b9\u719f\u4eba\u7684\u6d88\u606f\u66f4\u91cd\u8981\u3002
\u56fe\u6ce8\u610f\u529b\u7f51\u7edc\u901a\u8fc7\u4f7f\u7528\u4e0eTransformer\uff08\u7b2c7\u7ae0\uff09\u76f8\u540c\u7684\u6ce8\u610f\u529b\u673a\u5236\u6765\u5b66\u4e60\u5173\u6ce8\u54ea\u4e9b\u90bb\u5c45\uff0c\u4ece\u800c\u89e3\u51b3\u4e86\u8fd9\u4e00\u95ee\u9898\u3002\u4e0e\u56fa\u5b9a\u7684\u3001\u57fa\u4e8e\u7ed3\u6784\u7684\u6743\u91cd\u4e0d\u540c\uff0c\u6bcf\u4e2a\u8282\u70b9\u5728\u5176\u90bb\u5c45\u4e0a\u8ba1\u7b97\u52a8\u6001\u7684\u3001\u57fa\u4e8e\u5185\u5bb9\u7684\u6ce8\u610f\u529b\u5206\u6570\u3002
\u5176\u4e2d \\(W \\in \\mathbb{R}^{d' \\times d}\\) \u662f\u5171\u4eab\u7684\u7ebf\u6027\u53d8\u6362\uff0c\\(\\|\\) \u8868\u793a\u62fc\u63a5\uff0c\\(\\mathbf{a} \\in \\mathbb{R}^{2d'}\\) \u662f\u53ef\u5b66\u4e60\u7684\u6ce8\u610f\u529b\u5411\u91cf\u3002\u5206\u6570 \\(e_{ij}\\) \u8861\u91cf\u8282\u70b9 \\(j\\) \u7684\u7279\u5f81\u5bf9\u8282\u70b9 \\(i\\) \u7684\u91cd\u8981\u7a0b\u5ea6\u3002
\u539f\u59cb\u5206\u6570\u4f7f\u7528softmax\u5728\u6240\u6709\u90bb\u5c45\u4e4b\u95f4\u8fdb\u884c\u5f52\u4e00\u5316\uff1a
\u4e0eGCN\u7684\u5173\u952e\u533a\u522b\uff1a\u6743\u91cd \\(\\alpha_{ij}\\) \u662f\u4ece\u6570\u636e\u4e2d\u5b66\u4e60\u7684\uff0c\u800c\u975e\u7531\u56fe\u7ed3\u6784\u56fa\u5b9a\u3002\u8282\u70b9\u53ef\u4ee5\u5b66\u4f1a\u5173\u6ce8\u4fe1\u606f\u91cf\u6700\u5927\u7684\u90bb\u5c45\uff0c\u540c\u65f6\u5ffd\u7565\u566a\u58f0\u6216\u65e0\u5173\u7684\u90bb\u5c45\u3002
\u6ce8\u610f\uff0c\u6ce8\u610f\u529b\u4ec5\u5728\u8fb9\u4e0a\u8ba1\u7b97\uff08\u8282\u70b9 \\(i\\) \u53ea\u5173\u6ce8\u5176\u90bb\u5c45 \\(\\mathcal{N}(i)\\)\uff09\uff0c\u800c\u4e0d\u662f\u5728\u6240\u6709\u8282\u70b9\u5bf9\u4e4b\u95f4\u3002\u8fd9\u4f7f\u5f97\u8ba1\u7b97\u91cf\u4e0e\u8fb9\u7684\u6570\u91cf\u6210\u6b63\u6bd4\uff0c\u800c\u4e0d\u662f\u8282\u70b9\u6570\u7684\u5e73\u65b9\u3002
\u6bcf\u4e2a\u5934\u53ef\u4ee5\u5173\u6ce8\u90bb\u57df\u7684\u4e0d\u540c\u65b9\u9762\uff1a\u4e00\u4e2a\u5934\u53ef\u80fd\u5173\u6ce8\u7ed3\u6784\u7279\u5f81\uff0c\u53e6\u4e00\u4e2a\u5173\u6ce8\u8bed\u4e49\u76f8\u4f3c\u6027\u3002\u8fd9\u4e0eTransformer\u4e2d\u591a\u5934\u6ce8\u610f\u529b\u7684\u52a8\u673a\u76f8\u540c\uff1a\u4e0d\u540c\u7684\u5934\u6355\u83b7\u4e0d\u540c\u7c7b\u578b\u7684\u5173\u7cfb\u3002
\u4f7f\u7528 \\(K\\) \u4e2a\u5934\u548c\u6bcf\u4e2a\u5934\u8f93\u51fa\u7ef4\u5ea6 \\(d'\\)\uff0c\u62fc\u63a5\u540e\u7684\u8f93\u51fa\u7ef4\u5ea6\u4e3a \\(K \\times d'\\)\u3002\u6700\u540e\u4e00\u5c42\u901a\u5e38\u4f7f\u7528\u5e73\u5747\u800c\u4e0d\u662f\u62fc\u63a5\u6765\u4ea7\u751f\u56fa\u5b9a\u5927\u5c0f\u7684\u8f93\u51fa\u3002
\u539f\u59cbGAT\u6709\u4e00\u4e2a\u5fae\u5999\u7684\u9650\u5236\uff1a\u5176\u6ce8\u610f\u529b\u51fd\u6570\u662f\u9759\u6001\u7684\uff08\u4e5f\u79f0\u4e3a\u57fa\u4e8e\u6392\u5e8f\u7684\uff09\u3002\u6ce8\u610f\u529b\u5206\u6570\u53d6\u51b3\u4e8e\u62fc\u63a5 \\([W\\mathbf{h}_i \\| W\\mathbf{h}_j]\\)\uff0c\u4f46\u7531\u4e8e\u6ce8\u610f\u529b\u5411\u91cf \\(\\mathbf{a}\\) \u5728\u62fc\u63a5\u4e4b\u540e\u5e94\u7528\uff0c\u5b83\u53ef\u4ee5\u5206\u89e3\u4e3a\u4e24\u4e2a\u72ec\u7acb\u7684\u5206\u91cf\uff1a\\(\\mathbf{a}^T [W\\mathbf{h}_i \\| W\\mathbf{h}_j] = \\mathbf{a}_1^T W\\mathbf{h}_i + \\mathbf{a}_2^T W\\mathbf{h}_j\\)\u3002
\u8fd9\u610f\u5473\u7740\u5bf9\u4e8e\u7ed9\u5b9a\u8282\u70b9 \\(i\\)\uff0c\u90bb\u5c45\u7684\u6392\u5e8f\u5b8c\u5168\u7531\u90bb\u5c45\u7684\u7279\u5f81 \\(\\mathbf{h}_j\\) \u51b3\u5b9a\uff08\u9879 \\(\\mathbf{a}_1^T W\\mathbf{h}_i\\) \u5728 \\(i\\) \u7684\u6240\u6709\u90bb\u5c45\u4e2d\u662f\u5e38\u6570\uff09\u3002\u6ce8\u610f\u529b\u6392\u540d\u5e76\u4e0d\u771f\u6b63\u4f9d\u8d56\u4e8e\u67e5\u8be2\u8282\u70b9\u7684\u7279\u5f81\u3002\u8282\u70b9 \\(i\\) \u548c\u8282\u70b9 \\(k\\) \u5c06\u4ee5\u5b8c\u5168\u76f8\u540c\u7684\u65b9\u5f0f\u5bf9\u540c\u4e00\u7ec4\u90bb\u5c45\u8fdb\u884c\u6392\u5e8f\uff0c\u8fd9\u9650\u5236\u4e86\u8868\u8fbe\u80fd\u529b\u3002
GATv2\uff08Brody\u7b49\uff0c2022\uff09\u901a\u8fc7\u5728\u6ce8\u610f\u529b\u5411\u91cf\u4e4b\u524d\u5e94\u7528\u975e\u7ebf\u6027\u51fd\u6570\u6765\u4fee\u590d\u8fd9\u4e2a\u95ee\u9898\uff1a
\u6807\u51c6\u6d88\u606f\u4f20\u9012GNN\u53d7\u5230\u56fe\u62d3\u6251\u7684\u9650\u5236\uff1a\u4e00\u4e2a\u8282\u70b9\u53ea\u80fd\u5173\u6ce8\u5176\u76f4\u63a5\u90bb\u5c45\u3002\u7ecf\u8fc7 \\(k\\) \u5c42\u540e\uff0c\u6765\u81ea \\(k\\) \u8df3\u90bb\u5c45\u7684\u4fe1\u606f\u5df2\u901a\u8fc7\u591a\u4e2a\u805a\u5408\u6b65\u9aa4\u6df7\u5408\uff0c\u5931\u53bb\u4e86\u4fdd\u771f\u5ea6\u3002\u8fd9\u79cd\u5c40\u90e8\u74f6\u9888\uff08\u518d\u52a0\u4e0a\u6587\u4ef63\u4e2d\u7684\u8fc7\u5e73\u6ed1\uff09\u9650\u5236\u4e86\u6355\u83b7\u957f\u8ddd\u79bb\u4f9d\u8d56\u5173\u7cfb\u7684\u80fd\u529b\u3002
\u56feTransformer\u901a\u8fc7\u5c06\u5168\u5c40\u81ea\u6ce8\u610f\u529b\u5e94\u7528\u4e8e\u6240\u6709\u8282\u70b9\u5bf9\uff08\u65e0\u8bba\u5b83\u4eec\u4e4b\u95f4\u662f\u5426\u6709\u8fb9\uff09\u6765\u7a81\u7834\u8fd9\u4e2a\u74f6\u9888\u3002\u6bcf\u4e2a\u8282\u70b9\u53ef\u4ee5\u5728\u5355\u5c42\u4e2d\u5173\u6ce8\u6bcf\u4e2a\u5176\u4ed6\u8282\u70b9\uff0c\u5c31\u50cf\u6807\u51c6Transformer\u4e00\u6837\uff08\u7b2c7\u7ae0\uff09\u3002
\u57fa\u672c\u601d\u60f3\uff1a\u5c06\u6240\u6709\u8282\u70b9\u89c6\u4e3a\u6807\u8bb0\uff08token\uff09\uff0c\u5e94\u7528Transformer\u81ea\u6ce8\u610f\u529b\uff1a
\u5176\u4e2d \\(Q = XW_Q\\)\uff0c\\(K = XW_K\\)\uff0c\\(V = XW_V\\) \u662f\u8282\u70b9\u7279\u5f81 \\(X\\) \u7684\u67e5\u8be2\u3001\u952e\u548c\u503c\u6295\u5f71\uff08\u4e0e\u7b2c7\u7ae0\u5b8c\u5168\u76f8\u540c\uff09\u3002\u8fd9\u662f\u5b8c\u5168\u8fde\u63a5\u56fe\uff08\u5b8c\u5168\u56fe \\(K_n\\)\uff0c\u6587\u4ef62\uff09\u4e0a\u7684GNN\u3002
\u95ee\u9898\uff1a\u5b8c\u5168\u8fde\u63a5\u56fe\u5ffd\u7565\u4e86\u5b9e\u9645\u7684\u56fe\u7ed3\u6784\u3002\u8fb9\u4fe1\u606f\uff08\u8c01\u5b9e\u9645\u8fde\u63a5\u5230\u8c01\uff09\u4e22\u5931\u4e86\u3002\u4e24\u79cd\u65b9\u6cd5\u6062\u590d\u4e86\u8fd9\u4e00\u70b9\uff1a
Graphormer\uff08Ying\u7b49\uff0c2021\uff09\u901a\u8fc7\u6ce8\u610f\u529b\u5206\u6570\u4e2d\u7684\u504f\u7f6e\u9879\u5c06\u56fe\u7ed3\u6784\u6ce8\u5165Transformer\uff1a
\u7a7a\u95f4\u504f\u7f6e \\(b_{\\text{spatial}}\\) \u7f16\u7801\u8282\u70b9 \\(i\\) \u548c \\(j\\) \u4e4b\u95f4\u7684\u6700\u77ed\u8def\u5f84\u8ddd\u79bb\u3002\u8fb9\u504f\u7f6e \\(b_{\\text{edge}}\\) \u7f16\u7801\u6cbf\u6700\u77ed\u8def\u5f84\u7684\u8fb9\u7279\u5f81\u3002\u6b64\u5916\uff0cGraphormer\u4f7f\u7528\u4e2d\u5fc3\u6027\u7f16\u7801\uff0c\u5c06\u8282\u70b9\u7684\u5ea6\u6570\u6dfb\u52a0\u5230\u5176\u8f93\u5165\u5d4c\u5165\u4e2d\uff0c\u4e3a\u6a21\u578b\u63d0\u4f9b\u5173\u4e8e\u6bcf\u4e2a\u8282\u70b9\u7ed3\u6784\u89d2\u8272\u7684\u4fe1\u606f\u3002
GPS\uff08\u901a\u7528\u3001\u5f3a\u5927\u3001\u53ef\u6269\u5c55\u7684\u56feTransformer\uff0cRamp\u00e1\u0161ek\u7b49\uff0c2022\uff09\u5728\u6bcf\u4e00\u5c42\u4e2d\u7ed3\u5408\u4e86\u5c40\u90e8\u6d88\u606f\u4f20\u9012\u548c\u5168\u5c40\u6ce8\u610f\u529b\uff1a
\u5e8f\u5217\u4e0a\u7684Transformer\u4f7f\u7528\u4f4d\u7f6e\u7f16\u7801\uff08\u7b2c7\u7ae0\uff09\u6765\u6ce8\u5165\u987a\u5e8f\u4fe1\u606f\u3002\u56fe\u6ca1\u6709\u89c4\u8303\u7684\u987a\u5e8f\uff0c\u56e0\u6b64\u9700\u8981\u7279\u5b9a\u4e8e\u56fe\u7684\u7f16\u7801\u3002
\u62c9\u666e\u62c9\u65af\u7279\u5f81\u5411\u91cf\u7f16\u7801\u4f7f\u7528\u56fe\u62c9\u666e\u62c9\u65af\u7b97\u5b50\uff08\u6587\u4ef62\uff09\u7684\u7279\u5f81\u5411\u91cf\u4f5c\u4e3a\u4f4d\u7f6e\u7279\u5f81\u3002\\(k\\) \u4e2a\u6700\u5c0f\u7684\u975e\u5e73\u51e1\u7279\u5f81\u5411\u91cf\u63d0\u4f9b\u4e86\u56fe\u7684\u8c31\u5d4c\u5165\uff1a\u5728\u56fe\u4e2d\"\u9644\u8fd1\"\u7684\u8282\u70b9\u5177\u6709\u76f8\u4f3c\u7684\u7279\u5f81\u5411\u91cf\u503c\u3002\u8fd9\u4e9b\u88ab\u62fc\u63a5\u5230\u8282\u70b9\u7279\u5f81\u4e2d\u3002
\u4e00\u4e2a\u5fae\u5999\u4e4b\u5904\uff1a\u62c9\u666e\u62c9\u65af\u7279\u5f81\u5411\u91cf\u6709\u7b26\u53f7\u6a21\u7cca\u6027\uff08\u5982\u679c \\(\\mathbf{u}\\) \u662f\u7279\u5f81\u5411\u91cf\uff0c\\(-\\mathbf{u}\\) \u4e5f\u662f\uff09\u3002\u6a21\u578b\u5fc5\u987b\u5bf9\u8fd9\u4e9b\u7b26\u53f7\u7ffb\u8f6c\u4fdd\u6301\u4e0d\u53d8\u3002\u89e3\u51b3\u65b9\u6848\u5305\u62ec\u5728\u8bad\u7ec3\u671f\u95f4\u4f7f\u7528\u968f\u673a\u7b26\u53f7\u7ffb\u8f6c\u4f5c\u4e3a\u6570\u636e\u589e\u5f3a\uff0c\u6216\u5b66\u4e60\u7b26\u53f7\u4e0d\u53d8\u7684\u53d8\u6362\u3002
\u968f\u673a\u6e38\u8d70\u7f16\u7801\u8ba1\u7b97\u4ece\u8282\u70b9 \\(i\\) \u5f00\u59cb\u7684\u968f\u673a\u6e38\u8d70\u7ecf\u8fc7 \\(k\\) \u6b65\u540e\u8fd4\u56de\u8282\u70b9 \\(i\\) \u7684\u6982\u7387\uff0c\u5bf9\u4e8e \\(k = 1, 2, \\ldots, K\\)\u3002\u8fd9\u4e9b\u6982\u7387\u7f16\u7801\u4e86\u5c40\u90e8\u7ed3\u6784\u4fe1\u606f\uff1a\u5bc6\u96c6\u7c07\u4e2d\u7684\u8282\u70b9\u5177\u6709\u9ad8\u7684\u8fd4\u56de\u6982\u7387\uff0c\u800c\u7a00\u758f\u533a\u57df\u4e2d\u7684\u8282\u70b9\u8fd4\u56de\u6982\u7387\u4f4e\u3002\u7740\u9646\u6982\u7387 \\(p_{ii}^{(k)} = (A_{\\text{rw}}^k)_{ii}\\)\uff0c\u5176\u4e2d \\(A_{\\text{rw}} = D^{-1}A\\) \u662f\u968f\u673a\u6e38\u8d70\u8f6c\u79fb\u77e9\u9635\u3002
\u5ea6\u6570\u7f16\u7801\u7b80\u5355\u5730\u5c06\u8282\u70b9\u5ea6\u6570\u4f5c\u4e3a\u4e00\u4e2a\u7279\u5f81\u6dfb\u52a0\u3002\u8fd9\u51fa\u5947\u5730\u6709\u6548\uff0c\u56e0\u4e3a\u5ea6\u6570\u662f\u4e00\u4e2a\u5f3a\u5927\u7684\u7ed3\u6784\u4fe1\u53f7\uff1a\u53f6\u8282\u70b9\uff08\u5ea6\u6570\u4e3a1\uff09\u3001\u6865\u63a5\u8282\u70b9\u548c\u67a2\u7ebd\u8282\u70b9\u7684\u884c\u4e3a\u4e0d\u540c\u3002
\u8fd9\u4e9b\u7f16\u7801\u63d0\u4f9b\u4e86\u666e\u901aTransformer\u6240\u7f3a\u4e4f\u7684\u7ed3\u6784\u4fe1\u606f\uff0c\u4f7f\u56feTransformer\u5728\u9700\u8981\u957f\u8ddd\u79bb\u63a8\u7406\u7684\u4efb\u52a1\u4e0a\u80fd\u591f\u8d85\u8d8a\u6807\u51c6\u6d88\u606f\u4f20\u9012GNN\u3002
GNN\u7684\u57fa\u672c\u53ef\u6269\u5c55\u6027\u6311\u6218\u5728\u4e8e\u56fe\u53ef\u80fd\u62e5\u6709\u6570\u767e\u4e07\u4e2a\u8282\u70b9\u548c\u6570\u5341\u4ebf\u6761\u8fb9\u3002\u5728\u5b8c\u6574\u56fe\u4e0a\u8bad\u7ec3GNN\u9700\u8981\u5c06\u6240\u6709\u8282\u70b9\u7279\u5f81\u548c\u6574\u4e2a\u90bb\u63a5\u77e9\u9635\u5b58\u50a8\u5728\u5185\u5b58\u4e2d\uff0c\u8fd9\u901a\u5e38\u662f\u4e0d\u53ef\u884c\u7684\u3002
GNN\u7684\u5c0f\u6279\u91cf\u8bad\u7ec3\u6bd4\u56fe\u50cf\u6216\u5e8f\u5217\u66f4\u590d\u6742\uff0c\u56e0\u4e3a\u8282\u70b9\u4e4b\u95f4\u662f\u76f8\u4e92\u8fde\u63a5\u7684\u3002\u6734\u7d20\u5730\u91c7\u6837\u4e00\u6279\u8282\u70b9\u9700\u8981\u5b83\u4eec\u7684\u90bb\u5c45\uff08\u7b2c1\u5c42\uff09\u3001\u90bb\u5c45\u7684\u90bb\u5c45\uff08\u7b2c2\u5c42\uff09\uff0c\u4f9d\u6b64\u7c7b\u63a8\u3002\u8fd9\u79cd\u90bb\u57df\u7206\u70b8\u610f\u5473\u7740\u4e00\u4e2a\u5305\u542b1000\u4e2a\u76ee\u6807\u8282\u70b9\u7684\u5c0f\u6279\u91cf\u53ef\u80fd\u9700\u8981\u8ba1\u7b97\u56fe\u4e2d\u6570\u767e\u4e07\u4e2a\u8282\u70b9\u3002
\u90bb\u57df\u91c7\u6837\uff08GraphSAGE\u98ce\u683c\uff0c\u6587\u4ef63\uff09\u901a\u8fc7\u6bcf\u5c42\u6bcf\u4e2a\u8282\u70b9\u91c7\u6837\u56fa\u5b9a\u6570\u91cf\u7684\u90bb\u5c45\u6765\u9650\u5236\u7206\u70b8\u3002\u4f7f\u75282\u5c42\u548c\u6bcf\u5c4215\u4e2a\u6837\u672c\uff0c\u6bcf\u4e2a\u76ee\u6807\u8282\u70b9\u7684\u5b50\u56fe\u6700\u591a\u6709 \\(15^2 = 225\\) \u4e2a\u8282\u70b9\uff0c\u4e0e\u5b8c\u6574\u56fe\u7684\u5927\u5c0f\u65e0\u5173\u3002
Cluster-GCN\uff08Chiang\u7b49\uff0c2019\uff09\u4f7f\u7528\u56fe\u805a\u7c7b\u7b97\u6cd5\uff08\u4f8b\u5982METIS\uff09\u5c06\u56fe\u5212\u5206\u4e3a\u7c07\uff0c\u7136\u540e\u4e00\u6b21\u5728\u4e00\u4e2a\u7c07\u4e0a\u8bad\u7ec3\u3002\u7c07\u5185\u8fb9\u662f\u5bc6\u96c6\u7684\uff08\u5927\u591a\u6570\u90bb\u5c45\u5728\u540c\u4e00\u4e2a\u7c07\u5185\uff09\uff0c\u56e0\u6b64\u5b50\u56fe\u6355\u83b7\u4e86\u76f8\u5173\u7ed3\u6784\u3002\u8de8\u7c07\u8fb9\u901a\u8fc7\u5076\u5c14\u5305\u542b\u7c07\u4e4b\u95f4\u7684\u8fb9\u6765\u5904\u7406\u3002
\u56feTransformer\u7684\u53ef\u6269\u5c55\u6027\u66f4\u56f0\u96be\uff0c\u56e0\u4e3a\u5168\u5c40\u6ce8\u610f\u529b\u662f \\(O(n^2)\\) \u7684\u3002\u5bf9\u4e8e\u5177\u6709\u6570\u767e\u4e07\u4e2a\u8282\u70b9\u7684\u56fe\uff0c\u5b8c\u6574\u7684\u6ce8\u610f\u529b\u662f\u4e0d\u53ef\u884c\u7684\u3002\u89e3\u51b3\u65b9\u6848\u5305\u62ec\uff1a
\u6211\u4eec\u8fc4\u4eca\u4e3a\u6b62\u7814\u7a76\u7684\u56fe\u662f\u9759\u6001\u7684\uff1a\u8282\u70b9\u3001\u8fb9\u548c\u7279\u5f81\u90fd\u662f\u56fa\u5b9a\u7684\u3002\u4f46\u8bb8\u591a\u73b0\u5b9e\u4e16\u754c\u7684\u56fe\u4f1a\u968f\u65f6\u95f4\u6f14\u5316\uff1a\u65b0\u7528\u6237\u52a0\u5165\u793e\u4ea4\u7f51\u7edc\u3001\u91d1\u878d\u4ea4\u6613\u521b\u5efa\u8fb9\u3001\u4ea4\u901a\u6a21\u5f0f\u5168\u5929\u53d8\u5316\u3001\u5206\u5b50\u76f8\u4e92\u4f5c\u7528\u53d1\u751f\u6ce2\u52a8\u3002
\u65f6\u5e8f\u56fe\u4e3a\u6bcf\u6761\u8fb9\u589e\u52a0\u4e00\u4e2a\u65f6\u95f4\u6233\uff1a\\((i, j, t)\\) \u8868\u793a\u8282\u70b9 \\(i\\) \u5728\u65f6\u95f4 \\(t\\) \u4e0e\u8282\u70b9 \\(j\\) \u53d1\u751f\u4e86\u4ea4\u4e92\u3002\u6311\u6218\u5728\u4e8e\u5b66\u4e60\u540c\u65f6\u6355\u83b7\u56fe\u7ed3\u6784\u548c\u65f6\u5e8f\u52a8\u6001\u7684\u8868\u793a\u3002
\u5b58\u5728\u4e24\u79cd\u8303\u5f0f\uff1a
\u79bb\u6563\u65f6\u95f4\u52a8\u6001\u56fe\uff08DTDG\uff09\uff1a\u56fe\u88ab\u8868\u793a\u4e3a\u4e00\u7cfb\u5217\u5feb\u7167 \\(G_1, G_2, \\ldots, G_T\\)\uff0c\u6bcf\u4e2a\u65f6\u95f4\u6b65\u4e00\u4e2a\u3002GNN\u5904\u7406\u6bcf\u4e2a\u5feb\u7167\uff0cRNN\u6216\u65f6\u5e8f\u6ce8\u610f\u529b\u673a\u5236\u6355\u83b7\u5feb\u7167\u95f4\u7684\u6f14\u5316\u3002\u8fd9\u5f88\u7b80\u5355\uff0c\u4f46\u4e22\u5931\u4e86\u7cbe\u7ec6\u7684\u65f6\u95f4\u4fe1\u606f\uff08\u5feb\u7167\u4e4b\u95f4\u7684\u4e8b\u4ef6\u4e22\u5931\u4e86\uff09\uff0c\u5e76\u4e14\u9700\u8981\u9009\u62e9\u5feb\u7167\u9891\u7387\u3002
\u8fde\u7eed\u65f6\u95f4\u52a8\u6001\u56fe\uff08CTDG\uff09\uff1a\u4e8b\u4ef6\u88ab\u5efa\u6a21\u4e3a\u5e26\u65f6\u95f4\u6233\u7684\u4ea4\u4e92\u6d41\u3002\u6bcf\u4e2a\u4e8b\u4ef6 \\((i, j, t)\\) \u5728\u5176\u53d1\u751f\u7684\u51c6\u786e\u65f6\u95f4\u66f4\u65b0\u8282\u70b9 \\(i\\) \u548c \\(j\\) \u7684\u8868\u793a\u3002\u8fd9\u4fdd\u7559\u4e86\u6240\u6709\u65f6\u5e8f\u4fe1\u606f\u3002
\u65f6\u5e8f\u56fe\u7f51\u7edc\uff08TGN\uff09\uff08Rossi\u7b49\uff0c2020\uff09\u662f\u9886\u5148\u7684CTDG\u67b6\u6784\u3002\u6bcf\u4e2a\u8282\u70b9\u7ef4\u62a4\u4e00\u4e2a\u8bb0\u5fc6\u72b6\u6001 \\(\\mathbf{s}_i(t)\\)\uff0c\u6bcf\u5f53\u8282\u70b9\u53c2\u4e0e\u4ea4\u4e92\u65f6\u66f4\u65b0\uff1a
\u5176\u4e2d \\(\\mathbf{m}_i(t)\\) \u662f\u4ece\u4ea4\u4e92\u4e2d\u8ba1\u7b97\u51fa\u7684\u6d88\u606f\uff08\u7ed3\u5408\u4e86\u4e24\u4e2a\u8282\u70b9\u7684\u7279\u5f81\u3001\u8fb9\u7279\u5f81\u548c\u65f6\u95f4\u7f16\u7801\uff09\u3002GRU\uff08\u7b2c6\u7ae0\uff09\u9009\u62e9\u6027\u5730\u4fdd\u7559\u548c\u9057\u5fd8\u8fc7\u53bb\u7684\u4fe1\u606f\uff0c\u4f7f\u8bb0\u5fc6\u80fd\u591f\u6355\u83b7\u957f\u671f\u6a21\u5f0f\uff0c\u540c\u65f6\u9002\u5e94\u8fd1\u671f\u4e8b\u4ef6\u3002
\u65f6\u95f4\u7f16\u7801\u8868\u793a\u81ea\u4e0a\u6b21\u4ea4\u4e92\u4ee5\u6765\u7ecf\u8fc7\u7684\u65f6\u95f4\uff0c\u7c7b\u4f3c\u4e8eTransformer\u4e2d\u7684\u4f4d\u7f6e\u7f16\u7801\uff08\u7b2c7\u7ae0\uff09\u3002\u5e38\u7528\u65b9\u6cd5\u4f7f\u7528\u53ef\u5b66\u4e60\u7684\u5085\u91cc\u53f6\u7279\u5f81\uff1a
\u8fd9\u4e3a\u6a21\u578b\u63d0\u4f9b\u4e86\u65f6\u95f4\u95f4\u9694\u7684\u4e30\u5bcc\u8868\u793a\uff1a\"\u8be5\u7528\u6237\u4e0a\u6b21\u6d3b\u8dc3\u662f5\u5206\u949f\u524d\"\u4e0e\"3\u4e2a\u6708\u524d\"\u4ee5\u4e0d\u540c\u7684\u65b9\u5f0f\u5d4c\u5165\u3002
\u65f6\u5e8f\u56fe\u6ce8\u610f\u529b\uff08TGAT\uff09\u5728\u8282\u70b9\u7684\u65f6\u95f4\u90bb\u57df\u4e0a\u5e94\u7528\u81ea\u6ce8\u610f\u529b\uff1a\u4e00\u7ec4\u6700\u8fd1\u7684\u4ea4\u4e92\uff0c\u6bcf\u4e2a\u4ea4\u4e92\u540c\u65f6\u6309\u7279\u5f81\u76f8\u5173\u6027\uff08\u5982GAT\uff09\u548c\u65f6\u95f4\u8fd1\u5ea6\u52a0\u6743\u3002\u6765\u81ea\u9065\u8fdc\u8fc7\u53bb\u7684\u4ea4\u4e92\u81ea\u7136\u5730\u88ab\u964d\u4f4e\u6743\u91cd\u3002
\u5e94\u7528\u5305\u62ec\u6b3a\u8bc8\u68c0\u6d4b\uff08\u91d1\u878d\u56fe\u4e2d\u7684\u5f02\u5e38\u4ea4\u6613\u6a21\u5f0f\uff09\u3001\u4ea4\u901a\u9884\u6d4b\uff08\u4ece\u5386\u53f2\u6d41\u91cf\u6a21\u5f0f\u9884\u6d4b\u62e5\u5835\uff09\u3001\u793e\u4ea4\u7f51\u7edc\u52a8\u6001\uff08\u9884\u6d4b\u75c5\u6bd2\u5185\u5bb9\u4f20\u64ad\uff09\u4ee5\u53ca\u968f\u65f6\u95f4\u63a8\u79fb\u7684\u836f\u7269\u76f8\u4e92\u4f5c\u7528\u9884\u6d4b\u3002
\u4ece\u5934\u5b9e\u73b0\u4e00\u4e2a\u5355\u5934GAT\u6ce8\u610f\u529b\u3002\u8ba1\u7b97\u8282\u70b9\u4e0e\u5176\u90bb\u5c45\u4e4b\u95f4\u7684\u6ce8\u610f\u529b\u6743\u91cd\uff0c\u5e76\u9a8c\u8bc1\u6743\u91cd\u4e4b\u548c\u4e3a1\u3002
import jax\nimport jax.numpy as jnp\n\nrng = jax.random.PRNGKey(0)\nk1, k2, k3 = jax.random.split(rng, 3)\n\nn_nodes, d_in, d_out = 5, 4, 3\n\n# \u968f\u673a\u8282\u70b9\u7279\u5f81\nH = jax.random.normal(k1, (n_nodes, d_in))\n\n# \u53ef\u5b66\u4e60\u53c2\u6570\nW = jax.random.normal(k2, (d_in, d_out)) * 0.5\na = jax.random.normal(k3, (2 * d_out,)) * 0.5\n\n# \u90bb\u63a5\uff08\u8282\u70b90\u8fde\u63a5\u52301, 2, 3\uff09\nneighbours_of_0 = [1, 2, 3]\n\n# \u53d8\u6362\u7279\u5f81\nWh = H @ W # (n_nodes, d_out)\n\n# \u8ba1\u7b97\u8282\u70b90\u7684\u6ce8\u610f\u529b\u5206\u6570\nh_i = Wh[0]\nscores = []\nfor j in neighbours_of_0:\n h_j = Wh[j]\n e_ij = jnp.dot(a, jnp.concatenate([h_i, h_j]))\n e_ij = jax.nn.leaky_relu(e_ij, negative_slope=0.2)\n scores.append(float(e_ij))\n\nscores = jnp.array(scores)\nalpha = jax.nn.softmax(scores)\n\nprint(f\"\u539f\u59cb\u5206\u6570: {scores}\")\nprint(f\"\u6ce8\u610f\u529b\u6743\u91cd: {alpha}\")\nprint(f\"\u6743\u91cd\u4e4b\u548c: {alpha.sum():.4f}\")\n\n# \u52a0\u6743\u805a\u5408\nh_new = sum(alpha[k] * Wh[neighbours_of_0[k]] for k in range(len(neighbours_of_0)))\nprint(f\"\u66f4\u65b0\u540e\u7684\u8282\u70b90\u7279\u5f81: {h_new}\")\n \u6bd4\u8f83GCN\uff08\u56fa\u5b9a\u6743\u91cd\uff09\u548cGAT\uff08\u5b66\u4e60\u6743\u91cd\uff09\u7684\u805a\u5408\u3002\u5c55\u793aGAT\u53ef\u4ee5\u4e3a\u90bb\u5c45\u5206\u914d\u4e0d\u540c\u7684\u6743\u91cd\uff0c\u800cGCN\u7edf\u4e00\u5bf9\u5f85\u5b83\u4eec\u3002
import jax\nimport jax.numpy as jnp\n\n# 4\u4e2a\u8282\u70b9\uff1a\u8282\u70b90\u8fde\u63a5\u52301, 2, 3\nA = jnp.array([[0,1,1,1],\n [1,0,0,0],\n [1,0,0,0],\n [1,0,0,0]], dtype=float)\n\n# \u7279\u5f81\uff1a\u8282\u70b91\u975e\u5e38\u76f8\u5173\uff0c\u8282\u70b92\u662f\u566a\u58f0\uff0c\u8282\u70b93\u4e2d\u7b49\nH = jnp.array([[0.0, 0.0], # \u8282\u70b90\n [1.0, 0.0], # \u8282\u70b91\uff08\u4fe1\u53f7\uff09\n [0.0, 0.0], # \u8282\u70b92\uff08\u566a\u58f0\uff09\n [0.5, 0.0]]) # \u8282\u70b93\uff08\u4e2d\u7b49\uff09\n\n# GCN\uff1a\u5f52\u4e00\u5316\u90bb\u63a5\u6743\u91cd\nA_hat = A + jnp.eye(4)\nD_inv = jnp.diag(1.0 / A_hat.sum(axis=1))\ngcn_weights = (D_inv @ A_hat)[0] # \u8282\u70b90\u7684\u6743\u91cd\nprint(f\"GCN\u4e2d\u8282\u70b90\u7684\u6743\u91cd: {gcn_weights}\")\nprint(\" \u2192 \u6240\u6709\u90bb\u5c45\u83b7\u5f97\u5927\u81f4\u76f8\u7b49\u7684\u6743\u91cd\")\n\n# GAT\uff1a\u5b66\u4e60\u5230\u7684\u6ce8\u610f\u529b\uff08\u6a21\u62df\uff09\n# \u5047\u8bbe\u6ce8\u610f\u529b\u673a\u5236\u5b66\u4f1a\u5173\u6ce8\u8282\u70b91\ngat_weights = jnp.array([0.1, 0.7, 0.05, 0.15]) # \u5b66\u4e60\u5230\u7684\nprint(f\"\\nGAT\u4e2d\u8282\u70b90\u7684\u6743\u91cd: {gat_weights}\")\nprint(\" \u2192 \u6700\u5177\u4fe1\u606f\u91cf\u7684\u8282\u70b91\u83b7\u5f97\u6700\u591a\u5173\u6ce8\")\n\ngcn_output = gcn_weights @ H\ngat_output = gat_weights @ H\nprint(f\"\\nGCN\u8f93\u51fa: {gcn_output} \uff08\u88ab\u566a\u58f0\u7a00\u91ca\uff09\")\nprint(f\"GAT\u8f93\u51fa: {gat_output} \uff08\u805a\u7126\u4e8e\u4fe1\u53f7\uff09\")\n \u6f14\u793a\u4f4d\u7f6e\u7f16\u7801\u7684\u76ca\u5904\u3002\u8ba1\u7b97\u56fe\u7684\u62c9\u666e\u62c9\u65af\u7279\u5f81\u5411\u91cf\u7f16\u7801\uff0c\u5c55\u793a\u7ed3\u6784\u76f8\u4f3c\u7684\u8282\u70b9\u83b7\u5f97\u76f8\u4f3c\u7684\u7f16\u7801\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\n# \u6760\u94c3\u56fe\uff1a\u4e24\u4e2a\u56e2\u7531\u4e00\u6761\u6865\u8fde\u63a5\nn = 10\nA = jnp.zeros((n, n))\n# \u56e21\uff1a\u8282\u70b90-4\nfor i in range(5):\n for j in range(i+1, 5):\n A = A.at[i,j].set(1).at[j,i].set(1)\n# \u56e22\uff1a\u8282\u70b95-9\nfor i in range(5, 10):\n for j in range(i+1, 10):\n A = A.at[i,j].set(1).at[j,i].set(1)\n# \u6865\nA = A.at[4,5].set(1).at[5,4].set(1)\n\nD = jnp.diag(A.sum(axis=1))\nL = D - A\neigenvalues, eigenvectors = jnp.linalg.eigh(L)\n\n# \u4f7f\u7528\u524d3\u4e2a\u975e\u5e73\u51e1\u7279\u5f81\u5411\u91cf\u4f5c\u4e3a\u4f4d\u7f6e\u7f16\u7801\npe = eigenvectors[:, 1:4]\n\nprint(\"\u62c9\u666e\u62c9\u65af\u4f4d\u7f6e\u7f16\u7801:\")\nfor i in range(n):\n group = \"\u56e21\" if i < 5 else \"\u56e22\"\n bridge = \" (\u6865)\" if i in [4, 5] else \"\"\n print(f\" \u8282\u70b9 {i} ({group}{bridge}): {pe[i]}\")\n\nplt.scatter(pe[:5, 0], pe[:5, 1], c=\"#3498db\", s=80, label=\"\u56e21\")\nplt.scatter(pe[5:, 0], pe[5:, 1], c=\"#e74c3c\", s=80, label=\"\u56e22\")\nplt.scatter(pe[[4,5], 0], pe[[4,5], 1], c=\"black\", s=120, marker=\"*\",\n label=\"\u6865\u8282\u70b9\", zorder=5)\nplt.legend(); plt.grid(True)\nplt.title(\"\u62c9\u666e\u62c9\u65af\u7279\u5f81\u5411\u91cf\u4f4d\u7f6e\u7f16\u7801\")\nplt.xlabel(\"\u7279\u5f81\u5411\u91cf 1\"); plt.ylabel(\"\u7279\u5f81\u5411\u91cf 2\")\nplt.show()\n 3D\u56fe\u7f51\u7edc\u5c06GNN\u6269\u5c55\u5230\u5177\u6709\u7a7a\u95f4\u51e0\u4f55\u7684\u6570\u636e\uff0c\u5176\u4e2d\u5fc5\u987b\u6b63\u786e\u5904\u7406\u65cb\u8f6c\u548c\u5e73\u79fb\u3002\u672c\u7ae0\u6db5\u76d6\u51e0\u4f55\u56fe\u3001SE(3)/E(n)\u7b49\u53d8\u6027\u3001SchNet\u3001DimeNet\u3001EGNN\u3001\u5f20\u91cf\u573a\u7f51\u7edc\u4ee5\u53ca\u5206\u5b50\u6027\u8d28\u9884\u6d4b\u3001\u86cb\u767d\u8d28\u7ed3\u6784\u3001\u6750\u6599\u79d1\u5b66\u548c\u836f\u7269\u53d1\u73b0\u4e2d\u7684\u5e94\u7528\u2014\u2014\u4ece3D\u7269\u7406\u4e16\u754c\u4e2d\u5b66\u4e60\u7684\u67b6\u6784\u3002
\u6587\u4ef63\u548c4\u4e2d\u7684GNN\u64cd\u4f5c\u4e8e\u62bd\u8c61\u56fe\uff1a\u8282\u70b9\u6709\u7279\u5f81\uff0c\u8fb9\u7f16\u7801\u8fde\u63a5\u6027\uff0c\u4f46\u6ca1\u67093D\u7a7a\u95f4\u7684\u6982\u5ff5\u3002\u793e\u4ea4\u7f51\u7edc\u56fe\u6ca1\u6709\u51e0\u4f55\u7ed3\u6784\u3002\u4f46\u8bb8\u591a\u6700\u5177\u5f71\u54cd\u529b\u7684GNN\u5e94\u7528\u6d89\u53ca\u5b58\u5728\u4e8e\u7269\u74063D\u7a7a\u95f4\u4e2d\u7684\u6570\u636e\uff1a\u5206\u5b50\u3001\u86cb\u767d\u8d28\u3001\u6676\u4f53\u3001\u70b9\u4e91\u3002\u5bf9\u4e8e\u8fd9\u4e9b\u6570\u636e\uff0c\u8282\u70b9\u7684\u7a7a\u95f4\u4f4d\u7f6e\u643a\u5e26\u4e86\u62bd\u8c61GNN\u6240\u5ffd\u7565\u7684\u5173\u952e\u4fe1\u606f\u3002
\u6311\u6218\u5728\u4e8e3D\u6570\u636e\u5177\u6709\u51e0\u4f55\u5bf9\u79f0\u6027\uff08\u6587\u4ef61\uff09\uff1a\u65cb\u8f6c\u5206\u5b50\u4e0d\u4f1a\u6539\u53d8\u5176\u6027\u8d28\uff0c\u5e73\u79fb\u4e5f\u662f\u5982\u6b64\u30023D GNN\u5fc5\u987b\u5c0a\u91cd\u8fd9\u4e9b\u5bf9\u79f0\u6027\u3002\u4e00\u4e2a\u4f1a\u5728\u65cb\u8f6c\u5206\u5b50\u65f6\u6539\u53d8\u7684\u80fd\u91cf\u9884\u6d4b\u5728\u7269\u7406\u4e0a\u662f\u9519\u8bef\u7684\u3002
\u51e0\u4f55\u56fe\u662f\u5d4c\u5165\u57283D\u7a7a\u95f4\u4e2d\u7684\u56fe\u3002\u6bcf\u4e2a\u8282\u70b9 \\(i\\) \u9664\u4e86\u5176\u7279\u5f81\u5411\u91cf \\(\\mathbf{h}_i\\) \u4e4b\u5916\uff0c\u8fd8\u6709\u4e00\u4e2a\u4f4d\u7f6e \\(\\mathbf{r}_i \\in \\mathbb{R}^3\\)\u3002\u8fb9\u53ef\u4ee5\u57fa\u4e8e\u7a7a\u95f4\u90bb\u8fd1\u6027\uff08\u8fde\u63a5\u8ddd\u79bb\u5728 \\(r_{\\text{cut}}\\) \u5185\u7684\u8282\u70b9\uff09\u800c\u4e0d\u662f\u57fa\u4e8e\u663e\u5f0f\u7684\u5316\u5b66\u952e\u6765\u5b9a\u4e49\u3002
\u5bf9\u4e8e\u5206\u5b50\uff0c\u51e0\u4f55\u56fe\u4ee5\u539f\u5b50\u4e3a\u8282\u70b9\uff08\u7279\u5f81\u5305\u62ec\uff1a\u5143\u7d20\u7c7b\u578b\u3001\u7535\u8377\u7b49\uff09\uff0c\u5316\u5b66\u952e\u4e3a\u8fb9\u30023D\u4f4d\u7f6e \\(\\mathbf{r}_i\\) \u662f\u539f\u5b50\u5750\u6807\uff0c\u7531\u91cf\u5b50\u529b\u5b66\u6216\u5b9e\u9a8c\u6d4b\u91cf\uff08X\u5c04\u7ebf\u6676\u4f53\u5b66\u3001\u51b7\u51bb\u7535\u955c\uff09\u786e\u5b9a\u3002
\u5bf9\u4e8e\u70b9\u4e91\uff08\u6765\u81eaLiDAR\u62163D\u626b\u63cf\u4eea\uff0c\u7b2c8\u7ae0\u548c\u7b2c11\u7ae0\uff09\uff0c\u6bcf\u4e2a\u70b9\u662f\u4e00\u4e2a\u8282\u70b9\uff0c\u5177\u6709\u4f4d\u7f6e\u548c\u53ef\u9009\u7279\u5f81\uff08\u989c\u8272\u3001\u5f3a\u5ea6\uff09\u3002\u8fb9\u8fde\u63a5\u9644\u8fd1\u7684\u70b9\uff0c\u5f62\u6210k\u6700\u8fd1\u90bb\uff08kNN\uff09\u56fe\u6216\u534a\u5f84\u56fe\u3002
\u7528\u4e8e\u6d88\u606f\u4f20\u9012\u7684\u5173\u952e\u51e0\u4f55\u91cf\uff1a
\u539f\u5b50\u95f4\u8ddd\u79bb\uff1a\\(d_{ij} = \\|\\mathbf{r}_i - \\mathbf{r}_j\\|\\)\u3002\u8ddd\u79bb\u5bf9\u65cb\u8f6c\u548c\u5e73\u79fb\u4fdd\u6301\u4e0d\u53d8\u3002\u5177\u6709\u76f8\u540c\u539f\u5b50\u95f4\u8ddd\u79bb\u7684\u4e24\u4e2a\u5206\u5b50\u5177\u6709\u76f8\u540c\u7684\u5f62\u72b6\uff0c\u65e0\u8bba\u671d\u5411\u5982\u4f55\u3002
\u952e\u89d2\uff1a\u8282\u70b9 \\(i\\) \u5904\u5411\u91cf \\(\\mathbf{r}_j - \\mathbf{r}_i\\) \u548c \\(\\mathbf{r}_k - \\mathbf{r}_i\\) \u4e4b\u95f4\u7684\u89d2\u5ea6 \\(\\theta_{ijk}\\)\u3002\u89d2\u5ea6\u6355\u83b7\u4e86\u8d85\u8d8a\u6210\u5bf9\u8ddd\u79bb\u7684\u5c40\u90e8\u51e0\u4f55\u7ed3\u6784\u3002
\u4e8c\u9762\u89d2\uff08\u626d\u8f6c\u89d2\uff09\uff1a\u7531 \\((i, j, k)\\) \u548c \\((j, k, l)\\) \u5b9a\u4e49\u7684\u5e73\u9762\u4e4b\u95f4\u7684\u89d2\u5ea6 \\(\\phi_{ijkl}\\)\u3002\u4e8c\u9762\u89d2\u6355\u83b7\u7ed3\u6784\u57283D\u4e2d\u7684\u626d\u8f6c\u65b9\u5f0f\uff0c\u5bf9\u86cb\u767d\u8d28\u4e3b\u94fe\u51e0\u4f55\u7ed3\u6784\u81f3\u5173\u91cd\u8981\u3002
\u76f8\u5bf9\u4f4d\u7f6e\u5411\u91cf\uff1a\\(\\mathbf{r}_{ij} = \\mathbf{r}_j - \\mathbf{r}_i\\)\u3002\u8fd9\u4e9b\u662f\u5e73\u79fb\u4e0d\u53d8\u7684\uff0c\u4f46\u4e0d\u662f\u65cb\u8f6c\u4e0d\u53d8\u7684\u3002\u4f7f\u7528\u5b83\u4eec\u9700\u8981\u7b49\u53d8\uff08\u800c\u4e0d\u4ec5\u4ec5\u662f\u4e0d\u53d8\uff09\u7684\u67b6\u6784\u3002
3D\u7269\u7406\u6570\u636e\u7684\u5bf9\u79f0\u7fa4\u662f\u6b27\u51e0\u91cc\u5f97\u7fa4 \\(E(3)\\)\uff0c\u7531\u6240\u6709\u65cb\u8f6c\u3001\u53cd\u5c04\u548c\u5e73\u79fb\u7ec4\u6210\u3002\u5b50\u7fa4 \\(SE(3)\\)\uff08\u7279\u6b8a\u6b27\u51e0\u91cc\u5f97\u7fa4\uff09\u5305\u62ec\u65cb\u8f6c\u548c\u5e73\u79fb\uff0c\u4f46\u4e0d\u5305\u62ec\u53cd\u5c04\u3002
3D GNN\u5e94\u8be5\u662f\uff1a
\u8fd9\u4e9b\u7ea6\u675f\u76f4\u63a5\u53cd\u6620\u4e86\u6587\u4ef61\u4e2d\u7684\u4e0d\u53d8\u6027/\u7b49\u53d8\u6027\u6846\u67b6\uff0c\u73b0\u5728\u4e13\u95e8\u5e94\u7528\u4e8e3D\u65cb\u8f6c\u548c\u5e73\u79fb\u7fa4\u3002
\u5b58\u5728\u4e24\u79cd\u8bbe\u8ba1\u65b9\u6cd5\uff1a
SchNet\uff08Sch\u00fctt\u7b49\uff0c2017\uff09\u662f\u57fa\u7840\u6027\u7684\u4e0d\u53d83D GNN\u3002\u5176\u5173\u952e\u521b\u65b0\u662f\u8fde\u7eed\u6ee4\u6ce2\u5668\u5377\u79ef\uff1a\u4e0d\u662f\u4f7f\u7528\u56fa\u5b9a\u7684\u8fb9\u7c7b\u578b\u96c6\u5408\uff08\u5982\u5206\u5b50GNN\u4e2d\u7684\u952e\u7c7b\u578b\uff09\uff0cSchNet\u76f4\u63a5\u4ece\u539f\u5b50\u95f4\u8ddd\u79bb\u751f\u6210\u6d88\u606f\u6ee4\u6ce2\u5668\u3002
\u8ddd\u79bb \\(d_{ij}\\) \u9996\u5148\u4f7f\u7528\u5f84\u5411\u57fa\u51fd\u6570\uff08RBF\uff09\u6269\u5c55\u4e3a\u7279\u5f81\u5411\u91cf\uff1a
\u6bcf\u4e2a\u57fa\u51fd\u6570\u662f\u4e00\u4e2a\u4ee5 \\(\\mu_k\\) \u4e3a\u4e2d\u5fc3\u3001\u5bbd\u5ea6\u4e3a \\(\\gamma_k\\) \u7684\u9ad8\u65af\u51fd\u6570\u3002\u8fd9\u7c7b\u4f3c\u4e8e\u8ddd\u79bb\u7684\u53ef\u5b66\u4e60\u4f4d\u7f6e\u7f16\u7801\uff1a\u8fde\u7eed\u8ddd\u79bb\u88ab\u6620\u5c04\u5230\u4e00\u4e2a\u9ad8\u7ef4\u7279\u5f81\u7a7a\u95f4\uff0c\u7f51\u7edc\u53ef\u4ee5\u5728\u5176\u4e2d\u5b66\u4e60\u8ddd\u79bb\u76f8\u5173\u7684\u4ea4\u4e92\u3002\u4e2d\u5fc3 \\(\\mu_k\\) \u901a\u5e38\u4ece0\u5230\u622a\u6b62\u534a\u5f84\u5747\u5300\u5206\u5e03\u3002
SchNet\u4ece\u8282\u70b9 \\(j\\) \u5230\u8282\u70b9 \\(i\\) \u7684\u6d88\u606f\u4e3a\uff1a
\u5176\u4e2d \\(W_{\\text{filter}}\\) \u662f\u4e00\u4e2a\u5c06RBF\u6269\u5c55\u6620\u5c04\u5230\u6ee4\u6ce2\u5668\u5411\u91cf\u7684MLP\uff0c\\(\\odot\\) \u662f\u9010\u5143\u7d20\u4e58\u6cd5\uff08Hadamard\u4e58\u79ef\uff0c\u7b2c2\u7ae0\uff09\u3002\u6ee4\u6ce2\u5668\u4f9d\u8d56\u4e8e\u8ddd\u79bb\uff0c\u56e0\u6b64\u9644\u8fd1\u7684\u539f\u5b50\u4e0e\u8fdc\u5904\u7684\u539f\u5b50\u4ea7\u751f\u4e0d\u540c\u7684\u4ea4\u4e92\u3002\u9010\u5143\u7d20\u4e58\u6cd5\u7c7b\u4f3c\u4e8e\u95e8\u63a7\u673a\u5236\uff08\u7b2c6\u7ae0\uff09\uff1a\u4f9d\u8d56\u4e8e\u8ddd\u79bb\u7684\u6ee4\u6ce2\u5668\u63a7\u5236\u6bcf\u4e2a\u7279\u5f81\u7ef4\u5ea6\u6709\u591a\u5c11\u901a\u8fc7\u3002
\u7531\u4e8eSchNet\u53ea\u4f7f\u7528\u8ddd\u79bb\uff08\u4e0d\u53d8\u7684\uff09\uff0c\u6574\u4e2a\u6a21\u578b\u81ea\u52a8\u5bf9\u65cb\u8f6c\u548c\u5e73\u79fb\u4fdd\u6301\u4e0d\u53d8\u3002\u9664\u4e86\u8fd9\u4e2a\u8bbe\u8ba1\u9009\u62e9\u4e4b\u5916\uff0c\u4e0d\u9700\u8981\u5bf9\u5bf9\u79f0\u6027\u8fdb\u884c\u7279\u6b8a\u5904\u7406\u3002
\u4ec5\u51ed\u8ddd\u79bb\u4e0d\u80fd\u5b8c\u5168\u786e\u5b9a3D\u7ed3\u6784\u3002\u4e24\u4e2a\u4e0d\u540c\u7684\u5206\u5b50\u6784\u8c61\u53ef\u4ee5\u5177\u6709\u76f8\u540c\u7684\u6210\u5bf9\u8ddd\u79bb\u4f46\u4e0d\u540c\u7684\u952e\u89d2\uff08\u8fd9\u5c31\u662f\"\u8ddd\u79bb\u51e0\u4f55\u6b67\u4e49\"\u95ee\u9898\uff09\u3002DimeNet\uff08Gasteiger\u7b49\uff0c2020\uff09\u5c06\u952e\u89d2\u7eb3\u5165\u6d88\u606f\u4f20\u9012\u3002
DimeNet\u4f7f\u7528\u5b9a\u5411\u6d88\u606f\u4f20\u9012\uff1a\u6d88\u606f\u6cbf\u6709\u5411\u8fb9\u6d41\u52a8\uff0c\u8fb9 \\((j \\to i)\\) \u4e0a\u7684\u6d88\u606f\u53d7\u8fb9 \\((k \\to j)\\) \u548c \\((j \\to i)\\) \u4e4b\u95f4\u7684\u89d2\u5ea6\u5f71\u54cd\uff1a
\u89d2\u5ea6 \\(\\theta_{kji}\\) \u4f7f\u7528\u7403\u8d1d\u585e\u5c14\u51fd\u6570\u548c\u7403\u8c10\u51fd\u6570\uff08\u7403\u9762\u4e0a\u89d2\u5ea6\u4fe1\u606f\u7684\u81ea\u7136\u57fa\uff0c\u7c7b\u4f3c\u4e8e\u8ddd\u79bb\u7684RBF\uff09\u8fdb\u884c\u6269\u5c55\u3002\u8fd9\u4f7f\u6a21\u578b\u5728\u4fdd\u6301\u4e0d\u53d8\u6027\u7684\u540c\u65f6\u80fd\u591f\u8bbf\u95ee\u65b9\u5411\u4fe1\u606f\u3002
SphereNet\uff08Liu\u7b49\uff0c2022\uff09\u66f4\u8fdb\u4e00\u6b65\uff0c\u5305\u542b\u4e8c\u9762\u89d2 \\(\\phi_{lkji}\\)\uff0c\u6355\u83b7\u5b8c\u6574\u76843D\u626d\u8f6c\u7ed3\u6784\u3002\u5c42\u6b21\u7ed3\u6784\u4e3a\uff1a
\u6bcf\u4e2a\u5c42\u6b21\u589e\u52a0\u4e86\u51e0\u4f55\u5206\u8fa8\u7387\uff0c\u4f46\u8ba1\u7b97\u590d\u6742\u5ea6\u4e5f\u968f\u4e4b\u589e\u52a0\uff08\u8ddd\u79bb\u4e3a \\(O(|E|)\\)\uff0c\u89d2\u5ea6\u4e3a \\(O(|E| \\cdot k)\\)\uff0c\u4e8c\u9762\u89d2\u4e3a \\(O(|E| \\cdot k^2)\\)\uff0c\u5176\u4e2d \\(k\\) \u662f\u5e73\u5747\u5ea6\u6570\uff09\u3002
EGNN\uff08Satorras\u7b49\uff0c2021\uff09\u91c7\u7528\u7b49\u53d8\u65b9\u6cd5\uff1a\u5b83\u4e0d\u53ea\u4f7f\u7528\u4e0d\u53d8\u7279\u5f81\uff0c\u800c\u662f\u5728\u6bcf\u4e00\u5c42\u540c\u65f6\u66f4\u65b0\u8282\u70b9\u7279\u5f81\u548c\u8282\u70b9\u4f4d\u7f6e\uff0c\u5728\u6574\u4e2a\u8fc7\u7a0b\u4e2d\u4fdd\u6301\u7b49\u53d8\u6027\u3002
\u8282\u70b9 \\(i\\) \u7684EGNN\u66f4\u65b0\uff1a
\u5173\u952e\u5728\u4e8e\u4f4d\u7f6e\u66f4\u65b0\uff1a\u8282\u70b9\u4f4d\u7f6e\u901a\u8fc7\u76f8\u5bf9\u4f4d\u7f6e\u5411\u91cf \\((\\mathbf{r}_i - \\mathbf{r}_j)\\) \u7684\u52a0\u6743\u548c\u8fdb\u884c\u8c03\u6574\u3002\u6743\u91cd\u6765\u81ea\u6d88\u606f\u51fd\u6570 \\(\\phi_r\\)\uff0c\u8be5\u51fd\u6570\u4ec5\u4f9d\u8d56\u4e8e\u4e0d\u53d8\u7684\u91cf\uff08\u7279\u5f81\u548c\u8ddd\u79bb\uff09\u3002\u8fd9\u79cd\u6784\u9020\u662f\u53ef\u8bc1\u660e\u7b49\u53d8\u7684\uff1a\u5982\u679c\u6240\u6709\u8f93\u5165\u4f4d\u7f6e\u88ab\u65cb\u8f6c \\(R\\)\uff0c\u5219\u6240\u6709\u8f93\u51fa\u4f4d\u7f6e\u88ab\u76f8\u540c\u7684 \\(R\\) \u65cb\u8f6c\u3002
EGNN\u7684\u4f18\u96c5\u4e4b\u5904\u5728\u4e8e\u5b83\u4e0d\u663e\u5f0f\u4f7f\u7528\u7403\u8c10\u51fd\u6570\u6216\u4e0d\u53ef\u7ea6\u8868\u793a\u5c31\u5b9e\u73b0\u4e86\u7b49\u53d8\u6027\u3002\u76f8\u5bf9\u4f4d\u7f6e\u5411\u91cf\u643a\u5e26\u65b9\u5411\u4fe1\u606f\uff0c\u4e0d\u53d8\u7684\u6d88\u606f\u51fd\u6570\u63a7\u5236\u5982\u4f55\u4f7f\u7528\u8be5\u65b9\u5411\u4fe1\u606f\u3002
\u8fd9\u79cd\u7b80\u6d01\u6027\u662f\u6709\u4ee3\u4ef7\u7684\uff1aEGNN\u53ea\u4f7f\u7528\u5411\u91cf\u8868\u793a\uff081\u9636\uff09\u3002\u5b83\u65e0\u6cd5\u5728\u672a\u7ecf\u6269\u5c55\u7684\u60c5\u51b5\u4e0b\u8868\u793a\u66f4\u9ad8\u9636\u7684\u5f20\u91cf\uff0c\u5982\u56db\u6781\u77e9\u6216\u5e94\u529b\u5f20\u91cf\u3002
\u5f20\u91cf\u573a\u7f51\u7edc\uff08Thomas\u7b49\uff0c2018\uff09\u53ca\u5176\u540e\u7ee7\u8005\uff08SE(3)-Transformers\u3001MACE\u3001Equiformer\uff09\u4f7f\u7528\u65cb\u8f6c\u7fa4\u7684\u4e0d\u53ef\u7ea6\u8868\u793a\u7684\u5b8c\u6574\u673a\u5236\u6765\u6784\u5efa\u7b49\u53d8\u5c42\u3002
\u5728\u8868\u793a\u8bba\u4e2d\uff08\u8054\u7cfb\u5230\u7b2c2\u7ae0\u7684\u7ebf\u6027\u4ee3\u6570\uff09\uff0c3D\u4e2d\u7684\u65cb\u8f6c\u53ef\u4ee5\u5206\u89e3\u4e3a\u4ee5\u6574\u6570\u9636 \\(\\ell\\) \u4e3a\u7279\u5f81\u7684\u4e0d\u53ef\u7ea6\u5206\u91cf\uff1a
\u8fd9\u4e9b\u88ab\u79f0\u4e3a\u7403\u9762\u5f20\u91cf\uff0c\u5b83\u4eec\u901a\u8fc7Wigner-D\u77e9\u9635 \\(D^\\ell(R)\\) \u5728\u65cb\u8f6c \\(R\\) \u4e0b\u53d8\u6362\uff1a\u6807\u91cf\u4e0d\u53d8\uff0c\u5411\u91cf\u7531 \\(R\\) \u65cb\u8f6c\uff0c\u79e92\u5f20\u91cf\u7531\u66f4\u590d\u6742\u7684\u77e9\u9635\u65cb\u8f6c\u3002
\u4f7f\u7528\u7403\u9762\u5f20\u91cf\u7684\u7b49\u53d8\u6d88\u606f\u4f20\u9012\u4f7f\u7528Clebsch-Gordan\u5f20\u91cf\u79ef\u6765\u7ec4\u5408\u4e0d\u540c\u9636\u7684\u7279\u5f81\uff1a
Clebsch-Gordan\u7cfb\u6570 \\(C\\) \u662f\u56fa\u5b9a\u7684\u6570\u5b66\u5e38\u6570\uff0c\u786e\u4fdd\u5f20\u91cf\u79ef\u662f\u7b49\u53d8\u7684\u3002\u8fd9\u662fSO(3)\u7b49\u53d8\u7248\u672c\u7684\u77e9\u9635\u4e58\u6cd5\u3002
MACE\uff08Batatia\u7b49\uff0c2022\uff09\u4f7f\u7528\u9ad8\u9636\u6d88\u606f\uff08\u591a\u4e2a\u90bb\u5c45\u7279\u5f81\u7684\u4e58\u79ef\uff09\u4ee5\u66f4\u5c11\u7684\u6d88\u606f\u4f20\u9012\u5c42\u8fbe\u5230\u9ad8\u7cbe\u5ea6\u3002\u901a\u8fc7\u6784\u5efa\u4f53\u5e8f\u76f8\u4e92\u4f5c\u7528\uff08\u8ddd\u79bb\u76842\u4f53\u3001\u89d2\u5ea6\u76843\u4f53\u3001\u5f20\u91cf\u79ef\u7684\u591a\u4f53\uff09\uff0cMACE\u9ad8\u6548\u5730\u6355\u83b7\u4e86\u590d\u6742\u7684\u539f\u5b50\u95f4\u76f8\u4e92\u4f5c\u7528\u3002
Equiformer\uff08Liao & Smidt\uff0c2023\uff09\u5c06\u7b49\u53d8\u7403\u9762\u5f20\u91cf\u7279\u5f81\u4e0eTransformer\u6ce8\u610f\u529b\u673a\u5236\uff08\u6587\u4ef64\uff09\u76f8\u7ed3\u5408\uff0c\u521b\u5efa\u4e86SE(3)\u7b49\u53d8\u7684\u56feTransformer\u3002\u6ce8\u610f\u529b\u5206\u6570\u4ece\u4e0d\u53d8\u91cf\u7279\u5f81\u8ba1\u7b97\uff0c\u800c\u503c\u805a\u5408\u5728\u7b49\u53d8\u5f20\u91cf\u7279\u5f81\u4e0a\u8fdb\u884c\u3002
\u5206\u5b50\u6027\u8d28\u9884\u6d4b\uff1a\u7ed9\u5b9a\u5206\u5b50\u76843D\u7ed3\u6784\uff0c\u9884\u6d4b\u6027\u8d28\u5982\u80fd\u91cf\u3001\u529b\u3001\u5076\u6781\u77e9\u3001HOMO-LUMO\u80fd\u9699\u3001\u6bd2\u6027\u3001\u6eb6\u89e3\u5ea6\u3002\u8fd9\u662f3D GNN\u6700\u6210\u719f\u7684\u5e94\u7528\u3002\u5728\u91cf\u5b50\u5316\u5b66\u6570\u636e\u96c6\uff08QM9\u3001OC20\uff09\u4e0a\u8bad\u7ec3\u7684\u6a21\u578b\u5728\u8bb8\u591a\u6027\u8d28\u4e0a\u8fbe\u5230\u4e86\u5316\u5b66\u7cbe\u5ea6\uff0c\u5b9e\u73b0\u4e86\u5bf9\u6570\u767e\u4e07\u5019\u9009\u5206\u5b50\u7684\u865a\u62df\u7b5b\u9009\u3002
\u5206\u5b50\u52a8\u529b\u5b66\u52a0\u901f\uff1a\u4f7f\u7528\u91cf\u5b50\u529b\u5b66\uff08\u5bc6\u5ea6\u6cdb\u51fd\u7406\u8bba\uff0cDFT\uff09\u8ba1\u7b97\u539f\u5b50\u95f4\u7684\u529b\u6781\u5176\u6602\u8d35\uff08\u5bf9 \\(n\\) \u4e2a\u7535\u5b50\u4e3a \\(O(n^3)\\)\uff09\u3002\u8bad\u7ec3\u7528\u4e8e\u9884\u6d4b\u529b\u76843D GNN\u53ef\u4ee5\u5728\u5206\u5b50\u52a8\u529b\u5b66\u6a21\u62df\u671f\u95f4\u66ff\u4ee3DFT\uff0c\u5b9e\u73b0 \\(10^3\\)\u2013\\(10^6\\) \u7684\u52a0\u901f\uff0c\u540c\u65f6\u4fdd\u6301\u63a5\u8fd1DFT\u7684\u7cbe\u5ea6\u3002\u8fd9\u4f7f\u5f97\u80fd\u591f\u6a21\u62df\u66f4\u5927\u7684\u7cfb\u7edf\u548c\u66f4\u957f\u7684\u65f6\u95f4\u5c3a\u5ea6\uff0c\u63ed\u793a\u4f20\u7edf\u65b9\u6cd5\u65e0\u6cd5\u89c2\u6d4b\u7684\u73b0\u8c61\u3002
\u86cb\u767d\u8d28\u7ed3\u6784\uff1a\u86cb\u767d\u8d28\u662f\u6298\u53e0\u6210\u590d\u67423D\u7ed3\u6784\u7684\u6c28\u57fa\u9178\u94fe\u3002\u86cb\u767d\u8d28\u4e3b\u94fe\u662f\u4e00\u4e2a\u51e0\u4f55\u56fe\uff0c\u5176\u4e2d\u8282\u70b9\u662f\u6b8b\u57fa\uff0c\u8fb9\u8fde\u63a5\u7a7a\u95f4\u4e0a\u90bb\u8fd1\u7684\u6b8b\u57fa\u30023D GNN\u7528\u4e8e\u86cb\u767d\u8d28\u529f\u80fd\u9884\u6d4b\u3001\u7ed3\u5408\u4f4d\u70b9\u8bc6\u522b\u548c\u86cb\u767d\u8d28\u8bbe\u8ba1\uff08\u9006\u6298\u53e0\uff1a\u7ed9\u5b9a\u671f\u671b\u7ed3\u6784\uff0c\u9884\u6d4b\u6c28\u57fa\u9178\u5e8f\u5217\uff09\u3002AlphaFold\u4f7f\u7528\u51e0\u4f55\u548c\u57fa\u4e8e\u56fe\u7684\u63a8\u7406\u4ece\u5e8f\u5217\u9884\u6d4b\u86cb\u767d\u8d28\u7ed3\u6784\u3002
\u6750\u6599\u79d1\u5b66\u4e0e\u50ac\u5316\uff1a\u6676\u4f53\u6750\u6599\u5177\u6709\u5468\u671f\u6027\u76843D\u7ed3\u6784\u3002GNN\u5bf9\u91cd\u590d\u6676\u80de\u8fdb\u884c\u5efa\u6a21\u5e76\u9884\u6d4b\u6750\u6599\u6027\u8d28\uff1a\u5e26\u9699\u3001\u5f62\u6210\u80fd\u3001\u673a\u68b0\u5f3a\u5ea6\u3002\u5f00\u653e\u50ac\u5316\u5242\u9879\u76ee\uff08OC20/OC22\uff09\u5bf9GNN\u8fdb\u884c\u57fa\u51c6\u6d4b\u8bd5\uff0c\u9884\u6d4b\u50ac\u5316\u8868\u9762\u4e0a\u7684\u5438\u9644\u80fd\uff0c\u52a0\u901f\u5bfb\u627e\u7528\u4e8e\u53ef\u518d\u751f\u80fd\u6e90\u7684\u65b0\u578b\u50ac\u5316\u5242\u3002
\u836f\u7269\u53d1\u73b0\uff1a3D GNN\u9884\u6d4b\u836f\u7269\u5206\u5b50\u5982\u4f55\u4e0e\u9776\u86cb\u767d\u7ed3\u5408\u3002\u7ed3\u5408\u4eb2\u548c\u529b\u53d6\u51b3\u4e8e\u836f\u7269\u4e0e\u86cb\u767d\u8d28\u7ed3\u5408\u53e3\u888b\u4e4b\u95f4\u76843D\u5f62\u72b6\u4e92\u8865\u6027\u548c\u5316\u5b66\u76f8\u4e92\u4f5c\u7528\u3002DiffDock\u7b49\u6a21\u578b\u4f7f\u7528\u7b49\u53d8GNN\u4e0e\u6269\u6563\u6a21\u578b\uff08\u7b2c8\u7ae0\uff09\u6765\u9884\u6d4b\u7ed3\u5408\u59ff\u6001\uff08\u836f\u7269\u5728\u86cb\u767d\u8d28\u53e3\u888b\u4e2d\u76843D\u671d\u5411\uff09\u3002
\u4e0a\u8ff0\u6240\u6709\u67b6\u6784\u5206\u6790\u73b0\u6709\u56fe\u3002\u56fe\u751f\u6210\u521b\u5efa\u65b0\u7684\u56fe\uff1a\u8bbe\u8ba1\u5177\u6709\u671f\u671b\u6027\u8d28\u7684\u5206\u5b50\u3001\u751f\u6210\u7528\u4e8e\u6d4b\u8bd5\u7684\u5408\u6210\u793e\u4ea4\u7f51\u7edc\u6216\u63d0\u51fa\u65b0\u7684\u86cb\u767d\u8d28\u7ed3\u6784\u3002\u8fd9\u662f\u56fe\u7ea7\u522b\u9884\u6d4b\u7684\u751f\u6210\u5bf9\u5e94\u4efb\u52a1\u3002
\u6311\u6218\u5728\u4e8e\u56fe\u662f\u79bb\u6563\u7684\u3001\u5927\u5c0f\u53ef\u53d8\u4e14\u7ec4\u5408\u7684\u3002\u751f\u6210\u56fe\u610f\u5473\u7740\u51b3\u5b9a\u8981\u521b\u5efa\u591a\u5c11\u4e2a\u8282\u70b9\u3001\u5b83\u4eec\u5177\u6709\u4ec0\u4e48\u7279\u5f81\u4ee5\u53ca\u54ea\u4e9b\u5bf9\u8981\u8fde\u63a5\u3002\u53ef\u80fd\u7684\u56fe\u7a7a\u95f4\u968f\u8282\u70b9\u6570\u91cf\u8d85\u6307\u6570\u589e\u957f\u3002
\u81ea\u56de\u5f52\u751f\u6210\u4e00\u6b21\u6784\u5efa\u4e00\u4e2a\u8282\u70b9\uff08\u6216\u4e00\u6761\u8fb9\uff09\u3002GraphRNN\uff08You\u7b49\uff0c2018\uff09\u987a\u5e8f\u5730\u751f\u6210\u56fe\uff1aRNN\u7ef4\u62a4\u4e00\u4e2a\u72b6\u6001\uff0c\u6bcf\u4e00\u6b65\u751f\u6210\u4e00\u4e2a\u65b0\u8282\u70b9\uff0c\u5e76\u51b3\u5b9a\u5c06\u5176\u8fde\u63a5\u5230\u54ea\u4e9b\u73b0\u6709\u8282\u70b9\u3002\u751f\u6210\u987a\u5e8f\u4e3a\u672c\u6765\u65e0\u5e8f\u7684\u56fe\u65bd\u52a0\u4e86\u4eba\u5de5\u5e8f\u5217\uff0c\u4f46BFS\u6392\u5e8f\u901a\u8fc7\u4fdd\u6301\u6700\u8fd1\u751f\u6210\u7684\u8282\u70b9\u76f8\u5173\u6027\u6765\u5e2e\u52a9\u89e3\u51b3\u95ee\u9898\u3002
\u57fa\u4e8eVAE\u7684\u751f\u6210\u5c06\u56fe\u7f16\u7801\u5230\u8fde\u7eed\u6f5c\u5728\u7a7a\u95f4\uff08\u4f7f\u7528GNN\u7f16\u7801\u5668\uff09\uff0c\u7136\u540e\u4ece\u91c7\u6837\u7684\u6f5c\u5728\u5411\u91cf\u89e3\u7801\u65b0\u56fe\u3002GraphVAE\u4e00\u6b21\u6027\u751f\u6210\u4e00\u4e2a\u6982\u7387\u90bb\u63a5\u77e9\u9635 \\(\\hat{A} \\in [0, 1]^{n \\times n}\\)\uff0c\u4f46\u8fd9\u9700\u8981 \\(O(n^2)\\) \u89c4\u6a21\u5e76\u4ea7\u751f\u9700\u8981\u9608\u503c\u5316\u7684\u5bc6\u96c6\u8f93\u51fa\u3002\u6f5c\u5728\u7a7a\u95f4\u5141\u8bb8\u5e73\u6ed1\u63d2\u503c\uff1a\u5728\u4e24\u4e2a\u5206\u5b50\u5d4c\u5165\u4e4b\u95f4\u79fb\u52a8\u4f1a\u4ea7\u751f\u5316\u5b66\u4e0a\u6709\u6548\u7684\u4e2d\u95f4\u7ed3\u6784\u3002
\u57fa\u4e8e\u6269\u6563\u7684\u751f\u6210\u5c06\u6269\u6563\u6846\u67b6\uff08\u7b2c8\u7ae0\uff09\u5e94\u7528\u4e8e\u56fe\u3002\u524d\u5411\u8fc7\u7a0b\u9010\u6e10\u5411\u8282\u70b9\u7279\u5f81\u548c\u8fb9\u7ed3\u6784\u6dfb\u52a0\u566a\u58f0\u3002\u53cd\u5411\u8fc7\u7a0b\u5b66\u4e60\u53bb\u566a\uff0c\u4ece\u566a\u58f0\u4e2d\u751f\u6210\u6709\u6548\u7684\u56fe\u3002DiGress\uff08Vignac\u7b49\uff0c2023\uff09\u5bf9\u8282\u70b9\u7c7b\u578b\u548c\u8fb9\u7c7b\u578b\u5e94\u7528\u79bb\u6563\u6269\u6563\uff0c\u81ea\u7136\u5730\u5904\u7406\u56fe\u6570\u636e\u7684\u5206\u7c7b\u6027\u8d28\u3002
\u5bf9\u4e8e\u5206\u5b50\u751f\u6210\uff0c\u5173\u952e\u7ea6\u675f\u662f\u5316\u5b66\u6709\u6548\u6027\uff1a\u751f\u6210\u7684\u5206\u5b50\u5fc5\u987b\u9075\u5b88\u5316\u5408\u4ef7\u89c4\u5219\uff08\u78b3\u5f62\u62104\u4e2a\u952e\uff0c\u6c27\u5f62\u62102\u4e2a\uff0c\u7b49\u7b49\uff09\u3002Junction Tree VAE\uff08JT-VAE\uff09\u7b49\u65b9\u5c06\u5206\u5b50\u5206\u89e3\u4e3a\u6709\u6548\u5b50\u7ed3\u6784\uff08\u73af\u3001\u94fe\u3001\u5b98\u80fd\u56e2\uff09\uff0c\u5e76\u901a\u8fc7\u7ec4\u88c5\u8fd9\u4e9b\u6784\u5efa\u5757\u6765\u751f\u6210\uff0c\u901a\u8fc7\u6784\u9020\u4fdd\u8bc1\u6709\u6548\u6027\u3002
\u76ee\u6807\u5bfc\u5411\u751f\u6210\u4f18\u5316\u7279\u5b9a\u6027\u8d28\uff1a\u751f\u6210\u5bf9\u9776\u86cb\u767d\u5177\u6709\u9ad8\u7ed3\u5408\u4eb2\u548c\u529b\u3001\u4f4e\u6bd2\u6027\u548c\u826f\u597d\u6eb6\u89e3\u5ea6\u7684\u5206\u5b50\u3002\u8fd9\u5728\u4e00\u4e2a\u5faa\u73af\u4e2d\u7ed3\u5408\u4e86\u56fe\u751f\u6210\u4e0e\u6027\u8d28\u9884\u6d4b\uff08\u4f7f\u75283D GNN\u4f5c\u4e3a\u6027\u8d28\u8bc4\u4f30\u5668\uff09\uff1a\u751f\u6210 \u2192 \u8bc4\u4f30 \u2192 \u7cbe\u70bc\u3002\u5f3a\u5316\u5b66\u4e60\uff08\u7b2c6\u7ae0\uff09\u6216\u8d1d\u53f6\u65af\u4f18\u5316\u6307\u5bfc\u7740\u5316\u5b66\u7a7a\u95f4\u7684\u641c\u7d22\u3002
DiffDock\uff08Corso\u7b49\uff0c2023\uff09\u4f7f\u7528SE(3)\u7b49\u53d8\u6269\u6563\u6765\u9884\u6d4b\u836f\u7269\u5206\u5b50\u5982\u4f55\u5bf9\u63a5\u5165\u86cb\u767d\u8d28\u7ed3\u5408\u53e3\u888b\u3002\u8be5\u6a21\u578b\u901a\u8fc7\u4ece\u968f\u673a\u4f4d\u7f6e\u53bb\u566a\u6765\u751f\u62103D\u7ed3\u5408\u59ff\u6001\uff08\u836f\u7269\u76f8\u5bf9\u4e8e\u86cb\u767d\u8d28\u7684\u4f4d\u7f6e\u548c\u671d\u5411\uff09\uff0c\u5c06\u672c\u6587\u4ef6\u4e2d\u76843D\u7b49\u53d8\u7f51\u7edc\u4e0e\u7b2c8\u7ae0\u7684\u6269\u6563\u6846\u67b6\u76f8\u7ed3\u5408\u3002
\u6784\u5efa\u4e00\u4e2a\u4f7f\u7528\u539f\u5b50\u95f4\u8ddd\u79bb\u7684\u7b80\u5355\u4e0d\u53d83D\u6d88\u606f\u4f20\u9012\u5c42\u3002\u5c06\u5176\u5e94\u7528\u4e8e\u4e00\u4e2a\u5c0f\u5206\u5b50\uff08\u6c34\uff1aH-O-H\uff09\uff0c\u5e76\u9a8c\u8bc1\u8f93\u51fa\u5bf9\u65cb\u8f6c\u662f\u4e0d\u53d8\u7684\u3002
import jax\nimport jax.numpy as jnp\n\n# \u6c34\u5206\u5b50\uff1aO\u5728\u539f\u70b9\uff0c\u4e24\u4e2aH\u539f\u5b50\npositions = jnp.array([[0.0, 0.0, 0.0], # O\n [0.96, 0.0, 0.0], # H1\n [-0.24, 0.93, 0.0]]) # H2\n\n# \u8282\u70b9\u7279\u5f81\uff1a[\u539f\u5b50\u5e8f\u6570]\nfeatures = jnp.array([[8.0], [1.0], [1.0]])\n\n# \u8ba1\u7b97\u6210\u5bf9\u8ddd\u79bb\uff08\u4e0d\u53d8\u7684\uff09\ndef pairwise_distances(pos):\n diff = pos[:, None, :] - pos[None, :, :]\n return jnp.sqrt(jnp.sum(diff**2, axis=-1) + 1e-8)\n\n# \u7b80\u5355\u7684\u57fa\u4e8e\u8ddd\u79bb\u7684\u6d88\u606f\u4f20\u9012\ndef invariant_message_pass(features, positions):\n dists = pairwise_distances(positions)\n # \u5177\u67094\u4e2a\u4e2d\u5fc3\u7684RBF\u6269\u5c55\n centres = jnp.array([0.5, 1.0, 1.5, 2.0])\n rbf = jnp.exp(-5.0 * (dists[:, :, None] - centres[None, None, :]) ** 2)\n\n # \u6d88\u606f\uff1a\u7531\u8ddd\u79bb\u76f8\u5173\u6ee4\u6ce2\u5668\u52a0\u6743\u7684\u7279\u5f81\n messages = jnp.einsum(\"ij,jd->id\", rbf.sum(axis=-1), features)\n return messages\n\noutput1 = invariant_message_pass(features, positions)\n\n# \u5c06\u5206\u5b50\u7ed5z\u8f74\u65cb\u8f6c90\u5ea6\nR = jnp.array([[0, -1, 0], [1, 0, 0], [0, 0, 1]], dtype=float)\nrotated_positions = (R @ positions.T).T\n\noutput2 = invariant_message_pass(features, rotated_positions)\n\nprint(f\"\u539f\u59cb\u8f93\u51fa:\\n{output1}\")\nprint(f\"\\n\u65cb\u8f6c\u540e\u8f93\u51fa:\\n{output2}\")\nprint(f\"\\n\u4e0d\u53d8\u6027: {jnp.allclose(output1, output2, atol=1e-5)}\")\n \u8ba1\u7b97\u4e09\u4e2a\u539f\u5b50\u4e4b\u95f4\u7684\u952e\u89d2\uff0c\u5e76\u9a8c\u8bc1\u5176\u5bf9\u65cb\u8f6c\u4e0d\u53d8\u3002
import jax.numpy as jnp\n\ndef bond_angle(r_i, r_j, r_k):\n \"\"\"\u8282\u70b9j\u5904\u8fb9j->i\u548cj->k\u4e4b\u95f4\u7684\u89d2\u5ea6\u3002\"\"\"\n v1 = r_i - r_j\n v2 = r_k - r_j\n cos_angle = jnp.dot(v1, v2) / (jnp.linalg.norm(v1) * jnp.linalg.norm(v2))\n return jnp.arccos(jnp.clip(cos_angle, -1, 1))\n\n# \u4e09\u4e2a\u539f\u5b50\nr1 = jnp.array([1.0, 0.0, 0.0])\nr2 = jnp.array([0.0, 0.0, 0.0])\nr3 = jnp.array([0.0, 1.0, 0.0])\n\nangle_original = bond_angle(r1, r2, r3)\nprint(f\"\u539f\u59cb\u89d2\u5ea6: {jnp.degrees(angle_original):.1f}\u00b0\")\n\n# \u5e94\u7528\u968f\u673a\u65cb\u8f6c\nR = jnp.array([[0.36, 0.48, -0.80],\n [-0.80, 0.60, 0.00],\n [0.48, 0.64, 0.60]])\nr1_rot, r2_rot, r3_rot = R @ r1, R @ r2, R @ r3\n\nangle_rotated = bond_angle(r1_rot, r2_rot, r3_rot)\nprint(f\"\u65cb\u8f6c\u540e\u89d2\u5ea6: {jnp.degrees(angle_rotated):.1f}\u00b0\")\nprint(f\"\u4e0d\u53d8\u6027: {jnp.allclose(angle_original, angle_rotated, atol=1e-4)}\")\n \u6f14\u793a\u7b49\u53d8\u4f4d\u7f6e\u66f4\u65b0\uff08EGNN\u98ce\u683c\uff09\u3002\u4f7f\u7528\u8ddd\u79bb\u52a0\u6743\u7684\u76f8\u5bf9\u5411\u91cf\u66f4\u65b0\u8282\u70b9\u4f4d\u7f6e\uff0c\u5e76\u9a8c\u8bc1\u7b49\u53d8\u6027\u3002
import jax\nimport jax.numpy as jnp\n\ndef egnn_position_update(positions, features):\n \"\"\"\u7b80\u5355\u7684EGNN\u98ce\u683c\u7b49\u53d8\u4f4d\u7f6e\u66f4\u65b0\u3002\"\"\"\n n = positions.shape[0]\n new_positions = jnp.zeros_like(positions)\n\n for i in range(n):\n shift = jnp.zeros(3)\n for j in range(n):\n if i != j:\n r_ij = positions[i] - positions[j]\n d_ij = jnp.linalg.norm(r_ij)\n # \u57fa\u4e8e\u8ddd\u79bb\u7684\u6743\u91cd\uff08\u7b80\u5355\uff1a\u53cd\u6bd4\u8ddd\u79bb\uff09\n weight = 1.0 / (d_ij + 1.0)\n # \u6309\u7279\u5f81\u76f8\u4f3c\u5ea6\u7f29\u653e\n feat_sim = jnp.dot(features[i], features[j])\n shift = shift + weight * feat_sim * r_ij\n new_positions = new_positions.at[i].set(positions[i] + 0.1 * shift)\n\n return new_positions\n\n# 3\u4e2a\u539f\u5b50\npos = jnp.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]])\nfeat = jnp.array([[1.0, 0.5], [0.5, 1.0], [0.8, 0.3]])\n\n# \u66f4\u65b0\u4f4d\u7f6e\npos_new = egnn_position_update(pos, feat)\n\n# \u73b0\u5728\u65cb\u8f6c\u8f93\u5165\u3001\u66f4\u65b0\uff0c\u5e76\u68c0\u67e5\u8f93\u51fa\u662f\u5426\u4e00\u81f4\u5730\u65cb\u8f6c\nR = jnp.array([[0.0, -1.0, 0.0], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]])\npos_rot = (R @ pos.T).T\npos_new_from_rot = egnn_position_update(pos_rot, feat)\n\n# \u5e94\u4e0e\u65cb\u8f6c\u539f\u59cb\u8f93\u51fa\u76f8\u540c\npos_new_then_rot = (R @ pos_new.T).T\n\nprint(f\"\u5148\u66f4\u65b0\u518d\u65cb\u8f6c:\\n{jnp.round(pos_new_then_rot, 4)}\")\nprint(f\"\\n\u5148\u65cb\u8f6c\u518d\u66f4\u65b0:\\n{jnp.round(pos_new_from_rot, 4)}\")\nprint(f\"\\n\u7b49\u53d8\u6027: {jnp.allclose(pos_new_then_rot, pos_new_from_rot, atol=1e-4)}\")\n \u79bb\u6563\u6570\u5b66\u662f\u5173\u4e8e\u53ef\u6570\u3001\u5206\u79bb\u7ed3\u6784\u7684\u6570\u5b66\uff0c\u662f\u8ba1\u7b97\u6784\u5efa\u7684\u57fa\u7840\u3002\u672c\u6587\u6db5\u76d6\u547d\u9898\u903b\u8f91\u4e0e\u8c13\u8bcd\u903b\u8f91\u3001\u8bc1\u660e\u6280\u5de7\u3001\u96c6\u5408\u3001\u5173\u7cfb\u3001\u51fd\u6570\u3001\u56fe\u8bba\u57fa\u7840\u4ee5\u53ca\u9012\u63a8\u5173\u7cfb\u3002
\u5728\u524d\u9762\u7684\u7ae0\u8282\u4e2d\uff0c\u6211\u4eec\u7814\u7a76\u4e86\u8fde\u7eed\u6570\u5b66\uff1a\u5fae\u79ef\u5206\uff08\u7b2c3\u7ae0\uff09\u3001\u6982\u7387\u5206\u5e03\uff08\u7b2c5\u7ae0\uff09\u4ee5\u53ca\u5b9e\u503c\u53c2\u6570\u7684\u4f18\u5316\uff08\u7b2c6\u7ae0\uff09\u3002\u4f46\u8ba1\u7b97\u673a\u672c\u8d28\u4e0a\u662f\u79bb\u6563\u673a\u5668\u3002\u5b83\u4eec\u5b58\u50a8\u6bd4\u7279\uff080\u62161\uff09\uff0c\u5904\u7406\u6574\u6570\uff0c\u9075\u5faa\u5206\u652f\u903b\u8f91\uff0c\u5e76\u64cd\u4f5c\u6709\u9650\u6570\u636e\u7ed3\u6784\u3002\u79bb\u6563\u6570\u5b66\u63d0\u4f9b\u4e86\u63a8\u7406\u8fd9\u4e9b\u7ed3\u6784\u7684\u5f62\u5f0f\u5316\u8bed\u8a00\u3002
\u672c\u7ae0\u6240\u6709\u5185\u5bb9\u90fd\u5efa\u7acb\u5728\u79bb\u6563\u6570\u5b66\u4e4b\u4e0a\uff1a\u5904\u7406\u5668\u903b\u8f91\u95e8\u662f\u5e03\u5c14\u4ee3\u6570\uff0c\u8c03\u5ea6\u7b97\u6cd5\u9700\u8981\u6b63\u786e\u6027\u8bc1\u660e\uff0c\u5185\u5b58\u7ba1\u7406\u4f7f\u7528\u96c6\u5408\u8fd0\u7b97\uff0c\u7b97\u6cd5\u5206\u6790\u9700\u8981\u9012\u63a8\u5173\u7cfb\u3002
\u547d\u9898\u903b\u8f91\u662f\u771f\u5047\u8bed\u53e5\u7684\u4ee3\u6570\u3002\u4e00\u4e2a\u547d\u9898\u662f\u4e00\u4e2a\u8981\u4e48\u4e3a\u771f\uff08T\uff09\u8981\u4e48\u4e3a\u5047\uff08F\uff09\u7684\u9648\u8ff0\uff0c\u7edd\u4e0d\u4f1a\u4e24\u8005\u517c\u6709\u3002\"\u5929\u5728\u4e0b\u96e8\"\u662f\u4e00\u4e2a\u547d\u9898\u3002\"\u73b0\u5728\u51e0\u70b9\u4e86\uff1f\"\u5219\u4e0d\u662f\uff08\u5b83\u662f\u4e00\u4e2a\u95ee\u53e5\uff0c\u4e0d\u662f\u5177\u6709\u771f\u503c\u7684\u9648\u8ff0\uff09\u3002
\u547d\u9898\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u8fde\u63a5\u8bcd\u8fdb\u884c\u7ec4\u5408\uff1a
\u771f\u503c\u8868\u7a77\u4e3e\u5217\u51fa\u6240\u6709\u53ef\u80fd\u7684\u8f93\u5165\u7ec4\u5408\u53ca\u76f8\u5e94\u7684\u8f93\u51fa\u3002\u5bf9\u4e8e\\(n\\)\u4e2a\u547d\u9898\uff0c\u8be5\u8868\u6709\\(2^n\\)\u884c\u3002\u8fd9\u5c31\u662f\u6211\u4eec\u9a8c\u8bc1\u903b\u8f91\u7b49\u4ef7\u6027\u7684\u65b9\u5f0f\uff1a
\u8574\u542b\u884c\u4e2d\\(p\\)\u4e3a\u5047\u7684\u60c5\u51b5\u503c\u5f97\u5173\u6ce8\uff1a\\(F \\to q\\)\u65e0\u8bba\\(q\\)\u4e3a\u4f55\u503c\u90fd\u4e3a\u771f\u3002\u8fd9\u5c31\u662f\u7a7a\u771f\u3002\"\u5982\u679c\u732a\u4f1a\u98de\uff0c\u90a3\u6211\u5c31\u662f\u82f1\u56fd\u56fd\u738b\"\u5728\u903b\u8f91\u4e0a\u4e3a\u771f\uff0c\u56e0\u4e3a\u524d\u63d0\u4e3a\u5047\u3002\u8fd9\u770b\u8d77\u6765\u8fdd\u53cd\u76f4\u89c9\uff0c\u4f46\u5bf9\u6570\u5b66\u63a8\u7406\u81f3\u5173\u91cd\u8981\u3002
\u903b\u8f91\u7b49\u4ef7\u5f0f\u662f\u5bf9\u6240\u6709\u771f\u503c\u90fd\u6210\u7acb\u7684\u6052\u7b49\u5f0f\uff1a
\u5fb7\u6469\u6839\u5b9a\u5f8b\uff1a\\(\\neg(p \\wedge q) \\equiv \\neg p \\vee \\neg q\\) \u548c \\(\\neg(p \\vee q) \\equiv \\neg p \\wedge \\neg q\\)\u3002\u8981\u5426\u5b9a\u4e00\u4e2aAND\uff0c\u5206\u522b\u5426\u5b9a\u6bcf\u4e2a\u90e8\u5206\u5e76\u5207\u6362\u4e3aOR\uff08\u53cd\u4e4b\u4ea6\u7136\uff09\u3002\u8fd9\u4e9b\u76f4\u63a5\u51fa\u73b0\u5728\u7f16\u7a0b\u4e2d\uff1a!(a && b) \u7b49\u4ef7\u4e8e (!a || !b)\u3002
\u9006\u5426\u547d\u9898\uff1a\\(p \\to q \\equiv \\neg q \\to \\neg p\\)\u3002\"\u5982\u679c\u4e0b\u96e8\uff0c\u5730\u5c31\u662f\u6e7f\u7684\"\u7b49\u4ef7\u4e8e\"\u5982\u679c\u5730\u4e0d\u662f\u6e7f\u7684\uff0c\u90a3\u4e48\u5c31\u6ca1\u4e0b\u96e8\u3002\"\u8fd9\u662f\u4e00\u4e2a\u5f3a\u5927\u7684\u8bc1\u660e\u6280\u5de7\u3002
\u53cc\u91cd\u5426\u5b9a\uff1a\\(\\neg(\\neg p) \\equiv p\\)\u3002
\u5206\u914d\u5f8b\uff1a\\(p \\wedge (q \\vee r) \\equiv (p \\wedge q) \\vee (p \\wedge r)\\)\u3002
\u4e00\u4e2a\u603b\u662f\u4e3a\u771f\uff08\u5bf9\u6240\u6709\u771f\u503c\u6307\u6d3e\uff09\u7684\u516c\u5f0f\u662f\u91cd\u8a00\u5f0f\u3002\u603b\u662f\u4e3a\u5047\u7684\u516c\u5f0f\u662f\u77db\u76fe\u5f0f\u3002\u6709\u65f6\u771f\u6709\u65f6\u5047\u7684\u516c\u5f0f\u662f\u5076\u7136\u5f0f\u3002\u4f8b\u5982\uff0c\\(p \\vee \\neg p\\)\u662f\u91cd\u8a00\u5f0f\uff0c\\(p \\wedge \\neg p\\)\u662f\u77db\u76fe\u5f0f\u3002
\u547d\u9898\u903b\u8f91\u65e0\u6cd5\u8868\u8fbe\u5173\u4e8e\u96c6\u5408\u4e2d\u6240\u6709\u6216\u67d0\u4e9b\u5143\u7d20\u7684\u9648\u8ff0\u3002\"\u6bcf\u4e2a\u5927\u4e8e2\u7684\u7d20\u6570\u90fd\u662f\u5947\u6570\"\u9700\u8981\u8c13\u8bcd\u903b\u8f91\uff0c\u5b83\u7528\u53d8\u91cf\u3001\u8c13\u8bcd\u548c\u91cf\u8bcd\u6269\u5c55\u4e86\u547d\u9898\u903b\u8f91\u3002
\u8c13\u8bcd\u662f\u4f9d\u8d56\u4e8e\u53d8\u91cf\u7684\u9648\u8ff0\uff1a\\(P(x)\\) = \"\\(x\\)\u662f\u5076\u6570\u3002\"\u5f53\u7ed9\u5b9a\\(x\\)\u4e00\u4e2a\u5177\u4f53\u503c\u65f6\uff0c\u5b83\u6210\u4e3a\u4e00\u4e2a\u547d\u9898\uff1a\\(P(4)\\)\u4e3a\u771f\uff0c\\(P(7)\\)\u4e3a\u5047\u3002
\u91cf\u8bcd\u8868\u8fbe\u8303\u56f4\uff1a
\u5426\u5b9a\u91cf\u8bcd\u4f1a\u7ffb\u8f6c\u5b83\u4eec\uff1a\\(\\neg(\\forall x \\, P(x)) \\equiv \\exists x \\, \\neg P(x)\\)\u3002\"\u4e0d\u662f\u6240\u6709\u4eba\u90fd\u901a\u8fc7\u4e86\"\u610f\u5473\u7740\"\u6709\u4eba\u6ca1\u901a\u8fc7\u3002\"\u800c \\(\\neg(\\exists x \\, P(x)) \\equiv \\forall x \\, \\neg P(x)\\)\u3002\"\u6ca1\u6709\u5b8c\u7f8e\u7684\u7b97\u6cd5\"\u610f\u5473\u7740\"\u6bcf\u4e2a\u7b97\u6cd5\u90fd\u6709\u7f3a\u9677\u3002\"
\u5d4c\u5957\u91cf\u8bcd\u8868\u8fbe\u590d\u6742\u5173\u7cfb\u3002\\(\\forall x \\, \\exists y \\, (y > x)\\) \u8868\u793a\"\u5bf9\u4e8e\u6bcf\u4e2a\u6570\uff0c\u90fd\u6709\u4e00\u4e2a\u66f4\u5927\u7684\u6570\"\uff08\u5bf9\u6574\u6570\u6210\u7acb\uff09\u3002\u987a\u5e8f\u5f88\u91cd\u8981\uff1a\\(\\exists y \\, \\forall x \\, (y > x)\\) \u8868\u793a\"\u5b58\u5728\u4e00\u4e2a\u6bd4\u6240\u6709\u5176\u4ed6\u6570\u90fd\u5927\u7684\u6570\"\uff08\u5bf9\u6574\u6570\u4e0d\u6210\u7acb\uff09\u3002
\u8c13\u8bcd\u903b\u8f91\u662f\u5f62\u5f0f\u5316\u89c4\u7ea6\u7684\u8bed\u8a00\u3002\u5f53\u6211\u4eec\u8bf4\u4e00\u4e2a\u7b97\u6cd5\u662f\"\u6b63\u786e\"\u7684\uff0c\u610f\u5473\u7740 \\(\\forall \\text{\u8f93\u5165} \\, x, \\, \\text{\u8f93\u51fa}(x) = \\text{\u671f\u671b\u8f93\u51fa}(x)\\)\u3002\u5f53\u6211\u4eec\u8bf4\u5b83\"\u7ec8\u6b62\"\uff0c\u610f\u5473\u7740 \\(\\forall x \\, \\exists t \\, \\text{\u7ec8\u6b62}(x, t)\\)\u3002
\u8bc1\u660e\u662f\u786e\u7acb\u4e00\u4e2a\u9648\u8ff0\u771f\u7406\u6027\u3001\u6beb\u65e0\u7591\u4e49\u7684\u903b\u8f91\u8bba\u8bc1\u3002\u4e0e\u7ecf\u9a8c\u8bc1\u636e\uff08\u4ec5\u5c55\u793a\u5728\u67d0\u4e9b\u6d4b\u8bd5\u6848\u4f8b\u4e0b\u6709\u6548\uff09\u4e0d\u540c\uff0c\u8bc1\u660e\u4fdd\u8bc1\u5728\u6240\u6709\u60c5\u51b5\u4e0b\u6210\u7acb\u3002\u8fd9\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u4e2d\u6b63\u786e\u6027\u7684\u6807\u51c6\u3002
\u76f4\u63a5\u8bc1\u660e\uff1a\u5047\u8bbe\u524d\u63d0\uff0c\u901a\u8fc7\u903b\u8f91\u6b65\u9aa4\u63a8\u5bfc\u51fa\u7ed3\u8bba\u3002\u8981\u8bc1\u660e\"\u5982\u679c\\(n\\)\u662f\u5076\u6570\uff0c\u90a3\u4e48\\(n^2\\)\u662f\u5076\u6570\"\uff1a\u5047\u8bbe\\(n = 2k\\)\u5bf9\u4e8e\u67d0\u4e2a\u6574\u6570\\(k\\)\uff0c\u5219\\(n^2 = 4k^2 = 2(2k^2)\\)\uff0c\u8fd9\u662f\u5076\u6570\u3002
\u53cd\u8bc1\u6cd5\uff1a\u5047\u8bbe\u8be5\u9648\u8ff0\u4e3a\u5047\uff0c\u63a8\u5bfc\u51fa\u77db\u76fe\u3002\u8981\u8bc1\u660e\\(\\sqrt{2}\\)\u662f\u65e0\u7406\u6570\uff1a\u5047\u8bbe\\(\\sqrt{2} = a/b\\)\uff08\u5df2\u7ea6\u7b80\uff09\u3002\u90a3\u4e48\\(2 = a^2/b^2\\)\uff0c\u6240\u4ee5\\(a^2 = 2b^2\\)\uff0c\u610f\u5473\u7740\\(a^2\\)\u662f\u5076\u6570\uff0c\u6240\u4ee5\\(a\\)\u662f\u5076\u6570\uff0c\u8bbe\\(a = 2c\\)\u3002\u90a3\u4e48\\(4c^2 = 2b^2\\)\uff0c\u6240\u4ee5\\(b^2 = 2c^2\\)\uff0c\u610f\u5473\u7740\\(b\\)\u4e5f\u662f\u5076\u6570\u3002\u4f46\u6211\u4eec\u5df2\u7ecf\u5047\u8bbe\\(a/b\\)\u662f\u7ea6\u7b80\u5f62\u5f0f\u2014\u2014\u77db\u76fe\u3002
\u5f52\u7eb3\u8bc1\u660e\uff1a\u901a\u8fc7\u8bc1\u660e\u4ee5\u4e0b\u4e24\u70b9\u6765\u8bc1\u660e\u4e00\u4e2a\u9648\u8ff0\u5bf9\u6240\u6709\u81ea\u7136\u6570\u6210\u7acb\uff1a\uff081\uff09\u57fa\u7840\u60c5\u5f62\u6210\u7acb\uff08\u901a\u5e38\\(n = 0\\)\u6216\\(n = 1\\)\uff09\uff0c\u548c\uff082\uff09\u5f52\u7eb3\u6b65\u9aa4\uff1a\u5982\u679c\u9648\u8ff0\u5bf9\\(n = k\\)\u6210\u7acb\uff08\u5f52\u7eb3\u5047\u8bbe\uff09\uff0c\u90a3\u4e48\u5b83\u5bf9\\(n = k + 1\\)\u4e5f\u6210\u7acb\u3002
\u4f8b\u5982\uff0c\u8bc1\u660e \\(\\sum_{i=1}^{n} i = \\frac{n(n+1)}{2}\\)\uff1a
\u5f52\u7eb3\u6cd5\u662f\u8bc1\u660e\u9012\u5f52\u7b97\u6cd5\u548c\u6570\u636e\u7ed3\u6784\u6027\u8d28\u7684\u4e3b\u529b\u5de5\u5177\u3002\u6bcf\u4e2a\u9012\u5f52\u7b97\u6cd5\u90fd\u6697\u542b\u4e00\u4e2a\u5f52\u7eb3\u6b63\u786e\u6027\u8bc1\u660e\uff1a\u57fa\u7840\u60c5\u5f62\u662f\u7ec8\u6b62\u6761\u4ef6\uff0c\u5f52\u7eb3\u6b65\u9aa4\u662f\u9012\u5f52\u8c03\u7528\u3002
\u5f3a\u5f52\u7eb3\u6cd5\u5047\u8bbe\u8be5\u9648\u8ff0\u5bf9\u6240\u6709\u4e0d\u5927\u4e8e\\(k\\)\u7684\u503c\u90fd\u6210\u7acb\uff08\u4e0d\u4ec5\u4ec5\u662f\\(k\\)\uff09\uff0c\u7136\u540e\u8bc1\u660e\u5b83\u5bf9\\(k + 1\\)\u6210\u7acb\u3002\u5f53\u9012\u5f52\u4f9d\u8d56\u4e8e\u591a\u4e2a\u4e4b\u524d\u7684\u503c\u65f6\uff0c\u8fd9\u5f88\u6709\u7528\u3002
\u9e3d\u5de2\u539f\u7406\uff1a\u5982\u679c\u628a\\(n+1\\)\u4e2a\u7269\u4f53\u653e\u5165\\(n\\)\u4e2a\u76d2\u5b50\u4e2d\uff0c\u81f3\u5c11\u6709\u4e00\u4e2a\u76d2\u5b50\u5305\u542b\u4e24\u4e2a\u7269\u4f53\u3002\u7b80\u5355\u4f46\u51fa\u5947\u5730\u5f3a\u5927\u3002\u5b83\u8bc1\u660e\u4e86\u5728\u4efb\u4f5513\u4e2a\u4eba\u4e2d\uff0c\u81f3\u5c11\u6709\u4e24\u4e2a\u4eba\u51fa\u751f\u6708\u4efd\u76f8\u540c\u3002\u5728\u7f51\u7edc\u4e2d\uff0c\u5b83\u8bc1\u660e\u4e86\u5f53\u9879\u76ee\u6570\u8d85\u8fc7\u6876\u6570\u65f6\uff0c\u54c8\u5e0c\u51b2\u7a81\u662f\u4e0d\u53ef\u907f\u514d\u7684\u3002
\u96c6\u5408\u662f\u4e0d\u540c\u5143\u7d20\u7684\u65e0\u5e8f\u6536\u96c6\u3002\u96c6\u5408\u662f\u6570\u5b66\u4e2d\u6700\u539f\u59cb\u7684\u6570\u636e\u7ed3\u6784\uff0c\u652f\u6491\u7740\u4ece\u7c7b\u578b\u7cfb\u7edf\u5230\u6570\u636e\u5e93\u67e5\u8be2\u7684\u4e00\u5207\u3002
\u96c6\u5408\u8fd0\u7b97\uff08\u8054\u7cfb\u7b2c5\u7ae0\uff0c\u6211\u4eec\u5728\u90a3\u91cc\u7528\u8fd9\u4e9b\u8fdb\u884c\u6982\u7387\u8ba1\u7b97\uff09\uff1a
\u5e42\u96c6 \\(\\mathcal{P}(A)\\) \u662f\\(A\\)\u7684\u6240\u6709\u5b50\u96c6\u6784\u6210\u7684\u96c6\u5408\u3002\u5982\u679c \\(|A| = n\\)\uff0c\u90a3\u4e48 \\(|\\mathcal{P}(A)| = 2^n\\)\u3002\u5bf9\u4e8e \\(A = \\{1, 2\\}\\)\uff1a\\(\\mathcal{P}(A) = \\{\\emptyset, \\{1\\}, \\{2\\}, \\{1, 2\\}\\}\\)\u3002
\u57fa\u6570\u8861\u91cf\u96c6\u5408\u5927\u5c0f\u3002\u6709\u9650\u96c6\u5177\u6709\u6574\u6570\u57fa\u6570\u3002\u65e0\u9650\u96c6\u6709\u4e0d\u540c\u7684\u5927\u5c0f\uff1a\u81ea\u7136\u6570\\(\\mathbb{N}\\)\u548c\u6709\u7406\u6570\\(\\mathbb{Q}\\)\u662f\u53ef\u6570\u65e0\u7a77\uff08\u53ef\u4ee5\u5217\u4e3e\uff09\uff0c\u800c\u5b9e\u6570\\(\\mathbb{R}\\)\u662f\u4e0d\u53ef\u6570\u65e0\u7a77\uff08\u65e0\u6cd5\u5217\u4e3e\uff0c\u7531\u5eb7\u6258\u5c14\u7684\u5bf9\u89d2\u7ebf\u8bba\u8bc1\u8bc1\u660e\uff09\u3002\u8fd9\u79cd\u533a\u522b\u5728\u53ef\u8ba1\u7b97\u6027\u7406\u8bba\u4e2d\u5f88\u91cd\u8981\uff1a\u5b58\u5728\u4e0d\u53ef\u6570\u591a\u4e2a\u51fd\u6570\uff0c\u4f46\u53ea\u6709\u53ef\u6570\u591a\u4e2a\u7a0b\u5e8f\uff0c\u56e0\u6b64\u5927\u591a\u6570\u51fd\u6570\u662f\u4e0d\u53ef\u8ba1\u7b97\u7684\u3002
\u96c6\u5408\\(A\\)\u4e0a\u7684\u5173\u7cfb\\(R\\)\u662f\\(A \\times A\\)\u7684\u4e00\u4e2a\u5b50\u96c6\uff1a\u6307\u5b9a\u54ea\u4e9b\u5143\u7d20\u76f8\u5173\u8054\u7684\u6709\u5e8f\u5bf9\u96c6\u5408\u3002\u4f8b\u5982\uff0c\u6574\u6570\u4e0a\u7684\\(\\leq\\)\u662f\u96c6\u5408 \\(\\{(a, b) : a \\leq b\\}\\)\u3002
\u5173\u7cfb\u7684\u91cd\u8981\u6027\u8d28\uff1a
\u7b49\u4ef7\u5173\u7cfb\u662f\u81ea\u53cd\u3001\u5bf9\u79f0\u4e14\u4f20\u9012\u7684\u3002\u5b83\u5c06\u96c6\u5408\u5212\u5206\u4e3a\u7b49\u4ef7\u7c7b\uff0c\u5176\u4e2d\u540c\u4e00\u7c7b\u4e2d\u7684\u6240\u6709\u5143\u7d20\u5f7c\u6b64\u76f8\u5173\uff0c\u4f46\u4e0e\u4e0d\u540c\u7c7b\u4e2d\u7684\u5143\u7d20\u65e0\u5173\u3002\u6a21\u8fd0\u7b97\u662f\u4e00\u4e2a\u7b49\u4ef7\u5173\u7cfb\uff1a\\(a \\equiv b \\pmod{n}\\) \u5c06\u6574\u6570\u5212\u5206\u4e3a\\(n\\)\u4e2a\u7c7b\u3002\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u7c7b\u578b\u7b49\u4ef7\u662f\u4e00\u4e2a\u7b49\u4ef7\u5173\u7cfb\u3002
\u504f\u5e8f\u662f\u81ea\u53cd\u3001\u53cd\u5bf9\u79f0\u4e14\u4f20\u9012\u7684\u3002\u5b83\u5b9a\u4e49\u4e86\u4e00\u4e2a\"\u5c0f\u4e8e\u7b49\u4e8e\"\u7ed3\u6784\uff0c\u53ef\u80fd\u4f1a\u4f7f\u67d0\u4e9b\u5143\u7d20\u4e0d\u53ef\u6bd4\u8f83\u3002\u6587\u4ef6\u7cfb\u7edf\u76ee\u5f55\u6784\u6210\u4e00\u4e2a\u504f\u5e8f\uff08\u7236-\u5b50\uff09\uff0c\u4f46\u540c\u7ea7\u76ee\u5f55\u662f\u4e0d\u53ef\u6bd4\u8f83\u7684\u3002\u5168\u5e8f\u662f\u6bcf\u4e00\u5bf9\u5143\u7d20\u90fd\u53ef\u6bd4\u8f83\u7684\u504f\u5e8f\uff08\u5982\u6574\u6570\u4e0a\u7684\\(\\leq\\)\uff09\u3002
\u504f\u5e8f\u5728\u5e76\u53d1\u4e2d\u81f3\u5173\u91cd\u8981\uff1a\u4e8b\u4ef6\u4e0a\u7684\"\u5148\u4e8e\u53d1\u751f\"\u5173\u7cfb\u662f\u4e00\u4e2a\u504f\u5e8f\u3002\u4e0d\u7531\u5148\u4e8e\u53d1\u751f\u5173\u7cfb\u6392\u5e8f\u7684\u4e8b\u4ef6\u662f\u5e76\u53d1\u7684\uff0c\u53ef\u80fd\u4ee5\u4efb\u610f\u76f8\u5bf9\u987a\u5e8f\u6267\u884c\u3002
\u51fd\u6570 \\(f: A \\to B\\) \u5c06\\(A\\)\uff08\u5b9a\u4e49\u57df\uff09\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u6620\u5c04\u5230\\(B\\)\uff08\u966a\u57df\uff09\u4e2d\u7684\u6070\u597d\u4e00\u4e2a\u5143\u7d20\u3002\u51fd\u6570\u662f\u786e\u5b9a\u6027\u8ba1\u7b97\u7684\u6570\u5b66\u6a21\u578b\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u8f93\u5165\uff0c\u6070\u597d\u6709\u4e00\u4e2a\u8f93\u51fa\u3002
\u5355\u5c04\uff08\u4e00\u5bf9\u4e00\uff09\uff1a\u4e0d\u540c\u7684\u8f93\u5165\u603b\u662f\u4ea7\u751f\u4e0d\u540c\u7684\u8f93\u51fa\u3002\\(f(a) = f(b) \\implies a = b\\)\u3002\u65e0\u635f\u538b\u7f29\u662f\u5355\u5c04\u7684\uff1a\u4e0d\u540c\u7684\u8f93\u5165\u5fc5\u987b\u538b\u7f29\u6210\u4e0d\u540c\u7684\u8f93\u51fa\uff08\u5426\u5219\u65e0\u6cd5\u552f\u4e00\u89e3\u538b\uff09\u3002
\u6ee1\u5c04\uff08\u5230\u4e0a\uff09\uff1a\\(B\\)\u4e2d\u7684\u6bcf\u4e2a\u5143\u7d20\u90fd\u88ab\\(A\\)\u4e2d\u7684\u67d0\u4e2a\u5143\u7d20\u547d\u4e2d\u3002\u503c\u57df\u7b49\u4e8e\u966a\u57df\u3002\u5c06\u5b57\u7b26\u4e32\u6620\u5c04\u5230256\u4f4d\u54c8\u5e0c\u7684\u54c8\u5e0c\u51fd\u6570\uff0c\u5982\u679c\u5b57\u7b26\u4e32\u6570\u5c11\u4e8e\u53ef\u80fd\u7684\u54c8\u5e0c\u6570\uff0c\u5219\u4e0d\u662f\u6ee1\u5c04\u3002
\u53cc\u5c04\uff1a\u65e2\u662f\u5355\u5c04\u53c8\u662f\u6ee1\u5c04\u3002\\(A\\)\u548c\\(B\\)\u4e4b\u95f4\u7684\u4e00\u4e00\u5bf9\u5e94\u3002\u53cc\u5c04\u5177\u6709\u9006\u51fd\u6570\u3002\u52a0\u5bc6\u5fc5\u987b\u662f\u53cc\u5c04\u7684\uff1a\u6bcf\u4e2a\u660e\u6587\u6620\u5c04\u5230\u552f\u4e00\u7684\u5bc6\u6587\uff0c\u800c\u89e3\u5bc6\u51fd\u6570\u5c31\u662f\u9006\u51fd\u6570\u3002
\u590d\u5408 \\((g \\circ f)(x) = g(f(x))\\)\uff1a\u5148\u5e94\u7528\\(f\\)\uff0c\u518d\u5e94\u7528\\(g\\)\u3002\u51fd\u6570\u590d\u5408\u662f\u53ef\u7ed3\u5408\u7684\uff08\u7b2c2\u7ae0\uff1a\u5c31\u50cf\u77e9\u9635\u4e58\u6cd5\u662f\u53ef\u7ed3\u5408\u7684\u4e00\u6837\uff09\u3002\u8f6f\u4ef6\u4e2d\u7684\u7ba1\u9053\u5c31\u662f\u51fd\u6570\u590d\u5408\uff1a\u6570\u636e\u6d41\u7ecf\u4e00\u7cfb\u5217\u53d8\u6362\u3002
\u6211\u4eec\u5728\u7b2c12\u7ae0\uff08\u56fe\u795e\u7ecf\u7f51\u7edc\uff09\u4e2d\u5e7f\u6cdb\u4ecb\u7ecd\u4e86\u56fe\uff0c\u5305\u62ec\u90bb\u63a5\u77e9\u9635\u3001\u56fe\u7c7b\u578b\u3001\u62c9\u666e\u62c9\u65af\u77e9\u9635\u548c\u8c31\u7406\u8bba\u3002\u8fd9\u91cc\u6211\u4eec\u4e13\u6ce8\u4e8e\u4e0eCS\u76f8\u5173\u7684\u7b97\u6cd5\u548c\u7ed3\u6784\u6027\u8d28\u3002
\u6811\u662f\u6ca1\u6709\u73af\u7684\u8fde\u901a\u56fe\u3002\u7b49\u4ef7\u5730\uff0c\u5b83\u6709\\(n\\)\u4e2a\u8282\u70b9\u548c\\(n-1\\)\u6761\u8fb9\u3002\u6811\u662f\u6587\u4ef6\u7cfb\u7edf\u3001XML/HTML\u6587\u6863\u3001\u51b3\u7b56\u8fc7\u7a0b\u548c\u9012\u5f52\u5206\u89e3\u7684\u7ed3\u6784\u3002\u6709\u6839\u6811\u6709\u4e00\u4e2a\u6307\u5b9a\u7684\u6839\u8282\u70b9\uff1b\u6bcf\u4e2a\u5176\u4ed6\u8282\u70b9\u6070\u597d\u6709\u4e00\u4e2a\u7236\u8282\u70b9\u3002
\u56fe\\(G\\)\u7684\u751f\u6210\u6811\u662f\u5305\u542b\\(G\\)\u6240\u6709\u8282\u70b9\u5e76\u4f7f\u7528\u5176\u8fb9\u5b50\u96c6\u7684\u4e00\u68f5\u6811\u3002\u6700\u5c0f\u751f\u6210\u6811\uff08MST\uff09\u6700\u5c0f\u5316\u603b\u8fb9\u6743\u3002Kruskal\u7b97\u6cd5\uff08\u5bf9\u8fb9\u6392\u5e8f\uff0c\u8d2a\u5fc3\u5730\u6dfb\u52a0\u4e0d\u5f62\u6210\u73af\u7684\u6700\u8f7b\u8fb9\uff09\u548cPrim\u7b97\u6cd5\uff08\u4ece\u8d77\u59cb\u8282\u70b9\u5f00\u59cb\u6269\u5c55\u6811\uff0c\u603b\u662f\u6dfb\u52a0\u8fde\u63a5\u5230\u65b0\u8282\u70b9\u7684\u6700\u8f7b\u8fb9\uff09\u90fd\u80fd\u5728\\(O(|E| \\log |V|)\\)\u5185\u627e\u5230MST\u3002
\u5e73\u9762\u6027\uff1a\u5982\u679c\u4e00\u4e2a\u56fe\u53ef\u4ee5\u753b\u5728\u5e73\u9762\u4e0a\u800c\u8fb9\u4e0d\u76f8\u4ea4\uff0c\u5219\u662f\u5e73\u9762\u56fe\u3002\u6839\u636e\u6b27\u62c9\u516c\u5f0f\uff0c\u5bf9\u4e8e\u8fde\u901a\u5e73\u9762\u56fe\uff1a\\(|V| - |E| + |F| = 2\\)\uff0c\u5176\u4e2d\\(|F|\\)\u662f\u9762\u7684\u6570\u91cf\uff08\u533a\u57df\uff0c\u5305\u62ec\u5916\u90e8\u9762\uff09\u3002\u8fd9\u610f\u5473\u7740\u5e73\u9762\u56fe\u7684\\(|E| \\leq 3|V| - 6\\)\uff0c\u56e0\u6b64\u5e73\u9762\u56fe\u662f\u7a00\u758f\u7684\u3002\u7535\u8def\u677f\u5e03\u7ebf\u548c\u5730\u56fe\u7740\u8272\u5229\u7528\u4e86\u5e73\u9762\u6027\u3002
\u56fe\u7740\u8272\u4e3a\u8282\u70b9\u5206\u914d\u989c\u8272\uff0c\u4f7f\u5f97\u6ca1\u6709\u4e24\u4e2a\u76f8\u90bb\u8282\u70b9\u5171\u4eab\u76f8\u540c\u7684\u989c\u8272\u3002\u6240\u9700\u7684\u6700\u5c0f\u989c\u8272\u6570\u662f\u8272\u6570 \\(\\chi(G)\\)\u3002\u56db\u8272\u5b9a\u7406\u6307\u51fa\u4efb\u4f55\u5e73\u9762\u56fe\u7684 \\(\\chi(G) \\leq 4\\)\u3002\u5728CS\u4e2d\uff0c\u56fe\u7740\u8272\u6a21\u62df\u5bc4\u5b58\u5668\u5206\u914d\uff08\u5c06\u53d8\u91cf\u5206\u914d\u5230CPU\u5bc4\u5b58\u5668\uff0c\u4f7f\u5f97\u540c\u65f6\u6d3b\u8dc3\u7684\u53d8\u91cf\u83b7\u5f97\u4e0d\u540c\u7684\u5bc4\u5b58\u5668\uff09\u548c\u8c03\u5ea6\uff08\u5c06\u4efb\u52a1\u5206\u914d\u5230\u65f6\u95f4\u69fd\uff0c\u4f7f\u5f97\u51b2\u7a81\u7684\u4efb\u52a1\u4e0d\u91cd\u53e0\uff09\u3002
\u6b27\u62c9\u8def\u5f84\u6070\u597d\u8bbf\u95ee\u6bcf\u6761\u8fb9\u4e00\u6b21\u3002\u5f53\u4e14\u4ec5\u5f53\u56fe\u4e2d\u6070\u597d\u67090\u4e2a\u62162\u4e2a\u5947\u6570\u5ea6\u8282\u70b9\u65f6\uff0c\u6b27\u62c9\u8def\u5f84\u5b58\u5728\u3002\u54c8\u5bc6\u987f\u8def\u5f84\u6070\u597d\u8bbf\u95ee\u6bcf\u4e2a\u8282\u70b9\u4e00\u6b21\u3002\u786e\u5b9a\u54c8\u5bc6\u987f\u8def\u5f84\u662f\u5426\u5b58\u5728\u662fNP\u5b8c\u5168\u7684\u2014\u2014\u8fd9\u662fCS\u4e2d\u7684\u7ecf\u5178\u96be\u9898\u4e4b\u4e00\u3002\u8fd9\u79cd\u5bf9\u6bd4\uff08\u6b27\u62c9\uff1a\u591a\u9879\u5f0f\uff0c\u54c8\u5bc6\u987f\uff1aNP\u5b8c\u5168\uff09\u8bf4\u660e\u4e86\u542c\u8d77\u6765\u76f8\u4f3c\u7684\u95ee\u9898\u53ef\u80fd\u5177\u6709\u622a\u7136\u4e0d\u540c\u7684\u8ba1\u7b97\u590d\u6742\u5ea6\u3002
\u9012\u63a8\u5173\u7cfb\u5b9a\u4e49\u4e00\u4e2a\u5e8f\u5217\uff0c\u5176\u4e2d\u6bcf\u4e00\u9879\u4f9d\u8d56\u4e8e\u524d\u9762\u7684\u9879\u3002\u5b83\u4eec\u81ea\u7136\u5730\u4ece\u9012\u5f52\u7b97\u6cd5\u4e2d\u4ea7\u751f\u3002
\u6700\u7b80\u5355\u7684\u4f8b\u5b50\uff1a\\(T(n) = T(n-1) + 1\\)\uff0c\u5176\u4e2d \\(T(0) = 0\\)\u3002\u5c55\u5f00\uff1a\\(T(n) = T(n-1) + 1 = T(n-2) + 2 = \\cdots = n\\)\u3002\u8fd9\u662f\\(O(n)\\)\uff0c\u5373\u7b80\u5355\u5faa\u73af\u7684\u65f6\u95f4\u590d\u6742\u5ea6\u3002
\u5f52\u5e76\u6392\u5e8f\u7ed9\u51fa \\(T(n) = 2T(n/2) + O(n)\\)\uff1a\u5c06\u6570\u7ec4\u5206\u6210\u4e24\u534a\uff08\u4e24\u4e2a\u5927\u5c0f\u4e3a\\(n/2\\)\u7684\u5b50\u95ee\u9898\uff09\uff0c\u9012\u5f52\u6392\u5e8f\u6bcf\u4e00\u534a\uff0c\u7136\u540e\u5408\u5e76\uff08\\(O(n)\\)\u5de5\u4f5c\uff09\u3002\u89e3\u4e3a \\(T(n) = O(n \\log n)\\)\u3002
\u4e3b\u5b9a\u7406\u6c42\u89e3\u5f62\u5f0f\u4e3a \\(T(n) = aT(n/b) + O(n^d)\\) \u7684\u9012\u63a8\u5f0f\uff1a
\u5bf9\u4e8e\u5f52\u5e76\u6392\u5e8f\uff1a\\(a = 2, b = 2, d = 1\\)\u3002\u7531\u4e8e \\(d = \\log_2 2 = 1\\)\uff0c\u6211\u4eec\u5904\u4e8e\u5e73\u8861\u60c5\u51b5\uff1a\\(T(n) = O(n \\log n)\\)\u3002
\u6590\u6ce2\u90a3\u5951\u9012\u63a8 \\(F(n) = F(n-1) + F(n-2)\\)\uff0c\u5176\u4e2d \\(F(0) = 0, F(1) = 1\\)\uff0c\u5c01\u95ed\u5f62\u5f0f\u89e3\u4e3a \\(F(n) = \\frac{\\phi^n - \\psi^n}{\\sqrt{5}}\\)\uff0c\u5176\u4e2d \\(\\phi = \\frac{1+\\sqrt{5}}{2}\\)\uff08\u9ec4\u91d1\u6bd4\u4f8b\uff09\u4e14 \\(\\psi = \\frac{1-\\sqrt{5}}{2}\\)\u3002\u8fd9\u8868\u660e\u6590\u6ce2\u90a3\u5951\u6570\u5217\u4ee5 \\(O(\\phi^n)\\) \u6307\u6570\u589e\u957f\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6734\u7d20\u9012\u5f52\u6590\u6ce2\u90a3\u5951\u6307\u6570\u7ea7\u6162\u3002
\u7ec4\u5408\u6570\u5b66\uff08\u6392\u5217\u3001\u7ec4\u5408\u3001\u4e8c\u9879\u5f0f\u5b9a\u7406\u548c\u5bb9\u65a5\u539f\u7406\uff09\u5728\u7b2c5\u7ae0\uff08\u6982\u7387\uff09\u4e2d\u4ecb\u7ecd\u3002\u8fd9\u4e9b\u8ba1\u6570\u6280\u672f\u5bf9\u7b97\u6cd5\u5206\u6790\u81f3\u5173\u91cd\u8981\uff08\u6709\u591a\u5c11\u79cd\u53ef\u80fd\u7684\u8f93\u5165\uff1f\u9700\u8981\u591a\u5c11\u6b21\u6bd4\u8f83\uff1f\uff09\uff0c\u4f46\u6211\u4eec\u5728\u6b64\u4e0d\u518d\u91cd\u590d\u3002
\u5e76\u975e\u6240\u6709\u4e8b\u60c5\u90fd\u80fd\u88ab\u8ba1\u7b97\u3002\u8fd9\u662f\u6574\u4e2a\u6570\u5b66\u4e2d\u6700\u6df1\u523b\u7684\u7ed3\u8bba\u4e4b\u4e00\uff0c\u5b83\u8bbe\u5b9a\u4e86\u8ba1\u7b97\u673a\u80fd\u529b\u7684\u57fa\u672c\u6781\u9650\u3002
\u56fe\u7075\u673a\u662f\u8ba1\u7b97\u7684\u62bd\u8c61\u6a21\u578b\uff1a\u4e00\u6761\u65e0\u9650\u957f\u7684\u5355\u5143\u683c\u78c1\u5e26\uff08\u6bcf\u4e2a\u5355\u5143\u683c\u5305\u542b\u4e00\u4e2a\u7b26\u53f7\uff09\uff0c\u4e00\u4e2a\u8bfb\u5199\u5934\uff0c\u4ee5\u53ca\u4e00\u7ec4\u5e26\u8f6c\u79fb\u89c4\u5219\u7684\u6709\u9650\u72b6\u6001\u3002\u5c3d\u7ba1\u7b80\u5355\uff0c\u56fe\u7075\u673a\u53ef\u4ee5\u8ba1\u7b97\u4efb\u4f55\u5b9e\u9645\u8ba1\u7b97\u673a\u80fd\u8ba1\u7b97\u7684\u4efb\u4f55\u4e1c\u897f\u3002\u8fd9\u5c31\u662f\u90b1\u5947-\u56fe\u7075\u8bba\u9898\uff1a\u4efb\u4f55\u6709\u6548\u53ef\u8ba1\u7b97\u7684\u51fd\u6570\u90fd\u53ef\u4ee5\u7531\u56fe\u7075\u673a\u8ba1\u7b97\u3002
\u6bcf\u79cd\u7f16\u7a0b\u8bed\u8a00\uff08Python\u3001C\u3001Haskell\uff09\u90fd\u662f\u56fe\u7075\u5b8c\u5907\u7684\uff1a\u5b83\u53ef\u4ee5\u6a21\u62df\u56fe\u7075\u673a\uff0c\u4ece\u800c\u8ba1\u7b97\u4efb\u4f55\u53ef\u8ba1\u7b97\u7684\u4e1c\u897f\u3002\u8bed\u8a00\u4e4b\u95f4\u7684\u533a\u522b\u5728\u4e8e\u4fbf\u5229\u6027\u3001\u901f\u5ea6\u548c\u5b89\u5168\u6027\uff0c\u800c\u4e0d\u5728\u4e8e\u5b83\u4eec\u6839\u672c\u4e0a\u80fd\u8ba1\u7b97\u4ec0\u4e48\u3002
\u505c\u673a\u95ee\u9898\u8be2\u95ee\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u7a0b\u5e8f\u548c\u4e00\u4e2a\u8f93\u5165\uff0c\u8be5\u7a0b\u5e8f\u6700\u7ec8\u4f1a\u505c\u6b62\uff0c\u8fd8\u662f\u6c38\u8fdc\u8fd0\u884c\uff1f\u56fe\u7075\uff081936\uff09\u8bc1\u660e\u4e0d\u5b58\u5728\u80fd\u666e\u904d\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u7684\u7b97\u6cd5\u3002\u8bc1\u660e\u91c7\u7528\u53cd\u8bc1\u6cd5\uff1a\u5047\u8bbe\u5b58\u5728\u4e00\u4e2a\u505c\u673a\u68c0\u6d4b\u5668 \\(H(P, x)\\)\u3002\u6784\u9020\u4e00\u4e2a\u7a0b\u5e8f \\(D\\)\uff0c\u5b83\u8fd0\u884c \\(H(D, D)\\) \u5e76\u505a\u4e0e \\(H\\) \u6240\u8bf4\u7684\u76f8\u53cd\u7684\u4e8b\u3002\u5982\u679c \\(H\\) \u8bf4 \\(D\\) \u505c\u673a\uff0c\\(D\\) \u5c31\u6c38\u8fdc\u5faa\u73af\u3002\u5982\u679c \\(H\\) \u8bf4 \\(D\\) \u5faa\u73af\uff0c\\(D\\) \u5c31\u505c\u673a\u3002\u77db\u76fe\u3002
\u8fd9\u4e0d\u662f\u5f53\u524d\u6280\u672f\u7684\u5c40\u9650\uff1b\u8fd9\u662f\u4e00\u4e2a\u6570\u5b66\u4e0a\u7684\u4e0d\u53ef\u80fd\u6027\u3002\u65e0\u8bba\u591a\u5c11\u8ba1\u7b97\u3001\u591a\u5c11\u806a\u660e\u624d\u667a\u3001\u6216\u591a\u5c11\u4eba\u5de5\u667a\u80fd\uff0c\u90fd\u65e0\u6cd5\u666e\u904d\u89e3\u51b3\u505c\u673a\u95ee\u9898\u3002\u5b83\u662f\u54e5\u5fb7\u5c14\u4e0d\u5b8c\u5907\u5b9a\u7406\u5728\u8ba1\u7b97\u673a\u79d1\u5b66\u4e2d\u7684\u7c7b\u6bd4\u3002
\u5b9e\u9645\u540e\u679c\uff1a\u4f60\u65e0\u6cd5\u7f16\u5199\u4e00\u4e2a\u5b8c\u7f8e\u7684\u6b7b\u9501\u68c0\u6d4b\u5668\u3001\u4e00\u4e2a\u5b8c\u7f8e\u7684\u75c5\u6bd2\u626b\u63cf\u5668\u6216\u4e00\u4e2a\u5b8c\u7f8e\u7684\u4f18\u5316\u7f16\u8bd1\u5668\u3002\u6bcf\u4e00\u4e2a\u90fd\u9700\u8981\u901a\u7528\u5730\u89e3\u51b3\u505c\u673a\u95ee\u9898\uff08\u6216\u4e00\u4e2a\u7b49\u4ef7\u7684\u4e0d\u5224\u5b9a\u95ee\u9898\uff09\u3002\u5b9e\u9645\u5de5\u5177\u4f7f\u7528\u542f\u53d1\u5f0f\u65b9\u6cd5\u548c\u8fd1\u4f3c\u65b9\u6cd5\uff0c\u5728\u5e38\u89c1\u60c5\u51b5\u4e0b\u6709\u6548\uff0c\u4f46\u4e0d\u80fd\u4fdd\u8bc1\u5bf9\u6240\u6709\u8f93\u5165\u90fd\u6b63\u786e\u3002
\u5982\u679c\u4e00\u4e2a\u95ee\u9898\u5b58\u5728\u4e00\u4e2a\u603b\u662f\u80fd\u7ed9\u51fa\u6b63\u786e\u662f/\u5426\u7b54\u6848\u5e76\u7ec8\u6b62\u7684\u7b97\u6cd5\uff0c\u5219\u5b83\u662f\u53ef\u5224\u5b9a\u7684\u3002\u5982\u679c\u4e0d\u5b58\u5728\u8fd9\u6837\u7684\u7b97\u6cd5\uff0c\u5219\u662f\u4e0d\u53ef\u5224\u5b9a\u7684\u3002\u505c\u673a\u95ee\u9898\u662f\u4e0d\u53ef\u5224\u5b9a\u7684\u3002\u7d20\u6570\u6d4b\u8bd5\u662f\u53ef\u5224\u5b9a\u7684\u3002\u5927\u591a\u6570\u7f16\u7a0b\u8bed\u8a00\u4e2d\u7684\u7c7b\u578b\u68c0\u67e5\u662f\u53ef\u5224\u5b9a\u7684\uff08\u901a\u8fc7\u8bbe\u8ba1\uff09\u3002
P\uff08\u591a\u9879\u5f0f\u65f6\u95f4\uff09\uff1a\u80fd\u5728 \\(O(n^k)\\) \u65f6\u95f4\u5185\u89e3\u51b3\u7684\u95ee\u9898\uff0c\\(k\\)\u4e3a\u67d0\u4e2a\u5e38\u6570\u3002\u6392\u5e8f\uff08\\(O(n \\log n)\\)\uff09\u3001\u6700\u77ed\u8def\u5f84\uff08\\(O(|V|^2)\\)\uff09\u3001\u77e9\u9635\u4e58\u6cd5\uff08\\(O(n^3)\\)\uff09\u3002\u8fd9\u4e9b\u88ab\u8ba4\u4e3a\u662f\"\u9ad8\u6548\"\u6216\"\u53ef\u5904\u7406\u7684\u3002\"
NP\uff08\u975e\u786e\u5b9a\u6027\u591a\u9879\u5f0f\u65f6\u95f4\uff09\uff1a\u4e00\u4e2a\u62df\u8bae\u7684\u89e3\u7b54\u80fd\u5728\u591a\u9879\u5f0f\u65f6\u95f4\u5185\u9a8c\u8bc1\u7684\u95ee\u9898\uff0c\u5373\u4f7f\u627e\u5230\u89e3\u7b54\u53ef\u80fd\u9700\u8981\u6307\u6570\u65f6\u95f4\u3002\u4f8b\u5982\uff0c\u7ed9\u5b9a\u4e00\u4e2a\u58f0\u79f0\u7684\u54c8\u5bc6\u987f\u8def\u5f84\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u68c0\u67e5\u6bcf\u6761\u8fb9\u5728 \\(O(n)\\) \u65f6\u95f4\u5185\u9a8c\u8bc1\u5b83\u3002\u4f46\u627e\u5230\u4e00\u6761\u53ef\u80fd\u9700\u5c1d\u8bd5\u6307\u6570\u591a\u4e2a\u53ef\u80fd\u6027\u3002
P\u4e2d\u7684\u6bcf\u4e2a\u95ee\u9898\u4e5f\u5728NP\u4e2d\uff08\u5982\u679c\u4f60\u80fd\u5feb\u901f\u89e3\u51b3\u5b83\uff0c\u4f60\u5f53\u7136\u80fd\u5feb\u901f\u9a8c\u8bc1\u4e00\u4e2a\u89e3\u7b54\uff09\u3002\u6838\u5fc3\u95ee\u9898\u662f \\(P = NP\\) \u662f\u5426\u6210\u7acb\uff1a\u6bcf\u4e2a\u80fd\u5feb\u901f\u9a8c\u8bc1\u89e3\u7b54\u7684\u95ee\u9898\u662f\u5426\u4e5f\u80fd\u5feb\u901f\u6c42\u89e3\uff1f\u8fd9\u662f\u8ba1\u7b97\u673a\u79d1\u5b66\u4e2d\u6700\u91cd\u8981\u7684\u5f00\u653e\u95ee\u9898\uff0c\u83b7\u5f97\u514b\u83b1\u6570\u5b66\u7814\u7a76\u6240100\u4e07\u7f8e\u5143\u7684\u5343\u79a7\u5e74\u5927\u5956\u3002
\u5927\u591a\u6570\u4e13\u5bb6\u76f8\u4fe1 \\(P \\neq NP\\)\uff0c\u610f\u5473\u7740\u6709\u4e9b\u95ee\u9898\u672c\u8d28\u4e0a\u6bd4\u9a8c\u8bc1\u66f4\u96be\u89e3\u51b3\u3002\u5982\u679c \\(P = NP\\)\uff0c\u5bc6\u7801\u5b66\u5c06\u5d29\u6e83\uff08\u7834\u89e3\u52a0\u5bc6\u5c5e\u4e8eNP\uff09\uff0c\u800c\u4f18\u5316\u3001\u8c03\u5ea6\u548c\u836f\u7269\u8bbe\u8ba1\u5c06\u53d8\u5f97\u5f02\u5e38\u7b80\u5355\u3002
NP\u5b8c\u5168\u95ee\u9898\u662fNP\u4e2d\u6700\u96be\u7684\u95ee\u9898\u3002\u4e00\u4e2a\u95ee\u9898\u5982\u679c\u662fNP\u5b8c\u5168\u7684\uff0c\u5219\uff1a\uff081\uff09\u5b83\u5728NP\u4e2d\uff0c\u4e14\uff082\uff09\u6240\u6709\u5176\u4ed6NP\u95ee\u9898\u53ef\u4ee5\u5728\u591a\u9879\u5f0f\u65f6\u95f4\u5185\u5f52\u7ea6\u5230\u5b83\u3002\u5982\u679c\u4f60\u80fd\u9ad8\u6548\u89e3\u51b3\u4efb\u4f55\u4e00\u4e2aNP\u5b8c\u5168\u95ee\u9898\uff0c\u4f60\u5c31\u80fd\u89e3\u51b3\u6240\u6709NP\u5b8c\u5168\u95ee\u9898\uff08\u4ece\u800c \\(P = NP\\)\uff09\u3002
\u5f52\u7ea6\u5c06\u4e00\u4e2a\u95ee\u9898\u8f6c\u6362\u4e3a\u53e6\u4e00\u4e2a\u95ee\u9898\u3002\u5982\u679c\u95ee\u9898A\u5f52\u7ea6\u5230\u95ee\u9898B\uff0c\u90a3\u4e48B\u81f3\u5c11\u548cA\u4e00\u6837\u96be\u3002Cook\uff081971\uff09\u8bc1\u660e\u4e86SAT\uff08\u5e03\u5c14\u53ef\u6ee1\u8db3\u6027\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u903b\u8f91\u516c\u5f0f\uff0c\u662f\u5426\u5b58\u5728\u4f7f\u516c\u5f0f\u4e3a\u771f\u7684\u53d8\u91cf\u8d4b\u503c\uff1f\uff09\u662fNP\u5b8c\u5168\u7684\u3002Karp\uff081972\uff09\u901a\u8fc7\u5c06SAT\u5f52\u7ea6\u5230\u6bcf\u4e2a\u95ee\u9898\uff0c\u8bc1\u660e\u4e86\u5176\u4ed621\u4e2a\u7ecf\u5178\u95ee\u9898\u662fNP\u5b8c\u5168\u7684\u3002
\u8457\u540d\u7684NP\u5b8c\u5168\u95ee\u9898\uff1a
\u5f53\u4f60\u5728\u5b9e\u8df5\u4e2d\u9047\u5230NP\u5b8c\u5168\u95ee\u9898\u65f6\uff0c\u4f60\u4e0d\u4f1a\u5bf9\u5927\u89c4\u6a21\u8f93\u5165\u7cbe\u786e\u6c42\u89e3\u3002\u76f8\u53cd\uff0c\u4f60\u4f7f\u7528\uff1a\u8fd1\u4f3c\u7b97\u6cd5\uff08\u627e\u5230\u4fdd\u8bc1\u5728\u6700\u4f18\u89e3\u4e00\u5b9a\u500d\u6570\u8303\u56f4\u5185\u7684\u89e3\uff09\u3001\u542f\u53d1\u5f0f\u65b9\u6cd5\uff08\u8d2a\u5fc3\u3001\u5c40\u90e8\u641c\u7d22\u3001\u6a21\u62df\u9000\u706b\uff09\u6216\u7279\u4f8b\u6c42\u89e3\u5668\uff08\u8bb8\u591aNP\u5b8c\u5168\u95ee\u9898\u5bf9\u53d7\u9650\u8f93\u5165\u5f88\u5bb9\u6613\uff09\u3002\u4f8b\u5982\uff0c\u73b0\u4ee3SAT\u6c42\u89e3\u5668\u5c3d\u7ba1\u5728\u6700\u574f\u60c5\u51b5\u4e0b\u662f\u6307\u6570\u590d\u6742\u5ea6\uff0c\u4f46\u901a\u8fc7\u5229\u7528\u5b9e\u9645\u5b9e\u4f8b\u4e2d\u7684\u7ed3\u6784\uff0c\u901a\u5e38\u80fd\u89e3\u51b3\u62e5\u6709\u6570\u767e\u4e07\u53d8\u91cf\u7684\u5b9e\u4f8b\u3002
NP\u56f0\u96be\u95ee\u9898\u81f3\u5c11\u548cNP\u5b8c\u5168\u95ee\u9898\u4e00\u6837\u96be\uff0c\u4f46\u53ef\u80fd\u4e0d\u5728NP\u4e2d\uff08\u5b83\u4eec\u7684\u89e3\u751a\u81f3\u53ef\u80fd\u4e0d\u80fd\u5728\u591a\u9879\u5f0f\u65f6\u95f4\u5185\u9a8c\u8bc1\uff09\u3002NP\u5b8c\u5168\u95ee\u9898\u7684\u4f18\u5316\u7248\u672c\u901a\u5e38\u662fNP\u56f0\u96be\u7684\uff1a\"\u627e\u5230\u6700\u77edTSP\u8def\u7ebf\"\u662fNP\u56f0\u96be\u7684\uff0c\u800c\"\u662f\u5426\u5b58\u5728\u4e00\u6761\u957f\u5ea6\u5c0f\u4e8e\\(k\\)\u7684TSP\u8def\u7ebf\uff1f\"\u662fNP\u5b8c\u5168\u7684\u3002
\u6784\u5efa\u4e00\u4e2a\u771f\u503c\u8868\u751f\u6210\u5668\u3002\u7ed9\u5b9a\u4e00\u4e2a\u903b\u8f91\u8868\u8fbe\u5f0f\uff0c\u679a\u4e3e\u6240\u6709\u8f93\u5165\u7ec4\u5408\u5e76\u8ba1\u7b97\u7ed3\u679c\u3002
import itertools\n\ndef truth_table(n_vars, expr_fn):\n \"\"\"\u4e3a\u4e00\u4e2an_vars\u4e2a\u53d8\u91cf\u7684\u5e03\u5c14\u51fd\u6570\u751f\u6210\u771f\u503c\u8868\u3002\"\"\"\n headers = [f\"p{i}\" for i in range(n_vars)]\n print(\" | \".join(headers + [\"result\"]))\n print(\"-\" * (len(headers) * 4 + 10))\n for vals in itertools.product([False, True], repeat=n_vars):\n result = expr_fn(*vals)\n row = [str(v)[0] for v in vals] + [str(result)[0]]\n print(\" | \".join(f\"{r:>2}\" for r in row))\n\n# \u5fb7\u6469\u6839\u5b9a\u5f8b\uff1aNOT(p AND q) == (NOT p) OR (NOT q)\nprint(\"\u5fb7\u6469\u6839\u5b9a\u5f8b\u9a8c\u8bc1\uff1a\")\ntruth_table(2, lambda p, q: (not (p and q)) == ((not p) or (not q)))\n \u901a\u8fc7\u5f52\u7eb3\u6cd5\u8bc1\u660e\u6c42\u548c\u516c\u5f0f\u2014\u2014\u5bf9\u591a\u4e2a\u503c\u8fdb\u884c\u6570\u503c\u9a8c\u8bc1\uff0c\u7136\u540e\u5b9e\u73b0\u5c01\u95ed\u5f62\u5f0f\u89e3\u3002
import jax.numpy as jnp\n\n# \u9a8c\u8bc1\u6c42\u548c\u516c\u5f0f\uff1asum(1..n) = n(n+1)/2\nfor n in [1, 5, 10, 100, 1000, 10000]:\n brute = sum(range(1, n + 1))\n formula = n * (n + 1) // 2\n print(f\"n={n:5d} sum={brute:>10d} formula={formula:>10d} match={brute == formula}\")\n \u4f7f\u7528\u4e3b\u5b9a\u7406\u6c42\u89e3\u5f52\u5e76\u6392\u5e8f\u9012\u63a8\u5173\u7cfb\uff0c\u5e76\u901a\u8fc7\u8ba1\u6570\u64cd\u4f5c\u8fdb\u884c\u7ecf\u9a8c\u9a8c\u8bc1\u3002
import jax.numpy as jnp\n\ndef merge_sort_ops(n):\n \"\"\"\u7edf\u8ba1\u5f52\u5e76\u6392\u5e8f\u4e2d\u7684\u6bd4\u8f83\u6b21\u6570\uff08\u9012\u63a8\uff1aT(n) = 2T(n/2) + n\uff09\u3002\"\"\"\n if n <= 1:\n return 0\n half = n // 2\n return merge_sort_ops(half) + merge_sort_ops(n - half) + n\n\nfor n in [8, 64, 512, 4096, 32768]:\n ops = merge_sort_ops(n)\n predicted = n * jnp.log2(n)\n ratio = ops / predicted\n print(f\"n={n:5d} ops={ops:>10d} n log n={int(predicted):>10d} ratio={ratio:.3f}\")\n \u8ba1\u7b97\u673a\u4f53\u7cfb\u7ed3\u6784\u662f\u5173\u4e8e\u5982\u4f55\u6784\u5efa\u6267\u884c\u6307\u4ee4\u7684\u673a\u5668\u3002\u672c\u6587\u6db5\u76d6\u6570\u5236\u3001\u903b\u8f91\u95e8\u3001CPU\u8bbe\u8ba1\u3001\u6307\u4ee4\u96c6\u67b6\u6784\u3001\u6d41\u6c34\u7ebf\u3001\u5b58\u50a8\u5668\u5c42\u6b21\u7ed3\u6784\u548c\u865a\u62df\u5185\u5b58\u2014\u2014\u6bcf\u4e2a\u7a0b\u5e8f\u3001\u6846\u67b6\u548cAI\u6a21\u578b\u6700\u7ec8\u8fd0\u884c\u5176\u4e0a\u7684\u786c\u4ef6\u57fa\u7840\u3002
\u8ba1\u7b97\u673a\u5c06\u6240\u6709\u5185\u5bb9\u8868\u793a\u4e3a\u4e8c\u8fdb\u5236\uff08\u57fa2\uff09\uff1a0\u548c1\u7684\u5e8f\u5217\u3002\u6bcf\u4e2a\u6570\u5b57\u662f\u4e00\u4e2a\u6bd4\u7279\u30028\u4e2a\u6bd4\u7279\u4e3a\u4e00\u7ec4\u79f0\u4e3a\u4e00\u4e2a\u5b57\u8282\u3002\u4e8c\u8fdb\u5236\u6570 \\(b_{n-1} b_{n-2} \\ldots b_1 b_0\\) \u7684\u503c\u4e3a \\(\\sum_{i=0}^{n-1} b_i \\cdot 2^i\\)\u3002
\u4f8b\u5982\uff0c\\(1011_2 = 1 \\cdot 8 + 0 \\cdot 4 + 1 \\cdot 2 + 1 \\cdot 1 = 11_{10}\\)\u3002
\u5341\u516d\u8fdb\u5236\uff08\u57fa16\uff09\u662f\u4e8c\u8fdb\u5236\u7684\u7d27\u51d1\u8868\u793a\u6cd5\u3002\u6bcf\u4e2a\u5341\u516d\u8fdb\u5236\u6570\u5b57\u4ee3\u88684\u4e2a\u6bd4\u7279\uff1a\\(0\\text{-}9\\) \u6620\u5c04\u5230 \\(0000\\text{-}1001\\)\uff0c\\(A\\text{-}F\\) \u6620\u5c04\u5230 \\(1010\\text{-}1111\\)\u3002\u56e0\u6b64 \\(\\text{0xFF} = 1111\\,1111_2 = 255_{10}\\)\u3002\u5185\u5b58\u5730\u5740\u548c\u989c\u8272\u4ee3\u7801\u901a\u5e38\u7528\u5341\u516d\u8fdb\u5236\u4e66\u5199\u3002
\u8865\u7801\u8868\u793a\u6709\u7b26\u53f7\u6574\u6570\u3002\u5bf9\u4e8e\\(n\\)\u4f4d\u6570\u5b57\uff0c\u6700\u9ad8\u6709\u6548\u4f4d\u7684\u6743\u91cd\u4e3a \\(-2^{n-1}\\) \u800c\u975e \\(+2^{n-1}\\)\u30028\u4f4d\u8865\u7801\u7684\u8303\u56f4\u4e3a \\(-128\\) \u5230 \\(+127\\)\u3002\u8981\u53d6\u4e00\u4e2a\u6570\u7684\u76f8\u53cd\u6570\uff1a\u7ffb\u8f6c\u6240\u6709\u4f4d\u7136\u540e\u52a01\u3002\u8fd9\u79cd\u8868\u793a\u4f7f\u52a0\u6cd5\u548c\u51cf\u6cd5\u4f7f\u7528\u76f8\u540c\u7684\u786c\u4ef6\u7535\u8def\uff0c\u8fd9\u5c31\u662f\u5b83\u88ab\u666e\u904d\u91c7\u7528\u7684\u539f\u56e0\u3002
IEEE 754\u6d6e\u70b9\u6570\u5c06\u5b9e\u6570\u8868\u793a\u4e3a \\((-1)^s \\times 1.m \\times 2^{e-\\text{bias}}\\)\uff0c\u5176\u4e2d\\(s\\)\u662f\u7b26\u53f7\u4f4d\uff0c\\(m\\)\u662f\u5c3e\u6570\uff08\u5c0f\u6570\u90e8\u5206\uff09\uff0c\\(e\\)\u662f\u79fb\u7801\u6307\u6570\u3002
- **float32**\uff08\u5355\u7cbe\u5ea6\uff09\uff1a1\u4e2a\u7b26\u53f7 + 8\u4e2a\u6307\u6570 + 23\u4e2a\u5c3e\u6570 = 32\u4f4d\u3002\u8303\u56f4\uff1a$\\approx \\pm 3.4 \\times 10^{38}$\uff0c\u7cbe\u5ea6\uff1a$\\approx 7$\u4f4d\u5341\u8fdb\u5236\u6570\u5b57\u3002\n- **float64**\uff08\u53cc\u7cbe\u5ea6\uff09\uff1a1\u4e2a\u7b26\u53f7 + 11\u4e2a\u6307\u6570 + 52\u4e2a\u5c3e\u6570 = 64\u4f4d\u3002\u8303\u56f4\uff1a$\\approx \\pm 1.8 \\times 10^{308}$\uff0c\u7cbe\u5ea6\uff1a$\\approx 15$\u4f4d\u5341\u8fdb\u5236\u6570\u5b57\u3002\n- **float16**\uff08\u534a\u7cbe\u5ea6\uff09\uff1a1 + 5 + 10 = 16\u4f4d\u3002\u8303\u56f4\u548c\u7cbe\u5ea6\u6709\u9650\uff0c\u4f46\u4f7f\u7528\u4e00\u534a\u7684\u5185\u5b58\u548c\u5e26\u5bbd\u3002\u5e7f\u6cdb\u7528\u4e8eML\u8bad\u7ec3\uff08\u6df7\u5408\u7cbe\u5ea6\uff0c\u7b2c6\u7ae0\uff09\u3002\n- **bfloat16**\uff1a1 + 8 + 7 = 16\u4f4d\u3002\u4e0efloat32\u76f8\u540c\u7684\u6307\u6570\u8303\u56f4\u4f46\u7cbe\u5ea6\u66f4\u4f4e\u3002\u7531Google\u4e13\u95e8\u4e3aML\u8bbe\u8ba1\uff1a\u5b8c\u6574\u7684\u6307\u6570\u8303\u56f4\u53ef\u9632\u6b62\u8bad\u7ec3\u671f\u95f4\u6ea2\u51fa\uff0c\u964d\u4f4e\u7684\u7cbe\u5ea6\u5bf9\u68af\u5ea6\u66f4\u65b0\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u3002\n \u6240\u6709\u8ba1\u7b97\u90fd\u53ef\u4ee5\u5f52\u7ed3\u4e3a\u903b\u8f91\u95e8\uff1a\u5b9e\u73b0\u5e03\u5c14\u8fd0\u7b97\uff08\u6765\u81ea\u6587\u4ef61\u7684\u547d\u9898\u903b\u8f91\uff09\u7684\u7269\u7406\u7535\u8def\u3002
\u57fa\u672c\u95e8\uff1a
\u534a\u52a0\u5668\u4f7f\u7528XOR\uff08\u548c\uff09\u548cAND\uff08\u8fdb\u4f4d\uff09\u76f8\u52a0\u4e24\u4e2a\u5355\u6bd4\u7279\u3002\u5168\u52a0\u5668\u76f8\u52a0\u4e24\u4e2a\u6bd4\u7279\u52a0\u4e0a\u4e00\u4e2a\u8fdb\u4f4d\u8f93\u5165\uff0c\u53ef\u4ee5\u4e32\u8054\u8d77\u6765\u521b\u5efa\\(n\\)\u4f4d\u52a0\u6cd5\u5668\u3002\u8fd9\u5c31\u662fCPU\u6267\u884c\u6574\u6570\u52a0\u6cd5\u7684\u65b9\u5f0f\uff1a\u4e00\u7cfb\u5217\u7b80\u5355\u903b\u8f91\u95e8\u7684\u7ea7\u8054\u3002
\u591a\u8def\u9009\u62e9\u5668\uff08MUX\uff09\u6839\u636e\u63a7\u5236\u4fe1\u53f7\u4ece\u591a\u4e2a\u8f93\u5165\u4e2d\u9009\u62e9\u4e00\u4e2a\u3002\u4f7f\u7528\\(n\\)\u4e2a\u63a7\u5236\u4f4d\uff0c\u53ef\u4ee5\u4ece\\(2^n\\)\u4e2a\u8f93\u5165\u4e2d\u9009\u62e9\u3002\u591a\u8def\u9009\u62e9\u5668\u662fif-else\u94fe\u7684\u786c\u4ef6\u7b49\u4ef7\u7269\uff0c\u5e7f\u6cdb\u7528\u4e8eCPU\u6570\u636e\u901a\u8def\u4e2d\u8def\u7531\u6570\u636e\u3002
\u73b0\u4ee3\u5904\u7406\u5668\u5305\u542b\u6570\u5341\u4ebf\u4e2a\u6676\u4f53\u7ba1\uff0c\u6bcf\u4e2a\u6676\u4f53\u7ba1\u5145\u5f53\u4e00\u4e2a\u5fae\u5c0f\u7684\u5f00\u5173\u3002\u6676\u4f53\u7ba1\u8981\u4e48\u5bfc\u901a\uff08\u5bfc\u7535\uff0c\u8868\u793a1\uff09\uff0c\u8981\u4e48\u4e0d\u5bfc\u901a\uff08\u4e0d\u5bfc\u7535\uff0c\u8868\u793a0\uff09\u3002\u95e8\u7531\u6676\u4f53\u7ba1\u6784\u6210\uff0c\u52a0\u6cd5\u5668\u7531\u95e8\u6784\u6210\uff0cALU\u7531\u52a0\u6cd5\u5668\u6784\u6210\uff0cCPU\u7531ALU\u6784\u6210\u3002\u6574\u4e2a\u8ba1\u7b97\u5c42\u7ea7\u5c31\u5efa\u7acb\u5728\u8fd9\u4e2a\u57fa\u7840\u4e4b\u4e0a\u3002
\u4e2d\u592e\u5904\u7406\u5668\uff08CPU\uff09\u6267\u884c\u6307\u4ee4\u3002\u5176\u6838\u5fc3\u7ec4\u4ef6\uff1a
ALU\uff08\u7b97\u672f\u903b\u8f91\u5355\u5143\uff09\uff1a\u6267\u884c\u6574\u6570\u7b97\u672f\uff08\u52a0\u3001\u51cf\u3001\u4e58\uff09\u548c\u903b\u8f91\u8fd0\u7b97\uff08AND\u3001OR\u3001XOR\u3001\u79fb\u4f4d\uff09\u3002\u8fd9\u91cc\u662f\u5b9e\u9645\u8ba1\u7b97\u53d1\u751f\u7684\u5730\u65b9\uff0c\u7531\u4e0a\u8ff0\u903b\u8f91\u95e8\u6784\u5efa\u800c\u6210\u3002
\u5bc4\u5b58\u5668\uff1aCPU\u5185\u90e8\u5fae\u5c0f\u3001\u8d85\u5feb\u7684\u5b58\u50a8\u4f4d\u7f6e\u3002\u73b0\u4ee3CPU\u6709\u6570\u5341\u4e2a\u901a\u7528\u5bc4\u5b58\u5668\uff0c\u6bcf\u4e2a\u5bc4\u5b58\u5668\u4fdd\u5b58\u4e00\u4e2a\u5b57\uff08\u572864\u4f4dCPU\u4e0a\u4e3a64\u4f4d\uff09\u3002\u5bc4\u5b58\u5668\u662f\u7cfb\u7edf\u4e2d\u901f\u5ea6\u6700\u5feb\u7684\u5b58\u50a8\u5668\uff1a\u8bbf\u95ee\u65f6\u95f4\u7ea6~0.3\u7eb3\u79d2\u3002
\u7a0b\u5e8f\u8ba1\u6570\u5668\uff08PC\uff09\uff1a\u4fdd\u5b58\u4e0b\u4e00\u6761\u8981\u6267\u884c\u6307\u4ee4\u7684\u5185\u5b58\u5730\u5740\u3002
\u63a7\u5236\u5355\u5143\uff1a\u89e3\u7801\u6307\u4ee4\u5e76\u7f16\u6392\u6570\u636e\u901a\u8def\uff0c\u544a\u8bc9ALU\u6267\u884c\u4ec0\u4e48\u64cd\u4f5c\u4ee5\u53ca\u4f7f\u7528\u54ea\u4e9b\u5bc4\u5b58\u5668\u3002
\u6307\u4ee4\u5468\u671f\uff08\u53d6\u6307-\u8bd1\u7801-\u6267\u884c\uff09\u6bcf\u79d2\u91cd\u590d\u6570\u5341\u4ebf\u6b21\uff1a
\u8fd0\u884c\u57284 GHz\u7684CPU\u6bcf\u79d2\u6267\u884c40\u4ebf\u4e2a\u5468\u671f\u3002\u6bcf\u4e2a\u5468\u671f\u8017\u65f60.25\u7eb3\u79d2\u3002\u5728\u8fd9\u6bb5\u65f6\u95f4\u5185\uff0c\u5149\u4f20\u64ad\u7ea67.5\u5398\u7c73\uff0c\u8fd9\u5c31\u662f\u82af\u7247\u7269\u7406\u5927\u5c0f\u91cd\u8981\u7684\u539f\u56e0\uff1a\u4fe1\u53f7\u65e0\u6cd5\u5728\u4e00\u4e2a\u5468\u671f\u5185\u7a7f\u8fc7\u5927\u82af\u7247\u3002
\u6307\u4ee4\u96c6\u67b6\u6784\uff08ISA\uff09\u662f\u786c\u4ef6\u548c\u8f6f\u4ef6\u4e4b\u95f4\u7684\u5951\u7ea6\uff1a\u5b83\u5b9a\u4e49\u4e86CPU\u80fd\u7406\u89e3\u7684\u6307\u4ee4\u3001\u5bc4\u5b58\u5668\u96c6\u3001\u5185\u5b58\u6a21\u578b\u548c\u7f16\u7801\u683c\u5f0f\u3002
CISC\uff08\u590d\u6742\u6307\u4ee4\u96c6\u8ba1\u7b97\u673a\uff09\uff1a\u6307\u4ee4\u53ef\u4ee5\u590d\u6742\u3001\u53d8\u957f\uff0c\u5e76\u53ef\u4ee5\u76f4\u63a5\u8bbf\u95ee\u5185\u5b58\u3002\u4e00\u6761\u6307\u4ee4\u53ef\u4ee5\u4e58\u6cd5\u4e24\u4e2a\u5185\u5b58\u503c\u5e76\u5b58\u50a8\u7ed3\u679c\u3002x86\uff08Intel/AMD\uff09\u662f\u5360\u4e3b\u5bfc\u5730\u4f4d\u7684CISC ISA\uff0c\u9a71\u52a8\u7740\u5927\u591a\u6570\u684c\u9762\u548c\u670d\u52a1\u5668\u3002\u5176\u5411\u540e\u517c\u5bb9\u6027\uff08\u73b0\u4ee3x86 CPU\u4ecd\u7136\u8fd0\u884c1980\u5e74\u4ee3\u7684\u4ee3\u7801\uff09\u65e2\u662f\u4f18\u52bf\u4e5f\u662f\u8d1f\u62c5\u3002
RISC\uff08\u7cbe\u7b80\u6307\u4ee4\u96c6\u8ba1\u7b97\u673a\uff09\uff1a\u6307\u4ee4\u7b80\u5355\u3001\u5b9a\u957f\uff0c\u4e14\u4ec5\u64cd\u4f5c\u5bc4\u5b58\u5668\u3002\u5185\u5b58\u8bbf\u95ee\u9700\u8981\u5355\u72ec\u7684\u52a0\u8f7d/\u5b58\u50a8\u6307\u4ee4\u3002\u66f4\u7b80\u5355\u7684\u6307\u4ee4\u53ef\u5b9e\u73b0\u66f4\u5feb\u7684\u65f6\u949f\u901f\u5ea6\u548c\u66f4\u6613\u5b9e\u73b0\u7684\u6d41\u6c34\u7ebf\u3002
CISC\u4e0eRISC\u7684\u533a\u522b\u5df2\u7ecf\u6a21\u7cca\uff1a\u73b0\u4ee3x86 CPU\u5185\u90e8\u5c06\u590d\u6742\u7684CISC\u6307\u4ee4\u89e3\u7801\u4e3a\u66f4\u7b80\u5355\u7684\u5fae\u64cd\u4f5c\uff08\u672c\u8d28\u4e0a\u662f\u5185\u90e8RISC\uff09\uff0c\u4ece\u800c\u83b7\u5f97\u4e24\u65b9\u9762\u7684\u4f18\u52bf\u3002
\u6d41\u6c34\u7ebf\u4f7f\u6307\u4ee4\u6267\u884c\u91cd\u53e0\uff0c\u5982\u540c\u88c5\u914d\u7ebf\u3002\u5f53\u6307\u4ee41\u5728\u6267\u884c\u65f6\uff0c\u6307\u4ee42\u5728\u8bd1\u7801\uff0c\u6307\u4ee43\u5728\u88ab\u53d6\u6307\u3002\u4e00\u4e2a5\u7ea7\u6d41\u6c34\u7ebf\uff08\u53d6\u6307\u3001\u8bd1\u7801\u3001\u6267\u884c\u3001\u8bbf\u5b58\u3001\u5199\u56de\uff09\u53ef\u4ee5\u540c\u65f6\u67095\u6761\u6307\u4ee4\u5728\u6267\u884c\u4e2d\u3002
\u541e\u5410\u91cf\u63a5\u8fd1\u6bcf\u5468\u671f\u4e00\u6761\u6307\u4ee4\uff08\u5c3d\u7ba1\u6bcf\u6761\u6307\u4ee4\u9700\u89815\u4e2a\u5468\u671f\u624d\u80fd\u5b8c\u6210\uff09\u3002\u8fd9\u4e0eML\u4e2d\u7684\u6d41\u6c34\u7ebf\u539f\u7406\u76f8\u540c\uff1a\u6570\u636e\u5e76\u884c\u6027\u4f7f\u8ba1\u7b97\u548c\u901a\u4fe1\u91cd\u53e0\uff08\u7b2c6\u7ae0\uff09\u3002
\u5192\u9669\u662f\u6d41\u6c34\u7ebf\u88ab\u7834\u574f\u7684\u60c5\u51b5\uff1a
\u6570\u636e\u5192\u9669\uff1a\u6307\u4ee42\u9700\u8981\u6307\u4ee41\u5c1a\u672a\u4ea7\u751f\u7684\u7ed3\u679c\u3002\"Add R1, R2, R3\"\u540e\u8ddf\"Sub R4, R1, R5\"\u2014\u2014\u7b2c\u4e8c\u6761\u6307\u4ee4\u9700\u8981R1\uff0c\u800c\u7b2c\u4e00\u6761\u6307\u4ee4\u4ecd\u5728\u8ba1\u7b97\u3002\u8f6c\u53d1\uff08\u65c1\u8def\uff09\u901a\u8fc7\u5c06\u7ed3\u679c\u76f4\u63a5\u4ece\u4e00\u7ea7\u6d41\u6c34\u7ebf\u8def\u7531\u5230\u53e6\u4e00\u7ea7\uff0c\u65e0\u9700\u7b49\u5f85\u5199\u56de\u9636\u6bb5\u6765\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u3002
\u63a7\u5236\u5192\u9669\uff1a\u5206\u652f\u6307\u4ee4\uff08if-else\uff09\u610f\u5473\u7740CPU\u5728\u5206\u652f\u89e3\u6790\u4e4b\u524d\u4e0d\u77e5\u9053\u5e94\u8be5\u53d6\u6307\u54ea\u6761\u4e0b\u4e00\u6761\u6307\u4ee4\u3002\u5206\u652f\u9884\u6d4b\u731c\u6d4b\u5206\u652f\u5c06\u8d70\u54ea\u6761\u8def\u5f84\uff0c\u5e76\u63a8\u6d4b\u6027\u5730\u6cbf\u9884\u6d4b\u8def\u5f84\u53d6\u6307\u3002\u73b0\u4ee3\u9884\u6d4b\u5668\u51c6\u786e\u7387\u8d85\u8fc795%\uff0c\u4f7f\u7528\u5386\u53f2\u8868\u548c\u7c7b\u4f3c\u795e\u7ecf\u7f51\u7edc\u7684\u6a21\u5f0f\u5339\u914d\u3002\u4e00\u6b21\u9884\u6d4b\u9519\u8bef\u4ee3\u4ef7\u7ea6~15\u4e2a\u5468\u671f\uff08\u6d41\u6c34\u7ebf\u5fc5\u987b\u88ab\u6e05\u7a7a\u5e76\u91cd\u542f\uff09\u3002
\u7ed3\u6784\u5192\u9669\uff1a\u4e24\u6761\u6307\u4ee4\u540c\u65f6\u9700\u8981\u76f8\u540c\u7684\u786c\u4ef6\u8d44\u6e90\uff08\u4f8b\u5982\uff0c\u90fd\u9700\u8981\u5185\u5b58\u7aef\u53e3\uff09\u3002\u901a\u8fc7\u590d\u5236\u8d44\u6e90\u6216\u63d2\u5165\u505c\u987f\u6765\u89e3\u51b3\u3002
\u5c42\u6b21\u7ed3\u6784\uff0c\u4ece\u6700\u5feb\u5230\u6700\u6162\uff1a
\u5bc4\u5b58\u5668\u548cRAM\u4e4b\u95f4\u7684\u901f\u5ea6\u5dee\u8ddd\u7ea6\u4e3a300\u500d\u3002\u5bc4\u5b58\u5668\u548c\u78c1\u76d8\u4e4b\u95f4\u7ea6\u4e3a30,000,000\u500d\u3002\u7f13\u5b58\u5c42\u6b21\u7ed3\u6784\u9690\u85cf\u4e86\u8fd9\u4e00\u5dee\u8ddd\uff1a\u5982\u679cCPU\u9700\u8981\u7684\u6570\u636e\u5728L1\u7f13\u5b58\u4e2d\uff08\u7f13\u5b58\u547d\u4e2d\uff09\uff0c\u8bbf\u95ee\u5f88\u5feb\u3002\u5982\u679c\u4e0d\u5728\uff08\u7f13\u5b58\u672a\u547d\u4e2d\uff09\uff0cCPU\u505c\u987f\uff0c\u540c\u65f6\u4ece\u66f4\u6162\u7684\u5c42\u7ea7\u83b7\u53d6\u6570\u636e\u3002
\u7f13\u5b58\u5173\u8054\u5ea6\u51b3\u5b9a\u5185\u5b58\u5730\u5740\u53ef\u4ee5\u5b58\u50a8\u5728\u7f13\u5b58\u4e2d\u7684\u4f4d\u7f6e\uff1a
\u7f13\u5b58\u4e00\u81f4\u6027\u786e\u4fdd\u6240\u6709CPU\u6838\u5fc3\u770b\u5230\u4e00\u81f4\u7684\u5185\u5b58\u89c6\u56fe\u3002\u5f53\u6838\u5fc31\u5199\u5165\u4e00\u4e2a\u6838\u5fc32\u5df2\u7f13\u5b58\u7684\u5185\u5b58\u5730\u5740\u65f6\uff0c\u4e00\u81f4\u6027\u534f\u8bae\uff08\u5982MESI\uff09\u4f1a\u4f7f\u6838\u5fc32\u7684\u526f\u672c\u5931\u6548\u6216\u66f4\u65b0\u3002\u8fd9\u5bf9\u5e76\u53d1\u7f16\u7a0b\uff08\u6587\u4ef64\uff09\u81f3\u5173\u91cd\u8981\uff0c\u4e5f\u662f\u5171\u4eab\u5185\u5b58\u5e76\u884c\u6027\u56f0\u96be\u7684\u539f\u56e0\u4e4b\u4e00\u3002
\u5bf9\u4e8eML\u4ece\u4e1a\u8005\uff0c\u5b58\u50a8\u5668\u5c42\u6b21\u7ed3\u6784\u89e3\u91ca\u4e86\u4e3a\u4ec0\u4e48\uff1a
\u865a\u62df\u5185\u5b58\u4f7f\u6bcf\u4e2a\u8fdb\u7a0b\u4eff\u4f5b\u62e5\u6709\u81ea\u5df1\u72ec\u7acb\u3001\u8fde\u7eed\u7684\u5927\u5185\u5b58\u7a7a\u95f4\uff0c\u5373\u4f7f\u7269\u7406RAM\u662f\u6709\u9650\u7684\u5e76\u5728\u8fdb\u7a0b\u95f4\u5171\u4eab\u3002
\u5730\u5740\u7a7a\u95f4\u88ab\u5212\u5206\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684\u9875\uff08\u901a\u5e38\u4e3a4 KB\uff09\u3002\u9875\u8868\u5c06\u865a\u62df\u9875\u53f7\u6620\u5c04\u5230\u7269\u7406\u5e27\u53f7\u3002\u5f53\u7a0b\u5e8f\u8bbf\u95ee\u865a\u62df\u5730\u57400x1234\u65f6\uff0cCPU\u901a\u8fc7\u67e5\u627e\u9875\u8868\u5c06\u5176\u8f6c\u6362\u4e3a\u7269\u7406\u5730\u5740\u3002
\u8f6c\u8bd1\u540e\u5907\u7f13\u51b2\u5668\uff08TLB\uff09\u662f\u9875\u8868\u9879\u7684\u7f13\u5b58\u3002\u7531\u4e8e\u9875\u8868\u4f4d\u4e8eRAM\u4e2d\uff08\u6162\u901f\uff09\uff0cTLB\u5728\u5feb\u901f\u786c\u4ef6\u4e2d\u5b58\u50a8\u6700\u8fd1\u4f7f\u7528\u7684\u8f6c\u8bd1\u7ed3\u679c\u3002TLB\u672a\u547d\u4e2d\u9700\u8981\u904d\u5386\u5185\u5b58\u4e2d\u7684\u9875\u8868\uff0c\u8017\u8d39\u6570\u767e\u4e2a\u5468\u671f\u3002
\u5f53\u7a0b\u5e8f\u8bbf\u95ee\u4e00\u4e2a\u4e0d\u5728\u7269\u7406RAM\u4e2d\u7684\u9875\u65f6\uff0c\u53d1\u751f\u7f3a\u9875\u3002OS\u4ece\u78c1\u76d8\u52a0\u8f7d\u8be5\u9875\uff08\u4ea4\u6362\uff09\uff0c\u8017\u8d39\u6570\u767e\u4e07\u4e2a\u5468\u671f\u3002\u8fc7\u591a\u7684\u7f3a\u9875\uff08\u7cfb\u7edf\u98a0\u7c38\uff09\u4f1a\u4e25\u91cd\u635f\u5bb3\u6027\u80fd\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48ML\u8bad\u7ec3\u9700\u8981\u8db3\u591f\u7684RAM\u6765\u5bb9\u7eb3\u6a21\u578b\u3001\u4f18\u5316\u5668\u72b6\u6001\u548c\u5408\u7406\u7684\u6570\u636e\u6279\u6b21\u3002
\u9875\u9762\u7f6e\u6362\u7b97\u6cd5\u51b3\u5b9a\u5f53RAM\u6ee1\u65f6\u5e94\u6362\u51fa\u54ea\u4e2a\u9875\u9762\uff1a
\u865a\u62df\u5185\u5b58\u8fd8\u63d0\u4f9b\u4e86\u9694\u79bb\uff1a\u6bcf\u4e2a\u8fdb\u7a0b\u90fd\u6709\u81ea\u5df1\u7684\u865a\u62df\u5730\u5740\u7a7a\u95f4\u3002\u4e00\u4e2a\u8fdb\u7a0b\u4e2d\u7684\u9519\u8bef\u4e0d\u4f1a\u7834\u574f\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u7684\u5185\u5b58\uff0c\u56e0\u4e3a\u5b83\u4eec\u7684\u865a\u62df\u5730\u5740\u6620\u5c04\u5230\u4e0d\u540c\u7684\u7269\u7406\u5e27\u3002\u8fd9\u662fOS\u5b89\u5168\u6027\u548c\u7a33\u5b9a\u6027\u7684\u57fa\u7840\u3002
CPU\u9700\u8981\u4e0e\u5916\u90e8\u4e16\u754c\u901a\u4fe1\uff1a\u78c1\u76d8\u3001\u7f51\u5361\u3001\u952e\u76d8\u3001GPU\u3002\u8fd9\u5c31\u662fI/O\u5b50\u7cfb\u7edf\u3002
\u7a0b\u5e8f\u63a7\u5236I/O\uff08\u8f6e\u8be2\uff09\uff1aCPU\u5728\u4e00\u4e2a\u5faa\u73af\u4e2d\u53cd\u590d\u68c0\u67e5\u8bbe\u5907\u7684\u72b6\u6001\u5bc4\u5b58\u5668\uff0c\u7b49\u5f85\u6570\u636e\u5c31\u7eea\u3002\u7b80\u5355\u4f46\u6d6a\u8d39CPU\u5468\u671f\u505a\u7a7a\u8f6c\u800c\u4e0d\u662f\u6709\u7528\u5de5\u4f5c\u3002
\u4e2d\u65ad\u9a71\u52a8I/O\uff1a\u8bbe\u5907\u5728\u6570\u636e\u5c31\u7eea\u65f6\u53d1\u9001\u4e00\u4e2a\u786c\u4ef6\u4e2d\u65ad\u3002CPU\u7ee7\u7eed\u6b63\u5e38\u6267\u884c\u76f4\u5230\u4e2d\u65ad\u5230\u8fbe\uff0c\u7136\u540e\u8fd0\u884c\u4e00\u4e2a\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\uff08\u5185\u6838\u51fd\u6570\uff09\u6765\u5904\u7406\u6570\u636e\u3002\u8fd9\u6bd4\u8f6e\u8be2\u9ad8\u6548\u5f97\u591a\uff0c\u56e0\u4e3aCPU\u5728\u7b49\u5f85\u65f6\u4e0d\u4f1a\u7a7a\u95f2\u3002
\u4e2d\u65ad\u673a\u5236\uff1a
\u8fd9\u4e0e\u4e0a\u4e0b\u6587\u5207\u6362\uff08\u6587\u4ef63\uff09\u7684\u4fdd\u5b58/\u6062\u590d\u6a21\u5f0f\u76f8\u540c\uff0c\u4f46\u7531\u786c\u4ef6\u800c\u975e\u5b9a\u65f6\u5668\u89e6\u53d1\u3002
DMA\uff08\u76f4\u63a5\u5b58\u50a8\u5668\u8bbf\u95ee\uff09\uff1a\u5bf9\u4e8e\u5927\u6570\u636e\u4f20\u8f93\uff08\u78c1\u76d8\u8bfb\u53d6\u3001\u7f51\u7edc\u6570\u636e\u5305\u3001GPU\u5185\u5b58\u590d\u5236\uff09\uff0c\u8ba9CPU\u9010\u5b57\u8282\u590d\u5236\u6570\u636e\u662f\u6d6a\u8d39\u7684\u3002DMA\u63a7\u5236\u5668\u76f4\u63a5\u5728\u8bbe\u5907\u548cRAM\u4e4b\u95f4\u4f20\u8f93\u6570\u636e\uff0c\u65e0\u9700CPU\u53c2\u4e0e\u3002CPU\u8bbe\u7f6e\u4f20\u8f93\uff08\u6e90\u5730\u5740\u3001\u76ee\u6807\u5730\u5740\u3001\u5927\u5c0f\uff09\uff0cDMA\u63a7\u5236\u5668\u5904\u7406\u4f20\u8f93\uff0c\u5b8c\u6210\u540eCPU\u6536\u5230\u4e00\u4e2a\u4e2d\u65ad\u3002
DMA\u5bf9ML\u81f3\u5173\u91cd\u8981\uff1a\u5f53\u4f60\u8c03\u7528 model.to('cuda') \u65f6\uff0c\u6570\u636e\u901a\u8fc7PCIe\u603b\u7ebf\u4e0a\u7684DMA\u4ece\u7cfb\u7edfRAM\u4f20\u8f93\u5230GPU\u5185\u5b58\u3002\u5728\u8bad\u7ec3\u671f\u95f4\uff0c\u8de8GPU\u7684\u68af\u5ea6\u540c\u6b65\u4f7f\u7528\u57fa\u4e8eDMA\u7684RDMA\uff08\u8fdc\u7a0bDMA\uff09\u8fdb\u884c\u9ad8\u5e26\u5bbd\u3001\u4f4e\u5ef6\u8fdf\u4f20\u8f93\uff08\u7b2c6\u7ae0\uff09\u3002
\u603b\u7ebf\u5c06CPU\u8fde\u63a5\u5230\u5185\u5b58\u548cI/O\u8bbe\u5907\u3002\u73b0\u4ee3\u7cfb\u7edf\u4f7f\u7528PCIe\uff08\u5feb\u901f\u5916\u8bbe\u7ec4\u4ef6\u4e92\u8fde\uff09\u8fde\u63a5\u9ad8\u901f\u8bbe\u5907\uff08GPU\u3001NVMe SSD\u3001\u7f51\u5361\uff09\u3002PCIe 4.0\u5728\u6bcf\u4e2ax16\u63d2\u69fd\u4e0a\u63d0\u4f9b\u7ea6~32 GB/s\uff1bPCIe 5.0\u5c06\u5176\u7ffb\u500d\u3002\u603b\u7ebf\u5e26\u5bbd\u901a\u5e38\u662fGPU\u8bad\u7ec3\u7684\u74f6\u9888\uff1aGPU\u7684\u8ba1\u7b97\u901f\u5ea6\u53ef\u80fd\u5feb\u4e8e\u6570\u636e\u9001\u8fbe\u7684\u901f\u5ea6\u3002
MMIO\uff08\u5185\u5b58\u6620\u5c04I/O\uff09\uff1a\u8bbe\u5907\u5bc4\u5b58\u5668\u88ab\u6620\u5c04\u5230\u5185\u5b58\u5730\u5740\u3002CPU\u4f7f\u7528\u666e\u901a\u7684\u52a0\u8f7d/\u5b58\u50a8\u6307\u4ee4\u5bf9\u8fd9\u4e9b\u5730\u5740\u8fdb\u884c\u8bfb\u5199\uff0c\u786c\u4ef6\u5c06\u8bbf\u95ee\u8def\u7531\u5230\u8bbe\u5907\u800c\u4e0d\u662fRAM\u3002\u8fd9\u7edf\u4e00\u4e86\u5185\u5b58\u548cI/O\u8bbf\u95ee\u4e3a\u4e00\u4e2a\u5355\u4e00\u673a\u5236\uff0c\u7b80\u5316\u4e86\u786c\u4ef6\u548c\u8f6f\u4ef6\u3002
\u63a2\u7d22IEEE 754\u6d6e\u70b9\u6570\u8868\u793a\u3002\u5c06\u6d6e\u70b9\u6570\u8f6c\u6362\u4e3a\u4e8c\u8fdb\u5236\u8868\u793a\uff0c\u89c2\u5bdf\u7b26\u53f7\u3001\u6307\u6570\u548c\u5c3e\u6570\u5b57\u6bb5\u3002
import struct\n\ndef float_to_bits(f):\n \"\"\"\u663e\u793afloat32\u7684IEEE 754\u4e8c\u8fdb\u5236\u8868\u793a\u3002\"\"\"\n packed = struct.pack('>f', f)\n bits = ''.join(f'{byte:08b}' for byte in packed)\n sign = bits[0]\n exponent = bits[1:9]\n mantissa = bits[9:]\n return sign, exponent, mantissa\n\nfor val in [1.0, -1.0, 0.1, 0.5, 3.14, float('inf'), float('nan')]:\n s, e, m = float_to_bits(val)\n print(f\"{val:>10} sign={s} exp={e} ({int(e, 2) - 127:>4d}) mantissa={m[:10]}...\")\n \u6a21\u62df\u76f4\u63a5\u6620\u5c04\u7f13\u5b58\u3002\u8ddf\u8e2a\u4e00\u7cfb\u5217\u5185\u5b58\u8bbf\u95ee\u7684\u547d\u4e2d\u4e0e\u672a\u547d\u4e2d\u3002
def simulate_cache(accesses, cache_size=8, block_size=1):\n \"\"\"\u6a21\u62df\u76f4\u63a5\u6620\u5c04\u7f13\u5b58\u3002\"\"\"\n cache = [None] * cache_size\n hits, misses = 0, 0\n\n for addr in accesses:\n cache_line = addr % cache_size\n if cache[cache_line] == addr:\n hits += 1\n status = \"HIT \"\n else:\n misses += 1\n cache[cache_line] = addr\n status = \"MISS\"\n print(f\" Access {addr:3d} \u2192 line {cache_line}: {status}\")\n\n print(f\"\\nHits: {hits}, Misses: {misses}, Hit rate: {hits/(hits+misses):.1%}\")\n\n# \u987a\u5e8f\u8bbf\u95ee\uff08\u826f\u597d\u7684\u5c40\u90e8\u6027\uff09\nprint(\"\u987a\u5e8f\u8bbf\u95ee\uff1a\")\nsimulate_cache([0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3])\n\n# \u8de8\u6b65\u8bbf\u95ee\uff08\u51b2\u7a81\u672a\u547d\u4e2d\uff09\nprint(\"\\n\u8de8\u6b65\u8bbf\u95ee\uff08stride = cache size\uff09\uff1a\")\nsimulate_cache([0, 8, 0, 8, 0, 8])\n \u6f14\u793a\u4e3a\u4ec0\u4e48\u6d6e\u70b9\u7b97\u672f\u4e0d\u6ee1\u8db3\u7ed3\u5408\u5f8b\u3002\u5c55\u793a \\((a + b) + c \\neq a + (b + c)\\) \u7684\u60c5\u51b5\u3002
import jax.numpy as jnp\n\na = jnp.float32(1e8)\nb = jnp.float32(1.0)\nc = jnp.float32(-1e8)\n\nleft = (a + b) + c # (1e8 + 1) + (-1e8)\nright = a + (b + c) # 1e8 + (1 + (-1e8))\n\nprint(f\"(a + b) + c = {left}\") # \u5e94\u4e3a 1.0\nprint(f\"a + (b + c) = {right}\") # \u53ef\u80fd\u4f1a\u4e22\u5931 1.0\nprint(f\"Equal: {left == right}\")\nprint(f\"\\n\u5f53 1.0 \u52a0\u5230 1e8 \u4e0a\u65f6\u88ab\u4e22\u5931\uff0c\u56e0\u4e3a float32 \u53ea\u6709\u7ea6 7 \u4f4d\u7cbe\u5ea6\")\n \u64cd\u4f5c\u7cfb\u7edf\u662f\u786c\u4ef6\u4e0e\u5e94\u7528\u7a0b\u5e8f\u4e4b\u95f4\u7684\u8f6f\u4ef6\u5c42\uff0c\u8d1f\u8d23\u7ba1\u7406\u8d44\u6e90\u3001\u63d0\u4f9b\u62bd\u8c61\u5e76\u5b9e\u65bd\u9694\u79bb\u3002\u672c\u6587\u6db5\u76d6\u64cd\u4f5c\u7cfb\u7edf\u7684\u529f\u80fd\u3001\u8fdb\u7a0b\u3001\u7ebf\u7a0b\u3001CPU\u8c03\u5ea6\u3001\u5185\u5b58\u7ba1\u7406\u3001\u6587\u4ef6\u7cfb\u7edf\u548c\u7cfb\u7edf\u8c03\u7528\u3002
\u6ca1\u6709\u64cd\u4f5c\u7cfb\u7edf\u7684\u8ba1\u7b97\u673a\u5c31\u50cf\u4e00\u4e2a\u6ca1\u6709\u53a8\u5e08\u7684\u53a8\u623f\uff1a\u98df\u6750\uff08\u786c\u4ef6\uff09\u90fd\u5728\u90a3\u91cc\uff0c\u4f46\u6ca1\u6709\u4eba\u534f\u8c03\u8c01\u4f7f\u7528\u7089\u7076\u3001\u9910\u5177\u653e\u5728\u54ea\u91cc\u3001\u6216\u8005\u5982\u4f55\u9632\u6b62\u4e24\u4e2a\u4eba\u540c\u65f6\u6293\u540c\u4e00\u628a\u5200\u3002OS\u5c31\u662f\u90a3\u4e2a\u534f\u8c03\u8005\u3002
\u5bf9\u4e8eML\u4ece\u4e1a\u8005\uff0c\u64cd\u4f5c\u7cfb\u7edf\u7684\u6982\u5ff5\u89e3\u91ca\u4e86\uff1a\u4e3a\u4ec0\u4e48 nvidia-smi \u663e\u793a\u6bcf\u4e2a\u8fdb\u7a0b\u7684GPU\u5185\u5b58\u4f7f\u7528\u91cf\u3001\u4e3a\u4ec0\u4e48\u8bad\u7ec3\u56e0\"\u5185\u5b58\u4e0d\u8db3\"\u800c\u5d29\u6e83\u3001\u4e3a\u4ec0\u4e48 fork() \u4f1a\u590d\u5236\u4f60\u7684Python\u8fdb\u7a0b\u3001\u4ee5\u53ca\u4e3a\u4ec0\u4e48Docker\u5bb9\u5668\u63d0\u4f9b\u9694\u79bb\u73af\u5883\u3002
OS\u6709\u4e09\u4e2a\u6838\u5fc3\u804c\u8d23\uff1a
\u62bd\u8c61\uff1a\u5c06\u786c\u4ef6\u590d\u6742\u6027\u9690\u85cf\u5728\u7b80\u6d01\u7684\u63a5\u53e3\u4e4b\u540e\u3002\u7a0b\u5e8f\u8bfb\u5199\"\u6587\u4ef6\"\u800c\u65e0\u9700\u77e5\u9053\u5e95\u5c42\u5b58\u50a8\u662fSSD\u3001HDD\u8fd8\u662f\u7f51\u7edc\u9a71\u52a8\u5668\u3002\u5b83\u4eec\u5206\u914d\"\u5185\u5b58\"\u800c\u65e0\u9700\u7ba1\u7406\u7269\u7406RAM\u82af\u7247\u3002\u5b83\u4eec\u5728\"CPU\"\u4e0a\u8fd0\u884c\u800c\u65e0\u9700\u62c5\u5fc3\u4e2d\u65ad\u548c\u7f13\u5b58\u4e00\u81f4\u6027\u3002
\u8d44\u6e90\u7ba1\u7406\uff1a\u591a\u4e2a\u7a0b\u5e8f\u5171\u4eabCPU\u3001\u5185\u5b58\u3001\u78c1\u76d8\u548c\u7f51\u7edc\u3002OS\u51b3\u5b9a\u8c01\u83b7\u5f97\u4ec0\u4e48\u8d44\u6e90\u3001\u4f55\u65f6\u83b7\u5f97\u3001\u83b7\u5f97\u591a\u4e45\u3002\u516c\u5e73\u9ad8\u6548\u7684\u5206\u914d\u7b56\u7565\u4fdd\u6301\u7cfb\u7edf\u7684\u54cd\u5e94\u6027\u3002
\u9694\u79bb\u4e0e\u4fdd\u62a4\uff1a\u7a0b\u5e8f\u4e4b\u95f4\u4e0d\u5f97\u76f8\u4e92\u5e72\u6270\u3002\u6d4f\u89c8\u5668\u4e2d\u7684Bug\u4e0d\u5e94\u5bfc\u81f4\u5185\u6838\u5d29\u6e83\u3002\u6076\u610f\u7a0b\u5e8f\u4e0d\u5e94\u8bfb\u53d6\u53e6\u4e00\u4e2a\u7a0b\u5e8f\u7684\u5bc6\u7801\u3002OS\u5229\u7528\u786c\u4ef6\u652f\u6301\uff08\u7279\u6743\u7ea7\u3001\u865a\u62df\u5185\u5b58\uff09\u5f3a\u5236\u5b9e\u65bd\u8fb9\u754c\u3002
\u8fdb\u7a0b\u662f\u6b63\u5728\u8fd0\u884c\u7684\u7a0b\u5e8f\u3002\u5b83\u662fOS\u7684\u57fa\u672c\u5de5\u4f5c\u5355\u5143\u3002\u6bcf\u4e2a\u8fdb\u7a0b\u90fd\u6709\uff1a
\u8fdb\u7a0b\u63a7\u5236\u5757\uff08PCB\uff09\u662fOS\u7528\u4e8e\u8ddf\u8e2a\u8fdb\u7a0b\u7684\u6570\u636e\u7ed3\u6784\u3002\u5b83\u5b58\u50a8\u8fdb\u7a0bID\uff08PID\uff09\u3001\u72b6\u6001\u3001\u7a0b\u5e8f\u8ba1\u6570\u5668\u3001\u5bc4\u5b58\u5668\u5185\u5bb9\u3001\u5185\u5b58\u6620\u5c04\u3001\u6253\u5f00\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26\u548c\u8c03\u5ea6\u4f18\u5148\u7ea7\u3002\u5f53OS\u4ece\u4e00\u4e2a\u8fdb\u7a0b\u5207\u6362\u5230\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u65f6\uff0c\u5b83\u5c06\u5f53\u524d\u8fdb\u7a0b\u7684\u72b6\u6001\u4fdd\u5b58\u5230\u5176PCB\u4e2d\uff0c\u5e76\u52a0\u8f7d\u4e0b\u4e00\u4e2a\u8fdb\u7a0b\u7684\u72b6\u6001\u3002\u8fd9\u5c31\u662f\u4e0a\u4e0b\u6587\u5207\u6362\u3002
\u4e0a\u4e0b\u6587\u5207\u6362\u4ee3\u4ef7\u9ad8\u6602\uff1a\u4fdd\u5b58\u548c\u6062\u590d\u5bc4\u5b58\u5668\u3001\u5237\u65b0\u7f13\u5b58\u3001\u4f7fTLB\u9879\u5931\u6548\u9700\u8981\u5fae\u79d2\u7ea7\u65f6\u95f4\u3002\u5728\u4e00\u4e2a\u8fd0\u884c\u6570\u5343\u4e2a\u8fdb\u7a0b\u7684\u7cfb\u7edf\u4e2d\uff0c\u5f00\u9500\u53ef\u80fd\u5f88\u5927\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6bcf\u8fdb\u7a0b\u6bcf\u8bf7\u6c42\u7684\u670d\u52a1\u5668\u67b6\u6784\uff08\u5982\u8001\u5f0fApache\uff09\u88ab\u57fa\u4e8e\u7ebf\u7a0b\u6216\u4e8b\u4ef6\u9a71\u52a8\u7684\u67b6\u6784\u53d6\u4ee3\u3002
Unix\u4e2d\u7684\u8fdb\u7a0b\u521b\u5efa\u4f7f\u7528 fork() \u548c exec()\uff1a
fork() \u521b\u5efa\u5f53\u524d\u8fdb\u7a0b\u7684\u4e00\u4e2a\u526f\u672c\u3002\u5b50\u8fdb\u7a0b\u83b7\u5f97\u7236\u8fdb\u7a0b\u5185\u5b58\u3001\u6587\u4ef6\u63cf\u8ff0\u7b26\u548c\u72b6\u6001\u7684\u4e00\u4efd\u526f\u672c\u3002\u4e24\u4e2a\u8fdb\u7a0b\u4ece\u540c\u4e00\u70b9\u7ee7\u7eed\u6267\u884c\uff0c\u4f46 fork() \u5728\u5b50\u8fdb\u7a0b\u4e2d\u8fd4\u56de0\uff0c\u5728\u7236\u8fdb\u7a0b\u4e2d\u8fd4\u56de\u5b50\u8fdb\u7a0b\u7684PID\u3002
exec() \u7528\u65b0\u7a0b\u5e8f\u66ff\u6362\u5f53\u524d\u8fdb\u7a0b\u7684\u4ee3\u7801\u3002\u5728 fork() \u4e4b\u540e\uff0c\u5b50\u8fdb\u7a0b\u901a\u5e38\u8c03\u7528 exec() \u6765\u8fd0\u884c\u4e00\u4e2a\u4e0d\u540c\u7684\u7a0b\u5e8f\u3002
\u8fd9\u79cd\u5148fork\u540eexec\u7684\u6a21\u578b\u5f88\u4f18\u96c5\uff1a\u521b\u5efa\u65b0\u8fdb\u7a0b\uff08fork\uff09\u548c\u52a0\u8f7d\u65b0\u7a0b\u5e8f\uff08exec\uff09\u662f\u72ec\u7acb\u7684\u64cd\u4f5c\uff0c\u53ef\u4ee5\u5404\u81ea\u5b9a\u5236\u3002\u5728fork\u548cexec\u4e4b\u95f4\uff0c\u5b50\u8fdb\u7a0b\u53ef\u4ee5\u91cd\u5b9a\u5411I/O\u3001\u66f4\u6539\u73af\u5883\u53d8\u91cf\u6216\u964d\u4f4e\u6743\u9650\u3002
\u7ebf\u7a0b\u662f\u8fdb\u7a0b\u5185\u7684\u8f7b\u91cf\u7ea7\u6267\u884c\u5355\u5143\u3002\u8fdb\u7a0b\u5185\u7684\u6240\u6709\u7ebf\u7a0b\u5171\u4eab\u76f8\u540c\u7684\u4ee3\u7801\u3001\u6570\u636e\u548c\u5806\uff0c\u4f46\u6bcf\u4e2a\u7ebf\u7a0b\u6709\u81ea\u5df1\u7684\u5806\u6808\u548c\u5bc4\u5b58\u5668\u72b6\u6001\u3002
\u4e0e\u591a\u4e2a\u8fdb\u7a0b\u76f8\u6bd4\u7684\u4f18\u52bf\uff1a\u7ebf\u7a0b\u5171\u4eab\u5185\u5b58\uff0c\u56e0\u6b64\u5b83\u4eec\u4e4b\u95f4\u7684\u901a\u4fe1\u5f88\u5feb\uff08\u53ea\u9700\u8bfb\u5199\u5171\u4eab\u53d8\u91cf\uff09\u3002\u8fdb\u7a0b\u9700\u8981\u8fdb\u7a0b\u95f4\u901a\u4fe1\uff08\u7ba1\u9053\u3001\u5957\u63a5\u5b57\u3001\u5171\u4eab\u5185\u5b58\u6620\u5c04\uff09\uff0c\u8fd9\u66f4\u6162\u4e14\u66f4\u590d\u6742\u3002
\u52a3\u52bf\uff1a\u5171\u4eab\u5185\u5b58\u662f\u5371\u9669\u7684\u3002\u4e24\u4e2a\u7ebf\u7a0b\u540c\u65f6\u5199\u5165\u540c\u4e00\u53d8\u91cf\u4f1a\u5bfc\u81f4\u7ade\u6001\u6761\u4ef6\uff08\u7ed3\u679c\u53d6\u51b3\u4e8e\u54ea\u4e2a\u7ebf\u7a0b\u5148\u8fd0\u884c\uff09\u3002\u8fd9\u5f15\u5bfc\u6211\u4eec\u8fdb\u5165\u540c\u6b65\u95ee\u9898\uff0c\u5728\u6587\u4ef64\u4e2d\u4ecb\u7ecd\u3002
\u5185\u6838\u7ebf\u7a0b\u7531OS\u8c03\u5ea6\u5668\u7ba1\u7406\u3002\u6bcf\u4e2a\u7ebf\u7a0b\u72ec\u7acb\u5730\u88ab\u8c03\u5ea6\u5230CPU\u6838\u5fc3\u4e0a\u3002\u521b\u5efa\u548c\u5207\u6362\u5185\u6838\u7ebf\u7a0b\u6d89\u53ca\u7cfb\u7edf\u8c03\u7528\uff0c\u5f00\u9500\u4e0e\u8fdb\u7a0b\u4e0a\u4e0b\u6587\u5207\u6362\u7c7b\u4f3c\uff08\u4f46\u66f4\u5c0f\uff09\u3002
\u7528\u6237\u7ebf\u7a0b\uff08\u7eff\u8272\u7ebf\u7a0b\uff09\u7531\u7528\u6237\u7a7a\u95f4\u7684\u8fd0\u884c\u65f6\u5e93\u7ba1\u7406\uff0c\u5bf9OS\u4e0d\u53ef\u89c1\u3002\u521b\u5efa\u548c\u5207\u6362\u5b83\u4eec\u7684\u6210\u672c\u66f4\u4f4e\uff08\u65e0\u9700\u7cfb\u7edf\u8c03\u7528\uff09\uff0c\u4f46\u4e00\u4e2a\u7528\u6237\u7ebf\u7a0b\u7684\u963b\u585e\u64cd\u4f5c\u4f1a\u963b\u585e\u8fdb\u7a0b\u4e2d\u7684\u6240\u6709\u7ebf\u7a0b\uff08\u56e0\u4e3aOS\u53ea\u770b\u5230\u4e00\u4e2a\u5185\u6838\u7ebf\u7a0b\uff09\u3002
\u73b0\u4ee3\u7cfb\u7edf\u4f7f\u7528\u6df7\u5408\u6a21\u578b\uff1a\u8bb8\u591a\u7528\u6237\u7ebf\u7a0b\u6620\u5c04\u5230\u8f83\u5c11\u6570\u91cf\u7684\u5185\u6838\u7ebf\u7a0b\u4e0a\uff08M:N\u7ebf\u7a0b\uff09\u3002Go\u7684goroutine\u548cErlang\u7684\u8fdb\u7a0b\u662f\u7531\u8bed\u8a00\u8fd0\u884c\u65f6\u8c03\u5ea6\u5230OS\u7ebf\u7a0b\u4e0a\u7684\u7528\u6237\u7ea7\u7ebf\u7a0b\u3002
\u7ebf\u7a0b\u6c60\u9884\u5148\u521b\u5efa\u56fa\u5b9a\u6570\u91cf\u7684\u7ebf\u7a0b\uff0c\u7b49\u5f85\u4efb\u52a1\u3002\u5f53\u4efb\u52a1\u5230\u8fbe\u65f6\uff0c\u5206\u914d\u7ed9\u4e00\u4e2a\u7a7a\u95f2\u7ebf\u7a0b\u3002\u8fd9\u907f\u514d\u4e86\u4e3a\u6bcf\u4e2a\u4efb\u52a1\u521b\u5efa\u548c\u9500\u6bc1\u7ebf\u7a0b\u7684\u5f00\u9500\u3002Web\u670d\u52a1\u5668\u3001\u6570\u636e\u5e93\u5f15\u64ce\u548cML\u63a8\u7406\u670d\u52a1\u5668\u90fd\u4f7f\u7528\u7ebf\u7a0b\u6c60\u3002
\u8c03\u5ea6\u5668\u51b3\u5b9a\u6bcf\u4e2a\u65f6\u523b\u54ea\u4e2a\u8fdb\u7a0b/\u7ebf\u7a0b\u5728\u54ea\u4e2aCPU\u6838\u5fc3\u4e0a\u8fd0\u884c\u3002\u76ee\u6807\u662f\uff1a\u6700\u5927\u5316CPU\u5229\u7528\u7387\u3001\u6700\u5c0f\u5316\u54cd\u5e94\u65f6\u95f4\uff08\u5bf9\u4ea4\u4e92\u5f0f\u4efb\u52a1\uff09\u3001\u6700\u5927\u5316\u541e\u5410\u91cf\uff08\u5bf9\u6279\u5904\u7406\u4efb\u52a1\uff09\u3001\u5e76\u786e\u4fdd\u516c\u5e73\u6027\u3002
\u5148\u6765\u5148\u670d\u52a1\uff08FCFS\uff09\uff1a\u8fdb\u7a0b\u6309\u5230\u8fbe\u987a\u5e8f\u8fd0\u884c\u3002\u7b80\u5355\u4f46\u5b58\u5728\u62a4\u822a\u6548\u5e94\uff1a\u4e00\u4e2a\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u8fdb\u7a0b\u963b\u585e\u4e86\u540e\u9762\u6240\u6709\u8f83\u77ed\u7684\u8fdb\u7a0b\u3002
\u6700\u77ed\u4f5c\u4e1a\u4f18\u5148\uff08SJF\uff09\uff1a\u8fd0\u884c\u6700\u77ed\u7684\u8fdb\u7a0b\u4f18\u5148\u3002\u53ef\u8bc1\u660e\u6700\u5c0f\u5316\u5e73\u5747\u7b49\u5f85\u65f6\u95f4\uff0c\u4f46\u9700\u8981\u9884\u5148\u77e5\u9053\u4f5c\u4e1a\u957f\u5ea6\uff08\u901a\u5e38\u4e0d\u53ef\u80fd\uff09\u3002\u5176\u62a2\u5360\u5f0f\u7248\u672c\u6700\u77ed\u5269\u4f59\u65f6\u95f4\u4f18\u5148\uff08SRTF\uff09\uff0c\u5982\u679c\u51fa\u73b0\u66f4\u77ed\u7684\u4f5c\u4e1a\u5219\u4e2d\u65ad\u6b63\u5728\u8fd0\u884c\u7684\u4f5c\u4e1a\u3002
\u8f6e\u8f6c\uff08RR\uff09\uff1a\u6bcf\u4e2a\u8fdb\u7a0b\u83b7\u5f97\u4e00\u4e2a\u56fa\u5b9a\u7684\u65f6\u95f4\u7247\uff08\u598210 ms\uff09\uff0c\u7136\u540e\u88ab\u62a2\u5360\u5e76\u79fb\u5230\u961f\u5217\u672b\u5c3e\u3002\u516c\u5e73\u4e14\u54cd\u5e94\u6027\u597d\uff0c\u4f46\u65f6\u95f4\u7247\u5927\u5c0f\u5f88\u91cd\u8981\uff1a\u592a\u5c0f\u4f1a\u5bfc\u81f4\u8fc7\u591a\u4e0a\u4e0b\u6587\u5207\u6362\uff0c\u592a\u5927\u5219\u4f1a\u9000\u5316\u4e3aFCFS\u3002
\u4f18\u5148\u7ea7\u8c03\u5ea6\uff1a\u6bcf\u4e2a\u8fdb\u7a0b\u6709\u4e00\u4e2a\u4f18\u5148\u7ea7\u3002\u9ad8\u4f18\u5148\u7ea7\u8fdb\u7a0b\u5148\u8fd0\u884c\u3002\u5371\u9669\u662f\u9965\u997f\uff1a\u5982\u679c\u9ad8\u4f18\u5148\u7ea7\u8fdb\u7a0b\u6e90\u6e90\u4e0d\u65ad\u5230\u6765\uff0c\u4f4e\u4f18\u5148\u7ea7\u8fdb\u7a0b\u53ef\u80fd\u6c38\u8fdc\u65e0\u6cd5\u8fd0\u884c\u3002\u8001\u5316\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\uff1a\u8fdb\u7a0b\u7b49\u5f85\u65f6\u95f4\u8d8a\u957f\uff0c\u5176\u4f18\u5148\u7ea7\u5c31\u8d8a\u9ad8\u3002
\u591a\u7ea7\u53cd\u9988\u961f\u5217\uff08MLFQ\uff09\uff1a\u5177\u6709\u4e0d\u540c\u4f18\u5148\u7ea7\u548c\u65f6\u95f4\u7247\u7684\u591a\u4e2a\u961f\u5217\u3002\u65b0\u8fdb\u7a0b\u4ece\u6700\u9ad8\u4f18\u5148\u7ea7\u961f\u5217\uff08\u77ed\u65f6\u95f4\u7247\uff09\u5f00\u59cb\u3002\u5982\u679c\u4e00\u4e2a\u8fdb\u7a0b\u7528\u5b8c\u5176\u65f6\u95f4\u7247\uff08CPU\u5bc6\u96c6\u578b\uff09\uff0c\u5b83\u88ab\u964d\u5230\u8f83\u4f4e\u4f18\u5148\u7ea7\u961f\u5217\uff08\u8f83\u957f\u65f6\u95f4\u7247\uff09\u3002\u4ea4\u4e92\u5f0f\u8fdb\u7a0b\u81ea\u7136\u505c\u7559\u5728\u9ad8\u4f18\u5148\u7ea7\u961f\u5217\u4e2d\uff08\u5b83\u4eec\u5728\u4f7f\u7528\u5b8c\u65f6\u95f4\u7247\u4e4b\u524d\u5c31\u56e0I/O\u963b\u585e\u4e86\uff09\u3002\u8fd9\u53ef\u4ee5\u9002\u5e94\u5de5\u4f5c\u8d1f\u8f7d\uff0c\u800c\u65e0\u9700\u9884\u5148\u4e86\u89e3\u4f5c\u4e1a\u7c7b\u578b\u3002
\u5b8c\u5168\u516c\u5e73\u8c03\u5ea6\u5668\uff08CFS\uff09\uff1aLinux\u8c03\u5ea6\u5668\u3002\u5b83\u7ef4\u62a4\u4e00\u68f5\u7ea2\u9ed1\u6811\uff08\u5e73\u8861\u4e8c\u53c9\u641c\u7d22\u6811\uff09\uff0c\u8fdb\u7a0b\u6309\"\u865a\u62df\u8fd0\u884c\u65f6\u95f4\"\uff08\u5b83\u4eec\u5df2\u7ecf\u6d88\u8017\u7684CPU\u65f6\u95f4\uff09\u6392\u5e8f\u3002\u5177\u6709\u6700\u5c0f\u865a\u62df\u8fd0\u884c\u65f6\u95f4\u7684\u8fdb\u7a0b\u63a5\u4e0b\u6765\u8fd0\u884c\u3002\u8fd9\u786e\u4fdd\u4e86\u968f\u7740\u65f6\u95f4\u7684\u63a8\u79fb\uff0c\u6bcf\u4e2a\u8fdb\u7a0b\u83b7\u5f97\u5176\u516c\u5e73\u4efd\u989d\u3002CFS\u6bcf\u6b21\u8c03\u5ea6\u51b3\u7b56\u8fd0\u884c\u65f6\u95f4\u4e3a \\(O(\\log n)\\)\u3002
OS\u7ba1\u7406\u7269\u7406RAM\uff0c\u5c06\u5176\u5206\u914d\u7ed9\u8fdb\u7a0b\u5e76\u5728\u4e0d\u518d\u9700\u8981\u65f6\u56de\u6536\u3002
\u5206\u9875\uff08\u6765\u81ea\u6587\u4ef62\uff09\u5c06\u865a\u62df\u5185\u5b58\u5212\u5206\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684\u9875\uff0c\u7269\u7406\u5185\u5b58\u5212\u5206\u4e3a\u5e27\u3002\u9875\u8868\u5c06\u9875\u6620\u5c04\u5230\u5e27\u3002\u5206\u9875\u6d88\u9664\u4e86\u5916\u90e8\u788e\u7247\uff08\u5206\u914d\u4e4b\u95f4\u7684\u6d6a\u8d39\u7a7a\u95f4\uff09\uff0c\u56e0\u4e3a\u6240\u6709\u9875\u9762\u5927\u5c0f\u76f8\u540c\u3002
\u8bf7\u6c42\u5206\u9875\u4ec5\u5728\u9996\u6b21\u8bbf\u95ee\u65f6\u5c06\u9875\u52a0\u8f7d\u5230RAM\u4e2d\uff08\u800c\u4e0d\u662f\u5728\u8fdb\u7a0b\u542f\u52a8\u65f6\uff09\u3002\u8fd9\u8282\u7701\u4e86\u5185\u5b58\uff1a\u4e00\u4e2a\u62e5\u67091 GB\u4ee3\u7801\u7684\u7a0b\u5e8f\u5728\u5178\u578b\u8fd0\u884c\u4e2d\u53ef\u80fd\u53ea\u4f7f\u752850 MB\u3002\u5176\u4f59\u90e8\u5206\u4ece\u672a\u88ab\u52a0\u8f7d\u3002
\u5f53RAM\u6ee1\u4e14\u9700\u8981\u65b0\u9875\u65f6\uff0cOS\u5fc5\u987b\u6362\u51fa\u4e00\u4e2a\u73b0\u6709\u9875\u9762\u3002\u9875\u9762\u7f6e\u6362\u7b97\u6cd5\uff08LRU\u3001FIFO\u3001\u65f6\u949f\uff0c\u6765\u81ea\u6587\u4ef62\uff09\u51b3\u5b9a\u6362\u51fa\u54ea\u4e2a\u9875\u9762\u3002\u597d\u7684\u7f6e\u6362\u6700\u5c0f\u5316\u7f3a\u9875\u6b21\u6570\uff1b\u574f\u7684\u7f6e\u6362\u5bfc\u81f4\u7cfb\u7edf\u98a0\u7c38\u3002
\u5206\u6bb5\u5c06\u5185\u5b58\u5212\u5206\u4e3a\u53ef\u53d8\u5927\u5c0f\u7684\u6bb5\uff08\u4ee3\u7801\u3001\u6570\u636e\u3001\u6808\u3001\u5806\uff09\uff0c\u6bcf\u4e2a\u6bb5\u6709\u81ea\u5df1\u7684\u57fa\u5730\u5740\u548c\u957f\u5ea6\u3002\u5206\u6bb5\u63d0\u4f9b\u903b\u8f91\u7ec4\u7ec7\uff0c\u800c\u5206\u9875\u63d0\u4f9b\u7269\u7406\u7ba1\u7406\u3002\u73b0\u4ee3\u7cfb\u7edf\u6700\u5c0f\u9650\u5ea6\u5730\u4f7f\u7528\u5206\u6bb5\uff08\u4e3b\u8981\u7528\u4e8e\u4fdd\u62a4\uff09\uff0c\u5e76\u4f9d\u8d56\u5206\u9875\u8fdb\u884c\u5185\u5b58\u7ba1\u7406\u3002
\u5806\u662f\u52a8\u6001\u5206\u914d\u5185\u5b58\u6240\u5728\u7684\u5730\u65b9\uff08C\u4e2d\u7684malloc/free\uff0cJava\u4e2d\u7684new\uff0cPython\u4e2d\u9690\u5f0f\u7ba1\u7406\uff09\u3002OS\u5411\u8fdb\u7a0b\u63d0\u4f9b\u5927\u5757\u5185\u5b58\uff0c\u5185\u5b58\u5206\u914d\u5668\uff08\u5982 glibc malloc\u3001jemalloc\u3001tcmalloc\uff09\u5c06\u8fd9\u4e9b\u5927\u5757\u7ec6\u5206\u4e3a\u66f4\u5c0f\u7684\u5206\u914d\u3002\u5206\u914d\u5668\u8bbe\u8ba1\u5f71\u54cd\u6027\u80fd\uff1a\u788e\u7247\u6d6a\u8d39\u7a7a\u95f4\uff0c\u7ebf\u7a0b\u95f4\u7684\u4e89\u7528\u6d6a\u8d39\u65f6\u95f4\u3002
\u6587\u4ef6\u7cfb\u7edf\u5c06\u6301\u4e45\u5b58\u50a8\uff08SSD\u3001HDD\uff09\u4e0a\u7684\u6570\u636e\u7ec4\u7ec7\u4e3a\u547d\u540d\u7684\u6587\u4ef6\u548c\u76ee\u5f55\u5c42\u6b21\u7ed3\u6784\u3002
inode\uff08\u7d22\u5f15\u8282\u70b9\uff09\u5b58\u50a8\u6587\u4ef6\u7684\u5143\u6570\u636e\uff1a\u5927\u5c0f\u3001\u6240\u6709\u6743\u3001\u6743\u9650\u3001\u65f6\u95f4\u6233\u4ee5\u53ca\u6307\u5411\u78c1\u76d8\u4e0a\u6570\u636e\u5757\u7684\u6307\u9488\u3002\u6587\u4ef6\u540d\u5b58\u50a8\u5728\u76ee\u5f55\u4e2d\uff0c\u76ee\u5f55\u5c06\u540d\u79f0\u6620\u5c04\u5230inode\u7f16\u53f7\u3002\u8fd9\u79cd\u5206\u79bb\u610f\u5473\u7740\u4e00\u4e2a\u6587\u4ef6\u53ef\u4ee5\u6709\u591a\u4e2a\u540d\u79f0\uff08\u786c\u94fe\u63a5\uff09\u6307\u5411\u540c\u4e00\u4e2ainode\u3002
FAT\uff08\u6587\u4ef6\u5206\u914d\u8868\uff09\uff1a\u4e00\u79cd\u7b80\u5355\u7684\u6587\u4ef6\u7cfb\u7edf\uff0c\u7528\u4e8eUSB\u9a71\u52a8\u5668\u548cSD\u5361\u3002\u4e00\u4e2a\u8868\u5c06\u6bcf\u4e2a\u7c07\uff08\u5757\uff09\u6620\u5c04\u5230\u6587\u4ef6\u4e2d\u7684\u4e0b\u4e00\u4e2a\u7c07\uff0c\u5f62\u6210\u4e00\u4e2a\u94fe\u8868\u3002\u7b80\u5355\u4f46\u4e0d\u597d\u652f\u6301\u6743\u9650\u3001\u65e5\u5fd7\u8bb0\u5f55\u6216\u5927\u6587\u4ef6\u3002
ext4\uff1a\u9ed8\u8ba4\u7684Linux\u6587\u4ef6\u7cfb\u7edf\u3002\u4f7f\u7528\u5e26\u6709\u76f4\u63a5\u3001\u95f4\u63a5\u3001\u4e8c\u7ea7\u95f4\u63a5\u548c\u4e09\u7ea7\u95f4\u63a5\u5757\u6307\u9488\u7684inode\u6765\u5904\u7406\u4efb\u4f55\u5927\u5c0f\u7684\u6587\u4ef6\u3002\u652f\u6301\u533a\u6bb5\uff08\u5757\u7684\u8fde\u7eed\u8303\u56f4\uff09\u4ee5\u9ad8\u6548\u5904\u7406\u5927\u6587\u4ef6\u3002\u6700\u5927\u6587\u4ef6\u5927\u5c0f\uff1a16 TB\uff0c\u6700\u5927\u5206\u533a\uff1a1 EB\u3002
\u65e5\u5fd7\u8bb0\u5f55\u9632\u6b62\u56e0\u5d29\u6e83\u800c\u635f\u574f\u3002\u5728\u4fee\u6539\u6587\u4ef6\u7cfb\u7edf\u7ed3\u6784\u4e4b\u524d\uff0c\u66f4\u6539\u88ab\u5199\u5165\u65e5\u5fd7\uff08journal\uff09\u3002\u5982\u679c\u7cfb\u7edf\u5728\u64cd\u4f5c\u4e2d\u95f4\u5d29\u6e83\uff0c\u91cd\u542f\u65f6\u4f1a\u91cd\u653e\u65e5\u5fd7\u4ee5\u5b8c\u6210\u6216\u64a4\u9500\u8be5\u64cd\u4f5c\u3002\u6ca1\u6709\u65e5\u5fd7\u8bb0\u5f55\uff0c\u5199\u5165\u671f\u95f4\u7684\u5d29\u6e83\u53ef\u80fd\u4f7f\u6587\u4ef6\u7cfb\u7edf\u5904\u4e8e\u4e0d\u4e00\u81f4\u72b6\u6001\uff08\u6587\u4ef6\u7684\u6570\u636e\u5757\u5df2\u66f4\u65b0\u4f46\u5176inode\u672a\u66f4\u65b0\uff0c\u53cd\u4e4b\u4ea6\u7136\uff09\u3002
\u57fa\u4e8eB\u6811\u7684\u6587\u4ef6\u7cfb\u7edf\uff08Btrfs\u3001ZFS\uff09\u4f7f\u7528B\u6811\uff08\u5e73\u8861\u641c\u7d22\u6811\uff09\u6765\u7ec4\u7ec7\u6570\u636e\u548c\u5143\u6570\u636e\uff0c\u5b9e\u73b0\u9ad8\u6548\u641c\u7d22\u3001\u5199\u65f6\u590d\u5236\u5feb\u7167\u4ee5\u53ca\u7528\u4e8e\u6570\u636e\u5b8c\u6574\u6027\u7684\u5185\u7f6e\u6821\u9a8c\u548c\u3002\u8fd9\u4e9b\u4e0e\u6570\u636e\u5e93\u7d22\u5f15\u4e2d\u4f7f\u7528\u7684B\u6811\u76f8\u540c\u3002
\u7cfb\u7edf\u8c03\u7528\u662f\u7528\u6237\u7a0b\u5e8f\u548cOS\u5185\u6838\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u5f53\u7a0b\u5e8f\u9700\u8981\u505a\u4e00\u4e9b\u7279\u6743\u64cd\u4f5c\uff08\u8bfb\u53d6\u6587\u4ef6\u3001\u5206\u914d\u5185\u5b58\u3001\u521b\u5efa\u8fdb\u7a0b\u3001\u53d1\u9001\u7f51\u7edc\u6570\u636e\u5305\uff09\u65f6\uff0c\u5b83\u4f1a\u8fdb\u884c\u7cfb\u7edf\u8c03\u7528\u3002
CPU\u5728\u4e24\u79cd\u6a21\u5f0f\u4e0b\u8fd0\u884c\uff1a
\u5f53\u7a0b\u5e8f\u8c03\u7528 read() \u65f6\uff0c\u53d1\u751f\u4ee5\u4e0b\u8fc7\u7a0b\uff1a
\u5e38\u89c1\u7cfb\u7edf\u8c03\u7528\uff1aopen\u3001read\u3001write\u3001close\uff08\u6587\u4ef6\uff09\uff0cfork\u3001exec\u3001wait\u3001exit\uff08\u8fdb\u7a0b\uff09\uff0cmmap\u3001brk\uff08\u5185\u5b58\uff09\uff0csocket\u3001bind\u3001listen\u3001accept\uff08\u7f51\u7edc\uff09\u3002
\u4e2d\u65ad\u662f\u8feb\u4f7fCPU\u6682\u65f6\u505c\u6b62\u5f53\u524d\u64cd\u4f5c\u5e76\u8fd0\u884c\u4e2d\u65ad\u5904\u7406\u7a0b\u5e8f\uff08\u5728\u5185\u6838\u4e2d\uff09\u7684\u786c\u4ef6\u4fe1\u53f7\u3002\u4e00\u6b21\u952e\u76d8\u6309\u952e\u3001\u4e00\u4e2a\u7f51\u7edc\u6570\u636e\u5305\u5230\u8fbe\u6216\u4e00\u4e2a\u5b9a\u65f6\u5668\u6ef4\u7b54\u90fd\u4f1a\u4ea7\u751f\u4e2d\u65ad\u3002\u5b9a\u65f6\u5668\u4e2d\u65ad\u7279\u522b\u91cd\u8981\uff1a\u5b83\u4f7fOS\u80fd\u591f\u62a2\u5360\u6b63\u5728\u8fd0\u884c\u7684\u8fdb\u7a0b\u5e76\u5207\u6362\u5230\u53e6\u4e00\u4e2a\uff08\u62a2\u5360\u5f0f\u591a\u4efb\u52a1\uff09\u3002
TCP/IP\u6a21\u578b\u5c06\u7f51\u7edc\u7ec4\u7ec7\u4e3a\u5206\u5c42\u7ed3\u6784\uff0c\u6bcf\u5c42\u4e3a\u4e0a\u5c42\u63d0\u4f9b\u62bd\u8c61\uff1a
TCP\uff08\u4f20\u8f93\u63a7\u5236\u534f\u8bae\uff09\u63d0\u4f9b\u53ef\u9760\u3001\u6709\u5e8f\u7684\u4ea4\u4ed8\u3002\u5b83\u5efa\u7acb\u4e00\u4e2a\u8fde\u63a5\uff08\u4e09\u6b21\u63e1\u624b\uff1aSYN\u3001SYN-ACK\u3001ACK\uff09\uff0c\u4fdd\u8bc1\u6240\u6709\u6570\u636e\u6309\u5e8f\u5230\u8fbe\uff08\u4f7f\u7528\u5e8f\u5217\u53f7\u548c\u786e\u8ba4\uff09\uff0c\u91cd\u4f20\u4e22\u5931\u7684\u6570\u636e\u5305\uff0c\u5e76\u63a7\u5236\u53d1\u9001\u901f\u7387\u4ee5\u907f\u514d\u7f51\u7edc\u8fc7\u8f7d\uff08\u62e5\u585e\u63a7\u5236\uff09\u3002\u4ee3\u4ef7\u662f\u5ef6\u8fdf\uff1a\u63e1\u624b\u589e\u52a0\u4e86\u4e00\u4e2a\u5f80\u8fd4\u65f6\u95f4\uff0c\u91cd\u4f20\u589e\u52a0\u4e86\u5ef6\u8fdf\u3002
UDP\uff08\u7528\u6237\u6570\u636e\u62a5\u534f\u8bae\uff09\u63d0\u4f9b\u4e0d\u53ef\u9760\u3001\u65e0\u5e8f\u7684\u4ea4\u4ed8\u3002\u65e0\u9700\u63e1\u624b\u3001\u65e0\u9700\u91cd\u4f20\u3001\u65e0\u987a\u5e8f\u4fdd\u8bc1\u3002\u5ef6\u8fdf\u8fdc\u4f4e\u4e8eTCP\u3002\u7528\u4e8e\u901f\u5ea6\u6bd4\u53ef\u9760\u6027\u66f4\u91cd\u8981\u7684\u573a\u666f\uff1a\u89c6\u9891\u6d41\u3001\u5728\u7ebf\u6e38\u620f\u3001DNS\u67e5\u8be2\u3002\u5728ML\u4e2d\uff0c\u4e00\u4e9b\u68af\u5ea6\u540c\u6b65\u534f\u8bae\u4f7f\u7528\u57fa\u4e8eUDP\u7684RDMA\u4ee5\u83b7\u5f97\u66f4\u4f4e\u5ef6\u8fdf\u3002
\u5957\u63a5\u5b57\u662f\u7528\u4e8e\u7f51\u7edc\u901a\u4fe1\u7684OS API\u3002\u4e00\u4e2a\u5957\u63a5\u5b57\u662f\u7531\uff08IP\u5730\u5740\uff0c\u7aef\u53e3\u53f7\uff09\u6807\u8bc6\u7684\u7aef\u70b9\u3002\u670d\u52a1\u5668\u521b\u5efa\u4e00\u4e2a\u5957\u63a5\u5b57\uff0c\u5c06\u5176\u7ed1\u5b9a\u5230\u4e00\u4e2a\u7aef\u53e3\uff08\u4f8b\u5982HTTP\u768480\uff09\uff0c\u76d1\u542c\u8fde\u63a5\uff0c\u5e76\u63a5\u53d7\u5b83\u4eec\u3002\u5ba2\u6237\u7aef\u521b\u5efa\u4e00\u4e2a\u5957\u63a5\u5b57\u5e76\u8fde\u63a5\u5230\u670d\u52a1\u5668\u7684\u5730\u5740:\u7aef\u53e3\u3002\u7136\u540e\u901a\u8fc7\u5957\u63a5\u5b57\u50cf\u6587\u4ef6\u4e00\u6837\u8bfb\u5199\u6570\u636e\u3002
DNS\uff08\u57df\u540d\u7cfb\u7edf\uff09\u5c06\u4eba\u7c7b\u53ef\u8bfb\u7684\u540d\u79f0\uff08google.com\uff09\u7ffb\u8bd1\u4e3aIP\u5730\u5740\uff08142.250.80.46\uff09\u3002\u5b83\u662f\u4e00\u4e2a\u5206\u5e03\u5f0f\u7684\u3001\u5c42\u6b21\u5316\u7684\u6570\u636e\u5e93\uff1a\u4f60\u7684\u673a\u5668\u8be2\u95ee\u672c\u5730\u89e3\u6790\u5668\uff0c\u540e\u8005\u8be2\u95ee\u6839\u670d\u52a1\u5668\uff0c\u6839\u670d\u52a1\u5668\u59d4\u6258\u7ed9\u6bcf\u4e2a\u57df\u7684\u6743\u5a01\u670d\u52a1\u5668\u3002
HTTP\uff08\u8d85\u6587\u672c\u4f20\u8f93\u534f\u8bae\uff09\u662fWeb\u7684\u8bf7\u6c42-\u54cd\u5e94\u534f\u8bae\u3002\u5ba2\u6237\u7aef\u53d1\u9001\u4e00\u4e2a\u8bf7\u6c42\uff08\u65b9\u6cd5 + URL + \u5934\u90e8 + \u53ef\u9009\u4f53\uff09\uff0c\u670d\u52a1\u5668\u53d1\u9001\u4e00\u4e2a\u54cd\u5e94\uff08\u72b6\u6001\u7801 + \u5934\u90e8 + \u4f53\uff09\u3002ML\u6a21\u578b\u670d\u52a1\uff08\u5982TensorFlow Serving\u3001Triton\uff09\u5c06\u6a21\u578b\u66b4\u9732\u4e3aHTTP\u6216gRPC\u7aef\u70b9\u3002
\u5ef6\u8fdf vs \u5e26\u5bbd\uff1a\u5ef6\u8fdf\u662f\u4e00\u4e2a\u6570\u636e\u5305\u4ece\u6e90\u5230\u76ee\u6807\u6240\u9700\u7684\u65f6\u95f4\uff08\u7531\u7269\u7406\u8ddd\u79bb\u548c\u7f51\u7edc\u8df3\u6570\u51b3\u5b9a\uff09\u3002\u5e26\u5bbd\u662f\u6570\u636e\u4f20\u8f93\u901f\u7387\uff08\u6bcf\u79d2\u5b57\u8282\u6570\uff09\u3002\u9ad8\u5e26\u5bbd\u3001\u9ad8\u5ef6\u8fdf\u7684\u8fde\u63a5\uff08\u536b\u661f\u4e92\u8054\u7f51\uff09\u53ef\u4ee5\u4f20\u8f93\u5927\u91cf\u6570\u636e\uff0c\u4f46\u6bcf\u4e2a\u5b57\u8282\u9700\u8981\u5f88\u957f\u65f6\u95f4\u624d\u80fd\u5230\u8fbe\u3002\u5bf9\u4e8e\u5206\u5e03\u5f0f\u8bad\u7ec3\uff0c\u5ef6\u8fdf\u5bf9\u540c\u6b65\u5c4f\u969c\uff08\u6240\u6709GPU\u5fc5\u987b\u7b49\u5f85\u6700\u6162\u7684\u90a3\u4e2a\uff09\u5f88\u91cd\u8981\uff0c\u800c\u5e26\u5bbd\u5bf9\u4f20\u8f93\u5927\u7684\u68af\u5ea6\u5f20\u91cf\u5f88\u91cd\u8981\uff08\u7b2c6\u7ae0\uff09\u3002
\u865a\u62df\u5316\u5728\u5355\u4e2a\u7269\u7406\u673a\u4e0a\u8fd0\u884c\u591a\u4e2a\u64cd\u4f5c\u7cfb\u7edf\u3002\u865a\u62df\u673a\u76d1\u89c6\u5668\uff08VMware\u3001KVM\u3001Xen\uff09\u521b\u5efa\u865a\u62df\u673a\uff08VM\uff09\uff0c\u6bcf\u4e2a\u865a\u62df\u673a\u6709\u81ea\u5df1\u7684\u865a\u62dfCPU\u3001\u5185\u5b58\u3001\u78c1\u76d8\u548c\u7f51\u7edc\u63a5\u53e3\u3002\u6bcf\u4e2a\u865a\u62df\u673a\u8fd0\u884c\u4e00\u4e2a\u5b8c\u6574\u7684\u64cd\u4f5c\u7cfb\u7edf\uff08\u6765\u5bbeOS\uff09\uff0c\u5b83\u8ba4\u4e3a\u81ea\u5df1\u62e5\u6709\u4e13\u7528\u786c\u4ef6\u3002
VM\u63d0\u4f9b\u5f3a\u9694\u79bb\uff08\u4e00\u4e2aVM\u5d29\u6e83\u4e0d\u5f71\u54cd\u5176\u4ed6VM\uff09\u548c\u7075\u6d3b\u6027\uff08\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u8fd0\u884cLinux\u548cWindows\uff0c\u5728\u7269\u7406\u4e3b\u673a\u4e4b\u95f4\u8fc1\u79fbVM\uff09\u3002\u4ee3\u4ef7\u662f\u5f00\u9500\uff1a\u6bcf\u4e2aVM\u8fd0\u884c\u4e00\u4e2a\u5b8c\u6574\u7684OS\u5185\u6838\uff0c\u6d88\u8017\u5185\u5b58\u548cCPU\u6765\u6267\u884c\u4e0e\u5bbf\u4e3b\u673aOS\u5197\u4f59\u7684OS\u64cd\u4f5c\u3002
\u5bb9\u5668\uff08Docker\u3001Podman\uff09\u63d0\u4f9b\u4e86\u4e00\u79cd\u66f4\u8f7b\u91cf\u7684\u66ff\u4ee3\u65b9\u6848\u3002\u5bb9\u5668\u4e0d\u662f\u865a\u62df\u5316\u6574\u4e2a\u786c\u4ef6\uff0c\u800c\u662f\u5171\u4eab\u5bbf\u4e3b\u673aOS\u5185\u6838\uff0c\u5e76\u4f7f\u7528\u5185\u6838\u7279\u6027\u6765\u9694\u79bb\u8fdb\u7a0b\uff1a
\u547d\u540d\u7a7a\u95f4\u9694\u79bb\u8fdb\u7a0b\u53ef\u4ee5\u770b\u5230\u7684\u5185\u5bb9\uff1a\u6bcf\u4e2a\u5bb9\u5668\u62e5\u6709\u81ea\u5df1\u7684\u8fdb\u7a0b\u6811\u89c6\u56fe\uff08PID\u547d\u540d\u7a7a\u95f4\uff09\u3001\u7f51\u7edc\u63a5\u53e3\uff08\u7f51\u7edc\u547d\u540d\u7a7a\u95f4\uff09\u3001\u6587\u4ef6\u7cfb\u7edf\u6302\u8f7d\u70b9\uff08\u6302\u8f7d\u547d\u540d\u7a7a\u95f4\uff09\u548c\u4e3b\u673a\u540d\uff08UTS\u547d\u540d\u7a7a\u95f4\uff09\u3002\u5bb9\u5668\u5185\u7684\u8fdb\u7a0b\u4e0d\u80fd\u770b\u5230\u5176\u4ed6\u5bb9\u5668\u4e2d\u7684\u8fdb\u7a0b\u3002
Cgroups\uff08\u63a7\u5236\u7ec4\uff09\u9650\u5236\u8fdb\u7a0b\u53ef\u4ee5\u4f7f\u7528\u7684\u5185\u5bb9\uff1aCPU\u65f6\u95f4\u3001\u5185\u5b58\u3001\u78c1\u76d8I/O\u3001\u7f51\u7edc\u5e26\u5bbd\u3002\u5bb9\u5668\u4e0d\u80fd\u6d88\u8017\u8d85\u8fc7\u5176cgroup\u5141\u8bb8\u7684\u8d44\u6e90\uff0c\u9632\u6b62\u4e00\u4e2a\u5bb9\u5668\u997f\u6b7b\u5176\u4ed6\u5bb9\u5668\u3002
\u5bb9\u5668\u5728\u6beb\u79d2\u5185\u542f\u52a8\uff08\u65e0\u9700OS\u542f\u52a8\uff09\uff0c\u4f7f\u7528\u6700\u5c0f\u5f00\u9500\uff08\u5171\u4eab\u5185\u6838\uff09\uff0c\u5e76\u901a\u8fc7Dockerfile\u5b9a\u4e49\uff0c\u8be5\u6587\u4ef6\u6307\u5b9a\u57fa\u7840\u955c\u50cf\u3001\u4f9d\u8d56\u9879\u548c\u547d\u4ee4\u3002\u8fd9\u4f7f\u5f97\u5b83\u4eec\u53ef\u590d\u73b0\uff1adocker build \u5728\u4efb\u4f55\u5730\u65b9\u4ea7\u751f\u76f8\u540c\u7684\u73af\u5883\u3002
\u5bf9\u4e8eML\uff0c\u5bb9\u5668\u89e3\u51b3\u4e86\"\u5728\u6211\u673a\u5668\u4e0a\u80fd\u8fd0\u884c\"\u7684\u95ee\u9898\u3002\u5177\u6709\u7279\u5b9a\u7248\u672cCUDA\u3001cuDNN\u3001PyTorch\u548cPython\u7684\u8bad\u7ec3\u73af\u5883\u88ab\u6253\u5305\u4e3a\u5bb9\u5668\u955c\u50cf\u3002\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u5728\u4efb\u4f55\u673a\u5668\u4e0a\u590d\u73b0\u786e\u5207\u7684\u73af\u5883\u3002\u4e91\u8bad\u7ec3\u5e73\u53f0\uff08AWS SageMaker\u3001GCP Vertex AI\uff09\u5728\u5bb9\u5668\u4e2d\u8fd0\u884c\u8bad\u7ec3\u4efb\u52a1\u3002
Kubernetes\uff08K8s\uff09\u5927\u89c4\u6a21\u7f16\u6392\u5bb9\u5668\uff1a\u5b83\u5c06\u5bb9\u5668\u8c03\u5ea6\u5230\u96c6\u7fa4\u4e2d\u7684\u591a\u53f0\u673a\u5668\u4e0a\uff0c\u91cd\u542f\u5931\u8d25\u7684\u5bb9\u5668\uff0c\u6839\u636e\u8d1f\u8f7d\u8fdb\u884c\u6269\u7f29\u5bb9\uff0c\u5e76\u7ba1\u7406\u5bb9\u5668\u4e4b\u95f4\u7684\u7f51\u7edc\u3002\u5927\u89c4\u6a21ML\u670d\u52a1\uff08\u6570\u5343\u4e2a\u6a21\u578b\u526f\u672c\u5904\u7406\u6570\u767e\u4e07\u8bf7\u6c42\uff09\u5728Kubernetes\u4e0a\u8fd0\u884c\u3002
OS\u901a\u8fc7\u591a\u79cd\u673a\u5236\u5b9e\u65bd\u5b89\u5168\uff1a
\u6743\u9650\uff1a\u6bcf\u4e2a\u6587\u4ef6\u6709\u4e00\u4e2a\u6240\u6709\u8005\u3001\u4e00\u4e2a\u7ec4\u548c\u6743\u9650\u4f4d\uff08\u62e5\u6709\u8005\u3001\u7ec4\u548c\u5176\u4ed6\u4eba\u7684\u8bfb/\u5199/\u6267\u884c\uff09\u3002\u8fdb\u7a0b\u4ee5\u542f\u52a8\u5b83\u7684\u7528\u6237\u7684\u8eab\u4efd\uff08UID\uff09\u8fd0\u884c\uff0c\u53ea\u80fd\u8bbf\u95ee\u6743\u9650\u4f4d\u5141\u8bb8\u7684\u6587\u4ef6\u3002root\u7528\u6237\uff08UID 0\uff09\u7ed5\u8fc7\u6240\u6709\u6743\u9650\u68c0\u67e5\uff0c\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u4ee5root\u8eab\u4efd\u8fd0\u884c\u662f\u5371\u9669\u7684\u3002
\u6743\u9650\u5206\u79bb\uff1a\u8fdb\u7a0b\u4ee5\u6240\u9700\u7684\u6700\u5c0f\u6743\u9650\u8fd0\u884c\u3002Web\u670d\u52a1\u5668\u4e0d\u9700\u8981root\u8bbf\u95ee\u6743\u9650\uff1b\u5b83\u5e94\u8be5\u4ee5\u4e00\u4e2a\u53d7\u9650\u7528\u6237\u8eab\u4efd\u8fd0\u884c\uff0c\u8be5\u7528\u6237\u53ea\u80fd\u8bfb\u53d6Web\u6587\u4ef6\u5e76\u7ed1\u5b9a\u5230\u7aef\u53e380\u3002\u5982\u679c\u670d\u52a1\u5668\u88ab\u653b\u7834\uff0c\u653b\u51fb\u8005\u7684\u8bbf\u95ee\u9650\u5236\u5728\u8be5\u53d7\u9650\u7528\u6237\u80fd\u505a\u7684\u8303\u56f4\u5185\u3002
\u6c99\u7bb1\u5316\uff1a\u9650\u5236\u8fdb\u7a0b\u5728\u6587\u4ef6\u6743\u9650\u4e4b\u5916\u80fd\u505a\u7684\u4e8b\u60c5\u3002seccomp\uff08Linux\uff09\u9650\u5236\u8fdb\u7a0b\u53ef\u4ee5\u8fdb\u884c\u7684\u7cfb\u7edf\u8c03\u7528\u3002AppArmor\u548cSELinux\u5b9a\u4e49\u5f3a\u5236\u8bbf\u95ee\u63a7\u5236\u7b56\u7565\u3002\u5bb9\u5668\u7ed3\u5408\u4e86\u547d\u540d\u7a7a\u95f4\u3001cgroups\u548cseccomp\u8fdb\u884c\u591a\u5c42\u9694\u79bb\u3002
\u5730\u5740\u7a7a\u95f4\u5e03\u5c40\u968f\u673a\u5316\uff08ASLR\uff09\uff1a\u6bcf\u6b21\u7a0b\u5e8f\u8fd0\u884c\u65f6\uff0c\u968f\u673a\u5316\u5806\u6808\u3001\u5806\u548c\u5e93\u7684\u5185\u5b58\u4f4d\u7f6e\u3002\u8fd9\u4f7f\u5f97\u653b\u51fb\u8005\u66f4\u96be\u5229\u7528\u5185\u5b58\u635f\u574f\u6f0f\u6d1e\uff08\u7f13\u51b2\u533a\u6ea2\u51fa\uff09\uff0c\u56e0\u4e3a\u4ed6\u4eec\u65e0\u6cd5\u9884\u6d4b\u4ee3\u7801\u6216\u6570\u636e\u5728\u5185\u5b58\u4e2d\u7684\u4f4d\u7f6e\u3002
\u5b89\u5168\u662f\u4e00\u4e2a\u5168\u7cfb\u7edf\u5c42\u9762\u7684\u5173\u6ce8\uff1a\u94fe\u6761\u7684\u5f3a\u5ea6\u53d6\u51b3\u4e8e\u6700\u5f31\u7684\u4e00\u73af\u3002\u6a21\u578b\u670d\u52a1\u7cfb\u7edf\u9700\u8981\u5b89\u5168\u7684\u7f51\u7edc\u901a\u4fe1\uff08TLS/HTTPS\uff09\u3001\u7ecf\u8fc7\u8eab\u4efd\u9a8c\u8bc1\u7684API\u8bbf\u95ee\uff08API\u5bc6\u94a5\u3001OAuth\uff09\u3001\u8f93\u5165\u9a8c\u8bc1\uff08\u9632\u6b62\u5bf9\u6297\u6027\u8f93\u5165\uff09\u548c\u9694\u79bb\u6267\u884c\uff08\u5177\u6709\u6700\u5c0f\u6743\u9650\u7684\u5bb9\u5668\uff09\u3002
\u63a2\u7d22\u8fdb\u7a0b\u521b\u5efa\u3002\u4f7f\u7528Python\u7684 os.fork()\uff08\u4ec5Unix\uff09\u521b\u5efa\u4e00\u4e2a\u5b50\u8fdb\u7a0b\uff0c\u5e76\u89c2\u5bdf\u7236\u8fdb\u7a0b\u548c\u5b50\u8fdb\u7a0b\u5982\u4f55\u4ece\u540c\u4e00\u70b9\u7ee7\u7eed\u6267\u884c\u3002
import os\n\npid = os.fork()\n\nif pid == 0:\n # \u5b50\u8fdb\u7a0b\n print(f\"Child: my PID is {os.getpid()}, parent PID is {os.getppid()}\")\nelse:\n # \u7236\u8fdb\u7a0b\n print(f\"Parent: my PID is {os.getpid()}, child PID is {pid}\")\n os.wait() # \u7b49\u5f85\u5b50\u8fdb\u7a0b\u7ed3\u675f\n \u6a21\u62df\u8f6e\u8f6c\u8c03\u5ea6\u3002\u7ed9\u5b9a\u4e00\u4e2a\u5e26\u6709\u6267\u884c\u65f6\u95f4\u7684\u8fdb\u7a0b\u5217\u8868\uff0c\u6a21\u62df\u8c03\u5ea6\u5e76\u8ba1\u7b97\u5e73\u5747\u7b49\u5f85\u65f6\u95f4\u3002
def round_robin(processes, quantum=3):\n \"\"\"\u6a21\u62df\u8f6e\u8f6c\u8c03\u5ea6\u3002\n processes: (name, burst_time) \u5143\u7ec4\u5217\u8868\u3002\n \"\"\"\n queue = [(name, burst, 0) for name, burst in processes] # (name, remaining, wait)\n time = 0\n log = []\n\n while queue:\n name, remaining, waited = queue.pop(0)\n waited += (time - waited - (processes[[p[0] for p in processes].index(name)][1] - remaining))\n run_time = min(quantum, remaining)\n log.append(f\" t={time:3d}: {name} runs for {run_time} (remaining: {remaining - run_time})\")\n time += run_time\n remaining -= run_time\n\n if remaining > 0:\n queue.append((name, remaining, time))\n else:\n log.append(f\" t={time:3d}: {name} DONE (turnaround: {time})\")\n\n for line in log:\n print(line)\n\nprint(\"\u8f6e\u8f6c\u8c03\u5ea6 (quantum=3)\uff1a\")\nround_robin([(\"P1\", 10), (\"P2\", 4), (\"P3\", 6)], quantum=3)\n \u6a21\u62dfLRU\u9875\u9762\u7f6e\u6362\u3002\u7ed9\u5b9a\u4e00\u4e2a\u9875\u9762\u8bbf\u95ee\u5e8f\u5217\u548c\u56fa\u5b9a\u6570\u91cf\u7684\u5e27\uff0c\u7edf\u8ba1\u7f3a\u9875\u6b21\u6570\u3002
def lru_page_replacement(pages, n_frames):\n \"\"\"\u6a21\u62dfLRU\u9875\u9762\u7f6e\u6362\u3002\"\"\"\n frames = []\n faults = 0\n\n for page in pages:\n if page in frames:\n frames.remove(page)\n frames.append(page) # \u79fb\u52a8\u5230\u6700\u8fd1\u4f7f\u7528\n status = \"HIT \"\n else:\n faults += 1\n if len(frames) >= n_frames:\n evicted = frames.pop(0) # \u79fb\u9664\u6700\u8fd1\u6700\u5c11\u4f7f\u7528\n status = f\"MISS (evict {evicted})\"\n else:\n status = \"MISS (cold)\"\n frames.append(page)\n print(f\" Page {page}: {status} frames={frames}\")\n\n print(f\"\\nTotal faults: {faults}/{len(pages)} ({faults/len(pages):.0%})\")\n\nprint(\"LRU with 3 frames:\")\nlru_page_replacement([1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5], n_frames=3)\n \u5e76\u53d1\u4e0e\u5e76\u884c\u662f\u7a0b\u5e8f\u540c\u65f6\u5904\u7406\u591a\u4ef6\u4e8b\u60c5\u7684\u65b9\u5f0f\u3002\u672c\u6587\u6db5\u76d6\u5e76\u53d1\u4e0e\u5e76\u884c\u7684\u533a\u522b\u3001\u540c\u6b65\u539f\u8bed\u3001\u7ecf\u5178\u5e76\u53d1\u95ee\u9898\u3001\u6b7b\u9501\u3001\u65e0\u9501\u6570\u636e\u7ed3\u6784\u3001\u5e76\u884c\u7f16\u7a0b\u6a21\u578b\u3001\u5f02\u6b65\u7f16\u7a0b\u548c\u6269\u5c55\u5b9a\u5f8b\u2014\u2014\u8fd9\u4e9b\u6982\u5ff5\u652f\u6491\u7740\u591a\u7ebf\u7a0b\u670d\u52a1\u5668\u3001\u5206\u5e03\u5f0f\u8bad\u7ec3\u548c\u6bcf\u4e00\u4e2a\u73b0\u4ee3\u5e94\u7528\u7a0b\u5e8f\u3002
\u5e76\u53d1\u662f\u5173\u4e8e\u7ba1\u7406\u591a\u4e2a\u4efb\u52a1\u3002\u4efb\u52a1\u901a\u8fc7\u4ea4\u9519\u8fdb\u884c\uff1a\u4efb\u52a1A\u8fd0\u884c\u4e00\u4f1a\u513f\uff0c\u7136\u540e\u4efb\u52a1B\uff0c\u7136\u540e\u56de\u5230A\u3002\u5728\u5355\u6838\u4e0a\uff0c\u5e76\u53d1\u521b\u9020\u4e86\u540c\u65f6\u6267\u884c\u7684\u5047\u8c61\u3002\u8fd9\u4e9b\u4efb\u52a1\u5e76\u975e\u771f\u6b63\u540c\u65f6\u6267\u884c\uff1b\u5b83\u4eec\u8f6e\u6d41\u8fdb\u884c\u3002
\u5e76\u884c\u662f\u5173\u4e8e\u6267\u884c\u591a\u4e2a\u4efb\u52a1\u540c\u65f6\u8fdb\u884c\u3002\u6709\\(n\\)\u4e2a\u6838\u5fc3\uff0c\\(n\\)\u4e2a\u4efb\u52a1\u53ef\u4ee5\u771f\u6b63\u540c\u65f6\u8fd0\u884c\u3002\u5e76\u884c\u9700\u8981\u591a\u4e2a\u786c\u4ef6\u6267\u884c\u5355\u5143\u3002
\u7c7b\u6bd4\uff1a\u5e76\u53d1\u662f\u4e00\u4e2a\u53a8\u5e08\u4ea4\u66ff\u5207\u83dc\u548c\u6405\u62cc\u9505\u3002\u5e76\u884c\u662f\u4e24\u4e2a\u53a8\u5e08\u5404\u81ea\u540c\u65f6\u505a\u4e00\u4e2a\u4efb\u52a1\u3002\u4e00\u4e2a\u7cfb\u7edf\u53ef\u4ee5\u662f\u5e76\u53d1\u4f46\u4e0d\u5e76\u884c\u7684\uff08\u5355\u6838\uff0c\u4efb\u52a1\u4ea4\u9519\uff09\uff0c\u5e76\u884c\u4f46\u4e0d\u5e76\u53d1\u7684\uff08\u591a\u6838\u8fd0\u884c\u72ec\u7acb\u7a0b\u5e8f\uff0c\u6ca1\u6709\u4ea4\u4e92\uff09\uff0c\u6216\u8005\u4e24\u8005\u517c\u6709\uff08\u591a\u6838\u8fd0\u884c\u4e92\u76f8\u4ea4\u9519\u4ea4\u4e92\u7684\u4efb\u52a1\uff09\u3002
\u5728ML\u4e2d\uff0c\u5e76\u53d1\u51fa\u73b0\u5728\u6570\u636e\u52a0\u8f7d\u4e2d\uff08\u6570\u636e\u9884\u5904\u7406\u4e0eGPU\u8ba1\u7b97\u91cd\u53e0\uff09\uff0c\u800c\u5e76\u884c\u51fa\u73b0\u5728\u5206\u5e03\u5f0f\u8bad\u7ec3\u4e2d\uff08\u591a\u4e2aGPU\u540c\u65f6\u8ba1\u7b97\u68af\u5ea6\uff0c\u7b2c6\u7ae0\uff09\u3002
\u5f53\u591a\u4e2a\u7ebf\u7a0b\u5171\u4eab\u6570\u636e\u65f6\uff0c\u540c\u6b65\u9632\u6b62\u7ade\u6001\u6761\u4ef6\u3002\u7ade\u6001\u6761\u4ef6\u53d1\u751f\u5728\u7ed3\u679c\u4f9d\u8d56\u4e8e\u7ebf\u7a0b\u6267\u884c\u7684\u4e0d\u53ef\u9884\u6d4b\u987a\u5e8f\u65f6\u3002
\u8003\u8651\u4e24\u4e2a\u7ebf\u7a0b\u540c\u65f6\u589e\u52a0\u4e00\u4e2a\u5171\u4eab\u8ba1\u6570\u5668\uff1acounter += 1\u3002\u8fd9\u5b9e\u9645\u4e0a\u662f\u4e09\u4e2a\u64cd\u4f5c\uff1a\uff081\uff09\u8bfb\u53d6\u8ba1\u6570\u5668\uff0c\uff082\uff09\u52a01\uff0c\uff083\uff09\u5199\u5165\u8ba1\u6570\u5668\u3002\u5982\u679c\u4e24\u4e2a\u7ebf\u7a0b\u8bfb\u53d6\u76f8\u540c\u7684\u503c\uff08\u6bd4\u59825\uff09\uff0c\u90fd\u52a01\uff0c\u90fd\u5199\u51656\uff0c\u8ba1\u6570\u5668\u6700\u7ec8\u4e3a6\u800c\u4e0d\u662f\u6b63\u786e\u76847\u3002\u4e00\u6b21\u589e\u52a0\u4e22\u5931\u4e86\u3002
\u4e92\u65a5\u9501\uff08\u4e92\u65a5\u6392\u65a5\u9501\uff09\u786e\u4fdd\u4e00\u6b21\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u4e34\u754c\u533a\u3002\u4e00\u4e2a\u7ebf\u7a0b\u5728\u8fdb\u5165\u4e34\u754c\u533a\u524d\u83b7\u53d6\u9501\uff0c\u4e4b\u540e\u91ca\u653e\u9501\u3002\u4efb\u4f55\u5176\u4ed6\u8bd5\u56fe\u83b7\u53d6\u5df2\u88ab\u6301\u6709\u9501\u7684\u7ebf\u7a0b\u5c06\u963b\u585e\u76f4\u5230\u9501\u88ab\u91ca\u653e\u3002
lock.acquire()\ncounter += 1 # \u4e00\u6b21\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u5728\u6b64\nlock.release()\n \u4e92\u65a5\u9501\u662f\u6b63\u786e\u7684\uff0c\u4f46\u4f1a\u5f15\u5165\u4e89\u7528\uff1a\u5982\u679c\u8bb8\u591a\u7ebf\u7a0b\u7ade\u4e89\u540c\u4e00\u4e2a\u9501\uff0c\u5b83\u4eec\u82b1\u8d39\u65f6\u95f4\u7b49\u5f85\u800c\u4e0d\u662f\u8ba1\u7b97\u3002\u8fd9\u9650\u5236\u4e86\u53ef\u6269\u5c55\u6027\u3002\u6781\u7aef\u60c5\u51b5\u4e0b\uff0c\u6240\u6709\u7ebf\u7a0b\u90fd\u60f3\u8981\u540c\u4e00\u4e2a\u9501\uff0c\u4f1a\u4f7f\u6574\u4e2a\u7a0b\u5e8f\u4e32\u884c\u5316\u3002
\u4fe1\u53f7\u91cf\u6cdb\u5316\u4e86\u4e92\u65a5\u9501\u3002\u8ba1\u6570\u4fe1\u53f7\u91cf\u7ef4\u62a4\u4e00\u4e2a\u8ba1\u6570\u5668\uff1await() \u9012\u51cf\u8ba1\u6570\u5668\uff08\u5982\u679c\u4f1a\u53d8\u8d1f\u5219\u963b\u585e\uff09\uff0csignal() \u9012\u589e\u8ba1\u6570\u5668\u3002\u521d\u59cb\u5316\u4e3a1\u7684\u4fe1\u53f7\u91cf\u884c\u4e3a\u7c7b\u4f3c\u4e92\u65a5\u9501\u3002\u521d\u59cb\u5316\u4e3a\\(n\\)\u7684\u4fe1\u53f7\u91cf\u5141\u8bb8\u6700\u591a\\(n\\)\u4e2a\u7ebf\u7a0b\u540c\u65f6\u8fdb\u5165\u4e34\u754c\u533a\uff08\u9002\u7528\u4e8e\u8d44\u6e90\u6c60\u5982\u6570\u636e\u5e93\u8fde\u63a5\uff09\u3002
\u6761\u4ef6\u53d8\u91cf\u8ba9\u4e00\u4e2a\u7ebf\u7a0b\u7b49\u5f85\u76f4\u5230\u67d0\u4e2a\u7279\u5b9a\u6761\u4ef6\u6ee1\u8db3\u3002\u8be5\u7ebf\u7a0b\u91ca\u653e\u4e00\u4e2a\u9501\uff0c\u5728\u6761\u4ef6\u53d8\u91cf\u4e0a\u7b49\u5f85\uff0c\u5f53\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u53d1\u51fa\u8be5\u6761\u4ef6\u7684\u4fe1\u53f7\u65f6\u88ab\u5524\u9192\u3002\u8fd9\u907f\u514d\u4e86\u5fd9\u7b49\u5f85\uff08\u5728\u4e00\u4e2a\u5faa\u73af\u4e2d\u53cd\u590d\u68c0\u67e5\u6761\u4ef6\uff0c\u6d6a\u8d39CPU\uff09\u3002
\u76d1\u89c6\u5668\u5c06\u4e92\u65a5\u9501\u4e0e\u6761\u4ef6\u53d8\u91cf\u548c\u5171\u4eab\u6570\u636e\u6346\u7ed1\u4e3a\u4e00\u4e2a\u5355\u4e00\u62bd\u8c61\u3002Java\u7684 synchronized \u5173\u952e\u5b57\u548cPython\u7684 threading.Condition \u5b9e\u73b0\u4e86\u7c7b\u4f3c\u76d1\u89c6\u5668\u7684\u8bed\u4e49\u3002
\u8bfb\u5199\u9501\u533a\u5206\u8bfb\u7ebf\u7a0b\uff08\u53ef\u4ee5\u5171\u4eab\u8bbf\u95ee\uff0c\u56e0\u4e3a\u8bfb\u53d6\u4e0d\u4f1a\u4fee\u6539\u6570\u636e\uff09\u548c\u5199\u7ebf\u7a0b\uff08\u9700\u8981\u72ec\u5360\u8bbf\u95ee\uff09\u3002\u591a\u4e2a\u8bfb\u7ebf\u7a0b\u53ef\u4ee5\u540c\u65f6\u6301\u6709\u9501\uff0c\u4f46\u4e00\u4e2a\u5199\u7ebf\u7a0b\u4f1a\u963b\u585e\u6240\u6709\u8bfb\u7ebf\u7a0b\u548c\u5176\u4ed6\u5199\u7ebf\u7a0b\u3002\u5f53\u8bfb\u64cd\u4f5c\u8fdc\u591a\u4e8e\u5199\u64cd\u4f5c\u65f6\uff08\u4f8b\u5982\uff0c\u63d0\u4f9b\u9884\u6d4b\u7684\u7f13\u5b58\u6a21\u578b\uff09\uff0c\u8fd9\u662f\u6700\u4f18\u7684\u3002
\u751f\u4ea7\u8005-\u6d88\u8d39\u8005\uff08\u6709\u754c\u7f13\u51b2\u533a\uff09\uff1a\u751f\u4ea7\u8005\u751f\u6210\u9879\u76ee\u5e76\u5c06\u5176\u653e\u5165\u56fa\u5b9a\u5927\u5c0f\u7684\u7f13\u51b2\u533a\uff1b\u6d88\u8d39\u8005\u79fb\u9664\u9879\u76ee\u3002\u6311\u6218\uff1a\u7f13\u51b2\u533a\u6ee1\u65f6\u751f\u4ea7\u8005\u5fc5\u987b\u7b49\u5f85\uff0c\u7f13\u51b2\u533a\u7a7a\u65f6\u6d88\u8d39\u8005\u5fc5\u987b\u7b49\u5f85\uff0c\u4e14\u4e24\u8005\u5fc5\u987b\u9632\u6b62\u635f\u574f\u7f13\u51b2\u533a\u3002
\u89e3\u51b3\u65b9\u6848\u4f7f\u7528\u4e24\u4e2a\u4fe1\u53f7\u91cf\uff08\u4e00\u4e2a\u8ba1\u6570\u7a7a\u4f4d\uff0c\u4e00\u4e2a\u8ba1\u6570\u6ee1\u4f4d\uff09\u52a0\u4e0a\u4e00\u4e2a\u7528\u4e8e\u7f13\u51b2\u533a\u672c\u8eab\u7684\u4e92\u65a5\u9501\u3002\u8fd9\u662f\u5927\u591a\u6570\u6d88\u606f\u961f\u5217\u3001\u65e5\u5fd7\u7cfb\u7edf\u548c\u6570\u636e\u7ba1\u9053\u80cc\u540e\u7684\u6a21\u5f0f\u3002
\u8bfb\u8005-\u5199\u8005\uff1a\u591a\u4e2a\u8bfb\u8005\u53ef\u4ee5\u540c\u65f6\u8bfb\u53d6\uff0c\u4f46\u5199\u8005\u9700\u8981\u72ec\u5360\u8bbf\u95ee\u3002\u6311\u6218\u662f\u516c\u5e73\u6027\uff1a\u5982\u679c\u8bfb\u8005\u6e90\u6e90\u4e0d\u65ad\u5730\u5230\u6765\uff0c\u5199\u8005\u53ef\u80fd\u9965\u997f\uff08\u6c38\u8fdc\u5f97\u4e0d\u5230\u8bbf\u95ee\uff09\u3002\u89e3\u51b3\u65b9\u6848\u8981\u4e48\u4f18\u5148\u8003\u8651\u8bfb\u8005\uff0c\u8981\u4e48\u4f18\u5148\u8003\u8651\u5199\u8005\uff0c\u8981\u4e48\u516c\u5e73\u5730\u4ea4\u66ff\u3002
\u54f2\u5b66\u5bb6\u5c31\u9910\u95ee\u9898\uff1a\u4e94\u4f4d\u54f2\u5b66\u5bb6\u56f4\u5750\u5728\u4e00\u5f20\u6709\u4e94\u4e2a\u53c9\u5b50\u7684\u684c\u5b50\u65c1\u3002\u6bcf\u4eba\u9700\u8981\u4e24\u628a\u53c9\u5b50\u624d\u80fd\u5403\u996d\u3002\u5982\u679c\u6240\u6709\u4e94\u4f4d\u540c\u65f6\u62ff\u8d77\u5de6\u8fb9\u7684\u53c9\u5b50\uff0c\u6ca1\u4eba\u80fd\u62ff\u8d77\u53f3\u8fb9\u7684\u53c9\u5b50\uff0c\u6240\u6709\u4eba\u90fd\u997f\u6b7b\uff08\u6b7b\u9501\uff09\u3002\u89e3\u51b3\u65b9\u6848\u5305\u62ec\uff1a\u540c\u65f6\u62ff\u8d77\u4e24\u628a\u53c9\u5b50\uff08\u539f\u5b50\u64cd\u4f5c\uff09\uff0c\u5f15\u5165\u4e0d\u5bf9\u79f0\u6027\uff08\u4e00\u4f4d\u54f2\u5b66\u5bb6\u5148\u62ff\u53f3\u8fb9\u7684\u53c9\u5b50\uff09\uff0c\u6216\u8005\u4f7f\u7528\u670d\u52a1\u5458\uff08\u9650\u5236\u7528\u9910\u4eba\u6570\u4e3a4\u7684\u4fe1\u53f7\u91cf\uff09\u3002
\u6b7b\u9501\u7684\u56db\u4e2a\u5fc5\u8981\u6761\u4ef6\uff08\u5fc5\u987b\u540c\u65f6\u6ee1\u8db3\uff09\uff1a
\u6b7b\u9501\u9884\u9632\u6253\u7834\u56db\u4e2a\u6761\u4ef6\u4e4b\u4e00\uff1a
\u6b7b\u9501\u907f\u514d\u52a8\u6001\u51b3\u5b9a\u662f\u5426\u6279\u51c6\u4e00\u4e2a\u8d44\u6e90\u8bf7\u6c42\u53ef\u80fd\u5bfc\u81f4\u6b7b\u9501\u3002\u94f6\u884c\u5bb6\u7b97\u6cd5\u7ef4\u62a4\u6bcf\u4e2a\u7ebf\u7a0b\u7684\u6700\u5927\u53ef\u80fd\u9700\u6c42\uff0c\u4ec5\u6279\u51c6\u4f7f\u7cfb\u7edf\u4fdd\u6301\"\u5b89\u5168\u72b6\u6001\"\uff08\u6240\u6709\u7ebf\u7a0b\u6700\u7ec8\u90fd\u80fd\u5b8c\u6210\u7684\u72b6\u6001\uff09\u7684\u8bf7\u6c42\u3002\u8be5\u7b97\u6cd5\u6bcf\u4e2a\u8bf7\u6c42 \\(O(n^2 m)\\)\uff08\\(n\\)\u4e2a\u7ebf\u7a0b\uff0c\\(m\\)\u79cd\u8d44\u6e90\u7c7b\u578b\uff09\uff0c\u5bf9\u5927\u591a\u6570\u5b9e\u9645\u7cfb\u7edf\u6765\u8bf4\u8fc7\u4e8e\u6602\u8d35\u3002
\u6b7b\u9501\u68c0\u6d4b\u8ba9\u6b7b\u9501\u53d1\u751f\uff0c\u7136\u540e\u68c0\u6d4b\u5b83\u4eec\uff08\u901a\u8fc7\u5728\u7b49\u5f85\u56fe\u4e2d\u627e\u5230\u5faa\u73af\uff09\u5e76\u6062\u590d\uff08\u901a\u8fc7\u6740\u6b7b\u4e00\u4e2a\u7ebf\u7a0b\u6216\u56de\u6eda\u4e00\u4e2a\u4e8b\u52a1\uff09\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u5927\u591a\u6570\u7cfb\u7edf\u5bf9\u5e38\u89c1\u60c5\u51b5\u4f7f\u7528\u9884\u9632\uff08\u8d44\u6e90\u6392\u5e8f\uff09\uff0c\u5bf9\u7f55\u89c1\u60c5\u51b5\u4f7f\u7528\u68c0\u6d4b\u3002\u6570\u636e\u5e93\u7cfb\u7edf\u662f\u7ecf\u5178\u4f8b\u5b50\uff1a\u5b83\u4eec\u68c0\u6d4b\u4e8b\u52a1\u4e4b\u95f4\u7684\u6b7b\u9501\u5e76\u4e2d\u6b62\u4e00\u4e2a\u6765\u6253\u7834\u5faa\u73af\u3002
\u9501\u5f15\u5165\u4e86\u4e89\u7528\u3001\u4f18\u5148\u7ea7\u53cd\u8f6c\u548c\u6b7b\u9501\u98ce\u9669\u3002\u65e0\u9501\u6570\u636e\u7ed3\u6784\u5b8c\u5168\u907f\u514d\u4f7f\u7528\u9501\uff0c\u4f7f\u7528\u786c\u4ef6\u63d0\u4f9b\u7684\u539f\u5b50\u64cd\u4f5c\u3002
\u5173\u952e\u7684\u539f\u5b50\u64cd\u4f5c\u662f\u6bd4\u8f83\u5e76\u4ea4\u6362\uff08CAS\uff09\uff1a\u539f\u5b50\u5730\u68c0\u67e5\u4e00\u4e2a\u5185\u5b58\u4f4d\u7f6e\u662f\u5426\u5177\u6709\u671f\u671b\u7684\u503c\uff0c\u5982\u679c\u662f\uff0c\u5219\u5c06\u5176\u66ff\u6362\u4e3a\u65b0\u503c\u3002\u4f2a\u4ee3\u7801\uff1a
CAS(address, expected, new_value):\n if *address == expected:\n *address = new_value\n return true\n else:\n return false\n CAS\u5b9e\u73b0\u4e3a\u5355\u4e2a\u786c\u4ef6\u6307\u4ee4\uff0c\u56e0\u6b64\u5373\u4f7f\u6ca1\u6709\u9501\u4e5f\u662f\u539f\u5b50\u7684\u3002\u65e0\u9501\u7b97\u6cd5\u4f7f\u7528\u91cd\u8bd5\u5faa\u73af\u4e2d\u7684CAS\uff1a\u8bfb\u53d6\u5f53\u524d\u503c\uff0c\u8ba1\u7b97\u65b0\u503c\uff0c\u5c1d\u8bd5CAS\u3002\u5982\u679c\u53e6\u4e00\u4e2a\u7ebf\u7a0b\u5728\u6b64\u671f\u95f4\u4fee\u6539\u4e86\u8be5\u503c\uff0cCAS\u5931\u8d25\uff0c\u7ebf\u7a0b\u91cd\u8bd5\u3002
\u65e0\u9501\uff1a\u81f3\u5c11\u4e00\u4e2a\u7ebf\u7a0b\u5728\u6709\u9650\u6b65\u9aa4\u5185\u53d6\u5f97\u8fdb\u5c55\uff08\u4e0d\u53ef\u80fd\u6b7b\u9501\uff0c\u4f46\u4e2a\u522b\u7ebf\u7a0b\u5728\u4e89\u7528\u4e0b\u53ef\u80fd\u65e0\u9650\u91cd\u8bd5\uff09\u3002
\u514d\u7b49\u5f85\uff1a\u6bcf\u4e2a\u7ebf\u7a0b\u5728\u6709\u9650\u6b65\u9aa4\u5185\u53d6\u5f97\u8fdb\u5c55\uff08\u6700\u5f3a\u4fdd\u8bc1\uff0c\u4f46\u6700\u96be\u5b9e\u73b0\uff09\u3002
\u65e0\u9501\u7684\u5806\u6808\u3001\u961f\u5217\u548c\u54c8\u5e0c\u6620\u5c04\u5e7f\u6cdb\u7528\u4e8e\u9ad8\u6027\u80fd\u7cfb\u7edf\u3002Java\u7684 ConcurrentHashMap \u548cGo\u7684\u539f\u5b50\u64cd\u4f5c\u90fd\u5efa\u7acb\u5728CAS\u4e4b\u4e0a\u3002
#pragma omp parallel for\nfor (int i = 0; i < n; i++) {\n result[i] = compute(data[i]);\n}\n \u7f16\u8bd1\u5668\u5c06\u5faa\u73af\u8fed\u4ee3\u62c6\u5206\u5230\u53ef\u7528\u7684\u6838\u5fc3\u4e0a\u3002OpenMP\u5bf9\u6570\u636e\u5e76\u884c\u5de5\u4f5c\u8d1f\u8f7d\uff08\u5bf9\u8bb8\u591a\u6570\u636e\u70b9\u6267\u884c\u76f8\u540c\u64cd\u4f5c\uff09\u5f88\u6709\u6548\uff0c\u5e7f\u6cdb\u7528\u4e8e\u79d1\u5b66\u8ba1\u7b97\u3002
\u6d88\u606f\u4f20\u9012\u5e76\u884c\uff1a\u6bcf\u4e2a\u8fdb\u7a0b\u6709\u81ea\u5df1\u7684\u5185\u5b58\u3002\u901a\u4fe1\u901a\u8fc7\u53d1\u9001\u548c\u63a5\u6536\u6d88\u606f\u5b9e\u73b0\u3002MPI\uff08\u6d88\u606f\u4f20\u9012\u63a5\u53e3\uff09\u662f\u8de8\u8282\u70b9\u5206\u5e03\u5f0f\u8ba1\u7b97\u7684\u6807\u51c6\uff1a
MPI_Send(data, count, MPI_FLOAT, dest, tag, MPI_COMM_WORLD);\nMPI_Recv(data, count, MPI_FLOAT, src, tag, MPI_COMM_WORLD, &status);\n MPI\u53ef\u6269\u5c55\u5230\u6570\u5343\u4e2a\u8282\u70b9\uff0c\u56e0\u4e3a\u6ca1\u6709\u9700\u8981\u540c\u6b65\u7684\u5171\u4eab\u72b6\u6001\u3002\u5206\u5e03\u5f0f\u6df1\u5ea6\u5b66\u4e60\uff08\u7b2c6\u7ae0\uff09\u4f7f\u7528\u96c6\u5408\u64cd\u4f5c\u5982 MPI_AllReduce\uff08\u73af\u72b6 all-reduce\uff09\u6765\u8de8GPU\u540c\u6b65\u68af\u5ea6\u3002
GPU\u5e76\u884c\u9075\u5faaSIMT\uff08\u5355\u6307\u4ee4\u591a\u7ebf\u7a0b\uff09\u6a21\u578b\uff1a\u6570\u5343\u4e2a\u7ebf\u7a0b\u5728\u4e0d\u540c\u6570\u636e\u4e0a\u6267\u884c\u76f8\u540c\u7684\u6307\u4ee4\u3002\u8fd9\u975e\u5e38\u9002\u5408\u77e9\u9635\u8fd0\u7b97\uff08\u7b2c2\u7ae0\uff09\uff0c\u5176\u4e2d\u76f8\u540c\u7684\u4e58\u52a0\u64cd\u4f5c\u5e94\u7528\u4e8e\u6bcf\u4e2a\u5143\u7d20\u3002\u6211\u4eec\u5c06\u5728\u540e\u7eed\u7ae0\u8282\u4e2d\u8be6\u7ec6\u4ecb\u7ecdGPU\u7f16\u7a0b\u3002
\u5e76\u975e\u6240\u6709\u5e76\u53d1\u90fd\u9700\u8981\u7ebf\u7a0b\u3002\u5f02\u6b65\u7f16\u7a0b\u4f7f\u7528\u4e8b\u4ef6\u5faa\u73af\u5728\u5355\u4e2a\u7ebf\u7a0b\u4e2d\u5904\u7406\u8bb8\u591aI/O\u5bc6\u96c6\u578b\u4efb\u52a1\u3002
\u4e8b\u4ef6\u5faa\u73af\u7ef4\u62a4\u4e00\u4e2a\u4efb\u52a1\u961f\u5217\u3002\u5f53\u4e00\u4e2a\u4efb\u52a1\u9700\u8981\u7b49\u5f85I/O\uff08\u7f51\u7edc\u54cd\u5e94\u3001\u6587\u4ef6\u8bfb\u53d6\uff09\u65f6\uff0c\u5b83\u6ce8\u518c\u4e00\u4e2a\u56de\u8c03\u5e76\u4ea4\u51fa\u63a7\u5236\u6743\u3002\u4e8b\u4ef6\u5faa\u73af\u9009\u53d6\u4e0b\u4e00\u4e2a\u5c31\u7eea\u7684\u4efb\u52a1\u3002\u5f53I/O\u5b8c\u6210\u65f6\uff0c\u56de\u8c03\u88ab\u6392\u961f\u5e76\u6700\u7ec8\u6267\u884c\u3002\u7b49\u5f85\u671f\u95f4\u6ca1\u6709\u7ebf\u7a0b\u88ab\u963b\u585e\u3002
\u534f\u7a0b\u662f\u53ef\u4ee5\u6682\u505c\u548c\u6062\u590d\u7684\u51fd\u6570\u3002async/await \u8bed\u6cd5\uff08Python\u3001JavaScript\u3001Rust\uff09\u4f7f\u534f\u7a0b\u770b\u8d77\u6765\u50cf\u5e38\u89c4\u7684\u987a\u5e8f\u4ee3\u7801\uff1a
async def fetch_data(url):\n response = await http_get(url) # \u5728\u6b64\u6682\u505c\uff0c\u4e8b\u4ef6\u5faa\u73af\u8fd0\u884c\u5176\u4ed6\u4efb\u52a1\n return process(response) # \u54cd\u5e94\u5230\u8fbe\u65f6\u6062\u590d\n await \u5173\u952e\u5b57\u6682\u505c\u534f\u7a0b\u5e76\u5c06\u63a7\u5236\u6743\u8fd4\u56de\u7ed9\u4e8b\u4ef6\u5faa\u73af\u3002\u5f53\u7b49\u5f85\u7684\u64cd\u4f5c\u5b8c\u6210\u65f6\uff0c\u534f\u7a0b\u4ece\u4e2d\u65ad\u5904\u6062\u590d\u3002\u8fd9\u662f\u534f\u4f5c\u5f0f\u591a\u4efb\u52a1\uff1a\u534f\u7a0b\u81ea\u613f\u653e\u5f03\u63a7\u5236\uff0c\u4e0d\u540c\u4e8e\u62a2\u5360\u5f0f\u591a\u4efb\u52a1\u4e2dOS\u5f3a\u5236\u5207\u6362\u7ebf\u7a0b\u3002
\u5f02\u6b65\u9002\u7528\u4e8e\u5177\u6709\u8bb8\u591a\u5e76\u53d1\u8fde\u63a5\u7684I/O\u5bc6\u96c6\u578b\u5de5\u4f5c\u8d1f\u8f7d\uff08\u5904\u7406\u6570\u5343\u4e2a\u5ba2\u6237\u7684Web\u670d\u52a1\u5668\uff09\u3002\u5b83\u4e0d\u9002\u7528\u4e8eCPU\u5bc6\u96c6\u578b\u5de5\u4f5c\uff08\u5355\u7ebf\u7a0b\u4e8b\u4ef6\u5faa\u73af\u65e0\u6cd5\u5229\u7528\u591a\u6838\uff09\u3002\u5bf9\u4e8eCPU\u5bc6\u96c6\u578b\u5de5\u4f5c\uff0c\u8bf7\u4f7f\u7528\u7ebf\u7a0b\u6216\u8fdb\u7a0b\u3002
Python\u7684\u5168\u5c40\u89e3\u91ca\u5668\u9501\uff08GIL\uff09\u963b\u6b62\u7ebf\u7a0b\u771f\u6b63\u7684\u5e76\u884c\uff1a\u4e00\u6b21\u53ea\u6709\u4e00\u4e2a\u7ebf\u7a0b\u53ef\u4ee5\u6267\u884cPython\u5b57\u8282\u7801\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48Python\u5bf9CPU\u5e76\u884c\u4f7f\u7528\u591a\u5904\u7406\uff08\u72ec\u7acb\u7684\u8fdb\u7a0b\uff0c\u6bcf\u4e2a\u6709\u81ea\u5df1\u7684\u89e3\u91ca\u5668\uff09\uff0c\u5bf9I/O\u5e76\u53d1\u4f7f\u7528\u5f02\u6b65\u3002GIL\u6b63\u5728Python 3.13+\u4e2d\u88ab\u79fb\u9664\uff08\u81ea\u7531\u7ebf\u7a0bPython\uff09\uff0c\u8fd9\u5c06\u542f\u7528\u771f\u6b63\u7684\u591a\u7ebf\u7a0b\u5e76\u884c\u3002
\u5176\u4e2d\\(n\\)\u662f\u5904\u7406\u5668\u6570\u91cf\u3002\u5f53 \\(n \\to \\infty\\) \u65f6\uff0c\u6700\u5927\u52a0\u901f\u6bd4\u8d8b\u8fd1\u4e8e \\(\\frac{1}{1-p}\\)\u3002\u5982\u679c95%\u7684\u7a0b\u5e8f\u662f\u5e76\u884c\u7684\uff0c\u6700\u5927\u52a0\u901f\u6bd4\u4e3a \\(\\frac{1}{0.05} = 20\\times\\)\uff0c\u65e0\u8bba\u4f60\u6dfb\u52a0\u591a\u5c11\u6838\u5fc3\u3002\u4e32\u884c\u90e8\u5206\u5c31\u662f\u74f6\u9888\u3002
\u8fd9\u5bf9ML\u6709\u6df1\u8fdc\u5f71\u54cd\uff1a\u5982\u679c\u6570\u636e\u52a0\u8f7d\u82b1\u8d39\u8bad\u7ec3\u65f6\u95f4\u768410%\u5e76\u4e14\u662f\u4e32\u884c\u7684\uff0c\u589e\u52a0\u66f4\u591aGPU\u6700\u591a\u53ea\u80fd\u5c06\u8bad\u7ec3\u52a0\u901f10\u500d\u300210%\u7684\u4e32\u884c\u74f6\u9888\u9650\u5236\u4e86\u6240\u6709\u4e1c\u897f\uff08\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u9ad8\u6548\u7684\u6570\u636e\u7ba1\u9053\u548cI/O\u4e0e\u8ba1\u7b97\u91cd\u53e0\u5f88\u91cd\u8981\uff0c\u7b2c6\u7ae0\uff09\u3002
\u53e4\u65af\u5854\u592b\u68ee\u5b9a\u5f8b\u63d0\u4f9b\u4e86\u66f4\u4e50\u89c2\u7684\u89c6\u89d2\u3002\u5b83\u4e0d\u662f\u5728\u56fa\u5b9a\u95ee\u9898\u89c4\u6a21\u5e76\u6dfb\u52a0\u5904\u7406\u5668\uff0c\u800c\u662f\u56fa\u5b9a\u603b\u65f6\u95f4\u5e76\u95ee\u53ef\u4ee5\u505a\u591a\u5c11\u989d\u5916\u5de5\u4f5c\u3002\u5982\u679c\u5e76\u884c\u90e8\u5206\u968f\u95ee\u9898\u89c4\u6a21\u6269\u5c55\uff1a
\u6f14\u793a\u7ade\u6001\u6761\u4ef6\u3002\u4e24\u4e2a\u7ebf\u7a0b\u5728\u6ca1\u6709\u540c\u6b65\u7684\u60c5\u51b5\u4e0b\u589e\u52a0\u4e00\u4e2a\u5171\u4eab\u8ba1\u6570\u5668\uff0c\u89c2\u5bdf\u4e22\u5931\u7684\u66f4\u65b0\u3002
import threading\n\ncounter = 0\n\ndef increment(n):\n global counter\n for _ in range(n):\n counter += 1 # \u4e0d\u662f\u539f\u5b50\u7684\uff1a\u8bfb\u3001\u52a0\u3001\u5199\n\nthreads = [threading.Thread(target=increment, args=(100000,)) for _ in range(4)]\nfor t in threads: t.start()\nfor t in threads: t.join()\n\nprint(f\"Expected: {4 * 100000}\")\nprint(f\"Actual: {counter}\")\nprint(f\"Lost updates: {4 * 100000 - counter}\")\n \u7528\u9501\u4fee\u590d\u7ade\u6001\u6761\u4ef6\u5e76\u6d4b\u91cf\u5f00\u9500\u3002
import threading\nimport time\n\nlock = threading.Lock()\ncounter = 0\n\ndef increment_locked(n):\n global counter\n for _ in range(n):\n with lock:\n counter += 1\n\nstart = time.time()\nthreads = [threading.Thread(target=increment_locked, args=(100000,)) for _ in range(4)]\nfor t in threads: t.start()\nfor t in threads: t.join()\nelapsed = time.time() - start\n\nprint(f\"Counter: {counter} (correct: {4 * 100000})\")\nprint(f\"Time with lock: {elapsed:.3f}s\")\n \u53ef\u89c6\u5316\u963f\u59c6\u8fbe\u5c14\u5b9a\u5f8b\u3002\u7ed8\u5236\u4e0d\u540c\u5e76\u884c\u6bd4\u4f8b\u4e0b\u52a0\u901f\u6bd4\u4e0e\u5904\u7406\u5668\u6570\u91cf\u7684\u5173\u7cfb\u56fe\u3002
import jax.numpy as jnp\nimport matplotlib.pyplot as plt\n\nn_procs = jnp.arange(1, 65)\n\nfor p, color in [(0.5, \"#e74c3c\"), (0.9, \"#f39c12\"), (0.95, \"#27ae60\"), (0.99, \"#3498db\")]:\n speedup = 1 / ((1 - p) + p / n_procs)\n plt.plot(n_procs, speedup, color=color, linewidth=2, label=f\"p={p}\")\n # \u6700\u5927\u52a0\u901f\u6bd4\u7ebf\n plt.axhline(1 / (1 - p), color=color, linestyle=\"--\", alpha=0.3)\n\nplt.xlabel(\"\u5904\u7406\u5668\u6570\u91cf\")\nplt.ylabel(\"\u52a0\u901f\u6bd4\")\nplt.title(\"\u963f\u59c6\u8fbe\u5c14\u5b9a\u5f8b\uff1a\u4e32\u884c\u6bd4\u4f8b\u9650\u5236\u52a0\u901f\u6bd4\")\nplt.legend()\nplt.grid(True)\nplt.show()\n \u7f16\u7a0b\u8bed\u8a00\u662f\u4eba\u7c7b\u610f\u56fe\u4e0e\u673a\u5668\u6267\u884c\u4e4b\u95f4\u7684\u63a5\u53e3\u3002\u672c\u6587\u6db5\u76d6\u8bed\u8a00\u8303\u5f0f\u3001\u7c7b\u578b\u7cfb\u7edf\u3001\u5185\u5b58\u7ba1\u7406\u7b56\u7565\u3001\u7f16\u8bd1\u6d41\u6c34\u7ebf\u3001\u89e3\u91ca\u4e0eJIT\u7f16\u8bd1\u3001\u5173\u952e\u8bed\u8a00\u7279\u6027\u3001\u9886\u57df\u7279\u5b9a\u8bed\u8a00\u4ee5\u53ca\u8bbe\u8ba1\u6743\u8861\u3002
\u8303\u5f0f\u662f\u4e00\u79cd\u7f16\u7a0b\u98ce\u683c\uff1a\u4e00\u5957\u6307\u5bfc\u4f60\u5982\u4f55\u7ec4\u7ec7\u4ee3\u7801\u548c\u601d\u8003\u95ee\u9898\u7684\u539f\u5219\u3002
\u547d\u4ee4\u5f0f\u7f16\u7a0b\u5c06\u8ba1\u7b97\u63cf\u8ff0\u4e3a\u4e00\u7cfb\u5217\u6539\u53d8\u72b6\u6001\u7684\u547d\u4ee4\u3002\"\u8bbex\u4e3a5\u3002\u5c063\u52a0\u5230x\u3002\u5982\u679cx > 7\uff0c\u6253\u5370\u5b83\u3002\"C\u3001Python\u548cJava\u672c\u8d28\u4e0a\u662f\u547d\u4ee4\u5f0f\u7684\u3002\u5fc3\u667a\u6a21\u578b\u662f\u4e00\u4e2a\u5e26\u6709\u5185\u5b58\u7684\u673a\u5668\uff0c\u4f60\u9010\u6b65\u4fee\u6539\u5b83\u3002
\u9762\u5411\u5bf9\u8c61\uff08OOP\uff09\u7f16\u7a0b\u56f4\u7ed5\u5bf9\u8c61\u7ec4\u7ec7\u4ee3\u7801\uff1a\u6570\u636e\uff08\u5c5e\u6027\uff09\u548c\u884c\u4e3a\uff08\u65b9\u6cd5\uff09\u7684\u6346\u7ed1\u3002\u5bf9\u8c61\u901a\u8fc7\u76f8\u4e92\u53d1\u9001\u6d88\u606f\u6765\u4ea4\u4e92\u3002\u5173\u952e\u601d\u60f3\u662f\u5c01\u88c5\uff08\u5c06\u5185\u90e8\u72b6\u6001\u9690\u85cf\u5728\u516c\u5171\u63a5\u53e3\u4e4b\u540e\uff09\u3001\u7ee7\u627f\uff08\u901a\u8fc7\u6269\u5c55\u73b0\u6709\u7c7b\u521b\u5efa\u65b0\u7c7b\uff09\u548c\u591a\u6001\uff08\u901a\u8fc7\u5171\u4eab\u63a5\u53e3\u7edf\u4e00\u5904\u7406\u4e0d\u540c\u7c7b\u578b\uff09\u3002Java\u3001C++\u548cPython\u652f\u6301OOP\u3002
\u51fd\u6570\u5f0f\u7f16\u7a0b\uff08FP\uff09\u5c06\u8ba1\u7b97\u89c6\u4e3a\u6570\u5b66\u51fd\u6570\u7684\u6c42\u503c\u3002\u6838\u5fc3\u539f\u5219\uff1a\u4e0d\u53ef\u53d8\u6027\uff08\u6570\u636e\u4e00\u65e6\u521b\u5efa\u5c31\u4e0d\u6539\u53d8\uff09\u3001\u7eaf\u51fd\u6570\uff08\u8f93\u51fa\u4ec5\u53d6\u51b3\u4e8e\u8f93\u5165\uff0c\u65e0\u526f\u4f5c\u7528\uff09\u548c\u4e00\u7b49\u51fd\u6570\uff08\u51fd\u6570\u662f\u53ef\u4ee5\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u3001\u4ece\u5176\u4ed6\u51fd\u6570\u8fd4\u56de\u548c\u5b58\u50a8\u5728\u53d8\u91cf\u4e2d\u7684\u503c\uff09\u3002Haskell\u662f\u7eaf\u51fd\u6570\u5f0f\u7684\u3002Python\u3001JavaScript\u548cScala\u652f\u6301\u51fd\u6570\u5f0f\u98ce\u683c\u3002
\u7eaf\u51fd\u6570\u6613\u4e8e\u63a8\u7406\u3001\u6d4b\u8bd5\u548c\u5e76\u884c\u5316\uff08\u6ca1\u6709\u5171\u4eab\u7684\u53ef\u53d8\u72b6\u6001\u610f\u5473\u7740\u6ca1\u6709\u7ade\u6001\u6761\u4ef6\uff09\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u51fd\u6570\u5f0f\u601d\u60f3\u8d8a\u6765\u8d8a\u591a\u5730\u7528\u4e8e\u5206\u5e03\u5f0f\u7cfb\u7edf\u548c\u6570\u636e\u7ba1\u9053\u3002JAX\uff08\u672c\u4e66\u4e2d\u4e00\u76f4\u5728\u4f7f\u7528\uff09\u662f\u51fd\u6570\u5f0f\u7684\uff1ajax.grad \u4e4b\u6240\u4ee5\u6709\u6548\uff0c\u662f\u56e0\u4e3aJAX\u51fd\u6570\u662f\u7eaf\u51fd\u6570\u3002
\u903b\u8f91\u7f16\u7a0b\u63cf\u8ff0\u4ec0\u4e48\u5e94\u8be5\u4e3a\u771f\uff0c\u800c\u4e0d\u662f\u5982\u4f55\u8ba1\u7b97\u5b83\u3002\u4f60\u9648\u8ff0\u4e8b\u5b9e\u548c\u89c4\u5219\uff0c\u8fd0\u884c\u65f6\u627e\u5230\u89e3\u3002Prolog\u662f\u7ecf\u5178\u4f8b\u5b50\uff1a\u7ed9\u5b9a\"\u82cf\u683c\u62c9\u5e95\u662f\u4eba\"\u548c\"\u6240\u6709\u4eba\u90fd\u662f\u5fc5\u6b7b\u7684\"\uff0c\u5f15\u64ce\u63a8\u5bfc\u51fa\"\u82cf\u683c\u62c9\u5e95\u662f\u5fc5\u6b7b\u7684\u3002\"\u903b\u8f91\u7f16\u7a0b\u7528\u4e8eAI\u77e5\u8bc6\u5e93\u548c\u7c7b\u578b\u68c0\u67e5\u3002
\u5927\u591a\u6570\u73b0\u4ee3\u8bed\u8a00\u662f\u591a\u8303\u5f0f\u7684\uff1aPython\u652f\u6301\u547d\u4ee4\u5f0f\u3001OOP\u548c\u51fd\u6570\u5f0f\u98ce\u683c\u3002Rust\u652f\u6301\u547d\u4ee4\u5f0f\u548c\u51fd\u6570\u5f0f\u3002\u8303\u5f0f\u662f\u4e00\u79cd\u5de5\u5177\uff0c\u4e0d\u662f\u4fe1\u4ef0\u3002
\u7c7b\u578b\u5bf9\u503c\u8fdb\u884c\u5206\u7c7b\uff0c\u5e76\u786e\u5b9a\u54ea\u4e9b\u64cd\u4f5c\u662f\u6709\u6548\u7684\u3002\u6574\u65703\u548c\u5b57\u7b26\u4e32\"3\"\u662f\u4e0d\u540c\u7684\u7c7b\u578b\uff1a\u4f60\u53ef\u4ee5\u5bf9\u6574\u6570\u8fdb\u884c\u52a0\u6cd5\uff0c\u4f46\u4e0d\u80fd\u5bf9\u5b57\u7b26\u4e32\uff08\u597d\u5427\uff0c\u4f60\u53ef\u4ee5\u62fc\u63a5\u5b57\u7b26\u4e32\uff0c\u4f46\u90a3\u662f\u4e0d\u540c\u7684\u64cd\u4f5c\uff09\u3002
\u9759\u6001\u7c7b\u578b\uff1a\u7c7b\u578b\u5728\u7f16\u8bd1\u65f6\u68c0\u67e5\uff0c\u5728\u7a0b\u5e8f\u8fd0\u884c\u4e4b\u524d\u3002\u7c7b\u578b\u9519\u8bef\u53ca\u65e9\u88ab\u53d1\u73b0\u3002C\u3001Java\u3001Rust\u548cGo\u662f\u9759\u6001\u7c7b\u578b\u7684\u3002\u4f60\u5fc5\u987b\u58f0\u660e\u7c7b\u578b\uff08\u6216\u8005\u7f16\u8bd1\u5668\u63a8\u65ad\u5b83\u4eec\uff09\uff1a
let x: i32 = 5; // Rust\uff1ax\u662f\u4e00\u4e2a32\u4f4d\u6574\u6570\nlet y: f64 = 3.14; // y\u662f\u4e00\u4e2a64\u4f4d\u6d6e\u70b9\u6570\n// let z = x + y; // \u7f16\u8bd1\u9519\u8bef\uff1a\u4e0d\u80fd\u52a0 i32 \u548c f64\n x = 5 # x\u662f\u4e00\u4e2aint\uff08\u76ee\u524d\uff09\nx = \"hello\" # \u73b0\u5728x\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32\u2014\u2014\u6ca1\u6709\u9519\u8bef\n \u5f3a\u7c7b\u578b\uff1a\u8bed\u8a00\u963b\u6b62\u9690\u5f0f\u7c7b\u578b\u8f6c\u6362\u3002Python\u662f\u5f3a\u7c7b\u578b\u7684\uff1a\"3\" + 5 \u5f15\u53d1TypeError\u3002\u5f31\u7c7b\u578b\uff1a\u8bed\u8a00\u9759\u9ed8\u5730\u8f6c\u6362\u7c7b\u578b\u3002JavaScript\u662f\u5f31\u7c7b\u578b\u7684\uff1a\"3\" + 5 \u5f97\u5230 \"35\"\uff08\u6570\u5b57\u88ab\u5f3a\u5236\u8f6c\u6362\u4e3a\u5b57\u7b26\u4e32\uff09\u3002C\u662f\u5f31\u7c7b\u578b\u7684\uff1a\u4f60\u53ef\u4ee5\u5c06\u6307\u9488\u5f3a\u5236\u8f6c\u6362\u4e3a\u6574\u6570\u3002
\u7c7b\u578b\u63a8\u65ad\u8ba9\u7f16\u8bd1\u5668\u63a8\u5bfc\u7c7b\u578b\u800c\u65e0\u9700\u663e\u5f0f\u6ce8\u89e3\uff1a
let x = 5; // \u7f16\u8bd1\u5668\u63a8\u65ad\uff1ai32\nlet y = x + 3.0; // \u7f16\u8bd1\u9519\u8bef\uff1a\u6df7\u5408\u7c7b\u578b\uff0c\u5373\u4f7f\u6709\u63a8\u65ad\n fn largest<T: PartialOrd>(list: &[T]) -> &T {\n let mut max = &list[0];\n for item in &list[1..] {\n if item > max { max = item; }\n }\n max\n}\n// \u9002\u7528\u4e8e\u6574\u6570\u3001\u6d6e\u70b9\u6570\u3001\u5b57\u7b26\u4e32\u2014\u2014\u4efb\u4f55\u652f\u6301\u6bd4\u8f83\u7684\u7c7b\u578b\n def train(model: nn.Module, lr: float) -> float\uff09\u548c\u9759\u6001\u5206\u6790\u5de5\u5177\uff08mypy\uff09\u4ee5\u5728\u90e8\u7f72\u524d\u6355\u83b7\u9519\u8bef\u3002PyTorch\u548cJAX\u4f7f\u7528Python\u4ee5\u83b7\u5f97\u7075\u6d3b\u6027\uff1bTensorRT\u548cONNX Runtime\u4f7f\u7528C++\u4ee5\u83b7\u5f97\u6027\u80fd\u3002\u5806\u6808\u5b58\u50a8\u5c40\u90e8\u53d8\u91cf\u548c\u51fd\u6570\u8c03\u7528\u5e27\u3002\u5206\u914d\u5f88\u7b80\u5355\uff08\u79fb\u52a8\u6808\u6307\u9488\uff09\uff0c\u91ca\u653e\u662f\u81ea\u52a8\u7684\uff08\u51fd\u6570\u8fd4\u56de\u65f6\u5f39\u51fa\u5e27\uff09\u3002\u5806\u6808\u8bbf\u95ee\u5f88\u5feb\uff0c\u56e0\u4e3a\u5b83\u603b\u5728\u7f13\u5b58\u4e2d\u3002\u4f46\u5806\u6808\u6709\u56fa\u5b9a\u5927\u5c0f\uff08\u901a\u5e381-8 MB\uff09\uff0c\u4e14\u4ec5\u652f\u6301LIFO\uff08\u540e\u8fdb\u5148\u51fa\uff09\u5206\u914d\u3002
\u5806\u5b58\u50a8\u52a8\u6001\u5206\u914d\u7684\u6570\u636e\uff08\u7f16\u8bd1\u65f6\u5927\u5c0f\u672a\u77e5\u7684\u5bf9\u8c61\u3001\u6570\u7ec4\u3001\u5b57\u7b26\u4e32\uff09\u3002\u5806\u5206\u914d\u8f83\u6162\uff08\u9700\u8981\u627e\u5230\u4e00\u4e2a\u7a7a\u95f2\u5757\uff09\uff0c\u9700\u8981\u663e\u5f0f\u6216\u81ea\u52a8\u91ca\u653e\u3002\u5806\u53ef\u4ee5\u589e\u957f\u5230\u586b\u6ee1\u53ef\u7528\u5185\u5b58\u3002
\u624b\u52a8\u5185\u5b58\u7ba1\u7406\uff08C\u3001C++\uff09\uff1a\u7a0b\u5e8f\u5458\u663e\u5f0f\u5206\u914d\uff08malloc\uff09\u548c\u91ca\u653e\uff08free\uff09\u5806\u5185\u5b58\u3002\u6700\u5927\u63a7\u5236\u548c\u6027\u80fd\uff0c\u4f46\u6781\u6613\u51fa\u9519\uff1a
\u5783\u573e\u56de\u6536\uff08GC\uff09\uff1a\u8fd0\u884c\u65f6\u81ea\u52a8\u68c0\u6d4b\u5e76\u91ca\u653e\u4e0d\u518d\u53ef\u8fbe\u7684\u5185\u5b58\u3002\u7a0b\u5e8f\u5458\u4ece\u4e0d\u8c03\u7528 free\u3002
\u8ddf\u8e2aGC\uff08Java\u3001Go\u3001Python\u7684\u5faa\u73af\u6536\u96c6\u5668\uff09\uff1a\u5b9a\u671f\u4ece\"\u6839\"\uff08\u5806\u6808\u53d8\u91cf\u3001\u5168\u5c40\u53d8\u91cf\uff09\u904d\u5386\u6240\u6709\u53ef\u8fbe\u5bf9\u8c61\uff0c\u91ca\u653e\u4e0d\u53ef\u8fbe\u5bf9\u8c61\u3002\u7b80\u5355\u4f46\u5bfc\u81f4GC\u6682\u505c\uff1a\u6536\u96c6\u5668\u8fd0\u884c\u65f6\u7a0b\u5e8f\u505c\u6b62\u3002\u73b0\u4ee3\u6536\u96c6\u5668\uff08Go\u7684\u5e76\u53d1GC\u3001Java\u7684ZGC\uff09\u5c06\u6682\u505c\u65f6\u95f4\u6700\u5c0f\u5316\u5230\u4e9a\u6beb\u79d2\u7ea7\u3002
\u5f15\u7528\u8ba1\u6570\uff08Python\u7684\u4e3b\u8981\u673a\u5236\u3001Swift\u3001Objective-C\uff09\uff1a\u6bcf\u4e2a\u5bf9\u8c61\u8ddf\u8e2a\u6709\u591a\u5c11\u5f15\u7528\u6307\u5411\u5b83\u3002\u5f53\u8ba1\u6570\u964d\u52300\u65f6\uff0c\u5bf9\u8c61\u88ab\u7acb\u5373\u91ca\u653e\u3002\u65e0\u6682\u505c\uff0c\u4f46\u65e0\u6cd5\u5904\u7406\u5faa\u73af\uff08A\u5f15\u7528B\uff0cB\u5f15\u7528A\uff0c\u4e24\u8005\u8ba1\u6570\u90fd > 0 \u4f46\u90fd\u4e0d\u53ef\u8fbe\uff09\u3002Python\u4f7f\u7528\u5355\u72ec\u7684\u5faa\u73af\u68c0\u6d4b\u5668\u6765\u5904\u7406\u6b64\u95ee\u9898\u3002
\u6240\u6709\u6743\uff08Rust\uff09\uff1a\u7f16\u8bd1\u5668\u5728\u7f16\u8bd1\u65f6\u5f3a\u5236\u5b9e\u65bd\u5185\u5b58\u5b89\u5168\u89c4\u5219\uff0c\u96f6\u8fd0\u884c\u65f6\u5f00\u9500\u3002
\u501f\u7528\u68c0\u67e5\u5668\u662fRust\u7684\u6740\u624b\u7ea7\u7279\u6027\uff0c\u4e5f\u662f\u5176\u6700\u9661\u5ced\u7684\u5b66\u4e60\u66f2\u7ebf\u3002\u5b83\u4fdd\u8bc1\u4e86\u5185\u5b58\u5b89\u5168\u548c\u7ebf\u7a0b\u5b89\u5168\uff0c\u4e14\u6ca1\u6709\u5783\u573e\u56de\u6536\uff0c\u8fd9\u5c31\u662fRust\u8d8a\u6765\u8d8a\u591a\u5730\u7528\u4e8e\u6027\u80fd\u5173\u952e\u7cfb\u7edf\uff08OS\u5185\u6838\u3001\u6e38\u620f\u5f15\u64ce\u3001ML\u63a8\u7406\u8fd0\u884c\u65f6\u5982Candle\u548cBurn\uff09\u7684\u539f\u56e0\u3002
\u8bcd\u6cd5\u5206\u6790\uff08\u5206\u8bcd\uff09\uff1a\u5c06\u6e90\u6587\u672c\u8f6c\u6362\u4e3a\u4ee4\u724c\u6d41\u3002x = 3 + y \u53d8\u4e3a [IDENT(\"x\"), EQUALS, INT(3), PLUS, IDENT(\"y\")]\u3002\u8bcd\u6cd5\u5206\u6790\u5668\u53bb\u9664\u7a7a\u767d\u548c\u6ce8\u91ca\u3002
\u8bed\u6cd5\u5206\u6790\uff1a\u4ece\u4ee4\u724c\u6d41\u6784\u5efa\u62bd\u8c61\u8bed\u6cd5\u6811\uff08AST\uff09\u3002AST\u8868\u793a\u7a0b\u5e8f\u7684\u5c42\u6b21\u7ed3\u6784\u30023 + y * 2 \u89e3\u6790\u4e3a Add(3, Mul(y, 2))\uff08\u4e58\u6cd5\u4f18\u5148\u7ea7\u66f4\u9ad8\uff09\u3002\u89e3\u6790\u5668\u68c0\u67e5\u8bed\u6cd5\uff1a\u62ec\u53f7\u4e0d\u5339\u914d\u548c\u7f3a\u5c11\u5206\u53f7\u5728\u6b64\u88ab\u6355\u83b7\u3002
\u8bed\u4e49\u5206\u6790\uff1a\u68c0\u67e5\u7c7b\u578b\u3001\u89e3\u6790\u53d8\u91cf\u540d\u3001\u9a8c\u8bc1\u51fd\u6570\u8c03\u7528\u53c2\u6570\u662f\u5426\u6b63\u786e\u3002\u9759\u6001\u7c7b\u578b\u68c0\u67e5\u5728\u6b64\u53d1\u751f\u3002\u8f93\u51fa\u662f\u5e26\u7c7b\u578b\u6ce8\u89e3\u7684AST\u3002
\u4f18\u5316\uff1a\u5728\u4e0d\u6539\u53d8\u884c\u4e3a\u7684\u60c5\u51b5\u4e0b\u8f6c\u6362\u7a0b\u5e8f\u4ee5\u4f7f\u5176\u8fd0\u884c\u66f4\u5feb\u3002\u5e38\u89c1\u4f18\u5316\uff1a
3 + 5\uff0c\u66ff\u6362\u4e3a 8\u3002\u4ee3\u7801\u751f\u6210\uff1a\u5c06\u4f18\u5316\u540e\u7684\u8868\u793a\u8f6c\u6362\u4e3a\u76ee\u6807\u673a\u5668\u7801\uff08x86\u3001ARM\uff09\u6216\u4e2d\u95f4\u8868\u793a\u3002
LLVM\u662f\u4e3b\u6d41\u7684\u7f16\u8bd1\u5668\u57fa\u7840\u8bbe\u65bd\u3002\u5b83\u63d0\u4f9b\u4e86\u4e00\u4e2a\u901a\u7528\u4e2d\u95f4\u8868\u793a\uff08LLVM IR\uff09\uff0c\u8bb8\u591a\u8bed\u8a00\u53ef\u4ee5\u7f16\u8bd1\u5230\u8be5\u8868\u793a\u4e0a\u3002LLVM\u7684\u4f18\u5316\u5668\u5728\u8fd9\u4e2aIR\u4e0a\u5de5\u4f5c\uff0c\u5176\u540e\u7aef\u4e3a\u8bb8\u591a\u76ee\u6807\u751f\u6210\u673a\u5668\u7801\u3002Clang\uff08C/C++\uff09\u3001Rust\u3001Swift\u3001Julia\u548c\u8bb8\u591a\u5176\u4ed6\u8bed\u8a00\u4f7f\u7528LLVM\u3002\u8fd9\u610f\u5473\u7740LLVM\u4f18\u5316\u5668\u7684\u6539\u8fdb\u540c\u65f6\u60e0\u53ca\u6240\u6709\u8fd9\u4e9b\u8bed\u8a00\u3002
\u89e3\u91ca\u5668\u9010\u884c\uff08\u6216\u9010\u8bed\u53e5\uff09\u6267\u884c\u7a0b\u5e8f\u800c\u4e0d\u4ea7\u751f\u673a\u5668\u7801\u3002\u8fd9\u4f7f\u5f97\u542f\u52a8\u5feb\u901f\u4e14\u5f00\u53d1\u4ea4\u4e92\u5f0f\uff0c\u4f46\u6267\u884c\u8f83\u6162\uff08\u6bcf\u884c\u6bcf\u6b21\u8fd0\u884c\u65f6\u90fd\u8981\u91cd\u65b0\u5206\u6790\uff09\u3002
\u5927\u591a\u6570\u89e3\u91ca\u578b\u8bed\u8a00\u5b9e\u9645\u4e0a\u7f16\u8bd1\u4e3a\u5b57\u8282\u7801\uff1a\u4e00\u79cd\u6bd4\u6e90\u4ee3\u7801\u66f4\u7b80\u5355\u4f46\u4e0d\u7279\u5b9a\u4e8e\u673a\u5668\u7684\u4e2d\u95f4\u8868\u793a\u3002\u5b57\u8282\u7801\u5728\u865a\u62df\u673a\uff08VM\uff09\u4e0a\u8fd0\u884c\u3002
CPython\uff08\u6807\u51c6Python\u5b9e\u73b0\uff09\u5c06Python\u6e90\u4ee3\u7801\u7f16\u8bd1\u4e3a\u5b57\u8282\u7801\uff08.pyc \u6587\u4ef6\uff09\uff0c\u7531CPython VM\u6267\u884c\u3002VM\u9010\u6761\u6307\u4ee4\u89e3\u91ca\u5b57\u8282\u7801\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48Python\u5728\u8ba1\u7b97\u5bc6\u96c6\u578b\u4ee3\u7801\u4e0a\u6bd4C\u6162\u7ea6~100\u500d\u3002
JVM\uff08Java\u865a\u62df\u673a\uff09\uff1aJava\u7f16\u8bd1\u4e3aJVM\u5b57\u8282\u7801\uff08.class \u6587\u4ef6\uff09\u3002JVM\u6700\u521d\u89e3\u91ca\u5b57\u8282\u7801\uff0c\u7136\u540eJIT\u7f16\u8bd1\u9891\u7e41\u6267\u884c\u7684\u4ee3\u7801\u8def\u5f84\uff08\"\u70ed\u70b9\"\uff09\u4e3a\u672c\u673a\u673a\u5668\u7801\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48Java\u542f\u52a8\u6bd4C\u6162\uff08\u89e3\u91ca\u5f00\u9500\uff09\uff0c\u4f46\u5bf9\u4e8e\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u7a0b\u5e8f\uff08JIT\u4f18\u5316\u7684\u70ed\u8def\u5f84\uff09\u63a5\u8fd1C\u7684\u901f\u5ea6\u3002
JIT\uff08\u5373\u65f6\uff09\u7f16\u8bd1\u5728\u8fd0\u884c\u65f6\u5c06\u4ee3\u7801\u7f16\u8bd1\u4e3a\u673a\u5668\u7801\uff0c\u4f7f\u7528\u4ec5\u5728\u6267\u884c\u671f\u95f4\u53ef\u7528\u7684\u4fe1\u606f\u3002JIT\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u8fd0\u884c\u65f6\u6570\u636e\u8fdb\u884c\u4f18\u5316\uff1a\u5982\u679c\u4e00\u4e2a\u51fd\u6570\u603b\u662f\u7528\u6574\u6570\u53c2\u6570\u8c03\u7528\uff0cJIT\u751f\u6210\u4e13\u95e8\u5316\u7684\u4ec5\u6574\u6570\u673a\u5668\u7801\uff0c\u8df3\u8fc7\u7c7b\u578b\u68c0\u67e5\u3002
PyPy\u662f\u53e6\u4e00\u4e2a\u5e26\u6709JIT\u7f16\u8bd1\u5668\u7684Python\u5b9e\u73b0\u3002\u5b83\u901a\u8fc7\u5c06\u70ed\u70b9\u5faa\u73afJIT\u7f16\u8bd1\u4e3a\u673a\u5668\u7801\uff0c\u4f7f\u5927\u591a\u6570Python\u4ee3\u7801\u8fd0\u884c\u901f\u5ea6\u6bd4CPython\u5feb5-10\u500d\u3002\u7136\u800c\uff0c\u5b83\u4e0eC\u6269\u5c55\u6a21\u5757\uff08NumPy\u3001PyTorch\uff09\u7684\u517c\u5bb9\u6027\u6709\u9650\uff0c\u8fd9\u9650\u5236\u4e86\u5b83\u5728ML\u4e2d\u7684\u4f7f\u7528\u3002
\u4ece\u89e3\u91ca\u5230\u7f16\u8bd1\u7684\u8303\u56f4\u4e0d\u662f\u4e8c\u5143\u7684\uff1a
jax.jit \u5728\u9996\u6b21\u8c03\u7528\u65f6\u7f16\u8bd1Python\u51fd\u6570\u4e3a\u4f18\u5316\u7684XLA\u4ee3\u7801\uff0c\u7136\u540e\u7f13\u5b58\u7f16\u8bd1\u540e\u7684\u7248\u672c\u3002def make_adder(n):\n def add(x):\n return x + n # n \u4ece\u5305\u56f4\u4f5c\u7528\u57df\u6355\u83b7\n return add\n\nadd5 = make_adder(5)\nprint(add5(3)) # 8\n \u95ed\u5305\u662f\u56de\u8c03\u3001\u88c5\u9970\u5668\u548c\u90e8\u5206\u5e94\u7528\u80cc\u540e\u7684\u673a\u5236\u3002\u5b83\u4eec\u5bf9\u51fd\u6570\u5f0f\u7f16\u7a0b\u81f3\u5173\u91cd\u8981\u3002
\u6a21\u5f0f\u5339\u914d\uff1a\u4e00\u79cd\u5f3a\u5927\u7684\u63a7\u5236\u6d41\u673a\u5236\uff0c\u89e3\u6784\u6570\u636e\u5e76\u6839\u636e\u5176\u5f62\u72b6\u8fdb\u884c\u5206\u652f\uff1a
match value {\n Some(x) if x > 0 => println!(\"Positive: {}\", x),\n Some(0) => println!(\"Zero\"),\n Some(x) => println!(\"Negative: {}\", x),\n None => println!(\"Nothing\"),\n}\n \u6a21\u5f0f\u5339\u914d\u6bd4if-else\u94fe\u66f4\u5177\u8868\u73b0\u529b\uff1a\u5b83\u68c0\u67e5\u6570\u636e\u7684\u7ed3\u6784\uff08\u662fSome\u8fd8\u662fNone\uff1f\u5b83\u5305\u542b\u7684\u503c\u662f\u5426\u7b26\u5408\u67d0\u4e2a\u6761\u4ef6\uff1f\uff09\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u76f8\u7b49\u6027\u3002Python\u57283.10\u4e2d\u589e\u52a0\u4e86\u7ed3\u6784\u6a21\u5f0f\u5339\u914d\uff08match/case\uff09\u3002
\u4ee3\u6570\u6570\u636e\u7c7b\u578b\uff08ADT\uff09\uff1a\u53ef\u4ee5\u662f\u591a\u4e2a\u53d8\u4f53\u4e4b\u4e00\u7684\u7c7b\u578b\uff0c\u6bcf\u4e2a\u53d8\u4f53\u643a\u5e26\u4e0d\u540c\u7684\u6570\u636e\u3002Result \u7c7b\u578b\u8981\u4e48\u662f Ok(value) \u8981\u4e48\u662f Err(error)\u3002Tree \u8981\u4e48\u662f Leaf(value) \u8981\u4e48\u662f Node(left, right)\u3002ADT\u7ed3\u5408\u6a21\u5f0f\u5339\u914d\u53ef\u4ee5\u7a77\u5c3d\u5904\u7406\u6240\u6709\u60c5\u51b5\uff0c\u6d88\u9664\u6574\u7c7bbug\uff08\u7a7a\u6307\u9488\u5f02\u5e38\u3001\u672a\u5904\u7406\u7684\u9519\u8bef\u7801\uff09\u3002
\u7279\u8d28\u4e0e\u63a5\u53e3\uff1a\u5b9a\u4e49\u4e00\u4e2a\u7c7b\u578b\u5fc5\u987b\u5b9e\u73b0\u7684\u4e00\u7ec4\u65b9\u6cd5\uff0c\u800c\u4e0d\u6307\u5b9a\u5982\u4f55\u5b9e\u73b0\u3002\u8fd9\u5b9e\u73b0\u4e86\u591a\u6001\uff1a\u4e00\u4e2a\u63a5\u53d7\"\u4efb\u4f55\u5b9e\u73b0\u4e86Display\u7279\u8d28\u7684\u7c7b\u578b\"\u7684\u51fd\u6570\u53ef\u4ee5\u5904\u7406\u6574\u6570\u3001\u5b57\u7b26\u4e32\u548c\u81ea\u5b9a\u4e49\u7c7b\u578b\u3002Rust\u4f7f\u7528\u7279\u8d28\uff0cJava\u4f7f\u7528\u63a5\u53e3\uff0cGo\u4f7f\u7528\u9690\u5f0f\u63a5\u53e3\uff0cPython\u4f7f\u7528\u9e2d\u5b50\u7c7b\u578b\uff08\"\u5982\u679c\u5b83\u8d70\u8def\u50cf\u9e2d\u5b50\u2026\u2026\"\uff09\u3002
\u9886\u57df\u7279\u5b9a\u8bed\u8a00\uff08DSL\uff09\u662f\u4e3a\u7279\u5b9a\u95ee\u9898\u57df\u8bbe\u8ba1\u7684\u8bed\u8a00\uff0c\u5728\u8be5\u9886\u57df\u5185\u7528\u901a\u7528\u6027\u6362\u53d6\u8868\u73b0\u529b\u3002
SQL\uff1a\u5173\u7cfb\u6570\u636e\u5e93\u7684\u8bed\u8a00\u3002SELECT name FROM users WHERE age > 30 \u6bd4\u7b49\u4ef7\u7684\u547d\u4ee4\u5f0f\u5faa\u73af\u53ef\u8bfb\u6027\u5f3a\u5f97\u591a\u4e14\u66f4\u6613\u4f18\u5316\u3002\u6570\u636e\u5e93\u5f15\u64ce\u4f18\u5316\u67e5\u8be2\u6267\u884c\u8ba1\u5212\uff0c\u81ea\u52a8\u9009\u62e9\u8fde\u63a5\u7b56\u7565\u548c\u7d22\u5f15\u4f7f\u7528\u3002
\u6b63\u5219\u8868\u8fbe\u5f0f\uff1a\u7528\u4e8e\u6587\u672c\u6a21\u5f0f\u5339\u914d\u7684\u5fae\u578b\u8bed\u8a00\u3002\\d{3}-\\d{4} \u5339\u914d\u50cf\"555-1234\"\u8fd9\u6837\u7684\u7535\u8bdd\u53f7\u7801\u3002\u6b63\u5219\u5f15\u64ce\u5c06\u6a21\u5f0f\u7f16\u8bd1\u4e3a\u6709\u9650\u81ea\u52a8\u673a\u4ee5\u5b9e\u73b0\u9ad8\u6548\u5339\u914d\u3002
\u7740\u8272\u5668\u8bed\u8a00\uff08GLSL\u3001HLSL\u3001Metal Shading Language\uff09\uff1a\u5728GPU\u6838\u5fc3\u4e0a\u8fd0\u884c\u7684\u7a0b\u5e8f\uff0c\u7528\u4e8e\u8ba1\u7b97\u50cf\u7d20\u989c\u8272\u3001\u9876\u70b9\u4f4d\u7f6e\u6216\u8ba1\u7b97\u64cd\u4f5c\u3002\u7740\u8272\u5668\u662f\u6d77\u91cf\u5e76\u884c\u7684\uff1a\u6bcf\u6b21\u8c03\u7528\u72ec\u7acb\u5904\u7406\u4e00\u4e2a\u50cf\u7d20\u6216\u4e00\u4e2a\u5143\u7d20\u3002\u8fd9\u4e0eCUDA\u7528\u4e8eML\u8ba1\u7b97\u7684\u6267\u884c\u6a21\u578b\u76f8\u540c\u3002
\u5728ML\u4e2d\uff0c\u50cfPyTorch\u548cJAX\u8fd9\u6837\u7684\u6846\u67b6\u672c\u8d28\u4e0a\u662f\u5d4c\u5165\u5728Python\u4e2d\u7684\u5f20\u91cf\u8ba1\u7b97DSL\u3002\u5b83\u4eec\u63d0\u4f9b\u9886\u57df\u7279\u5b9a\u7684\u62bd\u8c61\uff08\u5f20\u91cf\u3001\u81ea\u52a8\u5fae\u5206\u3001\u8bbe\u5907\u653e\u7f6e\uff09\uff0c\u540c\u65f6\u5229\u7528Python\u7684\u751f\u6001\u7cfb\u7edf\u3002
\u6ca1\u6709\u4e00\u79cd\u8bed\u8a00\u5728\u6240\u6709\u65b9\u9762\u90fd\u662f\u6700\u597d\u7684\u3002\u8bbe\u8ba1\u662f\u5173\u4e8e\u9009\u62e9\u54ea\u4e9b\u6743\u8861\uff1a
\u6027\u80fd vs \u5b89\u5168\uff1aC\u63d0\u4f9b\u4e86\u539f\u59cb\u901f\u5ea6\u548c\u786c\u4ef6\u63a7\u5236\uff0c\u4f46\u4f1a\u8ba9\u4f60\u7834\u574f\u5185\u5b58\u3002Rust\u4ee5\u7f16\u8bd1\u65f6\u5185\u5b58\u5b89\u5168\u63d0\u4f9b\u76f8\u5f53\u7684\u901f\u5ea6\u3002Java\u63d0\u4f9b\u5185\u5b58\u5b89\u5168\u4f46\u6709\u5783\u573e\u56de\u6536\u5f00\u9500\u3002Python\u63d0\u4f9b\u6700\u5927\u7684\u5b89\u5168\u6027\u548c\u8868\u73b0\u529b\uff0c\u4f46\u6267\u884c\u901f\u5ea6\u6162100\u500d\u3002
\u8868\u73b0\u529b vs \u7b80\u6d01\u6027\uff1aHaskell\u7684\u7c7b\u578b\u7cfb\u7edf\u53ef\u4ee5\u8868\u8fbe\u975e\u5e38\u7cbe\u786e\u7684\u7ea6\u675f\uff0c\u4f46\u6709\u9661\u5ced\u7684\u5b66\u4e60\u66f2\u7ebf\u3002Go\u6545\u610f\u7701\u7565\u4e86\u6cdb\u578b\uff08\u76f4\u5230\u6700\u8fd1\uff09\u3001\u7ee7\u627f\u548c\u5f02\u5e38\u4ee5\u8ffd\u6c42\u7b80\u6d01\u6027\u3002Python\u7684\"\u5e94\u8be5\u6709\u4e00\u79cd\u2014\u2014\u6700\u597d\u53ea\u6709\u4e00\u79cd\u2014\u2014\u663e\u800c\u6613\u89c1\u7684\u505a\u6cd5\"\u54f2\u5b66\u4fdd\u6301\u4e86\u8bed\u8a00\u7684\u53ef\u5b66\u4e60\u6027\u3002
\u63a7\u5236 vs \u62bd\u8c61\uff1aC/C++\u8ba9\u4f60\u63a7\u5236\u5185\u5b58\u5e03\u5c40\u3001\u7f13\u5b58\u884c\u4e3a\u548c\u786c\u4ef6\u4ea4\u4e92\u3002Python\u9690\u85cf\u4e86\u6240\u6709\u8fd9\u4e9b\u3002\u5bf9\u4e8eML\u8bad\u7ec3\uff08GPU\u8ba1\u7b97\u5360\u4e3b\u5bfc\uff09\uff0cPython\u7684\u5f00\u9500\u53ef\u4ee5\u5ffd\u7565\u4e0d\u8ba1\u3002\u5bf9\u4e8eML\u63a8\u7406\uff08\u6bcf\u5fae\u79d2\u90fd\u5f88\u5173\u952e\uff09\uff0cC++\u6216Rust\u53ef\u80fd\u662f\u5fc5\u8981\u7684\u3002
\u7f16\u8bd1\u901f\u5ea6 vs \u8fd0\u884c\u65f6\u901f\u5ea6\uff1aGo\u5728\u51e0\u79d2\u5185\u7f16\u8bd1\u5b8c\u6210\uff08\u7b80\u5355\u7684\u7c7b\u578b\u7cfb\u7edf\uff0c\u6700\u5c0f\u4f18\u5316\uff09\u3002Rust\u9700\u8981\u51e0\u5206\u949f\u7f16\u8bd1\uff08\u590d\u6742\u7684\u7c7b\u578b\u7cfb\u7edf\uff0c\u6fc0\u8fdb\u4f18\u5316\uff09\u3002\u6743\u8861\u7684\u662f\u5f00\u53d1\u8005\u8fed\u4ee3\u901f\u5ea6\u4e0e\u90e8\u7f72\u540e\u7684\u6027\u80fd\u3002
ML\u751f\u6001\u7cfb\u7edf\u53cd\u6620\u4e86\u8fd9\u4e9b\u6743\u8861\uff1aPython\u7528\u4e8e\u5b9e\u9a8c\u548c\u8bad\u7ec3\uff08\u8868\u73b0\u529b\u53d6\u80dc\uff09\uff0cC++/CUDA\u7528\u4e8e\u5185\u6838\u548c\u63a8\u7406\uff08\u6027\u80fd\u53d6\u80dc\uff09\uff0cRust\u7528\u4e8e\u57fa\u7840\u8bbe\u65bd\u548c\u5b89\u5168\u5173\u952e\u7cfb\u7edf\uff08\u5b89\u5168\u53d6\u80dc\uff09\u3002
\u63a2\u7d22\u95ed\u5305\u548c\u9ad8\u9636\u51fd\u6570\u3002\u5b9e\u73b0\u4e00\u4e2a\u7b80\u5355\u7684\u51fd\u6570\u5de5\u5382\uff0c\u9a8c\u8bc1\u95ed\u5305\u6355\u83b7\u5176\u73af\u5883\u3002
def make_multiplier(factor):\n \"\"\"\u8fd4\u56de\u4e00\u4e2a\u5c06\u8f93\u5165\u4e58\u4ee5 factor \u7684\u51fd\u6570\u3002\"\"\"\n def multiply(x):\n return x * factor\n return multiply\n\ndouble = make_multiplier(2)\ntriple = make_multiplier(3)\n\nprint(f\"double(5) = {double(5)}\") # 10\nprint(f\"triple(5) = {triple(5)}\") # 15\n\n# \u95ed\u5305\u901a\u8fc7\u5f15\u7528\u6355\u83b7\uff0c\u800c\u4e0d\u662f\u901a\u8fc7\u503c\ndef make_counter():\n count = [0] # \u53ef\u53d8\u7684\u5bb9\u5668\u4ee5\u5141\u8bb8\u4fee\u6539\n def increment():\n count[0] += 1\n return count[0]\n return increment\n\ncounter = make_counter()\nprint(f\"counter() = {counter()}\") # 1\nprint(f\"counter() = {counter()}\") # 2\nprint(f\"counter() = {counter()}\") # 3\n \u6bd4\u8f83\u52a8\u6001\u4e0e\u9759\u6001\u7c7b\u578b\u884c\u4e3a\u3002\u5c55\u793aPython\u7684\u52a8\u6001\u7c7b\u578b\u5982\u4f55\u63d0\u4f9b\u7075\u6d3b\u6027\u4f46\u53ef\u80fd\u9690\u85cfbug\u3002
def add(a, b):\n return a + b\n\n# \u9002\u7528\u4e8e\u4e0d\u540c\u7c7b\u578b\u2014\u2014\u7075\u6d3b\uff01\nprint(add(3, 5)) # 8 (int + int)\nprint(add(\"hello \", \"world\")) # \"hello world\" (str + str)\nprint(add([1, 2], [3, 4])) # [1, 2, 3, 4] (list + list)\n\n# \u4f46\u7c7b\u578b\u9519\u8bef\u4ec5\u5728\u8fd0\u884c\u65f6\u66b4\u9732\uff1a\ntry:\n print(add(\"hello\", 5)) # TypeError\uff01str + int\nexcept TypeError as e:\n print(f\"\u8fd0\u884c\u65f6\u9519\u8bef\uff1a{e}\")\n print(\"\u9759\u6001\u7c7b\u578b\u68c0\u67e5\u5668\u4f1a\u5728\u8fd0\u884c\u524d\u6355\u83b7\u6b64\u95ee\u9898\")\n \u6d4b\u91cf\u89e3\u91ca\u578bPython\u4e0e\u7f16\u8bd1/JIT\u65b9\u6cd5\u5728\u8ba1\u7b97\u5bc6\u96c6\u578b\u4efb\u52a1\u4e0a\u7684\u6027\u80fd\u5dee\u5f02\u3002
import time\nimport jax\nimport jax.numpy as jnp\n\nn = 1_000_000\n\n# \u7eafPython\u5faa\u73af\uff08\u89e3\u91ca\u578b\uff09\nstart = time.time()\ntotal = 0.0\nfor i in range(n):\n total += i * i\npython_time = time.time() - start\n\n# JAX\uff08\u901a\u8fc7XLA\u7f16\u8bd1\uff09\n@jax.jit\ndef sum_squares_jax(n):\n return jnp.sum(jnp.arange(n, dtype=jnp.float32) ** 2)\n\n_ = sum_squares_jax(10) # \u9884\u70edJIT\nstart = time.time()\nresult = sum_squares_jax(n)\njax_time = time.time() - start\n\nprint(f\"Python loop: {python_time:.4f}s\")\nprint(f\"JAX (JIT): {jax_time:.6f}s\")\nprint(f\"Speedup: {python_time / jax_time:.0f}x\")\n \u5728\u6df1\u5165\u5b66\u4e60\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u638c\u63e1\u56db\u4e2a\u57fa\u7840\u6982\u5ff5\uff1a\u8861\u91cf\u6548\u7387\u7684\u5927O\u8868\u793a\u6cd5\u3001\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u5b50\u95ee\u9898\u7684\u9012\u5f52\u3001\u5e26\u526a\u679d\u7684\u7a77\u4e3e\u641c\u7d22\u2014\u2014\u56de\u6eaf\uff0c\u4ee5\u53ca\u907f\u514d\u5197\u4f59\u8ba1\u7b97\u7684\u52a8\u6001\u89c4\u5212\u3002\u672c\u6587\u4ef6\u4ece\u57fa\u672c\u539f\u7406\u51fa\u53d1\u9010\u4e00\u8bb2\u89e3\u3002
LeetCode\u3001NeetCode \u548c HackerRank \u4e0a\u6709\u6210\u5343\u4e0a\u4e07\u7684\u7f16\u7a0b\u9898\u3002\u6ca1\u6709\u4eba\u80fd\u8bb0\u4f4f\u5168\u90e8\uff0c\u8bd5\u56fe\u8fd9\u4e48\u505a\u662f\u6ce8\u5b9a\u5931\u8d25\u7684\u7b56\u7565\u3002\u9762\u8bd5\u5b98\u4e0d\u4f1a\u4ece\u56fa\u5b9a\u9898\u5e93\u4e2d\u9009\u9898\u2014\u2014\u4ed6\u4eec\u4f1a\u4fee\u6539\u3001\u7ec4\u5408\u3001\u4f2a\u88c5\u3002\u80cc\u4e0b\u6765\u7684\"\u4e24\u6570\u4e4b\u548c\"\u89e3\u6cd5\uff0c\u5f53\u9762\u8bd5\u5b98\u95ee\u4f60\u4e00\u4e2a\u4ece\u672a\u89c1\u8fc7\u7684\u53d8\u4f53\u65f6\u6beb\u65e0\u7528\u5904\u3002
\u597d\u6d88\u606f\u662f\uff1a\u6838\u5fc3\u6a21\u5f0f\u5927\u7ea6\u53ea\u6709 15-20 \u79cd\uff08\u53cc\u6307\u9488\u3001\u6ed1\u52a8\u7a97\u53e3\u3001BFS/DFS\u3001DP\u3001\u56de\u6eaf\u7b49\uff09\u3002\u6240\u6709\u95ee\u9898\uff0c\u65e0\u8bba\u8868\u9762\u591a\u65b0\u9896\uff0c\u6700\u7ec8\u90fd\u5f52\u7ed3\u4e3a\u8fd9\u4e9b\u6a21\u5f0f\u4e2d\u7684\u4e00\u4e2a\u6216\u51e0\u4e2a\u7ec4\u5408\u3002\u9762\u8bd5\u8003\u7684\u4e0d\u662f\u4f60\u662f\u5426\u89c1\u8fc7\u8fd9\u9053\u9898\uff0c\u800c\u662f\u4f60\u662f\u5426\u80fd\u5265\u79bb\u4e0a\u4e0b\u6587\u2014\u2014\u6545\u4e8b\u3001\u5177\u4f53\u6570\u636e\u7c7b\u578b\u3001\u8fb9\u754c\u60c5\u51b5\u2014\u2014\u8bc6\u522b\u51fa\u5e95\u5c42\u7684\u6a21\u5f0f\u3002
\u8003\u8651\u8fd9\u4e09\u4e2a\u95ee\u9898\uff1a
\u5b83\u4eec\u770b\u8d77\u6765\u622a\u7136\u4e0d\u540c\u3002\u4f46\u5b83\u4eec\u662f\u540c\u4e00\u4e2a\u95ee\u9898\uff1a\u4e24\u6570\u4e4b\u548c\u3002\u4e0a\u4e0b\u6587\uff08\u6570\u5b57\u3001\u5206\u5b50\u3001\u8d26\u6237\uff09\u65e0\u5173\u7d27\u8981\u3002\u5176\u7ed3\u6784\u662f\uff1a\u5728\u96c6\u5408\u4e2d\u641c\u7d22\u8865\u6570 \u2192 \u54c8\u5e0c\u8868\u67e5\u627e\u3002
\u8fd9\u5c31\u662f\u672c\u7ae0\u901a\u8fc7\u76f4\u89c9\u6559\u6388\u6a21\u5f0f\u800c\u975e\u901a\u8fc7\u91cd\u590d\u6559\u6388\u89e3\u9898\u65b9\u6cd5\u7684\u539f\u56e0\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u6a21\u5f0f\uff0c\u6211\u4eec\u90fd\u4f1a\u89e3\u91ca\uff1a
\u5f53\u4f60\u6df1\u5165\u7406\u89e3\u4e3a\u4ec0\u4e48\u6ed1\u52a8\u7a97\u53e3\u6709\u6548\uff08\u7ea6\u675f\u7684\u5355\u8c03\u6027\u610f\u5473\u7740\u6269\u5c55/\u6536\u7f29\u5c31\u8db3\u591f\u4e86\uff09\uff0c\u4f60\u5c31\u53ef\u4ee5\u5c06\u5176\u5e94\u7528\u5230\u4efb\u4f55\u5177\u6709\u8be5\u7ed3\u6784\u7684\u95ee\u9898\u4e0a\uff0c\u5373\u4f7f\u662f\u672a\u66fe\u89c1\u8fc7\u7684\u95ee\u9898\u3002\u5f53\u4f60\u53ea\u662f\u80cc\u4e0b\u4e86\"\u65e0\u91cd\u590d\u5b57\u7b26\u7684\u6700\u957f\u5b50\u4e32\"\u7684\u4ee3\u7801\uff0c\u4e00\u65e6\u95ee\u9898\u53d1\u751f\u53d8\u5316\uff0c\u4f60\u5c31\u4f1a\u675f\u624b\u65e0\u7b56\u3002
\u5b9e\u8df5\u7b56\u7565\uff1a
\u5f53\u6211\u4eec\u8bf4\u4e00\u4e2a\u7b97\u6cd5\"\u5feb\"\u6216\"\u6162\"\u65f6\uff0c\u9700\u8981\u4e00\u79cd\u7cbe\u786e\u7684\u8861\u91cf\u65b9\u5f0f\u3002\u5927O\u8868\u793a\u6cd5\u63cf\u8ff0\u4e86\u968f\u7740\u8f93\u5165\u89c4\u6a21 \\(n\\) \u7684\u589e\u957f\uff0c\u7b97\u6cd5\u7684\u8fd0\u884c\u65f6\u95f4\uff08\u6216\u7a7a\u95f4\u4f7f\u7528\u91cf\uff09\u5982\u4f55\u589e\u957f\uff0c\u5ffd\u7565\u4e86\u5e38\u6570\u56e0\u5b50\u548c\u4f4e\u9636\u9879\u3002
\u5f62\u5f0f\u5316\u5b9a\u4e49\uff1a\\(f(n) = O(g(n))\\) \u610f\u5473\u7740\u5b58\u5728\u5e38\u6570 \\(c > 0\\) \u548c \\(n_0\\)\uff0c\u4f7f\u5f97\u5bf9\u6240\u6709 \\(n \\geq n_0\\) \u6709 \\(f(n) \\leq c \\cdot g(n)\\)\u3002\u901a\u4fd7\u5730\u8bf4\uff1a\u5bf9\u4e8e\u5927\u89c4\u6a21\u8f93\u5165\uff0c\\(f\\) \u7684\u589e\u957f\u901f\u5ea6\u4e0d\u8d85\u8fc7 \\(g\\)\u3002
\u4e3a\u4ec0\u4e48\u8981\u5ffd\u7565\u5e38\u6570\uff1f\u56e0\u4e3a \\(2n\\) \u7684\u7b97\u6cd5\u548c \\(5n\\) \u7684\u7b97\u6cd5\u90fd\u662f \\(O(n)\\)\uff1a\u5b83\u4eec\u7684\u6269\u5c55\u65b9\u5f0f\u76f8\u540c\u3002\u5728\u66f4\u5feb\u7684\u8ba1\u7b97\u673a\u4e0a\uff0c\u5e38\u6570\u4f1a\u53d8\uff0c\u4f46\u6269\u5c55\u6027\u4e0d\u4f1a\u3002\u5927O\u8868\u793a\u6cd5\u6355\u6349\u4e86\u95ee\u9898\u7684\u5185\u5728\u96be\u5ea6\uff0c\u4e0e\u786c\u4ef6\u65e0\u5173\u3002
\u7ecf\u9a8c\u6cd5\u5219\uff1a\u73b0\u4ee3\u8ba1\u7b97\u673a\u6bcf\u79d2\u6267\u884c\u7ea6 \\(10^8\\)\u2013\\(10^9\\) \u6b21\u7b80\u5355\u64cd\u4f5c\u3002\u5bf9\u4e8e1\u79d2\u7684\u65f6\u95f4\u9650\u5236\uff1a
\u8fd9\u5f20\u8868\u80fd\u7acb\u5373\u544a\u8bc9\u4f60\u5f53\u524d\u65b9\u6cd5\u662f\u5426\u8db3\u591f\u5feb\u3002\u5982\u679c \\(n = 10^5\\) \u800c\u4f60\u7684\u89e3\u6cd5\u662f \\(O(n^2)\\)\uff0c\u90a3\u5c31\u662f \\(10^{10}\\) \u6b21\u64cd\u4f5c\u2014\u2014\u592a\u6162\u4e86\u3002\u4f60\u9700\u8981\u4e00\u4e2a\u66f4\u597d\u7684\u7b97\u6cd5\u3002
total = 0\nfor x in arr: # n \u6b21\u8fed\u4ee3\n total += x # \u6bcf\u6b21\u8fed\u4ee3 O(1)\n# \u603b\u8ba1\uff1aO(n)\n for i in range(n): # n \u6b21\u8fed\u4ee3\n for j in range(n): # \u6bcf\u6b21 n \u6b21\u8fed\u4ee3\n process(i, j) # O(1)\n# \u603b\u8ba1\uff1aO(n^2)\n i = n\nwhile i > 0:\n process(i)\n i //= 2\n# \u603b\u8ba1\uff1aO(log n)\n for i in range(n):\n for j in range(i): # j \u4ece 0 \u5230 i-1\n process(i, j)\n# \u603b\u8ba1\uff1a0 + 1 + 2 + ... + (n-1) = n(n-1)/2 = O(n^2)\n x in list \u662f \\(O(n)\\)\uff08\u7ebf\u6027\u626b\u63cf\uff09\uff0c\u4f46 x in set \u662f \\(O(1)\\)\u3002\u5728\u5faa\u73af\u4e2d\u5bf9\u5217\u8868\u4f7f\u7528 in \u4f1a\u5f97\u5230 \\(O(n^2)\\)\uff0c\u800c\u4e0d\u662f \\(O(n)\\)\u3002# \u4e0d\u597d\uff1aO(n^2) \u2014 \u5bf9\u5217\u8868\u7528 \"in\" \u662f O(n)\nfor x in arr:\n if x in another_list:\n process(x)\n\n# \u597d\uff1aO(n) \u2014 \u5148\u8f6c\u6362\u4e3a set\nanother_set = set(another_list)\nfor x in arr:\n if x in another_set:\n process(x)\n \u5b57\u7b26\u4e32\u62fc\u63a5\uff1aPython \u4e2d s += c \u6bcf\u6b21\u90fd\u4f1a\u590d\u5236\u6574\u4e2a\u5b57\u7b26\u4e32\u3002\u5728 \\(n\\) \u6b21\u8fed\u4ee3\u7684\u5faa\u73af\u4e2d\uff1a\\(O(1 + 2 + \\cdots + n) = O(n^2)\\)\u3002
\u6392\u5e8f\u4e3b\u5bfc\uff1a\u5982\u679c\u4f60\u7684\u7b97\u6cd5\u5148\u6392\u5e8f\uff08\\(O(n \\log n)\\)\uff09\u7136\u540e\u505a\u7ebf\u6027\u626b\u63cf\uff08\\(O(n)\\)\uff09\uff0c\u603b\u590d\u6742\u5ea6\u662f \\(O(n \\log n)\\)\u2014\u2014\u6392\u5e8f\u5360\u4e3b\u5bfc\u3002
\u5e73\u644a\u590d\u6742\u5ea6\uff1a\u67d0\u4e9b\u64cd\u4f5c\u5076\u5c14\u5f88\u6602\u8d35\uff0c\u4f46\u5e73\u644a\u4e0b\u6765\u5f88\u4fbf\u5b9c\u3002\u52a8\u6001\u6570\u7ec4\u7684\u8ffd\u52a0\u64cd\u4f5c\u5e73\u644a\u590d\u6742\u5ea6\u4e3a \\(O(1)\\)\uff0c\u56e0\u4e3a\u7f55\u89c1\u7684 \\(O(n)\\) \u6269\u5bb9\u88ab\u5206\u644a\u5230 \\(n\\) \u6b21\u4fbf\u5b9c\u7684\u8ffd\u52a0\u64cd\u4f5c\u4e2d\u3002\u4e0d\u8981\u6df7\u6dc6\u5e73\u644a \\(O(1)\\) \u548c\u6700\u574f\u60c5\u51b5 \\(O(1)\\)\u3002
\u7a7a\u95f4\u590d\u6742\u5ea6\u9075\u5faa\u540c\u6837\u7684\u5927O\u89c4\u5219\uff0c\u53ea\u662f\u5e94\u7528\u4e8e\u5185\u5b58\u4f7f\u7528\u800c\u975e\u65f6\u95f4\u3002
\u539f\u5730\u7b97\u6cd5\u4f7f\u7528 \\(O(1)\\) \u989d\u5916\u7a7a\u95f4\uff08\u4e0d\u8ba1\u8f93\u5165\uff09\u3002\u5feb\u901f\u6392\u5e8f\u662f \\(O(\\log n)\\) \u7a7a\u95f4\uff08\u9012\u5f52\u6808\u6df1\u5ea6\uff09\u3002\u5f52\u5e76\u6392\u5e8f\u662f \\(O(n)\\)\uff08\u5408\u5e76\u65f6\u4f7f\u7528\u7684\u4e34\u65f6\u6570\u7ec4\uff09\u3002
\u9012\u5f52\u6808\uff1a\u6bcf\u6b21\u9012\u5f52\u8c03\u7528\u90fd\u4f1a\u4f7f\u7528\u6808\u7a7a\u95f4\u3002\u6df1\u5ea6\u4e3a \\(n\\) \u7684\u9012\u5f52\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\uff0c\u5373\u4f7f\u6bcf\u6b21\u8c03\u7528\u6ca1\u6709\u5206\u914d\u989d\u5916\u5185\u5b58\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u5728\u5177\u6709 \\(n\\) \u4e2a\u8282\u70b9\u7684\u56fe\u4e0a\u8fdb\u884c\u9012\u5f52 DFS \u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\u3002
\u9762\u8bd5\u4e2d\uff0c\u59cb\u7ec8\u540c\u65f6\u8bf4\u660e\u65f6\u95f4\u548c\u7a7a\u95f4\u590d\u6742\u5ea6\u3002\\(O(n)\\) \u65f6\u95f4\u3001\\(O(n)\\) \u7a7a\u95f4\u7684\u89e3\u6cd5\u901a\u5e38\u53ef\u4ee5\u63a5\u53d7\uff0c\u4f46 \\(O(n)\\) \u65f6\u95f4\u3001\\(O(1)\\) \u7a7a\u95f4\u7684\u89e3\u6cd5\u66f4\u597d\u3002\u9762\u8bd5\u5b98\u53ef\u80fd\u4f1a\u8981\u6c42\u4f60\u4f18\u5316\u5176\u4e2d\u4e00\u4e2a\u3002
\u9012\u5f52\u662f\u6307\u51fd\u6570\u8c03\u7528\u81ea\u8eab\u6765\u89e3\u51b3\u540c\u4e00\u95ee\u9898\u7684\u66f4\u5c0f\u5b9e\u4f8b\u3002\u5b83\u662f\u5904\u7406\u5177\u6709\u9012\u5f52\u7ed3\u6784\u7684\u95ee\u9898\u6700\u81ea\u7136\u7684\u65b9\u5f0f\uff1a\u6811\u3001\u5d4c\u5957\u6570\u636e\u3001\u5206\u6cbb\u6cd5\u548c\u6570\u5b66\u5e8f\u5217\u3002
\u6bcf\u4e2a\u9012\u5f52\u51fd\u6570\u90fd\u6709\u4e24\u90e8\u5206\uff1a
def factorial(n):\n if n <= 1: # \u57fa\u672c\u60c5\u51b5\n return 1\n return n * factorial(n - 1) # \u9012\u5f52\u60c5\u51b5\n factorial(4) \u7684\u6267\u884c\u8fc7\u7a0b\uff1a
factorial(4) \u8c03\u7528 factorial(3)factorial(3) \u8c03\u7528 factorial(2)factorial(2) \u8c03\u7528 factorial(1)factorial(1) \u8fd4\u56de 1\uff08\u57fa\u672c\u60c5\u51b5\uff09factorial(2) \u8fd4\u56de 2 * 1 = 2factorial(3) \u8fd4\u56de 3 * 2 = 6factorial(4) \u8fd4\u56de 4 * 6 = 24\u6bcf\u6b21\u8c03\u7528\u90fd\u88ab\u538b\u5165\u8c03\u7528\u6808\u3002\u6808\u4e00\u76f4\u589e\u957f\u76f4\u5230\u5230\u8fbe\u57fa\u672c\u60c5\u51b5\uff0c\u7136\u540e\u968f\u7740\u6bcf\u6b21\u8c03\u7528\u7684\u8fd4\u56de\u800c\u5c55\u5f00\u3002\u5982\u679c\u9012\u5f52\u592a\u6df1\uff08\u4f8b\u5982 Python \u4e2d\u7684 factorial(1000000)\uff09\uff0c\u6808\u4f1a\u6ea2\u51fa\uff08RecursionError\uff09\u3002Python \u7684\u9ed8\u8ba4\u9012\u5f52\u9650\u5236\u662f 1000\u3002
\u5173\u952e\u7684\u601d\u7ef4\u8f6c\u53d8\u662f\uff1a\u4fe1\u4efb\u9012\u5f52\u3002\u5728\u7f16\u5199\u9012\u5f52\u51fd\u6570\u65f6\uff0c\u5047\u8bbe\u9012\u5f52\u8c03\u7528\u5df2\u7ecf\u6b63\u786e\u8fd4\u56de\u4e86\u66f4\u5c0f\u5b50\u95ee\u9898\u7684\u7b54\u6848\u3002\u4f60\u53ea\u9700\u8981\uff1a
\u4f60\u4e0d\u9700\u8981\u5728\u8111\u4e2d\u8ddf\u8e2a\u6bcf\u4e00\u6b21\u9012\u5f52\u8c03\u7528\u3002\u8fd9\u5c31\u50cf\u8bd5\u56fe\u901a\u8fc7\u5728\u5fc3\u91cc\u6267\u884c\u6bcf\u6b21\u8fed\u4ee3\u6765\u7406\u89e3\u4e00\u4e2a\u5faa\u73af\u3002\u76f8\u53cd\uff0c\u9a8c\u8bc1\uff1a\"\u5982\u679c\u9012\u5f52\u8c03\u7528\u7ed9\u4e86\u6211\u66f4\u5c0f\u8f93\u5165\u7684\u6b63\u786e\u7ed3\u679c\uff0c\u90a3\u4e48\u6211\u7684\u7ec4\u5408\u6b65\u9aa4\u662f\u5426\u7ed9\u51fa\u4e86\u5b8c\u6574\u8f93\u5165\u7684\u6b63\u786e\u7ed3\u679c\uff1f\"
def reverse(head):\n if not head or not head.next: # \u57fa\u672c\u60c5\u51b5\uff1a0 \u6216 1 \u4e2a\u8282\u70b9\n return head\n\n new_head = reverse(head.next) # \u53cd\u8f6c\u5269\u4f59\u90e8\u5206\n head.next.next = head # \u5c06\u4e0b\u4e00\u4e2a\u8282\u70b9\u6307\u56de\u5f53\u524d\u8282\u70b9\n head.next = None # \u5f53\u524d\u8282\u70b9\u73b0\u5728\u6210\u4e3a\u5c3e\u8282\u70b9\n return new_head\n reverse(head.next) \u6b63\u786e\u53cd\u8f6c\u4e86\u94fe\u8868\u7684\u5269\u4f59\u90e8\u5206\u5e76\u8fd4\u56de\u65b0\u7684\u5934\u8282\u70b9\u3002\u6211\u4eec\u53ea\u9700\u5c06\u5f53\u524d\u8282\u70b9\u9644\u52a0\u5230\u672b\u5c3e\u3002def height(root):\n if not root: # \u57fa\u672c\u60c5\u51b5\uff1a\u7a7a\u6811\u9ad8\u5ea6\u4e3a 0\n return 0\n left_h = height(root.left) # \u5de6\u5b50\u6811\u9ad8\u5ea6\n right_h = height(root.right) # \u53f3\u5b50\u6811\u9ad8\u5ea6\n return 1 + max(left_h, right_h) # \u5f53\u524d\u8282\u70b9\u589e\u52a0 1 \u5c42\n \u6bcf\u4e2a\u9012\u5f52\u7b97\u6cd5\u90fd\u53ef\u4ee5\u8f6c\u6362\u4e3a\u8fed\u4ee3\u7b97\u6cd5\uff08\u4f7f\u7528\u663e\u5f0f\u6808\u6216\u5faa\u73af\uff09\u3002\u8fed\u4ee3\u907f\u514d\u4e86\u8c03\u7528\u6808\u5f00\u9500\u548c\u6808\u6ea2\u51fa\u98ce\u9669\u3002
\u4f55\u65f6\u4f18\u5148\u4f7f\u7528\u9012\u5f52\uff1a\u95ee\u9898\u5177\u6709\u81ea\u7136\u7684\u9012\u5f52\u7ed3\u6784\uff08\u6811\u3001\u5d4c\u5957\u6570\u636e\u3001\u5206\u6cbb\u6cd5\uff09\u3002\u9012\u5f52\u89e3\u6cd5\u66f4\u7b80\u6d01\u3001\u66f4\u6613\u4e8e\u63a8\u7406\u3002
\u4f55\u65f6\u4f18\u5148\u4f7f\u7528\u8fed\u4ee3\uff1a\u9012\u5f52\u6df1\u5ea6\u53ef\u80fd\u975e\u5e38\u5927\uff08\u4f8b\u5982\uff0c\u5904\u7406\u5305\u542b \\(10^6\\) \u4e2a\u8282\u70b9\u7684\u94fe\u8868\uff09\u3002\u8fed\u4ee3\u89e3\u6cd5\u907f\u514d\u4e86\u6808\u6ea2\u51fa\u3002
\u5c3e\u9012\u5f52\uff1a\u5982\u679c\u9012\u5f52\u8c03\u7528\u662f\u51fd\u6570\u4e2d\u7684\u6700\u540e\u4e00\u4e2a\u64cd\u4f5c\uff08\u9012\u5f52\u8c03\u7528\u8fd4\u56de\u540e\u6ca1\u6709\u540e\u7eed\u5de5\u4f5c\uff09\uff0c\u5219\u8be5\u9012\u5f52\u8c03\u7528\u662f\"\u5c3e\u9012\u5f52\"\u7684\u3002\u67d0\u4e9b\u8bed\u8a00\uff08Scheme\u3001Scala\uff09\u4f1a\u5c06\u5c3e\u8c03\u7528\u4f18\u5316\u4e3a\u4f7f\u7528\u5e38\u6570\u6808\u7a7a\u95f4\u3002Python \u4e0d\u4f18\u5316\u5c3e\u8c03\u7528\uff0c\u56e0\u6b64 Python \u4e2d\u7684\u5c3e\u9012\u5f52\u4ecd\u7136\u4f7f\u7528 \\(O(n)\\) \u6808\u7a7a\u95f4\u3002
f(n) \u8c03\u7528 f(n) \u800c\u975e f(n-1) \u786e\u4fdd\u5b50\u95ee\u9898\u4e25\u683c\u66f4\u5c0f \u5197\u4f59\u8ba1\u7b97 \u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1af(n) = f(n-1) + f(n-2) \u4ee5\u6307\u6570\u7ea7\u91cd\u590d\u8ba1\u7b97 \u4f7f\u7528\u8bb0\u5fc6\u5316\uff08\u2192 DP\uff09 Python \u9012\u5f52\u9650\u5236 factorial(10000) \u5d29\u6e83 \u4f7f\u7528 sys.setrecursionlimit \u6216\u8f6c\u4e3a\u8fed\u4ee3"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/00.%20foundations/#_11","title":"\u56de\u6eaf","text":"\u56de\u6eaf\u662f\u4e00\u79cd\u7cfb\u7edf\u5730\u63a2\u7d22\u6240\u6709\u53ef\u80fd\u89e3\u6cd5\u7684\u65b9\u6cd5\uff0c\u901a\u8fc7\u9010\u6b65\u6784\u5efa\u89e3\u5e76\u5728\u53d1\u73b0\u90e8\u5206\u89e3\u4e0d\u53ef\u80fd\u5f97\u5230\u6709\u6548\u7b54\u6848\u65f6\u7acb\u5373\u653e\u5f03\u3002
\u53ef\u4ee5\u628a\u5b83\u60f3\u8c61\u6210\u8d70\u8ff7\u5bab\u3002\u5728\u6bcf\u4e2a\u5c94\u8def\u53e3\uff0c\u4f60\u9009\u62e9\u4e00\u6761\u8def\u3002\u5982\u679c\u78b0\u5230\u6b7b\u80e1\u540c\uff0c\u4f60\u5c31\u56de\u5230\u4e0a\u4e00\u4e2a\u5c94\u8def\u53e3\u5c1d\u8bd5\u4e0d\u540c\u7684\u8def\u3002\u4f60\u4e0d\u4f1a\u4ece\u5934\u5f00\u59cb\u2014\u2014\u4f60\u56de\u6eaf\u5230\u6700\u8fd1\u7684\u4e00\u4e2a\u51b3\u7b56\u70b9\u3002
\u6bcf\u4e2a\u56de\u6eaf\u7b97\u6cd5\u90fd\u9075\u5faa\u76f8\u540c\u7684\u6a21\u5f0f\uff1a
def backtrack(state, choices, result):\n if is_complete(state):\n result.append(state.copy())\n return\n\n for choice in choices:\n if is_valid(choice, state):\n state.add(choice) # 1. \u9009\u62e9\n backtrack(state, choices, result) # 2. \u63a2\u7d22\n state.remove(choice) # 3. \u64a4\u9500\uff08\u56de\u6eaf\uff09\n for choice in choices:\n if not is_valid(choice, state):\n continue # \u526a\u679d\uff1a\u8df3\u8fc7\u6574\u4e2a\u5b50\u6811\n\n state.add(choice)\n backtrack(state, choices, result)\n state.remove(choice)\n def subsets(nums):\n result = []\n\n def backtrack(start, path):\n result.append(path[:]) # \u6bcf\u4e2a\u90e8\u5206\u89e3\u90fd\u662f\u4e00\u4e2a\u6709\u6548\u7684\u5b50\u96c6\n\n for i in range(start, len(nums)):\n path.append(nums[i]) # \u9009\u62e9\n backtrack(i + 1, path) # \u63a2\u7d22\uff08i+1\uff1a\u4e0d\u5141\u8bb8\u91cd\u590d\u4f7f\u7528\uff09\n path.pop() # \u64a4\u9500\n\n backtrack(0, [])\n return result\n \u5bf9\u4e8e [1, 2, 3]\uff0c\u9012\u5f52\u6811\uff1a
[] \u2192 [1] \u2192 [1,2] \u2192 [1,2,3]\uff08\u56de\u6eaf\uff09\u2192 [1,3]\uff08\u56de\u6eaf\uff09\u2192 [2] \u2192 [2,3]\uff08\u56de\u6eaf\uff09\u2192 [3]\u6811\u4e2d\u7684\u6bcf\u4e2a\u8282\u70b9\u662f\u4e00\u6b21\u5bf9 backtrack \u7684\u8c03\u7528\u3002\u6bcf\u4e2a\u53f6\u5b50\u8282\u70b9\uff08\u4ee5\u53ca\u4e2d\u95f4\u8282\u70b9\uff09\u4ea7\u751f\u4e00\u4e2a\u5b50\u96c6\u3002\u603b\u5b50\u96c6\u6570\uff1a\\(2^n\\)\u3002
def permutations(nums):\n result = []\n\n def backtrack(path, remaining):\n if not remaining:\n result.append(path[:])\n return\n\n for i in range(len(remaining)):\n path.append(remaining[i]) # \u9009\u62e9\n backtrack(path, remaining[:i] + remaining[i+1:]) # \u63a2\u7d22\n path.pop() # \u64a4\u9500\n\n backtrack([], nums)\n return result\n remaining\uff0c\u6240\u4ee5\u603b\u590d\u6742\u5ea6\u4e3a \\(O(n \\cdot n!)\\)\u3002result.append(path) \u2014\u2014 \u6240\u6709\u6761\u76ee\u5171\u4eab\u540c\u4e00\u4e2a\u5217\u8868 result.append(path[:]) \u6216 path.copy() \u672a\u56de\u6eaf\uff08\u64a4\u9500\uff09 \u72b6\u6001\u4e0d\u65ad\u589e\u957f\uff0c\u540e\u9762\u7684\u5019\u9009\u770b\u5230\u8fc7\u65f6\u7684\u72b6\u6001 \u9012\u5f52\u8c03\u7528\u540e\u59cb\u7ec8\u6267\u884c path.pop() \u6216 state.remove() \u5faa\u73af\u8d77\u59cb\u4f4d\u7f6e\u9519\u8bef \u5b50\u96c6\u4e2d\u6709\u91cd\u590d\u9879\uff0c\u6216\u6392\u5217\u4e2d\u51fa\u73b0\u4e86\u4e0d\u5e94\u6709\u7684\u91cd\u590d\u4f7f\u7528 \u4f7f\u7528 start \u53c2\u6570\u907f\u514d\u91cd\u65b0\u8bbf\u95ee\u4e4b\u524d\u7684\u7d22\u5f15 \u8df3\u8fc7\u526a\u679d \u63a2\u7d22\u660e\u663e\u65e0\u6548\u7684\u5206\u652f \u5728\u9012\u5f52\u8c03\u7528\u524d\u6dfb\u52a0 if not is_valid: continue"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/00.%20foundations/#_18","title":"\u52a8\u6001\u89c4\u5212","text":"\u52a8\u6001\u89c4\u5212\uff08DP\uff09\u662f\u4e00\u79cd\u4f18\u5316\u6280\u672f\uff0c\u9002\u7528\u4e8e\u76f8\u540c\u5b50\u95ee\u9898\u88ab\u53cd\u590d\u6c42\u89e3\u7684\u60c5\u51b5\u3002DP \u4e0d\u91cd\u590d\u8ba1\u7b97\uff0c\u800c\u662f\u6bcf\u4e2a\u5b50\u95ee\u9898\u53ea\u89e3\u4e00\u6b21\u5e76\u5b58\u50a8\u7ed3\u679c\u3002
DP \u9002\u7528\u4e8e\u5177\u6709\u4e24\u4e2a\u6027\u8d28\u7684\u95ee\u9898\uff1a
def fib(n):\n if n <= 1:\n return n\n return fib(n - 1) + fib(n - 2)\n \u5bf9\u4e8e fib(5)\uff0c\u9012\u5f52\u6811\uff1a
fib(5) \u8c03\u7528 fib(4) \u548c fib(3)fib(4) \u8c03\u7528 fib(3) \u548c fib(2)fib(3) \u88ab\u8ba1\u7b97\u4e86\u4e24\u6b21\uff0cfib(2) \u88ab\u8ba1\u7b97\u4e86\u4e09\u6b21\u8fd9\u662f \\(O(2^n)\\)\uff0c\u56e0\u4e3a\u6811\u5728\u6bcf\u4e00\u5c42\u90fd\u5206\u652f\uff0c\u800c\u4e14\u5927\u591a\u6570\u5206\u652f\u91cd\u590d\u8ba1\u7b97\u76f8\u540c\u7684\u503c\u3002\u5bf9\u4e8e fib(50)\uff0c\u9700\u8981\u8d85\u8fc7 \\(10^{15}\\) \u6b21\u64cd\u4f5c\u2014\u2014\u4e0d\u53ef\u884c\u3002
\u4f7f\u7528\u8bb0\u5fc6\u5316\uff08\u81ea\u9876\u5411\u4e0b DP\uff09\uff1a
def fib_memo(n, memo={}):\n if n in memo:\n return memo[n]\n if n <= 1:\n return n\n memo[n] = fib_memo(n - 1, memo) + fib_memo(n - 2, memo)\n return memo[n]\n \u73b0\u5728 fib(3) \u53ea\u8ba1\u7b97\u4e00\u6b21\uff0c\u5b58\u50a8\u8d77\u6765\uff0c\u540e\u7eed\u8c03\u7528\u76f4\u63a5\u67e5\u627e\u3002\u603b\u8ba1\uff1a\\(O(n)\\) \u65f6\u95f4\uff0c\\(O(n)\\) \u7a7a\u95f4\u3002
\u4f7f\u7528\u5236\u8868\u6cd5\uff08\u81ea\u5e95\u5411\u4e0a DP\uff09\uff1a
def fib_tab(n):\n if n <= 1:\n return n\n dp = [0] * (n + 1)\n dp[1] = 1\n for i in range(2, n + 1):\n dp[i] = dp[i - 1] + dp[i - 2]\n return dp[n]\n \u5bf9\u4e8e\u4efb\u4f55 DP \u95ee\u9898\uff0c\u9075\u5faa\u4ee5\u4e0b\u6b65\u9aa4\uff1a
\u5b9a\u4e49\u72b6\u6001\uff1adp[i]\uff08\u6216 dp[i][j]\uff09\u4ee3\u8868\u4ec0\u4e48\uff1f\u8fd9\u662f\u6700\u96be\u7684\u4e00\u6b65\u3002\u72b6\u6001\u5fc5\u987b\u6355\u83b7\u8db3\u591f\u7684\u4fe1\u606f\u4ee5\u505a\u51fa\u6700\u4f18\u51b3\u7b56\u3002
\u5199\u51fa\u9012\u63a8\u5173\u7cfb\uff1adp[i] \u5982\u4f55\u4e0e\u66f4\u5c0f\u7684\u5b50\u95ee\u9898\u5173\u8054\uff1f\u8fd9\u662f\u8f6c\u79fb\u516c\u5f0f\u3002
\u786e\u5b9a\u57fa\u672c\u60c5\u51b5\uff1a\u54ea\u4e9b\u662f\u6700\u5c0f\u7684\u5b50\u95ee\u9898\uff0c\u53ef\u4ee5\u76f4\u63a5\u6c42\u89e3\uff1f
\u786e\u5b9a\u8fed\u4ee3\u987a\u5e8f\uff1a\u54ea\u4e9b\u5b50\u95ee\u9898\u5fc5\u987b\u5148\u4e8e\u54ea\u4e9b\u5b50\u95ee\u9898\u6c42\u89e3\uff1f\u81ea\u5e95\u5411\u4e0a\uff1a\u6309\u7167\u786e\u4fdd\u4f9d\u8d56\u5173\u7cfb\u5df2\u89e3\u51b3\u7684\u987a\u5e8f\u8fed\u4ee3\u3002\u81ea\u9876\u5411\u4e0b\uff1a\u9012\u5f52\u4f1a\u81ea\u52a8\u5904\u7406\u3002
\u4f18\u5316\u7a7a\u95f4\uff08\u53ef\u9009\uff09\uff1a\u5982\u679c dp[i] \u53ea\u4f9d\u8d56\u4e8e\u524d\u4e00\u884c\u6216\u524d\u51e0\u4e2a\u6761\u76ee\uff0c\u4f60\u5c31\u4e0d\u9700\u8981\u5b8c\u6574\u7684\u8868\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u6b63\u6574\u6570\u6570\u7ec4\uff0c\u6c42\u4e0d\u76f8\u90bb\u5143\u7d20\u7684\u6700\u5927\u548c\uff08\u6253\u5bb6\u52ab\u820d\uff09\u3002
\u7b2c1\u6b65\u2014\u2014\u5b9a\u4e49\u72b6\u6001\uff1adp[i] = \u8003\u8651\u5143\u7d20 nums[0..i] \u7684\u6700\u5927\u548c\u3002
\u7b2c2\u6b65\u2014\u2014\u5199\u51fa\u9012\u63a8\u5173\u7cfb\uff1a\u5bf9\u4e8e\u5143\u7d20 \\(i\\)\uff0c\u6211\u4eec\u8981\u4e48\uff1a - \u8df3\u8fc7\u5b83\uff1adp[i] = dp[i-1]\uff08\u4e0d\u542b\u5143\u7d20 \\(i\\) \u7684\u6700\u4f73\u548c\uff09\u3002 - \u53d6\u7528\u5b83\uff1adp[i] = dp[i-2] + nums[i]\uff08\u5fc5\u987b\u8df3\u8fc7\u5143\u7d20 \\(i-1\\)\uff0c\u7136\u540e\u52a0\u4e0a\u5143\u7d20 \\(i\\)\uff09\u3002
\u6240\u4ee5\uff1adp[i] = max(dp[i-1], dp[i-2] + nums[i])\u3002
\u7b2c3\u6b65\u2014\u2014\u57fa\u672c\u60c5\u51b5\uff1adp[0] = nums[0]\uff0cdp[1] = max(nums[0], nums[1])\u3002
\u7b2c4\u6b65\u2014\u2014\u8fed\u4ee3\u987a\u5e8f\uff1a\u4ece\u5de6\u5230\u53f3\uff08\u6bcf\u4e2a\u72b6\u6001\u4f9d\u8d56\u4e8e\u524d\u4e24\u4e2a\u72b6\u6001\uff09\u3002
\u7b2c5\u6b65\u2014\u2014\u7a7a\u95f4\u4f18\u5316\uff1a\u53ea\u9700\u8981\u6700\u540e\u4e24\u4e2a\u503c\u3002
def rob(nums):\n if len(nums) == 1:\n return nums[0]\n\n prev2, prev1 = nums[0], max(nums[0], nums[1])\n\n for i in range(2, len(nums)):\n curr = max(prev1, prev2 + nums[i])\n prev2, prev1 = prev1, curr\n\n return prev1\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/00.%20foundations/#dp_1","title":"\u5982\u4f55\u8bc6\u522b DP \u95ee\u9898","text":"1D DP\uff1a\u72b6\u6001\u4f9d\u8d56\u4e8e\u5355\u4e2a\u7d22\u5f15\u3002\u793a\u4f8b\uff1a\u722c\u697c\u68af\u3001\u6253\u5bb6\u52ab\u820d\u3001\u6700\u5927\u5b50\u6570\u7ec4\u3002
2D DP\uff1a\u72b6\u6001\u4f9d\u8d56\u4e8e\u4e24\u4e2a\u7d22\u5f15\u3002\u793a\u4f8b\uff1a\u6700\u957f\u516c\u5171\u5b50\u5e8f\u5217\uff08dp[i][j] \u8868\u793a\u5b57\u7b26\u4e321\u7684\u524d \\(i\\) \u4e2a\u5b57\u7b26\u548c\u5b57\u7b26\u4e322\u7684\u524d \\(j\\) \u4e2a\u5b57\u7b26\uff09\u3001\u7f16\u8f91\u8ddd\u79bb\u3001\u7f51\u683c\u8def\u5f84\u95ee\u9898\u3002
\u533a\u95f4 DP\uff1a\u72b6\u6001\u662f\u4e00\u4e2a\u533a\u95f4 dp[i][j]\uff0c\u8868\u793a arr[i..j] \u4e0a\u7684\u5b50\u95ee\u9898\u3002\u793a\u4f8b\uff1a\u77e9\u9635\u94fe\u4e58\u6cd5\u3001\u6233\u6c14\u7403\u3002
\u80cc\u5305 DP\uff1a\u72b6\u6001\u662f\u7269\u54c1\u7d22\u5f15\u548c\u5bb9\u91cf\u3002\u793a\u4f8b\uff1a0/1 \u80cc\u5305\u3001\u96f6\u94b1\u5151\u6362\u3001\u5b50\u96c6\u548c\u3002
\u4f4d\u63a9\u7801 DP\uff1a\u72b6\u6001\u5305\u542b\u4e00\u4e2a\u4f4d\u63a9\u7801\uff0c\u8868\u793a\u54ea\u4e9b\u5143\u7d20\u5df2\u88ab\u4f7f\u7528\u3002\u793a\u4f8b\uff1a\u65c5\u884c\u5546\u95ee\u9898\u3001\u5206\u914d\u95ee\u9898\u3002\u72b6\u6001\u7a7a\u95f4\u4e3a \\(O(2^n \\cdot n)\\)\uff0c\u5bf9\u4e8e \\(n \\leq 20\\) \u53ef\u884c\u3002
dp[i] \u6ca1\u6709\u6355\u83b7\u8db3\u591f\u4fe1\u606f\u6765\u505a\u51b3\u7b56 \u589e\u52a0\u7ef4\u5ea6\uff08\u4f8b\u5982\u7528 dp[i][j] \u4ee3\u66ff dp[i]\uff09 \u7f3a\u5c11\u57fa\u672c\u60c5\u51b5 dp[0] \u9519\u8bef \u2192 \u6240\u6709\u540e\u7eed\u503c\u90fd\u9519 \u624b\u52a8\u9a8c\u8bc1\u57fa\u672c\u60c5\u51b5 \u8fed\u4ee3\u987a\u5e8f\u9519\u8bef \u5728\u4f9d\u8d56\u5173\u7cfb\u672a\u89e3\u51b3\u4e4b\u524d\u8ba1\u7b97 dp[i] \u753b\u51fa\u4f9d\u8d56\u7bad\u5934\u5e76\u76f8\u5e94\u8fed\u4ee3 \u672a\u6b63\u786e\u521d\u59cb\u5316 dp \u7528 0 \u800c\u5e94\u8be5\u7528\u65e0\u7a77\u5927\uff08\u6c42\u6700\u5c0f\u503c\u65f6\uff09 \u6700\u5c0f\u5316\u7528 float('inf')\uff0c\u6700\u5927\u5316\u7528 float('-inf') \u5fd8\u8bb0\u8003\u8651\"\u8df3\u8fc7\"\u9009\u9879 \u603b\u662f\u53d6\u5f53\u524d\u5143\u7d20 \u9012\u63a8\u5173\u7cfb\u901a\u5e38\u6709 max(take, skip) \u53ef\u53d8\u7684\u9ed8\u8ba4\u53c2\u6570 def f(memo={}) \u5728\u8c03\u7528\u95f4\u5171\u4eab\u7f13\u5b58 def f(memo=None): if memo is None: memo = {} 2D DP \u4e2d\u7684\u5dee\u4e00\u9519\u8bef dp \u662f 1-indexed \u65f6\u8bbf\u95ee text1[i] dp \u5927\u5c0f\u4e3a (m+1) x (n+1)\uff0c\u8bbf\u95ee text1[i-1]"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/00.%20foundations/#_22","title":"\u878d\u4f1a\u8d2f\u901a","text":"\u8fd9\u56db\u4e2a\u6982\u5ff5\u6784\u6210\u4e00\u4e2a\u9012\u8fdb\u5173\u7cfb\uff1a
\u5f53\u4f60\u9047\u5230\u4e00\u4e2a\u65b0\u95ee\u9898\u65f6\uff1a
\u6570\u7ec4\u548c\u54c8\u5e0c\u8868\u662f\u7f16\u7a0b\u4e2d\u6700\u57fa\u7840\u7684\u4e24\u79cd\u6570\u636e\u7ed3\u6784\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u5b83\u4eec\u5e95\u5c42\u7684\u8fd0\u884c\u673a\u5236\uff0c\u7136\u540e\u6784\u5efa\u5173\u952e\u7684\u95ee\u9898\u89e3\u51b3\u6a21\u5f0f\uff1a\u53cc\u6307\u9488\u3001\u6ed1\u52a8\u7a97\u53e3\u3001\u524d\u7f00\u548c\u4ee5\u53ca\u57fa\u4e8e\u54c8\u5e0c\u7684\u67e5\u627e\uff0c\u901a\u8fc7\u9010\u6b65\u589e\u52a0\u96be\u5ea6\u7684\u9898\u76ee\uff0c\u5e76\u5728\u6bcf\u4e00\u6b65\u6307\u51fa\u5e38\u89c1\u9677\u9631\u3002
\u5982\u679c\u4f60\u6df1\u5165\u7406\u89e3\u6570\u7ec4\u548c\u54c8\u5e0c\u8868\uff0c\u4f60\u53ef\u4ee5\u89e3\u51b3\u7ea640%\u7684\u7f16\u7801\u9762\u8bd5\u9898\u3002\u8fd9\u4e24\u79cd\u7ed3\u6784\u65e0\u5904\u4e0d\u5728\uff0c\u56e0\u4e3a\u5b83\u4eec\u63d0\u4f9b\u4e86\u7b97\u6cd5\u6700\u9700\u8981\u7684\u4e24\u6837\u4e1c\u897f\uff1a\u5feb\u901f\u7d22\u5f15\u8bbf\u95ee\uff08\u6570\u7ec4\uff09\u548c\u6309\u952e\u5feb\u901f\u67e5\u627e\uff08\u54c8\u5e0c\u8868\uff09\u3002
\u672c\u6587\u4ef6\u6559\u6388\u7684\u662f\u6a21\u5f0f\uff0c\u800c\u975e\u89e3\u6cd5\u3002\u76ee\u6807\u662f\u5f53\u4f60\u770b\u5230\u4e00\u4e2a\u65b0\u95ee\u9898\u65f6\uff0c\u4f60\u80fd\u8bc6\u522b\u51fa\u9002\u7528\u54ea\u4e2a\u6a21\u5f0f\u4ee5\u53ca\u4e3a\u4ec0\u4e48\uff0c\u800c\u4e0d\u662f\u8bd5\u56fe\u56de\u5fc6\u4e00\u4e2a\u80cc\u4e0b\u6765\u7684\u89e3\u6cd5\u3002
\u6570\u7ec4\u662f\u4e00\u7247\u8fde\u7eed\u7684\u5185\u5b58\u5757\uff0c\u5143\u7d20\u4ee5\u56fa\u5b9a\u504f\u79fb\u91cf\u5b58\u50a8\u3002\u8bbf\u95ee\u5143\u7d20 \\(i\\) \u7684\u6210\u672c\u662f \\(O(1)\\)\uff0c\u56e0\u4e3a\u5730\u5740\u5c31\u662f base + i * element_size\u3002\u8fd9\u662f\u6700\u5feb\u7684\u6570\u636e\u8bbf\u95ee\u65b9\u5f0f\uff0c\u4e5f\u662f\u6570\u7ec4\u6210\u4e3a\u9ed8\u8ba4\u9009\u62e9\u7684\u539f\u56e0\u3002
\u52a8\u6001\u6570\u7ec4\uff08Python \u7684 list\u3001Java \u7684 ArrayList\u3001C++ \u7684 vector\uff09\u5728\u6ee1\u65f6\u81ea\u52a8\u589e\u957f\u3002\u5176\u7b56\u7565\u662f\u5e73\u644a\u52a0\u500d\uff1a\u5f53\u6570\u7ec4\u6ee1\u65f6\uff0c\u5206\u914d\u4e00\u4e2a\u4e24\u500d\u5927\u5c0f\u7684\u65b0\u6570\u7ec4\u5e76\u5c06\u6240\u6709\u5143\u7d20\u590d\u5236\u8fc7\u53bb\u3002\u590d\u5236\u6210\u672c\u4e3a \\(O(n)\\)\uff0c\u4f46\u8fd9\u79cd\u60c5\u51b5\u5f88\u5c11\u53d1\u751f\uff08\u6bcf \\(n\\) \u6b21\u63d2\u5165\u4e00\u6b21\uff09\uff0c\u6240\u4ee5\u6bcf\u6b21\u63d2\u5165\u7684\u5e73\u644a\u6210\u672c\u662f \\(O(1)\\)\u3002
\u7f13\u5b58\u5c40\u90e8\u6027\u662f\u6570\u7ec4\u5728\u5b9e\u8df5\u4e2d\u5f88\u5feb\u7684\u539f\u56e0\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u7406\u8bba\u4e0a\u3002\u56e0\u4e3a\u5143\u7d20\u662f\u8fde\u7eed\u5b58\u50a8\u7684\uff0c\u8bbf\u95ee\u4e00\u4e2a\u5143\u7d20\u4f1a\u5c06\u5176\u90bb\u8fd1\u5143\u7d20\u52a0\u8f7d\u5230 CPU \u7f13\u5b58\u4e2d\uff08\u7b2c13\u7ae0\uff09\u3002\u904d\u5386\u6570\u7ec4\u662f\u7f13\u5b58\u53cb\u597d\u7684\uff1b\u5728\u94fe\u8868\u4e2d\u8ddf\u968f\u6307\u9488\u5219\u4e0d\u662f\u3002\u8fd9\u4e2a\u5e38\u6570\u56e0\u5b50\u5dee\u5f02\u5728\u5b9e\u9645\u4e2d\u53ef\u80fd\u8fbe\u5230 10-100 \u500d\u3002
# \u4e0d\u597d\uff1aO(n^2) \u5b57\u7b26\u4e32\u62fc\u63a5\ns = \"\"\nfor c in characters:\n s += c # \u6bcf\u6b21\u590d\u5236\u6574\u4e2a\u5b57\u7b26\u4e32\n\n# \u597d\uff1aO(n) \u4f7f\u7528\u5217\u8868\u7136\u540e join\nparts = []\nfor c in characters:\n parts.append(c)\ns = \"\".join(parts)\n \u9677\u9631\uff1a\u5728 Python \u4e2d\uff0c\u5faa\u73af\u5185\u7684 s += c \u662f\u6700\u5e38\u89c1\u7684\u6027\u80fd bug \u4e4b\u4e00\u3002\u59cb\u7ec8\u5148\u6536\u96c6\u5230\u5217\u8868\u4e2d\u518d .join()\u3002
\u7f16\u7801\uff1aASCII \u4f7f\u7528 7 \u4f4d\uff08128 \u4e2a\u5b57\u7b26\uff09\u3002UTF-8 \u662f\u53ef\u53d8\u957f\u5ea6\u7684\uff1aASCII \u5b57\u7b26\u4f7f\u7528 1 \u5b57\u8282\uff0c\u5e26\u91cd\u97f3\u5b57\u7b26\u4f7f\u7528 2 \u5b57\u8282\uff0c\u4e2d\u6587/\u65e5\u6587\u5b57\u7b26\u4f7f\u7528 3 \u5b57\u8282\uff0c\u8868\u60c5\u7b26\u53f7\u4f7f\u7528 4 \u5b57\u8282\u3002\u5f53\u95ee\u9898\u8bf4\"\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd\"\u65f6\uff0c\u5b57\u6bcd\u8868\u5927\u5c0f\u4e3a 26\uff0c\u8fd9\u610f\u5473\u7740\u4f60\u53ef\u4ee5\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u6570\u7ec4\u800c\u4e0d\u662f\u54c8\u5e0c\u8868\u3002
\u54c8\u5e0c\u8868\u5c06\u952e\u6620\u5c04\u5230\u503c\uff0c\u5e73\u5747\u60c5\u51b5\u4e0b\u7684\u67e5\u627e\u3001\u63d2\u5165\u548c\u5220\u9664\u90fd\u662f \\(O(1)\\)\u3002\u5b83\u901a\u8fc7\u8ba1\u7b97\u4e00\u4e2a\u54c8\u5e0c\u51fd\u6570 \\(h(key)\\) \u5c06\u952e\u8f6c\u6362\u4e3a\u6570\u7ec4\u7d22\u5f15\u6765\u5b9e\u73b0\u3002
\u54c8\u5e0c\u51fd\u6570\u5fc5\u987b\uff1a\u786e\u5b9a\u6027\u7684\uff08\u76f8\u540c\u952e\u603b\u662f\u5f97\u5230\u76f8\u540c\u54c8\u5e0c\u503c\uff09\u3001\u5747\u5300\u7684\uff08\u5c06\u952e\u5747\u5300\u5206\u5e03\u5230\u5404\u4e2a\u6876\u4e2d\uff09\u4e14\u8ba1\u7b97\u901f\u5ea6\u5feb\u3002
\u51b2\u7a81\u53d1\u751f\u5728\u4e24\u4e2a\u4e0d\u540c\u7684\u952e\u54c8\u5e0c\u5230\u76f8\u540c\u7684\u7d22\u5f15\u65f6\u3002\u6709\u4e24\u79cd\u4e3b\u8981\u7b56\u7565\uff1a
\u94fe\u5730\u5740\u6cd5\uff1a\u6bcf\u4e2a\u6876\u5b58\u50a8\u4e00\u4e2a\u952e\u503c\u5bf9\u94fe\u8868\u3002\u53d1\u751f\u51b2\u7a81\u65f6\uff0c\u8ffd\u52a0\u5230\u94fe\u8868\u3002\u6700\u574f\u60c5\u51b5\uff08\u6240\u6709\u952e\u54c8\u5e0c\u5230\u540c\u4e00\u4e2a\u6876\uff09\uff1a\\(O(n)\\)\u3002\u4f7f\u7528\u597d\u7684\u54c8\u5e0c\u51fd\u6570\u65f6\u7684\u5e73\u5747\u60c5\u51b5\uff1a\\(O(1)\\)\u3002
\u5f00\u653e\u5730\u5740\u6cd5\uff1a\u53d1\u751f\u51b2\u7a81\u65f6\uff0c\u63a2\u6d4b\u4e0b\u4e00\u4e2a\u7a7a\u69fd\u3002\u7ebf\u6027\u63a2\u6d4b\u68c0\u67e5\u4e0b\u4e00\u4e2a\u69fd\u4f4d\uff0c\u7136\u540e\u518d\u4e0b\u4e00\u4e2a\uff0c\u4ee5\u6b64\u7c7b\u63a8\u3002\u5b83\u7f13\u5b58\u53cb\u597d\uff0c\u4f46\u4f1a\u906d\u53d7\u805a\u96c6\u95ee\u9898\uff08\u957f\u4e32\u7684\u5df2\u5360\u7528\u69fd\u4f4d\uff09\u3002\u7f57\u5bbe\u6c49\u54c8\u5e0c\u901a\u8fc7\u5c06\"\u79bb\u5bb6\u8f83\u8fd1\"\u7684\u6761\u76ee\u79fb\u4f4d\u6765\u51cf\u5c11\u65b9\u5dee\u3002
\u8d1f\u8f7d\u56e0\u5b50 \\(\\alpha = n / m\\)\uff08\u5143\u7d20\u6570 / \u6876\u6570\uff09\u51b3\u5b9a\u4e86\u6027\u80fd\u3002\u5f53 \\(\\alpha\\) \u8d85\u8fc7\u9608\u503c\uff08\u901a\u5e38\u4e3a 0.75\uff09\u65f6\uff0c\u8868\u4f1a\u91cd\u65b0\u54c8\u5e0c\uff1a\u5206\u914d\u4e00\u4e2a\u66f4\u5927\u7684\u8868\u5e76\u91cd\u65b0\u63d2\u5165\u6240\u6709\u5143\u7d20\u3002\u8fd9\u9700\u8981 \\(O(n)\\) \u65f6\u95f4\uff0c\u4f46\u4e0d\u5e38\u53d1\u751f\u3002
\u54c8\u5e0c\u6620\u5c04\uff08Python \u4e2d\u7684 dict\u3001Java \u4e2d\u7684 HashMap\uff09\u5b58\u50a8\u952e\u503c\u5bf9\u3002\u54c8\u5e0c\u96c6\u5408\uff08Python \u4e2d\u7684 set\u3001Java \u4e2d\u7684 HashSet\uff09\u53ea\u5b58\u50a8\u952e\uff08\u7528\u4e8e\u5feb\u901f\u6210\u5458\u6d4b\u8bd5\uff09\u3002
\u5e03\u9686\u8fc7\u6ee4\u5668\u662f\u7a7a\u95f4\u9ad8\u6548\u7684\u6982\u7387\u6027\u96c6\u5408\u3002\u5b83\u53ef\u4ee5\u544a\u8bc9\u4f60\"\u80af\u5b9a\u4e0d\u5728\u96c6\u5408\u4e2d\"\u6216\"\u53ef\u80fd\u5728\u96c6\u5408\u4e2d\"\uff08\u5177\u6709\u53ef\u8c03\u7684\u5047\u9633\u6027\u7387\uff09\u3002\u5b83\u4f7f\u7528 \\(k\\) \u4e2a\u54c8\u5e0c\u51fd\u6570\u548c\u4e00\u4e2a\u4f4d\u6570\u7ec4\u3002\u7528\u4e8e\u6570\u636e\u5e93\uff08\u907f\u514d\u5bf9\u4e0d\u5b58\u5728\u7684\u952e\u8fdb\u884c\u78c1\u76d8\u8bfb\u53d6\uff09\u3001Web \u7f13\u5b58\u548c\u62fc\u5199\u68c0\u67e5\u5668\u3002
\u4f55\u65f6\u4f7f\u7528\u54c8\u5e0c\u8868\uff1a\u6bcf\u5f53\u4f60\u9700\u8981\u7528 \\(O(1)\\) \u7684\u65f6\u95f4\u56de\u7b54\"\u6211\u4e4b\u524d\u89c1\u8fc7\u8fd9\u4e2a\u5417\uff1f\"\u6216\"\u4e0e\u8fd9\u4e2a\u952e\u5173\u8054\u7684\u8ba1\u6570/\u7d22\u5f15/\u503c\u662f\u4ec0\u4e48\uff1f\"\u65f6\u3002\u5982\u679c\u4f60\u6b63\u5728\u53cd\u590d\u8fdb\u884c\u7ebf\u6027\u626b\u63cf\u5bfb\u627e\u67d0\u7269\uff0c\u54c8\u5e0c\u8868\u51e0\u4e4e\u603b\u80fd\u4f7f\u5176\u66f4\u5feb\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u6574\u6570\u6570\u7ec4\u548c\u4e00\u4e2a\u76ee\u6807\u503c\uff0c\u8fd4\u56de\u4e24\u4e2a\u6570\u7684\u7d22\u5f15\uff0c\u4f7f\u5b83\u4eec\u7684\u548c\u7b49\u4e8e\u76ee\u6807\u503c\u3002
\u66b4\u529b\u89e3\u6cd5 \\(O(n^2)\\)\uff1a\u68c0\u67e5\u6bcf\u4e00\u5bf9\u3002
\u6a21\u5f0f\u6d1e\u5bdf\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u6570\u5b57 num\uff0c\u9700\u8981 target - num \u5b58\u5728\u4e8e\u6570\u7ec4\u4e2d\u7684\u67d0\u5904\u3002\u4e0e\u5176\u626b\u63cf\u6570\u7ec4\u5bfb\u627e\u5b83\uff0c\u4e0d\u5982\u5c06\u4e4b\u524d\u89c1\u8fc7\u7684\u6570\u5b57\u5b58\u50a8\u5728\u4e00\u4e2a\u54c8\u5e0c\u8868\u4e2d\u3002
def two_sum(nums, target):\n seen = {} # \u503c -> \u7d22\u5f15\n for i, num in enumerate(nums):\n complement = target - num\n if complement in seen:\n return [seen[complement], i]\n seen[num] = i\n \u4e3a\u4ec0\u4e48\u6709\u6548\uff1a\u4e00\u6b21\u904d\u5386\u6570\u7ec4\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u5143\u7d20\uff0c\u54c8\u5e0c\u8868\u67e5\u627e\u662f \\(O(1)\\)\u3002\u603b\u8ba1\uff1a\\(O(n)\\) \u65f6\u95f4\uff0c\\(O(n)\\) \u7a7a\u95f4\u3002
\u9677\u9631\uff1a\u5728\u68c0\u67e5\u8865\u6570\u4e4b\u524d\u4e0d\u8981\u5c06\u5f53\u524d\u6570\u5b57\u6dfb\u52a0\u5230\u54c8\u5e0c\u8868\uff0c\u5426\u5219\u53ef\u80fd\u4f1a\u8ba9\u5143\u7d20\u4e0e\u81ea\u8eab\u5339\u914d\u3002\u4e0a\u9762\u4ee3\u7801\u4e2d\u7684\u987a\u5e8f\u662f\u6b63\u786e\u7684\uff1a\u5148\u68c0\u67e5\uff0c\u540e\u63d2\u5165\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u5b57\u7b26\u4e32\u5217\u8868\uff0c\u5c06\u5b57\u6bcd\u5f02\u4f4d\u8bcd\u5206\u7ec4\u5728\u4e00\u8d77\u3002\uff08\"eat\"\u3001\"tea\"\u3001\"ate\"\uff09\u662f\u4e00\u7ec4\u3002
\u6a21\u5f0f\u6d1e\u5bdf\uff1a\u5f02\u4f4d\u8bcd\u5177\u6709\u76f8\u540c\u7684\u5b57\u7b26\u4f46\u987a\u5e8f\u4e0d\u540c\u3002\u5982\u679c\u5bf9\u6bcf\u4e2a\u5b57\u7b26\u4e32\u8fdb\u884c\u6392\u5e8f\uff0c\u5f02\u4f4d\u8bcd\u4f1a\u4ea7\u751f\u76f8\u540c\u7684\u6392\u5e8f\u540e\u952e\u3002\u4f7f\u7528\u8fd9\u4e2a\u6392\u5e8f\u540e\u7684\u952e\u4f5c\u4e3a\u54c8\u5e0c\u8868\u7684\u952e\u3002
from collections import defaultdict\n\ndef group_anagrams(strs):\n groups = defaultdict(list)\n for s in strs:\n key = tuple(sorted(s)) # \u6216\u4f7f\u7528\u5b57\u7b26\u8ba1\u6570\u5143\u7ec4\n groups[key].append(s)\n return list(groups.values())\n def group_anagrams_fast(strs):\n groups = defaultdict(list)\n for s in strs:\n count = [0] * 26\n for c in s:\n count[ord(c) - ord('a')] += 1\n groups[tuple(count)].append(s)\n return list(groups.values())\n \u8fd9\u6837\u6bcf\u4e2a\u5b57\u7b26\u4e32\u662f \\(O(k)\\) \u800c\u4e0d\u662f \\(O(k \\log k)\\)\u3002\u5b57\u7b26\u8ba1\u6570\u5143\u7ec4\u662f\u4e00\u79cd\u89c4\u8303\u5f62\u5f0f\uff1a\u5bf9\u7ec4\u5185\u6240\u6709\u6210\u5458\u90fd\u76f8\u540c\u7684\u8868\u793a\u3002
\u9677\u9631\uff1a\u5728 Python \u4e2d\uff0c\u5217\u8868\u4e0d\u53ef\u54c8\u5e0c\uff08\u4e0d\u80fd\u7528\u4f5c\u5b57\u5178\u952e\uff09\u3002\u4f60\u5fc5\u987b\u8f6c\u6362\u4e3a\u5143\u7ec4\u3002\u5f53\u4eba\u4eec\u5c1d\u8bd5 groups[count].append(s) \u65f6\u5c31\u4f1a\u51fa\u9519\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u672a\u6392\u5e8f\u7684\u6570\u7ec4\uff0c\u627e\u51fa\u6700\u957f\u8fde\u7eed\u5e8f\u5217\u7684\u957f\u5ea6\uff08\u4f8b\u5982\uff0c[100, 4, 200, 1, 3, 2] \u2192 4\uff0c\u56e0\u4e3a [1, 2, 3, 4]\uff09\u3002
\u66b4\u529b\u89e3\u6cd5 \\(O(n \\log n)\\)\uff1a\u5bf9\u6570\u7ec4\u6392\u5e8f\uff0c\u7136\u540e\u626b\u63cf\u8fde\u7eed\u6bb5\u3002
\u6a21\u5f0f\u6d1e\u5bdf\uff1a\u5c06\u6240\u6709\u6570\u5b57\u653e\u5165\u54c8\u5e0c\u96c6\u4ee5\u5b9e\u73b0 \\(O(1)\\) \u67e5\u627e\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u6570\u5b57\uff0c\u68c0\u67e5\u5b83\u662f\u5426\u662f\u4e00\u4e2a\u5e8f\u5217\u7684\u8d77\u70b9\uff08\u5373 num - 1 \u4e0d\u5728\u96c6\u5408\u4e2d\uff09\u3002\u5982\u679c\u662f\uff0c\u5219\u8ba1\u7b97\u8be5\u5e8f\u5217\u80fd\u5ef6\u4f38\u591a\u8fdc\u3002
def longest_consecutive(nums):\n num_set = set(nums)\n best = 0\n\n for num in num_set:\n # \u53ea\u4ece\u5e8f\u5217\u7684\u5f00\u5934\u5f00\u59cb\u8ba1\u6570\n if num - 1 not in num_set:\n length = 1\n while num + length in num_set:\n length += 1\n best = max(best, length)\n\n return best\n \u4e3a\u4ec0\u4e48\u662f \\(O(n)\\)\uff1a\u5185\u90e8 while \u5faa\u73af\u5728\u6240\u6709\u8fed\u4ee3\u4e2d\u603b\u5171\u6700\u591a\u8fd0\u884c \\(n\\) \u6b21\uff08\u6bcf\u4e2a\u6570\u5b57\u6700\u591a\u88ab\u8bbf\u95ee\u4e24\u6b21\uff1a\u4e00\u6b21\u5728\u5916\u5c42\u5faa\u73af\uff0c\u4e00\u6b21\u5728 while \u6269\u5c55\u4e2d\uff09\u3002if num - 1 not in num_set \u5b88\u536b\u786e\u4fdd\u6211\u4eec\u53ea\u4ece\u5e8f\u5217\u8d77\u70b9\u5f00\u59cb\u8ba1\u6570\u3002
\u9677\u9631\uff1a\u5982\u679c\u6ca1\u6709 if num - 1 not in num_set \u68c0\u67e5\uff0c\u4f60\u4f1a\u4ece\u6bcf\u4e2a\u5143\u7d20\u5f00\u59cb\u8ba1\u6570\uff0c\u5728\u6700\u574f\u60c5\u51b5\u4e0b\u4f1a\u53d8\u6210 \\(O(n^2)\\)\uff08\u4f8b\u5982\uff0c[1, 2, 3, ..., n] \u4f1a\u4ece\u6bcf\u4e2a\u8d77\u70b9\u626b\u63cf\u6574\u4e2a\u5e8f\u5217\uff09\u3002
\u53cc\u6307\u9488\u6a21\u5f0f\u4f7f\u7528\u4e24\u4e2a\u7d22\u5f15\u5728\u6570\u7ec4\u4e2d\u79fb\u52a8\uff0c\u901a\u5e38\u4ece\u4e24\u7aef\u5411\u4e2d\u95f4\u6216\u4ece\u540c\u7aef\u4ee5\u4e0d\u540c\u901f\u5ea6\u79fb\u52a8\u3002\u5b83\u5728\u6570\u7ec4\u5df2\u6392\u5e8f\u6216\u9700\u8981\u6bd4\u8f83\u6210\u5bf9\u5143\u7d20\u65f6\u6709\u6548\u3002
\u4f55\u65f6\u4f7f\u7528\uff1a\u95ee\u9898\u6d89\u53ca\u6210\u5bf9\u3001\u5b50\u6570\u7ec4\u6216\u5206\u533a\uff0c\u5e76\u4e14\u6570\u7ec4\u5df2\u6392\u5e8f\uff08\u6216\u53ef\u5728\u4e0d\u4e22\u5931\u6240\u9700\u4fe1\u606f\u7684\u60c5\u51b5\u4e0b\u6392\u5e8f\uff09\u3002
\u95ee\u9898\uff1a\u5224\u65ad\u4e00\u4e2a\u5b57\u7b26\u4e32\u662f\u5426\u662f\u56de\u6587\u4e32\uff0c\u53ea\u8003\u8651\u5b57\u6bcd\u6570\u5b57\u5b57\u7b26\u5e76\u5ffd\u7565\u5927\u5c0f\u5199\u3002
\u6a21\u5f0f\uff1a\u4e00\u4e2a\u6307\u9488\u5728\u5f00\u5934\uff0c\u4e00\u4e2a\u5728\u7ed3\u5c3e\u3002\u5411\u4e2d\u95f4\u79fb\u52a8\uff0c\u6bd4\u8f83\u5b57\u7b26\u3002
def is_palindrome(s):\n left, right = 0, len(s) - 1\n\n while left < right:\n # \u8df3\u8fc7\u975e\u5b57\u6bcd\u6570\u5b57\u5b57\u7b26\n while left < right and not s[left].isalnum():\n left += 1\n while left < right and not s[right].isalnum():\n right -= 1\n\n if s[left].lower() != s[right].lower():\n return False\n\n left += 1\n right -= 1\n\n return True\n left < right \u68c0\u67e5\u3002\u6ca1\u6709\u5b83\uff0c\u5728\u50cf \"!!!\"\uff08\u5168\u90e8\u975e\u5b57\u6bcd\u6570\u5b57\uff09\u8fd9\u6837\u7684\u5b57\u7b26\u4e32\u4e0a\u6307\u9488\u53ef\u80fd\u8d8a\u754c\u3002\u95ee\u9898\uff1a\u627e\u51fa\u6570\u7ec4\u4e2d\u6240\u6709\u552f\u4e00\u7684\u4e09\u5143\u7ec4\uff0c\u4f7f\u5176\u548c\u4e3a\u96f6\u3002
\u6a21\u5f0f\uff1a\u5bf9\u6570\u7ec4\u6392\u5e8f\u3002\u56fa\u5b9a\u4e00\u4e2a\u5143\u7d20\uff0c\u7136\u540e\u5728\u5269\u4f59\u90e8\u5206\u4f7f\u7528\u53cc\u6307\u9488\u627e\u5230\u548c\u4e3a\u56fa\u5b9a\u5143\u7d20\u76f8\u53cd\u6570\u7684\u5bf9\u3002
def three_sum(nums):\n nums.sort()\n result = []\n\n for i in range(len(nums) - 2):\n # \u8df3\u8fc7\u91cd\u590d\u7684\u56fa\u5b9a\u5143\u7d20\n if i > 0 and nums[i] == nums[i - 1]:\n continue\n\n left, right = i + 1, len(nums) - 1\n target = -nums[i]\n\n while left < right:\n total = nums[left] + nums[right]\n if total < target:\n left += 1\n elif total > target:\n right -= 1\n else:\n result.append([nums[i], nums[left], nums[right]])\n # \u8df3\u8fc7\u91cd\u590d\u9879\n while left < right and nums[left] == nums[left + 1]:\n left += 1\n while left < right and nums[right] == nums[right - 1]:\n right -= 1\n left += 1\n right -= 1\n\n return result\n \u4e3a\u4ec0\u4e48\u6709\u6548\uff1a\u6392\u5e8f\u662f \\(O(n \\log n)\\)\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u56fa\u5b9a\u5143\u7d20\uff0c\u53cc\u6307\u9488\u626b\u63cf\u662f \\(O(n)\\)\u3002\u603b\u8ba1\uff1a\\(O(n^2)\\)\uff0c\u8fd9\u662f\u8be5\u95ee\u9898\u7684\u6700\u4f18\u89e3\uff08\u4f60\u5fc5\u987b\u8003\u8651\u6240\u6709\u6210\u5bf9\u7ec4\u5408\uff09\u3002
\u9677\u9631\uff1a\u5904\u7406\u91cd\u590d\u9879\u662f\u6700\u96be\u7684\u90e8\u5206\u3002\u6ca1\u6709\u8df3\u8fc7\u91cd\u590d\u7684\u903b\u8f91\uff08\u5bf9\u56fa\u5b9a\u5143\u7d20\u548c\u53cc\u6307\u9488\u7ed3\u679c\u90fd\u662f\u5982\u6b64\uff09\uff0c\u4f60\u4f1a\u8fd4\u56de\u91cd\u590d\u7684\u4e09\u5143\u7ec4\u3002if i > 0 and nums[i] == nums[i-1]: continue \u8fd9\u884c\u81f3\u5173\u91cd\u8981\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u9ad8\u5ea6\u56fe\uff08\u975e\u8d1f\u6574\u6570\u6570\u7ec4\uff09\uff0c\u8ba1\u7b97\u4e0b\u96e8\u540e\u5b83\u80fd\u63a5\u4f4f\u591a\u5c11\u6c34\u3002
\u6a21\u5f0f\u6d1e\u5bdf\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u4f4d\u7f6e\uff0c\u6c34\u4f4d\u7531\u5b83\u5de6\u8fb9\u6700\u5927\u9ad8\u5ea6\u548c\u53f3\u8fb9\u6700\u5927\u9ad8\u5ea6\u4e2d\u7684\u6700\u5c0f\u503c\u51cf\u53bb\u5f53\u524d\u9ad8\u5ea6\u51b3\u5b9a\u3002\u4ece\u4e24\u7aef\u5f00\u59cb\u7684\u53cc\u6307\u9488\u8ddf\u8e2a\u8fd9\u4e9b\u8fd0\u884c\u4e2d\u7684\u6700\u5927\u503c\u3002
def trap(height):\n left, right = 0, len(height) - 1\n left_max, right_max = 0, 0\n water = 0\n\n while left < right:\n if height[left] < height[right]:\n if height[left] >= left_max:\n left_max = height[left]\n else:\n water += left_max - height[left]\n left += 1\n else:\n if height[right] >= right_max:\n right_max = height[right]\n else:\n water += right_max - height[right]\n right -= 1\n\n return water\n \u4e3a\u4ec0\u4e48\u6709\u6548\uff1a\u5173\u952e\u7684\u6d1e\u5bdf\u662f\uff0c\u5982\u679c height[left] < height[right]\uff0c\u90a3\u4e48\u4f4d\u7f6e left \u5904\u7684\u6c34\u7531 left_max \u9650\u5236\uff08\u6211\u4eec\u77e5\u9053\u53f3\u8fb9\u6709\u66f4\u9ad8\u7684\u67f1\u5b50\uff0c\u6240\u4ee5\u53f3\u8fb9\u4e0d\u53ef\u80fd\u662f\u74f6\u9888\uff09\u3002\u6211\u4eec\u5904\u7406\u8f83\u77ed\u7684\u4e00\u4fa7\uff0c\u4fdd\u8bc1\u53e6\u4e00\u4fa7\u6709\u66f4\u9ad8\u7684\u67f1\u5b50\u3002
\u9677\u9631\uff1a\u5f88\u591a\u4eba\u8bd5\u56fe\u5148\u9884\u8ba1\u7b97 left_max[i] \u548c right_max[i] \u6570\u7ec4\uff08\u8fd9\u53ef\u884c\u4f46\u4f7f\u7528 \\(O(n)\\) \u7a7a\u95f4\uff09\u3002\u53cc\u6307\u9488\u65b9\u6cd5\u5b9e\u73b0\u4e86 \\(O(1)\\) \u7a7a\u95f4\u3002\u53e6\u5916\uff0c\u5728\u6700\u5927\u503c\u66f4\u65b0\u4e2d\u6df7\u6dc6 >= \u548c > \u4f1a\u5bfc\u81f4\u5dee\u4e00\u9519\u8bef\u7684\u6c34\u91cf\u8ba1\u7b97\u3002
\u6ed1\u52a8\u7a97\u53e3\u6a21\u5f0f\u7ef4\u62a4\u4e00\u4e2a\u7a97\u53e3\uff08\u8fde\u7eed\u5b50\u6570\u7ec4\uff09\uff0c\u968f\u7740\u8fed\u4ee3\u6269\u5c55\u548c\u6536\u7f29\u3002\u5b83\u9002\u7528\u4e8e\u8be2\u95ee\u6ee1\u8db3\u67d0\u4e2a\u6761\u4ef6\u7684\u5b50\u6570\u7ec4\u6216\u5b50\u4e32\u7684\u95ee\u9898\u3002
\u4f55\u65f6\u4f7f\u7528\uff1a\u95ee\u9898\u8981\u6c42\u6ee1\u8db3\u7ea6\u675f\u6761\u4ef6\u7684\u6700\u957f/\u6700\u77ed\u5b50\u6570\u7ec4\u6216\u5b50\u4e32\uff0c\u4e14\u6269\u5c55/\u6536\u7f29\u7a97\u53e3\u662f\u5355\u8c03\u7684\uff08\u6dfb\u52a0\u5143\u7d20\u53ea\u80fd\u4f7f\u7ea6\u675f\u66f4\u96be/\u66f4\u5bb9\u6613\u6ee1\u8db3\uff0c\u800c\u4e0d\u662f\u4e24\u8005\u517c\u6709\uff09\u3002
\u6a21\u677f\uff1a
def sliding_window(arr):\n left = 0\n state = ... # \u7a97\u53e3\u72b6\u6001\uff08\u8ba1\u6570\u3001\u548c\u7b49\uff09\n best = ...\n\n for right in range(len(arr)):\n # \u6269\u5c55\uff1a\u5c06 arr[right] \u6dfb\u52a0\u5230\u7a97\u53e3\u72b6\u6001\n update_state(state, arr[right])\n\n # \u6536\u7f29\uff1a\u5f53\u7ea6\u675f\u88ab\u8fdd\u53cd\u65f6\u4ece\u5de6\u4fa7\u7f29\u5c0f\n while constraint_violated(state):\n remove_from_state(state, arr[left])\n left += 1\n\n # \u66f4\u65b0\u7b54\u6848\n best = max(best, right - left + 1) # \u6216 min\uff0c\u53d6\u51b3\u4e8e\u95ee\u9898\n\n return best\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/01.%20arrays%20and%20hashing/#_14","title":"\u7b80\u5355\uff1a\u4e70\u5356\u80a1\u7968\u7684\u6700\u4f73\u65f6\u673a","text":"\u95ee\u9898\uff1a\u7ed9\u5b9a\u6bcf\u65e5\u4ef7\u683c\uff0c\u627e\u51fa\u4e00\u7b14\u4ea4\u6613\uff08\u5148\u4e70\u540e\u5356\uff09\u7684\u6700\u5927\u5229\u6da6\u3002
\u6a21\u5f0f\uff1a\u8ddf\u8e2a\u5230\u76ee\u524d\u4e3a\u6b62\u7684\u6700\u5c0f\u4ef7\u683c\uff08\u7a97\u53e3\u7684\u5de6\u8fb9\u754c\uff09\uff0c\u5e76\u5728\u6bcf\u4e00\u5929\u8ba1\u7b97\u5229\u6da6\u3002
def max_profit(prices):\n min_price = float('inf')\n max_profit = 0\n\n for price in prices:\n min_price = min(min_price, price)\n max_profit = max(max_profit, price - min_price)\n\n return max_profit\n \u95ee\u9898\uff1a\u627e\u51fa\u4e0d\u542b\u91cd\u590d\u5b57\u7b26\u7684\u6700\u957f\u5b50\u4e32\u7684\u957f\u5ea6\u3002
\u6a21\u5f0f\uff1a\u901a\u8fc7\u79fb\u52a8 right \u6269\u5c55\u7a97\u53e3\u3002\u5f53\u53d1\u73b0\u91cd\u590d\u65f6\uff0c\u4ece\u5de6\u4fa7\u6536\u7f29\u76f4\u5230\u91cd\u590d\u88ab\u79fb\u9664\u3002
def length_of_longest_substring(s):\n char_index = {} # \u5b57\u7b26 -> \u5b83\u7684\u6700\u8fd1\u7d22\u5f15\n left = 0\n best = 0\n\n for right, char in enumerate(s):\n if char in char_index and char_index[char] >= left:\n left = char_index[char] + 1 # \u8df3\u8fc7\u91cd\u590d\u5b57\u7b26\n\n char_index[char] = right\n best = max(best, right - left + 1)\n\n return best\n \u4e3a\u4ec0\u4e48\u9700\u8981 char_index[char] >= left\uff1a\u8be5\u5b57\u7b26\u53ef\u80fd\u6765\u81ea\u5f53\u524d\u7a97\u53e3\u5f00\u59cb\u4e4b\u524d\u7684\u6620\u5c04\u3002\u6ca1\u6709\u8fd9\u4e2a\u68c0\u67e5\uff0c\u4f60\u4f1a\u9519\u8bef\u5730\u4e3a\u5f53\u524d\u7a97\u53e3\u4e2d\u5b9e\u9645\u4e0d\u5b58\u5728\u7684\u5b57\u7b26\u6536\u7f29\u7a97\u53e3\u3002
\u9677\u9631\uff1a\u4f7f\u7528\u96c6\u5408\u5e76\u4ece\u5de6\u9010\u4e2a\u5220\u9664\u5b57\u7b26\u662f\u6b63\u786e\u7684\u4f46\u8f83\u6162\u3002\u54c8\u5e0c\u8868\u65b9\u6cd5\u76f4\u63a5\u8df3\u5230\u6b63\u786e\u7684\u4f4d\u7f6e\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u5b57\u7b26\u4e32 s \u548c t\uff0c\u5728 s \u4e2d\u627e\u5230\u5305\u542b t \u4e2d\u6240\u6709\u5b57\u7b26\u7684\u6700\u5c0f\u7a97\u53e3\u3002
\u6a21\u5f0f\uff1a\u6269\u5c55\u7a97\u53e3\u4ee5\u5305\u542b\u6240\u6709\u5fc5\u9700\u7684\u5b57\u7b26\uff0c\u7136\u540e\u4ece\u5de6\u4fa7\u6536\u7f29\u4ee5\u627e\u5230\u6700\u5c0f\u6709\u6548\u7a97\u53e3\u3002
from collections import Counter\n\ndef min_window(s, t):\n if not t or not s:\n return \"\"\n\n need = Counter(t) # \u6211\u4eec\u9700\u8981\u7684\u5b57\u7b26\u53ca\u5176\u8ba1\u6570\n have = 0 # \u6211\u4eec\u5df2\u7ecf\u62e5\u6709\u8db3\u591f\u6570\u91cf\u7684\u552f\u4e00\u5b57\u7b26\u6570\n required = len(need) # \u6211\u4eec\u9700\u8981\u591a\u5c11\u79cd\u552f\u4e00\u5b57\u7b26\n\n left = 0\n best = (float('inf'), 0, 0) # (\u957f\u5ea6, \u5de6, \u53f3)\n\n window_counts = {}\n\n for right in range(len(s)):\n char = s[right]\n window_counts[char] = window_counts.get(char, 0) + 1\n\n # \u68c0\u67e5\u6b64\u5b57\u7b26\u7684\u8ba1\u6570\u662f\u5426\u6ee1\u8db3\u8981\u6c42\n if char in need and window_counts[char] == need[char]:\n have += 1\n\n # \u5f53\u7a97\u53e3\u6709\u6548\u65f6\u4ece\u5de6\u4fa7\u6536\u7f29\n while have == required:\n # \u66f4\u65b0\u6700\u4f73\u503c\n if (right - left + 1) < best[0]:\n best = (right - left + 1, left, right)\n\n # \u79fb\u9664\u6700\u5de6\u8fb9\u7684\u5b57\u7b26\n left_char = s[left]\n window_counts[left_char] -= 1\n if left_char in need and window_counts[left_char] < need[left_char]:\n have -= 1\n left += 1\n\n length, start, end = best\n return s[start:end + 1] if length != float('inf') else \"\"\n \u9677\u9631\uff1ahave \u8ba1\u6570\u5668\u662f\u5173\u952e\u4f18\u5316\u3002\u6ca1\u6709\u5b83\uff0c\u4f60\u9700\u8981\u5728\u6bcf\u4e00\u6b65\u6bd4\u8f83\u6574\u4e2a window_counts \u5b57\u5178\u4e0e need\uff0c\u6bcf\u6b21\u6bd4\u8f83\u662f \\(O(|\\text{unique chars}|)\\)\u3002have \u8ba1\u6570\u5668\u4f7f\u6709\u6548\u6027\u68c0\u67e5\u53d8\u4e3a \\(O(1)\\)\u3002
\u9677\u9631\uff1a\u68c0\u67e5 window_counts[char] == need[char]\uff08\u800c\u4e0d\u662f >=\uff09\u786e\u4fdd\u6211\u4eec\u6bcf\u4e2a\u5b57\u7b26\u53ea\u9012\u589e\u4e00\u6b21 have\u3002\u5982\u679c\u4f7f\u7528 >=\uff0c\u6211\u4eec\u4f1a\u591a\u8ba1\u6570\u3002
prefix[i] = sum(arr[0:i])\u3002\u4e00\u65e6\u5728 \\(O(n)\\) \u65f6\u95f4\u5185\u6784\u5efa\u5b8c\u6210\uff0c\u4efb\u4f55\u5b50\u6570\u7ec4\u548c\u90fd\u53ef\u4ee5\u5728 \\(O(1)\\) \u65f6\u95f4\u5185\u8ba1\u7b97\uff1asum(arr[l:r]) = prefix[r] - prefix[l]\u3002def build_prefix(arr):\n prefix = [0] * (len(arr) + 1)\n for i in range(len(arr)):\n prefix[i + 1] = prefix[i] + arr[i]\n return prefix\n\n# arr[l:r] \u7684\u548c\uff08\u5305\u542b l\uff0c\u4e0d\u5305\u542b r\uff09\ndef range_sum(prefix, l, r):\n return prefix[r] - prefix[l]\n \u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u6570\u7ec4\uff0c\u56de\u7b54\u591a\u4e2a\"\u4ece\u7d22\u5f15 \\(l\\) \u5230 \\(r\\) \u7684\u548c\u662f\u591a\u5c11\uff1f\"\u7684\u67e5\u8be2\u3002
\u6ca1\u6709\u524d\u7f00\u548c\uff1a\u6bcf\u4e2a\u67e5\u8be2\u662f \\(O(n)\\)\u3002\u6709\u524d\u7f00\u548c\uff1a\\(O(n)\\) \u9884\u8ba1\u7b97\uff0c\u7136\u540e\u6bcf\u4e2a\u67e5\u8be2 \\(O(1)\\)\u3002
\u95ee\u9898\uff1a\u7edf\u8ba1\u6709\u591a\u5c11\u4e2a\u8fde\u7eed\u5b50\u6570\u7ec4\u7684\u548c\u7b49\u4e8e \\(k\\)\u3002
\u6a21\u5f0f\u6d1e\u5bdf\uff1a\u4ece\u7d22\u5f15 \\(l\\) \u5230 \\(r\\) \u7684\u5b50\u6570\u7ec4\u548c\u7b49\u4e8e prefix[r+1] - prefix[l]\u3002\u6211\u4eec\u5e0c\u671b\u8fd9\u4e2a\u503c\u7b49\u4e8e \\(k\\)\uff0c\u6240\u4ee5 prefix[l] = prefix[r+1] - k\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u4f4d\u7f6e\uff0c\u4f7f\u7528\u54c8\u5e0c\u8868\u7edf\u8ba1\u591a\u5c11\u4e2a\u66f4\u65e9\u7684\u524d\u7f00\u548c\u7b49\u4e8e current_prefix - k\u3002
def subarray_sum(nums, k):\n count = 0\n prefix = 0\n prefix_counts = {0: 1} # \u7a7a\u524d\u7f00\u548c\n\n for num in nums:\n prefix += num\n # \u6709\u591a\u5c11\u66f4\u65e9\u7684\u524d\u7f00\u548c\u7b49\u4e8e prefix - k\uff1f\n count += prefix_counts.get(prefix - k, 0)\n prefix_counts[prefix] = prefix_counts.get(prefix, 0) + 1\n\n return count\n \u8fd9\u7ed3\u5408\u4e86\u524d\u7f00\u548c\u4e0e\u54c8\u5e0c\u8868\u67e5\u627e\uff1a\\(O(n)\\) \u65f6\u95f4\uff0c\\(O(n)\\) \u7a7a\u95f4\u3002
\u9677\u9631\uff1a\u5fd8\u8bb0\u521d\u59cb\u5316 prefix_counts = {0: 1}\u3002\u7a7a\u524d\u7f00\uff08\u5728\u4efb\u4f55\u5143\u7d20\u4e4b\u524d\uff09\u7684\u548c\u4e3a 0\u3002\u6ca1\u6709\u5b83\uff0c\u4f60\u4f1a\u6f0f\u6389\u4ece\u7d22\u5f15 0 \u5f00\u59cb\u7684\u5b50\u6570\u7ec4\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u6570\u7ec4\uff0c\u8fd4\u56de\u4e00\u4e2a\u6570\u7ec4\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5143\u7d20\u662f\u6240\u6709\u5176\u4ed6\u5143\u7d20\u7684\u4e58\u79ef\u3002\u4f60\u4e0d\u80fd\u4f7f\u7528\u9664\u6cd5\u3002
\u6a21\u5f0f\uff1a\u4ece\u5de6\u4fa7\u6784\u5efa\u524d\u7f00\u4e58\u79ef\uff0c\u4ece\u53f3\u4fa7\u6784\u5efa\u540e\u7f00\u4e58\u79ef\u3002\u6bcf\u4e2a\u4f4d\u7f6e\u7684\u7b54\u6848\u662f left_product * right_product\u3002
def product_except_self(nums):\n n = len(nums)\n result = [1] * n\n\n # \u5de6\u5411\u904d\u5386\uff1aresult[i] = nums[0..i-1] \u7684\u4e58\u79ef\n prefix = 1\n for i in range(n):\n result[i] = prefix\n prefix *= nums[i]\n\n # \u53f3\u5411\u904d\u5386\uff1a\u4e58\u4ee5 nums[i+1..n-1] \u7684\u4e58\u79ef\n suffix = 1\n for i in range(n - 1, -1, -1):\n result[i] *= suffix\n suffix *= nums[i]\n\n return result\n \\(O(n)\\) \u65f6\u95f4\uff0c\\(O(1)\\) \u989d\u5916\u7a7a\u95f4\uff08\u8f93\u51fa\u6570\u7ec4\u4e0d\u8ba1\u5165\uff09\u3002\u5b83\u4f7f\u7528\u8f93\u51fa\u6570\u7ec4\u672c\u8eab\u6765\u5b58\u50a8\u4e2d\u95f4\u524d\u7f00\u4e58\u79ef\uff0c\u7136\u540e\u5728\u7b2c\u4e8c\u904d\u904d\u5386\u4e2d\u4e58\u5165\u540e\u7f00\u4e58\u79ef\u3002
\u9677\u9631\uff1a\u5982\u679c\u6570\u7ec4\u5305\u542b\u96f6\uff0c\u57fa\u4e8e\u9664\u6cd5\u7684\u65b9\u6cd5\u4f1a\u5931\u8d25\u3002\u8fd9\u79cd\u524d\u7f00/\u540e\u7f00\u65b9\u6cd5\u6b63\u786e\u5904\u7406\u96f6\uff0c\u56e0\u4e3a\u5b83\u4ece\u4e0d\u505a\u9664\u6cd5\u3002
right - left vs right - left + 1 \u753b\u4e00\u4e2a2\u5143\u7d20\u793a\u4f8b Python \u4e2d\u7684\u53ef\u53d8\u9ed8\u8ba4\u503c def f(seen={}) \u5728\u8c03\u7528\u95f4\u5171\u4eab\u72b6\u6001 \u4f7f\u7528 def f(seen=None) \u5faa\u73af\u4e2d\u7684\u5b57\u7b26\u4e32\u62fc\u63a5 s += c \u5728 Python \u4e2d\u662f \\(O(n^2)\\) \u4f7f\u7528 list.append + \"\".join \u524d\u7f00\u548c\u4e2d\u5fd8\u8bb0 {0: 1} \u6f0f\u6389\u4ece\u7d22\u5f15 0 \u5f00\u59cb\u7684\u5b50\u6570\u7ec4 \u59cb\u7ec8\u7528\u7a7a\u524d\u7f00\u521d\u59cb\u5316 \u68c0\u67e5\u524d\u6dfb\u52a0\u54c8\u5e0c\u8868 \u4e24\u6570\u4e4b\u548c\uff1a\u5728\u68c0\u67e5\u8865\u6570\u4e4b\u524d\u6dfb\u52a0\u4e86 num \u5148\u68c0\u67e5\uff0c\u540e\u63d2\u5165 \u672a\u5904\u7406\u91cd\u590d\u9879 \u4e09\u6570\u4e4b\u548c\u8fd4\u56de\u91cd\u590d\u7684\u4e09\u5143\u7ec4 \u8df3\u8fc7\u8fde\u7eed\u76f8\u7b49\u7684\u503c \u6574\u6570\u6ea2\u51fa C++/Java \u4e2d\u5927\u6570\u7ec4\u6c42\u548c \u4f7f\u7528 long \u6216\u68c0\u67e5\u8fb9\u754c"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/01.%20arrays%20and%20hashing/#neetcode","title":"\u8bfe\u540e\u7ec3\u4e60\u9898\uff08NeetCode\uff09","text":"\u6309\u987a\u5e8f\u7ec3\u4e60\u3002\u6bcf\u9053\u9898\u5f3a\u5316\u672c\u6587\u4ef6\u4e2d\u7684\u4e00\u4e2a\u6a21\u5f0f\u3002
"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/01.%20arrays%20and%20hashing/#_21","title":"\u54c8\u5e0c\u8868\u67e5\u627e","text":"\u94fe\u8868\u3001\u6808\u548c\u961f\u5217\u662f\u66f4\u590d\u6742\u6570\u636e\u7ed3\u6784\u7684\u6784\u5efa\u6a21\u5757\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u5b83\u4eec\u7684\u8fd0\u884c\u673a\u5236\uff0c\u7136\u540e\u6784\u5efa\u5173\u952e\u6a21\u5f0f\uff1a\u5feb\u6162\u6307\u9488\u3001\u5355\u8c03\u6808\u548c\u57fa\u4e8e\u5806\u7684\u4f18\u5148\u961f\u5217\uff0c\u901a\u8fc7\u9010\u6b65\u589e\u52a0\u96be\u5ea6\u7684\u9898\u76ee\uff0c\u5e76\u5728\u6bcf\u4e00\u6b65\u6307\u51fa\u5e38\u89c1\u9677\u9631\u3002
null\u3002class ListNode:\n def __init__(self, val=0, next=None):\n self.val = val\n self.next = next\n \u76f8\u5bf9\u4e8e\u6570\u7ec4\u7684\u4f18\u52bf\uff1a\u5728\u5df2\u77e5\u4f4d\u7f6e\u63d2\u5165\u6216\u5220\u9664\u662f \\(O(1)\\)\uff08\u53ea\u9700\u91cd\u65b0\u6307\u5411\u6307\u9488\uff09\u3002\u65e0\u9700\u79fb\u52a8\u5143\u7d20\u3002
\u52a3\u52bf\uff1a\u8bbf\u95ee\u5143\u7d20 \\(i\\) \u9700\u8981 \\(O(i)\\) \u6b21\u904d\u5386\uff08\u65e0\u968f\u673a\u8bbf\u95ee\uff09\u3002\u7f13\u5b58\u5c40\u90e8\u6027\u5dee\uff08\u8282\u70b9\u5206\u6563\u5728\u5185\u5b58\u4e2d\uff09\u3002
\u53cc\u5411\u94fe\u8868\u589e\u52a0\u4e86\u4e00\u4e2a prev \u6307\u9488\uff0c\u652f\u6301\u5411\u540e\u904d\u5386\u3002\u7528\u4e8e LRU \u7f13\u5b58\uff08\u5e38\u6570\u65f6\u95f4\u5220\u9664\u4efb\u4f55\u8282\u70b9\uff09\u548c\u6d4f\u89c8\u5668\u5386\u53f2\uff08\u524d\u8fdb/\u540e\u9000\uff09\u3002
\u6709\u5c3e\u6307\u9488\u65f6\u3002*\u9700\u8981\u524d\u9a71\u8282\u70b9\uff0c\u9700\u8981\u904d\u5386\u3002
# \u65e0\u865a\u62df\u8282\u70b9\uff1a\u5934\u90e8\u5220\u9664\u9700\u8981\u7279\u6b8a\u5904\u7406\ndef delete_head(head):\n if not head:\n return None\n return head.next\n\n# \u6709\u865a\u62df\u8282\u70b9\uff1a\u7edf\u4e00\u903b\u8f91\ndummy = ListNode(0)\ndummy.next = head\n# \u73b0\u5728\u6bcf\u6b21\u5220\u9664\u90fd\u662f\uff1aprev.next = prev.next.next\n head is None\uff09\u6216\u5355\u5143\u7d20\u5217\u8868\u3002\u59cb\u7ec8\u6d4b\u8bd5\u8fd9\u4e9b\u8fb9\u754c\u60c5\u51b5\u3002\u95ee\u9898\uff1a\u5224\u65ad\u4e00\u4e2a\u94fe\u8868\u662f\u5426\u6709\u73af\u3002
\u6a21\u5f0f\uff1a\u5982\u679c\u6709\u73af\uff0c\u5feb\u6307\u9488\u6700\u7ec8\u4f1a\u8ffd\u4e0a\u6162\u6307\u9488\uff08\u5b83\u4eec\u4f1a\u76f8\u9047\uff09\u3002\u5982\u679c\u6ca1\u6709\u73af\uff0c\u5feb\u6307\u9488\u4f1a\u5230\u8fbe null\u3002
def has_cycle(head):\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n if slow == fast:\n return True\n return False\n \u4e3a\u4ec0\u4e48\u6709\u6548\uff1a\u5982\u679c\u73af\u7684\u957f\u5ea6\u4e3a \\(c\\)\uff0c\u5feb\u6307\u9488\u6bcf\u6b65\u7f29\u5c0f1\u4e2a\u8282\u70b9\u7684\u5dee\u8ddd\u3002\u5b83\u4eec\u5fc5\u5728\u6162\u6307\u9488\u8fdb\u5165\u73af\u540e\u7684 \\(c\\) \u6b65\u5185\u76f8\u9047\u3002
\u9677\u9631\uff1a\u68c0\u67e5 fast and fast.next\uff08\u800c\u4e0d\u4ec5\u4ec5\u662f fast.next\uff09\u3002\u5982\u679c fast \u662f None\uff0c\u8c03\u7528 fast.next \u4f1a\u5d29\u6e83\u3002
\u95ee\u9898\uff1a\u8fd4\u56de\u4e2d\u95f4\u8282\u70b9\u3002
\u6a21\u5f0f\uff1a\u5f53\u5feb\u6307\u9488\u5230\u8fbe\u672b\u5c3e\u65f6\uff0c\u6162\u6307\u9488\u5728\u4e2d\u95f4\u3002
def find_middle(head):\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n return slow # slow \u5728\u4e2d\u95f4\uff08\u5076\u6570\u957f\u5ea6\u65f6\u4e3a\u7b2c\u4e8c\u4e2a\u4e2d\u95f4\u8282\u70b9\uff09\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/02.%20linked%20lists%2C%20stacks%2C%20and%20queues/#ii","title":"\u4e2d\u7b49\uff1a\u73af\u5f62\u94fe\u8868 II\uff08\u5bfb\u627e\u73af\u7684\u8d77\u70b9\uff09","text":"\u95ee\u9898\uff1a\u8fd4\u56de\u73af\u5f00\u59cb\u7684\u8282\u70b9\u3002
\u6a21\u5f0f\uff1a\u5728\u5feb\u6307\u9488\u548c\u6162\u6307\u9488\u76f8\u9047\u540e\uff0c\u5c06\u4e00\u4e2a\u6307\u9488\u91cd\u7f6e\u5230\u5934\u90e8\u3002\u4e24\u8005\u4ee5\u901f\u5ea61\u79fb\u52a8\u3002\u5b83\u4eec\u5728\u73af\u7684\u8d77\u70b9\u76f8\u9047\u3002
def detect_cycle(head):\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n if slow == fast:\n # \u5c06\u4e00\u4e2a\u6307\u9488\u91cd\u7f6e\u5230\u5934\u90e8\n slow = head\n while slow != fast:\n slow = slow.next\n fast = fast.next\n return slow\n return None\n def reverse_k_group(head, k):\n # \u68c0\u67e5\u662f\u5426\u8fd8\u6709 k \u4e2a\u8282\u70b9\n node = head\n for _ in range(k):\n if not node:\n return head\n node = node.next\n\n # \u53cd\u8f6c k \u4e2a\u8282\u70b9\n prev, curr = None, head\n for _ in range(k):\n nxt = curr.next\n curr.next = prev\n prev = curr\n curr = nxt\n\n # \u5f53\u524d head \u73b0\u5728\u662f\u53cd\u8f6c\u540e\u7684\u7ec4\u7684\u5c3e\u8282\u70b9\n # \u9012\u5f52\u5904\u7406\u5269\u4f59\u90e8\u5206\n head.next = reverse_k_group(curr, k)\n return prev # prev \u662f\u8fd9\u7ec4\u7684\u65b0\u5934\u8282\u70b9\n prev, curr, nxt\uff09\u503c\u5f97\u8bb0\u4f4f\u3002\u753b\u51fa\u6765\uff1a\u6bcf\u4e00\u6b65\uff0c\u4f60\u5c06 curr.next \u6307\u56de prev\uff0c\u7136\u540e\u63a8\u8fdb\u6240\u6709\u4e09\u4e2a\u6307\u9488\u3002\u987a\u5e8f\u641e\u9519\u4f1a\u7834\u574f\u94fe\u8868\u3002\u6808\u662f LIFO\uff08\u540e\u8fdb\u5148\u51fa\uff09\uff1a\u6700\u8fd1\u6dfb\u52a0\u7684\u5143\u7d20\u6700\u5148\u88ab\u79fb\u9664\u3002\u60f3\u8c61\u4e00\u5806\u76d8\u5b50\u3002
\u64cd\u4f5c\uff1apush(x) \u6dfb\u52a0\u5230\u9876\u90e8\uff0cpop() \u4ece\u9876\u90e8\u79fb\u9664\uff0cpeek() \u67e5\u770b\u9876\u90e8\u4e0d\u79fb\u9664\u3002\u5168\u90e8 \\(O(1)\\)\u3002
\u6808\u662f\u9012\u5f52\uff08\u8c03\u7528\u6808\uff09\u3001\u8868\u8fbe\u5f0f\u6c42\u503c\uff08\u4e2d\u7f00\u8f6c\u540e\u7f00\uff09\u548c\u64a4\u9500\u64cd\u4f5c\uff08\u6bcf\u4e2a\u64cd\u4f5c\u88ab\u5165\u6808\uff0c\u64a4\u9500\u65f6\u5f39\u51fa\u6700\u540e\u4e00\u4e2a\uff09\u80cc\u540e\u7684\u9690\u5f0f\u7ed3\u6784\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u7531\u62ec\u53f7 ()[]{} \u7ec4\u6210\u7684\u5b57\u7b26\u4e32\uff0c\u5224\u65ad\u5b83\u4eec\u662f\u5426\u5e73\u8861\u3002
\u6a21\u5f0f\uff1a\u5c06\u5de6\u62ec\u53f7\u5165\u6808\u3002\u5f53\u770b\u5230\u53f3\u62ec\u53f7\u65f6\uff0c\u68c0\u67e5\u6808\u9876\u662f\u5426\u5339\u914d\u3002
def is_valid(s):\n stack = []\n matching = {')': '(', ']': '[', '}': '{'}\n\n for char in s:\n if char in matching:\n if not stack or stack[-1] != matching[char]:\n return False\n stack.pop()\n else:\n stack.append(char)\n\n return len(stack) == 0\n len(stack) == 0\u3002\u5b57\u7b26\u4e32 \"(((\" \u4e2d\u6ca1\u6709\u4e0d\u5339\u914d\u7684\u60c5\u51b5\uff0c\u4f46\u56e0\u4e3a\u6ca1\u6709\u95ed\u5408\u7684\u62ec\u53f7\uff0c\u5b83\u662f\u65e0\u6548\u7684\u3002\u5355\u8c03\u6808\u7ef4\u62a4\u6309\u6392\u5e8f\u987a\u5e8f\u6392\u5217\u7684\u5143\u7d20\uff08\u9012\u589e\u6216\u9012\u51cf\uff09\u3002\u5f53\u65b0\u5143\u7d20\u4f1a\u7834\u574f\u987a\u5e8f\u65f6\uff0c\u4f60\u5f39\u51fa\u5143\u7d20\u76f4\u5230\u987a\u5e8f\u6062\u590d\u3002
\u4f55\u65f6\u4f7f\u7528\uff1a\u95ee\u9898\u8981\u6c42\"\u5bf9\u6bcf\u4e2a\u5143\u7d20\uff0c\u627e\u5230\u4e0b\u4e00\u4e2a/\u4e0a\u4e00\u4e2a\u66f4\u5927/\u66f4\u5c0f\u7684\u5143\u7d20\u3002\"\u6808\u7684\u603b\u65f6\u95f4\u590d\u6742\u5ea6\u4e3a \\(O(n)\\)\uff0c\u56e0\u4e3a\u6bcf\u4e2a\u5143\u7d20\u6700\u591a\u88ab\u5165\u6808\u548c\u51fa\u6808\u4e00\u6b21\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u6bcf\u65e5\u6e29\u5ea6\uff0c\u5bf9\u4e8e\u6bcf\u4e00\u5929\uff0c\u627e\u5230\u9700\u8981\u7b49\u591a\u5c11\u5929\u624d\u4f1a\u5347\u6e29\u3002
\u6a21\u5f0f\uff1a\u4f7f\u7528\u4e00\u4e2a\u7d22\u5f15\u6808\u3002\u5f53\u5f53\u524d\u6e29\u5ea6\u9ad8\u4e8e\u6808\u9876\u65f6\uff0c\u5f39\u51fa\u5e76\u8bb0\u5f55\u8ddd\u79bb\u3002
def daily_temperatures(temperatures):\n n = len(temperatures)\n result = [0] * n\n stack = [] # \u7d22\u5f15\u6808\uff0c\u6e29\u5ea6\u9012\u51cf\n\n for i in range(n):\n while stack and temperatures[i] > temperatures[stack[-1]]:\n prev = stack.pop()\n result[prev] = i - prev\n stack.append(i)\n\n return result\n \u6bcf\u4e2a\u5143\u7d20\u88ab\u5165\u6808\u4e00\u6b21\uff0c\u6700\u591a\u51fa\u6808\u4e00\u6b21\uff1a\u603b\u8ba1 \\(O(n)\\)\u3002
\u9677\u9631\uff1a\u5728\u6808\u4e2d\u5b58\u50a8\u7d22\u5f15\uff08\u800c\u975e\u503c\uff09\u3002\u4f60\u9700\u8981\u7d22\u5f15\u6765\u8ba1\u7b97\u8ddd\u79bb\u3002
\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u6761\u5f62\u9ad8\u5ea6\u6570\u7ec4\uff0c\u627e\u51fa\u6700\u5927\u77e9\u5f62\u7684\u9762\u79ef\u3002
\u6a21\u5f0f\uff1a\u5bf9\u4e8e\u6bcf\u4e2a\u6761\u5f62\uff0c\u627e\u51fa\u5b83\u53ef\u4ee5\u5411\u5de6\u53f3\u5ef6\u4f38\u591a\u8fdc\uff08\u5373\uff0c\u6bcf\u4fa7\u6700\u8fd1\u7684\u66f4\u77ed\u6761\u5f62\uff09\u3002\u5355\u8c03\u9012\u589e\u6808\u9ad8\u6548\u5730\u8ffd\u8e2a\u8fd9\u4e2a\u4fe1\u606f\u3002
def largest_rectangle(heights):\n stack = [] # \u7d22\u5f15\u6808\uff0c\u9ad8\u5ea6\u9012\u589e\n max_area = 0\n heights.append(0) # \u54e8\u5175\uff0c\u7528\u4e8e\u6700\u540e\u6e05\u7a7a\u6808\n\n for i, h in enumerate(heights):\n start = i\n while stack and stack[-1][1] > h:\n idx, height = stack.pop()\n max_area = max(max_area, height * (i - idx))\n start = idx # \u5f53\u524d\u6761\u5f62\u53ef\u4ee5\u5ef6\u4f38\u5230\u88ab\u5f39\u51fa\u6761\u5f62\u5f00\u59cb\u7684\u4f4d\u7f6e\n stack.append((start, h))\n\n heights.pop() # \u79fb\u9664\u54e8\u5175\n return max_area\n \u9677\u9631\uff1astart = idx \u8fd9\u884c\u5f88\u5fae\u5999\u3002\u5f53\u6211\u4eec\u5f39\u51fa\u4e00\u4e2a\u6bd4\u5f53\u524d\u6761\u5f62\u66f4\u9ad8\u7684\u6761\u5f62\u65f6\uff0c\u5f53\u524d\u6761\u5f62\u53ef\u4ee5\u5411\u540e\u5ef6\u4f38\u81f3\u88ab\u5f39\u51fa\u6761\u5f62\u5f00\u59cb\u7684\u4f4d\u7f6e\uff08\u56e0\u4e3a\u4e2d\u95f4\u7684\u6240\u6709\u6761\u5f62\u81f3\u5c11\u548c\u88ab\u5f39\u51fa\u6761\u5f62\u4e00\u6837\u9ad8\uff09\u3002\u7f3a\u5c11\u8fd9\u884c\u4f1a\u5f97\u5230\u9519\u8bef\u7684\u9762\u79ef\u3002
\u9677\u9631\uff1a\u54e8\u5175 heights.append(0) \u786e\u4fdd\u6808\u4e2d\u6240\u6709\u5269\u4f59\u7684\u6761\u5f62\u88ab\u5904\u7406\u3002\u6ca1\u6709\u5b83\uff0c\u90a3\u4e9b\u53f3\u4fa7\u4ece\u672a\u9047\u5230\u66f4\u77ed\u6761\u5f62\u7684\u6761\u5f62\u4f1a\u88ab\u9057\u6f0f\u3002
\u961f\u5217\u662f FIFO\uff08\u5148\u8fdb\u5148\u51fa\uff09\uff1a\u5143\u7d20\u4ece\u540e\u9762\u6dfb\u52a0\uff0c\u4ece\u524d\u9762\u79fb\u9664\u3002\u60f3\u8c61\u5546\u5e97\u91cc\u6392\u961f\u3002
\u53cc\u7aef\u961f\u5217\uff08deque\uff09\u652f\u6301\u5728\u4e24\u7aef \\(O(1)\\) \u63d2\u5165\u548c\u5220\u9664\u3002Python \u7684 collections.deque \u662f\u6807\u51c6\u5b9e\u73b0\u3002
\u961f\u5217\u662f BFS\uff08\u5e7f\u5ea6\u4f18\u5148\u641c\u7d22\uff0c\u7b2c14\u7ae0\u6587\u4ef604\uff09\u3001\u4efb\u52a1\u8c03\u5ea6\u548c\u6d88\u606f\u4f20\u9012\u80cc\u540e\u7684\u7ed3\u6784\u3002
\u95ee\u9898\uff1a\u4ec5\u4f7f\u7528\u4e24\u4e2a\u6808\u5b9e\u73b0\u4e00\u4e2a\u961f\u5217\u3002
\u6a21\u5f0f\uff1a\u4f7f\u7528\u4e00\u4e2a\u6808\u8fdb\u884c\u5165\u961f\u64cd\u4f5c\uff0c\u4e00\u4e2a\u6808\u8fdb\u884c\u51fa\u961f\u64cd\u4f5c\u3002\u5f53\u51fa\u961f\u6808\u4e3a\u7a7a\u65f6\uff0c\u5c06\u6240\u6709\u5143\u7d20\u4ece\u5165\u961f\u6808\u8f6c\u79fb\u5230\u51fa\u961f\u6808\uff08\u53cd\u8f6c\u987a\u5e8f\uff09\u3002
class MyQueue:\n def __init__(self):\n self.push_stack = []\n self.pop_stack = []\n\n def push(self, x):\n self.push_stack.append(x)\n\n def pop(self):\n if not self.pop_stack:\n while self.push_stack:\n self.pop_stack.append(self.push_stack.pop())\n return self.pop_stack.pop()\n\n def peek(self):\n if not self.pop_stack:\n while self.push_stack:\n self.pop_stack.append(self.push_stack.pop())\n return self.pop_stack[-1]\n\n def empty(self):\n return not self.push_stack and not self.pop_stack\n \u4f18\u5148\u961f\u5217\u603b\u662f\u8fd4\u56de\u6700\u5c0f\uff08\u6216\u6700\u5927\uff09\u7684\u5143\u7d20\uff0c\u4e0d\u8bba\u63d2\u5165\u987a\u5e8f\u3002\u6807\u51c6\u5b9e\u73b0\u662f\u4e8c\u53c9\u5806\u3002
\u6700\u5c0f\u5806\u662f\u4e00\u68f5\u5b8c\u5168\u4e8c\u53c9\u6811\uff0c\u5176\u4e2d\u6bcf\u4e2a\u7236\u8282\u70b9\u90fd\u5c0f\u4e8e\u5176\u5b50\u8282\u70b9\u3002\u6700\u5c0f\u503c\u603b\u662f\u5728\u6839\u8282\u70b9\u3002\u4ee5\u6570\u7ec4\u5f62\u5f0f\u5b58\u50a8\uff1a\u8282\u70b9 \\(i\\) \u7684\u5b50\u8282\u70b9\u5728\u4f4d\u7f6e \\(2i + 1\\) \u548c \\(2i + 2\\)\u3002
heapq \u6a21\u5757\u63d0\u4f9b\u4e86\u6700\u5c0f\u5806\u3002\u5bf9\u4e8e\u6700\u5927\u5806\uff0c\u5c06\u503c\u53d6\u53cd\u3002import heapq\n\n# \u6700\u5c0f\u5806\nh = []\nheapq.heappush(h, 5)\nheapq.heappush(h, 2)\nheapq.heappush(h, 8)\nprint(heapq.heappop(h)) # 2\uff08\u6700\u5c0f\uff09\n\n# \u6700\u5927\u5806\u6280\u5de7\uff1a\u53d6\u53cd\nheapq.heappush(h, -10)\nprint(-heapq.heappop(h)) # 10\uff08\u6700\u5927\uff09\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/02.%20linked%20lists%2C%20stacks%2C%20and%20queues/#k_1","title":"\u4e2d\u7b49\uff1a\u6570\u7ec4\u4e2d\u7684\u7b2c K \u4e2a\u6700\u5927\u5143\u7d20","text":"\u95ee\u9898\uff1a\u627e\u5230\u7b2c k \u4e2a\u6700\u5927\u7684\u5143\u7d20\u3002
\u6a21\u5f0f\uff1a\u7ef4\u62a4\u4e00\u4e2a\u5927\u5c0f\u4e3a \\(k\\) \u7684\u6700\u5c0f\u5806\u3002\u5806\u7684\u6839\u8282\u70b9\u5c31\u662f\u7b2c k \u5927\u7684\u5143\u7d20\u3002\u5982\u679c\u5806\u6709 \\(k\\) \u4e2a\u5143\u7d20\u4e14\u65b0\u5143\u7d20\u5927\u4e8e\u6839\u8282\u70b9\uff0c\u5219\u66ff\u6362\u6839\u8282\u70b9\u3002
import heapq\n\ndef find_kth_largest(nums, k):\n heap = nums[:k]\n heapq.heapify(heap) # O(k)\n\n for num in nums[k:]:\n if num > heap[0]:\n heapq.heapreplace(heap, num) # \u5f39\u51fa\u6700\u5c0f\u503c\uff0c\u63a8\u5165 num\uff1aO(log k)\n\n return heap[0]\n \\(O(n \\log k)\\) \u65f6\u95f4\uff0c\\(O(k)\\) \u7a7a\u95f4\u3002\u5f53 \\(k \\ll n\\) \u65f6\uff0c\u8fd9\u6bd4\u6392\u5e8f\uff08\\(O(n \\log n)\\)\uff09\u597d\u5f97\u591a\u3002
\u9677\u9631\uff1a\u4f7f\u7528\u5927\u5c0f\u4e3a \\(n\\) \u7684\u6700\u5927\u5806\u5e76\u5f39\u51fa \\(k\\) \u6b21\u4e5f\u53ef\u884c\u4f46\u8f83\u6162\uff1a\\(O(n + k \\log n)\\)\u3002\u5927\u5c0f\u4e3a \\(k\\) \u7684\u6700\u5c0f\u5806\u662f\u6700\u4f18\u65b9\u6cd5\u3002
\u95ee\u9898\uff1a\u5408\u5e76 \\(k\\) \u4e2a\u5df2\u6392\u5e8f\u94fe\u8868\u4e3a\u4e00\u4e2a\u6392\u5e8f\u94fe\u8868\u3002
\u6a21\u5f0f\uff1a\u4f7f\u7528\u4e00\u4e2a\u5305\u542b\u6bcf\u4e2a\u94fe\u8868\u5934\u8282\u70b9\u7684\u6700\u5c0f\u5806\u3002\u5f39\u51fa\u6700\u5c0f\u7684\u8282\u70b9\uff0c\u5c06\u5176\u6dfb\u52a0\u5230\u7ed3\u679c\u4e2d\uff0c\u5e76\u5c06\u5176\u4e0b\u4e00\u4e2a\u8282\u70b9\u63a8\u5165\u5806\u4e2d\u3002
import heapq\n\ndef merge_k_lists(lists):\n heap = []\n for i, lst in enumerate(lists):\n if lst:\n heapq.heappush(heap, (lst.val, i, lst))\n\n dummy = ListNode(0)\n curr = dummy\n\n while heap:\n val, i, node = heapq.heappop(heap)\n curr.next = node\n curr = curr.next\n if node.next:\n heapq.heappush(heap, (node.next.val, i, node.next))\n\n return dummy.next\n \\(O(n \\log k)\\)\uff0c\u5176\u4e2d \\(n\\) \u662f\u603b\u8282\u70b9\u6570\u3002\u5806\u4e2d\u6700\u591a\u6709 \\(k\\) \u4e2a\u5143\u7d20\u3002
\u9677\u9631\uff1a\u5806\u5143\u7ec4\u4e2d\u7684 i\uff08\u7d22\u5f15\uff09\u662f\u7528\u4e8e\u6253\u7834\u5e73\u5c40\u7684\u3002\u6ca1\u6709\u5b83\uff0c\u5f53\u503c\u76f8\u7b49\u65f6 Python \u4f1a\u5c1d\u8bd5\u6bd4\u8f83 ListNode \u5bf9\u8c61\uff0c\u8fd9\u4f1a\u5d29\u6e83\u56e0\u4e3a ListNode \u4e0d\u652f\u6301 <\u3002\u7d22\u786e\u4fdd\u4e86\u4e00\u6709\u6548\u7684\u6bd4\u8f83\u3002
fast.next \u4e0a\u7684\u7a7a\u6307\u9488 \u5faa\u73af\u68c0\u6d4b\u4e2d\u4f7f\u7528 while fast.next \u68c0\u67e5 fast and fast.next \u672a\u5904\u7406\u7a7a\u94fe\u8868 \u53cd\u8f6c None \u6dfb\u52a0 if not head \u5b88\u536b \u6808\u4e0b\u6ea2 \u4ece\u7a7a\u6808\u5f39\u51fa \u68c0\u67e5 len(stack) > 0 \u6216 if stack \u5fd8\u8bb0\u54e8\u5175 \u76f4\u65b9\u56fe\u9057\u6f0f\u4e86\u6700\u540e\u7684\u6761\u5f62 \u8ffd\u52a0 0 \u6765\u6e05\u7a7a\u6808 \u5806\u4e2d\u7f3a\u5c11\u5e73\u5c40\u6253\u7834 \u6bd4\u8f83\u4e0d\u53ef\u6bd4\u8f83\u7684\u5bf9\u8c61 \u5411\u5806\u5143\u7ec4\u6dfb\u52a0\u7d22\u5f15 \u904d\u5386\u65f6\u4fee\u6539\u94fe\u8868 \u904d\u5386\u65f6\u5220\u9664\u8282\u70b9 \u4f7f\u7528 prev/curr \u6a21\u5f0f\u6216\u865a\u62df\u5934\u8282\u70b9"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/02.%20linked%20lists%2C%20stacks%2C%20and%20queues/#neetcode","title":"\u8bfe\u540e\u7ec3\u4e60\u9898\uff08NeetCode\uff09","text":""},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/02.%20linked%20lists%2C%20stacks%2C%20and%20queues/#_15","title":"\u94fe\u8868","text":"\u6811\u662f\u5c42\u6b21\u5316\u6570\u636e\u7ed3\u6784\uff0c\u662f\u6587\u4ef6\u7cfb\u7edf\u3001\u6570\u636e\u5e93\u3001\u7f16\u8bd1\u5668\u548c\u65e0\u6570\u9762\u8bd5\u9898\u80cc\u540e\u7684\u57fa\u7840\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u4e8c\u53c9\u6811\u3001\u4e8c\u53c9\u641c\u7d22\u6811\u3001\u5e73\u8861\u6811\u3001\u524d\u7f00\u6811\u3001\u7ebf\u6bb5\u6811\u3001\u6811\u72b6\u6570\u7ec4\u548c\u5e76\u67e5\u96c6\uff0c\u5305\u62ec\u904d\u5386\u6a21\u5f0f\u3001\u9012\u5f52\u601d\u7ef4\u4ee5\u53ca\u9010\u6b65\u589e\u52a0\u96be\u5ea6\u7684\u9898\u76ee\u3002
\u6811\u662f\u4e00\u4e2a\u8fde\u901a\u7684\u65e0\u73af\u56fe\uff08\u7b2c13\u7ae0\uff09\u3002\u6700\u91cd\u8981\u7684\u53d8\u4f53\u662f\u4e8c\u53c9\u6811\uff1a\u6bcf\u4e2a\u8282\u70b9\u6700\u591a\u6709\u4e24\u4e2a\u5b50\u8282\u70b9\uff08\u5de6\u548c\u53f3\uff09\u3002\u6811\u65e0\u5904\u4e0d\u5728\uff1a\u7f16\u8bd1\u5668\u4e2d\u7684\u89e3\u6790\u6811\u3001\u6d4f\u89c8\u5668\u4e2d\u7684 DOM \u6811\u3001\u673a\u5668\u5b66\u4e60\u4e2d\u7684\u51b3\u7b56\u6811\u4ee5\u53ca\u6570\u636e\u5e93\u4e2d\u7684 B \u6811\u3002
\u89e3\u51b3\u6811\u95ee\u9898\u7684\u5173\u952e\u6d1e\u5bdf\uff1a\u5927\u591a\u6570\u6811\u95ee\u9898\u90fd\u53ef\u4ee5\u9012\u5f52\u89e3\u51b3\u3002\u7ed3\u6784\u662f\u9012\u5f52\u7684\uff08\u6811\u662f\u4e00\u4e2a\u6839\u8282\u70b9\u52a0\u4e0a\u4e24\u68f5\u5b50\u6811\uff09\uff0c\u56e0\u6b64\u89e3\u6cd5\u4e5f\u5e94\u662f\u9012\u5f52\u7684\u3002\u638c\u63e1\"\u89e3\u51b3\u5de6\u5b50\u6811\u3001\u89e3\u51b3\u53f3\u5b50\u6811\u3001\u5408\u5e76\u7ed3\u679c\"\u7684\u6a21\u5f0f\uff0c\u4f60\u5c31\u80fd\u89e3\u51b3\u5927\u591a\u6570\u6811\u95ee\u9898\u3002
\u6709\u56db\u79cd\u6807\u51c6\u7684\u8bbf\u95ee\u6bcf\u4e2a\u8282\u70b9\u7684\u65b9\u5f0f\uff1a
class TreeNode:\n def __init__(self, val=0, left=None, right=None):\n self.val = val\n self.left = left\n self.right = right\n\ndef inorder(root):\n if not root:\n return []\n return inorder(root.left) + [root.val] + inorder(root.right)\n\ndef preorder(root):\n if not root:\n return []\n return [root.val] + preorder(root.left) + preorder(root.right)\n\ndef postorder(root):\n if not root:\n return []\n return postorder(root.left) + postorder(root.right) + [root.val]\n\nfrom collections import deque\n\ndef level_order(root):\n if not root:\n return []\n result, queue = [], deque([root])\n while queue:\n level = []\n for _ in range(len(queue)):\n node = queue.popleft()\n level.append(node.val)\n if node.left:\n queue.append(node.left)\n if node.right:\n queue.append(node.right)\n result.append(level)\n return result\n + \u62fc\u63a5\uff09\uff0c\u8fd9\u662f \\(O(n^2)\\)\u3002\u4e3a\u4e86\u6548\u7387\uff0c\u4f20\u9012\u4e00\u4e2a\u7ed3\u679c\u5217\u8868\u5e76\u539f\u5730\u8ffd\u52a0\uff1adef inorder_efficient(root, result=None):\n if result is None:\n result = []\n if root:\n inorder_efficient(root.left, result)\n result.append(root.val)\n inorder_efficient(root.right, result)\n return result\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/#_3","title":"\u7b80\u5355\uff1a\u4e8c\u53c9\u6811\u7684\u6700\u5927\u6df1\u5ea6","text":"def max_depth(root):\n if not root:\n return 0\n return 1 + max(max_depth(root.left), max_depth(root.right))\n def invert_tree(root):\n if not root:\n return None\n root.left, root.right = invert_tree(root.right), invert_tree(root.left)\n return root\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/#_5","title":"\u4e2d\u7b49\uff1a\u4e8c\u53c9\u6811\u7684\u6700\u8fd1\u516c\u5171\u7956\u5148","text":"\u95ee\u9898\uff1a\u627e\u5230\u65e2\u662f \\(p\\) \u53c8\u662f \\(q\\) \u7684\u7956\u5148\u7684\u6700\u4f4e\u8282\u70b9\u3002
\u6a21\u5f0f\uff1a\u5982\u679c \\(p\\) \u548c \\(q\\) \u90fd\u5728\u5de6\u5b50\u6811\u4e2d\uff0c\u5219 LCA \u5728\u5de6\u5b50\u6811\u4e2d\u3002\u5982\u679c\u90fd\u5728\u53f3\u5b50\u6811\u4e2d\uff0c\u5219\u5728\u53f3\u5b50\u6811\u4e2d\u3002\u5982\u679c\u5b83\u4eec\u5206\u5f00\u4e86\uff08\u4e00\u4e2a\u5728\u5de6\uff0c\u4e00\u4e2a\u5728\u53f3\uff09\uff0c\u5219\u5f53\u524d\u8282\u70b9\u5c31\u662f LCA\u3002
def lowest_common_ancestor(root, p, q):\n if not root or root == p or root == q:\n return root\n\n left = lowest_common_ancestor(root.left, p, q)\n right = lowest_common_ancestor(root.right, p, q)\n\n if left and right:\n return root # p \u548c q \u5728\u4e0d\u540c\u5b50\u6811\u4e2d\n return left if left else right\n def max_path_sum(root):\n best = [float('-inf')]\n\n def dfs(node):\n if not node:\n return 0\n left = max(dfs(node.left), 0) # \u5ffd\u7565\u8d1f\u8def\u5f84\n right = max(dfs(node.right), 0)\n\n # \u7ecf\u8fc7\u5f53\u524d\u8282\u70b9\u7684\u8def\u5f84\uff08\u53ef\u80fd\u4f5c\u4e3a\"\u8f6c\u5f2f\u70b9\"\uff09\n best[0] = max(best[0], node.val + left + right)\n\n # \u8fd4\u56de\u5230\u7236\u8282\u70b9\u7684\u6700\u5927\u589e\u76ca\n return node.val + max(left, right)\n\n dfs(root)\n return best[0]\n def search_bst(root, target):\n if not root:\n return None\n if target < root.val:\n return search_bst(root.left, target)\n elif target > root.val:\n return search_bst(root.right, target)\n else:\n return root\n\ndef insert_bst(root, val):\n if not root:\n return TreeNode(val)\n if val < root.val:\n root.left = insert_bst(root.left, val)\n else:\n root.right = insert_bst(root.right, val)\n return root\n def is_valid_bst(root, lo=float('-inf'), hi=float('inf')):\n if not root:\n return True\n if root.val <= lo or root.val >= hi:\n return False\n return (is_valid_bst(root.left, lo, root.val) and\n is_valid_bst(root.right, root.val, hi))\n left.val < root.val < right.val \u662f\u9519\u8bef\u7684\u3002\u7ea6\u675f\u6761\u4ef6\u662f\u5de6\u5b50\u6811\u4e2d\u6240\u6709\u8282\u70b9\u90fd\u66f4\u5c0f\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u76f4\u63a5\u5b50\u8282\u70b9\u3002lo/hi \u8fb9\u754c\u5c06\u8fd9\u4e2a\u7ea6\u675f\u5411\u4e0b\u4f20\u9012\u3002def kth_smallest(root, k):\n count = [0]\n result = [None]\n\n def inorder(node):\n if not node or result[0] is not None:\n return\n inorder(node.left)\n count[0] += 1\n if count[0] == k:\n result[0] = node.val\n return\n inorder(node.right)\n\n inorder(root)\n return result[0]\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/#trie","title":"\u524d\u7f00\u6811\uff08Trie\uff09","text":"class TrieNode:\n def __init__(self):\n self.children = {}\n self.is_end = False\n\nclass Trie:\n def __init__(self):\n self.root = TrieNode()\n\n def insert(self, word):\n node = self.root\n for char in word:\n if char not in node.children:\n node.children[char] = TrieNode()\n node = node.children[char]\n node.is_end = True\n\n def search(self, word):\n node = self.root\n for char in word:\n if char not in node.children:\n return False\n node = node.children[char]\n return node.is_end\n\n def starts_with(self, prefix):\n node = self.root\n for char in prefix:\n if char not in node.children:\n return False\n node = node.children[char]\n return True\n \u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u5b57\u7b26\u677f\u548c\u4e00\u4e2a\u5355\u8bcd\u5217\u8868\uff0c\u627e\u51fa\u6240\u6709\u53ef\u4ee5\u901a\u8fc7\u904d\u5386\u76f8\u90bb\u5355\u5143\u683c\u5f62\u6210\u7684\u5355\u8bcd\u3002
\u6a21\u5f0f\uff1a\u4ece\u5355\u8bcd\u5217\u8868\u6784\u5efa\u4e00\u4e2a\u524d\u7f00\u6811\uff0c\u7136\u540e\u4ece\u6bcf\u4e2a\u5355\u5143\u683c\u4f7f\u7528\u524d\u7f00\u6811\u8fdb\u884c DFS\uff0c\u5c3d\u65e9\u526a\u679d\u5206\u652f\uff08\u5982\u679c\u6ca1\u6709\u5355\u8bcd\u4ee5\u5f53\u524d\u524d\u7f00\u5f00\u5934\uff0c\u5219\u505c\u6b62\uff09\u3002
\u9677\u9631\uff1a\u6ca1\u6709\u524d\u7f00\u6811\u7684\u8bdd\uff0c\u4f60\u9700\u8981\u4e3a\u6bcf\u4e2a\u5355\u8bcd\u5355\u72ec\u8fdb\u884c DFS\uff1a\\(O(w \\cdot m \\cdot n \\cdot 4^L)\\)\u3002\u524d\u7f00\u6811\u8de8\u5355\u8bcd\u5171\u4eab\u524d\u7f00\u8ba1\u7b97\uff0c\u5927\u5e45\u51cf\u5c11\u4e86\u5de5\u4f5c\u91cf\u3002
find(x) \u8fd4\u56de \\(x\\) \u6240\u5728\u96c6\u5408\u7684\u4ee3\u8868\u5143\uff0cunion(x, y) \u5408\u5e76\u5305\u542b \\(x\\) \u548c \\(y\\) \u7684\u96c6\u5408\u3002class UnionFind:\n def __init__(self, n):\n self.parent = list(range(n))\n self.rank = [0] * n\n self.count = n # \u8fde\u901a\u5206\u91cf\u6570\n\n def find(self, x):\n if self.parent[x] != x:\n self.parent[x] = self.find(self.parent[x]) # \u8def\u5f84\u538b\u7f29\n return self.parent[x]\n\n def union(self, x, y):\n rx, ry = self.find(x), self.find(y)\n if rx == ry:\n return False # \u5df2\u7ecf\u8fde\u901a\n # \u6309\u79e9\u5408\u5e76\n if self.rank[rx] < self.rank[ry]:\n rx, ry = ry, rx\n self.parent[ry] = rx\n if self.rank[rx] == self.rank[ry]:\n self.rank[rx] += 1\n self.count -= 1\n return True\n \u901a\u8fc7\u8def\u5f84\u538b\u7f29\u548c\u6309\u79e9\u5408\u5e76\uff0c\u4e24\u4e2a\u64cd\u4f5c\u90fd\u662f\u5e73\u644a \\(O(\\alpha(n)) \\approx O(1)\\)\uff08\u53cd\u963f\u514b\u66fc\u51fd\u6570\uff0c\u5b9e\u9645\u4e0a\u662f\u5e38\u6570\uff09\u3002
\u4f55\u65f6\u4f7f\u7528\uff1a\u8fde\u901a\u5206\u91cf\u3001\u65e0\u5411\u56fe\u4e2d\u7684\u73af\u68c0\u6d4b\u3001Kruskal \u6700\u5c0f\u751f\u6210\u6811\u3001\u5206\u7ec4\u7b49\u4ef7\u9879\u3002
def count_components(n, edges):\n uf = UnionFind(n)\n for u, v in edges:\n uf.union(u, v)\n return uf.count\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/#_10","title":"\u4e2d\u7b49\uff1a\u5197\u4f59\u8fde\u63a5","text":"\u95ee\u9898\uff1a\u627e\u51fa\u4ece\u56fe\u4e2d\u79fb\u9664\u540e\u4f7f\u56fe\u6210\u4e3a\u6811\u7684\u90a3\u6761\u8fb9\uff08\u5373\uff0c\u521b\u5efa\u73af\u7684\u90a3\u6761\u8fb9\uff09\u3002
\u6a21\u5f0f\uff1a\u9010\u4e00\u5904\u7406\u8fb9\u3002\u7b2c\u4e00\u6761\u4e24\u4e2a\u7aef\u70b9\u5df2\u7ecf\u5728\u540c\u4e00\u5206\u91cf\u4e2d\u7684\u8fb9\u5c31\u662f\u521b\u5efa\u73af\u7684\u8fb9\u3002
def find_redundant(edges):\n uf = UnionFind(len(edges) + 1)\n for u, v in edges:\n if not uf.union(u, v):\n return [u, v] # \u5df2\u7ecf\u8fde\u901a \u2192 \u8fd9\u6761\u8fb9\u521b\u5efa\u4e86\u73af\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/#_11","title":"\u7ebf\u6bb5\u6811\u548c\u6811\u72b6\u6570\u7ec4","text":"\u7ebf\u6bb5\u6811\u652f\u6301\u533a\u95f4\u67e5\u8be2\uff08\u5b50\u6570\u7ec4\u4e0a\u7684\u548c\u3001\u6700\u5c0f\u503c\u3001\u6700\u5927\u503c\uff09\u548c\u5355\u70b9\u66f4\u65b0\uff0c\u4e24\u8005\u90fd\u662f \\(O(\\log n)\\)\u3002
\u6811\u72b6\u6570\u7ec4\uff08\u4e8c\u53c9\u7d22\u5f15\u6811\uff09\u662f\u524d\u7f00\u548c\u67e5\u8be2\u548c\u5355\u70b9\u66f4\u65b0\u7684\u66f4\u7b80\u5355\u3001\u66f4\u5feb\u7684\u66ff\u4ee3\u65b9\u6848\u3002\u5b83\u4f7f\u7528\u4e00\u79cd\u5de7\u5999\u7684\u4f4d\u64cd\u4f5c\u6280\u5de7\uff1a\u6bcf\u4e2a\u4f4d\u7f6e\u5b58\u50a8\u4e00\u4e2a\u90e8\u5206\u548c\uff0c\u8986\u76d6\u8303\u56f4\u7531\u6700\u4f4e\u8bbe\u7f6e\u4f4d\u51b3\u5b9a\u3002
class FenwickTree:\n def __init__(self, n):\n self.n = n\n self.tree = [0] * (n + 1)\n\n def update(self, i, delta):\n i += 1 # 1-indexed\n while i <= self.n:\n self.tree[i] += delta\n i += i & (-i) # \u52a0\u4e0a\u6700\u4f4e\u8bbe\u7f6e\u4f4d\n\n def prefix_sum(self, i):\n i += 1\n total = 0\n while i > 0:\n total += self.tree[i]\n i -= i & (-i) # \u79fb\u9664\u6700\u4f4e\u8bbe\u7f6e\u4f4d\n return total\n\n def range_sum(self, l, r):\n return self.prefix_sum(r) - (self.prefix_sum(l - 1) if l > 0 else 0)\n left.val < root.val \u9057\u6f0f\u4e86\u6df1\u5c42\u8fdd\u89c4 \u4f20\u9012 lo/hi \u8fb9\u754c \u9012\u5f52\u4e2d \\(O(n^2)\\) \u5217\u8868\u62fc\u63a5 inorder(left) + [val] + inorder(right) \u8ffd\u52a0\u5230\u5171\u4eab\u5217\u8868 \u5fd8\u8bb0\u57fa\u672c\u60c5\u51b5 \u7a7a\u6811\u4e0a\u7684\u65e0\u9650\u9012\u5f52 if not root: return \u6df7\u6dc6\u7ecf\u8fc7\u8def\u5f84\u548c\u5230\u7236\u8282\u70b9\u7684\u8def\u5f84 \u6700\u5927\u8def\u5f84\u548c\uff1a\u5728\u4e24\u4e2a\u5c42\u7ea7\u5206\u53c9 \u5411\u7236\u8282\u70b9\u8fd4\u56de\u5355\u5206\u652f\uff0c\u5355\u72ec\u8ddf\u8e2a\u53cc\u5206\u652f \u6811\u72b6\u6570\u7ec4 1-indexed vs 0-indexed \u6811\u6570\u7ec4\u4e2d\u7684\u5dee\u4e00\u9519\u8bef \u5165\u53e3\u5904\u59cb\u7ec8 i += 1 \u5e76\u67e5\u96c6\u6ca1\u6709\u8def\u5f84\u538b\u7f29 \u6700\u574f\u60c5\u51b5\u4e0b\u6bcf\u6b21 find \u662f \\(O(n)\\) self.parent[x] = self.find(self.parent[x])"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/#neetcode","title":"\u8bfe\u540e\u7ec3\u4e60\u9898\uff08NeetCode\uff09","text":""},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/03.%20trees/#_13","title":"\u4e8c\u53c9\u6811\u6a21\u5f0f","text":"\u56fe\u5efa\u6a21\u4e86\u5173\u7cfb\u548c\u8fde\u63a5\u2014\u2014\u4ece\u793e\u4ea4\u7f51\u7edc\u5230\u9053\u8def\u5730\u56fe\u518d\u5230\u4f9d\u8d56\u94fe\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u56fe\u7684\u8868\u793a\u3001BFS\u3001DFS\u3001\u6700\u77ed\u8def\u5f84\u3001\u62d3\u6251\u6392\u5e8f\u548c\u8fde\u901a\u5206\u91cf\uff0c\u5305\u62ec\u904d\u5386\u548c\u5bfb\u8def\u6a21\u5f0f\uff0c\u8fd9\u4e9b\u662f\u56fe\u9762\u8bd5\u9898\u4e2d\u7684\u6838\u5fc3\u3002
\u6211\u4eec\u5728\u7b2c12\u7ae0\uff08\u90bb\u63a5\u77e9\u9635\u3001\u62c9\u666e\u62c9\u65af\u77e9\u9635\u3001\u8c31\u6027\u8d28\uff09\u548c\u7b2c13\u7ae0\uff08\u6811\u3001\u5e73\u9762\u6027\u3001\u7740\u8272\uff09\u4e2d\u5df2\u7ecf\u4ecb\u7ecd\u4e86\u56fe\u8bba\u3002\u8fd9\u91cc\u6211\u4eec\u4e13\u6ce8\u4e8e\u7b97\u6cd5\u6a21\u5f0f\uff1a\u5982\u4f55\u5728\u4ee3\u7801\u4e2d\u904d\u5386\u3001\u641c\u7d22\u548c\u4f18\u5316\u56fe\u3002
\u4e24\u79cd\u57fa\u672c\u7684\u56fe\u7b97\u6cd5\u662f BFS \u548c DFS\u3002\u51e0\u4e4e\u6240\u6709\u56fe\u95ee\u9898\u90fd\u53ef\u4ee5\u5f52\u7ed3\u4e3a\u5176\u4e2d\u4e00\u79cd\uff0c\u53ef\u80fd\u5e26\u6709\u4fee\u6539\u3002\u638c\u63e1\u8fd9\u4e24\u79cd\u7b97\u6cd5\uff0c\u4f60\u5c31\u80fd\u89e3\u51b3\u7edd\u5927\u591a\u6570\u56fe\u95ee\u9898\u3002
# \u65e0\u5411\u56fe\ngraph = {\n 0: [1, 2],\n 1: [0, 3],\n 2: [0, 3],\n 3: [1, 2]\n}\n\n# \u4ece\u8fb9\u5217\u8868\u6784\u5efa\ndef build_graph(n, edges):\n graph = {i: [] for i in range(n)}\n for u, v in edges:\n graph[u].append(v)\n graph[v].append(u) # \u6709\u5411\u56fe\u7701\u7565\u8fd9\u4e00\u884c\n return graph\n \u90bb\u63a5\u77e9\u9635\uff1a\\(n \\times n\\) \u77e9\u9635\uff0c\u5176\u4e2d \\(A[i][j] = 1\\) \u5982\u679c\u8fb9 \\((i, j)\\) \u5b58\u5728\u3002\u7a7a\u95f4\uff1a\\(O(|V|^2)\\)\u3002\u6700\u9002\u5408\u7a20\u5bc6\u56fe\u6216\u9700\u8981 \\(O(1)\\) \u8fb9\u67e5\u627e\u65f6\u3002
\u4f55\u65f6\u4f7f\u7528\u54ea\u79cd\uff1a\u7edd\u5927\u591a\u6570\u60c5\u51b5\u4f7f\u7528\u90bb\u63a5\u8868\u3002\u53ea\u6709\u5f53\u56fe\u5f88\u7a20\u5bc6\uff08\\(|E| \\approx |V|^2\\)\uff09\u6216\u9700\u8981\u5e38\u6570\u65f6\u95f4\u8fb9\u5b58\u5728\u6027\u68c0\u67e5\u65f6\u624d\u4f7f\u7528\u77e9\u9635\u3002
from collections import deque\n\ndef bfs(graph, start):\n visited = {start}\n queue = deque([start])\n\n while queue:\n node = queue.popleft()\n for neighbour in graph[node]:\n if neighbour not in visited:\n visited.add(neighbour)\n queue.append(neighbour)\n visited\uff0c\u800c\u4e0d\u662f\u5728\u51fa\u961f\u65f6\u3002\u5982\u679c\u4f60\u5728\u51fa\u961f\u65f6\u6807\u8bb0\u5df2\u8bbf\u95ee\uff0c\u540c\u4e00\u4e2a\u8282\u70b9\u53ef\u80fd\u88ab\u4e0d\u540c\u524d\u9a71\u591a\u6b21\u5165\u961f\uff0c\u6d6a\u8d39\u65f6\u95f4\u5e76\u53ef\u80fd\u5bfc\u81f4\u9519\u8bef\u7ed3\u679c\u3002\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e00\u4e2a\u7531 '1'\uff08\u9646\u5730\uff09\u548c '0'\uff08\u6c34\uff09\u7ec4\u6210\u7684 2D \u7f51\u683c\uff0c\u8ba1\u7b97\u5c9b\u5c7f\u7684\u6570\u91cf\u3002
\u6a21\u5f0f\uff1a\u904d\u5386\u7f51\u683c\u3002\u5f53\u627e\u5230\u4e00\u4e2a '1' \u65f6\uff0c\u4f7f\u7528 BFS/DFS \u5c06\u6240\u6709\u8fde\u901a\u7684\u9646\u5730\u5355\u5143\u683c\u6807\u8bb0\u4e3a\u5df2\u8bbf\u95ee\u3002\u6bcf\u6b21\u5f00\u59cb BFS \u5c31\u662f\u4e00\u4e2a\u5c9b\u5c7f\u3002
from collections import deque\n\ndef num_islands(grid):\n if not grid:\n return 0\n\n rows, cols = len(grid), len(grid[0])\n count = 0\n\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == '1':\n count += 1\n # BFS \u6807\u8bb0\u6574\u4e2a\u5c9b\u5c7f\n queue = deque([(r, c)])\n grid[r][c] = '0' # \u6807\u8bb0\u5df2\u8bbf\u95ee\n while queue:\n cr, cc = queue.popleft()\n for dr, dc in [(0,1),(0,-1),(1,0),(-1,0)]:\n nr, nc = cr + dr, cc + dc\n if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == '1':\n grid[nr][nc] = '0'\n queue.append((nr, nc))\n\n return count\n \u9677\u9631\uff1adirections = [(0,1),(0,-1),(1,0),(-1,0)] \u6a21\u5f0f\u7528\u4e8e\u56db\u8fde\u901a\u7f51\u683c\u90bb\u5c45\uff0c\u51e0\u4e4e\u6bcf\u4e2a\u7f51\u683c\u95ee\u9898\u90fd\u4f1a\u7528\u5230\u3002\u8bb0\u4f4f\u5b83\u3002\u5bf9\u4e8e\u516b\u8fde\u901a\uff0c\u52a0\u4e0a\u5bf9\u89d2\u7ebf\u3002
\u9677\u9631\uff1a\u4fee\u6539\u8f93\u5165\u7f51\u683c\uff08grid[r][c] = '0'\uff09\u907f\u514d\u4e86\u9700\u8981\u5355\u72ec\u7684 visited \u96c6\u5408\u3002\u5728\u9762\u8bd5\u4e2d\u8fd9\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4f46\u8981\u660e\u786e\u8bf4\u660e\u6743\u8861\uff08\u6539\u53d8\u4e86\u8f93\u5165\uff09\u3002
\u95ee\u9898\uff1a\u65b0\u9c9c\u6a58\u5b50\u5982\u679c\u4e0e\u8150\u70c2\u6a58\u5b50\u76f8\u90bb\u5219\u4f1a\u8150\u70c2\u3002\u8fd4\u56de\u6240\u6709\u6a58\u5b50\u90fd\u8150\u70c2\u7684\u6700\u77ed\u65f6\u95f4\uff08\u5982\u679c\u4e0d\u53ef\u80fd\u5219\u8fd4\u56de -1\uff09\u3002
\u6a21\u5f0f\uff1a\u591a\u6e90 BFS\u3002\u5c06\u6240\u6709\u521d\u59cb\u8150\u70c2\u7684\u6a58\u5b50\u540c\u65f6\u653e\u5165\u961f\u5217\u3002\u6bcf\u5c42 BFS \u5c31\u662f\u4e00\u4e2a\u65f6\u95f4\u6b65\u3002
from collections import deque\n\ndef oranges_rotting(grid):\n rows, cols = len(grid), len(grid[0])\n queue = deque()\n fresh = 0\n\n for r in range(rows):\n for c in range(cols):\n if grid[r][c] == 2:\n queue.append((r, c))\n elif grid[r][c] == 1:\n fresh += 1\n\n if fresh == 0:\n return 0\n\n time = 0\n while queue and fresh > 0:\n time += 1\n for _ in range(len(queue)):\n cr, cc = queue.popleft()\n for dr, dc in [(0,1),(0,-1),(1,0),(-1,0)]:\n nr, nc = cr + dr, cc + dc\n if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == 1:\n grid[nr][nc] = 2\n fresh -= 1\n queue.append((nr, nc))\n\n return time if fresh == 0 else -1\n def dfs(graph, node, visited=None):\n if visited is None:\n visited = set()\n visited.add(node)\n for neighbour in graph[node]:\n if neighbour not in visited:\n dfs(graph, neighbour, visited)\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/04.%20graphs/#_5","title":"\u4e2d\u7b49\uff1a\u8bfe\u7a0b\u8868\uff08\u73af\u68c0\u6d4b\uff09","text":"\u95ee\u9898\uff1a\u7ed9\u5b9a \\(n\\) \u95e8\u8bfe\u7a0b\u548c\u5148\u4fee\u6761\u4ef6\uff0c\u5224\u65ad\u662f\u5426\u80fd\u5b8c\u6210\u6240\u6709\u8bfe\u7a0b\uff08\u5373\uff0c\u6ca1\u6709\u5faa\u73af\u4f9d\u8d56\uff09\u3002
\u6a21\u5f0f\uff1a\u5728\u6709\u5411\u56fe\u4e2d\u68c0\u6d4b\u73af\u3002\u4f7f\u7528\u5e26\u6709\u4e09\u79cd\u72b6\u6001\u7684 DFS\uff1a\u672a\u8bbf\u95ee\u3001\u6b63\u5728\u8fdb\u884c\uff08\u5728\u5f53\u524d DFS \u8def\u5f84\u4e0a\uff09\u3001\u5df2\u5b8c\u6210\u3002
def can_finish(num_courses, prerequisites):\n graph = {i: [] for i in range(num_courses)}\n for course, prereq in prerequisites:\n graph[course].append(prereq)\n\n # 0 = \u672a\u8bbf\u95ee, 1 = \u8fdb\u884c\u4e2d, 2 = \u5df2\u5b8c\u6210\n state = [0] * num_courses\n\n def has_cycle(node):\n if state[node] == 1:\n return True # \u56de\u8fb9 \u2192 \u73af\n if state[node] == 2:\n return False # \u5df2\u7ecf\u5b8c\u5168\u63a2\u7d22\u8fc7\n\n state[node] = 1 # \u6807\u8bb0\u4e3a\u8fdb\u884c\u4e2d\n for neighbour in graph[node]:\n if has_cycle(neighbour):\n return True\n state[node] = 2 # \u6807\u8bb0\u4e3a\u5df2\u5b8c\u6210\n return False\n\n for course in range(num_courses):\n if has_cycle(course):\n return False\n return True\n \u95ee\u9898\uff1a\u8fd4\u56de\u4e00\u4e2a\u6709\u6548\u7684\u8bfe\u7a0b\u987a\u5e8f\uff08\u62d3\u6251\u6392\u5e8f\uff09\u3002
\u6a21\u5f0f\uff08Kahn \u7b97\u6cd5\u2014\u2014\u57fa\u4e8e BFS\uff09\uff1a\u4ece\u6ca1\u6709\u5165\u8fb9\u7684\u8282\u70b9\uff08\u5165\u5ea6\u4e3a 0\uff09\u5f00\u59cb\u3002\u5904\u7406\u5b83\u4eec\uff0c\u51cf\u5c11\u5b83\u4eec\u90bb\u5c45\u7684\u5165\u5ea6\u3002\u91cd\u590d\u3002
from collections import deque\n\ndef find_order(num_courses, prerequisites):\n graph = {i: [] for i in range(num_courses)}\n indegree = [0] * num_courses\n\n for course, prereq in prerequisites:\n graph[prereq].append(course)\n indegree[course] += 1\n\n queue = deque([i for i in range(num_courses) if indegree[i] == 0])\n order = []\n\n while queue:\n node = queue.popleft()\n order.append(node)\n for neighbour in graph[node]:\n indegree[neighbour] -= 1\n if indegree[neighbour] == 0:\n queue.append(neighbour)\n\n return order if len(order) == num_courses else [] # \u7a7a = \u5b58\u5728\u73af\n import heapq\n\ndef dijkstra(graph, start):\n # graph: {node: [(neighbour, weight), ...]}\n dist = {node: float('inf') for node in graph}\n dist[start] = 0\n heap = [(0, start)]\n\n while heap:\n d, node = heapq.heappop(heap)\n if d > dist[node]:\n continue # \u8fc7\u671f\u6761\u76ee\n\n for neighbour, weight in graph[node]:\n new_dist = d + weight\n if new_dist < dist[neighbour]:\n dist[neighbour] = new_dist\n heapq.heappush(heap, (new_dist, neighbour))\n\n return dist\n \u65f6\u95f4\uff1a\u4f7f\u7528\u4e8c\u53c9\u5806\u4e3a \\(O((|V| + |E|) \\log |V|)\\)\u3002
\u9677\u9631\uff1aif d > dist[node]: continue \u8fd9\u884c\u662f\u5fc5\u987b\u7684\u3002\u6ca1\u6709\u5b83\uff0c\u4f60\u4f1a\u5904\u7406\u8fc7\u671f\u7684\u5806\u6761\u76ee\uff0c\u53ef\u80fd\u9000\u5316\u5230 \\(O(|V|^2)\\)\u3002
\u9677\u9631\uff1aDijkstra \u4e0d\u9002\u7528\u4e8e\u8d1f\u6743\u91cd\u3002\u5982\u679c\u4e00\u6761\u8fb9\u6709\u8d1f\u6743\u91cd\uff0c\u8d2a\u5fc3\u5047\u8bbe\uff08\u4e00\u65e6\u8282\u70b9\u88ab\u786e\u5b9a\uff0c\u5176\u8ddd\u79bb\u5c31\u662f\u6700\u4f18\u7684\uff09\u5c31\u4e0d\u6210\u7acb\u4e86\u3002\u5e94\u6539\u7528 Bellman-Ford\u3002
def network_delay(times, n, k):\n graph = {i: [] for i in range(1, n + 1)}\n for u, v, w in times:\n graph[u].append((v, w))\n\n dist = dijkstra(graph, k)\n max_time = max(dist.values())\n return max_time if max_time < float('inf') else -1\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/04.%20graphs/#_8","title":"\u5f3a\u8fde\u901a\u5206\u91cf","text":"\u5728\u6709\u5411\u56fe\u4e2d\uff0c\u5f3a\u8fde\u901a\u5206\u91cf\uff08SCC\uff09\u662f\u4e00\u4e2a\u6700\u5927\u8282\u70b9\u96c6\u5408\uff0c\u5176\u4e2d\u6bcf\u4e2a\u8282\u70b9\u90fd\u80fd\u5230\u8fbe\u5176\u4ed6\u6240\u6709\u8282\u70b9\u3002
Kosaraju \u7b97\u6cd5\uff1a(1) \u5728\u539f\u59cb\u56fe\u4e0a\u8fdb\u884c DFS\uff0c\u8bb0\u5f55\u5b8c\u6210\u987a\u5e8f\u3002(2) \u8f6c\u7f6e\u56fe\uff08\u53cd\u8f6c\u6240\u6709\u8fb9\uff09\u3002(3) \u6309\u5b8c\u6210\u987a\u5e8f\u7684\u9006\u5e8f\u5728\u8f6c\u7f6e\u56fe\u4e0a\u8fdb\u884c DFS\u3002\u7b2c3\u6b65\u4e2d\u7684\u6bcf\u4e2a DFS \u6811\u5c31\u662f\u4e00\u4e2a SCC\u3002
\u4f55\u65f6\u4f7f\u7528\uff1a\u5bfb\u627e\u5faa\u73af\u4f9d\u8d56\u30012-SAT\u3001\u5c06\u6709\u5411\u56fe\u538b\u7f29\u4e3a SCC \u7684 DAG\u3002
if d > dist[node]: continue \u5904\u7406\u8fc7\u671f\u5806\u6761\u76ee \u603b\u662f\u8df3\u8fc7\u5f53\u524d\u8ddd\u79bb\u66f4\u5dee\u7684\u60c5\u51b5 \u7f51\u683c\u8fb9\u754c\u68c0\u67e5 \u7d22\u5f15\u8d8a\u754c 0 <= nr < rows and 0 <= nc < cols \u6ca1\u6709\u8003\u8651 time=0 \u7684\u8fb9\u754c\u60c5\u51b5 \u8150\u70c2\u6a58\u5b50\uff1a\u6ca1\u6709\u65b0\u9c9c\u6a58\u5b50 \u5728 BFS \u4e4b\u524d\u68c0\u67e5 fresh == 0 \u5c06\u6709\u5411\u56fe\u6784\u5efa\u4e3a\u65e0\u5411\u56fe \u5148\u4fee\u6761\u4ef6\u662f\u5355\u5411\u7684 \u53ea\u5728\u4e00\u4e2a\u65b9\u5411\u6dfb\u52a0\u8fb9"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/04.%20graphs/#neetcode","title":"\u8bfe\u540e\u7ec3\u4e60\u9898\uff08NeetCode\uff09","text":""},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/04.%20graphs/#bfs_1","title":"BFS \u6a21\u5f0f","text":"\u6392\u5e8f\u548c\u641c\u7d22\u662f\u6700\u57fa\u7840\u7684\u7b97\u6cd5\u64cd\u4f5c\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u6392\u5e8f\u7b97\u6cd5\u3001\u4e8c\u5206\u67e5\u627e\u6a21\u5f0f\u3001\u5206\u6cbb\u6cd5\u3001\u8d2a\u5fc3\u7b97\u6cd5\u3001\u52a8\u6001\u89c4\u5212\u548c\u56de\u6eaf\u3002
\u7a33\u5b9a\u610f\u5473\u7740\u76f8\u7b49\u5143\u7d20\u4fdd\u6301\u5176\u76f8\u5bf9\u987a\u5e8f\u3002\u8fd9\u5728\u6309\u591a\u4e2a\u952e\u6392\u5e8f\u65f6\u5f88\u91cd\u8981\u3002
\u57fa\u4e8e\u6bd4\u8f83\u7684\u6392\u5e8f\u7684\u4e0b\u9650\u662f \\(\\Omega(n \\log n)\\)\u3002\u8bc1\u660e\u4f7f\u7528\u51b3\u7b56\u6811\uff08\u7b2c13\u7ae0\uff09\uff1a\u4efb\u4f55\u6bd4\u8f83\u6392\u5e8f\u5fc5\u987b\u533a\u5206\u6240\u6709 \\(n!\\) \u79cd\u6392\u5217\uff0c\u81f3\u5c11\u9700\u8981 \\(\\log_2(n!) = \\Omega(n \\log n)\\) \u6b21\u6bd4\u8f83\u3002\u8ba1\u6570\u6392\u5e8f\u548c\u57fa\u6570\u6392\u5e8f\u901a\u8fc7\u4e0d\u6bd4\u8f83\u5143\u7d20\u800c\u8d85\u8d8a\u4e86\u8fd9\u4e2a\u4e0b\u9650\u3002
def merge_sort(arr):\n if len(arr) <= 1:\n return arr\n\n mid = len(arr) // 2\n left = merge_sort(arr[:mid])\n right = merge_sort(arr[mid:])\n\n return merge(left, right)\n\ndef merge(left, right):\n result = []\n i = j = 0\n while i < len(left) and j < len(right):\n if left[i] <= right[j]: # <= \u4fdd\u8bc1\u7a33\u5b9a\u6027\n result.append(left[i])\n i += 1\n else:\n result.append(right[j])\n j += 1\n result.extend(left[i:])\n result.extend(right[j:])\n return result\n < \u800c\u4e0d\u662f <= \u4f1a\u7834\u574f\u7a33\u5b9a\u6027\uff08\u53f3\u534a\u90e8\u5206\u7684\u76f8\u7b49\u5143\u7d20\u4f1a\u6392\u5728\u5de6\u534a\u90e8\u5206\u4e4b\u524d\uff09\u3002def quicksort(arr, lo=0, hi=None):\n if hi is None:\n hi = len(arr) - 1\n if lo >= hi:\n return\n\n pivot_idx = partition(arr, lo, hi)\n quicksort(arr, lo, pivot_idx - 1)\n quicksort(arr, pivot_idx + 1, hi)\n\ndef partition(arr, lo, hi):\n pivot = arr[hi] # Lomuto \u5206\u533a\uff1a\u57fa\u51c6\u662f\u6700\u540e\u4e00\u4e2a\u5143\u7d20\n i = lo\n for j in range(lo, hi):\n if arr[j] < pivot:\n arr[i], arr[j] = arr[j], arr[i]\n i += 1\n arr[i], arr[hi] = arr[hi], arr[i]\n return i\n \u57fa\u51c6\u7b56\u7565\uff1a\u6700\u540e\u4e00\u4e2a\u5143\u7d20\uff08\u7b80\u5355\uff0c\u5bf9\u5df2\u6392\u5e8f\u8f93\u5165\u4e0d\u597d\uff09\u3001\u968f\u673a\uff08\u671f\u671b \\(O(n \\log n)\\)\uff09\u3001\u4e09\u6570\u53d6\u4e2d\uff08\u5b9e\u9645\u9009\u62e9\uff09\u3002\u5728\u9762\u8bd5\u4e2d\u59cb\u7ec8\u4f18\u5148\u9009\u62e9\u968f\u673a\u57fa\u51c6\u4ee5\u907f\u514d\u6700\u574f\u60c5\u51b5\u7684\u8ba8\u8bba\u3002
\u9677\u9631\uff1a\u5feb\u901f\u6392\u5e8f\u7684 \\(O(n^2)\\) \u6700\u574f\u60c5\u51b5\u53d1\u751f\u5728\u5df2\u6392\u5e8f\u6570\u7ec4\u914d\u5408\u9996/\u5c3e\u57fa\u51c6\u65f6\u3002\u5b9e\u8df5\u4e2d\uff0c\u968f\u673a\u57fa\u51c6\u6216\u4e09\u6570\u53d6\u4e2d\u6d88\u9664\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002
def counting_sort(arr, k):\n count = [0] * k\n for x in arr:\n count[x] += 1\n result = []\n for val in range(k):\n result.extend([val] * count[val])\n return result\n \u4e8c\u5206\u67e5\u627e\u901a\u8fc7\u5728\u5df2\u6392\u5e8f\u6570\u7ec4\u4e2d\u53cd\u590d\u51cf\u534a\u641c\u7d22\u7a7a\u95f4\u6765\u4ee5 \\(O(\\log n)\\) \u7684\u65f6\u95f4\u627e\u5230\u76ee\u6807\u3002\u4f46\u4e8c\u5206\u67e5\u627e\u8fdc\u4e0d\u6b62\"\u5728\u5df2\u6392\u5e8f\u6570\u7ec4\u4e2d\u627e\u4e00\u4e2a\u6570\"\u3002\u901a\u7528\u6a21\u5f0f\u662f\uff1a\u5728\u5355\u8c03\u6761\u4ef6\u4e0a\u8fdb\u884c\u641c\u7d22\u3002
\u6a21\u677f\uff08\u907f\u514d\u5dee\u4e00\u9519\u8bef\u7684\u90a3\u4e00\u4e2a\uff09\uff1a
def binary_search(arr, target):\n lo, hi = 0, len(arr) - 1\n\n while lo <= hi:\n mid = lo + (hi - lo) // 2 # \u5728\u5176\u4ed6\u8bed\u8a00\u4e2d\u907f\u514d\u6ea2\u51fa\n if arr[mid] == target:\n return mid\n elif arr[mid] < target:\n lo = mid + 1\n else:\n hi = mid - 1\n\n return -1 # \u672a\u627e\u5230\n def lower_bound(arr, target):\n lo, hi = 0, len(arr)\n while lo < hi:\n mid = (lo + hi) // 2\n if arr[mid] < target:\n lo = mid + 1\n else:\n hi = mid\n return lo\n lo <= hi \u548c lo < hi \u7684\u533a\u522b\uff0c\u4ee5\u53ca hi = mid \u548c hi = mid - 1 \u7684\u533a\u522b\uff0c\u51b3\u5b9a\u4e86\u4f60\u662f\u627e\u5230\u7cbe\u786e\u5339\u914d\u8fd8\u662f\u8fb9\u754c\u3002\u7528\u4e00\u4e2a2\u5143\u7d20\u6570\u7ec4\u753b\u51fa\u6765\u9a8c\u8bc1\u3002\u95ee\u9898\uff1a\u4e00\u4e2a\u6392\u5e8f\u6570\u7ec4\u5728\u67d0\u4e2a\u67a2\u8f74\u5904\u88ab\u65cb\u8f6c\u3002\u627e\u5230\u76ee\u6807\u503c\u3002
\u6a21\u5f0f\uff1a\u5728\u6bcf\u4e00\u6b65\uff0c\u6709\u4e00\u534a\u603b\u662f\u6709\u5e8f\u7684\u3002\u786e\u5b9a\u54ea\u4e00\u534a\u662f\u6709\u5e8f\u7684\uff0c\u5e76\u68c0\u67e5\u76ee\u6807\u662f\u5426\u5728\u8fd9\u4e00\u534a\u4e2d\u3002
def search_rotated(nums, target):\n lo, hi = 0, len(nums) - 1\n\n while lo <= hi:\n mid = (lo + hi) // 2\n if nums[mid] == target:\n return mid\n\n # \u5de6\u534a\u90e8\u5206\u6709\u5e8f\n if nums[lo] <= nums[mid]:\n if nums[lo] <= target < nums[mid]:\n hi = mid - 1\n else:\n lo = mid + 1\n # \u53f3\u534a\u90e8\u5206\u6709\u5e8f\n else:\n if nums[mid] < target <= nums[hi]:\n lo = mid + 1\n else:\n hi = mid - 1\n\n return -1\n nums[lo] <= nums[mid] \u4e2d\u7684 <=\uff08\u800c\u4e0d\u662f <\uff09\u81f3\u5173\u91cd\u8981\u3002\u5f53 lo == mid\uff08\u53ea\u52692\u4e2a\u5143\u7d20\uff09\u65f6\uff0c\u6211\u4eec\u5fc5\u987b\u6b63\u786e\u8bc6\u522b\u6709\u5e8f\u7684\u4e00\u534a\u3002\u95ee\u9898\uff1a\u5728 \\(O(\\log(m + n))\\) \u65f6\u95f4\u5185\u627e\u5230\u4e24\u4e2a\u6709\u5e8f\u6570\u7ec4\u7684\u4e2d\u4f4d\u6570\u3002
\u6a21\u5f0f\uff1a\u5bf9\u8f83\u5c0f\u6570\u7ec4\u7684\u5206\u5272\u70b9\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u3002\u5206\u5272\u5c06\u4e24\u4e2a\u6570\u7ec4\u5206\u4e3a\u4e24\u90e8\u5206\uff0c\u4f7f\u5f97\u5de6\u4fa7\u6240\u6709\u5143\u7d20\u90fd\u5c0f\u4e8e\u53f3\u4fa7\u6240\u6709\u5143\u7d20\u3002
def find_median(nums1, nums2):\n if len(nums1) > len(nums2):\n nums1, nums2 = nums2, nums1 # \u786e\u4fdd nums1 \u8f83\u77ed\n\n m, n = len(nums1), len(nums2)\n lo, hi = 0, m\n half = (m + n + 1) // 2\n\n while lo <= hi:\n i = (lo + hi) // 2 # nums1 \u4e2d\u7684\u5206\u5272\u70b9\n j = half - i # nums2 \u4e2d\u7684\u5206\u5272\u70b9\n\n left1 = nums1[i - 1] if i > 0 else float('-inf')\n right1 = nums1[i] if i < m else float('inf')\n left2 = nums2[j - 1] if j > 0 else float('-inf')\n right2 = nums2[j] if j < n else float('inf')\n\n if left1 <= right2 and left2 <= right1:\n # \u6b63\u786e\u5206\u5272\n if (m + n) % 2 == 1:\n return max(left1, left2)\n return (max(left1, left2) + min(right1, right2)) / 2\n elif left1 > right2:\n hi = i - 1\n else:\n lo = i + 1\n \u8bb8\u591a\u770b\u8d77\u6765\u4e0d\u50cf\u4e8c\u5206\u67e5\u627e\u7684\u95ee\u9898\u53ef\u4ee5\u901a\u8fc7\u5bf9\u7b54\u6848\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u6765\u89e3\u51b3\u3002\u5982\u679c\u7b54\u6848\u662f\u4e00\u4e2a\u6570\u5b57\uff0c\u5e76\u4e14\u4f60\u53ef\u4ee5\u5199\u4e00\u4e2a\u5355\u8c03\u7684\u51fd\u6570 is_feasible(x)\uff08\u5bf9\u6240\u6709 \\(x \\geq\\) \u6700\u4f18\u503c\u4e3a True\uff0c\u6216\u5bf9\u6240\u6709 \\(x \\geq\\) \u6700\u4f18\u503c\u4e3a False\uff09\uff0c\u90a3\u4e48\u5c31\u5728 \\(x\\) \u4e0a\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u3002
\u793a\u4f8b\uff1a\"\u5728 \\(d\\) \u5929\u5185\u8fd0\u9001\u6240\u6709\u5305\u88f9\u6240\u9700\u7684\u6700\u5c0f\u8fd0\u529b\u662f\u591a\u5c11\uff1f\"\u5bf9\u8fd0\u529b\u8fdb\u884c\u4e8c\u5206\u67e5\u627e\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u5019\u9009\u8fd0\u529b\uff0c\u8d2a\u5fc3\u5730\u68c0\u67e5\u662f\u5426\u53ef\u4ee5\u5728 \\(d\\) \u5929\u5185\u8fd0\u9001\u6240\u6709\u5305\u88f9\u3002
def ship_within_days(weights, days):\n lo, hi = max(weights), sum(weights)\n\n while lo < hi:\n mid = (lo + hi) // 2\n # \u80fd\u5426\u4ee5\u8fd0\u529b mid \u5728 <= days \u5929\u5185\u8fd0\u9001\u5b8c\uff1f\n current_load, num_days = 0, 1\n for w in weights:\n if current_load + w > mid:\n num_days += 1\n current_load = 0\n current_load += w\n\n if num_days <= days:\n hi = mid\n else:\n lo = mid + 1\n\n return lo\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/05.%20sorting%20and%20search/#_11","title":"\u6a21\u5f0f\uff1a\u8d2a\u5fc3\u7b97\u6cd5","text":"nums[i] \u662f\u5728\u4f4d\u7f6e \\(i\\) \u7684\u6700\u5927\u8df3\u8dc3\u957f\u5ea6\uff0c\u5224\u65ad\u662f\u5426\u80fd\u591f\u5230\u8fbe\u6700\u540e\u4e00\u4e2a\u7d22\u5f15\u3002def can_jump(nums):\n max_reach = 0\n for i, jump in enumerate(nums):\n if i > max_reach:\n return False # \u65e0\u6cd5\u5230\u8fbe\u8fd9\u4e2a\u4f4d\u7f6e\n max_reach = max(max_reach, i + jump)\n return True\n def merge_intervals(intervals):\n intervals.sort(key=lambda x: x[0])\n merged = [intervals[0]]\n\n for start, end in intervals[1:]:\n if start <= merged[-1][1]:\n merged[-1][1] = max(merged[-1][1], end)\n else:\n merged.append([start, end])\n\n return merged\n \u6a21\u5f0f\uff1a\u6309\u5f00\u59cb\u65f6\u95f4\u6392\u5e8f\uff0c\u7136\u540e\u8d2a\u5fc3\u5730\u5408\u5e76\u3002\u5982\u679c\u5f53\u524d\u533a\u95f4\u4e0e\u4e0a\u4e00\u4e2a\u5408\u5e76\u7684\u533a\u95f4\u91cd\u53e0\uff0c\u5219\u6269\u5c55\u5b83\u3002\u5426\u5219\uff0c\u5f00\u59cb\u4e00\u4e2a\u65b0\u7684\u5408\u5e76\u533a\u95f4\u3002
\u9677\u9631\uff1a\u4f7f\u7528 merged[-1][1] = end \u800c\u4e0d\u662f merged[-1][1] = max(merged[-1][1], end)\u3002\u4e00\u4e2a\u533a\u95f4\u53ef\u80fd\u5b8c\u5168\u5305\u542b\u5728\u53e6\u4e00\u4e2a\u533a\u95f4\u5185\uff08\u4f8b\u5982 [1, 10] \u548c [2, 5]\uff09\u3002
\u52a8\u6001\u89c4\u5212\uff08DP\uff09\u901a\u8fc7\u5c06\u95ee\u9898\u5206\u89e3\u4e3a\u91cd\u53e0\u7684\u5b50\u95ee\u9898\uff0c\u6bcf\u4e2a\u5b50\u95ee\u9898\u53ea\u89e3\u4e00\u6b21\u5e76\u5b58\u50a8\u7ed3\u679c\u3002\u5b83\u9002\u7528\u4e8e\u5177\u6709\u6700\u4f18\u5b50\u7ed3\u6784\u548c\u91cd\u53e0\u5b50\u95ee\u9898\u7684\u95ee\u9898\u3002
\u4e24\u79cd\u65b9\u6cd5\uff1a
\u5982\u4f55\u8bc6\u522b DP\uff1a\u95ee\u9898\u8981\u6c42\u6700\u4f18\u503c\uff08\u6700\u5c0f/\u6700\u5927\uff09\u3001\u8ba1\u6570\u6216\u5b58\u5728\u6027\uff0c\u5e76\u4e14\u5f53\u524d\u51b3\u7b56\u4f9d\u8d56\u4e8e\u5148\u524d\u7684\u51b3\u7b56\u3002\u5982\u679c\u4f60\u753b\u51fa\u9012\u5f52\u6811\u5e76\u770b\u5230\u91cd\u590d\u7684\u5b50\u95ee\u9898\uff0c\u90a3\u5c31\u662f DP\u3002
\u95ee\u9898\uff1a\\(n\\) \u4e2a\u53f0\u9636\uff0c\u6bcf\u6b21\u53ef\u4ee5\u722c 1 \u6216 2 \u4e2a\u53f0\u9636\u3002\u6709\u591a\u5c11\u79cd\u4e0d\u540c\u7684\u65b9\u6cd5\uff1f
\u8fd9\u5c31\u662f\u6590\u6ce2\u90a3\u5951\u6570\u5217\uff1a\\(f(n) = f(n-1) + f(n-2)\\)\u3002
def climb_stairs(n):\n if n <= 2:\n return n\n a, b = 1, 2\n for _ in range(3, n + 1):\n a, b = b, a + b\n return b\n \u95ee\u9898\uff1a\u7ed9\u5b9a\u786c\u5e01\u9762\u989d\u548c\u4e00\u4e2a\u76ee\u6807\u91d1\u989d\uff0c\u627e\u5230\u6240\u9700\u7684\u6700\u5c11\u786c\u5e01\u6570\u91cf\u3002
\u72b6\u6001\uff1adp[amount] = \u51d1\u6210 amount \u6240\u9700\u7684\u6700\u5c0f\u786c\u5e01\u6570\u3002
dp[amount] = min(dp[amount - coin] + 1) \u5bf9\u6bcf\u4e2a\u786c\u5e01\u3002dp[0] = 0\u3002def coin_change(coins, amount):\n dp = [float('inf')] * (amount + 1)\n dp[0] = 0\n\n for a in range(1, amount + 1):\n for coin in coins:\n if coin <= a and dp[a - coin] + 1 < dp[a]:\n dp[a] = dp[a - coin] + 1\n\n return dp[amount] if dp[amount] != float('inf') else -1\n float('inf') \u521d\u59cb\u5316\uff08\u800c\u4e0d\u662f 0 \u6216 -1\uff09\u3002\u6700\u5c0f\u6bd4\u8f83\u53ea\u6709\u5728\u4e0d\u53ef\u8fbe\u72b6\u6001\u4e3a\u65e0\u7a77\u5927\u65f6\u624d\u6709\u6548\u3002\u95ee\u9898\uff1a\u7ed9\u5b9a\u4e24\u4e2a\u5b57\u7b26\u4e32\uff0c\u627e\u51fa\u5b83\u4eec\u7684\u6700\u957f\u516c\u5171\u5b50\u5e8f\u5217\u7684\u957f\u5ea6\u3002
\u72b6\u6001\uff1adp[i][j] = text1[:i] \u548c text2[:j] \u7684 LCS\u3002
text1[i-1] == text2[j-1]\uff0c\u5219 dp[i][j] = dp[i-1][j-1] + 1\u3002\u5426\u5219\uff0cdp[i][j] = max(dp[i-1][j], dp[i][j-1])\u3002def longest_common_subsequence(text1, text2):\n m, n = len(text1), len(text2)\n dp = [[0] * (n + 1) for _ in range(m + 1)]\n\n for i in range(1, m + 1):\n for j in range(1, n + 1):\n if text1[i - 1] == text2[j - 1]:\n dp[i][j] = dp[i - 1][j - 1] + 1\n else:\n dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])\n\n return dp[m][n]\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/05.%20sorting%20and%20search/#01","title":"\u56f0\u96be\uff1a0/1 \u80cc\u5305","text":"\u95ee\u9898\uff1a\u7ed9\u5b9a\u5177\u6709\u91cd\u91cf\u548c\u4ef7\u503c\u7684\u7269\u54c1\uff0c\u4ee5\u53ca\u5bb9\u91cf \\(W\\)\uff0c\u5728\u4e0d\u8d85\u51fa \\(W\\) \u7684\u60c5\u51b5\u4e0b\u6700\u5927\u5316\u603b\u4ef7\u503c\u3002
\u72b6\u6001\uff1adp[i][w] = \u4f7f\u7528\u524d \\(i\\) \u4e2a\u7269\u54c1\u5728\u5bb9\u91cf \\(w\\) \u4e0b\u7684\u6700\u5927\u4ef7\u503c\u3002
dp[i][w] = max(dp[i-1][w], dp[i-1][w - weight[i]] + value[i])\uff08\u8df3\u8fc7\u6216\u53d6\u7528\u7269\u54c1 \\(i\\)\uff09\u3002def knapsack(weights, values, capacity):\n n = len(weights)\n dp = [[0] * (capacity + 1) for _ in range(n + 1)]\n\n for i in range(1, n + 1):\n for w in range(capacity + 1):\n dp[i][w] = dp[i - 1][w] # \u8df3\u8fc7\u7269\u54c1 i\n if weights[i - 1] <= w:\n dp[i][w] = max(dp[i][w],\n dp[i - 1][w - weights[i - 1]] + values[i - 1])\n\n return dp[n][capacity]\n def knapsack_optimised(weights, values, capacity):\n dp = [0] * (capacity + 1)\n for i in range(len(weights)):\n for w in range(capacity, weights[i] - 1, -1): # \u4ece\u53f3\u5411\u5de6\uff01\n dp[w] = max(dp[w], dp[w - weights[i]] + values[i])\n return dp[capacity]\n \u56de\u6eaf\u662f\u5e26\u526a\u679d\u7684\u7a77\u4e3e\u641c\u7d22\u3002\u9010\u6b65\u6784\u5efa\u89e3\uff0c\u4e00\u65e6\u90e8\u5206\u89e3\u4e0d\u53ef\u80fd\u5bfc\u81f4\u5b8c\u6574\u7684\u6709\u6548\u89e3\uff0c\u5c31\u7acb\u5373\u653e\u5f03\uff08\u56de\u6eaf\uff09\u3002
\u6a21\u677f\uff1a
def backtrack(candidates, path, result):\n if is_solution(path):\n result.append(path[:]) # \u590d\u5236\uff01\n return\n\n for candidate in get_candidates(path):\n if is_valid(candidate, path):\n path.append(candidate) # \u9009\u62e9\n backtrack(candidates, path, result) # \u63a2\u7d22\n path.pop() # \u64a4\u9500\uff08\u56de\u6eaf\uff09\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/05.%20sorting%20and%20search/#_19","title":"\u4e2d\u7b49\uff1a\u5b50\u96c6","text":"def subsets(nums):\n result = []\n def backtrack(start, path):\n result.append(path[:])\n for i in range(start, len(nums)):\n path.append(nums[i])\n backtrack(i + 1, path)\n path.pop()\n backtrack(0, [])\n return result\n"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/05.%20sorting%20and%20search/#_20","title":"\u4e2d\u7b49\uff1a\u7ec4\u5408\u603b\u548c","text":"def combination_sum(candidates, target):\n result = []\n def backtrack(start, path, remaining):\n if remaining == 0:\n result.append(path[:])\n return\n for i in range(start, len(candidates)):\n if candidates[i] > remaining:\n break # \u526a\u679d\uff1a\u5df2\u6392\u5e8f\uff0c\u540e\u7eed\u5019\u9009\u90fd\u592a\u5927\n path.append(candidates[i])\n backtrack(i, path, remaining - candidates[i]) # i \u800c\u4e0d\u662f i+1\uff1a\u5141\u8bb8\u91cd\u590d\u4f7f\u7528\n path.pop()\n\n candidates.sort() # \u6392\u5e8f\u4ee5\u4fbf\u526a\u679d\n backtrack(0, [], target)\n return result\n backtrack(i, ...) \u5141\u8bb8\u91cd\u590d\u4f7f\u7528\u540c\u4e00\u5143\u7d20\u3002backtrack(i + 1, ...) \u4f1a\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5143\u7d20\uff08\u4e0d\u53ef\u91cd\u590d\u4f7f\u7528\uff09\u3002\u641e\u9519\u8fd9\u4e2a\u662f\u6700\u5e38\u89c1\u7684\u56de\u6eaf bug\u3002def solve_n_queens(n):\n result = []\n cols = set()\n pos_diag = set() # (row + col) \u5728 / \u5bf9\u89d2\u7ebf\u4e0a\u4e3a\u5e38\u6570\n neg_diag = set() # (row - col) \u5728 \\ \u5bf9\u89d2\u7ebf\u4e0a\u4e3a\u5e38\u6570\n\n board = [['.' ] * n for _ in range(n)]\n\n def backtrack(row):\n if row == n:\n result.append([''.join(r) for r in board])\n return\n\n for col in range(n):\n if col in cols or (row + col) in pos_diag or (row - col) in neg_diag:\n continue\n\n cols.add(col)\n pos_diag.add(row + col)\n neg_diag.add(row - col)\n board[row][col] = 'Q'\n\n backtrack(row + 1)\n\n cols.remove(col)\n pos_diag.remove(row + col)\n neg_diag.remove(row - col)\n board[row][col] = '.'\n\n backtrack(0)\n return result\n / \u5bf9\u89d2\u7ebf\uff0crow + col \u662f\u5e38\u6570\u3002\u5bf9\u4e8e \\ \u5bf9\u89d2\u7ebf\uff0crow - col \u662f\u5e38\u6570\u3002\u4f7f\u7528\u96c6\u5408\u8ddf\u8e2a\u5217\u548c\u5bf9\u89d2\u7ebf\u4f7f\u5f97\u6709\u6548\u6027\u68c0\u67e5\u53d8\u4e3a \\(O(1)\\)\u3002lo <= hi vs lo < hi \u8fb9\u754c\u5dee\u4e00\u9519\u8bef \u6839\u636e hi \u662f\u5305\u542b\u8fd8\u662f\u6392\u9664\u6765\u9009\u62e9 \u4ece\u5de6\u5230\u53f3\u7684\u4e00\u7ef4\u80cc\u5305 \u7269\u54c1\u88ab\u591a\u6b21\u4f7f\u7528 0/1 \u80cc\u5305\u4ece\u53f3\u5411\u5de6\u8fed\u4ee3 \u56de\u6eaf\u4e2d\u672a\u590d\u5236\u8def\u5f84 result.append(path) \u2014 \u6240\u6709\u6761\u76ee\u6307\u5411\u540c\u4e00\u5217\u8868 result.append(path[:]) \u6216 path.copy() backtrack(i) vs backtrack(i+1) \u91cd\u590d\u4f7f\u7528 vs \u4e0d\u91cd\u590d\u4f7f\u7528\u5143\u7d20 \u5339\u914d\u95ee\u9898\u8981\u6c42 \u6392\u5e8f\u540e\u7684\u56de\u6eaf\u4e2d\u7f3a\u5c11 break \u63a2\u7d22\u8fc7\u5927\u7684\u5019\u9009 \u6392\u5e8f + \u5019\u9009\u8d85\u8fc7\u5269\u4f59\u65f6 break DP \u521d\u59cb\u5316 dp[0] \u9519\u8bef \u2192 \u6240\u6709\u540e\u7eed\u503c\u90fd\u9519 \u4ed4\u7ec6\u5b9a\u4e49\u57fa\u672c\u60c5\u51b5 \u672a\u7ecf\u8bc1\u660e\u7684\u8d2a\u5fc3 \u8d2a\u5fc3\u5e76\u4e0d\u603b\u662f\u6709\u6548 \u9a8c\u8bc1\u8d2a\u5fc3\u9009\u62e9\u6027\u8d28 \u591a\u952e\u6392\u5e8f\u65f6\u4e0d\u7a33\u5b9a \u76f8\u7b49\u5143\u7d20\u7684\u76f8\u5bf9\u987a\u5e8f\u4e22\u5931 \u4f7f\u7528\u7a33\u5b9a\u6392\u5e8f\uff08\u5f52\u5e76\u6392\u5e8f\u3001Python \u7684 sorted\uff09"},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/05.%20sorting%20and%20search/#neetcode","title":"\u8bfe\u540e\u7ec3\u4e60\u9898\uff08NeetCode\uff09","text":""},{"location":"chapter%2014%3A%20data%20structures%20and%20algorithms/05.%20sorting%20and%20search/#_22","title":"\u4e8c\u5206\u67e5\u627e","text":"\u547d\u4ee4\u884c\u662f\u673a\u5668\u5b66\u4e60\u5de5\u7a0b\u7684\u4e3b\u8981\u754c\u9762\uff1a\u8bad\u7ec3\u4efb\u52a1\u3001\u670d\u52a1\u5668\u7ba1\u7406\u3001\u6570\u636e\u7ba1\u9053\u548c\u96c6\u7fa4\u7ba1\u7406\u90fd\u901a\u8fc7\u7ec8\u7aef\u8fdb\u884c\u3002\u672c\u6587\u6db5\u76d6 Shell\u3001\u6587\u4ef6\u7cfb\u7edf\u3001\u6743\u9650\u3001\u8fdb\u7a0b\u7ba1\u7406\u3001\u5305\u7ba1\u7406\u5668\u3001\u73af\u5883\u53d8\u91cf\u3001SSH \u4ee5\u53ca\u6bcf\u4f4d\u673a\u5668\u5b66\u4e60\u5de5\u7a0b\u5e08\u65e5\u5e38\u4f7f\u7528\u7684\u57fa\u672c\u547d\u4ee4\u3002
GUI \u9002\u5408\u6d4f\u89c8\u7f51\u9875\uff0c\u4f46\u5728\u51cc\u6668 2 \u70b9\u5728\u8fdc\u7a0b GPU \u96c6\u7fa4\u4e0a\u8fd0\u884c\u8bad\u7ec3\u4efb\u52a1\u65f6\u5374\u5f88\u7cdf\u7cd5\u3002\u547d\u4ee4\u884c\uff08\u6216\u7ec8\u7aef\u3001Shell\uff09\u662f\u80fd\u591f\u6269\u5c55\u7684\u5de5\u5177\uff1a\u5b83\u5728\u4efb\u4f55\u673a\u5668\u4e0a\u90fd\u80fd\u5de5\u4f5c\uff0c\u53ef\u7f16\u5199\u811a\u672c\uff0c\u53ef\u7ec4\u5408\uff0c\u5e76\u4e14\u5728\u4f60\u7684\u7b14\u8bb0\u672c\u7535\u8111\u3001\u4e91 VM \u548c HPC \u96c6\u7fa4\u4e0a\u5b8c\u5168\u76f8\u540c\u3002
\u5982\u679c\u4f60\u662f\u4e00\u540d\u53ea\u4f7f\u7528 Jupyter notebook \u548c VS Code \u6309\u94ae\u7684\u673a\u5668\u5b66\u4e60\u5de5\u7a0b\u5e08\uff0c\u4f60\u6b63\u5728\u6d6a\u8d39\u5de8\u5927\u7684\u751f\u4ea7\u529b\u3002\u6bcf\u4e2a\u751f\u4ea7\u7ea7\u673a\u5668\u5b66\u4e60\u7cfb\u7edf\u90fd\u662f\u901a\u8fc7\u547d\u4ee4\u884c\u8fdb\u884c\u90e8\u7f72\u3001\u76d1\u63a7\u548c\u8c03\u8bd5\u7684\u3002
Shell \u662f\u4e00\u4e2a\u8bfb\u53d6\u4f60\u7684\u547d\u4ee4\u5e76\u6267\u884c\u5b83\u4eec\u7684\u7a0b\u5e8f\u3002\u5b83\u662f\u4f60\u548c\u64cd\u4f5c\u7cfb\u7edf\u4e4b\u95f4\u7684\u4e2d\u4ecb\uff08\u7b2c 13 \u7ae0\uff09\u3002\u6700\u5e38\u89c1\u7684 Shell \u662f bash\uff08\u5927\u591a\u6570 Linux \u7cfb\u7edf\u7684\u9ed8\u8ba4 Shell\uff09\u548c zsh\uff08macOS \u7684\u9ed8\u8ba4 Shell\uff09\u3002
\u547d\u4ee4\u7684\u683c\u5f0f\u4e3a\uff1acommand [options] [arguments]
ls -la /home/user # \u547d\u4ee4=ls, \u9009\u9879=-la, \u53c2\u6570=/home/user\n - \u8868\u793a\u77ed\u9009\u9879\uff0c-- \u8868\u793a\u957f\u9009\u9879\uff09\u3002ls -l \u4ee5\u957f\u683c\u5f0f\u5217\u51fa\uff0cls --all \u663e\u793a\u9690\u85cf\u6587\u4ef6\u3002\u8bb8\u591a\u9009\u9879\u53ef\u4ee5\u7ec4\u5408\uff1als -la \u8868\u793a\u5c06 -l \u548c -a \u4e00\u8d77\u4f7f\u7528\u3002pwd # \u6253\u5370\u5f53\u524d\u5de5\u4f5c\u76ee\u5f55\uff08\u6211\u5728\u54ea\uff1f\uff09\nls # \u5217\u51fa\u5f53\u524d\u76ee\u5f55\u4e2d\u7684\u6587\u4ef6\nls -la # \u5217\u51fa\u6240\u6709\u6587\u4ef6\uff08\u5305\u62ec\u9690\u85cf\u6587\u4ef6\uff09\u53ca\u8be6\u7ec6\u4fe1\u606f\ncd /path/to/dir # \u5207\u6362\u76ee\u5f55\ncd .. # \u8fd4\u56de\u4e0a\u4e00\u7ea7\ncd ~ # \u8fd4\u56de\u7528\u6237\u4e3b\u76ee\u5f55\ncd - # \u8fd4\u56de\u4e0a\u4e00\u4e2a\u76ee\u5f55\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/01.%20linux%20and%20CMD/#_2","title":"\u6587\u4ef6\u64cd\u4f5c","text":"cp source dest # \u590d\u5236\u6587\u4ef6\ncp -r dir1 dir2 # \u9012\u5f52\u590d\u5236\u76ee\u5f55\nmv old new # \u79fb\u52a8/\u91cd\u547d\u540d\u6587\u4ef6\nrm file # \u5220\u9664\u6587\u4ef6\uff08\u6ca1\u6709\u56de\u6536\u7ad9\u2014\u2014\u6c38\u4e45\u5220\u9664\uff09\nrm -rf dir # \u9012\u5f52\u5220\u9664\u76ee\u5f55\uff08\u5371\u9669\u2014\u2014\u65e0\u786e\u8ba4\uff09\nmkdir -p a/b/c # \u521b\u5efa\u5d4c\u5957\u76ee\u5f55\ntouch file.txt # \u521b\u5efa\u7a7a\u6587\u4ef6\uff08\u6216\u66f4\u65b0\u65f6\u95f4\u6233\uff09\ncat file.txt # \u6253\u5370\u6587\u4ef6\u5185\u5bb9\nhead -n 20 file # \u663e\u793a\u524d 20 \u884c\ntail -f logfile # \u5b9e\u65f6\u8ddf\u8e2a\u65e5\u5fd7\u6587\u4ef6\uff08\u76d1\u63a7\u8bad\u7ec3\u65f6\u975e\u5e38\u6709\u7528\uff09\n rm -rf \u662f\u8ba1\u7b97\u4e2d\u6700\u5371\u9669\u7684\u547d\u4ee4\u3002\u6ca1\u6709\u64a4\u9500\u64cd\u4f5c\u3002\u6309\u56de\u8f66\u524d\u8bf7\u4e09\u6b21\u68c0\u67e5\u8def\u5f84\u3002\u5207\u52ff\u8fd0\u884c rm -rf / \u6216 rm -rf ~\u3002Shell \u7684\u6740\u624b\u7ea7\u7279\u6027\u662f\u53ef\u7ec4\u5408\u6027\uff1a\u5c06\u5c0f\u547d\u4ee4\u8fde\u63a5\u8d77\u6765\u5b8c\u6210\u590d\u6742\u4efb\u52a1\u3002
\u7ba1\u9053\uff08|\uff09\uff1a\u5c06\u4e00\u4e2a\u547d\u4ee4\u7684\u8f93\u51fa\u4f5c\u4e3a\u4e0b\u4e00\u4e2a\u547d\u4ee4\u7684\u8f93\u5165\u3002
cat training.log | grep \"loss\" | tail -5 # \u6700\u540e5\u884c\u5305\u542b\"loss\"\u7684\u5185\u5bb9\nps aux | grep python # \u67e5\u627e\u6b63\u5728\u8fd0\u884c\u7684 Python \u8fdb\u7a0b\nhistory | grep \"docker\" # \u67e5\u627e\u4e4b\u524d\u7684 docker \u547d\u4ee4\n python train.py > output.log 2>&1 # stdout \u548c stderr \u90fd\u8f93\u51fa\u5230\u6587\u4ef6\npython train.py >> output.log # \u8ffd\u52a0\uff08\u4e0d\u8986\u76d6\uff09\necho \"data\" > file.txt # \u8986\u76d6\u6587\u4ef6\necho \"more\" >> file.txt # \u8ffd\u52a0\u5230\u6587\u4ef6\n 2>&1 \u5c06 stderr\uff08\u6587\u4ef6\u63cf\u8ff0\u7b26 2\uff09\u91cd\u5b9a\u5411\u5230 stdout\uff08\u6587\u4ef6\u63cf\u8ff0\u7b26 1\uff09\u3002\u6ca1\u6709\u5b83\uff0c\u9519\u8bef\u6d88\u606f\u4ecd\u4f1a\u51fa\u73b0\u5728\u5c4f\u5e55\u4e0a\uff0c\u53ea\u6709\u6b63\u5e38\u8f93\u51fa\u4f1a\u8fdb\u5165\u6587\u4ef6\u3002grep \"error\" logfile.txt # \u67e5\u627e\u5305\u542b\"error\"\u7684\u884c\ngrep -r \"import torch\" src/ # \u9012\u5f52\u641c\u7d22\u76ee\u5f55\ngrep -i \"warning\" log.txt # \u4e0d\u533a\u5206\u5927\u5c0f\u5199\u641c\u7d22\ngrep -c \"epoch\" train.log # \u7edf\u8ba1\u5339\u914d\u884c\u6570\n\nwc -l file.txt # \u7edf\u8ba1\u884c\u6570\nwc -w file.txt # \u7edf\u8ba1\u5355\u8bcd\u6570\n\nsort data.txt # \u6309\u5b57\u6bcd\u987a\u5e8f\u6392\u5e8f\nsort -n numbers.txt # \u6309\u6570\u503c\u6392\u5e8f\nsort -u data.txt # \u6392\u5e8f\u5e76\u53bb\u91cd\nuniq -c sorted.txt # \u7edf\u8ba1\u8fde\u7eed\u91cd\u590d\u9879\n\ncut -d',' -f2,3 data.csv # \u63d0\u53d6 CSV \u7684\u7b2c 2 \u548c\u7b2c 3 \u5217\nawk '{print $1, $3}' data.txt # \u6253\u5370\u7b2c 1 \u548c\u7b2c 3 \u4e2a\u7a7a\u767d\u5206\u9694\u5b57\u6bb5\nsed 's/old/new/g' file.txt # \u5c06\u6240\u6709\"old\"\u66ff\u6362\u4e3a\"new\"\n # \u67e5\u627e\u65e5\u5fd7\u6587\u4ef6\u4e2d\u6700\u5e38\u89c1\u7684 10 \u79cd\u9519\u8bef\u7c7b\u578b\ngrep \"ERROR\" app.log | awk -F': ' '{print $2}' | sort | uniq -c | sort -rn | head -10\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/01.%20linux%20and%20CMD/#_5","title":"\u67e5\u627e\u6587\u4ef6","text":"find . -name \"*.py\" # \u67e5\u627e\u6240\u6709 Python \u6587\u4ef6\nfind . -name \"*.pyc\" -delete # \u67e5\u627e\u5e76\u5220\u9664\u7f16\u8bd1\u540e\u7684 Python \u6587\u4ef6\nfind /data -size +100M # \u67e5\u627e\u5927\u4e8e 100MB \u7684\u6587\u4ef6\nfind . -mtime -1 # \u67e5\u627e\u8fc7\u53bb 24 \u5c0f\u65f6\u5185\u4fee\u6539\u8fc7\u7684\u6587\u4ef6\n\nwhich python # python \u53ef\u6267\u884c\u6587\u4ef6\u5728\u54ea\uff1f\nlocate filename # \u5feb\u901f\u67e5\u627e\u6587\u4ef6\uff08\u4f7f\u7528\u9884\u6784\u5efa\u7d22\u5f15\uff09\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/01.%20linux%20and%20CMD/#_6","title":"\u6587\u4ef6\u7cfb\u7edf\u5c42\u6b21\u7ed3\u6784","text":"/ \u4e3a\u6839\u7684\u5355\u68f5\u6811\u4e2d\uff1a/ \u6574\u4e2a\u6587\u4ef6\u7cfb\u7edf\u7684\u6839 /home/user \u4f60\u7684\u4e2a\u4eba\u6587\u4ef6\u3001\u914d\u7f6e\u3001\u9879\u76ee /etc \u7cfb\u7edf\u7ea7\u914d\u7f6e\u6587\u4ef6 /usr \u7528\u6237\u7a0b\u5e8f\u3001\u5e93\u3001\u6587\u6863 /usr/local \u672c\u5730\u5b89\u88c5\u7684\u8f6f\u4ef6\uff08\u975e\u5305\u7ba1\u7406\u5668\u5b89\u88c5\uff09 /var \u53ef\u53d8\u6570\u636e\uff1a\u65e5\u5fd7\uff08/var/log\uff09\u3001\u6570\u636e\u5e93\u3001\u7f13\u5b58 /tmp \u4e34\u65f6\u6587\u4ef6\uff08\u91cd\u542f\u540e\u6e05\u9664\uff09 /opt \u53ef\u9009\u7684\u7b2c\u4e09\u65b9\u8f6f\u4ef6 /proc \u66b4\u9732\u5185\u6838\u548c\u8fdb\u7a0b\u4fe1\u606f\u7684\u865a\u62df\u6587\u4ef6\u7cfb\u7edf /dev \u8bbe\u5907\u6587\u4ef6\uff08\u78c1\u76d8\u3001GPU \u5728\u8fd9\u91cc\u663e\u793a\uff09 /data \u6216 /home/user/data\uff0c\u6a21\u578b\u5728 /home/user/models\uff0cCUDA \u5728 /usr/local/cuda\u3002GPU \u8bbe\u5907\u663e\u793a\u4e3a /dev/nvidia0\u3001/dev/nvidia1 \u7b49\u3002ls -l script.py\n# -rwxr-xr-- 1 henry ml_team 2048 Mar 28 script.py\n# ^^^ \u6240\u6709\u8005\u6743\u9650\uff1arwx\uff08\u8bfb\u3001\u5199\u3001\u6267\u884c\uff09\n# ^^^ \u7ec4\u6743\u9650\uff1ar-x\uff08\u8bfb\u3001\u6267\u884c\uff0c\u4e0d\u53ef\u5199\uff09\n# ^^^ \u5176\u4ed6\u4eba\u6743\u9650\uff1ar--\uff08\u53ea\u8bfb\uff09\n chmod 755 script.py # owner=rwx, group=rx, others=rx\nchmod +x script.py # \u4e3a\u6240\u6709\u4eba\u6dfb\u52a0\u6267\u884c\u6743\u9650\nchmod u+w,g-w file.txt # \u4e3a\u6240\u6709\u8005\u6dfb\u52a0\u5199\u6743\u9650\uff0c\u79fb\u9664\u7ec4\u7684\u5199\u6743\u9650\nchown henry:ml_team file # \u66f4\u6539\u6240\u6709\u8005\u548c\u7ec4\n #!/usr/bin/env python3 \u7684 Python \u811a\u672c\u9700\u8981\u6267\u884c\u6743\u9650\uff08chmod +x\uff09\u624d\u80fd\u4ee5 ./script.py \u65b9\u5f0f\u8fd0\u884c\u3002\u6ca1\u6709\u5b83\uff0c\u4f60\u5fc5\u987b\u4f7f\u7528 python3 script.py\u3002ps aux # \u5217\u51fa\u6240\u6709\u6b63\u5728\u8fd0\u884c\u7684\u8fdb\u7a0b\nps aux | grep python # \u67e5\u627e Python \u8fdb\u7a0b\ntop # \u5b9e\u65f6\u8fdb\u7a0b\u76d1\u63a7\uff08CPU\u3001\u5185\u5b58\uff09\nhtop # top \u7684\u589e\u5f3a\u7248\uff08\u9700\u5355\u72ec\u5b89\u88c5\uff09\nnvidia-smi # GPU \u4f7f\u7528\u60c5\u51b5\uff08\u673a\u5668\u5b66\u4e60\u5fc5\u5907\uff09\nwatch -n 1 nvidia-smi # \u6bcf\u79d2\u5237\u65b0 nvidia-smi\n\nkill PID # \u4f18\u96c5\u7ec8\u6b62\u8fdb\u7a0b\nkill -9 PID # \u5f3a\u5236\u7ec8\u6b62\uff08\u4f18\u96c5\u65b9\u5f0f\u5931\u8d25\u65f6\u4f7f\u7528\uff09\nkillall python # \u7ec8\u6b62\u6240\u6709 Python \u8fdb\u7a0b\n\n# \u540e\u53f0\u8fd0\u884c\npython train.py & # \u540e\u53f0\u8fd0\u884c\nnohup python train.py > log.txt & # \u540e\u53f0\u8fd0\u884c\uff0c\u9000\u51fa\u767b\u5f55\u540e\u4ecd\u5b58\u6d3b\n nohup \u5bf9\u673a\u5668\u5b66\u4e60\u8bad\u7ec3\u81f3\u5173\u91cd\u8981\uff1a\u6ca1\u6709\u5b83\uff0c\u5173\u95ed SSH \u8fde\u63a5\u4f1a\u7ec8\u6b62\u8bad\u7ec3\u4efb\u52a1\u3002nohup \u5c06\u8fdb\u7a0b\u4ece\u7ec8\u7aef\u5206\u79bb\u51fa\u6765\u3002
screen \u548c tmux \u662f\u7ec8\u7aef\u590d\u7528\u5668\uff0c\u53ef\u4ee5\u521b\u5efa\u6301\u4e45\u4f1a\u8bdd\u3002\u4f60\u53ef\u4ee5\u5728 tmux \u4f1a\u8bdd\u4e2d\u542f\u52a8\u8bad\u7ec3\u4efb\u52a1\uff0c\u65ad\u5f00 SSH \u8fde\u63a5\uff0c\u7a0d\u540e\u91cd\u65b0\u8fde\u63a5\uff0c\u4f1a\u8bdd\uff08\u548c\u8bad\u7ec3\uff09\u4ecd\u5728\u8fd0\u884c\u3002
tmux new -s training # \u521b\u5efa\u547d\u540d\u4f1a\u8bdd\n# ... \u5f00\u59cb\u8bad\u7ec3 ...\n# Ctrl+B, \u7136\u540e D # \u4ece\u4f1a\u8bdd\u5206\u79bb\ntmux attach -t training # \u7a0d\u540e\u91cd\u65b0\u8fde\u63a5\uff08\u5373\u4f7f SSH \u91cd\u65b0\u8fde\u63a5\u540e\u4e5f\u53ef\u7528\uff09\ntmux ls # \u5217\u51fa\u4f1a\u8bdd\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/01.%20linux%20and%20CMD/#_9","title":"\u5305\u7ba1\u7406\u5668","text":"# Debian/Ubuntu\nsudo apt update # \u5237\u65b0\u5305\u5217\u8868\nsudo apt install htop # \u5b89\u88c5\u5305\nsudo apt upgrade # \u5347\u7ea7\u6240\u6709\u5305\n\n# macOS\nbrew install wget # \u901a\u8fc7 Homebrew \u5b89\u88c5\n pip install torch # \u4ece PyPI \u5b89\u88c5\npip install -e . # \u4ee5\u53ef\u7f16\u8f91\u6a21\u5f0f\u5b89\u88c5\u5f53\u524d\u9879\u76ee\npip install -r requirements.txt # \u4ece requirements \u6587\u4ef6\u5b89\u88c5\npip freeze > requirements.txt # \u5bfc\u51fa\u5df2\u5b89\u88c5\u7684\u5305\n\n# Conda\uff08\u7528\u4e8e\u590d\u6742\u4f9d\u8d56\uff0c\u5982 CUDA\uff09\nconda create -n myenv python=3.11\nconda activate myenv\nconda install pytorch torchvision cudatoolkit=12.1 -c pytorch\n pip install \u5b89\u88c5\u5230\u7cfb\u7edf Python \u4e2d\u3002\u59cb\u7ec8\u4f7f\u7528\u865a\u62df\u73af\u5883\uff08python -m venv env\u3001conda create \u6216 uv venv\uff09\u3002\u7cfb\u7edf Python \u88ab\u64cd\u4f5c\u7cfb\u7edf\u5de5\u5177\u5171\u4eab\uff1b\u7834\u574f\u5b83\u53ef\u80fd\u5bfc\u81f4\u7cfb\u7edf\u5d29\u6e83\u3002export CUDA_VISIBLE_DEVICES=0,1 # \u4ec5\u4f7f\u7528 GPU 0 \u548c 1\nexport PYTHONPATH=/home/user/src # \u6dfb\u52a0\u5230 Python \u7684\u5bfc\u5165\u8def\u5f84\nexport WANDB_API_KEY=abc123 # Weights & Biases \u7684 API \u5bc6\u94a5\n\necho $PATH # \u67e5\u770b\u5f53\u524d PATH\nexport PATH=$PATH:/usr/local/cuda/bin # \u5c06 CUDA \u6dfb\u52a0\u5230 PATH\n .bashrc\uff08\u6216 .zshrc\uff09\uff1a\u6bcf\u6b21\u6253\u5f00 Shell \u65f6\u8fd0\u884c\u7684\u547d\u4ee4\u3002\u628a\u4f60\u7684 export \u8bed\u53e5\u653e\u5728\u8fd9\u91cc\uff0c\u8fd9\u6837\u5b83\u4eec\u5c31\u4f1a\u6301\u4e45\u5b58\u5728\u3002
.env \u6587\u4ef6\uff1a\u7531 python-dotenv \u7b49\u5de5\u5177\u52a0\u8f7d\u7684\u9879\u76ee\u7279\u5b9a\u53d8\u91cf\u3002\u5c06\u5bc6\u94a5\uff08API \u5bc6\u94a5\u3001\u6570\u636e\u5e93\u5bc6\u7801\uff09\u4fdd\u5b58\u5728 .env \u4e2d\uff0c\u5e76\u5c06 .env \u6dfb\u52a0\u5230 .gitignore\u3002\u5207\u52ff\u5c06\u5bc6\u94a5\u63d0\u4ea4\u5230 Git\u3002
ssh user@hostname # \u8fde\u63a5\u5230\u8fdc\u7a0b\u673a\u5668\nssh -i ~/.ssh/key.pem user@ip # \u4f7f\u7528\u7279\u5b9a\u5bc6\u94a5\u8fde\u63a5\nssh -L 8888:localhost:8888 user@server # \u7aef\u53e3\u8f6c\u53d1\uff08\u8fdc\u7a0b Jupyter\uff09\n ssh-keygen -t ed25519 # \u751f\u6210\u5bc6\u94a5\u5bf9\nssh-copy-id user@server # \u5c06\u516c\u94a5\u590d\u5236\u5230\u670d\u52a1\u5668\n# \u73b0\u5728\u65e0\u9700\u8f93\u5165\u5bc6\u7801\u5373\u53ef SSH\n ~/.ssh/config\uff09\u4fdd\u5b58\u8fde\u63a5\u8be6\u60c5\uff1aHost gpu-server\n HostName 10.0.1.42\n User henry\n IdentityFile ~/.ssh/gpu_key\n LocalForward 8888 localhost:8888\n \u73b0\u5728\u8f93\u5165 ssh gpu-server \u5373\u53ef\u81ea\u52a8\u4f7f\u7528\u6240\u6709\u8fd9\u4e9b\u8bbe\u7f6e\u8fdb\u884c\u8fde\u63a5\u3002
scp \u548c rsync \u5728\u673a\u5668\u4e4b\u95f4\u4f20\u8f93\u6587\u4ef6\uff1a
scp model.pt user@server:/data/models/ # \u5c06\u6587\u4ef6\u590d\u5236\u5230\u8fdc\u7a0b\nscp -r user@server:/data/results/ ./ # \u4ece\u8fdc\u7a0b\u590d\u5236\u76ee\u5f55\nrsync -avz --progress data/ user@server:/data/ # \u5e26\u8fdb\u5ea6\u540c\u6b65\uff08\u6bd4 scp \u66f4\u667a\u80fd\uff09\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/01.%20linux%20and%20CMD/#_11","title":"\u673a\u5668\u5b66\u4e60\u5fc5\u5907\u547d\u4ee4\u901f\u67e5\u8868","text":"# GPU \u76d1\u63a7\nnvidia-smi # GPU \u4f7f\u7528\u5feb\u7167\nwatch -n 1 nvidia-smi # \u5b9e\u65f6\u76d1\u63a7\ngpustat # \u66f4\u6e05\u6670\u7684 GPU \u6982\u89c8\uff08pip install gpustat\uff09\n\n# \u8bad\u7ec3\u7ba1\u7406\nnohup python train.py > train.log 2>&1 & # \u9000\u51fa\u767b\u5f55\u540e\u4ecd\u5b58\u6d3b\u7684\u540e\u53f0\u8bad\u7ec3\ntail -f train.log # \u76d1\u63a7\u8bad\u7ec3\u8f93\u51fa\nkill %1 # \u7ec8\u6b62\u6700\u540e\u4e00\u4e2a\u540e\u53f0\u4efb\u52a1\n\n# \u78c1\u76d8\u4f7f\u7528\uff08\u6570\u636e\u96c6\u5f88\u5927\uff09\ndf -h # \u6240\u6709\u6302\u8f7d\u70b9\u7684\u78c1\u76d8\u7a7a\u95f4\ndu -sh /data/* # /data \u4e2d\u6bcf\u4e2a\u9879\u76ee\u7684\u5927\u5c0f\ndu -sh --max-depth=1 . # \u5b50\u76ee\u5f55\u7684\u5927\u5c0f\n\n# \u5185\u5b58\nfree -h # RAM \u4f7f\u7528\u60c5\u51b5\ncat /proc/meminfo # \u8be6\u7ec6\u5185\u5b58\u4fe1\u606f\n\n# \u7f51\u7edc\ncurl -O https://example.com/dataset.tar.gz # \u4e0b\u8f7d\u6587\u4ef6\nwget https://example.com/model.bin # \u66ff\u4ee3\u4e0b\u8f7d\u5de5\u5177\ncurl -X POST http://localhost:8080/predict \\\n -H \"Content-Type: application/json\" \\\n -d '{\"text\": \"hello\"}' # \u6d4b\u8bd5\u6a21\u578b\u63a8\u7406\u7aef\u70b9\n\n# \u5f52\u6863\ntar -czf archive.tar.gz directory/ # \u538b\u7f29\ntar -xzf archive.tar.gz # \u89e3\u538b\nzip -r archive.zip directory/ # zip \u538b\u7f29\nunzip archive.zip # zip \u89e3\u538b\n\n# \u5feb\u901f\u6570\u636e\u68c0\u67e5\nhead -5 data.csv # CSV \u7684\u524d 5 \u884c\nwc -l data.csv # \u7edf\u8ba1\u884c\u6570\ncut -d',' -f1 data.csv | sort -u | wc -l # \u7edf\u8ba1\u7b2c 1 \u5217\u7684\u552f\u4e00\u503c\u6570\u91cf\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/02.%20git%20and%20repository%20management/","title":"Git \u4e0e\u7248\u672c\u63a7\u5236","text":"Git \u662f\u8f6f\u4ef6\u56e2\u961f\u5728\u4e0d\u76f8\u4e92\u8986\u76d6\u5de5\u4f5c\u7684\u60c5\u51b5\u4e0b\u8fdb\u884c\u534f\u4f5c\u7684\u65b9\u5f0f\u3002\u672c\u6587\u6db5\u76d6 Git \u7684\u5fc3\u667a\u6a21\u578b\u3001\u5206\u652f\u7b56\u7565\u3001\u5408\u5e76\u4e0e\u53d8\u57fa\u3001\u51b2\u7a81\u89e3\u51b3\u3001\u62c9\u53d6\u8bf7\u6c42\uff0c\u4ee5\u53ca\u7ba1\u7406\u673a\u5668\u5b66\u4e60\u7279\u5b9a\u6311\u6218\uff08\u5982\u5927\u6587\u4ef6\u548c\u5b9e\u9a8c\u8ffd\u8e2a\uff09\u7684\u65b9\u6cd5\u3002
\u6bcf\u4e2a\u4e25\u8083\u7684\u8f6f\u4ef6\u9879\u76ee\u90fd\u4f7f\u7528\u7248\u672c\u63a7\u5236\u3002Git \u662f\u4e3b\u5bfc\u7cfb\u7edf\uff0c\u51e0\u4e4e\u6240\u6709\u5f00\u6e90\u9879\u76ee\u548c\u516c\u53f8\u90fd\u5728\u4f7f\u7528\u3002\u6ca1\u6709 Git\uff0c\u534f\u4f5c\u5c31\u662f\u901a\u8fc7\u7535\u5b50\u90ae\u4ef6\u53d1\u9001 zip \u6587\u4ef6\u5e76\u7948\u7977\u6ca1\u4eba\u8986\u76d6\u4f60\u7684\u66f4\u6539\u3002\u6709\u4e86 Git\uff0c\u6bcf\u6b21\u66f4\u6539\u90fd\u53ef\u8ffd\u8e2a\u3001\u53ef\u64a4\u9500\u3001\u53ef\u8ffd\u6eaf\u3002
\u5bf9\u4e8e\u673a\u5668\u5b66\u4e60\u5de5\u7a0b\u5e08\uff1aGit \u8ffd\u8e2a\u4f60\u7684\u4ee3\u7801\u3001\u914d\u7f6e\u548c\u5b9e\u9a8c\u811a\u672c\u3002\u7ed3\u5408\u5b9e\u9a8c\u8ffd\u8e2a\u5de5\u5177\uff0c\u5b83\u80fd\u63d0\u4f9b\u53ef\u91cd\u73b0\u6027\uff1a\"\u662f\u54ea\u4e2a\u786e\u5207\u7684\u4ee3\u7801\u548c\u914d\u7f6e\u4ea7\u751f\u4e86\u8fd9\u4e2a\u6a21\u578b\uff1f\"
Git \u8ffd\u8e2a\u9879\u76ee\u7684\u5feb\u7167\u3002\u6bcf\u6b21\u63d0\u4ea4\u90fd\u662f\u90a3\u4e00\u523b\u6240\u6709\u8ffd\u8e2a\u6587\u4ef6\u7684\u5b8c\u6574\u5feb\u7167\uff0c\u800c\u4e0d\u662f\u5dee\u5f02\uff08\u5728\u5185\u90e8\uff0cGit \u4e3a\u6548\u7387\u5b58\u50a8\u5dee\u5f02\uff0c\u4f46\u4ece\u6982\u5ff5\u4e0a\u8bb2\uff0c\u6bcf\u6b21\u63d0\u4ea4\u90fd\u662f\u4e00\u4e2a\u5b8c\u6574\u72b6\u6001\uff09\u3002
\u6587\u4ef6\u7684\u56db\u4e2a\"\u4f4d\u7f6e\"\uff1a
git add \u5c06\u66f4\u6539\u79fb\u5230\u8fd9\u91cc\u3002.git/ \u4e2d\u3002git commit \u5c06\u6682\u5b58\u533a\u4fdd\u5b58\u4e3a\u65b0\u7684\u5feb\u7167\u3002git push \u4e0a\u4f20\u4f60\u7684\u63d0\u4ea4\uff0cgit pull \u4e0b\u8f7d\u4ed6\u4eba\u7684\u63d0\u4ea4\u3002Working Dir \u2192 git add \u2192 Staging \u2192 git commit \u2192 Local Repo \u2192 git push \u2192 Remote\n \u2190 git pull \u2190\n git init # \u521b\u5efa\u65b0\u4ed3\u5e93\ngit clone url # \u4e0b\u8f7d\u8fdc\u7a0b\u4ed3\u5e93\ngit status # \u6709\u4ec0\u4e48\u53d8\u5316\uff1f\uff08\u6700\u5e38\u7528\u7684\u547d\u4ee4\uff09\ngit add file.py # \u6682\u5b58\u7279\u5b9a\u6587\u4ef6\ngit add . # \u6682\u5b58\u6240\u6709\u66f4\u6539\uff08\u8c28\u614e\u4f7f\u7528\uff09\ngit commit -m \"descriptive msg\" # \u63d0\u4ea4\u6682\u5b58\u7684\u66f4\u6539\ngit push # \u5c06\u63d0\u4ea4\u4e0a\u4f20\u5230\u8fdc\u7a0b\ngit pull # \u4e0b\u8f7d\u5e76\u5408\u5e76\u8fdc\u7a0b\u66f4\u6539\ngit log --oneline # \u7d27\u51d1\u7684\u63d0\u4ea4\u5386\u53f2\ngit diff # \u663e\u793a\u672a\u6682\u5b58\u7684\u66f4\u6539\ngit diff --staged # \u663e\u793a\u5df2\u6682\u5b58\u7684\u66f4\u6539\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/02.%20git%20and%20repository%20management/#_3","title":"\u5206\u652f","text":"main\uff08\u6216 master\uff09\u3002\u521b\u5efa\u5206\u652f\u8ba9\u4f60\u62e5\u6709\u72ec\u7acb\u7684\u5f00\u53d1\u7ebf\uff1a\u4f60\u53ef\u4ee5\u5728\u4e0d\u5f71\u54cd main \u7684\u60c5\u51b5\u4e0b\u8fdb\u884c\u66f4\u6539\u3002git branch feature-x # \u521b\u5efa\u5206\u652f\ngit checkout feature-x # \u5207\u6362\u5230\u6b64\u5206\u652f\ngit checkout -b feature-x # \u521b\u5efa\u5e76\u5207\u6362\uff08\u4e00\u6b65\u5b8c\u6210\uff09\ngit branch -d feature-x # \u5220\u9664\u5206\u652f\uff08\u5408\u5e76\u540e\uff09\ngit branch -a # \u5217\u51fa\u6240\u6709\u5206\u652f\uff08\u672c\u5730 + \u8fdc\u7a0b\uff09\n main\u3002\u6bcf\u4e2a\u529f\u80fd\u3001\u9519\u8bef\u4fee\u590d\u6216\u5b9e\u9a8c\u90fd\u6709\u5176\u81ea\u5df1\u7684\u5206\u652f\u3002\u8fd9\u4fdd\u6301\u4e86 main \u7684\u7a33\u5b9a\u6027\u548c\u53ef\u90e8\u7f72\u6027\u3002\u529f\u80fd\u5206\u652f\uff08\u6700\u5e38\u89c1\uff09\uff1a\u6bcf\u4e2a\u529f\u80fd/\u4fee\u590d\u4ece main \u521b\u5efa\u4e00\u4e2a\u5206\u652f\u3002\u5b8c\u6210\u540e\uff0c\u6253\u5f00\u62c9\u53d6\u8bf7\u6c42\uff08PR\uff09\u4ee5\u5408\u5e76\u56de\u53bb\u3002\u7b80\u5355\uff0c\u9002\u7528\u4e8e\u5927\u591a\u6570\u56e2\u961f\u3002
\u4e3b\u5e72\u5f00\u53d1\uff1a\u5f00\u53d1\u4eba\u5458\u9891\u7e41\uff08\u6bcf\u5929\u591a\u6b21\uff09\u63d0\u4ea4\u5230 main\uff0c\u4f7f\u7528\u7279\u6027\u6807\u8bb0\u9690\u85cf\u672a\u5b8c\u6210\u7684\u5de5\u4f5c\u3002\u6301\u7eed\u90e8\u7f72\u7684\u56e2\u961f\uff08Google\u3001Facebook\uff09\u66f4\u504f\u597d\u8fd9\u79cd\u65b9\u5f0f\u3002\u9700\u8981\u4f18\u79c0\u7684 CI/CD\u3002
Gitflow\uff1a\u4e3a\u529f\u80fd\u3001\u53d1\u5e03\u548c\u70ed\u4fee\u590d\u8bbe\u7f6e\u5355\u72ec\u7684\u5206\u652f\u3002\u66f4\u590d\u6742\uff0c\u9002\u7528\u4e8e\u6709\u7248\u672c\u5316\u53d1\u5e03\u7684\u8f6f\u4ef6\uff08\u79fb\u52a8\u5e94\u7528\u3001\u6253\u5305\u8f6f\u4ef6\uff09\u3002\u5bf9\u5927\u591a\u6570\u673a\u5668\u5b66\u4e60\u9879\u76ee\u6765\u8bf4\u8fc7\u4e8e\u590d\u6742\u3002
\u5bf9\u4e8e\u673a\u5668\u5b66\u4e60\u56e2\u961f\uff1a\u529f\u80fd\u5206\u652f\u914d\u5408\u77ed\u751f\u547d\u5468\u671f\u7684\u5206\u652f\uff081-3 \u5929\u5185\u5408\u5e76\uff09\u662f\u6700\u4f73\u9009\u62e9\u3002\u751f\u547d\u5468\u671f\u957f\u7684\u5206\u652f\u4f1a\u4e0e main \u4ea7\u751f\u5206\u6b67\uff0c\u5bfc\u81f4\u75db\u82e6\u7684\u5408\u5e76\u51b2\u7a81\u3002
git checkout main\ngit merge feature-x\n \u8fd9\u4fdd\u7559\u4e86\u5b8c\u6574\u7684\u5386\u53f2\u8bb0\u5f55\uff1a\u4f60\u53ef\u4ee5\u770b\u5230\u5de5\u4f5c\u662f\u5728\u5206\u652f\u4e0a\u5b8c\u6210\u7684\uff0c\u4ee5\u53ca\u4f55\u65f6\u5408\u5e76\u7684\u3002\u5408\u5e76\u63d0\u4ea4\u6709\u4e24\u4e2a\u7236\u8282\u70b9\u3002
\u53d8\u57fa\u5728\u4f60\u7684\u5206\u652f\u4e0a\u91cd\u653e\u63d0\u4ea4\u5230\u76ee\u6807\u5206\u652f\u4e4b\u4e0a\uff1a
git checkout feature-x\ngit rebase main\n \u8fd9\u4f1a\u91cd\u5199\u5386\u53f2\uff1a\u4f60\u7684\u5206\u652f\u4e0a\u7684\u63d0\u4ea4\u4f1a\u83b7\u5f97\u65b0\u7684\u54c8\u5e0c\u503c\uff0c\u5c31\u597d\u50cf\u4f60\u662f\u4ece main \u7684\u5f53\u524d\u9876\u7aef\u5f00\u59cb\u5de5\u4f5c\u4e00\u6837\u3002\u7ed3\u679c\u662f\u7ebf\u6027\u7684\u5386\u53f2\u8bb0\u5f55\uff08\u6ca1\u6709\u5408\u5e76\u63d0\u4ea4\uff09\uff0c\u9605\u8bfb\u8d77\u6765\u66f4\u6e05\u6670\u3002
\u4f55\u65f6\u4f7f\u7528\u54ea\u79cd\uff1a
main \u66f4\u6539\u66f4\u65b0\u4f60\u7684\u529f\u80fd\u5206\u652f\uff08\u4fdd\u6301\u5206\u652f\u6574\u6d01\u548c\u6700\u65b0\uff09\u3002main\uff08\u4fdd\u7559\u5206\u652f\u5386\u53f2\uff09\u3002<<<<<<< HEAD\nlearning_rate = 0.001\n=======\nlearning_rate = 0.0005\n>>>>>>> feature-x\n <<<<<<< HEAD \u548c ======= \u4e4b\u95f4\u662f\u5f53\u524d\u5206\u652f\u7684\u7248\u672c\u3002======= \u548c >>>>>>> feature-x \u4e4b\u95f4\u662f\u4f20\u5165\u5206\u652f\u7684\u7248\u672c\u3002\u4f60\u51b3\u5b9a\u4fdd\u7559\u54ea\u4e2a\uff08\u6216\u7ec4\u5408\u5b83\u4eec\uff09\uff0c\u5220\u9664\u6807\u8bb0\uff0c\u4fdd\u5b58\uff0c\u7136\u540e\u8fd0\u884c git add \u6dfb\u52a0\u5df2\u89e3\u51b3\u7684\u6587\u4ef6\u3002
\u9677\u9631\uff1a\u4e0d\u8981\u5728\u5df2\u63d0\u4ea4\u7684\u6587\u4ef6\u4e2d\u7559\u4e0b\u51b2\u7a81\u6807\u8bb0\u3002\u5b83\u4eec\u662f\u4f1a\u7834\u574f\u4f60\u4ee3\u7801\u7684\u5b57\u9762\u6587\u672c\u3002\u89e3\u51b3\u540e\u59cb\u7ec8\u641c\u7d22 <<<<<<<\u3002
\u51cf\u5c11\u51b2\u7a81\uff1a\u4fdd\u6301\u5206\u652f\u77ed\u751f\u547d\u5468\u671f\uff0c\u9891\u7e41\u5c06 main \u5408\u5e76\u5230\u4f60\u7684\u5206\u652f\u4e2d\uff0c\u907f\u514d\u591a\u4eba\u540c\u65f6\u7f16\u8f91\u540c\u4e00\u4e2a\u6587\u4ef6\u3002
\u63d0\u4ea4\u4fe1\u606f\u662f\u4e3a\u4e86\u672a\u6765\u7684\u4f60\u548c\u4f60\u7684\u961f\u53cb\u3002\"\u4fee\u590d\u9519\u8bef\"\u544a\u8bc9\u4e0d\u4e86\u4f60\u4ec0\u4e48\u3002\"\u4fee\u590d\u6279\u6b21\u5927\u5c0f\u8ba1\u7b97\u4e2d\u7684\u5dee\u4e00\u9519\u8bef\uff0c\u8be5\u9519\u8bef\u5bfc\u81f4 8-GPU \u8bad\u7ec3\u65f6 OOM\"\u544a\u8bc9\u4f60\u4e00\u5207\u3002
\u683c\u5f0f\uff1a
\u7b80\u77ed\u6458\u8981\uff0850 \u5b57\u4ee5\u5185\uff0c\u7948\u4f7f\u8bed\u6c14\uff09\n\n\u5982\u679c\u9700\u8981\uff0c\u53ef\u9644\u5e26\u66f4\u957f\u7684\u63cf\u8ff0\u3002\u89e3\u91ca WHY\uff0c\u800c\u4e0d\u662f WHAT\n\uff08\u5dee\u5f02\u663e\u793a\u4e86\u4ec0\u4e48\u6539\u53d8\u4e86\uff09\u3002\u6bcf\u884c\u4e0d\u8d85\u8fc7 72 \u4e2a\u5b57\u7b26\u3002\n\nFixes #123\n \u7948\u4f7f\u8bed\u6c14\uff1a\"\u6dfb\u52a0\u529f\u80fd\"\u800c\u4e0d\u662f\"\u5df2\u6dfb\u52a0\u529f\u80fd\"\u6216\"\u6dfb\u52a0\u4e86\u529f\u80fd\"\u3002\u5c06\u5176\u89c6\u4e3a\u5b8c\u6210\u53e5\u5b50\uff1a\"\u5982\u679c\u5e94\u7528\u6b64\u63d0\u4ea4\uff0c\u5b83\u5c06\u6dfb\u52a0\u529f\u80fd\u3002\"
\u539f\u5b50\u63d0\u4ea4\uff1a\u6bcf\u4e2a\u63d0\u4ea4\u5e94\u505a\u4e00\u4ef6\u4e8b\u3002\"\u6dfb\u52a0\u6570\u636e\u52a0\u8f7d\u5668\"\u662f\u4e00\u4e2a\u63d0\u4ea4\u3002\"\u6dfb\u52a0\u6570\u636e\u52a0\u8f7d\u5668\u5e76\u4fee\u590d\u65e0\u5173\u7684\u9519\u8bef\u5e76\u66f4\u65b0 README\"\u5e94\u8be5\u662f\u4e09\u4e2a\u63d0\u4ea4\u3002\u8fd9\u4f7f\u5f97 git bisect\uff08\u627e\u5230\u54ea\u4e2a\u63d0\u4ea4\u5f15\u5165\u4e86\u9519\u8bef\uff09\u6210\u4e3a\u53ef\u80fd\u3002
\u62c9\u53d6\u8bf7\u6c42\uff08PR\uff09\u63d0\u8bae\u5c06\u4e00\u4e2a\u5206\u652f\u5408\u5e76\u5230 main\u3002\u5b83\u662f\u4ee3\u7801\u5ba1\u67e5\u7684\u95e8\u6237\uff1a\u961f\u53cb\u9605\u8bfb\u4f60\u7684\u66f4\u6539\uff0c\u63d0\u51fa\u6539\u8fdb\u5efa\u8bae\uff0c\u5e76\u5728\u5408\u5e76\u524d\u6279\u51c6\u3002
\u826f\u597d\u7684 PR \u5b9e\u8df5\uff1a
main \u5c31\u6709\u5e72\u51c0\u7684\u5386\u53f2\u8bb0\u5f55\uff09\u3002\u4ee3\u7801\u5ba1\u67e5\u4e0d\u662f\u4e3a\u4e86\u627e\u9519\u8bef\uff08\u6d4b\u8bd5\u6765\u505a\u8fd9\u4e2a\uff09\u3002\u5b83\u7684\u76ee\u7684\u662f\uff1a\u77e5\u8bc6\u5206\u4eab\uff08\u5ba1\u67e5\u8005\u5b66\u4e60\u4ee3\u7801\u5e93\uff09\u3001\u8bbe\u8ba1\u53cd\u9988\uff08\u8fd9\u662f\u6b63\u786e\u7684\u65b9\u6cd5\u5417\uff1f\uff09\u548c\u7ef4\u62a4\u6807\u51c6\uff08\u547d\u540d\u3001\u98ce\u683c\u3001\u67b6\u6784\uff09\u3002
.gitignore \u6587\u4ef6\u544a\u8bc9 Git \u6392\u9664\u54ea\u4e9b\u6587\u4ef6\u4e0d\u88ab\u8ffd\u8e2a\u3002\u5bf9\u4e8e\u673a\u5668\u5b66\u4e60\u9879\u76ee\uff1a# Python\n__pycache__/\n*.pyc\n*.egg-info/\n.venv/\nenv/\n\n# \u6570\u636e\u548c\u6a21\u578b\uff08\u5bf9 git \u6765\u8bf4\u592a\u5927\uff09\ndata/\n*.csv\n*.parquet\nmodels/\n*.pt\n*.onnx\n*.bin\ncheckpoints/\n\n# \u5bc6\u94a5\n.env\n*.pem\ncredentials.json\n\n# IDE\n.vscode/\n.idea/\n*.swp\n\n# \u64cd\u4f5c\u7cfb\u7edf\n.DS_Store\nThumbs.db\n\n# Jupyter\n.ipynb_checkpoints/\n\n# \u5b9e\u9a8c\u8f93\u51fa\nwandb/\nmlruns/\noutputs/\nlogs/\n .gitignore \u4e0d\u4f1a\u5c06\u5176\u4ece\u4ed3\u5e93\u4e2d\u79fb\u9664\u3002\u4f60\u8fd8\u5fc5\u987b\u4f7f\u7528 git rm --cached file \u6765\u53d6\u6d88\u8ffd\u8e2a\u3002\u8be5\u6587\u4ef6\u4f1a\u6c38\u8fdc\u7559\u5728\u5386\u53f2\u4e2d\uff0c\u9664\u975e\u4f60\u91cd\u5199\u5386\u53f2\uff08\u8fd9\u5f88\u9ebb\u70e6\uff09\u3002\u673a\u5668\u5b66\u4e60\u5f15\u5165\u4e86\u4f20\u7edf\u8f6f\u4ef6\u4e0d\u9762\u4e34\u7684\u6311\u6218\uff1a
\u5927\u6587\u4ef6\uff1a\u6570\u636e\u96c6\u548c\u6a21\u578b\u6743\u91cd\u53ef\u80fd\u6709\u6570 GB \u6216\u66f4\u5927\u3002Git \u662f\u4e3a\u6587\u672c\u6587\u4ef6\uff08\u6e90\u4ee3\u7801\uff09\u8bbe\u8ba1\u7684\uff0c\u800c\u4e0d\u662f\u4e8c\u8fdb\u5236 blob\u3002\u89e3\u51b3\u65b9\u6848\uff1a
dvc add data.csv\u3001dvc push\u3001dvc pull\u3002\u5b9e\u9a8c\u8ffd\u8e2a\uff1a\u54ea\u4e2a\u63d0\u4ea4 + \u54ea\u4e9b\u8d85\u53c2\u6570 + \u54ea\u4e2a\u6570\u636e\u4ea7\u751f\u4e86\u54ea\u4e9b\u6307\u6807\uff1fGit \u8ffd\u8e2a\u4ee3\u7801\uff0c\u4f46\u4e0d\u8ffd\u8e2a\u5b8c\u6574\u7684\u5b9e\u9a8c\u4e0a\u4e0b\u6587\u3002
git_hash = subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip()\u3002\u5c06\u5176\u4e0e\u4f60\u7684\u7ed3\u679c\u4e00\u8d77\u5b58\u50a8\u3002\u53ef\u91cd\u73b0\u6027\u68c0\u67e5\u6e05\u5355\uff08\u6bcf\u4e2a\u5b9e\u9a8c\u9700\u8981\u8ffd\u8e2a\u7684\u5185\u5bb9\uff09\uff1a
pip freeze\uff09# \u5feb\u901f\u53ef\u91cd\u73b0\u6027\u5feb\u7167\necho \"Commit: $(git rev-parse HEAD)\" > experiment_info.txt\necho \"Branch: $(git branch --show-current)\" >> experiment_info.txt\necho \"Dirty: $(git status --porcelain | wc -l) files\" >> experiment_info.txt\npip freeze >> experiment_info.txt\nnvidia-smi >> experiment_info.txt\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/03.%20codebase%20design/","title":"\u4ee3\u7801\u5e93\u8bbe\u8ba1\u4e0e\u6a21\u5f0f","text":"\u826f\u597d\u7684\u4ee3\u7801\u5e93\u8bbe\u8ba1\u662f\u533a\u5206\u7814\u7a76\u539f\u578b\u4e0e\u751f\u4ea7\u7ea7\u8f6f\u4ef6\u7684\u5173\u952e\u3002\u672c\u6587\u6db5\u76d6\u9879\u76ee\u7ed3\u6784\u3001\u6574\u6d01\u4ee3\u7801\u539f\u5219\u3001\u4e0e\u673a\u5668\u5b66\u4e60\u76f8\u5173\u7684\u8bbe\u8ba1\u6a21\u5f0f\u3001\u914d\u7f6e\u7ba1\u7406\u3001\u65e5\u5fd7\u3001API \u8bbe\u8ba1\u4ee5\u53ca\u6253\u5305\u5206\u53d1\u3002
\u5927\u591a\u6570\u673a\u5668\u5b66\u4e60\u4ee3\u7801\u59cb\u4e8e Jupyter notebook\u3002Notebook \u4e0d\u65ad\u589e\u957f\u3001\u88ab\u590d\u5236\u3001\u4fee\u6539\u3001\u5171\u4eab\uff0c\u6700\u7ec8\u53d8\u6210\u7531\u5168\u5c40\u53d8\u91cf\u3001\u6b7b\u5355\u5143\u683c\u548c\u9b54\u6570\u7ec4\u6210\u7684\u96be\u4ee5\u7ef4\u62a4\u7684\u6df7\u4e71\u3002\u4ee3\u7801\u5e93\u8bbe\u8ba1\u662f\u4e00\u95e8\u7ec4\u7ec7\u4ee3\u7801\u7684\u5b66\u79d1\uff0c\u4f7f\u4ee3\u7801\u5728\u9879\u76ee\u589e\u957f\u8fc7\u7a0b\u4e2d\u4fdd\u6301\u53ef\u7406\u89e3\u548c\u53ef\u4fee\u6539\u3002
\u8fd9\u4e0d\u662f\u4e3a\u4e86\u9075\u5faa\u89c4\u5219\u800c\u9075\u5faa\u89c4\u5219\u3002\u800c\u662f\u4e3a\u4e86\u51cf\u5c11\u4ece\"\u6211\u60f3\u6539\u53d8 X\"\u5230\"X \u5df2\u88ab\u4fee\u6539\u5e76\u80fd\u6b63\u5e38\u5de5\u4f5c\"\u4e4b\u95f4\u7684\u65f6\u95f4\u3002\u5728\u7cbe\u5fc3\u8bbe\u8ba1\u7684\u4ee3\u7801\u5e93\u4e2d\uff0c\u8fd9\u4e2a\u65f6\u95f4\u662f\u51e0\u5206\u949f\u3002\u5728\u8bbe\u8ba1\u7cdf\u7cd5\u7684\u4ee3\u7801\u5e93\u4e2d\uff0c\u5219\u9700\u8981\u51e0\u5929\u7684\u65f6\u95f4\u53bb\u8003\u53e4\u3001\u7ffb\u9605\u672a\u8bb0\u5f55\u7684\u610f\u5927\u5229\u9762\u6761\u5f0f\u4ee3\u7801\u3002
my_project/\n\u251c\u2500\u2500 src/my_project/ # \u6e90\u4ee3\u7801\uff08\u53ef\u5bfc\u5165\u7684\u5305\uff09\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 data/ # \u6570\u636e\u52a0\u8f7d\u548c\u9884\u5904\u7406\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502 \u251c\u2500\u2500 dataset.py\n\u2502 \u2502 \u2514\u2500\u2500 transforms.py\n\u2502 \u251c\u2500\u2500 models/ # \u6a21\u578b\u67b6\u6784\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502 \u251c\u2500\u2500 transformer.py\n\u2502 \u2502 \u2514\u2500\u2500 layers.py\n\u2502 \u251c\u2500\u2500 training/ # \u8bad\u7ec3\u5faa\u73af\u3001\u4f18\u5316\u5668\n\u2502 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502 \u251c\u2500\u2500 trainer.py\n\u2502 \u2502 \u2514\u2500\u2500 losses.py\n\u2502 \u2514\u2500\u2500 utils/ # \u5171\u4eab\u5de5\u5177\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u2514\u2500\u2500 logging.py\n\u251c\u2500\u2500 configs/ # \u914d\u7f6e\u6587\u4ef6\n\u2502 \u251c\u2500\u2500 base.yaml\n\u2502 \u2514\u2500\u2500 experiment_1.yaml\n\u251c\u2500\u2500 scripts/ # \u5165\u53e3\u70b9\uff08\u8bad\u7ec3\u3001\u8bc4\u4f30\u3001\u63a8\u7406\uff09\n\u2502 \u251c\u2500\u2500 train.py\n\u2502 \u251c\u2500\u2500 evaluate.py\n\u2502 \u2514\u2500\u2500 serve.py\n\u251c\u2500\u2500 tests/ # \u6d4b\u8bd5\u6587\u4ef6\uff08\u955c\u50cf src/ \u7ed3\u6784\uff09\n\u2502 \u251c\u2500\u2500 test_dataset.py\n\u2502 \u251c\u2500\u2500 test_model.py\n\u2502 \u2514\u2500\u2500 test_trainer.py\n\u251c\u2500\u2500 notebooks/ # \u4ec5\u7528\u4e8e\u63a2\u7d22\uff08\u975e\u751f\u4ea7\u4ee3\u7801\uff09\n\u251c\u2500\u2500 pyproject.toml # \u9879\u76ee\u5143\u6570\u636e\u548c\u4f9d\u8d56\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 .gitignore\n\u2514\u2500\u2500 Dockerfile\n src/ \u5e03\u5c40\uff1a\u5c06\u6e90\u4ee3\u7801\u653e\u5728 src/my_project/ \u4e0b\u53ef\u4ee5\u9632\u6b62\u4ece\u5f53\u524d\u76ee\u5f55\u610f\u5916\u5bfc\u5165\uff08\u8fd9\u4f1a\u63a9\u76d6\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u624d\u4f1a\u66b4\u9732\u7684\u5bfc\u5165\u9519\u8bef\uff09\u3002\u4f7f\u7528 pip install -e . \u8fdb\u884c\u5f00\u53d1\u5b89\u88c5\u3002
\u5355\u4ed3\u5e93 vs \u591a\u4ed3\u5e93\uff1a\u5355\u4ed3\u5e93\u5c06\u6240\u6709\u76f8\u5173\u9879\u76ee\u653e\u5728\u4e00\u4e2a\u4ed3\u5e93\u4e2d\uff08\u8de8\u9879\u76ee\u66f4\u6539\u66f4\u5bb9\u6613\u3001CI \u5171\u4eab\uff09\u3002\u591a\u4ed3\u5e93\u7ed9\u6bcf\u4e2a\u9879\u76ee\u81ea\u5df1\u7684\u4ed3\u5e93\uff08\u8fb9\u754c\u66f4\u6e05\u6670\u3001\u7248\u672c\u63a7\u5236\u72ec\u7acb\uff09\u3002\u5927\u591a\u6570\u673a\u5668\u5b66\u4e60\u56e2\u961f\u4ece\u5355\u4ed3\u5e93\u5f00\u59cb\uff0c\u5fc5\u8981\u65f6\u518d\u62c6\u5206\u3002
\u811a\u672c vs \u5e93\uff1a\u5c06\u5165\u53e3\u70b9\uff08train.py\u3001evaluate.py\uff09\u4fdd\u7559\u5728 scripts/ \u4e2d\u3002\u5c06\u53ef\u590d\u7528\u7684\u903b\u8f91\u653e\u5728 src/ \u4e2d\u3002\u8bad\u7ec3\u811a\u672c\u5e94\u7ea6\u4e3a 50 \u884c\uff1a\u89e3\u6790\u914d\u7f6e\u3001\u6784\u5efa\u6570\u636e\u96c6\u3001\u6784\u5efa\u6a21\u578b\u3001\u6784\u5efa\u8bad\u7ec3\u5668\u3001\u8bad\u7ec3\u3002\u6240\u6709\u590d\u6742\u6027\u90fd\u5728\u5e93\u4e2d\u3002
x \u7684\u53d8\u91cf\u9700\u8981\u4f60\u9605\u8bfb\u5468\u56f4\u7684\u4ee3\u7801\u624d\u80fd\u7406\u89e3\u3002\u540d\u4e3a learning_rate \u7684\u53d8\u91cf\u662f\u81ea\u89e3\u91ca\u7684\u3002# \u7cdf\u7cd5\ndef proc(d, n, lr):\n for i in range(n):\n for k, v in d.items():\n v -= lr * g[k]\n\n# \u826f\u597d\ndef update_parameters(parameters, num_steps, learning_rate):\n for step in range(num_steps):\n for name, param in parameters.items():\n param -= learning_rate * gradients[name]\n \u5355\u4e00\u804c\u8d23\u539f\u5219\uff1a\u6bcf\u4e2a\u51fd\u6570/\u7c7b\u53ea\u505a\u4e00\u4ef6\u4e8b\u3002\u540d\u4e3a load_data_and_train_model \u7684\u51fd\u6570\u5728\u505a\u4e24\u4ef6\u4e8b\uff0c\u5e94\u8be5\u62c6\u5206\u3002\u8fd9\u4f7f\u6bcf\u4e2a\u90e8\u5206\u90fd\u53ef\u4ee5\u72ec\u7acb\u6d4b\u8bd5\u3001\u590d\u7528\u548c\u7406\u89e3\u3002
DRY\uff08\u4e0d\u8981\u91cd\u590d\u81ea\u5df1\uff09\u2014\u2014\u4f46\u4e0d\u8981\u8fc7\u65e9\u62bd\u8c61\u3002\u5982\u679c\u4f60\u590d\u5236\u7c98\u8d34\u4ee3\u7801\u4e09\u6b21\uff0c\u5c06\u5176\u63d0\u53d6\u4e3a\u4e00\u4e2a\u51fd\u6570\u3002\u4f46\u4e0d\u8981\u4e3a\u53ea\u4f7f\u7528\u8fc7\u4e00\u6b21\u7684\u4ee3\u7801\u521b\u5efa\u62bd\u8c61\u3002\u8fc7\u65e9\u7684\u62bd\u8c61\u6bd4\u91cd\u590d\u66f4\u7cdf\u7cd5\uff1a\u5b83\u589e\u52a0\u4e86\u590d\u6742\u6027\u4f46\u6ca1\u6709\u7ecf\u8fc7\u9a8c\u8bc1\u7684\u597d\u5904\u3002
# \u8fc7\u65e9\u62bd\u8c61\uff08\u4e00\u4e2a\u7528\u4f8b\uff0c\u8fc7\u5ea6\u8bbe\u8ba1\uff09\nclass AbstractDataTransformPipelineFactory:\n ...\n\n# \u6070\u5230\u597d\u5904\uff08\u76f4\u63a5\u3001\u6e05\u6670\u3001\u5728\u4e09\u5904\u4f7f\u7528\uff09\ndef normalise_image(image, mean, std):\n return (image - mean) / std\n # \u7cdf\u7cd5\nif len(batch) > 32:\n split_batch(batch, 32)\n\n# \u826f\u597d\nMAX_BATCH_SIZE = 32\nif len(batch) > MAX_BATCH_SIZE:\n split_batch(batch, MAX_BATCH_SIZE)\n \u8bbe\u8ba1\u6a21\u5f0f\u662f\u9488\u5bf9\u5e38\u89c1\u95ee\u9898\u7684\u53ef\u590d\u7528\u89e3\u51b3\u65b9\u6848\u3002\u4ee5\u4e0b\u662f\u4e0e\u673a\u5668\u5b66\u4e60\u4ee3\u7801\u5e93\u6700\u76f8\u5173\u7684\u6a21\u5f0f\uff1a
\u5de5\u5382\u6a21\u5f0f\uff1a\u5728\u4e0d\u6307\u5b9a\u786e\u5207\u7c7b\u7684\u60c5\u51b5\u4e0b\u521b\u5efa\u5bf9\u8c61\u3002\u5f53\u4f60\u7684\u914d\u7f6e\u8bf4 model: \"transformer\" \u5e76\u4e14\u4f60\u9700\u8981\u5b9e\u4f8b\u5316\u6b63\u786e\u7684\u7c7b\u65f6\u5f88\u6709\u7528\uff1a
MODEL_REGISTRY = {\n \"transformer\": TransformerModel,\n \"cnn\": CNNModel,\n \"mlp\": MLPModel,\n}\n\ndef build_model(config):\n model_cls = MODEL_REGISTRY[config[\"model\"]]\n return model_cls(**config[\"model_params\"])\n \u8fd9\u4f7f\u8bad\u7ec3\u811a\u672c\u4e0e\u7279\u5b9a\u7684\u6a21\u578b\u5b9e\u73b0\u89e3\u8026\u3002\u6dfb\u52a0\u65b0\u6a21\u578b\u610f\u5473\u7740\u5728\u6ce8\u518c\u8868\u4e2d\u6dfb\u52a0\u4e00\u884c\uff0c\u800c\u4e0d\u662f\u4fee\u6539\u8bad\u7ec3\u5faa\u73af\u3002
\u7b56\u7565\u6a21\u5f0f\uff1a\u5728\u8fd0\u884c\u65f6\u4ea4\u6362\u7b97\u6cd5\u3002\u9002\u7528\u4e8e\u635f\u5931\u51fd\u6570\u3001\u4f18\u5316\u5668\u3001\u8c03\u5ea6\u5668\uff1a
LOSS_FUNCTIONS = {\n \"mse\": nn.MSELoss,\n \"cross_entropy\": nn.CrossEntropyLoss,\n \"focal\": FocalLoss,\n}\n\nloss_fn = LOSS_FUNCTIONS[config[\"loss\"]]()\n class EarlyStopping:\n def __init__(self, patience=5):\n self.patience = patience\n self.best_loss = float('inf')\n self.counter = 0\n\n def on_epoch_end(self, epoch, val_loss):\n if val_loss < self.best_loss:\n self.best_loss = val_loss\n self.counter = 0\n else:\n self.counter += 1\n if self.counter >= self.patience:\n return \"stop\"\n # \u7cdf\u7cd5\uff1a\u786c\u7f16\u7801\u4f9d\u8d56\nclass Trainer:\n def __init__(self):\n self.logger = WandbLogger() # \u6ca1\u6709 W&B \u5c31\u65e0\u6cd5\u6d4b\u8bd5\n\n# \u826f\u597d\uff1a\u6ce8\u5165\u4f9d\u8d56\nclass Trainer:\n def __init__(self, logger):\n self.logger = logger # \u53ef\u4ee5\u6ce8\u5165\u4efb\u4f55\u8bb0\u5f55\u5668\uff0c\u5305\u62ec mock\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/03.%20codebase%20design/#_5","title":"\u914d\u7f6e\u7ba1\u7406","text":"\u786c\u7f16\u7801\u8d85\u53c2\u6570\u3001\u6587\u4ef6\u8def\u5f84\u548c\u6a21\u578b\u8bbe\u7f6e\u4f7f\u5b9e\u9a8c\u65e0\u6cd5\u91cd\u73b0\uff0c\u4fee\u6539\u4e5f\u5f88\u75db\u82e6\u3002\u5c06\u914d\u7f6e\u5916\u90e8\u5316\u5230\u6587\u4ef6\u4e2d\u3002
YAML \u662f\u673a\u5668\u5b66\u4e60\u914d\u7f6e\u6700\u5e38\u89c1\u7684\u683c\u5f0f\uff1a
# configs/experiment_1.yaml\nmodel:\n name: transformer\n d_model: 512\n n_heads: 8\n n_layers: 6\n\ntraining:\n batch_size: 64\n learning_rate: 3e-4\n max_epochs: 100\n early_stopping_patience: 10\n\ndata:\n train_path: /data/train.parquet\n val_path: /data/val.parquet\n max_seq_length: 512\n Hydra\uff08Facebook\uff09\u662f\u4e00\u4e2a\u652f\u6301\u7ec4\u5408\uff08\u5c06\u57fa\u7840\u914d\u7f6e\u4e0e\u5b9e\u9a8c\u7279\u5b9a\u8986\u76d6\u5408\u5e76\uff09\u3001\u547d\u4ee4\u884c\u8986\u76d6\uff08python train.py training.lr=1e-3\uff09\u548c\u591a\u8fd0\u884c\uff08\u8d85\u53c2\u6570\u626b\u63cf\uff09\u7684\u914d\u7f6e\u6846\u67b6\u3002
argparse \u9002\u7528\u4e8e\u53c2\u6570\u8f83\u5c11\u7684\u811a\u672c\uff1a
import argparse\n\nparser = argparse.ArgumentParser()\nparser.add_argument(\"--lr\", type=float, default=3e-4)\nparser.add_argument(\"--batch-size\", type=int, default=64)\nparser.add_argument(\"--config\", type=str, default=\"configs/base.yaml\")\nargs = parser.parse_args()\n print \u8bed\u53e5\u7528\u4e8e\u8c03\u8bd5\u3002\u65e5\u5fd7\u7528\u4e8e\u751f\u4ea7\u73af\u5883\uff1aimport logging\n\nlogger = logging.getLogger(__name__)\nlogger.setLevel(logging.INFO)\n\nlogger.debug(\"Batch loaded: %d samples\", len(batch)) # \u8be6\u7ec6\uff0c\u7528\u4e8e\u8c03\u8bd5\nlogger.info(\"Epoch %d: loss=%.4f, lr=%.6f\", epoch, loss, lr) # \u6b63\u5e38\u8fd0\u884c\nlogger.warning(\"GPU memory >90%%, consider reducing batch size\")\nlogger.error(\"Failed to load checkpoint: %s\", path) # \u53ef\u6062\u590d\u7684\u9519\u8bef\nlogger.critical(\"CUDA out of memory, aborting\") # \u81f4\u547d\u9519\u8bef\n \u4e3a\u4ec0\u4e48\u4e0d\u7528 print\uff1a\u65e5\u5fd7\u652f\u6301\u7ea7\u522b\uff08\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u8fc7\u6ee4\u8c03\u8bd5\u6d88\u606f\uff09\u3001\u683c\u5f0f\u5316\uff08\u65f6\u95f4\u6233\u3001\u6a21\u5757\u540d\uff09\u548c\u5904\u7406\u7a0b\u5e8f\uff08\u5199\u5165\u6587\u4ef6\u3001\u53d1\u9001\u5230\u76d1\u63a7\u7cfb\u7edf\uff09\uff0c\u800c\u65e0\u9700\u66f4\u6539\u65e5\u5fd7\u8c03\u7528\u3002
\u7ed3\u6784\u5316\u65e5\u5fd7\u540c\u65f6\u8f93\u51fa\u673a\u5668\u53ef\u89e3\u6790\u7684\u683c\u5f0f\uff08JSON\uff09\u548c\u4eba\u7c7b\u53ef\u8bfb\u7684\u6d88\u606f\u3002\u8fd9\u4f7f\u5f97\u53ef\u4ee5\u641c\u7d22\u7279\u5b9a\u5b57\u6bb5\u5e76\u8bbe\u7f6e\u544a\u8b66\uff1a
logger.info(\"training_step\", extra={\n \"epoch\": 5, \"step\": 1200, \"loss\": 0.0342, \"lr\": 2.1e-4\n})\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/03.%20codebase%20design/#api","title":"API \u8bbe\u8ba1","text":"\u5982\u679c\u4f60\u7684\u6a21\u578b\u5c06\u88ab\u5176\u4ed6\u670d\u52a1\u4f7f\u7528\uff08Web \u5e94\u7528\u3001\u79fb\u52a8\u5e94\u7528\u3001\u53e6\u4e00\u4e2a\u673a\u5668\u5b66\u4e60\u7ba1\u9053\uff09\uff0c\u5b83\u9700\u8981\u4e00\u4e2a API\uff08\u5e94\u7528\u7a0b\u5e8f\u7f16\u7a0b\u63a5\u53e3\uff09\u3002
REST API \u4f7f\u7528 HTTP \u65b9\u6cd5\uff1aGET \u7528\u4e8e\u8bfb\u53d6\uff0cPOST \u7528\u4e8e\u521b\u5efa/\u9884\u6d4b\uff0cPUT \u7528\u4e8e\u66f4\u65b0\uff0cDELETE \u7528\u4e8e\u5220\u9664\u3002\u7aef\u70b9\u9075\u5faa\u57fa\u4e8e\u8d44\u6e90\u7684\u547d\u540d\uff1a
POST /api/v1/predict # \u53d1\u9001\u8f93\u5165\uff0c\u83b7\u53d6\u9884\u6d4b\u7ed3\u679c\nGET /api/v1/models # \u5217\u51fa\u53ef\u7528\u6a21\u578b\nGET /api/v1/models/{id} # \u83b7\u53d6\u6a21\u578b\u8be6\u60c5\nPOST /api/v1/models/{id}/predict # \u4f7f\u7528\u7279\u5b9a\u6a21\u578b\u8fdb\u884c\u9884\u6d4b\n from fastapi import FastAPI\nfrom pydantic import BaseModel\n\napp = FastAPI()\n\nclass PredictRequest(BaseModel):\n text: str\n\nclass PredictResponse(BaseModel):\n label: str\n confidence: float\n\n@app.post(\"/predict\", response_model=PredictResponse)\nasync def predict(request: PredictRequest):\n result = model.predict(request.text)\n return PredictResponse(label=result.label, confidence=result.score)\n FastAPI \u81ea\u52a8\u751f\u6210 API \u6587\u6863\uff08\u5728 /docs \u7684 Swagger UI\uff09\uff0c\u4f7f\u7528 Pydantic \u6a21\u578b\u9a8c\u8bc1\u8f93\u5165/\u8f93\u51fa\uff0c\u5e76\u652f\u6301\u5f02\u6b65\u4ee5\u5b9e\u73b0\u9ad8\u541e\u5410\u91cf\u3002
gRPC \u5728\u5185\u90e8\u670d\u52a1\u95f4\u901a\u4fe1\u65b9\u9762\u6bd4 REST \u66f4\u5feb\u3002\u5b83\u4f7f\u7528 Protocol Buffers\uff08\u4e8c\u8fdb\u5236\u5e8f\u5217\u5316\uff0c\u6bd4 JSON \u66f4\u5c0f\u66f4\u5feb\uff09\u5e76\u652f\u6301\u6d41\u5f0f\u4f20\u8f93\u3002TensorFlow Serving\u3001Triton Inference Server \u548c\u8bb8\u591a\u5fae\u670d\u52a1\u67b6\u6784\u90fd\u4f7f\u7528\u5b83\u3002
# pyproject.toml\n[project]\nname = \"my-ml-project\"\nversion = \"0.1.0\"\nrequires-python = \">=3.10\"\ndependencies = [\n \"torch>=2.0\",\n \"jax>=0.4\",\n \"pydantic>=2.0\",\n]\n\n[project.optional-dependencies]\ndev = [\"pytest\", \"ruff\", \"mypy\"]\n\n[build-system]\nrequires = [\"setuptools>=64\"]\nbuild-backend = \"setuptools.backends._legacy:_Backend\"\n pip install -e \".[dev]\" # \u4ee5\u53ef\u7f16\u8f91\u6a21\u5f0f\u5b89\u88c5\uff0c\u5305\u542b\u5f00\u53d1\u4f9d\u8d56\n \u53ef\u7f16\u8f91\u5b89\u88c5\uff08-e\uff09\uff1a\u5bf9\u6e90\u4ee3\u7801\u7684\u66f4\u6539\u4f1a\u7acb\u5373\u751f\u6548\uff0c\u65e0\u9700\u91cd\u65b0\u5b89\u88c5\u3002\u5f00\u53d1\u671f\u95f4\u5fc5\u4e0d\u53ef\u5c11\u3002
\u9501\u5b9a\u4f9d\u8d56\uff1a\u4f7f\u7528\u786e\u5207\u7248\u672c\u7684 requirements.txt\uff08torch==2.2.1\uff0c\u800c\u4e0d\u662f torch>=2.0\uff09\u786e\u4fdd\u53ef\u91cd\u73b0\u6027\u3002\u4f7f\u7528 pip freeze > requirements.txt \u6355\u83b7\u4f60\u5f53\u524d\u7684\u73af\u5883\u3002\u5bf9\u4e8e\u66f4\u590d\u6742\u7684\u4f9d\u8d56\u7ba1\u7406\uff0c\u4f7f\u7528 uv\u3001poetry \u6216 pip-tools\u3002
AI \u7f16\u7801\u52a9\u624b\uff08Claude Code\u3001GitHub Copilot\u3001Cursor \u7b49\uff09\u73b0\u5728\u5df2\u6210\u4e3a\u4e13\u4e1a\u5de5\u7a0b\u5e08\u5de5\u4f5c\u6d41\u7a0b\u7684\u4e00\u90e8\u5206\u3002\u4f7f\u7528\u5f97\u5f53\uff0c\u5b83\u4eec\u80fd\u6781\u5927\u52a0\u901f\u5f00\u53d1\u3002\u4f7f\u7528\u4e0d\u5f53\uff0c\u5b83\u4eec\u4f1a\u5f15\u5165\u5fae\u5999\u7684\u9519\u8bef\u3001\u4fb5\u8680\u4f60\u5bf9\u4ee3\u7801\u5e93\u7684\u7406\u89e3\uff0c\u5e76\u5236\u9020\u865a\u5047\u7684\u751f\u4ea7\u529b\u611f\u3002
\u6b63\u786e\u7684\u5fc3\u667a\u6a21\u578b\uff1aAI \u52a9\u624b\u662f\u4e00\u4e2a\u5feb\u901f\u4f46\u7f3a\u4e4f\u7ecf\u9a8c\u7684\u7ed3\u5bf9\u7a0b\u5e8f\u5458\u3002\u5b83\u53ef\u4ee5\u5feb\u901f\u7f16\u5199\u4ee3\u7801\uff0c\u719f\u6089\u8bed\u6cd5\u548c\u6807\u51c6\u6a21\u5f0f\uff0c\u5e76\u4e14\u9605\u8bfb\u8fc7\u7684\u6587\u6863\u6bd4\u4f60\u8fd8\u591a\u3002\u4f46\u5b83\u4e0d\u4e86\u89e3\u4f60\u7684\u7279\u5b9a\u7cfb\u7edf\u3001\u4e1a\u52a1\u7ea6\u675f\u3001\u8fb9\u754c\u60c5\u51b5\u4ee5\u53ca\u8bbe\u8ba1\u51b3\u7b56\u80cc\u540e\u7684\u539f\u56e0\u3002\u4f60\u662f\u9ad8\u7ea7\u5de5\u7a0b\u5e08\uff1bAI \u52a9\u624b\u662f\u521d\u7ea7\u5de5\u7a0b\u5e08\u3002\u4f60\u6765\u6307\u5bfc\u3001\u5ba1\u67e5\u5e76\u627f\u62c5\u8d23\u4efb\u3002
\u6837\u677f\u4ee3\u7801\u548c\u811a\u624b\u67b6\uff1a\u751f\u6210 Dockerfile\u3001CI \u914d\u7f6e\u3001\u6d4b\u8bd5\u5939\u5177\u3001\u6570\u636e\u7c7b\u5b9a\u4e49\u3001argparse \u8bbe\u7f6e\u3002\u8fd9\u4e9b\u9075\u5faa\u4f17\u6240\u5468\u77e5\u7684\u6a21\u5f0f\uff0c\u624b\u52a8\u7f16\u5199\u5f88\u7e41\u7410\u3002\u8ba9 AI \u751f\u6210\u5b83\u4eec\uff0c\u7136\u540e\u5ba1\u67e5\u6b63\u786e\u6027\u3002
\u7f16\u5199\u6d4b\u8bd5\uff1a\u63cf\u8ff0\u51fd\u6570\u7684\u884c\u4e3a\uff0cAI \u52a9\u624b\u751f\u6210\u6d4b\u8bd5\u7528\u4f8b\u3002\u5b83\u901a\u5e38\u4f1a\u6355\u6349\u5230\u4f60\u53ef\u80fd\u4f1a\u9057\u6f0f\u7684\u8fb9\u754c\u60c5\u51b5\uff08\u7a7a\u8f93\u5165\u3001\u8d1f\u503c\u3001Unicode\uff09\u3002\u59cb\u7ec8\u9605\u8bfb\u751f\u6210\u7684\u6d4b\u8bd5\u2014\u2014\u5b83\u4eec\u9a8c\u8bc1\u7684\u662f\u4f60\u7684\u5047\u8bbe\uff0c\u800c\u4e0d\u4ec5\u4ec5\u662f\u4f60\u7684\u4ee3\u7801\u3002
\u91cd\u6784\uff1a\"\u5c06\u8fd9\u4e2a\u5757\u63d0\u53d6\u6210\u51fd\u6570\"\u3001\"\u5c06\u8fd9\u4e2a\u7c7b\u6539\u4e3a\u4f7f\u7528 dataclasses\"\u3001\"\u7ed9\u8fd9\u4e2a\u6a21\u5757\u6dfb\u52a0\u7c7b\u578b\u63d0\u793a\"\u3002\u673a\u68b0\u6027\u7684\u8f6c\u6362\uff0c\u610f\u56fe\u660e\u786e\uff0c\u5f15\u5165\u7ec6\u5fae\u9519\u8bef\u7684\u98ce\u9669\u8f83\u4f4e\u3002
\u63a2\u7d22\u548c\u539f\u578b\u5f00\u53d1\uff1a\"\u5199\u4e00\u4e2a\u5feb\u901f\u811a\u672c\u6765 benchmark \u63a8\u7406\u5ef6\u8fdf\"\u6216\"\u5c55\u793a\u5982\u4f55\u4f7f\u7528 HuggingFace tokeniser API\"\u3002AI \u52a9\u624b\u80fd\u6bd4\u9605\u8bfb\u6587\u6863\u66f4\u5feb\u5730\u7ed9\u4f60\u4e00\u4e2a\u53ef\u7528\u7684\u8d77\u70b9\u3002
\u6587\u6863\u548c docstrings\uff1aAI \u52a9\u624b\u53ef\u4ee5\u6839\u636e\u4f60\u7684\u4ee3\u7801\u7ed3\u6784\u751f\u6210\u6587\u6863\u3002\u4f60\u9700\u8981\u5ba1\u67e5\u51c6\u786e\u6027\uff0c\u4f46\u82e6\u529b\u6d3b\u5df2\u7ecf\u81ea\u52a8\u5316\u4e86\u3002
\u8c03\u8bd5\u8f85\u52a9\uff1a\u7c98\u8d34\u9519\u8bef\u56de\u6eaf\u4fe1\u606f\u5e76\u8bf7\u6c42\u8bca\u65ad\u3002AI \u52a9\u624b\u901a\u5e38\u80fd\u8bc6\u522b\u6839\u672c\u539f\u56e0\u5e76\u63d0\u51fa\u4fee\u590d\u5efa\u8bae\uff0c\u5c24\u5176\u662f\u5bf9\u4e8e\u5e38\u89c1\u95ee\u9898\uff08\u5f62\u72b6\u4e0d\u5339\u914d\u3001\u5bfc\u5165\u9519\u8bef\u3001CUDA \u5185\u5b58\u4e0d\u8db3\uff09\u3002
\u65b0\u9896\u7684\u67b6\u6784\u51b3\u7b56\uff1a\u5982\u679c\u4f60\u6b63\u5728\u8bbe\u8ba1\u4e00\u4e2a\u65b0\u7684\u8bad\u7ec3\u7ba1\u9053\uff0cAI \u52a9\u624b\u4f1a\u7ed9\u51fa\u4e00\u4e2a\u901a\u7528\u7684\u7b54\u6848\u3002\u5b83\u4e0d\u4e86\u89e3\u4f60\u7684\u6570\u636e\u7ea6\u675f\u3001\u5ef6\u8fdf\u8981\u6c42\u6216\u56e2\u961f\u4e13\u4e1a\u77e5\u8bc6\u3002\u4f7f\u7528 AI \u52a9\u624b\u6765\u5b9e\u73b0\u4f60\u5df2\u7ecf\u6df1\u601d\u719f\u8651\u7684\u8bbe\u8ba1\u3002
\u5b89\u5168\u5173\u952e\u4ee3\u7801\uff1a\u8ba4\u8bc1\u3001\u52a0\u5bc6\u3001\u8f93\u5165\u6e05\u7406\u3002AI \u52a9\u624b\u53ef\u80fd\u751f\u6210\u770b\u8d77\u6765\u6b63\u786e\u4f46\u5b58\u5728\u7ec6\u5fae\u6f0f\u6d1e\u7684\u4ee3\u7801\uff08SQL \u6ce8\u5165\u3001\u4e0d\u5b89\u5168\u7684\u9ed8\u8ba4\u503c\u3001\u65f6\u5e8f\u653b\u51fb\uff09\u3002\u5b89\u5168\u4ee3\u7801\u5e94\u7531\u7406\u89e3\u5a01\u80c1\u6a21\u578b\u7684\u4eba\u7f16\u5199\uff0c\u5e76\u7531\u53e6\u4e00\u4e2a\u4eba\u5ba1\u67e5\u3002
\u6027\u80fd\u5173\u952e\u7684\u5185\u5faa\u73af\uff1aAI \u52a9\u624b\u4f1a\u7f16\u5199\u6b63\u786e\u4f46\u5929\u771f\u7684\u4ee3\u7801\u3002\u5bf9\u4e8e GPU \u5185\u6838\u3001\u5185\u5b58\u5173\u952e\u7684\u6570\u636e\u7ed3\u6784\u6216\u5ef6\u8fdf\u654f\u611f\u7684\u63a8\u7406\u8def\u5f84\uff0c\u4f60\u9700\u8981\u7406\u89e3\u786c\u4ef6\u7ea6\u675f\uff08\u7b2c 13 \u7ae0\u3001\u7b2c 16 \u7ae0\uff09\u5e76\u6709\u76ee\u7684\u5730\u8fdb\u884c\u4f18\u5316\u3002
\u4f60\u4e0d\u7406\u89e3\u7684\u4ee3\u7801\uff1a\u5982\u679c AI \u52a9\u624b\u751f\u6210\u4e86 200 \u884c\u4ee3\u7801\uff0c\u800c\u4f60\u65e0\u6cd5\u89e3\u91ca\u6bcf\u4e00\u884c\u7684\u4f5c\u7528\uff0c\u90a3\u5c31\u4e0d\u8981\u63d0\u4ea4\u3002\u4f60\u73b0\u5728\u6b63\u5728\u7ef4\u62a4\u4f60\u4e0d\u7406\u89e3\u7684\u4ee3\u7801\uff0c\u5f53\u5b83\u51fa\u95ee\u9898\u65f6\uff08\u5b83\u4f1a\u7684\uff09\uff0c\u4f60\u65e0\u6cd5\u8c03\u8bd5\u3002\u8fd9\u662f\u6700\u5e38\u89c1\u4e5f\u6700\u5371\u9669\u7684\u5931\u8d25\u6a21\u5f0f\u3002
\u5728\u63d0\u4ea4\u524d\u59cb\u7ec8\u9010\u884c\u9605\u8bfb\u751f\u6210\u7684\u4ee3\u7801\u3002\u8fd9\u4e0d\u662f\u53ef\u9009\u7684\u3002AI \u52a9\u624b\u7684\u4ee3\u7801\u662f\u8349\u7a3f\uff0c\u4e0d\u662f\u6210\u54c1\u3002\u5c31\u50cf\u5bf9\u5f85\u540c\u4e8b\u7684\u62c9\u53d6\u8bf7\u6c42\u4e00\u6837\uff1a\u6279\u5224\u6027\u5730\u5ba1\u67e5\u5b83\u3002
\u68c0\u67e5\u4ec0\u4e48\uff1a
AI \u52a9\u624b\u8f93\u51fa\u7684\u8d28\u91cf\u76f4\u63a5\u4e0e\u4f60\u7684\u6307\u4ee4\u8d28\u91cf\u6210\u6b63\u6bd4\u3002\u6a21\u7cca\u7684\u63d0\u793a\u8bcd\u5f97\u5230\u6a21\u7cca\u7684\u4ee3\u7801\u3002
\u7cdf\u7cd5\uff1a\"\u5199\u4e00\u4e2a\u6570\u636e\u52a0\u8f7d\u5668\"
\u597d\uff1a\"\u4e3a\u4e00\u4e2a\u5305\u542b'text'\u548c'label'\u5217\u7684 CSV \u6587\u4ef6\u7f16\u5199\u4e00\u4e2a PyTorch DataLoader\u3002\u4f7f\u7528 HuggingFace tokeniser 'bert-base-uncased' \u5bf9\u6587\u672c\u8fdb\u884c\u5206\u8bcd\uff0cmax_length=512\u3002\u8fd4\u56de input_ids\u3001attention_mask \u548c label \u4f5c\u4e3a\u5f20\u91cf\u3002\u5904\u7406 CSV \u4e2d\u6807\u7b7e\u5217\u6709\u7f3a\u5931\u503c\u7684\u60c5\u51b5\uff0c\u8df3\u8fc7\u90a3\u4e9b\u884c\u3002\"
\u63d0\u4f9b\u4e0a\u4e0b\u6587\uff1a\u544a\u8bc9 AI \u52a9\u624b\u4f60\u7684\u9879\u76ee\u7ed3\u6784\u3001\u73b0\u6709\u4ee3\u7801\u3001\u7ea6\u675f\u548c\u7ea6\u5b9a\u3002\u4e0a\u4e0b\u6587\u8d8a\u591a\uff0c\u8f93\u51fa\u8d8a\u597d\u3002
\u6307\u5b9a\u7ea6\u675f\uff1a\"\u53ea\u4f7f\u7528\u6807\u51c6\u5e93\"\u3001\"\u5fc5\u987b\u517c\u5bb9 Python 3.10\"\u3001\"\u4e0d\u8981\u4f7f\u7528\u5168\u5c40\u53d8\u91cf\"\u3001\"\u9075\u5faa src/models/transformer.py \u4e2d\u7684\u73b0\u6709\u6a21\u5f0f\"\u3002
\u8981\u6c42\u89e3\u91ca\uff1a\"\u5b9e\u73b0 X \u5e76\u89e3\u91ca\u5173\u952e\u7684\u8bbe\u8ba1\u51b3\u7b56\u3002\"\u8fd9\u4f1a\u8feb\u4f7f AI \u52a9\u624b\u9610\u8ff0\u5176\u63a8\u7406\uff0c\u4f7f\u4f60\u66f4\u5bb9\u6613\u53d1\u73b0\u9519\u8bef\u5047\u8bbe\u3002
\u4f60\u73b0\u6709\u7684\u8d28\u91cf\u57fa\u7840\u8bbe\u65bd\uff08\u6587\u4ef6 04\uff09\u6355\u6349 AI \u52a9\u624b\u7684\u9519\u8bef\u4e0e\u6355\u6349\u4eba\u7c7b\u7684\u9519\u8bef\u540c\u6837\u6709\u6548\uff1a
\"AI \u52a9\u624b\u5199\u4ee3\u7801\" + \"\u8d28\u91cf\u95e8\u63a7\u9a8c\u8bc1\" \u7684\u7ec4\u5408\u6bd4\u5355\u72ec\u4f7f\u7528\u4efb\u4f55\u4e00\u79cd\u90fd\u66f4\u9ad8\u6548\u3002AI \u52a9\u624b\u5feb\u901f\u4f46\u8349\u7387\uff1b\u95e8\u63a7\u5de5\u5177\u5f7b\u5e95\u4f46\u4e0d\u5199\u4ee3\u7801\u3002\u4e24\u8005\u7ed3\u5408\uff0c\u4f60\u540c\u65f6\u83b7\u5f97\u901f\u5ea6\u548c\u6b63\u786e\u6027\u3002
\u4f7f\u7528\u7f16\u7801\u52a9\u624b\u7684\u6700\u5927\u98ce\u9669\u662f\u751f\u4ea7\u529b\u7684\u5e7b\u89c9\u3002\u4f60\u53ef\u4ee5\u5728 10 \u5206\u949f\u5185\u751f\u6210 500 \u884c\u4ee3\u7801\u3002\u4f46\u5982\u679c\u4f60\u82b1 2 \u5c0f\u65f6\u8c03\u8bd5\u8fd9\u4e9b\u4f60\u5e76\u4e0d\u7406\u89e3\u7684 500 \u884c\u4ee3\u7801\uff0c\u90a3\u8fd8\u4e0d\u5982\u81ea\u5df1\u82b1 30 \u5206\u949f\u5199 200 \u884c\u4ee3\u7801\u6765\u5f97\u5feb\u3002
\u4f7f\u7528 AI \u52a9\u624b\u7684\u771f\u6b63\u751f\u4ea7\u529b\u6765\u81ea\uff1a
\u4ece\u7f16\u7801\u52a9\u624b\u4e2d\u83b7\u76ca\u6700\u591a\u7684\u5de5\u7a0b\u5e08\u662f\u90a3\u4e9b\u5df2\u7ecf\u64c5\u957f\u7f16\u7801\u7684\u4eba\u3002AI \u52a9\u624b\u653e\u5927\u4f60\u73b0\u6709\u7684\u6280\u80fd\uff1b\u5b83\u4e0d\u4f1a\u53d6\u4ee3\u4f60\u7684\u6280\u80fd\u3002\u7406\u89e3\u6570\u636e\u7ed3\u6784\u3001\u7b97\u6cd5\u3001\u7cfb\u7edf\u8bbe\u8ba1\u548c\u8f6f\u4ef6\u5de5\u7a0b\uff08\u6574\u7ae0\u7684\u5185\u5bb9\uff09\u8ba9\u4f60\u80fd\u591f\u6709\u6548\u5730\u6307\u5bfc AI \u52a9\u624b\u5e76\u6279\u5224\u6027\u5730\u8bc4\u4f30\u5176\u8f93\u51fa\u3002
\u6d4b\u8bd5\u662f\u4f60\u5982\u4f55\u786e\u4fdd\u4ee3\u7801\u6b63\u5e38\u5de5\u4f5c\u7684\u65b9\u6cd5\u2014\u2014\u4e0d\u4ec5\u662f\u73b0\u5728\uff0c\u800c\u4e14\u5728\u6bcf\u6b21\u66f4\u6539\u540e\u90fd\u80fd\u6b63\u5e38\u5de5\u4f5c\u3002\u672c\u6587\u6db5\u76d6\u6d4b\u8bd5\u91d1\u5b57\u5854\u3001\u4f7f\u7528 pytest \u8fdb\u884c\u7684\u5355\u5143\u6d4b\u8bd5\u3001Mock\u3001\u6d4b\u8bd5\u673a\u5668\u5b66\u4e60\u7279\u5b9a\u4ee3\u7801\u3001CI/CD \u7ba1\u9053\u3001\u4ee3\u7801\u68c0\u67e5\u3001\u683c\u5f0f\u5316\u548c\u4ee3\u7801\u5ba1\u67e5\u2014\u2014\u8fd9\u4e9b\u5b9e\u8df5\u80fd\u5728\u9519\u8bef\u5230\u8fbe\u751f\u4ea7\u73af\u5883\u4e4b\u524d\u6355\u83b7\u5b83\u4eec\u3002
\u673a\u5668\u5b66\u4e60\u4ee3\u7801\u4ee5\u7f3a\u4e4f\u6d4b\u8bd5\u800c\u95fb\u540d\u3002\"\u80fd\u8bad\u7ec3\uff0c\u6240\u4ee5\u80fd\u5de5\u4f5c\"\u662f\u666e\u904d\u6001\u5ea6\u3002\u8fd9\u4f1a\u5bfc\u81f4\u9759\u9ed8\u9519\u8bef\uff1a\u4e00\u4e2a\u9519\u8bef\u5730\u6253\u4e71\u6570\u636e\u7684\u6570\u636e\u52a0\u8f7d\u5668\u3001\u4e00\u4e2a\u6709\u7b26\u53f7\u9519\u8bef\u7684\u635f\u5931\u51fd\u6570\u3001\u4e00\u4e2a\u4e22\u5f03 5% \u6570\u636e\u7684\u9884\u5904\u7406\u6b65\u9aa4\u3002\u8fd9\u4e9b\u9519\u8bef\u4e0d\u4f1a\u4f7f\u4f60\u7684\u7a0b\u5e8f\u5d29\u6e83\u3002\u5b83\u4eec\u53ea\u662f\u8ba9\u4f60\u7684\u6a21\u578b\u6084\u6084\u53d8\u5dee\uff0c\u7136\u540e\u4f60\u6d6a\u8d39\u6570\u5468\u65f6\u95f4\u8c03\u8bd5\"\u672c\u5e94\u66f4\u9ad8\"\u7684\u6307\u6807\u3002
\u6d4b\u8bd5\u4e0d\u662f\u989d\u5916\u8d1f\u62c5\u3002\u5b83\u662f\u5feb\u901f\u524d\u8fdb\u800c\u4e0d\u7834\u574f\u4e1c\u897f\u7684\u6700\u5feb\u65b9\u5f0f\u3002
\u6d4b\u8bd5\u6309\u5c42\u7ea7\u7ec4\u7ec7\uff0c\u4ece\u5feb\u901f\u4e14\u72ed\u7a84\u5230\u6162\u901f\u4e14\u5e7f\u6cdb\uff1a
\u5355\u5143\u6d4b\u8bd5\uff08\u5e95\u5c42\uff09\uff1a\u9694\u79bb\u6d4b\u8bd5\u5355\u4e2a\u51fd\u6570\u548c\u7c7b\u3002\u5feb\u901f\uff08\u6beb\u79d2\u7ea7\uff09\uff0c\u6570\u91cf\u591a\uff08\u6570\u767e\u5230\u6570\u5343\uff09\u3002\"normalise_image \u662f\u5426\u4ea7\u751f [0, 1] \u8303\u56f4\u5185\u7684\u503c\uff1f\"
\u96c6\u6210\u6d4b\u8bd5\uff08\u4e2d\u5c42\uff09\uff1a\u6d4b\u8bd5\u7ec4\u4ef6\u534f\u540c\u5de5\u4f5c\u3002\u8f83\u6162\uff08\u79d2\u7ea7\uff09\u3002\"\u6570\u636e\u52a0\u8f7d\u5668\u662f\u5426\u4ee5\u6a21\u578b\u671f\u671b\u7684\u683c\u5f0f\u4ea7\u751f\u6279\u6b21\uff1f\"
\u7aef\u5230\u7aef\u6d4b\u8bd5\uff08\u9876\u5c42\uff09\uff1a\u6d4b\u8bd5\u4ece\u8f93\u5165\u5230\u8f93\u51fa\u7684\u5b8c\u6574\u7ba1\u9053\u3002\u8f83\u6162\uff08\u5206\u949f\u7ea7\uff09\u3002\"python train.py --config test.yaml \u662f\u5426\u65e0\u9519\u8bef\u5b8c\u6210\u5e76\u4ea7\u751f\u6709\u6548\u7684\u68c0\u67e5\u70b9\uff1f\"
\u91d1\u5b57\u5854\u5f62\u72b6\u610f\u5473\u7740\uff1a\u7f16\u5199\u5927\u91cf\u5355\u5143\u6d4b\u8bd5\uff0c\u8f83\u5c11\u6570\u91cf\u7684\u96c6\u6210\u6d4b\u8bd5\uff0c\u4ee5\u53ca\u5c11\u91cf\u7aef\u5230\u7aef\u6d4b\u8bd5\u3002\u5355\u5143\u6d4b\u8bd5\u6355\u83b7\u5927\u591a\u6570\u9519\u8bef\uff0c\u5e76\u5728\u51e0\u79d2\u949f\u5185\u8fd0\u884c\u3002\u7aef\u5230\u7aef\u6d4b\u8bd5\u6355\u83b7\u96c6\u6210\u95ee\u9898\uff0c\u4f46\u6162\u4e14\u8106\u5f31\u3002
test_ \u5f00\u5934\u7684\u51fd\u6570\uff0c\u653e\u5728\u4ee5 test_ \u5f00\u5934\u7684\u6587\u4ef6\u4e2d\uff1a# tests/test_utils.py\n\ndef test_normalise_image():\n import numpy as np\n image = np.array([0, 128, 255], dtype=np.uint8)\n result = normalise_image(image, mean=128, std=128)\n assert result.min() >= -1.0\n assert result.max() <= 1.0\n assert abs(result[1]) < 1e-6 # 128 \u88ab mean=128 \u5f52\u4e00\u5316\u540e\u5e94\u7ea6\u4e3a 0\n\ndef test_normalise_empty():\n import numpy as np\n image = np.array([], dtype=np.uint8)\n result = normalise_image(image, mean=128, std=128)\n assert len(result) == 0\n pytest tests/ # \u8fd0\u884c\u6240\u6709\u6d4b\u8bd5\npytest tests/test_utils.py # \u8fd0\u884c\u4e00\u4e2a\u6587\u4ef6\npytest -v # \u8be6\u7ec6\u8f93\u51fa\npytest -x # \u5728\u7b2c\u4e00\u4e2a\u5931\u8d25\u65f6\u505c\u6b62\npytest -k \"normalise\" # \u8fd0\u884c\u5339\u914d\u540d\u79f0\u6a21\u5f0f\u7684\u6d4b\u8bd5\npytest --tb=short # \u66f4\u77ed\u7684\u8ffd\u6eaf\u4fe1\u606f\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/#_3","title":"\u5939\u5177","text":"import pytest\n\n@pytest.fixture\ndef sample_dataset():\n \"\"\"\u521b\u5efa\u4e00\u4e2a\u7528\u4e8e\u6d4b\u8bd5\u7684\u5c0f\u578b\u6570\u636e\u96c6\u3002\"\"\"\n return {\n \"inputs\": torch.randn(10, 3, 32, 32),\n \"labels\": torch.randint(0, 10, (10,))\n }\n\n@pytest.fixture\ndef trained_model():\n \"\"\"\u52a0\u8f7d\u4e00\u4e2a\u5c0f\u578b\u9884\u8bad\u7ec3\u6a21\u578b\u3002\"\"\"\n model = SmallModel()\n model.load_state_dict(torch.load(\"tests/fixtures/small_model.pt\"))\n return model\n\ndef test_model_output_shape(trained_model, sample_dataset):\n output = trained_model(sample_dataset[\"inputs\"])\n assert output.shape == (10, 10) # batch_size x num_classes\n scope=\"function\"\uff08\u9ed8\u8ba4\uff0c\u6bcf\u6b21\u6d4b\u8bd5\u91cd\u65b0\u521b\u5efa\uff09\u3001scope=\"module\"\uff08\u6bcf\u4e2a\u6587\u4ef6\u4e00\u6b21\uff09\u3001scope=\"session\"\uff08\u6bcf\u6b21\u6d4b\u8bd5\u8fd0\u884c\u4e00\u6b21\uff09\u3002\u5bf9\u4e8e\u52a0\u8f7d\u6a21\u578b\u7b49\u6602\u8d35\u8bbe\u7f6e\uff0c\u4f7f\u7528 scope=\"session\"\u3002@pytest.mark.parametrize(\"input,expected\", [\n ([1, 2, 3], 6),\n ([], 0),\n ([-1, 1], 0),\n ([1000000, 1000000], 2000000),\n])\ndef test_sum(input, expected):\n assert sum(input) == expected\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/#mock","title":"Mock \u4e0e\u8865\u4e01","text":"from unittest.mock import patch, MagicMock\n\ndef test_training_logs_metrics():\n mock_logger = MagicMock()\n\n with patch(\"my_project.training.trainer.wandb\") as mock_wandb:\n trainer = Trainer(logger=mock_logger)\n trainer.train_one_epoch()\n\n # \u9a8c\u8bc1\u8bad\u7ec3\u5668\u8bb0\u5f55\u4e86\u6307\u6807\n mock_logger.log.assert_called()\n # \u9a8c\u8bc1\u5b83\u8bb0\u5f55\u4e86\u635f\u5931\u503c\n call_args = mock_logger.log.call_args\n assert \"loss\" in call_args[1]\n \u4f55\u65f6\u4f7f\u7528 Mock\uff1a\u5916\u90e8\u670d\u52a1\uff08API\u3001\u6570\u636e\u5e93\u3001\u4e91\u5b58\u50a8\uff09\u3001\u6602\u8d35\u64cd\u4f5c\uff08GPU \u8ba1\u7b97\u3001\u5927\u578b\u6587\u4ef6 I/O\uff09\u548c\u975e\u786e\u5b9a\u6027\u884c\u4e3a\uff08\u968f\u673a\u6570\u751f\u6210\u5668\u3001\u65f6\u95f4\u6233\uff09\u3002
\u4f55\u65f6\u4e0d\u8981 Mock\uff1a\u4f60\u81ea\u5df1\u7684\u4ee3\u7801\u3002\u5982\u679c\u4f60 Mock \u4e86\u6240\u6709\u5185\u5bb9\uff0c\u4f60\u7684\u6d4b\u8bd5\u9a8c\u8bc1\u7684\u662f Mock \u7684\u884c\u4e3a\u7b26\u5408\u9884\u671f\uff0c\u800c\u4e0d\u662f\u4f60\u7684\u4ee3\u7801\u80fd\u5de5\u4f5c\u3002\u5728\u8fb9\u754c\u5904\u8fdb\u884c Mock\uff0c\u76f4\u63a5\u6d4b\u8bd5\u4f60\u7684\u903b\u8f91\u3002
import random\nimport numpy as np\nimport torch\n\ndef set_seed(seed=42):\n random.seed(seed)\n np.random.seed(seed)\n torch.manual_seed(seed)\n if torch.cuda.is_available():\n torch.cuda.manual_seed_all(seed)\n torch.backends.cudnn.deterministic = True\n torch.backends.cudnn.benchmark = False\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/#_7","title":"\u6570\u503c\u5bb9\u5dee","text":"# \u7cdf\u7cd5\uff1a\u7531\u4e8e\u6d6e\u70b9\u6570\u95ee\u9898\uff0c\u7cbe\u786e\u6bd4\u8f83\u4f1a\u5931\u8d25\nassert model_output == 0.5\n\n# \u826f\u597d\uff1a\u8fd1\u4f3c\u6bd4\u8f83\nimport numpy as np\nassert np.isclose(model_output, 0.5, atol=1e-5)\n\n# \u5bf9\u4e8e\u5f20\u91cf\nassert torch.allclose(output, expected, atol=1e-4)\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/#_8","title":"\u673a\u5668\u5b66\u4e60\u4e2d\u9700\u8981\u6d4b\u8bd5\u4ec0\u4e48","text":"def test_model_output_shape():\n model = MyModel(d_model=256, n_classes=10)\n x = torch.randn(8, 32, 256) # batch=8, seq=32, dim=256\n output = model(x)\n assert output.shape == (8, 10)\n def test_gradients_flow():\n model = MyModel()\n x = torch.randn(4, 3, 32, 32)\n y = torch.randint(0, 10, (4,))\n\n output = model(x)\n loss = F.cross_entropy(output, y)\n loss.backward()\n\n for name, param in model.named_parameters():\n assert param.grad is not None, f\"\u6ca1\u6709 {name} \u7684\u68af\u5ea6\"\n assert param.grad.abs().sum() > 0, f\"{name} \u7684\u68af\u5ea6\u4e3a\u96f6\"\n def test_overfit_one_batch():\n model = MyModel()\n optimiser = torch.optim.Adam(model.parameters(), lr=1e-3)\n x, y = get_single_batch()\n\n for _ in range(100):\n loss = F.cross_entropy(model(x), y)\n loss.backward()\n optimiser.step()\n optimiser.zero_grad()\n\n assert loss.item() < 0.01, f\"\u65e0\u6cd5\u8fc7\u62df\u5408\u5355\u4e2a\u6279\u6b21\uff1aloss={loss.item()}\"\n def test_dataset_basics():\n dataset = MyDataset(\"tests/fixtures/small_data.csv\")\n assert len(dataset) > 0\n x, y = dataset[0]\n assert x.shape == (3, 224, 224)\n assert 0 <= y < 10\n assert not torch.isnan(x).any()\n assert not torch.isinf(x).any()\n def test_determinism():\n set_seed(42)\n output1 = model(input_data)\n set_seed(42)\n output2 = model(input_data)\n assert torch.allclose(output1, output2)\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/#cicd","title":"CI/CD \u7ba1\u9053","text":"\u6301\u7eed\u96c6\u6210\uff08CI\uff09\uff1a\u5728\u6bcf\u6b21\u63d0\u4ea4\u6216 PR \u4e0a\u81ea\u52a8\u8fd0\u884c\u6d4b\u8bd5\u3002\u5982\u679c\u6d4b\u8bd5\u5931\u8d25\uff0cPR \u4e0d\u80fd\u5408\u5e76\u3002\u8fd9\u9632\u6b62\u4e86\u635f\u574f\u7684\u4ee3\u7801\u5230\u8fbe main\u3002
GitHub Actions \u793a\u4f8b\uff08.github/workflows/ci.yml\uff09\uff1a
name: CI\non: [push, pull_request]\n\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-python@v5\n with:\n python-version: \"3.11\"\n - run: pip install -e \".[dev]\"\n - run: ruff check src/\n - run: mypy src/\n - run: pytest tests/ -v --tb=short\n # .pre-commit-config.yaml\nrepos:\n - repo: https://github.com/astral-sh/ruff-pre-commit\n rev: v0.3.0\n hooks:\n - id: ruff\n args: [--fix]\n - id: ruff-format\n - repo: https://github.com/pre-commit/pre-commit-hooks\n rev: v4.5.0\n hooks:\n - id: trailing-whitespace\n - id: end-of-file-fixer\n - id: check-yaml\n pip install pre-commit\npre-commit install # \u73b0\u5728\u6bcf\u6b21 git \u63d0\u4ea4\u65f6\u90fd\u4f1a\u8fd0\u884c\u94a9\u5b50\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/#_9","title":"\u4ee3\u7801\u68c0\u67e5\u4e0e\u683c\u5f0f\u5316","text":"\u4ee3\u7801\u68c0\u67e5\u65e0\u9700\u8fd0\u884c\u4ee3\u7801\u5373\u53ef\u6355\u83b7\u9519\u8bef\u548c\u98ce\u683c\u95ee\u9898\u3002\u683c\u5f0f\u5316\u81ea\u52a8\u5f3a\u5236\u6267\u884c\u4e00\u81f4\u7684\u98ce\u683c\u3002
Ruff\uff1a\u4e00\u4e2a\u5feb\u901f\u7684 Python \u4ee3\u7801\u68c0\u67e5\u5668\u548c\u683c\u5f0f\u5316\u5668\uff08\u5728\u4e00\u4e2a\u5de5\u5177\u4e2d\u66ff\u4ee3 flake8\u3001isort \u548c black\uff09\uff1a
ruff check src/ # \u4ee3\u7801\u68c0\u67e5\nruff check --fix src/ # \u4ee3\u7801\u68c0\u67e5\u5e76\u81ea\u52a8\u4fee\u590d\nruff format src/ # \u683c\u5f0f\u5316\n mypy src/\n# src/model.py:42: error: Argument 1 to \"forward\" has incompatible type \"int\"; expected \"Tensor\"\n def train(\n model: nn.Module,\n dataloader: DataLoader,\n optimiser: torch.optim.Optimizer,\n num_epochs: int = 10,\n) -> float:\n \"\"\"\u8bad\u7ec3\u6a21\u578b\u5e76\u8fd4\u56de\u6700\u7ec8\u635f\u5931\u3002\"\"\"\n ...\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/04.%20testing%20and%20quality%20assurance/#_10","title":"\u4ee3\u7801\u5ba1\u67e5\u6700\u4f73\u5b9e\u8df5","text":"\u5bf9\u4e8e\u4f5c\u8005\uff1a
\u5bf9\u4e8e\u5ba1\u67e5\u8005\uff1a
\u90e8\u7f72\u662f\u4f60\u7684\u6a21\u578b\u4ece\u7814\u7a76\u4ea7\u7269\u53d8\u6210\u4ea7\u54c1\u7684\u5730\u65b9\u3002\u672c\u6587\u6db5\u76d6\u7528\u4e8e\u673a\u5668\u5b66\u4e60\u7684 Docker\u3001\u6a21\u578b\u63a8\u7406\u3001\u5b9e\u9a8c\u8ffd\u8e2a\u3001\u53ef\u91cd\u73b0\u6027\u3001\u751f\u4ea7\u73af\u5883\u76d1\u63a7\u3001\u7279\u5f81\u5b58\u50a8\u548c\u7ba1\u9053\u7f16\u6392\u2014\u2014\u8fd9\u4e9b\u57fa\u7840\u8bbe\u65bd\u5c06\u4e00\u4e2a\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u4ece notebook \u5e26\u5230\u6570\u767e\u4e07\u7528\u6237\u9762\u524d\u3002
\u4e00\u4e2a\u53ea\u5728\u4f60\u7b14\u8bb0\u672c\u7535\u8111\u4e0a\u8fd0\u884c\u7684\u6a21\u578b\u662f\u539f\u578b\u3002\u4e00\u4e2a\u80fd\u591f\u53ef\u9760\u5730\u5927\u89c4\u6a21\u8fd0\u884c\u3001\u5728\u6beb\u79d2\u5185\u63d0\u4f9b\u9884\u6d4b\u7ed3\u679c\u3001\u80fd\u591f\u4ece\u6545\u969c\u4e2d\u6062\u590d\u5e76\u5728\u4e0d\u4e2d\u65ad\u670d\u52a1\u7684\u60c5\u51b5\u4e0b\u66f4\u65b0\u7684\u6a21\u578b\u624d\u662f\u4ea7\u54c1\u3002\u4e24\u8005\u4e4b\u95f4\u7684\u5dee\u8ddd\u5c31\u662f\u90e8\u7f72\u4e0e DevOps\u3002
\u5927\u591a\u6570\u673a\u5668\u5b66\u4e60\u5de5\u7a0b\u5e08\u5728\u90e8\u7f72\u3001\u76d1\u63a7\u548c\u8c03\u8bd5\u751f\u4ea7\u95ee\u9898\u4e0a\u82b1\u8d39\u7684\u65f6\u95f4\u6bd4\u8bad\u7ec3\u6a21\u578b\u8fd8\u591a\u3002\u7406\u89e3\u8fd9\u4e9b\u57fa\u7840\u8bbe\u65bd\u5bf9\u4e8e\u4efb\u4f55\u6784\u5efa\u771f\u5b9e ML \u7cfb\u7edf\u7684\u4eba\u6765\u8bf4\u90fd\u4e0d\u662f\u53ef\u9009\u9879\u3002
\u6211\u4eec\u5728\u7b2c 13 \u7ae0\uff08\u64cd\u4f5c\u7cfb\u7edf\uff09\u4e2d\u6982\u5ff5\u6027\u5730\u4ecb\u7ecd\u4e86\u5bb9\u5668\u3002\u8fd9\u91cc\u6211\u4eec\u5173\u6ce8\u5b9e\u8df5\u65b9\u9762\uff1a\u4e3a\u673a\u5668\u5b66\u4e60\u5de5\u4f5c\u8d1f\u8f7d\u7f16\u5199 Dockerfile\u3002
Dockerfile \u662f\u6784\u5efa\u5bb9\u5668\u955c\u50cf\u7684\u914d\u65b9\uff1a
# \u4ece\u5b98\u65b9\u7684 CUDA \u57fa\u7840\u955c\u50cf\u5f00\u59cb\nFROM nvidia/cuda:12.1.0-cudnn8-runtime-ubuntu22.04\n\n# \u7cfb\u7edf\u4f9d\u8d56\nRUN apt-get update && apt-get install -y \\\n python3.11 python3-pip git \\\n && rm -rf /var/lib/apt/lists/*\n\n# Python \u4f9d\u8d56\uff08\u5355\u72ec\u5b89\u88c5\u4ee5\u5229\u7528\u7f13\u5b58\uff09\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\n# \u590d\u5236\u6e90\u4ee3\u7801\uff08\u9891\u7e41\u66f4\u6539\uff0c\u56e0\u6b64\u6b64\u5c42\u653e\u5728\u6700\u540e\uff09\nCOPY src/ /app/src/\nCOPY configs/ /app/configs/\nWORKDIR /app\n\n# \u5165\u53e3\u70b9\nCMD [\"python3\", \"src/scripts/serve.py\", \"--config\", \"configs/serve.yaml\"]\n \u5c42\u7f13\u5b58\uff1aDocker \u4f1a\u7f13\u5b58\u6bcf\u4e00\u5c42\u3002\u5982\u679c requirements.txt \u6ca1\u6709\u53d8\u5316\uff0cpip install \u5728\u91cd\u65b0\u6784\u5efa\u65f6\u4f1a\u88ab\u8df3\u8fc7\u3002\u5c06\u4e0d\u5e38\u66f4\u6539\u7684\u5c42\uff08\u7cfb\u7edf\u5305\u3001pip \u5b89\u88c5\uff09\u653e\u5728\u9891\u7e41\u66f4\u6539\u7684\u5c42\uff08\u6e90\u4ee3\u7801\uff09\u4e4b\u524d\u3002\u8fd9\u5c06 10 \u5206\u949f\u7684\u6784\u5efa\u53d8\u6210 10 \u79d2\u7684\u91cd\u65b0\u6784\u5efa\u3002
GPU \u8bbf\u95ee\uff1a\u4f7f\u7528 nvidia/cuda \u57fa\u7840\u955c\u50cf\uff0c\u5e76\u4f7f\u7528 docker run --gpus all \u8fd0\u884c\u3002nvidia-container-toolkit \u63d0\u4f9b\u4ece\u5bbf\u4e3b\u673a\u5230\u5bb9\u5668\u7684 GPU \u900f\u4f20\u3002
\u591a\u9636\u6bb5\u6784\u5efa\u901a\u8fc7\u5c06\u6784\u5efa\u73af\u5883\u4e0e\u8fd0\u884c\u73af\u5883\u5206\u79bb\u6765\u51cf\u5c0f\u955c\u50cf\u5927\u5c0f\uff1a
# \u6784\u5efa\u9636\u6bb5\uff1a\u5b89\u88c5\u6784\u5efa\u5de5\u5177\u3001\u7f16\u8bd1\u4f9d\u8d56\nFROM python:3.11 AS builder\nCOPY requirements.txt .\nRUN pip install --user -r requirements.txt\n\n# \u8fd0\u884c\u9636\u6bb5\uff1a\u4ec5\u8fd0\u884c\u73af\u5883\u4f9d\u8d56\nFROM nvidia/cuda:12.1.0-cudnn8-runtime-ubuntu22.04\nCOPY --from=builder /root/.local /root/.local\nCOPY src/ /app/src/\nENV PATH=/root/.local/bin:$PATH\n \u6700\u7ec8\u955c\u50cf\u53ea\u5305\u542b\u8fd0\u884c\u65f6\u5e93\uff0c\u4e0d\u5305\u542b\u7f16\u8bd1\u5668\u3001\u5934\u6587\u4ef6\u6216\u6784\u5efa\u5de5\u5177\u3002\u4e00\u4e2a 5GB \u7684\u6784\u5efa\u955c\u50cf\u53d8\u6210\u4e86 2GB \u7684\u8fd0\u884c\u955c\u50cf\u3002
Docker Compose \u8fd0\u884c\u591a\u5bb9\u5668\u8bbe\u7f6e\uff08\u6a21\u578b\u670d\u52a1\u5668 + \u8d1f\u8f7d\u5747\u8861\u5668 + \u76d1\u63a7\uff09\uff1a
# docker-compose.yml\nservices:\n model:\n build: .\n ports:\n - \"8080:8080\"\n deploy:\n resources:\n reservations:\n devices:\n - capabilities: [gpu]\n prometheus:\n image: prom/prometheus\n ports:\n - \"9090:9090\"\n"},{"location":"chapter%2015%3A%20production%20software%20engineering/05.%20deployment%20and%20devops/#_1","title":"\u6a21\u578b\u63a8\u7406","text":"\u6a21\u578b\u63a8\u7406\u662f\u5c06\u63a8\u7406\u4f5c\u4e3a\u670d\u52a1\u8fd0\u884c\uff1a\u63a5\u6536\u8bf7\u6c42\u3001\u8fd0\u884c\u6a21\u578b\u3001\u8fd4\u56de\u9884\u6d4b\u7ed3\u679c\u3002
FastAPI\uff08\u5728\u6587\u4ef6 03 \u4e2d\u4ecb\u7ecd\uff09\u9002\u7528\u4e8e\u4f4e\u5230\u4e2d\u7b49\u541e\u5410\u91cf\u7684\u6700\u7b80\u5355\u65b9\u6cd5\u3002\u5bf9\u4e8e\u9ad8\u541e\u5410\u91cf\u548c GPU \u4f18\u5316\u63a8\u7406\uff0c\u4f7f\u7528\u4e13\u7528\u5de5\u5177\uff1a
Triton Inference Server\uff08NVIDIA\uff09\uff1a\u4ee5 TensorRT\u3001ONNX\u3001PyTorch \u548c TensorFlow \u683c\u5f0f\u63d0\u4f9b\u6a21\u578b\u3002\u7279\u6027\uff1a
TorchServe\uff08PyTorch\uff09\uff1a\u4ee5 REST/gRPC API \u63d0\u4f9b PyTorch \u6a21\u578b\u3002\u652f\u6301\u6a21\u578b\u7248\u672c\u63a7\u5236\u3001A/B \u6d4b\u8bd5\u548c\u81ea\u5b9a\u4e49\u5904\u7406\u5668\u3002
vLLM\uff1a\u4e13\u95e8\u7528\u4e8e LLM \u63a8\u7406\u3002\u5b9e\u73b0\u4e86 PagedAttention\uff08\u9ad8\u6548\u7684 KV \u7f13\u5b58\u7ba1\u7406\uff09\u3001\u8fde\u7eed\u6279\u5904\u7406\u548c\u8de8 GPU \u7684\u5f20\u91cf\u5e76\u884c\u3002\u5bf9\u4e8e\u5927\u8bed\u8a00\u6a21\u578b\uff0c\u541e\u5410\u91cf\u6bd4\u6734\u7d20\u63a8\u7406\u9ad8\u51fa 10-20 \u500d\u3002
Cactus\uff08github.com/cactus-compute/cactus\uff09\uff1a\u4e00\u4e2a\u7528\u4e8e\u79fb\u52a8\u7aef\u548c\u8fb9\u7f18\u7aef\u8bbe\u5907\u63a8\u7406\u7684\u4f4e\u5ef6\u8fdf AI \u5f15\u64ce\u3002Cactus \u63d0\u4f9b\u517c\u5bb9 OpenAI \u7684 API\uff08\u804a\u5929\u8865\u5168\u3001\u6d41\u5f0f\u4f20\u8f93\u3001\u5de5\u5177\u8c03\u7528\u3001\u8f6c\u5f55\u3001\u5d4c\u5165\u3001RAG\u3001\u89c6\u89c9\uff09\uff0c\u5b8c\u5168\u5728\u8bbe\u5907\u4e0a\u8fd0\u884c\uff0c\u5f53\u672c\u5730\u6a21\u578b\u65e0\u6cd5\u5904\u7406\u8bf7\u6c42\u65f6\u81ea\u52a8\u8fdb\u884c\u4e91\u56de\u9000\u3002\u8fd9\u79cd\u6df7\u5408\u67b6\u6784\u610f\u5473\u7740\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\u4ee3\u7801\u4f7f\u7528\u76f8\u540c\u7684 API\uff0c\u65e0\u8bba\u63a8\u7406\u662f\u5728\u672c\u5730\u8fd8\u662f\u5728\u4e91\u7aef\u8fd0\u884c\u2014\u2014\u5f15\u64ce\u6839\u636e\u6a21\u578b\u7f6e\u4fe1\u5ea6\u548c\u8bbe\u5907\u80fd\u529b\u6765\u51b3\u5b9a\u3002\u63d0\u4f9b Python\u3001Swift\u3001Kotlin\u3001Flutter\u3001React Native \u548c Rust \u7684 SDK\uff0c\u4ee5\u53ca HuggingFace \u4e0a\u9884\u8f6c\u6362\u7684\u6a21\u578b\u6743\u91cd\u3002\u652f\u6301\u591a\u6a21\u6001\u63a8\u7406\uff08LLM\u3001\u89c6\u89c9\u3001\u8bed\u97f3\uff09\uff0c\u914d\u5907\u81ea\u5b9a\u4e49 ARM SIMD \u5185\u6838\u4ee5\u5b9e\u73b0 ARM CPU \u4e0a\u7684\u6700\u5feb\u63a8\u7406\uff0c\u4ee5\u53ca\u96f6\u62f7\u8d1d\u5185\u5b58\u6620\u5c04\u4ee5\u5b9e\u73b0 10 \u500d RAM \u4f7f\u7528\u964d\u4f4e\uff08\u7b2c 16 \u7ae0\u3001\u7b2c 17 \u7ae0\uff09\u3002
\u6a21\u578b\u683c\u5f0f\u4f18\u5316\uff1a
\u6ca1\u6709\u5b9e\u9a8c\u8ffd\u8e2a\uff0c\u673a\u5668\u5b66\u4e60\u7814\u7a76\u4f1a\u9000\u5316\u4e3a\uff1a\"\u6211\u89c9\u5f97\u4e0a\u5468\u4e8c\u90a3\u4e2a\u6211\u6539\u4e86\u4e9b\u914d\u7f6e\u7684\u6a21\u578b\u662f\u6700\u597d\u7684\uff0c\u4f46\u6211\u4e0d\u8bb0\u5f97\u6539\u4e86\u5565\u3002\"
Weights & Biases\uff08W&B\uff09\uff1a\u6700\u6d41\u884c\u7684\u5b9e\u9a8c\u8ffd\u8e2a\u5de5\u5177\u3002\u4ece\u4f60\u7684\u8bad\u7ec3\u811a\u672c\u4e2d\u8bb0\u5f55\u4efb\u4f55\u5185\u5bb9\uff1a
import wandb\n\nwandb.init(project=\"my-project\", config={\n \"model\": \"transformer\",\n \"lr\": 3e-4,\n \"batch_size\": 64,\n})\n\nfor epoch in range(num_epochs):\n train_loss = train_one_epoch()\n val_loss = validate()\n\n wandb.log({\n \"train/loss\": train_loss,\n \"val/loss\": val_loss,\n \"epoch\": epoch,\n })\n\n # \u5c06\u6a21\u578b\u8bb0\u5f55\u4e3a\u4ea7\u7269\n if val_loss < best_loss:\n wandb.save(\"best_model.pt\")\n\nwandb.finish()\n W&B \u63d0\u4f9b\uff1a\u7528\u4e8e\u6bd4\u8f83\u8fd0\u884c\u7684\u4eea\u8868\u677f\u3001\u8d85\u53c2\u6570\u626b\u63cf\u5de5\u5177\u3001\u6a21\u578b\u6ce8\u518c\u8868\u3001\u6570\u636e\u96c6\u7248\u672c\u63a7\u5236\u548c\u56e2\u961f\u534f\u4f5c\u3002
MLflow\uff1a\u5f00\u6e90\u66ff\u4ee3\u65b9\u6848\u3002\u5728\u672c\u5730\u6216\u670d\u52a1\u5668\u4e0a\u8fd0\u884c\uff1a
import mlflow\n\nmlflow.set_experiment(\"my-experiment\")\n\nwith mlflow.start_run():\n mlflow.log_params({\"lr\": 3e-4, \"batch_size\": 64})\n mlflow.log_metric(\"val_loss\", 0.042, step=epoch)\n mlflow.pytorch.log_model(model, \"model\")\n \u53ef\u91cd\u73b0\u6027\u610f\u5473\u7740\uff1a\u7ed9\u5b9a\u76f8\u540c\u7684\u4ee3\u7801\u3001\u6570\u636e\u548c\u914d\u7f6e\uff0c\u4ea7\u751f\u76f8\u540c\u7684\u6a21\u578b\u3002\u8fd9\u5728\u673a\u5668\u5b66\u4e60\u4e2d\u51fa\u5947\u5730\u56f0\u96be\uff0c\u56e0\u4e3a GPU \u64cd\u4f5c\u7684\u975e\u786e\u5b9a\u6027\u3001\u6570\u636e\u6253\u4e71\u548c\u6d6e\u70b9\u6570\u7d2f\u79ef\u3002
\u53ef\u91cd\u73b0\u6027\u68c0\u67e5\u6e05\u5355\uff1a
pip freeze\u3001Docker \u955c\u50cf\u54c8\u5e0c\u503c\u6216\u9501\u5b9a\u6587\u4ef6 \u786c\u4ef6 GPU \u7c7b\u578b\u3001GPU \u6570\u91cf\u3001CUDA \u7248\u672c \u975e\u786e\u5b9a\u6027 torch.backends.cudnn.deterministic = True\uff08\u8f83\u6162\u4f46\u53ef\u91cd\u73b0\uff09 \u9501\u5b9a\u6240\u6709\u5185\u5bb9\uff1apip install torch==2.2.1 \u800c\u4e0d\u662f torch>=2.0\u3002\u6b21\u7248\u672c\u53f7\u5347\u7ea7\u53ef\u80fd\u6539\u53d8\u6570\u503c\u884c\u4e3a\u3001\u4f18\u5316\u5668\u5b9e\u73b0\u6216\u9ed8\u8ba4\u8d85\u53c2\u6570\u3002
\u4f7f\u7528 Docker \u5b9e\u73b0\u53ef\u91cd\u73b0\u6027\uff1aDocker \u955c\u50cf\u9501\u5b9a\u4e86\u64cd\u4f5c\u7cfb\u7edf\u3001\u7cfb\u7edf\u5e93\u3001Python \u7248\u672c\u548c pip \u5305\u3002\u955c\u50cf\u54c8\u5e0c\u503c\u662f\u5b8c\u6574\u7684\u73af\u5883\u6307\u7eb9\u3002\u5982\u679c\u4f60\u80fd\u91cd\u73b0 Docker \u955c\u50cf\uff0c\u5c31\u80fd\u91cd\u73b0\u8bad\u7ec3\u3002
\u90e8\u7f72\u6a21\u578b\u4e0d\u662f\u7ec8\u70b9\u2014\u2014\u800c\u662f\u4e00\u7cfb\u5217\u65b0\u95ee\u9898\u7684\u5f00\u59cb\u3002\u968f\u7740\u73b0\u5b9e\u4e16\u754c\u7684\u53d8\u5316\uff08\u6982\u5ff5\u6f02\u79fb\uff09\u4ee5\u53ca\u8f93\u5165\u6570\u636e\u5206\u5e03\u7684\u53d8\u5316\uff08\u6570\u636e\u6f02\u79fb\uff09\uff0c\u6a21\u578b\u4f1a\u968f\u65f6\u95f4\u63a8\u79fb\u800c\u9000\u5316\u3002
\u9700\u8981\u76d1\u63a7\u7684\u5185\u5bb9\uff1a
\u5ef6\u8fdf\uff1a\u63a8\u7406\u9700\u8981\u591a\u957f\u65f6\u95f4\uff1f\u8ffd\u8e2a p50\uff08\u4e2d\u4f4d\u6570\uff09\u3001p95 \u548c p99\u3002p99 \u4e3a 500ms \u610f\u5473\u7740\u6bcf 100 \u4e2a\u7528\u6237\u4e2d\u6709 1 \u4e2a\u8981\u7b49\u5f85\u534a\u79d2\u949f\uff0c\u8fd9\u53ef\u80fd\u4e0d\u53ef\u63a5\u53d7\u3002
\u541e\u5410\u91cf\uff1a\u6bcf\u79d2\u5904\u7406\u591a\u5c11\u4e2a\u8bf7\u6c42\uff1f\u7cfb\u7edf\u662f\u5426\u8ddf\u5f97\u4e0a\u9700\u6c42\uff1f
\u9519\u8bef\u7387\uff1a\u6709\u591a\u5c11\u6bd4\u4f8b\u7684\u8bf7\u6c42\u5931\u8d25\uff08\u5f02\u5e38\u3001\u8d85\u65f6\u3001\u65e0\u6548\u8f93\u5165\uff09\uff1f
\u6a21\u578b\u6307\u6807\uff1a\u5728\u9a8c\u8bc1\u96c6\u4e0a\u7684\u51c6\u786e\u7387\u3001\u7cbe\u786e\u7387\u3001\u53ec\u56de\u7387\u3002\u5982\u679c\u751f\u4ea7\u73af\u5883\u4e2d\u5b58\u5728\u6807\u6ce8\u6570\u636e\uff08\u4f8b\u5982\u7528\u6237\u7ea0\u6b63\uff09\uff0c\u8ffd\u8e2a\u5728\u7ebf\u6307\u6807\u3002
\u6570\u636e\u6f02\u79fb\uff1a\u8f93\u5165\u6570\u636e\u7684\u5206\u5e03\u662f\u5426\u53d1\u751f\u4e86\u53d8\u5316\uff1f\u5728\u767d\u5929\u7167\u7247\u4e0a\u8bad\u7ec3\u7684\u6a21\u578b\u53ef\u80fd\u5728\u591c\u95f4\u7167\u7247\u4e0a\u5931\u8d25\u3002\u7edf\u8ba1\u68c0\u9a8c\uff08KS \u68c0\u9a8c\u3001PSI\uff09\u5c06\u8bad\u7ec3\u5206\u5e03\u4e0e\u5728\u7ebf\u5206\u5e03\u8fdb\u884c\u6bd4\u8f83\u3002
\u7279\u5f81\u6f02\u79fb\uff1a\u5355\u4e2a\u7279\u5f81\u7684\u5206\u5e03\u662f\u5426\u53d1\u751f\u4e86\u53d8\u5316\uff1f\u8bad\u7ec3\u65f6\u5448\u6b63\u6001\u5206\u5e03\u4f46\u5728\u751f\u4ea7\u65f6\u5448\u53cc\u5cf0\u5206\u5e03\u7684\u7279\u5f81\uff0c\u8868\u660e\u6570\u636e\u7ba1\u9053\u5b58\u5728\u95ee\u9898\u3002
\u5de5\u5177\uff1a
\u544a\u8b66\uff1a\u4e0d\u8981\u53ea\u653e\u5728\u4eea\u8868\u677f\u4e0a\u2014\u2014\u8bbe\u7f6e\u81ea\u52a8\u544a\u8b66\u3002\"\u5982\u679c p99 \u5ef6\u8fdf\u8d85\u8fc7 200ms \u6301\u7eed 5 \u5206\u949f\uff0c\u53d1\u9001 Slack \u901a\u77e5\u3002\"\"\u5982\u679c\u6570\u636e\u6f02\u79fb\u8bc4\u5206\u8d85\u8fc7\u9608\u503c\uff0c\u901a\u77e5\u503c\u73ed\u5de5\u7a0b\u5e08\u3002\"
\u7279\u5f81\u5b58\u50a8\u662f\u9884\u8ba1\u7b97\u7279\u5f81\u7684\u96c6\u4e2d\u5f0f\u4ed3\u5e93\uff0c\u5728\u8bad\u7ec3\u548c\u63a8\u7406\u4e4b\u95f4\u5171\u4eab\u3002\u5b83\u89e3\u51b3\u4e24\u4e2a\u95ee\u9898\uff1a
\u8bad\u7ec3-\u63a8\u7406\u504f\u5dee\uff1a\u8bad\u7ec3\u671f\u95f4\u4f7f\u7528\u7684\u7279\u5f81\u5fc5\u987b\u4e0e\u63a8\u7406\u671f\u95f4\u4f7f\u7528\u7684\u7279\u5f81\u5b8c\u5168\u76f8\u540c\u3002\u5982\u679c\u8bad\u7ec3\u4f7f\u7528\u4e00\u79cd\u65b9\u5f0f\u8ba1\u7b97\u7684 user_age_at_signup\uff0c\u800c\u63a8\u7406\u4f7f\u7528\u4e0d\u540c\u7684\u65b9\u5f0f\u8ba1\u7b97\uff0c\u6a21\u578b\u7684\u9884\u6d4b\u7ed3\u679c\u4f1a\u9759\u9ed8\u51fa\u9519\u3002
\u7279\u5f81\u590d\u7528\uff1a\u591a\u4e2a\u6a21\u578b\u901a\u5e38\u4f7f\u7528\u76f8\u540c\u7684\u7279\u5f81\uff08\u7528\u6237\u4eba\u53e3\u7edf\u8ba1\u3001\u7269\u54c1\u5d4c\u5165\u3001\u805a\u5408\u7edf\u8ba1\uff09\u3002\u8ba1\u7b97\u4e00\u6b21\u5e76\u5171\u4eab\uff0c\u907f\u514d\u4e86\u91cd\u590d\u548c\u4e0d\u4e00\u81f4\u6027\u3002
Feast \u662f\u6700\u6d41\u884c\u7684\u5f00\u6e90\u7279\u5f81\u5b58\u50a8\u3002\u5b83\u7ba1\u7406\u5728\u7ebf\u7279\u5f81\uff08\u4f4e\u5ef6\u8fdf\uff0c\u4ece Redis \u6216 DynamoDB \u63d0\u4f9b\uff09\u548c\u79bb\u7ebf\u7279\u5f81\uff08\u6279\u5904\u7406\uff0c\u5b58\u50a8\u5728\u6570\u636e\u4ed3\u5e93\u4e2d\u7528\u4e8e\u8bad\u7ec3\uff09\u3002
\u7279\u5f81\u5b58\u50a8\u5bf9\u4e8e\u63a8\u8350\u7cfb\u7edf\u3001\u6b3a\u8bc8\u68c0\u6d4b\u4ee5\u53ca\u4efb\u4f55\u7279\u5f81\u4ece\u539f\u59cb\u6570\u636e\u7ba1\u9053\u8ba1\u7b97\u800c\u6765\u7684\u5e94\u7528\u90fd\u81f3\u5173\u91cd\u8981\u3002
\u751f\u4ea7\u7ea7\u673a\u5668\u5b66\u4e60\u7cfb\u7edf\u4e0d\u4ec5\u4ec5\u662f\u6a21\u578b\u3002\u5b83\u662f\u4e00\u4e2a\u7ba1\u9053\uff1a\u6570\u636e\u91c7\u96c6 \u2192 \u9884\u5904\u7406 \u2192 \u7279\u5f81\u8ba1\u7b97 \u2192 \u8bad\u7ec3 \u2192 \u8bc4\u4f30 \u2192 \u90e8\u7f72 \u2192 \u76d1\u63a7\u3002\u6bcf\u4e2a\u6b65\u9aa4\u4f9d\u8d56\u4e8e\u524d\u4e00\u6b65\u9aa4\uff0c\u53ef\u4ee5\u72ec\u7acb\u5931\u8d25\uff0c\u53ef\u80fd\u9700\u8981\u5728\u4e0d\u540c\u7684\u65f6\u95f4\u8868\u4e0a\u8fd0\u884c\u3002
\u7f16\u6392\u5668\u7ba1\u7406\u8fd9\u4e9b\u7ba1\u9053\uff1a
Apache Airflow\uff1a\u6570\u636e\u7ba1\u9053\u7f16\u6392\u7684\u6807\u51c6\u65b9\u6848\u3002DAG\uff08\u6709\u5411\u65e0\u73af\u56fe\uff09\u5b9a\u4e49\u4efb\u52a1\u4f9d\u8d56\u5173\u7cfb\u3002\u6bcf\u4e2a\u4efb\u52a1\u72ec\u7acb\u8fd0\u884c\uff0c\u5931\u8d25\u65f6\u53ef\u4ee5\u91cd\u8bd5\uff0c\u5e76\u901a\u8fc7 Web UI \u8fdb\u884c\u76d1\u63a7\u3002
# airflow DAG \u793a\u4f8b\uff08\u7b80\u5316\uff09\nfrom airflow import DAG\nfrom airflow.operators.python import PythonOperator\n\ndag = DAG(\"training_pipeline\", schedule=\"@daily\")\n\npreprocess = PythonOperator(task_id=\"preprocess\", python_callable=preprocess_data, dag=dag)\ntrain = PythonOperator(task_id=\"train\", python_callable=train_model, dag=dag)\nevaluate = PythonOperator(task_id=\"evaluate\", python_callable=evaluate_model, dag=dag)\ndeploy = PythonOperator(task_id=\"deploy\", python_callable=deploy_model, dag=dag)\n\npreprocess >> train >> evaluate >> deploy\n Kubeflow Pipelines\uff1a\u5728 Kubernetes \u4e0a\u8fd0\u884c\u673a\u5668\u5b66\u4e60\u7279\u5b9a\u7f16\u6392\u3002\u6bcf\u4e2a\u6b65\u9aa4\u5728\u5bb9\u5668\u4e2d\u8fd0\u884c\uff0cGPU \u8d44\u6e90\u6309\u9700\u5206\u914d\uff0c\u5b9e\u9a8c\u81ea\u52a8\u8ffd\u8e2a\u3002
Prefect \u548c Dagster\uff1aAirflow \u7684\u73b0\u4ee3\u66ff\u4ee3\u65b9\u6848\uff0c\u62e5\u6709\u66f4\u597d\u7684\u5f00\u53d1\u8005\u4f53\u9a8c\u3001\u539f\u751f Python API \u548c\u5185\u7f6e\u6570\u636e\u8840\u7f18\u8ffd\u8e2a\u3002
\u4f55\u65f6\u9700\u8981\u7f16\u6392\uff1a\u5f53\u4f60\u7684\u7ba1\u9053\u6709\u8d85\u8fc7 2-3 \u4e2a\u6b65\u9aa4\u3001\u6309\u8ba1\u5212\u8fd0\u884c\u3001\u6d89\u53ca\u591a\u4e2a\u56e2\u961f\u6216\u670d\u52a1\u3001\u6216\u9700\u8981\u81ea\u52a8\u6545\u969c\u6062\u590d\u65f6\u3002\u5355\u4e00\u811a\u672c\u7684\u8bad\u7ec3\u4efb\u52a1\u4e0d\u9700\u8981\u7f16\u6392\u5668\u3002\u6bcf\u5929\u91cd\u65b0\u8bad\u7ec3\u7684\u7ba1\u9053\u2014\u2014\u4ece 5 \u4e2a\u6570\u636e\u6e90\u91c7\u96c6\u6570\u636e\u3001\u8bad\u7ec3 3 \u4e2a\u6a21\u578b\u3001\u8bc4\u4f30\u5b83\u4eec\u5e76\u90e8\u7f72\u6700\u4f73\u6a21\u578b\u2014\u2014\u7edd\u5bf9\u9700\u8981\u3002
\u672c\u4e66\u4e2d\u6bcf\u4e00\u6b21 jnp.matmul\u3001\u6bcf\u4e00\u6b21 torch.nn.Linear\u3001\u6bcf\u4e00\u6b21 np.dot \u8c03\u7528\uff0c\u5e95\u5c42\u90fd\u5728\u6267\u884cC++\u548cCUDA\u4ee3\u7801\u3002\u672c\u6587\u6863\u63ed\u5f00\u5e37\u5e55\uff1a\u4e3a\u4f55ML\u6846\u67b6\u91c7\u7528\u8fd9\u79cd\u67b6\u6784\uff0c\u9762\u5411Python\u5de5\u7a0b\u5e08\u7684C++\u5feb\u901f\u5165\u95e8\uff0c\u4f55\u65f6\u7f16\u5199\u81ea\u5b9a\u4e49C++\u6838\u51fd\u6570\uff0c\u4ee5\u53ca\u5982\u4f55\u5c06\u5176\u7ed1\u5b9a\u5230Python\u2014\u2014\u8fd9\u662f\u8fde\u63a5\u4f60\u6240\u5199\u4ee3\u7801\u4e0e\u6240\u8fd0\u884c\u786c\u4ef6\u4e4b\u95f4\u7684\u6865\u6881\u3002
\u4f60\u82b1\u4e8615\u7ae0\u5199Python\u3002\u4f60\u5bfc\u5165\u4e86JAX\uff0c\u8c03\u7528\u4e86jax.grad\uff0c\u8fd0\u884c\u4e86\u8bad\u7ec3\u5faa\u73af\uff0c\u6784\u5efa\u4e86\u6a21\u578b\u3002\u4e00\u5207\u611f\u89c9\u90fd\u50cf\u662fPython\u3002\u4f46\u4e8b\u5b9e\u662f\uff1a\u51e0\u4e4e\u6ca1\u6709\u5b9e\u9645\u8ba1\u7b97\u53d1\u751f\u5728Python\u4e2d\u3002
\u5f53\u4f60\u5728PyTorch\u4e2d\u5199 output = model(input) \u6216\u5728JAX\u4e2d\u5199 output = jnp.matmul(W, x) \u65f6\uff0cPython\u51e0\u4e4e\u4ec0\u4e48\u90fd\u4e0d\u505a\u3002\u5b83\u6784\u5efa\u4e00\u4e2a\u8ba1\u7b97\u7684\u63cf\u8ff0\uff08\u4e00\u4e2a\u64cd\u4f5c\u56fe\uff09\uff0c\u7136\u540e\u5c06\u5176\u4ea4\u7ed9\u6267\u884c\u771f\u6b63\u5de5\u4f5c\u7684C++/CUDA\u540e\u7aef\u3002Python\u662f\u65b9\u5411\u76d8\uff1bC++\u662f\u5f15\u64ce\u3002
\u6838\u5fc3\u89c1\u89e3\uff1a\u6bcf\u79cd\u8bed\u8a00\u53d1\u6325\u5176\u4f18\u52bf\u3002Python\u5904\u7406\u4eba\u529b\u751f\u4ea7\u529b\u91cd\u8981\u7684\u4e8b\u52a1\uff08\u5b9e\u9a8c\u8bbe\u8ba1\u3001\u8d85\u53c2\u6570\u8c03\u4f18\u3001\u6570\u636e\u63a2\u7d22\uff09\u3002C++\u5904\u7406\u673a\u5668\u6027\u80fd\u91cd\u8981\u7684\u4e8b\u52a1\uff08\u77e9\u9635\u4e58\u6cd5\u3001\u5377\u79ef\u3001\u6ce8\u610f\u529b\u6838\u51fd\u6570\uff09\u3002
\u4e00\u6b21\u77e9\u9635\u4e58\u6cd5 jnp.matmul(A, B)\uff0c\u5176\u4e2d \\(A\\) \u4e3a \\(4096 \\times 4096\\)\uff0c\u6267\u884c\u7ea61370\u4ebf\u6b21\u6d6e\u70b9\u8fd0\u7b97\u3002\u5728\u7eafPython\uff08\u5d4c\u5957\u5faa\u73af\uff09\u4e2d\u9700\u8981\u7ea630\u5206\u949f\u3002\u5728\u4f7f\u7528AVX-512 SIMD\u548c\u591a\u7ebf\u7a0b\u4f18\u5316\u540e\u7684C++\u4e2d\uff0c\u53ea\u9700\u7ea610\u6beb\u79d2\u3002\u5dee\u8ddd\u8fbe180,000\u500d\u3002\u518d\u591a\u7684Python\u6280\u5de7\u4e5f\u65e0\u6cd5\u5f25\u5408\u8fd9\u4e00\u9e3f\u6c9f\u3002
\u7528\u6237\u4ee3\u7801\uff08Python\uff09\n \u2193\nPython API\u5c42\uff08torch.nn\u3001jax.numpy\u3001numpy\uff09\n \u2193\n\u8c03\u5ea6/JIT\u7f16\u8bd1\u5668\uff08torch.compile\u3001XLA\u3001NumPy\u8c03\u5ea6\uff09\n \u2193\nC++\u6838\u51fd\u6570\u5e93\uff08ATen/PyTorch\u3001XLA\u3001BLAS/LAPACK\uff09\n \u2193\n\u786c\u4ef6\u7279\u5b9a\u540e\u7aef\uff08CUDA\u3001cuDNN\u3001MKL\u3001oneDNN\u3001Metal\uff09\n \u2193\n\u786c\u4ef6\uff08CPU SIMD\u5355\u5143\u3001GPU\u6838\u5fc3\u3001TPU MXU\uff09\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/00.%20why%20C%2B%2B%20and%20how%20ML%20frameworks%20work/#numpy","title":"NumPy","text":"NumPy\u7684\u6838\u5fc3\u7528C\u7f16\u5199\u3002\u5f53\u4f60\u8c03\u7528 np.dot(A, B) \u65f6\uff0cPython\u8c03\u7528\u4e00\u4e2aC\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u8c03\u7528BLAS\uff08\u57fa\u672c\u7ebf\u6027\u4ee3\u6570\u5b50\u7a0b\u5e8f\uff09\uff0c\u901a\u5e38\u662fIntel MKL\u6216OpenBLAS\u3002BLAS\u662f\u624b\u5de5\u4f18\u5316\u7684C\u548cFortran\u4ee3\u7801\uff0c\u4f7f\u7528SIMD\u6307\u4ee4\u3001\u7f13\u5b58\u611f\u77e5\u7684\u5185\u5b58\u8bbf\u95ee\u6a21\u5f0f\u548c\u591a\u7ebf\u7a0b\u3002\u6570\u5341\u5e74\u4f18\u5316\u81f4\u529b\u4e8e\u8ba9\u77e9\u9635\u4e58\u6cd5\u66f4\u5feb\u3002
NumPy\u4ec5\u652f\u6301CPU\uff0c\u4e0d\u4f7f\u7528GPU\u3002\u4f46\u5728CPU\u4e0a\uff0c\u5b83\u6781\u5176\u5feb\u901f\uff0c\u56e0\u4e3a\u5b83\u59d4\u6258\u7ed9\u53ef\u7528\u7684\u6700\u4f73BLAS\u5b9e\u73b0\u3002
PyTorch\u7684\u8ba1\u7b97\u5f15\u64ce\u662fATen\uff08\u5f20\u91cf\u5e93\uff09\uff0c\u7528C++\u7f16\u5199\u3002ATen\u5b9e\u73b0\u4e86\u7ea62000\u4e2a\u5f20\u91cf\u64cd\u4f5c\uff08add\u3001matmul\u3001conv2d\u3001softmax...\uff09\uff0c\u6bcf\u4e2a\u90fd\u6709CPU\u548cCUDA\u540e\u7aef\u3002
\u5f53\u4f60\u8c03\u7528 torch.matmul(A, B) \u65f6\uff1a
torch.compile\uff08PyTorch 2.0+\uff09\u66f4\u8fdb\u4e00\u6b65\uff1a\u5b83\u8ffd\u8e2a\u4f60\u7684Python\u4ee3\u7801\uff0c\u6784\u5efa\u8ba1\u7b97\u56fe\uff0c\u5e76\u4f7f\u7528Triton\uff08GPU\uff09\u6216C++/OpenMP\uff08CPU\uff09\u7f16\u8bd1\u3002\u7f16\u8bd1\u540e\u7684\u4ee3\u7801\u878d\u5408\u64cd\u4f5c\uff0c\u6d88\u9664Python\u5f00\u9500\uff0c\u53ef\u4ee5\u6bd4\u5373\u65f6\u6a21\u5f0f\u5feb2-5\u500d\u3002
JAX\u5c06Python\u51fd\u6570\u7f16\u8bd1\u4e3aXLA\uff08\u52a0\u901f\u7ebf\u6027\u4ee3\u6570\uff09\uff0cGoogle\u7684ML\u7f16\u8bd1\u5668\u3002\u5f53\u4f60 jax.jit \u4e00\u4e2a\u51fd\u6570\u65f6\uff1a
\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48 jax.jit \u5982\u6b64\u91cd\u8981\uff1a\u6ca1\u6709\u5b83\uff0c\u6bcf\u4e2a\u64cd\u4f5c\u90fd\u662f\u72ec\u7acb\u7684Python\u2192C++\u5f80\u8fd4\u3002\u6709\u4e86\u5b83\uff0c\u6574\u4e2a\u51fd\u6570\u662f\u4e00\u4e2a\u5355\u4e00\u7684\u7f16\u8bd1\u6838\u51fd\u6570\u3002
// C++\u9700\u8981\u663e\u5f0f\u7c7b\u578b\uff08\u4e0d\u50cfPython\uff09\nint count = 0; // 32\u4f4d\u6574\u6570\nfloat loss = 0.5f; // 32\u4f4d\u6d6e\u70b9\u6570\ndouble lr = 3e-4; // 64\u4f4d\u6d6e\u70b9\u6570\nbool training = true; // \u5e03\u5c14\u503c\n\n// \u6570\u7ec4\uff08\u56fa\u5b9a\u5927\u5c0f\uff0c\u6808\u5206\u914d\uff09\nfloat weights[1024]; // 1024\u4e2a\u6d6e\u70b9\u6570\uff0c\u5185\u5b58\u4e2d\u8fde\u7eed\n\n// \u6307\u9488\uff1a\u4fdd\u5b58\u5185\u5b58\u5730\u5740\u7684\u53d8\u91cf\nfloat* ptr = weights; // ptr\u6307\u5411weights\u7684\u7b2c\u4e00\u4e2a\u5143\u7d20\nfloat val = ptr[42]; // \u901a\u8fc7\u6307\u9488\u8fd0\u7b97\u8bbf\u95ee\u5143\u7d2042\n// ptr[42] \u7b49\u4ef7\u4e8e *(ptr + 42)\n // \u51fd\u6570\u58f0\u660e\uff1a\u8fd4\u56de\u7c7b\u578b \u540d\u5b57(\u53c2\u6570\u7c7b\u578b \u53c2\u6570\u540d)\nfloat relu(float x) {\n return x > 0.0f ? x : 0.0f;\n}\n\n// \u4f20\u5f15\u7528\uff08\u907f\u514d\u62f7\u8d1d\u5927\u5bf9\u8c61\uff09\nvoid scale_vector(std::vector<float>& vec, float factor) {\n for (size_t i = 0; i < vec.size(); i++) {\n vec[i] *= factor;\n }\n}\n\n// const\u5f15\u7528\uff1a\u53ea\u8bfb\uff0c\u65e0\u62f7\u8d1d\nfloat sum(const std::vector<float>& vec) {\n float total = 0.0f;\n for (float x : vec) { // \u57fa\u4e8e\u8303\u56f4\u7684for\u5faa\u73af\uff08\u7c7b\u4f3cPython\u7684for x in vec\uff09\n total += x;\n }\n return total;\n}\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/00.%20why%20C%2B%2B%20and%20how%20ML%20frameworks%20work/#_3","title":"\u5185\u5b58\uff1a\u6808\u4e0e\u5806","text":"// \u6808\u5206\u914d\uff1a\u5feb\u901f\uff0c\u81ea\u52a8\u751f\u547d\u5468\u671f\uff08\u51fd\u6570\u8fd4\u56de\u65f6\u91ca\u653e\uff09\nfloat buffer[256]; // \u6808\u4e0a\u7684256\u4e2a\u6d6e\u70b9\u6570\n\n// \u5806\u5206\u914d\uff1a\u624b\u52a8\uff0c\u5728\u51fd\u6570\u5916\u4ecd\u7136\u5b58\u6d3b\nfloat* data = new float[n]; // \u5728\u5806\u4e0a\u5206\u914dn\u4e2a\u6d6e\u70b9\u6570\n// ... \u4f7f\u7528data ...\ndelete[] data; // \u5fc5\u987b\u624b\u52a8\u91ca\u653e\uff08\u6ca1\u6709\u5783\u573e\u56de\u6536\u5668\uff09\n\n// \u73b0\u4ee3C++\uff1a\u667a\u80fd\u6307\u9488\uff08\u81ea\u52a8\u6e05\u7406\uff0c\u7c7b\u4f3cPython\u5f15\u7528\uff09\n#include <memory>\nauto data = std::make_unique<float[]>(n); // \u79bb\u5f00\u4f5c\u7528\u57df\u65f6\u81ea\u52a8\u91ca\u653e\n // \u9002\u7528\u4e8e\u4efb\u4f55\u6570\u503c\u7c7b\u578b\u7684\u51fd\u6570\ntemplate <typename T>\nT add(T a, T b) {\n return a + b;\n}\n\nadd<float>(1.5f, 2.5f); // \u8fd4\u56de 4.0f\nadd<int>(3, 4); // \u8fd4\u56de 7\n #include <vector> // \u52a8\u6001\u6570\u7ec4\uff08\u7c7b\u4f3cPython list\uff09\n#include <string> // \u5b57\u7b26\u4e32\u7c7b\u578b\n#include <unordered_map> // \u54c8\u5e0c\u6620\u5c04\uff08\u7c7b\u4f3cPython dict\uff09\n#include <algorithm> // sort\u3001find\u3001transform\u7b49\n#include <cmath> // \u6570\u5b66\u51fd\u6570\n\nstd::vector<float> vec = {1.0f, 2.0f, 3.0f};\nvec.push_back(4.0f); // \u8ffd\u52a0\nfloat first = vec[0]; // \u7d22\u5f15\nsize_t len = vec.size(); // \u957f\u5ea6\n\nstd::unordered_map<std::string, int> counts;\ncounts[\"hello\"] = 5; // \u63d2\u5165\nif (counts.count(\"hello\")) { } // \u68c0\u67e5\u5b58\u5728\u6027\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/00.%20why%20C%2B%2B%20and%20how%20ML%20frameworks%20work/#c","title":"\u4f55\u65f6\u7f16\u5199\u81ea\u5b9a\u4e49C++\u6838\u51fd\u6570","text":"\u5927\u591a\u6570ML\u5de5\u7a0b\u5e08\u4ece\u4e0d\u9700\u8981\u5199C++\u3002\u6846\u67b6\u7684\u5185\u7f6e\u64cd\u4f5c\u8986\u76d6\u4e8699%\u7684\u7528\u4f8b\u3002\u4ec5\u5728\u4ee5\u4e0b\u60c5\u51b5\u8003\u8651\u81ea\u5b9a\u4e49C++\uff1a
\u6846\u67b6\u4e2d\u4e0d\u5b58\u5728\u4f60\u7684\u64cd\u4f5c\uff1a\u65b0\u9896\u7684\u6fc0\u6d3b\u51fd\u6570\u3001\u81ea\u5b9a\u4e49\u6ce8\u610f\u529b\u6a21\u5f0f\u3001\u65e0\u6cd5\u8868\u793a\u4e3a\u73b0\u6709\u64cd\u4f5c\u7ec4\u5408\u7684\u7279\u6b8a\u635f\u5931\u51fd\u6570\u3002
\u878d\u5408\u64cd\u4f5c\u4ee5\u63d0\u9ad8\u6027\u80fd\uff1a\u4f60\u7684\u6a21\u578b\u6267\u884c relu(layernorm(matmul(x, W) + b))\u3002\u6bcf\u4e2a\u64cd\u4f5c\u542f\u52a8\u4e00\u4e2a\u72ec\u7acb\u7684\u6838\u51fd\u6570\uff0c\u8bfb\u5199\u5185\u5b58\uff0c\u5e76\u540c\u6b65\u3002\u4e00\u4e2a\u878d\u5408\u6838\u51fd\u6570\u5728\u4e00\u6b21\u904d\u5386\u4e2d\u5b8c\u6210\u6240\u6709\u5de5\u4f5c\uff0c\u907f\u514d\u5185\u5b58\u5f80\u8fd4\u3002\u8fd9\u53ef\u5feb2-5\u500d\u3002
\u51cf\u5c11\u5185\u5b58\u4f7f\u7528\uff1a\u81ea\u5b9a\u4e49\u6838\u51fd\u6570\u53ef\u4ee5\u5728\u4e0d\u5b58\u50a8\u6240\u6709\u4e2d\u95f4\u6fc0\u6d3b\u7684\u60c5\u51b5\u4e0b\u8ba1\u7b97\u68af\u5ea6\uff08\u6838\u51fd\u6570\u7ea7\u522b\u7684\u68af\u5ea6\u68c0\u67e5\u70b9\uff09\u3002
\u9488\u5bf9\u65b0\u578b\u786c\u4ef6\uff1a\u65b0\u7684\u52a0\u901f\u5668\uff08\u5982Cerebras\u3001Groq\uff09\u53ef\u80fd\u6ca1\u6709\u6846\u67b6\u652f\u6301\u3002\u4f60\u9700\u8981\u76f4\u63a5\u7f16\u5199\u6838\u51fd\u6570\u3002
\u5bf9\u4e8e\u60c5\u51b51-2\uff0cTriton\uff08\u7b2c16\u7ae0\u6587\u4ef605\uff09\u901a\u5e38\u8db3\u591f\u4e14\u6bd4\u76f4\u63a5\u7f16\u5199CUDA C\u66f4\u7b80\u5355\u3002\u53ea\u6709\u5728Triton\u65e0\u6cd5\u8868\u8fbe\u4f60\u7684\u9700\u6c42\u65f6\u624d\u4e0b\u964d\u5230CUDA C\u3002
// my_ops.cpp\n#include <pybind11/pybind11.h>\n#include <pybind11/numpy.h>\nnamespace py = pybind11;\n\n// \u4e00\u4e2a\u7b80\u5355\u7684\u81ea\u5b9a\u4e49\u64cd\u4f5c\npy::array_t<float> custom_relu(py::array_t<float> input) {\n auto buf = input.request();\n float* ptr = static_cast<float*>(buf.ptr);\n size_t n = buf.size;\n\n auto result = py::array_t<float>(n);\n float* out = static_cast<float*>(result.request().ptr);\n\n for (size_t i = 0; i < n; i++) {\n out[i] = ptr[i] > 0 ? ptr[i] : 0;\n }\n return result;\n}\n\nPYBIND11_MODULE(my_ops, m) {\n m.def(\"custom_relu\", &custom_relu, \"\u81ea\u5b9a\u4e49ReLU\u64cd\u4f5c\");\n}\n # \u7f16\u8bd1\npip install pybind11\nc++ -O3 -shared -std=c++17 -fPIC $(python3 -m pybind11 --includes) my_ops.cpp -o my_ops$(python3-config --extension-suffix)\n # \u4ecePython\u4f7f\u7528\nimport my_ops\nimport numpy as np\n\nx = np.array([-1.0, 2.0, -3.0, 4.0], dtype=np.float32)\ny = my_ops.custom_relu(x)\nprint(y) # [0. 2. 0. 4.]\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/00.%20why%20C%2B%2B%20and%20how%20ML%20frameworks%20work/#pytorch-c","title":"PyTorch C++\u6269\u5c55","text":"// custom_op.cpp\n#include <torch/extension.h>\n\ntorch::Tensor custom_gelu(torch::Tensor x) {\n return x * 0.5 * (1.0 + torch::erf(x / std::sqrt(2.0)));\n}\n\nPYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {\n m.def(\"custom_gelu\", &custom_gelu, \"\u81ea\u5b9a\u4e49GELU\u6fc0\u6d3b\u51fd\u6570\");\n}\n # \u52a8\u6001\u52a0\u8f7d\u548c\u7f16\u8bd1\nfrom torch.utils.cpp_extension import load\n\ncustom_ops = load(\n name=\"custom_ops\",\n sources=[\"custom_op.cpp\"],\n extra_cflags=[\"-O3\"],\n)\n\nx = torch.randn(1000)\ny = custom_ops.custom_gelu(x)\n torch.utils.cpp_extension.load \u7f16\u8bd1C++\u4ee3\u7801\uff0c\u521b\u5efa\u5171\u4eab\u5e93\uff0c\u5e76\u5c06\u5176\u4f5c\u4e3aPython\u6a21\u5757\u52a0\u8f7d\uff0c\u5168\u5728\u4e00\u4e2a\u8c03\u7528\u4e2d\u5b8c\u6210\u3002\u8fd9\u662f\u5728PyTorch\u4e2d\u5b9e\u9a8c\u81ea\u5b9a\u4e49C++\u64cd\u4f5c\u7684\u6700\u7b80\u5355\u65b9\u5f0f\u3002JAX\u4f7f\u7528XLA\u81ea\u5b9a\u4e49\u8c03\u7528\u3002\u8fc7\u7a0b\u66f4\u4e3a\u590d\u6742\uff08\u4f60\u9700\u8981\u5411XLA\u6ce8\u518c\u4e00\u4e2aC\u51fd\u6570\uff09\uff0c\u4f46\u6982\u5ff5\u76f8\u540c\uff1a\u7f16\u5199C/C++\uff0c\u7ed1\u5b9a\uff0c\u4ecePython\u8c03\u7528\u3002
\u5bf9\u4e8e\u5927\u591a\u6570JAX\u7528\u6237\uff0cPallas\uff08\u5728\u6587\u4ef605\u4e2d\u4ecb\u7ecd\uff09\u662f\u66f4\u597d\u7684\u9009\u62e9\uff1a\u5b83\u8ba9\u4f60\u7528\u7c7b\u4f3cPython\u7684\u8bed\u6cd5\u7f16\u5199GPU\u6838\u51fd\u6570\uff0c\u7531XLA\u7f16\u8bd1\uff0c\u65e0\u9700\u79bb\u5f00JAX\u751f\u6001\u7cfb\u7edf\u3002
\u672c\u6587\u89e3\u91ca\u4e86Python\u548c\u786c\u4ef6\u4e4b\u95f4\u7684\u5c42\u6b21\u3002\u672c\u7ae0\u5269\u4f59\u6587\u4ef6\u5c06\u6df1\u5165\u63a2\u8ba8\uff1a
\u8fd9\u79cd\u9012\u8fdb\u53cd\u6620\u4e86\u62bd\u8c61\u9636\u68af\uff1aC++\u5185\u8054\u51fd\u6570\uff08\u6700\u4f4e\u5c42\u3001\u6700\u591a\u63a7\u5236\uff09\u2192 CUDA\uff08GPU\u4e13\u7528\uff09\u2192 Triton/Pallas\uff08Python\u98ce\u683c\u3001\u7f16\u8bd1\u578b\uff09\u2192 JAX/PyTorch\uff08\u6700\u9ad8\u5c42\u3001\u81ea\u52a8\uff09\u3002\u6bcf\u4e00\u5c42\u4ee5\u63a7\u5236\u6743\u6362\u53d6\u4fbf\u5229\u6027\u3002\u7406\u89e3\u8f83\u4f4e\u5c42\u4f7f\u4f60\u6210\u4e3a\u8f83\u9ad8\u5c42\u7684\u66f4\u597d\u4f7f\u7528\u8005\u3002
\u7f16\u5199\u4f60\u7684\u7b2c\u4e00\u4e2aC++\u7a0b\u5e8f\u3002\u5206\u914d\u4e00\u4e2a\u6570\u7ec4\uff0c\u586b\u5145\u6570\u636e\uff0c\u8ba1\u7b97\u603b\u548c\uff0c\u5e76\u6d4b\u91cf\u65f6\u95f4\u3002\u8fd9\u4ecb\u7ecd\u4e86\u7f16\u8bd1\u3001\u6570\u7ec4\u3001\u6307\u9488\u548c\u8ba1\u65f6\u3002
// task1_basics.cpp\n// \u7f16\u8bd1\uff1ag++ -O3 -o task1 task1_basics.cpp\n// \u8fd0\u884c\uff1a./task1\n\n#include <iostream>\n#include <chrono>\n#include <vector>\n\nint main() {\n const int N = 10'000'000; // C++\u5141\u8bb8'\u4f5c\u4e3a\u6570\u5b57\u5206\u9694\u7b26\n std::vector<float> data(N);\n\n // \u586b\u5145\u6570\u7ec4\n for (int i = 0; i < N; i++) {\n data[i] = static_cast<float>(i) * 0.001f;\n }\n\n // \u8ba1\u7b97\u603b\u548c\n auto start = std::chrono::high_resolution_clock::now();\n float sum = 0.0f;\n for (int i = 0; i < N; i++) {\n sum += data[i];\n }\n auto end = std::chrono::high_resolution_clock::now();\n double elapsed = std::chrono::duration<double, std::milli>(end - start).count();\n\n std::cout << \"\u603b\u548c: \" << sum << std::endl;\n std::cout << \"\u65f6\u95f4: \" << elapsed << \" ms\" << std::endl;\n std::cout << \"\u5143\u7d20\u6570: \" << N << std::endl;\n std::cout << \"\u541e\u5410\u91cf: \" << (N * sizeof(float)) / elapsed / 1e6 << \" GB/s\" << std::endl;\n\n return 0;\n}\n \u7f16\u5199\u4e00\u4e2aC++\u51fd\u6570\u5728\u6570\u7ec4\u4e0a\u8ba1\u7b97ReLU\uff0c\u7136\u540e\u4f7f\u7528pybind11\u6784\u5efaPython\u7ed1\u5b9a\u3002\u4ecePython\u8c03\u7528\u5b83\u5e76\u4e0eNumPy\u6bd4\u8f83\u901f\u5ea6\u3002
// task2_relu.cpp\n// \u7f16\u8bd1\uff1ac++ -O3 -shared -std=c++17 -fPIC $(python3 -m pybind11 --includes) \\\n// task2_relu.cpp -o my_relu$(python3-config --extension-suffix)\n\n#include <pybind11/pybind11.h>\n#include <pybind11/numpy.h>\nnamespace py = pybind11;\n\npy::array_t<float> cpp_relu(py::array_t<float> input) {\n auto buf = input.request();\n float* ptr = static_cast<float*>(buf.ptr);\n int n = buf.size;\n\n auto result = py::array_t<float>(n);\n float* out = static_cast<float*>(result.request().ptr);\n\n for (int i = 0; i < n; i++) {\n out[i] = ptr[i] > 0.0f ? ptr[i] : 0.0f;\n }\n return result;\n}\n\nPYBIND11_MODULE(my_relu, m) {\n m.def(\"relu\", &cpp_relu, \"C++ ReLU\");\n}\n # test_relu.py \u2014 \u5728\u7f16\u8bd1\u4e0a\u8ff0C++\u6a21\u5757\u540e\u8fd0\u884c\nimport numpy as np\nimport time\nimport my_relu # \u7f16\u8bd1\u540e\u7684C++\u6a21\u5757\n\nx = np.random.randn(10_000_000).astype(np.float32)\n\n# C++ ReLU\nstart = time.time()\nfor _ in range(100):\n y_cpp = my_relu.relu(x)\ncpp_time = (time.time() - start) / 100\n\n# NumPy ReLU\nstart = time.time()\nfor _ in range(100):\n y_np = np.maximum(x, 0)\nnp_time = (time.time() - start) / 100\n\nprint(f\"C++ ReLU: {cpp_time*1000:.2f} ms\")\nprint(f\"NumPy ReLU: {np_time*1000:.2f} ms\")\nprint(f\"\u5339\u914d: {np.allclose(y_cpp, y_np)}\")\n \u7f16\u5199\u4e00\u4e2aC++\u7a0b\u5e8f\uff0c\u6f14\u793a\u4e3a\u4f55\u5185\u5b58\u5e03\u5c40\u5f88\u91cd\u8981\u3002\u6bd4\u8f83\u884c\u4f18\u5148\u4e0e\u5217\u4f18\u5148\u8bbf\u95ee\u6a21\u5f0f\u5e76\u6d4b\u91cf\u6027\u80fd\u5dee\u5f02\u3002
// task3_layout.cpp\n// \u7f16\u8bd1\uff1ag++ -O3 -o task3 task3_layout.cpp\n\n#include <iostream>\n#include <chrono>\n#include <vector>\n\nint main() {\n const int N = 4096;\n std::vector<float> matrix(N * N, 1.0f);\n\n // \u884c\u4f18\u5148\u8bbf\u95ee\uff1a\u8fde\u7eed\u5185\u5b58\u5730\u5740\uff08\u7f13\u5b58\u53cb\u597d\uff09\n auto start = std::chrono::high_resolution_clock::now();\n float sum_row = 0.0f;\n for (int i = 0; i < N; i++) {\n for (int j = 0; j < N; j++) {\n sum_row += matrix[i * N + j]; // \u6b65\u957f1\u8bbf\u95ee\n }\n }\n auto end = std::chrono::high_resolution_clock::now();\n double row_ms = std::chrono::duration<double, std::milli>(end - start).count();\n\n // \u5217\u4f18\u5148\u8bbf\u95ee\uff1a\u6b65\u957fN\u8bbf\u95ee\uff08\u7f13\u5b58\u4e0d\u53cb\u597d\uff09\n start = std::chrono::high_resolution_clock::now();\n float sum_col = 0.0f;\n for (int j = 0; j < N; j++) {\n for (int i = 0; i < N; i++) {\n sum_col += matrix[i * N + j]; // \u6b65\u957fN\u8bbf\u95ee\uff08\u7f13\u5b58\u7f3a\u5931\uff01\uff09\n }\n }\n end = std::chrono::high_resolution_clock::now();\n double col_ms = std::chrono::duration<double, std::milli>(end - start).count();\n\n std::cout << \"\u884c\u4f18\u5148\uff08\u7f13\u5b58\u53cb\u597d\uff09: \" << row_ms << \" ms\" << std::endl;\n std::cout << \"\u5217\u4f18\u5148\uff08\u7f13\u5b58\u4e0d\u53cb\u597d\uff09: \" << col_ms << \" ms\" << std::endl;\n std::cout << \"\u51cf\u901f\u6bd4: \" << col_ms / row_ms << \"x\" << std::endl;\n std::cout << \"\uff08\u4e24\u4e2a\u548c: \" << sum_row << \", \" << sum_col << \"\uff09\" << std::endl;\n\n return 0;\n}\n \u5728\u7f16\u5199SIMD\u6216GPU\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u4e86\u89e3\u6240\u7f16\u7a0b\u7684\u786c\u4ef6\u3002\u672c\u6587\u6db5\u76d6\u4e3a\u4ec0\u4e48\u5e76\u884c\u6027\u53d6\u4ee3\u4e86\u65f6\u949f\u901f\u5ea6\u3001\u73b0\u4ee3CPU\u5982\u4f55\u6267\u884c\u6307\u4ee4\u3001\u4ec0\u4e48\u662fSIMD\u3001\u7528\u4e8e\u63a8\u7406\u6027\u80fd\u7684\u5c4b\u9876\u7ebf\u6a21\u578b\uff0c\u4ee5\u53ca\u82af\u7247\u67b6\u6784\u7684\u5168\u666f
\u6469\u5c14\u5b9a\u5f8b\uff081965\u5e74\uff09\u89c2\u5bdf\u5230\u82af\u7247\u4e0a\u7684\u6676\u4f53\u7ba1\u6570\u91cf\u5927\u7ea6\u6bcf\u4e24\u5e74\u7ffb\u4e00\u756a\u3002\u8fd9\u4e00\u89c4\u5f8b\u7ef4\u6301\u4e8660\u5e74\u3002\u66f4\u591a\u6676\u4f53\u7ba1\u610f\u5473\u7740\u66f4\u5c0f\u7684\u6676\u4f53\u7ba1\uff0c\u8fdb\u800c\u610f\u5473\u7740\u66f4\u9ad8\u7684\u65f6\u949f\u9891\u7387\uff0c\u4ece\u800c\u610f\u5473\u7740\u66f4\u5feb\u7684\u7a0b\u5e8f\u3002
\u4f46\u57282005\u5e74\u5de6\u53f3\uff0c\u65f6\u949f\u9891\u7387\u5728\u5927\u7ea64 GHz\u5904\u649e\u4e0a\u4e86\u5899\u58c1\u3002\u95ee\u9898\u662f\u529f\u8017\u3002\u82af\u7247\u6d88\u8017\u7684\u529f\u7387\u5927\u7ea6\u4e3a\uff1a
\u5176\u4e2d \\(C\\) \u662f\u7535\u5bb9\uff08\u4e0e\u6676\u4f53\u7ba1\u6570\u91cf\u6210\u6b63\u6bd4\uff09\uff0c\\(V\\) \u662f\u7535\u538b\uff0c\\(f\\) \u662f\u65f6\u949f\u9891\u7387\u3002\u8981\u63d0\u9ad8\u9891\u7387\uff0c\u5fc5\u987b\u63d0\u9ad8\u7535\u538b\uff08\u4ee5\u4f7f\u6676\u4f53\u7ba1\u66f4\u5feb\u5730\u5207\u6362\uff09\u3002\u4f46\u529f\u8017\u4e0e \\(V^2 \\cdot f\\) \u6210\u6bd4\u4f8b\uff0c\u6240\u4ee5\u9891\u7387\u7684\u5c0f\u5e45\u589e\u52a0\u4f1a\u5bfc\u81f4\u529f\u8017\uff08\u548c\u70ed\u91cf\uff09\u7684\u5927\u5e45\u589e\u52a0\u3002\u57284 GHz\u65f6\uff0c\u82af\u7247\u5df2\u7ecf\u8fbe\u5230100+\u74e6\u3002\u8fbe\u52308 GHz\u9700\u8981\u4e0d\u5207\u5b9e\u9645\u7684\u51b7\u5374\u65b9\u6848\u3002
\u89e3\u51b3\u65b9\u6848\uff1a\u4e0d\u8ba9\u5355\u4e2a\u6838\u5fc3\u66f4\u5feb\uff0c\u800c\u662f\u5728\u540c\u4e00\u82af\u7247\u4e0a\u653e\u7f6e\u591a\u4e2a\u6838\u5fc3\u3002\u4e00\u4e2a4\u6838\u82af\u7247\u57283 GHz\u4e0b\u4f7f\u7528\u4e0e\u5355\u4e2a\u6838\u5fc3\u57284.5 GHz\u4e0b\u76f8\u4f3c\u7684\u529f\u8017\uff0c\u4f46\u53ef\u4ee5\u505a4\u500d\u7684\u5e76\u884c\u5de5\u4f5c\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u6bcf\u4e2a\u73b0\u4ee3CPU\u90fd\u6709\u591a\u4e2a\u6838\u5fc3\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u5e76\u884c\u6027\uff08SIMD\u3001\u591a\u7ebf\u7a0b\u3001GPU\u8ba1\u7b97\uff09\u662f\u83b7\u5f97\u66f4\u9ad8\u6027\u80fd\u7684\u552f\u4e00\u9014\u5f84\u3002
\u5bf9ML\u7684\u5f71\u54cd\uff1a\u4e00\u4e2a\u5728\u5355\u6838\u4e0a\u9700\u898110\u5206\u949f\u7684\u8bad\u7ec3\u6b65\u9aa4\uff0c\u65e0\u6cd5\u901a\u8fc7\u8d2d\u4e70\u66f4\u5feb\u7684CPU\u6765\u52a0\u901f\u3002\u53ea\u80fd\u901a\u8fc7\u4f7f\u7528\u66f4\u591a\u6838\u5fc3\uff08\u6570\u636e\u5e76\u884c\u6027\uff0c\u7b2c6\u7ae0\uff09\u3001\u66f4\u5bbd\u7684SIMD\u5355\u5143\uff08\u672c\u7ae0\uff09\u6216GPU\uff08\u6570\u5343\u4e2a\u6838\u5fc3\uff09\u6765\u52a0\u901f\u3002
\u73b0\u4ee3CPU\u6838\u5fc3\u8fdc\u6bd4\u7b2c13\u7ae0\u4e2d\u7b80\u5355\u7684\u53d6\u6307-\u8bd1\u7801-\u6267\u884c\u6a21\u578b\u590d\u6742\u3002\u5b83\u4f7f\u7528\u51e0\u79cd\u6280\u5de7\u6765\u6bcf\u5468\u671f\u6267\u884c\u66f4\u591a\u6307\u4ee4\uff1a
\u8d85\u6807\u91cf\u6267\u884c\uff1aCPU\u6709\u591a\u4e2a\u6267\u884c\u5355\u5143\uff08ALU\u3001FPU\u3001\u52a0\u8f7d/\u5b58\u50a8\u5355\u5143\uff09\uff0c\u53ef\u4ee5\u540c\u65f6\u6267\u884c\u591a\u4e2a\u72ec\u7acb\u7684\u6307\u4ee4\u3002\u5982\u679c\u6307\u4ee4\u4e0d\u76f8\u4e92\u4f9d\u8d56\uff0c\u73b0\u4ee3\u6838\u5fc3\u6bcf\u5468\u671f\u53ef\u80fd\u6267\u884c4-6\u6761\u6307\u4ee4\u3002
\u4e71\u5e8f\u6267\u884c\uff08OoO\uff09\uff1aCPU\u4e0d\u6309\u7a0b\u5e8f\u987a\u5e8f\u6267\u884c\u6307\u4ee4\u3002\u5b83\u5411\u524d\u770b\u6307\u4ee4\u6d41\uff0c\u627e\u5230\u8f93\u5165\u5df2\u51c6\u5907\u597d\u7684\u6307\u4ee4\uff0c\u5e76\u7acb\u5373\u6267\u884c\uff0c\u4e0d\u8bba\u5176\u4f4d\u7f6e\u3002\u8fd9\u9690\u85cf\u4e86\u5ef6\u8fdf\uff1a\u5f53\u4e00\u6761\u6307\u4ee4\u7b49\u5f85\u6765\u81ea\u5185\u5b58\u7684\u6570\u636e\u65f6\uff08100+\u5468\u671f\uff09\uff0cCPU\u6267\u884c\u5176\u4ed6\u5df2\u51c6\u5907\u597d\u7684\u6307\u4ee4\u3002
\u5206\u652f\u9884\u6d4b\uff1a\u6761\u4ef6\u5206\u652f\uff08if\u8bed\u53e5\u3001\u5faa\u73af\u6761\u4ef6\uff09\u9020\u6210\u4e0d\u786e\u5b9a\u6027\uff1aCPU\u5728\u6761\u4ef6\u88ab\u8bc4\u4f30\u4e4b\u524d\u4e0d\u77e5\u9053\u8d70\u54ea\u6761\u8def\u5f84\u3002\u4e3a\u4e86\u907f\u514d\u505c\u987f\uff0cCPU\u9884\u6d4b\u7ed3\u679c\u5e76\u6cbf\u9884\u6d4b\u8def\u5f84\u6295\u673a\u6267\u884c\u3002\u5982\u679c\u9884\u6d4b\u6b63\u786e\uff08\u4f7f\u7528\u73b0\u4ee3\u9884\u6d4b\u5668\u8d85\u8fc795%\uff09\uff0c\u5219\u6ca1\u6709\u65f6\u95f4\u635f\u5931\u3002\u5982\u679c\u9519\u8bef\uff0c\u6295\u673a\u5de5\u4f5c\u88ab\u4e22\u5f03\uff0c\u6267\u884c\u6b63\u786e\u8def\u5f84\uff08\u7ea615\u5468\u671f\u60e9\u7f5a\uff09\u3002
\u6295\u673a\u6267\u884c\uff1a\u5206\u652f\u9884\u6d4b\u7684\u5ef6\u4f38\u3002CPU\u6267\u884c\u53ef\u80fd\u4e0d\u9700\u8981\u7684\u6307\u4ee4\uff0c\u8d4c\u5b83\u4eec\u4f1a\u88ab\u9700\u8981\u3002\u8fd9\u586b\u5145\u4e86\u6d41\u6c34\u7ebf\u5e76\u4fdd\u6301\u6267\u884c\u5355\u5143\u5fd9\u788c\u3002
\u6240\u6709\u8fd9\u4e9b\u90fd\u662f\u81ea\u52a8\u7684\u2014\u2014CPU\u65e0\u9700\u4efb\u4f55\u7a0b\u5e8f\u5458\u5e72\u9884\u5373\u53ef\u5b8c\u6210\u3002\u4f46\u5b83\u4eec\u53ea\u5e2e\u52a9\u6307\u4ee4\u7ea7\u5e76\u884c\u6027\uff08ILP\uff09\uff1a\u5355\u6761\u6d41\u5185\u76f8\u4e92\u72ec\u7acb\u7684\u6307\u4ee4\u3002\u5bf9\u4e8e\u6570\u636e\u7ea7\u5e76\u884c\u6027\uff08\u5bf9\u8bb8\u591a\u6570\u636e\u5143\u7d20\u6267\u884c\u76f8\u540c\u64cd\u4f5c\uff09\uff0c\u6211\u4eec\u9700\u8981SIMD\u3002
SIMD\u662f\u5c06\u4e00\u6761\u6307\u4ee4\u540c\u65f6\u5e94\u7528\u4e8e\u591a\u4e2a\u6570\u636e\u5143\u7d20\u7684\u601d\u60f3\u3002\u4e0d\u662f\u5c06\u4e24\u4e2a\u6570\u76f8\u52a0\uff0c\u800c\u662f\u5728\u4e00\u6761\u6307\u4ee4\u4e2d\u5c06\u4e24\u4e2a4\uff08\u62168\u3001\u621616\uff09\u5143\u7d20\u5411\u91cf\u76f8\u52a0\u3002
\u65e0SIMD\uff08\u6807\u91cf\uff09\uff1a
// \u9010\u5143\u7d20\u76f8\u52a0\u4e24\u6570\u7ec4\uff1a4\u6761\u52a0\u6cd5\u6307\u4ee4\nfor (int i = 0; i < 4; i++) {\n c[i] = a[i] + b[i]; // \u6bcf\u6b21\u8fed\u4ee3\u4e00\u6b21\u52a0\u6cd5\n}\n // \u4e24\u6570\u7ec4\u76f8\u52a0\uff1a1\u6761SIMD\u6307\u4ee4\u5b8c\u6210\u6240\u67094\u6b21\u52a0\u6cd5\n#include <immintrin.h> // x86 SIMD\u5185\u8054\u51fd\u6570\n\n__m128 va = _mm_load_ps(a); // \u52a0\u8f7d4\u4e2a\u6d6e\u70b9\u6570\u5230128\u4f4d\u5bc4\u5b58\u5668\n__m128 vb = _mm_load_ps(b); // \u52a0\u8f7d4\u4e2a\u6d6e\u70b9\u6570\u5230\u53e6\u4e00\u4e2a\u5bc4\u5b58\u5668\n__m128 vc = _mm_add_ps(va, vb); // \u540c\u65f6\u76f8\u52a0\u6240\u67094\u5bf9\n_mm_store_ps(c, vc); // \u5b58\u50a84\u4e2a\u7ed3\u679c\n \u66f4\u5bbd\u7684\u5bc4\u5b58\u5668 = \u66f4\u591a\u5e76\u884c\u6027\u3002\u4e00\u6761512\u4f4dAVX-512\u6307\u4ee4\u4e00\u6b21\u5904\u740616\u4e2a\u6d6e\u70b9\u6570\uff0c\u662f\u6807\u91cf\u4ee3\u7801\u7406\u8bba\u4e0a\u768416\u500d\u52a0\u901f\u3002\u5b9e\u9645\u4e0a\uff0c\u7531\u4e8e\u5185\u5b58\u5e26\u5bbd\u9650\u5236\uff08\u8ba1\u7b97\u901f\u5ea6\u53ef\u80fd\u8d85\u8fc7\u5411CPU\u8f93\u9001\u6570\u636e\u7684\u901f\u5ea6\uff09\uff0c\u52a0\u901f\u6bd4\u66f4\u4f4e\u3002
\u5bf9\u4e8eML\uff1afloat32\u503c\u7684\u77e9\u9635\u4e58\u6cd5\u4eceSIMD\u4e2d\u83b7\u76ca\u5de8\u5927\u3002\u5185\u5faa\u73af\uff08\u4e24\u4e2a\u5411\u91cf\u7684\u70b9\u79ef\uff09\u76f4\u63a5\u6620\u5c04\u5230SIMD\u4e58\u52a0\u6307\u4ee4\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48BLAS\u5e93\uff08NumPy\u548cPyTorch\u8c03\u7528\u7684\uff09\u7528SIMD\u8fdb\u884c\u4e86\u5982\u6b64\u6df1\u5ea6\u4f18\u5316\u3002
\u4f60\u5982\u4f55\u77e5\u9053\u4f60\u7684\u4ee3\u7801\u662f\u5426\u5feb\u901f\uff1f\u5c4b\u9876\u7ebf\u6a21\u578b\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6846\u67b6\uff0c\u6839\u636e\u4e24\u4e2a\u786c\u4ef6\u9650\u5236\u6765\u63cf\u8ff0\u6027\u80fd\uff1a
\u5cf0\u503c\u8ba1\u7b97\u80fd\u529b\uff08FLOPS\uff09\uff1a\u6bcf\u79d2\u6700\u5927\u6d6e\u70b9\u8fd0\u7b97\u6b21\u6570\u3002\u5bf9\u4e8e\u4e00\u4e2a4 GHz CPU\uff0c\u914d\u5907256\u4f4dAVX\uff08\u6bcf\u6761\u6307\u4ee48\u4e2a\u6d6e\u70b9\u6570\uff09\u548c2\u4e2aFMA\u5355\u5143\uff1a\\(4 \\times 10^9 \\times 8 \\times 2 = 64\\) GFLOPS\u3002
\u5cf0\u503c\u5185\u5b58\u5e26\u5bbd\uff08\u5b57\u8282/\u79d2\uff09\uff1a\u6570\u636e\u4ece\u5185\u5b58\u5230CPU\u7684\u6700\u5927\u4f20\u8f93\u901f\u5ea6\u3002\u73b0\u4ee3CPU\u53ef\u80fd\u670950 GB/s\u7684\u5185\u5b58\u5e26\u5bbd\u3002
\u4ee3\u7801\u7684\u7b97\u672f\u5f3a\u5ea6\u662f\u8ba1\u7b97\u4e0e\u5185\u5b58\u8bbf\u95ee\u7684\u6bd4\u7387\uff1a
\u5982\u679c\u7b97\u672f\u5f3a\u5ea6\u4f4e\uff08\u6bcf\u52a0\u8f7d\u5b57\u8282\u7684\u64cd\u4f5c\u6570\u5c11\uff09\uff0c\u4f60\u7684\u4ee3\u7801\u662f\u5185\u5b58\u53d7\u9650\u7684\uff1a\u5927\u90e8\u5206\u65f6\u95f4\u82b1\u5728\u7b49\u5f85\u6570\u636e\u4e0a\u3002\u8ba9\u8ba1\u7b97\u66f4\u5feb\uff08\u66f4\u5bbd\u7684SIMD\u3001\u66f4\u9ad8\u7684\u65f6\u949f\uff09\u4e0d\u4f1a\u6709\u5e2e\u52a9\u3002
\u5982\u679c\u7b97\u672f\u5f3a\u5ea6\u9ad8\uff08\u6bcf\u5b57\u8282\u591a\u6b21\u64cd\u4f5c\uff09\uff0c\u4f60\u7684\u4ee3\u7801\u662f\u8ba1\u7b97\u53d7\u9650\u7684\uff1a\u5927\u90e8\u5206\u65f6\u95f4\u82b1\u5728\u8ba1\u7b97\u4e0a\u3002\u66f4\u5feb\u7684\u5185\u5b58\u4e0d\u4f1a\u6709\u5e2e\u52a9\u3002
\u5c4b\u9876\u7ebf\uff1a
\u77e9\u9635\u4e58\u6cd5\u5177\u6709\u9ad8\u7b97\u672f\u5f3a\u5ea6\uff1a\\(O(n^3)\\) \u6b21\u64cd\u4f5c\u4f5c\u7528\u4e8e \\(O(n^2)\\) \u6570\u636e\uff0c\u56e0\u6b64\u5f3a\u5ea6 \\(\\approx O(n)\\)\u3002\u5bf9\u4e8e\u5927\u77e9\u9635\uff0c\u5b83\u662f\u8ba1\u7b97\u53d7\u9650\u7684\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48GPU\uff08\u9ad8\u8ba1\u7b97\u80fd\u529b\uff09\u4e3b\u5bfc\u77e9\u9635\u5bc6\u96c6\u578b\u7684ML\u5de5\u4f5c\u8d1f\u8f7d\u3002
\u9010\u5143\u7d20\u64cd\u4f5c\uff08ReLU\u3001\u52a0\u6cd5\u3001\u4e58\u6cd5\uff09\u5177\u6709\u4f4e\u7b97\u672f\u5f3a\u5ea6\uff1a\u6bcf\u52a0\u8f7d\u4e00\u4e2a\u5143\u7d201\u6b21\u64cd\u4f5c\u3002\u8fd9\u4e9b\u662f\u5185\u5b58\u53d7\u9650\u7684\u3002\u8ba9GPU\u66f4\u5feb\u6ca1\u6709\u5e2e\u52a9\uff1b\u4f60\u9700\u8981\u66f4\u5feb\u7684\u5185\u5b58\uff08\u6216\u8005\u5c06\u8fd9\u4e9b\u64cd\u4f5c\u4e0e\u8ba1\u7b97\u5bc6\u96c6\u578b\u64cd\u4f5c\u878d\u5408\uff0c\u4ee5\u907f\u514d\u72ec\u7acb\u7684\u5185\u5b58\u5f80\u8fd4\uff09\u3002
\u5c4b\u9876\u7ebf\u6a21\u578b\u89e3\u91ca\u4e86\u4e3a\u4ec0\u4e48\u6838\u51fd\u6570\u878d\u5408\u5982\u6b64\u91cd\u8981\uff1a\u5c06matmul\u4e0e\u504f\u7f6e\u52a0\u6cd5\u548cReLU\u7ec4\u5408\u6210\u4e00\u4e2a\u6838\u51fd\u6570\uff0c\u907f\u514d\u4e86\u5c06\u4e2d\u95f4\u7ed3\u679c\u5199\u5165\u5185\u5b58\u5e76\u91cd\u65b0\u8bfb\u53d6\uff0c\u5c06\u4e09\u4e2a\u5185\u5b58\u53d7\u9650\u64cd\u4f5c\u8f6c\u5316\u4e3a\u4e00\u4e2a\u8ba1\u7b97\u53d7\u9650\u64cd\u4f5c\u3002
\u5ef6\u8fdf\u662f\u5b8c\u6210\u4e00\u4e2a\u64cd\u4f5c\u6240\u9700\u7684\u65f6\u95f4\u3002\u541e\u5410\u91cf\u662f\u5355\u4f4d\u65f6\u95f4\u5185\u5b8c\u6210\u7684\u64cd\u4f5c\u6570\u91cf\u3002
\u6253\u4e2a\u6bd4\u65b9\uff1a\u516c\u4ea4\u8f66\u5ef6\u8fdf\u9ad8\uff08\u6bcf\u7ad9\u90fd\u505c\uff09\uff0c\u4f46\u541e\u5410\u91cf\u9ad8\uff08\u4e00\u6b21\u642d\u8f7d50\u4eba\uff09\u3002\u51fa\u79df\u8f66\u5ef6\u8fdf\u4f4e\uff08\u76f4\u8fbe\u4f60\u7684\u76ee\u7684\u5730\uff09\uff0c\u4f46\u541e\u5410\u91cf\u4f4e\uff08\u642d\u8f7d1-4\u4eba\uff09\u3002
GPU\u662f\u516c\u4ea4\u8f66\uff1a\u6bcf\u6b21\u64cd\u4f5c\u5ef6\u8fdf\u9ad8\uff08\u6bcf\u6761\u6307\u4ee4\u9700\u8981\u8bb8\u591a\u5468\u671f\u5b8c\u6210\uff09\uff0c\u4f46\u541e\u5410\u91cf\u5de8\u5927\uff08\u6570\u5343\u4e2a\u6838\u5fc3\u540c\u65f6\u5904\u7406\uff09\u3002CPU\u662f\u51fa\u79df\u8f66\uff1a\u5ef6\u8fdf\u4f4e\uff08\u4e71\u5e8f\u6267\u884c\u3001\u5206\u652f\u9884\u6d4b\u3001\u6df1\u5c42\u7f13\u5b58\u6700\u5c0f\u5316\u5ef6\u8fdf\uff09\uff0c\u4f46\u541e\u5410\u91cf\u6709\u9650\uff084-64\u4e2a\u6838\u5fc3\uff09\u3002
\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48GPU\u66f4\u9002\u5408ML\u8bad\u7ec3\uff08\u541e\u5410\u91cf\u91cd\u8981\uff1a\u5904\u7406\u6570\u767e\u4e07\u4e2a\u6837\u672c\uff09\u800cCPU\u66f4\u9002\u5408\u64cd\u4f5c\u7cfb\u7edf\u4efb\u52a1\uff08\u5ef6\u8fdf\u91cd\u8981\uff1a\u7acb\u5373\u54cd\u5e94\u6309\u952e\uff09\u3002
\u6d41\u6c34\u7ebf\u5c06\u5ef6\u8fdf\u8f6c\u5316\u4e3a\u541e\u5410\u91cf\u3002\u5982\u679c\u4e00\u6761\u6307\u4ee4\u9700\u89815\u4e2a\u5468\u671f\uff0c\u4f46\u6d41\u6c34\u7ebf\u6bcf\u5468\u671f\u5f00\u59cb\u4e00\u6761\u65b0\u6307\u4ee4\uff0c\u5219\u541e\u5410\u91cf\u662f\u6bcf\u6761\u6307\u4ee41\u5468\u671f\uff08\u5373\u4f7f\u6bcf\u6761\u6307\u4ee4\u9700\u89815\u4e2a\u5468\u671f\u5b8c\u6210\uff09\u3002\u8fd9\u548c\u7b2c13\u7ae0\u7684CPU\u6d41\u6c34\u7ebf\u662f\u540c\u4e00\u539f\u7406\uff0c\u4f46\u5b83\u9002\u7528\u4e8e\u6bcf\u4e2a\u5c42\u9762\uff1aSIMD\u5355\u5143\u3001\u5185\u5b58\u63a7\u5236\u5668\u548cGPU\u6838\u5fc3\u90fd\u662f\u6d41\u6c34\u7ebf\u5316\u7684\u3002
\u4e3b\u5bfc\u53f0\u5f0f\u673a\u3001\u7b14\u8bb0\u672c\u7535\u8111\u548c\u6570\u636e\u4e2d\u5fc3CPU\u3002SIMD\uff1aSSE\uff08128\u4f4d\uff09\u3001AVX/AVX2\uff08256\u4f4d\uff09\u3001AVX-512\uff08512\u4f4d\uff09\u3002Intel AMX\u63d0\u4f9b\u4e13\u7528\u7684\u77e9\u9635\u4e58\u6cd5\u5355\u5143\u7528\u4e8eAI\u5de5\u4f5c\u8d1f\u8f7d\u3002
\u4f18\u52bf\uff1a\u6700\u9ad8\u5355\u6838\u6027\u80fd\u3001\u6700\u5bbdSIMD\u3001\u6210\u719f\u7684\u8f6f\u4ef6\u751f\u6001\u7cfb\u7edf\uff08MKL\u3001oneDNN\uff09\u3002
\u4e3b\u5bfc\u79fb\u52a8\u8bbe\u5907\uff08\u6bcf\u4e00\u90e8\u667a\u80fd\u624b\u673a\uff09\uff0c\u5728\u670d\u52a1\u5668\uff08AWS Graviton\u3001Ampere Altra\uff09\u548c\u7b14\u8bb0\u672c\u7535\u8111\uff08Apple M\u7cfb\u5217\uff09\u4e2d\u589e\u957f\u3002SIMD\uff1aNEON\uff08128\u4f4d\uff09\u3001SVE/SVE2\uff08\u53ef\u4f38\u7f29\uff0c128-2048\u4f4d\uff09\u3002
\u4f18\u52bf\uff1a\u51fa\u8272\u7684\u529f\u8017\u6548\u7387\uff08\u6bcf\u74e6\u6027\u80fd\uff09\u3001\u81ea\u5b9a\u4e49\u6838\u5fc3\uff08Apple M4\u5728\u5355\u6838\u6027\u80fd\u4e0a\u5ab2\u7f8eIntel\uff0c\u529f\u8017\u4ec5\u4e3a\u5176\u4e00\u5c0f\u90e8\u5206\uff09\u3002
\u57fa\u4e8eARM\u5e76\u5e26\u6709\u81ea\u5b9a\u4e49\u6269\u5c55\u3002\u5305\u542bAMX\uff08Apple\u77e9\u9635\u6269\u5c55\uff09\u2014\u2014\u672a\u516c\u5f00\u7684\u77e9\u9635\u4e58\u6cd5\u5355\u5143\uff0cAccelerate\u6846\u67b6\u5c06\u5176\u7528\u4e8eBLAS\u64cd\u4f5c\u3002\u7edf\u4e00\u5185\u5b58\u67b6\u6784\uff1aCPU\u548cGPU\u5171\u4eab\u540c\u4e00\u7269\u7406\u5185\u5b58\uff0c\u6d88\u9664\u4e86CPU\u2194GPU\u62f7\u8d1d\u7684\u74f6\u9888\u3002
\u5bf9\u4e8eML\uff1aApple\u7684\u795e\u7ecf\u7f51\u7edc\u5f15\u64ce\uff0816\u6838\uff0c\u4e13\u7528ML\u52a0\u901f\u5668\uff09\u548c\u7edf\u4e00\u5185\u5b58\u4f7fM\u7cfb\u5217\u82af\u7247\u5728\u672c\u5730ML\u63a8\u7406\u548c\u5c0f\u89c4\u6a21\u8bad\u7ec3\u65b9\u9762\u51fa\u5947\u5730\u5f3a\u5927\u3002\u4e0d\u8fc7\u6ca1\u6709CUDA\uff1a\u4f60\u5fc5\u987b\u4f7f\u7528Metal\uff08Apple\u7684GPU API\uff09\u6216MLX\uff08Apple\u7684ML\u6846\u67b6\uff09\u3002
\u5f00\u6e90ISA\u3002\u65e0\u8bb8\u53ef\u8d39\u7528\uff08\u4e0d\u50cfARM\uff09\u3002\u5728\u5d4c\u5165\u5f0f\u7cfb\u7edf\u3001\u7269\u8054\u7f51\u548c\u7814\u7a76\u9886\u57df\u589e\u957f\u3002SIMD\uff1a\"V\"\uff08\u5411\u91cf\uff09\u6269\u5c55\u63d0\u4f9b\u7c7b\u4f3c\u4e8eARM SVE\u7684\u53ef\u4f38\u7f29\u5411\u91cf\u5904\u7406\u3002
\u5bf9\u4e8eML\uff1a\u5728ML\u5de5\u4f5c\u8d1f\u8f7d\u4e0a\u5c1a\u4e0d\u80fd\u4e0ex86/ARM\u7ade\u4e89\uff0c\u4f46\u503c\u5f97\u5173\u6ce8\u3002\u51e0\u4e2aAI\u52a0\u901f\u5668\u521d\u521b\u516c\u53f8\u4f7f\u7528RISC-V\u6838\u5fc3\u3002
\u6027\u80fd\u6700\u7ec8\u53d7\u9650\u4e8e\u529f\u8017\u548c\u6563\u70ed\uff1a
TDP\uff08\u70ed\u8bbe\u8ba1\u529f\u8017\uff09\uff1a\u82af\u7247\u53ef\u4ee5\u6301\u7eed\u6d88\u8017\u7684\u6700\u5927\u529f\u7387\u3002\u7b14\u8bb0\u672c\u7535\u8111CPU\u53ef\u80fd\u670915W TDP\uff1b\u670d\u52a1\u5668CPU 250W\uff1b\u6570\u636e\u4e2d\u5fc3GPU 700W\uff08NVIDIA B200\uff09\u3002
\u6697\u7845\uff1a\u5728\u4efb\u4f55\u7ed9\u5b9a\u65f6\u523b\uff0c\u4e3a\u4e86\u4fdd\u6301\u5728\u70ed\u9884\u7b97\u5185\uff0c\u5fc5\u987b\u5173\u95ed\u82af\u7247\u7684\u76f8\u5f53\u5927\u4e00\u90e8\u5206\u6676\u4f53\u7ba1\u3002\u7406\u8bba\u4e0a\u82af\u7247\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u6240\u6709\u6676\u4f53\u7ba1\uff0c\u4f46\u4f1a\u7194\u5316\u3002
\u529f\u8017\u6548\u7387\uff08FLOPS/\u74e6\uff09\u65e5\u76ca\u6210\u4e3a\u91cd\u8981\u6307\u6807\uff0c\u800c\u975e\u539f\u59cbFLOPS\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\uff1a
\u5bf9\u4e8e\u5927\u89c4\u6a21ML\uff1a\u8bad\u7ec3\u524d\u6cbfLLM\u6570\u6708\u6d88\u8017\u5146\u74e6\u7ea7\u529f\u7387\u3002\u7535\u8d39\u53ef\u80fd\u8d85\u8fc7\u786c\u4ef6\u6210\u672c\u3002\u529f\u8017\u6548\u7387\u76f4\u63a5\u5f71\u54cdAI\u7814\u7a76\u7684\u7ecf\u6d4e\u6027\u3002
#include <iostream>\n#include <chrono>\n#include <vector>\n\n// \u6807\u91cf\u52a0\u6cd5\nvoid add_scalar(const float* a, const float* b, float* c, int n) {\n for (int i = 0; i < n; i++) {\n c[i] = a[i] + b[i];\n }\n}\n\nint main() {\n const int N = 1 << 24; // \u7ea61600\u4e07\u4e2a\u5143\u7d20\n std::vector<float> a(N, 1.0f), b(N, 2.0f), c(N);\n\n // \u9884\u70ed\uff08\u586b\u5145\u7f13\u5b58\uff0c\u89e6\u53d1\u9891\u7387\u7f29\u653e\uff09\n add_scalar(a.data(), b.data(), c.data(), N);\n\n // \u57fa\u51c6\u6d4b\u8bd5\n auto start = std::chrono::high_resolution_clock::now();\n\n for (int trial = 0; trial < 100; trial++) {\n add_scalar(a.data(), b.data(), c.data(), N);\n }\n\n auto end = std::chrono::high_resolution_clock::now();\n double elapsed = std::chrono::duration<double>(end - start).count();\n\n double total_bytes = 3.0 * N * sizeof(float) * 100; // \u8bfba\u3001\u8bfbb\u3001\u5199c\n double bandwidth = total_bytes / elapsed / 1e9; // GB/s\n\n std::cout << \"\u65f6\u95f4: \" << elapsed << \" s\\n\";\n std::cout << \"\u5e26\u5bbd: \" << bandwidth << \" GB/s\\n\";\n\n return 0;\n}\n # \u542f\u7528\u4f18\u5316\u7f16\u8bd1\ng++ -O3 -march=native -o bench bench.cpp\n./bench\n \u8fd9\u6bb5\u4ee3\u7801\u4e2d\u7684\u5173\u952eC++\u6982\u5ff5\uff1a
#include <vector>\uff1a\u52a8\u6001\u6570\u7ec4\uff08std::vector<float>\uff09\u2014\u2014\u7c7b\u4f3cPython\u7684list\u4f46\u5e26\u7c7b\u578b\u4e14\u5728\u5185\u5b58\u4e2d\u8fde\u7eed\u3002a.data()\uff1a\u8fd4\u56de\u5e95\u5c42\u6570\u7ec4\u7684\u539f\u59cb\u6307\u9488\uff08float*\uff09\u2014\u2014SIMD\u5185\u8054\u51fd\u6570\u9700\u8981\u3002std::chrono\uff1a\u7528\u4e8e\u57fa\u51c6\u6d4b\u8bd5\u7684\u9ad8\u5206\u8fa8\u7387\u8ba1\u65f6\u5668\u3002-O3\uff1a\u6700\u9ad8\u7f16\u8bd1\u5668\u4f18\u5316\u7ea7\u522b\u3002\u7f16\u8bd1\u5668\u53ef\u80fd\u81ea\u52a8\u5411\u91cf\u5316\u4f60\u7684\u5faa\u73af\uff08\u81ea\u52a8\u4f7f\u7528SIMD\uff09\u3002-march=native \u542f\u7528\u4f60\u7684CPU\u652f\u6301\u7684\u6240\u6709SIMD\u6307\u4ee4\u3002\u4e3a\u4ec0\u4e48\u9700\u8981\u9884\u70ed\uff1a\u9996\u6b21\u8fd0\u884c\u586b\u5145\u7f13\u5b58\u5e76\u53ef\u80fd\u89e6\u53d1CPU\u9891\u7387\u7f29\u653e\uff08\u777f\u9891\u52a0\u901f\uff09\u3002\u540e\u7eed\u8fd0\u884c\u66f4\u5177\u4ee3\u8868\u6027\u3002
\u4e3a\u4ec0\u4e48\u6d4b\u91cf\u5e26\u5bbd\uff1a\u5bf9\u4e8e\u5185\u5b58\u53d7\u9650\u7684\u64cd\u4f5c\uff08\u5982\u9010\u5143\u7d20\u52a0\u6cd5\uff09\uff0c\u6709\u610f\u4e49\u7684\u5ea6\u91cf\u662f\u5e26\u5bbd\uff08GB/s\uff09\uff0c\u800c\u4e0d\u662fFLOPS\u3002\u5982\u679c\u4f60\u7684\u6d4b\u91cf\u5e26\u5bbd\u63a5\u8fd1\u786c\u4ef6\u6781\u9650\uff08DDR5\u7ea650 GB/s\uff09\uff0c\u4f60\u662f\u5185\u5b58\u53d7\u9650\u7684\uff0cSIMD\u4e0d\u4f1a\u6709\u591a\u5927\u5e2e\u52a9\uff08\u74f6\u9888\u662f\u5185\u5b58\uff0c\u800c\u975e\u8ba1\u7b97\uff09\u3002
\u8ba1\u7b97\u5e38\u89c1ML\u64cd\u4f5c\u7684\u7b97\u672f\u5f3a\u5ea6\uff0c\u5e76\u5c06\u5b83\u4eec\u5206\u7c7b\u4e3a\u5185\u5b58\u53d7\u9650\u6216\u8ba1\u7b97\u53d7\u9650\u3002
import jax.numpy as jnp\n\ndef arithmetic_intensity(flops, bytes_transferred):\n return flops / bytes_transferred\n\n# \u9010\u5143\u7d20ReLU\uff1a\u6bcf\u5143\u7d201\u6b21\u6bd4\u8f83\uff0c\u8bfb\u53d6+\u5199\u5165\nn = 1024\nrelu_flops = n # \u6bcf\u5143\u7d201\u6b21\u64cd\u4f5c\nrelu_bytes = 2 * n * 4 # \u8bfb\u53d6\u8f93\u5165+\u5199\u5165\u8f93\u51fa\uff08float32\uff09\nprint(f\"ReLU: {arithmetic_intensity(relu_flops, relu_bytes):.2f} FLOPS/byte \u2192 \u5185\u5b58\u53d7\u9650\")\n\n# \u77e9\u9635\u4e58\u6cd5\uff1a2*n^3\u6b21\u64cd\u4f5c\uff0c\u8bfb\u53d62*n^2 + \u5199\u5165n^2\u4e2a\u6d6e\u70b9\u6570\nmatmul_flops = 2 * n**3\nmatmul_bytes = 3 * n**2 * 4 # \u8bfb\u53d6A + \u8bfb\u53d6B + \u5199\u5165C\nprint(f\"\u77e9\u9635\u4e58\u6cd5 ({n}\u00d7{n}): {arithmetic_intensity(matmul_flops, matmul_bytes):.0f} FLOPS/byte \u2192 \u8ba1\u7b97\u53d7\u9650\")\n\n# \u5c42\u5f52\u4e00\u5316\uff1a\u7ea65n\u6b21\u64cd\u4f5c\uff08\u5747\u503c\u3001\u65b9\u5dee\u3001\u5f52\u4e00\u5316\uff09\uff0c\u8bfb\u53d6+\u5199\u5165\nln_flops = 5 * n\nln_bytes = 2 * n * 4\nprint(f\"LayerNorm: {arithmetic_intensity(ln_flops, ln_bytes):.2f} FLOPS/byte \u2192 \u5185\u5b58\u53d7\u9650\")\n\n# 3x3\u5377\u79ef\uff1a2*9*C_in*C_out*H*W\uff0c\u8bfb\u53d6\u5377\u79ef\u6838+\u7279\u5f81\u56fe+\u5199\u5165\u8f93\u51fa\nC_in, C_out, H, W = 64, 128, 32, 32\nconv_flops = 2 * 9 * C_in * C_out * H * W\nconv_bytes = (9 * C_in * C_out + C_in * H * W + C_out * H * W) * 4\nprint(f\"Conv3x3: {arithmetic_intensity(conv_flops, conv_bytes):.0f} FLOPS/byte \u2192 \u8ba1\u7b97\u53d7\u9650\")\n \u6f14\u793a\u4e3a\u4ec0\u4e48\u5e76\u884c\u6027\u91cd\u8981\u3002\u6bd4\u8f83\u987a\u5e8f\u6267\u884c\u4e0e\u5e76\u884c\uff08NumPy\uff09\u6267\u884c\u968f\u6570\u636e\u89c4\u6a21\u589e\u957f\u7684\u8868\u73b0\u3002
import numpy as np\nimport time\n\nfor n in [1000, 10000, 100000, 1000000, 10000000]:\n a = np.random.randn(n).astype(np.float32)\n b = np.random.randn(n).astype(np.float32)\n\n # \"\u987a\u5e8f\u6267\u884c\"\uff08Python\u5faa\u73af\uff09\n start = time.time()\n c = [a[i] * b[i] for i in range(min(n, 100000))] # \u4e0a\u965010\u4e07\u4ee5\u786e\u4fdd\u5408\u7406\n seq_time = time.time() - start\n if n > 100000:\n seq_time *= n / 100000 # \u5916\u63a8\n\n # \"\u5e76\u884c\"\uff08NumPy\uff0c\u5185\u90e8\u4f7f\u7528SIMD+\u591a\u7ebf\u7a0b\uff09\n start = time.time()\n c = a * b\n par_time = time.time() - start\n\n print(f\"n={n:>10,} \u987a\u5e8f={seq_time:.4f}s \u5e76\u884c={par_time:.6f}s \"\n f\"\u52a0\u901f\u6bd4={seq_time/par_time:.0f}x\")\n ARM\u5904\u7406\u5668\u9a71\u52a8\u7740\u6bcf\u4e00\u90e8\u667a\u80fd\u624b\u673a\u3001\u5927\u591a\u6570\u5e73\u677f\u7535\u8111\u3001Apple\u7684\u7b14\u8bb0\u672c\u7535\u8111\u4ee5\u53ca\u65e5\u76ca\u589e\u957f\u7684\u6570\u636e\u4e2d\u5fc3\u670d\u52a1\u5668\u4efd\u989d\u3002\u672c\u6587\u6db5\u76d6ARM\u67b6\u6784\u3001\u4f7f\u7528C++\u5185\u8054\u51fd\u6570\u7684NEON SIMD\u7f16\u7a0b\u3001\u7528\u4e8e\u53ef\u4f38\u7f29\u5411\u91cf\u5904\u7406\u7684SVE/SVE2\u3001Apple Silicon\u7279\u6027\u4ee5\u53ca\u5b9e\u9645\u5411\u91cf\u5316\u6838\u51fd\u6570\u793a\u4f8b
\u5982\u679c\u4f60\u62e5\u6709iPhone\u3001MacBook\u6216\u4f7f\u7528AWS Graviton\u5b9e\u4f8b\uff0c\u4f60\u6b63\u5728\u8fd0\u884cARM\u3002ARM\u7684\u529f\u8017\u6548\u7387\u4f7f\u5176\u5728\u79fb\u52a8\u548c\u5d4c\u5165\u5f0f\u9886\u57df\u5360\u636e\u4e3b\u5bfc\u5730\u4f4d\uff0c\u5e76\u5728\u670d\u52a1\u5668\u548cML\u63a8\u7406\u65b9\u9762\u65e5\u76ca\u5177\u6709\u7ade\u4e89\u529b\u3002\u7406\u89e3ARM SIMD\u8ba9\u4f60\u80fd\u591f\u7f16\u5199\u5728\u5927\u591a\u6570\u4eba\u5b9e\u9645\u4f7f\u7528\u7684\u786c\u4ef6\u4e0a\u5feb\u901f\u8fd0\u884c\u7684\u4ee3\u7801\u3002
\u6709\u5173\u751f\u4ea7\u4e2dARM SIMD\u6838\u51fd\u6570\u7684\u5b9e\u9645\u4f8b\u5b50\uff0c\u8bf7\u53c2\u89c1Cactus\u2014\u2014\u9762\u5411\u79fb\u52a8\u8bbe\u5907\u548c\u53ef\u7a7f\u6234\u8bbe\u5907\u7684\u4f4e\u5ef6\u8fdfAI\u5f15\u64ce\uff1agithub.com/cactus-compute/cactus\u3002Cactus\u5b9e\u73b0\u4e86\u81ea\u5b9a\u4e49ARM NEON\u548cNPU\u52a0\u901f\u7684\u6ce8\u610f\u673a\u5236\u3001KV\u7f13\u5b58\u91cf\u5316\u548c\u5206\u5757\u9884\u586b\u5145\u6838\u51fd\u6570\uff0c\u5728ARM CPU\u4e0a\u5b9e\u73b0\u4e86\u6700\u5feb\u7684\u63a8\u7406\uff0c\u4e14RAM\u6bd4\u5176\u5b83\u5f15\u64ce\u4f4e10\u500d\u3002\u5176\u4e09\u5c42\u67b6\u6784\uff08\u5f15\u64ce\u2192\u56fe\u2192\u6838\u51fd\u6570\uff09\u662f\u672c\u6587\u4e2dSIMD\u6982\u5ff5\u5982\u4f55\u7528\u4e8e\u6784\u5efa\u751f\u4ea7\u7ea7ML\u57fa\u7840\u8bbe\u65bd\u7684\u5177\u4f53\u5b9e\u4f8b\u3002
ARM\u662f\u4e00\u79cdRISC\uff08\u7cbe\u7b80\u6307\u4ee4\u96c6\u8ba1\u7b97\u673a\uff09\u67b6\u6784\uff08\u7b2c13\u7ae0\uff09\u3002\u5173\u952e\u7279\u5f81\uff1a
\u52a0\u8f7d-\u5b58\u50a8\u67b6\u6784\uff1a\u7b97\u672f\u6307\u4ee4\u53ea\u64cd\u4f5c\u5bc4\u5b58\u5668\uff0c\u4ece\u4e0d\u76f4\u63a5\u64cd\u4f5c\u5185\u5b58\u3002\u8981\u5bf9\u5185\u5b58\u4e2d\u7684\u4e24\u4e2a\u6570\u76f8\u52a0\uff0c\u4f60\u5fc5\u987b\uff1a(1) \u5c06\u5b83\u4eec\u52a0\u8f7d\u5230\u5bc4\u5b58\u5668\uff0c(2) \u5c06\u5bc4\u5b58\u5668\u76f8\u52a0\uff0c(3) \u5c06\u7ed3\u679c\u5b58\u56de\u5185\u5b58\u3002\u8fd9\u6bd4x86\u66f4\u7b80\u5355\uff08x86\u53ef\u4ee5\u5728\u4e00\u6761\u6307\u4ee4\u4e2d\u52a0\u4e00\u4e2a\u5bc4\u5b58\u5668\u548c\u4e00\u4e2a\u5185\u5b58\u4f4d\u7f6e\uff09\uff0c\u4f46\u4f7f\u5f97\u6d41\u6c34\u7ebf\u66f4\u6e05\u6670\u3002
\u5b9a\u957f\u6307\u4ee4\uff1a\u6bcf\u4e2aARMv8\uff08AArch64\uff09\u6307\u4ee4\u6070\u597d32\u4f4d\u3002\u8fd9\u4f7f\u5f97\u89e3\u7801\u5feb\u901f\u4e14\u53ef\u9884\u6d4b\uff08\u4e0d\u50cfx86\u7684\u53ef\u53d8\u957f\u6307\u4ee4\uff0c\u957f\u5ea6\u53ef\u4ee5\u662f1-15\u5b57\u8282\uff09\u3002
32\u4e2a\u901a\u7528\u5bc4\u5b58\u5668\uff08x0-x30\uff0c\u6bcf\u4e2a64\u4f4d\uff09\u52a0\u4e0a\u6808\u6307\u9488\uff08sp\uff09\u548c\u96f6\u5bc4\u5b58\u5668\uff08xzr\uff09\u3002\u76f8\u6bd4\u4e4b\u4e0bx86\u670916\u4e2a\u901a\u7528\u5bc4\u5b58\u5668\u3002\u66f4\u591a\u5bc4\u5b58\u5668 = \u66f4\u5c11\u5185\u5b58\u8bbf\u95ee = \u66f4\u5feb\u4ee3\u7801\u3002
32\u4e2aSIMD/\u6d6e\u70b9\u5bc4\u5b58\u5668\uff08v0-v31\uff0c\u6bcf\u4e2a128\u4f4d\uff09\u7528\u4e8eNEON\u548c\u6d6e\u70b9\u64cd\u4f5c\u3002
// ARM\u6c47\u7f16\uff08\u4ec5\u611f\u53d7\u98ce\u683c\u2014\u2014\u4f60\u5c06\u4f7f\u7528\u5185\u8054\u51fd\u6570\uff0c\u800c\u975e\u6c47\u7f16\uff09\n// \u4e24\u5bc4\u5b58\u5668\u76f8\u52a0\nadd x0, x1, x2 // x0 = x1 + x2\n\n// \u4ece\u5185\u5b58\u52a0\u8f7d\nldr x0, [x1] // x0 = *x1\uff08\u4ecex1\u4e2d\u7684\u5730\u5740\u52a0\u8f7d64\u4f4d\uff09\n\n// NEON\uff1a\u52a0\u56db\u4e2a\u6d6e\u70b9\u6570\nfadd v0.4s, v1.4s, v2.4s // v0 = v1 + v2\uff08\u56db\u4e2a32\u4f4d\u6d6e\u70b9\u6570\uff09\n float32x4_t float16 8 float16x8_t int32 4 int32x4_t int16 8 int16x8_t int8 16 int8x16_t v[\u64cd\u4f5c][\u9650\u5b9a\u7b26]_[\u7c7b\u578b]#include <arm_neon.h>\n\n// \u4ece\u5185\u5b58\u52a0\u8f7d4\u4e2a\u6d6e\u70b9\u6570\u5230NEON\u5bc4\u5b58\u5668\nfloat32x4_t a = vld1q_f32(ptr); // vld1q = vector load 1, q = 128\u4f4d\uff08\u56db\u5b57\uff09\n\n// \u4eceNEON\u5bc4\u5b58\u5668\u5b58\u50a84\u4e2a\u6d6e\u70b9\u6570\u5230\u5185\u5b58\nvst1q_f32(out_ptr, a); // vst1q = vector store 1, q = 128\u4f4d\n\n// \u7b97\u672f\u8fd0\u7b97\nfloat32x4_t c = vaddq_f32(a, b); // c = a + b\uff084\u4e2a\u6d6e\u70b9\u6570\uff09\nfloat32x4_t d = vmulq_f32(a, b); // d = a * b\uff084\u4e2a\u6d6e\u70b9\u6570\uff09\nfloat32x4_t e = vfmaq_f32(c, a, b); // e = c + a * b\uff08\u878d\u5408\u4e58\u52a0\uff0c4\u4e2a\u6d6e\u70b9\u6570\uff09\n\n// \u6bd4\u8f83\uff08\u8fd4\u56de\u63a9\u7801\uff1a\u82e5\u771f\u5219\u51681\uff0c\u82e5\u5047\u5219\u51680\uff09\nuint32x4_t mask = vcgtq_f32(a, b); // mask[i] = (a[i] > b[i]) ? 0xFFFFFFFF : 0\n\n// \u57fa\u4e8e\u63a9\u7801\u9009\u62e9\u5143\u7d20\uff08\u7c7b\u4f3cnumpy.where\uff09\nfloat32x4_t result = vbslq_f32(mask, a, b); // result[i] = mask[i] ? a[i] : b[i]\n\n// \u5f52\u7ea6\uff1a\u5c06\u6240\u67094\u4e2a\u5143\u7d20\u6c42\u548c\u4e3a\u6807\u91cf\nfloat total = vaddvq_f32(a); // total = a[0] + a[1] + a[2] + a[3]\n vfmaq_f32\uff08\u878d\u5408\u4e58\u52a0\uff09\u662fML\u6700\u91cd\u8981\u7684SIMD\u6307\u4ee4\u3002\u5b83\u7528\u4e00\u6b21\u820d\u5165\u6b65\u9aa4\u8ba1\u7b97 \\(c = c + a \\times b\\)\uff08\u6bd4\u5206\u5f00\u4e58\u7136\u540e\u52a0\u66f4\u7cbe\u786e\uff09\u3002\u70b9\u79ef\u3001\u77e9\u9635\u4e58\u6cd5\u548c\u5377\u79ef\u90fd\u7531FMA\u6784\u5efa\u3002#include <arm_neon.h>\n\n// \u6807\u91cf\u70b9\u79ef\nfloat dot_scalar(const float* a, const float* b, int n) {\n float sum = 0.0f;\n for (int i = 0; i < n; i++) {\n sum += a[i] * b[i];\n }\n return sum;\n}\n\n// NEON\u5411\u91cf\u5316\u70b9\u79ef\nfloat dot_neon(const float* a, const float* b, int n) {\n float32x4_t sum_vec = vdupq_n_f32(0.0f); // \u521d\u59cb\u53164\u4e2a\u7d2f\u52a0\u5668\u4e3a0\n\n int i = 0;\n for (; i + 4 <= n; i += 4) {\n float32x4_t va = vld1q_f32(a + i); // \u4ecea\u52a0\u8f7d4\u4e2a\u5143\u7d20\n float32x4_t vb = vld1q_f32(b + i); // \u4eceb\u52a0\u8f7d4\u4e2a\u5143\u7d20\n sum_vec = vfmaq_f32(sum_vec, va, vb); // sum_vec += va * vb\n }\n\n // \u5c064\u4e2a\u7d2f\u52a0\u5668\u5f52\u7ea6\u4e3a\u5355\u4e00\u6807\u91cf\n float sum = vaddvq_f32(sum_vec);\n\n // \u5904\u7406\u5269\u4f59\u5143\u7d20\uff08\u5982\u679cn\u4e0d\u662f4\u7684\u500d\u6570\uff09\n for (; i < n; i++) {\n sum += a[i] * b[i];\n }\n\n return sum;\n}\n \u5173\u952eC++\u6982\u5ff5\uff1a
const float*\uff1a\u6307\u5411\u53ea\u8bfb\u6d6e\u70b9\u6570\u636e\u7684\u6307\u9488\u3002const \u627f\u8bfa\u6211\u4eec\u4e0d\u4f1a\u901a\u8fc7\u6b64\u6307\u9488\u4fee\u6539\u6570\u636e\u3002a + i\uff1a\u6307\u9488\u8fd0\u7b97\u3002a + i \u6307\u5411\u6570\u7ec4\u7684\u7b2c \\(i\\) \u4e2a\u5143\u7d20\uff08\u7b49\u540c\u4e8e &a[i]\uff09\u3002\u4e3a\u4ec0\u4e48 sum_vec \u4e2d\u4f7f\u75284\u4e2a\u7d2f\u52a0\u5668\uff1a\u6211\u4eec\u4f7f\u75284\u4e2a\u72ec\u7acb\u7684\u7d2f\u52a0\u5668\uff08\u6bcf\u4e2aSIMD\u901a\u9053\u4e00\u4e2a\uff09\uff0c\u800c\u4e0d\u662f\u5355\u4e2a\u6807\u91cf\u7d2f\u52a0\u5668\u3002\u8fd9\u907f\u514d\u4e86\u6570\u636e\u4f9d\u8d56\uff1a\u6bcf\u6b21\u8fed\u4ee3\u7684FMA\u4f9d\u8d56\u4e8e sum_vec\uff0c\u4f46\u6709\u4e864\u4e2a\u72ec\u7acb\u901a\u9053\uff0cCPU\u53ef\u4ee5\u5bf9FMAs\u8fdb\u884c\u6d41\u6c34\u7ebf\u5904\u7406\u3002\u6700\u540e\uff0c\u6211\u4eec\u5c064\u4e2a\u90e8\u5206\u548c\u5f52\u7ea6\u4e3a\u4e00\u4e2a\u3002
#include <arm_neon.h>\n\nvoid relu_neon(const float* input, float* output, int n) {\n float32x4_t zero = vdupq_n_f32(0.0f);\n\n int i = 0;\n for (; i + 4 <= n; i += 4) {\n float32x4_t x = vld1q_f32(input + i);\n float32x4_t result = vmaxq_f32(x, zero); // max(x, 0) = ReLU\n vst1q_f32(output + i, result);\n }\n\n // \u6807\u91cf\u6e05\u7406\n for (; i < n; i++) {\n output[i] = input[i] > 0 ? input[i] : 0;\n }\n}\n vmaxq_f32 \u8ba1\u7b97\u4e24\u4e2a\u5411\u91cf\u7684\u9010\u5143\u7d20\u6700\u5927\u503c\u3002\u7531\u4e8e\u4e00\u4e2a\u5411\u91cf\u5168\u4e3a\u96f6\uff0c\u8fd9\u6070\u597d\u5c31\u662fReLU\u3002\u65e0\u9700\u5206\u652f\uff0c\u65e0\u9700\u6bd4\u8f83\u2014\u2014\u4ec5\u4e00\u6761\u6307\u4ee4\u3002I8MM\uff08Int8\u77e9\u9635\u4e58\u6cd5\uff09\u662fARMv8.6\u6269\u5c55\uff0c\u589e\u52a0\u4e86\u7528\u4e8eINT8\u77e9\u9635\u4e58\u6cd5\uff08INT32\u7d2f\u52a0\uff09\u7684\u4e13\u7528\u6307\u4ee4\u2014\u2014\u8fd9\u6b63\u662f\u91cf\u5316ML\u63a8\u7406\u6240\u9700\u8981\u7684\u3002
\u5173\u952e\u6307\u4ee4\u662f SMMLA\uff08\u6709\u7b26\u53f7\u77e9\u9635\u4e58\u52a0\uff09\uff1a\u5b83\u63a5\u53d7\u4e24\u4e2a8\u00d72\u5757\u7684INT8\u503c\uff0c\u5e76\u5c06\u7ed3\u679c\u7d2f\u52a0\u52302\u00d72\u5757\u7684INT32\u4e2d\uff1a
#include <arm_neon.h>\n\n// I8MM\uff1a\u5c06\u4e24\u4e2a8\u5143\u7d20INT8\u5411\u91cf\u76f8\u4e58\uff0c\u7d2f\u52a0\u52304\u4e2aINT32\u7ed3\u679c\u4e2d\n// \u8fd9\u4ece2x8 \u00d7 8x2\u8f93\u5165\u5757\u8ba1\u7b97\u8f93\u51fa\u77e9\u9635\u7684\u4e00\u4e2a2x2\u74e6\u7247\nvoid matmul_i8mm_tile(const int8_t* A, const int8_t* B, int32_t* C) {\n // \u4eceA\u52a0\u8f7d8\u5b57\u8282\uff082\u884c\u54044\u5143\u7d20\uff0c\u6253\u5305\uff09\n int8x16_t va = vld1q_s8(A); // 16\u5b57\u8282 = 2\u884c \u00d7 8\u5143\u7d20\n int8x16_t vb = vld1q_s8(B); // 16\u5b57\u8282 = 2\u884c \u00d7 8\u5143\u7d20\n\n // \u52a0\u8f7d\u73b0\u6709\u7d2f\u52a0\u5668\uff082x2 = 4\u4e2aint32\u503c\uff09\n int32x4_t acc = vld1q_s32(C);\n\n // I8MM\u6307\u4ee4\uff1aacc += A_tile \u00d7 B_tile^T\n // \u4ece2\u00d78 \u00d7 8\u00d72\u8f93\u5165\u8ba1\u7b972\u00d72\u8f93\u51fa\n acc = vmmlaq_s32(acc, va, vb); // I8MM\u6307\u4ee4\n\n vst1q_s32(C, acc);\n}\n \u4e3a\u4ec0\u4e48I8MM\u91cd\u8981\uff1a\u6ca1\u6709I8MM\u65f6\uff0cNEON\u4e0a\u7684INT8\u77e9\u9635\u4e58\u6cd5\u9700\u8981\u52a0\u5bbd\u4e58\u6cd5\uff08vmull\uff09\u540e\u8ddf\u6210\u5bf9\u52a0\u6cd5\u2014\u2014\u6bcf\u4e2a\u8f93\u51fa\u5143\u7d20\u9700\u8981\u591a\u6761\u6307\u4ee4\u3002\u6709\u4e86I8MM\uff0c\u786c\u4ef6\u5728\u4e00\u6761\u6307\u4ee4\u4e2d\u5b8c\u62108\u5143\u7d20\u70b9\u79ef\uff082\u00d78 \u00d7 8\u00d72 = 2\u00d72\uff09\u3002\u5bf9\u4e8eINT8\u63a8\u7406\u5de5\u4f5c\u8d1f\u8f7d\uff0c\u8fd9\u6bd4\u7eafNEON\u5feb4-8\u500d\u3002
\u53ef\u7528\u6027\uff1aApple M1+\uff08\u6240\u6709Apple Silicon\uff09\u3001ARM Cortex-A510/A710/X2+\uff08ARMv9\uff09\u3001AWS Graviton3+\u3002\u7528 #ifdef __ARM_FEATURE_MATMUL_INT8 \u68c0\u67e5\u3002
\u5bf9\u4e8eML\u63a8\u7406\uff1a\u5728ARM\u670d\u52a1\u5668\uff08Graviton\uff09\u6216Apple Silicon\u4e0a\u8fd0\u884c\u7684INT8\u91cf\u5316\u6a21\u578b\uff08\u7b2c18\u7ae0\uff09\u4eceI8MM\u4e2d\u83b7\u76ca\u5de8\u5927\u3002ONNX Runtime\u548cllama.cpp\u7b49\u6846\u67b6\u5728\u8fd0\u884c\u65f6\u68c0\u6d4bI8MM\u5e76\u81ea\u52a8\u4f7f\u7528\u4f18\u5316\u6838\u51fd\u6570\u3002
SME\uff08\u53ef\u4f38\u7f29\u77e9\u9635\u6269\u5c55\uff09\u662fARM\u5bf9Intel AMX\u548cNVIDIA\u5f20\u91cf\u6838\u5fc3\u7684\u56de\u5e94\uff1a\u7528\u4e8e\u77e9\u9635\u64cd\u4f5c\u7684\u4e13\u7528\u786c\u4ef6\u3002SME2\uff08ARMv9.2\uff09\u8fdb\u4e00\u6b65\u6269\u5c55\u4e86\u5b83\u3002
SME\u5f15\u5165\u4e86ZA\u74e6\u7247\u5bc4\u5b58\u5668\uff1a\u5b58\u50a8\u5728\u786c\u4ef6\u4e2d\u76842D\u77e9\u9635\uff0c\u6700\u5927\u53ef\u8fbeSVL\u00d7SVL\u5b57\u8282\uff08\u5176\u4e2dSVL\u662f\u6d41\u5411\u91cf\u957f\u5ea6\uff0c\u901a\u5e38\u6bcf\u7ef4128-512\u4f4d\uff09\u3002\u4e0eNEON\uff081D\u5411\u91cf\uff09\u751a\u81f3SVE\uff081D\u53ef\u4f38\u7f29\u5411\u91cf\uff09\u4e0d\u540c\uff0cSME\u539f\u751f\u64cd\u4f5c2D\u74e6\u7247\u3002
\u7f16\u7a0b\u6a21\u578b\u6709\u4e24\u79cd\u6a21\u5f0f\uff1a
smstart \u8fdb\u5165\uff0c\u542f\u7528SME\u6307\u4ee4\u3002SVE\u6307\u4ee4\u5728\u6b64\u6a21\u5f0f\u4e0b\u4e5f\u53ef\u5de5\u4f5c\uff0c\u4f46\u53ef\u80fd\u4f7f\u7528\u4e0d\u540c\u7684\u5bc4\u5b58\u5668\u5bbd\u5ea6\u3002#include <arm_sme.h>\n\n// SME2\uff1a\u77e9\u9635\u4e58\u6cd5\u7684\u5916\u79ef\u7d2f\u52a0\n// \u5c06A_col \u00d7 B_row \u7d2f\u52a0\u5230ZA\u74e6\u7247\u5bc4\u5b58\u5668\u4e2d\nvoid sme2_matmul_outer(const float* A_col, const float* B_row, int K) {\n // \u8fdb\u5165\u6d41\u6a21\u5f0f\n // smstart; // \uff08\u901a\u8fc7\u7f16\u8bd1\u5668\u5185\u8054\u6216\u5185\u8054\u6c47\u7f16\u5b8c\u6210\uff09\n\n // \u6e05\u96f6ZA\u74e6\u7247\u7d2f\u52a0\u5668\n svzero_za();\n\n for (int k = 0; k < K; k++) {\n // \u5c06A\u7684\u4e00\u5217\u548cB\u7684\u4e00\u884c\u52a0\u8f7d\u5230SVE\u5bc4\u5b58\u5668\u4e2d\n svfloat32_t a = svld1_f32(svptrue_b32(), &A_col[k * SVL]);\n svfloat32_t b = svld1_f32(svptrue_b32(), &B_row[k * SVL]);\n\n // \u5916\u79ef\uff1aZA += a \u00d7 b^T\n // \u8fd9\u5728\u4e00\u4e2a\u6307\u4ee4\u4e2d\u7d2f\u52a0\u4e00\u4e2aSVL\u00d7SVL\u74e6\u7247\n svmopa_za32_f32_m(0, svptrue_b32(), svptrue_b32(), a, b);\n }\n\n // \u5c06ZA\u74e6\u7247\u5b58\u50a8\u5230\u5185\u5b58\n // svst1_za(...);\n\n // \u9000\u51fa\u6d41\u6a21\u5f0f\n // smstop;\n}\n \u5173\u952e\u6982\u5ff5\uff1a
svmopa\uff08\u5916\u79ef\u7d2f\u52a0\uff09\uff1a\u6838\u5fc3SME\u6307\u4ee4\u3002\u5b83\u8ba1\u7b97\u4e24\u4e2a\u5411\u91cf\u7684\u5b8c\u6574\u5916\u79ef\u5e76\u7d2f\u52a0\u5230ZA\u74e6\u7247\u4e2d\u3002\u5bf9\u4e8eSVL=512\u4f4d\uff0816\u4e2a\u6d6e\u70b9\u6570\uff09\uff0c\u8fd9\u662f\u4e00\u4e2a16\u00d716\u5916\u79ef\u2014\u2014\u4e00\u6761\u6307\u4ee4\u4e2d256\u6b21FMA\u64cd\u4f5c\u3002SME2\u65b0\u589e\uff1a\u591a\u5411\u91cf\u64cd\u4f5c\uff08\u540c\u65f6\u5904\u74062\u62164\u4e2aSVE\u5411\u91cf\uff09\u3001\u989d\u5916\u7684\u74e6\u7247\u64cd\u4f5c\u4ee5\u53ca\u4e0e\u666e\u901a\u6a21\u5f0f\u7684\u6539\u8fdb\u96c6\u6210\u3002
\u53ef\u7528\u6027\uff1aARM Neoverse V2\uff08AWS Graviton4\uff09\u3001\u4e00\u4e9b\u5373\u5c06\u63a8\u51fa\u7684\u79fb\u52a8\u82af\u7247\u3002\u622a\u81f32026\u5e74\u5c1a\u672a\u51fa\u73b0\u5728Apple Silicon\u4e0a\u3002SME\u4ecd\u5904\u4e8e\u65e9\u671f\u9636\u6bb5\u2014\u2014\u5927\u591a\u6570ML\u6846\u67b6\u8fd8\u6ca1\u6709SME\u4f18\u5316\u7684\u6838\u51fd\u6570\u3002
\u6f14\u8fdb\u8109\u7edc\uff1aNEON\uff08128\u4f4d\u5411\u91cf\uff0c\u9010\u5143\u7d20\uff09\u2192 I8MM\uff08INT8\u77e9\u9635\u74e6\u7247\uff09\u2192 SVE\uff08\u53ef\u4f38\u7f29\u5411\u91cf\uff09\u2192 SME\uff08\u53ef\u4f38\u7f292D\u77e9\u9635\u74e6\u7247\uff09\u3002\u6bcf\u4e00\u4ee3\u90fd\u66f4\u63a5\u8fd1\u786c\u4ef6\u539f\u751f\u77e9\u9635\u64cd\u4f5c\u3002
#include <arm_sve.h>\n\nvoid add_sve(const float* a, const float* b, float* c, int n) {\n int i = 0;\n svbool_t pred = svwhilelt_b32(i, n); // \u8c13\u8bcd\uff1a\u54ea\u4e9b\u901a\u9053\u662f\u6fc0\u6d3b\u7684\n\n while (svptest_any(svptrue_b32(), pred)) {\n svfloat32_t va = svld1(pred, a + i);\n svfloat32_t vb = svld1(pred, b + i);\n svst1(pred, c + i, svadd_x(pred, va, vb));\n\n i += svcntw(); // \u6309\u786c\u4ef6\u5411\u91cf\u5bbd\u5ea6\u524d\u8fdb\uff08\u4ee532\u4f4d\u5143\u7d20\u8ba1\uff09\n pred = svwhilelt_b32(i, n);\n }\n}\n \u8c13\u8bcd\u5bc4\u5b58\u5668\uff08svbool_t\uff09\u53d6\u4ee3\u4e86\u6807\u91cf\u6e05\u7406\u5faa\u73af\u3002\u6bcf\u4e2a\u901a\u9053\u6709\u4e00\u4e2a\u8c13\u8bcd\u4f4d\uff1a\u6fc0\u6d3b\u7684\u901a\u9053\u53c2\u4e0e\uff0c\u975e\u6fc0\u6d3b\u7684\u88ab\u5c4f\u853d\u3002svwhilelt_b32(i, n) \u6307\u4ee4\u521b\u5efa\u4e00\u4e2a\u8c13\u8bcd\uff0c\u5176\u4e2d\u5bf9\u5e94 i, i+1, ..., n-1 \u7684\u901a\u9053\u88ab\u6fc0\u6d3b\u3002\u8fd9\u81ea\u52a8\u5904\u7406\u4e86\u5c3e\u90e8\u3002
svcntw() \u5728\u8fd0\u884c\u65f6\u8fd4\u56de\u6bcf\u4e2a\u5411\u91cf\u5bc4\u5b58\u5668\u4e2d32\u4f4d\u5143\u7d20\u7684\u6570\u91cf\u3002\u5728\u5177\u6709256\u4f4dSVE\u7684CPU\u4e0a\uff0c\u8fd4\u56de8\u3002\u5728512\u4f4dSVE\u4e0a\uff0c\u8fd4\u56de16\u3002\u4f60\u7684\u4ee3\u7801\u81ea\u52a8\u9002\u5e94\u3002
SVE\u5728ARM Neoverse V1/V2\u4e0a\u53ef\u7528\uff08AWS Graviton3/4\uff0c\u4e00\u4e9b\u670d\u52a1\u5668\u82af\u7247\uff09\u3002\u5728Apple Silicon\u4e0a\u5c1a\u4e0d\u53ef\u7528\u3002
Apple\u7684M\u7cfb\u5217\u82af\u7247\uff08M1\u3001M2\u3001M3\u3001M4\uff09\u662f\u57fa\u4e8eARM\u7684\u81ea\u5b9a\u4e49\u5fae\u67b6\u6784\uff1a
\u6027\u80fd\u6838\u5fc3\u548c\u6548\u7387\u6838\u5fc3\uff1aP\u6838\u5fc3\uff08Firestorm/Avalanche\u7b49\uff09\u7528\u4e8e\u91cd\u578b\u8ba1\u7b97\uff0cE\u6838\u5fc3\uff08Icestorm/Blizzard\u7b49\uff09\u7528\u4e8e\u540e\u53f0\u4efb\u52a1\u3002\u8c03\u5ea6\u5668\u5c06\u7ebf\u7a0b\u5206\u914d\u7ed9\u9002\u5f53\u7684\u6838\u5fc3\u7c7b\u578b\u3002
AMX\uff08Apple\u77e9\u9635\u6269\u5c55\uff09\uff1a\u4e13\u7528\u77e9\u9635\u4e58\u6cd5\u5355\u5143\uff0c\u72ec\u7acb\u4e8eNEON\u3002AMX\u672a\u516c\u5f00\uff08Apple\u4e0d\u53d1\u5e03ISA\uff09\uff0c\u4f46Accelerate\u6846\u67b6\u5185\u90e8\u5c06\u5176\u7528\u4e8eBLAS\u64cd\u4f5c\u3002\u5f53\u4f60\u5728Mac\u4e0a\u8c03\u7528 np.dot \u65f6\uff0c\u5b83\u901a\u8fc7Accelerate\uff0c\u540e\u8005\u4f7f\u7528AMX\u3002\u4f60\u4e0d\u80fd\u76f4\u63a5\u5bf9AMX\u7f16\u7a0b\uff08\u9664\u975e\u9006\u5411\u5de5\u7a0b\uff09\u3002
\u7edf\u4e00\u5185\u5b58\uff1aCPU\u548cGPU\u5171\u4eab\u540c\u4e00\u7269\u7406RAM\u3002\u5728\u5176\u4ed6\u7cfb\u7edf\u4e0a\uff0c\u6570\u636e\u5fc5\u987b\u4eceCPU\u5185\u5b58\u62f7\u8d1d\u5230GPU\u5185\u5b58\uff08\u901a\u8fc7PCIe\uff0c\u7ea632 GB/s\uff09\u3002\u5728Apple Silicon\u4e0a\uff0c\u65e0\u9700\u62f7\u8d1d\u2014\u2014GPU\u8bfb\u53d6CPU\u5199\u5165\u7684\u540c\u4e00\u5185\u5b58\u3002\u8fd9\u6d88\u9664\u4e86ML\u5de5\u4f5c\u8d1f\u8f7d\u7684\u4e3b\u8981\u74f6\u9888\u3002
\u795e\u7ecf\u7f51\u7edc\u5f15\u64ce\uff1a\u4e00\u4e2a16\u6838\u4e13\u7528ML\u52a0\u901f\u5668\u3002INT8\u63a8\u7406\u65f6\u8fbe\u5230\u7ea630 TOPS\uff08\u6bcf\u79d2\u4e07\u4ebf\u6b21\u64cd\u4f5c\uff09\u3002Core ML\u5c06\u5176\u7528\u4e8e\u8bbe\u5907\u7aef\u63a8\u7406\u3002
Apple Silicon\u4e0a\u7684ML\uff1a\u4f7f\u7528MLX\uff08Apple\u7684ML\u6846\u67b6\uff09\uff0c\u5b83\u4e13\u4e3a\u7edf\u4e00\u5185\u5b58\u67b6\u6784\u8bbe\u8ba1\u3002PyTorch\u4e5f\u6709MPS\uff08Metal\u6027\u80fd\u7740\u8272\u5668\uff09\u540e\u7aef\u652f\u6301\uff0c\u5c3d\u7ba1\u4e0d\u5982CUDA\u6210\u719f\u3002
\u7f16\u5199SIMD\u5185\u8054\u51fd\u6570\u5f88\u7e41\u7410\u3002\u7f16\u8bd1\u5668\u80fd\u81ea\u52a8\u5411\u91cf\u5316\u4f60\u7684\u4ee3\u7801\u5417\uff1f
\u53ef\u4ee5\u7684\uff0c\u4f46\u6709\u9650\u5236\u3002\u73b0\u4ee3\u7f16\u8bd1\u5668\uff08GCC\u3001Clang\uff09\u53ef\u4ee5\u81ea\u52a8\u5411\u91cf\u5316\u7b80\u5355\u5faa\u73af\uff1a
// \u7f16\u8bd1\u5668\u53ef\u4ee5\u81ea\u52a8\u5411\u91cf\u5316\u6b64\u4ee3\u7801\uff08\u4f7f\u7528 -O3 -march=native\uff09\nvoid add_auto(const float* a, const float* b, float* c, int n) {\n for (int i = 0; i < n; i++) {\n c[i] = a[i] + b[i];\n }\n}\n c[i] \u4e0d\u4f9d\u8d56\u4e8e c[i-1]\uff09\u3002const \u548c restrict \u6307\u9488\uff08\u544a\u77e5\u7f16\u8bd1\u5668\u6570\u7ec4\u4e0d\u91cd\u53e0\uff09\u3002// restrict \u544a\u8bc9\u7f16\u8bd1\u5668\uff1aa\u3001b\u3001c \u6307\u5411\u4e0d\u91cd\u53e0\u7684\u5185\u5b58\nvoid add_restrict(const float* __restrict__ a,\n const float* __restrict__ b,\n float* __restrict__ c, int n) {\n for (int i = 0; i < n; i++) {\n c[i] = a[i] + b[i];\n }\n}\n \u6ca1\u6709 restrict\uff0c\u7f16\u8bd1\u5668\u5fc5\u987b\u5047\u8bbe c \u53ef\u80fd\u4e0e a \u6216 b \u91cd\u53e0\uff08\u5199\u5165 c[i] \u53ef\u80fd\u6539\u53d8 a[i+1]\uff09\uff0c\u4ece\u800c\u963b\u6b62\u5411\u91cf\u5316\u3002
\u963b\u6b62\u81ea\u52a8\u5411\u91cf\u5316\u7684\u6a21\u5f0f\uff1a
a[i] = a[i-1] + b[i]\uff08\u6bcf\u6b21\u8fed\u4ee3\u4f9d\u8d56\u524d\u4e00\u6b21\uff09\u3002if \u8bed\u53e5\uff08\u9664\u975e\u7f16\u8bd1\u5668\u80fd\u8f6c\u6362\u4e3a\u8c13\u8bcd\u5316\uff09\u3002restrict\uff09\u3002\u68c0\u67e5\u81ea\u52a8\u5411\u91cf\u5316\uff1a\u4f7f\u7528\u7f16\u8bd1\u5668\u6807\u5fd7\u67e5\u770b\u54ea\u4e9b\u88ab\u5411\u91cf\u5316\u4e86\uff1a
# GCC\uff1a\u663e\u793a\u5411\u91cf\u5316\u51b3\u7b56\ng++ -O3 -march=native -fopt-info-vec-optimized code.cpp\n\n# Clang\uff1a\u663e\u793a\u5411\u91cf\u5316\u62a5\u544a\nclang++ -O3 -march=native -Rpass=loop-vectorize code.cpp\n \u7f16\u5199\u6807\u91cf\u70b9\u79ef\u548cNEON\u5411\u91cf\u5316\u70b9\u79ef\u3002\u5bf9\u4e24\u8005\u8fdb\u884c\u57fa\u51c6\u6d4b\u8bd5\u5e76\u6d4b\u91cf\u52a0\u901f\u6bd4\u3002
// task1_neon_dot.cpp\n// \u7f16\u8bd1\uff08Mac/ARM Linux\uff09\uff1aclang++ -O3 -o task1 task1_neon_dot.cpp\n// \u6ce8\u610f\uff1aNEON\u5728AArch64\u4e0a\u9ed8\u8ba4\u542f\u7528\uff0c\u65e0\u9700\u7279\u6b8a\u6807\u5fd7\n\n#include <iostream>\n#include <chrono>\n#include <vector>\n#include <arm_neon.h>\n\nfloat dot_scalar(const float* a, const float* b, int n) {\n float sum = 0.0f;\n for (int i = 0; i < n; i++) {\n sum += a[i] * b[i];\n }\n return sum;\n}\n\nfloat dot_neon(const float* a, const float* b, int n) {\n float32x4_t sum_vec = vdupq_n_f32(0.0f);\n int i = 0;\n for (; i + 4 <= n; i += 4) {\n float32x4_t va = vld1q_f32(a + i);\n float32x4_t vb = vld1q_f32(b + i);\n sum_vec = vfmaq_f32(sum_vec, va, vb);\n }\n float sum = vaddvq_f32(sum_vec);\n for (; i < n; i++) sum += a[i] * b[i];\n return sum;\n}\n\nint main() {\n const int N = 10'000'000;\n std::vector<float> a(N, 1.0f), b(N, 2.0f);\n\n // \u9884\u70ed\n volatile float s1 = dot_scalar(a.data(), b.data(), N);\n volatile float s2 = dot_neon(a.data(), b.data(), N);\n\n // \u6807\u91cf\u57fa\u51c6\u6d4b\u8bd5\n auto start = std::chrono::high_resolution_clock::now();\n for (int t = 0; t < 100; t++) {\n s1 = dot_scalar(a.data(), b.data(), N);\n }\n auto end = std::chrono::high_resolution_clock::now();\n double scalar_ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n\n // NEON\u57fa\u51c6\u6d4b\u8bd5\n start = std::chrono::high_resolution_clock::now();\n for (int t = 0; t < 100; t++) {\n s2 = dot_neon(a.data(), b.data(), N);\n }\n end = std::chrono::high_resolution_clock::now();\n double neon_ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n\n std::cout << \"\u6807\u91cf: \" << scalar_ms << \" ms\uff08\u7ed3\u679c: \" << s1 << \"\uff09\\n\";\n std::cout << \"NEON: \" << neon_ms << \" ms\uff08\u7ed3\u679c: \" << s2 << \"\uff09\\n\";\n std::cout << \"\u52a0\u901f\u6bd4: \" << scalar_ms / neon_ms << \"x\\n\";\n return 0;\n}\n \u5b9e\u73b0NEON ReLU\u548csoftmax\u6700\u5927\u503c\u67e5\u627e\u3002\u7ec3\u4e60\u4f7f\u7528\u4e0d\u540c\u64cd\u4f5c\u7684\u52a0\u8f7d\u2192\u8ba1\u7b97\u2192\u5b58\u50a8\u6a21\u5f0f\u3002
// task2_neon_ops.cpp\n// \u7f16\u8bd1\uff1aclang++ -O3 -o task2 task2_neon_ops.cpp\n\n#include <iostream>\n#include <vector>\n#include <cmath>\n#include <arm_neon.h>\n\nvoid relu_neon(const float* in, float* out, int n) {\n float32x4_t zero = vdupq_n_f32(0.0f);\n int i = 0;\n for (; i + 4 <= n; i += 4) {\n float32x4_t x = vld1q_f32(in + i);\n vst1q_f32(out + i, vmaxq_f32(x, zero));\n }\n for (; i < n; i++) out[i] = in[i] > 0 ? in[i] : 0;\n}\n\nfloat max_neon(const float* data, int n) {\n float32x4_t max_vec = vdupq_n_f32(-INFINITY);\n int i = 0;\n for (; i + 4 <= n; i += 4) {\n max_vec = vmaxq_f32(max_vec, vld1q_f32(data + i));\n }\n float result = vmaxvq_f32(max_vec);\n for (; i < n; i++) result = result > data[i] ? result : data[i];\n return result;\n}\n\nint main() {\n std::vector<float> data = {-3, 1, -1, 4, 2, -5, 0, 7, -2, 3};\n std::vector<float> out(data.size());\n\n relu_neon(data.data(), out.data(), data.size());\n std::cout << \"ReLU: \";\n for (float x : out) std::cout << x << \" \";\n std::cout << \"\\n\";\n\n float mx = max_neon(data.data(), data.size());\n std::cout << \"\u6700\u5927\u503c: \" << mx << \"\uff08\u671f\u671b\u503c: 7\uff09\\n\";\n return 0;\n}\n \u6bd4\u8f83\u81ea\u52a8\u5411\u91cf\u5316\u4ee3\u7801\u4e0e\u624b\u5199NEON\u5185\u8054\u51fd\u6570\u3002\u7528 -fopt-info-vec\uff08GCC\uff09\u6216 -Rpass=loop-vectorize\uff08Clang\uff09\u7f16\u8bd1\u4ee5\u67e5\u770b\u7f16\u8bd1\u5668\u7684\u64cd\u4f5c\u3002
// task3_auto_vs_manual.cpp\n// \u7f16\u8bd1\uff1aclang++ -O3 -Rpass=loop-vectorize -o task3 task3_auto_vs_manual.cpp\n// \uff08\u6216\uff09\uff1ag++ -O3 -fopt-info-vec-optimized -o task3 task3_auto_vs_manual.cpp\n\n#include <iostream>\n#include <chrono>\n#include <vector>\n#include <arm_neon.h>\n\n// \u8ba9\u7f16\u8bd1\u5668\u81ea\u52a8\u5411\u91cf\u5316\nvoid add_auto(const float* __restrict__ a, const float* __restrict__ b,\n float* __restrict__ c, int n) {\n for (int i = 0; i < n; i++) {\n c[i] = a[i] + b[i];\n }\n}\n\n// \u624b\u5199NEON\nvoid add_neon(const float* a, const float* b, float* c, int n) {\n int i = 0;\n for (; i + 4 <= n; i += 4) {\n vst1q_f32(c + i, vaddq_f32(vld1q_f32(a + i), vld1q_f32(b + i)));\n }\n for (; i < n; i++) c[i] = a[i] + b[i];\n}\n\nint main() {\n const int N = 10'000'000;\n std::vector<float> a(N, 1.0f), b(N, 2.0f), c(N);\n\n auto bench = [&](auto fn, const char* name) {\n fn(a.data(), b.data(), c.data(), N); // \u9884\u70ed\n auto start = std::chrono::high_resolution_clock::now();\n for (int t = 0; t < 100; t++) fn(a.data(), b.data(), c.data(), N);\n auto end = std::chrono::high_resolution_clock::now();\n double ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n std::cout << name << \": \" << ms << \" ms\\n\";\n };\n\n bench(add_auto, \"\u81ea\u52a8\u5411\u91cf\u5316\");\n bench(add_neon, \"\u624b\u5199NEON\");\n // \u5b83\u4eec\u5e94\u8be5\u975e\u5e38\u63a5\u8fd1\u2014\u2014\u7f16\u8bd1\u5668\u80fd\u5f88\u597d\u5730\u81ea\u52a8\u5411\u91cf\u5316\u8fd9\u4e2a\u7b80\u5355\u5faa\u73af\n return 0;\n}\n x86\u5904\u7406\u5668\u6765\u81eaIntel\u548cAMD\uff0c\u4e3b\u5bfc\u7740\u5927\u591a\u6570ML\u8bad\u7ec3\u6240\u5728\u7684\u6570\u636e\u4e2d\u5fc3\u670d\u52a1\u5668\u3002\u672c\u6587\u6db5\u76d6x86 SIMD\u7684\u6f14\u8fdb\u3001AVX/AVX2\u5185\u8054\u51fd\u6570\u7f16\u7a0b\u3001AVX-512\u3001\u7528\u4e8e\u77e9\u9635\u64cd\u4f5c\u7684Intel AMX\u3001\u5185\u5b58\u5bf9\u9f50\u3001\u6027\u80fd\u9677\u9631\u4ee5\u53ca\u6027\u80fd\u5206\u6790\u2014\u2014\u5728\u5168\u7403\u6700\u5e38\u89c1\u7684\u670d\u52a1\u5668CPU\u4e0a\u69a8\u53d6\u6700\u5927\u6027\u80fd\u7684\u5de5\u5177\u3002
\u6bcf\u4e00\u4ee3\u90fd\u5c06\u5411\u91cf\u5316\u4ee3\u7801\u7684\u541e\u5410\u91cf\u7ffb\u500d\u3002\u7528SSE\u5185\u8054\u51fd\u6570\u7f16\u5199\u7684\u4ee3\u7801\u53ef\u4ee5\u57282001\u5e74\u4ee5\u6765\u5236\u9020\u7684\u6bcf\u4e00\u4e2ax86 CPU\u4e0a\u8fd0\u884c\u3002AVX2\u9700\u89812013\u5e74\u4ee5\u540e\u7684CPU\u3002AVX-512\u9700\u8981Intel Xeon\u548c\u4e00\u4e9b\u6d88\u8d39\u7ea7\u82af\u7247\u3002AMX\u662f\u6700\u65b0\u7684\uff08Sapphire Rapids\u53ca\u4ee5\u540e\uff09\u3002
\u5411\u540e\u517c\u5bb9\u6027\uff1ax86 SSE\u5bc4\u5b58\u5668\uff08xmm\uff09\u662fAVX\u5bc4\u5b58\u5668\uff08ymm\uff09\u7684\u4f4e128\u4f4d\uff0c\u540e\u8005\u662fAVX-512\u5bc4\u5b58\u5668\uff08zmm\uff09\u7684\u4f4e256\u4f4d\u3002\u65e7\u7684SSE\u4ee3\u7801\u65e0\u9700\u4fee\u6539\u5373\u53ef\u5728\u65b0\u7684CPU\u4e0a\u8fd0\u884c\u3002
\u6240\u6709x86\u5185\u8054\u51fd\u6570\u9075\u5faa\u6a21\u5f0f\uff1a_mm[\u5bbd\u5ea6]_[\u64cd\u4f5c]_[\u7c7b\u578b]
_mm = MMX/SSE\uff08128\u4f4d\uff09\uff0c_mm256 = AVX\uff08256\u4f4d\uff09\uff0c_mm512 = AVX-512\uff08512\u4f4d\uff09add\u3001mul\u3001fmadd\u3001load\u3001store\u3001set \u7b49ps = \u6253\u5305\u5355\u7cbe\u5ea6\uff08float32\uff09\uff0cpd = \u6253\u5305\u53cc\u7cbe\u5ea6\uff08float64\uff09\uff0cepi32 = \u6253\u5305int32\uff0csi256 = 256\u4f4d\u6574\u6570#include <immintrin.h> // \u6240\u6709x86 SIMD\u5185\u8054\u51fd\u6570\n\n// \u6570\u636e\u7c7b\u578b\n__m256 a; // 256\u4f4d\u5bc4\u5b58\u5668\uff0c\u4fdd\u5b588\u4e2afloat32\n__m256d b; // 256\u4f4d\u5bc4\u5b58\u5668\uff0c\u4fdd\u5b584\u4e2afloat64\n__m256i c; // 256\u4f4d\u5bc4\u5b58\u5668\uff0c\u4fdd\u5b58\u6574\u6570\uff088x32\u300116x16\u621632x8\uff09\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/03.%20x86%20and%20AVX/#_2","title":"\u52a0\u8f7d\u548c\u5b58\u50a8\u6570\u636e","text":"// \u4ece\u5185\u5b58\u52a0\u8f7d8\u4e2a\u6d6e\u70b9\u6570\n__m256 v = _mm256_loadu_ps(ptr); // \u975e\u5bf9\u9f50\u52a0\u8f7d\uff08\u9002\u7528\u4e8e\u4efb\u4f55\u5730\u5740\uff09\n__m256 v = _mm256_load_ps(ptr); // \u5bf9\u9f50\u52a0\u8f7d\uff08ptr\u5fc5\u987b32\u5b57\u8282\u5bf9\u9f50\uff0c\u66f4\u5feb\uff09\n\n// \u5b58\u50a88\u4e2a\u6d6e\u70b9\u6570\u5230\u5185\u5b58\n_mm256_storeu_ps(out_ptr, v); // \u975e\u5bf9\u9f50\u5b58\u50a8\n_mm256_store_ps(out_ptr, v); // \u5bf9\u9f50\u5b58\u50a8\n\n// \u5c06\u5355\u4e2a\u503c\u5e7f\u64ad\u5230\u6240\u67098\u4e2a\u901a\u9053\n__m256 ones = _mm256_set1_ps(1.0f); // [1, 1, 1, 1, 1, 1, 1, 1]\n\n// \u8bbe\u7f6e\u5404\u4e2a\u503c\uff08\u5f88\u5c11\u9700\u8981\uff09\n__m256 v = _mm256_set_ps(7,6,5,4,3,2,1,0); // \u6ce8\u610f\uff1a\u9006\u5e8f\uff01\n\n// \u96f6\u5bc4\u5b58\u5668\n__m256 z = _mm256_setzero_ps();\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/03.%20x86%20and%20AVX/#_3","title":"\u7b97\u672f\u8fd0\u7b97","text":"__m256 c = _mm256_add_ps(a, b); // c[i] = a[i] + b[i]\n__m256 d = _mm256_mul_ps(a, b); // d[i] = a[i] * b[i]\n__m256 e = _mm256_sub_ps(a, b); // e[i] = a[i] - b[i]\n__m256 f = _mm256_div_ps(a, b); // f[i] = a[i] / b[i]\uff08\u6bd4\u4e58\u6cd5\u6162\uff09\n\n// \u878d\u5408\u4e58\u52a0\uff1ar = a * b + c\uff08\u4e00\u6761\u6307\u4ee4\uff0c\u4e00\u6b21\u820d\u5165\uff09\n__m256 r = _mm256_fmadd_ps(a, b, c); // ML\u6700\u91cd\u8981\u7684\u6307\u4ee4\n\n// \u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\n__m256 mn = _mm256_min_ps(a, b); // min(a[i], b[i]) \u2014 \u7528\u4e8e\u88c1\u526a\n__m256 mx = _mm256_max_ps(a, b); // max(a[i], b[i]) \u2014 \u7528\u4e8eReLU\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/03.%20x86%20and%20AVX/#avx2_1","title":"\u5b9e\u8df5\u793a\u4f8b\uff1aAVX2\u70b9\u79ef","text":"#include <immintrin.h>\n\nfloat dot_avx2(const float* a, const float* b, int n) {\n __m256 sum = _mm256_setzero_ps(); // 8\u4e2a\u7d2f\u52a0\u5668\u521d\u59cb\u5316\u4e3a0\n\n int i = 0;\n for (; i + 8 <= n; i += 8) {\n __m256 va = _mm256_loadu_ps(a + i);\n __m256 vb = _mm256_loadu_ps(b + i);\n sum = _mm256_fmadd_ps(va, vb, sum); // sum += va * vb\n }\n\n // \u6c34\u5e73\u5f52\u7ea6\uff1a\u5c06sum\u76848\u4e2a\u5143\u7d20\u76f8\u52a0\n // \u6b65\u9aa41\uff1a\u5c06\u4e0a128\u4f4d\u52a0\u5230\u4e0b128\u4f4d\n __m128 hi = _mm256_extractf128_ps(sum, 1);\n __m128 lo = _mm256_castps256_ps128(sum);\n __m128 sum128 = _mm_add_ps(hi, lo); // 4\u4e2a\u90e8\u5206\u548c\n\n // \u6b65\u9aa42\uff1a\u5728128\u4f4d\u5bc4\u5b58\u5668\u5185\u6c34\u5e73\u76f8\u52a0\n sum128 = _mm_hadd_ps(sum128, sum128); // [a+b, c+d, a+b, c+d]\n sum128 = _mm_hadd_ps(sum128, sum128); // [a+b+c+d, ...]\n\n float result = _mm_cvtss_f32(sum128); // \u63d0\u53d6\u6807\u91cf\n\n // \u6807\u91cf\u6e05\u7406\n for (; i < n; i++) {\n result += a[i] * b[i];\n }\n\n return result;\n}\n \u4e3a\u4ec0\u4e48\u6c34\u5e73\u5f52\u7ea6\u5982\u6b64\u4e11\u964b\uff1aSIMD\u662f\u4e3a\u5782\u76f4\u64cd\u4f5c\u8bbe\u8ba1\u7684\uff08\u901a\u90530\u4e0e\u901a\u90530\uff0c\u901a\u90531\u4e0e\u901a\u90531\uff09\u3002\u6c34\u5e73\u64cd\u4f5c\uff08\u8de8\u901a\u9053\u6c42\u548c\uff09\u4e0e\u786c\u4ef6\u5bf9\u6297\u3002\u8fd9\u5c31\u662f\u70b9\u79ef\u5728\u672b\u5c3e\u6709\u5c34\u5c2c\u5f52\u7ea6\u4ee3\u7801\u7684\u539f\u56e0\u3002\u5411\u91cf\u5316\u5faa\u73af\u662f\u7b80\u6d01\u7684\uff1b\u5f52\u7ea6\u662f\u6837\u677f\u4ee3\u7801\u3002
\u6027\u80fd\uff1a\u4e0eNEON\u7248\u672c\uff08\u6587\u4ef602\uff09\u76f8\u6bd4\uff0cAVX2\u6bcf\u6b21\u8fed\u4ee3\u5904\u74068\u4e2a\u6d6e\u70b9\u6570\uff0c\u800cNEON\u5904\u74064\u4e2a\u3002\u5bf9\u4e8e\u957f\u5411\u91cf\uff0c\u8fd9\u6bd4NEON\u5feb2\u500d\uff08\u5ffd\u7565\u5185\u5b58\u5e26\u5bbd\u9650\u5236\uff09\u3002
float vector_max_avx2(const float* data, int n) {\n __m256 max_vec = _mm256_set1_ps(-INFINITY);\n\n int i = 0;\n for (; i + 8 <= n; i += 8) {\n __m256 v = _mm256_loadu_ps(data + i);\n max_vec = _mm256_max_ps(max_vec, v);\n }\n\n // \u5c068\u4e2a\u6700\u5927\u503c\u5f52\u7ea6\u4e3a1\u4e2a\n __m128 hi = _mm256_extractf128_ps(max_vec, 1);\n __m128 lo = _mm256_castps256_ps128(max_vec);\n __m128 max128 = _mm_max_ps(hi, lo);\n\n // \u901a\u8fc7\u6df7\u6d17\u548c\u53d6\u6700\u5927\u503c\u627e\u5230\u5355\u4e00\u6700\u5927\u503c\n max128 = _mm_max_ps(max128, _mm_shuffle_ps(max128, max128, 0b01001110));\n max128 = _mm_max_ps(max128, _mm_shuffle_ps(max128, max128, 0b10110001));\n\n float result = _mm_cvtss_f32(max128);\n\n for (; i < n; i++) {\n result = result > data[i] ? result : data[i];\n }\n\n return result;\n}\n _mm_shuffle_ps \u6307\u4ee4\u5728\u5bc4\u5b58\u5668\u5185\u91cd\u6392\u5143\u7d20\u3002\u4e8c\u8fdb\u5236\u5e38\u91cf 0b01001110 \u63a7\u5236\u54ea\u4e9b\u5143\u7d20\u53bb\u54ea\u91cc\u3002\u8fd9\u79f0\u4e3a\u7f6e\u6362\uff0c\u5b83\u76f4\u63a5\u8fde\u63a5\u5230\u7f6e\u6362\u77e9\u9635\uff08\u7b2c2\u7ae0\uff09\uff1a\u6253\u4e71SIMD\u901a\u9053\u662f\u505a\u786c\u4ef6\u7ea7\u522b\u7684\u4e58\u4ee5\u7f6e\u6362\u77e9\u9635\u3002__m512 a = _mm512_loadu_ps(ptr); // \u52a0\u8f7d16\u4e2a\u6d6e\u70b9\u6570\n__m512 c = _mm512_fmadd_ps(a, b, c); // 16\u4e2aFMA\u540c\u65f6\u8fdb\u884c\nfloat sum = _mm512_reduce_add_ps(a); // \u5185\u7f6e\u6c34\u5e73\u6c42\u548c\uff08\u65e0\u9700\u624b\u52a8\u5f52\u7ea6\uff01\uff09\n\n// \u63a9\u7801\u64cd\u4f5c\uff1a\u64cd\u4f5c\u901a\u9053\u5b50\u96c6\n__mmask16 mask = _mm512_cmpgt_ps_mask(a, zero); // \u54ea\u4e9b\u901a\u9053 > 0\uff1f\n__m512 relu = _mm512_maskz_mov_ps(mask, a); // \u8d1f\u901a\u9053\u7f6e\u96f6 = ReLU\n \u63a9\u7801\u5bc4\u5b58\u5668\uff08__mmask16\uff09\u662fAVX-512\u6700\u5f3a\u5927\u7684\u529f\u80fd\u3002\u6bcf\u4e2a\u4f4d\u63a7\u5236\u4e00\u4e2a\u901a\u9053\u662f\u5426\u53c2\u4e0e\u64cd\u4f5c\u3002\u8fd9\u53d6\u4ee3\u4e86\u6807\u91cf\u6e05\u7406\u5faa\u73af\uff1a\u6700\u540e\u4e00\u6b21\u8fed\u4ee3\u4f7f\u7528\u63a9\u7801\uff0c\u53ea\u6709\u6709\u6548\u901a\u9053\u662f\u6fc0\u6d3b\u7684\uff0c\u5904\u7406\u4efb\u4f55\u5411\u91cf\u957f\u5ea6\u800c\u65e0\u9700\u5355\u72ec\u6807\u91cf\u5faa\u73af\u3002
AVX-512\u9891\u7387\u964d\u9891\uff1a\u5728\u8bb8\u591aIntel CPU\u4e0a\uff0c\u4f7f\u7528AVX-512\u6307\u4ee4\u4f1a\u5bfc\u81f4CPU\u6682\u65f6\u964d\u4f4e\u65f6\u949f\u9891\u7387\uff08\u4ee5\u4fdd\u6301\u5728\u70ed\u9650\u5236\u5185\uff09\u3002\u8fd9\u610f\u5473\u7740\u5bf9\u4e8e\u77ed\u65f6\u7206\u53d1\uff0cAVX-512\u5e76\u4e0d\u603b\u662f\u6bd4AVX2\u5feb\u2014\u2014\u9891\u7387\u60e9\u7f5a\u53ef\u80fd\u62b5\u6d88\u66f4\u5bbd\u5411\u91cf\u7684\u4f18\u52bf\u3002\u5bf9\u4e8e\u6301\u7eed\u5de5\u4f5c\u8d1f\u8f7d\uff08\u5982\u77e9\u9635\u4e58\u6cd5\uff09\uff0cAVX-512\u80dc\u51fa\u3002\u5bf9\u4e8e\u6df7\u5408\u4ee3\u7801\uff08\u90e8\u5206SIMD\u3001\u90e8\u5206\u6807\u91cf\uff09\uff0c\u9891\u7387\u8f6c\u6362\u53ef\u80fd\u9020\u6210\u635f\u5931\u3002
#include <immintrin.h>\n\n// AMX\u74e6\u7247\u4e58\u6cd5\uff1aC += A * B\uff08BF16\u683c\u5f0f\uff09\n// A\u4e3a16x32 BF16\uff0cB\u4e3a32x16 BF16\uff0cC\u4e3a16x16 FP32\n_tile_loadd(0, a_ptr, stride_a); // \u4eceA\u52a0\u8f7d\u74e6\u72470\n_tile_loadd(1, b_ptr, stride_b); // \u4eceB\u52a0\u8f7d\u74e6\u72471\n_tile_dpbf16ps(2, 0, 1); // \u74e6\u72472 += \u74e6\u72470 * \u74e6\u72471\uff08BF16\u77e9\u9635\u4e58\u6cd5\uff0cFP32\u7d2f\u52a0\uff09\n_tile_stored(2, c_ptr, stride_c); // \u5b58\u50a8\u74e6\u72472\u5230C\n AMX\u5728\u4e00\u6761\u6307\u4ee4\u4e2d\u6267\u884c\u5b8c\u6574\u768416\u00d732 \u00d7 32\u00d716\u77e9\u9635\u4e58\u6cd5\u3002\u8fd9\u662f\u6570\u767e\u6b21FMA\u64cd\u4f5c\u540c\u65f6\u8fdb\u884c\uff0c\u4e13\u95e8\u4e3aTransformer\u63a8\u7406\u4e2d\u4e3b\u5bfc\u7684\u5c0f\u77e9\u9635\u4e58\u6cd5\u8bbe\u8ba1\uff08\u6ce8\u610f\u529b\u5f97\u5206\u8ba1\u7b97\u3001MLP\u5c42\uff09\u3002
AMX\u652f\u6301BF16\uff08bfloat16\uff09\u548cINT8\uff0c\u5339\u914dML\u63a8\u7406\u4e2d\u4f7f\u7528\u7684\u7cbe\u5ea6\u3002\u7ed3\u5408\u7528\u4e8e\u5176\u4ed6\u64cd\u4f5c\u7684AVX-512\uff0c\u914d\u5907AMX\u7684CPU\uff08Intel Sapphire Rapids\u3001Emerald Rapids\uff09\u53ef\u4ee5\u5728Transformer\u63a8\u7406\u4e2d\u4e0e\u5165\u95e8\u7ea7GPU\u7ade\u4e89\u3002
_mm256_load_ps\uff08\u76f8\u5bf9\u4e8e _mm256_loadu_ps\uff09\u7684\u8981\u6c42\u3002// \u5206\u914d\u5bf9\u9f50\u5185\u5b58\nfloat* data = (float*)aligned_alloc(32, n * sizeof(float)); // AVX\u768432\u5b57\u8282\u5bf9\u9f50\n\n// C++\u5bf9\u9f50\u5206\u914d\n#include <new>\nfloat* data = new (std::align_val_t(32)) float[n];\n\n// \u6216\u8005\u4f7f\u7528\u7f16\u8bd1\u5668\u5c5e\u6027\nalignas(32) float data[1024];\n loadu\uff09\u51e0\u4e4e\u4e0e\u5bf9\u9f50\u52a0\u8f7d\u4e00\u6837\u5feb\u3002\u975e\u5bf9\u9f50\u8bbf\u95ee\u7684\u6027\u80fd\u60e9\u7f5a\u5df2\u57fa\u672c\u6d88\u5931\uff0c\u4f46\u7f13\u5b58\u884c\u5206\u5272\uff08\u6570\u636e\u8de8\u8d8a\u4e24\u4e2a64\u5b57\u8282\u7f13\u5b58\u884c\uff09\u4ecd\u53ef\u80fd\u4f7f\u7279\u5b9a\u52a0\u8f7d\u53d8\u6162\u7ea62\u500d\u3002\u5bf9\u9f50\u5206\u914d\u5b8c\u5168\u907f\u514d\u4e86\u8fd9\u79cd\u60c5\u51b5\u3002AVX-SSE\u8f6c\u6362\u60e9\u7f5a\uff1a\u5728\u8f83\u65e7\u7684Intel CPU\uff08Skylake\u4e4b\u524d\uff09\u4e0a\uff0c\u5728AVX\uff08256\u4f4d\uff09\u548cSSE\uff08128\u4f4d\uff09\u6307\u4ee4\u4e4b\u95f4\u5207\u6362\u4f1a\u9020\u6210\u60e9\u7f5a\uff08\u7ea670\u5468\u671f\uff09\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48\u4f60\u5e94\u8be5\u5728\u4ece\u4f7f\u7528AVX\u7684\u51fd\u6570\u8fd4\u56de\u4e4b\u524d\u4f7f\u7528 _mm256_zeroupper()\uff08\u6216 vzeroupper \u6307\u4ee4\uff09\u6e05\u9664YMM\u5bc4\u5b58\u5668\u7684\u4e0a128\u4f4d\u3002\u73b0\u4ee3CPU\uff08Skylake+\uff09\u6ca1\u6709\u6b64\u60e9\u7f5a\u3002
\u5bc4\u5b58\u5668\u538b\u529b\uff1aAVX2\u670916\u4e2aYMM\u5bc4\u5b58\u5668\u3002\u5982\u679c\u4f60\u7684\u6838\u51fd\u6570\u4f7f\u7528\u592a\u591a\u53d8\u91cf\uff0c\u7f16\u8bd1\u5668\u4f1a\u5c06\u5bc4\u5b58\u5668\u6ea2\u51fa\u5230\u6808\uff08\u5185\u5b58\uff09\uff0c\u4ece\u800c\u7834\u574f\u6027\u80fd\u3002\u4fdd\u6301\u5185\u5faa\u73af\u7b80\u5355\uff0c\u6d3b\u53d8\u91cf\u5c11\u3002
\u6570\u636e\u4f9d\u8d56\uff1asum = _mm256_fmadd_ps(a, b, sum) \u5bf9 sum \u6709\u4f9d\u8d56\uff1a\u6bcf\u6b21\u8fed\u4ee3\u5fc5\u987b\u7b49\u5f85\u524d\u4e00\u4e2aFMA\u5b8c\u6210\uff08\u7ea64-5\u4e2a\u5468\u671f\u7684\u5ef6\u8fdf\uff09\u3002\u89e3\u51b3\u65b9\u6848\uff1a\u4f7f\u7528\u591a\u4e2a\u72ec\u7acb\u7d2f\u52a0\u5668\u5e76\u5728\u7ed3\u675f\u65f6\u5f52\u7ea6\uff1a
// \u5355\u7d2f\u52a0\u5668\uff1a\u53d7FMA\u5ef6\u8fdf\u9650\u5236\uff084-5\u4e2a\u5468\u671f\uff09\n__m256 sum = _mm256_setzero_ps();\nfor (...) {\n sum = _mm256_fmadd_ps(a, b, sum); // \u6bcf\u4e2a\u4f9d\u8d56\u524d\u4e00\u4e2a\n}\n\n// \u56db\u4e2a\u7d2f\u52a0\u5668\uff1a4\u500d\u541e\u5410\u91cf\uff08\u9690\u85cf\u5ef6\u8fdf\uff09\n__m256 sum0 = _mm256_setzero_ps();\n__m256 sum1 = _mm256_setzero_ps();\n__m256 sum2 = _mm256_setzero_ps();\n__m256 sum3 = _mm256_setzero_ps();\nfor (...) {\n sum0 = _mm256_fmadd_ps(a0, b0, sum0); // \u72ec\u7acb\n sum1 = _mm256_fmadd_ps(a1, b1, sum1); // \u72ec\u7acb\n sum2 = _mm256_fmadd_ps(a2, b2, sum2); // \u72ec\u7acb\n sum3 = _mm256_fmadd_ps(a3, b3, sum3); // \u72ec\u7acb\n}\nsum0 = _mm256_add_ps(sum0, sum1);\nsum2 = _mm256_add_ps(sum2, sum3);\nsum0 = _mm256_add_ps(sum0, sum2);\n # Linux perf\uff08\u9700\u8981\u5185\u6838\u652f\u6301\uff09\nperf stat ./my_program # \u57fa\u672c\u8ba1\u6570\u5668\uff1a\u5468\u671f\u3001\u6307\u4ee4\u3001IPC\nperf stat -e cache-misses,cache-references ./my_program # \u7f13\u5b58\u884c\u4e3a\nperf record -g ./my_program && perf report # \u8c03\u7528\u56fe\u5206\u6790\n\n# Intel VTune\uff08\u8be6\u7ec6\u7684x86\u6027\u80fd\u5206\u6790\uff09\nvtune -collect hotspots -- ./my_program\nvtune -collect memory-access -- ./my_program # \u5185\u5b58\u5e26\u5bbd\u5206\u6790\n \u7f16\u5199\u6807\u91cf\u70b9\u79ef\u548cAVX2\u70b9\u79ef\u3002\u5bf9\u4e24\u8005\u8fdb\u884c\u57fa\u51c6\u6d4b\u8bd5\u5e76\u6d4b\u91cf8\u8defSIMD\u5e26\u6765\u7684\u52a0\u901f\u6bd4\u3002
// task1_avx_dot.cpp\n// \u7f16\u8bd1\uff1ag++ -O3 -mavx2 -mfma -o task1 task1_avx_dot.cpp\n\n#include <iostream>\n#include <chrono>\n#include <vector>\n#include <immintrin.h>\n\nfloat dot_scalar(const float* a, const float* b, int n) {\n float sum = 0.0f;\n for (int i = 0; i < n; i++) sum += a[i] * b[i];\n return sum;\n}\n\nfloat dot_avx2(const float* a, const float* b, int n) {\n __m256 sum = _mm256_setzero_ps();\n int i = 0;\n for (; i + 8 <= n; i += 8) {\n __m256 va = _mm256_loadu_ps(a + i);\n __m256 vb = _mm256_loadu_ps(b + i);\n sum = _mm256_fmadd_ps(va, vb, sum);\n }\n // \u5f52\u7ea6\uff1a\u4e0a128\u52a0\u5230\u4e0b128\uff0c\u7136\u540e\u6c34\u5e73\u76f8\u52a0\n __m128 hi = _mm256_extractf128_ps(sum, 1);\n __m128 lo = _mm256_castps256_ps128(sum);\n __m128 r = _mm_add_ps(hi, lo);\n r = _mm_hadd_ps(r, r);\n r = _mm_hadd_ps(r, r);\n float result = _mm_cvtss_f32(r);\n for (; i < n; i++) result += a[i] * b[i];\n return result;\n}\n\nint main() {\n const int N = 10'000'000;\n std::vector<float> a(N, 1.0f), b(N, 2.0f);\n\n volatile float s1 = dot_scalar(a.data(), b.data(), N);\n volatile float s2 = dot_avx2(a.data(), b.data(), N);\n\n auto bench = [&](auto fn, const char* name) {\n auto start = std::chrono::high_resolution_clock::now();\n volatile float s;\n for (int t = 0; t < 100; t++) s = fn(a.data(), b.data(), N);\n auto end = std::chrono::high_resolution_clock::now();\n double ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n std::cout << name << \": \" << ms << \" ms\uff08\u7ed3\u679c: \" << s << \"\uff09\\n\";\n return ms;\n };\n\n double t1 = bench(dot_scalar, \"\u6807\u91cf\");\n double t2 = bench(dot_avx2, \"AVX2 \");\n std::cout << \"\u52a0\u901f\u6bd4: \" << t1 / t2 << \"x\\n\";\n return 0;\n}\n \u4f7f\u7528 _mm256_max_ps \u5b9e\u73b0AVX2 ReLU\u5e76\u4e0e\u6807\u91cf\u5faa\u73af\u6bd4\u8f83\u3002\u7136\u540e\u5c1d\u8bd5\u4f7f\u7528\u591a\u7d2f\u52a0\u5668\uff08\u5faa\u73af\u5c55\u5f00\uff09\u4ee5\u9690\u85cfFMA\u5ef6\u8fdf\u3002
// task2_avx_relu.cpp\n// \u7f16\u8bd1\uff1ag++ -O3 -mavx2 -o task2 task2_avx_relu.cpp\n\n#include <iostream>\n#include <chrono>\n#include <vector>\n#include <immintrin.h>\n\nvoid relu_scalar(const float* in, float* out, int n) {\n for (int i = 0; i < n; i++) {\n out[i] = in[i] > 0.0f ? in[i] : 0.0f;\n }\n}\n\nvoid relu_avx2(const float* in, float* out, int n) {\n __m256 zero = _mm256_setzero_ps();\n int i = 0;\n for (; i + 8 <= n; i += 8) {\n __m256 x = _mm256_loadu_ps(in + i);\n _mm256_storeu_ps(out + i, _mm256_max_ps(x, zero));\n }\n for (; i < n; i++) out[i] = in[i] > 0.0f ? in[i] : 0.0f;\n}\n\n// \u5c55\u5f00\uff1a\u6bcf\u6b21\u8fed\u4ee3\u5904\u740632\u4e2a\u6d6e\u70b9\u6570\uff084 x 8\uff09\nvoid relu_avx2_unrolled(const float* in, float* out, int n) {\n __m256 zero = _mm256_setzero_ps();\n int i = 0;\n for (; i + 32 <= n; i += 32) {\n __m256 x0 = _mm256_loadu_ps(in + i);\n __m256 x1 = _mm256_loadu_ps(in + i + 8);\n __m256 x2 = _mm256_loadu_ps(in + i + 16);\n __m256 x3 = _mm256_loadu_ps(in + i + 24);\n _mm256_storeu_ps(out + i, _mm256_max_ps(x0, zero));\n _mm256_storeu_ps(out + i + 8, _mm256_max_ps(x1, zero));\n _mm256_storeu_ps(out + i + 16, _mm256_max_ps(x2, zero));\n _mm256_storeu_ps(out + i + 24, _mm256_max_ps(x3, zero));\n }\n for (; i + 8 <= n; i += 8) {\n _mm256_storeu_ps(out + i, _mm256_max_ps(_mm256_loadu_ps(in + i), zero));\n }\n for (; i < n; i++) out[i] = in[i] > 0.0f ? in[i] : 0.0f;\n}\n\nint main() {\n const int N = 16'000'000;\n std::vector<float> in(N), out(N);\n for (int i = 0; i < N; i++) in[i] = (float)(i % 200) - 100.0f;\n\n auto bench = [&](auto fn, const char* name) {\n fn(in.data(), out.data(), N); // \u9884\u70ed\n auto start = std::chrono::high_resolution_clock::now();\n for (int t = 0; t < 100; t++) fn(in.data(), out.data(), N);\n auto end = std::chrono::high_resolution_clock::now();\n double ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n double bw = 2.0 * N * sizeof(float) / ms / 1e6; // \u8bfb\u53d6+\u5199\u5165\n std::cout << name << \": \" << ms << \" ms\uff08\" << bw << \" GB/s\uff09\\n\";\n };\n\n bench(relu_scalar, \"\u6807\u91cf \");\n bench(relu_avx2, \"AVX2 \");\n bench(relu_avx2_unrolled, \"AVX2\u5c55\u5f00 \");\n return 0;\n}\n \u6d4b\u91cf\u5185\u5b58\u5bf9\u9f50\u7684\u6548\u679c\u3002\u6bd4\u8f83\u5728\u5927\u6570\u7ec4\u4e0a\u7684\u5bf9\u9f50\u52a0\u8f7d\u4e0e\u975e\u5bf9\u9f50\u52a0\u8f7d\u3002
// task3_alignment.cpp\n// \u7f16\u8bd1\uff1ag++ -O3 -mavx2 -o task3 task3_alignment.cpp\n\n#include <iostream>\n#include <chrono>\n#include <cstdlib>\n#include <immintrin.h>\n\nint main() {\n const int N = 16'000'000;\n\n // \u5bf9\u9f50\u5206\u914d\uff08AVX2\u4e3a32\u5b57\u8282\uff09\n float* aligned = (float*)aligned_alloc(32, N * sizeof(float));\n\n // \u975e\u5bf9\u9f50\uff1a\u4ece\u5bf9\u9f50\u8fb9\u754c\u504f\u79fb4\u5b57\u8282\uff081\u4e2a\u6d6e\u70b9\u6570\uff09\n float* raw = (float*)malloc((N + 1) * sizeof(float));\n float* unaligned = raw + 1; // \u4fdd\u8bc1\u672a\u5bf9\u9f50\n\n for (int i = 0; i < N; i++) {\n aligned[i] = 1.0f;\n unaligned[i] = 1.0f;\n }\n\n auto bench = [&](float* ptr, bool use_aligned, const char* name) {\n __m256 sum = _mm256_setzero_ps();\n // \u9884\u70ed\n for (int i = 0; i + 8 <= N; i += 8) {\n __m256 v = use_aligned ? _mm256_load_ps(ptr + i) : _mm256_loadu_ps(ptr + i);\n sum = _mm256_add_ps(sum, v);\n }\n\n auto start = std::chrono::high_resolution_clock::now();\n for (int t = 0; t < 100; t++) {\n sum = _mm256_setzero_ps();\n for (int i = 0; i + 8 <= N; i += 8) {\n __m256 v = use_aligned ? _mm256_load_ps(ptr + i) : _mm256_loadu_ps(ptr + i);\n sum = _mm256_add_ps(sum, v);\n }\n }\n auto end = std::chrono::high_resolution_clock::now();\n double ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n double bw = (double)N * sizeof(float) / ms / 1e6;\n std::cout << name << \": \" << ms << \" ms\uff08\" << bw << \" GB/s\uff09\\n\";\n };\n\n bench(aligned, true, \"\u5bf9\u9f50\u52a0\u8f7d \");\n bench(unaligned, false, \"\u975e\u5bf9\u9f50\u52a0\u8f7d\");\n\n free(aligned);\n free(raw);\n return 0;\n}\n GPU\u901a\u8fc7\u63d0\u4f9b\u6570\u5343\u4e2a\u6838\u5fc3\u7528\u4e8e\u5927\u89c4\u6a21\u5e76\u884c\u8ba1\u7b97\uff0c\u6539\u53d8\u4e86AI\u3002\u672c\u6587\u6db5\u76d6GPU\u4e0eCPU\u7684\u8bbe\u8ba1\u54f2\u5b66\u5bf9\u6bd4\u3001GPU\u5b58\u50a8\u5c42\u6b21\u3001C++\u4e2d\u7684CUDA\u7f16\u7a0b\u3001SIMT\u6267\u884c\u6a21\u578b\u3001\u5185\u5b58\u8bbf\u95ee\u6a21\u5f0f\u3001\u540c\u6b65\u3001\u6d41\u3001\u6027\u80fd\u5206\u6790\u4ee5\u53caNVIDIA GPU\u4ee3\u6b21\u2014\u2014\u7f16\u5199\u548c\u7406\u89e3GPU\u6838\u51fd\u6570\u6240\u9700\u7684\u77e5\u8bc6\u3002
\u6709\u5173\u5e26\u6709\u5b8c\u6574\u5de5\u4f5c\u793a\u4f8b\u7684\u5b9e\u8df5CUDA\u6559\u7a0b\uff0c\u8bf7\u53c2\u89c1\u914d\u5957\u4ed3\u5e93\uff1agithub.com/HenryNdubuaku/cuda-tutorials\u3002
\u73b0\u4ee3NVIDIA GPU\u6709\u8d85\u8fc710,000\u4e2aCUDA\u6838\u5fc3\u3002CPU\u67094-128\u4e2a\u6838\u5fc3\u3002\u8fd9100-1000\u500d\u7684\u6838\u5fc3\u4f18\u52bf\u662fGPU\u4e3b\u5bfcML\u7684\u539f\u56e0\uff1a\u8bad\u7ec3\u4e00\u4e2aTransformer\u9700\u8981\u6570\u4e07\u4ebf\u6b21\u4e58\u52a0\u64cd\u4f5c\uff0cGPU\u4ee5CPU\u65e0\u6cd5\u5339\u654c\u7684\u89c4\u6a21\u5e76\u884c\u5904\u7406\u5b83\u4eec\u3002
\u5373\u4f7f\u4f60\u4ece\u4e0d\u81ea\u5df1\u7f16\u5199CUDA\u6838\u51fd\u6570\uff0c\u7406\u89e3GPU\u67b6\u6784\u4e5f\u80fd\u89e3\u91ca\uff1a\u4e3a\u4ec0\u4e48\u6279\u6b21\u5927\u5c0f\u5f88\u91cd\u8981\uff08\u9700\u8981\u8db3\u591f\u7684\u5de5\u4f5c\u6765\u9971\u548cGPU\uff09\uff0c\u4e3a\u4ec0\u4e48\u5185\u5b58\u901a\u5e38\u662f\u74f6\u9888\uff08\u800c\u975e\u8ba1\u7b97\uff09\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u67d0\u4e9b\u64cd\u4f5c\uff08\u5206\u6563\u3001\u6761\u4ef6\u5206\u652f\uff09\u5728GPU\u4e0a\u5f88\u6162\u3002
CPU\u662f\u4e3a\u5ef6\u8fdf\u8bbe\u8ba1\u7684\uff1a\u6700\u5c0f\u5316\u5b8c\u6210\u4e00\u4e2a\u4efb\u52a1\u7684\u65f6\u95f4\u3002\u5b83\u5c06\u5176\u6676\u4f53\u7ba1\u9884\u7b97\u7684\u5927\u90e8\u5206\u7528\u4e8e\u7f13\u5b58\u3001\u5206\u652f\u9884\u6d4b\u5668\u548c\u4e71\u5e8f\u6267\u884c\u2014\u2014\u6240\u6709\u8ba9\u5355\u4e00\u7ebf\u7a0b\u5feb\u901f\u8fd0\u884c\u7684\u6280\u5de7\u3002
GPU\u662f\u4e3a\u541e\u5410\u91cf\u8bbe\u8ba1\u7684\uff1a\u6700\u5927\u5316\u6bcf\u79d2\u5b8c\u6210\u7684\u4efb\u52a1\u6570\u91cf\u3002\u5b83\u5c06\u5927\u90e8\u5206\u6676\u4f53\u7ba1\u7528\u4e8e\u6267\u884c\u5355\u5143\uff08ALU\uff09\u3002\u5355\u4e2a\u7ebf\u7a0b\u5f88\u6162\uff0c\u4f46\u6709\u6570\u5343\u4e2a\u3002
\u5bc4\u5b58\u5668\u662f\u6700\u5feb\u4f46\u6700\u6709\u9650\u7684\u3002\u6bcf\u4e2a\u7ebf\u7a0b\u6709\u4e00\u7ec4\u79c1\u6709\u5bc4\u5b58\u5668\uff08\u901a\u5e38\u6700\u591a255\u4e2a\uff09\u3002\u6bcf\u7ebf\u7a0b\u4f7f\u7528\u8fc7\u591a\u5bc4\u5b58\u5668\u4f1a\u964d\u4f4e\u5360\u7528\u7387\uff08\u53ef\u540c\u65f6\u8fd0\u884c\u7684\u7ebf\u7a0b\u66f4\u5c11\uff09\u3002
\u5171\u4eab\u5185\u5b58\u662f\u7531\u7a0b\u5e8f\u5458\u7ba1\u7406\u7684\u7f13\u5b58\uff0c\u7531\u5757\u4e2d\u7684\u6240\u6709\u7ebf\u7a0b\u5171\u4eab\u3002\u5b83\u662f\u7f16\u5199\u5feb\u901fCUDA\u6838\u51fd\u6570\u7684\u5173\u952e\uff1a\u5c06\u6570\u636e\u74e6\u7247\u4ece\u6162\u901f\u5168\u5c40\u5185\u5b58\u52a0\u8f7d\u5230\u5feb\u901f\u5171\u4eab\u5185\u5b58\uff0c\u7136\u540e\u8fdb\u884c\u8ba1\u7b97\u3002\u8fd9\u662f\u4e3b\u5bfcGPU\u7f16\u7a0b\u7684\u5206\u5757\u6a21\u5f0f\u3002
\u5168\u5c40\u5185\u5b58\uff08HBM\uff09\uff1a\u4e3bGPU\u5185\u5b58\uff08VRAM\uff09\u3002\u5927\u4f46\u6162\uff08400\u5468\u671f\u5ef6\u8fdf\uff09\u3002\u6240\u6709\u6570\u636e\u8d77\u59cb\u548c\u7ed3\u675f\u4e8e\u6b64\u3002\u6838\u51fd\u6570\u4f18\u5316\u7684\u76ee\u6807\u662f\u5c3d\u91cf\u51cf\u5c11\u5168\u5c40\u5185\u5b58\u8bbf\u95ee\u3002
\u7f51\u683c\uff08\u6574\u4e2a\u542f\u52a8\uff09\n\u251c\u2500\u2500 \u5757 (0,0)\n\u2502 \u251c\u2500\u2500 \u7ebf\u7a0b (0,0)\n\u2502 \u251c\u2500\u2500 \u7ebf\u7a0b (1,0)\n\u2502 \u251c\u2500\u2500 \u7ebf\u7a0b (2,0)\n\u2502 \u2514\u2500\u2500 ... \uff08\u6bcf\u5757\u6700\u591a1024\u7ebf\u7a0b\uff09\n\u251c\u2500\u2500 \u5757 (1,0)\n\u2502 \u251c\u2500\u2500 \u7ebf\u7a0b (0,0)\n\u2502 \u2514\u2500\u2500 ...\n\u2514\u2500\u2500 ... \uff08\u53ef\u80fd\u6709\u6570\u767e\u4e07\u4e2a\u5757\uff09\n threadIdx.x\uff09\u3002blockIdx.x\u3002\u5757\u5927\u5c0f\uff1ablockDim.x\uff08\u6700\u591a1024\u7ebf\u7a0b\uff09\u3002\u7f51\u683c\uff1a\u5355\u4e2a\u6838\u51fd\u6570\u542f\u52a8\u7684\u6240\u6709\u5757\u3002\u53ef\u4ee5\u662f1D\u30012D\u62163D\u3002
\u6bcf\u4e2a\u7ebf\u7a0b\u8ba1\u7b97\u5176\u5168\u5c40\u7d22\u5f15\uff1aint idx = blockIdx.x * blockDim.x + threadIdx.x;
// vector_add.cu \u2014 CUDA\u6e90\u6587\u4ef6\uff08.cu\u6269\u5c55\u540d\uff09\n\n#include <stdio.h>\n\n// __global__ \u6807\u8bb0\u6b64\u4e3aGPU\u6838\u51fd\u6570\uff08\u4eceCPU\u8c03\u7528\uff0c\u5728GPU\u4e0a\u8fd0\u884c\uff09\n__global__ void vector_add(const float* a, const float* b, float* c, int n) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n if (idx < n) { // \u8fb9\u754c\u68c0\u67e5\uff08\u7f51\u683c\u53ef\u80fd\u5927\u4e8e\u6570\u636e\uff09\n c[idx] = a[idx] + b[idx];\n }\n}\n\nint main() {\n int n = 1 << 20; // \u7ea6100\u4e07\u4e2a\u5143\u7d20\n size_t bytes = n * sizeof(float);\n\n // \u5206\u914d\u4e3b\u673a\uff08CPU\uff09\u5185\u5b58\n float *h_a = new float[n];\n float *h_b = new float[n];\n float *h_c = new float[n];\n\n // \u521d\u59cb\u5316\n for (int i = 0; i < n; i++) {\n h_a[i] = 1.0f;\n h_b[i] = 2.0f;\n }\n\n // \u5206\u914d\u8bbe\u5907\uff08GPU\uff09\u5185\u5b58\n float *d_a, *d_b, *d_c;\n cudaMalloc(&d_a, bytes);\n cudaMalloc(&d_b, bytes);\n cudaMalloc(&d_c, bytes);\n\n // \u5c06\u6570\u636e\u4eceCPU\u62f7\u8d1d\u5230GPU\n cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);\n cudaMemcpy(d_b, h_b, bytes, cudaMemcpyHostToDevice);\n\n // \u542f\u52a8\u6838\u51fd\u6570\uff1a\u6bcf\u5757256\u7ebf\u7a0b\uff0c\u8db3\u591f\u7684\u5757\u8986\u76d6n\u4e2a\u5143\u7d20\n int block_size = 256;\n int grid_size = (n + block_size - 1) / block_size; // \u4e0a\u53d6\u6574\u9664\u6cd5\n vector_add<<<grid_size, block_size>>>(d_a, d_b, d_c, n);\n\n // \u5c06\u7ed3\u679c\u4eceGPU\u62f7\u8d1d\u5230CPU\n cudaMemcpy(h_c, d_a, bytes, cudaMemcpyDeviceToHost);\n\n // \u9a8c\u8bc1\n printf(\"c[0] = %f\uff08\u671f\u671b\u503c 3.0\uff09\\n\", h_c[0]);\n\n // \u91ca\u653e\u5185\u5b58\n cudaFree(d_a); cudaFree(d_b); cudaFree(d_c);\n delete[] h_a; delete[] h_b; delete[] h_c;\n\n return 0;\n}\n # \u7528NVIDIA\u7f16\u8bd1\u5668\u7f16\u8bd1\nnvcc -O3 -o vector_add vector_add.cu\n./vector_add\n __global__\uff1aCUDA\u5173\u952e\u5b57\uff0c\u6807\u8bb0\u6838\u51fd\u6570\u3002\u4eceCPU\uff08\u4e3b\u673a\uff09\u8c03\u7528\uff0c\u5728GPU\uff08\u8bbe\u5907\uff09\u4e0a\u8fd0\u884c\u3002<<<grid_size, block_size>>>\uff1a\u6838\u51fd\u6570\u542f\u52a8\u8bed\u6cd5\u3002\u6307\u5b9a\u4f7f\u7528\u591a\u5c11\u5757\u548c\u7ebf\u7a0b\u3002cudaMalloc / cudaFree\uff1a\u5206\u914d/\u91ca\u653eGPU\u5185\u5b58\uff08\u7c7b\u4f3c\u4e8enew/delete\uff0c\u4f46\u9488\u5bf9GPU\uff09\u3002cudaMemcpy\uff1a\u5728CPU\u548cGPU\u4e4b\u95f4\u62f7\u8d1d\u6570\u636e\u3002\u8fd9\u901a\u5e38\u662f\u6700\u5927\u7684\u74f6\u9888\uff08PCIe\u5e26\u5bbd\u7ea632 GB/s\uff0c\u800cGPU\u5185\u5b58\u5e26\u5bbd\u7ea63 TB/s\uff09\u3002GPU\u4ee532\u4e2a\u4e3a\u4e00\u7ec4\u79f0\u4e3a\u7ebf\u7a0b\u675f\u7684\u7ec4\u6267\u884c\u7ebf\u7a0b\u3002\u4e00\u4e2a\u7ebf\u7a0b\u675f\u4e2d\u7684\u6240\u670932\u4e2a\u7ebf\u7a0b\u540c\u65f6\u6267\u884c\u76f8\u540c\u6307\u4ee4\uff08\u5355\u6307\u4ee4\u591a\u7ebf\u7a0b\u2014\u2014SIMT\uff09\u3002\u8fd9\u662fGPU\u7684SIMD\u7b49\u6548\uff0c\u4f46\u5728\u7ebf\u7a0b\u7ea7\u522b\u3002
\u7ebf\u7a0b\u675f\u5206\u6b67\u53d1\u751f\u5728\u540c\u4e00\u7ebf\u7a0b\u675f\u4e2d\u7684\u7ebf\u7a0b\u5728if\u8bed\u53e5\u4e2d\u8d70\u4e0d\u540c\u5206\u652f\u65f6\u3002GPU\u4e0d\u80fd\u5728\u4e00\u4e2a\u7ebf\u7a0b\u675f\u4e2d\u540c\u65f6\u6267\u884c\u4e24\u6761\u4e0d\u540c\u6307\u4ee4\uff0c\u56e0\u6b64\u5b83\u987a\u5e8f\u6267\u884c\u4e24\u4e2a\u5206\u652f\uff0c\u5c4f\u853d\u6389\u4e0d\u5e94\u53c2\u4e0e\u7684\u7ebf\u7a0b\u3002\u8fd9\u4f7f\u6027\u80fd\u51cf\u534a\uff08\u6216\u66f4\u5dee\uff09\u3002
// \u7cdf\u7cd5\uff1a\u7ebf\u7a0b\u675f\u5206\u6b67\uff08\u540c\u4e00\u7ebf\u7a0b\u675f\u4e2d\u7684\u7ebf\u7a0b\u8d70\u4e0d\u540c\u8def\u5f84\uff09\nif (threadIdx.x % 2 == 0) {\n c[idx] = a[idx] + b[idx]; // \u5076\u6570\u7ebf\u7a0b\u505a\u8fd9\u4e2a\n} else {\n c[idx] = a[idx] - b[idx]; // \u5947\u6570\u7ebf\u7a0b\u505a\u8fd9\u4e2a\uff08\u540c\u4e00\u7ebf\u7a0b\u675f\uff0c\u4e32\u884c\u5316\uff09\n}\n\n// \u66f4\u597d\uff1a\u65e0\u5206\u652f\uff08\u65e0\u5206\u6b67\uff09\nfloat sign = (threadIdx.x % 2 == 0) ? 1.0f : -1.0f;\nc[idx] = a[idx] + sign * b[idx]; // \u6240\u6709\u7ebf\u7a0b\u6267\u884c\u76f8\u540c\u6307\u4ee4\n"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/04.%20GPU%20architecture%20and%20CUDA/#_2","title":"\u5185\u5b58\u5408\u5e76","text":"// \u597d\uff1a\u5408\u5e76\u2014\u2014\u7ebf\u7a0b0\u8bfba[0]\uff0c\u7ebf\u7a0b1\u8bfba[1]\uff0c...\nc[idx] = a[idx] + b[idx];\n\n// \u574f\uff1a\u8de8\u6b65\u2014\u2014\u7ebf\u7a0b0\u8bfba[0]\uff0c\u7ebf\u7a0b1\u8bfba[\u6b65\u957f]\uff0c...\nc[idx] = a[idx * stride] + b[idx * stride]; // \u6b65\u957f > 1 \u6d6a\u8d39\u5e26\u5bbd\n // \u4f7f\u7528\u5171\u4eab\u5185\u5b58\u5206\u5757\u7684\u77e9\u9635\u4e58\u6cd5\uff08\u7b80\u5316\u7248\uff09\n__global__ void matmul_tiled(const float* A, const float* B, float* C,\n int M, int N, int K) {\n // A\u7684\u4e00\u4e2a\u74e6\u7247\u548cB\u7684\u4e00\u4e2a\u74e6\u7247\u7684\u5171\u4eab\u5185\u5b58\n __shared__ float tile_A[TILE_SIZE][TILE_SIZE];\n __shared__ float tile_B[TILE_SIZE][TILE_SIZE];\n\n int row = blockIdx.y * TILE_SIZE + threadIdx.y;\n int col = blockIdx.x * TILE_SIZE + threadIdx.x;\n float sum = 0.0f;\n\n // \u904d\u5386\u74e6\u7247\n for (int t = 0; t < (K + TILE_SIZE - 1) / TILE_SIZE; t++) {\n // \u5c06A\u548cB\u7684\u4e00\u4e2a\u74e6\u7247\u52a0\u8f7d\u5230\u5171\u4eab\u5185\u5b58\n if (row < M && t * TILE_SIZE + threadIdx.x < K)\n tile_A[threadIdx.y][threadIdx.x] = A[row * K + t * TILE_SIZE + threadIdx.x];\n else\n tile_A[threadIdx.y][threadIdx.x] = 0.0f;\n\n if (col < N && t * TILE_SIZE + threadIdx.y < K)\n tile_B[threadIdx.y][threadIdx.x] = B[(t * TILE_SIZE + threadIdx.y) * N + col];\n else\n tile_B[threadIdx.y][threadIdx.x] = 0.0f;\n\n __syncthreads(); // \u7b49\u5f85\u6240\u6709\u7ebf\u7a0b\u5b8c\u6210\u52a0\u8f7d\n\n // \u8ba1\u7b97\u6b64\u74e6\u7247\u7684\u90e8\u5206\u70b9\u79ef\n for (int k = 0; k < TILE_SIZE; k++) {\n sum += tile_A[threadIdx.y][k] * tile_B[k][threadIdx.x];\n }\n\n __syncthreads(); // \u5728\u52a0\u8f7d\u4e0b\u4e00\u4e2a\u74e6\u7247\u524d\u7b49\u5f85\n }\n\n if (row < M && col < N)\n C[row * N + col] = sum;\n}\n __shared__\uff1a\u58f0\u660e\u5757\u5185\u6240\u6709\u7ebf\u7a0b\u5171\u4eab\u7684\u5185\u5b58\uff08\u5feb\u901f\u3001\u7247\u4e0a\uff09\u3002__syncthreads()\uff1a\u4e00\u4e2a\u5c4f\u969c\uff0c\u7b49\u5f85\u5757\u4e2d\u6240\u6709\u7ebf\u7a0b\u5230\u8fbe\u6b64\u70b9\u3002\u5728\u5199\u5165\u5171\u4eab\u5185\u5b58\u548c\u8bfb\u53d6\u5b83\u4e4b\u95f4\u5fc5\u987b\u4f7f\u7528\uff08\u5426\u5219\u67d0\u4e9b\u7ebf\u7a0b\u8bfb\u53d6\u5230\u8fc7\u671f\u6570\u636e\uff09\u3002cudaStream_t stream1, stream2;\ncudaStreamCreate(&stream1);\ncudaStreamCreate(&stream2);\n\n// \u8fd9\u4e9b\u64cd\u4f5c\u53ef\u4ee5\u91cd\u53e0\uff1a\u4e0d\u540c\u6d41\u5e76\u53d1\u6267\u884c\ncudaMemcpyAsync(d_a, h_a, bytes, cudaMemcpyHostToDevice, stream1);\ncudaMemcpyAsync(d_b, h_b, bytes, cudaMemcpyHostToDevice, stream2);\n\nkernel1<<<grid, block, 0, stream1>>>(d_a, d_c);\nkernel2<<<grid, block, 0, stream2>>>(d_b, d_d);\n # NVIDIA Nsight Compute\uff1a\u6838\u51fd\u6570\u7ea7\u5206\u6790\nncu --set full ./my_program\n\n# NVIDIA Nsight Systems\uff1a\u7cfb\u7edf\u7ea7\u65f6\u95f4\u7ebf\nnsys profile ./my_program\n\n# \u5feb\u901f\u6307\u6807\nncu --metrics sm__throughput,dram__throughput ./my_program\n [{x,y,z}, {x,y,z}, {x,y,z}]\u3002{[x,x,x], [y,y,y], [z,z,z]}\u3002// AoS\uff1a\u5bf9\u4e8eSIMD/GPU\u4e0d\u597d\uff08\u8bbf\u95ee\u6240\u6709x\u503c\u89e6\u53ca\u975e\u8fde\u7eed\u5185\u5b58\uff09\nstruct Particle { float x, y, z, mass; };\nParticle particles[N];\n// particles[0].x, particles[1].x \u76f8\u969416\u5b57\u8282\n\n// SoA\uff1a\u5bf9\u4e8eSIMD/GPU\u597d\uff08\u6240\u6709x\u503c\u8fde\u7eed\uff09\nstruct Particles {\n float x[N], y[N], z[N], mass[N];\n};\n// x[0], x[1] \u76f8\u96944\u5b57\u8282\u2014\u2014\u975e\u5e38\u9002\u5408\u5408\u5e76\u8bbf\u95ee\u548cSIMD\n #include <xmmintrin.h> // for _mm_prefetch\n\nfor (int i = 0; i < n; i += 4) {\n _mm_prefetch((char*)(a + i + 64), _MM_HINT_T0); // \u9884\u53d6\u4e4b\u524d64\u4e2a\u5143\u7d20\n // \u7528SIMD\u5904\u7406 a[i:i+4]\n __m128 va = _mm_load_ps(a + i);\n // ...\n}\n // \u672a\u878d\u5408\uff1a3\u6b21\u6838\u51fd\u6570\u542f\u52a8\uff0c3\u6b21\u5168\u5c40\u5185\u5b58\u5f80\u8fd4\ny = matmul(x, W) // \u5199y\u5230\u5168\u5c40\u5185\u5b58\nz = y + bias // \u8bfby\uff0c\u5199z\nout = relu(z) // \u8bfbz\uff0c\u5199out\n\n// \u878d\u5408\uff1a1\u6b21\u6838\u51fd\u6570\u542f\u52a8\uff0c1\u6b21\u5168\u5c40\u5185\u5b58\u5199\u5165\nout = fused_matmul_bias_relu(x, W, bias) // y\u548cz\u6c38\u4e0d\u79bb\u5f00SRAM\n torch.compile\u548cTriton\u53ef\u4ee5\u81ea\u52a8\u6216\u901a\u8fc7\u6700\u5c11\u52aa\u529b\u5b9e\u73b0\u878d\u5408\u3002// \u5f20\u91cf\u6838\u5fc3\uff1a\u4e58FP16\u77e9\u9635\uff0c\u5728FP32\u4e2d\u7d2f\u52a0\n// \u6bcf\u6761\u5f20\u91cf\u6838\u5fc3\u6307\u4ee4\uff1aD\uff08FP32\uff09= A\uff08FP16\uff09\u00d7 B\uff08FP16\uff09+ C\uff08FP32\uff09\nnvcuda::wmma::mma_sync(c_frag, a_frag, b_frag, c_frag);\n cudaMalloc \u5f88\u6162\uff08\u6bcf\u6b21\u8c03\u7528\u7ea61\u6beb\u79d2\uff09\uff0c\u56e0\u4e3a\u5b83\u4e0eGPU\u540c\u6b65\u3002\u5728\u6bcf\u6b21\u8fed\u4ee3\u5206\u914d\u4e34\u65f6\u7f13\u51b2\u533a\u7684\u8bad\u7ec3\u5faa\u73af\u4e2d\uff0c\u8fd9\u4f1a\u7d2f\u79ef\u8d77\u6765\u3002
\u5185\u5b58\u6c60\uff08PyTorch\u7684\u7f13\u5b58\u5206\u914d\u5668\u3001CUDA\u5185\u5b58\u6c60\uff09\u9884\u5148\u5206\u914d\u4e00\u5927\u5757GPU\u5185\u5b58\uff0c\u5e76\u4ece\u5176\u4e2d\u5b50\u5206\u914d\u800c\u65e0\u9700\u7cfb\u7edf\u8c03\u7528\uff1a
# PyTorch\u81ea\u52a8\u6267\u884c\u6b64\u64cd\u4f5c\u2014\u2014\u4f46\u7406\u89e3\u539f\u56e0\u5f88\u91cd\u8981\n# \u6bcf\u4e2a torch.empty() \u4ece\u6c60\u4e2d\u91cd\u7528\u5185\u5b58\uff0c\u65e0\u9700cudaMalloc\ntemp = torch.empty(1024, 1024, device='cuda') # \u5fae\u79d2\uff0c\u800c\u975e\u6beb\u79d2\n torch.cuda.memory_allocated() \u548c torch.cuda.max_memory_allocated() \u4e0d\u540c\uff1aallocated\u662f\u5f53\u524d\u4f7f\u7528\u7684\uff0cmax\u662f\u5cf0\u503c\uff08\u6c60\u53ef\u80fd\u6301\u6709\u6bd4\u5f53\u524d\u4f7f\u7528\u66f4\u591a\u7684\u5185\u5b58\uff09\u3002\u4e0d\u8981\u76f2\u76ee\u4f18\u5316\u3002\u5148\u5206\u6790\uff0c\u8bc6\u522b\u74f6\u9888\uff0c\u4f18\u5316\u90a3\u4e2a\uff0c\u7136\u540e\u91cd\u65b0\u5206\u6790\u3002\u5c4b\u9876\u7ebf\u6a21\u578b\uff08\u6587\u4ef601\uff09\u544a\u8bc9\u4f60\u74f6\u9888\u662f\u5185\u5b58\u8fd8\u662f\u8ba1\u7b97\uff1a
\u5927\u591a\u6570ML\u5de5\u4f5c\u8d1f\u8f7d\u662f\u5185\u5b58\u53d7\u9650\u7684\u3002\u4ee4\u4eba\u60ca\u8bb6\u7684\u63a8\u8bba\uff1a\u66f4\u5feb\u7684GPU\uff08\u66f4\u591aFLOPS\uff09\u901a\u5e38\u6ca1\u6709\u5e2e\u52a9\u3002\u66f4\u5feb\u7684\u5185\u5b58\uff08HBM3 vs HBM2e\uff09\u66f4\u6709\u5e2e\u52a9\u3002\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48A100\u2192H100\u5347\u7ea7\u4e0d\u53ea\u662f\u5173\u4e8eFLOPS\u2014\u2014H100\u4e5f\u67092\u500d\u7684\u5185\u5b58\u5e26\u5bbd\u3002
\u5f20\u91cf\u6838\u5fc3\u662f\u4e13\u7528\u7684\u77e9\u9635\u4e58\u6cd5\u5355\u5143\u3002\u5355\u4e2a\u5f20\u91cf\u6838\u5fc3\u6307\u4ee4\u5728\u4e00\u4e2a\u5468\u671f\u5185\u8ba1\u7b974\u00d74\u77e9\u9635\u4e58\u6cd5\uff08D = A\u00d7B + C\uff09\u3002\u5e38\u89c4CUDA\u6838\u5fc3\u9700\u898164\u6b21FMA\u64cd\u4f5c\u3002\u5f20\u91cf\u6838\u5fc3\u5c31\u662f\u4e3a\u4ec0\u4e48\u6df7\u5408\u7cbe\u5ea6\u8bad\u7ec3\uff08float16\u8ba1\u7b97\uff0cfloat32\u7d2f\u52a0\uff09\u5982\u6b64\u5feb\u901f\u3002
Transformer\u5f15\u64ce\uff08Hopper+\uff09\u5728\u5355\u5c42\u5185\u52a8\u6001\u5207\u6362FP8\u548cFP16\u7cbe\u5ea6\uff0c\u53ea\u5728\u9700\u8981\u65f6\u9009\u62e9\u66f4\u9ad8\u7cbe\u5ea6\u3002\u8fd9\u6700\u5927\u5316\u541e\u5410\u91cf\u800c\u4e0d\u727a\u7272\u6a21\u578b\u8d28\u91cf\u3002\u5b83\u4e13\u4e3aTransformer\u67b6\u6784\uff08\u6ce8\u610f\u529b+MLP\uff09\u8bbe\u8ba1\uff0c\u540e\u8005\u4e3b\u5bfc\u73b0\u4ee3AI\u3002
\u7f16\u5199\u4e00\u4e2a\u5bf9\u6570\u7ec4\u5e94\u7528ReLU\u7684CUDA\u6838\u51fd\u6570\u3002\u6d4b\u91cf\u5305\u62ec\u5185\u5b58\u4f20\u8f93\u5728\u5185\u7684\u65f6\u95f4\u3002\u8fd9\u6559\u6388\u6838\u51fd\u6570\u7f16\u5199\u3001cudaMalloc/cudaMemcpy\u4ee5\u53ca\u4e3b\u673a\u2194\u8bbe\u5907\u4f20\u8f93\u74f6\u9888\u3002
// task1_relu.cu\n// \u7f16\u8bd1\uff1anvcc -O3 -o task1_relu task1_relu.cu\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <cuda_runtime.h>\n\n__global__ void relu_kernel(const float* input, float* output, int n) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n if (idx < n) {\n output[idx] = input[idx] > 0.0f ? input[idx] : 0.0f;\n }\n}\n\nint main() {\n const int N = 1 << 24; // \u7ea61600\u4e07\u5143\u7d20\n size_t bytes = N * sizeof(float);\n\n // \u5206\u914d\u4e3b\u673a\u5185\u5b58\n float* h_input = (float*)malloc(bytes);\n float* h_output = (float*)malloc(bytes);\n for (int i = 0; i < N; i++) {\n h_input[i] = (float)(i % 100) - 50.0f; // \u6b63\u8d1f\u6df7\u5408\n }\n\n // \u5206\u914d\u8bbe\u5907\u5185\u5b58\n float *d_input, *d_output;\n cudaMalloc(&d_input, bytes);\n cudaMalloc(&d_output, bytes);\n\n // \u8ba1\u65f6\u5b8c\u6574\u6d41\u6c34\u7ebf\uff1a\u62f7\u8d1d\u5230GPU\u3001\u8ba1\u7b97\u3001\u62f7\u8d1d\u56de\n cudaEvent_t start, stop;\n cudaEventCreate(&start);\n cudaEventCreate(&stop);\n\n cudaEventRecord(start);\n cudaMemcpy(d_input, h_input, bytes, cudaMemcpyHostToDevice);\n\n int block_size = 256;\n int grid_size = (N + block_size - 1) / block_size;\n relu_kernel<<<grid_size, block_size>>>(d_input, d_output, N);\n\n cudaMemcpy(h_output, d_output, bytes, cudaMemcpyDeviceToHost);\n cudaEventRecord(stop);\n cudaEventSynchronize(stop);\n\n float ms = 0;\n cudaEventElapsedTime(&ms, start, stop);\n\n // \u9a8c\u8bc1\n int errors = 0;\n for (int i = 0; i < N; i++) {\n float expected = h_input[i] > 0.0f ? h_input[i] : 0.0f;\n if (h_output[i] != expected) errors++;\n }\n\n printf(\"\u65f6\u95f4\uff08\u542b\u4f20\u8f93\uff09: %.2f ms\\n\", ms);\n printf(\"\u5e26\u5bbd: %.1f GB/s\\n\", 2.0 * bytes / ms / 1e6); // \u8bfb\u53d6+\u5199\u5165\n printf(\"\u9519\u8bef: %d / %d\\n\", errors, N);\n\n cudaFree(d_input); cudaFree(d_output);\n free(h_input); free(h_output);\n return 0;\n}\n \u5728CUDA\u4e2d\u4f7f\u7528\u5171\u4eab\u5185\u5b58\u7f16\u5199\u5206\u5757\u77e9\u9635\u4e58\u6cd5\u3002\u5c06\u6027\u80fd\u4e0e\u6734\u7d20\uff08\u975e\u5206\u5757\uff09\u7248\u672c\u8fdb\u884c\u6bd4\u8f83\u3002\u8fd9\u6559\u6388\u5171\u4eab\u5185\u5b58\u3001__syncthreads\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u5206\u5757\u91cd\u8981\u3002
// task2_matmul.cu\n// \u7f16\u8bd1\uff1anvcc -O3 -o task2_matmul task2_matmul.cu\n\n#include <stdio.h>\n#include <cuda_runtime.h>\n\n#define TILE 16\n\n// \u6734\u7d20\u77e9\u9635\u4e58\u6cd5\uff1a\u6bcf\u4e2a\u7ebf\u7a0b\u8ba1\u7b97C\u7684\u4e00\u4e2a\u5143\u7d20\n__global__ void matmul_naive(const float* A, const float* B, float* C, int N) {\n int row = blockIdx.y * blockDim.y + threadIdx.y;\n int col = blockIdx.x * blockDim.x + threadIdx.x;\n if (row < N && col < N) {\n float sum = 0.0f;\n for (int k = 0; k < N; k++) {\n sum += A[row * N + k] * B[k * N + col];\n }\n C[row * N + col] = sum;\n }\n}\n\n// \u5206\u5757\u77e9\u9635\u4e58\u6cd5\uff1a\u4f7f\u7528\u5171\u4eab\u5185\u5b58\u51cf\u5c11\u5168\u5c40\u5185\u5b58\u8bbf\u95ee\n__global__ void matmul_tiled(const float* A, const float* B, float* C, int N) {\n __shared__ float sA[TILE][TILE];\n __shared__ float sB[TILE][TILE];\n\n int row = blockIdx.y * TILE + threadIdx.y;\n int col = blockIdx.x * TILE + threadIdx.x;\n float sum = 0.0f;\n\n for (int t = 0; t < (N + TILE - 1) / TILE; t++) {\n sA[threadIdx.y][threadIdx.x] = (row < N && t*TILE+threadIdx.x < N)\n ? A[row * N + t*TILE + threadIdx.x] : 0.0f;\n sB[threadIdx.y][threadIdx.x] = (t*TILE+threadIdx.y < N && col < N)\n ? B[(t*TILE + threadIdx.y) * N + col] : 0.0f;\n\n __syncthreads();\n for (int k = 0; k < TILE; k++)\n sum += sA[threadIdx.y][k] * sB[k][threadIdx.x];\n __syncthreads();\n }\n\n if (row < N && col < N)\n C[row * N + col] = sum;\n}\n\nint main() {\n const int N = 1024;\n size_t bytes = N * N * sizeof(float);\n\n float *d_A, *d_B, *d_C;\n cudaMalloc(&d_A, bytes); cudaMalloc(&d_B, bytes); cudaMalloc(&d_C, bytes);\n\n // \u521d\u59cb\u5316\u4e3a1\uff08\u5bb9\u6613\u9a8c\u8bc1\uff1aC\u5e94\u5168\u4e3aN\uff09\n float* h_A = new float[N*N];\n for (int i = 0; i < N*N; i++) h_A[i] = 1.0f;\n cudaMemcpy(d_A, h_A, bytes, cudaMemcpyHostToDevice);\n cudaMemcpy(d_B, h_A, bytes, cudaMemcpyHostToDevice);\n\n dim3 block(TILE, TILE);\n dim3 grid((N+TILE-1)/TILE, (N+TILE-1)/TILE);\n\n // \u57fa\u51c6\u6d4b\u8bd5\u6734\u7d20\u7248\n cudaEvent_t start, stop;\n cudaEventCreate(&start); cudaEventCreate(&stop);\n\n cudaEventRecord(start);\n for (int i = 0; i < 10; i++)\n matmul_naive<<<grid, block>>>(d_A, d_B, d_C, N);\n cudaEventRecord(stop);\n cudaEventSynchronize(stop);\n float naive_ms; cudaEventElapsedTime(&naive_ms, start, stop);\n\n // \u57fa\u51c6\u6d4b\u8bd5\u5206\u5757\u7248\n cudaEventRecord(start);\n for (int i = 0; i < 10; i++)\n matmul_tiled<<<grid, block>>>(d_A, d_B, d_C, N);\n cudaEventRecord(stop);\n cudaEventSynchronize(stop);\n float tiled_ms; cudaEventElapsedTime(&tiled_ms, start, stop);\n\n double gflops_naive = 2.0 * N * N * N * 10 / naive_ms / 1e6;\n double gflops_tiled = 2.0 * N * N * N * 10 / tiled_ms / 1e6;\n\n printf(\"\u6734\u7d20\u7248: %.2f ms, %.1f GFLOPS\\n\", naive_ms/10, gflops_naive);\n printf(\"\u5206\u5757\u7248: %.2f ms, %.1f GFLOPS\\n\", tiled_ms/10, gflops_tiled);\n printf(\"\u52a0\u901f\u6bd4: %.1fx\\n\", naive_ms / tiled_ms);\n\n cudaFree(d_A); cudaFree(d_B); cudaFree(d_C);\n delete[] h_A;\n return 0;\n}\n \u6f14\u793a\u7ebf\u7a0b\u675f\u5206\u6b67\u3002\u7f16\u5199\u4e00\u4e2a\u6838\u51fd\u6570\uff0c\u5176\u4e2d\u540c\u4e00\u7ebf\u7a0b\u675f\u4e2d\u7684\u7ebf\u7a0b\u8d70\u4e0d\u540c\u5206\u652f\uff0c\u5e76\u4e0e\u65e0\u5206\u652f\u7248\u672c\u6bd4\u8f83\u3002
// task3_divergence.cu\n// \u7f16\u8bd1\uff1anvcc -O3 -o task3_diverge task3_divergence.cu\n\n#include <stdio.h>\n#include <cuda_runtime.h>\n\n// \u7cdf\u7cd5\uff1a\u7ebf\u7a0b\u675f\u5206\u6b67\u2014\u2014\u5076\u6570/\u5947\u6570\u7ebf\u7a0b\u8d70\u4e0d\u540c\u8def\u5f84\n__global__ void divergent_kernel(float* data, int n) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n if (idx < n) {\n if (idx % 2 == 0) {\n data[idx] = data[idx] * 2.0f + 1.0f;\n } else {\n data[idx] = data[idx] * 0.5f - 1.0f;\n }\n }\n}\n\n// \u597d\uff1a\u65e0\u5206\u652f\u2014\u2014\u6240\u6709\u7ebf\u7a0b\u6267\u884c\u76f8\u540c\u6307\u4ee4\n__global__ void branchless_kernel(float* data, int n) {\n int idx = blockIdx.x * blockDim.x + threadIdx.x;\n if (idx < n) {\n float scale = (idx % 2 == 0) ? 2.0f : 0.5f;\n float offset = (idx % 2 == 0) ? 1.0f : -1.0f;\n data[idx] = data[idx] * scale + offset;\n }\n}\n\nint main() {\n const int N = 1 << 24;\n float* d_data;\n cudaMalloc(&d_data, N * sizeof(float));\n cudaMemset(d_data, 0, N * sizeof(float));\n\n int block = 256, grid = (N + block - 1) / block;\n\n cudaEvent_t start, stop;\n cudaEventCreate(&start); cudaEventCreate(&stop);\n\n // \u5206\u6b67\u7248\n cudaEventRecord(start);\n for (int i = 0; i < 100; i++)\n divergent_kernel<<<grid, block>>>(d_data, N);\n cudaEventRecord(stop);\n cudaEventSynchronize(stop);\n float div_ms; cudaEventElapsedTime(&div_ms, start, stop);\n\n // \u65e0\u5206\u652f\u7248\n cudaEventRecord(start);\n for (int i = 0; i < 100; i++)\n branchless_kernel<<<grid, block>>>(d_data, N);\n cudaEventRecord(stop);\n cudaEventSynchronize(stop);\n float nodiv_ms; cudaEventElapsedTime(&nodiv_ms, start, stop);\n\n printf(\"\u5206\u6b67\u7248: %.2f ms\\n\", div_ms / 100);\n printf(\"\u65e0\u5206\u652f\u7248: %.2f ms\\n\", nodiv_ms / 100);\n printf(\"\u52a0\u901f\u6bd4: %.2fx\\n\", div_ms / nodiv_ms);\n\n cudaFree(d_data);\n return 0;\n}\n CUDA C\u529f\u80fd\u5f3a\u5927\u4f46\u5197\u957f\u3002Triton\u8ba9\u4f60\u7528Python\u7f16\u5199GPU\u6838\u51fd\u6570\u3002TPU\u63d0\u4f9b\u4e86GPU\u4e4b\u5916\u7684\u9009\u62e9\uff0c\u5177\u6709\u4e0d\u540c\u7684\u6743\u8861\u3002\u672c\u6587\u6db5\u76d6Triton\u6838\u51fd\u6570\u7f16\u7a0b\u3001\u4ee5Flash Attention\u4e3a\u6848\u4f8b\u7814\u7a76\u3001TPU\u67b6\u6784\u4e0eJAX/Pallas\uff0c\u4ee5\u53ca\u5982\u4f55\u9009\u62e9\u5408\u9002\u7684\u5de5\u5177\u3002\u5173\u4e8eVulkan\u548c\u8de8\u5e73\u53f0GPU\u8ba1\u7b97\uff0c\u8bf7\u53c2\u89c1\u6587\u4ef607\u3002
Triton\uff08OpenAI\uff09\u662f\u4e00\u79cd\u57fa\u4e8ePython\u7684GPU\u6838\u51fd\u6570\u7f16\u5199\u8bed\u8a00\u3002\u4f60\u4e0d\u9700\u8981\u601d\u8003\u5355\u4e2a\u7ebf\u7a0b\uff08CUDA\uff09\uff0c\u800c\u662f\u601d\u8003\u5757\u7ea7\u6570\u636e\u3002Triton\u7684\u7f16\u8bd1\u5668\u81ea\u52a8\u5904\u7406\u7ebf\u7a0b\u6620\u5c04\u3001\u5185\u5b58\u5408\u5e76\u3001\u5171\u4eab\u5185\u5b58\u7ba1\u7406\u548c\u8bb8\u591a\u4f18\u5316\u3002
\u4e3a\u4ec0\u4e48Triton\u91cd\u8981\uff1aCUDA C\u9700\u8981\u5bf9\u7ebf\u7a0b\u675f\u8c03\u5ea6\u3001\u5171\u4eab\u5185\u5b58\u5b58\u50a8\u4f53\u51b2\u7a81\u3001\u5bc4\u5b58\u5668\u538b\u529b\u548c\u5408\u5e76\u6a21\u5f0f\u6709\u6df1\u5165\u7406\u89e3\u3002Triton\u62bd\u8c61\u4e86\u5176\u4e2d\u5927\u90e8\u5206\u5185\u5bb9\uff0c\u4f7fGPU\u6838\u51fd\u6570\u5f00\u53d1\u5bf9\u4e86\u89e3Python\u4f46\u4e0d\u4e86\u89e3\u7cfb\u7edf\u7f16\u7a0b\u7684ML\u7814\u7a76\u4eba\u5458\u53ef\u53ca\u3002
import triton\nimport triton.language as tl\nimport torch\n\n@triton.jit\ndef add_kernel(\n x_ptr, y_ptr, output_ptr,\n n_elements,\n BLOCK_SIZE: tl.constexpr, # \u7f16\u8bd1\u65f6\u5e38\u91cf\n):\n # \u6bcf\u4e2a\u7a0b\u5e8f\u5b9e\u4f8b\u5904\u7406\u4e00\u4e2aBLOCK_SIZE\u5143\u7d20\u7684\u5757\n pid = tl.program_id(axis=0) # \u6211\u662f\u54ea\u4e2a\u5757\uff1f\n block_start = pid * BLOCK_SIZE\n\n # \u6b64\u5757\u7684\u504f\u79fb\u91cf\n offsets = block_start + tl.arange(0, BLOCK_SIZE)\n\n # \u63a9\u7801\u5904\u7406n_elements\u4e0d\u662fBLOCK_SIZE\u500d\u6570\u7684\u60c5\u51b5\n mask = offsets < n_elements\n\n # \u52a0\u8f7d\u6570\u636e\uff08\u5e26\u63a9\u7801\uff1a\u8d8a\u754c\u8bfb\u53d6\u8fd4\u56de0\uff09\n x = tl.load(x_ptr + offsets, mask=mask)\n y = tl.load(y_ptr + offsets, mask=mask)\n\n # \u8ba1\u7b97\n output = x + y\n\n # \u5b58\u50a8\u7ed3\u679c\n tl.store(output_ptr + offsets, output, mask=mask)\n\n\ndef add(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor:\n output = torch.empty_like(x)\n n_elements = output.numel()\n\n # \u542f\u52a8\uff1a\u6bcf\u4e2a\u5757\u4e00\u4e2a\u7a0b\u5e8f\n grid = lambda meta: (triton.cdiv(n_elements, meta['BLOCK_SIZE']),)\n add_kernel[grid](x, y, output, n_elements, BLOCK_SIZE=1024)\n\n return output\n\n\n# \u4f7f\u7528\nx = torch.randn(1000000, device='cuda')\ny = torch.randn(1000000, device='cuda')\nz = add(x, y)\n tl.arange(0, BLOCK_SIZE) \u4e3a\u6574\u4e2a\u5757\u521b\u5efa\u4e00\u4e2a\u504f\u79fb\u5411\u91cf\u3002\u6b64\u5411\u91cf\u4e0a\u7684\u6240\u6709\u64cd\u4f5c\u90fd\u9690\u5f0f\u5411\u91cf\u5316\u3002mask \u5904\u7406\u8fb9\u754c\u6761\u4ef6\uff08\u7c7b\u4f3c\u4e8eAVX-512\u63a9\u7801\u5bc4\u5b58\u5668\uff0c\u6587\u4ef603\uff09\u3002\u65e0\u9700\u6807\u91cf\u6e05\u7406\u5faa\u73af\u3002tl.load \u548c tl.store \u81ea\u52a8\u5904\u7406\u5408\u5e76\u8bbf\u95ee\u3002@triton.jit \u5728\u9996\u6b21\u8c03\u7528\u65f6\u5c06\u51fd\u6570\u7f16\u8bd1\u4e3aPTX\uff08GPU\u6c47\u7f16\uff09\uff0c\u7136\u540e\u7f13\u5b58\u7f16\u8bd1\u540e\u7684\u6838\u51fd\u6570\u3002@triton.jit\ndef softmax_kernel(\n output_ptr, input_ptr, input_row_stride, output_row_stride, n_cols,\n BLOCK_SIZE: tl.constexpr,\n):\n # \u6bcf\u4e2a\u7a0b\u5e8f\u5904\u7406\u4e00\u884c\n row_idx = tl.program_id(0)\n row_start = input_ptr + row_idx * input_row_stride\n\n # \u52a0\u8f7d\u8be5\u884c\n col_offsets = tl.arange(0, BLOCK_SIZE)\n mask = col_offsets < n_cols\n row = tl.load(row_start + col_offsets, mask=mask, other=-float('inf'))\n\n # Softmax\uff1a\u4e3a\u6570\u503c\u7a33\u5b9a\u6027\u53d6\u6700\u5927\u503c\uff0c\u7136\u540eexp\uff0c\u7136\u540e\u5f52\u4e00\u5316\n row_max = tl.max(row, axis=0)\n numerator = tl.exp(row - row_max)\n denominator = tl.sum(numerator, axis=0)\n softmax_output = numerator / denominator\n\n # \u5b58\u50a8\u7ed3\u679c\n output_start = output_ptr + row_idx * output_row_stride\n tl.store(output_start + col_offsets, softmax_output, mask=mask)\n F.softmax(x, dim=-1) \u542f\u52a83\u4e2a\u72ec\u7acb\u6838\u51fd\u6570\uff08\u6700\u5927\u503c\u3001\u6307\u6570-\u6c42\u548c\u3001\u9664\u6cd5\uff09\uff0c\u6bcf\u4e2a\u90fd\u4ece\u5168\u5c40\u5185\u5b58\u8bfb\u53d6\u548c\u5199\u5165\u3002Triton\u7248\u672c\u5728\u4e00\u4e2a\u6838\u51fd\u6570\u5185\u5b8c\u6210\u6240\u6709\u64cd\u4f5c\uff0c\u5c06\u6570\u636e\u4fdd\u7559\u5728\u5bc4\u5b58\u5668/SRAM\u4e2d\u3002\u8fd9\u79cd\u6838\u51fd\u6570\u878d\u5408\u5c31\u662f\u81ea\u5b9a\u4e49Triton\u6838\u51fd\u6570\u53ef\u4ee5\u6bd4PyTorch\u5185\u7f6e\u64cd\u4f5c\u5feb2-4\u500d\u7684\u539f\u56e0\u3002@triton.autotune(\n configs=[\n triton.Config({'BLOCK_SIZE_M': 128, 'BLOCK_SIZE_N': 128, 'BLOCK_SIZE_K': 32}),\n triton.Config({'BLOCK_SIZE_M': 64, 'BLOCK_SIZE_N': 256, 'BLOCK_SIZE_K': 32}),\n triton.Config({'BLOCK_SIZE_M': 256, 'BLOCK_SIZE_N': 64, 'BLOCK_SIZE_K': 64}),\n ],\n key=['M', 'N', 'K'], # \u5f53\u8fd9\u4e9b\u53d8\u5316\u65f6\u91cd\u65b0\u8c03\u4f18\n)\n@triton.jit\ndef matmul_kernel(a_ptr, b_ptr, c_ptr, M, N, K, ...):\n ...\n Flash Attention\uff08Dao\u7b49\u4eba\uff0c2022\uff09\u662f\u8fd1\u5e74\u6765\u6700\u5177\u5f71\u54cd\u529b\u7684\u81ea\u5b9a\u4e49\u6838\u51fd\u6570\u3002\u5b83\u4ee5 \\(O(n)\\) \u5185\u5b58\u800c\u975e \\(O(n^2)\\) \u8ba1\u7b97\u6ce8\u610f\u529b\uff0c\u4f7f\u5f97\u66f4\u957f\u7684\u5e8f\u5217\u6210\u4e3a\u53ef\u80fd\u3002
\u95ee\u9898\uff1a\u6807\u51c6\u6ce8\u610f\u529b\u8ba1\u7b97 \\(\\\\text{softmax}(QK^T / \\\\sqrt{d}) \\\\cdot V\\)\u3002\\(QK^T\\) \u77e9\u9635\u662f \\(n \\\\times n\\)\uff0c\u5176\u4e2d \\(n\\) \u662f\u5e8f\u5217\u957f\u5ea6\u3002\u5bf9\u4e8e \\(n = 128K\\)\uff0c\u6b64\u77e9\u9635\u4e3a \\(128K \\\\times 128K \\\\times 4\\) \u5b57\u8282 = 64 GB\u3002\u5b83\u65e0\u6cd5\u653e\u5165GPU\u5185\u5b58\u3002
\u5173\u952e\u6d1e\u5bdf\uff1a\u4f60\u4e0d\u9700\u8981\u5177\u4f53\u5316\u5b8c\u6574\u7684 \\(n \\\\times n\\) \u77e9\u9635\u3002\u6309\u74e6\u7247\u8ba1\u7b97\u6ce8\u610f\u529b\uff1a\u52a0\u8f7d\u4e00\u7ec4 \\(Q\\)\u3001\u4e00\u7ec4 \\(K\\)\uff0c\u8ba1\u7b97\u5b83\u4eec\u7684\u90e8\u5206\u6ce8\u610f\u529b\u5f97\u5206\uff0c\u7d2f\u52a0\uff0c\u7136\u540e\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5757\u3002\\(n \\\\times n\\) \u77e9\u9635\u4ece\u672a\u5b8c\u5168\u5177\u4f53\u5316\u2014\u2014\u6bcf\u6b21\u53ea\u6709\u4e00\u5757\u5b58\u5728\u4e8eSRAM\u4e2d\u3002
\u5728\u7ebfsoftmax\uff1a\u68d8\u624b\u7684\u90e8\u5206\u662fsoftmax\uff0c\u5b83\u9700\u8981\u77e5\u9053\u6574\u4e2a\u884c\u4e0a\u7684\u6700\u5927\u503c\uff08\u4e3a\u6570\u503c\u7a33\u5b9a\u6027\uff09\u3002Flash Attention\u4f7f\u7528\u5728\u7ebfsoftmax\u6280\u5de7\uff1a\u7ef4\u62a4\u4e00\u4e2a\u8fd0\u884c\u4e2d\u7684\u6700\u5927\u503c\uff0c\u5f53\u53d1\u73b0\u65b0\u7684\u6700\u5927\u503c\u65f6\u91cd\u65b0\u7f29\u653e\u5148\u524d\u8ba1\u7b97\u7684\u503c\u3002\u8fd9\u5141\u8bb8softmax\u4ee5\u589e\u91cf\u65b9\u5f0f\u9010\u5757\u8ba1\u7b97\u3002
\u7b97\u6cd5\uff1a
\u5bf9\u4e8e\u6bcf\u4e2aQ\u884c\u5757\uff1a\n \u5bf9\u4e8e\u6bcf\u4e2aK\u5217\u5757\uff1a\n 1. \u5c06Q_block\u4eceHBM\u52a0\u8f7d\u5230SRAM\n 2. \u5c06K_block\u4eceHBM\u52a0\u8f7d\u5230SRAM\n 3. \u8ba1\u7b97S_block = Q_block @ K_block.T\uff08\u5728SRAM\u4e2d\uff09\n 4. \u66f4\u65b0\u8fd0\u884c\u4e2d\u6700\u5927\u503c\uff0c\u91cd\u65b0\u7f29\u653e\u5148\u524d\u7ed3\u679c\n 5. \u8ba1\u7b97exp(S_block - \u8fd0\u884c\u4e2d\u6700\u5927\u503c)\n 6. \u66f4\u65b0\u8fd0\u884c\u4e2d\u6c42\u548c\u548c\u8f93\u51fa\u7d2f\u52a0\u5668\n \u52a0\u8f7dV_block\u5e76\u8ba1\u7b97\u6700\u7ec8\u8f93\u51fa\n \u5c06\u8f93\u51fa\u5757\u5199\u56deHBM\n \u4e3a\u4ec0\u4e48\u5b83\u5feb\uff1a\u5185\u5faa\u73af\u5b8c\u5168\u5728SRAM\uff08\u5171\u4eab\u5185\u5b58\uff09\u4e2d\u64cd\u4f5c\u3002\u5168\u5c40\u5185\u5b58\uff08HBM\uff09\u4ec5\u7528\u4e8e\u52a0\u8f7dQ\u3001K\u3001V\u5757\u548c\u5199\u5165\u6700\u7ec8\u8f93\u51fa\u3002\u6570\u636e\u91cd\u7528\u56e0\u5b50\u4e0eSRAM\u5927\u5c0f\u6210\u6b63\u6bd4\uff0c\u800cSRAM\u6bd4HBM\u5feb\u7ea6100\u500d\u3002
Flash Attention\u5728Triton\u548cCUDA C\u4e2d\u90fd\u6709\u5b9e\u73b0\u3002CUDA\u7248\u672c\u66f4\u5feb\uff08\u6548\u7387\u9ad8\u7ea610%\uff09\uff0c\u4f46Triton\u7248\u672c\u66f4\u5177\u53ef\u8bfb\u6027\u548c\u53ef\u4fee\u6539\u6027\uff0c\u8fd9\u5bf9\u7814\u7a76\u65b0\u7684\u6ce8\u610f\u529b\u53d8\u4f53\u5f88\u91cd\u8981\u3002
TPU\uff08\u5f20\u91cf\u5904\u7406\u5355\u5143\uff09\u662fGoogle\u7684\u81ea\u5b9a\u4e49ML\u52a0\u901f\u5668\u3002\u5b83\u4eec\u91c7\u7528\u4e0eGPU\u622a\u7136\u4e0d\u540c\u7684\u65b9\u6cd5\uff1a
\u8109\u52a8\u9635\u5217\uff1aTPU\u7684\u6838\u5fc3\u8ba1\u7b97\u5355\u5143\u662f\u77e9\u9635\u4e58\u6cd5\u5355\u5143\uff08MXU\uff09\uff0c\u4e00\u4e2a128\u00d7128\u6216256\u00d7256\u7684\u8109\u52a8\u9635\u5217\uff0c\u901a\u8fc7\u8ba9\u6570\u636e\u6d41\u7ecf\u4e58\u52a0\u5355\u5143\u7f51\u683c\u6765\u8ba1\u7b97\u77e9\u9635\u4e58\u6cd5\u3002\u6570\u636e\u4ece\u8fb9\u7f18\u8fdb\u5165\u5e76\u901a\u8fc7\u9635\u5217\u4f20\u64ad\uff0c\u6bcf\u4e2a\u5355\u5143\u6267\u884c\u4e00\u6b21\u4e58\u52a0\u5e76\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a\u3002
\u4e0eGPU\uff08\u8c03\u5ea6\u6570\u5343\u4e2a\u72ec\u7acb\u7ebf\u7a0b\uff09\u4e0d\u540c\uff0c\u8109\u52a8\u9635\u5217\u662f\u5355\u4e00\u7684\u786e\u5b9a\u6027\u6570\u636e\u6d41\u3002\u6ca1\u6709\u7ebf\u7a0b\u8c03\u5ea6\u3001\u6ca1\u6709\u7ebf\u7a0b\u675f\u5206\u6b67\u3001\u6ca1\u6709\u5206\u652f\u9884\u6d4b\u3002\u8fd9\u79cd\u7b80\u6734\u6027\u4f7fMXU\u5728\u77e9\u9635\u4e58\u6cd5\u65b9\u9762\u6781\u5176\u80fd\u6548\u9ad8\u6548\u3002
HBM\uff1aTPU\u4f7f\u7528\u4e0eGPU\u76f8\u540c\u7684\u9ad8\u5e26\u5bbd\u5185\u5b58\u3002TPU v5e\u6bcf\u82af\u724716 GB HBM2e\uff1bTPU v5p\u6bcf\u82af\u724795 GB HBM2e\u3002
ICI\uff08\u82af\u7247\u95f4\u4e92\u8fde\uff09\uff1aTPU Pod\u7528\u81ea\u5b9a\u4e49\u9ad8\u901f\u7f51\u7edc\u8fde\u63a5\u6570\u767e\u4e2aTPU\u3002JAX\u539f\u751f\u652f\u6301\u8de8TPU Pod\u7684\u6570\u636e\u5e76\u884c\u6027\u548c\u6a21\u578b\u5e76\u884c\u6027\uff08\u7b2c6\u7ae0\uff09\u3002
BFloat16\uff1aTPU\u662f\u9996\u4e2a\u4f7f\u7528bfloat16\u7684\uff08\u7b2c13\u7ae0\u6587\u4ef602\uff09\u3002BF16\u5177\u6709\u4e0efloat32\u76f8\u540c\u7684\u6307\u6570\u8303\u56f4\uff08\u9632\u6b62\u8bad\u7ec3\u671f\u95f4\u6ea2\u51fa\uff09\uff0c\u5c3e\u6570\u7cbe\u5ea6\u8f83\u4f4e\u3002\u8fd9\u79cd\u6743\u8861\u5bf9ML\u662f\u7406\u60f3\u7684\uff0c\u5176\u4e2d\u68af\u5ea6\u503c\u8303\u56f4\u5e7f\u4f46\u4e0d\u9700\u898123\u4f4d\u7cbe\u5ea6\u3002
jax.jit \u5c06\u5176\u7f16\u8bd1\u4e3aXLA HLO\uff0cXLA\u5c06HLO\u7f16\u8bd1\u4e3aTPU\u7279\u5b9a\u7684\u6307\u4ee4\u3002\u65e0\u9700CUDA\uff0c\u65e0\u9700C++\u3002import jax\nimport jax.numpy as jnp\n\n@jax.jit\ndef matmul(a, b):\n return jnp.dot(a, b)\n\n# \u8fd9\u5c06\u6839\u636e\u8bbe\u5907\u5728CPU\u3001GPU\u6216TPU\u4e0a\u8fd0\u884c\na = jnp.ones((1024, 1024))\nb = jnp.ones((1024, 1024))\nc = matmul(a, b)\n from jax.experimental import pallas as pl\nimport jax.numpy as jnp\n\ndef add_kernel(x_ref, y_ref, o_ref):\n o_ref[...] = x_ref[...] + y_ref[...]\n\ndef add_pallas(x, y):\n return pl.pallas_call(\n add_kernel,\n out_shape=jax.ShapeDtypeStruct(x.shape, x.dtype),\n grid=(x.shape[0] // 128,),\n in_specs=[pl.BlockSpec((128,), lambda i: (i,)),\n pl.BlockSpec((128,), lambda i: (i,))],\n out_specs=pl.BlockSpec((128,), lambda i: (i,)),\n )(x, y)\n \u7f16\u5199\u5e76\u8fd0\u884c\u5411\u91cf\u52a0\u6cd5\u7684Triton\u6838\u51fd\u6570\u3002\u5c06\u5176\u6027\u80fd\u4e0ePyTorch\u5185\u7f6e\u52a0\u6cd5\u6bd4\u8f83\u3002
import triton\nimport triton.language as tl\nimport torch\nimport time\n\n@triton.jit\ndef add_kernel(x_ptr, y_ptr, out_ptr, n, BLOCK: tl.constexpr):\n pid = tl.program_id(0)\n offs = pid * BLOCK + tl.arange(0, BLOCK)\n mask = offs < n\n x = tl.load(x_ptr + offs, mask=mask)\n y = tl.load(y_ptr + offs, mask=mask)\n tl.store(out_ptr + offs, x + y, mask=mask)\n\nn = 10_000_000\nx = torch.randn(n, device='cuda')\ny = torch.randn(n, device='cuda')\n\n# Triton\nout_triton = torch.empty_like(x)\ngrid = lambda meta: (triton.cdiv(n, meta['BLOCK']),)\nadd_kernel[grid](x, y, out_triton, n, BLOCK=1024)\n\n# PyTorch\nout_torch = x + y\n\n# \u9a8c\u8bc1\u6b63\u786e\u6027\nassert torch.allclose(out_triton, out_torch, atol=1e-5)\n\n# \u57fa\u51c6\u6d4b\u8bd5\ntorch.cuda.synchronize()\nstart = time.time()\nfor _ in range(1000):\n add_kernel[grid](x, y, out_triton, n, BLOCK=1024)\ntorch.cuda.synchronize()\ntriton_time = (time.time() - start) / 1000\n\nstart = time.time()\nfor _ in range(1000):\n out_torch = x + y\ntorch.cuda.synchronize()\ntorch_time = (time.time() - start) / 1000\n\nprint(f\"Triton: {triton_time*1000:.3f} ms\")\nprint(f\"PyTorch: {torch_time*1000:.3f} ms\")\nprint(f\"\u6bd4\u7387: {torch_time/triton_time:.2f}x\")\n \u7f16\u5199\u4e00\u4e2aTriton\u878d\u5408\u6838\u51fd\u6570\uff0c\u5728\u5355\u6b21\u904d\u5386\u4e2d\u6267\u884c\u4e58\u6cd5+\u52a0\u6cd5+ReLU\u3002\u4e0e\u4e09\u4e2a\u72ec\u7acb\u7684PyTorch\u64cd\u4f5c\u6bd4\u8f83\u3002
import triton\nimport triton.language as tl\nimport torch\nimport time\n\n@triton.jit\ndef fused_mul_add_relu_kernel(x_ptr, w_ptr, b_ptr, out_ptr, n, BLOCK: tl.constexpr):\n pid = tl.program_id(0)\n offs = pid * BLOCK + tl.arange(0, BLOCK)\n mask = offs < n\n x = tl.load(x_ptr + offs, mask=mask)\n w = tl.load(w_ptr + offs, mask=mask)\n b = tl.load(b_ptr + offs, mask=mask)\n result = tl.maximum(x * w + b, 0.0) # \u878d\u5408\uff1a\u4e58\u6cd5 + \u52a0\u6cd5 + relu\n tl.store(out_ptr + offs, result, mask=mask)\n\nn = 10_000_000\nx = torch.randn(n, device='cuda')\nw = torch.randn(n, device='cuda')\nb = torch.randn(n, device='cuda')\n\n# \u878d\u5408\uff08Triton\uff09\nout_fused = torch.empty_like(x)\ngrid = lambda meta: (triton.cdiv(n, meta['BLOCK']),)\nfused_mul_add_relu_kernel[grid](x, w, b, out_fused, n, BLOCK=1024)\n\n# \u672a\u878d\u5408\uff08PyTorch\uff09\nout_unfused = torch.relu(x * w + b)\n\nassert torch.allclose(out_fused, out_unfused, atol=1e-5)\n\n# \u57fa\u51c6\u6d4b\u8bd5\ntorch.cuda.synchronize()\nstart = time.time()\nfor _ in range(1000):\n fused_mul_add_relu_kernel[grid](x, w, b, out_fused, n, BLOCK=1024)\ntorch.cuda.synchronize()\nfused_time = (time.time() - start) / 1000\n\nstart = time.time()\nfor _ in range(1000):\n out_unfused = torch.relu(x * w + b)\ntorch.cuda.synchronize()\nunfused_time = (time.time() - start) / 1000\n\nprint(f\"\u878d\u5408\uff08Triton\uff09: {fused_time*1000:.3f} ms\")\nprint(f\"\u672a\u878d\u5408\uff08PyTorch\uff09: {unfused_time*1000:.3f} ms\")\nprint(f\"\u52a0\u901f\u6bd4: {unfused_time/fused_time:.2f}x\")\n \u6d4b\u91cfJAX\u7684XLA\u7f16\u8bd1\u5668\u5982\u4f55\u81ea\u52a8\u878d\u5408\u64cd\u4f5c\u3002\u6bd4\u8f83\u5e26\u548c\u4e0d\u5e26jit\u7684\u64cd\u4f5c\u94fe\u3002
import jax\nimport jax.numpy as jnp\nimport time\n\ndef chain_ops(x):\n x = x * 2.0\n x = x + 1.0\n x = jnp.maximum(x, 0.0) # ReLU\n x = x / jnp.sum(x)\n return x\n\nchain_jit = jax.jit(chain_ops)\nx = jax.random.normal(jax.random.PRNGKey(0), (10000, 1000))\n\n# \u9884\u70ed\n_ = chain_jit(x)\njax.block_until_ready(_)\n\n# \u5373\u65f6\u6a21\u5f0f\uff08\u6bcf\u4e2a\u64cd\u4f5c\u662f\u72ec\u7acb\u6838\u51fd\u6570\u542f\u52a8\uff09\nstart = time.time()\nfor _ in range(100):\n y = chain_ops(x)\njax.block_until_ready(y)\neager_time = (time.time() - start) / 100\n\n# JIT\uff08XLA\u878d\u5408\u64cd\u4f5c\uff09\nstart = time.time()\nfor _ in range(100):\n y = chain_jit(x)\njax.block_until_ready(y)\njit_time = (time.time() - start) / 100\n\nprint(f\"\u5373\u65f6: {eager_time*1000:.2f} ms\")\nprint(f\"JIT: {jit_time*1000:.2f} ms\")\nprint(f\"\u52a0\u901f\u6bd4: {eager_time/jit_time:.1f}x\uff08XLA\u5c064\u4e2a\u64cd\u4f5c\u878d\u5408\u4e3a1\u4e2a\u6838\u51fd\u6570\uff09\")\n RISC-V\u662f\u6b63\u5728\u91cd\u5851\u82af\u7247\u884c\u4e1a\u7684\u5f00\u6e90\u6307\u4ee4\u96c6\u67b6\u6784\u3002\u672c\u6587\u6db5\u76d6RISC-V\u54f2\u5b66\u3001V\u5411\u91cf\u6269\u5c55\u3001\u5d4c\u5165\u5f0fML\u63a8\u7406\u3001\u5fae\u63a7\u5236\u5668\u4e0a\u7684TinyML\u3001AI\u52a0\u901f\u5668\u4e2d\u7684RISC-V\u4ee5\u53ca\u8fb9\u7f18\u90e8\u7f72\u7ea6\u675f
RISC-V\uff08\u53d1\u97f3\u4e3a\"risk five\"\uff09\u4e8e2010\u5e74\u5728\u52a0\u5dde\u5927\u5b66\u4f2f\u514b\u5229\u5206\u6821\u521b\u5efa\uff0c\u4f5c\u4e3a\u4e00\u4e2a\u7b80\u6d01\u3001\u73b0\u4ee3\u7684RISC\u6307\u4ee4\u96c6\u3002\u5173\u952e\u539f\u5219\uff1a
\u5f00\u653e\u6807\u51c6\uff1aISA\u89c4\u8303\u514d\u8d39\u63d0\u4f9b\u3002\u4f60\u53ef\u4ee5\u5728\u6ca1\u6709\u8bb8\u53ef\u8d39\u3001NDA\u6216\u6cd5\u5f8b\u534f\u8bae\u7684\u60c5\u51b5\u4e0b\u6784\u5efaRISC-V CPU\u3002\u8fd9\u5c31\u50cfLinux\u4e4b\u4e8e\u64cd\u4f5c\u7cfb\u7edf\u2014\u2014\u4efb\u4f55\u4eba\u90fd\u53ef\u4ee5\u4f7f\u7528\u3001\u4fee\u6539\u548c\u5728\u6b64\u57fa\u7840\u4e0a\u6784\u5efa\u3002
\u6a21\u5757\u5316\u8bbe\u8ba1\uff1a\u57fa\u7840ISA\uff08RV32I\u6216RV64I\uff09\u662f\u6700\u5c0f\u7684\u2014\u2014\u4ec547\u6761\u6307\u4ee4\u3002\u5176\u4ed6\u4e00\u5207\u90fd\u662f\u53ef\u9009\u7684\u6269\u5c55\uff1aM\uff08\u4e58\u6cd5/\u9664\u6cd5\uff09\u3001A\uff08\u539f\u5b50\u64cd\u4f5c\uff09\u3001F/D\uff08\u6d6e\u70b9\uff09\u3001C\uff08\u538b\u7f29\u6307\u4ee4\uff09\u3001V\uff08\u5411\u91cf\u5904\u7406\uff09\u3002\u4f60\u53ea\u9009\u62e9\u9700\u8981\u7684\uff0c\u4fdd\u6301\u82af\u7247\u5c0f\u5de7\u9ad8\u6548\u3002
\u65e0\u9057\u7559\u5305\u88b1\uff1ax86\u80cc\u8d1f\u774045\u5e74\u7684\u5411\u540e\u517c\u5bb9\u6027\u3002ARM\u80cc\u8d1f\u774035\u5e74\u3002RISC-V\u4ece\u96f6\u5f00\u59cb\uff0c\u878d\u5165\u4e86\u4ece\u4e24\u8005\u4e2d\u5438\u53d6\u7684\u7ecf\u9a8c\u6559\u8bad\u3002\u6ca1\u6709\u4ec5\u4e3a\u4e0e1980\u5e74\u4ee3\u8f6f\u4ef6\u517c\u5bb9\u800c\u5b58\u5728\u7684\u6666\u6da9\u6307\u4ee4\u3002
\u8c01\u5728\u4f7f\u7528RISC-V\uff1aSiFive\uff08\u901a\u7528\u6838\u5fc3\uff09\u3001\u963f\u91cc\u5df4\u5df4\uff08\u7384\u94c1\u670d\u52a1\u5668\u6838\u5fc3\uff09\u3001\u897f\u90e8\u6570\u636e\uff08\u5b58\u50a8\u63a7\u5236\u5668\uff0c\u5df2\u51fa\u8d27\u6570\u5341\u4ebf\uff09\u3001\u4e50\u946b\uff08ESP32-C3\uff0c\u6d41\u884cIoT\u82af\u7247\uff09\uff0c\u4ee5\u53ca\u6570\u5341\u5bb6\u4f7f\u7528RISC-V\u4f5c\u4e3a\u7ba1\u7406\u5176\u81ea\u5b9a\u4e49\u8ba1\u7b97\u5355\u5143\u7684\u63a7\u5236\u5904\u7406\u5668\u7684AI\u52a0\u901f\u5668\u521d\u521b\u516c\u53f8\u3002
# RISC-V\u6c47\u7f16\uff08\u611f\u53d7\u98ce\u683c\u2014\u2014\u4f60\u5c06\u4f7f\u7528C/C++\uff09\nadd x3, x1, x2 # x3 = x1 + x2\nlw x4, 0(x5) # \u4ecex5\u4e2d\u7684\u5730\u5740\u52a0\u8f7d\u5b57\nsw x4, 8(x5) # \u5b58\u50a8\u5b57\u5230\u5730\u5740 x5 + 8\nbeq x1, x2, label # \u5982\u679cx1 == x2\u5219\u5206\u652f\n #include <riscv_vector.h>\n\n// \u4f7f\u7528RVV\u5185\u8054\u51fd\u6570\u8fdb\u884c\u5411\u91cf\u52a0\u6cd5\nvoid vadd_rvv(const float* a, const float* b, float* c, int n) {\n while (n > 0) {\n // vsetvl\uff1a\u8bbe\u7f6e\u5411\u91cf\u957f\u5ea6\u2014\u2014\u5904\u7406 min(n, \u786c\u4ef6\u6700\u5927\u503c) \u4e2a\u5143\u7d20\n size_t vl = __riscv_vsetvl_e32m1(n);\n\n // \u52a0\u8f7dvl\u4e2a\u5143\u7d20\n vfloat32m1_t va = __riscv_vle32_v_f32m1(a, vl);\n vfloat32m1_t vb = __riscv_vle32_v_f32m1(b, vl);\n\n // \u76f8\u52a0\n vfloat32m1_t vc = __riscv_vfadd_vv_f32m1(va, vb, vl);\n\n // \u5b58\u50a8\n __riscv_vse32_v_f32m1(c, vc, vl);\n\n // \u524d\u8fdb\u6307\u9488\n a += vl; b += vl; c += vl; n -= vl;\n }\n}\n vsetvl \u662f\u5173\u952e\u6307\u4ee4\u3002\u5b83\u544a\u8bc9\u786c\u4ef6\"\u6211\u60f3\u5904\u7406\u8fd9\u4e48\u591a\u5143\u7d20\"\uff0c\u786c\u4ef6\u56de\u5e94\"\u6211\u53ef\u4ee5\u5904\u7406\u8fd9\u4e48\u591a\"\uff08\u53d7VLEN\u9650\u5236\uff09\u3002\u5faa\u73af\u81ea\u52a8\u9002\u5e94\u4efb\u4f55\u5411\u91cf\u5bbd\u5ea6\uff0c\u65e0\u9700\u6807\u91cf\u6e05\u7406\uff08\u6700\u540e\u4e00\u6b21\u8fed\u4ee3\u53ea\u5904\u7406\u8f83\u5c11\u7684\u5143\u7d20\uff09\u3002
LMUL\uff08\u957f\u5ea6\u4e58\u6570\uff09\uff1aRVV\u53ef\u4ee5\u5c06\u591a\u4e2a\u5411\u91cf\u5bc4\u5b58\u5668\u5206\u7ec4\u5728\u4e00\u8d77\uff08m1\u3001m2\u3001m4\u3001m8\uff09\uff0c\u4ee5\u6bcf\u6761\u6307\u4ee4\u5904\u7406\u66f4\u591a\u5143\u7d20\uff0c\u4ee3\u4ef7\u662f\u53ef\u7528\u7684\u5bc4\u5b58\u5668\u66f4\u5c11\u3002m1 \u6bcf\u4e2a\u5411\u91cf\u64cd\u4f5c\u6570\u4f7f\u7528\u4e00\u4e2a\u5bc4\u5b58\u5668\uff1bm8 \u4f7f\u7528\u516b\u4e2a\uff0c\u5904\u74068\u500d\u5143\u7d20\uff0c\u4f46\u53ea\u7559\u4e0b4\u4e2a\u5bc4\u5b58\u5668\u7ec4\u53ef\u7528\u3002
\u4e0ex86 AVX\uff08\u56fa\u5b9a256/512\u4f4d\uff09\u548cARM NEON\uff08\u56fa\u5b9a128\u4f4d\uff09\u76f8\u6bd4\uff0cRVV\u7684\u53ef\u4f38\u7f29\u6027\u5bf9\u4e8e\u591a\u6837\u5316\u786c\u4ef6\u662f\u4e00\u4e2a\u91cd\u8981\u4f18\u52bf\uff1a\u76f8\u540c\u4ee3\u7801\u5728\u5c0f\u578b\u5d4c\u5165\u5f0f\u6838\u5fc3\uff08VLEN=128\uff09\u548c\u9ad8\u6027\u80fd\u670d\u52a1\u5668\u6838\u5fc3\uff08VLEN=1024+\uff09\u4e0a\u8fd0\u884c\u3002
TinyML\u662f\u5fae\u63a7\u5236\u5668\u4e0a\u7684\u673a\u5668\u5b66\u4e60\u2014\u2014\u5177\u6709\u5343\u5b57\u8282RAM\u3001\u5146\u8d6b\u7ea7CPU\u548c\u6beb\u74e6\u529f\u7387\u9884\u7b97\u7684\u8bbe\u5907\u3002\u60f3\u60f3\uff1a\u68c0\u6d4b\u5173\u952e\u8bcd\u7684\u4f20\u611f\u5668\uff08\"Hey Siri\"\uff09\u3001\u5206\u7c7b\u624b\u52bf\u7684\u52a0\u901f\u5ea6\u8ba1\u3001\u6216\u8ba1\u6570\u4eba\u6570\u7684\u5c0f\u578b\u6444\u50cf\u5934\uff0c\u6240\u6709\u8fd9\u4e9b\u90fd\u5728\u4e00\u4e2a\u552e\u4ef70.50\u7f8e\u5143\u3001\u65e0\u9700\u4e92\u8054\u7f51\u8fde\u63a5\u7684\u82af\u7247\u4e0a\u8fd0\u884c\u3002
\u7ea6\u675f\u6761\u4ef6\u6781\u5176\u4e25\u82db\uff1a
// \u5fae\u63a7\u5236\u5668\u4e0a\u7684TinyML\u63a8\u7406\uff08\u7b80\u5316\u7248\uff09\n#include \"tensorflow/lite/micro/micro_interpreter.h\"\n#include \"tensorflow/lite/micro/micro_mutable_op_resolver.h\"\n\n// \u6a21\u578b\u7f16\u8bd1\u4e3aC\u6570\u7ec4\uff08const unsigned char model_data[]\uff09\nconst tflite::Model* model = tflite::GetModel(model_data);\n\n// \u5206\u914d\u56fa\u5b9a\u5185\u5b58\u7f13\u51b2\u533a\uff08\u65e0malloc\uff01\uff09\nconstexpr int kArenaSize = 10 * 1024; // 10 KB\nuint8_t tensor_arena[kArenaSize];\n\n// \u8bbe\u7f6e\u89e3\u91ca\u5668\ntflite::MicroInterpreter interpreter(model, resolver, tensor_arena, kArenaSize);\ninterpreter.AllocateTensors();\n\n// \u8bbe\u7f6e\u8f93\u5165\nfloat* input = interpreter.input(0)->data.f;\ninput[0] = sensor_reading;\n\n// \u8fd0\u884c\u63a8\u7406\ninterpreter.Invoke();\n\n// \u8bfb\u53d6\u8f93\u51fa\nfloat* output = interpreter.output(0)->data.f;\nif (output[0] > 0.8f) {\n trigger_alert();\n}\n tensor_arena \u662f\u9759\u6001\u5206\u914d\u7684\u2014\u2014\u6ca1\u6709 malloc\uff0c\u6ca1\u6709\u5806\u3002\u5d4c\u5165\u5f0f\u7cfb\u7edf\u901a\u5e38\u6ca1\u6709\u52a8\u6001\u5185\u5b58\u5206\u914d\u5668\u3002const \u5b57\u8282\u6570\u7ec4\uff0c\u5b58\u50a8\u5728\u95ea\u5b58\uff08ROM\uff09\u4e2d\uff0c\u800c\u975e\u4ece\u6587\u4ef6\u7cfb\u7edf\u52a0\u8f7d\u3002\u8ba9\u6a21\u578b\u5728\u5fae\u63a7\u5236\u5668\u4e0a\u8fd0\u884c\u9700\u8981\u6fc0\u8fdb\u4f18\u5316\uff1a
\u91cf\u5316\uff08\u7b2c18\u7ae0\uff09\uff1a\u5c06float32\u6743\u91cd\u8f6c\u6362\u4e3aINT8\uff08\u5c0f4\u500d\uff0c\u5728\u7eaf\u6574\u6570\u786c\u4ef6\u4e0a\u5feb2-4\u500d\uff09\u3002\u8bad\u7ec3\u540e\u91cf\u5316\u7b80\u5355\uff1b\u91cf\u5316\u611f\u77e5\u8bad\u7ec3\u4fdd\u7559\u66f4\u591a\u7cbe\u5ea6\u3002
\u526a\u679d\uff1a\u79fb\u9664\u63a5\u8fd1\u96f6\u7684\u6743\u91cd\u3002\u7ed3\u6784\u5316\u526a\u679d\uff08\u79fb\u9664\u6574\u4e2a\u901a\u9053/\u5934\uff09\u6bd4\u975e\u7ed3\u6784\u5316\u526a\u679d\uff08\u968f\u673a\u96f6\uff09\u5bf9\u786c\u4ef6\u66f4\u53cb\u597d\uff0c\u56e0\u4e3a\u5b83\u51cf\u5c11\u5b9e\u9645\u8ba1\u7b97\uff0c\u800c\u4e0d\u4ec5\u662f\u5b58\u50a8\u3002
\u77e5\u8bc6\u84b8\u998f\uff08\u7b2c6\u7ae0\uff09\uff1a\u8bad\u7ec3\u4e00\u4e2a\u5c0f\u578b\"\u5b66\u751f\"\u6a21\u578b\u6765\u6a21\u4eff\u5927\u578b\"\u6559\u5e08\"\u6a21\u578b\u3002\u5b66\u751f\u6a21\u578b\u6bd4\u4ece\u5934\u8bad\u7ec3\u83b7\u5f97\u66f4\u9ad8\u7cbe\u5ea6\uff0c\u56e0\u4e3a\u5b83\u4ece\u6559\u5e08\u6a21\u578b\u7684\u8f6f\u9884\u6d4b\u4e2d\u5b66\u4e60\u3002
\u795e\u7ecf\u67b6\u6784\u641c\u7d22\uff08NAS\uff09\uff1a\u81ea\u52a8\u641c\u7d22\u9002\u5408\u786c\u4ef6\u9884\u7b97\uff08\u5ef6\u8fdf\u3001\u5185\u5b58\u3001\u529f\u8017\uff09\u7684\u9ad8\u6548\u67b6\u6784\u3002MicroNets\u548cMCUNet\u4e3a\u7279\u5b9a\u5fae\u63a7\u5236\u5668\u5bfb\u627e\u4f18\u5316\u67b6\u6784\u3002
\u7b97\u5b50\u878d\u5408\uff1a\u5c06\u5377\u79ef+\u6279\u5f52\u4e00\u5316+ReLU\u7ec4\u5408\u6210\u5355\u4e2a\u878d\u5408\u64cd\u4f5c\uff0c\u6d88\u9664\u4e2d\u95f4\u5185\u5b58\u5199\u5165\uff08\u4e0eGPU\u6838\u51fd\u6570\u878d\u5408\u540c\u4e00\u539f\u5219\uff0c\u4f46\u5728\u53ea\u6709256 KB RAM\u65f6\u66f4\u52a0\u5173\u952e\uff09\u3002
\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 AI\u52a0\u901f\u5668 \u2502\n\u2502 \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 RISC-V \u2502\u2500\u2500\u2500\u2192\u2502 \u81ea\u5b9a\u4e49\u77e9\u9635 \u2502 \u2502\n\u2502 \u2502 \u63a7\u5236 \u2502 \u2502 \u4e58\u6cd5\u5355\u5143 \u2502 \u2502\n\u2502 \u2502 \u6838\u5fc3 \u2502 \u2502 \uff08\u8109\u52a8\u9635\u5217\u3001 \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502 \u81ea\u5b9a\u4e49\u6570\u636e\u6d41\uff09 \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2502 \u2502 \u2502 \u2502\n\u2502 \u25bc \u25bc \u2502\n\u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502\n\u2502 \u2502 \u5185\u5b58 \u2502 \u2502 \u7247\u4e0aSRAM \u2502 \u2502\n\u2502 \u2502 \u63a7\u5236 \u2502 \u2502 \uff08\u6fc0\u6d3b\u7f13\u51b2\uff09 \u2502 \u2502\n\u2502 \u2502 \u2502 \u2502 \u2502 \u2502\n\u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n RISC-V\u6838\u5fc3\u5904\u7406\uff1a\u4ece\u5916\u90e8\u5185\u5b58\u52a0\u8f7d\u6a21\u578b\u6743\u91cd\u3001\u8c03\u5ea6\u5c42\u6267\u884c\u3001\u7ba1\u7406\u8ba1\u7b97\u5355\u5143\u4e4b\u95f4\u7684\u6570\u636e\u6d41\u4ee5\u53ca\u4e0e\u4e3b\u673a\u901a\u4fe1\uff08\u901a\u8fc7PCIe\u3001USB\u6216SPI\uff09\u3002\u7e41\u91cd\u8ba1\u7b97\uff08\u77e9\u9635\u4e58\u6cd5\u3001\u5377\u79ef\uff09\u7531\u81ea\u5b9a\u4e49\u786c\u4ef6\u5b8c\u6210\uff0c\u800c\u975eRISC-V\u6838\u5fc3\u3002
\u4e3a\u4ec0\u4e48\u7528RISC-V\u505a\u63a7\u5236\uff1a\u65e0\u9700\u8bb8\u53ef\u8d39\u7528\uff08\u5bf9\u521d\u521b\u516c\u53f8\u81f3\u5173\u91cd\u8981\uff09\u3001\u53ef\u5b9a\u5236\uff08\u6dfb\u52a0\u9886\u57df\u7279\u5b9a\u6307\u4ee4\uff09\u3001\u5c0f\u5360\u7528\u7a7a\u95f4\uff08\u63a7\u5236\u6838\u5fc3\u4e0d\u9700\u8981x86\u7684\u590d\u6742\u6027\uff09\uff0c\u4ee5\u53ca\u5f00\u653e\u751f\u6001\u7cfb\u7edf\u652f\u6301\u5feb\u901f\u539f\u578b\u5f00\u53d1\u3002
\u793a\u4f8b\uff1aEsperanto Technologies\uff081000+\u4e2aRISC-V\u6838\u5fc3\u7528\u4e8eML\uff09\u3001Tenstorrent\uff08RISC-V\u63a7\u5236+\u81ea\u5b9a\u4e49tensix\u6838\u5fc3\uff09\u3001SiFive\uff08\u5e26\u5411\u91cf\u6269\u5c55\u7684RISC-V\u6838\u5fc3\u7528\u4e8e\u8fb9\u7f18ML\uff09\u3002
\u5728\u8fb9\u7f18\u90e8\u7f72ML\uff08\u8bbe\u5907\u7aef\uff0c\u800c\u975e\u4e91\u7aef\uff09\u5f15\u5165\u4e86\u4e91\u7aef\u90e8\u7f72\u4e0d\u9700\u8981\u7684\u7ea6\u675f\uff1a
\u529f\u8017\uff1a\u7535\u6c60\u4f9b\u7535\u7684\u8bbe\u5907\u603b\u529f\u8017\u9884\u7b97\u53ef\u80fd\u4e3a100 mW\u3002\u8fd0\u884c\u6d88\u801750 mW\u7684\u6a21\u578b\u53ea\u7ed9\u7cfb\u7edf\u5176\u4f59\u90e8\u5206\uff08\u4f20\u611f\u5668\u3001\u65e0\u7ebf\u7535\u3001\u663e\u793a\u5668\uff09\u7559\u4e0b50 mW\u3002\u529f\u8017\u611f\u77e5\u63a8\u7406\u8c03\u5ea6\u8ba1\u7b97\u4ee5\u907f\u514d\u70ed\u964d\u9891\u5e76\u5ef6\u957f\u7535\u6c60\u5bff\u547d\u3002
\u5ef6\u8fdf\uff1a\u8fb9\u7f18\u63a8\u7406\u901a\u5e38\u5fc5\u987b\u662f\u5b9e\u65f6\u7684\u3002\u5524\u9192\u8bcd\u68c0\u6d4b\u5668\uff08\"Hey Siri\"\uff09\u5fc5\u987b\u5728\u7ea6200 ms\u5185\u54cd\u5e94\u3002\u81ea\u52a8\u9a7e\u9a76\u611f\u77e5\u7cfb\u7edf\uff08\u7b2c11\u7ae0\uff09\u5fc5\u987b\u5728\u7ea630 ms\u5185\u5904\u7406\u5e27\u3002\u5230\u4e91\u7aef\u7684\u7f51\u7edc\u5f80\u8fd4\uff0850-200 ms\uff09\u5bf9\u8fd9\u4e9b\u7528\u4f8b\u6765\u8bf4\u592a\u6162\u4e86\u3002
\u9690\u79c1\uff1a\u5728\u8bbe\u5907\u4e0a\u5904\u7406\u6570\u636e\u610f\u5473\u7740\u654f\u611f\u6570\u636e\uff08\u533b\u5b66\u56fe\u50cf\u3001\u8bed\u97f3\u8bb0\u5f55\u3001\u4e2a\u4eba\u7167\u7247\uff09\u6c38\u8fdc\u4e0d\u4f1a\u79bb\u5f00\u8bbe\u5907\u3002\u8fd9\u5728\u67d0\u4e9b\u53f8\u6cd5\u7ba1\u8f96\u533a\u662f\u6cd5\u5f8b\u8981\u6c42\uff08GDPR\uff09\uff0c\u5728\u6240\u6709\u5730\u65b9\u90fd\u662f\u7528\u6237\u4fe1\u4efb\u7684\u8981\u6c42\u3002
\u8fde\u63a5\u6027\uff1a\u8fb9\u7f18\u8bbe\u5907\u53ef\u80fd\u95f4\u6b47\u6027\u6216\u5b8c\u5168\u6ca1\u6709\u4e92\u8054\u7f51\u8fde\u63a5\u3002\u5728\u706b\u661f\u8f66\uff08\u7b2c11\u7ae0\uff09\u3001\u6f5c\u8247\u6216\u519c\u6751\u519c\u7530\u4f20\u611f\u5668\u4e0a\u8fd0\u884c\u7684\u6a21\u578b\u5fc5\u987b\u5b8c\u5168\u79bb\u7ebf\u5de5\u4f5c\u3002
\u89c4\u6a21\u6210\u672c\uff1a\u5c06ML\u90e8\u7f72\u5230\u5341\u4ebf\u90e8\u667a\u80fd\u624b\u673a\u6bcf\u53f0\u6210\u672c\u4e3a$0\uff08\u786c\u4ef6\u5df2\u7ecf\u5b58\u5728\uff09\u3002\u5c06ML\u90e8\u7f72\u5230\u5341\u4ebf\u4e2aIoT\u4f20\u611f\u5668\u610f\u5473\u7740\u6bcf\u4e2a\u4f20\u611f\u5668\u7684ML\u786c\u4ef6\u9884\u7b97\u53ea\u6709\u51e0\u5206\u94b1\u3002RISC-V\u7684\u96f6\u8bb8\u53ef\u6210\u672c\u5728\u8fd9\u4e2a\u89c4\u6a21\u4e0b\u610f\u4e49\u91cd\u5927\u3002
\u7f16\u5199\u4e00\u4e2aC\u7a0b\u5e8f\uff0c\u6a21\u62dfTinyML\u63a8\u7406\u6d41\u6c34\u7ebf\uff1a\u9759\u6001\u5206\u914d\u6a21\u578b\u7f13\u51b2\u533a\uff0c\u8fd0\u884c\u6a21\u62df\u524d\u5411\u4f20\u64ad\uff0c\u5e76\u6d4b\u91cf\u8d44\u6e90\u4f7f\u7528\u3002\u8fd9\u6559\u6388\u5d4c\u5165\u5f0f\u7ea6\u675f\uff08\u65e0malloc\u3001\u56fa\u5b9a\u5185\u5b58\u7f13\u51b2\u533a\uff09\u3002
// task1_tinyml_sim.cpp\n// \u7f16\u8bd1\uff1ag++ -O2 -o task1 task1_tinyml_sim.cpp\n\n#include <iostream>\n#include <chrono>\n#include <cmath>\n#include <cstring>\n\n// \u6a21\u62df\u5fae\u63a7\u5236\u5668\uff1a\u56fa\u5b9a\u5185\u5b58\u7f13\u51b2\u533a\uff0c\u65e0\u52a8\u6001\u5206\u914d\nstatic constexpr int ARENA_SIZE = 32 * 1024; // 32 KB\u603bRAM\u9884\u7b97\nstatic uint8_t arena[ARENA_SIZE];\n\n// \u7b80\u5355\u76842\u5c42MLP\uff1a784 -> 64 -> 10\uff08\u7c7b\u4f3cMNIST\uff0cINT8\u6743\u91cd\uff09\nstruct TinyModel {\n int8_t w1[784 * 64]; // \u5c421\u6743\u91cd\uff1a50,176\u5b57\u8282\n int8_t b1[64]; // \u5c421\u504f\u7f6e\n int8_t w2[64 * 10]; // \u5c422\u6743\u91cd\uff1a640\u5b57\u8282\n int8_t b2[10]; // \u5c422\u504f\u7f6e\n // \u603b\u8ba1\uff1a\u7ea651 KB \u2192 \u5fc5\u987b\u653e\u5728\u95ea\u5b58\uff08ROM\uff09\uff0c\u800c\u975eRAM\n};\n\n// \u68c0\u67e5\u6a21\u578b\u662f\u5426\u9002\u5408\u95ea\u5b58\nvoid check_model_fit(int flash_kb) {\n int model_bytes = sizeof(TinyModel);\n std::cout << \"\u6a21\u578b\u5927\u5c0f: \" << model_bytes << \" \u5b57\u8282\uff08\"\n << model_bytes / 1024 << \" KB\uff09\\n\";\n std::cout << \"\u95ea\u5b58: \" << flash_kb << \" KB \u2192 \"\n << (model_bytes <= flash_kb * 1024 ? \"\u9002\u5408\" : \"\u592a\u5927\") << \"\\n\";\n}\n\n// \u4f7f\u7528\u56fa\u5b9a\u7f13\u51b2\u533a\u8fdb\u884c\u6fc0\u6d3b\u7684\u6a21\u62df\u63a8\u7406\nvoid mock_inference(const int8_t* input, int8_t* output) {\n // \u6fc0\u6d3b\u503c\u653e\u5728\u7f13\u51b2\u533a\uff08RAM\uff09\u4e2d\uff0c\u800c\u975e\u52a8\u6001\u5206\u914d\n int8_t* act1 = (int8_t*)arena; // \u5c421\u8f93\u51fa64\u5b57\u8282\n int8_t* act2 = (int8_t*)(arena + 64); // \u5c422\u8f93\u51fa10\u5b57\u8282\n\n // \u5c421\uff1a\u7b80\u5316\u7248\u77e9\u9635\u4e58\u6cd5\uff08\u4e0d\u662f\u771f\u6b63\u7684\u91cf\u5316\u77e9\u9635\u4e58\u6cd5\uff0c\u4ec5\u7ed3\u6784\u6f14\u793a\uff09\n for (int j = 0; j < 64; j++) {\n int32_t sum = 0; // \u7528int32\u7d2f\u52a0\u907f\u514d\u6ea2\u51fa\n for (int i = 0; i < 784; i++) {\n sum += (int32_t)input[i] * 1; // \u6a21\u62df\uff1a\u6743\u91cd=1\n }\n act1[j] = (int8_t)std::max(-128, std::min(127, sum / 784)); // \u91cf\u5316\u56de\n act1[j] = act1[j] > 0 ? act1[j] : 0; // ReLU\n }\n\n // \u5c422\n for (int j = 0; j < 10; j++) {\n int32_t sum = 0;\n for (int i = 0; i < 64; i++) {\n sum += (int32_t)act1[i] * 1;\n }\n act2[j] = (int8_t)std::max(-128, std::min(127, sum / 64));\n }\n\n std::memcpy(output, act2, 10);\n}\n\nint main() {\n std::cout << \"=== TinyML\u8d44\u6e90\u9884\u7b97 ===\\n\";\n std::cout << \"\u7f13\u51b2\u533a\uff08RAM\uff09: \" << ARENA_SIZE << \" \u5b57\u8282\uff08\"\n << ARENA_SIZE / 1024 << \" KB\uff09\\n\";\n check_model_fit(256); // \u5178\u578bMCU\u95ea\u5b58\n\n // \u6fc0\u6d3b\u5185\u5b58\u4f7f\u7528\n int activation_bytes = 64 + 10; // \u5c421 + \u5c422\u8f93\u51fa\n std::cout << \"\u6fc0\u6d3b\u5185\u5b58: \" << activation_bytes\n << \" \u5b57\u8282 / \" << ARENA_SIZE << \" \u53ef\u7528\\n\\n\";\n\n // \u57fa\u51c6\u6d4b\u8bd5\u63a8\u7406\n int8_t input[784];\n int8_t output[10];\n std::memset(input, 1, 784);\n\n auto start = std::chrono::high_resolution_clock::now();\n for (int i = 0; i < 10000; i++) {\n mock_inference(input, output);\n }\n auto end = std::chrono::high_resolution_clock::now();\n double us = std::chrono::duration<double, std::micro>(end - start).count() / 10000;\n\n std::cout << \"\u63a8\u7406\u5ef6\u8fdf: \" << us << \" us\\n\";\n std::cout << \"\u5728160 MHz MCU\uff08\u7ea66.25 ns/\u5468\u671f\uff09\u4e0b\uff1a\u7ea6\"\n << (int)(us * 160) << \" \u5468\u671f\\n\";\n\n std::cout << \"\u8f93\u51falogits: \";\n for (int i = 0; i < 10; i++) std::cout << (int)output[i] << \" \";\n std::cout << \"\\n\";\n\n return 0;\n}\n \u7f16\u5199\u4e00\u4e2aC++\u7a0b\u5e8f\uff0c\u5c06float32\u6743\u91cd\u91cf\u5316\u4e3aINT8\uff0c\u5e76\u6d4b\u91cf\u538b\u7f29\u6bd4\u548c\u91cf\u5316\u8bef\u5dee\u3002
// task2_quantise.cpp\n// \u7f16\u8bd1\uff1ag++ -O3 -o task2 task2_quantise.cpp\n\n#include <iostream>\n#include <vector>\n#include <cmath>\n#include <algorithm>\n#include <numeric>\n\n// \u5bf9\u79f0\u91cf\u5316\uff1a\u5c06\u6d6e\u70b9\u8303\u56f4 [-max, +max] \u6620\u5c04\u5230 [-127, +127]\nvoid quantise_symmetric(const float* input, int8_t* output, int n, float& scale) {\n float max_val = 0.0f;\n for (int i = 0; i < n; i++) {\n max_val = std::max(max_val, std::abs(input[i]));\n }\n scale = max_val / 127.0f;\n for (int i = 0; i < n; i++) {\n float scaled = input[i] / scale;\n output[i] = (int8_t)std::max(-127.0f, std::min(127.0f, std::round(scaled)));\n }\n}\n\n// \u53cd\u91cf\u5316\uff1aINT8\u8f6c\u56defloat\nvoid dequantise(const int8_t* input, float* output, int n, float scale) {\n for (int i = 0; i < n; i++) {\n output[i] = (float)input[i] * scale;\n }\n}\n\nint main() {\n const int N = 100000;\n\n // \u6a21\u62df\u968f\u673a\u6743\u91cd\uff08\u5927\u81f4\u6b63\u6001\u5206\u5e03\uff09\n std::vector<float> weights(N);\n for (int i = 0; i < N; i++) {\n // \u7b80\u5355\u7684\u4f2a\u968f\u673a\u6b63\u6001\u503c\n float u1 = (float)(i * 7 % 997 + 1) / 998.0f;\n float u2 = (float)(i * 13 % 991 + 1) / 992.0f;\n weights[i] = std::sqrt(-2.0f * std::log(u1)) * std::cos(6.2832f * u2) * 0.1f;\n }\n\n // \u91cf\u5316\n std::vector<int8_t> quantised(N);\n float scale;\n quantise_symmetric(weights.data(), quantised.data(), N, scale);\n\n // \u53cd\u91cf\u5316\u5e76\u6d4b\u91cf\u8bef\u5dee\n std::vector<float> reconstructed(N);\n dequantise(quantised.data(), reconstructed.data(), N, scale);\n\n float max_error = 0.0f, total_error = 0.0f;\n for (int i = 0; i < N; i++) {\n float err = std::abs(weights[i] - reconstructed[i]);\n max_error = std::max(max_error, err);\n total_error += err;\n }\n\n std::cout << \"=== \u91cf\u5316\u7ed3\u679c ===\\n\";\n std::cout << \"\u539f\u59cb: \" << N * 4 << \" \u5b57\u8282\uff08float32\uff09\\n\";\n std::cout << \"\u91cf\u5316: \" << N * 1 << \" \u5b57\u8282\uff08int8\uff09+ 4 \u5b57\u8282\uff08\u7f29\u653e\u56e0\u5b50\uff09\\n\";\n std::cout << \"\u538b\u7f29\u6bd4: \" << 4.0f << \"x\\n\";\n std::cout << \"\u7f29\u653e\u56e0\u5b50: \" << scale << \"\\n\";\n std::cout << \"\u5e73\u5747\u7edd\u5bf9\u8bef\u5dee: \" << total_error / N << \"\\n\";\n std::cout << \"\u6700\u5927\u7edd\u5bf9\u8bef\u5dee: \" << max_error << \"\\n\";\n std::cout << \"\u6700\u5927\u7edd\u5bf9\u8bef\u5dee/\u7f29\u653e\u56e0\u5b50: \" << max_error / scale\n << \"\uff08\u5e94 <= 0.5 \u91cf\u5316\u7ea7\u522b\uff09\\n\";\n\n return 0;\n}\n \u7f16\u5199\u4e00\u4e2aC++\u7a0b\u5e8f\uff0c\u6267\u884cINT8\u77e9\u9635\u4e58\u6cd5\uff08INT32\u7d2f\u52a0\uff09\u2014\u2014\u8fd9\u662f\u5728\u5d4c\u5165\u5f0fML\u52a0\u901f\u5668\u4e0a\u8fd0\u884c\u7684\u5b9e\u9645\u8ba1\u7b97\u3002
// task3_int8_matmul.cpp\n// \u7f16\u8bd1\uff1ag++ -O3 -o task3 task3_int8_matmul.cpp\n\n#include <iostream>\n#include <chrono>\n#include <vector>\n#include <cstdint>\n\n// INT8\u77e9\u9635\u4e58\u6cd5\uff08INT32\u7d2f\u52a0\uff09\u2014\u2014\u5f20\u91cf\u6838\u5fc3\u548cMCU\u52a0\u901f\u5668\u7684\u5b9e\u9645\u5de5\u4f5c\u65b9\u5f0f\nvoid matmul_int8(const int8_t* A, const int8_t* B, int32_t* C,\n int M, int N, int K) {\n for (int i = 0; i < M; i++) {\n for (int j = 0; j < N; j++) {\n int32_t sum = 0;\n for (int k = 0; k < K; k++) {\n sum += (int32_t)A[i * K + k] * (int32_t)B[k * N + j];\n }\n C[i * N + j] = sum;\n }\n }\n}\n\n// \u7528\u4e8e\u6bd4\u8f83\u7684Float32\u77e9\u9635\u4e58\u6cd5\nvoid matmul_f32(const float* A, const float* B, float* C,\n int M, int N, int K) {\n for (int i = 0; i < M; i++) {\n for (int j = 0; j < N; j++) {\n float sum = 0.0f;\n for (int k = 0; k < K; k++) {\n sum += A[i * K + k] * B[k * N + j];\n }\n C[i * N + j] = sum;\n }\n }\n}\n\nint main() {\n const int M = 128, N = 128, K = 128;\n\n std::vector<int8_t> A_i8(M * K, 1), B_i8(K * N, 1);\n std::vector<int32_t> C_i32(M * N);\n\n std::vector<float> A_f32(M * K, 1.0f), B_f32(K * N, 1.0f);\n std::vector<float> C_f32(M * N);\n\n // \u57fa\u51c6\u6d4b\u8bd5INT8\n auto start = std::chrono::high_resolution_clock::now();\n for (int t = 0; t < 100; t++) {\n matmul_int8(A_i8.data(), B_i8.data(), C_i32.data(), M, N, K);\n }\n auto end = std::chrono::high_resolution_clock::now();\n double i8_ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n\n // \u57fa\u51c6\u6d4b\u8bd5FP32\n start = std::chrono::high_resolution_clock::now();\n for (int t = 0; t < 100; t++) {\n matmul_f32(A_f32.data(), B_f32.data(), C_f32.data(), M, N, K);\n }\n end = std::chrono::high_resolution_clock::now();\n double f32_ms = std::chrono::duration<double, std::milli>(end - start).count() / 100;\n\n double gops_i8 = 2.0 * M * N * K / i8_ms / 1e6;\n double gflops_f32 = 2.0 * M * N * K / f32_ms / 1e6;\n\n std::cout << \"INT8\u77e9\u9635\u4e58\u6cd5: \" << i8_ms << \" ms\uff08\" << gops_i8 << \" GOPS\uff09\\n\";\n std::cout << \"FP32\u77e9\u9635\u4e58\u6cd5: \" << f32_ms << \" ms\uff08\" << gflops_f32 << \" GFLOPS\uff09\\n\";\n std::cout << \"INT8\u52a0\u901f\u6bd4: \" << f32_ms / i8_ms << \"x\\n\";\n std::cout << \"\u5185\u5b58: INT8 = \" << M*K + K*N << \" \u5b57\u8282 vs FP32 = \"\n << (M*K + K*N) * 4 << \" \u5b57\u8282\uff08\u5c0f4\u500d\uff09\\n\";\n\n return 0;\n}\n Vulkan \u662f\u552f\u4e00\u80fd\u5728\u6240\u6709\u4e3b\u8981\u5e73\u53f0\u4e0a\u8fd0\u884c\u7684 GPU \u8ba1\u7b97 API\uff1aNVIDIA\u3001AMD\u3001Intel\u3001Apple\uff08\u901a\u8fc7 MoltenVK\uff09\u3001Android\uff0c\u751a\u81f3\u6d4f\u89c8\u5668\uff08\u901a\u8fc7 WebGPU\uff09\u3002\u672c\u6587\u6db5\u76d6 Vulkan \u67b6\u6784\u3001\u8ba1\u7b97\u7ba1\u7ebf\u3001\u4f7f\u7528 GLSL \u7f16\u5199\u8ba1\u7b97\u7740\u8272\u5668\u3001GPU \u8ba1\u7b97\u7a0b\u5e8f\u7684\u5b8c\u6574 C++ \u8bbe\u7f6e\u3001\u5171\u4eab\u5185\u5b58\u4e0e\u540c\u6b65\u3001\u7528\u4e8e\u6d4f\u89c8\u5668\u7684 WebGPU\uff0c\u4ee5\u53ca\u5b9e\u9645\u7684\u673a\u5668\u5b66\u4e60\u63a8\u7406\u793a\u4f8b\u3002
CUDA \u5728 NVIDIA \u786c\u4ef6\u4e0a\u4e3b\u5bfc\u7740 ML \u8bad\u7ec3\u3002\u4f46\u5e76\u975e\u6bcf\u4e2a\u90e8\u7f72\u76ee\u6807\u90fd\u6709 NVIDIA GPU\u3002\u79fb\u52a8\u5e94\u7528\u8fd0\u884c\u5728 Qualcomm Adreno \u6216 ARM Mali GPU \u4e0a\u3002Web \u5e94\u7528\u8fd0\u884c\u5728\u6d4f\u89c8\u5668\u4e2d\u3002\u6e38\u620f\u5f15\u64ce\u9700\u8981\u540c\u65f6\u652f\u6301 AMD\u3001Intel \u548c NVIDIA\u3002\u5bf9\u4e8e\u6240\u6709\u8fd9\u4e9b\u573a\u666f\uff0cVulkan \u5c31\u662f\u7b54\u6848\u3002
Vulkan \u5f88\u5197\u957f\u2014\u2014\u4e00\u4e2a\"hello world\"\u8ba1\u7b97\u7a0b\u5e8f\u5927\u7ea6\u6709 300 \u884c C++ \u4ee3\u7801\u3002\u4f46\u8fd9\u79cd\u5197\u957f\u662f \u663e\u5f0f\u63a7\u5236 \u7684\u4ee3\u4ef7\uff1a\u4f60\u9700\u8981\u81ea\u5df1\u7ba1\u7406\u6bcf\u4e00\u4e2a GPU \u8d44\u6e90\uff08\u5185\u5b58\u3001\u7ba1\u7ebf\u3001\u547d\u4ee4\u7f13\u51b2\u533a\uff09\u3002\u8fd9\u79cd\u63a7\u5236\u5e26\u6765\u4e86\u6700\u5927\u6027\u80fd\u548c\u53ef\u79fb\u690d\u6027\uff0c\u4ee3\u4ef7\u662f\u5f00\u53d1\u901f\u5ea6\u3002
Vulkan \u662f\u7531 Khronos Group\uff08OpenGL \u80cc\u540e\u7684\u540c\u4e00\u7ec4\u7ec7\uff09\u521b\u5efa\u7684\u4f4e\u7ea7 GPU API\u3002\u4e0e CUDA\uff08\u5b83\u9690\u85cf\u4e86 GPU \u8d44\u6e90\u7ba1\u7406\uff09\u4e0d\u540c\uff0cVulkan \u8981\u6c42\u4f60\u663e\u5f0f\u5730\u7ba1\u7406\uff1a
\u8fd9\u4e0e CUDA \u7684 cudaMalloc + \u5185\u6838\u542f\u52a8\u6a21\u578b\u622a\u7136\u4e0d\u540c\u3002\u5728 CUDA \u4e2d\uff0c\u9a71\u52a8\u7a0b\u5e8f\u5728\u5e55\u540e\u5904\u7406\u5927\u90e8\u5206\u5de5\u4f5c\u3002\u5728 Vulkan \u4e2d\uff0c\u4f60\u9700\u8981\u81ea\u5df1\u505a\u8fd9\u4e00\u5207\u3002
Vulkan \u7684\u663e\u5f0f\u6027\u5b58\u5728\u6709\u4e24\u65b9\u9762\u539f\u56e0\uff1a
\u9a71\u52a8\u7b80\u5316\uff1aOpenGL \u9a71\u52a8\u6781\u5176\u590d\u6742\uff08\u5b83\u4eec\u5fc5\u987b\u731c\u6d4b\u5e94\u7528\u7a0b\u5e8f\u7684\u610f\u56fe\u5e76\u8fdb\u884c\u76f8\u5e94\u4f18\u5316\uff09\u3002Vulkan \u5c06\u8be5\u8d23\u4efb\u8f6c\u79fb\u7ed9\u5e94\u7528\u7a0b\u5e8f\uff0c\u4f7f\u9a71\u52a8\u66f4\u7cbe\u7b80\u3001\u66f4\u53ef\u9884\u6d4b\uff0c\u5e76\u4e14\u66f4\u5bb9\u6613\u5728\u5404\u5382\u5546\u95f4\u6b63\u786e\u5b9e\u73b0\u3002
\u6027\u80fd\uff1a\u5bf9\u5185\u5b58\u5e03\u5c40\u3001\u540c\u6b65\u548c\u547d\u4ee4\u6279\u5904\u7406\u7684\u663e\u5f0f\u63a7\u5236\u4f7f\u5e94\u7528\u7a0b\u5e8f\u80fd\u591f\u505a\u51fa\u6700\u4f18\u51b3\u7b56\u3002\u5728 CUDA \u4e2d\uff0c\u9a71\u52a8\u53ef\u80fd\u4f1a\u63d2\u5165\u4e0d\u5fc5\u8981\u7684\u540c\u6b65\u3002\u5728 Vulkan \u4e2d\uff0c\u4f60\u53ea\u5728\u9700\u8981\u65f6\u624d\u8fdb\u884c\u540c\u6b65\u3002
// add.comp \u2014 \u7f16\u8bd1\u547d\u4ee4: glslangValidator -V add.comp -o add.spv\n#version 450\n\n// \u5de5\u4f5c\u7ec4\u5927\u5c0f\uff1a\u6bcf\u4e2a\u5de5\u4f5c\u7ec4\u6709 256 \u4e2a\u8c03\u7528\uff08= CUDA \u4e2d\u6bcf\u5757\u7684\u7ebf\u7a0b\u6570\uff09\nlayout(local_size_x = 256) in;\n\n// \u7f13\u51b2\u533a\u7ed1\u5b9a\uff08\u7c7b\u4f3c\u4e8e\u5185\u6838\u53c2\u6570\uff09\nlayout(set = 0, binding = 0) buffer InputA { float a[]; };\nlayout(set = 0, binding = 1) buffer InputB { float b[]; };\nlayout(set = 0, binding = 2) buffer Output { float c[]; };\n\n// \u63a8\u9001\u5e38\u91cf\uff1a\u5c0f\u7684\u7edf\u4e00\u6570\u636e\uff08\u7c7b\u4f3c\u4e8e\u5185\u6838\u53c2\u6570\uff09\nlayout(push_constant) uniform PushConstants {\n uint n; // \u5143\u7d20\u6570\u91cf\n};\n\nvoid main() {\n uint idx = gl_GlobalInvocationID.x; // \u5168\u5c40\u7ebf\u7a0b\u7d22\u5f15\n if (idx < n) {\n c[idx] = a[idx] + b[idx];\n }\n}\n gl_GlobalInvocationID blockIdx * blockDim + threadIdx \u5168\u5c40\u7ebf\u7a0b\u7d22\u5f15 gl_LocalInvocationID threadIdx \u5de5\u4f5c\u7ec4\u5185\u7684\u7ebf\u7a0b\u7d22\u5f15 gl_WorkGroupID blockIdx \u5de5\u4f5c\u7ec4\u7d22\u5f15 local_size_x blockDim.x \u6bcf\u5de5\u4f5c\u7ec4\u7684\u7ebf\u7a0b\u6570 \u5b58\u50a8\u7f13\u51b2\u533a \u5168\u5c40\u5185\u5b58 \u53ef\u8bfb\u5199\u7684 GPU \u5185\u5b58 \u5171\u4eab\u5185\u5b58 (shared) __shared__ \u6bcf\u5de5\u4f5c\u7ec4\u7684\u9ad8\u901f\u5185\u5b58 \u63a8\u9001\u5e38\u91cf \u5185\u6838\u53c2\u6570 \u5c0f\u7684\u7edf\u4e00\u6570\u636e"},{"location":"chapter%2016%3A%20SIMD%20and%20GPU%20programming/07.%20vulkan%20compute%20and%20cross-platform%20GPU/#relu","title":"\u4f7f\u7528\u5171\u4eab\u5185\u5b58\u7684 ReLU","text":"// relu_shared.comp\n#version 450\n\nlayout(local_size_x = 256) in;\n\nlayout(set = 0, binding = 0) buffer Input { float input_data[]; };\nlayout(set = 0, binding = 1) buffer Output { float output_data[]; };\n\nlayout(push_constant) uniform PushConstants { uint n; };\n\n// \u5171\u4eab\u5185\u5b58\uff08\u7b49\u540c\u4e8e CUDA \u7684 __shared__\uff09\nshared float tile[256];\n\nvoid main() {\n uint gid = gl_GlobalInvocationID.x;\n uint lid = gl_LocalInvocationID.x;\n\n // \u52a0\u8f7d\u5230\u5171\u4eab\u5185\u5b58\n if (gid < n) {\n tile[lid] = input_data[gid];\n }\n\n // \u5c4f\u969c\uff1a\u7b49\u5f85\u5de5\u4f5c\u7ec4\u4e2d\u6240\u6709\u8c03\u7528\u5b8c\u6210\u52a0\u8f7d\n barrier(); // \u7b49\u540c\u4e8e CUDA \u7684 __syncthreads()\n\n // \u8ba1\u7b97 ReLU\n if (gid < n) {\n output_data[gid] = max(tile[lid], 0.0);\n }\n}\n // reduce_sum.comp\n#version 450\n\nlayout(local_size_x = 256) in;\n\nlayout(set = 0, binding = 0) buffer Input { float input_data[]; };\nlayout(set = 0, binding = 1) buffer Output { float partial_sums[]; };\n\nlayout(push_constant) uniform PushConstants { uint n; };\n\nshared float sdata[256];\n\nvoid main() {\n uint gid = gl_GlobalInvocationID.x;\n uint lid = gl_LocalInvocationID.x;\n uint wgid = gl_WorkGroupID.x;\n\n // \u52a0\u8f7d\u5230\u5171\u4eab\u5185\u5b58\n sdata[lid] = (gid < n) ? input_data[gid] : 0.0;\n barrier();\n\n // \u5de5\u4f5c\u7ec4\u5185\u7684\u6811\u5f62\u5f52\u7ea6\n for (uint stride = 128; stride > 0; stride >>= 1) {\n if (lid < stride) {\n sdata[lid] += sdata[lid + stride];\n }\n barrier();\n }\n\n // \u7ebf\u7a0b 0 \u5199\u5165\u5de5\u4f5c\u7ec4\u7684\u5c40\u90e8\u548c\n if (lid == 0) {\n partial_sums[wgid] = sdata[0];\n }\n}\n // matmul_tiled.comp\n#version 450\n\n#define TILE_SIZE 16\n\nlayout(local_size_x = TILE_SIZE, local_size_y = TILE_SIZE) in;\n\nlayout(set = 0, binding = 0) buffer MatA { float A[]; };\nlayout(set = 0, binding = 1) buffer MatB { float B[]; };\nlayout(set = 0, binding = 2) buffer MatC { float C[]; };\n\nlayout(push_constant) uniform PushConstants {\n uint M, N, K;\n};\n\nshared float tileA[TILE_SIZE][TILE_SIZE];\nshared float tileB[TILE_SIZE][TILE_SIZE];\n\nvoid main() {\n uint row = gl_GlobalInvocationID.y;\n uint col = gl_GlobalInvocationID.x;\n uint lr = gl_LocalInvocationID.y;\n uint lc = gl_LocalInvocationID.x;\n\n float sum = 0.0;\n\n for (uint t = 0; t < (K + TILE_SIZE - 1) / TILE_SIZE; t++) {\n // \u5c06 A \u548c B \u7684\u5206\u5757\u52a0\u8f7d\u5230\u5171\u4eab\u5185\u5b58\u4e2d\n uint aCol = t * TILE_SIZE + lc;\n uint bRow = t * TILE_SIZE + lr;\n\n tileA[lr][lc] = (row < M && aCol < K) ? A[row * K + aCol] : 0.0;\n tileB[lr][lc] = (bRow < K && col < N) ? B[bRow * N + col] : 0.0;\n\n barrier();\n\n // \u8ba1\u7b97\u90e8\u5206\u70b9\u79ef\n for (uint k = 0; k < TILE_SIZE; k++) {\n sum += tileA[lr][k] * tileB[k][lc];\n }\n\n barrier();\n }\n\n if (row < M && col < N) {\n C[row * N + col] = sum;\n }\n}\n // vulkan_compute.cpp \u2014 \u4e00\u4e2a\u6700\u5c0f\u4f46\u5b8c\u6574\u7684 Vulkan \u8ba1\u7b97\u793a\u4f8b\n// \u7f16\u8bd1\u547d\u4ee4: g++ -O3 -o vulkan_compute vulkan_compute.cpp -lvulkan\n// \u8981\u6c42: \u5df2\u5b89\u88c5 Vulkan SDK\uff0c\u5df2\u4ece add.comp \u7f16\u8bd1 add.spv\n\n#include <vulkan/vulkan.h>\n#include <iostream>\n#include <vector>\n#include <fstream>\n#include <cassert>\n\n// \u8f85\u52a9\u51fd\u6570\uff1a\u8bfb\u53d6 SPIR-V \u6587\u4ef6\nstd::vector<uint32_t> readSPIRV(const std::string& filename) {\n std::ifstream file(filename, std::ios::ate | std::ios::binary);\n size_t fileSize = file.tellg();\n std::vector<uint32_t> buffer(fileSize / sizeof(uint32_t));\n file.seekg(0);\n file.read(reinterpret_cast<char*>(buffer.data()), fileSize);\n return buffer;\n}\n\nint main() {\n const uint32_t N = 1024;\n const size_t bufferSize = N * sizeof(float);\n\n // ========== 1. \u521b\u5efa Vulkan \u5b9e\u4f8b ==========\n VkApplicationInfo appInfo{};\n appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;\n appInfo.apiVersion = VK_API_VERSION_1_2;\n\n VkInstanceCreateInfo instanceInfo{};\n instanceInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;\n instanceInfo.pApplicationInfo = &appInfo;\n\n VkInstance instance;\n vkCreateInstance(&instanceInfo, nullptr, &instance);\n\n // ========== 2. \u9009\u62e9\u7269\u7406\u8bbe\u5907 (GPU) ==========\n uint32_t deviceCount = 0;\n vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);\n std::vector<VkPhysicalDevice> devices(deviceCount);\n vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());\n VkPhysicalDevice physicalDevice = devices[0]; // \u4f7f\u7528\u7b2c\u4e00\u4e2a GPU\n\n // \u6253\u5370 GPU \u540d\u79f0\n VkPhysicalDeviceProperties props;\n vkGetPhysicalDeviceProperties(physicalDevice, &props);\n std::cout << \"\u4f7f\u7528\u7684 GPU: \" << props.deviceName << \"\\n\";\n\n // ========== 3. \u67e5\u627e\u8ba1\u7b97\u961f\u5217\u65cf ==========\n uint32_t queueFamilyCount = 0;\n vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamilyCount, nullptr);\n std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);\n vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, &queueFamilyCount, queueFamilies.data());\n\n uint32_t computeFamily = 0;\n for (uint32_t i = 0; i < queueFamilyCount; i++) {\n if (queueFamilies[i].queueFlags & VK_QUEUE_COMPUTE_BIT) {\n computeFamily = i;\n break;\n }\n }\n\n // ========== 4. \u521b\u5efa\u903b\u8f91\u8bbe\u5907\u548c\u961f\u5217 ==========\n float queuePriority = 1.0f;\n VkDeviceQueueCreateInfo queueInfo{};\n queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;\n queueInfo.queueFamilyIndex = computeFamily;\n queueInfo.queueCount = 1;\n queueInfo.pQueuePriorities = &queuePriority;\n\n VkDeviceCreateInfo deviceInfo{};\n deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;\n deviceInfo.queueCreateInfoCount = 1;\n deviceInfo.pQueueCreateInfos = &queueInfo;\n\n VkDevice device;\n vkCreateDevice(physicalDevice, &deviceInfo, nullptr, &device);\n\n VkQueue computeQueue;\n vkGetDeviceQueue(device, computeFamily, 0, &computeQueue);\n\n // ========== 5. \u5206\u914d\u7f13\u51b2\u533a (A, B, C) ==========\n // \u4e3a\u7b80\u6d01\u8d77\u89c1\uff0c\u8fd9\u91cc\u4f7f\u7528\u4e3b\u673a\u53ef\u89c1\u5185\u5b58\uff08\u8f83\u6162\u4f46\u66f4\u7b80\u5355\uff09\n auto createBuffer = [&](VkBuffer& buffer, VkDeviceMemory& memory) {\n VkBufferCreateInfo bufInfo{};\n bufInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;\n bufInfo.size = bufferSize;\n bufInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;\n vkCreateBuffer(device, &bufInfo, nullptr, &buffer);\n\n VkMemoryRequirements memReqs;\n vkGetBufferMemoryRequirements(device, buffer, &memReqs);\n\n // \u67e5\u627e\u4e3b\u673a\u53ef\u89c1\u7684\u5185\u5b58\u7c7b\u578b\n VkPhysicalDeviceMemoryProperties memProps;\n vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProps);\n uint32_t memType = 0;\n for (uint32_t i = 0; i < memProps.memoryTypeCount; i++) {\n if ((memReqs.memoryTypeBits & (1 << i)) &&\n (memProps.memoryTypes[i].propertyFlags &\n (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT))) {\n memType = i;\n break;\n }\n }\n\n VkMemoryAllocateInfo allocInfo{};\n allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;\n allocInfo.allocationSize = memReqs.size;\n allocInfo.memoryTypeIndex = memType;\n vkAllocateMemory(device, &allocInfo, nullptr, &memory);\n vkBindBufferMemory(device, buffer, memory, 0);\n };\n\n VkBuffer bufA, bufB, bufC;\n VkDeviceMemory memA, memB, memC;\n createBuffer(bufA, memA);\n createBuffer(bufB, memB);\n createBuffer(bufC, memC);\n\n // ========== 6. \u586b\u5145\u8f93\u5165\u7f13\u51b2\u533a ==========\n float* ptrA;\n vkMapMemory(device, memA, 0, bufferSize, 0, (void**)&ptrA);\n for (uint32_t i = 0; i < N; i++) ptrA[i] = 1.0f;\n vkUnmapMemory(device, memA);\n\n float* ptrB;\n vkMapMemory(device, memB, 0, bufferSize, 0, (void**)&ptrB);\n for (uint32_t i = 0; i < N; i++) ptrB[i] = 2.0f;\n vkUnmapMemory(device, memB);\n\n // ========== 7. \u521b\u5efa\u8ba1\u7b97\u7ba1\u7ebf ==========\n auto spirvCode = readSPIRV(\"add.spv\");\n VkShaderModuleCreateInfo shaderInfo{};\n shaderInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;\n shaderInfo.codeSize = spirvCode.size() * sizeof(uint32_t);\n shaderInfo.pCode = spirvCode.data();\n VkShaderModule shaderModule;\n vkCreateShaderModule(device, &shaderInfo, nullptr, &shaderModule);\n\n // \u63cf\u8ff0\u7b26\u96c6\u5e03\u5c40\uff08\u544a\u8bc9 Vulkan \u7f13\u51b2\u533a\u7ed1\u5b9a\u7684\u4fe1\u606f\uff09\n VkDescriptorSetLayoutBinding bindings[3] = {};\n for (int i = 0; i < 3; i++) {\n bindings[i].binding = i;\n bindings[i].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n bindings[i].descriptorCount = 1;\n bindings[i].stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;\n }\n\n VkDescriptorSetLayoutCreateInfo layoutInfo{};\n layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;\n layoutInfo.bindingCount = 3;\n layoutInfo.pBindings = bindings;\n VkDescriptorSetLayout descLayout;\n vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr, &descLayout);\n\n // \u63a8\u9001\u5e38\u91cf\u8303\u56f4\n VkPushConstantRange pushRange{};\n pushRange.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;\n pushRange.offset = 0;\n pushRange.size = sizeof(uint32_t);\n\n // \u7ba1\u7ebf\u5e03\u5c40\n VkPipelineLayoutCreateInfo pipeLayoutInfo{};\n pipeLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;\n pipeLayoutInfo.setLayoutCount = 1;\n pipeLayoutInfo.pSetLayouts = &descLayout;\n pipeLayoutInfo.pushConstantRangeCount = 1;\n pipeLayoutInfo.pPushConstantRanges = &pushRange;\n VkPipelineLayout pipelineLayout;\n vkCreatePipelineLayout(device, &pipeLayoutInfo, nullptr, &pipelineLayout);\n\n // \u8ba1\u7b97\u7ba1\u7ebf\n VkComputePipelineCreateInfo pipeInfo{};\n pipeInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;\n pipeInfo.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;\n pipeInfo.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;\n pipeInfo.stage.module = shaderModule;\n pipeInfo.stage.pName = \"main\";\n pipeInfo.layout = pipelineLayout;\n VkPipeline pipeline;\n vkCreateComputePipelines(device, VK_NULL_HANDLE, 1, &pipeInfo, nullptr, &pipeline);\n\n // ========== 8. \u63cf\u8ff0\u7b26\u96c6\uff08\u5c06\u7f13\u51b2\u533a\u7ed1\u5b9a\u5230\u7740\u8272\u5668\uff09 ==========\n VkDescriptorPoolSize poolSize{};\n poolSize.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n poolSize.descriptorCount = 3;\n\n VkDescriptorPoolCreateInfo poolInfo{};\n poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;\n poolInfo.maxSets = 1;\n poolInfo.poolSizeCount = 1;\n poolInfo.pPoolSizes = &poolSize;\n VkDescriptorPool descPool;\n vkCreateDescriptorPool(device, &poolInfo, nullptr, &descPool);\n\n VkDescriptorSetAllocateInfo descAllocInfo{};\n descAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;\n descAllocInfo.descriptorPool = descPool;\n descAllocInfo.descriptorSetCount = 1;\n descAllocInfo.pSetLayouts = &descLayout;\n VkDescriptorSet descSet;\n vkAllocateDescriptorSets(device, &descAllocInfo, &descSet);\n\n // \u5c06\u7f13\u51b2\u533a\u5f15\u7528\u5199\u5165\u63cf\u8ff0\u7b26\u96c6\n VkDescriptorBufferInfo bufInfos[3] = {\n {bufA, 0, bufferSize}, {bufB, 0, bufferSize}, {bufC, 0, bufferSize}\n };\n VkWriteDescriptorSet writes[3] = {};\n for (int i = 0; i < 3; i++) {\n writes[i].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;\n writes[i].dstSet = descSet;\n writes[i].dstBinding = i;\n writes[i].descriptorCount = 1;\n writes[i].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;\n writes[i].pBufferInfo = &bufInfos[i];\n }\n vkUpdateDescriptorSets(device, 3, writes, 0, nullptr);\n\n // ========== 9. \u8bb0\u5f55\u548c\u63d0\u4ea4\u547d\u4ee4\u7f13\u51b2\u533a ==========\n VkCommandPoolCreateInfo cmdPoolInfo{};\n cmdPoolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;\n cmdPoolInfo.queueFamilyIndex = computeFamily;\n VkCommandPool cmdPool;\n vkCreateCommandPool(device, &cmdPoolInfo, nullptr, &cmdPool);\n\n VkCommandBufferAllocateInfo cmdAllocInfo{};\n cmdAllocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;\n cmdAllocInfo.commandPool = cmdPool;\n cmdAllocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;\n cmdAllocInfo.commandBufferCount = 1;\n VkCommandBuffer cmdBuf;\n vkAllocateCommandBuffers(device, &cmdAllocInfo, &cmdBuf);\n\n VkCommandBufferBeginInfo beginInfo{};\n beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;\n vkBeginCommandBuffer(cmdBuf, &beginInfo);\n\n vkCmdBindPipeline(cmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);\n vkCmdBindDescriptorSets(cmdBuf, VK_PIPELINE_BIND_POINT_COMPUTE,\n pipelineLayout, 0, 1, &descSet, 0, nullptr);\n vkCmdPushConstants(cmdBuf, pipelineLayout, VK_SHADER_STAGE_COMPUTE_BIT,\n 0, sizeof(uint32_t), &N);\n vkCmdDispatch(cmdBuf, (N + 255) / 256, 1, 1); // \u542f\u52a8\u5de5\u4f5c\u7ec4\n\n vkEndCommandBuffer(cmdBuf);\n\n // \u63d0\u4ea4\n VkFenceCreateInfo fenceInfo{};\n fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;\n VkFence fence;\n vkCreateFence(device, &fenceInfo, nullptr, &fence);\n\n VkSubmitInfo submitInfo{};\n submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;\n submitInfo.commandBufferCount = 1;\n submitInfo.pCommandBuffers = &cmdBuf;\n vkQueueSubmit(computeQueue, 1, &submitInfo, fence);\n vkWaitForFences(device, 1, &fence, VK_TRUE, UINT64_MAX);\n\n // ========== 10. \u8bfb\u53d6\u7ed3\u679c ==========\n float* ptrC;\n vkMapMemory(device, memC, 0, bufferSize, 0, (void**)&ptrC);\n std::cout << \"\u7ed3\u679c: c[0]=\" << ptrC[0] << \" c[1]=\" << ptrC[1]\n << \" (\u671f\u671b\u503c 3.0)\\n\";\n bool correct = true;\n for (uint32_t i = 0; i < N; i++) {\n if (ptrC[i] != 3.0f) { correct = false; break; }\n }\n std::cout << (correct ? \"\u5168\u90e8\u6b63\u786e\" : \"\u53d1\u73b0\u9519\u8bef\") << \"\\n\";\n vkUnmapMemory(device, memC);\n\n // ========== \u6e05\u7406\uff08\u7b80\u5199\uff09 ==========\n vkDestroyFence(device, fence, nullptr);\n vkDestroyCommandPool(device, cmdPool, nullptr);\n vkDestroyPipeline(device, pipeline, nullptr);\n vkDestroyPipelineLayout(device, pipelineLayout, nullptr);\n vkDestroyDescriptorPool(device, descPool, nullptr);\n vkDestroyDescriptorSetLayout(device, descLayout, nullptr);\n vkDestroyShaderModule(device, shaderModule, nullptr);\n vkDestroyBuffer(device, bufA, nullptr); vkFreeMemory(device, memA, nullptr);\n vkDestroyBuffer(device, bufB, nullptr); vkFreeMemory(device, memB, nullptr);\n vkDestroyBuffer(device, bufC, nullptr); vkFreeMemory(device, memC, nullptr);\n vkDestroyDevice(device, nullptr);\n vkDestroyInstance(instance, nullptr);\n\n return 0;\n}\n \u662f\u7684\uff0c\u5411\u91cf\u52a0\u6cd5\u5c31\u9700\u8981\u5927\u7ea6 200 \u884c\u4ee3\u7801\u3002 \u76f8\u6bd4\u4e4b\u4e0b CUDA \u53ea\u9700\u8981\u5927\u7ea6 30 \u884c\u3002\u8fd9\u5c31\u662f\u663e\u5f0f\u6027\u7684\u4ee3\u4ef7\u3002\u4f46\u8bf7\u6ce8\u610f\uff1a\u6bcf\u4e00\u884c\u90fd\u6709\u5176\u76ee\u7684\u3002\u6ca1\u6709\u9690\u85cf\u7684\u9a71\u52a8\u51b3\u7b56\uff0c\u6ca1\u6709\u9690\u5f0f\u540c\u6b65\uff0c\u6ca1\u6709\u610f\u5916\u7684\u5185\u5b58\u5206\u914d\u3002\u4f60\u63a7\u5236\u4e00\u5207\u3002
\u5728\u5b9e\u8df5\u4e2d\uff0c\u4f60\u53ef\u4ee5\u5c06\u8fd9\u4e9b\u6837\u677f\u4ee3\u7801\u5c01\u88c5\u5230\u8f85\u52a9\u5e93\u4e2d\uff08\u6216\u4f7f\u7528\u73b0\u6709\u7684\u5e93\uff0c\u5982 vk-bootstrap\u3001\u7528\u4e8e\u5185\u5b58\u5206\u914d\u7684 VMA\uff0c\u6216\u4e13\u6ce8\u4e8e ML \u7684 Vulkan \u8ba1\u7b97\u5e93 kompute\uff09\u3002
#include <kompute/Kompute.hpp>\n\nint main() {\n kp::Manager mgr;\n\n auto tensorA = mgr.tensor({1, 1, 1, 1, 1});\n auto tensorB = mgr.tensor({2, 2, 2, 2, 2});\n auto tensorC = mgr.tensor({0, 0, 0, 0, 0});\n\n std::string shader = R\"(\n #version 450\n layout(local_size_x = 1) in;\n layout(set=0, binding=0) buffer A { float a[]; };\n layout(set=0, binding=1) buffer B { float b[]; };\n layout(set=0, binding=2) buffer C { float c[]; };\n void main() {\n uint i = gl_GlobalInvocationID.x;\n c[i] = a[i] + b[i];\n }\n )\";\n\n auto algorithm = mgr.algorithm({tensorA, tensorB, tensorC},\n kompute::Shader::compile_source(shader));\n\n mgr.sequence()\n ->record<kp::OpTensorSyncDevice>({tensorA, tensorB, tensorC})\n ->record<kp::OpAlgoDispatch>(algorithm)\n ->record<kp::OpTensorSyncLocal>({tensorC})\n ->eval();\n\n // tensorC \u73b0\u5728\u5305\u542b [3, 3, 3, 3, 3]\n}\n WebGPU \u662f WebGL \u7684\u7ee7\u4efb\u8005\uff0c\u63d0\u4f9b\u4ece JavaScript \u8bbf\u95ee\u73b0\u4ee3 GPU \u7684\u80fd\u529b\u3002\u5b83\u57fa\u4e8e Vulkan\uff08Linux/Android\uff09\u3001Metal\uff08macOS/iOS\uff09\u548c DirectX 12\uff08Windows\uff09\u6784\u5efa\uff0c\u62bd\u8c61\u4e86\u5e73\u53f0\u5dee\u5f02\u3002
WebGPU \u4f7f\u7528 WGSL\uff08WebGPU \u7740\u8272\u8bed\u8a00\uff09\u800c\u975e GLSL\uff1a
// add.wgsl \u2014 WebGPU \u8ba1\u7b97\u7740\u8272\u5668\n@group(0) @binding(0) var<storage, read> a: array<f32>;\n@group(0) @binding(1) var<storage, read> b: array<f32>;\n@group(0) @binding(2) var<storage, read_write> c: array<f32>;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) id: vec3<u32>) {\n let i = id.x;\n c[i] = a[i] + b[i];\n}\n const adapter = await navigator.gpu.requestAdapter();\nconst device = await adapter.requestDevice();\n\n// \u521b\u5efa\u7f13\u51b2\u533a\nconst bufferA = device.createBuffer({ size: N * 4, usage: GPUBufferUsage.STORAGE, mappedAtCreation: true });\nnew Float32Array(bufferA.getMappedRange()).fill(1.0);\nbufferA.unmap();\n\n// ...\uff08B \u548c C \u7c7b\u4f3c\uff09\n\n// \u4ece WGSL \u7740\u8272\u5668\u521b\u5efa\u7ba1\u7ebf\nconst pipeline = device.createComputePipeline({\n layout: 'auto',\n compute: { module: device.createShaderModule({ code: wgslSource }), entryPoint: 'main' }\n});\n\n// \u8c03\u5ea6\nconst encoder = device.createCommandEncoder();\nconst pass = encoder.beginComputePass();\npass.setPipeline(pipeline);\npass.setBindGroup(0, bindGroup);\npass.dispatchWorkgroups(Math.ceil(N / 256));\npass.end();\ndevice.queue.submit([encoder.finish()]);\n \u7f16\u8bd1\u5e76\u8fd0\u884c\u4e0a\u9762\u7684\u5411\u91cf\u52a0\u6cd5\u793a\u4f8b\u3002\u4fee\u6539\u7740\u8272\u5668\u4ee5\u8ba1\u7b97 c[i] = a[i] * b[i] + a[i]\uff08\u878d\u5408\u4e58\u52a0\uff09\u5e76\u9a8c\u8bc1\u7ed3\u679c\u3002
\u7f16\u5199\u4e00\u4e2a\u8ba1\u7b97\u7740\u8272\u5668\uff0c\u4f7f\u7528\u5171\u4eab\u5185\u5b58\u5bf9\u4e00\u884c\u6570\u636e\u5e94\u7528 softmax\uff08\u5305\u62ec\u6700\u5927\u503c\u548c\u6c42\u548c\u5f52\u7ea6\u6b65\u9aa4\uff09\u3002\u7528\u5df2\u77e5\u503c\u8fdb\u884c\u6d4b\u8bd5\u3002
// softmax.comp \u2014 \u7f16\u8bd1\u547d\u4ee4: glslangValidator -V softmax.comp -o softmax.spv\n#version 450\n\n#define WG_SIZE 256\n\nlayout(local_size_x = WG_SIZE) in;\n\nlayout(set = 0, binding = 0) buffer Input { float input_data[]; };\nlayout(set = 0, binding = 1) buffer Output { float output_data[]; };\n\nlayout(push_constant) uniform PC { uint n; };\n\nshared float sdata[WG_SIZE];\n\nvoid main() {\n uint gid = gl_GlobalInvocationID.x;\n uint lid = gl_LocalInvocationID.x;\n\n // \u6b65\u9aa4 1\uff1a\u627e\u6700\u5927\u503c\uff08\u6570\u503c\u7a33\u5b9a\u6027\uff09\n sdata[lid] = (gid < n) ? input_data[gid] : -1e30;\n barrier();\n for (uint s = WG_SIZE / 2; s > 0; s >>= 1) {\n if (lid < s) sdata[lid] = max(sdata[lid], sdata[lid + s]);\n barrier();\n }\n float maxVal = sdata[0];\n barrier();\n\n // \u6b65\u9aa4 2\uff1a\u8ba1\u7b97 exp(x - max)\n float expVal = (gid < n) ? exp(input_data[gid] - maxVal) : 0.0;\n sdata[lid] = expVal;\n barrier();\n\n // \u6b65\u9aa4 3\uff1aexp \u503c\u6c42\u548c\n for (uint s = WG_SIZE / 2; s > 0; s >>= 1) {\n if (lid < s) sdata[lid] += sdata[lid + s];\n barrier();\n }\n float sumExp = sdata[0];\n\n // \u6b65\u9aa4 4\uff1a\u5f52\u4e00\u5316\n if (gid < n) {\n output_data[gid] = expVal / sumExp;\n }\n}\n \u91cf\u5316\u964d\u4f4e\u6a21\u578b\u6743\u91cd\u548c\u6fc0\u6d3b\u503c\u7684\u7cbe\u5ea6\uff0c\u4f7f\u6a21\u578b\u66f4\u5c0f\u3001\u66f4\u5feb\u3001\u8fd0\u884c\u6210\u672c\u66f4\u4f4e\u3002\u672c\u6587\u6db5\u76d6\u6570\u5b57\u683c\u5f0f\u3001\u8bad\u7ec3\u540e\u91cf\u5316\u3001\u91cf\u5316\u611f\u77e5\u8bad\u7ec3\u3001\u4ec5\u6743\u91cd\u91cf\u5316\u65b9\u6cd5\uff08GPTQ\u3001AWQ\uff09\u3001\u6fc0\u6d3b\u503c\u91cf\u5316\u3001\u6df7\u5408\u7cbe\u5ea6\u548cKV\u7f13\u5b58\u91cf\u5316
\u4e00\u4e2a70B\u53c2\u6570\u7684float16\u6a21\u578b\u9700\u8981140 GB\u5185\u5b58\uff0c\u8d85\u8fc7\u4efb\u4f55\u5355\u5f20GPU\u3002\u91cf\u5316\u4e3aINT4\u540e\uff0c\u5b83\u53ef\u4ee5\u88c5\u516535 GB\uff08\u4e00\u5f20A100\uff09\u751a\u81f320 GB\uff08\u5e26\u5378\u8f7d\u7684\u6d88\u8d39\u7ea7RTX 4090\uff09\u3002\u91cf\u5316\u4e0d\u662f\u4e00\u79cd\u53ef\u6709\u53ef\u65e0\u7684\u4f18\u5316\uff1b\u5b83\u662f\u8ba9\u5927\u6a21\u578b\u90e8\u7f72\u5728\u7ecf\u6d4e\u4e0a\u53ef\u884c\u7684\u5173\u952e\u3002
\u57fa\u672c\u6743\u8861\uff1a\u4f4e\u7cbe\u5ea6\u610f\u5473\u7740\u66f4\u5c11\u5185\u5b58\u3001\u66f4\u9ad8\u541e\u5410\u91cf\u548c\u66f4\u4f4e\u529f\u8017\uff0c\u4f46\u4f1a\u5f15\u5165\u91cf\u5316\u8bef\u5dee\uff0c\u53ef\u80fd\u964d\u4f4e\u6a21\u578b\u8d28\u91cf\u3002\u91cf\u5316\u7684\u827a\u672f\u5728\u4e8e\u6700\u5c0f\u5316\u8fd9\u79cd\u964d\u7ea7\u3002
\u5185\u5b58\u51cf\u5c11\uff1aINT8\u6bd4FP16\u5c0f2\u500d\uff0cINT4\u5c0f4\u500d\u3002\u5bf9\u4e8eLLM\uff0c\u6a21\u578b\u6743\u91cd\u5360\u4e3b\u5bfc\u5185\u5b58\u3002\u7cbe\u5ea6\u51cf\u534a\u610f\u5473\u7740\u5185\u5b58\u9700\u6c42\u51cf\u534a\u3002
\u541e\u5410\u91cf\u63d0\u5347\uff1a\u4f4e\u7cbe\u5ea6\u610f\u5473\u7740\u6bcf\u79d2\u66f4\u591a\u64cd\u4f5c\u3002NVIDIA Tensor Core\uff08\u7b2c16\u7ae0\uff09\u5728FP16 vs FP32\u4e0a\u5b9e\u73b02\u500d\u541e\u5410\u91cf\uff0cINT8 vs FP16\u518d\u5b9e\u73b02\u500d\uff0cINT4 vs INT8\u518d\u5b9e\u73b02\u500d\u3002H100\u5728FP8\u4e0b\u8fbe\u5230989 TFLOPS\uff0c\u800cFP32\u4e0b\u53ea\u670967 TFLOPS\u2014\u2014\u76f8\u5dee15\u500d\u3002
\u5e26\u5bbd\u8282\u7701\uff1aLLM\u63a8\u7406\u901a\u5e38\u662f\u5185\u5b58\u5e26\u5bbd\u53d7\u9650\u7684\uff08\u7b2c16\u7ae0\uff0c\u5c4b\u9876\u6a21\u578b\uff09\u3002\u74f6\u9888\u662f\u4eceGPU\u5185\u5b58\u52a0\u8f7d\u6743\u91cd\uff0c\u800c\u4e0d\u662f\u8ba1\u7b97\u3002\u66f4\u5c0f\u7684\u6743\u91cd\u610f\u5473\u7740\u66f4\u5c11\u7684\u4f20\u8f93\u5b57\u8282\uff0c\u76f4\u63a5\u63d0\u9ad8\u6bcf\u79d2token\u6570\u3002\u8fd9\u5c31\u662f\u91cf\u5316\u901a\u5e38\u80fd\u4e3aLLM\u63a8\u7406\u5e26\u6765\u8fd1\u4e4e\u7ebf\u6027\u52a0\u901f\u7684\u539f\u56e0\u3002
\u8282\u80fd\uff1a\u4f4e\u7cbe\u5ea6\u6bcf\u6b21\u64cd\u4f5c\u6d88\u8017\u66f4\u5c11\u80fd\u91cf\u3002\u5728\u6570\u636e\u4e2d\u5fc3\u89c4\u6a21\uff08\u6570\u5343GPU\uff09\u4e0b\uff0c\u8fd9\u8f6c\u5316\u4e3a\u663e\u8457\u7684\u7535\u529b\u6210\u672c\u964d\u4f4e\u3002
FP8\u6709\u4e24\u79cd\u53d8\u4f53\uff1aE4M3\uff084\u4f4d\u6307\u6570\uff0c3\u4f4d\u5c3e\u6570\uff0c\u8303\u56f4\u8f83\u7a84\u4f46\u7cbe\u5ea6\u66f4\u9ad8\uff09\u7528\u4e8e\u524d\u5411\u4f20\u64ad\uff0cE5M2\uff085\u4f4d\u6307\u6570\uff0c2\u4f4d\u5c3e\u6570\uff0c\u8303\u56f4\u66f4\u5bbd\u4f46\u7cbe\u5ea6\u8f83\u4f4e\uff09\u7528\u4e8e\u68af\u5ea6\u3002Transformer Engine\uff08\u7b2c16\u7ae0\uff09\u5728\u6bcf\u4e2a\u5f20\u91cf\u4e4b\u95f4\u81ea\u52a8\u5207\u6362\u3002
BF16 vs FP16\uff1aBF16\u5177\u6709\u4e0eFP32\u76f8\u540c\u7684\u6307\u6570\u8303\u56f4\uff08\u65e0\u6ea2\u51fa\u98ce\u9669\uff09\uff0c\u4f46\u5c3e\u6570\u7cbe\u5ea6\u8f83\u4f4e\u3002FP16\u7cbe\u5ea6\u66f4\u9ad8\u4f46\u8303\u56f4\u8f83\u7a84\uff08\u6700\u592765504\uff09\uff0c\u8bad\u7ec3\u65f6\u9700\u8981\u635f\u5931\u7f29\u653e\u3002\u5bf9\u4e8e\u63a8\u7406\uff0c\u4e24\u8005\u90fd\u8868\u73b0\u826f\u597d\uff1b\u5bf9\u4e8e\u8bad\u7ec3\uff0cBF16\u66f4\u5b89\u5168\u3002
\u6574\u6570\u683c\u5f0f\u6ca1\u6709\u6307\u6570\u2014\u2014\u5b83\u4eec\u8868\u793a\u5b9a\u70b9\u503c\u3002\u8981\u5728\u6d6e\u70b9\u548c\u6574\u6570\u4e4b\u95f4\u8f6c\u6362\uff0c\u9700\u8981\u4e00\u4e2a\u7f29\u653e\u56e0\u5b50\u548c\u4e00\u4e2a\u53ef\u9009\u7684\u96f6\u70b9\uff1a\\(x_{\\text{float}} = \\text{scale} \\times (x_{\\text{int}} - \\text{zero\\_point})\\)\u3002
\u7f29\u653e\u56e0\u5b50\u51b3\u5b9a\u5206\u8fa8\u7387\uff1a\\(\\text{scale} = \\frac{x_{\\max} - x_{\\min}}{q_{\\max} - q_{\\min}}\\)\u3002\u5bf9\u4e8eINT8\uff1a\\(q_{\\min} = -128\\)\uff0c\\(q_{\\max} = 127\\)\u3002
\u5bf9\u79f0\u91cf\u5316\u8bbe\u7f6e\\(\\text{zero\\_point} = 0\\)\uff0c\u56e0\u6b64\\(\\text{scale} = \\frac{\\max(|x|)}{127}\\)\u3002\u66f4\u7b80\u5355\u3001\u66f4\u5feb\uff08\u63a8\u7406\u65f6\u65e0\u9700\u51cf\u53bb\u96f6\u70b9\uff09\u3002
\u975e\u5bf9\u79f0\u91cf\u5316\u4f7f\u7528\u975e\u96f6\\(\\text{zero\\_point}\\)\u6765\u5904\u7406\u975e\u5bf9\u79f0\u5206\u5e03\uff08\u4f8b\u5982\uff0cReLU\u8f93\u51fa\u5168\u4e3a\u975e\u8d1f\uff09\u3002\u5c06\\([x_{\\min}, x_{\\max}]\\)\u6620\u5c04\u5230\u65e0\u7b26\u53f7INT8\u7684\\([0, 255]\\)\u3002
\u6700\u5c0f-\u6700\u5927\uff1a\u57fa\u4e8e\u89c2\u5bdf\u5230\u7684\u6700\u5c0f\u503c\u548c\u6700\u5927\u503c\u8bbe\u7f6e\u7f29\u653e\u56e0\u5b50\u3002\u7b80\u5355\u4f46\u5bb9\u6613\u53d7\u5f02\u5e38\u503c\u5f71\u54cd\uff08\u4e00\u4e2a\u6781\u7aef\u503c\u5c06\u5927\u90e8\u5206\u91cf\u5316\u8303\u56f4\u6d6a\u8d39\u5728\u5f88\u5c11\u4f7f\u7528\u7684\u503c\u4e0a\uff09\u3002
\u767e\u5206\u4f4d\u6570\uff1a\u4f7f\u752899.99\u767e\u5206\u4f4d\u6570\u800c\u4e0d\u662f\u7edd\u5bf9\u6700\u5927\u503c\u3002\u88c1\u526a\u6781\u7aef\u5f02\u5e38\u503c\uff0c\u4e3a\u5927\u591a\u6570\u503c\u63d0\u4f9b\u66f4\u597d\u7684\u5206\u8fa8\u7387\u3002\u88c1\u526a\u540e\u7684\u503c\u9971\u548c\u5230\\(q_{\\min}\\)\u6216\\(q_{\\max}\\)\u3002
MSE\u6700\u4f18\uff1a\u627e\u5230\u6700\u5c0f\u5316\u539f\u59cb\u5f20\u91cf\u548c\u91cf\u5316\u5f20\u91cf\u4e4b\u95f4\u5747\u65b9\u8bef\u5dee\u7684\u7f29\u653e\u56e0\u5b50\u3002\u8fd9\u662f\u4e00\u4e2a\u4e00\u7ef4\u4f18\u5316\uff08\u641c\u7d22\u53ef\u80fd\u7684\u88c1\u526a\u503c\uff09\uff0c\u901a\u5e38\u7ed9\u51fa\u6700\u597d\u7684PTQ\u7cbe\u5ea6\u3002
\u57fa\u4e8e\u71b5\uff08KL\u6563\u5ea6\uff09\uff1a\u627e\u5230\u6700\u5c0f\u5316\u539f\u59cb\u548c\u91cf\u5316\u503c\u5206\u5e03\u4e4b\u95f4KL\u6563\u5ea6\u7684\u7f29\u653e\u56e0\u5b50\u3002\u7528\u4e8eTensorRT\u7684INT8\u6821\u51c6\u3002
# \u4f7f\u7528PyTorch\u7684\u7b80\u5316PTQ\uff08\u6982\u5ff5\u6027\uff09\nimport torch\n\ndef quantise_tensor_symmetric(tensor, bits=8):\n qmax = 2 ** (bits - 1) - 1 # INT8\u7684127\n scale = tensor.abs().max() / qmax\n quantised = torch.clamp(torch.round(tensor / scale), -qmax, qmax).to(torch.int8)\n return quantised, scale\n\ndef dequantise(quantised, scale):\n return quantised.float() * scale\n\n# \u91cf\u5316\u4e00\u4e2a\u6743\u91cd\u77e9\u9635\nweight = torch.randn(512, 512) # \u9884\u8bad\u7ec3\u6743\u91cd\nweight_q, scale = quantise_tensor_symmetric(weight, bits=8)\nweight_reconstructed = dequantise(weight_q, scale)\n\n# \u91cf\u5316\u8bef\u5dee\nerror = (weight - weight_reconstructed).abs().mean()\nprint(f\"\u5e73\u5747\u7edd\u5bf9\u8bef\u5dee: {error:.6f}\")\nprint(f\"\u538b\u7f29\u6bd4: {weight.numel() * 4 / (weight_q.numel() * 1 + 4):.1f}x\") # +4\u5b57\u8282\u7528\u4e8e\u7f29\u653e\u56e0\u5b50\n \u6a21\u578b\u5728\u8bad\u7ec3\u8fc7\u7a0b\u4e2d\u5b66\u4f1a\u4e86\u62b5\u6297\u91cf\u5316\u566a\u58f0\u3002QAT\u901a\u5e38\u80fd\u6062\u590dPTQ\u635f\u5931\u7684\u5168\u90e8\u6216\u5927\u90e8\u5206\u7cbe\u5ea6\uff0c\u7279\u522b\u662f\u5728\u4f4e\u4f4d\u5bbd\uff08INT4\u3001INT2\uff09\u4e0b\u3002
\u6210\u672c\uff1aQAT\u9700\u8981\u91cd\u65b0\u8bad\u7ec3\uff08\u6216\u5fae\u8c03\uff09\u6a21\u578b\uff0c\u8fd9\u5bf9\u5927\u6a21\u578b\u6765\u8bf4\u6210\u672c\u9ad8\u6602\u3002\u5bf9\u4e8e\u4e00\u4e2a70B\u53c2\u6570\u6a21\u578b\uff0cQAT\u53ef\u80fd\u9700\u8981\\(10,000-\\)100,000\u7684\u8ba1\u7b97\u6210\u672c\u3002PTQ\u57fa\u672c\u4e0a\u96f6\u6210\u672c\uff08\u53ea\u9700\u6821\u51c6\uff09\u3002
\u4f55\u65f6\u4f7f\u7528QAT\uff1a\u5f53PTQ\u8d28\u91cf\u4e0d\u53ef\u63a5\u53d7\u65f6\uff08\u901a\u5e38\u662fINT4\u6216\u66f4\u4f4e\uff09\uff0c\u5f53\u90e8\u7f72\u5230\u6709\u4e25\u683c\u5ef6\u8fdf\u9884\u7b97\u7684\u8fb9\u7f18\u8bbe\u5907\u65f6\uff0c\u6216\u8005\u5f53\u6a21\u578b\u5c06\u88ab\u91cf\u5316\u6570\u767e\u4e07\u6b21\u65f6\uff08\u4e00\u6b21\u6027QAT\u6210\u672c\u88ab\u644a\u9500\uff09\u3002
\u5173\u952e\u6d1e\u5bdf\uff1a\u91cf\u5316\u7b2c\\(j\\)\u5217\u4f1a\u5f15\u5165\u8bef\u5dee\u3002GPTQ\u7acb\u5373\u901a\u8fc7\u8c03\u6574\u6240\u6709\u5269\u4f59\u5217\u6765\u8865\u507f\uff0c\u4f7f\u5f97\u8be5\u5c42\u7684\u6574\u4f53\u8f93\u51fa\uff08\\(XW\\)\uff09\u53d8\u5316\u5c3d\u53ef\u80fd\u5c0f\u3002\u8fd9\u662f\u5e94\u7528\u4e8eTransformer\u7684\u6700\u4f18\u8111\u91cf\u5316\uff08OBQ\uff09\u3002
\u4f7f\u75284\u4f4d\u7ec4\u91cf\u5316\uff08\u7ec4\u5927\u5c0f128\uff09\u7684GPTQ\u5728\u5927\u591a\u6570LLM\u4e0a\u8fbe\u5230<1%\u7684\u56f0\u60d1\u5ea6\u964d\u7ea7\u3002\u5728\u5355GPU\u4e0a\uff0c70B\u6a21\u578b\u7684\u91cf\u5316\u5927\u7ea6\u9700\u89811\u5c0f\u65f6\u3002
AWQ\uff08\u6fc0\u6d3b\u611f\u77e5\u6743\u91cd\u91cf\u5316\uff0cLin\u7b49\u4eba\uff0c2023\uff09\u89c2\u5bdf\u5230\u4e00\u5c0f\u90e8\u5206\u6743\u91cd\u901a\u9053\uff081-3%\uff09\u6bd4\u5176\u4ed6\u901a\u9053\u91cd\u8981\u5f97\u591a\u2014\u2014\u5b83\u4eec\u5bf9\u5e94\u4e8e\u5177\u6709\u5927\u5e45\u5ea6\u7684\u6fc0\u6d3b\u901a\u9053\u3002\u4fdd\u62a4\u8fd9\u4e9b\u663e\u8457\u901a\u9053\u53ef\u4ee5\u5927\u5e45\u964d\u4f4e\u91cf\u5316\u8bef\u5dee\u3002
AWQ\u5728\u91cf\u5316\u524d\u5c06\u8fd9\u4e9b\u91cd\u8981\u901a\u9053\u4e58\u4ee5\u4e00\u4e2a\u56e0\u5b50\\(s\\)\uff08\u4f7f\u5b83\u4eec\u53d8\u5927\uff0c\u56e0\u6b64\u53d7\u820d\u5165\u5f71\u54cd\u66f4\u5c0f\uff09\uff0c\u5e76\u5c06\u76f8\u5e94\u7684\u6fc0\u6d3b\u503c\u4e58\u4ee5\\(1/s\\)\uff08\u4ee5\u4fdd\u6301\u8f93\u51fa\u4e0d\u53d8\uff09\u3002\u7f29\u653e\u56e0\u5b50\\(s\\)\u6309\u7ec4\u4f18\u5316\uff0c\u4ee5\u6700\u5c0f\u5316\u6574\u4f53\u91cf\u5316\u8bef\u5dee\u3002
AWQ\u6bd4GPTQ\u66f4\u7b80\u5355\uff08\u65e0\u9700Hessian\u8ba1\u7b97\uff09\uff0c\u8fd0\u884c\u66f4\u5feb\uff0c\u5e76\u8fbe\u5230\u53ef\u6bd4\u8f83\u7684\u8d28\u91cf\u3002\u5b83\u5df2\u6210\u4e3a\u8bb8\u591a\u5f00\u6e90LLM\u91cf\u5316\u6d41\u7a0b\u7684\u9ed8\u8ba4\u9009\u62e9\u3002
GGUF\uff08GGML\u901a\u7528\u683c\u5f0f\uff09\u662fllama.cpp\u7528\u4e8eCPU\u63a8\u7406\u7684\u683c\u5f0f\u3002\u5b83\u652f\u6301\u591a\u79cd\u91cf\u5316\u65b9\u6848\uff1a
\"K\"\u53d8\u4f53\uff08k-quants\uff09\u4e3a\u91cd\u8981\u7684\u6743\u91cd\u5757\u5206\u914d\u66f4\u591a\u4f4d\uff0c\u7c7b\u4f3c\u4e8eAWQ\u7684\u6d1e\u5bdf\u4f46\u5b9e\u73b0\u5728\u683c\u5f0f\u5c42\u9762\u3002Q4_K_M\u662f\u5927\u591a\u6570\u6a21\u578b\u7684\u6700\u4f73\u9009\u62e9\uff1a\u5e73\u57474\u4f4d\uff0c\u8d28\u91cf\u635f\u5931\u6700\u5c0f\u3002
QuIP\uff08Chee\u7b49\u4eba\uff0c2023\uff09\u5f15\u5165\u4e86\u975e\u76f8\u5e72\u5904\u7406\uff1a\u5728\u91cf\u5316\u4e4b\u524d\u4f7f\u7528\u968f\u673a\u6b63\u4ea4\u53d8\u6362\u65cb\u8f6c\u6743\u91cd\u77e9\u9635\u3002\u8fd9\u4f1a\u5c06\u4fe1\u606f\u5206\u6563\u5230\u6240\u6709\u6743\u91cd\u4e0a\uff0c\u9632\u6b62\u5c11\u6570\u5f02\u5e38\u6743\u91cd\u4e3b\u5bfc\u91cf\u5316\u8bef\u5dee\u3002
\u76f4\u89c9\uff1a\u5982\u679c\u4e00\u4e2a\u6743\u91cd\u662f100\uff0c\u5176\u4f59\u7684\u5927\u7ea6\u662f1\uff0c\u7528\u76f8\u540c\u7684\u7f29\u653e\u56e0\u5b50\u91cf\u5316\u6240\u6709\u6743\u91cd\u4f1a\u6d6a\u8d39INT4\u7684\u5927\u90e8\u5206\u8303\u56f4\u5728\u5f02\u5e38\u503c\u4e0a\u3002\u7ecf\u8fc7\u6b63\u4ea4\u65cb\u8f6c\uff08\u4fdd\u6301\u77e9\u9635\u7684\u6570\u5b66\u6027\u8d28\uff09\u540e\uff0c\u6240\u6709\u6743\u91cd\u5177\u6709\u76f8\u4f3c\u5e45\u5ea6\uff0c\u5747\u5300\u91cf\u5316\u6548\u679c\u66f4\u597d\u3002
QuIP# \u901a\u8fc7\u683c\u70b9\u7801\u672c\u6269\u5c55\u4e86\u8fd9\u4e00\u601d\u60f3\uff1a\u4e0d\u662f\u6620\u5c04\u5230\u5747\u5300\u6574\u6570\u7f51\u683c\uff0c\u800c\u662f\u6620\u5c04\u5230\u6700\u4f18\u683c\u70b9\u4e2d\u7684\u70b9\uff088D\u4e2d\u7684E8\u683c\u70b9\uff09\u3002\u683c\u70b9\u7f16\u7801\u5728\u76f8\u540c\u4f4d\u6570\u5185\u6253\u5305\u66f4\u591a\u91cf\u5316\u70b9\uff0c\u5b9e\u73b0\u4e86\u6bd4\u5747\u5300\u91cf\u5316\u66f4\u597d\u7684\u7387\u5931\u771f\u6027\u80fd\u3002QuIP#\u57282\u4f4d\u7cbe\u5ea6\u4e0b\u8fbe\u5230\u4e86\u53ef\u7528\u8d28\u91cf\u2014\u2014\u5178\u578bINT4\u65b9\u6cd5\u7684\u4e00\u534a\u4f4d\u6570\u3002
SpQR\uff08Dettmers\u7b49\u4eba\uff0c2023\uff09\u89c2\u5bdf\u5230\u6781\u5c0f\u4e00\u90e8\u5206\u6743\u91cd\uff080.1-1%\uff09\u662f\u5f02\u5e38\u503c\uff0c\u5bf9\u8f93\u51fa\u8d28\u91cf\u7684\u8d21\u732e\u4e0d\u6210\u6bd4\u4f8b\u3002SpQR\u4e0d\u662f\u5c06\u6240\u6709\u5185\u5bb9\u91cf\u5316\u5230\u76f8\u540c\u7cbe\u5ea6\uff0c\u800c\u662f\uff1a
\u7ed3\u679c\uff1a~99%\u7684\u6743\u91cd\u88ab\u79ef\u6781\u91cf\u5316\uff08\u5c0f\uff09\uff0c\u800c\u5173\u952e\u76841%\u4fdd\u6301\u5168\u7cbe\u5ea6\uff08\u51c6\u786e\uff09\u3002\u7a00\u758f\u5f02\u5e38\u503c\u5b58\u50a8\u589e\u52a0\u7684\u5f00\u9500\u6700\u5c0f\uff08\u5360\u603b\u5927\u5c0f\u7684<5%\uff09\u3002
HQQ\uff08\u534a\u4e8c\u6b21\u91cf\u5316\uff0cBadri & Shaji\uff0c2023\uff09\u662f\u4e00\u79cd\u96f6\u6837\u672c\u6743\u91cd\u91cf\u5316\u65b9\u6cd5\uff0c\u5b8c\u5168\u4e0d\u9700\u8981\u6821\u51c6\u6570\u636e\u3002\u5b83\u5c06\u91cf\u5316\u8868\u8ff0\u4e3a\u4e00\u4e2a\u534a\u4e8c\u6b21\u4f18\u5316\u95ee\u9898\uff0c\u8fed\u4ee3\u6c42\u89e3\u6700\u4f18\u91cf\u5316\u6743\u91cd\u548c\u7f29\u653e\u56e0\u5b50\u3002
\u4f18\u52bf\uff1a\u65e0\u9700\u6821\u51c6\u96c6\u610f\u5473\u7740\u6ca1\u6709\u6570\u636e\u4f9d\u8d56\uff0c\u5373\u65f6\u91cf\u5316\uff0c\u4e5f\u6ca1\u6709\u6821\u51c6\u6570\u636e\u4e0d\u5339\u914d\u7684\u98ce\u9669\u3002HQQ\u5bf9\u4e8e\u65e0\u6cd5\u83b7\u5f97\u4ee3\u8868\u6027\u6821\u51c6\u6570\u636e\u6216\u6570\u636e\u654f\u611f\u578b\u7684\u6a21\u578b\u7279\u522b\u6709\u7528\u3002
BitNet\uff08Wang\u7b49\u4eba\uff0c2023\uff09\u5c06\u91cf\u5316\u63a8\u5411\u6781\u81f4\uff1a\u6743\u91cd\u662f\u4e09\u503c\u7684\uff08\\(\\{-1, 0, +1\\}\\)\uff09\uff0c\u6bcf\u4e2a\u6743\u91cd\u4ec5\u9700\u7ea61.58\u4f4d\u3002\u77e9\u9635\u4e58\u6cd5\u53d8\u6210\u53ea\u6709\u52a0\u6cd5\u548c\u51cf\u6cd5\u2014\u2014\u4e0d\u9700\u8981\u6d6e\u70b9\u4e58\u6cd5\u3002
BitNet b1.58\uff08Ma\u7b49\u4eba\uff0c2024\uff09\u5c06\u6bcf\u4e2a\u6743\u91cd\u7ea6\u675f\u4e3a\\(\\{-1, 0, +1\\}\\)\u3002\"1.58\u4f4d\"\u6765\u81ea\\(\\log_2(3) \\approx 1.58\\)\u3002\u5728\u8fd9\u4e2a\u7cbe\u5ea6\u4e0b\uff0c\u4e00\u4e2a70B\u6a21\u578b\u9002\u5408\u7ea615 GB\uff0c\u63a8\u7406\u4e0d\u9700\u8981\u4e58\u6cd5\u8fd0\u7b97\u2014\u2014\u53ea\u9700\u52a0\u3001\u51cf\u548c\u7b26\u53f7\u7ffb\u8f6c\u3002
\u77e9\u9635\u4e58\u6cd5\u53d8\u6210\uff1a
\u5728FP8\u4e2d\u8bad\u7ec3\uff08\u4e0d\u4ec5\u4ec5\u662f\u63a8\u7406\uff09\u73b0\u5728\u5728NVIDIA Hopper\u548cBlackwell GPU\u4e0a\u53ef\u884c\u3002\u65b9\u6848\u5982\u4e0b\uff1a
\u524d\u5411\u4f20\u64ad\uff1a\u6743\u91cd\u548c\u6fc0\u6d3b\u503c\u4f7f\u7528E4M3\uff08\u66f4\u9ad8\u7cbe\u5ea6\uff0c\u66f4\u7a84\u8303\u56f4\uff09\u3002Transformer Engine\u4f7f\u7528\u5ef6\u8fdf\u7f29\u653e\uff08\u8ddf\u8e2a\u4e0a\u4e00\u6b21\u8fed\u4ee3\u7684\u7edf\u8ba1\u4fe1\u606f\uff0c\u5e94\u7528\u4e8e\u5f53\u524d\u8fed\u4ee3\uff09\u52a8\u6001\u8ba1\u7b97\u6bcf\u5f20\u91cf\u7f29\u653e\u56e0\u5b50\u3002
\u53cd\u5411\u4f20\u64ad\uff1a\u68af\u5ea6\u4f7f\u7528E5M2\uff08\u66f4\u5bbd\u8303\u56f4\uff0c\u66f4\u4f4e\u7cbe\u5ea6\uff09\u3002\u68af\u5ea6\u7684\u503c\u8303\u56f4\u6bd4\u6743\u91cd/\u6fc0\u6d3b\u503c\u66f4\u5e7f\uff0c\u56e0\u6b64\u989d\u5916\u7684\u6307\u6570\u4f4d\u9632\u6b62\u6ea2\u51fa\u3002
\u4e3b\u6743\u91cd\uff1a\u4ee5FP32\u7ef4\u62a4\uff0c\u7528\u4e8e\u4f18\u5316\u5668\u72b6\u6001\uff08\u5c31\u50cf\u4f7f\u7528FP16\u7684\u6807\u51c6\u6df7\u5408\u7cbe\u5ea6\u8bad\u7ec3\uff0c\u7b2c6\u7ae0\uff09\u3002FP8\u8ba1\u7b97\u4ec5\u7528\u4e8e\u77e9\u9635\u4e58\u6cd5\uff0c\u4e0d\u7528\u4e8e\u6743\u91cd\u66f4\u65b0\u3002
\u635f\u5931\u7f29\u653e\uff1aFP8\u4ecd\u7136\u9700\u8981\uff0c\u5c31\u50cfFP16\u4e00\u6837\u3002\u52a8\u6001\u635f\u5931\u7f29\u653e\u5668\u8c03\u6574\u7f29\u653e\u56e0\u5b50\uff0c\u4f7f\u68af\u5ea6\u503c\u4fdd\u6301\u5728FP8\u7684\u53ef\u8868\u793a\u8303\u56f4\u5185\u3002
FP8\u8bad\u7ec3\u5728\u5927\u591a\u6570\u6a21\u578b\u89c4\u6a21\u4e0a\u8fbe\u5230\u4e0eBF16\u8bad\u7ec3\u76f8\u5f53\u7684\u8d28\u91cf\uff0c\u541e\u5410\u91cf\u63d0\u9ad8\u7ea62\u500d\u3002\u5b83\u662f\u5728H100\u96c6\u7fa4\u4e0a\u8fdb\u884c\u65b0\u7684\u5927\u89c4\u6a21\u8bad\u7ec3\u8fd0\u884c\u7684\u9ed8\u8ba4\u9009\u62e9\u3002
\u6fc0\u6d3b\u503c\uff08\u5c42\u4e4b\u95f4\u6d41\u52a8\u7684\u4e2d\u95f4\u5f20\u91cf\uff09\u4e5f\u53ef\u4ee5\u91cf\u5316\uff0c\u5b9e\u73b0\u5b8c\u5168INT8\u8ba1\u7b97\uff08\u6743\u91cd\u548c\u6fc0\u6d3b\u503c\u90fd\u662fINT8\uff0cINT32\u7d2f\u52a0\uff09\u3002
\u52a8\u6001\u91cf\u5316\uff1a\u5728\u8fd0\u884c\u65f6\u6839\u636e\u5b9e\u9645\u6fc0\u6d3b\u503c\u8ba1\u7b97\u7f29\u653e\u56e0\u5b50\u3002\u66f4\u51c6\u786e\uff08\u9002\u5e94\u6bcf\u4e2a\u8f93\u5165\uff09\uff0c\u4f46\u589e\u52a0\u5f00\u9500\uff08\u6bcf\u5c42\u8ba1\u7b97\u6700\u5c0f\u503c/\u6700\u5927\u503c\u6216\u767e\u5206\u4f4d\u6570\uff09\u3002
\u9759\u6001\u91cf\u5316\uff1a\u5728\u6821\u51c6\u671f\u95f4\u8ba1\u7b97\u4e00\u6b21\u7f29\u653e\u56e0\u5b50\u5e76\u56fa\u5b9a\u3002\u63a8\u7406\u65f6\u66f4\u5feb\uff08\u65e0\u9700\u8fd0\u884c\u65f6\u7edf\u8ba1\uff09\uff0c\u4f46\u5982\u679c\u6821\u51c6\u6570\u636e\u4e0d\u5177\u4ee3\u8868\u6027\u5219\u7cbe\u5ea6\u8f83\u4f4e\u3002
\u9010token\u91cf\u5316\uff1a\u4e3a\u5e8f\u5217\u4e2d\u7684\u6bcf\u4e2atoken\u8ba1\u7b97\u5355\u72ec\u7684\u7f29\u653e\u56e0\u5b50\u3002\u5bf9LLM\u81f3\u5173\u91cd\u8981\uff0c\u56e0\u4e3a\u4e0d\u540ctoken\u7684\u6fc0\u6d3b\u503c\u5e45\u5ea6\u53ef\u80fd\u5dee\u5f02\u5f88\u5927\uff08\u67d0\u4e9btoken\u7684\u6fc0\u6d3b\u503c\u6bd4\u5176\u4ed6token\u5927100\u500d\uff09\u3002
\u6fc0\u6d3b\u503c\u91cf\u5316\u6bd4\u6743\u91cd\u91cf\u5316\u66f4\u96be\uff0c\u56e0\u4e3a\u6fc0\u6d3b\u503c\u4f9d\u8d56\u4e8e\u6570\u636e\uff08\u5b83\u4eec\u968f\u6bcf\u4e2a\u8f93\u5165\u53d8\u5316\uff09\uff0c\u800c\u6743\u91cd\u662f\u56fa\u5b9a\u7684\u3002\"\u5f02\u5e38\u503c\"\u95ee\u9898\u5c24\u5176\u4e25\u91cd\uff1a\u5c11\u6570\u6fc0\u6d3b\u901a\u9053\u5177\u6709\u6781\u503c\uff08\u5e73\u5747\u503c\u7684100\u500d\uff09\uff0c\u7528\u4e0e\u6b63\u5e38\u901a\u9053\u76f8\u540c\u7684\u7f29\u653e\u56e0\u5b50\u91cf\u5316\u5b83\u4eec\u4f1a\u6d6a\u8d39\u7cbe\u5ea6\u3002
SmoothQuant\uff08Xiao\u7b49\u4eba\uff0c2022\uff09\u901a\u8fc7\u6570\u5b66\u4e0a\u5c06\u91cf\u5316\u96be\u5ea6\u4ece\u6fc0\u6d3b\u503c\uff08\u7531\u4e8e\u5f02\u5e38\u503c\u96be\u4ee5\u91cf\u5316\uff09\u8fc1\u79fb\u5230\u6743\u91cd\uff08\u6613\u4e8e\u91cf\u5316\uff09\u6765\u89e3\u51b3\u5f02\u5e38\u503c\u95ee\u9898\uff1a\u5c06\u6fc0\u6d3b\u503c\u4e58\u4ee5\\(1/s\\)\uff0c\u6743\u91cd\u4e58\u4ee5\\(s\\)\uff0c\u5176\u4e2d\\(s\\)\u5e73\u8861\u96be\u5ea6\u3002\u8f93\u51fa\\(XW = (X \\cdot \\text{diag}(s^{-1})) \\cdot (\\text{diag}(s) \\cdot W)\\)\u4fdd\u6301\u4e0d\u53d8\u3002
\u5e76\u975e\u6240\u6709\u5c42\u5bf9\u91cf\u5316\u7684\u654f\u611f\u5ea6\u76f8\u540c\u3002\u6ce8\u610f\u529b\u5c42\u901a\u5e38\u53ef\u4ee5\u5bb9\u5fcdINT4\uff0c\u800c\u5d4c\u5165\u5c42\u548c\u6700\u7ec8\u5206\u7c7b\u5668\u9700\u8981\u66f4\u9ad8\u7cbe\u5ea6\u3002
\u654f\u611f\u6027\u5206\u6790\uff1a\u9010\u5c42\u91cf\u5316\u5e76\u6d4b\u91cf\u7cbe\u5ea6\u5f71\u54cd\u3002\u654f\u611f\u6027\u9ad8\u7684\u5c42\u83b7\u5f97\u66f4\u591a\u4f4d\uff1b\u4e0d\u654f\u611f\u7684\u5c42\u83b7\u5f97\u66f4\u5c11\u4f4d\u3002
Transformer Engine\uff08\u7b2c16\u7ae0\uff0cNVIDIA Hopper\uff09\u5728\u64cd\u4f5c\u7ea7\u522b\u5b9e\u73b0\u52a8\u6001\u6df7\u5408\u7cbe\u5ea6\uff1a\u6bcf\u4e2a\u77e9\u9635\u4e58\u6cd5\u6839\u636e\u5f20\u91cf\u7edf\u8ba1\u4fe1\u606f\u5728FP8\u548cFP16\u4e4b\u95f4\u9009\u62e9\uff0c\u6700\u5927\u5316\u541e\u5410\u91cf\u540c\u65f6\u4fdd\u6301\u8d28\u91cf\u3002
\u4e00\u4e2a70B\u6a21\u578b\uff0c80\u5c42\uff0c64\u5934\uff0c128\u7ef4\u5934\uff0c\u5e8f\u5217\u957f\u5ea6128K\uff0cFP16\uff1a\\(2 \\times 80 \\times 64 \\times 128 \\times 131072 \\times 2 = 330\\) GB\u3002\u8fd9\u8d85\u8fc7\u4e86GPU\u5185\u5b58\u3002
KV\u7f13\u5b58\u91cf\u5316\u901a\u8fc7\u5c06\u7f13\u5b58\u7684\u952e\u548c\u503c\u4ee5INT8\u6216INT4\u800c\u4e0d\u662fFP16\u5b58\u50a8\u6765\u51cf\u5c11\u5185\u5b58\u3002\u91cf\u5316\u8bef\u5dee\u5728\u5e8f\u5217\u4e2d\u7d2f\u79ef\uff08\u6bcf\u4e2a\u65b0token\u5173\u6ce8\u6240\u6709\u7f13\u5b58\u7684K/V\uff09\uff0c\u4f46\u4f7f\u7528\u9010\u901a\u9053\u6216\u9010\u5934\u91cf\u5316\u540e\uff0c\u964d\u7ea7\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u3002
KV\u7f13\u5b58\u91cf\u5316\u5177\u6709\u4e58\u6cd5\u7ea7\u6536\u76ca\uff1a\u5b83\u652f\u6301\u66f4\u957f\u7684\u5e8f\u5217\uff08\u66f4\u591a\u4e0a\u4e0b\u6587\uff09\u3001\u66f4\u5927\u7684\u6279\u6b21\u5927\u5c0f\uff08\u66f4\u591a\u5e76\u53d1\u7528\u6237\uff09\u548c\u66f4\u5feb\u7684\u63a8\u7406\uff08\u52a0\u8f7d\u7f13\u5b58\u6240\u9700\u7684\u5185\u5b58\u5e26\u5bbd\u66f4\u5c11\uff09\u3002\u8fd9\u662fLLM\u670d\u52a1\u4e2d\u5f71\u54cd\u6700\u5927\u7684\u4f18\u5316\u4e4b\u4e00\u3002
\u4ece\u5934\u5b9e\u73b0\u5bf9\u79f0INT8\u91cf\u5316\u3002\u91cf\u5316\u4e00\u4e2a\u6743\u91cd\u77e9\u9635\uff0c\u53cd\u91cf\u5316\u5b83\uff0c\u5e76\u6d4b\u91cf\u4f5c\u4e3a\u503c\u5206\u5e03\u51fd\u6570\u7684\u91cd\u5efa\u8bef\u5dee\u3002
import jax.numpy as jnp\nimport jax\n\ndef quantise_int8(tensor):\n scale = jnp.max(jnp.abs(tensor)) / 127.0\n quantised = jnp.clip(jnp.round(tensor / scale), -127, 127).astype(jnp.int8)\n return quantised, scale\n\ndef dequantise(quantised, scale):\n return quantised.astype(jnp.float32) * scale\n\n# \u6b63\u5e38\u6743\u91cd\uff08\u5178\u578b\u8bad\u7ec3\u6a21\u578b\uff09\nkey = jax.random.PRNGKey(0)\nweights = jax.random.normal(key, (1024, 1024)) * 0.02\n\nq, s = quantise_int8(weights)\nrecon = dequantise(q, s)\n\nprint(f\"\u539f\u59cb: {weights.nbytes / 1024:.0f} KB\")\nprint(f\"\u91cf\u5316\u540e: {q.nbytes / 1024:.0f} KB ({weights.nbytes / q.nbytes:.0f}x \u66f4\u5c0f)\")\nprint(f\"\u5e73\u5747\u7edd\u5bf9\u8bef\u5dee: {jnp.abs(weights - recon).mean():.6f}\")\nprint(f\"\u6700\u5927\u7edd\u5bf9\u8bef\u5dee: {jnp.abs(weights - recon).max():.6f}\")\nprint(f\"\u76f8\u5bf9\u8bef\u5dee: {jnp.abs(weights - recon).mean() / jnp.abs(weights).mean():.4%}\")\n \u6f14\u793a\u5f02\u5e38\u503c\u95ee\u9898\u3002\u521b\u5efa\u5177\u6709\u51e0\u4e2a\u6781\u7aef\u901a\u9053\u7684\u6fc0\u6d3b\u503c\uff0c\u5c55\u793a\u9010\u5f20\u91cf\u91cf\u5316\u5931\u8d25\u800c\u9010\u901a\u9053\u91cf\u5316\u6210\u529f\u3002
import jax.numpy as jnp\nimport jax\n\nkey = jax.random.PRNGKey(42)\n\n# \u6fc0\u6d3b\u503c\uff1a\u5927\u591a\u6570\u901a\u9053\u6b63\u5e38\uff0c2\u4e2a\u901a\u9053\u6709100x\u5f02\u5e38\u503c\nactivations = jax.random.normal(key, (32, 512)) * 0.1\nactivations = activations.at[:, 0].set(activations[:, 0] * 100) # \u5f02\u5e38\u901a\u9053\nactivations = activations.at[:, 1].set(activations[:, 1] * 50) # \u5f02\u5e38\u901a\u9053\n\n# \u9010\u5f20\u91cf\u91cf\u5316\uff08\u6574\u4e2a\u5f20\u91cf\u4e00\u4e2a\u7f29\u653e\u56e0\u5b50\uff09\nscale_tensor = jnp.max(jnp.abs(activations)) / 127.0\nq_tensor = jnp.clip(jnp.round(activations / scale_tensor), -127, 127)\nrecon_tensor = q_tensor * scale_tensor\n\n# \u9010\u901a\u9053\u91cf\u5316\uff08\u6bcf\u901a\u9053\u4e00\u4e2a\u7f29\u653e\u56e0\u5b50\uff09\nscales_channel = jnp.max(jnp.abs(activations), axis=0) / 127.0\nq_channel = jnp.clip(jnp.round(activations / scales_channel), -127, 127)\nrecon_channel = q_channel * scales_channel\n\nerr_tensor = jnp.abs(activations - recon_tensor).mean()\nerr_channel = jnp.abs(activations - recon_channel).mean()\n\nprint(f\"\u9010\u5f20\u91cf\u8bef\u5dee: {err_tensor:.6f}\")\nprint(f\"\u9010\u901a\u9053\u8bef\u5dee: {err_channel:.6f}\")\nprint(f\"\u9010\u901a\u9053\u597d {err_tensor / err_channel:.1f}x\")\nprint(f\"\\n\u5f02\u5e38\u901a\u9053\u6d6a\u8d39\u4e86 {(activations.shape[1] - 2) / activations.shape[1]:.0%} \"\n f\"\u7684\u91cf\u5316\u8303\u56f4\u7ed9 {2 / activations.shape[1]:.1%} \u7684\u901a\u9053\")\n \u8ba1\u7b97\u4e0d\u540c\u6a21\u578b\u5927\u5c0f\u548c\u5e8f\u5217\u957f\u5ea6\u7684KV\u7f13\u5b58\u5185\u5b58\u3002\u5c55\u793a\u4e3a\u4ec0\u4e48KV\u7f13\u5b58\u91cf\u5316\u5bf9\u957f\u4e0a\u4e0b\u6587\u6a21\u578b\u81f3\u5173\u91cd\u8981\u3002
def kv_cache_gb(n_layers, n_heads, d_head, seq_len, bytes_per_elem):\n return 2 * n_layers * n_heads * d_head * seq_len * bytes_per_elem / 1e9\n\nmodels = [\n (\"Llama-7B\", 32, 32, 128),\n (\"Llama-70B\", 80, 64, 128),\n (\"GPT-4 (\u4f30\u8ba1)\", 120, 96, 128),\n]\n\nprint(f\"{'\u6a21\u578b':<15} {'\u5e8f\u5217\u957f\u5ea6':>8} {'FP16 (GB)':>10} {'INT8 (GB)':>10} {'INT4 (GB)':>10}\")\nprint(\"-\" * 60)\n\nfor name, layers, heads, d_head in models:\n for seq_len in [4096, 32768, 131072]:\n fp16 = kv_cache_gb(layers, heads, d_head, seq_len, 2)\n int8 = kv_cache_gb(layers, heads, d_head, seq_len, 1)\n int4 = kv_cache_gb(layers, heads, d_head, seq_len, 0.5)\n print(f\"{name:<15} {seq_len:>8} {fp16:>9.1f} {int8:>9.1f} {int4:>9.1f}\")\n print()\n \u8ba9\u6a21\u578b\u66f4\u5feb\u4e0d\u4ec5\u4ec5\u662f\u964d\u4f4e\u7cbe\u5ea6\uff0c\u8fd8\u5728\u4e8e\u8bbe\u8ba1\u66f4\u667a\u80fd\u7684\u67b6\u6784\uff0c\u4f7f\u6bcf\u4e2atoken\u7684\u8ba1\u7b97\u91cf\u66f4\u5c11\u3002\u672c\u6587\u6db5\u76d6StreamingLLM\u3001\u7a00\u758f\u548c\u7ebf\u6027\u6ce8\u610f\u529b\u3001\u591a\u67e5\u8be2\u548c\u5206\u7ec4\u67e5\u8be2\u6ce8\u610f\u529b\u3001\u63a8\u7406\u65f6\u7684\u6df7\u5408\u4e13\u5bb6\u3001\u77e5\u8bc6\u84b8\u998f\u3001\u526a\u679d\u548c\u795e\u7ecf\u67b6\u6784\u641c\u7d22
\u6807\u51c6Transformer\u5c06\u6240\u6709\u5148\u524d\u7684token\u5b58\u50a8\u5728KV\u7f13\u5b58\u4e2d\uff0cKV\u7f13\u5b58\u968f\u5e8f\u5217\u957f\u5ea6\u7ebf\u6027\u589e\u957f\u3002\u5728\u67d0\u4e00\u70b9\u4e0a\uff0c\u7f13\u5b58\u8d85\u8fc7GPU\u5185\u5b58\uff0c\u751f\u6210\u5931\u8d25\u3002StreamingLLM\uff08Xiao\u7b49\u4eba\uff0c2023\uff09\u4f7f\u7528\u56fa\u5b9a\u5927\u5c0f\u7684\u6eda\u52a8KV\u7f13\u5b58\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\u3002
\u5173\u952e\u89c2\u5bdf\uff1a\u5e8f\u5217\u4e2d\u7684\u524d\u51e0\u4e2atoken\uff0c\u65e0\u8bba\u5176\u5185\u5bb9\u5982\u4f55\uff0c\u90fd\u83b7\u5f97\u4e0d\u6210\u6bd4\u4f8b\u7684\u9ad8\u6ce8\u610f\u529b\u5206\u6570\u3002\u8fd9\u4e9b\u88ab\u79f0\u4e3a\u6ce8\u610f\u529b\u6c47\u805a\u70b9\u3002\u5982\u679c\u5c06\u5b83\u4eec\u4ece\u7f13\u5b58\u4e2d\u9010\u51fa\uff0c\u6ce8\u610f\u529b\u5206\u5e03\u4f1a\u5d29\u6e83\uff0c\u751f\u6210\u8d28\u91cf\u707e\u96be\u6027\u4e0b\u964d\u3002
StreamingLLM\u7684\u89e3\u51b3\u65b9\u6848\uff1a\u5728\u7f13\u5b58\u4e2d\u6c38\u4e45\u4fdd\u7559\u5c11\u91cf\u6c47\u805atoken\uff08\u524d1-4\u4e2atoken\uff09\uff0c\u52a0\u4e0a\u6700\u8fd1\\(w\\)\u4e2atoken\u7684\u6eda\u52a8\u7a97\u53e3\u3002\u603b\u7f13\u5b58\u5927\u5c0f\u4e3a\\(\\text{sink} + w\\)\uff0c\u65e0\u8bba\u751f\u6210\u4e86\u591a\u5c11token\u90fd\u662f\u56fa\u5b9a\u7684\u3002
\u6ce8\u610f\u529b\u6c47\u805a\u70b9\u951a\u5b9asoftmax\u5206\u5e03\uff0c\u6eda\u52a8\u7a97\u53e3\u63d0\u4f9b\u6700\u8fd1\u7684\u4e0a\u4e0b\u6587\u3002\u8fd9\u5b9e\u73b0\u4e86\u65e0\u9650\u957f\u5ea6\u751f\u6210\uff0c\u5185\u5b58\u6052\u5b9a\uff0c\u4ee3\u4ef7\u662f\u5931\u53bb\u4e86\u8bbf\u95ee\u5e8f\u5217\u4e2d\u95f4\u4e0a\u4e0b\u6587\u7684\u80fd\u529b\u3002
StreamingLLM\u65e0\u9700\u91cd\u65b0\u8bad\u7ec3\u5373\u53ef\u7528\u4e8e\u81ea\u7136\u5f62\u6210\u6ce8\u610f\u529b\u6c47\u805a\u70b9\u7684\u6a21\u578b\uff08\u5927\u591a\u6570\u9884\u8bad\u7ec3LLM\u90fd\u4f1a\uff09\u3002\u5bf9\u4e8e\u4e0d\u5f62\u6210\u6c47\u805a\u70b9\u7684\u6a21\u578b\uff0c\u5728\u8bad\u7ec3\u671f\u95f4\u6dfb\u52a0\u4e00\u4e2a\u53ef\u5b66\u4e60\u7684\u6c47\u805atoken\u5373\u53ef\u89e3\u51b3\u3002
\u6ed1\u52a8\u7a97\u53e3\u6ce8\u610f\u529b\uff08Mistral\u3001Gemma\uff09\uff1a\u6bcf\u4e2atoken\u53ea\u5173\u6ce8\u4e4b\u524d\\(w\\)\u4e2atoken\uff08\u4f8b\u5982\\(w = 4096\\)\uff09\u3002\u6ce8\u610f\u529b\u662f\\(O(n \\cdot w)\\)\u800c\u4e0d\u662f\\(O(n^2)\\)\u3002\u4fe1\u606f\u901a\u8fc7\u591a\u5c42\u5728\u7a97\u53e3\u4e4b\u5916\u4f20\u64ad\uff1a\u7ecf\u8fc7\\(L\\)\u5c42\u540e\uff0c\u6709\u6548\u4e0a\u4e0b\u6587\u4e3a\\(L \\times w\\)\u3002
\u5c40\u90e8+\u5168\u5c40\u6ce8\u610f\u529b\uff08Longformer\u3001BigBird\uff09\uff1a\u5927\u591a\u6570token\u4f7f\u7528\u6ed1\u52a8\u7a97\u53e3\u6ce8\u610f\u529b\uff08\u5c40\u90e8\uff09\uff0c\u4f46\u5c11\u6570\u6307\u5b9atoken\uff08\u4f8b\u5982[CLS]\uff0c\u6bcf512\u4e2atoken\uff09\u5173\u6ce8\u6240\u6709token\uff08\u5168\u5c40\uff09\u3002\u8fd9\u540c\u65f6\u6355\u83b7\u4e86\u5c40\u90e8\u6a21\u5f0f\u548c\u957f\u8ddd\u79bb\u4f9d\u8d56\u3002
\u81a8\u80c0\u6ce8\u610f\u529b\uff1a\u5173\u6ce8\u7a97\u53e3\u5185\u6bcf\u7b2c\\(k\\)\u4e2atoken\uff0c\u521b\u5efa\u4e00\u4e2a\u8986\u76d6\u66f4\u5927\u8303\u56f4\u4f46\u6ce8\u610f\u529b\u5206\u6570\u6570\u91cf\u76f8\u540c\u7684\u7a00\u758f\u6a21\u5f0f\u3002\u8de8\u5c42\u589e\u52a0\u81a8\u80c0\u5ea6\u521b\u5efa\u7c7b\u4f3c\u4e8e\u81a8\u80c0\u5377\u79ef\u7684\u5c42\u6b21\u7ed3\u6784\uff08\u7b2c8\u7ae0\uff09\u3002
\u73b0\u4ee3LLM\u7684\u5b9e\u9645\u80dc\u8005\u662f\u6ed1\u52a8\u7a97\u53e3+\u5168\u6ce8\u610f\u529b\u4ea4\u9519\uff1a\u67d0\u4e9b\u5c42\u4f7f\u7528\u6ed1\u52a8\u7a97\u53e3\uff08\u5ec9\u4ef7\uff0c\u5904\u7406\u5c40\u90e8\u4e0a\u4e0b\u6587\uff09\uff0c\u67d0\u4e9b\u5c42\u4f7f\u7528\u5168\u6ce8\u610f\u529b\uff08\u6602\u8d35\uff0c\u6355\u83b7\u957f\u8ddd\u79bb\uff09\u3002Mistral/Mixtral\u4f7f\u7528\u8fd9\u79cd\u6a21\u5f0f\u3002
\u6211\u4eec\u80fd\u5b8c\u5168\u66ff\u6362\\(O(n^2)\\)\u7684\u6ce8\u610f\u529b\u5417\uff1f\u7ebf\u6027\u6ce8\u610f\u529b\u548c\u72b6\u6001\u7a7a\u95f4\u6a21\u578b\uff08SSM\uff09\u901a\u8fc7\u907f\u514d\u663e\u5f0f\u6ce8\u610f\u529b\u77e9\u9635\uff0c\u4ee5\\(O(n)\\)\u65f6\u95f4\u5904\u7406\u5e8f\u5217\u3002
\u7ebf\u6027\u6ce8\u610f\u529b\u7528\u6838\u8fd1\u4f3c\u66ff\u6362softmax\u6ce8\u610f\u529b\uff1a
\u901a\u8fc7\u5148\u5173\u8054\\(K^T V\\)\u4e58\u79ef\uff08\u8fd9\u662f\\(d \\times d\\)\uff0c\u4e0e\u5e8f\u5217\u957f\u5ea6\u65e0\u5173\uff09\uff0c\u8ba1\u7b97\u53d8\u6210\\(O(n \\cdot d^2)\\)\u800c\u4e0d\u662f\\(O(n^2 \\cdot d)\\)\u3002\u5bf9\u4e8e\\(n \\gg d\\)\u7684\u957f\u5e8f\u5217\uff0c\u8fd9\u662f\u5de8\u5927\u7684\u8282\u7701\u3002
RWKV\u7ed3\u5408\u4e86RNN\u548cTransformer\u7684\u601d\u60f3\u3002\u5b83\u4f7f\u7528\u5faa\u73af\u516c\u5f0f\u987a\u5e8f\u5904\u7406token\uff08\u50cfRNN\uff09\uff0c\u4f46\u53ef\u4ee5\u5728\u8bad\u7ec3\u65f6\u5e76\u884c\u5316\uff08\u50cfTransformer\uff09\u3002\u63a8\u7406\u662f\u6bcf\u4e2atoken \\(O(1)\\)\uff08\u5e38\u91cf\u5185\u5b58\uff0cKV\u7f13\u5b58\u4e0d\u589e\u957f\uff09\u3002
Mamba\uff08Gu & Dao\uff0c2023\uff09\u662f\u4e00\u79cd\u9009\u62e9\u6027\u72b6\u6001\u7a7a\u95f4\u6a21\u578b\u3002\u5b83\u901a\u8fc7\u5b66\u4e60\u5230\u7684\u72b6\u6001\u8f6c\u6362\u5904\u7406\u5e8f\u5217\uff1a
\u5176\u4e2d\\(\\bar{A}\\)\u548c\\(\\bar{B}\\)\u662f\u4f9d\u8d56\u4e8e\u8f93\u5165\u7684\uff08\u9009\u62e9\u6027\uff09\uff0c\u5141\u8bb8Mamba\u52a8\u6001\u5173\u6ce8\u6216\u5ffd\u7565\u8f93\u5165\u7684\u90e8\u5206\u3002\u4e0e\u56fa\u5b9aSSM\u4e0d\u540c\uff0c\u9009\u62e9\u6027\u4f7fMamba\u5728\u8bed\u8a00\u4efb\u52a1\u4e0a\u4e0eTransformer\u5177\u6709\u7ade\u4e89\u529b\uff0c\u540c\u65f6\u4fdd\u6301\\(O(n)\\)\u7684\u6269\u5c55\u6027\u3002
\u6743\u8861\uff1a\u7ebf\u6027\u6ce8\u610f\u529b\u548cSSM\u5bf9\u957f\u5e8f\u5217\u66f4\u5feb\uff0c\u4f46\u5bf9\u4e8e\u9700\u8981\u7cbe\u786e\u957f\u8ddd\u79bb\u68c0\u7d22\u7684\u4efb\u52a1\uff0c\u901a\u5e38\u4e0d\u5982\u5168\u6ce8\u610f\u529b\u3002\u6df7\u5408\u67b6\u6784\uff08\u4e00\u4e9bTransformer\u5c42+\u4e00\u4e9bMamba\u5c42\uff09\u901a\u5e38\u80fd\u63d0\u4f9b\u4e24\u5168\u5176\u7f8e\u7684\u6548\u679c\u3002
\u6807\u51c6\u591a\u5934\u6ce8\u610f\u529b\uff08MHA\uff0c\u7b2c7\u7ae0\uff09\u4e3a\u6bcf\u4e2a\u5934\u4f7f\u7528\u72ec\u7acb\u7684\\(K\\)\u3001\\(V\\)\u6295\u5f71\u3002\u5bf9\u4e8e\\(h\\)\u4e2ahead\uff0cKV\u7f13\u5b58\u4e2d\u6709\\(h\\)\u4e2a\u72ec\u7acb\u7684\u952e\u548c\u503c\u5f20\u91cf\u3002\u591a\u67e5\u8be2\u6ce8\u610f\u529b\uff08MQA\uff09\u548c\u5206\u7ec4\u67e5\u8be2\u6ce8\u610f\u529b\uff08GQA\uff09\u51cf\u5c11\u4e86\u8fd9\u4e2a\u6570\u91cf\u3002
MQA\uff08Shazeer\uff0c2019\uff09\uff1a\u6240\u6709\u5934\u5171\u4eab\u5355\u7ec4\\(K, V\\)\u6295\u5f71\u3002\u6bcf\u4e2a\u5934\u4ecd\u7136\u6709\u81ea\u5df1\u7684\\(Q\\)\u6295\u5f71\u3002KV\u7f13\u5b58\u7f29\u5c0f\u4e86\\(h\\)\u500d\uff08\u4f8b\u5982\uff0c32\u4e2a\u5934\u5219\u7f29\u5c0f32\u500d\uff09\u3002
GQA\uff08Ainslie\u7b49\u4eba\uff0c2023\uff09\uff1a\u4e00\u4e2a\u4e2d\u95f4\u65b9\u6848\u3002\u5934\u88ab\u5206\u7ec4\uff0c\u6bcf\u7ec4\u5171\u4eab\u4e00\u7ec4\\(K, V\\)\u6295\u5f71\u3002\u6709\\(h = 32\\)\u4e2a\u5934\u548c\\(g = 8\\)\u4e2a\u7ec4\uff0c\u6bcf\u7ec44\u4e2a\u5934\u5171\u4eabK/V\u3002KV\u7f13\u5b58\u7f29\u5c0f\u4e86\\(h/g = 4\\)\u500d\u3002
\u538b\u7f29\u5411\u91cf\\(\\mathbf{c}_t\\)\u6bd4\u539f\u59cbK\u548cV\u7684\u7ec4\u5408\u5c0f\u5f97\u591a\u3002DeepSeek-V2\u5b9e\u73b0\u4e86\u4e0eMHA\u76f8\u6bd493.3%\u7684KV\u7f13\u5b58\u5927\u5c0f\u51cf\u5c11\uff0c\u751a\u81f3\u4f18\u4e8eMQA\uff0c\u540c\u65f6\u4fdd\u6301MHA\u7ea7\u522b\u7684\u8d28\u91cf\u3002
\u6743\u8861\uff1a\u4ece\u6f5c\u5728\u5411\u91cf\u91cd\u6784K/V\u5728\u6bcf\u4e2a\u6ce8\u610f\u529b\u64cd\u4f5c\u4e2d\u589e\u52a0\u4e86\u5c11\u91cf\u8ba1\u7b97\u6210\u672c\u3002\u4f46\u7531\u4e8eLLM\u89e3\u7801\u662f\u5185\u5b58\u5e26\u5bbd\u53d7\u9650\u7684\uff08\u800c\u975e\u8ba1\u7b97\u53d7\u9650\uff09\uff0c\u8fd9\u603b\u4f53\u4e0a\u662f\u4e2a\u51c0\u6536\u76ca\uff1a\u66f4\u5c11\u7684\u5185\u5b58\u52a0\u8f7d > \u6bcftoken\u7a0d\u591a\u8ba1\u7b97\u3002
Flash Attention\uff08Dao\u7b49\u4eba\uff0c2022\uff0c\u7b2c16\u7ae0\u6587\u4ef605\u6709\u8be6\u7ec6\u8bba\u8ff0\uff09\u4e0d\u662f\u67b6\u6784\u53d8\u5316\uff0c\u800c\u662f\u4e00\u79cd\u5b9e\u73b0\u4f18\u5316\uff0c\u5728\u4efb\u4f55\u9ad8\u6548\u6ce8\u610f\u529b\u8ba8\u8bba\u4e2d\u90fd\u4e0d\u53ef\u6216\u7f3a\u3002\u5b83\u8ba1\u7b97\u7cbe\u786e\u7684\u6807\u51c6\u6ce8\u610f\u529b\uff0c\u5177\u6709\u4ee5\u4e0b\u7279\u70b9\uff1a
Flash Attention\u73b0\u5728\u662fPyTorch\uff08torch.nn.functional.scaled_dot_product_attention\uff09\u3001JAX\u548c\u6240\u6709\u4e3b\u8981\u63a8\u7406\u6846\u67b6\u4e2d\u9ed8\u8ba4\u7684\u6ce8\u610f\u529b\u5b9e\u73b0\u3002\u5982\u679c\u4f60\u57282024+\u5e74\u8fd0\u884c\u6ce8\u610f\u529b\uff0c\u4f60\u51e0\u4e4e\u80af\u5b9a\u5728\u4f7f\u7528Flash Attention\u3002
Ring Attention\uff08Liu\u7b49\u4eba\uff0c2023\uff09\u5c06\u6ce8\u610f\u529b\u8ba1\u7b97\u5206\u5e03\u5230\u591a\u4e2a\u8bbe\u5907\u4e0a\uff0c\u7528\u4e8e\u5373\u4f7f\u4f7f\u7528Flash Attention\u4e5f\u65e0\u6cd5\u88c5\u5165\u5355GPU\u5185\u5b58\u7684\u957f\u5e8f\u5217\u3002
\u601d\u8def\uff1a\u5c06\u5e8f\u5217\u5206\u533a\u5230\\(N\\)\u4e2a\u8bbe\u5907\u4e0a\u3002\u6bcf\u4e2a\u8bbe\u5907\u6301\u6709\\(n/N\\)\u4e2atoken\u7684Q\u3001K\u3001V\u3002\u8bbe\u5907\u6392\u5217\u6210\u73af\u5f62\u3002\u6bcf\u4e00\u6b65\uff1a
\u901a\u4fe1\u4e0e\u8ba1\u7b97\u91cd\u53e0\uff1a\u5728\u5f53\u524dK/V\u5757\u4e0a\u8ba1\u7b97\u6ce8\u610f\u529b\u7684\u540c\u65f6\uff0c\u4e0b\u4e00\u4e2a\u5757\u6b63\u5728\u4f20\u8f93\u4e2d\u3002\u8fd9\u51e0\u4e4e\u5b8c\u5168\u9690\u85cf\u4e86\u901a\u4fe1\u5ef6\u8fdf\u3002
Ring Attention\u901a\u8fc7\u5c06KV\u7f13\u5b58\u5206\u5e03\u5728\u4e00\u5708GPU\u4e0a\uff0c\u5b9e\u73b0\u4e86\u767e\u4e07token\u4e0a\u4e0b\u6587\u7a97\u53e3\u3002\u6bcf\u53f0\u8bbe\u5907\u7684\u5185\u5b58\u4e3aO(n/N)\uff0c\u4f7f\u5f97\u4efb\u610f\u957f\u5e8f\u5217\u90fd\u53ef\u884c\uff08\u4ec5\u53d7\u8bbe\u5907\u6570\u91cf\u9650\u5236\uff09\u3002
MoE\u6a21\u578b\uff08\u7b2c7\u7ae0\uff09\u6bcf\u4e2atoken\u53ea\u6fc0\u6d3b\u5176\u53c2\u6570\u7684\u4e00\u5c0f\u90e8\u5206\uff08\u901a\u5e388\u4e2a\u4e13\u5bb6\u4e2d\u76842\u4e2a\uff09\u3002\u5728\u63a8\u7406\u65f6\uff0c\u72ec\u7279\u7684\u6311\u6218\u662f\u4e13\u5bb6\u7f13\u5b58\uff1a\u6240\u6709\u4e13\u5bb6\u90fd\u5fc5\u987b\u5728\u5185\u5b58\u4e2d\uff08\u56e0\u4e3a\u4efb\u4f55token\u53ef\u80fd\u8def\u7531\u5230\u4efb\u4f55\u4e13\u5bb6\uff09\uff0c\u4f46\u6bcf\u4e2atoken\u53ea\u67092\u4e2a\u6d3b\u8dc3\u3002
\u5bf9\u4e8eMixtral 8x7B\u6a21\u578b\uff1a\u603b\u53c2\u6570 = 47B\uff088 \u00d7 7B\u4e13\u5bb6\uff0c\u4f46\u6709\u5171\u4eab\u7ec4\u4ef6\uff09\u3002\u6bcf\u4e2atoken\u7684\u6d3b\u8dc3\u53c2\u6570 \u2248 13B\uff082\u4e2a\u4e13\u5bb6 + \u5171\u4eab\u5c42\uff09\u3002\u8be5\u6a21\u578b\u5177\u6709LLM-70B\u7ea7\u522b\u7684\u8d28\u91cf\uff0c\u4f46\u63a8\u7406\u6210\u672c\u4e3aLLM-13B\u7ea7\u522b\uff0c\u4e0d\u8fc7\u9700\u8981\u5728\u5185\u5b58\u4e2d\u4fdd\u755947B\u53c2\u6570\u3002
\u4e13\u5bb6\u5378\u8f7d\uff1a\u5bf9\u4e8eGPU\u5185\u5b58\u53d7\u9650\u7684\u90e8\u7f72\uff0c\u5c06\u975e\u6d3b\u8dc3\u4e13\u5bb6\u4fdd\u7559\u5728CPU\u6216SSD\u4e0a\uff0c\u6309\u9700\u52a0\u8f7d\u3002\u8fd9\u4e4b\u6240\u4ee5\u6709\u6548\uff0c\u662f\u56e0\u4e3atoken\u8def\u7531\u8db3\u591f\u53ef\u9884\u6d4b\uff0c\u53ef\u4ee5\u9884\u53d6\u53ef\u80fd\u7684\u4e13\u5bb6\u3002
\u4e13\u5bb6\u7f13\u5b58\uff1a\u5728GPU\u5185\u5b58\u4e2d\u7ef4\u62a4\u6700\u8fd1\u4f7f\u7528\u7684\u4e13\u5bb6\u7684LRU\u7f13\u5b58\u3002\u5982\u679c\u76f8\u540c\u7684\u4e13\u5bb6\u88ab\u91cd\u590d\u6fc0\u6d3b\uff08\u5728\u9886\u57df\u5185\u6570\u636e\u4e2d\u5e38\u89c1\uff09\uff0c\u7f13\u5b58\u547d\u4e2d\u7387\u5f88\u9ad8\u3002
\u5176\u4e2d\\(T\\)\u662f\u6e29\u5ea6\uff08\u66f4\u9ad8\u7684\\(T\\)\u4f7f\u5206\u5e03\u53d8\u8f6f\uff0c\u63ed\u793a\u6559\u5e08\u7684\u4e0d\u786e\u5b9a\u6027\uff09\uff0c\\(\\alpha\\)\u5e73\u8861\u84b8\u998f\u635f\u5931\u4e0e\u6807\u51c6\u4ea4\u53c9\u71b5\u635f\u5931\u3002
\u5bf9\u4e8eLLM\uff1a\u84b8\u998f\u7528\u4e8e\u4ece\u5927\u578b\u3001\u80fd\u529b\u5f3a\u7684\u6a21\u578b\u521b\u5efa\u5c0f\u578b\u3001\u5feb\u901f\u7684\u6a21\u578b\u3002GPT-4 \u2192 \u4e00\u4e2a7B\u5b66\u751f\u6a21\u578b\uff0c\u5728\u7279\u5b9a\u4efb\u52a1\u4e0a\u6355\u83b7GPT-4\u7684\u5927\u90e8\u5206\u884c\u4e3a\u3002\u5b66\u751f\u6a21\u578b\u7684\u63a8\u7406\u6210\u672c\u53ef\u4ee5\u4f4e10-100\u500d\u3002
\u4efb\u52a1\u7279\u5b9a\u84b8\u998f\uff1a\u4ec5\u5728\u4e0e\u90e8\u7f72\u4efb\u52a1\u76f8\u5173\u7684\u6570\u636e\u4e0a\u8fdb\u884c\u84b8\u998f\u3002\u4ece70B\u6559\u5e08\u6a21\u578b\u5728\u533b\u7597\u95ee\u7b54\u4e0a\u84b8\u998f\u51fa\u76847B\u6a21\u578b\uff0c\u5728\u8be5\u7279\u5b9a\u4efb\u52a1\u4e0a\u53ef\u4ee5\u8d85\u8d8a70B\u6a21\u578b\uff08\u56e0\u4e3a\u5b66\u751f\u6709\u9650\u7684\u5bb9\u91cf\u5b8c\u5168\u96c6\u4e2d\u5728\u76ee\u6807\u9886\u57df\u4e0a\uff09\u3002
\u526a\u679d\u79fb\u9664\u4e0d\u5fc5\u8981\u7684\u6743\u91cd\uff08\u5c06\u5176\u8bbe\u4e3a\u96f6\uff09\uff0c\u51cf\u5c11\u6a21\u578b\u5927\u5c0f\u548c\u8ba1\u7b97\u91cf\u3002
\u975e\u7ed3\u6784\u5316\u526a\u679d\uff08\u57fa\u4e8e\u5e45\u503c\uff09\uff1a\u79fb\u9664\u7edd\u5bf9\u503c\u6700\u5c0f\u7684\u5355\u4e2a\u6743\u91cd\u3002\u8fd9\u521b\u5efa\u4e86\u7a00\u758f\u6743\u91cd\u77e9\u9635\u3002\u7b80\u5355\u6709\u6548\u7528\u4e8e\u538b\u7f29\uff0c\u4f46\u5f53\u524d\u786c\u4ef6\uff08GPU\uff09\u9664\u975e\u7a00\u758f\u6027\u9075\u5faa\u7279\u5b9a\u6a21\u5f0f\uff0c\u5426\u5219\u65e0\u6cd5\u9ad8\u6548\u52a0\u901f\u7a00\u758f\u64cd\u4f5c\u3002
\u7ed3\u6784\u5316\u526a\u679d\uff1a\u79fb\u9664\u6574\u4e2a\u5355\u5143\u2014\u2014\u6ce8\u610f\u529b\u5934\u3001MLP\u795e\u7ecf\u5143\u6216\u5c42\u3002\u8fd9\u4ea7\u751f\u4e00\u4e2a\u66f4\u5c0f\u7684\u7a20\u5bc6\u6a21\u578b\uff0c\u53ef\u4ee5\u5728\u6807\u51c6\u786c\u4ef6\u4e0a\u76f4\u63a5\u52a0\u901f\u3002\u6743\u8861\u662f\u7c92\u5ea6\u66f4\u7c97\uff08\u79fb\u9664\u4e00\u4e2a\u5b8c\u6574\u7684\u5934\u53ef\u80fd\u540c\u65f6\u79fb\u9664\u4e86\u6709\u7528\u548c\u65e0\u7528\u7684\u6743\u91cd\uff09\u3002
2:4\u7a00\u758f\u6027\uff08NVIDIA Ampere+\uff09\uff1a\u4e00\u79cd\u786c\u4ef6\u652f\u6301\u7684\u7a00\u758f\u6a21\u5f0f\uff0c\u6bcf4\u4e2a\u6743\u91cd\u4e2d\u67092\u4e2a\u4e3a\u96f6\u3002GPU\u7684\u7a00\u758fTensor Core\u8df3\u8fc7\u96f6\u4e58\u6cd5\uff0c\u5b9e\u73b0\u7ea62\u500d\u52a0\u901f\u3002\u8fd9\u662f\u76ee\u524d\u552f\u4e00\u5177\u6709\u5b9e\u9645\u786c\u4ef6\u52a0\u901f\u7684\u7a00\u758f\u6a21\u5f0f\u3002
\u5f69\u7968\u5047\u8bf4\uff08Frankle & Carlin\uff0c2019\uff09\uff1a\u5728\u968f\u673a\u521d\u59cb\u5316\u7684\u7f51\u7edc\u4e2d\uff0c\u5b58\u5728\u4e00\u4e2a\u5b50\u7f51\u7edc\uff08\"\u4e2d\u5956\u5f69\u7968\"\uff09\uff0c\u53ef\u4ee5\u5355\u72ec\u8bad\u7ec3\u4ee5\u5339\u914d\u5b8c\u6574\u7f51\u7edc\u7684\u6027\u80fd\u3002\u627e\u5230\u8fd9\u4e9b\u5b50\u7f51\u7edc\uff08\u901a\u8fc7\u8bad\u7ec3\u3001\u526a\u679d\u548c\u91cd\u7f6e\uff09\u6210\u672c\u9ad8\u6602\uff0c\u4f46\u8fd9\u4e2a\u6d1e\u5bdf\u6fc0\u52b1\u4e86\u526a\u679d\u7814\u7a76\u3002
NAS\u901a\u8fc7\u641c\u7d22\u53ef\u80fd\u7684\u67b6\u6784\u7a7a\u95f4\u6765\u81ea\u52a8\u5316\u67b6\u6784\u8bbe\u8ba1\uff0c\u627e\u5230\u5728\u786c\u4ef6\u7ea6\u675f\uff08\u5ef6\u8fdf\u3001\u5185\u5b58\u3001\u529f\u8017\uff09\u4e0b\u6700\u5927\u5316\u7cbe\u5ea6\u7684\u67b6\u6784\u3002
EfficientNet\uff08\u7b2c8\u7ae0\uff09\u5c31\u662f\u901a\u8fc7NAS\u627e\u5230\u7684\uff1a\u590d\u5408\u7f29\u653e\u89c4\u5219\uff08\u5e73\u8861\u6df1\u5ea6\u3001\u5bbd\u5ea6\u3001\u5206\u8fa8\u7387\uff09\u662f\u4ece\u641c\u7d22\u4e2d\u6d8c\u73b0\u7684\uff0c\u800c\u975e\u4eba\u7c7b\u76f4\u89c9\u3002
\u5bf9\u4e8e\u63a8\u7406\u6548\u7387\uff0cNAS\u53ef\u4ee5\u627e\u5230\u9488\u5bf9\u7279\u5b9a\u786c\u4ef6\u76ee\u6807\u4f18\u5316\u7684\u67b6\u6784\uff1a\"\u627e\u5230\u4e00\u4e2a\u5728iPhone\u795e\u7ecf\u5f15\u64ce\u4e0a\u5ef6\u8fdf<5ms\u4e14\u5728ImageNet\u4e0a\u7cbe\u5ea6>80%\u7684\u6a21\u578b\u3002\"\u641c\u7d22\u7a7a\u95f4\u5305\u62ec\u5c42\u7c7b\u578b\u3001\u5bbd\u5ea6\u3001\u6fc0\u6d3b\u51fd\u6570\u548c\u6ce8\u610f\u529b\u6a21\u5f0f\u3002
\u4e00\u6b21\u6027\u7f51\u7edc\u8bad\u7ec3\u4e00\u4e2a\u5355\u4e2a\u8fc7\u53c2\u6570\u5316\u7f51\u7edc\uff0c\u4e3a\u4e0d\u540c\u7684\u90e8\u7f72\u76ee\u6807\u63d0\u53d6\u5b50\u7f51\u7edc\u3002\u4e00\u6b21\u8bad\u7ec3\u8fd0\u884c\u4ea7\u751f\u9488\u5bf9\u4e91GPU\u3001\u79fb\u52a8GPU\u548cCPU\u4f18\u5316\u7684\u6a21\u578b\uff0c\u6bcf\u4e2a\u90fd\u9488\u5bf9\u5176\u76ee\u6807\u8fdb\u884c\u4e86\u4f18\u5316\u3002
\u5b9e\u73b0\u6ed1\u52a8\u7a97\u53e3\u6ce8\u610f\u529b\uff0c\u5e76\u4e0e\u5168\u6ce8\u610f\u529b\u6bd4\u8f83\u5185\u5b58\u4f7f\u7528\u3002
import jax\nimport jax.numpy as jnp\n\ndef full_attention(Q, K, V):\n \"\"\"\u6807\u51c6O(n\u00b2)\u6ce8\u610f\u529b\u3002\"\"\"\n scores = Q @ K.T / jnp.sqrt(Q.shape[-1])\n weights = jax.nn.softmax(scores, axis=-1)\n return weights @ V\n\ndef sliding_window_attention(Q, K, V, window_size=128):\n \"\"\"\u6ed1\u52a8\u7a97\u53e3\u6ce8\u610f\u529b\uff1a\u6bcf\u4e2atoken\u5173\u6ce8\u524dwindow_size\u4e2atoken\u3002\"\"\"\n n = Q.shape[0]\n d = Q.shape[-1]\n output = jnp.zeros_like(Q)\n\n for i in range(n):\n start = max(0, i - window_size + 1)\n k_window = K[start:i+1]\n v_window = V[start:i+1]\n scores = Q[i] @ k_window.T / jnp.sqrt(d)\n weights = jax.nn.softmax(scores)\n output = output.at[i].set(weights @ v_window)\n\n return output\n\nn, d = 512, 64\nkey = jax.random.PRNGKey(0)\nQ = jax.random.normal(key, (n, d))\nK = jax.random.normal(jax.random.PRNGKey(1), (n, d))\nV = jax.random.normal(jax.random.PRNGKey(2), (n, d))\n\nprint(f\"\u5168\u6ce8\u610f\u529b\u5185\u5b58: O(n\u00b2) = {n*n} \u4e2a\u6761\u76ee\")\nprint(f\"\u7a97\u53e3 (w=128) \u5185\u5b58: O(n*w) = {n*128} \u4e2a\u6761\u76ee\")\nprint(f\"\u51cf\u5c11: {n*n / (n*128):.1f}x\")\n \u6bd4\u8f83MHA\u3001GQA\u548cMQA\u7684KV\u7f13\u5b58\u5927\u5c0f\u3002\u5c55\u793a\u4e3a\u4ec0\u4e48GQA\u662f\u5b9e\u9645\u7684\u6700\u4f73\u9009\u62e9\u3002
def kv_cache_size(n_heads, n_kv_heads, d_head, seq_len, bytes=2):\n \"\"\"KV\u7f13\u5b58\u5927\u5c0f\uff08MB\uff09\u3002\"\"\"\n return 2 * n_kv_heads * d_head * seq_len * bytes / 1e6\n\nn_heads = 32\nd_head = 128\nseq_len = 32768\n\nmha = kv_cache_size(n_heads, n_heads, d_head, seq_len) # 32\u4e2aKV\u5934\ngqa = kv_cache_size(n_heads, 8, d_head, seq_len) # 8\u4e2aKV\u5934\nmqa = kv_cache_size(n_heads, 1, d_head, seq_len) # 1\u4e2aKV\u5934\n\nprint(f\"MHA (32\u4e2aKV\u5934): {mha:.0f} MB \u6bcf\u5c42\")\nprint(f\"GQA (8\u4e2aKV\u5934): {gqa:.0f} MB \u6bcf\u5c42 ({mha/gqa:.0f}x \u66f4\u5c0f)\")\nprint(f\"MQA (1\u4e2aKV\u5934): {mqa:.0f} MB \u6bcf\u5c42 ({mha/mqa:.0f}x \u66f4\u5c0f)\")\n \u901a\u8fc7\u4ece\u968f\u673a\u6ce8\u610f\u529b\u5c42\u4e2d\u79fb\u9664\u6700\u4e0d\u91cd\u8981\u7684\u6ce8\u610f\u529b\u5934\u5e76\u6d4b\u91cf\u8f93\u51fa\u53d8\u5316\u6765\u6a21\u62df\u7ed3\u6784\u5316\u526a\u679d\u3002
import jax\nimport jax.numpy as jnp\n\nkey = jax.random.PRNGKey(0)\nn_heads, seq_len, d_head = 8, 64, 32\n\n# \u968f\u673a\u591a\u5934\u6ce8\u610f\u529b\u8f93\u51fa\uff08\u6bcf\u4e2a\u5934\u4e00\u4e2a\uff09\nhead_outputs = jax.random.normal(key, (n_heads, seq_len, d_head))\n\n# \u5b8c\u6574\u8f93\u51fa\uff1a\u8fde\u63a5\u6240\u6709\u5934\nfull_output = head_outputs.reshape(seq_len, n_heads * d_head)\n\n# \u91cd\u8981\u6027\uff1a\u901a\u8fc7\u8303\u6570\u5ea6\u91cf\u6bcf\u4e2a\u5934\u7684\u8d21\u732e\nhead_norms = jnp.linalg.norm(head_outputs, axis=(1, 2))\nprint(\"\u5934\u91cd\u8981\u6027\uff08\u6309\u8303\u6570\uff09:\", jnp.round(head_norms, 2))\n\n# \u526a\u679d\u6700\u4e0d\u91cd\u8981\u7684\u5934\nfor n_keep in [8, 6, 4, 2]:\n top_heads = jnp.argsort(head_norms)[-n_keep:]\n pruned = head_outputs[top_heads].reshape(seq_len, n_keep * d_head)\n\n # \u586b\u5145\u5230\u539f\u59cb\u5927\u5c0f\u7528\u4e8e\u6bd4\u8f83\uff08\u5c06\u526a\u6389\u7684\u5934\u8bbe\u4e3a\u96f6\uff09\n full_pruned = jnp.zeros_like(head_outputs)\n full_pruned = full_pruned.at[top_heads].set(head_outputs[top_heads])\n full_pruned = full_pruned.reshape(seq_len, n_heads * d_head)\n\n error = jnp.linalg.norm(full_output - full_pruned) / jnp.linalg.norm(full_output)\n print(f\"\u4fdd\u7559 {n_keep}/{n_heads} \u4e2a\u5934: \u76f8\u5bf9\u8bef\u5dee = {error:.4f}, \"\n f\"\u5185\u5b58 = {n_keep/n_heads:.0%}\")\n \u5411\u6570\u5343\u5e76\u53d1\u7528\u6237\u63d0\u4f9bLLM\u670d\u52a1\u9700\u8981\u7684\u4e0d\u53ea\u662f\u52a0\u8f7d\u6a21\u578b\u548c\u8fd0\u884c\u63a8\u7406\u3002\u672c\u6587\u6db5\u76d6\u9884\u586b\u5145-\u89e3\u7801\u5206\u79bb\u3001\u8fde\u7eed\u6279\u5904\u7406\u3001PagedAttention\u548cvLLM\u3001\u8c03\u5ea6\u7b56\u7565\u3001\u5206\u79bb\u5f0f\u670d\u52a1\u3001\u591a\u6a21\u578b\u548cLoRA\u670d\u52a1\uff0c\u4ee5\u53ca\u5173\u952e\u6307\u6807
LLM\u63a8\u7406\u6709\u4e24\u4e2a\u4e0d\u540c\u7684\u9636\u6bb5\uff0c\u5177\u6709\u6839\u672c\u4e0d\u540c\u7684\u8ba1\u7b97\u7279\u5f81\uff1a
\u9884\u586b\u5145\uff08\u63d0\u793a\u5904\u7406\uff09\uff1a\u540c\u65f6\u5904\u7406\u6240\u6709\u8f93\u5165token\u3002\u8fd9\u662f\u4e00\u4e2a\u5355\u6b21\u5927\u89c4\u6a21\u77e9\u9635\u4e58\u6cd5\uff1a\\(O(\\text{prompt\\_length} \\times d_{\\text{model}}^2)\\)\u3002\u63d0\u793a\u53ef\u4ee5\u5e76\u884c\u5904\u7406\uff08\u6240\u6709token\u90fd\u5df2\u77e5\uff09\u3002\u9884\u586b\u5145\u662f\u8ba1\u7b97\u53d7\u9650\u7684\uff1aGPU\u7684ALU\u662f\u74f6\u9888\u3002
\u89e3\u7801\uff08token\u751f\u6210\uff09\uff1a\u81ea\u56de\u5f52\u5730\u4e00\u6b21\u751f\u6210\u4e00\u4e2atoken\u3002\u6bcf\u4e2a\u65b0token\u9700\u8981\u901a\u8fc7KV\u7f13\u5b58\u5173\u6ce8\u6240\u6709\u5148\u524d\u7684token\u3002\u89e3\u7801\u662f\u5185\u5b58\u5e26\u5bbd\u53d7\u9650\u7684\uff1aGPU\u5927\u90e8\u5206\u65f6\u95f4\u82b1\u5728\u4ece\u5185\u5b58\u52a0\u8f7d\u6a21\u578b\u6743\u91cd\u548cKV\u7f13\u5b58\u4e0a\uff0c\u800c\u4e0d\u662f\u8ba1\u7b97\u3002\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\u53ea\u4ea7\u751f\u4e00\u4e2atoken\uff0c\u4f46\u5fc5\u987b\u52a0\u8f7d\u6574\u4e2a\u6a21\u578b\uff0870B FP16\u6a21\u578b\u7ea6140 GB\uff09\u3002
\u542b\u4e49\uff1a
\u6700\u7b80\u5355\u7684\u6279\u5904\u7406\uff1a\u6536\u96c6\\(B\\)\u4e2a\u8bf7\u6c42\uff0c\u586b\u5145\u5230\u76f8\u540c\u957f\u5ea6\uff0c\u4f5c\u4e3a\u5355\u4e2a\u6279\u6b21\u5904\u7406\u3002
\u95ee\u98981\uff1a\u8bf7\u6c42\u6709\u4e0d\u540c\u7684\u63d0\u793a\u957f\u5ea6\uff0c\u5e76\u751f\u6210\u4e0d\u540c\u6570\u91cf\u7684\u8f93\u51fatoken\u3002\u77ed\u8bf7\u6c42\u63d0\u524d\u5b8c\u6210\uff0c\u4f46\u5fc5\u987b\u7b49\u5f85\u6279\u6b21\u4e2d\u6700\u957f\u7684\u8bf7\u6c42\u5b8c\u6210\u540e\u624d\u80fd\u5f00\u59cb\u4e0b\u4e00\u4e2a\u6279\u6b21\u3002GPU\u5728\u4e3a\u5269\u4f59\u7684\u4e00\u4e2a\u957f\u8bf7\u6c42\u751f\u6210token\u65f6\u5904\u4e8e\u7a7a\u95f2\u72b6\u6001\u3002
\u95ee\u98982\uff1a\u586b\u5145\u6d6a\u8d39\u8ba1\u7b97\u3002\u5982\u679c\u6700\u957f\u63d0\u793a\u662f2000\u4e2atoken\uff0c\u6700\u77ed\u662f50\u4e2a\uff0c\u6279\u6b21\u88ab\u586b\u5145\u52302000\u3002GPU\u4e3a\u77ed\u8bf7\u6c42\u5904\u7406\u4e861950\u4e2a\u586b\u5145token\u2014\u2014\u7eaf\u5c5e\u6d6a\u8d39\u3002
\u8fde\u7eed\u6279\u5904\u7406\uff08\u4e5f\u79f0\u4e3a\u8fed\u4ee3\u7ea7\u6279\u5904\u7406\uff09\u901a\u8fc7\u5728\u5355\u4e2a\u89e3\u7801\u6b65\u9aa4\u7684\u7c92\u5ea6\u4e0a\u64cd\u4f5c\u6765\u89e3\u51b3\u8fd9\u4e24\u4e2a\u95ee\u9898\uff0c\u800c\u4e0d\u662f\u6574\u4e2a\u8bf7\u6c42\u3002
\u5728\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\uff1a
\u6279\u6b21\u5927\u5c0f\u6bcf\u6b65\u52a8\u6001\u53d8\u5316\u3002GPU\u4ece\u4e0d\u7b49\u5019\u843d\u540e\u8005\uff0c\u4e5f\u6ca1\u6709\u6d6a\u8d39\u7684\u586b\u5145\uff08\u6bcf\u4e2a\u8bf7\u6c42\u53ea\u4f7f\u7528\u5b83\u9700\u8981\u7684\u69fd\u4f4d\uff09\u3002
\u5f71\u54cd\uff1a\u8fde\u7eed\u6279\u5904\u7406\u901a\u5e38\u6bd4\u9759\u6001\u6279\u5904\u7406\u63d0\u9ad8\u541e\u5410\u91cf2-10\u500d\uff0c\u6a21\u578b\u8d28\u91cf\u4e0d\u53d8\u4e14\u5ef6\u8fdf\u65e0\u660e\u663e\u589e\u52a0\u3002
PagedAttention\uff08Kwon\u7b49\u4eba\uff0c2023\uff09\u5c06\u64cd\u4f5c\u7cfb\u7edf\u865a\u62df\u5185\u5b58\u7684\u6982\u5ff5\uff08\u7b2c13\u7ae0\uff09\u5e94\u7528\u4e8eKV\u7f13\u5b58\u3002\u7f13\u5b58\u88ab\u5212\u5206\u4e3a\u56fa\u5b9a\u5927\u5c0f\u7684\u9875\uff08token\u4f4d\u7f6e\u7684\u5757\uff09\u3002\u9875\u6309\u9700\u5206\u914d\uff0c\u5728\u7269\u7406GPU\u5185\u5b58\u4e2d\u53ef\u4ee5\u662f\u975e\u8fde\u7eed\u7684\u3002
\u4f18\u52bf\uff1a
vLLM\u662f\u57fa\u4e8ePagedAttention\u6784\u5efa\u7684\u63a8\u7406\u5f15\u64ce\u3002\u901a\u8fc7\u51e0\u4e4e\u6d88\u9664KV\u7f13\u5b58\u5185\u5b58\u6d6a\u8d39\uff0c\u5b83\u5b9e\u73b0\u4e86\u6bd4\u9759\u6001\u5206\u914d\u670d\u52a1\uff08\u5982\u6ca1\u6709\u5206\u9875\u6ce8\u610f\u529b\u7684HuggingFace text-generation-inference\uff09\u9ad82-4\u500d\u7684\u541e\u5410\u91cf\u3002
\u5f53\u591a\u4e2a\u8bf7\u6c42\u5728\u7b49\u5f85\u4e14GPU\u53ea\u80fd\u5904\u7406\u6709\u9650\u6279\u6b21\u65f6\uff0c\u8c03\u5ea6\u51b3\u5b9a\u670d\u52a1\u54ea\u4e9b\u8bf7\u6c42\uff1a
\u5148\u6765\u5148\u670d\u52a1\uff08FCFS\uff09\uff1a\u6309\u5230\u8fbe\u987a\u5e8f\u5904\u7406\u8bf7\u6c42\u3002\u7b80\u5355\u4f46\u4e0d\u516c\u5e73\uff1a\u4e00\u4e2a\u63d0\u4ea410K-token\u751f\u6210\u7684\u7528\u6237\u4f1a\u963b\u585e\u6240\u6709\u540e\u9762\u7684\u7528\u6237\u3002
\u6700\u77ed\u4f5c\u4e1a\u4f18\u5148\uff08SJF\uff09\uff1a\u5904\u7406\u6700\u5148\u5b8c\u6210\u7684\u8bf7\u6c42\u3002\u6700\u5c0f\u5316\u5e73\u5747\u5ef6\u8fdf\uff0c\u4f46\u60e9\u7f5a\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u8bf7\u6c42\uff08\u5b83\u4eec\u53ef\u80fd\u88ab\u997f\u6b7b\uff09\u3002\u5728\u5b9e\u8df5\u4e2d\uff0c\u4f30\u8ba1\u8f93\u51fa\u957f\u5ea6\u672a\u77e5\uff0c\u56e0\u6b64SJF\u4f7f\u7528\u542f\u53d1\u5f0f\u65b9\u6cd5\uff08\u63d0\u793a\u957f\u5ea6\u3001\u7528\u6237\u5386\u53f2\uff09\u3002
\u62a2\u5360\uff1a\u5982\u679c\u9ad8\u4f18\u5148\u7ea7\u8bf7\u6c42\u5230\u8fbe\uff0c\u6682\u505c\u4f4e\u4f18\u5148\u7ea7\u7684\u8fdb\u884c\u4e2d\u8bf7\u6c42\uff08\u5c06\u5176KV\u7f13\u5b58\u4ea4\u6362\u5230CPU\u5185\u5b58\u6216SSD\uff09\uff0c\u670d\u52a1\u9ad8\u4f18\u5148\u7ea7\u8bf7\u6c42\uff0c\u7136\u540e\u6062\u590d\u6682\u505c\u7684\u8bf7\u6c42\u3002vLLM\u652f\u6301\u6b64\u529f\u80fd\u3002
\u57fa\u4e8e\u4f18\u5148\u7ea7\uff1a\u4e3a\u7528\u6237\u6216\u8bf7\u6c42\u7c7b\u578b\u5206\u914d\u4f18\u5148\u7ea7\u3002\u5b9e\u65f6\u4ea4\u4e92\u67e5\u8be2\u6bd4\u6279\u5904\u7406\u4f5c\u4e1a\u83b7\u5f97\u66f4\u9ad8\u4f18\u5148\u7ea7\u3002\u7ed3\u5408\u62a2\u5360\uff0c\u8fd9\u786e\u4fdd\u9ad8\u4f18\u5148\u7ea7\u6d41\u91cf\u7684\u5ef6\u8fdfSLO\u3002
Token\u9884\u7b97\uff1a\u9650\u5236\u6d3b\u8dc3\u6279\u6b21\u4e2d\u7684\u603btoken\u6570\u3002\u8fd9\u9632\u6b62\u5c11\u91cf\u957f\u8bf7\u6c42\u72ec\u5360GPU\u5185\u5b58\u5e76\u997f\u6b7b\u65b0\u8bf7\u6c42\u3002
\u9884\u586b\u5145\u548c\u89e3\u7801\u5177\u6709\u76f8\u53cd\u7684\u8ba1\u7b97\u7279\u5f81\u3002\u5728\u540c\u4e00GPU\u4e0a\u8fd0\u884c\u4e24\u8005\u610f\u5473\u7740GPU\u5728\u8ba1\u7b97\u53d7\u9650\uff08\u9884\u586b\u5145\uff09\u548c\u5185\u5b58\u5e26\u5bbd\u53d7\u9650\uff08\u89e3\u7801\uff09\u4e4b\u95f4\u4ea4\u66ff\uff0c\u4ece\u672a\u5145\u5206\u5229\u7528\u4efb\u4e00\u8d44\u6e90\u3002
\u5206\u79bb\u5f0f\u670d\u52a1\u5c06\u5b83\u4eec\u5206\u5f00\uff1a
\u9884\u586b\u5145\u8282\u70b9\u8ba1\u7b97\u521d\u59cbKV\u7f13\u5b58\u5e76\u901a\u8fc7NVLink\u6216\u7f51\u7edc\u5c06\u5176\u53d1\u9001\u5230\u89e3\u7801\u8282\u70b9\u3002\u89e3\u7801\u8282\u70b9\u4f7f\u7528\u63a5\u6536\u5230\u7684\u7f13\u5b58\u751f\u6210token\u3002
\u8fd9\u662fMooncake\uff08\u6708\u4e4b\u6697\u9762\uff09\u7684\u67b6\u6784\uff0c\u5e76\u6b63\u5728\u88ab\u591a\u4e2aLLM\u670d\u52a1\u56e2\u961f\u63a2\u7d22\u3002\u597d\u5904\uff1a\u6bcf\u4e2aGPU\u7c7b\u578b\u4e0e\u5176\u5de5\u4f5c\u8d1f\u8f7d\u7279\u5f81\u5339\u914d\uff0c\u63d0\u9ad8\u6574\u4f53\u5229\u7528\u7387\u3002
\u5728\u751f\u4ea7\u4e2d\uff0c\u4f60\u901a\u5e38\u670d\u52a1\u591a\u4e2a\u6a21\u578b\uff08\u4e0d\u540c\u5c42\u7ea7\u7684\u6a21\u578b\u5927\u5c0f\u4e0d\u540c\uff0c\u4e0d\u540c\u4efb\u52a1\u7684\u5fae\u8c03\u53d8\u4f53\u4e0d\u540c\uff09\u3002
\u6a21\u578b\u590d\u7528\uff1a\u5728\u540c\u4e00GPU\u4e0a\u52a0\u8f7d\u591a\u4e2a\u6a21\u578b\uff0c\u5c06\u8bf7\u6c42\u8def\u7531\u5230\u76f8\u5e94\u6a21\u578b\u3002GPU\u5185\u5b58\u5171\u4eab\uff1a\u4e00\u4e2a40 GB GPU\u53ef\u80fd\u540c\u65f6\u6301\u6709\u4e00\u4e2a13B\u6a21\u578b\uff0826 GB\uff09\u548c\u4e00\u4e2a7B\u6a21\u578b\uff0814 GB\uff09\u3002
LoRA\u670d\u52a1\uff1a\u4e0d\u662f\u90e8\u7f72\u5355\u72ec\u7684\u5fae\u8c03\u6a21\u578b\uff0c\u800c\u662f\u90e8\u7f72\u4e00\u4e2a\u57fa\u7840\u6a21\u578b\u5e76\u5e26\u6709\u591a\u4e2aLoRA\u9002\u914d\u5668\uff08\u7b2c6\u7ae0\uff09\u3002\u6bcf\u4e2a\u9002\u914d\u5668\u589e\u52a0<1%\u7684\u53c2\u6570\u3002\u8bf7\u6c42\u5728\u63a8\u7406\u65f6\u8def\u7531\u5230\u76f8\u5e94\u7684\u9002\u914d\u5668\u3002
S-LoRA\uff08Sheng\u7b49\u4eba\uff0c2023\uff09\uff1a\u4ece\u4e00\u4e2a\u57fa\u7840\u6a21\u578b\u670d\u52a1\u6570\u5343\u4e2aLoRA\u9002\u914d\u5668\u3002\u9002\u914d\u5668\u5b58\u50a8\u5728CPU\u4e0a\uff0c\u6309\u9700\u5206\u9875\u5230GPU\u5185\u5b58\u3002\u57fa\u7840\u6a21\u578b\u7684KV\u7f13\u5b58\u548c\u6743\u91cd\u88ab\u5171\u4eab\uff1b\u53ea\u6709\u5c0f\u7684LoRA\u77e9\u9635\u56e0\u8bf7\u6c42\u800c\u5f02\u3002
Punica\uff08Chen\u7b49\u4eba\uff0c2023\uff09\uff1a\u901a\u8fc7\u4f7f\u7528\u81ea\u5b9a\u4e49CUDA\u5185\u6838\u5728\u540c\u4e00\u6279\u6b21\u4e2d\u4e3a\u4e0d\u540c\u8bf7\u6c42\u5e94\u7528\u4e0d\u540c\u7684LoRA\u77e9\u9635\uff0c\u8de8\u4e0d\u540cLoRA\u9002\u914d\u5668\u5bf9\u8bf7\u6c42\u8fdb\u884c\u6279\u5904\u7406\u3002\u8fd9\u907f\u514d\u4e86\u6bcf\u4e2a\u8bf7\u6c42\u5207\u6362\u9002\u914d\u5668\u7684\u5f00\u9500\u3002
\u8bb8\u591a\u5e94\u7528\u9700\u8981LLM\u4ee5\u7279\u5b9a\u683c\u5f0f\u4ea7\u751f\u8f93\u51fa\uff1a\u6709\u6548\u7684JSON\u3001SQL\u67e5\u8be2\u3001\u7279\u5b9a\u8bed\u8a00\u7684\u4ee3\u7801\u6216\u9075\u5faa\u6a21\u5f0f\u7684\u54cd\u5e94\u3002\u53d7\u9650\u751f\u6210\u4fdd\u8bc1\u8f93\u51fa\u7b26\u5408\u8bed\u6cd5\u6216\u6a21\u5f0f\u3002
\u8bed\u6cd5\u53d7\u9650\u89e3\u7801\uff1a\u5728\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\uff0c\u5c4f\u853d\u4f1a\u8fdd\u53cd\u8bed\u6cd5\u7684token\u3002\u5982\u679c\u5230\u76ee\u524d\u4e3a\u6b62\u7684\u8f93\u51fa\u662f{\"name\": \"Alice\", \"age\":\u4e14\u8bed\u6cd5\u8981\u6c42\u63a5\u4e0b\u6765\u662f\u6574\u6570\uff0c\u5219\u5c4f\u853d\u9664\u6570\u5b57\u5916\u7684\u6240\u6709token\u3002LLM\u7684\u6982\u7387\u5206\u5e03\u5728\u6709\u6548token\u4e0a\u91cd\u65b0\u5f52\u4e00\u5316\u3002
Outlines\uff08Willard & Louf\uff0c2023\uff09\uff1a\u5c06JSON\u6a21\u5f0f\u6216\u6b63\u5219\u8868\u8fbe\u5f0f\u7f16\u8bd1\u6210\u6709\u9650\u72b6\u6001\u673a\uff08FSM\uff09\u3002\u5728\u6bcf\u4e2a\u89e3\u7801\u6b65\u9aa4\uff0cFSM\u786e\u5b9a\u54ea\u4e9btoken\u662f\u6709\u6548\u7684\u540e\u7eed\u3002\u65e0\u6548token\u83b7\u5f97\u6982\u73870\u3002\u8fd9\u4fdd\u8bc1\u4e86100%\u7684\u6a21\u5f0f\u5408\u89c4\uff0c\u96f6\u91cd\u8bd5\u3002
SGLang\u539f\u751f\u96c6\u6210\u53d7\u9650\u751f\u6210\uff1a\u4f60\u7528Python\u6307\u5b9a\u8f93\u51fa\u7ed3\u6784\uff0c\u5f15\u64ce\u9ad8\u6548\u5904\u7406token\u63a9\u7801\u548c\u7f13\u5b58\u3002\u8fd9\u4e0eRadixAttention\uff08\u524d\u7f00\u7f13\u5b58\uff09\u7ed3\u5408\uff0c\u4f7f\u5f97\u7ed3\u6784\u5316\u8f93\u51fa\u91cd\u7528\u7f13\u5b58\u7684\u516c\u5171\u524d\u7f00\u3002
\u4e3a\u4ec0\u4e48\u91cd\u8981\uff1a\u6ca1\u6709\u53d7\u9650\u751f\u6210\uff0c\u4f60\u81ea\u7531\u751f\u6210\u7136\u540e\u89e3\u6790\u8f93\u51fa\uff0c\u5931\u8d25\u65f6\u91cd\u8bd5\u3002\u5bf9\u4e8e\u590d\u6742JSON\u6a21\u5f0f\uff0c\u91cd\u8bd5\u7387\u901a\u5e38\u4e3a10-30%\uff0c\u6d6a\u8d39\u8ba1\u7b97\u3002\u53d7\u9650\u751f\u6210\u5b8c\u5168\u6d88\u9664\u4e86\u91cd\u8bd5\u3002
\u5e76\u975e\u6bcf\u4e2a\u67e5\u8be2\u90fd\u9700\u8981\u6700\u5927\u7684\u6a21\u578b\u3002\u8bf7\u6c42\u8def\u7531\u6839\u636e\u4f30\u8ba1\u7684\u96be\u5ea6\u5c06\u67e5\u8be2\u5b9a\u5411\u5230\u4e0d\u540c\u7684\u6a21\u578b\uff1a
\u7ea7\u8054\uff1a\u5148\u5c1d\u8bd5\u5c0f\u6a21\u578b\u3002\u5982\u679c\u5c0f\u6a21\u578b\u7684\u7f6e\u4fe1\u5ea6\u4f4e\u4e8e\u9608\u503c\uff08\u4f8b\u5982\uff0ctop token\u7684softmax\u6982\u7387<0.8\uff09\uff0c\u5219\u5347\u7ea7\u5230\u66f4\u5927\u7684\u6a21\u578b\u3002\u7b80\u5355\u67e5\u8be2\uff0880%+\u7684\u6d41\u91cf\uff09\u7531\u5c0f\u6a21\u578b\u5ec9\u4ef7\u670d\u52a1\uff1b\u53ea\u6709\u56f0\u96be\u67e5\u8be2\u4f7f\u7528\u6602\u8d35\u6a21\u578b\u3002
\u5b66\u4e60\u578b\u8def\u7531\uff1a\u8bad\u7ec3\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u5206\u7c7b\u5668\uff08\u6216\u4f7f\u7528\u5c0f\u6a21\u578b\u7684\u56f0\u60d1\u5ea6\uff09\u6765\u9884\u6d4b\u67e5\u8be2\u9700\u8981\u54ea\u4e2a\u6a21\u578b\u5c42\u7ea7\u3002\u5c06\"2+2\u7b49\u4e8e\u591a\u5c11\uff1f\"\u8def\u7531\u52303B\u6a21\u578b\uff0c\u5c06\"\u89e3\u91ca\u91cf\u5b50\u7ea0\u7f20\u7684\u6570\u5b66\u57fa\u7840\"\u8def\u7531\u523070B\u6a21\u578b\u3002
\u5f71\u54cd\uff1a\u5982\u679c80%\u7684\u67e5\u8be2\u53ef\u4ee5\u7531\u6210\u672c\u4f4e10\u500d\u7684\u6a21\u578b\u5904\u7406\uff0c\u5e73\u5747\u6bcf\u67e5\u8be2\u6210\u672c\u4e0b\u964d\u7ea670%\u3002\u8fd9\u662f\u591a\u6a21\u578b\u90e8\u7f72\u4e2d\u5f71\u54cd\u6700\u5927\u7684\u6210\u672c\u4f18\u5316\u4e4b\u4e00\u3002
\u8bbe\u5907\u7aef+\u4e91\u6df7\u5408\u8def\u7531\uff1aCactus\uff08github.com/cactus-compute/cactus\uff09\u5728\u8bbe\u5907\u7ea7\u522b\u5b9e\u73b0\u8bf7\u6c42\u8def\u7531\u3002\u5b83\u901a\u8fc7\u81ea\u5b9a\u4e49ARM SIMD\u5185\u6838\u5728\u8bbe\u5907\u7aef\uff08\u624b\u673a\u3001\u7b14\u8bb0\u672c\u7535\u8111\u3001\u53ef\u7a7f\u6234\u8bbe\u5907\uff09\u8fd0\u884c\u5c0f\u6a21\u578b\uff0c\u5e76\u5728\u672c\u5730\u6a21\u578b\u7f6e\u4fe1\u5ea6\u4f4e\u6216\u67e5\u8be2\u8d85\u51fa\u8bbe\u5907\u80fd\u529b\u65f6\u81ea\u52a8\u8def\u7531\u5230\u4e91\u7aef\u6a21\u578b\u3002\u5e94\u7528\u4e3a\u4e24\u6761\u8def\u5f84\u4f7f\u7528OpenAI\u517c\u5bb9API\u2014\u2014\u8def\u7531\u662f\u900f\u660e\u7684\u3002\u8fd9\u662f\u5728\u57fa\u7840\u8bbe\u65bd\u7ea7\u522b\u7684\u7ea7\u8054\uff1a\u7b2c\u4e00\u5c42\u662f\u514d\u8d39\u7684\uff08\u8bbe\u5907\u7aef\uff09\uff0c\u7b2c\u4e8c\u5c42\u82b1\u94b1\uff08\u4e91API\uff09\u3002\u5bf9\u4e8e\u5927\u591a\u6570\u67e5\u8be2\u7b80\u5355\u7684\u5e94\u7528\uff08\u52a9\u624b\u95ee\u7b54\u3001\u81ea\u52a8\u8865\u5168\u3001\u8f6c\u5f55\uff09\uff0c\u8bbe\u5907\u7aef\u5904\u7406\u8986\u76d670-90%\u7684\u6d41\u91cf\uff0c\u8fb9\u9645\u6210\u672c\u4e3a\u96f6\u3002
TTFT vs TPOT\u6743\u8861\uff1a\u6fc0\u8fdb\u7684\u6279\u5904\u7406\u589e\u52a0\u541e\u5410\u91cf\uff08\u603btoken\u6570/\u79d2\u66f4\u591a\uff09\uff0c\u4f46\u589e\u52a0TPOT\uff08\u6bcf\u4e2atoken\u8017\u65f6\u66f4\u957f\uff0c\u56e0\u4e3aGPU\u5904\u7406\u66f4\u591a\u8bf7\u6c42\uff09\u3002\u8c03\u5ea6\u7b56\u7565\u5fc5\u987b\u5e73\u8861\u541e\u5410\u91cf\uff08\u6536\u5165\uff09\u4e0e\u5ef6\u8fdf\uff08\u7528\u6237\u4f53\u9a8c\uff09\u3002
\u6bcftoken\u6210\u672c\u662f\u751f\u4ea7\u7684\u6700\u7ec8\u6307\u6807\u3002\u5b83\u7ed3\u5408\u4e86\u786c\u4ef6\u6210\u672c\uff08GPU\u79df\u91d1\uff09\u3001\u541e\u5410\u91cf\uff08token/\u79d2\uff09\u548c\u5229\u7528\u7387\u3002\u8fd0\u884c\u572850% GPU\u5229\u7528\u7387\u7684\u7cfb\u7edf\u6bd4100%\u5229\u7528\u7387\u7684\u7cfb\u7edf\u6bcftoken\u6210\u672c\u9ad82\u500d\u3002\u8fd9\u5c31\u662f\u6279\u5904\u7406\u3001\u8c03\u5ea6\u548cPagedAttention\u5982\u6b64\u91cd\u8981\u7684\u539f\u56e0\u2014\u2014\u5b83\u4eec\u63d0\u9ad8\u4e86\u5229\u7528\u7387\u3002
\u6a21\u62df\u8fde\u7eedvs\u9759\u6001\u6279\u5904\u7406\u5e76\u6d4b\u91cf\u541e\u5410\u91cf\u5dee\u5f02\u3002
import random\nimport time\n\ndef simulate_static_batching(requests, batch_size=8):\n \"\"\"\u5728\u56fa\u5b9a\u6279\u6b21\u4e2d\u5904\u7406\u8bf7\u6c42\u3002\u7b49\u5f85\u6240\u6709\u5b8c\u6210\u3002\"\"\"\n total_tokens = 0\n total_time = 0\n\n for i in range(0, len(requests), batch_size):\n batch = requests[i:i + batch_size]\n max_len = max(r['output_len'] for r in batch)\n # \u6279\u6b21\u4e2d\u6240\u6709\u8bf7\u6c42\u8017\u65f6\u7b49\u4e8e\u6700\u957f\u8bf7\u6c42\n batch_time = max_len * 0.01 # \u6bcftoken 10ms\n total_time += batch_time\n total_tokens += sum(r['output_len'] for r in batch)\n\n return total_tokens / total_time # token/\u79d2\n\ndef simulate_continuous_batching(requests, max_batch=8):\n \"\"\"\u4f7f\u7528\u8fde\u7eed\u6279\u5904\u7406\u5904\u7406\u3002\u79fb\u9664\u5b8c\u6210\u8bf7\u6c42\uff0c\u6dfb\u52a0\u65b0\u8bf7\u6c42\u3002\"\"\"\n total_tokens = 0\n total_time = 0\n active = []\n queue = list(requests)\n\n while active or queue:\n # \u586b\u5145\u6279\u6b21\n while len(active) < max_batch and queue:\n active.append({'remaining': queue.pop(0)['output_len']})\n\n if not active:\n break\n\n # \u4e00\u4e2a\u89e3\u7801\u6b65\u9aa4\uff1a\u6240\u6709\u6d3b\u8dc3\u8bf7\u6c42\u751f\u62101\u4e2atoken\n for req in active:\n req['remaining'] -= 1\n total_tokens += len(active)\n total_time += 0.01 # \u6bcf\u6b6510ms\n\n # \u79fb\u9664\u5b8c\u6210\u7684\u8bf7\u6c42\n active = [r for r in active if r['remaining'] > 0]\n\n return total_tokens / total_time\n\n# \u751f\u6210\u5177\u6709\u4e0d\u540c\u8f93\u51fa\u957f\u5ea6\u7684\u8bf7\u6c42\nrandom.seed(42)\nrequests = [{'output_len': random.randint(10, 500)} for _ in range(100)]\n\nstatic_tps = simulate_static_batching(requests)\ncontinuous_tps = simulate_continuous_batching(requests)\n\nprint(f\"\u9759\u6001\u6279\u5904\u7406: {static_tps:.0f} tokens/s\")\nprint(f\"\u8fde\u7eed\u6279\u5904\u7406: {continuous_tps:.0f} tokens/s\")\nprint(f\"\u52a0\u901f\u6bd4: {continuous_tps / static_tps:.1f}x\")\n \u8ba1\u7b97PagedAttention\u7684KV\u7f13\u5b58\u5185\u5b58\u8282\u7701\u3002\u6bd4\u8f83\u9884\u5206\u914d\uff08\u6700\u574f\u60c5\u51b5\uff09vs\u5206\u9875\uff08\u5b9e\u9645\u4f7f\u7528\uff09\u3002
def paged_vs_preallocated(n_requests, max_seq_len, avg_seq_len, page_size, kv_per_token_bytes):\n \"\"\"\u6bd4\u8f83\u5185\u5b58\u4f7f\u7528\uff1a\u9884\u5206\u914dvs\u5206\u9875KV\u7f13\u5b58\u3002\"\"\"\n # \u9884\u5206\u914d\uff1a\u6bcf\u4e2a\u8bf7\u6c42\u83b7\u5f97max_seq_len\u4e2a\u69fd\u4f4d\n preallocated_gb = n_requests * max_seq_len * kv_per_token_bytes / 1e9\n\n # \u5206\u9875\uff1a\u53ea\u5206\u914d\u4f7f\u7528\u7684\u90e8\u5206\uff08\u6309\u9875\u7c92\u5ea6\uff09\n import math\n avg_pages = math.ceil(avg_seq_len / page_size)\n paged_gb = n_requests * avg_pages * page_size * kv_per_token_bytes / 1e9\n\n waste_preallocated = (max_seq_len - avg_seq_len) / max_seq_len\n waste_paged = (avg_pages * page_size - avg_seq_len) / (avg_pages * page_size)\n\n print(f\"\u8bf7\u6c42\u6570: {n_requests}, \u6700\u5927\u5e8f\u5217: {max_seq_len}, \u5e73\u5747\u5e8f\u5217: {avg_seq_len}\")\n print(f\" \u9884\u5206\u914d: {preallocated_gb:.1f} GB (\u6d6a\u8d39: {waste_preallocated:.0%})\")\n print(f\" \u5206\u9875: {paged_gb:.1f} GB (\u6d6a\u8d39: {waste_paged:.0%})\")\n print(f\" \u8282\u7701: {preallocated_gb - paged_gb:.1f} GB ({preallocated_gb/paged_gb:.1f}x)\")\n print()\n\n# Llama-70B\uff1a\u6bcf\u5c42\u6bcftoken\u7ea61.3 KB\uff0c80\u5c42 = \u6bcftoken\u7ea6100 KB\u603b\u8ba1\nkv_bytes = 100_000\n\n# \u573a\u666f1\uff1a\u77ed\u8bf7\u6c42\uff0c\u5927\u6700\u5927\u503c\npaged_vs_preallocated(256, max_seq_len=4096, avg_seq_len=256, page_size=16, kv_per_token_bytes=kv_bytes)\n\n# \u573a\u666f2\uff1a\u4e0d\u540c\u957f\u5ea6\npaged_vs_preallocated(256, max_seq_len=8192, avg_seq_len=1024, page_size=16, kv_per_token_bytes=kv_bytes)\n\n# \u573a\u666f3\uff1a\u957f\u4e0a\u4e0b\u6587\npaged_vs_preallocated(64, max_seq_len=131072, avg_seq_len=16000, page_size=16, kv_per_token_bytes=kv_bytes)\n \u8fb9\u7f18\u63a8\u7406\u5728\u7528\u6237\u8bbe\u5907\uff08\u624b\u673a\u3001\u7b14\u8bb0\u672c\u7535\u8111\u3001\u7269\u8054\u7f51\u4f20\u611f\u5668\uff09\u4e0a\u8fd0\u884c\u6a21\u578b\uff0c\u65e0\u9700\u5c06\u6570\u636e\u53d1\u9001\u5230\u4e91\u7aef\u3002\u672c\u6587\u6db5\u76d6\u8fb9\u7f18\u9650\u5236\u3001\u6a21\u578b\u538b\u7f29\u6d41\u6c34\u7ebf\u3001\u8bbe\u5907\u7aef\u8fd0\u884c\u65f6\u3001\u7f16\u8bd1\u5668\u6808\u3001\u786c\u4ef6\u76ee\u6807\uff08NPU\u3001\u795e\u7ecf\u5f15\u64ce\uff09\u3001\u8bbe\u5907\u7aefLLM\u3001\u8054\u90a6\u5b66\u4e60\u548c\u5ef6\u8fdf\u4f18\u5316
\u4e91\u7aef\u63a8\u7406\u9700\u8981\u7f51\u7edc\u8fde\u63a5\uff0c\u589e\u52a0\u5ef6\u8fdf\uff0850-200\u6beb\u79d2\u5f80\u8fd4\uff09\uff0c\u6bcf\u6b21\u8bf7\u6c42\u82b1\u8d39\u91d1\u94b1\uff0c\u5e76\u5c06\u7528\u6237\u6570\u636e\u53d1\u9001\u5230\u7b2c\u4e09\u65b9\u670d\u52a1\u5668\u3002\u8fb9\u7f18\u63a8\u7406\u6d88\u9664\u4e86\u6240\u6709\u56db\u4e2a\u95ee\u9898\uff1a\u6a21\u578b\u672c\u5730\u8fd0\u884c\uff0c\u5373\u65f6\u54cd\u5e94\uff0c\u6bcf\u6b21\u63a8\u7406\u96f6\u6210\u672c\uff0c\u4e14\u6570\u636e\u4fdd\u6301\u79c1\u5bc6\u3002
\u6743\u8861\uff1a\u8fb9\u7f18\u8bbe\u5907\u7684\u8ba1\u7b97\u548c\u5185\u5b58\u6bd4\u6570\u636e\u4e2d\u5fc3GPU\u5c0f100-1000\u500d\u3002\u4f7f\u6a21\u578b\u5728\u8fd9\u4e9b\u7ea6\u675f\u4e0b\u8fd0\u884c\u9700\u8981\u5728\u6bcf\u4e2a\u5c42\u9762\u8fdb\u884c\u79ef\u6781\u4f18\u5316\u3002
Cactus\uff08github.com/cactus-compute/cactus) \u662f\u4e00\u4e2a\u4e13\u4e3a\u79fb\u52a8\u548c\u53ef\u7a7f\u6234\u8bbe\u5907\u6784\u5efa\u7684\u4f4e\u5ef6\u8fdfAI\u5f15\u64ce\u3002\u5b83\u5728\u751f\u4ea7\u4e2d\u5c55\u793a\u4e86\u672c\u6587\u6db5\u76d6\u7684\u8bb8\u591a\u6280\u672f\uff1a\u81ea\u5b9a\u4e49ARM SIMD\u5185\u6838\u7528\u4e8e\u6ce8\u610f\u529b\u548c\u77e9\u9635\u8fd0\u7b97\uff08\u7b2c16\u7ae0\uff09\u3001KV\u7f13\u5b58\u91cf\u5316\uff08\u7b2c17\u7ae0\u6587\u4ef601\uff09\u3001\u5206\u5757\u9884\u586b\u5145\u3001Apple\u548cQualcomm\u82af\u7247\u4e0a\u7684NPU\u52a0\u901f\u63a8\u7406\u3001\u96f6\u62f7\u8d1d\u5185\u5b58\u6620\u5c04\u5b9e\u73b010\u500d\u66f4\u4f4e\u7684RAM\u4f7f\u7528\uff0c\u4ee5\u53ca\u5728\u8bbe\u5907\u7aef\u8ba1\u7b97\u4e0d\u8db3\u65f6\u7684\u81ea\u52a8\u4e91\u56de\u9000\u3002Cactus\u652f\u6301\u8de8iOS\u3001Android\u3001macOS\u548c\u5d4c\u5165\u5f0fLinux\u7684\u591a\u6a21\u6001\u63a8\u7406\uff08LLM\u3001\u89c6\u89c9\u3001\u8bed\u97f3\uff09\uff0c\u5e76\u63d0\u4f9bSwift\u3001Kotlin\u3001Python\u3001Flutter\u3001React Native\u548cRust\u7684SDK\u3002\u5176\u57fa\u51c6\u6d4b\u8bd5\u663e\u793a\uff0c\u5728M4 Pro\u4e0a1.2B INT4\u6a21\u578b\u89e3\u7801\u8fbe\u5230100 tokens/s\uff0c\u5728iPhone 17 Pro\u4e0a\u8fbe\u523048 tokens/s\u2014\u2014\u8fd9\u662f\u4f18\u5316\u8fb9\u7f18\u63a8\u7406\u7684\u5177\u4f53\u793a\u4f8b\u3002
\u5b8c\u6574\u6a21\u578b\uff08FP32\uff0c70B\u53c2\u6570\uff09\n \u2193 \u77e5\u8bc6\u84b8\u998f \u2192 \u66f4\u5c0f\u6a21\u578b\uff087B\u53c2\u6570\uff09\n \u2193 \u7ed3\u6784\u5316\u526a\u679d \u2192 \u79fb\u9664\u5197\u4f59\u5934/\u5c42\uff084B\u6709\u6548\uff09\n \u2193 \u91cf\u5316\uff08INT4\uff09 \u2192 4\u500d\u66f4\u5c0f\uff082 GB\uff09\n \u2193 \u7f16\u8bd1\u5668\u4f18\u5316 \u2192 \u878d\u5408\u5185\u6838\uff0c\u4f18\u5316\u5185\u5b58\u5e03\u5c40\n \u2193 \u8fd0\u884c\u65f6 \u2192 \u8bbe\u5907\u7aef\u6267\u884c\n \u8fd0\u884c\u65f6\u52a0\u8f7d\u6a21\u578b\u3001\u5206\u914d\u5185\u5b58\u5e76\u5728\u76ee\u6807\u786c\u4ef6\u4e0a\u6267\u884c\u63a8\u7406\u3002\u6bcf\u4e2a\u5e73\u53f0\u6709\u5176\u504f\u597d\u7684\u8fd0\u884c\u65f6\uff1a
ONNX Runtime\uff1a\u8de8\u5e73\u53f0\uff08Windows\u3001Linux\u3001macOS\u3001iOS\u3001Android\uff09\u3002\u652f\u6301CPU\u3001GPU\uff08CUDA\u3001DirectML\u3001CoreML\u3001NNAPI\uff09\u548c\u8bb8\u591a\u52a0\u901f\u5668\u540e\u7aef\u3002\u6700\u5177\u53ef\u79fb\u690d\u6027\u7684\u9009\u9879\u3002\u6a21\u578b\u4ecePyTorch/TensorFlow\u5bfc\u51fa\u4e3aONNX\u683c\u5f0f\u3002
TensorFlow Lite\uff08TFLite\uff09\uff1aGoogle\u7684\u8fb9\u7f18\u8fd0\u884c\u65f6\u3002\u9488\u5bf9ARM CPU\u548cAndroid NPU\u4f18\u5316\u3002\u4e8c\u8fdb\u5236\u6587\u4ef6\u5c0f\u5de7\uff08\u7ea61 MB\uff09\u3002\u652f\u6301INT8\u548cfloat16\u3002Android\u90e8\u7f72\u7684\u6807\u51c6\u3002
Core ML\uff1aApple\u7684iOS/macOS\u8fd0\u884c\u65f6\u3002\u6839\u636e\u6a21\u578b\u7279\u5f81\u81ea\u52a8\u4f7f\u7528\u795e\u7ecf\u5f15\u64ce\u3001GPU\u6216CPU\u3002\u6a21\u578b\u4f7f\u7528coremltools\u4ecePyTorch/TensorFlow\u8f6c\u6362\u3002\u4e0eApple\u786c\u4ef6\u7d27\u5bc6\u96c6\u6210\uff08\u7edf\u4e00\u5185\u5b58\u3001\u795e\u7ecf\u5f15\u64ce\uff09\u3002
ExecuTorch\uff1aMeta\u65b0\u63a8\u51fa\u7684\u8bbe\u5907\u7aefPyTorch\u8fd0\u884c\u65f6\u3002\u4e13\u4e3a\u8fb9\u7f18\u90e8\u7f72\u8bbe\u8ba1\uff0c\u5177\u6709\u63d0\u524d\u7f16\u8bd1\u548c\u64cd\u4f5c\u7ea7\u786c\u4ef6\u52a0\u901f\u5668\u59d4\u6d3e\u529f\u80fd\u3002PyTorch Mobile\u7684\u7ee7\u4efb\u8005\u3002
TensorRT\uff1aNVIDIA\u7684GPU\u63a8\u7406\u4f18\u5316\u8fd0\u884c\u65f6\uff08\u7b2c15\u7ae0\uff09\u3002\u878d\u5408\u5c42\u3001\u9009\u62e9\u6700\u4f18\u5185\u6838\u5e76\u81ea\u52a8\u91cf\u5316\u3002\u5728NVIDIA GPU\u4e0a\u6bd4PyTorch eager\u6a21\u5f0f\u5feb2-5\u500d\u3002
llama.cpp\uff1a\u7528\u4e8eLLM\u7684\u5355\u6587\u4ef6C++\u63a8\u7406\u5f15\u64ce\u3002\u652f\u6301GGUF\u91cf\u5316\uff08Q4\u3001Q5\u3001Q8\uff09\u3001CPU\uff08AVX/NEON\uff09\u3001Metal\uff08Apple GPU\uff09\u3001CUDA\u548cVulkan\u3002\u5728\u6d88\u8d39\u7ea7\u786c\u4ef6\u4e0a\u8fd0\u884cLLM\u7684\u9996\u9009\u65b9\u6848\u3002
PyTorch\u6a21\u578b\n \u2193 \u5bfc\u51fa\uff08torch.export\u3001ONNX\u3001TorchScript\uff09\n\u56feIR\uff08\u4e2d\u95f4\u8868\u793a\uff09\n \u2193 \u56fe\u4f18\u5316\n - \u5e38\u91cf\u6298\u53e0\uff08\u7f16\u8bd1\u65f6\u8ba1\u7b97\u5e38\u91cf\u8868\u8fbe\u5f0f\uff09\n - \u6b7b\u4ee3\u7801\u6d88\u9664\uff08\u79fb\u9664\u672a\u4f7f\u7528\u7684\u64cd\u4f5c\uff09\n - \u7b97\u5b50\u878d\u5408\uff08conv + bn + relu \u2192 \u5355\u4e2a\u878d\u5408\u64cd\u4f5c\uff09\n - \u5e03\u5c40\u8f6c\u6362\uff08NCHW \u2192 NHWC\u7528\u4e8eARM\uff0c\u901a\u9053\u6700\u540e\uff09\n \u2193 \u964d\u7ea7\n\u786c\u4ef6\u7279\u5b9aIR\n \u2193 \u540e\u7aef\u4f18\u5316\n - \u5206\u5757\u548c\u5faa\u73af\u6392\u5e8f\uff08\u7f13\u5b58\u53cb\u597d\u7684\u8bbf\u95ee\u6a21\u5f0f\uff09\n - \u5411\u91cf\u5316\uff08SIMD\uff0c\u7b2c16\u7ae0\uff09\n - \u5185\u5b58\u89c4\u5212\uff08\u91cd\u7528\u7f13\u51b2\u533a\u4ee5\u6700\u5c0f\u5316\u5cf0\u503c\u5185\u5b58\uff09\n - \u5185\u6838\u9009\u62e9\uff08\u4e3a\u6bcf\u4e2a\u64cd\u4f5c\u9009\u62e9\u6700\u4f73\u5b9e\u73b0\uff09\n \u2193 \u4ee3\u7801\u751f\u6210\n\u673a\u5668\u4ee3\u7801 / NPU\u6307\u4ee4\n \u7b97\u5b50\u878d\u5408\u662f\u5f71\u54cd\u6700\u5927\u7684\u4f18\u5316\u3002\u4e00\u4e2aTransformer\u5757\u7ea6\u670920\u4e2a\u64cd\u4f5c\uff08\u77e9\u9635\u4e58\u3001\u52a0\u6cd5\u3001\u5c42\u5f52\u4e00\u5316\u3001softmax\u7b49\uff09\u3002\u6ca1\u6709\u878d\u5408\uff0c\u6bcf\u4e2a\u64cd\u4f5c\u5c06\u5176\u8f93\u51fa\u5199\u5165\u5185\u5b58\uff0c\u4e0b\u4e00\u4e2a\u64cd\u4f5c\u518d\u8bfb\u56de\u3002\u6709\u4e86\u878d\u5408\uff0c\u591a\u4e2a\u64cd\u4f5c\u7ec4\u5408\u6210\u4e00\u4e2a\u5185\u6838\uff0c\u5c06\u6570\u636e\u4fdd\u7559\u5728\u5bc4\u5b58\u5668/\u7f13\u5b58\u4e2d\u3002\u8fd9\u53ef\u4ee5\u4f7f\u901f\u5ea6\u5feb2-5\u500d\uff08\u7b2c16\u7ae0\uff0c\u5c4b\u9876\u6a21\u578b\uff09\u3002
\u5185\u5b58\u89c4\u5212\uff1a\u7f16\u8bd1\u5668\u5206\u6790\u6a21\u578b\u56fe\u4ee5\u786e\u5b9a\u54ea\u4e9b\u5f20\u91cf\u7684\u751f\u547d\u5468\u671f\u91cd\u53e0\uff0c\u53ef\u4ee5\u5171\u4eab\u76f8\u540c\u7684\u5185\u5b58\u7f13\u51b2\u533a\u3002\u4e00\u4e2a\u6709100\u4e2a\u4e2d\u95f4\u5f20\u91cf\u7684\u6a21\u578b\u53ef\u80fd\u53ea\u9700\u898110\u5f20\u91cf\u7684\u5185\u5b58\uff0c\u56e0\u4e3a\u5927\u591a\u6570\u5f20\u91cf\u5728\u5176\u4ed6\u5f20\u91cf\u521b\u5efa\u4e4b\u524d\u5c31\u88ab\u6d88\u8017\u548c\u91ca\u653e\u4e86\u3002\u8fd9\u5728\u5185\u5b58\u6709\u9650\u7684\u8bbe\u5907\u4e0a\u81f3\u5173\u91cd\u8981\u3002
Qualcomm Adreno\uff08Android\uff09\uff1a\u652f\u6301OpenCL\u3001Vulkan\u8ba1\u7b97\uff08\u7b2c16\u7ae0\uff09\u548cQualcomm\u4e13\u6709\u7684SNPE\uff08Snapdragon\u795e\u7ecf\u5904\u7406\u5f15\u64ce\uff09\u3002Adreno GPU\u5177\u6709256-1024\u4e2aALU\uff0c\u652f\u6301FP16\u548cINT8\u3002
ARM Mali\uff08Android\uff09\uff1a\u652f\u6301OpenCL\u548cVulkan\u3002Mali GPU\u4f7f\u7528\u57fa\u4e8e\u56fe\u5757\u7684\u67b6\u6784\uff08\u4e0e\u684c\u9762GPU\u4e0d\u540c\uff09\uff0c\u8fd9\u5f71\u54cd\u6700\u4f18\u5185\u5b58\u8bbf\u95ee\u6a21\u5f0f\u3002
Apple GPU\uff08iOS/macOS\uff09\uff1a\u901a\u8fc7Metal\uff08Apple\u7684GPU API\uff09\u8bbf\u95ee\u3002\u7edf\u4e00\u5185\u5b58\u67b6\u6784\u610f\u5473\u7740\u6ca1\u6709CPU\u2194GPU\u590d\u5236\u5f00\u9500\u3002Metal Performance Shaders\uff08MPS\uff09\u63d0\u4f9b\u4f18\u5316\u7684ML\u539f\u8bed\u3002
NPU\u662f\u4e13\u95e8\u4e3aML\u63a8\u7406\u8bbe\u8ba1\u7684\u56fa\u5b9a\u529f\u80fd\u52a0\u901f\u5668\u3002\u5b83\u4eec\u5728\u6807\u51c6ML\u64cd\u4f5c\uff08\u77e9\u9635\u4e58\u3001\u5377\u79ef\u3001\u6fc0\u6d3b\uff09\u4e0a\u6bd4GPU\u8282\u80fd\u5f97\u591a\u3002
Apple\u795e\u7ecf\u5f15\u64ce\uff1a16\u6838\uff0c\u7ea638 TOPS\uff08INT8\uff09\u3002\u901a\u8fc7Core ML\u8bbf\u95ee\u3002\u975e\u5e38\u9002\u5408\u89c6\u89c9\u6a21\u578b\u548c\u8bbe\u5907\u7aef\u6269\u6563\u3002\u4e0d\u80fd\u8fd0\u884c\u4efb\u610f\u4ee3\u7801\u2014\u2014\u53ea\u652f\u6301Core ML\u652f\u6301\u7684\u64cd\u4f5c\u3002
Qualcomm Hexagon NPU\uff1a\u96c6\u6210\u5230Snapdragon SoC\u4e2d\u3002\u652f\u6301INT8\u548cINT4\u63a8\u7406\u3002\u901a\u8fc7SNPE\u6216ONNX Runtime\uff08\u5e26QNN\u540e\u7aef\uff09\u8bbf\u95ee\u3002\u4e3a\u8bbe\u5907\u7aef\u529f\u80fd\u5982\u80cc\u666f\u865a\u5316\u3001\u8bed\u97f3\u8bc6\u522b\u548c\u5b9e\u65f6\u7ffb\u8bd1\u63d0\u4f9b\u652f\u6301\u3002
Google Edge TPU\uff1a\u4e91\u7aefTPU\u7684\u5c0f\u578b\u4f4e\u529f\u8017\u7248\u672c\u30024 TOPS\uff0c2W\u3002\u7528\u4e8eCoral\u8bbe\u5907\u8fdb\u884c\u8bbe\u5907\u7aef\u63a8\u7406\u3002\u4ec5\u652f\u6301INT8\u91cf\u5316\u7684TFLite\u6a21\u578b\u3002
\u59d4\u6d3e\u6a21\u5f0f\uff1a\u8fd0\u884c\u65f6\u5728NPU\uff08\u7528\u4e8e\u652f\u6301\u7684\u64cd\u4f5c\uff09\u548cCPU\uff08\u7528\u4e8e\u4e0d\u652f\u6301\u7684\u64cd\u4f5c\uff09\u4e4b\u95f4\u62c6\u5206\u6a21\u578b\u56fe\u3002\u6700\u5927\u5316\u5728NPU\u4e0a\u8fd0\u884c\u7684\u90e8\u5206\u662f\u6027\u80fd\u548c\u80fd\u6548\u7684\u5173\u952e\u3002
\u6311\u6218\uff1a
llama.cpp\u662f\u8bbe\u5907\u7aefLLM\u7684\u6807\u51c6\u3002\u5b83\u5728CPU\uff08AVX2\u3001NEON\u3001I8MM\uff09\u3001Apple GPU\uff08Metal\uff09\u3001NVIDIA GPU\uff08CUDA\uff09\u3001AMD GPU\uff08ROCm/Vulkan\uff09\u751a\u81f3\u624b\u673a\u4e0a\uff08\u901a\u8fc7Android\u4e0a\u7684Termux\uff09\u8fd0\u884c\u3002
\u8054\u90a6\u5b66\u4e60\u5728\u8bb8\u591a\u8bbe\u5907\u4e0a\u8bad\u7ec3\u6a21\u578b\uff0c\u65e0\u9700\u96c6\u4e2d\u6570\u636e\u3002\u6bcf\u4e2a\u8bbe\u5907\u5728\u5176\u672c\u5730\u6570\u636e\u4e0a\u8bad\u7ec3\uff0c\u8ba1\u7b97\u68af\u5ea6\u66f4\u65b0\uff0c\u5e76\u5c06\u53ea\u6709\u66f4\u65b0\uff08\u800c\u975e\u6570\u636e\uff09\u53d1\u9001\u5230\u805a\u5408\u66f4\u65b0\u7684\u4e2d\u592e\u670d\u52a1\u5668\u3002
\u7b97\u6cd5\uff08FedAvg\uff09\uff1a
\u9690\u79c1\uff1a\u539f\u59cb\u6570\u636e\u4ece\u4e0d\u79bb\u5f00\u8bbe\u5907\u3002\u670d\u52a1\u5668\u53ea\u770b\u5230\u805a\u5408\u7684\u6a21\u578b\u66f4\u65b0\u3002\u5dee\u5206\u9690\u79c1\u5411\u66f4\u65b0\u6dfb\u52a0\u566a\u58f0\uff0c\u4f7f\u5f97\u65e0\u6cd5\u4ece\u68af\u5ea6\u4e2d\u9006\u5411\u63a8\u65ad\u5355\u4e2a\u6570\u636e\u70b9\u3002
\u901a\u4fe1\u6548\u7387\uff1a\u6a21\u578b\u66f4\u65b0\u5f88\u5927\uff08\u4e0e\u6a21\u578b\u76f8\u540c\u5927\u5c0f\uff09\u3002\u538b\u7f29\u6280\u672f\u51cf\u5c11\u4e86\u8fd9\u4e00\u70b9\uff1a\u68af\u5ea6\u91cf\u5316\uff08\u53d1\u9001INT8\u68af\u5ea6\u800c\u4e0d\u662fFP32\uff09\u3001\u7a00\u758f\u5316\uff08\u53ea\u53d1\u9001\u6700\u5927\u7684\u68af\u5ea6\uff09\u548c\u68af\u5ea6\u7d2f\u79ef\uff08\u505a\u66f4\u591a\u672c\u5730\u6b65\u9aa4\uff0c\u53d1\u9001\u66f4\u5c11\u9891\u7387\uff09\u3002
\u5e94\u7528\uff1aGoogle\u7684\u952e\u76d8\u9884\u6d4b\uff08Gboard\uff09\u3001Apple\u7684\u8bed\u97f3\u8bc6\u522b\u3001\u5065\u5eb7\u76d1\u6d4b\uff08\u5728\u654f\u611f\u5065\u5eb7\u6570\u636e\u4e0a\u8bad\u7ec3\u800c\u4e0d\u96c6\u4e2d\u6570\u636e\uff09\u3002
\u9664\u4e86\u538b\u7f29\uff0c\u8fd8\u6709\u51e0\u79cd\u6280\u672f\u51cf\u5c11\u7aef\u5230\u7aef\u63a8\u7406\u5ef6\u8fdf\uff1a
\u63d0\u524d\u9000\u51fa\uff1a\u5728\u4e2d\u95f4\u5c42\u6dfb\u52a0\u5206\u7c7b\u5934\u3002\u5982\u679c\u6a21\u578b\u5728\u7b2c6\u5c42\uff08\u517124\u5c42\uff09\u5df2\u7ecf\u81ea\u4fe1\uff0c\u5219\u8fd4\u56de\u9884\u6d4b\u800c\u4e0d\u8fd0\u884c\u7b2c7-24\u5c42\u3002\u7b80\u5355\u8f93\u5165\u63d0\u524d\u9000\u51fa\uff0c\u56f0\u96be\u8f93\u5165\u4f7f\u7528\u5b8c\u6574\u6a21\u578b\u3002\u5bf9\u4e8e\u6df7\u5408\u7b80\u5355\u548c\u56f0\u96be\u8f93\u5165\u7684\u4efb\u52a1\uff0c\u5e73\u5747\u5ef6\u8fdf\u663e\u8457\u4e0b\u964d\u3002
\u6a21\u578b\u5206\u533a\uff1a\u5728NPU\uff08\u5bf9\u77e9\u9635\u4e58\u9ad8\u6548\uff09\u3001GPU\uff08\u5bf9\u4e0d\u89c4\u5219\u64cd\u4f5c\u9ad8\u6548\uff09\u548cCPU\uff08\u5904\u7406\u5176\u4ed6\u4e00\u5207\uff09\u4e4b\u95f4\u62c6\u5206\u6a21\u578b\u3002\u7f16\u8bd1\u5668\u6839\u636e\u6027\u80fd\u5206\u6790\u51b3\u5b9a\u54ea\u4e9b\u64cd\u4f5c\u53bb\u54ea\u91cc\u3002
\u7f13\u5b58\uff1a\u5bf9\u4e8e\u5177\u6709\u91cd\u590d\u67e5\u8be2\u7684\u5e94\u7528\uff08\u81ea\u52a8\u8865\u5168\u3001\u4ee3\u7801\u8865\u5168\uff09\uff0c\u7f13\u5b58\u6700\u8fd1\u7684\u8ba1\u7b97\u3002\u5982\u679c\u7528\u6237\u8f93\u5165\"How do I\"\u4e14\u6a21\u578b\u6700\u8fd1\u751f\u6210\u4e86\"How do I\"\u7684\u8865\u5168\uff0c\u53ef\u4ee5\u91cd\u7528\u7f13\u5b58\u7684KV\u7f13\u5b58\uff0c\u5b8c\u5168\u8df3\u8fc7\u9884\u586b\u5145\u9636\u6bb5\u3002
\u63a8\u6d4b\u6027\u9884\u53d6\uff1a\u9884\u6d4b\u7528\u6237\u4e0b\u4e00\u6b65\u5c06\u505a\u4ec0\u4e48\uff0c\u5728\u7528\u6237\u8be2\u95ee\u4e4b\u524d\u5f00\u59cb\u63a8\u7406\u3002\u804a\u5929\u5e94\u7528\u53ef\u80fd\u5728\u7528\u6237\u9605\u8bfb\u5f53\u524d\u7b54\u6848\u65f6\u5f00\u59cb\u751f\u6210\u53ef\u80fd\u540e\u7eed\u95ee\u9898\u7684\u54cd\u5e94\u3002
\u6a21\u62df\u6a21\u578b\u538b\u7f29\u6d41\u6c34\u7ebf\u3002\u4ecefloat32\u6a21\u578b\u5f00\u59cb\uff0c\u4f9d\u6b21\u5e94\u7528\u84b8\u998f\uff08\u6a21\u62df\uff09\u3001\u526a\u679d\u548c\u91cf\u5316\uff0c\u5e76\u8ddf\u8e2a\u6bcf\u4e00\u6b65\u7684\u5927\u5c0f\u3002
def compression_pipeline(original_params_M, original_bits=32):\n size_mb = original_params_M * 1e6 * original_bits / 8 / 1e6\n\n print(f\"\u539f\u59cb: {original_params_M}M \u53c2\u6570, {original_bits}-\u4f4d \u2192 {size_mb:.0f} MB\")\n\n # \u6b65\u9aa41\uff1a\u77e5\u8bc6\u84b8\u998f\uff08\u51cf\u5c11\u53c2\u6570\uff09\n distilled_params = original_params_M * 0.15 # 70B \u2192 ~10B \u7b49\u4ef7\n size_mb = distilled_params * 1e6 * original_bits / 8 / 1e6\n print(f\"\u84b8\u998f\u540e ({distilled_params:.0f}M \u53c2\u6570): {size_mb:.0f} MB\")\n\n # \u6b65\u9aa42\uff1a\u7ed3\u6784\u5316\u526a\u679d\uff08\u79fb\u9664\u5269\u4f5930%\uff09\n pruned_params = distilled_params * 0.7\n size_mb = pruned_params * 1e6 * original_bits / 8 / 1e6\n print(f\"\u526a\u679d\u540e ({pruned_params:.0f}M \u53c2\u6570): {size_mb:.0f} MB\")\n\n # \u6b65\u9aa43\uff1aINT4\u91cf\u5316\n size_mb = pruned_params * 1e6 * 4 / 8 / 1e6\n print(f\"INT4\u91cf\u5316\u540e: {size_mb:.0f} MB\")\n\n print(f\"\u603b\u538b\u7f29\u6bd4: {original_params_M * 1e6 * original_bits / 8 / 1e6 / size_mb:.0f}x\")\n\nprint(\"=== \u4ece70B\u6a21\u578b\u5f00\u59cb ===\")\ncompression_pipeline(70000)\n\nprint(\"\\n=== \u4ece7B\u6a21\u578b\u5f00\u59cb ===\")\ncompression_pipeline(7000)\n \u4f30\u8ba1\u8bbe\u5907\u7aef\u63a8\u7406\u5ef6\u8fdf\u3002\u7ed9\u5b9a\u6a21\u578b\u7684\u64cd\u4f5c\u8ba1\u6570\u548c\u786c\u4ef6\u89c4\u683c\uff0c\u8ba1\u7b97\u662f\u5426\u6ee1\u8db3\u5ef6\u8fdf\u76ee\u6807\u3002
def estimate_latency(model_name, params_M, bits, compute_tops, mem_bw_gbs, seq_len=256):\n \"\"\"\u4f30\u8ba1\u5185\u5b58\u5e26\u5bbd\u53d7\u9650\u6a21\u578b\u7684token\u751f\u6210\u5ef6\u8fdf\u3002\"\"\"\n # \u6a21\u578b\u5927\u5c0f\uff08\u5b57\u8282\uff09\n model_bytes = params_M * 1e6 * bits / 8\n\n # \u89e3\u7801\u662f\u5185\u5b58\u53d7\u9650\u7684\uff1a\u6bcftoken\u5fc5\u987b\u52a0\u8f7d\u6574\u4e2a\u6a21\u578b\n time_per_token_ms = model_bytes / (mem_bw_gbs * 1e9) * 1000\n\n # \u6bcf\u79d2token\u6570\n tokens_per_sec = 1000 / time_per_token_ms\n\n print(f\"{model_name}: {params_M/1000:.1f}B \u53c2\u6570 @ {bits}-\u4f4d = {model_bytes/1e9:.1f} GB\")\n print(f\" \u5185\u5b58\u5e26\u5bbd: {mem_bw_gbs} GB/s\")\n print(f\" \u6bcftoken\u65f6\u95f4: {time_per_token_ms:.1f} ms\")\n print(f\" Tokens/\u79d2: {tokens_per_sec:.0f}\")\n print()\n\n# Apple M2 Pro\uff1a200 GB/s \u7edf\u4e00\u5185\u5b58\u5e26\u5bbd\nprint(\"=== Apple M2 Pro (200 GB/s) ===\")\nestimate_latency(\"Llama-7B Q4\", 7000, 4, 15.8, 200)\nestimate_latency(\"Llama-7B Q8\", 7000, 8, 15.8, 200)\nestimate_latency(\"Llama-70B Q4\", 70000, 4, 15.8, 200)\n\n# \u624b\u673a\uff08Snapdragon 8 Gen 3\uff09\uff1a~50 GB/s LPDDR5\nprint(\"=== Snapdragon 8 Gen 3 (50 GB/s) ===\")\nestimate_latency(\"Phi-3 Mini Q4\", 3800, 4, 45, 50)\nestimate_latency(\"Llama-3B Q4\", 3000, 4, 45, 50)\n \u5411\u6570\u767e\u4e07\u7528\u6237\u63d0\u4f9b\u5927\u6a21\u578b\u670d\u52a1\u9700\u8981\u8de8\u591a\u4e2aGPU\u5206\u5e03\u63a8\u7406\u3001\u5728\u9700\u8981\u4e4b\u524d\u9884\u6d4btoken\u3001\u7f13\u5b58\u5171\u4eab\u4e0a\u4e0b\u6587\u4ee5\u53ca\u9009\u62e9\u5408\u9002\u7684\u6846\u67b6\u3002\u672c\u6587\u6db5\u76d6\u63a8\u7406\u65f6\u7684\u5e76\u884c\u6027\u3001\u63a8\u6d4b\u6027\u89e3\u7801\u3001\u524d\u7f00\u7f13\u5b58\u3001\u63a8\u7406\u6846\u67b6\u3001\u6210\u672c\u4f18\u5316\u548c\u76d1\u63a7
\u5728\u63a8\u7406\u65f6\uff0c\u5f20\u91cf\u5e76\u884c\u662f\u6a21\u578b\u65e0\u6cd5\u88c5\u5165\u5355\u5f20GPU\u65f6\u7684\u9ed8\u8ba4\u9009\u62e9\u3002FP16\u768470B\u6a21\u578b\u9700\u8981140 GB\u2014\u2014\u8de82\u5f2080 GB GPU\u4f7f\u7528\u5f20\u91cf\u5e76\u884c\u62c6\u5206\u3002
\u5ef6\u8fdf\u5f71\u54cd\uff1a\u5f20\u91cf\u5e76\u884c\u6bcf\u5c42\u589e\u52a0\u4e00\u4e2aall-reduce\u901a\u4fe1\u6b65\u9aa4\u3002\u5728NVLink\uff08900 GB/s\uff09\u4e0a\uff0c\u6bcf\u5c42\u589e\u52a0\u7ea60.1 ms\u3002\u5728PCIe\uff0832 GB/s\uff09\u4e0a\uff0c\u6bcf\u5c42\u589e\u52a0\u7ea63 ms\u3002\u5bf9\u4e8e80\u5c42\u768470B\u6a21\u578b\u57282\u5f20GPU\u4e0a\uff1aNVLink\u603b\u589e\u52a0\u7ea68 ms\uff0cPCIe\u603b\u589e\u52a0\u7ea6240 ms\u3002\u8fd9\u5c31\u662fNVLink\u5bf9\u591aGPU\u63a8\u7406\u81f3\u5173\u91cd\u8981\u7684\u539f\u56e0\u3002
\u6d41\u6c34\u7ebf\u5e76\u884c\u5c06\u4e0d\u540c\u7684\u5c42\u5206\u914d\u7ed9\u4e0d\u540c\u7684GPU\u3002GPU 1\u5904\u7406\u7b2c0-39\u5c42\uff0cGPU 2\u5904\u7406\u7b2c40-79\u5c42\u3002token\u987a\u5e8f\u6d41\u8fc7\u6d41\u6c34\u7ebf\u3002
\u5728\u63a8\u7406\u65f6\uff0c\u6d41\u6c34\u7ebf\u5e76\u884c\u7684\u5ef6\u8fdf\u9ad8\u4e8e\u5f20\u91cf\u5e76\u884c\uff08\u6bcf\u4e2atoken\u5fc5\u987b\u904d\u5386\u6574\u4e2a\u6d41\u6c34\u7ebf\uff09\uff0c\u4f46\u901a\u4fe1\u5f00\u9500\u66f4\u4f4e\uff08\u53ea\u6709\u6fc0\u6d3b\u503c\u5728GPU\u4e4b\u95f4\u4f20\u9012\uff0c\u65e0\u9700all-reduce\uff09\u3002\u5f53GPU\u901a\u8fc7\u6162\u901f\u4e92\u8fde\uff08\u4e0d\u540c\u8282\u70b9\uff0c\u65e0NVLink\uff09\u8fde\u63a5\u65f6\uff0c\u66f4\u503e\u5411\u4e8e\u4f7f\u7528\u6d41\u6c34\u7ebf\u5e76\u884c\u3002
\u5bf9\u4e8e\u975e\u5e38\u957f\u7684\u5e8f\u5217\uff0c\u5373\u4f7f\u6a21\u578b\u672c\u8eab\u9002\u5408\uff0cKV\u7f13\u5b58\u672c\u8eab\u53ef\u80fd\u65e0\u6cd5\u88c5\u5165\u5355\u5f20GPU\u3002\u5e8f\u5217\u5e76\u884c\u5c06KV\u7f13\u5b58\u5206\u7247\u5230\u591a\u4e2aGPU\u4e0a\uff1a\u6bcf\u4e2aGPU\u5b58\u50a8\u5e8f\u5217\u7f13\u5b58\u952e\u548c\u503c\u7684\u4e00\u90e8\u5206\u3002
\u5728\u6ce8\u610f\u529b\u671f\u95f4\uff0c\u6bcf\u4e2aGPU\u5728\u5176\u7f13\u5b58\u7684\u6bb5\u4e0a\u8ba1\u7b97\u90e8\u5206\u6ce8\u610f\u529b\u5206\u6570\uff0c\u7136\u540e\u901a\u8fc7\u89c4\u7ea6\u5408\u5e76\u7ed3\u679c\u3002\u8fd9\u7528\u4e8e\u957f\u4e0a\u4e0b\u6587\u63a8\u7406\uff08128K+ token\uff09\uff0c\u5176\u4e2dKV\u7f13\u5b58\u8d85\u8fc7\u5355GPU\u5185\u5b58\u3002
\u4e3a\u4ec0\u4e48\u65e0\u8d28\u91cf\u635f\u5931\uff1a\u62d2\u7edd\u91c7\u6837\u65b9\u6848\u4fdd\u8bc1\u8f93\u51fa\u5206\u5e03\u4e0e\u76ee\u6807\u6a21\u578b\u5b8c\u5168\u5339\u914d\u3002\u63a8\u6d4b\u6027\u89e3\u7801\u662f\u65e0\u635f\u7684\u2014\u2014\u8f93\u51fa\u5728\u7edf\u8ba1\u4e0a\u4e0e\u5355\u72ec\u8fd0\u884c\u76ee\u6807\u6a21\u578b\u76f8\u540c\uff0c\u53ea\u662f\u66f4\u5feb\u3002
\u53d8\u4f53\uff1a
\u8bb8\u591a\u8bf7\u6c42\u5171\u4eab\u5171\u540c\u7684\u524d\u7f00\uff1a\u7cfb\u7edf\u63d0\u793a\u3001few-shot\u793a\u4f8b\u6216\u5e38\u89c1\u67e5\u8be2\u6a21\u5f0f\u3002\u524d\u7f00\u7f13\u5b58\u5b58\u50a8\u8fd9\u4e9b\u524d\u7f00\u7684KV\u7f13\u5b58\u5e76\u5728\u8bf7\u6c42\u4e4b\u95f4\u91cd\u7528\u3002
\u7cfb\u7edf\u63d0\u793a\u7f13\u5b58\uff1a\u5982\u679c\u6bcf\u4e2a\u8bf7\u6c42\u90fd\u4ee5\u76f8\u540c\u76842000-token\u7cfb\u7edf\u63d0\u793a\u5f00\u59cb\uff0c\u8fd92000\u4e2atoken\u7684KV\u7f13\u5b58\u88ab\u8ba1\u7b97\u4e00\u6b21\uff0c\u5e76\u5728\u6240\u6709\u8bf7\u6c42\u4e4b\u95f4\u5171\u4eab\u3002\u5bf9\u4e8e80\u5c42\u768470B\u6a21\u578b\uff0c\u6bcf\u6b21\u8bf7\u6c42\u8282\u7701\u7ea6200 MB\u3002
\u57fa\u6570\u6811\u7f13\u5b58\uff08SGLang\uff09\uff1a\u5c06\u7f13\u5b58\u7684\u524d\u7f00\u7ec4\u7ec7\u5728\u57fa\u6570\u6811\uff08trie\uff09\u4e2d\u3002\u5f53\u65b0\u8bf7\u6c42\u5230\u8fbe\u65f6\uff0c\u627e\u5230\u6700\u957f\u7684\u7f13\u5b58\u524d\u7f00\u5339\u914d\uff0c\u5e76\u4ece\u90a3\u91cc\u5f00\u59cb\u751f\u6210\uff0c\u8df3\u8fc7\u5339\u914d\u524d\u7f00\u7684\u8ba1\u7b97\u3002
\u5f71\u54cd\uff1a\u5bf9\u4e8e\u5177\u6709\u957f\u5171\u4eab\u524d\u7f00\u7684\u5e94\u7528\uff08\u5e26\u7cfb\u7edf\u63d0\u793a\u7684\u804a\u5929\u673a\u5668\u4eba\u3001\u5177\u6709\u5e38\u89c1\u68c0\u7d22\u6bb5\u843d\u7684RAG\uff09\uff0c\u524d\u7f00\u7f13\u5b58\u5c06TTFT\u964d\u4f4e50-90%\uff0c\u5e76\u8282\u7701\u76f8\u5e94\u7684GPU\u8ba1\u7b97\u3002
\u9664\u4e86\u91cf\u5316KV\u7f13\u5b58\uff08\u6587\u4ef601\uff09\u548c\u4f7f\u7528GQA/MLA\u51cf\u5c0f\u5176\u5927\u5c0f\uff08\u6587\u4ef602\uff09\u4e4b\u5916\uff0cKV\u7f13\u5b58\u9a71\u9010\u7b56\u7565\u9009\u62e9\u6027\u5730\u79fb\u9664\u4e0d\u592a\u53ef\u80fd\u5728\u672a\u6765\u88ab\u5173\u6ce8\u7684\u7f13\u5b58token\u3002
H2O\uff08\u91cd\u8981token\u8bc6\u522b\u5668\uff0cZhang\u7b49\u4eba\uff0c2023\uff09\u89c2\u5bdf\u5230\u6ce8\u610f\u529b\u5206\u6570\u9075\u5faa\u5e42\u5f8b\uff1a\u4e00\u5c0f\u90e8\u5206token\uff08\"\u91cd\u8981token\"\uff09\u83b7\u5f97\u5927\u90e8\u5206\u6ce8\u610f\u529b\uff0c\u800c\u5927\u591a\u6570token\u83b7\u5f97\u7684\u6ce8\u610f\u529b\u53ef\u4ee5\u5ffd\u7565\u4e0d\u8ba1\u3002H2O\u4fdd\u7559\uff1a
\u65e2\u4e0d\u662f\u6700\u8fd1\u4e5f\u4e0d\u662f\u91cd\u8981token\u7684token\u88ab\u9a71\u9010\u3002\u8fd9\u4fdd\u6301\u56fa\u5b9a\u5927\u5c0f\u7684KV\u7f13\u5b58\uff0c\u540c\u65f6\u4fdd\u7559\u5b9e\u9645\u5f71\u54cd\u751f\u6210\u7684token\u3002H2O\u4ec5\u4f7f\u752820%\u7684\u5185\u5b58\u5c31\u5b9e\u73b0\u4e86\u63a5\u8fd1\u5b8c\u6574KV\u7f13\u5b58\u7684\u8d28\u91cf\u3002
Scissorhands\uff08Liu\u7b49\u4eba\uff0c2023\uff09\u91c7\u7528\u7c7b\u4f3c\u65b9\u6cd5\uff0c\u4f46\u4f7f\u7528\u66f4\u590d\u6742\u7684\u5ea6\u91cf\uff1a\u5728\u5f53\u524d\u6b65\u9aa4\u4e2d\u83b7\u5f97\u9ad8\u6ce8\u610f\u529b\u7684token\u88ab\u4fdd\u7559\uff0c\u800c\u5df2\u7ecf\\(T\\)\u6b65\u6ca1\u6709\u88ab\u5173\u6ce8\u7684token\u88ab\u9a71\u9010\u3002\u8fd9\u9002\u5e94\u4e86\u751f\u6210\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u529b\u6a21\u5f0f\u7684\u53d8\u5316\u3002
\u52a8\u6001\u9a71\u9010+StreamingLLM\uff1a\u7ed3\u5408\u6ce8\u610f\u529b\u6c47\u805a\u70b9\uff08\u6c38\u4e45\u4fdd\u7559\u524d\u51e0\u4e2atoken\uff09\u548c\u52a8\u6001\u9a71\u9010\uff08\u4fdd\u7559\u6700\u8fd1+\u91cd\u8981token\uff09\u3002\u8fd9\u662f\u6700\u5185\u5b58\u9ad8\u6548\u7684\u65b9\u6cd5\uff0c\u9002\u7528\u4e8e\u975e\u5e38\u957f\u7684\u751f\u6210\uff0c\u5b9e\u73b0\u4e86\u65e0\u9650\u957f\u5ea6\u751f\u6210\uff0c\u8d28\u91cf\u4e0b\u964d\u6709\u9650\u3002
\u6240\u6709\u9a71\u9010\u65b9\u6cd5\u7684\u6838\u5fc3\u6d1e\u5bdf\uff1aLLM\u6ce8\u610f\u529b\u5728\u5b9e\u8df5\u4e2d\u662f\u7a00\u758f\u7684\u2014\u2014\u5c3d\u7ba1\u67b6\u6784\u4f1a\u5bf9\u6240\u6709\u7f13\u5b58\u7684token\u8ba1\u7b97\u6ce8\u610f\u529b\uff0c\u4f46\u5b9e\u9645\u6ce8\u610f\u529b\u6743\u91cd\u96c6\u4e2d\u5728\u5c0f\u5b50\u96c6\u4e0a\u3002\u9a71\u9010\u5176\u4f59\u90e8\u5206\u5bf9\u8f93\u51fa\u8d28\u91cf\u5f71\u54cd\u6781\u5c0f\u3002
vLLM\u662f\u751f\u4ea7\u7ea7LLM\u670d\u52a1\u7684\u9ed8\u8ba4\u9009\u62e9\u3002\u5b83\u652f\u6301\u8fde\u7eed\u6279\u5904\u7406\u3001PagedAttention\u3001\u5f20\u91cf\u5e76\u884c\u3001\u63a8\u6d4b\u6027\u89e3\u7801\u3001LoRA\u670d\u52a1\u548c\u5927\u591a\u6570\u5f00\u6e90\u6a21\u578b\u3002
TensorRT-LLM\u5728NVIDIA\u786c\u4ef6\u4e0a\u5b9e\u73b0\u6700\u9ad8\u7684\u539f\u59cb\u6027\u80fd\uff08\u5728\u76f8\u540cGPU\u4e0a\u6bd4vLLM\u5feb10-30%\uff09\uff0c\u4f46\u7075\u6d3b\u6027\u8f83\u4f4e\u4e14\u66f4\u96be\u4ee5\u5b9a\u5236\u3002
SGLang\u5728\u5e94\u7528\u5177\u6709\u7ed3\u6784\u5316\u8f93\u51fa\uff08JSON\u3001\u7279\u5b9a\u683c\u5f0f\u7684\u4ee3\u7801\uff09\u6216\u5171\u4eab\u524d\u7f00\u65f6\u8868\u73b0\u51fa\u8272\uff0c\u8fd9\u5f97\u76ca\u4e8e\u5176\u57fa\u6570\u6ce8\u610f\u529b\u7f13\u5b58\u548c\u53d7\u9650\u89e3\u7801\u5f15\u64ce\u3002
\u5728\u89c4\u6a21\u4e0a\uff0c\u63a8\u7406\u6210\u672c\u4e3b\u5bfcML\u9884\u7b97\u3002\u964d\u4f4e\u6210\u672c\u7684\u7b56\u7565\uff1a
\u5408\u7406\u9009\u62e9GPU\uff1a\u5e76\u975e\u6bcf\u4e2a\u6a21\u578b\u90fd\u9700\u8981H100\u3002\u91cf\u5316\u76847B\u6a21\u578b\u5728A10G\uff08\u7ea6\\(1/\u5c0f\u65f6\uff09\u4e0a\u8fd0\u884c\u826f\u597d\uff0c\u800c\u4e0d\u662fH100\uff08\u7ea6\\)8/\u5c0f\u65f6\uff09\u3002\u5339\u914dGPU\u5230\u5de5\u4f5c\u8d1f\u8f7d\u3002
\u7ade\u4ef7\u5b9e\u4f8b\uff1a\u4e91\u63d0\u4f9b\u5546\u63d0\u4f9b\u672a\u4f7f\u7528\u7684GPU\u5bb9\u91cf\uff0c\u6298\u626360-90%\uff08AWS Spot\u3001GCP Preemptible\uff09\u3002\u7ade\u4ef7\u5b9e\u4f8b\u53ef\u80fd\u88ab\u4e2d\u65ad\uff0c\u56e0\u6b64\u9002\u7528\u4e8e\u6279\u5904\u7406\u63a8\u7406\u800c\u4e0d\u662f\u5ef6\u8fdf\u5173\u952e\u578b\u670d\u52a1\u3002\u7ed3\u5408\u62a2\u5360\u5904\u7406\uff08\u4fdd\u5b58\u72b6\u6001\uff0c\u5728\u65b0\u5b9e\u4f8b\u4e0a\u6062\u590d\uff09\uff0c\u7ade\u4ef7\u5b9e\u4f8b\u4e5f\u53ef\u4ee5\u670d\u52a1\u4ea4\u4e92\u5f0f\u6d41\u91cf\u3002
\u81ea\u52a8\u6269\u7f29\uff1a\u6839\u636e\u6d41\u91cf\u6269\u5c55GPU\u6570\u91cf\u3002\u9ad8\u5cf0\u671f\u6269\u5c55\uff0c\u591c\u95f4\u7f29\u51cf\u3002Kubernetes HPA\uff08\u6c34\u5e73Pod\u81ea\u52a8\u6269\u7f29\u5668\uff09\u6216\u4e91\u539f\u751f\u81ea\u52a8\u6269\u7f29\uff08AWS SageMaker\u3001GCP Vertex AI\uff09\u5904\u7406\u6b64\u529f\u80fd\u3002
\u6279\u5904\u7406+\u5229\u7528\u7387\uff1a30%\u548c90% GPU\u5229\u7528\u7387\u4e4b\u95f4\u7684\u5dee\u5f02\u662f\u6bcftoken\u6210\u672c3\u500d\u3002\u8fde\u7eed\u6279\u5904\u7406\u3001\u667a\u80fd\u8c03\u5ea6\u548cPagedAttention\u90fd\u63d0\u9ad8\u4e86\u5229\u7528\u7387\u3002
\u91cf\u5316\uff1aINT4 vs FP16\u662f4\u500d\u66f4\u5c11\u5185\u5b58 \u2192 \u9002\u5408\u66f4\u5c0f\u7684GPU \u2192 \u6210\u672c\u964d\u4f4e2-4\u500d\u3002\u6b64\u5916\uff0c\u66f4\u591a\u8bf7\u6c42\u9002\u5408\u540c\u4e00\u6279\u6b21 \u2192 \u66f4\u9ad8\u541e\u5410\u91cf \u2192 \u66f4\u4f4e\u6bcftoken\u6210\u672c\u3002
\u6bcftoken\u6210\u672c\u57fa\u51c6\uff08\u8fd1\u4f3c\u503c\uff0c2026\u5e74\uff09\uff1a
\u751f\u4ea7\u63a8\u7406\u9700\u8981\u6301\u7eed\u76d1\u63a7\uff0c\u4ee5\u4fbf\u5728\u7528\u6237\u53d7\u5230\u5f71\u54cd\u4e4b\u524d\u53d1\u73b0\u964d\u7ea7\uff1a
\u5ef6\u8fdf\u76d1\u63a7\uff1a\u8ddf\u8e2aTTFT\u548cTPOT\u7684p50\u3001p95\u548cp99\u3002\u8bbe\u7f6e\u544a\u8b66\uff0c\u5f53p99\u8d85\u8fc7SLO\u65f6\u89e6\u53d1\u3002p99\u7684\u5c16\u5cf0\u901a\u5e38\u6307\u793a\uff1aKV\u7f13\u5b58\u5185\u5b58\u538b\u529b\uff08\u6296\u52a8\uff09\u3001\u957f\u65f6\u95f4\u8fd0\u884c\u7684\u8bf7\u6c42\u5784\u65ad\u6279\u6b21\u3001\u6216GPU\u70ed\u8282\u6d41\u3002
\u541e\u5410\u91cf\u76d1\u63a7\uff1a\u8ddf\u8e2a\u6bcfGPU\u6bcf\u79d2token\u6570\u3002\u4e0b\u964d\u6307\u793a\uff1a\u6279\u6b21\u6548\u7387\u964d\u4f4e\uff08\u8bb8\u591a\u77ed\u8bf7\u6c42\u2192\u6279\u6b21\u5229\u7528\u7387\u4f4e\uff09\u3001\u5e8f\u5217\u957f\u5ea6\u589e\u52a0\uff08\u6bcf\u4e2a\u8bf7\u6c42\u66f4\u591aKV\u7f13\u5b58\u5185\u5b58\uff09\u3001\u6216\u786c\u4ef6\u95ee\u9898\uff08GPU\u5904\u4e8eECC\u7ea0\u9519\u6a21\u5f0f\uff0c\u8fd0\u884c\u66f4\u6162\uff09\u3002
GPU\u5229\u7528\u7387\uff1a\u8ddf\u8e2aSM\u5360\u7528\u7387\u3001\u5185\u5b58\u5229\u7528\u7387\u548c\u5185\u5b58\u5e26\u5bbd\u3002\u4f4eSM\u5360\u7528\u7387+\u9ad8\u5185\u5b58\u5229\u7528\u7387=\u5185\u5b58\u53d7\u9650\uff08\u9700\u8981\u66f4\u591a\u5e26\u5bbd\u6216\u91cf\u5316\uff09\u3002\u9ad8SM\u5360\u7528\u7387+\u4f4e\u5185\u5b58\u5229\u7528\u7387=\u8ba1\u7b97\u53d7\u9650\uff08\u9700\u8981\u66f4\u591aFLOPS\u6216\u66f4\u5c0f\u6a21\u578b\uff09\u3002
\u6a21\u578b\u8d28\u91cf\u76d1\u63a7\uff1a\u8ddf\u8e2a\u6bcf\u8bf7\u6c42\u6307\u6807\uff08\u54cd\u5e94\u957f\u5ea6\u3001\u4fdd\u7559\u96c6\u4e0a\u7684\u56f0\u60d1\u5ea6\u3001\u7528\u6237\u53cd\u9988\u4fe1\u53f7\uff09\u3002\u6a21\u578b\u8d28\u91cf\u53ef\u80fd\u56e0\u4ee5\u4e0b\u539f\u56e0\u964d\u7ea7\uff1a\u6570\u636e\u6f02\u79fb\uff08\u4f20\u5165\u8bf7\u6c42\u7684\u5206\u5e03\u53d8\u5316\uff09\u3001KV\u7f13\u5b58\u91cf\u5316\u8bef\u5dee\u5728\u957f\u5bf9\u8bdd\u4e2d\u7d2f\u79ef\u3001\u6216\u670d\u52a1\u6d41\u6c34\u7ebf\u4e2d\u7684\u9519\u8bef\u3002
\u6210\u672c\u76d1\u63a7\uff1a\u8ddf\u8e2a\u6bcf\u6a21\u578b\u6bcfGPU\u7c7b\u578b\u6bcftoken\u6210\u672c\u3002\u5982\u679c\u6210\u672c\u589e\u52a0\u800c\u541e\u5410\u91cf\u6ca1\u6709\u589e\u52a0\uff0c\u8c03\u67e5\u6548\u7387\u56de\u5f52\uff08\u65b0\u6a21\u578b\u7248\u672c\u5185\u5b58\u4f7f\u7528\u66f4\u9ad8\u3001\u6279\u6b21\u914d\u7f6e\u6b21\u4f18\u3001\u6216GPU\u5229\u7528\u4e0d\u8db3\uff09\u3002
\u5de5\u5177\uff1aPrometheus + Grafana\uff08\u7b2c15\u7ae0\uff09\u7528\u4e8e\u57fa\u7840\u8bbe\u65bd\u6307\u6807\uff0cvLLM/TRT-LLM\u7684\u5185\u7f6e\u6307\u6807\u7aef\u70b9\uff0c\u4ee5\u53ca\u7528\u4e8e\u6a21\u578b\u7ea7\u6307\u6807\u7684\u81ea\u5b9a\u4e49\u65e5\u5fd7\u8bb0\u5f55\u3002
\u6a21\u62df\u63a8\u6d4b\u6027\u89e3\u7801\u3002\u4f7f\u7528\u5feb\u901f\u7684\"\u8349\u7a3f\"\u51fd\u6570\u548c\u6162\u901f\u7684\"\u76ee\u6807\"\u51fd\u6570\uff0c\u6d4b\u91cf\u4e00\u6b21\u751f\u6210\u548c\u9a8c\u8bc1\u591a\u4e2atoken\u7684\u52a0\u901f\u6bd4\u3002
import random\nimport time\n\ndef target_model(tokens):\n \"\"\"\u6162\u4f46\u51c6\u786e\u7684\u6a21\u578b\u3002\u8fd4\u56de\u6bcf\u4e2a\u5019\u9009token\u7684\u6982\u7387\u3002\"\"\"\n time.sleep(0.01) # \u6a21\u62df\u6bcf\u6b21\u524d\u5411\u4f20\u64ad10ms\n # \u7528\u4e8e\u6a21\u62df\uff1a\u63a5\u53d7\u5076\u6570token\n return [0.9 if t % 2 == 0 else 0.1 for t in tokens]\n\ndef draft_model():\n \"\"\"\u5feb\u4f46\u8fd1\u4f3c\u7684\u6a21\u578b\u3002\u751f\u6210\u4e00\u4e2a\u5019\u9009token\u3002\"\"\"\n time.sleep(0.001) # \u6a21\u62df\u6bcftoken 1ms\n return random.randint(0, 9)\n\ndef standard_decoding(n_tokens):\n \"\"\"\u4e00\u6b21\u751f\u6210\u4e00\u4e2atoken\uff0c\u4f7f\u7528\u76ee\u6807\u6a21\u578b\u3002\"\"\"\n tokens = []\n for _ in range(n_tokens):\n time.sleep(0.01) # \u76ee\u6807\u6a21\u578b\u751f\u62101\u4e2atoken\n tokens.append(random.randint(0, 9))\n return tokens\n\ndef speculative_decoding(n_tokens, k=4):\n \"\"\"\u751f\u6210k\u4e2a\u8349\u7a3ftoken\uff0c\u7528\u76ee\u6807\u6a21\u578b\u9a8c\u8bc1\uff0c\u63a5\u53d7/\u62d2\u7edd\u3002\"\"\"\n tokens = []\n total_target_calls = 0\n\n while len(tokens) < n_tokens:\n # \u8349\u7a3f\uff1a\u5feb\u901f\u751f\u6210k\u4e2a\u5019\u9009\n candidates = [draft_model() for _ in range(k)]\n\n # \u9a8c\u8bc1\uff1a\u4e00\u6b21\u76ee\u6807\u6a21\u578b\u8c03\u7528\u9a8c\u8bc1\u6240\u6709k\u4e2a\u5019\u9009\n probs = target_model(candidates)\n total_target_calls += 1\n\n # \u63a5\u53d7token\uff0c\u76f4\u5230\u4e00\u4e2a\u88ab\u62d2\u7edd\n for i, (tok, prob) in enumerate(zip(candidates, probs)):\n if random.random() < prob:\n tokens.append(tok)\n if len(tokens) >= n_tokens:\n break\n else:\n # \u4ece\u76ee\u6807\u5206\u5e03\u91cd\u65b0\u91c7\u6837\n tokens.append(tok + 1) # \u7b80\u5316\u91cd\u65b0\u91c7\u6837\n break\n\n return tokens, total_target_calls\n\nn = 50\n\nstart = time.time()\n_ = standard_decoding(n)\nstandard_time = time.time() - start\n\nstart = time.time()\n_, target_calls = speculative_decoding(n, k=5)\nspec_time = time.time() - start\n\nprint(f\"\u6807\u51c6: {standard_time:.2f}s ({n} \u6b21\u76ee\u6807\u8c03\u7528)\")\nprint(f\"\u63a8\u6d4b\u6027: {spec_time:.2f}s ({target_calls} \u6b21\u76ee\u6807\u8c03\u7528)\")\nprint(f\"\u52a0\u901f\u6bd4: {standard_time / spec_time:.1f}x\")\n \u4f30\u8ba1\u5e94\u7528\u4e8eLLM\u670d\u52a1\u90e8\u7f72\u7684\u4e0d\u540c\u4f18\u5316\u7b56\u7565\u7684\u6210\u672c\u8282\u7701\u3002
def serving_cost_analysis(\n model_name, params_B, precision_bits,\n gpu_name, gpu_mem_gb, gpu_cost_per_hr,\n target_throughput_tps,\n):\n \"\"\"\u4f30\u8ba1LLM\u90e8\u7f72\u7684\u670d\u52a1\u6210\u672c\u3002\"\"\"\n model_size_gb = params_B * 1e9 * precision_bits / 8 / 1e9\n gpus_for_model = max(1, int((model_size_gb * 1.2) / gpu_mem_gb + 0.99)) # 1.2x\u7528\u4e8eKV\u7f13\u5b58\n\n # \u7c97\u7565\u541e\u5410\u91cf\u4f30\u8ba1\uff08\u5185\u5b58\u5e26\u5bbd\u53d7\u9650\uff09\n tokens_per_gpu = 500 / (params_B * precision_bits / 16) # \u5f52\u4e00\u5316\u52307B FP16\u7684500 tok/s\n total_throughput = tokens_per_gpu * gpus_for_model\n\n replicas = max(1, int(target_throughput_tps / total_throughput + 0.99))\n total_gpus = gpus_for_model * replicas\n cost_per_hr = total_gpus * gpu_cost_per_hr\n cost_per_1M_tokens = cost_per_hr / (total_throughput * replicas * 3600 / 1e6)\n\n print(f\"{model_name} @ {precision_bits}-\u4f4d \u5728 {gpu_name} \u4e0a:\")\n print(f\" \u6a21\u578b\u5927\u5c0f: {model_size_gb:.0f} GB \u2192 {gpus_for_model} GPU(s)/\u526f\u672c\")\n print(f\" \u541e\u5410\u91cf: {total_throughput:.0f} tok/s/\u526f\u672c\")\n print(f\" \u9700\u8fbe\u5230{target_throughput_tps} tok/s\u7684\u526f\u672c\u6570: {replicas}\")\n print(f\" \u603bGPU\u6570: {total_gpus}\")\n print(f\" \u6210\u672c: ${cost_per_hr:.0f}/\u5c0f\u65f6, ${cost_per_1M_tokens:.2f}/100\u4e07token\")\n print()\n\nprint(\"=== \u6210\u672c\u6bd4\u8f83 ===\\n\")\n\n# \u57fa\u7ebf\uff1aH100\u4e0a\u7684FP16\nserving_cost_analysis(\"Llama-70B\", 70, 16, \"H100\", 80, 8.0, 1000)\n\n# \u91cf\u5316\u540e\uff1aH100\u4e0a\u7684INT8\nserving_cost_analysis(\"Llama-70B\", 70, 8, \"H100\", 80, 8.0, 1000)\n\n# \u91cf\u5316\u540e\uff1aA100\u4e0a\u7684INT4\nserving_cost_analysis(\"Llama-70B\", 70, 4, \"A100\", 80, 4.0, 1000)\n\n# \u5c0f\u6a21\u578b\uff1aA10G\u4e0a\u76848B\nserving_cost_analysis(\"Llama-8B\", 8, 4, \"A10G\", 24, 1.0, 1000)\n \u7cfb\u7edf\u8bbe\u8ba1\u662f\u6784\u5efa\u53ef\u5728\u5927\u89c4\u6a21\u4e0b\u53ef\u9760\u8fd0\u884c\u7684\u8f6f\u4ef6\u7684\u65b9\u6cd5\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u5ba2\u6237\u7aef-\u670d\u52a1\u5668\u67b6\u6784\u3001\u7f51\u7edc\u534f\u8bae\u3001DNS\u3001\u4ee3\u7406\u3001\u8d1f\u8f7d\u5747\u8861\u3001\u7f13\u5b58\u3001\u6570\u636e\u5e93\u3001\u6d88\u606f\u961f\u5217\u3001\u4e00\u81f4\u6027\u6a21\u578b\u548c\u5f39\u6027\u6a21\u5f0f
.proto\u6587\u4ef6\u4e2d\u5b9a\u4e49\u6d88\u606f\u6a21\u5f0f\uff1amessage PredictRequest {\n repeated float features = 1;\n string model_version = 2;\n}\n\nmessage PredictResponse {\n float prediction = 1;\n float confidence = 2;\n}\n\nservice ModelService {\n rpc Predict(PredictRequest) returns (PredictResponse);\n}\n /v1/predict\u8def\u7531\u5230\u6a21\u578b\u670d\u52a1\u5668A\u3001\u5c06/v2/predict\u8def\u7531\u5230\u6a21\u578b\u670d\u52a1\u5668B\uff0c\u5e76\u6536\u96c6\u4f7f\u7528\u6307\u6807\u3002/api/chat\u8def\u7531\u5230\u804a\u5929\u670d\u52a1\u5668\uff0c\u5c06/api/embed\u8def\u7531\u5230\u5d4c\u5165\u670d\u52a1\u5668\u3002\u8f83\u6162\u4f46\u66f4\u7075\u6d3b\u3002shard = hash(user_id) % num_shards\u3002\u5206\u5e03\u5747\u5300\u4f46\u4e0d\u652f\u6301\u8303\u56f4\u67e5\u8be2\u3002WHERE age BETWEEN 20 AND 30\uff09\u3002\u5927\u591a\u6570SQL\u6570\u636e\u5e93\u4f7f\u7528B\u6811\u3002WHERE id = 12345\uff09\u3002CREATE INDEX ON users(country, city) \u52a0\u901f\u6309\u56fd\u5bb6\u6216\u6309\u56fd\u5bb6+\u57ce\u5e02\u7b5b\u9009\u7684\u67e5\u8be2\uff0c\u4f46\u4e0d\u80fd\u52a0\u901f\u4ec5\u6309\u57ce\u5e02\u7684\u67e5\u8be2\uff08\u6700\u5de6\u8fb9\u7684\u5217\u5fc5\u987b\u5728\u67e5\u8be2\u4e2d\uff09\u3002/users\u3001/models\uff09\uff0cHTTP\u65b9\u6cd5\u8868\u793a\u64cd\u4f5c\uff08GET=\u8bfb\u53d6\u3001POST=\u521b\u5efa\u3001PUT=\u66f4\u65b0\u3001DELETE=\u5220\u9664\uff09\uff0c\u72b6\u6001\u7801\u8868\u793a\u7ed3\u679c\uff08200=OK\u3001201=\u5df2\u521b\u5efa\u3001400=\u9519\u8bef\u8bf7\u6c42\u3001404=\u672a\u627e\u5230\u3001429=\u88ab\u9650\u6d41\u3001500=\u670d\u52a1\u5668\u9519\u8bef\uff09\u3002GET /items?cursor=abc&limit=50\uff09\u6216\u57fa\u4e8e\u504f\u79fb\u91cf\u7684\u5206\u9875\uff08GET /items?offset=100&limit=50\uff09\u3002\u5bf9\u4e8e\u5927\u6570\u636e\u96c6\uff0c\u57fa\u4e8e\u6e38\u6807\u7684\u5206\u9875\u66f4\u9ad8\u6548\uff08\u57fa\u4e8e\u504f\u79fb\u91cf\u7684\u5206\u9875\u9700\u8981\u8df3\u8fc7\u884c\uff09\u3002/v1/predict\u3001/v2/predict\uff09\u3002\u8fd9\u6837\u53ef\u4ee5\u5728\u4e0d\u7834\u574f\u73b0\u6709\u5ba2\u6237\u7aef\u7684\u60c5\u51b5\u4e0b\u6f14\u8fdbAPI\u3002\u5ba2\u6237\u7aef\u6309\u7167\u81ea\u5df1\u7684\u8282\u594f\u8fc1\u79fb\u5230v2\uff1bv1\u88ab\u5f03\u7528\u4f46\u5728\u6d41\u91cf\u4e0b\u964d\u4e4b\u524d\u4e0d\u4f1a\u5220\u9664\u3002{\n \"error\": {\n \"code\": \"INVALID_INPUT\",\n \"message\": \"\u7279\u5f81'user_age'\u5fc5\u987b\u4e3a\u6b63\u6574\u6570\",\n \"details\": {\"field\": \"user_age\", \"value\": -5}\n }\n}\n"},{"location":"chapter%2018%3A%20ML%20systems%20design/01.%20systems%20design%20fundamentals/#_9","title":"\u6d88\u606f\u961f\u5217","text":"PUT /user/123 {\"name\": \"Alice\"}\u662f\u5e42\u7b49\u7684\uff08\u5c06\u540d\u79f0\u8bbe\u7f6e\u4e3a\"Alice\"\u4e24\u6b21\u6ca1\u95ee\u9898\uff09\u3002POST /payments\u4e0d\u662f\uff08\u652f\u4ed8\u4e24\u6b21\u5f88\u7cdf\u7cd5\uff09\u3002\u4f7f\u64cd\u4f5c\u5e42\u7b49\u53ef\u786e\u4fdd\u91cd\u8bd5\u662f\u5b89\u5168\u7684\u3002\u4e91\u8ba1\u7b97\u4e3aML\u5de5\u4f5c\u8d1f\u8f7d\u63d0\u4f9b\u6309\u9700\u57fa\u7840\u8bbe\u65bd\uff0c\u65e0\u9700\u62e5\u6709\u786c\u4ef6\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u670d\u52a1\u6a21\u578b\u3001\u4e3b\u8981\u4e91\u670d\u52a1\u5546\u3001\u5bb9\u5668\u548cKubernetes\u3001\u5b58\u50a8\u3001\u4e91\u7f51\u7edc\u3001\u65e0\u670d\u52a1\u5668\u8ba1\u7b97\u3001\u6210\u672c\u7ba1\u7406\u548c\u57fa\u7840\u8bbe\u65bd\u5373\u4ee3\u7801
resources:\n limits:\n nvidia.com/gpu: 2 # \u6b64Pod\u9700\u89812\u4e2aGPU\n # main.tf \u2014 \u521b\u5efa\u7528\u4e8e\u63a8\u7406\u7684GPU VM\nresource \"aws_instance\" \"model_server\" {\n ami = \"ami-0abcdef1234567890\" # \u6df1\u5ea6\u5b66\u4e60AMI\n instance_type = \"g5.xlarge\" # A10G GPU\n\n tags = {\n Name = \"model-server-prod\"\n }\n}\n\nresource \"aws_s3_bucket\" \"model_weights\" {\n bucket = \"my-model-weights-prod\"\n\n versioning {\n enabled = true\n }\n}\n terraform init # \u4e0b\u8f7d\u63d0\u4f9b\u5546\u63d2\u4ef6\nterraform plan # \u663e\u793a\u5c06\u8981\u66f4\u6539\u7684\u5185\u5bb9\nterraform apply # \u521b\u5efa\u57fa\u7840\u8bbe\u65bd\nterraform destroy # \u5168\u90e8\u62c6\u9664\n \u6784\u5efa\u670d\u52a1\u6570\u767e\u4e07\u7528\u6237\u7684\u7cfb\u7edf\u9700\u8981\u7684\u4e0d\u53ea\u662f\u5355\u4e2a\u670d\u52a1\u5668\u3002\u672c\u6587\u4ef6\u6db5\u76d6\u53ef\u6269\u5c55\u6027\u6a21\u5f0f\u3001\u5206\u5e03\u5f0f\u7cfb\u7edf\u57fa\u7840\u3001\u5fae\u670d\u52a1\u3001\u6570\u636e\u6d41\u6c34\u7ebf\u3001\u6570\u636e\u5e93\u6269\u5c55\u3001\u641c\u7d22\u548c\u5411\u91cf\u7cfb\u7edf\u3001\u53ef\u89c2\u6d4b\u6027\u3001\u53ef\u9760\u6027\u5de5\u7a0b\u4ee5\u53caCI/CD
\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 API\u7f51\u5173 \u2502\u2192 \u2502 \u7279\u5f81\u670d\u52a1 \u2502\u2192 \u2502 \u7279\u5f81\u6570\u636e\u5e93 \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2192 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 \u2502 \u6a21\u578b\u670d\u52a1 \u2502\u2192 \u2502 \u6a21\u578b\u5b58\u50a8 \u2502\n \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2192 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 \u65e5\u5fd7\u670d\u52a1 \u2502\u2192 \u2502 \u65e5\u5fd7\u5b58\u50a8 \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n ML\u7cfb\u7edf\u8bbe\u8ba1\u5c06\u6587\u4ef601-03\u4e2d\u7684\u57fa\u7840\u8bbe\u65bd\u6a21\u5f0f\u5e94\u7528\u4e8e\u673a\u5668\u5b66\u4e60\u7684\u7279\u5b9a\u6311\u6218\u3002\u672c\u6587\u4ef6\u6db5\u76d6ML\u751f\u547d\u5468\u671f\u3001\u6570\u636e\u7ba1\u7406\u3001\u8bad\u7ec3\u57fa\u7840\u8bbe\u65bd\u3001\u6a21\u578b\u8bc4\u4f30\u3001\u670d\u52a1\u7b56\u7565\u3001\u7279\u5f81\u5de5\u7a0b\u3001ML\u6d41\u6c34\u7ebf\u548c\u76d1\u63a7
\u95ee\u9898\u5b9a\u4e49 \u2192 \u6570\u636e \u2192 \u7279\u5f81 \u2192 \u8bad\u7ec3 \u2192 \u8bc4\u4f30 \u2192 \u90e8\u7f72 \u2192 \u76d1\u63a7 \u2192 \u8fed\u4ee3\n \u2191 \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n"},{"location":"chapter%2018%3A%20ML%20systems%20design/04.%20ML%20systems%20design/#_1","title":"\u95ee\u9898\u5b9a\u4e49","text":"\u6570\u636e\u6444\u5165 \u2192 \u9a8c\u8bc1 \u2192 \u7279\u5f81\u5de5\u7a0b \u2192 \u8bad\u7ec3 \u2192 \u8bc4\u4f30 \u2192 \u6ce8\u518c \u2192 \u90e8\u7f72 \u2192 \u76d1\u63a7\n \u5b66\u4e60ML\u7cfb\u7edf\u8bbe\u8ba1\u7684\u6700\u4f73\u65b9\u5f0f\u662f\u901a\u8fc7\u5b9e\u64cd\u793a\u4f8b\u3002\u672c\u6587\u4ef6\u8be6\u7ec6\u4ecb\u7ecd\u4e86\u4e03\u4e2a\u5b8c\u6574\u7684\u8bbe\u8ba1\uff1a\u63a8\u8350\u7cfb\u7edf\u3001\u641c\u7d22\u6392\u5e8f\u3001\u5e7f\u544a\u70b9\u51fb\u9884\u6d4b\u3001\u6b3a\u8bc8\u68c0\u6d4b\u3001\u5185\u5bb9\u5ba1\u6838\u3001\u5bf9\u8bdd\u5f0fAI\u548c\u5927\u89c4\u6a21\u56fe\u50cf\u641c\u7d22
1\u4ebf\u4e2a\u9879\u76ee \u2192 \u5019\u9009\u751f\u6210\uff08\u5feb\u901f\u3001\u7c97\u7565\uff09\u2192 1000\u4e2a\u5019\u9009\n \u2192 \u6392\u5e8f\uff08\u7f13\u6162\u3001\u7cbe\u786e\uff09\u2192 100\u4e2a\u6392\u5e8f\u9879\u76ee\n \u2192 \u91cd\u65b0\u6392\u5e8f\uff08\u4e1a\u52a1\u89c4\u5219\uff09\u2192 \u5c55\u793a\u7ed9\u7528\u6237\u768420\u4e2a\n"},{"location":"chapter%2018%3A%20ML%20systems%20design/05.%20ML%20design%20examples/#_3","title":"\u5019\u9009\u751f\u6210","text":"[\u67e5\u8be2\uff0c\u6587\u6863]\u4e3a\u8f93\u5165\u5e76\u8f93\u51fa\u76f8\u5173\u6027\u5206\u6570\u7684Transformer\u3002\u6bd4\u53cc\u7f16\u7801\u5668\u66f4\u51c6\u786e\uff08\u540e\u8005\u72ec\u7acb\u7f16\u7801\u67e5\u8be2\u548c\u6587\u6863\uff09\uff0c\u56e0\u4e3a\u5b83\u6355\u83b7\u4e86\u7ec6\u7c92\u5ea6\u7684\u4ea4\u4e92\u3002\u4f46\u5bf9\u4e8e\u5b8c\u6574\u8bed\u6599\u5e93\u6765\u8bf4\u592a\u6162\u2014\u2014\u4ec5\u7528\u4e8e\u5bf9\u68c0\u7d22\u524d100-1000\u4e2a\u5019\u9009\u8fdb\u884c\u91cd\u65b0\u6392\u5e8f\u3002if text_model.hate_speech_score > 0.9:\n action = \"remove\"\nelif text_model.hate_speech_score > 0.7:\n action = \"human_review\"\nelse:\n action = \"allow\"\n \u7528\u6237\u67e5\u8be2 \u2192 \u67e5\u8be2\u5d4c\u5165 \u2192 \u5411\u91cf\u641c\u7d22\uff08\u6587\u6863\uff09\u2192 Top-K\u5757\n \u2193\n\u7528\u6237\u67e5\u8be2 + \u68c0\u7d22\u5230\u7684\u5757 \u2192 LLM \u2192 \u54cd\u5e94\uff08\u542b\u5f15\u7528\uff09\n"},{"location":"chapter%2018%3A%20ML%20systems%20design/05.%20ML%20design%20examples/#_29","title":"\u7ec4\u4ef6","text":"\u7cfb\u7edf\uff1a\u4f60\u662f\u4e00\u4e2a\u6709\u7528\u7684\u52a9\u624b\u3002\u4ec5\u57fa\u4e8e\u63d0\u4f9b\u7684\u4e0a\u4e0b\u6587\u56de\u7b54\u3002\n\u5982\u679c\u7b54\u6848\u4e0d\u5728\u4e0a\u4e0b\u6587\u4e2d\uff0c\u8bf7\u8bf4\"\u6211\u4e0d\u77e5\u9053\u3002\"\n\n\u4e0a\u4e0b\u6587\uff1a\n[\u5757 1]\n[\u5757 2]\n...\n\n\u7528\u6237\uff1a{\u95ee\u9898}\n \u67e5\u8be2\u56fe\u50cf \u2192 \u5d4c\u5165\u6a21\u578b\uff08ViT/CLIP\uff09\u2192 512\u7ef4\u5411\u91cf \u2192 ANN\u641c\u7d22 \u2192 Top-K\u7ed3\u679c\n"},{"location":"chapter%2018%3A%20ML%20systems%20design/05.%20ML%20design%20examples/#_35","title":"\u5d4c\u5165\u63d0\u53d6","text":"\u8fed\u4ee3\uff082-3\u5206\u949f\uff09\uff1a\u5982\u679c\u6709\u66f4\u591a\u65f6\u95f4/\u8d44\u6e90\uff0c\u4f60\u4f1a\u6539\u8fdb\u4ec0\u4e48\uff1f\u8fd9\u8868\u660e\u4f60\u7406\u89e3\u6743\u8861\u5e76\u80fd\u8bbe\u5b9a\u4f18\u5148\u7ea7\u3002
\u9762\u8bd5\u5b98\u770b\u4e2d\u7684\uff1a\u7ed3\u6784\u5316\u601d\u7ef4\uff08\u4e0d\u662f\u76f4\u63a5\u8df3\u5230\u89e3\u51b3\u65b9\u6848\uff09\u3001\u6743\u8861\u610f\u8bc6\uff08\u6bcf\u4e2a\u9009\u62e9\u90fd\u6709\u4ee3\u4ef7\uff09\u3001\u5b9e\u8df5\u77e5\u8bc6\uff08\u4f60\u786e\u5b9e\u6784\u5efa\u8fc7\u7cfb\u7edf\uff09\u548c\u6c9f\u901a\u80fd\u529b\uff08\u4f60\u80fd\u6e05\u6670\u89e3\u91ca\u4f60\u7684\u8bbe\u8ba1\u5417\uff1f\uff09\u3002