<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grokking:从死记硬背到突然理解——一万步里发生了什么?</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700&family=Noto+Serif+SC:wght@400;700&family=Source+Code+Pro:wght@400;700&display=swap" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.2/dist/chart.umd.min.js"></script>
<style>
/* 1. 总体布局与氛围 */
html {
scroll-behavior: smooth;
}
body {
margin: 0;
padding: 0;
background-color: #FFFFFF;
font-family: "Noto Serif SC", serif;
font-size: 16px;
line-height: 1.8;
color: #212529;
-webkit-font-smoothing: antialiased;
}
.content-wrapper {
max-width: 800px;
margin: 3em auto;
padding: 2em 3em;
background-color: #FFFFFF;
border-radius: 4px;
}
/* 2. 字体与排版 */
h1, h2, h3, h4 {
font-family: "Noto Sans SC", "Noto Serif SC", sans-serif;
font-weight: 700;
line-height: 1.4;
}
h1 {
font-size: 28px;
text-align: center;
margin-top: 24px;
margin-bottom: 20px;
color: #212529;
}
h2 {
font-size: 22px;
margin-top: 2.5em;
margin-bottom: 1.2em;
padding-bottom: 0.4em;
border-bottom: 1px solid #e9ecef;
position: relative;
padding-left: 1.2em;
}
h2::before {
content: '';
position: absolute;
left: 0;
top: 5px;
width: 14px;
height: 14px;
background-color: #0D6EFD;
border-radius: 50%;
}
h3 {
font-size: 20px;
margin-top: 2em;
margin-bottom: 1em;
}
h4 {
font-size: 18px;
margin-top: 1.5em;
margin-bottom: 0.8em;
}
p {
margin-top: 0;
margin-bottom: 1.2em;
}
strong, b {
font-weight: 700;
color: #212529; /* 文本强调色B */
}
code {
font-family: "Source Code Pro", monospace;
background-color: #e9ecef;
padding: 0.2em 0.4em;
border-radius: 3px;
font-size: 0.9em;
}
a {
color: #0D6EFD; /* 文本强调色A */
text-decoration: none;
transition: color 0.2s ease, text-decoration 0.2s ease;
}
a:hover {
color: #0a58ca;
text-decoration: underline;
}
/* 3. 目录生成 */
.toc {
background-color: #f8f9fa;
border: 1px solid #e9ecef;
padding: 1.5em 2em;
margin: 2em 0 3em 0;
border-radius: 8px;
}
.toc-title {
font-family: "Noto Sans SC", sans-serif;
font-size: 1.2em;
font-weight: 700;
margin-top: 0;
margin-bottom: 1em;
color: #212529;
}
.toc ul {
padding-left: 0;
margin: 0;
list-style-type: none;
}
.toc .toc-level-2 > li {
margin-bottom: 0.7em;
color: #0D6EFD;
}
.toc .toc-level-2 > li a {
font-weight: 700;
}
.toc .toc-level-3 {
padding-left: 2em;
margin-top: 0.5em;
}
.toc .toc-level-3 > li {
margin-bottom: 0.4em;
}
.toc a {
color: #0D6EFD;
}
/* 4. 其他元素 */
blockquote {
margin: 1.5em 0;
padding: 0.5em 1.5em;
border-left: 5px solid #0D6EFD;
background-color: #f8f9fa;
color: #495057;
}
blockquote p {
margin-bottom: 0;
}
hr {
border: 0;
height: 2px;
background-image: linear-gradient(to right, rgba(13, 110, 253, 0), rgba(13, 110, 253, 0.75), rgba(13, 110, 253, 0));
margin: 3em 0;
}
table {
width: 100%;
border-collapse: collapse;
margin: 1.5em 0;
font-size: 0.95em;
}
th, td {
padding: 0.8em 1em;
text-align: left;
border-bottom: 1px solid #dee2e6;
}
thead th {
border-bottom: 2px solid #0D6EFD;
font-family: "Noto Sans SC", sans-serif;
font-weight: 700;
}
tbody tr:hover {
background-color: #f8f9fa;
}
/* 示例分组组件 */
.example-group {
background-color: #f8f9fa;
border: 1px dashed #ced4da;
padding: 1.5em;
margin: 2em 0;
border-radius: 8px;
}
.example-group-title {
font-family: "Noto Sans SC", sans-serif;
font-weight: 700;
margin-top: 0;
margin-bottom: 1em;
}
/* 智能图表占位 */
.chart-placeholder {
margin: 2em 0;
border: 1px dashed #ced4da;
padding: 1.5em;
text-align: center;
background-color: #f8f9fa;
border-radius: 4px;
}
.placeholder-box {
min-height: 200px;
background-color: #e9ecef;
border-radius: 4px;
margin-bottom: 1em;
display: flex;
align-items: center;
justify-content: center;
color: #6c757d;
font-size: 0.9em;
}
.placeholder-box::before {
content: "图表区域 (Chart Area)";
}
.chart-placeholder figcaption {
font-size: 0.9em;
color: #495057;
line-height: 1.4;
margin-bottom: 1.2em;
}
.chart-placeholder figcaption strong {
color: #212529;
}
/* 图表容器 */
.generated-chart {
margin: 2em 0;
}
.generated-chart canvas {
max-width: 100%;
}
.generated-chart figcaption {
font-family: "Noto Sans SC", sans-serif;
text-align: center;
margin-top: 1em;
font-size: 0.9em;
color: #495057;
}
</style>
</head>
<body>
<div class="content-wrapper">
<h1>Grokking:从死记硬背到突然理解——一万步里发生了什么?</h1>
<nav class="toc">
<h3 class="toc-title">目录</h3>
<ul class="toc-level-2">
<li><a href="#什么是-grokking诡异之处何在">一、 什么是 Grokking?诡异之处何在?</a></li>
<li><a href="#之前的解释规范最小化特征涌现与彩票假说">二、 之前的解释:规范最小化、特征涌现与彩票假说</a></li>
<li><a href="#注意力机制一个赌徒的隐喻">三、 注意力机制:一个赌徒的隐喻</a></li>
<li><a href="#结构推断与贝叶斯彩票两个可分离的条件">四、 结构推断与贝叶斯彩票:两个可分离的条件</a></li>
<li><a href="#解释消除为什么理解要等记忆先消退">五、 解释消除:为什么理解要等记忆先消退?</a></li>
<li><a href="#打破等待结构干预的标度律">六、 打破等待:结构干预的标度律</a></li>
<li><a href="#未知与局限从模加法到更复杂的任务">七、 未知与局限:从模加法到更复杂的任务</a></li>
<li><a href="#总结等待中的结构与彩票的对话">八、 总结:等待中的结构与彩票的对话</a></li>
</ul>
</nav>
<h2 id="什么是-grokking诡异之处何在">什么是 Grokking?诡异之处何在?</h2>
<p><strong>Grokking</strong> 是机器学习中一个引人注目的现象:模型在训练初期<strong>死记硬背</strong>训练数据,然后在漫长的等待后<strong>突然理解</strong>并泛化。具体来说,一个 Transformer 在模加法等小数据集上训练时,往往会在很短的时间内将训练集的每个例子都记住,达到训练准确率100%,但对未见过的数据(同一模运算的新组合)却几乎随机猜测,泛化准确率只有30%左右。训练继续进行,几千步、上万步过去,模型的表现似乎停滞不前,毫无起色。然而,大约在某一点(例如一万两千步左右),模型的泛化准确率会<strong>骤然攀升</strong>,短短几十步内从30%跃升至95%以上,仿佛一下子“顿悟”了模加法的规律。这种从记忆到理解的延迟转变就是 grokking,源自罗伯特·海因莱因小说中的火星词“grok”,意为<strong>完全地、水乳交融地理解</strong>。</p>
<p>诡异之处并不在于模型最终学会了泛化——我们当然希望如此。而在于<strong>为什么它要等那么久</strong>。按理说,当模型已经完美记忆了所有训练数据,它应该“顺便”也学会了背后的规律,从而逐步提高泛化能力。但事实是,模型在记忆和理解之间徘徊了上万步训练,<strong>毫无进展</strong>,然后<strong>瞬间</strong>完成过渡。这种漫长的等待期让人困惑:在这漫长的“沉默期”里,模型内部究竟发生了什么?</p>
<figure class="generated-chart">
<div style="height: 400px; position: relative;">
<canvas id="grokkingChart"></canvas>
</div>
<figcaption>图1:Grokking 现象示意图。模型在训练前期迅速达到100%的训练准确率,但泛化准确率长期低迷;在经过漫长的等待后,泛化能力在极短的训练步数内骤然提升,完成从记忆到理解的转变。</figcaption>
</figure>
<h2 id="之前的解释规范最小化特征涌现与彩票假说">之前的解释:规范最小化、特征涌现与彩票假说</h2>
<p>研究者们此前提出了多种解释来阐明 grokking 等待期的成因。这些解释从不同角度揭示了延迟泛化的一些侧面,但往往<strong>忽略了注意力机制本身的特殊性</strong>:</p>
<div class="example-group">
<h4 class="example-group-title">已有理论视角</h4>
<p><strong>- 规范最小化(Norm Minimization)</strong>:有观点认为,模型在记忆阶段学到了<strong>权重范数较大</strong>的参数,这些参数对记忆训练数据有效但对泛化无益。随着训练进行,<strong>权重衰减</strong>(weight decay)等正则化手段会逐步<strong>削减这些大权重</strong>,使模型朝向更小的范数解移动。当范数小到一定程度,模型被迫从记忆转向理解,从而出现泛化能力的突然提升。这个解释强调了<strong>权重范数</strong>在 grokking 中的作用,与<strong> Goldilocks 约束</strong>(容量约束)的思想一致:模型容量太大时容易通过大权重死记硬背,容量适中时才倾向于学习可泛化的特征。</p>
<p><strong>- 特征涌现(Feature Emergence)</strong>:另一种解释关注<strong>内部特征的演化</strong>。在训练初期,模型可能主要依赖<strong>低层、简单的特征</strong>来拟合数据,这些特征足以记忆训练集但缺乏泛化能力。随着训练推进,<strong>更抽象、更具泛化性的特征</strong>逐渐涌现并被模型利用,使得模型从记忆转向理解。这种解释将 grokking 视为<strong>特征演变</strong>的结果,暗示模型需要时间来“发现”正确的特征表示。</p>
<p><strong>- 彩票假说(Lottery Ticket Hypothesis)</strong>:彩票假说认为,在随机初始化的神经网络中<strong>隐藏着稀疏的、可训练的子网络</strong>,称为“中奖彩票”。训练过程本质上是在寻找这些子网络。在 grokking 的情境下,可以理解为模型在训练初期<strong>尚未找到</strong>那组能够泛化的参数子集,因此只能靠记忆;当某次训练偶然<strong>发现了</strong>(或逐步逼近)那组“中奖彩票”参数时,模型突然具备了泛化能力。这种解释把 grokking 等待期归因于<strong>子网络的发现</strong>,强调<strong>稀疏性</strong>和<strong>参数子集</strong>的作用。</p>
</div>
<p>以上解释各有道理,也各自捕捉到了 grokking 转变的一部分机制。然而,它们<strong>都未充分考虑 Transformer 中注意力机制的独特约束</strong>。具体来说,这些理论要么将 Transformer 视作一般的参数模型(如规范最小化和特征涌现的解释),要么关注参数子集的发现(如彩票假说),但<strong>忽略了注意力作为信息瓶颈的角色</strong>:如果注意力机制在某一层丢弃了某个关键信息,那么后续任何计算都无法再恢复该信息。这一约束是注意力模型所特有的,对理解 grokking 至关重要。</p>
<h2 id="注意力机制一个赌徒的隐喻">注意力机制:一个赌徒的隐喻</h2>
<p>Hidajat 等人的新论文从<strong>注意力机制</strong>出发,提出了一个全新的视角。他们指出,<strong>注意力在本质上是一个赌徒</strong>——它在对输入序列进行<strong>下注</strong>,决定哪些信息(token)重要、哪些可以忽略。这种“下注”可以用<strong>贝叶斯推断</strong>的语言来描述:注意力实际上是在<strong>隐式地推断</strong>任务的<strong>依赖结构</strong>(dependency graph),为每个输入 token 分配一个权重,相当于赋予其一个后验概率,表示“这个 token 对于当前任务有多重要”。</p>
<p>关键在于,如果注意力在某一步<strong>丢弃了</strong>一个实际上对任务<strong>信息量很大</strong>的 token(即没有给它足够的权重),那么<strong>后续的任何有限计算都无法弥补这一损失</strong>。因为信息一旦被丢弃,就像赌徒输掉的筹码,再也无法通过后续操作赢回。这与卷积网络或全连接网络不同——后者即使在中间层丢失了某些信号,后续层仍有参数可以重新组合出所需的信息。而注意力模型<strong>没有这样的第二次机会</strong>:丢弃的信息永远丢失。</p>
<p>因此,<strong>泛化要求注意力必须为每一个信息性 token 放置足够的质量</strong>。所谓“信息性 token”,是指对解决当前任务有用的输入元素;而“放置足够质量”则意味着注意力权重不能太小,以至于在 Softmax 归一化后该 token 被忽略。只有当注意力正确地识别出所有相关 token 并给予足够关注时,模型才能基于完整的任务结构进行推理,从而实现泛化。</p>
<h2 id="结构推断与贝叶斯彩票两个可分离的条件">结构推断与贝叶斯彩票:两个可分离的条件</h2>
<p>基于上述洞察,作者将 Transformer 的泛化条件<strong>拆解为两个独立的部分</strong>:</p>
<p><strong>1. MLP 容量的 Goldilocks 约束</strong>:这是指 Transformer 中前馈层(MLP)的容量必须<strong>适中</strong>,不能过大也不能过小。如果 MLP 容量不足,模型根本没有足够的参数去拟合训练数据;但如果容量过大,模型会倾向于通过<strong>记忆</strong>(死记硬背)来解决问题,因为这样更省事。只有当 MLP 的参数量恰到好处时,模型才被迫学习<strong>可泛化</strong>的表示。这个条件与之前基于<strong>权重范数</strong>的解释相吻合:容量过大对应于允许模型通过大范数权重记忆数据,而容量适中则迫使模型寻找更高效的解。简而言之,<strong>MLP 容量必须不大不小</strong>,这是泛化的第一个必要条件。</p>
<p><strong>2. 注意力的贝叶斯结构条件</strong>:这是新提出的条件,强调<strong>注意力必须正确推断出任务的依赖结构</strong>。具体来说,注意力需要为<strong>每一个</strong>对任务有用的 token 分配足够的权重,不能遗漏任何关键信息。作者将这一要求形式化为<strong>贝叶斯结构条件</strong>:注意力权重应被视为对任务依赖图的后验分布,泛化要求这个后验在<strong>所有信息性节点上都有非零质量</strong>。如果某个关键 token 被注意力忽略(后验质量为零),相当于模型误以为该 token 与任务无关,那么模型就无法学到正确的任务结构,只能靠记忆训练集来弥补。因此,<strong>注意力的结构推断</strong>(structural inference)是泛化的第二个必要条件。</p>
<p>这两个条件是<strong>可分离的</strong>:一个条件满足并不意味着另一个也满足。MLP 容量的约束与注意力的推断是独立的两个方面。这种拆解揭示了 grokking 延迟的根源:<strong>延迟泛化本质上就是延迟的结构推断</strong>。模型之所以要等,是因为<strong>结构推断被推迟</strong>了。</p>
<h2 id="解释消除为什么理解要等记忆先消退">解释消除:为什么理解要等记忆先消退?</h2>
<p>那么,为什么注意力的结构推断会被推迟?答案在于<strong>“解释消除”</strong>(explaining away)效应。在训练初期,MLP 有足够的容量直接<strong>记忆</strong>训练数据——它可以通过学习一些与任务本质无关的<strong>捷径特征</strong>来拟合所有样本。一旦 MLP 将交叉熵损失压到接近零,模型就“认为”自己已经做得很好了,此时<strong>梯度信号变得非常微弱</strong>。对于注意力来说,这意味着它几乎<strong>得不到关于任务结构的有用反馈</strong>。</p>
<p>更糟糕的是,由于 MLP 已经<strong>解释</strong>了所有的输出(即通过记忆方式给出了正确答案),注意力就失去了学习任务结构的动力——它没有动力去弄清楚到底哪些 token 是关键的,因为即使它不提供有用信息,MLP 也能靠记忆把答案“猜”对。这种现象在因果推理中被称为<strong>解释消除</strong>:一个变量(这里是 MLP 的记忆)已经解释了结果,另一个变量(这里是注意力的结构推断)就被“消除”了影响,没有机会发挥作用。</p>
<p>因此,在训练早期,注意力被“屏蔽”了,无法学习到正确的任务依赖结构。只有当<strong>权重衰减</strong>等正则化机制逐步<strong>侵蚀</strong>掉 MLP 的记忆痕迹,使模型对训练数据的拟合不再完美时,损失才会上升,<strong>梯度信号重新出现</strong>。此时,注意力才能收到反馈,开始学习那些被遗漏的依赖关系。换句话说,<strong>grokking 之所以要等,是因为在等待记忆的消退</strong>。当 MLP 的记忆被削弱到一定程度,注意力终于有机会推断出正确的任务结构,模型也就完成了从记忆到理解的过渡。</p>
<p>这解释了为何 grokking 时间与<strong>权重衰减强度</strong>呈反比关系:权重衰减越强,记忆被啃掉得越快,注意力越早得到反馈,grokking 越早发生;反之亦然。这种延迟实际上是一种<strong>结构性等待时间</strong>,源于记忆对结构推断的抑制。</p>
<h2 id="打破等待结构干预的标度律">打破等待:结构干预的标度律</h2>
<p>既然 grokking 延迟的根本原因是注意力缺乏结构梯度,那么一个自然的想法是:<strong>能否不给注意力“放假”,直接给它一些结构上的指导?</strong> 作者正是这样做的。他们引入了一种<strong>结构干预</strong>:在目标函数中加入一个<strong>KL 散度</strong>项,将注意力的分布约束向一个先验靠近。这个先验可以是任务依赖结构的某种先验知识,或者简单地鼓励注意力更均匀地关注各个 token,避免过早忽略任何信息。</p>
<p>实验结果非常漂亮:<strong>加入 KL 干预后,grokking 的等待时间大幅缩短</strong>。更令人惊喜的是,作者发现<strong>干预强度与 grokking 时间之间存在清晰的标度律</strong>——<strong>干预强度每增加一倍,等待时间近似减半</strong>。换言之,通过给注意力一点“提示”,我们几乎可以<strong>线性加速</strong>模型从记忆到理解的过渡。这种 KL 干预巧妙地绕过了“解释消除”的困境:即使 MLP 已经记忆了数据,注意力也不再完全依赖微弱的梯度信号,因为 KL 项直接为注意力提供了方向,让它更快地朝正确的结构推断迈进。</p>
<figure class="generated-chart">
<div style="height: 400px; position: relative;">
<canvas id="interventionChart"></canvas>
</div>
<figcaption>图2:KL干预强度与Grokking等待时间的标度关系。图表采用对数坐标,显示干预强度每增加一倍,等待时间近似减半的指数衰减规律,验证了论文中提出的标度律。</figcaption>
</figure>
<h2 id="未知与局限从模加法到更复杂的任务">未知与局限:从模加法到更复杂的任务</h2>
<p>尽管这一理论为 grokking 提供了一个新颖且有力的解释,仍有一些开放的问题和局限需要承认:</p>
<p><strong>- 与彩票假说的关系</strong>:论文标题中出现了“Bayesian Lottery Tickets”,明显是在与<strong>彩票假说</strong>对话。彩票假说强调<strong>参数子网络</strong>的重要性,而本文强调<strong>注意力的结构推断</strong>。两者似乎解释了 grokking 的不同侧面:彩票假说关注<strong>哪组参数</strong>能泛化,本文关注<strong>哪些信息</strong>被模型利用。然而,这两种解释是<strong>互补</strong>的还是<strong>相互竞争</strong>的?或者说,它们是否可以在一个统一的框架下共存?目前尚不清楚。作者在论文中也没有明确回答这一点,留给读者一个思考的空间。</p>
<p><strong>- 任务范围的扩展</strong>:该研究的实验主要在<strong>算法序列任务</strong>上进行,例如模加法、奇偶判断等。这些任务具有清晰、离散的依赖结构,非常适合验证注意力的结构推断条件。然而,对于更复杂的任务(例如自然语言的句法结构推断),依赖图远没有模加法那么“干净”,充满噪声和模糊性。注意力在这种环境下的贝叶斯推断行为可能截然不同,<strong>泛化延迟的机制</strong>或许也不同。目前尚不确定本文的结论能否直接推广到这类更模糊的任务上。未来的研究需要在更广泛的任务上检验这一理论的有效性。</p>
<p><strong>- 其他模型架构</strong>:本文聚焦于 Transformer 的注意力机制,但 grokking 并非 Transformer 独有。在其他架构(如 RNN、MLP)上也观察到了类似的延迟泛化现象。这些模型没有显式的注意力机制,那么它们的 grokking 是否也能用类似的结构推断延迟来解释?还是需要其他机制?这也是一个值得探索的方向。</p>
<h2 id="总结等待中的结构与彩票的对话">总结:等待中的结构与彩票的对话</h2>
<p>Hidajat 等人的工作将 grokking 这一机器学习中的谜题<strong>拆解为两个可分离的条件</strong>:一个是关于<strong>模型容量</strong>的 Goldilocks 约束,另一个是关于<strong>注意力结构</strong>的贝叶斯推断条件。他们揭示了延迟泛化的本质——<strong>延迟的结构推断</strong>,并指出这种延迟源于记忆对结构推断的抑制(解释消除效应)。通过巧妙的结构干预,他们成功缩短了 grokking 的等待时间,并发现了干预强度与等待时间之间的标度律。</p>
<p>这篇论文不仅解释了“<strong>一万步里发生了什么</strong>”,还提供了一种加速模型理解的方法。它告诉我们:grokking 的等待并非不可避免,只要我们理解了其中的机制,就能主动打破记忆的束缚,让模型更早地“顿悟”。这无疑为理解和控制神经网络的学习过程提供了新的视角。然而,也正如作者所坦诚的,<strong>彩票假说与结构推断之间的关系</strong>、以及这一理论在更复杂任务上的普适性,仍是未解之谜,有待进一步研究。在 grokking 的研究中,结构推断与彩票假说的对话才刚刚开始,我们期待未来出现更多将二者融会贯通的理论,彻底揭开神经网络从记忆到理解转变的奥秘。</p>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
// General Chart Configuration
const defaultFontFamily = "'Noto Sans SC', sans-serif";
const defaultFontColor = '#212529';
const gridColor = '#E9ECEF';
Chart.defaults.font.family = defaultFontFamily;
Chart.defaults.color = defaultFontColor;
Chart.defaults.borderColor = gridColor;
// Chart 1: Grokking Phenomenon
const grokkingCtx = document.getElementById('grokkingChart');
if (grokkingCtx) {
const grokkingData = {
labels: [0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 11500, 12000, 12500, 13000, 14000],
datasets: [
{
label: '训练准确率',
data: [10, 80, 98, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100],
borderColor: 'rgba(255, 99, 132, 0.8)',
backgroundColor: 'rgba(255, 99, 132, 0.1)',
borderWidth: 2,
fill: false,
tension: 0.1,
pointRadius: 1,
},
{
label: '泛化准确率',
data: [10, 25, 28, 30, 30, 30, 30, 30, 30, 30, 32, 50, 70, 90, 94, 95, 95],
borderColor: 'rgba(13, 110, 253, 0.8)',
backgroundColor: 'rgba(13, 110, 253, 0.1)',
borderWidth: 2,
fill: false,
tension: 0.1,
pointRadius: 1,
}
]
};
new Chart(grokkingCtx, {
type: 'line',
data: grokkingData,
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
x: {
title: {
display: true,
text: '训练步数',
font: { size: 14 }
},
grid: {
drawOnChartArea: false
},
ticks: {
color: defaultFontColor
}
},
y: {
title: {
display: true,
text: '准确率 (%)',
font: { size: 14 }
},
min: 0,
max: 120, // 100 * 1.2
grid: {
borderDash: [5, 5] // Dashed lines
},
ticks: {
color: defaultFontColor,
callback: function(value) {
return value + '%';
}
}
}
},
plugins: {
legend: {
position: 'top',
labels: {
font: { size: 12 }
}
},
tooltip: {
mode: 'index',
intersect: false
},
title: {
display: false
}
}
}
});
}
// Chart 2: Intervention Scaling Law
const interventionCtx = document.getElementById('interventionChart');
if (interventionCtx) {
const interventionData = {
labels: [1, 2, 4, 8, 16],
datasets: [{
label: 'Grokking 等待时间',
data: [10000, 5000, 2500, 1250, 625],
backgroundColor: 'rgba(13, 110, 253, 0.5)',
borderColor: 'rgba(13, 110, 253, 1)',
borderWidth: 1
}]
};
new Chart(interventionCtx, {
type: 'bar',
data: interventionData,
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
x: {
title: {
display: true,
text: 'KL 干预强度 (相对值)',
font: { size: 14 }
},
grid: {
drawOnChartArea: false
},
ticks: {
color: defaultFontColor
}
},
y: {
type: 'logarithmic',
title: {
display: true,
text: 'Grokking 等待时间 (步)',
font: { size: 14 }
},
grid: {
borderDash: [5, 5] // Dashed lines
},
ticks: {
color: defaultFontColor,
callback: function(value, index, values) {
if (value === 10000 || value === 5000 || value === 2500 || value === 1250 || value === 625) {
return value;
}
}
}
}
},
plugins: {
legend: {
display: false
},
tooltip: {
callbacks: {
label: function(context) {
let label = context.dataset.label || '';
if (label) {
label += ': ';
}
if (context.parsed.y !== null) {
label += context.parsed.y + ' 步';
}
return label;
}
}
},
title: {
display: false
}
}
}
});
}
});
</script>
</body>
</html>