我是一名计算机科学专业的学生,对于今年的项目,我需要创建遗传算法并将其应用于某些东西。我认为神经网络应用它是一件好事,但我无法理解它们。我完全理解这些概念,但没有一个网站真正解释了以下阻碍我理解的内容:
如何决定有多少节点。节点实际代表什么和做什么。权重和偏差实际上在分类中起什么作用。
有人可以为我解释一下吗?
此外,如果您对我可以应用 GA 的内容有任何类似的想法,我将不胜感激。
非常感谢!:)
我是一名计算机科学专业的学生,对于今年的项目,我需要创建遗传算法并将其应用于某些东西。我认为神经网络应用它是一件好事,但我无法理解它们。我完全理解这些概念,但没有一个网站真正解释了以下阻碍我理解的内容:
如何决定有多少节点。节点实际代表什么和做什么。权重和偏差实际上在分类中起什么作用。
有人可以为我解释一下吗?
此外,如果您对我可以应用 GA 的内容有任何类似的想法,我将不胜感激。
非常感谢!:)
您可能会发现这个关于增强拓扑的神经进化 (NEAT) 的维基百科页面很有趣。NEAT 是应用遗传算法创建神经网络拓扑的一个例子。
解释人工神经网络 (ANN) 的最佳方式是提供它试图模拟的生物过程——神经网络。一个最好的例子是人脑。那么大脑是如何工作的(对于 CS 来说高度简化了)?
大脑的功能单元(为了我们的目的)是神经元。它是潜在的蓄能器和“分散器”。这意味着在达到一定量的电势(想想用空气填充气球)之后,它会“发射”(气球爆裂)。它会向它拥有的任何连接发送电信号。
神经元是如何连接的?突触。这些突触可以具有不同的权重(在现实生活中,由于来自较厚/较薄连接的更强/更弱的突触)。这些权重允许一定数量的发射信号通过。
因此,您拥有大量由突触连接的神经元——您的 ANN 的基本表示。请注意,其他人描述的输入/输出结构是应用人工神经网络的问题类型的产物。理论上,任何神经元也可以接受输入。然而,它在计算任务中几乎没有用处。
现在谈谈ANN。
神经元:人工神经网络中的神经元与其生物学对应物非常相似。它们被建模为函数(在某个组合输入信号之后发出“1”信号,或在所有其他时间发出“0”信号),或者产生连续输出的step
稍微复杂的触发序列(arctan
,等),尽管缩放相似sigmoid
一步。这更接近生物现实。
突触:这些在人工神经网络中非常简单——只是描述神经元之间连接的权重。仅用于对连接到当前神经元的神经元进行加权,但仍起着至关重要的作用:突触是网络输出的原因。需要澄清的是,具有集合结构和神经元激活功能的 ANN 的训练只是对突触权重的修改。这就对了。从“哑”网到产生准确结果的网没有其他变化。
结构:神经网络没有“正确”的结构。这些结构要么是 a) 手动选择的,要么是 b) 允许作为学习算法的结果而增长(如 Cascade-Correlation Networks)。
假设是精心挑选的结构,实际上是通过仔细分析问题和预期的解决方案来选择的。“隐藏”神经元/层太少,并且您的结构不够复杂,无法逼近复杂的函数。太多了,你的训练时间会很快变得笨拙。出于这个原因,输入(“特征”)的选择和神经网络的结构是 IMO 问题的 99%。相比之下,人工神经网络的训练和使用是微不足道的。
现在解决您的 GA 问题,这是通过修改突触权重来训练网络的众多努力之一。为什么?因为最终,神经网络的输出只是一个 N 维的极高阶曲面。任何表面优化技术都可以用来求解权重,遗传算法就是这样一种技术。简单的反向传播方法类似于基于降维梯度的优化技术。
你的问题很复杂,我不认为一个小的答案会让你完全满意。还是让我试试吧。
首先,你的神经网络必须至少有三层(假设是一个简单的前馈层)。第一个是输入层,每个输入会有一个神经元。第三层是输出层,每个输出值将有一个神经元(如果您正在分类,可能会有多个 f 您想为每个神经元分配“属于”含义)。剩下的层是隐藏的一个,它将位于输入和输出之间。确定其大小是一项复杂的任务,您可以在以下参考资料中看到:
尽管如此,最好的方法是让您更清楚地说明您的问题(尽可能地工业保密),并让我们更多地考虑您的背景。
...我理解这一点的主要障碍是理解隐藏层的实际工作原理;我不太了解神经元的功能以及权重的用途...
中间层的每个节点都是一个“特征检测器”——它会(希望)“点亮”(即,被强烈激活)以响应输入中的一些重要特征。权重是强调前一层的一个方面;也就是说,神经元的输入权重集合对应于前一层中的哪些节点对该特征很重要。
如果连接myInputNode
到的权重myMiddleLayerNode
为 0,那么您可以看出这对于检测myInputNode
到的任何特征都不重要myMiddleLayerNode
。但是,如果连接myInputNode
到的权重myMiddleLayerNode
非常大(正或负),您知道这myInputNode
非常重要(如果非常负,则意味着“不,几乎可以肯定此特征不存在”,而如果非常正则意味着“是的,这个功能几乎肯定存在”)。
所以一个推论是你希望你的中间层节点的数量与需要多少特征来分类输入有对应关系:中间层节点太少,在训练过程中很难收敛(因为每个中间层节点将不得不在其特征检测上“加倍”),而太多的中间层节点可能会过度拟合您的数据。
所以......遗传算法的一个可能用途是设计您的网络架构!即使用一个GA来设置中间层节点的数量和初始权重。人口的一些实例将更快地收敛并且更健壮——这些可以为后代选择。(就个人而言,我从来没有觉得这是对 GA 的一种很好的使用,因为我认为通过反复试验进入一个体面的 NN 架构通常会更快,但是以这种方式使用 GA 并不少见。)
输入和输出节点的数量取决于您拥有的输入和输出的数量。中间节点的数量由您决定。没有“正确”的数字。
想象一个简单的网络:输入(年龄、性别、国家、已婚)输出(今年的死亡几率)。您的网络可能有两个“隐藏值”,一个取决于年龄和性别,另一个取决于国家和已婚。你把重量放在每个人身上。例如,Hidden1 = 年龄 * 体重 1 + 性别 * 体重 2。隐藏 2 = 国家 * 体重 3 + 已婚 * 体重 4。然后,您制作另一组权重,Hidden3 和 Hidden4 连接到输出变量。
然后你从人口普查中获取数据,并通过你的神经网络运行以找出与数据最匹配的权重。您可以使用遗传算法来测试不同的权重集。如果您有太多边而无法尝试所有可能的权重,这将很有用。你需要找到好的权重,而不是穷尽所有可能的权重,所以 GA 可以让你“进化”一组好的权重。
然后你根据来自不同人口普查的数据测试你的权重,看看它的效果如何。