实现感知器分类器

9

你好,我对Python和自然语言处理都比较新。我需要实现一个感知器分类器。我在一些网站上搜索了一下,但没有找到足够的信息。目前,我有一些文件,按类别分组(体育、娱乐等)。我还有一个包含这些文档中最常用单词及其频率的列表。在一个特定的网站上,它指出我必须有某种接受参数x和w的决策函数。x显然是某种向量(我不知道w是什么)。但我不知道如何利用我拥有的信息来构建感知器算法,并如何使用它来对我的文档进行分类。你有任何想法吗?谢谢 :)

5个回答

16

感知器是怎样的

从外部看,感知器是一个函数,它接受 n 个参数(即一个 n 维向量),并产生 m 个输出(即一个 m 维向量)。

从内部看,感知器由多层 神经元 组成,每一层神经元都从前一层神经元接收输入,并使用该输入计算出一个单独的输出。第一层由 n 个神经元组成,其接收输入。最后一层由 m 个神经元组成,在处理完输入后保留输出。

输出如何从输入中计算出来

从神经元 i 到神经元 j 的每个连接都有一个权重 w(i,j)(我稍后会解释它们的来源)。第二层神经元 p总输入是所有来自第一层神经元加权输出的总和。因此,

total_input(p) = Σ(output(k) * w(k,p))

其中k遍历第一层的所有神经元。神经元的激活值通过应用一个激活函数从神经元的总输入中计算得出。常用的激活函数是费米函数,因此

activation(p) = 1/(1-exp(-total_input(p))).

神经元的输出是通过应用一个输出函数计算出来的。常用的输出函数是恒等函数f(x) = x(一些作者认为输出函数是激活函数的一部分)。在这里,我将假设

output(p) = activation(p)

在计算第二层所有神经元的输出后,使用该输出计算第三层的输出。迭代直到达到输出层。

权重从何而来

一开始,权重是随机选择的。然后选择一些示例(从中您知道所需的输出)。将每个示例馈送到感知器中,计算误差,即实际输出与期望输出相差多少。使用该误差来更新权重。最快的计算新权重的算法之一是弹性反向传播

如何构建感知器

您需要解决一些问题:

  1. 文档的相关特征是什么,如何将它们编码为一个n维向量?
  2. 应该选择哪些示例来调整权重?
  3. 如何解释输出以对文档进行分类?例如:产生最可能类的单个输出与为每个类分配概率的向量。
  4. 需要多少隐藏层以及它们应该有多大?我建议从一个具有n个神经元的隐藏层开始。

第一和第二点对分类器的质量非常关键。感知器可能会正确地对示例进行分类,但在新文档上失败。您可能需要进行实验。为了确定分类器的质量,请选择两组示例;一组用于训练,一组用于验证。不幸的是,由于缺乏实际经验,我无法给您更详细的回答这些问题的提示。


谢谢您的回复,您的解释非常有用。为了让您更好地了解我的问题,我有一些文件,我个人将它们分组(例如新闻、体育等)。对于所有类别,我都有一个最常用的单词列表(作为馈送感知器的特征)。作为指南,我得到了这些信息:初始化:w1 = 0 更新规则:对于每个数据点x如果class(x) != decision(X,W)那么Wk+1 <- Wk + YiXi, k <- k + 1 否则Wk+1 <- Wk 其中决策函数是:decision(x, w) 如果wx + b > 0,则返回+1否则返回-1 - rbc089
看起来你对实现单层感知器比多层感知器神经网络更感兴趣。请参考这份文档,了解感知器的工作原理和训练方法:http://www.cs.toronto.edu/~hinton/csc321/notes/lec2.pdf - Predictor

7

我认为如果你对自然语言处理和神经网络都不熟悉,尝试用神经网络解决NLP问题可能有些困难。使用新语言只是你的最小问题。

我会给你提供我所在大学教授的神经计算模块幻灯片链接。你需要下载第2周的第1和第2次课程幻灯片。页面底部有一个链接,可以了解如何在C语言中实现神经网络。稍加修改后,应该可以移植到Python。请注意,它详细介绍了如何实现多层感知器,而你只需要实现单层感知器,因此忽略任何关于隐藏层的内容。

一个关于 xw 的简要解释。x 和 w 都是向量。x 是输入向量。x 包含每个你所关心的单词的标准化频率。w 包含你所关心的每个单词的权重。感知器通过将每个单词的输入频率乘以其相应的权重并将它们加起来来工作。它将结果传递给一个函数(通常是一个 sigmoid 函数),将结果转换为介于 0 和 1 之间的值。1 表示感知器确信输入是它所代表的类别的实例,而 0 则表示它确信输入真的不是它所代表的类别的一个例子。
在自然语言处理中,你通常会先学习词袋模型,然后再转向其他更复杂的模型。对于神经网络,希望它能学习自己的模型。问题在于神经网络不会给你太多关于自然语言处理的理解,除了文档可以通过它们包含的单词进行分类,并且通常文档中单词的数量和类型包含了大部分你需要分类文档的信息——上下文和语法没有添加太多额外的细节。

无论如何,我希望这能为您的项目提供更好的起点。如果您仍然卡在某个特定部分,请再问一次,我会尽力帮助。


我通常不认为单个感知器分类器是一个“神经网络”,因为没有什么被联网。除非网络中有多个层,否则感知器只是线性分离器,在它可以学习的方面,它更接近于朴素贝叶斯、支持向量机和最大熵,而不是具有反向传播的多层神经网络。 - Ken Bloom

5
您应该查看Frabizio Sebastiani关于文本分类的这篇综述论文。它告诉您如何做文本分类的最佳方法。
现在,我不会让您阅读整篇论文,但是在最后有一张表格,他在其中比较了许多不同人的技术在许多不同测试语料库上的表现。找到它,选择最好的(如果您的任务是使用感知器学习如何做这件事,则选择最好的感知器),并阅读他引用的详细描述该方法的论文。
现在您知道如何构建一个良好的主题文本分类器了。
将Oswald给您的算法(您在其他问题中发布的)转化为代码只是一个小问题。如果您在工作时遇到像TF-IDF这样的陌生术语,请向您的老师寻求帮助,让他解释这些术语。

1

0

前几天我尝试着实现了类似的东西。我编写了一些代码来识别英文文本和非英文文本。我已经多年没有做过人工智能或统计了,所以这只是一个试手的尝试。

我的代码在这里(不想让帖子变得臃肿):http://cnippit.com/content/perceptron-statistically-recognizing-english

输入:

  • 我将一个文本文件拆分成三元组(例如“abcdef” => [“abc”,“bcd”,“cde”,“def”])
  • 我计算每个三元组的相对频率,并将其作为感知器的输入(因此有26^3个输入)

尽管我真的不知道自己在做什么,但它似乎工作得相当不错。成功很大程度上取决于训练数据。我之前的结果很差,直到我在更多的法语/西班牙语/德语文本上进行了训练。

这只是一个非常小的示例,其中有很多“幸运猜测”的值(例如初始权重,偏差,阈值等)。

多个类: 如果您有多个要区分的类(即不像“是A还是非A”那么简单),则一种方法是为每个类使用一个感知器。例如,一个用于体育,一个用于新闻等。

将体育感知器训练为以体育或非体育分组的数据。新闻或非新闻等类似。

在对新数据进行分类时,将输入传递给所有感知器,然后返回真(或“触发”)的感知器就是该数据所属的类别。

我曾经在大学时使用过这种方法,用一组感知器识别手写字符。它很简单,效果相当好(如果我没记错的话,准确率超过98%)。


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