实现感知器分类器
Posted
技术标签:
【中文标题】实现感知器分类器【英文标题】:implementing a perceptron classifier 【发布时间】:2011-06-07 11:54:01 【问题描述】:您好,我对 Python 和 NLP 还是很陌生。我需要实现一个感知器分类器。我搜索了一些网站,但没有找到足够的信息。现在我有一些文件,我根据类别(体育、娱乐等)进行了分组。我还列出了这些文档中最常用的单词及其频率。在一个特定的网站上,有人说我必须有某种接受参数 x 和 w 的决策函数。 x 显然是某种向量(我不知道 w 是什么)。但我不知道如何使用我必须构建感知器算法的信息以及如何使用它对我的文档进行分类。你有什么想法吗?谢谢:)
【问题讨论】:
【参考方案1】:我认为,在您不熟悉任何一种神经网络的情况下尝试使用神经网络解决 NLP 问题可能有点过头了。用一种新的语言来做这件事是你最不必担心的。
我会将您链接到我的大学教授的神经计算模块slides。您将需要第 2 周的第 1 次会议和第 2 次会议的幻灯片。页面底部是如何在 C 中实现神经网络的链接。通过一些修改应该能够将其移植到 python。您应该注意,它详细说明了如何实现多层感知器。你只需要实现一个单层感知器,所以忽略任何关于隐藏层的内容。
x
和w
的简要说明。 x 和 w 都是向量。 x 是输入向量。 x
包含您关注的每个单词的标准化频率。 w
包含您关注的每个单词的权重。感知器通过将每个单词的输入频率乘以其各自的权重并将它们相加来工作。它将结果传递给一个函数(通常是一个 sigmoid 函数),该函数将结果转换为 0 到 1 之间的值。1 表示感知器是肯定的,输入是它所代表的类的实例,0 表示确定输入确实不是其类的示例。
使用 NLP,您通常会先了解词袋模型,然后再学习其他更复杂的模型。希望借助神经网络,它可以学习自己的模型。这样做的问题是神经网络不会让你对 NLP 有太多的了解,除了文档可以按它们包含的单词进行分类,而且通常文档中单词的数量和类型包含你的大部分信息需要对文档进行分类——上下文和语法不会增加太多额外的细节。
无论如何,我希望这为您的项目提供了一个更好的起点。如果您仍然卡在某个特定部分,请再次询问,我会尽力提供帮助。
【讨论】:
我通常不认为单个感知器分类器是“神经网络”,因为没有任何东西被联网。除非网络中有多个层,否则感知器只是一个线性分离器,就它可以学习的内容而言,它更接近于朴素贝叶斯、支持向量机和最大熵,而不是多层神经网络使用反向传播。【参考方案2】:感知器的样子
从外部看,感知器是一个函数,它接受n
参数(即n
维向量)并产生m
输出(即m
维向量)。
在内部,感知器由多层神经元组成,这样一层中的每个神经元都接收来自前一层所有神经元的输入,并使用该输入来计算单个输出。第一层由n
神经元组成,它接收输入。最后一层由m
神经元组成,并在感知器处理完输入后保存输出。
如何根据输入计算输出
从神经元 i
到神经元 j
的每个连接都有一个权重 w(i,j)
(稍后我会解释它们的来源)。第二层神经元p
的total input
是第一层神经元的加权输出之和。所以
total_input(p) = Σ(output(k) * w(k,p))
其中k
运行在第一层的所有神经元上。一个神经元的激活是通过应用一个激活函数从神经元的总输入中计算出来的。一个常用的激活函数是费米函数,所以
activation(p) = 1/(1-exp(-total_input(p))).
通过应用output function
,根据神经元的激活计算神经元的输出。一个经常使用的输出函数是身份f(x) = x
(确实有些作者将输出函数视为激活函数的一部分)。我只是假设
output(p) = activation(p)
当计算出第二层所有神经元的输出时,使用该输出计算第三层的输出。迭代直到到达输出层。
权重从何而来
首先,权重是随机选择的。然后选择一些示例(从中您知道所需的输出)。将每个示例输入感知器并计算 error,即实际输出与期望输出相差多远。使用该错误来更新权重。计算新权重的最快算法之一是Resilient Propagation。
如何构建感知器
您需要解决的一些问题是
-
文档的相关特征是什么?如何将它们编码为
n
-dimansional 向量?
应该选择哪些示例来调整权重?
应如何解释输出以对文档进行分类?示例:产生最可能类别的单个输出与为每个类别分配概率的向量。
需要多少个隐藏层,它们应该有多大?我建议从一个带有n
神经元的隐藏层开始。
第一点和第二点对分类器的质量非常关键。感知器可能对示例进行正确分类,但在新文档上失败。您可能需要进行实验。要确定分类器的质量,请选择两组示例;一个用于训练,一个用于验证。很遗憾,由于缺乏实践经验,我无法为您提供更详细的提示来回答这些问题。
【讨论】:
感谢您的回复,您的解释非常有用。为了让您更好地了解我的问题,我有一些我个人分组的文档(例如新闻、体育等)。对于所有类别,我都有一个最常用的单词列表(作为提供给感知器的功能)。作为指导,我得到了以下信息:初始化:w1 = 0 更新规则:对于每个数据点 x If class(x) != decision(X,W) then Wk+1 0 return +1 Else return -1 您似乎对实现单个感知器而不是多层感知器神经网络感兴趣。有关感知器如何工作以及如何训练的说明,请参阅此文档:cs.toronto.edu/~hinton/csc321/notes/lec2.pdf【参考方案3】:你应该看看 this survey paper Frabizio Sebastiani 的文本分类。它告诉您进行文本分类的所有最佳方法。
现在,我不打算打扰您阅读整篇文章,但在最后有一张表格,他比较了许多不同的人的技术在许多不同的测试语料库中的叠加情况。找到它,选择最好的(最好的感知器,如果你的任务是专门学习如何使用感知器来做到这一点),然后阅读他引用的详细描述该方法的论文。
您现在知道如何构建一个好的主题文本分类器了。
将 Oswald 提供给您的算法(以及您在 other question 中发布的算法)转换为代码是编程的小问题 (TM)。如果您在工作时遇到 TF-IDF 等不熟悉的术语,请让您的老师帮助您解释这些术语。
【讨论】:
【参考方案4】:前几天我尝试实现类似的东西。我编写了一些代码来识别看起来是英文的文本与非英文的文本。我已经很多年没有做过 AI 或统计了,所以这有点像霰弹枪的尝试。
我的代码在这里(不想让帖子臃肿):http://cnippit.com/content/perceptron-statistically-recognizing-english
输入:
我获取一个文本文件,将其拆分为 三元组(例如“abcdef”=> [“abc”, "bcd", "cde", "def"]) 我计算每个的相对频率,并将其作为输入提供给感知器(因此有 26^3 个输入)尽管我并不真正知道自己在做什么,但它似乎运作良好。不过,成功在很大程度上取决于训练数据。在我用更多的法语/西班牙语/德语文本等进行训练之前,我的结果很差。
不过,这是一个非常小的示例,在值上有很多“幸运猜测”(例如,初始权重、偏差、阈值等)。
多个类: 如果您有多个要区分的类(即,不像“是 A 或 NOT-A”那么简单),那么一种方法是为每个类使用感知器。例如。一种用于运动,一种用于新闻等。
根据分组为运动或非运动的数据训练运动感知器。新闻或非新闻等类似。
在对新数据进行分类时,您将输入传递给所有感知器,无论哪一个返回 true(或“触发”),这就是数据所属的类别。
我早在大学时就使用过这种方法,当时我们使用一组感知器来识别手写字符。它很简单而且工作得非常有效(如果我没记错的话,准确率 > 98%)。
【讨论】:
【参考方案5】:多层感知器(用于一般分类问题的特定 NeuralNet 架构。)现在可用于 GraphLab 人员的 Python:
https://dato.com/products/create/docs/generated/graphlab.deeplearning.MultiLayerPerceptrons.html#graphlab.deeplearning.MultiLayerPerceptrons
【讨论】:
以上是关于实现感知器分类器的主要内容,如果未能解决你的问题,请参考以下文章
机器学习--感知器数据分类算法步骤(慕课网-实现简单的神经网络)
一个简单的单层感知器实现,用于具有 sigmoid 激活函数的二进制分类