首页 > 编程知识 正文

非线性代数(几何非线性)

时间:2023-05-04 19:11:42 阅读:101966 作者:303

雷锋。com AI技术评论:无论是通用编程还是机器学习,计算机中的所有数据都是以一定的数据格式表示的。但在某些情况下,数据格式会带来明显的局限性,导致计算结果异常。

但在OpenAI的研究者看来,这种“计算结果的异常”可以作为为神经网络带来新可能的立足点。在这篇博客文章中,他们介绍了一个异常的来源以及如何使用它,并取得了良好的效果。雷锋。com AI技术评论把文章整理如下。

以前的证据表明,如果用浮点数值运算实现深度线性网络,结果不是完全线性的,并且会表现出一些非线性计算特性。在本研究中,OpenAI的研究人员利用进化计算的策略来寻找线性网络中具有非线性特征的参数,希望对一些难题有所帮助。

神经网络由许多线性层叠加非线性层构成,常见的非线性函数有tanh或ReLU。没有这些非线性部分,几个连续的线性层在数学理论上应该相当于单个线性层。因此,浮点数的计算是非线性的,足以形成可训练的深度神经网络,这有点出乎意料。

00-1010计算机中使用的数字不是理想的数学对象,而是用有限的数字0和1近似表示。浮点数是计算机中数学对象的常用表示方法。每种浮点格式的数据可以分为小数和指数部分。在IEEE 32位浮点标准中,23位用于表示小数部分,8位用于表示指数部分,1位用于表示符号。

根据浮点数的定义和其中使用的二进制位表示范围的限制,它能表示的最幸福的零数是(二进制)1.000.0x2-126,这里称为min。然而,可以表示的第二小数字是1.000.01x2-126,可以用min 0.000表示.01x2-126。显然,min和第二小数的差距只有min和0差距的2-20倍,不到百万分之一的时间。在32位浮点数中,如果要表示的数字比min更接近0,那么这个数字将直接表示为0。由于这种“下溢”的影响,所有围绕0的浮点运算都将变成非线性的。

“非正规数字”不受这些限制的影响,但是一些计算硬件不支持这种数据格式。虽然默认情况下GPU和cuBLAS都可以使用反规范数,但TensorFlow在构建模型时默认关闭反规范数选项(对于ftz=true标志集)。这意味着所有用张量流写的非矩阵乘法运算都具有隐式非线性(假设计算中涉及的数量级在e^-38).附近

因此,虽然任何一个数的真值与后来用浮点格式表示的值之间的差异一般都很小,但是当这个数非常接近0时,这部分逼近误差就会变得非常显著。

这一事件的后果是熟悉的数学定律不再适用,接下来会发生很多奇怪的事情。例如,(a b) x c不再等于A X C B X C。

例如,假设a=0.4 x min,b=0.5 xmin,c=1/min。

然后,(a b)x c=(0.4 x min 0.5 x min)x 1/min=(00)x 1/min=0

然而,(a x c)(b x c)=0.4 x min/min 0.5 xmin x1/min=0.9

再举一个例子,这次a=2.5 x min,b=-1.6 xmin,c=1 xmin。

然后(a b) c=(0) 1 x min=min

但是,(b c) A=(0xmin) 2.5xmin=2.5xmin。

在这个数量级上,连最基本的约束定律都变成了非线性!

背景

OpenAI研究人员想知道这种固有的非线性是否可以作为计算中的非线性,如果可行,可以让深度线性网络实现非线性计算运算。挑战在于,所使用的现代微分库通常对如此小规模的非线性视而不见。从那时起,通过反向传播来利用这些非线性来训练神经网络是非常困难的,甚至是不可能的。

OpenAI研究人员决定使用进化策略来估计梯度,而不是依赖差分方法。通过进化策略,他们可以真正利用32位浮点数接近零值的非线性行为,并将其发展为计算非线性。以MNIST数据集的训练为例,用反向传播算法训练的深度线性网络可以达到94%的训练精度和92%的测试精度。相比之下,同一个线性神经网络可以达到99%以上的训练准确率和96.7%的测试准确率,这只有通过进化策略训练才能获得,同时激活权重也足够小,在32位浮点数的非线性行为能够影响的范围内。这种训练成绩的提高是进化的结果。

策略发现并充分利用了32位浮点数表示中的非线性。这些强有力的非线性行为可以让任意一个层根据低层特征的非线性组合产生全新的特征。这个网络的结构如下:

x = tf.placeholder(dtype=tf.float32, shape=[batch_size,784])

y = tf.placeholder(dtype=tf.float32, shape=[batch_size,10])

w1 = tf.Variable(np.random.normal(scale=np.sqrt(2./784),size=[784,512]).astype(np.float32))

b1 = tf.Variable(np.zeros(512,dtype=np.float32))

w2 = tf.Variable(np.random.normal(scale=np.sqrt(2./512),size=[512,512]).astype(np.float32))

b2 = tf.Variable(np.zeros(512,dtype=np.float32))

w3 = tf.Variable(np.random.normal(scale=np.sqrt(2./512),size=[512,10]).astype(np.float32))

b3 = tf.Variable(np.zeros(10,dtype=np.float32))

params = [w1,b1,w2,b2,w3,b3]

nr_params = sum([np.prod(p.get_shape().as_list()) for p in params])

scaling = 2**125

def get_logits(par):

h1 = tf.nn.bias_add(tf.matmul(x , par[0]), par[1]) / scaling

h2 = tf.nn.bias_add(tf.matmul(h1, par[2]) , par[3] / scaling)

o = tf.nn.bias_add(tf.matmul(h2, par[4]), par[5]/ scaling)*scaling

return o

除了 MNIST 之外,OpenAI 的研究人员们相信未来还会有更多有意思的实验把这种思想拓展到循环神经网络,或者把非线性计算运用在提升复杂语言建模和翻译之类的机器学习任务表现中。他们非常期待可以和广大研究人员们一起探索其中的可能性。

via OpenAI Blog,雷锋网 AI 科技评论编译

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。