实现感知器分类器
你好,我对Python和自然语言处理(NLP)还很陌生。我需要实现一个感知器分类器。我在一些网站上搜索过,但没有找到足够的信息。目前我有一些文档,这些文档按照类别(比如体育、娱乐等)进行了分组。我还有一份这些文档中最常用的词汇及其出现频率的列表。在某个网站上提到,我需要有一个决策函数,接受参数x和w。x显然是一种向量(我不知道w是什么)。但是我不知道如何利用我现有的信息来构建感知器算法,也不知道如何用它来对我的文档进行分类。你有什么想法吗?谢谢 :)
5 个回答
你可以看看 这篇关于文本分类的调查论文,作者是Frabizio Sebastiani。里面讲了很多关于文本分类的最佳方法。
我不会让你去读整篇论文,但在快要结束的地方有一张表,比较了很多不同人的技术在各种测试数据集上的表现。找到那张表,挑选出表现最好的方法(如果你的作业是专门学习感知器方法,就选最好的感知器方法),然后去阅读他引用的详细描述那种方法的论文。
现在你已经知道怎么构建一个好的主题文本分类器了。
把Oswald给你的算法(你在另一个问题中发过)写成代码其实很简单。如果在工作过程中遇到像TF-IDF这样的陌生术语,可以请老师帮你解释一下这些术语。
我觉得,如果你对自然语言处理(NLP)和神经网络都不太熟悉,试图用神经网络来解决NLP问题可能有点难度。而且,你用的新语言其实不是最重要的事情。
我会给你分享我在大学上课时用的神经计算模块的幻灯片。你可以查看第二周的第一节和第二节的幻灯片。在页面底部有一个链接,教你如何在C语言中实现神经网络。稍微修改一下,你就可以把它移植到Python中。需要注意的是,这里讲的是如何实现一个多层感知器,而你只需要实现一个单层感知器,所以可以忽略任何关于隐藏层的内容。
简单解释一下x
和w
。这两个都是向量。x
是输入向量,里面包含了你关注的每个单词的标准化频率。w
是每个单词的权重。感知器的工作原理是将每个单词的输入频率乘以它对应的权重,然后把这些结果加起来。接着,它会把这个结果传递给一个函数(通常是一个sigmoid函数),把结果转换成0到1之间的值。1表示感知器认为输入属于它所代表的类别,0则表示它确定输入不属于这个类别。
在学习NLP时,通常会先了解“词袋模型”,然后再学习其他更复杂的模型。使用神经网络时,希望它能自己学习模型。问题在于,神经网络并不能让你深入理解NLP,除了知道文档可以根据包含的单词进行分类外,通常文档中的单词数量和类型就包含了大部分分类所需的信息,语境和语法并不会提供太多额外的细节。
总之,希望这些信息能给你提供一个更好的起点来开始你的项目。如果你在某个具体部分仍然感到困惑,可以再问我,我会尽力帮助你。
感知器的外观
从外表上看,感知器就像一个函数,它可以接收 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)
当第二层所有神经元的输出计算完成后,就用这个输出去计算第三层的输出。一直这样迭代,直到到达输出层。
权重是从哪里来的
最开始,权重是随机选择的。然后你需要选择一些示例(你知道它们的期望输出)。把每个示例输入到感知器中,计算 误差,也就是实际输出与期望输出之间的差距。利用这个误差来更新权重。计算新权重的最快算法之一是 弹性传播算法。
如何构建感知器
你需要考虑的一些问题包括:
- 文档的相关特征是什么,如何将它们编码成一个
n
维向量? - 应该选择哪些示例来调整权重?
- 如何解释输出以对文档进行分类?例如:是选择一个输出表示最可能的类别,还是一个向量为每个类别分配概率。
- 需要多少个隐藏层,大小应该是多少?我建议从一个有
n
个神经元的隐藏层开始。
前两个问题对分类器的质量非常关键。感知器可能会正确分类示例,但在新文档上可能会失败。你可能需要进行一些实验。为了评估分类器的质量,选择两组示例;一组用于训练,另一组用于验证。不幸的是,由于缺乏实践经验,我无法给出更详细的建议来回答这些问题。