[{"content":"前言 这个文章是对论文 SmoothGrad: removing noise by adding noise 的个人解读和有关代码实现的讨论。SmoothGrad 论文发表于 2017 年。而 2016 年到 2017 年间是各种广为人知的可解释性方法爆发增长的两年，SmoothGrad 也是这一领域的著名论文之一。\n作者使用了一个非常简单的方法解决了深度神经网络中存在大量噪声的问题。那就是通过添加噪声，从而通过平均的方法消除掉噪声的影响。尽管这个想法非常简单，但是却十分行之有效。所以，值得我们思考的是：\n神经网络的梯度存在大量噪声的根本原因是什么？ SmoothGrad 为什么会行之有效？ 尽管目前可解释性人工智能（XAI）领域发展出了许多可解释性方法，但总的来说，XAI 研究是一个信任（Trust）或者说是归因（Attribution）的问题。之所以会需要XAI 技术，就是因为人在使用过程中不信任 AI，既不信任 AI 的学习能力，也不了解 AI 的运作机制。所以，才有了很多 XAI 方法来解析复杂 AI 模型背后的原理。但是，这又带来了一个问题，而且是一个非常关键的问题：XAI 方法的结果又真的可信吗？ 这个问题显然是值得所有 XAI 领域研究者思考的，也是对现有的所有的 XAI 方法的一种重新思考。\n摘要 在图像分类任务中，解释神经网络的一种方式就是解释每个像素对于最终决策的影响。这种策略的出发点就是类别分数对于输入图像的梯度。这个梯度可以被解释为“sensitivity map”（这里翻译为灵敏性图），并且有大量的可解释性方法是基于此的。SmoothGrad 的工作就是提出了一种帮助在视觉上锐化基于梯度的灵敏性图，并且讨论了一些经验。作者在 GitHub 上面开源了自己的代码。\n1 背景介绍 解释复杂的机器学习模型，如深度神经网络，仍然是一个挑战。然而，了解这些模型的功能对于构建应用程序及其本身的问题都很重要。从医疗保健领域（Hughes 等人，2016；DoshiVelez 等人，2014；Lou 等人，2012）到教育领域（Kim 等人，2015），有许多领域的可解释性很重要。例如，（Lou et al.，2012）中的肺炎风险预测案例研究表明，更具可解释性的模型可以揭示复杂模型忽略的数据中重要但令人惊讶的模式。关于可解释模型的综述，请参见（Freitas，2014；Doshi Velez，2017）。\n感兴趣的一个例子是图像分类系统。为分类决定找到一个“解释”可能会揭示这些系统的潜在机制，并有助于增强它们。例如，反卷积技术（deconvolution）帮助研究人员识别出未能学习任何有意义特征的神经元，这些知识被用于改进网络，如（Zeiler 和 Fergus，2014）所述。\n反卷积（deconvolution）是一个很有趣的工作。真正的反卷积方法是在论文《Adaptive deconvolutional networks for mid and high level feature learning》中提出的，但这论文（Zeiler 和 Fergus，2014）可以说把反卷积发扬光大了。\n理解图像分类系统决策的一种常见方法是找到对最终分类特别有影响的图像区域。（Bahrens 等人，2010；Zeiler 和 Fergus，2014；Springenberg 等人，2014；Zhou 等人，2016；Selvaraju 等人，2016年；Sundararajan 等人，2017；Zintgraf 等人，2016）。这些方法（不同地称为灵敏度图、显著性图或像素属性图；见第 2 节中的讨论）使用遮挡技术或带梯度的计算为单个像素分配“重要性”值，以反映其对最终分类的影响。\n这里作者提到了一大堆的论文。其中（Bahrens 等人，2010）这篇论文指的是《How to Explain Individual Classification Decisions》这篇论文。于 2010 年发表于 JMLR 上。这个时候深度神经网络还没有登上大众舞台，所以作者其实解释的都是一些机器学习分类器，比如 SVM 等。（Zhou 等人，2016）这篇论文指的是《Learning deep features for discriminative localization》，于 2016 年发表于 CVPR 上，其中提出了著名的类激活视图（Class Activation Map，CAM）方法，其作者周博磊对于卷积神经网络的神经元原理研究非常深入，该方法也催生了一系列基于类激活视图的 XAI 方法和弱监督定位方法。（Selvaraju 等人，2016年）指的是论文《Grad-CAM: Why did you say that?》，但其实这个只是这篇论文作者发表的预印本，其正式版本《Grad-CAM: Visual Explanations from Deep Networks via Gradient-Based Localization》于 2017 年发表于 ICCV 上，是 CAM 技术路线上的里程碑式技术，其引用量已经快要破 2 万了（本文写作时已经到达 19992）。（Sundararajan 等人，2017）这篇论文题目为《Axiomatic attribution for deep networks》于 2017 年发表于 ICML 上，其中提出了 Integrated Gradients（IG）方法，开创了 XAI 解释方法的积分梯度流派。（Zintgraf 等人，2016）这篇论文指的是《A New Method to Visualize Deep Neural Networks》这篇论文，于 2016 年发表于 ICML Workshop中。\n在实践中，这些技术似乎经常突出对人类有意义的区域，比如脸上的眼睛。同时，灵敏度图在视觉上往往很嘈杂，显示了一些在人眼看来是随机选择的像素。当然，我们无法先验地确定这种噪声是否反映了网络如何执行分类的基本事实，或者是由于更肤浅的因素造成的。不管怎样，这似乎是一个值得进一步研究的现象。\n这个也对应了前言中提到的一个问题——这些噪声产生的原因\n本文描述了一种非常简单的技术，SmoothGrad，在实践中可以减少视觉噪声，也可以与其他灵敏度图算法相结合。其核心思想是选取指定的图像，通过向图像添加噪声来对相似的图像进行采样，然后对每个采样图像的灵敏度图进行平均。我们还发现，在训练时添加噪声的常见正则化技术（Bishop，1995）对灵敏度图有额外的“去噪”效果。这两种技术（用噪声训练和用噪声推断）似乎具有相加效应；将它们一起执行会产生最佳结果。\n作者提到的在训练集中添加噪声的方法，来自于其引用的论文（Bishop，1995），其题目为《Training with noise is equivalent to tikhonov regularization》。其贡献如题目所示。事实上，作为一种事后解释的方法去使用时，一般是无法对模型进行重新训练的，所以这只能算是作者的一种尝试和探索。\n论文将 SmoothGrad 方法与几种基于梯度的灵敏度图方法进行了比较，并展示了其效果。我们提供了一个猜想，并有一些经验证据支持，解释为什么这项技术有效，以及为什么它可能更能反映网络是如何进行分类的。论文还讨论了增强这些灵敏度图可视化的几种方法。最后，论文还提供了用于生成本文中所有图像的代码，以及网站上每种比较方法的 200 多个示例.\n作者的代码被集成到一个 Python 库里面了，可以在 TensorFlow 1.x ，TensorFlow 2.x 和 PyTorch 的环境下使用。但是这样可能不利于阅读和理解。链接可以见论文原文。\n2 Gradients as sensitivity maps 考虑一个将图像分类为集合 CCC 中的一个类别的系统。给定一个输入图像 xxx，许多图像分类网络（Szegedy et al.，2016；LeCun et al.，1998）为每个类别 c∈Cc \\in Cc∈C 计算一个类别激活函数 ScS_cSc​，并通过最高分数确定最终的分类类别 class(x)class(x)class(x)。即，\nclass(x)=arg max⁡c∈CSc(x) class(x)=\\argmax_{c\\in C}S_c(x) class(x)=c∈Cargmax​Sc​(x)几位作者提出了一种在输入图像中定位“重要”像素的数学的准确的方法，例如 (Baehrens et al., 2010; Simonyan et al., 2013; Erhan et al., 2009)。如果函数 ScS_cSc​ 是分段可微的，对于任何图像 xxx，可以通过对输入 xxx 求导来构建一个灵敏度图 Mc(x)M_c(x)Mc​(x)。特别地，可以定义，\nMc(x)=∂Sc(x)/∂x M_c(x)=\\partial S_c(x)/\\partial x Mc​(x)=∂Sc​(x)/∂x (Simonyan et al., 2013) 这个工作首次提出了 Saliency Map 的概念，Gradient x Values 方法就是其首次提出的。\n在这里 ∂Sc\\partial S_c∂Sc​ 代表了 ScS_cSc​ 的导数（也就是梯度）。直观地来说，McM_cMc​ 表示对于类别 ccc，对 xxx 的每个像素进行微小的变化会对分类得分产生多大的影响。因此，往往希望得到 McM_cMc​ 可以突出表示关键区域。\n在实践中，一个标签的敏感度图似乎与该标签对应的区域呈正相关 (Baehrens 等人，2010年; Simonyan 等人，2013年)。然而，基于原始梯度的敏感度图通常在视觉上是嘈杂的，如图 1 所示。此外，正如这幅图所示，与人类认为有意义的区域的相关性充其量也仅是大致的。\n图1 一个噪声敏感度图，基于图像分类网络中“gazelle”类别得分的梯度。较亮的像素表示具有较高绝对值的偏导数。详见第 3 节中的可视化细节。\n作者在这里引入了两个假设：1. 标签对应的敏感度图和标签所指示的区域有关。以图1为例子，“gazelle”这个标签所指示的区域就是图片中羚羊所在的区域，所以对应的敏感度图在这一块的绝对值就偏大。2. 原始的敏感度图是充满噪声的。\n2.1 Previous work on enhancing sensitivity maps 在原始梯度可视化中存在一些明显的噪声，有几种假设可以解释这种现象。当然，一种可能性是这些图是网络正在做的事情的真实描述。也许散布在图像上看似随机的某些像素对于网络做出决策是至关重要的。另一方面，使用原始梯度作为特征重要性表示可能并不是最佳选择。为了寻求对网络决策更好的解释，一些先前的研究提出了对梯度敏感度图基本技术的改进方法；我们在这里总结了几个关键的例子。\n使用梯度作为衡量影响的指标时存在一个问题，即重要特征可能会使函数 ScS_cSc​“饱和”。换句话说，它可能在全局上产生强烈影响，但在局部上具有较小的导数。Layerwise Relevance Propagation (Bach et al., 2015)、DeepLift (Shrikumar et al., 2017) 以及最近的 Integrated Gradients (Sundararajan et al., 2017) 等多种方法尝试通过估计每个像素的全局重要性而不是局部敏感性来解决这个潜在问题。使用这些技术创建的地图通常被称为“显著性图”或“像素归因”图。\n关于这个问题，可以参考论文 Axiomatic Attribution for Deep Networks 中的讨论。\n另一种增强敏感度图的策略是改变或扩展反向传播算法本身，目的是强调对最终结果的正面影响。两个例子是“反卷积”（Zeiler＆Fergus，2014）和“导向反向传播（Guided Back Propagation）”（Springenberg等，2014）技术，它们通过在反向传播计算中舍弃负值来修改 ReLU 函数的梯度。目的是执行一种“去卷积”操作，以更清晰地显示触发高层单元激活的特征。类似的想法还出现在（Selvaraju等，2016; Zhou等，2016）中，它们提出了多层级单元梯度的组合方式。\n在接下来的内容中，我们将详细比较“原始（Vanilla）”梯度图与由积分梯度方法和引导反向传播方法创建的梯度图。关于术语的说明：尽管术语“敏感度图”、“显著性图”和“像素归因图”在不同的语境中被使用，但在本文中，将统称这些方法为“敏感度图”。\n2.2 Smoothing noisy gradients 关于增强敏感度图的先前工作存在一个可能的解释，据我们所知，该解释在文献中尚未直接讨论：函数 ScS_cSc​ 的导数在小尺度上可能会出现剧烈波动。换句话说，灵敏度图中所见到的明显噪点可能是由局部导数的本质上无意义的局部变化所导致的。毕竟，考虑到常见的训练技术，我们没有理由期望导数变化平稳。实际上，所涉及的网络通常基于 ReLU 激活函数，因此 ScS_cSc​ 通常甚至不会是连续可微的。\n图 2 显示了强烈波动的偏导数示例。这通过选取一个特定的图像 xxx 和一个图像像素 xix_ixi​，并以梯度向量的最大入口的一部分 ∂Sc∂xi(t)\\frac{\\partial S_c}{\\partial x_i}(t)∂xi​∂Sc​​(t) 的值进行绘制，max⁡i∂Sc∂xi(t)\\max_i \\frac{\\partial S_c}{\\partial x_i}(t)maxi​∂xi​∂Sc​​(t)，对应于图像空间中的一个短线段 x+tϵx+t\\epsilonx+tϵ，其中 t∈[0,1]t\\in [0,1]t∈[0,1]。我们将它表示为最大条目的分数，以验证波动的显著性。该段的长度足够小，以至于对于人类来说，初始图像 xxx 和最终图像 x+ϵx + \\epsilonx+ϵ 看起来是一样的。此外，路径上的每个图像都被模型正确分类。然而，关于红色、绿色和蓝色分量的偏导数却发生了显著变化。\n图2 RGB 像素值对梯度向量中最大分量的偏导数（作为分数表示）随着从基准图像 xxx（中间图）缓慢移动到固定位置 x+ϵx + \\epsilonx+ϵ （右图）逐渐变化。ϵ\\epsilonϵ 是从 N(0,0.012)\\mathcal{N}(0,0.012)N(0,0.012) 中随机抽取的一个样本。对于人类来说，最终图像 x+ϵx + \\epsilonx+ϵ 与原始图像 xxx 无法区分。\n鉴于这些快速波动，任何给定点的 ScS_cSc​ 梯度将比梯度值的局部平均值表达得更不明显。这表明了一种改进敏感度图的新方法：不是直接基于梯度 ∂Sc\\partial S_c∂Sc​ 来创建可视化，而是基于 ∂Sc\\partial S_c∂Sc​ 用高斯核进行平滑。\n直接在高维输入空间中计算这样一个局部平均是不可行的，但我们可以计算一个简单的随机近似。特别地，我们可以在输入 xxx 的邻域内取随机样本，并对得到的灵敏度图进行平均。在数学上，这意味着计算：\nM^c(x)=1n∑1nMc(x+N(0,σ2)) \\hat{M}_c(x)=\\frac{1}{n}\\sum_1^n M_c(x+\\mathcal{N}(0,\\sigma^2)) M^c​(x)=n1​1∑n​Mc​(x+N(0,σ2))其中 nnn 为采样的数目，N(0,σ2)\\mathcal{N}(0,\\sigma^2)N(0,σ2) 代表标准差为 σ\\sigmaσ 的高斯噪声。在这篇论文中我们把这种方法叫做 SmoothGrad。\n作者的想法大致遵循这样的思路：发现原始梯度存在噪声 -\u0026gt; 用一个简单的 demo 说明该现象 -\u0026gt; 然后提出自己的解决方案。作者的方法其实非常简单，就是基于简单的高斯平滑的想法，但是后续的实验证明，该方法非常行之有效。\n3 Experiments 为了评估 SMOOTHGRAD 技术，作者使用神经网络进行了一系列图像分类实验（Szegedy等，2016；TensorFlow，2017）。结果表明，估计的平滑梯度 M^c\\hat{M}_cM^c​ 比未平滑的梯度 McM_cMc​ 具有更加视觉上连贯的敏感性图，所得的可视化结果更好地与有意义的特征对齐。\n实验使用的模型为 Inception v3 在 ILSVRC-2013 数据集上进行训练，以及一个基于 TensorFlow tutorial 的卷积 MNIST 模型。\n这些都是非常简单和常见的图像分类模型和数据集。\n3.1 Visualization methods and techniques 敏感性图通常以热力图的形式进行可视化。找到从像素的通道值到特定颜色的正确映射方式，事实证明非常微妙，对可视化结果的印象有很大的影响。本节总结了一些可视化技术和在比较各种敏感性图工作的过程中所得到的经验教训。其中一些技术可能在选择敏感性图方法时无论如何都能普遍使用。\n梯度的绝对值 敏感性图算法通常会产生带有符号的值。在将带符号的值转换为颜色时存在较大的歧义。一个关键选择是是否以不同方式表示正负值，或者仅可视化绝对值。将梯度值取绝对值与否的实用性取决于数据集的特征。例如，当感兴趣的对象在不同类别中具有相同的颜色时（例如，在 MNIST 数字数据集中，数字永远是白色（LeCun et al.，2010）），正梯度指示了向类别的正信号。另一方面，在 ImageNet 数据集中（Russakovsky et al.，2015），我们发现将梯度的绝对值取出能产生更清晰的图片。这种现象的一个可能解释是方向是依赖于上下文的：许多图像识别任务在颜色和照明变化下是不变的。例如，在对一个球进行分类时，在明亮的背景上，一个黑色的球会有负梯度，而在较暗的背景上，一个白色的球会有正梯度。\n剔除离群值 我们观察到渐变存在着一些像素比平均值高得多的值。这并不是一个新的发现——这一特性在生成对人类不可辨别的对抗性样本时被利用了（Szegedy等，2013）。这些离群值有可能完全改变颜色尺度。将这些极值限制在相对高的值（我们发现 99 分位数足够）会导致地图更具视觉连贯性，就像 (Sundararajan等，2017) 中所示。如果没有这个后处理步骤，敏感性图可能几乎完全黑色化。\n乘以输入的图像 一些技术通过将基于梯度的数值与实际的像素数值相乘来创建最终的敏感度图（Shrikumar等，2017; Sundararajan等，2017）。这种乘法往往会产生视觉上更简单和更锐利的图像，尽管目前尚不清楚其中有多少是归因于原始图像本身的锐利度。例如，输入中的黑/白边缘即使在基础的敏感度图中没有边缘，最终的可视化图像也可能出现边缘状的结构。\n然而，这可能会导致不良的副作用。值为 0 的像素永远不会出现在敏感度图上。例如，如果我们将黑色编码为 0，那么在白色背景上正确预测黑球的分类器的图像将永远不会突出显示黑球。\n另一方面，将梯度与输入图像相乘在我们将特征的重要性视为对总分数 yyy 的贡献时是有意义的。例如，在线性系统 y=Wxy = W xy=Wx 中，将 xiwix_iw_ixi​wi​ 视为 xix_ixi​ 对最终得分 yyy 的贡献是有意义的。\n3.2 噪声水平和采样的影响 SmoothGrad 有两个超参数：σ\\sigmaσ，表示噪声水平，也就是高斯扰动的标准差；nnn 用来平均的样本数量。\nNoise, σ\\sigmaσ 图 3 展示了噪声水平对于 ImageNet (Russakovsky等，2015) 中一些样例图片的影响。其中的第二列对应了标准的梯度（也就是 0% 噪声），后面全篇称其为“Vanilla”方法。鉴于对解释可视化结果的定量评估仍然是一个未解决的问题，因此主要关注定性评估。作者观察到，通过应用 10% 到 20% 的噪声似乎可以取得锐度和原始图像结构中的一个平衡。并且同样可以观察到，虽然这个噪音范围对 Inception 来说通常能得到良好的结果，但理想的噪音水平取决于输入。图 10 给了一个基于 MNIST 数据集的一个类似的例子。\nSample size, nnn 在图 4 中，作者展示了采样数目 nnn 的影响。如预期所示，随着 nnn 的增大，估计的梯度会变得越来越平滑。根据实证研究结果，作者发现有递减回报现象——在 n\u0026gt;50n \u0026gt; 50n\u0026gt;50 的情况下，可视化效果几乎没有明显变化。\n图4 样本量对初始估计梯度的影响。每个图像添加了10%的噪声。\n3.3 与基准方法的定性比较 由于没有真实标准来进行灵敏度图的定量评估，我们遵循之前的研究（Simonyan et al.，2013; Zeiler \u0026amp; Fergus，2014; Springenberg et al.，2014; Selvaraju et al.，2016; Sundararajan et al.，2017），并着重关注两个定性评估方面。\n首先，我们检查视觉一致性（例如，亮点仅在感兴趣的物体上，而不是背景）。其次，我们进行区分性测试，在一张同时有猴子和勺子的图片中，我们期望关于猴子分类的解释集中在猴子而不是勺子上，反之亦然。\n关于视觉连贯性，图 5 显示了我们的方法与三种基于梯度的方法之间的并排对比：Integrated Gradients（Sundararajan等，2017）、Guided BackProp（Springenberg等，2014）和 vanilla gradient。在我们检查的随机样本 200 幅图像中，我们发现 SMOOTHGRAD 相比于 Integrated Gradients 和 vanilla gradient 更一致地提供了更具视觉效果的映射。而 Guided BackProp 提供了最清晰的映射（图 5 的最后三行），但容易失败（图 5 的前三行），尤其是对于具有均匀背景的图像。相反，我们的观察结果是，当对象周围有均匀背景颜色时（图 5 的前三行），SmoothGrad 的影响最大。探索这种差异是一个有趣的研究领域。可能类别分数函数的平滑性可能与底层图像的空间统计学有关；噪声可能对不同纹理的敏感性产生差异性影响。\n图 6 将我们的方法的区分度与其他方法进行了比较。每个图像至少有两个不同类别的对象，网络可能会识别出来。为了可视化地展示区分度，我们计算每个类别对应灵敏度图 M1(x)M_1(x)M1​(x) 和 M2(x)M_2(x)M2​(x)，并且缩放到 [0,1][0,1][0,1]，然后计算其差异 M1(x)−M2(x)M_1(x)-M_2(x)M1​(x)−M2​(x)。我们然后把这些值绘制在一个发散色图上，其中 [−1,0,1]→[blue,gray,red][-1,0,1]\\to[blue,gray,red][−1,0,1]→[blue,gray,red]。对于这些图像，SmoothGrad 在质量上显示出了比其他方法更好的区分能力。目前还不能确定哪些属性影响给定方法的区分能力，例如，为什么 Guided BackProp 似乎显示出最弱的区分能力仍然是一个开放问题。\n图5 定性评估不同方法。前三（后三）行显示了应用 SmoothGrad 对敏感性图质量具有高（低）影响的示例。\n图6 不同方法的区分能力。对于每个图像，我们可视化不同的 scale(∂y1/∂x)−scale(∂y2/∂x)\\text{scale}(\\partial y_1/\\partial x)- \\text{scale}(\\partial y_2/\\partial x)scale(∂y1​/∂x)−scale(∂y2​/∂x) ，其中 y1y_1y1​ 和 y2y_2y2​ 是第一类和第二类（即猫或狗）的 logits，scale()\\text{scale}()scale() 将梯度值归一化到 [0,1][0, 1][0,1] 之间。使用发散的颜色映射 [−1,0,1]→[blue,gray,red][-1,0,1]\\to[blue,gray,red][−1,0,1]→[blue,gray,red] 绘制数值。每种方法在列中表示。\n3.4 将 SmoothGrad 与其他方法结合 可以将 SmoothGrad 想象为使用简单的过程对 Vanilla Gradient 方法进行平滑处理：对 n 个有噪音的图片的 Vanilla 敏感度图进行平均。有了这个想法，相同的平滑处理可以用来增强任何基于梯度的方法。图 7 显示了将 SmoothGrad 与 Integrated Gradients 和 Guided BackProp 结合使用的结果。我们观察到，这种增强改善了两种方法的敏感度图的视觉连贯性。\n图7 将 SmoothGrad 与现有的基于梯度的方法一起使用：Integrated Gradients 和 Guided BackProp。\n3.5 在训练过程中添加噪音 迄今讨论的 SmoothGrad 可以直接应用于分类网络。然而，在重视清晰度的情况下，自然会想到是否有一种类似的方法可以修改网络权重，使其敏感性图更加清晰。与 SMOOTHGRAD 在某种程度上平行的一个想法是在训练过程中向样本添加噪声的众所周知的正则化技术（Bishop，1995）。我们发现，这种方法也改善了敏感性图的清晰度。\n图 8 和图 9 分别展示了在 MNIST 和 Inception 模型中，在训练时间和/或评估时间添加噪声的效果。有趣的是，在训练时间添加噪声似乎还能对敏感性图进行去噪。最后，这两种技术（训练时添加噪声和推断时添加噪声）似乎具有叠加效应；将它们同时执行能产生最具视觉连贯性的四种组合中的最佳敏感性图。\n图8 在 MNIST 数据集上训练时添加噪声与评估时添加噪声的效果比较。\n图9 在 Inception 模型的训练与评估过程中，添加噪声的效果\n结论和未来工作 这里描述的实验表明，基于梯度的敏感性图可以通过两种平滑方式进行加强。首先，通过对给定图像进行许多小扰动形成的图像平均化，似乎有显著的平滑效果。其次，通过对数据进行加入随机噪声的扰动后的训练，可以进一步增强效果。\n这些结果为未来的研究提供了几个方向。首先，虽然我们提供了一个关于嘈杂敏感性图是由噪声梯度引起的合理性论据，但寻找进一步的证据和理论论证来支持或否定这个假设是值得的。当然，SmoothGrad 的锐化效应可能存在其他原因，比如随机噪声对不同纹理的差异效应。\n其次，除了噪声训练外，可能还有更直接的方法来创建具有更平滑类别得分函数的系统。例如，可以对偏导数的大小进行明确的惩罚来进行训练。为了创建更具空间连贯性的地图，可以对相邻像素的类别得分的偏导数之间的差异添加一个惩罚。此外，值得探究类别分数的几何结构，以理解为什么在具有大块近似恒定像素值的图像上看起来更平滑的效果更好。\n进一步探索的一个领域是寻找用于比较敏感性图的更好度量标准。为了衡量空间一致性，可以使用现有的图像分割数据库，而我们已经在取得进展（Oh 等，2017年; Selvaraju 等，2016年）。系统性地测量可辨识性也可能非常有价值。最后，一个自然的问题是这里描述的去噪技术是否适用于其他网络架构和任务。\n基于 PyTorch 的代码实现 基本思路 我们主要针对实验中对 ImageNet 数据集的可视化进行复现。所依赖的库如下：\nnumpy matplotlib torch opencv-python (cv2) torchvision 加载所有的库 import numpy as np import matplotlib.pyplot as plt import torch.nn as nn import torch import torchvision import cv2 图像分类模型的加载 weights = torchvision.models.VGG16_Weights.DEFAULT\t# 选择 VGG16 这个模型作为分类模型 model = torchvision.models.vgg16(weights=weights)\t# 如果下载很慢，可以提前下载好模型权重放在指定位置 目标图像的加载和可视化 img_path = \u0026#34;./data/imagenet_samples/dog.JPEG\u0026#34;\t# 换成想要可视化的图片的地址即可 img = plt.imread(img_path) ax, fig = plt.subplots(1, 1, figsize=(10, 10)) fig.imshow(cv2.resize(img, (224, 224))) fig.axis(\u0026#34;off\u0026#34;) plt.show() 运行模型 img_input = torchvision.io.read_image(img_path) img_input = weights.transforms(antialias=True)(img_input) img_input = img_input.unsqueeze(0) prediction = model(img_input).squeeze(0).softmax(0) class_id = prediction.argmax().item() score = prediction[class_id].item() category_name = weights.meta[\u0026#34;categories\u0026#34;][class_id] print(f\u0026#34;{category_name}: {100 * score:.1f}%\u0026#34;) 计算 Vanilla Gradient x = img_input x.requires_grad = True y = model(x) model.zero_grad() x.grad = None one_hot = torch.zeros(y.shape) one_hot[:, class_id] = 1 y.backward(one_hot) vanilla_grad = x.grad 可视化 Vanilla Gradient def visulize_absscale(salience): vmax = abs(np.percentile(salience, 99)) vmin = np.min(salience) return np.clip((salience - vmin) / (vmax - vmin), 0, 1) salience = vanilla_grad.detach().numpy() salience = np.sum(salience, axis=1) salience = salience[0] salience = visulize_absscale(salience) ax, fig = plt.subplots(1, 1, figsize=(10, 10)) fig.imshow(salience, cmap=\u0026#34;jet\u0026#34;) fig.axis(\u0026#34;off\u0026#34;) plt.show() 计算 SmoothGrad n_samples = 50 bound_min = -2.1179039478302 bound_max = 2.640000104904175 sigma = 0.2 * (bound_max - bound_min) x_grad = torch.zeros(size=[n_samples, *x.shape]) for i in range(n_samples): x_noise = x.detach() + torch.randn(x.shape) * sigma x_noise.requires_grad = True y = model(x_noise) y.backward(one_hot) x_grad[i] = x_noise.grad smooth_grad = x_grad.mean(dim=0) 可视化 SmoothGrad salience = smooth_grad.detach().numpy() salience = np.sum(salience, axis=1) salience = salience[0] salience = visulize_absscale(salience) ax, fig = plt.subplots(1, 1, figsize=(10, 10)) fig.imshow(salience, cmap=\u0026#34;jet\u0026#34;) fig.axis(\u0026#34;off\u0026#34;) plt.show() ","permalink":"https://blog.fitue.cc/posts/smoothgrad-paper-reading/","summary":"对 2017 年发表的经典可解释性人工智能（XAI）论文 SmoothGrad 的个人解读与 PyTorch 代码实现讨论。SmoothGrad 通过在输入图像中添加高斯噪声，平均多次采样的梯度，从而有效消除显著性图中的视觉噪声。","title":"论文阅读：SmoothGrad: Removing Noise by Adding Noise"},{"content":"摘要 基于资源的共识是无许可分布式账本系统的支柱。这种协议的安全性从根本上取决于系统中积极参与的资源水平。各种不同的资源（以及相关的证明协议，有时在文献中被称为 PoX）提出了一个根本问题，即是否有可能同时使用其中的许多资源并建立多资源共识协议。组合不同资源的挑战是实现它们之间的可替代性，从某种意义上说，只要所有资源中累积的对抗力量是有限的，安全就会保持不变。\n在这项工作中，我们提出了 Minotaur，一种结合了工作证明（PoW）和权益证明（PoS）的多资源区块链共识协议，并证明了它是最优可替代的。在我们设计的核心中，Minotaur 以轮次为单位进行操作，同时不断对主动计算能力进行采样，以提供工作和权益这两种资源之间的公平交换。此外，与比特币区块链相比，我们展示了 Minotaur 处理更高程度工作波动的能力；我们还将 Minotaur 推广到任何数量的资源。\n我们通过在 Rust 中实现一个全栈客户端（已开源）来证明 Minotaur 的简单性。我们使用客户端来测试 Minotaur 对可变采矿能力和联合工作/权益攻击的鲁棒性，并证明 Minotaur 适合作为真实世界区块链的共识层的具体经验证据。\nCCS CONCEPTS 安全和隐私 —— 分布式系统安全\n关键词 工作证明，权益证明，基于资源的区块链，安全分析\nACM 引用格式 Matthias Fitzi, Xuechao Wang, Sreeram Kannan, Aggelos Kiayias, Nikos Leonardos, Pramod Viswanath, and Gerui Wang. 2022. Minotaur: MultiResource Blockchain Consensus. In Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security (CCS ’22), November 7–11, 2022, Los Angeles, CA, USA. ACM, New York, NY, USA, 14 pages. https://doi.org/10.1145/3548606.3559356\n1 介绍 基于资源的共识。 无许可区块链的去中心化计算范式的基本特征是，通过证明对某一资源的占有来实现对共识协议的参与。比特币开创了基于工作证明（PoW）的这一理念，其隐含的能源浪费激发了基于替代资源的新设计，如权益证明（PoS）、空间证明（PoSp）和消逝时间证明（PoD）。这些不同的资源涵盖了参与者带来的各种多维形式的“资本”。每个 X 证明机制在适当的设置（在 PoW 中的计算，PoSp 的存储和存储以及 PoD 中的时间/延迟，PoS 中的标记/资本的时间/延迟）都很有趣。此外，即使在同一资源格式中，这些机制也会引发不同的激励措施；以 PoW 为例，我们看到比特币中实现的 SHA256 函数实例化的哈希现金算法已经被其他算法取代，包括 scrypt 和 ethash。这些不同的 X 证明机制都导致了不同的、孤立的区块链生态系统。\n结合不同的资源。 跨多种资源进行结合是一个自然的问题。结合多种资源的关键挑战在于确定汇率，即不同资源在多大程度上转化为系统的权力，并以最佳方式从这些资源中提取安全。使汇率动态地适应每一种资源类型的参与水平，形成一个真正可替代的资源概念，是一个基本的和根本的目标。所谓真正的可替代性，我们的意思是，只要诚实的参与者控制了系统中每种资源类型的大部分组合资源，多资源共识协议的安全性就能得到保证 —— 具体来说就是，∑i=1Mβi\u0026lt;M/2\\sum_{i=1}^M \\beta_i \u0026lt; M/2∑i=1M​βi​\u0026lt;M/2，其中 MMM 是资源的数量，βi\\beta_iβi​ 是第 iii 个资源中的对抗力量（此属性在定义 2 中适当地推广到任何线性组合）。我们注意到，实现这种类型的可替代性有利于底层区块链系统的安全，因为对手将无法通过指挥其中一个底层资源中的 51% 来发动成功的攻击。接下来，我们给出了一些非可替代的混合 PoW/PoS 协议设计的例子。\n一阶混合 PoW/PoS 协议。 考虑到在单一区块链设计中包含多种资源的基本重要性，在文献中有多种混合 PoW/PoS 协议的设计。然而，这些协议要么是启发式的（缺乏正式的安全分析），要么是做了打破可替代性的假设（例如，诚实的多数股权和/或静态采矿能力）。事实上，有了足够的假设，混合协议的问题就很容易得到解决。例如，如果我们假设有一个诚实的多数股权（在任何时候），我们可以使用一个从利益相关者池中随机选择的委员会，通过定期发布检查点来协助 PoW 分类账。然而，这个方案的安全性完全由利益相关者保证，而且信任完全由 PoS 支持（不是来自 PoW）。\n自然解决方案。 事实上，如果我们假设一个静态设置（总的采矿能力和总的“活跃”股权都是固定的，并且为协议设计者所知），一个简单的解决方案是：PoW 和 PoS 挖矿是平行进行的；无论哪个 PoW 或 PoS 先成功，都会继续下去并扩展最长的链。然而，似乎没有任何直接的方法将这个简单的想法扩展到非静态设置，因为当总的采矿能力是变化和未知的时候，我们不能再将系统中的股权和工作归一化（第 4 节）。即使是来自两个不同哈希函数的可替代工作组合（即诚实工作总量超过拜占庭工作总量）也没有得到解决。\nMinotaur 协议。 在本文中，我们提出了 Minotaur，一个具有可互换工作和股权证明的区块链协议。在其核心，Minotaur 是一个最长的链式协议，它的区块提议者时间表基于我们的虚拟股权概念，融合了活跃的实际股权和工作股权。工作权益分配是通过衡量参与者在前一个时期的哈希算力贡献来确定的。工作贡献是通过对 PoW 区块（类似于“背书输入”或“果实”）的并发 PoW 挖掘来实现的，最终被主链区块所引用。然后，工作份额分配被按比例分配给参与者在该时代从主链上引用的认可者区块份额；该分配确实真正代表了参与者之间的 PoW 资源分配。图 1(a) 阐述了这个协议。\nMinotaur 的安全是最佳的。我们通过证明当 ω\\omegaω 乘以对抗者哈希算力的比例（βw\\beta_wβw​）和 1−ω1-\\omega1−ω 乘以对抗者股权的比例（βs\\beta_sβs​）之和小于 1/21/21/2 时，对于任何 ω∈[0,1]\\omega \\in [0,1]ω∈[0,1]（即 PoW/PoS 的权衡参数，见图 1(b)），Minotaur 在工作和股权之间是真正可替换的。图 1(b) 还比较了 Minotaur 和文献中的几个不可替换的 PoW/PoS 协议（检查点账本、2 跳区块链和一些最终性小工具）的安全保证。在第 6 节我们给出了一个正式的安全分析。一个直接的后果是，Minotaur 可以容忍 51% 的采矿对手，只要有一个超级多数的诚实股权（反之亦然，一个 51% 的股权对手）。我们证明了我们的安全保证是最优的，见第 3 节。我们还表明，Minotaur 能够比比特币更有效地容忍工作的波动，参见第 6.4 节。\n实现。我们在大约 6000 行 Rust 代码中实现了 Minotaur 客户端的原型，并提供了实验结果来评估 Minotaur 在不同场景下的性能。我们还实施了比特币/水果链/Ouroboros 客户端作为基准。我们用这个客户端来实验验证 Minotaur 可以在网络哈希力更剧烈的变化中存活下来，而 Bitcoin/FruitChain 在同样的情况下已经不复存在。\n动机。结合多种资源有助于防止对手可能获得对一种单一资源的大部分控制，但不能控制所有相关资源的组合的情况。例如，为了违反 ω=0.5\\omega=0.5ω=0.5 的 PoW/PoS 情况下的安全性，控制一半哈希功率的对手现在还需要控制一半的股权。\n作为一个具体的例子，考虑推出一个新的区块链。一个 PoS 链可以很容易地用现有的技术启动，如烧毁证明、初始硬币发行和空投。相比之下，PoW 链的引导是具有挑战性的，因为新系统开始时的总计算能力可能相对较小，因此容易受到“51% 攻击”。为了防御这种情况，Minotaur 允许在纯 PoS 模式下启动一个（预测的）PoW 区块链（设置参数 ω=0\\omega=0ω=0），然后通过逐渐改变权重参数 ω\\omegaω 到一个较高的值来过渡到一个纯 PoW 区块链，从而允许安全地提高应用的散列功率，直到达到一个安全的参与水平。\n图表 1：(a) Minotaur 共识协议的结构。(b) 不同混合 PoW/PoS 协议的安全区域对比\n相关工作。混合 PoW/PoS 块生产的想法首次在文献中提到，并在“活动证明”的标签下给出了第一个具体的构造，但没有给出严格的安全分析。他们的区块生产机制本质上扩展了标准的比特币挖矿，让挖出的区块隐含地选出一组利益相关者，这些利益相关者需要在区块上签名以验证它。\n另一个类似的结构被提出，并被证明在大多数对手的散列能力下是安全的 —— 然而，他们的安全证明仍然意味着一个诚实的大多数股权。特别是，该协议没有被证明在任何少数组合资源被对手控制的条件下是安全的。后续工作也探索了动态参与、散列能力和股权的适应，以及将 PoW 与多种资源（而不仅仅是 PoS）相结合，但这部分工作缺乏严格的安全分析。\n此外，还存在另一类混合 PoW/PoS 协议，它使用 BFT 协议（PoS）在中本聪式最长链协议（PoW）的基础上建立一个最终性小工具/层，以实现问责和最终性等重要特性。然而，这些协议需要在矿工和利益相关者的集合上获得诚实的多数（甚至是超级多数），因此它们是不可替换的。\n2 预设 2.1 安全模型 时间，时段和同步。我们考虑的环境是，时间被划分为不连续的单位，称为时段（slot）。玩家配备了大致同步的时钟。时段以整数为索引，并进一步分组为固定大小为 RRR 的轮次（epoch），即轮次 eee 由时段 {(e−1)R+1,(e−1)R+2,…,eR}\\{(e-1)R+1, (e-1)R+2, \\ldots, eR\\}{(e−1)R+1,(e−1)R+2,…,eR} 组成。而我们假设与每个时段对应的实时窗口具有两个特性：（1）当前时段由一个公开的、单调增长的当前时间函数决定；（2）每个玩家都能获得当前的时间，与一个时段的时间相比，各方的当地时间的任何差异都是微不足道的。我们在现在标准的 Δ\\DeltaΔ-同步网络模型中描述我们的协议，其中对手可能对任何信息的传递造成的延迟（以时隙数衡量）有一个（未知）的上限 Δ\\DeltaΔ。协议的执行在时段中进行，输入由环境程序提供，用 Z(1κ)Z(1^\\kappa)Z(1κ) 表示，给执行协议 Π\\PiΠ 的各方，其中 κ\\kappaκ 是一个安全参数。该网络允许消息排序被对手 AAA 控制，即 AAA 可以注入消息进行选择性传递，但不能改变诚实方的消息内容，也不能阻止它们在 Δ\\DeltaΔ 时段的延迟内被传递。\n协议玩家。该协议由两类玩家执行，即 PoW 矿工（简称矿工）和 PoS 持有者（简称利益相关者），他们产生不同类型的区块，即 PoW 区块和 PoS 区块。\n随机预言。对于 PoW 挖掘，我们将哈希函数抽象为一个随机预言功能。它接受的查询形式为 (compute,x)(compute, x)(compute,x) 和 (verify,x,y)(verify, x, y)(verify,x,y)。对于第一种类型的查询，从 {0,1}κ\\{0,1\\}^\\kappa{0,1}κ 中抽出一个值 yyy，并将其输入到一个表 THT_HTH​。对于第二种类型的查询，要对表进行查找操作。诚实的矿工被允许在每个时段提出一个 computecomputecompute 类型的查询和无限的 verifyverifyverify 类型的查询。\n对资源的对抗性控制。我们假设有一个拜占庭式的对手，他可以自适应地破坏矿工。在一个时段 rrr 中，协议中活跃的诚实矿工的数量用 hrh_rhr​ 表示，rrr 时段中所有活跃矿工的数量用 nrn_rnr​ 表示。为了在足够长的窗口中获得有意义的 PoW 区块数量的集中界限，我们对诚实采矿能力的部分设定了一个下限 α0\\alpha_0α0​，即对于所有 rrr，hr≥α0nrh_r \\ge \\alpha_0 n_rhr​≥α0​nr​。我们需要以某种有限的方式限制诚实/对抗性查询数量的波动。\n定义 1（波动限制）。对于 γ∈[1,∞)\\gamma \\in [1,\\infty)γ∈[1,∞)，我们称一个序列 (xr),r∈[LR](x_r), r \\in [LR](xr​),r∈[LR] 是 (γ,s)(\\gamma,s)(γ,s)-尊重的，如果对于任意的集合 S⊆[0,LR]S \\subseteq [0,LR]S⊆[0,LR]，在大多数的连续时段中有：\nmax⁡r∈Sxr≤γmin⁡r∈Sxr \\max_{r \\in S} x_r \\le \\gamma \\min_{r \\in S} x_r r∈Smax​xr​≤γr∈Smin​xr​我们就说 ZZZ 是 (γ,s)(\\gamma,s)(γ,s)-尊重的，如果对于所有的 AAA 和整个执行过程中的所有槽，序列 (hr)(h_r)(hr​) 和 (nr)(n_r)(nr​) 也是 (γ,s)(\\gamma,s)(γ,s)-尊重的。\n最后，Minotaur 通过可互换工作和股权的证明来实现共识。以下是可替换性的正式定义和我们对对抗性权力的主要假设。\n定义 2（资源的可替代性）。对于一个时间窗口 WWW，让 βsW\\beta_s^WβsW​ 是 WWW 中对抗性股权的最大比例；让 βwW\\beta_w^WβwW​ 是 WWW 中所有时段的对抗性采矿能力的最大比例（即 βwW=1−min⁡r∈Whr/nr\\beta_w^W = 1 - \\min_{r \\in W} h_r/n_rβwW​=1−minr∈W​hr​/nr​）。对于 θ∈[0,1]\\theta \\in [0, 1]θ∈[0,1]，如果对于任何有最多 mmm 个时段的时间窗口 WWW，我们有 ωβwW+(1−ω)βsW≤θ\\omega \\beta_w^W + (1 - \\omega) \\beta_s^W \\le \\thetaωβwW​+(1−ω)βsW​≤θ，我们就说对手 AAA 是 (θ,m,ω)(\\theta,m,\\omega)(θ,m,ω)-有界的。我们说，如果一个区块链协议对这样的对手是安全的，它就实现了工作和股权的可替代性。\n为了简化分析，Minotaur 协议将依赖于下面的初始化假设：\n假设 1（初始化）。在协议的初始化阶段，我们假设：\n1.1 初始股权分布具有诚实多数，即 βs0≤1/2−σ\\beta_s^0 \\le 1/2-\\sigmaβs0​≤1/2−σ，其中 βs0\\beta_s^0βs0​ 是由对手控制的初始股权的比例。我们对初始诚实采矿能力 h1h_1h1​ 有一个很好的估计。特别是，让 h~1\\tilde{h}_1h~1​ 是 h1h_1h1​ 的估计值，我们有 h1/(1+δ)γ2≤h~1≤γ2h1/(1−δ)α0h_1/(1+\\delta)\\gamma^2 \\le \\tilde{h}_1 \\le \\gamma^2 h_1 / (1-\\delta)\\alpha_0h1​/(1+δ)γ2≤h~1​≤γ2h1​/(1−δ)α0​。 1.2 初始化后，我们将上述内容放宽到下面描述的可替换资源假设。 假设 2（执行阶段）。在协议的执行阶段，我们假设：\n2.1 股权-工作约束：对手 AAA 是 (1/2−2σ,2R,ω)(1/2-2\\sigma, 2R, \\omega)(1/2−2σ,2R,ω)-有界的。 2.2 工作波动约束：环境 ZZZ 是 (γ,2R)(\\gamma, 2R)(γ,2R)-尊重的。 2.3 工作参与约束：对于任意的时段 r∈[LR]r \\in [LR]r∈[LR]，hr≥α0nrh_r \\ge \\alpha_0 n_rhr​≥α0​nr​。 参与模式。Minotaur 可以基于不同的 PoS 最长链协议来构建。各种版本的 Minotaur 将采取以下参与模型的不同假设子集：\n(P1) 诚实的利益相关者总是在线。 (P2) 在轮次 eee 中开采了 PoW 区块的诚实矿工将在轮次 e+2e+2e+2 中保持在线。 (P3) 如果一个诚实的一方在协议开始后加入，其由环境提供的初始化链 CCC 应该与在前一个时段活跃的诚实一方的链相匹配。 2.2 区块链安全属性 注释 1。我们用 C⌈lC^{\\lceil l}C⌈l 表示“修剪”时间戳在最后一个时段内的 lll 个块所产生的链。如果 C1C_1C1​ 是 C2C_2C2​ 的前缀，我们写 C1≺C2C_1 \\prec C_2C1​≺C2​。链中最新的区块 CCC 被称为链的头部，用 head(C)head(C)head(C) 表示。我们用 C1∩C2C_1 \\cap C_2C1​∩C2​ 表示链 C1C_1C1​ 和 C2C_2C2​ 的共同前缀。给定一个链 CCC 和一个区间 SSS（或 [r1,r2][r_1,r_2][r1​,r2​]），让 C(S)C(S)C(S) 是 CCC 的一段，包含时间戳在 SSS 的区块。如果一个链 CCC 是其视图中的最佳链之一，我们就说它是由一个诚实节点持有或属于该节点。\n定义 3（共同前缀（CPCPCP））。参数为 lcp∈Nl_{cp} \\in \\mathbb{N}lcp​∈N 的共同前缀属性指出，对于任何两个在时段 r1,r2r_1, r_2r1​,r2​ 持有链 C1,C2C_1, C_2C1​,C2​，且 r1≤r2r_1 \\le r_2r1​≤r2​ 的诚实节点，持有 C1⌈lcp≺C2C_1^{\\lceil l_{cp}} \\prec C_2C1⌈lcp​​≺C2​。\n定义 4（存在性链质量（∃CQ∃CQ∃CQ））。参数为 lcq∈Nl_{cq} \\in \\mathbb{N}lcq​∈N 的存在链质量属性指出，对于任何诚实的一方在时段 rrr 持有的任何链 CCC，以及至少有 lcql_{cq}lcq​ 个连续时隙的任何区间 S⊆[0,r]S \\subseteq [0,r]S⊆[0,r]，C(S)C(S)C(S) 中至少有一个诚实生成的块。\n我们的目标是生成一个健壮的交易账本，满足以下持久性和活跃性。\n定义 5（健壮交易账本）。如果一个协议 Π\\PiΠ 将账本组织成交易的区块链，并且满足以下两个属性，那么它就能维护一个健壮的公共交易账本：\n持久性：考虑任何节点 p1p_1p1​ 上的确认账本 L1L_1L1​ 在任何时段 r1r_1r1​，以及任何节点 p2p_2p2​ 上的确认账本 L2L_2L2​ 在任何时段 r2r_2r2​。如果 r1+Δ\u0026lt;r2r_1+\\Delta \u0026lt; r_2r1​+Δ\u0026lt;r2​，那么 L1L_1L1​ 是 L2L_2L2​ 的前缀。 活跃性：以 u∈Ru \\in \\mathbb{R}u∈R 为参数，如果一个交易 txtxtx 被所有诚实节点收到超过 uuu 个时段，那么所有诚实节点将在确认的分类帐中的同一位置包含 txtxtx。 3 不可能的结果 考虑由矿工和利益相关者这两类人执行的任何协议 Π\\PiΠ，让 DΠ∗D_\\Pi^*DΠ∗​ 成为 (βw,βs)(\\beta_w, \\beta_s)(βw​,βs​) 的安全区域，在对手控制 βw\\beta_wβw​ 比例的采矿能力和 βs\\beta_sβs​ 比例的股权的情况下，Π\\PiΠ 可以生成一个稳健的公共交易账本。\n定理 3.1。任何两个点 X1=(p1,q1)X_1=(p_1,q_1)X1​=(p1​,q1​) 和 X2=(p2,q2)X_2=(p_2,q_2)X2​=(p2​,q2​)，满足 p1+p2≥1p_1+p_2 \\ge 1p1​+p2​≥1 和 q1+q2≥1q_1+q_2 \\ge 1q1​+q2​≥1，在 DΠ∗D_\\Pi^*DΠ∗​ 中不能共存。\n证明。我们表明，如果存在一个协议 Π\\PiΠ 在 X1X_1X1​ 和 X2X_2X2​ 两点下都是安全的，那么我们可以用 Π\\PiΠ 来实现一个有两个玩家的稳健交易账本，其中一个是拜占庭的，这是不可能的。\n让 Alice 和 Bob 是两个玩家，其中一个可能是恶意的。让 Alice 控制 p1p_1p1​ 比例的采矿能力和 1−q21-q_21−q2​ 比例的股权。让 Bob 控制 1−p11-p_11−p1​ 比例的采矿能力和 q2q_2q2​ 比例的股权。在 Alice 是恶意的情况下，p1p_1p1​ 比例的采矿能力和 1−q2≤q11-q_2 \\le q_11−q2​≤q1​ 比例的股权是恶意的，这由 X1X_1X1​ 点支配。在 Bob 是恶意的情况下，1−p1≤p21-p_1 \\le p_21−p1​≤p2​ 比例的采矿能力和 q2q_2q2​ 比例的股权是恶意的，这由 X2X_2X2​ 点支配。假设 Π\\PiΠ 实现了一个稳健的公共交易账本，意味着当其中一个人是恶意的时候，两个玩家之间的协议也是如此。然而，这与容忍 1 个恶意玩家至少需要 3 个玩家的经典共识下界相矛盾。\n图表 2 给出了一些满足定理 3.1 约束条件的可能的最大安全区域的例子。\n图表 2：满足定理 3.1 约束条件的安全区域\n推论 1。没有任何协议 Π\\PiΠ 能在 (1/2,m,⋅)(1/2, m, \\cdot)(1/2,m,⋅)-有界的对手下产生一个稳健的公共交易账本。 因此，推论 1 意味着假设 2.1 不仅是充分的，也是必要的。\n4 基线方法 在这一节中，我们提供了几个自然设计的混合 PoW/PoS 协议，它们未能实现 Minotaur 的全部目标。\n想法 1：通过检查点保证 PoW 链的安全。 检查点分类帐采用了一组从利益相关者池中随机选择的委员会来协助 PoW 分类账，在区块创建后不久就完成了区块。最终的区块被称为检查点，最终的账本由检查点链形成。这种机制也可以保证 PoW 账本在存在对抗性采矿多数的情况下的安全，但安全性完全由外部集合或利益相关者保证。\n想法 2：在 PoW 和 PoS 区块之间进行平滑插值。在静态环境下（总的采矿能力和总的活跃股权都是固定的，协议设计者都知道），有一个简单的协议也可以实现图 1(b) 中红线所定义的区域。在这个协议中，PoW 和 PoS 挖矿是平行进行的，遵循最长链规则。在初始化阶段，我们调整采矿目标，使 PoW 区块的采矿率为 ωf\\omega fωf，PoS 区块的采矿率为 (1−ω)f(1-\\omega)f(1−ω)f。\n然而，很难将这个简单的想法扩展到非静态环境中，尤其是可变采矿能力。为了保证非静态设置的安全性，我们需要确保每个轮次中 PoW 区块和 PoS 区块的总开采率的比率是一个常数 ω/(1−ω)\\omega/(1-\\omega)ω/(1−ω)。然而，这在可变采矿能力设置中是不可能实现的，因为对手总是可以决定隐藏或释放其 PoW 区块，这样就没有办法准确估计总采矿能力。\n5 完整协议 在这一节中，我们将对我们的协议 Minotaur 进行详细描述。该协议建立在基于纪元的 PoS 最长链协议上（例如 Ouroboros Classic, Praos, 或 Genesis）。\n与原始的 Ouroboros 协议相比，区块提议者时间表通过虚拟股权来说明这两种资源，虚拟股权是实际股权（代表原始协议中的股权）和工作股权的组合，代表归属于 PoW 资源的区块生产权份额。\n此外，PoW 矿工通过开采代言人区块（类似于“背书输入”或“果实”）参与。每个纪元都会被分配一定数量的工作股份，分配给各矿工的工作股份与他们在一个纪元内从主链引用的 PoW 区块的贡献成正比。\n现在我们详细介绍该协议。该协议在固定时间的轮次中运行，每个轮次有 RRR 个时段。\nPoW 挖矿：在一个轮次 eee 中的时段 slslsl，一个矿工挖了一个 PoW 区块，如果： H(pk,sl,h,mr,monce)\u0026lt;Te H(pk, sl, h, mr, monce) \u0026lt; T_e H(pk,sl,h,mr,monce)\u0026lt;Te​ 其中 pkpkpk 是矿工的公钥，hhh 是最后确认的 PoS 区块的哈希值，mrmrmr 是有效载荷的 Merkle 根，TeT_eTe​ 是轮次 eee 中的挖矿目标。如果一个 PoW 区块指的是不早于 slnow−slresl_{now}-sl_{re}slnow​−slre​ 时段开采的确认的 PoS 区块，那么它在当前时段被称为最近的区块。 PoS 挖矿：在轮次 eee 的 slslsl 时段中，一个或多个利益相关者被选中。被选中的概率与它的相对“虚拟”股权（实际股权与工作股权之总和）成正比。在每个轮次开始时，我们将总的工作权益设定为系统中实际权益的 ω/(1−ω)\\omega / (1-\\omega)ω/(1−ω) 倍。而在轮次 eee 中使用的工作权益分布被设定为轮次 e−2e-2e−2 中 PoS 区块所指的 PoW 区块难度分布。 调整 PoW 挖矿目标：对于轮次 eee，TeT_eTe​ 根据 De−1totalD_{e-1}^{total}De−1total​ 调整，即： Te=f(w)R/De−1total T_e = f^{(w)} R / D_{e-1}^{total} Te​=f(w)R/De−1total​ 其中 f(w)f^{(w)}f(w) 是一个协议参数，代表每槽区块数量的预期 PoW 开采率。（对于 e=2e = 2e=2，T2=f(w)(R−k)/D1totalT_2 = f^{(w)}(R - k)/D_1^{total}T2​=f(w)(R−k)/D1total​。） 链式选择规则：我们使用以下链式选择规则之一： maxvalid-mc（需要一个可信的第三方来引导，即假设(P3)）：它更喜欢较长的链，除非新链相对于当前持有的链分叉超过 kkk 块（在这种情况下，新链将被丢弃）。 maxvalid-bg（支持从创世开始引导）：如果新的链 C′C\u0026#x27;C′ 相对于当前持有的链 CCC 来说分叉少于 kkk 个块，则倾向于长链。若分叉超过 kkk 块，如果 C′C\u0026#x27;C′ 在最后一个共同区块之后的 sss 个槽位中增长得更快，则 C′C\u0026#x27;C′ 仍将是首选。 6 安全分析 6.1 主要理论 定理 6.1。在假设 1、假设 2 和假设 (P1)-(P3) 下，当在锁步同步模型中执行时，用 Ouroboros 构建的 Minotaur 生成的交易账本以压倒性的概率满足持久性和灵活性。\n定理 6.2。在假设 1、假设 2 和假设 (P1)-(P3) 下，当在 Δ\\DeltaΔ-同步模型中执行时，用 Ouroboros Praos 构建的 Minotaur 产生了一个交易账本，以压倒性的概率满足持久性和有效性。\n定理 6.3。在假设 1、假设 2 和假设 (P1)-(P2) 下，当在 Δ\\DeltaΔ-同步模型中执行时，用 Ouroboros Genesis 构建 of Minotaur 产生了一个交易账本，以压倒性的概率满足了持久性和有效性。\n6.2 使用 Ouroboros 的安全性 6.2.1 单轮次安全 定理 6.4。设 κ,R,Δ∈N,σ∈(0,1)\\kappa, R, \\Delta \\in \\mathbb{N}, \\sigma \\in (0,1)κ,R,Δ∈N,σ∈(0,1)。让 βv\\beta_vβv​ 是满足以下条件的对抗性虚拟桩的比例： βv≤1/2−σ \\beta_v \\le 1/2-\\sigma βv​≤1/2−σ 那么对手在 RRR 个时段内违反参数 lcp=κl_{cp} = \\kappalcp​=κ 的 CP 和参数 lcq=κl_{cq} = \\kappalcq​=κ 的 ∃CQ\\exists CQ∃CQ 的概率不超过 Re−Ω(κ)R e^{-\\Omega(\\kappa)}Re−Ω(κ)，其中 Ω(⋅)\\Omega(\\cdot)Ω(⋅) 隐藏的常数取决于 σ\\sigmaσ。\n6.2.2 FruitChain 参数 对于一组时段 SSS，我们定义 h(S)=∑r∈Shrh(S)=\\sum_{r \\in S} h_rh(S)=∑r∈S​hr​ 和 n(S)=∑r∈Snrn(S)=\\sum_{r \\in S} n_rn(S)=∑r∈S​nr​。为了在足够长的窗口中获得有意义的 PoW 区块数量的集中界限，我们对诚实采矿能力的部分设定了一个下限 α0\\alpha_0α0​，即对于所有 rrr，hr≥α0nrh_r \\ge \\alpha_0 n_rhr​≥α0​nr​。\n根据共同前缀属性，前缀 C⌈κC^{\\lceil \\kappa}C⌈κ 是稳定的。我们设置最近参数 slre=3κ+Δsl_{re} = 3\\kappa + \\Deltaslre​=3κ+Δ。\n定理 6.5（水果新鲜度）。如果 slre=3κ+Δsl_{re} = 3\\kappa + \\Deltaslre​=3κ+Δ，在 rrr 时段开采的诚实 PoW 区块将在 r+rwaitr + r_{wait}r+rwait​ 之前被纳入稳定的链中，其中 rwait=2κ+Δr_{wait} = 2\\kappa + \\Deltarwait​=2κ+Δ。\n证明。假设一个诚实的 PoW 区块 BwB_wBw​ 在 r0r_0r0​ 时段被开采，而 PoS 链 C0C_0C0​ 被采用，那么 BwB_wBw​ 将引用 C0⌈κC_0^{\\lceil \\kappa}C0⌈κ​ 的顶端作为最后确认的 PoS 区块。此外，根据 ∃CQ\\exists CQ∃CQ 属性，C0⌈κC_0^{\\lceil \\kappa}C0⌈κ​ 的顶端有时间戳 r1≥r0−2κr_1 \\ge r_0 - 2\\kappar1​≥r0​−2κ。通过时段 r0+Δr_0 + \\Deltar0​+Δ，所有诚实的节点将收到 BwB_wBw​。让 r2=r0+2κ+Δr_2 = r_0 + 2\\kappa + \\Deltar2​=r0​+2κ+Δ，CCC 是由诚实节点在时段 r2r_2r2​ 持有的任何链，那么同样根据 ∃CQ\\exists CQ∃CQ，CCC 上存在一个诚实块 BsB_sBs​，其时间戳 r3r_3r3​ 在区间 [r2−2κ,r2−κ][r_2 - 2\\kappa, r_2 - \\kappa][r2​−2κ,r2​−κ] 内。我们检查 BwB_wBw​ 在 r3r_3r3​ 槽位上仍然是最近的，因为： r3−r1\u0026lt;(r2−κ)−(r0−2κ)=3κ+Δ=slre r_3 - r_1 \u0026lt; (r_2 - \\kappa) - (r_0 - 2\\kappa) = 3\\kappa + \\Delta = sl_{re} r3​−r1​\u0026lt;(r2​−κ)−(r0​−2κ)=3κ+Δ=slre​ 由于 BsB_sBs​ 是在 r0+Δr_0 + \\Deltar0​+Δ 之后开采的诚实区块，BsB_sBs​ 或 BsB_sBs​ 的祖先必须包括 BwB_wBw​。由于 BsB_sBs​ 在 CCC 中是在 r2r_2r2​ 时段上稳定的，我们有 rwait=r2−r0=2κ+Δr_{wait} = r_2 - r_0 = 2\\kappa + \\Deltarwait​=r2​−r0​=2κ+Δ。\n图表 3：证明简图\n命题 1。在一个 (γ,s)(\\gamma,s)(γ,s)-尊重的环境中，让 UUU 是一个最多有 sss 个连续时段的集合，S⊆US \\subseteq US⊆U。然后对于任意的 h∈{hr:r∈U}h \\in \\{h_r : r \\in U\\}h∈{hr​:r∈U} 和任意的 n∈{nr:r∈U}n \\in \\{n_r : r \\in U\\}n∈{nr​:r∈U}，我们有： h/γ≤h(S)/∣S∣≤γh,n/γ≤n(S)/∣S∣≤γn h/\\gamma \\le h(S)/|S| \\le \\gamma h, \\quad n/\\gamma \\le n(S)/|S| \\le \\gamma n h/γ≤h(S)/∣S∣≤γh,n/γ≤n(S)/∣S∣≤γn 以及： h(U)≤(1+γ∣U\\S∣/∣S∣)h(S),n(U)≤(1+γ∣U\\S∣/∣S∣)n(S) h(U) \\le (1+\\gamma|U \\backslash S|/|S|)h(S), \\quad n(U) \\le (1+\\gamma|U \\backslash S|/|S|)n(S) h(U)≤(1+γ∣U\\S∣/∣S∣)h(S),n(U)≤(1+γ∣U\\S∣/∣S∣)n(S)定义 6（好的轮次）。如果满足以下条件，则称时段 eee 是好的： (1−δ)α0f/γ≤ph(e)Te≤(1+δ)γf (1-\\delta)\\alpha_0 f / \\gamma \\le p h^{(e)} T_e \\le (1+\\delta)\\gamma f (1−δ)α0​f/γ≤ph(e)Te​≤(1+δ)γf 其中 p=1/2κp = 1/2^\\kappap=1/2κ，h(e)=h(e−1)R+1h^{(e)} = h_{(e-1)R+1}h(e)=h(e−1)R+1​，为轮次 eee 的第一个时段中诚实查询的数量。\n命题 2。在一个 (γ,2R)(\\gamma,2R)(γ,2R) 尊重的环境下，如果时段 rrr 在轮次 eee 中是一个好的时段，那么： (1−δ)α0fγ2≤phrTe≤(1+δ)γ2f \\frac{(1-\\delta)\\alpha_0 f}{\\gamma^2} \\le p h_r T_e \\le (1+\\delta)\\gamma^2 f γ2(1−δ)α0​f​≤phr​Te​≤(1+δ)γ2f定义 8（公平性）。我们说协议具有（近似的）(W0,σ)(W_0,\\sigma)(W0​,σ)-公平性，如果对于任何 ϕ\\phiϕ（α0≤ϕ\u0026lt;1\\alpha_0 \\le \\phi \u0026lt; 1α0​≤ϕ\u0026lt;1），任何 ϕ\\phiϕ-分数的诚实子集 HHH，以及任何诚实矿工在 rrr 时段持有链 CCC 和任何间隔 S0⊆[0,r]S_0 \\subseteq [0,r]S0​⊆[0,r]（至少有 W0W_0W0​ 个连续的时段），HHH 所开采的 C(S0)C(S_0)C(S0​) 中包含的 PoW 区块的总难度至少为 (1−σ)ϕd(1-\\sigma)\\phi d(1−σ)ϕd，其中 ddd 是 C(S0)C(S_0)C(S0​) 中包含的所有 PoW 区块的总难度。\n定义 9（典型执行）。如果以下条件成立，一个执行 EEE 就是典型的：\n对于任何一个至少有 lll 个连续好时段的集合 SSS，满足 D(S)\u0026lt;(1+ϵ)ph(S)D(S) \u0026lt; (1+\\epsilon)p h(S)D(S)\u0026lt;(1+ϵ)ph(S)。 对于任何由至少 lll 个连续好时段组成的集合 SSS，让 JJJ 是 SSS 中对抗性查询的集合。如果满足目标 TTT 的合理范围，则： D(S)+A(J)\u0026lt;(1+ϵ)p(h(S)+∣J∣) D(S) + A(J) \u0026lt; (1+\\epsilon)p (h(S) + |J|) D(S)+A(J)\u0026lt;(1+ϵ)p(h(S)+∣J∣) 对于任意的集合 SSS（至少有 l/ϕl/\\phil/ϕ 个连续的好时段），满足 DH(S)\u0026gt;(1−ϵ)pnH(S)D^H(S) \u0026gt; (1-\\epsilon)p n^H(S)DH(S)\u0026gt;(1−ϵ)pnH(S)。 为了获得有意义的集中度，我们考虑窗口大小至少为： l≜2(1+ϵ/3)ϵ2γ3(1−δ)α0fλ l \\triangleq \\frac{2(1+\\epsilon/3)}{\\epsilon^2 \\gamma^3 (1-\\delta)\\alpha_0 f} \\lambda l≜ϵ2γ3(1−δ)α0​f2(1+ϵ/3)​λ 其中 λ\\lambdaλ 为系统的典型性参数。\n我们要求协议参数满足： R−3κ−Δ≥l/α0≥γϵ(4κ+Δ)(C1) R-3\\kappa-\\Delta \\ge l / \\alpha_0 \\ge \\frac{\\gamma}{\\epsilon} (4\\kappa + \\Delta) \\tag{C1} R−3κ−Δ≥l/α0​≥ϵγ​(4κ+Δ)(C1) 并且： 4ϵ≤δ≤1(C2) 4\\epsilon \\le \\delta \\le 1 \\tag{C2} 4ϵ≤δ≤1(C2)定理 6.8（公平性）。对于在一个 (γ,2R)(\\gamma, 2R)(γ,2R)-尊重的环境中的典型执行，具有最近参数 slre=3κ+Δsl_{re} = 3\\kappa + \\Deltaslre​=3κ+Δ 的协议满足 (W0,σ)(W_0,\\sigma)(W0​,σ)-公平性，其中 W0=l/α0+3κ+ΔW_0 = l/\\alpha_0 + 3\\kappa + \\DeltaW0​=l/α0​+3κ+Δ 并且 σ=4ϵ\\sigma = 4\\epsilonσ=4ϵ。\n证明。让 S0={u:r1≤u≤r2}S_0 = \\{u : r_1 \\le u \\le r_2\\}S0​={u:r1​≤u≤r2​} 是一个至少有 W0W_0W0​ 个连续时段的窗口。让 C(S0)C(S_0)C(S0​) 是 CCC 中包含时间戳在 S0S_0S0​ 中的 PoS 块的部分，让 ddd 是其包含的所有 PoW 块的总难度。\n让 S1={u:r1−(4κ+Δ)≤u≤r2+κ}S_1 = \\{u : r_1-(4\\kappa+\\Delta) \\le u \\le r_2+\\kappa\\}S1​={u:r1​−(4κ+Δ)≤u≤r2​+κ}，S2={u:r1≤u≤r2−(3κ+Δ)}S_2 = \\{u : r_1 \\le u \\le r_2-(3\\kappa+\\Delta)\\}S2​={u:r1​≤u≤r2​−(3κ+Δ)}，JJJ 是 S1S_1S1​ 中与该区块相关的对抗者查询的集合。要证明 σ\\sigmaσ-公平性，只需证明： DH(S2)≥(1−σ)ϕ(D(S1)+A(J)) D^H(S_2) \\ge (1-\\sigma)\\phi(D(S_1) + A(J)) DH(S2​)≥(1−σ)ϕ(D(S1​)+A(J)) 在一个典型执行中，根据定义有： DH(S2)\u0026gt;(1−ϵ)pnH(S2)≥(1−ϵ)ϕpn(S2) D^H(S_2) \u0026gt; (1-\\epsilon)p n^H(S_2) \\ge (1-\\epsilon)\\phi p n(S_2) DH(S2​)\u0026gt;(1−ϵ)pnH(S2​)≥(1−ϵ)ϕpn(S2​) 且： D(S1)+A(J)\u0026lt;(1+ϵ)p(h(S1)+∣J∣)=(1+ϵ)pn(S1) D(S_1) + A(J) \u0026lt; (1+\\epsilon)p (h(S_1) + |J|) = (1+\\epsilon)p n(S_1) D(S1​)+A(J)\u0026lt;(1+ϵ)p(h(S1​)+∣J∣)=(1+ϵ)pn(S1​) 根据（C1），我们有： n(S1)≤(1+γ∣S1\\S2∣∣S2∣)n(S2)≤(1+γ8κ+2Δl/α0)n(S2)≤(1+2ϵ)n(S2) n(S_1) \\le \\left(1+\\gamma\\frac{|S_1 \\backslash S_2|}{|S_2|}\\right)n(S_2) \\le \\left(1+\\gamma\\frac{8\\kappa+2\\Delta}{l/\\alpha_0}\\right)n(S_2) \\le (1+2\\epsilon)n(S_2) n(S1​)≤(1+γ∣S2​∣∣S1​\\S2​∣​)n(S2​)≤(1+γl/α0​8κ+2Δ​)n(S2​)≤(1+2ϵ)n(S2​) 最后，通过设定 σ=4ϵ\\sigma=4\\epsilonσ=4ϵ，我们结束了证明。\n6.3.3 从单轮次到多轮次的提升论证 定理 6.9（定理 6.1 的重述）。在假设 1、假设 2 和假设 (P1)-(P3) 下，当在锁步同步模型中执行时，用 Ouroboros 构建的 Minotaur 产生了一个交易账本，在 LLL 个轮次期间满足持久性和有效性，概率为 1−RL(e−Ω(κ)+e−λ)1-RL(e^{-\\Omega(\\kappa)}+e^{-\\lambda})1−RL(e−Ω(κ)+e−λ)。\n其在论文的完整版本中给出。它表明对 δ2κ\\delta^2 \\kappaδ2κ 的依赖性无法进一步提高。\n6.4 与比特币的比较 在这一段中，我们观察到 Minotaur（当在纯 PoW 情况下执行时，ω=1\\omega=1ω=1）比比特币对 PoW 参与度的波动更稳健。\n考虑比特币的情况，即最初有 nnn 个诚实方，目标为 TTT。每个时段的成功概率为 f=1−(1−pT)n≈pTnf = 1 - (1 - pT)^n \\approx pTnf=1−(1−pT)n≈pTn。我们将表明，对于 s=⌊m/pTn⌋s = \\lfloor m / pTn \\rfloors=⌊m/pTn⌋，在一个 (2,s)(2,s)(2,s)-尊重的环境中有效性可能失败。在该环境中，对手被允许每隔 s≈m/fs \\approx m/fs≈m/f 时段将各方的数量减半。\n攻击以 sss 个时段为单位进行，在此期间，对手不挖矿，也不延迟信息。对手在每个阶段开始时将各方的数量减半。让 NiN_iNi​ 表示第 iii 阶段的诚实方数量，N0=nN_0=nN0​=n，Ni=n/2iN_i = n/2^iNi​=n/2i。在阶段 iii 中期望的成功的时段的数目为： s⋅[1−(1−pT)Ni]\u0026lt;spTNi=spTn/2i≤m/2i s \\cdot [1-(1-pT)^{N_i}] \u0026lt; s pT N_i = s pT n / 2^i \\le m / 2^i s⋅[1−(1−pT)Ni​]\u0026lt;spTNi​=spTn/2i≤m/2i 在前 jjj 个阶段计算的预期块数为： m/2+m/4+…+m/2j≈m m/2 + m/4 + \\ldots + m/2^j \\approx m m/2+m/4+…+m/2j≈m 随着各方的数量每两周减半，比特币可能会因为难度无法及时调低而陷入“死锁”，而 Minotaur 则可以通过对主动计算能力的细粒度采样安全度过这一波动。\n","permalink":"https://blog.fitue.cc/posts/minotaur-consensus/","summary":"介绍发表于 ACM CCS 2022 的多资源区块链共识协议 Minotaur。该协议结合了工作量证明（PoW）和权益证明（PoS），并被证明在工作和权益两种资源之间具有最优的可替代性。","title":"论文阅读：Minotaur: Multi-Resource Blockchain Consensus"},{"content":"关于我 你好！我是这个博客的主人。我是一名热衷于分享知识和探索前沿技术的开发者。\n这里是我记录学习轨迹、总结技术经验、分享生活感悟的数字后花园。\n技能谱系 人工智能 计算机视觉：OpenCV / TensorFlow / PyTorch 自然语言处理：Hugging Face / Transformers 机器学习：Scikit-learn / XGBoost 大模型技术: LLaMA / ChatGPT / Stable Diffusion 其他工具 平台：Cloudflare / Vercel CI/CD：GitHub Actions 工具：Git / Docker 取得联系 如果你有任何问题、合作意向或者只是想交个朋友，欢迎通过以下渠道与我联系：\nGitHub: github.com 感谢你的到访，祝你阅读愉快。\n","permalink":"https://blog.fitue.cc/about/","summary":"关于博客作者的个人介绍和技术栈。","title":"关于我"},{"content":"你好！欢迎来到我的博客。这是我的第一篇文章，在这篇文章中，我将分享如何使用 Hugo 和 PaperMod 主题，以极快的速度构建一个兼具美观与性能的个人网站。\n为什么选择 Hugo \u0026amp; PaperMod？ 极致的生成速度：Hugo 用 Go 语言编写，可以在几毫秒内生成数百个页面。 轻量与简洁：PaperMod 主题非常注重性能和简洁性，默认不加载臃肿的 JS 库。 出色的 SEO：自带良好的 HTML 语义结构和元数据配置。 Cloudflare Pages 免费托管：自带全球 CDN，支持自动化构建，而且完全免费！ 博客核心技术栈 技术/工具 用途 优势 Hugo Extended 静态生成引擎 编译速度极快，支持 Sass/SCSS 编译 PaperMod 博客主题 响应式设计，自带暗黑模式与 Profile 模式 Custom CSS 视觉微调 引入 Outfit 字体、玻璃模数导航和渐变按钮 Cloudflare Pages 网站托管 无限带宽，自动化 Git CI/CD 代码高亮示例 Hugo 和 PaperMod 自带非常漂亮的代码高亮。以下是一个简单的 Python 示例：\ndef greet(name): \u0026#34;\u0026#34;\u0026#34;一个简单的问候函数\u0026#34;\u0026#34;\u0026#34; message = f\u0026#34;Hello, {name}! Welcome to my Hugo blog.\u0026#34; print(message) return message # 调用函数 greet(\u0026#34;Antigravity\u0026#34;) 接下来\u0026hellip; 我将在这个博客上持续输出关于技术开发、生活随笔和各种有趣项目的分享。如果您对我的内容感兴趣，欢迎订阅或通过 GitHub/Twitter 联系我！\n","permalink":"https://blog.fitue.cc/posts/my-first-post/","summary":"记录我使用 Hugo 静态网站生成器和 PaperMod 主题搭建个人博客的过程，并将其部署到 Cloudflare Pages。","title":"我的第一篇博客文章：基于 Hugo \u0026 PaperMod 的建站之旅"}]