生成算法和判别算法有什么区别?

657
生成模型判别模型有什么区别?

4
这篇文档(也被anguyen8提到过)是一份不错的资料:http://cs229.stanford.edu/notes/cs229-notes2.pdf - GuSuku
6
请参考stats.SE上有关“生成式 vs. 判别式”的同一问题:Generative vs. Discriminative - Lenar Hoyt
那个链接已经失效了,这是正确的版本:https://meta.stackoverflow.com/questions/291009/do-pure-machine-learning-questions-belong-to-stack-overflow/291015#291015 - tripleee
13个回答

917
假设您有输入数据x,并且您想将数据分类为标签y。生成模型学习联合概率分布p(x,y),而判别模型学习条件概率分布p(y|x) - 您应该将其读作"给定x的情况下y的概率"
这里有一个非常简单的例子。假设您有以下形式的数据(x,y)(1,0), (1,0), (2,0), (2, 1) p(x,y)
      y=0   y=1
     -----------
x=1 | 1/2   0
x=2 | 1/4   1/4

p(y|x)

      y=0   y=1
     -----------
x=1 | 1     0
x=2 | 1/2   1/2

如果你花几分钟时间盯着这两个矩阵看,你就会理解这两个概率分布之间的差异。
分布 p(y|x) 是将给定的示例 x 分类为类别 y 的自然分布,因此直接对其建模的算法称为判别式算法。生成式算法对 p(x,y) 进行建模,可以通过应用贝叶斯规则转换为 p(y|x) 并用于分类。但是,分布 p(x,y) 也可以用于其他目的。例如,您可以使用 p(x,y) 生成可能的 (x,y) 对。
从上面的描述中,你可能认为生成模型更加普遍有用,因此更好,但事实并不简单。这篇论文是关于判别式与生成式分类器的非常流行的参考资料,但它很难懂。总体意思是,在分类任务中,判别式模型通常优于生成式模型。

51
谢谢您提供这篇论文。作者现在是斯坦福大学的教授,其网站 http://www.stanford.edu/class/cs229/materials.html 提供了丰富的资源。 - unj2
29
这里也有Andrew Ng提供的一个很好的解释链接 - clyfe
44
当观察这些矩阵时,请注意第一个矩阵中的所有条目加起来等于1.0,而在第二个矩阵中,每一行加起来都等于一。这将加快理解(并减少混淆)。 - Maxim Khesin
6
这里还有一条Andrew Ng的笔记非常有用:http://cs229.stanford.edu/notes/cs229-notes2.pdf - anh_ng8
2
这就是为什么直接建模这个的算法被称为判别式算法,但我仍然不确定为什么 p(y|x) 意味着建模它的算法被称为“判别式模型”。 - nbro
显示剩余6条评论

311
一个生成算法模拟了数据的生成方式以对信号进行分类。它会问一个问题:基于我的生成假设,最有可能产生这个信号的是哪一类?
一个判别算法不关心数据是如何生成的,只是对给定的信号进行分类。

6
这个答案让我感到困惑。两种算法都属于监督学习算法的范畴,它们通过学习标注的训练数据来推导出一个函数模型,以预测其他数据。你所描述的判别式算法听起来好像不会创建一个模型,这是正确的吗?如果你能在这方面增强你的回答,我会很高兴的。 - Lenar Hoyt
47
生成算法模拟数据的"生成过程",因此您可以问它:"这个实例是由哪个类别生成的可能性更大?",并选择概率更高的一个。判别算法使用数据创建决策边界,因此您可以问它:"这个实例在决策边界的哪一侧?" 因此,它不会创建数据生成模型,而是创建了一个它认为类别之间分界线的模型。 - Anthony
1
那么像朴素贝叶斯这样的生成模型没有决策边界吗? - sheetal_158
4
生成模型似乎更适合解释性? - makansij

172

想象一下你的任务是将演讲分类为一个语言。

你可以通过以下两种方式来完成:

  1. 学习每种语言,然后使用你刚刚获得的知识来对其进行分类

或者

  1. 确定语言模型之间的差异,而不必学习这些语言,然后对演讲进行分类。

第一种方法是生成式方法,第二种方法是判别式方法。

请参阅此参考资料以获取更多详情:http://www.cedar.buffalo.edu/~srihari/CSE574/Discriminative-Generative.pdf


2
难道不应该反过来吗?考虑到你已经学会了这门语言,你正在操作一个条件分布,因此应该采用判别式方法? - London guy
在阅读下面的答案后,我认为这也是相反的方式 - 来自Ghrua的CS299讲义示例 - Mitali Cyrus

144
实际应用中,这些模型的使用方法如下。
判别式模型中,为了从训练样本x预测标签y,您需要评估:

enter image description here

这仅仅是选择最可能的类y,考虑x。就像我们试图建立类之间的决策边界一样。这种行为在神经网络中非常明显,其中计算出的权重可以看作是在空间中隔离类元素的复杂曲线。

现在,使用贝叶斯规则,让我们用enter image description here来替换等式中的enter image description here。由于您只对arg max感兴趣,因此可以消除分母,这对于每个y都是相同的。因此,您只剩下:

enter image description here

这是您在生成模型中使用的方程式。 在第一种情况下,您有条件概率分布p(y|x),它建模了类之间的边界,在第二种情况下,您有联合概率分布p(x,y),因为p(x|y)p(y)=p(x,y),这明确地建模了每个类的实际分布。通过联合概率分布函数,给定一个y,您可以计算(“生成”)其相应的x。因此,它们被称为“生成”模型。请注意保留html标签。

3
按照这种推理,当应用于相同的分布时,生成模型和判别模型不是相等的吗?那么分类行为上为什么会存在差异呢?或者说只有在最大似然情境下它们才相等吗? - Sebastian Graf
1
为了确定它们是否“相等”,我们需要首先定义我们所指的内容。它们有许多共同点,但最强烈的区别在于所采用的策略:建模分布(生成式)与预测类别,而不考虑分布(判别式)——想一想KNN作为一个例子。 - Saul Berardo
如果我们有p(x, y),如何计算p(x|y) p(y)?我的意思是,我们可以从条件概率中推导出它,但我们仍不知道p(x|y)p(y)。其他人将生成模型定义为估计分布p(x|y),那么什么是正确的? - ado sar

105
以下是与主题相关的CS299(由Andrew Ng)讲义笔记中最重要的部分,这真正帮助我理解判别式生成式学习算法之间的区别。
假设我们有两类动物:大象(y = 1)和狗(y = 0)。x是动物的特征向量。
给定一个训练集,像逻辑回归或感知器算法这样的算法会试图找到一条直线——即决策边界——来分隔大象和狗。然后,为了将新动物分类为大象或狗,它检查它在决策边界的哪一侧,并根据此进行预测。我们称这些算法为判别式学习算法
这里有一种不同的方法。首先,我们可以通过观察大象来建立大象的模型。然后,我们可以通过观察狗来建立一个独立的狗的模型。最后,为了对新动物进行分类,我们可以将新动物与大象模型进行匹配,并将其与狗模型进行匹配,以查看新动物更像我们在训练集中看到的大象还是更像狗。我们称这些为“生成式学习算法”。

54

34

通常,在机器学习社区中有一个惯例,即不要学习您不想要的内容。例如,考虑一个分类问题,其中目标是将y标签分配给给定的x输入。如果我们使用生成模型

p(x,y)=p(y|x).p(x)

我们需要建模p(x),但它与手头的任务无关。实际限制,如数据稀疏性,将迫使我们使用一些弱独立假设来建模p(x)。因此,我们直觉地使用判别模型进行分类。


26

简短回答

这里的许多答案依赖于广泛使用的数学定义[1]:

  • 判别模型直接学习条件预测分布 p(y|x)
  • 生成模型学习联合分布 p(x,y) (或者更确切地说,p(x|y)p(y))。
    • 可以通过贝叶斯定理获得预测分布 p(y|x)

虽然非常有用,但这个狭窄的定义假设了监督设置,并且在检查无监督或半监督方法时不太方便。它也不适用于许多当代深度生成建模方法。例如,现在我们有隐式生成模型,例如生成对抗网络 (GANs),它们是基于采样的,甚至不明确地模拟概率密度 p(x) (而是通过鉴别器网络学习分歧度量)。但我们称它们为“生成模型”,因为它们用于生成(高维[10])样本。

一个更广泛和更基本的定义[2]似乎同样适用于这个一般性问题:

  • 判别模型学习类别之间的边界。
    • 因此它们可以在不同类型的数据实例之间进行区分
  • 生成模型学习数据分布。
    • 因此它们可以生成新的数据实例。

来自http://primo.ai/index.php?title=Discriminative_vs._Generative 图片来源


深入了解

即便如此,这个问题有点含糊不清 [3]。生成-判别“二分法”实际上是一个可以在其中平滑地插值的光谱 [4]。

因此,这种区分变得武断和令人困惑,特别是当许多流行的模型不完全属于其中之一 [5,6],或者实际上是混合模型(经典的“判别式”和“生成式”模型的组合)时。

尽管如此,这仍然是一种非常有用和常见的区分方式。我们可以列举一些明确的生成式和判别式模型,包括经典和最新的:

  • 生成式:朴素贝叶斯、潜在狄利克雷分配(LDA)、生成对抗网络(GAN)、变分自编码器(VAE)、归一化流。
  • 判别式:支持向量机(SVM)、逻辑回归、大多数深度神经网络。

还有很多有趣的工作深入研究了生成-判别的分界线 [7] 和光谱 [4,8],甚至将判别式模型转化为生成式模型 [9]。

最终,定义在这个快速发展的领域中不断演变 :) 最好带着一点儿保留地看待它们,甚至为自己和他人重新定义它们。


来源

  1. 可能来源于“机器学习-判别式和生成式”(Tony Jebara,2004)。
  2. Google的机器学习速成课程
  3. 生成式和判别式谬论
  4. “生成模型和判别模型的原则性混合”(Lasserre等,2006)
  5. @shimao的问题
  6. Binu Jasim的答案
  7. 比较逻辑回归和朴素贝叶斯:
  8. https://www.microsoft.com/en-us/research/wp-content/uploads/2016/04/DengJaitly2015-ch1-2.pdf
  9. “你的分类器实际上是一个基于能量的模型”(Grathwohl等,2019)
  10. 斯坦福CS236笔记:技术上,概率判别式模型也是数据条件下标签的生成模型。然而,生成模型这个术语通常是用于高维数据的。

2
这篇文章真的应该有更多的赞。你的回答是我找到的唯一涉及“虚假二分法”思想的答案。我的问题类似于这个:https://stats.stackexchange.com/questions/408421/is-the-only-difference-between-conditional-generative-models-and-discriminative - Antonio Luis Sombra

23

一个补充性的信息,与StompChicken以上的回答相呼应。

判别模型生成模型之间的基本区别是:

判别模型学习类别之间的(硬或软)边界

生成模型对个体类别的分布进行建模

编辑:

生成模型可以生成数据。它对特征和类别(即完整数据)进行建模。

如果我们对P(x,y)进行建模:我可以使用这个概率分布来生成数据点 - 因此所有建模P(x,y)的算法都是生成模型。

例如,生成模型的例子包括:

  • 朴素贝叶斯模型P(c)P(d|c) - 其中c是类别,d是特征向量。

    同时,P(c,d) = P(c) * P(d|c)

    因此,朴素贝叶斯以某种形式对P(c,d)进行建模。

  • 贝叶斯网络

  • 马尔科夫网络

判别模型只能用于区分/分类数据点

在这种情况下,只需要对P(y|x)进行建模(即给定特征向量的类别概率)。

例如,判别模型的例子包括:

  • 逻辑回归

  • 神经网络

  • 条件随机场

总的来说,生成模型需要建模的内容比判别模型多得多,因此有时并不那么有效。事实上,大多数(不确定是否全部)无监督学习算法(如聚类等)都可以称为生成模型,因为它们建模的是 P(d)(而没有类:P)

注:部分答案摘自来源


1
所有之前的答案都很好,我想再补充一点。 从生成算法模型中,我们可以得出任何分布;而从判别式算法模型中,我们只能获得条件分布P(Y|X)(或者说它们只对区分Y的标签有用),这就是为什么它被称为判别模型。 判别模型并不假定在给定Y的情况下X独立($X_i \perp X_{-i} | Y$), 因此通常更适用于计算该条件分布。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接