您当前的位置:首页 > 美文摘抄 > 内容

NAC的工作原理以及它如何处理加法和减法等操作

NAC的工作原理以及它如何处理加法和减法等操作

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


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: iphone墨绿色(iphone 11的电量处和信号处为何在不充电的情况下呈墨绿色)

下一篇: 三星note2是详细参数(三星note2照相怎么样)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号