理解感知器

Understanding Perceptrons

我刚开始学习机器学习 class,我们讨论了感知器。对于家庭作业,我们应该: "Choose appropriate training and test data sets of two dimensions (plane). Use 10 data points for training and 5 for testing. " 然后我们应该编写一个程序,该程序将使用感知器算法并输出:

我已经读了几遍我的书的第一章,但我仍然无法完全理解感知器。

我知道如果一个点被错误class化,你会改变权重直到 none 被错误class化,我想我无法理解的是

  1. 我将测试数据用于什么目的以及它与 训练数据?
  2. 我怎么知道一个点是否被误class化?
  3. 我该如何选择测试点、训练点、阈值或偏差?

如果我的书没有提供很好的例子,我真的很难知道如何组成其中之一。如您所知,我很迷茫,非常感谢任何帮助。

What do I use the test data for and how does that relate to the training data?

通常,要评估特定算法的性能,首先要对其进行训练,然后使用不同的数据来测试它在以前从未见过的数据上的性能。

How do I know if a point is misclassified?

你的训练数据有标签,这意味着对于训练集中的每个点,你知道它属于什么class。

How do I go about choosing test points, training points, threshold or a bias?

对于简单的问题,您通常会采用所有训练数据并将其分成 80/20 左右。您对 80% 进行训练并针对剩余的 20% 进行测试。

What do I use the test data for and how does that relate to the training data?

将感知器想象成年轻的 child。您想教 child 如何区分苹果和橙子。你给它看 5 个不同的苹果(都是 red/yellow)和 5 个橘子(不同形状),同时告诉它每次看到什么(“这是一个苹果。这是一个橘子”)。假设 child 有完美的记忆力,如果你给他足够多的例子,它会学会理解是什么让苹果成为苹果,让橙子成为橙子。他最终会开始使用 meta-features(比如shapes) 而无需你实际告诉他。这就是 Perceptron 所做的。在你向他展示所有示例之后,你从头开始,这称为新的 epoch.

当您想测试 child 的知识时会发生什么?你给它看一些新的东西。一个青苹果(不仅仅是 yellow/red),一个葡萄柚,也许还有一个西瓜。为什么不在训练期间向 child 显示与之前完全相同的数据?因为child的记忆力是完美的,它只会告诉你你告诉他的。除非你有不同的训练数据,否则你不会看到它从已知数据推广到未见数据有多好你在训练期间从未向他展示过。如果 child 在测试数据上表现糟糕,但在训练数据上表现 100%,你就会知道他 什么都没学到 - 它只是在重复他所拥有的在训练期间被告知 - 你训练他太久了,他只 记住了你的例子 而没有理解是什么让苹果成为苹果,因为你给了他太多细节 - 这叫做 过拟合。为了防止您的感知器仅(!)识别训练数据,您必须在合理的时间停止训练,并在训练集和测试集的大小之间找到一个良好的平衡。

How do I know if a point is misclassified?

如果它与应有的不同。假设一个苹果有 class 0,一个橙子有 1(在这里您应该开始阅读 Single/MultiLayer 感知器以及多个感知器的神经网络如何工作)。网络将接受您的输入。它的编码方式与此无关,假设输入是一个字符串 "apple"。那么你的训练集是{(apple1,0), (apple2,0), (apple3,0), (orange1,1), (orange2,1).....}。由于您事先知道 class,因此网络将为输入 "apple1" 输出 1 或 0。如果它输出 1,则执行 (targetValue-actualValue) = (1-0) = 1。在这种情况下,1 意味着网络给出了错误的输出。将此与 delta 规则进行比较,您会明白这个小方程式是较大更新方程式的一部分。如果您得到 1,您将执行权重更新。如果目标值和实际值相同,您将始终得到 0,并且您知道网络没有错误classify。

How do I go about choosing test points, training points, threshold or a bias?

实际上,偏差和阈值本身并不是 "chosen"。偏差像任何其他单元一样使用简单的 "trick" 进行训练,即使用偏差作为值为 1 的附加输入单元 - 这意味着实际偏差值编码在该附加单元的权重中,我们使用的算法将使确保它会自动为我们学习偏见。

根据您的激活函数,阈值是预先确定的。对于一个简单的感知器,class化将发生如下:

由于我们使用二进制输出(介于 0 和 1 之间),因此将阈值设置为 0.5 是一个好的开始,因为它恰好位于范围 [0,1] 的中间。

最后一个关于选择训练点和测试点的问题:这个比较难,靠经验。无论您身在何处,您都可以从实现简单的逻辑函数开始,例如 AND、OR、XOR 等。这是微不足道的。您将所有内容放入训练集中并使用与训练集相同的值进行测试(因为对于 x XOR y 等,只有 4 个可能的输入 00、10、01、11)。对于图像、音频等复杂数据,您必须尝试调整您的数据和功能,直到您觉得网络可以像您希望的那样好地处理它。