收到一条消息后,你排除了哪些可能?还剩多少不知道?信息论把这种变化变成可以计算的量。 它度量给定概率模型下的不确定性,不直接衡量一句话的意义、真假或价值。
这一篇先让你看见三件事:候选如何被回答排除、单次信息如何汇成平均值、一个变量怎样帮助我们了解另一个变量。全文使用以 2 为底的对数,单位为 bit;除特别说明外,讨论有限离散随机变量。
从八个候选到一个答案
设随机变量 X 等概率地取 1 到 8。每次只能问一个是非问题,并且必须最终确定答案。
问“是否大于 4”,不论回答是什么,都能排除一半候选。接下来继续对半分,候选数就沿着 8→4→2→1 变化。下面固定展示答案为 7 的一条路径;其他答案也都恰好经过三次提问。
正在呈现知识画面
一个答案,怎样变成 3 bit 信息均匀分布的 8 个候选沿这一条回答路径变成 4、2、1 个。每次把剩余概率质量平分,获得 1 bit;这是逻辑步骤,不是物理时间。
{"id":"entropy-candidates","title":"一个答案,怎样变成 3 bit 信息","summary":"均匀分布的 8 个候选沿这一条回答路径变成 4、2、1 个。每次把剩余概率质量平分,获得 1 bit;这是逻辑步骤,不是物理时间。","height":600,"html":"<div class=\"eyebrow\" data-i18n=\"eyebrow\"></div>\n<h2 data-i18n=\"heading\"></h2>\n<p class=\"hint\" data-i18n=\"intro\"></p>\n<div class=\"candidates\" role=\"group\" data-i18n-label=\"candidates\"></div>\n<div class=\"metrics\">\n <div class=\"metric\"><strong id=\"remaining\">8</strong><span data-i18n=\"remaining\"></span></div>\n <div class=\"metric\"><strong id=\"uncertainty\">3 bit</strong><span data-i18n=\"uncertainty\"></span></div>\n <div class=\"metric\"><strong id=\"received\">0 bit</strong><span data-i18n=\"received\"></span></div>\n</div>\n<div class=\"history\" data-i18n-label=\"history\"></div>\n<div class=\"readout\" id=\"explanation\" role=\"status\" aria-live=\"polite\"></div>\n<div class=\"toolbar\">\n <button type=\"button\" data-prev data-i18n=\"prev\"></button>\n <button type=\"button\" class=\"primary\" data-next data-i18n=\"next\"></button>\n <button type=\"button\" data-play data-i18n=\"play\" aria-pressed=\"false\"></button>\n <span data-step></span>\n</div>","css":".candidates { display:grid; grid-template-columns:repeat(8,minmax(0,1fr)); gap:8px; margin-top:24px; }\n.candidate { display:grid; place-items:center; height:62px; border:1px solid var(--accent); background:var(--accent-soft); color:var(--accent); border-radius:6px; font-size:23px; transition:opacity .45s,transform .45s,background .45s; }\n.candidate.excluded { opacity:.28; transform:scale(.88); border-color:var(--rule); background:var(--surface); color:var(--muted); text-decoration:line-through; }\n.candidate.found { background:var(--accent); color:var(--paper); }\n.history { display:grid; gap:6px; }\n.history-row { display:flex; align-items:center; gap:12px; font-size:14px; opacity:.32; transition:opacity .3s; }\n.history-row.current { opacity:1; }\n.history-step { width:22px; color:var(--muted); font-variant-numeric:tabular-nums; }\n.history-track { flex:1; display:grid; grid-template-columns:repeat(8,1fr); gap:2px; height:8px; }\n.history-track i { background:var(--rule); border-radius:2px; }\n.history-track i.kept { background:var(--accent); }\n.history-value { width:42px; text-align:right; color:var(--muted); }\n@media(max-width:480px) { .candidates { gap:4px; } .candidate { height:48px; font-size:20px; } }","js":"const states = [[1,2,3,4,5,6,7,8],[5,6,7,8],[7,8],[7]];\nconst grid = document.querySelector('.candidates'), history = document.querySelector('.history');\nfor (let n=1;n<=8;n++) {const cell=document.createElement('div');cell.className='candidate';cell.textContent=n;grid.append(cell);}\nstates.forEach((state,index)=>{\n const row=document.createElement('div');row.className='history-row';\n const label=document.createElement('span');label.className='history-step';label.textContent=index;\n const track=document.createElement('div');track.className='history-track';track.setAttribute('aria-hidden','true');\n for(let n=1;n<=8;n++){const bit=document.createElement('i');bit.classList.toggle('kept',state.includes(n));track.append(bit);}\n const value=document.createElement('span');value.className='history-value';value.textContent=state.length;\n row.append(label,track,value);history.append(row);\n});\nviz.sequence({count:4,render(step){\n [...grid.children].forEach((cell,index)=>{\n const kept=states[step].includes(index+1);\n cell.classList.toggle('excluded',!kept);cell.classList.toggle('found',step===3&&kept);\n cell.setAttribute('aria-label',`${index+1} · ${viz.t(kept?'kept':'excluded')}`);\n });\n [...history.children].forEach((row,index)=>row.classList.toggle('current',index<=step));\n document.querySelector('#remaining').textContent=states[step].length;\n document.querySelector('#uncertainty').textContent=`${3-step} bit`;\n document.querySelector('#received').textContent=`${step} bit`;\n document.querySelector('#explanation').textContent=viz.t('step'+step);\n}});","audio":false,"strings":{"candidates":"数字候选","excluded":"已排除","eyebrow":"01 / 从可能到确定","heading":"让每一条信息都有可见的去向","history":"保留每一步的候选变化","intro":"演示固定沿数字 7 的路径展开。先看全部候选,再逐步揭示回答。","kept":"仍可能","next":"下一步","pause":"暂停","play":"播放过程","prev":"上一步","received":"已获得的信息","remaining":"剩余候选","step0":"还没有收到回答。8 个数字等概率,确认其中一个需要 3 bit 信息。","step1":"问:大于 4 吗?答:是。排除 1–4,候选从 8 个变成 4 个,获得 1 bit。","step2":"问:大于 6 吗?答:是。在已有回答的条件下,候选从 4 个变成 2 个,再获得 1 bit。","step3":"问:大于 7 吗?答:否。只剩数字 7;累计获得 3 bit,剩余不确定性为 0。","uncertainty":"剩余不确定性"}}
一次回答能带来多少信息,取决于它排除了多少概率质量。 在这个例子中,每次回答在当时的条件下都有 1/2 的概率,所以都带来 1 bit,三次合计 log28=3 bit。
这个结论需要“等概率”和“每次对半分”。如果数字 7 的概率为 0.8,其余七个数字各占 0.2/7,先问“是不是 7”就能让多数情况一次结束。此时“是”和“否”分别携带约 0.322 和 2.322 bit;是非问题并不保证每个回答都恰好带来 1 bit。
自信息:确认一个事件,得到多少信息
概率为 p(x)>0 的结果 x 一旦发生,其自信息定义为:
I(x)=−log2p(x)
越罕见的事件,确认它发生时得到的信息越多。概率为 1 的事件自信息为 0:模型已经确定的结果,没有额外消除不确定性。
| 事件在模型中的概率 | 自信息 | 怎样理解 |
| 1/2 | 1 bit | 确认一次等概率的二选一 |
| 1/8 | 3 bit | 确认八个等概率候选中的一个 |
| 1/100 | 约 6.644 bit | 比常见事件携带更多信息 |
| 1 | 0 bit | 结果已经确定 |
为什么用对数?独立事件的联合概率相乘,我们希望确认它们的信息量相加:
I(x,y)=−log2[p(x)p(y)]=I(x)+I(y)
不独立时仍然可以相加,但第二项必须使用条件概率:
−log2p(x,y)=−log2p(x)−log2p(y∣x)
自信息可以是小数。它不是“这一次真的问了 0.322 个问题”,也不要求一段独立的二进制码字能有小数位长度。实际提问次数与编码长度的关系,稍后再讨论。
熵:把每种结果的信息量按概率加权
自信息针对某个结果。熵针对整个分布,是自信息的期望:
H(X)=E[I(X)]=−x∑p(x)log2p(x)
想象反复从同一分布独立取样。常见结果更频繁地进入平均,罕见结果虽然单次信息量大,出现次数却少。因此,不能把各结果的自信息简单相加;需要先乘上发生概率。
下面只保留两个结果:P(A)=p、P(B)=1−p。对应的二元熵函数为:
h2(p)=−plog2p−(1−p)log2(1−p)
先看整个概率区间的趋势:曲线的横坐标是 p,纵坐标是两项贡献之和 h2(p)。
两端的结果完全确定,熵为零;各占一半时最难预测,熵达到 1 bit。曲线左右对称,因为交换结果的名字不会改变不确定性。
下面把曲线上的一个点拆开:改变概率,观察每个矩形的宽、高与面积,理解这两项贡献如何相加。
正在呈现知识画面
罕见时变高,也变窄拖动 A 的概率,蓝色和金色色块同步改变。宽度是概率,高度是单次自信息,面积是对熵的贡献;两块面积相加得到平均信息量。
{"id":"entropy-probability","title":"罕见时变高,也变窄","summary":"拖动 A 的概率,蓝色和金色色块同步改变。宽度是概率,高度是单次自信息,面积是对熵的贡献;两块面积相加得到平均信息量。","height":1040,"html":"<div class=\"eyebrow\" data-i18n=\"eyebrow\"></div>\n<h2 data-i18n=\"heading\"></h2>\n<p class=\"hint\" data-i18n=\"intro\"></p>\n<div class=\"probability-control\"><label for=\"probability\" data-i18n=\"probability\"></label><output id=\"probability-value\" for=\"probability\"></output></div>\n<input id=\"probability\" type=\"range\" min=\"0\" max=\"100\" step=\"1\" value=\"90\">\n<div class=\"range-labels\" aria-hidden=\"true\"><span>0%</span><span>50%</span><span>100%</span></div>\n<div class=\"entropy-total\">\n <div class=\"total-heading\"><span data-i18n=\"totalMeaning\"></span><strong>H = <output id=\"entropy\"></output> <small>bit</small></strong></div>\n <div class=\"total-track\" role=\"img\" data-i18n-label=\"totalLabel\"><span id=\"total-a\"></span><span id=\"total-b\"></span></div>\n <div class=\"total-scale\"><span>0 bit</span><span>1 bit</span></div>\n</div>\n\n<div class=\"outcome-labels\">\n <div class=\"outcome-a\"><strong>A</strong><span id=\"label-a\"></span><span id=\"info-a\"></span></div>\n <div class=\"outcome-b\"><strong>B</strong><span id=\"label-b\"></span><span id=\"info-b\"></span></div>\n</div>\n<div class=\"axis-heading\" data-i18n=\"heightMeaning\"></div>\n<div class=\"chart-shell\">\n <div class=\"information-chart\" role=\"img\" data-i18n-label=\"chartLabel\">\n <span class=\"grid-line top\"><i>7</i></span><span class=\"grid-line middle\"><i>3.5</i></span><span class=\"grid-line bottom\"><i>0</i></span>\n <div class=\"area area-a\" id=\"area-a\"></div><div class=\"area area-b\" id=\"area-b\"></div>\n <div class=\"division\" id=\"division\"></div>\n </div>\n <div class=\"frequency-band\" aria-hidden=\"true\"><span id=\"frequency-a\"></span><span id=\"frequency-b\"></span></div>\n <div class=\"probability-axis\"><span>0</span><span data-i18n=\"widthMeaning\"></span><span>1</span></div>\n</div>\n<p class=\"area-meaning\" data-i18n=\"areaMeaning\"></p>\n<div class=\"probability-readout\" aria-live=\"polite\">\n <p id=\"probability-explanation\"></p><p class=\"reserve\" data-i18n=\"middle\" aria-hidden=\"true\"></p><p class=\"reserve\" data-i18n=\"offcenter\" aria-hidden=\"true\"></p><p class=\"reserve\" data-i18n=\"endpoint\" aria-hidden=\"true\"></p>\n</div>\n<details class=\"audit-details\"><summary data-i18n=\"detailLabel\"></summary><div class=\"contributions\">\n <div class=\"contribution contribution-a\"><span class=\"contribution-heading\"><strong>A</strong><span data-i18n=\"contribution\"></span></span><div class=\"expression\"><span id=\"contribution-a\"></span><span class=\"reserve\" aria-hidden=\"true\">0.99 × 6.64 ≈ 0.99 bit</span><span class=\"reserve\" aria-hidden=\"true\">lim −p log₂p → 0 bit</span></div></div>\n <div class=\"contribution contribution-b\"><span class=\"contribution-heading\"><strong>B</strong><span data-i18n=\"contribution\"></span></span><div class=\"expression\"><span id=\"contribution-b\"></span><span class=\"reserve\" aria-hidden=\"true\">0.99 × 6.64 ≈ 0.99 bit</span><span class=\"reserve\" aria-hidden=\"true\">lim −p log₂p → 0 bit</span></div></div>\n</div>\n<p class=\"model-note\" data-i18n=\"modelNote\"></p></details>","css":".probability-control { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-top:24px; }\n.range-labels { display:flex; justify-content:space-between; color:var(--muted); font-size:10px; font-variant-numeric:tabular-nums; }\n.outcome-labels { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; margin:24px 0; font-size:13px; font-variant-numeric:tabular-nums; }\n.outcome-labels > div { display:grid; grid-template-columns:auto 1fr; gap:2px 9px; align-items:center; }\n.outcome-labels strong { display:grid; grid-row:span 2; place-items:center; width:30px; height:36px; border-radius:6px; background:var(--accent-soft); }\n.outcome-labels span { white-space:nowrap; }\n.outcome-a { color:var(--accent); } .outcome-b { color:var(--second); }\n.outcome-b strong { background:var(--second-soft); }\n.axis-heading { margin-bottom:12px; color:var(--muted); font-size:12px; }\n.chart-shell { padding-left:28px; }\n.information-chart { position:relative; height:224px; border-left:1px solid var(--rule); }\n.grid-line { position:absolute; inset-inline:0; height:0; border-top:1px solid var(--rule); }\n.grid-line i { position:absolute; left:-29px; width:23px; text-align:right; transform:translateY(-50%); color:var(--muted); font-size:11px; font-style:normal; }\n.grid-line.top { top:0; } .grid-line.middle { top:50%; border-top-style:dashed; opacity:.7; } .grid-line.bottom { bottom:0; }\n.area { position:absolute; bottom:0; box-sizing:border-box; box-shadow:inset 0 0 0 1px currentColor; transition:width .35s ease,height .35s ease,opacity .2s ease; background:var(--accent-soft); }\n.area::after { content:''; position:absolute; inset:0; opacity:.1; background:repeating-linear-gradient(135deg,transparent 0 7px,currentColor 7px 8px); }\n.area-a { left:0; color:var(--accent); }\n.area-b { right:0; color:var(--second); background:var(--second-soft); }\n.division { position:absolute; top:0; bottom:0; width:0; border-left:1px dashed var(--muted); opacity:.35; transition:left .35s ease; }\n.frequency-band { display:flex; height:5px; margin-top:5px; overflow:hidden; border-radius:2px; }\n.frequency-band span { display:block; transition:width .35s ease; }\n#frequency-a { background:var(--accent); } #frequency-b { background:var(--second); }\n.probability-axis { display:flex; justify-content:space-between; align-items:baseline; gap:10px; font-size:11px; color:var(--muted); margin-top:8px; }\n.probability-axis > span:nth-child(2) { text-align:center; }\n.area-meaning { text-align:center; margin:20px 0; font-size:13px; color:var(--muted); }\n.contributions { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; }\n.contribution { padding:12px; border:1px solid var(--rule); border-radius:8px; min-width:0; }\n.contribution-a { color:var(--accent); } .contribution-b { color:var(--second); }\n.contribution-heading { display:flex; flex-wrap:wrap; gap:4px 8px; align-items:center; font-size:12px; margin-bottom:5px; }\n.expression { display:grid; font-size:13px; line-height:1.7; font-variant-numeric:tabular-nums; }\n.expression > span { grid-area:1 / 1; min-width:0; }\n.reserve { visibility:hidden; pointer-events:none; user-select:none; }\n.entropy-total { margin-top:24px; padding-top:18px; border-top:1px solid var(--rule); }\n.total-heading { display:flex; align-items:baseline; justify-content:space-between; flex-wrap:wrap; gap:8px 16px; }\n.total-heading > span { color:var(--muted); font-size:13px; }\n.total-heading strong { font-size:23px; font-weight:500; white-space:nowrap; font-variant-numeric:tabular-nums; }\n.total-heading small { font-size:13px; font-weight:400; color:var(--muted); }\n.total-track { display:flex; height:16px; margin-top:12px; border-radius:3px; overflow:hidden; background:var(--surface); }\n.total-track > span { height:100%; transition:width .35s ease; }\n#total-a { background:var(--accent); } #total-b { background:var(--second); }\n.total-scale { display:flex; justify-content:space-between; font-size:10px; color:var(--muted); margin-top:5px; }\n.probability-readout { display:grid; font-size:13px; line-height:1.7; margin-top:18px; }\n.probability-readout > p { grid-area:1 / 1; min-width:0; }\n.model-note { font-size:11px; color:var(--muted); margin-top:16px; line-height:1.7; }\n@media(max-width:480px) { .outcome-labels { gap:10px; font-size:11px; } .outcome-labels strong { width:24px; } .contributions { gap:8px; } .contribution { padding:10px; } .expression { font-size:12px; } .information-chart { height:200px; } }\n.entropy-total { margin-top:12px; padding-top:10px; }.outcome-labels { margin:16px 0; }.area-meaning { margin:12px 0; }.probability-readout { margin-top:12px; }\n@media(max-width:480px){.information-chart{height:150px}.outcome-labels{margin:12px 0}.axis-heading{margin-bottom:8px}.total-heading strong{font-size:21px}.contributions{margin-top:10px}.chart-shell{padding-left:28px}}\n\n.audit-details { border-top:1px solid var(--rule); margin-top:14px; padding-top:8px; }\n.audit-details summary { cursor:pointer; color:var(--accent); font-size:13px; min-height:36px; padding:6px 0; }\n.audit-details summary:focus-visible { outline:2px solid var(--accent); outline-offset:2px; }\n.audit-details .formula { border:0; margin-top:8px; padding:8px 0; }\n","js":"const slider=document.querySelector('#probability');\nfunction draw(){\n const p=Number(slider.value)/100,q=1-p;\n const ia=p>0?-Math.log2(p):Infinity,ib=q>0?-Math.log2(q):Infinity;\n const ca=p>0?p*ia:0,cb=q>0?q*ib:0,h=ca+cb;\n const info=x=>Number.isFinite(x)?viz.number(x):'∞';\n document.querySelector('#probability-value').textContent=viz.number(p*100,0)+'%';\n for(const [key,chance,value,contribution] of [['a',p,ia,ca],['b',q,ib,cb]]){\n document.querySelector('#label-'+key).textContent=`p = ${viz.number(chance)}`;\n document.querySelector('#info-'+key).textContent=`I = ${info(value)} bit`;\n const area=document.querySelector('#area-'+key);\n area.style.width=`${chance*100}%`;\n area.style.height=`${Number.isFinite(value)?100*value/7:0}%`;\n area.style.opacity=chance===0||value===0?'0':'1';\n document.querySelector('#frequency-'+key).style.width=`${chance*100}%`;\n document.querySelector('#total-'+key).style.width=`${contribution*100}%`;\n document.querySelector('#contribution-'+key).textContent=chance===0?'lim −p log₂p → 0 bit':`${viz.number(chance)} × ${info(value)} ≈ ${viz.number(contribution)} bit`;\n }\n document.querySelector('#division').style.left=`${p*100}%`;\n document.querySelector('#entropy').textContent=viz.number(h);\n document.querySelector('#probability-explanation').textContent=viz.t(p===0||p===1?'endpoint':p===.5?'middle':'offcenter');\n document.querySelector('.information-chart').setAttribute('aria-label',`${viz.t('chartLabel')} A: p=${viz.number(p)}, I=${info(ia)} bit; B: p=${viz.number(q)}, I=${info(ib)} bit.`);\n document.querySelector('.total-track').setAttribute('aria-label',`${viz.t('totalLabel')} A: ${viz.number(ca)} bit; B: ${viz.number(cb)} bit; H=${viz.number(h)} bit.`);\n}\nslider.addEventListener('input',draw);\ndraw();","audio":false,"strings":{"areaMeaning":"宽 × 高 = 概率 × 自信息 = 对熵的贡献","chartLabel":"概率与自信息的面积图:蓝色为 A,金色为 B;宽度是概率,高度是自信息,面积是对熵的贡献。","contribution":"面积 · p × I","detailLabel":"查看逐项计算与模型约定","endpoint":"结果完全确定时,必然结果的高度为 0;不可能结果的宽度为 0,自信息形式上为 ∞,贡献按极限定义为 0。两块面积都为 0,熵也为 0。","eyebrow":"02 / 用面积看见加权平均","heading":"罕见事件的信息量大,平均值为什么还能小?","heightMeaning":"高度 = 单次自信息 I · bit","intro":"只改变 A 的概率。沿着同一块颜色看:它有多宽、多高,以及面积有多大。","middle":"两种结果同样常见。每块宽 0.5、高 1,各贡献 0.5 bit;合起来是 1 bit,二元熵达到最大。","modelNote":"这里直接按概率计算,没有抽样波动。主图高度固定为 0–7 bit;底部贡献条的满刻度固定为 1 bit。","offcenter":"小概率结果的色块更高,却也更窄。面积同时取决于宽和高,所以单次信息量变大,不代表平均信息量也变大。","probability":"A 的发生概率","totalLabel":"两种结果对熵的贡献之和,满刻度为 1 bit。","totalMeaning":"两块面积相加,得到熵","widthMeaning":"宽度 = 发生概率 p"}}
在 p=0.5 时,两种结果各有 1 bit 自信息,加权后各贡献 0.5 bit,熵最大,为 1 bit。偏向任意一端时,罕见结果变得更意外,但整个分布的平均不确定性降低。到 p=0 或 1,结果完全确定,熵为 0。
这里约定 0log20=0,依据的是 limp→0+plog2p=0。概率为零的事件在模型内不会发生;若现实出现了它,应该检查模型,而不是把它当作一个普通的有限自信息样本。
熵与实际提问次数,不能直接画等号
自信息与熵可以是小数,但一次实际的是非提问只能算一次。逐符号前缀码的最优平均长度满足 H(X)≤L∗<H(X)+1(至少两个正概率结果)。因此自信息、熵、平均码长与最坏提问次数是不同的量。
这里先记住区别;公平骰子的决策树、取整开销与分块编码,放在源编码与压缩中解释。
联合熵、条件熵与互信息
两个变量之间的问题是:看到线索后,还剩多少不知道? 为了看清“平均”的作用,这次让 Y 不再均匀:P(Y=1)=0.1,P(Y=0)=0.9。线索 X=Y⊕N,独立噪声 N 以概率 q 翻转原值。
默认 q=0.1。如果看到 X=1,可能是少见的 Y=1 被正确保留,也可能是常见的 Y=0 被翻转。两种情况的联合概率都是 0.09,所以这个分支反而变成五五开。另一个分支是什么样?两者该怎样平均?
正在呈现知识画面
每个分支不一样,条件熵怎样平均?联合概率按 X 分成两行,各自归一化成条件分布。每个分支的熵乘以该分支概率,再相加得到条件熵;某一分支更不确定,也不妨碍平均不确定性下降。
{"id":"entropy-conditioning","title":"每个分支不一样,条件熵怎样平均?","summary":"联合概率按 X 分成两行,各自归一化成条件分布。每个分支的熵乘以该分支概率,再相加得到条件熵;某一分支更不确定,也不妨碍平均不确定性下降。","height":1100,"html":"<p class=\"eyebrow\" data-i18n=\"eyebrow\"></p><h2 data-i18n=\"heading\"></h2><p class=\"intro\" data-i18n=\"intro\"></p>\n<div class=\"presets\" role=\"group\" data-i18n-label=\"priorLabel\"><button data-prior=\"10\" data-i18n=\"skewed\"></button><button data-prior=\"50\" data-i18n=\"balanced\"></button></div>\n<label class=\"control\" for=\"noise\"><span data-i18n=\"noise\"></span><output id=\"noise-value\"></output></label><input id=\"noise\" type=\"range\" min=\"0\" max=\"100\" value=\"10\">\n<div class=\"presets\" role=\"group\" data-i18n-label=\"noise\"><button data-noise=\"0\" data-i18n=\"copy\"></button><button data-noise=\"50\" data-i18n=\"independent\"></button><button data-noise=\"100\" data-i18n=\"inverted\"></button></div>\n<div class=\"prior-line\"><span id=\"prior-distribution\"></span><strong id=\"prior-entropy\"></strong></div>\n<div class=\"joint\"><div class=\"joint-row\"><span>P(X,Y)</span><span>Y=0</span><span>Y=1</span><span>P(X)</span></div><div class=\"joint-row\"><strong>X=0</strong><span id=\"cell00\"></span><span id=\"cell01\"></span><strong id=\"weight0\"></strong></div><div class=\"joint-row\"><strong>X=1</strong><span id=\"cell10\"></span><span id=\"cell11\"></span><strong id=\"weight1\"></strong></div></div>\n<p class=\"note\" data-i18n=\"jointNote\"></p>\n<div class=\"branches\"><section class=\"branch\" id=\"branch0\"><h3>Y | X=0</h3><div class=\"posterior\" aria-hidden=\"true\"><div id=\"posterior0\"></div><div class=\"second\" id=\"posterior01\"></div></div><p class=\"distribution\" id=\"distribution0\"></p><strong id=\"entropy0\"></strong><p class=\"branch-change\"><span data-i18n=\"more\"></span></p></section><section class=\"branch\" id=\"branch1\"><h3>Y | X=1</h3><div class=\"posterior\" aria-hidden=\"true\"><div id=\"posterior10\"></div><div class=\"second\" id=\"posterior11\"></div></div><p class=\"distribution\" id=\"distribution1\"></p><strong id=\"entropy1\"></strong><p class=\"branch-change\"><span data-i18n=\"more\"></span></p></section></div>\n<div class=\"formula\"><div>H(Y|X) = P(X=0) H(Y|X=0) + P(X=1) H(Y|X=1)</div><div id=\"weighted-formula\"></div></div>\n<div class=\"contributions\" role=\"img\" data-i18n-label=\"contributions\"><div id=\"contribution0\"></div><div id=\"contribution1\"></div></div><div class=\"scale\"><span>0 bit</span><span>1 bit</span></div><div class=\"legend\"><span class=\"blue\">X=0</span><span class=\"gold\">X=1</span></div>\n<div class=\"metric-pair\"><div><span>H(Y|X) · bit</span><strong id=\"conditional\"></strong></div><div><span>I(X;Y) · bit</span><strong id=\"mutual\"></strong></div></div>\n<div class=\"formula\"><div id=\"mutual-formula\"></div><div id=\"chain-formula\"></div></div><p class=\"note\" data-i18n=\"note\"></p>\n","css":".intro { margin:8px 0 18px; color:var(--muted); font-size:14px; }\n.control { display:flex; align-items:center; justify-content:space-between; gap:16px; margin-top:18px; }\n.control output { min-width:4em; flex-shrink:0; text-align:center; background:var(--accent-soft); color:var(--accent); padding:2px 8px; border-radius:6px; font-weight:600; }\n.formula { margin-top:18px; padding:14px 0; border-block:1px solid var(--rule); font-size:16px; font-variant-numeric:tabular-nums; overflow-wrap:anywhere; }\n.copy-stack { display:grid; margin-top:14px; color:var(--muted); font-size:14px; }\n.copy-stack > * { grid-area:1/1; }\n.copy-stack .reserve { visibility:hidden; }\n.note { margin-top:14px; color:var(--muted); font-size:12px; }\n.metric-pair { display:grid; grid-template-columns:1fr 1fr; gap:16px; margin-top:18px; }\n.metric-pair > div { min-width:0; }\n.metric-pair span { display:block; font-size:12px; color:var(--muted); }\n.metric-pair strong { display:block; font-size:24px; font-weight:500; font-variant-numeric:tabular-nums; }\n.scale { display:flex; justify-content:space-between; color:var(--muted); font-size:12px; font-variant-numeric:tabular-nums; }\n@media(max-width:480px) { .metric-pair strong { font-size:21px; } }\n.presets { display:flex; }\n.plot { position:relative; margin-top:18px; height:190px; border-left:1px solid var(--rule); border-bottom:1px solid var(--muted); }\n.plot svg { width:100%; height:100%; overflow:hidden; }\n.plot .curve { fill:none; stroke:var(--accent); stroke-width:2.5; vector-effect:non-scaling-stroke; }\n.plot .curve.secondary { stroke:var(--second); stroke-dasharray:5 4; }\n.scale { position:relative; }.scale .middle { position:absolute; left:50%; transform:translateX(-50%); }\n.formula { font-size:14px; }.formula div+div { margin-top:6px; }\n@media(max-width:480px) { .plot { height:170px; } }\n.plot .curve { transition:d .28s cubic-bezier(.22,1,.36,1); }\n.band { display:flex; height:28px; border-radius:5px; overflow:hidden; background:var(--surface); margin-top:10px; }\n.band > div { background:var(--accent); transition:width .28s ease; }\n.band > .gold { background:var(--second); }\n.legend { display:flex; flex-wrap:wrap; gap:6px 18px; margin-top:10px; font-size:12px; color:var(--muted); }\n.legend .blue::before,.legend .gold::before { content:''; display:inline-block; width:9px; height:9px; border-radius:2px; margin-right:6px; background:var(--accent); }\n.legend .gold::before { background:var(--second); }\n.rows { margin-top:18px; display:grid; gap:12px; }\n.row { display:grid; grid-template-columns:32px 1fr 60px; align-items:center; gap:10px; font-size:13px; }\n.row > div { min-width:0; }.row output { text-align:right; font-variant-numeric:tabular-nums; }\n.track { height:14px; background:var(--surface); border-radius:3px; overflow:hidden; }\n.fill { height:100%; width:0; background:var(--accent); transition:width .28s ease; }\n.presets { flex-wrap:wrap; gap:4px; }.presets button { min-width:0; }\n.metric-pair strong { overflow-wrap:anywhere; }\n.presets button { flex:1 1 auto; min-width:min-content; }\n.presets { margin-top:10px; }.prior-line { display:flex; flex-wrap:wrap; gap:6px 16px; justify-content:space-between; margin-top:22px; font-size:13px; }.joint { margin-top:16px; }.joint-row { display:grid; grid-template-columns:1fr 1fr 1fr 1fr; text-align:center; border-bottom:1px solid var(--rule); padding:9px 0; font-size:13px; font-variant-numeric:tabular-nums; }.joint-row:first-child { color:var(--muted); }.branches { display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-top:18px; }.branch { border:1px solid var(--rule); border-radius:8px; padding:14px; min-width:0; transition:border-color .28s,background .28s; }.branch h3 { margin:0; font-size:15px; }.branch.increased { border-color:var(--second); background:var(--second-soft); }.posterior { display:flex; height:24px; margin-top:14px; border-radius:4px; overflow:hidden; }.posterior > div { background:var(--accent); transition:width .28s ease; }.posterior .second { background:var(--second); }.distribution { font-size:12px; color:var(--muted); margin:8px 0; }.branch > strong { font-size:20px; font-variant-numeric:tabular-nums; }.branch-change { margin:8px 0 0; font-size:12px; color:var(--second); }.branch-change span { visibility:hidden; }.increased .branch-change span { visibility:visible; }.contributions { display:flex; height:24px; background:var(--surface); border-radius:4px; overflow:hidden; margin-top:14px; }.contributions div { background:var(--accent); transition:width .28s ease; }#contribution1 { background:var(--second); }\n@media(max-width:480px) { .branch { padding:10px; }.branch > strong { font-size:18px; }.joint-row { font-size:12px; }.distribution { font-size:11px; }.formula { font-size:13px; } }\n","js":"const $=s=>document.querySelector(s),h=p=>viz.entropy([p,1-p]);let a=.1;\nfunction draw(){const q=+$('#noise').value/100,joint=[[(1-a)*(1-q),a*q],[(1-a)*q,a*(1-q)]],weights=joint.map(r=>r[0]+r[1]),posterior=joint.map((r,i)=>r[1]/weights[i]),entropies=posterior.map(h),terms=entropies.map((v,i)=>v*weights[i]),conditional=terms[0]+terms[1],prior=h(a),mi=Math.max(0,prior-conditional),hx=viz.entropy(weights);\n $('#noise-value').textContent=viz.number(q,2);$('#prior-distribution').textContent='P(Y) = ('+viz.number(1-a,1)+', '+viz.number(a,1)+')';$('#prior-entropy').textContent='H(Y) = '+viz.number(prior,3)+' bit';\n for(let i=0;i<2;i++){for(let y=0;y<2;y++)$('#cell'+i+y).textContent=viz.number(joint[i][y],3);$('#weight'+i).textContent=viz.number(weights[i],3);$(i?'#posterior10':'#posterior0').style.width=(1-posterior[i])*100+'%';$('#posterior'+i+'1').style.width=posterior[i]*100+'%';$('#distribution'+i).textContent='('+viz.number(1-posterior[i],3)+', '+viz.number(posterior[i],3)+')';$('#entropy'+i).textContent=viz.number(entropies[i],3)+' bit';$('#branch'+i).classList.toggle('increased',entropies[i]>prior+1e-10);$('#contribution'+i).style.width=terms[i]*100+'%';}\n $('#weighted-formula').textContent='≈ '+viz.number(weights[0],3)+' × '+viz.number(entropies[0],3)+' + '+viz.number(weights[1],3)+' × '+viz.number(entropies[1],3)+' ≈ '+viz.number(conditional,3)+' bit';$('#conditional').textContent=viz.number(conditional,3);$('#mutual').textContent=viz.number(mi,3);\n $('#mutual-formula').textContent='I(X;Y) = H(Y) − H(Y|X) ≈ '+viz.number(prior,3)+' − '+viz.number(conditional,3)+' = '+viz.number(mi,3)+' bit';$('#chain-formula').textContent='H(X,Y) = H(X) + H(Y|X) ≈ '+viz.number(hx,3)+' + '+viz.number(conditional,3)+' = '+viz.number(hx+conditional,3)+' bit';\n document.querySelectorAll('[data-prior]').forEach(e=>e.setAttribute('aria-pressed',String(+e.dataset.prior===a*100)));document.querySelectorAll('[data-noise]').forEach(e=>e.setAttribute('aria-pressed',String(+e.dataset.noise===+$('#noise').value)));}\n$('#noise').addEventListener('input',draw);document.querySelectorAll('[data-prior]').forEach(e=>e.addEventListener('click',()=>{a=+e.dataset.prior/100;draw();}));document.querySelectorAll('[data-noise]').forEach(e=>e.addEventListener('click',()=>{$('#noise').value=e.dataset.noise;draw();}));draw();\n","audio":false,"strings":{"balanced":"均匀先验","contributions":"固定 0–1 bit 标尺,两段宽度分别为 P(X=x)H(Y|X=x),总长为平均条件熵。","copy":"完全相同","eyebrow":"03 / 一条线索与所有线索","heading":"每个分支不一样,条件熵怎样平均?","independent":"互相独立","intro":"先看 Y 的先验,再把 X 的两个分支都保留下来。蓝/金表示 Y=0/1;下方贡献条另用蓝/金区分 X=0/1。","inverted":"完全相反","jointNote":"四格为联合概率,右列为行和。每行除以自己的行和,才得到下方的条件分布。","more":"比先验更不确定","noise":"独立翻转概率 q","note":"贡献条的每段是分支概率 × 分支熵,使用固定 0–1 bit 标尺。金色边框标出比先验更不确定的分支;互信息比较的是先验与全部分支的平均。","priorLabel":"Y 的先验分布","skewed":"偏斜先验"}}
条件熵:每条线索都要按出现概率算进去
表格每一行先除以自己的行和,得到 P(Y∣X=x)。这对应已经观察到某个具体线索。条件熵则要把所有分支的熵按线索出现概率加权:
H(Y∣X)=x∑P(X=x)H(Y∣X=x).
默认例子中,X=1 出现概率是 0.18,该分支的熵为 1 bit;X=0 出现概率为 0.82,该分支的熵约为 0.095 bit。加权后约为 0.258 bit,不能取两个分支的简单平均,更不能只看其中一个。
切换为均匀先验时,两行恰好对称,分支熵都为 h2(q)。这时只算一行会碰巧得到正确的平均值,但它是这个对称例子的特点,不是一般规则。
联合熵:先确定线索,再确定原值
把变量对 (X,Y) 当成一个结果,其熵为 H(X,Y)=−∑x,yp(x,y)log2p(x,y)。也可以分两步问清:先确定 X,再在对应分支内确定 Y,得到链式法则:
H(X,Y)=H(X)+H(Y∣X).
图中右侧行和组成 P(X),决定第一步的 H(X);两个条件分支的加权平均决定第二步的 H(Y∣X)。这就是下方联合熵公式两项的来历。
它也能从 p(x,y)=p(x)p(y∣x) 推出:取负对数把乘法变成加法,再按联合概率求平均。独立时 H(Y∣X)=H(Y),联合熵才等于两个边缘熵之和。
互信息:平均减少了多少不确定性
观察线索前,不确定性是 H(Y);观察后,平均剩下 H(Y∣X)。两者之差就是互信息:
I(X;Y)=H(Y)−H(Y∣X)=H(X)+H(Y)−H(X,Y).
默认例子中,先验熵约为 0.469 bit,平均条件熵约为 0.258 bit,所以互信息约为 0.211 bit。虽然某次观察会让不确定性升到 1 bit,对全部线索取平均后仍然减少了不确定性。
互信息对称、非负,为零当且仅当两个变量独立。这意味着 H(Y∣X)≤H(Y),但不要求每一个具体分支都满足同样的不等式。
把 q 调到 0.5,线索与原值独立,互信息为零;调到 0 或 1,线索都能完整确定原值,互信息等于 H(Y)。完全相反也可以完全提供信息;统计依赖不要求取值相同,也不自动意味着因果关系。
用一张图对照信息度量
对于这里的两个有限离散变量,可以用维恩图记住代数关系:两圆分别表示 H(X) 与 H(Y),重叠表示 I(X;Y),并集表示 H(X,Y)。图中面积只作示意,不对应上面某个噪声参数的数值。
从左圆可读出 H(X)=H(X∣Y)+I(X;Y);把三个互不重叠的区域相加,就得到联合熵。这张图把前面的关系放在一起,方便对照。
把这些量放回同一张表
| 量 | 对象 | 回答的问题 |
| I(x) | 一个已发生的结果 | 确认这件事带来多少信息? |
| H(X) | 一个变量的分布 | 平均有多少不确定性? |
| H(X,Y) | 两个变量的联合分布 | 一起确定它们有多少不确定性? |
| H(Y∣X) | 对线索加权的条件分布 | 知道 X 后,平均还剩多少? |
| I(X;Y) | 两个变量的依赖 | 知道 X 后,平均消除了多少? |
对于有限离散变量,还有两个有用的边界:
- H(X)≥0,仅在结果确定时取等号。
- 若取值集合大小为 m,则 H(X)≤log2m,仅在这 m 个取值均匀分布时取等号。
取值数量约束最大熵,概率分布决定实际熵。对于序列,还要考虑上下文依赖:单个字母的频率分布,与知道前文后的下一个字母分布,并不是同一个对象。不能把两者的差异全归结为“高频字母更多”。
基础主线到这里,进阶内容按需阅读
理解上表,已经足够进入下一篇。序列的链式法则与熵率在第三篇展开;连续变量的密度、微分熵与坐标尺度,在第四篇高斯信道处介绍。
如果想继续追问“条件为什么会改变依赖”“处理会丢掉哪些信息”,可以阅读选读:条件信息与数据处理。那里用条件分组和状态合并分别解释,不作为基础阅读的前置要求。
下一篇:预测分布不准确,会付出什么代价
这一篇始终使用给定分布本身计算信息量。下一篇把“数据实际来自的分布 p”与“我们拿来预测或编码的分布 q”分开,解释交叉熵与 KL 散度。
随后,系列依次讨论无损压缩、带噪信道、允许失真的压缩,最后回到语言模型。
参考