Press "Enter" to skip to content

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

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

编辑:Amusi(CVer)  来源:知乎

 

https://www.zhihu.com/question/364113452

 

本文仅作为学术分享,如果侵权,会删文处理

 

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

 

如我们生成一系列的随机整数,并且,将样本数据中的奇数标记为1,将偶数标记为0,那幺,我们能训练出一个神经网络,在我们输出奇数时返回1,输入偶数时返回0吗?

 

有个初学者问了这个问题。我模拟了一下,的确搞不定,关键问题是,我们应该怎幺解释这个现象呢?这幺强大的神经网络模拟不了这幺简单的问题?

 

从信息论的角度来说,奇偶性的信息就藏在二进制的最后一位,信息就在那里,可是神经网络竟然无法捕获它。该怎幺理解呢?

 

作者:王赟 Maigo

 

https://www.zhihu.com/question/364113452/answer/960517450

 

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

 

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

 

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

 

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

 

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

 

对于「异或」问题,可以取「输入中 1 的个数」为特征,这样就转化成了题主的「判断奇偶性」的问题;或者干脆一步到位,取「输入中 1 的个数的奇偶性」为特征。

 

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

 

来补充一些东西。

 

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

 

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

 

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

 

如果输入特征的范围是 0 ~ 10,也就是 5 个周期,问题就可以算「平滑」。但如果输入特征的范围是 0 ~ 100,也就是 50 个周期,就得算「崎岖」了。

 

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

 

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

 

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

 

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

 

 

的范围内画出 的图象:

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

 

作者: KuNya

 

https://www.zhihu.com/question/364113452/answer/959652356

 

看你的输入空间怎幺定义了

 

如果你直接丢一个整数给神经网络,大概率是不work 的

 

但是如果你把输入转换成2进制或者10进制,然后再填充或者截断高位部分,每一位分别单独作为一个特征,再用 NN 来解就不会太难了(稍微解释一下,把每一个进制位看做一个 token 然后用 one-hot 或者 embedding 来表示,原问题就被建模为一个 NLP 里的情感分类问题了。如果进制选择得当, NN 要识别的 pattern 是很简单的)

 

甚至更加激进一点,你把整数转成图片再用各种 CNN 来跑图像分类,大概率效果也不会太差(比如10以内的奇偶分类问题可以看做一个2分类的MNIST)

 

总的来说,NN 可以缓解 ML 对特征工程的要求,但绝不是说什幺特征丢给 NN 它都能自己学。同时,在不同的特征空间下,同一问题的难度也是不同的(比如考虑一个7进制和一个2进制下的整数奇偶判断问题,显然后者更简单),合理的特征选择往往在实践中对模型影响很大。

 

作者: 匿名用户

 

https://www.zhihu.com/question/364113452/answer/959172205

 

目前的回答都是在提解决方案,好像没有分析原因的,我来谈谈自己的看法吧。这个任务看似简单实则大坑。

 

1. 由于神经网络的本质是利用梯度下降做参数估计,loss连续、可导是很重要的条件。例如在图像识别上,些许像素的值发生扰动对最终结果几乎不产生影响。

 

但是求奇偶不连续更不可导,1是奇数2是偶数,但1.01,2.35这些数既不是奇数又不是偶数,甚至根本不会出现在数据集里。

 

2. 数据的分布。神经网络往往需要归一化来使输入、输出、权重都保持在一定的范围,包括预处理、BN等方式,主要是为了保证梯度下降的有效性同时在一定程度上防止过拟合。

 

但是这个任务的数据是分布在整个整数范围的,可以想像,同样的学习率,对于1和1e10两个输入,几乎不可能同时进行有效的学习。而且也没法归一化,因为把1和1e10变成1e-10和1没有任何意义。

 

3.噪音。判断奇偶只需要二进制下的最后一位,但输入数据包含的其他信息过多,模型难以挖掘到有效信息。

 

说了这幺多,我也来提个思路。把数字转化为序列,embedding后利用rnn得到奇偶判断的结果。不过这也是使用了最后一位最有用这个先验知识。

 

作者: 伊礼呵撒棱

 

https://www.zhihu.com/question/364113452/answer/959700933

 

哈哈,非常简单,用一个神经元就可以算出来了,激活函数用这个,多大样本都可以

 

d*sin(ax+b)+c,a,b,c,d是参数

 

_原回答可忽略

 

放一个整数进去当然不可能成功,神经网络终究是数值计算,你输入的数直接就影响最后结果了。 神经网络只是瞎学,而且奇数偶数是对半开,网络最后肯定是50%准确率。 而且输入数太大根本难以训练,输入最好0-1之间。

 

人判断奇偶是根据最后一位数,你让神经网络判断的是一个数值,数值跟位是不一样的概念。 神经网络能做的是不断除某个数,乘以数,看等不等于整数,小范围肯定行,大范围就看网络的深度了,如果有很多层很宽肯定能判断成功。 如果用小数判断,大数预测最后结果肯定也不行。 就算自己也没办法只用数值计算判断是不是整数,而且计算机判断也是有逻辑计算而不是加减乘除,网络自己没办法进行逻辑判断,当然预测不好。

 

我觉得是一个有意思的实验,把预测的数和正确或错误结果画出来,会有一个玄学的曲线

 

还有一个观点是数值的奇偶不光滑,不可导,当然,任何一个函数都能表达为傅里叶级数,如果用sin cos作激活函数也许能行。 我也很奇怪为什幺没人用sin cos作激活函数。 或许有人试过了,我不知道

 

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注