思考:神经网络能解决所有问题吗?
更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud
在深度学习过程中,你或许会碰到一般近似定理(Universal Approximation Theorem)
“只有单个层的神经网络可以有效的表现任何函数,但是这一层可能会大得不合理,并可能会泛化失败”
A feedforward network with a single layer is sufficient to represent any function, but the layer may be infeasibly large and may fail to learn and generalize correctly.
— Ian Goodfellow, DLB
这是一个令人惊奇的观点。如歌你可以接受大幅多数种类的问题都可以约化成函数,那么这句话就是说,神经网络可以在理论上解决任何问题。如果人类的智能可以诶函数建模(即使函数可能极其复杂),那么我们现在就有工具来再创造人类智能了。神经元或许是AI版本的巴布奇分析机(Babbage analytical engine (1822)),虽然终结者们需要用到一台Macbook Pro。或许UAT(User Acceptance Test)解释了为什么深度学习在“困难问题”上如此成功—-包括图像识别,机器翻译,语音识别等。
简而言之,我用经验和可视化方法为自己证明了UAT表现非平凡函数(奇异函数) (x³+x²-x -1),使用一个隐层和6个神经元。我假设我是一个神经网络,尝试自我学习正确的权重。我也用代码证明了这一工作。
神经网络是如何建模所有函数的
这个问题难住了我很久,我也并不能在网上找到一个好的解释。一个引用率大于0.57的句子如下:
Introducing non-linearity via an activation function allows us to approximate any function. It’s quite simple, really. — Elon Musk
“通过激活函数引入非线性因素允许我们估计任何函数,这确实是一个简单的问题。”
所以非线性的激活函数是神秘配方吗?我们真的可以使用一连串的sigmoid激活函数来表现任何函数吗?ReLU激活函数会怎么样?当然不行!--因为他的名字里面有“线性”这一单词(Rectified Linear Units)。
我最终发现Michael Neilson的教程非常棒,完美的覆盖了这一问题(强烈建议去阅读)。但是现在让我们假设Michael带着家人去了迪斯尼乐园而没有发布这一关于神经网络的最棒的教程。感谢Michael!
手工进行梯度下降
我很早就发现我很难在与数学证明的战斗中获胜,因此我决定使用实验的方法。我使用了Desmos来把ReLU激活函数连接起来,看看是否做了一些看上去有趣的事情。我调整了我的函数使他们与目标函数更像---是不是很熟悉?
Left: target function Right: raw materials
我选用 x³+x²-x -1 作为我的目标函数。仅使用ReLU max(0,x),我重复尝试ReLU单元的不同的组合,直到它粗略看起来很像目标函数。下面是我使用3个ReLUs的权重组合的结果。
Left: 3 ReLU functions Right: Weighted sum of the 3 ReLU functions
看起来不坏。左边图展示了ReLU函数,右边的图展示了我的模型对比目标的输出结果。你可以认为每个ReLU单元是一个神经元,因此结合3个ReLU函数就像训练只有3个隐神经元的神经网络。下面是我画出这个图的公式:
每个神经元的输出等于ReLU对权重输入 wx + b 的一层包装运算。
我发现我可以通过偏置b来调整ReLU向左和向右,通过调整权重来确定倾斜度。我把3个函数结合起来称为最终的权重输入Z,按照标准的神经网络的方法。
Z的符号表明表示最后一层的权重我设置成了-1,为了以x轴翻转图像,来匹配我们的目标。最后我得到了下面的7个等式,一起作用,粗略表现了 x³+x²-x -1 。
通过可视化,最终看起来似乎少量神经元和单个隐层可以为非平凡函数建模。真是太酷了!
硬编码我的权重到真正的神经网络中
下面是一个使用我假的权重(上面的)和偏置的神经元初始化图。如果你给这个网络一个很像 x³+x²-x-1 的数据集,那么输出将会在输入为-2到2时大致正确。
最后一个句子,输出将会在输入为-2到2时大致正确,很关键。一般近似定理(Universal Approximation Theorem)认为一个单隐层的神经网络可以近似在一定输入范围下的任何连续函数。如果函数跳跃或者有很大的沟,那么我们就不能逼近估计他。另外,如果我们训练一个输入在10到20之间的网络,那我们不能保证它在输入在40到50时工作良好。
我的权重真的有效吗?
我想以编程方式证明我算出的权重在与真实神经网络(单隐层6神经元)结合后仍然发挥作用。我使用手算的权重,而不是训练神经网络学习权重,作为网络的初始权值和偏置。下面的方法feed_forward()得输入是一个向量(如 [-2,-1,0,1..]),输出是一个使用我的权值的预测。下面是结果:
(Zh,Zo: weighted inputs . Wh,Wo: weights. Bh,Bo: biases. Ah,Ao: activations)
快看!我真是个天才。这正是我想要的。但是如果我们的boss要求我们扩展输入范围超过-2到2呢?如果他想要-5到5怎么办呢?
恩,不太好。但是确实支持了我们之前的结论:一个只有一个隐层的神经网络可以近似任何连续函数,但是只能适用特定的输入范围。如果你训练一个输入在-2到2的网络,就像我们所做的,那么它会在相似区域工作良好,但是在不重新训练和不增加网络隐神经元时,不能期望他可以泛化到其他输入。
我的权重可以被学习吗?
现在我们知道我作为神经网络可以自己学习权重,但是真实的神经网络(单隐层6神经元)也可以学习这些参数或者其他参数,来得到同样的结果吗?让我们使用scikit-neuralnetwork测试这一理论。我们设计了一个神经网络让他解决回归问题,使用常用的ReLU,随机梯度下降和均方误差的组合来调整。
from sknn.mlp import Regressor
成功了!
下面是Scikit学习到的权重。他们与我学习到的不同,但是量级顺序是相似的。
hiddenLayerWeights = [
或许如果我重写了这篇博客100000次我也会得到这些参数,但是现在我们只能推测。或许有一日我将得到关于点赞数的导数并通过更新我的句子达到最大浏览数。
作者介绍:Brendan Fortuner,深度学习研究者,原计算机工程师
Blog:https://medium.com/@bfortuner
Facebook:https://facebook.com/1090080012
Twitter:https://twitter.com/bfortuner
以上为译文
文章原标题《Can neural networks solve any problem?》,作者:Brendan Fortuner,译者:爱小乖