神经网络求解新思路:OpenAI用线性网络计算非线性问题

作者: JAKOB FOERSTER 2017-10-09 11:21:46

我们展示了深度线性网络(使用浮点运算实现)实际上并不是线性的,它可以执行非线性计算。我们利用这一点使用进化策略在线性网络中寻找参数,使我们能够解决重要问题。

神经网络通常由一个线性层和非线性函数(比如 tanh 和修正线性单元 ReLU)堆栈而成。如果没有非线性,理论上一连串的线性层和单一的线性层在数学上是等价的。因此浮点运算是非线性的,并足以训练深度网络。这很令人惊讶。

背景

计算机使用的数字并不是***的数学对象,而是使用有限个比特的近似表示。浮点数通常被计算机用于表示数学对象。每一个浮点数由小数和指数的组合构成。在 IEEE 的 float32 标准中,小数分配了 23 个比特,指数分配了 8 个比特,还有一个比特是表示正负的符号位 sign。

按照这种惯例和二进制格式,以二进制表示的最小非零正常数是 1.0..0 x 2^-126,以下用 min 来指代。而下一个可表示的数是 1.0..01 x 2^-126,可以写作 min+0.0..01 x 2^-126。很显然,***和第二个数之间的 gap 比 0 和 min 之间的 gap 小了 2^20 倍。在 float32 标准中,当一个数比最小的可表示数还小的时候,则该数字将被映射为零。因此,近邻零的所有包含浮点数的计算都将是非线性的。(而反常数是例外,它们在一些计算硬件上可能不可用。在我们的案例中通过设置归零(flush to zero,FTZ)解决这个问题,即将所有的反常数当成零。)

因此,虽然通常情况下,所有的数字和其浮点数表示之间的区别很小,但是在零附近会出现很大的 gap,而这个近似误差可能带来很大影响。

这会导致一些奇怪的影响,一些常用的数学规则无法发挥作用。比如,(a + b) x c 不等于 a x c + b x c。

比如,如果你设置 a = 0.4 x min,b = 0.5 x min,c = 1 / min。

则:(a+b) x c = (0.4 x min + 0.5 x min) x 1 / min = (0 + 0) x 1 / min = 0。

然而:(a x c) + (b x c) = 0.4 x min / min + 0.5 x min x 1 / min = 0.9。

再比如,我们可以设置 a = 2.5 x min,b = -1.6 x min,c = 1 x min。

则:(a+b) + c = (0) + 1 x min = min

然而:(b+c) + a = (0 x min) + 2.5 x min = 2.5 x min。

在这种小尺度的情况下,基础的加法运算变成非线性的了!

使用进化策略利用非线性

我们想知道这种内在非线性是否可以作为计算非线性的方法,如果可以,则深度线性网络能够执行非线性运算。挑战在于现代微分库在非线性尺度较小时会忽略它们。因此,使用反向传播利用非线性训练神经网络很困难或不可能。

我们可以使用进化策略(ES),无需依赖符号微分(symbolic differentiation)法就可以评估梯度。使用进化策略,我们可以将 float32 的零点邻域(near-zero)行为作为计算非线性的方法。深度线性网络通过反向传播在 MNIST 数据集上训练时,可获取 94% 的训练准确率和 92% 的测试准确率(机器之心使用三层全连接网络可获得 98.51% 的测试准确率)。相对而言,相同的线性网络使用进化策略训练可获取大于 99% 的训练准确率、96.7% 的测试准确率,确保激活值足够小而分布在 float32 的非线性区间内。训练性能的提升原因在于在 float32 表征中使用非线性的进化策略。这些强大的非线性允许任意层生成新的特征,这些特征是低级别特征的非线性组合。以下是网络结构:

  1. x = tf . placeholder ( dtype = tf . float32 , shape =[ batch_size , 784 ]) 
  2.  
  3. y = tf . placeholder ( dtype = tf . float32 , shape =[ batch_size , 10 ]) 
  4.  
  5. w1 = tf . Variable ( np . random . normal ( scale = np . sqrt ( 2. / 784 ), size =[ 784 , 512 ]). astype ( np . float32 )) 
  6.  
  7. b1 = tf . Variable ( np . zeros ( 512 , dtype = np . float32 )) 
  8.  
  9. w2 = tf . Variable ( np . random . normal ( scale = np . sqrt ( 2. / 512 ), size =[ 512 , 512 ]). astype ( np . float32 )) 
  10.  
  11. b2 = tf . Variable ( np . zeros ( 512 , dtype = np . float32 )) 
  12.  
  13. w3 = tf . Variable ( np . random . normal ( scale = np . sqrt ( 2. / 512 ), size =[ 512 , 10 ]). astype ( np . float32 )) 
  14.  
  15. b3 = tf . Variable ( np . zeros ( 10 , dtype = np . float32 )) 
  16.  
  17. params = [ w1 , b1 , w2 , b2 , w3 , b3 ] 
  18.  
  19. nr_params = sum ([ np . prod ( p . get_shape (). as_list ()) for p in params ]) 
  20.  
  21. scaling = 2 ** 125 
  22.  
  23. def get_logits ( par ): 
  24.  
  25. h1 = tf . nn . bias_add ( tf . matmul ( x , par [ 0 ]), par [ 1 ]) / scaling 
  26.  
  27. h2 = tf . nn . bias_add ( tf . matmul ( h1 , par [ 2 ]) , par [ 3 ] / scaling ) 
  28.  
  29. o = tf . nn . bias_add ( tf . matmul ( h2 , par [ 4 ]), par [ 5 ]/ scaling )* scaling 
  30.  
  31. return o 

在上面的代码中,我们可以看出该网络一共 4 层,***层为 784(28*28)个输入神经元,这个数量必须和 MNIST 数据集中单张图片所包含像素点数相同。第二层与第三层都为隐藏层且每层有 512 个神经元,***一层为输出的 10 个分类类别。其中每两层之间的全连接权重为服从正态分布的随机初始化值。nr_params 为加和所有参数的累乘。下面定义一个 get_logist() 函数,该函数的输入变量 par 应该可以是上面定义的 nr_params,因为定义添加偏置项的索引为 1、3、5,这个正好和前面定义的 nr_params 相符,但 OpenAI并没有给出该函数的调用过程。该函数***个表达式计算***层和第二层之间的前向传播结果,即计算输入 x 与 w1 之间的乘积再加上缩放后的偏置项(前面 b1、b2、b3 都定义为零向量)。后面两步的计算也基本相似,***返回的 o 应该是图片识别的类别。不过 OpenAI 只给出了网络架构,而并没有给出优化方法和损失函数等内容。

神经网络 OpenAI 非线性
上一篇:5分钟教你玩转 sklearn 机器学习(上) 下一篇:阿迪达斯机器人工厂制造的鞋子马上要发货了
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

微软麻将 AI 论文发布,首次公开技术细节

2019 年 8 月 29 日,微软发布了一个名为 Suphx(超级凤凰)的「麻将 AI」,在专业的麻将竞技平台上,Suphx 的实力胜过了顶级人类选手的平均水平。

神经小兮 ·  4天前
全球首个翻译引擎进化归来 “细节狂魔”搞定方言

最近,一款在线机器翻译软件在日本大火。这款翻译软件名叫DeepL,大火的原因正是因为它工作太负责了,翻译得太过准确,在日本引起了热议。

刘俊寰 ·  4天前
从零开始构建简单人工神经网络:1个隐藏层

我们在本文中将构建一个有1个输入层、1个隐藏层和1个输出层的神经网络。我们会看到,我们构建的神经网络能够找到非线性边界。

布加迪 ·  2020-03-26 09:00:00
AI芯片之卷积神经网络原理

卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。 它包括卷积层(convolutional layer)和池化层(pooling layer)。

人人都是极客 ·  2020-03-25 09:48:10
从零开始构建简单人工神经网络:1个输入层和1个输出层

本上下篇将介绍仅使用numpy Python库从零开始构建人工神经网络(ANN)。上篇将介绍构建一个很简单的ANN,只有1个输入层和1个输出层,没有隐藏层。下篇将介绍构建一个有1个输入层、1个隐藏层和1个输出层的ANN。

布加迪 ·  2020-03-25 09:00:00
华为开源只用加法的神经网络:实习生领衔打造,效果不输传统CNN

没有乘法的神经网络,你敢想象吗?无论是单个神经元的运算还是卷积运算,都不可避免地要使用乘法。

佚名 ·  2020-03-17 10:01:22
五分钟了解机器学习十大算法

本文为有志于成为数据科学家或对此感兴趣的读者们介绍最流行的机器学习算法。

Fahim ul Haq ·  2020-03-06 10:45:48
40纳秒完成图像分类,图像传感器自带神经网络登上Nature

AI芯片还可以怎么搞?最新登上Nature的研究带来新启发。试想一下,如果人类眼睛可以直接处理图像——不用劳烦大脑,那视觉图像信息的处理速度岂不是可以大大提升?

鱼羊 晓查 ·  2020-03-05 15:59:10
Copyright©2005-2020 51CTO.COM 版权所有 未经许可 请勿转载