💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较深入的研究。前言
ChatGPT的胜利,是概率论的胜利,也是贝叶斯定理的胜利 ! 一个拥有约250多年历史的定理在21世纪的今天再次被发扬光大!
托马斯·贝叶斯
(Thomas Baves,1701年一1761年),是18世纪的一位英国数学家、统计学家
他曾经是个牧师,不过他“生前籍籍无名,死后众人崇拜
”,在当代科技界“红”了起来,原因归结于以他命名的著名的贝叶斯定理。这个定理不仅在历史上促成了贝叶斯学派的发展,现在又被广泛应用于与人工智能密切相关的机器学习中
。
贝叶斯做了些什么?当年,他研究一个“白球黑球
”的概率问题。概率问题可以正向计算,也能反推回去。例如,盒子里有10个球,黑白两种颜色。如果我们知道10个球中5白5黑,那么,如果我问你,从中随机取出一个球,这个球是黑球的概率是多大?问题不难回答,当然是50%!如果10个球是6白4黑呢?取出一个球为黑的概率应该是40%。再考虑复杂一点的情形:如果10个球中2白8黑,现在随机取2个球,得到1黑1白的概率是多少呢?10个球取出2个的可能性总数为10*9=90种,1黑1白的情况有16种,所求概率为16/90,约等于17.5%。因此,只需进行一些简单的排列组合运算,我们可以在10个球的各种分布情形下,计算取出n个球,其中m个是黑球的概率。这些都是正向计算概率的例子。
不过,当年的贝叶斯更感兴趣的是反过来的“逆概率问题
”:假设我们预先并不知道盒子里黑球白球数目的比例,只知道总共是10个球,那么,比如说,我随机地拿出3个球,发现是2黑1白。逆概率问题则是要从这个试验样本(2黑1白),猜测盒子里白球黑球的比例。
也可以从最简单的抛硬币试验来说明“逆概率”问题。假设我们不知道硬币是不是两面公平的,也就是说,不了解这枚硬币的物理偏向性,这时候,得到正面的概率p不一定等于50%。那么,逆概率问题便是企图从某个(或数个)试验样本来猜测p的数值。
为了解决逆概率问题,贝叶斯在他的论文中提供了一种方法,即贝叶斯定理
:
贝叶斯定理
除了在概率论与统计学中绽放光彩,更是在机器学习
和人工智能
·等领域中具有重要的应用,被广泛用于推断和预测问题!
教机器学习,学些什么呢?实际上就是要学会如何处理数据
,这也是大人教孩子学会的东西:从感官得到的大量数据中挖掘出有用的信息来
。如果用数学的语言来叙述,就是从数据中建模,抽象出模型的参数
。
机器学习的任务,包括了“回归
”、“分类
”等主要功能。回归是统计中常用的方法,目的是求解模型的参数,以便“回归”事物的本来面目。分类也是机器学习中的重要内容。
机器学习中一般将学习种类分为有监督学习
和无监督学习
PS:贝叶斯分类算法是有监督学习算法中的典例!
朴素贝叶斯分类器
是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器。该分类器模型会给问题实例分配用特征值表示的类标签
,类标签取自有限集合。它不是训练这种分类器的单一算法,而是一系列基于相同原理的算法。
PS:所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关。
假设我们测试了1000个水果的数据,包括如下三种特征:形状(长?)、味道(甜?)、颜色(黄?)
,这些水果有三种:苹果、香蕉、或梨子。现在,使用一个朴素贝叶斯分类器,它将如何判定一个新给的水果的类别?比如说,这个水果三种特征全具备:长、甜、黄。那么,朴素贝叶斯分类器应该可以根据已知的训练数据给出这个新数据水果是每种水果的概率
。
下面跟着我的脚步,让我们在Python代码
中将它实现!
class NaiveBayesClassifier:
def __init__(self):
# 先验概率
self.prior = {'香蕉': 0.5, '苹果': 0.3, '梨子': 0.2}
# 条件概率
self.conditional_prob = {
'香蕉': {'长': 0.8, '甜': 0.7, '黄': 0.9},
'苹果': {'长': 0, '甜': 0.5, '黄': 1},
'梨子': {'长': 0.5, '甜': 0.75, '黄': 0.25}
}
def classify(self, features):
# 后验概率
posterior_prob = {}
# 计算每个水果类别的后验概率
for fruit in self.prior:
# 先验概率
prior_prob = self.prior[fruit]
# 条件概率初始化为1.0
conditional_prob = 1.0
# 计算条件概率的乘积
for feature in features:
conditional_prob *= self.conditional_prob[fruit][feature]
# 计算后验概率
posterior_prob[fruit] = prior_prob * conditional_prob
# 对后验概率进行归一化,使其总和为1
total_prob = sum(posterior_prob.values())
for fruit in posterior_prob:
posterior_prob[fruit] /= total_prob
return posterior_prob
# 使用示例:
classifier = NaiveBayesClassifier()
features = ['长', '甜', '黄']
result = classifier.classify(features)
print(result)
NaiveBayesClassifier
类的构造函数中,先验概率和条件概率被初始化为固定的值
。
特征列表
作为输入,并计算每个水果类别的后验概率
。
条件概率初始化为1.0
,并根据输入的特征列表乘以相应的条件概率。
归一化
,使所有后验概率的总和为1
。
PS:因此,当你给我一个又长、又甜、又黄的水果,此例中曾经被1000个水果训练过的贝叶斯分类器得出的结论是:这个新水果不可能是苹果(概率0%),有很小的概率(7%)是梨子,最大的可能性(93%)是香蕉。
在机器学习中,对于有监督学习可以将其分为两类模型: 判别式模型
和生成式模型
。
PS:简单地说,判别式模型是针对条件分布建模,而生成式模型则针对联合分布进行建模。
判别式模型
关注的是给定输入数据(特征),直接学习并建模输出标签(类别)与输入之间的条件概率分布。判别式模型主要关注于数据的边界和决策边界,以找到最佳的分类决策。常见的判别式模型包括逻辑回归
、支持向量机(SVM)
、决策树
和神经网络
等。判别式模型的优点是它们可以直接对输入—输出关系进行建模,适用于分类
、回归
和序列标注
等任务。
生成式模型
则从数据的生成过程的角度出发,通过学习数据的联合概率分布
来描述数据的整体分布情况。生成式模型不仅可以推断给定输入的条件下输出的概率,还可以通过边缘化来生成新的数据样本。生成式模型通常假设数据是由潜在的隐变量和参数共同生成的。常见的生成式模型有朴素贝叶斯
、高斯混合模型
和隐马尔可夫模型
等。生成式模型的优点是它们可以通过学习数据的生成过程来获取数据的整体分布信息
,能够进行概率推断、生成和样本采样等操作。
PS:假设我们要构建一个垃圾邮件分类器,将收到的电子邮件分为垃圾邮件和非垃圾邮件。我们可以使用两种不同的模型来解决这个问题。
判别式模型
:我们可以选择使用逻辑回归
作为判别式模型。我们提取电子邮件中的特征(例如词频
、词汇选择
等),然后训练逻辑回归模型来学习输入特征与输出标签(垃圾邮件或非垃圾邮件)之间的条件概率分布。在预测阶段,我们可以使用训练好的模型直接计算给定电子邮件是垃圾邮件或非垃圾邮件的概率,并根据阈值进行分类决策。
生成式模型
:作为生成式模型的一个例子,我们可以选择朴素贝叶斯分类器
。在这种情况下,我们需要计算垃圾邮件和非垃圾邮件的联合概率分布,以及每个类别的先验概率。我们可以通过学习训练集中的垃圾邮件和非垃圾邮件的特征频率来估计这些概率。在预测阶段,我们可以使用贝叶斯定理计算给定电子邮件属于每个类别的后验概率,并根据后验概率进行分类决策
。
语言模型训练
:贝叶斯原理可用于训练ChatGPT的语言模型。在预训练过程中,模型通过观察大量的文本数据来学习单词和句子之间的概率分布。通过计算条件概率,模型可以预测下一个可能的词或短语
。
文本生成
:贝叶斯原理可用于生成连贯的文本。ChatGPT可以基于已经生成的文本片段的条件概率来生成下一个合适的词或短语。通过考虑上下文和当前已生成的内容,模型可以利用贝叶斯原理来选择最有可能的下一个词。
语义理解和槽填充
:ChatGPT可以利用贝叶斯原理来进行语义理解和槽填充
的任务。通过观察输入句子中的词语和上下文之间的概率关系,模型可以理解用户意图并填充相关的槽位信息。
机器翻译
:贝叶斯原理在机器翻译中也有应用。ChatGPT可以通过贝叶斯原理来计算源语言和目标语言之间的翻译概率
,从而实现自动翻译功能。
实际上,语言模型的主要任务就是根据输入的文本预测下一个合适的词或短语
。模型会不断地根据已生成的文本片段计算条件概率,并选择最有可能的下一个词作为输出。然后,将输出的词添加到原始文本中,再将更新后的文本作为输入继续进行下一轮预测。这个过程不断循环,直到生成一个被认为是“合理的”
文本为止。
需要注意的是,ChatGPT的文字生成并非简单地进行词语的随机组合
,而是基于已经观察到的文本数据和训练得到的语言模型进行概率计算和选择
。这样的迭代循环过程使得生成的文本更加连贯和合理,与输入的文本上下文相符合。
PS:下面是一个简易的工作处理流程图,展示了ChatGPT的基本工作原理
#mermaid-svg-RxMO8DdRkpwVWT4G {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RxMO8DdRkpwVWT4G .error-icon{fill:#552222;}#mermaid-svg-RxMO8DdRkpwVWT4G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RxMO8DdRkpwVWT4G .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-RxMO8DdRkpwVWT4G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RxMO8DdRkpwVWT4G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RxMO8DdRkpwVWT4G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RxMO8DdRkpwVWT4G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RxMO8DdRkpwVWT4G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RxMO8DdRkpwVWT4G .marker.cross{stroke:#333333;}#mermaid-svg-RxMO8DdRkpwVWT4G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RxMO8DdRkpwVWT4G .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RxMO8DdRkpwVWT4G .cluster-label text{fill:#333;}#mermaid-svg-RxMO8DdRkpwVWT4G .cluster-label span{color:#333;}#mermaid-svg-RxMO8DdRkpwVWT4G .label text,#mermaid-svg-RxMO8DdRkpwVWT4G span{fill:#333;color:#333;}#mermaid-svg-RxMO8DdRkpwVWT4G .node rect,#mermaid-svg-RxMO8DdRkpwVWT4G .node circle,#mermaid-svg-RxMO8DdRkpwVWT4G .node ellipse,#mermaid-svg-RxMO8DdRkpwVWT4G .node polygon,#mermaid-svg-RxMO8DdRkpwVWT4G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RxMO8DdRkpwVWT4G .node .label{text-align:center;}#mermaid-svg-RxMO8DdRkpwVWT4G .node.clickable{cursor:pointer;}#mermaid-svg-RxMO8DdRkpwVWT4G .arrowheadPath{fill:#333333;}#mermaid-svg-RxMO8DdRkpwVWT4G .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RxMO8DdRkpwVWT4G .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RxMO8DdRkpwVWT4G .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-RxMO8DdRkpwVWT4G .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-RxMO8DdRkpwVWT4G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RxMO8DdRkpwVWT4G .cluster text{fill:#333;}#mermaid-svg-RxMO8DdRkpwVWT4G .cluster span{color:#333;}#mermaid-svg-RxMO8DdRkpwVWT4G div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RxMO8DdRkpwVWT4G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
用户
ChatGPT
处理输入文本
获取文本数据
训练语言模型
选择下一个词
输出词
添加词到生成文本
将生成文本作为输入
循环
生成合理文本
PS:贝叶斯原理在ChatGPT中的应用是基于概率模型的思想,ChatGPT并非直接使用贝叶斯公式进行计算,而是借鉴了贝叶斯原理的思想,并结合了神经网络和深度学习技术来实现语言模型的训练和文本生成。
本文花费大量时间介绍了贝叶斯算法原理以及它在ChatGPT中的应用
,希望能帮助到各位小伙伴,码文不易,还望各位大佬们多多支持哦,你们的支持是我最大的动力!