引言: 我将新开一个系列的文章叫做《数学科普系列》,旨在回答“我们学了这么多数学课有什么用?”的问题。本篇将以我最擅长的概率论讲起,先分享我的学习经历,再探讨概率论在工作和生活中的应用。
说到概率论的严格化,就必须牵扯到测度论、西格玛代数等等的概念。这里先简单说说,测度就是长度和体积的一种推广。最近很火的王虹老师破解的“挂谷猜想”就是一个几何测度论的问题。
而概率恰恰就是测度的一种。从而,随机变量其实就是可测函数,概率论的问题也就变成了实变函数的问题。
那概率论是否就是实变函数呢?就好比有人问人工智能是不是就是数学呢,其实不是的。概率论里有很多有意思的东西,比如独立性。
怎么理解独立性?比如你参加一次论文答辩,一共有 8 个同学参加,如果前 6 位答辩的主席已经宣布通过,最后两位同学认为每位同学的答辩结果都是独立的,那其实就没有必要紧张。如果答辩结果有一定的不通过率,且并非独立事件,最后两位同学就要焦虑了。
那高等概率论玩儿的又是什么呢?比如条件概率、Borel-Cantelli 引理,和各种大数定律和中心极限定理,以及鞅和停时。我那时候在香港科技大学交换时,全程旁听了 Chen Kani 老师的《高等概率论》,教的就是这些内容。
现在我再回到我的高中时期。第一次接触概率论其实是我为数学社团的小伙伴们讲上海市应用数学竞赛的教材,讲的是伯努利概型和 binomial distribution(二项分布)。
后来因为搞数学竞赛的原因,买了一本单樽老师编写的小蓝书《概率与期望》。这本书太好看了,里面讲了很多概率论的动机:
如何用一根针和一张纸去模拟计算出圆周率的值(蒲丰投针问题和蒙特卡洛方法)。 为什么有理数在 [0,1] 上的测度为 0。 以及一些博弈论的问题。 后来我在高三时,又看了复旦大学李贤平老师的书。大学里韩东老师用的是北京大学何书元老师的教材。到香港科技大学以后,我又看了 Durrett 的书,这本书非常适合概率论专业的研究生阅读。
这就是我大概学习概率论的一个经历。我们暂时把话题先限定在概率论本身,假设数理统计和概率论是两件事。
2022 年的菲尔兹奖颁给了法国数学家雨果·度米尼尔-柯平 (Hugo Duminil-Copin),表彰其在统计物理学相变的概率理论中长期存在的问题的解法,特别是在三维和四维空间中。他与网红数学家许埈珥 (June Huh) 是同一年获得菲尔兹奖的。这无疑让概率论这个古老的方向又焕发了新生。
最近我高中同学的大学同学邓煜写了一篇关于希尔伯特第六个问题的文章,而这第六个问题的第一小问正是概率论的公理化。邓煜同学很有希望角逐 2026 年的菲尔兹奖。
从贝叶斯公式到大模型:概率思维的跨界实践 上面我们介绍了概率论的基础内容及一些背景知识,下面我将具体讲讲概率论的一些具体应用和我在实际工作中遇到的一个项目案例。
在机器学习中概率论被广泛应用。我在 Coursera 上过的唯二的机器学习课程,一门是吴恩达老师的《机器学习》,还有一门就是他同事的《概率图模型》。
我将在本部分具体讲解:
贝叶斯公式、贝叶斯学派和朴素贝叶斯算法。 我如何通过朴素贝叶斯算法 + Python 在一个月内完成了一个获得两个多月工资的 VOC 项目。 大模型的底层逻辑为什么也是概率论。 我们在工作中常说的“大概率”、“小概率事件”到底是什么。
这个公式的证明很简单,就是利用条件概率的定义 P(A|B)=P(A∩B)P(B) 即可推导。
频率学派 vs. 贝叶斯学派 频率学派: 频率学派相信概率是一个确定的值,讨论概率的分布没有意义。虽然没有上帝视角,还不知道具体的概率值,但相信概率就是确定的,它就在那里。而数据是由这个确定的概率产生的,因此数据是随机的。
贝叶斯学派: 贝叶斯认为待估计值的概率是随机的变量,而用来估计的数据反过来是确定的常数,讨论观测数据的概率分布才是没有意义的。
朴素贝叶斯算法的核心公式基于贝叶斯定理,用于计算样本属于某一类别的概率。其基本形式为: P(类别|特征)=P(特征|类别)⋅P(类别)P(特征)
在实际分类任务中,由于假设所有特征之间相互独立(即“朴素”假设),公式中的 P(特征|类别) 可简化为各特征条件概率的乘积,即: P(特征1|类别)×P(特征2|类别)×⋯×P(特征n|类别)
最终,算法通过比较不同类别下的计算结果,选择概率最大的类别作为预测结果。例如,在文本分类中,通过统计每个词在不同类别中的出现概率,结合类别的先验概率,计算出文本属于某类别的后验概率。由于实际计算时可能涉及极小数值,通常会取对数将连乘转换为累加,以避免数值下溢问题。
接下来我介绍一下我是如何通过朴素贝叶斯算法 + Python 在一个月内完成了一个获得两个多月工资的 VOC(Voice of Customer,客户之声)项目。
import jieba
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.naive_bayes import MultinomialNB
def seg_sentence(sentence, stopwords_path):
"""
对句子进行分词
"""
print("now token sentence...")
def stopwordslist(filepath):
"""
创建停用词list闭包
"""
# 注意:此处原文件为 'rb' 读取并 decode('utf-8'),实际运行时需注意路径和编码
stopwords = [line.decode('utf-8').strip() for line in open(filepath, 'rb').readlines()]
return stopwords
sentence_seged = jieba.cut(sentence.strip())
stopwords = stopwordslist('C:/Users/KL/Desktop/stopwords.txt') # 停用词路径
outstr = ''
for word in sentence_seged:
if word not in stopwords and word != '\t':
outstr += word
return outstr + " "
def tokenFile(file_path_Predict, write_path_Predict):
"""
对文本进行分词,结果存储在write_path
"""
with open(write_path_Predict, 'w', encoding='utf-8') as w:
with open(file_path_Predict, 'r', encoding='utf-8') as f:
for line in f.readlines():
line = line.strip()
# 假设文件格式为:标签\t文本内容
token_sen = seg_sentence(line.split('\t')[1], 'stopwords.txt')
w.write(line.split('\t')[0] + "\t" + token_sen + "\n")
def tokenFilePredict(file_path, write_path):
# 对待预测的文本文件进行分词
with open(write_path, 'w', encoding='utf-8') as w:
with open(file_path, 'r', encoding='utf-8') as f:
for line in f.readlines():
line = line.strip()
# 假设待预测文件格式为:文本内容
token_sen = seg_sentence(line.split('\t')[0], 'stopwords.txt')
w.write(token_sen + "\n")
def constructDataset(path):
"""
构建数据集: 返回标签列表和语料列表
"""
label_list = []
corpus_list = []
with open(path, 'r', encoding='utf-8') as p:
for line in p.readlines():
label_list.append(line.split('\t')[0])
corpus_list.append(line.split('\t')[1])
return label_list, corpus_list
def constructDatasetPredict(path):
# 构建待预测数据集
corpus_list = []
with open(path, 'r', encoding='utf-8') as p:
for line in p.readlines():
corpus_list.append(line.split('\t')[0])
return corpus_list
if __name__ == '__main__':
# 1. 文件路径配置
file_path = 'C:/Users/KL/Desktop/dataSet.txt'
write_path = 'C:/Users/KL/Desktop/dataSet_token.txt'
file_path_Predict = 'C:/Users/KL/Desktop/dataSetPredict.txt'
write_path_Predict = 'C:/Users/KL/Desktop/dataSet_tokenPredict.txt'
write_path_Result = 'C:/Users/KL/Desktop/dataSet_Result.txt'
# 2. 执行分词
tokenFile(file_path, write_path)
tokenFilePredict(file_path_Predict, write_path_Predict)
# 3. 构建数据集
label, data = constructDataset(write_path)
data1 = constructDatasetPredict(write_path_Predict)
# 4. 划分训练测试集
x_train, x_test, y_train, y_test = train_test_split(data, label,
test_size=0.25,
random_state=42)
# 5. 特征工程 (使用 TF-IDF 提取特征)
tfidf_vect = TfidfVectorizer(analyzer='word', max_features=5000)
tfidf_vect.fit(x_train)
xtrain_tfidf = tfidf_vect.transform(x_train)
xtest_tfidf = tfidf_vect.transform(x_test)
x_tfidf = tfidf_vect.transform(data1)
# 6. 模型训练与预测 (多项式朴素贝叶斯)
mnb_count = MultinomialNB()
mnb_count.fit(xtrain_tfidf, y_train)
print(mnb_count.score(xtest_tfidf, y_test)) # 打印模型在测试集上的准确率
y_predict = mnb_count.predict(x_tfidf) # 对新数据进行预测
# 7. 结果输出
with open(write_path_Result, 'w', encoding='utf-8') as w:
# 假设预测数据总数为 1500 条
for i in range(0, 1499):
w.write(y_predict[i] + "\n")
由于篇幅原因,本篇的内容就暂时先讲到这里。
我们回到大模型(如 GPT、BERT 等)。为什么说大模型的底层逻辑是概率论呢?
简单来说,大模型所做的一切,都是在计算“在给定前文的条件下,下一个词是什么的概率”。它是一个极致的条件概率问题,也是概率论在当代科技中最宏大的一次应用。
在这里,为大家推荐一篇对大模型底层逻辑至关重要的论文:
《Attention Is All You Need》 发表于 2017 年 6 月 12 日 作者:Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin
数学彩蛋:贝尔数的西格玛代数之谜
思考题: 在集合 {1,2,…,n}上,共可以定义多少个西格玛代数?(提示:与贝尔数 (Bell Numbers)有关)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。