这篇回答节选自我在专栏《机器学习中的数学:概率统计》中的文章。在这篇文章中,我们通过全面细致的分析MCMC全过程的原理,帮助大家深入理解接受概率。
也欢迎关注我的知乎账号 @石溪 ,将持续发布机器学习数学基础及Python数据分析编程应用等方面的精彩内容。
这里我们要一举解决最核心的关键问题:对于任意给定的目标分布 ,我们如何找到以他为唯一平稳分布的马尔科夫链,并且基于马尔科夫链采样的方法,实现对其的近似采样。
找这么一个马尔科夫链,本质上就是要找到他的转移概率矩阵 ,那么首先先确立一个思考路径:有没有什么条件,使得只要我们的转移矩阵 满足了,就意味着目标分布 就是转移矩阵 对应的马尔科夫链的平稳分布呢?
还真有这么一个条件,这个条件就是马尔科夫链的细致平稳条件。
设有马尔科夫链 ,状态空间为 ,转移概率矩阵为 ,以及我们关注的状态分布 ,对于任意状态 ,任意时刻 都满足: ,则称状态分布 满足马尔科夫链的细致平衡条件,该状态分布 就是马尔科夫链 的平稳分布。
我们提前说一下,在这个过程中我们可以把马尔科夫链状态转移概率 按照需要简写成 或 ,表达的都是同一个意思。
看得出,细致平稳条件是一个充分条件,这个条件很强,只要满足了他,就相当于找到了我们要的马尔科夫链。我们来证明一下,很简单:
如果 ,
我们同时对两边的等式求和: ,显然也是成立的。
观察等式的右边, 的取值是独立于参数 的,可以提出来: ,同时依据马尔科夫状态转移矩阵的归一性,可知: ,因此归结起来就有:
到了这一步,其实已经证明结束了,不过可能还有同学没有明白,那我就最后画一张图来彻底点破:
从图中可以知道,对于每一个 的具体取值:
的计算过程实际上就是一次状态分布(行向量)与状态转移矩阵第 列(列向量)点乘的过程,得到的是一个数值,值恰好是状态分布(行向量)的第 个元素,那么如果让 取遍每一个索引值,那么最终得到的就是
, , ,...,
用一个式子综合起来就是:
这不正是平稳分布的定义式嘛,这正说明了,满足细致平稳条件的目标分布 就是以矩阵 为状态转移矩阵的马尔科夫链的平稳分布。
并且如果此时这个转移概率矩阵对应的马尔科夫链满足不可约、非周期和正常返,那么进一步说明该状态分布 是马尔科夫链的唯一平稳分布。当然如果找到了这个转移矩阵 ,一般而言都是满足这个条件的。
因此,一旦找到了状态转移矩阵,就确定了马尔科夫链。
可是问题来了,感觉还是很难找到这个矩阵啊,例如,我们随便找一个状态转移矩阵 ,一般是无法满足细致平稳条件的,即: ,注意这里我们把 写作 ,是一个意思,这是为了我们后面公式中的写法统一。
同时也把离散型和连续型的马尔科夫链都统一了起来。对于 ,离散型马尔科夫链时,我们称之为转移概率,连续型马尔科夫链我们称之为转移概率密度,或称转移核,本质上是一回事儿,可以类比pmf和pdf的区别和联系。
为了让这个等式能够相等,满足细致平稳条件,我们给他加点料,不是 不相等吗?下面我们让他两边相等,我们来介绍Metropolis-Hastings采样方法具体是怎么做的。
在这个采样方法中,针对每一个转移概率 ,我们再定义一个接受概率 ,使得每一个我们最终要构造的状态转移矩阵中的每一项 都是 和 相乘的结果:
即目标马尔科夫矩阵的状态转移矩阵中的每一项都满足:
在建议马尔科夫链中,从状态 转移到状态 的概率是 ,而在目标马尔科夫链中,从状态 到状态 的转移概率是 ,很显然, 表示一个接受概率,他满足 ,那么相比于建议马尔科夫链,在目标马尔科夫链中,从状态 到状态 的转移概率都减小了,但是同时我们知道,马尔科夫链的概率转移矩阵要满足 ,所有的 都减小了,那总有一个要增大?谁增大呢,显然是 增大了。
我们的目标也是借力打力,试想我们要找的目标是状态转移概率矩阵 ,他的唯一稳态是目标分布 ,我们参考上一节接受-拒绝采样方法的思想精髓:既然这个 矩阵难找,我们能不能也找一个所谓的“建议矩阵” ,这个 满足任意性,这样我们就能够利用一个明确的、便于随机游走的另一个马尔科夫链,基于转移概率的建议矩阵 中的每一个具体项 和接受概率 来共同决定最终从状态 到状态 的状态转移概率,以达到如下效果:
第一:最终的状态转移概率 就是我们目标马尔科夫链上状态 到状态 的状态转移概率?也就是说 ?
第二:通过上述方式得到的 满足细致平稳条件,使得目标分布 恰是矩阵 对应的唯一平稳分布?
换句话说,原本要找一个状态转移概率 ,满足细致平稳条件:
而现在则是在建议转移概率矩阵 可以任选的前提下,找到一个接受概率 ,替换掉 ,满足下面的等式成立:
对于任意给定的建议转移概率矩阵 ,这个接受概率 都一定存在吗?问题最终就卡在了这。然后幸运的是,这个答案是:一定存在。马尔科夫链蒙特卡洛方法中的Metropolis-Hastings采样中明确了接受概率 的表达式:
也就是说我们任选一个建议矩阵 ,那么由这个矩阵的每一项和对应的接受概率相乘:
,用这所有相乘得到的结果所对应构成的新矩阵,就是以目标分布 为唯一稳态分布的马尔科夫链的转移概率矩阵 。
这听起来有点神乎其神啊,是这么回事儿吗?我们怎么证明这一点?很简单,只要证明细致平稳条件 成立即可
那么在实际采样操作中,这个如何体现?
显然,分两种情况:
当 ,即 时,有: ,
当 ,即 时,有:
,
归结起来就是:
当 时,
当 时,
有了这个等式,我们再来推导 是否满足细致平稳条件:
到了这里,回顾一下我们的初心,我们的目标是证明细致平稳条件 ,而此时,我们已经推导出了:
那么接下来,我们只要说明:
,再化简一点,就是证明:
这个等式成立
我们把之前的等式关系摆在这里,方便我们推导:
当 时,
当 时,
由于 和 是任意的参数,把 写作 ,把 写作 就有:
当 时,
当 时,
对于 这个待证明的等式,我们还是分情况讨论:
当 时,我们则需要证明 ,此时对上了第一种情况,即 成立。
当 时,我们则需要证明 ,此时对上了第二种情况, 也是成立的。
那么,这就说明了任选一个建议马尔科夫链概率转移矩阵 ,配合接受概率 , 和目标分布 是满足细致平稳条件的。
那么接下来就是具体操作了,怎么理解,或者说怎么实现基于 矩阵的马尔科夫链随机游走同时再叠加一个接受概率 呢?
再说细致一点,我们就讨论从任意状态 向任意状态 进行状态转移的过程及状态转移概率,单纯基于 矩阵,状态 向每一个其他状态 的概率是 ,其中 ,如何叠加新的接受概率 ?
打个比方,比如有3个状态, , , , , , ,依照随机游走的过程,当以 的概率选择往状态$2$转移时,还要最后面临一道考验:在此基础上,此时以0.8的概率真正选择转移到状态2,以1-0.8=0.2的概率选择“半途而废”回到原状态1,这两个动作叠加起来,就是在我们 进行随机游走的过程。如图所示,我们在途中只看状态1到状态2和状态3转移的局部过程:
在目标马尔科夫链的转移概率矩阵 中:
同时验证: ,满足归一性。
那么在随机游走的过程中,怎么模拟这个接受-拒绝的过程呢?假设我们目前处于状态 ,那就当我们已经按照转移概率矩阵 ,依概率决定要转移到状态 时,增加最后一步:生成一个满足 之间均匀分布的随机数 ,如果 ,则决定随机游走的下一个状态是 ,否则下一个状态仍然是 。
还记得我们上一讲当中模拟概率的技巧吗?我们先生成一个 之间满足均匀分布的随机数 ,如果 ,则决定接受,否则就拒绝。
最后一个问题就是我们应该构建一个怎么样的建议转移概率矩阵 ?其实这个矩阵 选取的原则很简单:
第一是:必须要满足马尔科夫概率转移矩阵的归一性,即 。
第二是:获取 时刻的采样点 后,依概率选取 时刻的采样点 的过程简单易行,方便用计算机模拟。
下面我们来解决这个问题:或者说当前处在某个特定的采样点 ,我们如何决定下一个随机游走的采样点 ?我们可以看做,状态空间 中的采样值 和 分别对应了状态 和状态 ,那么从 时刻的采样点 转移到 时刻的采样点 的概率值就是存放在矩阵 位置上,以此类推构造出整个矩阵 。
其中一种比较好的定义方法是:
这是什么意思?他指的是从 时刻的某个指定采样点 转移到 时刻的指定采样点 的概率等于在均值为 ,方差为1的整体分布中取得 的概率值,感觉其实应该写成pdf的,因为正态分布是一个连续型的分布,但是这里因为是计算机采样,实际上我们已经把包括目标分布以及这里的正态分布都给离散化了,所以写成pmf更符合实际操作的需要。
那么这么构造的转移概率矩阵 行不行,好不好呢?
首先:行不行?
,也就是整个正态分布概率密度曲线上(这里严格说是离散化后的分布列)所有的取值点的概率求和,显然等于1,满足归一化的要求,因此可行性满足了。如下图所示:
这幅图就是离散化的以 为均值,1为方差的正态分布图,红色的竖线就是 的取值,而黑色的竖线就是示意的几个 的概率取值,我们将建议转移概率矩阵 的 ,也就是 定义为了这个离散化的以 为均值,1为方差的正态分布中 的取值概率,那么由于所有的 的取值概率之和为1,因此就有了: ,这样就彻底说明了上面的观点。
第二:好不好?
如果当前处于采样点 ,依概率 决定下一个采样点 ,难不难?太容易了,这不就是基于 的正态分布模型进行一次采样吗?这样采出的点就是依概率 的新采样点。利用程序在一个正态分布中采样,想想我们都做过多少遍了?
第三:意外之喜。
如下图所示,我们发现,依据正态分布曲线关于均值 对称,因此对于任意两个 和 ,均值为 ,方差为1的正态分布在 处的概率值和均值为 ,方差为1的正态分布在 处的概率值显然是相等的,即:
,即相当于 ,那么接受概率的表达式 就可以化简为 。
好的,最后我们来归纳一下马尔科夫链蒙特卡洛方法中metropolis-Hastings采样的步骤,并实际用python进行演示:
对于目标采样分布 :
第一步:随机选定一个起始点 ,指定燃烧期 和稳定期 。
第二步:开始采样,每一轮采样都以上一轮的采样值 为均值,方差为1,生成一个正态分布,然后在这个正态分布中依概率随机选取一个值 。
第三步:在 的均匀分布中随机生成一个数 ,并指定接收概率 ,如果 ,则本轮新的采样值为 ,否则本轮新的采样值仍为上一轮的 。
重复第二步~第三步采样过程 次,结束后,保留后 次采样结果作为目标分布的近似采样。
我们还是对之前使用过的目标分布: 进行采样,燃烧期采样个数设定为 ,最终实际保留的有效采样点的个数为 。
代码片段:
import random from scipy.stats import norm import matplotlib.pyplot as plt import numpy as np import seaborn seaborn.set() # 目标采样分布pi def pi(x): return (0.3 * np.exp(-(x - 0.3) ** 2) + 0.7 * np.exp(-(x - 2.) ** 2 / 0.3)) / 1.2113 m = 10000 # 燃烧期样本数 N = 100000 # 实际保留的有效样本数 sample = [0 for i in range(m + N)] # 采样数组 sample[0] = 2 # 任选一个起始点,选择默认的0也可以,效果一样 # 基于接受概率,在建议马尔科夫链上随机游走采样 for t in range(1, m + N): x = sample[t - 1] x_star = norm.rvs(loc=x, scale=1, size=1)[0] # 生成下一时刻随机游走的点x* alpha = min(1, (pi(x_star) / pi(x))) # 接受概率 u = random.uniform(0, 1) # 生成满足0~1之间均匀分布的随机数 if u < alpha: # 接受-拒绝的过程 sample[t] = x_star else: sample[t] = x x = np.arange(-2, 4, 0.01) plt.plot(x, pi(x), color='r') # 实际目标分布 plt.hist(sample[m:], bins=100, normed=True, color='b', edgecolor='k', alpha=0.6) # 实际分布的近似采样 plt.show()
运行结果:
当然还有《机器学习中的数学(全集)》系列专栏,欢迎大家阅读,配合食用,效果更佳~
有订阅的问题可咨询微信:zhangyumeng0422
天选系列从诞生至今,一直有着极高的讨论度和不错的销量。无论是二次元属性的天选姬,还是备受好评的「魔幻青」配色都是一道非常靓丽的风景线。
此外,天选系列的前2代总有着特殊的引发讨论技巧:
1代面世时除了其首发AMD的4000系CPU之外,那块45%NTSC色域的144Hz屏幕也成功打破了「高刷屏都是好屏幕」的定律,QLC表面固态硬盘也是2020年华硕非常独家的特色;
2代改进了屏幕刷新率,换上了TLC固态,但性能释放沦为了2021年游戏本基石单位,不支持独显直连更是进一步奠定了其稳定的地位。
这些并没有妨碍天选系列不错的销量,也好在产品经理没有躺在销量数据和拥趸的支持之上,在这次的3代做出了不小的进步。
独显直连有了,性能释放好了,机身还更轻薄了,青天就有了!(x
这次的首发供货非常少,京东渠道出货不到1万台。我是从咸鱼加价400入手的。(可能是经历了去年,居然感觉加价400完全可以接受…)
对这样高功耗的i7-12700H、RTX 3070,同时还能有90Wh的电池,机身做到了2.05kg,重量控制非常好。某种程度上完全可以起到部分全能本的职能。
最遗憾的是不支持PD充电。
故外带时要带上1斤4两的240瓦适配器,出行重量骤增。
室温保持在24.0°C~26.0°C之间(空调调温,没法做到恒温,望见谅)。
机器在控制台中有3个模式可以选「安静模式」、「性能模式」和「狂飙模式」,可用Fn+F5进行切换。
若无,测试均采用「增强模式」。
除了续航测试使用「集显输出」(iGPU)之外,其他测试均开启MUX的「独显直连」选项。
「独显直连」图形性能更好,「混合输出」续航更好。
所有跑分、帧数测试都会重复5次,每次跑完后静置5分钟再开始下一次,取最高分。
英特尔版天选3的3070显卡只有「日蚀灰」配色可选,无魔幻青。黑色有个小缺点,就是手上的油容易沾染,看上去比较明显。幸好比较好擦。
A面有LOGO「TX」代表天选(和企鹅没啥关系),位于上部。
B面为一块2160*1440分辨率、165Hz刷新率的屏幕。没有采用16:10的屏幕稍有可惜,下巴2指宽。
屏幕来自京东方。
作为一块广色域屏幕,色域容积142.7%sRGB、101.1%DCI P3;色域覆盖99.9%sRGB、98.9%DCI P3。
sRGB基准下,色准并不理想。有条件的话最好自行校色。
屏幕最高亮度为310尼特,边缘仅250尼特左右,在同定位&同价位游戏本里明显偏低。
键盘布局方面,风格延续上一代,WASD采用了反色设计。方向键半高。空格左半部分的突出被取消。数字小键盘相对完整,Delete和小键盘切换按键被做到了一起,对我来说需要适应。键盘手感回弹偏软。
最大可开合角度如图。
机器有运输模式,不插电无法直接开机。
之前已经测过了,而这也不会是最后一台,应该未来很长一段时间时间内很熟悉很主流的CPU。
除了开头2次之外,之后基本稳定在6620分左右,取后5轮中位数6622。
观察功耗可以发现,第一次较高,第二次逐步下降到100W,第三次出现波动,第四次开始比较平稳,打包功耗90W,IA大约83W,符合跑分曲线。
大小核频率如图。(蓝线大核频率,橙线小核频率)
功耗表现如图(蓝线打包功耗,橙线IA功耗)
大小核频率如图(蓝线大核,橙线小核)
RTX 3070是我心目中笔记本最值得选购的旗舰级显卡,处于一个性能与价格的甜区。
TimeSpy图形分 10261分
FSE图形分:13134
Superposition 1080P Extreme:6637
测了DOTA2、CSGO和《彩虹六号·围攻》3款网游在1440P和1080P下的表现。
DOTA2:全最高特效,比赛编号6040722034,完美世界视角。
CSGO:开多核渲染,其他全部最低,创意工坊BenchMark。
彩虹六号围攻:全最高档,性能测试。
可以看出网游部分的1080P和1440P分辨率下,帧数基本非常接近。可以任意按照自己喜好开高。
对比上面的网游,单机中,1440P和1080P分辨率下,帧数差距还是比较大的。帧数和清晰度不可得兼。
机器电池为90Wh。
把机器切换至核显输出,系统为「均衡模式」,中心亮度150尼特,开WIFI,关蓝牙,PC Mark 8的Conventional测试,办公场景下的中高负载,成绩比较接近实际使用。
实测续航为5小时15分,Conventional 3.0 Score为3572分。
室温在25°C附近。
使用AIDA64中的Stress FPU单烤CPU。
20分钟后,CPU功耗为90W,温度为87°C,大核3.6GHz,小核2.9GHz。
图上可以看出一个小插曲:单烤CPU期间,桌面突然变成一片白…我寻思又不是海涛,给我看一片纯白干甚…之后在任务管理器启动Explorer才恢复正常。
单烤期间功耗如图。
前期会冲到115W左右,前3分钟会保持在约100W(中间有过瞬间掉下去),之后稳定在90W。
使用Furmark 1.10.6(比较老的版本了,只不过我之前电脑都用这个烤的,所以暂时还没换新版本)。
关抗锯齿、1920*1080、勾选Burn-in和X Burn-in。
20分钟后,GPU温度75.8°C,功耗139.5W,频率1260MHz。
除了偶尔掉到过125W左右,其他时间基本全程在140W左右。
同时进行上面2项测试。数据取20-30分钟的平均值。
CPU功耗48W,温度为82°C,大核频率2.54GHz,小核频率2.29GHz。
GPU功耗115W,温度78.1°C,频率837MHz。
CPU功耗、GPU功耗与总功耗如图。
从110秒左右开始区域稳定,达到CPU 48W加上GPU 115W的功耗水平。
测试时电脑和分贝仪有固定位置,大概是在这个位置关系,比较接近人耳所听到的噪音,可能会比其他测试者的数据低一些。
烤机全程最高为52.3分贝,总体还算可以接受的水平。
此时键盘表面温度如图。
腕托为室温,WASD区域仅30°C附近比较低,键盘最热的区域在上部,键帽最高温在F8按钮名为48.4°C。中间有一个倒三角区域相对偏热,其他的地方温度都不算很高。
另外,这台机器用瓶盖垫高机身之后,双烤成绩上除了CPU和GPU的频率稍微提高,其他部分几乎完全一致,可能是原本已经有4个出风口充分散热的关系,底壳基本不出风。
拆机不难,机器底面除了右下角的螺丝之外的11颗螺丝全部拧下。
注意拆的时候右下角一颗螺丝是和后盖一体的,无法取下,但一定一定也要拧松。
先从这个螺丝周围开始撬开,右边撬开之后就比较方便可以拆下了。
机器为双风扇、五热管、四出风口的散热设计。贴纸下面有硬盘和内存。
我这台机器内存是三星的,跑分如图。读写都在56GB/s左右,延迟102.3ns偏高(DDR5目前的通病)
硬盘为美光的3400,大文件读写的跑分如图。
ASSSD的10GB读写跑分如图。
CrystalDiskMark的32GB读写跑分如图。
硬盘初始状态没有分盘,全部在一个C盘下,还剩余396GB(图为393是因为我装了测试软件)
一拿到手的时候,就能感觉到,机器总体的重量比以往任何一台15.6寸的3070游戏本都要明显轻,这种第一印象是很好的。
在这样的机身重量下,双烤成绩弱于部分更重、更大的游戏本,其实是完全可以接受的。
双烤47+115不算特别出色,但已经完全不拉跨了。相比于上一代天选2的3070,那这一代进步非常明显。
游戏的表现也都达到了主流水平。除了个别像2077这样优化不好的游戏,或者像《全战·三国》这样同屏单位多的游戏,其他大部分单机游戏都能1440p开预设的高档位拿到60帧以上,这个成绩是很令人满意的。
键盘的键帽温度热区在中间,基本避开了WASD部分,而且腕托很凉快。
同时,噪音比想象中要小很多,也不是特别吵的那种,使用体验是OK的。
当价格来到五位数的时候,我认为屏幕最高亮度至少也得有350尼特吧…310尼特真的有点拿不出手了,这点真的不得行啊。
机器的其他硬件已经都没啥问题了,硬盘、内存都没缩,网卡也是AX201,但就是这个屏幕给了个300尼特屏…淦…
同时,作为一块广色域屏幕,在色彩管理上基本没花心思和力气,非常放任。
这点其实是我感觉特别难受,要是这台机器支持PD,那我就不出二手留下自用了。
不满意的地方在于,明明ROG是支持PD的,而且之后会发售的天选Air也是支持PD的,天选3不支持PD完全是有意而为之的选择,真的感觉很不爽…
这样一来,机身轻的优势完全被不支持PD给削了一大部分。
我要是出趟门,你猜我更愿意带这三个充电器里左边这两个,还是右边这个?
尤其对我这种有紫米20充电宝的,我就更希望会支持PD了,这样找不到插头还能用充电宝应急。
不是很清楚为啥机器没有天选3经典的「魔幻青」配色。倒不是我多喜欢这个颜值,只是黑色真的容易看起来脏。
而且锐龙版3070也有,怎么这Intel版的3070就没这个颜色了…很奇怪。
这个没啥好说的,英特尔版京东放货7000台,锐龙版甚至不到5000台…目前需要加价购买。
总得来说,天选3是天选最均衡的一代,这次测试的3070版表现也远超个人的预期。
由于个人原因经常在多个城市之间来往,手头的17.3寸笔记本多有不便,今年也一直在考虑换一台笔记本。天选3差一点就成了我的落脚处,可惜最终由于屏幕不够亮、不支持PD两个主要原因,算是擦肩而过了…
总得来说,如果你对天选系列的外观垂涎已久,那天选3就是目前最值得购买的一代。
如果你需要当一个便携的全能本来用,那记得要把适配器重量也考虑在内。
如果上面提到的2个问题你不在意,又需要换一台12代的新3070游戏本,那目前天选3的3070版是值得考虑的。
至于上面提的2个主要缺点,大家多吐槽吐槽,按照天选以往每年的进步来看,说不定天选4就会更好。
这台机器,原价10299,我10700入手,按惯例一般是自刀300。
不过这台机器涨价买,而我无论如何都不太能接受自己的二手价高于首发价,会有点良心不安,因此折价500,按10200出。
等我视频做完就会放上海鲜二手平台,有兴趣的朋友可以去蹲一下。