第642章
对于这个神经网络的训练过程,就是要确定这11935个参数。
训练的目标可以粗略概括为:对于每一个训练样本,对应的输出无限接近于1,而其它输出无限接近于0。
根据michael nielsen给出的实验结果,以上述网络结构为基础,在未经过调优的情况下,可以轻松达到95%的正确识别率。而核心代码只有74行!
在采用了深度学习的思路和卷积网络(convolutional networks)之后,最终达到了99.67%的正确识别率。而针对mnist数据集达到的历史最佳成绩是99.79%的识别率,是由li wan, matthew zeiler, sixin zhang, yann lecun,和 rob fergus在2013年做出的。
考虑到这个数据集里还有一些类似如下这样难以辨认的数字,这个结果是相当惊人的!它已经超越了真正人眼的识别了。
在这个过程中一步步调整权重和偏置参数的值,就必须引入梯度下降算法(gradient descent)。
在训练的过程中,我们的神经网络需要有一个实际可行的学习算法,来逐步调整参数。
而最终的目的,是让网络的实际输出与期望输出能够尽量接近。我们需要找到一个表达式来对这种接近程度进行表征。这个表达式被称为代价函数(cost function)
x表示一个训练样本,即网络的输入。其实一个x代表784个输入。
y(x)表示当输入为x的时候,期望的输出值;而a表示当输入为x的时候,实际的输出值。y(x)和a都分别代表10个输出值(以数学上的向量来表示)。而它们的差的平方,就表征了实际输出值和期望输出值的接近程度。越接近,这个差值就越小。
n是训练样本的数量。假设有5万个训练样本,那么n就是5万。因为是多次训练,所以要除以n对所有训练样本求平均值。
c(w,b)的表示法,是把cost function看成是网络中所有权重w和偏置b的函数。为什么这样看呢?进行训练的时候,输入x是固定的(训练样本),不会变。在认为输入不变的情况下,这个式子就可以看成是w和b的函数。那么,式子右边的w和b在哪呢?实际上,在a里面。y(x)也是固定值,但a是w和b的函数。
总结来说,c(w,b)表征了网络的实际输出值和期望输出值的接近程度。越接近,c(w,b)的值就越小。因此,学习的过程就是想办法降低c(w,b)的过程,而不管c(w,b)的表达形式如何,它是w和b的函数,这就变成了一个求函数最小值的最优化问题。
由于c(w,b)的形式比较复杂,参数也非常多,所以直接进行数学上的求解,非常困难。
为了利用计算机算法解决这一问题,计算机科学家们提出了梯度下降算法(gradient descent)。
这个算法本质上是在多维空间中沿着各个维度的切线贡献的方向,每次向下迈出微小的一步,从而最终抵达最小值。
由于多维空间在视觉上无法体现,所以人们通常会退到三维空间进行类比。当c(w,b)只有两个参数的时候,它的函数图像可以在三维空间里呈现。
就好像一个小球在山谷的斜坡上向下不停地滚动,最终就有可能到达谷底。这个理解重新推广到多维空间内也基本成立。
而由于训练样本的数量很大(上万,几十万,甚至更多),直接根据前面的c(w,b)进行计算,计算量会很大,导致学习过程很慢。
、于是就出现了随机梯度下降(stochastic gradient descent)算法,是对于梯度下降的一个近似。
在这个算法中,每次学习不再针对所有的训练集,而是从训练集中随机选择一部分来计算c(w,b),下一次学习再从剩下的训练集中随机选择一部分来计算,直到把整个训练集用光。然后再不断重复这一过程。
深度神经网络(具有多个hidden layer)比浅层神经网络有更多结构上的优势,它有能力从多个层次上进行抽象。
从上个世纪八九十年代开始,研究人员们不断尝试将随机梯度下降算法应用于深度神经网络的训练,但却碰到了梯度消失(vanishing gradient)或梯度爆发(exploding gradient)的问题,导致学习过程异常缓慢,深度神经网络基本不可用。
然而,从2006年开始,人们开始使用一些新的技术来训练深度网络,不断取得了突破。这些技术包括但不限于:
采用卷积网络(convolutional networks);
regularization (dropout);
rectified linear units;
利用gpu获得更强的计算能力等。
深度学习的优点显而易见:这是一种全新的编程方式,它不需要我们直接为要解决的问题设计算法和编程,而是针对训练过程编程。
网络在训练过程中就能自己学习到解决问题的正确方法,这使得我们可以用简单的算法来解决复杂的问题,而且在很多领域胜过了传统方法。
而训练数据在这个过程发挥了更重要的作用:简单的算法加上复杂的数据,可能远胜于复杂的算法加上简单的数据。
深度网络往往包含大量的参数,这从哲学原则上不符合奥卡姆剃刀原则,通常人们要在调整这些参数上面花费巨大的精力;
训练深度网络需要大量的计算力和计算时间;
过拟合(overfitting)问题始终伴随着神经网络的训练过程,学习过慢的问题始终困扰着人们,这容易让人们产生一种失控的恐惧,同时也对这项技术在一些重要场合的进一步应用制造了障碍。
而betacat的故事,所讲的就是一个人工智能程序,通过自我学习,最终逐渐统治世界的故事。
那么,现在的人工智能技术的发展,会导致这种情况发生吗?这恐怕还不太可能。一般人认为,大概有两个重要因素:
第一,以现在的人工智能来说,它的自我学习还是限定在人们指定的方式,只能学习解决特定的问题,仍然不是通用的智能。
第二,现在对于人工智能的训练过程,需要人们为其输入规整化的训练数据,系统的输入输出仍然对于数据的格式要求很严格,这也意味着,即使把人工智能程序连到网上,它也不能像betacat那样对于互联网上海量的非结构化数据进行学习。
然而这仅仅是对普通的人工智能,但是对起源这样真正的网络智能生命来说,以上两点要求它完全都能够做到。
训练的目标可以粗略概括为:对于每一个训练样本,对应的输出无限接近于1,而其它输出无限接近于0。
根据michael nielsen给出的实验结果,以上述网络结构为基础,在未经过调优的情况下,可以轻松达到95%的正确识别率。而核心代码只有74行!
在采用了深度学习的思路和卷积网络(convolutional networks)之后,最终达到了99.67%的正确识别率。而针对mnist数据集达到的历史最佳成绩是99.79%的识别率,是由li wan, matthew zeiler, sixin zhang, yann lecun,和 rob fergus在2013年做出的。
考虑到这个数据集里还有一些类似如下这样难以辨认的数字,这个结果是相当惊人的!它已经超越了真正人眼的识别了。
在这个过程中一步步调整权重和偏置参数的值,就必须引入梯度下降算法(gradient descent)。
在训练的过程中,我们的神经网络需要有一个实际可行的学习算法,来逐步调整参数。
而最终的目的,是让网络的实际输出与期望输出能够尽量接近。我们需要找到一个表达式来对这种接近程度进行表征。这个表达式被称为代价函数(cost function)
x表示一个训练样本,即网络的输入。其实一个x代表784个输入。
y(x)表示当输入为x的时候,期望的输出值;而a表示当输入为x的时候,实际的输出值。y(x)和a都分别代表10个输出值(以数学上的向量来表示)。而它们的差的平方,就表征了实际输出值和期望输出值的接近程度。越接近,这个差值就越小。
n是训练样本的数量。假设有5万个训练样本,那么n就是5万。因为是多次训练,所以要除以n对所有训练样本求平均值。
c(w,b)的表示法,是把cost function看成是网络中所有权重w和偏置b的函数。为什么这样看呢?进行训练的时候,输入x是固定的(训练样本),不会变。在认为输入不变的情况下,这个式子就可以看成是w和b的函数。那么,式子右边的w和b在哪呢?实际上,在a里面。y(x)也是固定值,但a是w和b的函数。
总结来说,c(w,b)表征了网络的实际输出值和期望输出值的接近程度。越接近,c(w,b)的值就越小。因此,学习的过程就是想办法降低c(w,b)的过程,而不管c(w,b)的表达形式如何,它是w和b的函数,这就变成了一个求函数最小值的最优化问题。
由于c(w,b)的形式比较复杂,参数也非常多,所以直接进行数学上的求解,非常困难。
为了利用计算机算法解决这一问题,计算机科学家们提出了梯度下降算法(gradient descent)。
这个算法本质上是在多维空间中沿着各个维度的切线贡献的方向,每次向下迈出微小的一步,从而最终抵达最小值。
由于多维空间在视觉上无法体现,所以人们通常会退到三维空间进行类比。当c(w,b)只有两个参数的时候,它的函数图像可以在三维空间里呈现。
就好像一个小球在山谷的斜坡上向下不停地滚动,最终就有可能到达谷底。这个理解重新推广到多维空间内也基本成立。
而由于训练样本的数量很大(上万,几十万,甚至更多),直接根据前面的c(w,b)进行计算,计算量会很大,导致学习过程很慢。
、于是就出现了随机梯度下降(stochastic gradient descent)算法,是对于梯度下降的一个近似。
在这个算法中,每次学习不再针对所有的训练集,而是从训练集中随机选择一部分来计算c(w,b),下一次学习再从剩下的训练集中随机选择一部分来计算,直到把整个训练集用光。然后再不断重复这一过程。
深度神经网络(具有多个hidden layer)比浅层神经网络有更多结构上的优势,它有能力从多个层次上进行抽象。
从上个世纪八九十年代开始,研究人员们不断尝试将随机梯度下降算法应用于深度神经网络的训练,但却碰到了梯度消失(vanishing gradient)或梯度爆发(exploding gradient)的问题,导致学习过程异常缓慢,深度神经网络基本不可用。
然而,从2006年开始,人们开始使用一些新的技术来训练深度网络,不断取得了突破。这些技术包括但不限于:
采用卷积网络(convolutional networks);
regularization (dropout);
rectified linear units;
利用gpu获得更强的计算能力等。
深度学习的优点显而易见:这是一种全新的编程方式,它不需要我们直接为要解决的问题设计算法和编程,而是针对训练过程编程。
网络在训练过程中就能自己学习到解决问题的正确方法,这使得我们可以用简单的算法来解决复杂的问题,而且在很多领域胜过了传统方法。
而训练数据在这个过程发挥了更重要的作用:简单的算法加上复杂的数据,可能远胜于复杂的算法加上简单的数据。
深度网络往往包含大量的参数,这从哲学原则上不符合奥卡姆剃刀原则,通常人们要在调整这些参数上面花费巨大的精力;
训练深度网络需要大量的计算力和计算时间;
过拟合(overfitting)问题始终伴随着神经网络的训练过程,学习过慢的问题始终困扰着人们,这容易让人们产生一种失控的恐惧,同时也对这项技术在一些重要场合的进一步应用制造了障碍。
而betacat的故事,所讲的就是一个人工智能程序,通过自我学习,最终逐渐统治世界的故事。
那么,现在的人工智能技术的发展,会导致这种情况发生吗?这恐怕还不太可能。一般人认为,大概有两个重要因素:
第一,以现在的人工智能来说,它的自我学习还是限定在人们指定的方式,只能学习解决特定的问题,仍然不是通用的智能。
第二,现在对于人工智能的训练过程,需要人们为其输入规整化的训练数据,系统的输入输出仍然对于数据的格式要求很严格,这也意味着,即使把人工智能程序连到网上,它也不能像betacat那样对于互联网上海量的非结构化数据进行学习。
然而这仅仅是对普通的人工智能,但是对起源这样真正的网络智能生命来说,以上两点要求它完全都能够做到。