神经网络能解决所有问题吗?

更多深度文章,请关注云计算频道: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),使用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激活函数连接起来,看看是否做了一些看上去有趣的事情。我调整了我的函数使他们与目标函数更像---是不是很熟悉?

左图:目标函数 右图:拟合原材料

我选用 x³+x²-x -1 作为我的目标函数。仅使用ReLU max(0,x),我重复尝试ReLU单元的不同的组合,直到它粗略看起来很像目标函数。下面是我使用3个ReLUs的权重组合的结果。

左图:使用的3个ReLU函数 右图:3个ReLU函数的权重和

看起来不坏。左边图展示了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
from sknn.mlp import Layer

# Design Network
hiddenLayer = Layer("Rectifier", units=6)
outputLayer = Layer("Linear", units=1)
nn = Regressor([hiddenLayer, outputLayer], learning_rule='sgd',
               learning_rate=.001,batch_size=5,loss_type="mse")

# Generate Data
def cubic(x):
    return x3 + x2 - x - 1

def get_cubic_data(start,end,step_size):
    X = np.arange(start, end, step_size)
    X.shape = (len(X),1)
    y = np.array([cubic(X[i]) for i in range(len(X))])
    y.shape = (len(y),1)
    return X,y

# Train Model
X,y = get_cubic_data(-2,2,.1)
nn.fit(X,y)

# Predict
predictions = nn.predict(X)

# Visualize
plt.plot(predictions)
plt.plot(y)
plt.show()

成功了!

下面是Scikit学习到的权重。他们与我学习到的不同,但是量级顺序是相似的。

hiddenLayerWeights = [
 [-1.5272, -1.0567, -0.2828, 1.0399, 0.1243, 2.2446]
]
finalLayerWeights = [
  [-2.2466],
  [ 1.0707],
  [-1.0643],
  [ 1.8229],
  [-0.4581],
  [ 2.9386]
]

或许如果我重写了这篇博客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,译者:爱小乖 ,审校:6816816151。

文章为简译,更为详细的内容,请查看原文

时间: 2025-01-21 02:56:16

神经网络能解决所有问题吗?的相关文章

转载 : 神经网络浅讲:从神经元到深度学习

神经网络是一门重要的机器学习技术.它是目前最为火热的研究方向--深度学习的基础.学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术. 本文以一种简单的,循序的方式讲解神经网络.适合对神经网络了解不多的同学.本文对阅读没有一定的前提要求,但是懂一些机器学习基础会更好地帮助理解本文. 神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术.人脑中的神经网络是一个非常复杂的组织.成人的大脑中估计有1000亿个神经元之多. 图1 人脑神经网络   那

【机器学习】人工神经网络(ANN)浅讲

神经网络是一门重要的机器学习技术.它是目前最为火热的研究方向--深度学习的基础.学习神经网络不仅可以让你掌握一门强大的机器学习方法,同时也可以更好地帮助你理解深度学习技术. 本文以一种简单的,循序的方式讲解神经网络.适合对神经网络了解不多的同学.本文对阅读没有一定的前提要求,但是懂一些机器学习基础会更好地帮助理解本文. 神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术.人脑中的神经网络是一个非常复杂的组织.成人的大脑中估计有1000亿个神经元之多. 图1 人脑神经网络   那

人工神经网络简介

机器人2025本期导读 第一版: 人工神经网络简介 第二版: 受变色甲壳虫的启发,MIT研发可用于3D打印的机器人皮肤 第三版: 智享家 | 六年蛰伏,只为做一款好的机器人--大陆智源科技 高源 第四版: 数学专业经典读物 作者:fengbingchun 原文:http://blog.csdn.net/fengbingchun/article/details/50274471 一.人工神经网络的概念 人工神经网络(Artificial Neural Network,ANN)简称神经网络(NN),

神经网络和数学之间的联系在哪里?看完你就明白

在我们了解过神经网络的人中,都了解神经网络一个有很常见的训练方法,BP 训练算法.通过 BP 算法,我们可以不断的训练网络,最终使得网络可以无限的逼近一种我们想要拟合的函数,最终训练好的网络它既能在训练集上表现好,也能在测试集上表现不错! 那么 BP 算法具体是什么呢?为什么通过 BP 算法,我们就可以一步一步的走向最优值(即使有可能是局部最优,不是全局最优,我们也可以通过其它的方法也达到全局最优),有没有一些什么数学原理在里面支撑呢?这几天梳理了一下这方面的知识点,写下来,一是为了记录,二也可

零基础进行神经网络语言建模

更多深度文章,请关注:https://yq.aliyun.com/cloud 语言模型是自然语言处理领域的基础问题,其在词性标注.句法分析.机器翻译.信息检索等任务中起到了重要作用.简而言之,统计语言模型表示为:在词序列中,给定一个词和上下文中所有词,这个序列出现的概率.例如:你手机上键盘上方正显示的三个字,系统试图预测你要输入的下一个字词就是语言建模的用途之一.在下面所示的情况下,语言模型预测"from","on"和"it"在给定句子中具有很高

神经网络不胜语, M-P模型似可寻(深度学习入门系列之三)

系列文章: 一入侯门"深"似海,深度学习深几许(深度学习入门系列之一) 人工"碳"索意犹尽,智能"硅"来未可知(深度学习入门系列之二)   "那些在个人设备里,谦谦卑卑地为我们哼着歌曲的数字仆人,总有一天会成为我们的霸主!" --A.I. winter   在前面的小节中,我们大致了解了机器学习的形式化定义和神经网络的概念,在本小节中,我们将相对深入地探讨一下神经网络中的神经元模型以及深度学习常常用到的激活函数及卷积函数. 3

神经网络理论基础及Python实现

一.多层前向神经网络 多层前向神经网络由三部分组成:输出层.隐藏层.输出层,每层由单元组成; 输入层由训练集的实例特征向量传入,经过连接结点的权重传入下一层,前一层的输出是下一层的输入;隐藏层的个数是任意的,输入层只有一层,输出层也只有一层; 除去输入层之外,隐藏层和输出层的层数和为n,则该神经网络称为n层神经网络,如下图为2层的神经网络; 一层中加权求和,根据非线性方程进行转化输出;理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程 二.设计神经网络结构 使用神经网络之前,必须要

深度学习-神经网络 历史

一 2016 年一月底,人工智能的研究领域,发生了两件大事. 先是一月二十四号,MIT 的教授,人工智能研究的先驱者,Marvin Minsky 去世,享年89 岁. 三天之后,谷歌在自然杂志上正式公开发表论文,宣布其以深度学习技术为基础的电脑程序 AlphaGo, 在 2015年 十月,连续五局击败欧洲冠军.职业二段樊辉. 这是第一次机器击败职业围棋选手.距离 97年IBM 电脑击败国际象棋世界冠军,一晃近二十年了. 极具讽刺意义的是,Minsky 教授,一直不看好深度学习的概念.他曾在 19

深度学习中的“深度”究竟怎么理解?

介绍 为了研究神经网络,我们必须要对什么网络是什么有一个更直观的认识. 一.基本变换:层 神经网络是由一层一层构建的,那么每层究竟在做什么? 数学式子:,其中是输入向量,是输出向量,是偏移向量,是权重矩阵,是激活函数.每一层仅仅是把输入经过如此简单的操作得到. 数学理解:通过如下 5 种对输入空间(输入向量的集合)的操作,完成 输入空间 -> 输出空间 的变换 (矩阵的行空间到列空间). 注:用 "空间" 二字的原因是被分类的并不是单个事物,而是一类事物.空间是指这类事物所有个体