python 实现 AIGC 大语言模型中的概率论:生日相同问题的代码场景模拟

2023-12-04 13:14:34 浏览数 (1)

对深度学习本质而言,它实际上就是应用复杂的数学模型对输入数据进行建模,最后使用训练好的模型来预测或生成新的数据,因此深度学习的技术本质其实就是数学。随着大语言模型的发展,人工智能的数学本质被进一步封装,从业者要不直接调用给定模型处理给定数据,有点“技术内涵”的就是在给定模型基础上进行“微调”,我看现在很多 国内的AIGC 创业团队,几乎没有多少人有能力对开源的大模型进行修改或创造的能力。主要原因在于大模型的训练需要天量的数据和算力外,还在于其在数学理论基础上有很高的要求。我们很多人因此只能局限于AIGC 的“术”,也就是拿一个开源模型去适配特定的商业需求或场景,对于AIGC 的”道“而言,就只能讳莫如深,因为其要求的数学门槛太高。

从务虚的角度看, AIGC 内核中的数学思维极为精妙,我们若没有相应的能力去把握欣赏,那就相当于我们从未读过唐诗宋词,人生中失去了体会人类思维认知之美的机会。从务实的角度看,如果你只掌握”微调“能力,但没有能力在数学本质上看透大模型的算法本质,你很难利用大模型去适应或解决千变万化的商业场景和需求,因此只能生硬的”削足适履“,这也是我认为很多 AIGC 创业团队没有太多机会的原因。

当然要想磨练扎实的数学基础能力绝非易事。传统大学研究模式的数学学习方式太过于抽象和枯燥,我觉得数学学习就是被这种机械化,非人性化的学习方式搞坏。于是我就在想,我们能否通过工程化,代码化,具体化的方式来学习数学,于是就有了这里的尝试。我想实施能否通过代码的方式来探究掌握 AIGC 数学理论基础中的概率和数理统计部分,如果真有效果,后面我们也可以通过同样的方式来学习研究AIGC 的数学分析和高等代数部分,通过具体的实践方式来研究掌握抽象的思维理论。

我们首先着手的是概率论中经典的生日问题:一个房间中需要多少人才能使得其中某两个人出生在同一天的概率不少于 50%。处理数学问题的第一要点就是需要对问题进行没有歧义的,足够严谨和精准的描述,我们这里的描述其实就有很多模糊之处,因为它包含了很多没有说清楚的隐含假设。首先这个描述隐含的假设是房间内人与人之间的生日没有相互联系,但如果房间内的人都是双胞胎呢?双胞胎的生日显然不是互不关联的。因此我们对问题的描述就要增加一个前提,那就人与人的生日之间要相互独立,于是问题修改成:假设房间中每个人的生日都有可能在一年中的某一天,那么需要房间中有多少人,才能使得其中某两个人在同一天出生的概率不小于 50%。

修改后的问题描述足够清晰,足够严谨了吗?事实上问题的描述其实还隐含着一个假设,那就是房间中人与人之间没有特定联系。但如果某些原因让一些具有特定关系的人来到同一个屋子,并且这种特定关系影响到人生日的相互联系呢?杰拉德威尔在其著作《异类》中说过一个事情,加拿大青少年冰球联盟中每个级别选手按年龄分组,同年 1 月 1 日到 12 月 30 日出生的人都在同一组,这导致出生越靠近 1 月 1 日的选手竞争优势越大,因为他们年龄相对较大,身体的生长,营养的吸收,心理的稳定相对于靠近 12 月 30 日出生的选手更好,也就是”生理成熟度“更好,于是他们在训练中成绩更好,更容易放到”优秀组“里,于是更能得到优秀教练的指导,接收更有针对性的训练方案,于是他们成为职业选手的几率也就越大,于是如果进入屋子的是加拿大青年冰球职业球员,那么他们的生日就不再具有随机性。

由此我们还需要对问题的陈述做进一步改进:假设进入屋子的人,他们的生日日期相互独立,并且等可能的落入一年 365 天中的任何一天,那么我们需要屋子里有多少人,才能使得其中某两个人有相同生日的概率大于 50%.

在进行数学分析和推导前,我们先用代码模拟一下该问题,从感性上先对这个问题有初步认识:

代码语言:javascript复制
import random
#记录当前生日分布情况
birthday_map = {}
#试验次数
try_times = 10000
experiences_times = try_times
total_count = 0
people_count = 0
while try_times > 0:
  #随机从 365 中选择一个数值模拟人的生日
  birth_day = random.randrange(1,365)
  if birth_day in birthday_map:
    #有人生日发生重复
    total_count  = people_count
    birthday_map = {}
    try_times -= 1
    people_count = 0
  else:
    #当前没有人生日发生重复
    people_count  = 1
    birthday_map[birth_day] = 1

print(f"people count for share birth day: {total_count / experiences_times}")

上面代码使用随机数的方式来模拟人的生日,我们从[1,365]这个范围内随机抽取一个数作为人的生日,如果当前抽取的数值在前面出现过,那意味着两个人的生日出现了重复,我们把模拟试验设置成 10000 次,然后记录每次试验出现重复随机数时的计数,把 10000 次试验的计数加总再求平均就能模拟出一群人出现重复生日所需人数,上面代码运行后所得结果:

代码语言:javascript复制
people count for share birth day: 23.323

你可以尝试多次就可以发现,几乎每次试验结果都是 23 左右,这意味着问题的答案可能就是 23,后面我们通过严谨的数学推导看看为何 23 就是答案。更多内容请在 B 站搜索 coding 迪斯尼。

0 人点赞