DeepMind最近发表了一篇新论文——《神经算术逻辑单元(NALU)》(https://arxiv . org/ABS/1808.00508),这是一篇非常有趣的论文。它解决了深度学习中的一个重要问题,即教授神经网络计算。令人惊讶的是,尽管神经网络已经能够在许多任务中取得出色的性能,例如肺癌分类,但它们经常在一些简单的任务中挣扎,例如计算数字。
在一个展示网络如何试图向新数据中插入特征的实验中,我们的研究发现,他们可以用-5到5之间的数字对训练数据进行分类,精度几乎是完美的,但网络几乎无法对训练数据以外的数字进行归纳。
本文提供了一个解决方案,分为两部分。我将简单介绍一下NAC的工作原理,以及它是如何处理加减法等运算的。之后,我将介绍NALU,它可以处理更复杂的运算,如乘法和除法。我已经提供了可以尝试演示这些代码的代码。更多细节可以看上面的论文。
第一个神经网络(NAC)
神经累加器(NAC)是其输入的线性变换。你什么意思?它是一个变换矩阵,是tanh(W_hat)和sigmoid(M_hat)的乘积。最后,变换矩阵W乘以输入(x)。
Python中的NAC
1将张量流作为tf导入
2
3号NAC
4W帽子=tf。变量(tf.truncated_normal(shape,stddev=0.02))
5M_hat=tf。变量(tf.truncated_normal(shape,stddev=0.02))
六
7W=TF . tanh(W _ hat)* TF . sigmoid(M _ hat)
8#正向传播
9a=tf.matmul(in_dim,W)
网络准入控制
第二神经网络(NALU)
算术逻辑单元,简称NALU,由两个NAC单元组成。第一个NAC g等于sigmoid(Gx)。第二NAC在等于exp(W(log(| x |))的对数空间M中运行
蟒蛇皮NALU
1将张量流作为tf导入
2
3号NALU
4G=tf。变量(tf.truncated_normal(shape,stddev=0.02))
五
6m=TF . exp(TF . mat mul(TF . log(TF . ABS(in _ dim)epsilon),W))
七
8g=tf.sigmoid(tf.matmul(in_dim,G))
九
10y=g * a (1 - g) * m
NALU
通过学习加法来测试NAC
现在让测试,先把NAC转换成函数。
1#神经蓄能器
2def NAC(in_dim,out_dim):
三
4in_features=in_dim.shape[1]
五
6#定义W_hat和M_hat
7W _ hat=TF . get _ variable(name=W _ hat ,initializer=TF . initializer . random _ uniform(minval=-2,maxval=2),shape=[in_features,out_dim],trainable=True)
8M _ hat=TF . get _ variable(name=M _ hat ,initializer=TF . initializer . random _ uniform(minval=-2,maxval=2),shape=[in_features,out_dim],trainable=True)
九
10W=TF . nn . tanh(W _ hat)* TF . nn . sigmoid(M _ hat)
11
12a=tf.matmul(in_dim,W)
13
14返回a,W
Python中的NAC函数
Python中的NAC函数
接下来,让让我们为训练和测试数据创建一些玩具数据。NumPy有一个优秀的API,叫做numpy.arrange,我们将使用它来创建数据集。
1#生成一系列输入数字X1和X2用于训练
2x1=np.arange(0,10000,5,dtype=np.float32)
3x2=np.arange(5,10005,5,dtype=np.float32)
四
五
6y_train=x1 x2
七
8x_train=np.column_stack((x1,x2))
九
10print(x_train.shape)
11print(y_train.shape)
12
13#生成一系列用于测试的输入数字X1和X2
14x1=np.arange(1000,2000,8,dtype=np.float32)
15x2=np.arange(1000,1500,4,dtype=np.float32)
16
17x_test=np.column_stack((x1,x2))
18y_test=x1 x2
19
20打印()
21print(x_test.shape)
22print(y_test.shape)
添加玩具数据
现在,我们可以定义模板代码来训练模型。首先,我们定义占位符X和Y来在运行时提供数据。接下来我们定义NAC网络(y_pred,W=NAC(in_dim=X,out_dim=1))。对于loss,我们使用tf.reduce_sum()。我们会有两个超级参数alpha,分别是学习速率和我们要训练的网络的周期数。在运行训练循环之前,我们需要定义一个优化器,以便我们可以使用tf.train.AdamOptimizer()来减少损失。
1#定义占位符以在运行时输入值
2X=TF。占位符(dtype=TF。float 32,shape=[None,2]) #样本数x特征数(要添加的输入数)
3Y=TF。占位符(dtype=TF。float 32,shape=[无,])
四
5#定义网络
6#这里网络只包含一个网络准入控制小区(用于测试)
7y_pred,W=NAC(in_dim=X,out_dim=1)
8y_pred=tf.squeeze(y_pred)#删除额外的维度(如果有的话)
9
10#均方误差(均方误差)
11损失=TF。reduce _ mean((Y _ pred-Y)* * 2)
12
13
14#培训参数
15=0.05 #学习率
16个纪元=22000
17
18优化=TF。火车。adamoptimizer(learning _ rate=alpha).最小化(损失)
19
20带tf .会话()作为会话:
21
22 # init=TF。global _ variables _初始值设定项()
23cost_history=[]
24
25次成功。运行(TF。global _ variables _ initializer()
26
27#培训前评估
28 print(预训练MSE:ess.run (loss,feed_dict={X: x_test,Y:y_test}))
29打印()
30对于范围内的我(纪元):
31_,cost=sess.run([optimize,loss ],feed_dict={X:x_train,Y: y_train})
32 print(纪元:{},毫秒:{ } 格式(我,成本) )
33cost_history.append成本)
34
35#绘制每次迭代的均方误差(mean square error)
36plt.plot(np.arange(epochs),np.log(cost_history)) #以对数比例绘制均方误差(mean square error)
37plt.xlabel("纪元")
38 PLT . y label(MSE )
39plt.show()
40
41打印()
42print(W.eval())
43打印()
44#岗位培训流失
45 print(岗位培训MSE:ess.run(loss,feed_dict={X: x_test,Y: y_test}))
46
47 print(实际总和: 'y_test[0:10])
48打印()
49打印(预测总和: 'sess.run(y_pred[0:10],feed_dict={X: x_test,Y: y_test}))
训练之后,成本图的样子:
网络准入控制训练之后的成本
实际金额:【2000。2012.2024.2036.2048.2060.2072.2084.2096.2108.]预计金额:[1999.9021 2011.9015 2023.9009 2035.9004 2047.8997 2059.8992 2071.8984 2083.898 2095.8975 2107.8967]
虽然网络准入控制可以处理诸如加法和减法之类的操作,但是它无法处理乘法和除法。于是,就有了NALU的用武之地。它能够处理更复杂的操作,例如乘法和除法。
通过学习乘法来测试NALU
为此,我们将添加片段以使网络准入控制成为NALU。
神经累加器(新来港儿童)是其输入的线性变换。神经算术逻辑单元(NALU)使用两个带有绑定的权重的NACs来启用加法或者减法(较小的紫色单元)和乘法/除法(较大的紫色单元),由一个门(橙色单元)来控制。
1#神经算术逻辑单元
二维NALU(输入尺寸,输出尺寸):
3
4shape=(int(in_dim.shape[-1]),out_dim)
5=1e-7
6
七号网络准入控制
8W_hat=tf .变量(tf.truncated_normal(shape,stddev=0.02))
9M_hat=tf .变量(tf.truncated_normal(shape,stddev=0.02))
10G=tf .变量(tf.truncated_normal(shape,stddev=0.02))
11
12W=TF。tanh(W _ hat)* TF。乙状结肠
13#正向传播
14a=tf.matmul(in_dim,W)
15
16号NALU
17m=TF。exp(TF。mat mul(TF。日志(TF。ABS(in _ dim)),W))
18g=TF。乙状结肠(TF。材料mul(in _ dim,G))
19y=g * a (1 - g) * m
20
21返回y
计算机编程语言中的NALU函数
现在,再次创建一些玩具数据,这次我们将进行两行更改。
1#通过学习乘法来测试网络
2
3#生成一系列输入数字X1和X2用于训练
4x1=np.arange(0,10000,5,dtype=np.float32)
5x2=np.arange(5,10005,5,dtype=np.float32)
6
七
8y_train=x1 * x2
9
10x_train=np.column_stack((x1,x2))
11
12print(x_train.shape)
13print(y_train.shape)
14
15#生成一系列用于测试的输入数字X1和X2
16x1=np.arange(1000,2000,8,dtype=np.float32)
17x2=np.arange(1000,1500,4,dtype=np.float32)
18
19x_test=np.column_stack((x1,x2))
20y_test=x1 * x2
21
22打印()
23print(x_test.shape)
24print(y_test.shape)
用于乘法的玩具数据
第8行和第20 行是进行更改的地方,将加法运算符切换为乘法。
现在我们可以训练的是NALU网络。我们唯一需要更改的地方是定义网络准入控制网络改成NALU(y_pred=NALU(in_dim=X,out_dim=1))。
1#定义占位符以在运行时输入值
2X=TF。占位符(dtype=TF。float 32,shape=[None,2]) #样本数x特征数(要添加的输入数)
3Y=TF。占位符(dtype=TF。float 32,shape=[无,])
四
5#定义网络
6#这里网络只包含一个网络准入控制小区(用于测试)
7y_pred=NALU(输入_尺寸=X,输出_尺寸=1)
8y_pred=tf.squeeze(y_pred) #删除额外的维度(如果有的话)
9
10#均方误差(均方误差)
11损失=TF。reduce _ mean((Y _ pred-Y)* * 2)
12
13
14#培训参数
15=0.05 #学习率
16个纪元=22000
17
18优化=TF。火车。adamoptimizer(learning _ rate=alpha).最小化(损失)
19
20带tf .会话()作为会话:
21
22 # init=TF。global _ variables _初始值设定项()
23cost_history=[]
24
25次成功。运行(TF。global _ variables _ initializer()
26
27#培训前评估
28 print(预训练MSE:ess.run (loss,feed_dict={X: x_test,Y: y_test}))
29打印()
30对于范围内的我(纪元):
31_,cost=sess.run([optimize,loss ],feed_dict={X: x_train,Y: y_train})
32 print(纪元:{},毫秒:{ } 格式(我,成本) )
33cost_history.append成本)
34
35#绘制每次迭代的损失
36plt.plot(np.arange(epochs),np.log(cost_history)) #以对数比例绘制均方误差(mean square error)
37plt.xlabel("纪元")
38 PLT . y label(MSE )
39plt.show()
40
41
42#岗位培训流失
43 print(岗位培训MSE:ess.run(loss,feed_dict={X: x_test,Y: y_test}))
44
45 print(实际产品: 'y_test[0:10])
46打印()
47 print(预测产品: 'sess.run(y_pred[0:10],feed_dict={X: x_test,Y: y_test}))
NALU训练后的成本
实际产品:【1000000。1012032.1024128.1036288.1048512.1060800.1073152.1085568.1098048.1110592.]预测产品:[1000000.2 1012032。1024127.56 1036288.6 1048512.06 1060800.8 1073151.6 1085567.6 1098047.6 1110592.8 ]
在张量流中全面实现
标签:网络DIMY