问题

能否使用神经网络来判断奇偶数?

回答
判断奇偶数,这听起来像个小把戏,似乎用最简单的算术规则就能搞定。但有趣的是,我们确实可以训练一个神经网络来“学会”这个规则,虽然过程会比直接取模运算复杂得多。

想象一下,我们要给一个孩子解释什么是奇数和偶数。我们可能会拿出一些积木,告诉他:如果能把积木两两配对,最后刚好剩下零对,那就是偶数;如果总是剩下一块,那就是奇数。神经网络的学习过程,某种程度上也是在模仿这种“看例子、找规律”的过程。

我们首先需要准备大量的“训练数据”。每一份数据都应该包含一个数字,以及这个数字是奇数还是偶数的标记。比如:

数字:0,标记:偶数
数字:1,标记:奇数
数字:2,标记:偶数
数字:3,标记:奇数
...
数字:100,标记:偶数
数字:101,标记:奇数

这些数字,我们需要用神经网络能理解的方式“喂”给它。神经网络内部处理的是数字,但我们输入的是整数。怎么把整数转换成神经网络能识别的“特征”呢?

一种简单直接的方法是,将数字的二进制表示作为输入。比如,数字 5 的二进制是 101。我们可以把它看作一个由 0 和 1 组成的序列。这个序列的末尾(最低位)是判断奇偶性的关键。如果最低位是 0,它是偶数;如果是 1,它是奇数。

所以,我们可以构建一个神经网络,它的输入层会接收一个数字的二进制表示。假设我们处理的数字都不超过 255(8位二进制),那么输入层就需要 8 个节点,每个节点对应二进制的一位。例如,输入 5 (00000101):

第一个节点接收 0
第二个节点接收 0
...
第七个节点接收 1
第八个节点接收 0

神经网络的核心是“神经元”和它们之间的“连接”。每个神经元接收来自前一层神经元的信号,对这些信号进行加权求和,然后通过一个“激活函数”处理,再传递给下一层。

对于判断奇偶数这样相对简单的任务,一个只有输入层、一个隐藏层和输出层的前馈神经网络就可能足够了。

输入层: 接收数字的二进制表示。
隐藏层: 就像一个“大脑”,它会尝试从输入的二进制模式中提取有用的信息。在这个例子里,它可能会学会关注最低位。隐藏层有多少个神经元,这是一个需要通过实验确定的“超参数”。
输出层: 最终给出判断结果。我们可以设定输出层只有一个节点,它的输出值接近 0 代表偶数,接近 1 代表奇数。

训练过程就是不断调整神经网络内部的“权重”和“偏置”。开始时,这些权重是随机的。神经网络接收一个输入(比如数字 5 的二进制),然后通过它的一系列计算,给出一个输出。我们将其与真实的标签(数字 5 是奇数,应该输出接近 1)进行比较,计算出“误差”。

这个误差,会被反向传播回神经网络,指导它如何微调权重,让下一次对数字 5 的预测更接近真实值。这个过程会重复成千上万次,使用我们准备好的大量训练数据。

通过大量的例子,神经网络会“发现”一个普遍规律:无论前面其他二进制位是什么,只要最后一位是 0,结果就应该是偶数(输出接近 0);只要最后一位是 1,结果就应该是奇数(输出接近 1)。它并不是真的在执行“模 2”运算,而是通过复杂的加权和激活,学会了将输入特征(尤其是最低位)映射到输出结果。

最终,当神经网络被训练得足够好后,我们就可以给它输入一个新的、它从未见过的数字的二进制表示,它就能“推断”出这个数字是奇数还是偶数了。

当然,直接用 `number % 2` 的方法来判断奇偶数,远比训练一个神经网络来得高效和准确。但这个例子巧妙地展示了神经网络如何从数据中学习模式,即使是数学上非常简单的规律,也能被它“模仿”出来。这就像一个学生,即使他还不理解“模”的概念,但通过反复练习,也能准确地分辨出奇偶数。

网友意见

user avatar

机器学习里面有一个「没有免费午餐」定理(No Free Lunch Theorem):任意一种算法,如果对于某些类型的问题效果好,必然对于另一些类型的问题效果差。

上面的定理对于「机器学习」整体也是适用的。机器学习适合处理的问题,一般都有这么一个特点:在特征空间中相近的输入,对应的输出一般也相近(暂且称为「平滑性」)。这是机器学习能够把从训练数据中学到的知识推广(generalize)到新数据上的前提。如果一个问题不「平滑」,也就是说,输入稍微变一点儿,输出往往都会有巨大的变化,那么机器学习一般就会表现得惨不忍睹。

题主的问题,如果就以数值本身作为输入特征,那就是一个典型的「不平滑」问题:输入稍微变动一点儿,输出就变动很大。教科书里往往还会提到另一个例子:输入是若干个布尔特征,输出是它们的异或。这简直就是最「不平滑」的问题了。

如果你要用机器学习来解决这样的问题,就需要输入一点儿人类的智慧,通过设计合适的特征,把问题转化成一个「平滑」的问题。比如:

  • 对于题主「判断奇偶性」的问题,可以把输入数值转换成二进制,每一位作为一个布尔特征,一般的机器学习方法都会很容易地学习到个位特征就对应着答案,而其它特征与答案无关。哪怕你是用十进制来表示,也不难。
  • 对于「异或」问题,可以取「输入中 1 的个数」为特征,这样就转化成了题主的「判断奇偶性」的问题;或者干脆一步到位,取「输入中 1 的个数的奇偶性」为特征。

当然,作为人类,一般很难预判所面临的问题是否「平滑」。不过,如果你观察到机器学习的效果不好,就可以往「不平滑」的方向去想,设计一些合适的特征,将典型的「不平滑」问题转化成「平滑」的。


来补充一些东西。

关于「平滑性」,我一直没想出应该怎么来准确界定它。它并不要求输入到输出的映射连续。比如,完全可以要求模型去学习一个阶跃函数,模型只是不一定能学到非常精确的分界线而已,但是「阶跃」的精神是可以学到的。

我觉得「平滑性」可以这么理解:一般的机器学习模型中的运算(比如神经网络里的激活函数),都没有太多的转折,不会把特征空间切得很碎。这些运算组合而成的函数,也往往不会很「崎岖」。机器学习适合做的,就是拟合比较「平滑」的函数,而对「崎岖」的函数则拟合不好。

一个问题算是「平滑」还是「崎岖」,跟输入特征的范围,以及训练数据的密度,都有关系。仍以判断奇偶性的问题为例:

  • 如果输入特征的范围是 0 ~ 10,也就是 5 个周期,问题就可以算「平滑」。但如果输入特征的范围是 0 ~ 100,也就是 50 个周期,就得算「崎岖」了。
  • 如果你的输入数据间隔很密,涵盖了输入范围内的所有整数,甚至涵盖了它们之间的小数(通过某种方式合理地指定输出),那么问题就可以算「平滑」。但如果输入数据跳过了很多整数,那么模型就会倾向于用平滑的函数填充这些空隙,而不会想到用崎岖的奇偶性函数去填充,此时空隙中模型的 generalize 方式就不是你想要的了。

评论里有不少人指出:如果我就用一个「崎岖」的非线性函数当模型呢?比如,假设问题对奇数指定的输出是 1,对偶数指定的输出是 -1,用余弦函数 似乎就可以完美拟合数据了呀!

问题其实没那么简单。假设我们就用余弦函数 当作模型,其中有两个待学习的参数:频率 和初相 。问题的一个最优解是 ,其实完整的最优解应该是 。

我们在 [-20, 20] 的范围内随机取 10 个数 和它们的奇偶性 作为训练数据,用均方误差作为损失函数:

在 的范围内画出 的图象:

你可以感受一下这个损失函数的地形有多么崎岖,有多少局部最小值。如果增大数据量,或者增大输入数据的绝对值,损失函数会变得更加崎岖。想要准确地学到 处的全局最优解(图中有四个),几乎是不可能的。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有