0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Tensorflowers 来源:未知 作者:李倩 2018-10-10 11:34 次阅读

DeepMind 最近发布了一篇新的论文---《神经算术逻辑单元(NALU)》(https://arxiv.org/abs/1808.00508),这是一篇很有趣的论文,它解决了深度学习中的一个重要问题,即教导神经网络计算。 令人惊讶的是,尽管神经网络已经能够在许多任务,如肺癌分类中获得卓绝表现,却往往在一些简单任务,像计算数字上苦苦挣扎。

在一个展示网络如何努力从新数据中插入特征的实验中,我们的研究发现,他们能够用 -5 到 5 之间的数字将训练数据分类,准确度近乎完美,但对于训练数据之外的数字,网络几乎无法归纳概括。

论文提供了一个解决方案,分成两个部分。以下我将简单介绍一下 NAC 的工作原理,以及它如何处理加法和减法等操作。之后,我会介绍 NALU,它可以处理更复杂的操作,如乘法和除法。 我提供了可以尝试演示这些代码的代码,您可以阅读上述的论文了解更多详情。

第一神经网络(NAC)

神经累加器(简称 NAC)是其输入的一种线性变换。什么意思呢? 它是一个转换矩阵,是 tanh(W_hat)和 sigmoid(M_hat)的元素乘积。 最后,转换矩阵 W 乘以输入(x)。

Python 中的 NAC

1import tensorflow as tf

2

3# NAC

4W_hat = tf.Variable(tf.truncated_normal(shape, stddev=0.02))

5M_hat = tf.Variable(tf.truncated_normal(shape, stddev=0.02))

6

7W = tf.tanh(W_hat) * tf.sigmoid(M_hat)

8# Forward propogation

9a = tf.matmul(in_dim, W)

NAC

第二神经网络(NALU)

神经算术逻辑单元,或者我们简称之为 NALU,是由两个 NAC 单元组成。 第一个 NAC g 等于 sigmoid(Gx)。 第二个 NAC 在一个等于 exp 的日志空间 m 中运行 (W(log(|x| + epsilon)))

Python 中的 NALU

1import tensorflow as tf

2

3# NALU

4G = tf.Variable(tf.truncated_normal(shape, stddev=0.02))

5

6m = tf.exp(tf.matmul(tf.log(tf.abs(in_dim) + epsilon), W))

7

8g = tf.sigmoid(tf.matmul(in_dim, G))

9

10y = g * a + (1 - g) * m

NALU

通过学习添加来测试 NAC

现在让我们进行测试,首先将 NAC 转换为函数。

1# Neural Accumulator

2def NAC(in_dim, out_dim):

3

4in_features = in_dim.shape[1]

5

6# define W_hat and M_hat

7W_hat = tf.get_variable(name = 'W_hat', initializer=tf.initializers.random_uniform(minval=-2, maxval=2),shape=[in_features, out_dim], trainable=True)

8M_hat = tf.get_variable(name = 'M_hat', initializer=tf.initializers.random_uniform(minval=-2, maxval=2), shape=[in_features, out_dim], trainable=True)

9

10W = tf.nn.tanh(W_hat) * tf.nn.sigmoid(M_hat)

11

12a = tf.matmul(in_dim, W)

13

14return a, W

NAC function in Python

Python 中的 NAC 功能

接下来,让我们创建一些玩具数据,用于训练和测试数据。 NumPy 有一个名为 numpy.arrange 的优秀 API,我们将利用它来创建数据集。

1# Generate a series of input number X1 and X2 for training

2x1 = np.arange(0,10000,5, dtype=np.float32)

3x2 = np.arange(5,10005,5, dtype=np.float32)

4

5

6y_train = x1 + x2

7

8x_train = np.column_stack((x1,x2))

9

10print(x_train.shape)

11print(y_train.shape)

12

13# Generate a series of input number X1 and X2 for testing

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

20print()

21print(x_test.shape)

22print(y_test.shape)

添加玩具数据

现在,我们可以定义样板代码来训练模型。 我们首先定义占位符 X 和 Y,用以在运行时提供数据。 接下来我们定义的是 NAC 网络(y_pred,W = NAC(in_dim = X,out_dim = 1))。 对于损失,我们使用 tf.reduce_sum()。 我们将有两个超参数,alpha,即学习率和我们想要训练网络的时期数。在运行训练循环之前,我们需要定义一个优化器,这样我们就可以使用 tf.train.AdamOptimizer() 来减少损失。

1# Define the placeholder to feed the value at run time

2X = tf.placeholder(dtype=tf.float32, shape =[None , 2]) # Number of samples x Number of features (number of inputs to be added)

3Y = tf.placeholder(dtype=tf.float32, shape=[None,])

4

5# define the network

6# Here the network contains only one NAC cell (for testing)

7y_pred, W = NAC(in_dim=X, out_dim=1)

8y_pred = tf.squeeze(y_pred)# Remove extra dimensions if any

9

10# Mean Square Error (MSE)

11loss = tf.reduce_mean( (y_pred - Y) **2)

12

13

14# training parameters

15alpha = 0.05 # learning rate

16epochs = 22000

17

18optimize = tf.train.AdamOptimizer(learning_rate=alpha).minimize(loss)

19

20with tf.Session() as sess:

21

22#init = tf.global_variables_initializer()

23cost_history = []

24

25sess.run(tf.global_variables_initializer())

26

27# pre training evaluate

28print("Pre training MSE: ", sess.run (loss, feed_dict={X: x_test, Y:y_test}))

29print()

30for i in range(epochs):

31_, cost = sess.run([optimize, loss ], feed_dict={X:x_train, Y: y_train})

32print("epoch: {}, MSE: {}".format( i,cost) )

33cost_history.append(cost)

34

35# plot the MSE over each iteration

36plt.plot(np.arange(epochs),np.log(cost_history)) # Plot MSE on log scale

37plt.xlabel("Epoch")

38plt.ylabel("MSE")

39plt.show()

40

41print()

42print(W.eval())

43print()

44# post training loss

45print("Post training MSE: ", sess.run(loss, feed_dict={X: x_test, Y: y_test}))

46

47print("Actual sum: ", y_test[0:10])

48print()

49print("Predicted sum: ", sess.run(y_pred[0:10], feed_dict={X: x_test, Y: y_test}))

训练之后,成本图的样子:

NAC 训练之后的成本

Actual sum: [2000. 2012. 2024. 2036. 2048. 2060. 2072. 2084. 2096. 2108.]Predicted sum: [1999.9021 2011.9015 2023.9009 2035.9004 2047.8997 2059.8992 2071.8984 2083.898 2095.8975 2107.8967]

虽然 NAC 可以处理诸如加法和减法之类的操作,但是它无法处理乘法和除法。 于是,就有了 NALU 的用武之地。它能够处理更复杂的操作,例如乘法和除法。

通过学习乘法来测试 NALU

为此,我们将添加片段以使 NAC 成为 NALU。

神经累加器(NAC)是其输入的线性变换。神经算术逻辑单元(NALU)使用两个带有绑定的权重的 NACs 来启用加法或者减法(较小的紫色单元)和乘法/除法(较大的紫色单元),由一个门(橙色单元)来控制。

1# The Neural Arithmetic Logic Unit

2def NALU(in_dim, out_dim):

3

4shape = (int(in_dim.shape[-1]), out_dim)

5epsilon = 1e-7

6

7# NAC

8W_hat = tf.Variable(tf.truncated_normal(shape, stddev=0.02))

9M_hat = tf.Variable(tf.truncated_normal(shape, stddev=0.02))

10G = tf.Variable(tf.truncated_normal(shape, stddev=0.02))

11

12W = tf.tanh(W_hat) * tf.sigmoid(M_hat)

13# Forward propogation

14a = tf.matmul(in_dim, W)

15

16# NALU

17m = tf.exp(tf.matmul(tf.log(tf.abs(in_dim) + epsilon), W))

18g = tf.sigmoid(tf.matmul(in_dim, G))

19y = g * a + (1 - g) * m

20

21return y

Python 中的 NALU 函数

现在,再次创建一些玩具数据,这次我们将进行两行更改。

1# Test the Network by learning the multiplication

2

3# Generate a series of input number X1 and X2 for training

4x1 = np.arange(0,10000,5, dtype=np.float32)

5x2 = np.arange(5,10005,5, dtype=np.float32)

6

7

8y_train = x1 * x2

9

10x_train = np.column_stack((x1,x2))

11

12print(x_train.shape)

13print(y_train.shape)

14

15# Generate a series of input number X1 and X2 for testing

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

22print()

23print(x_test.shape)

24print(y_test.shape)

用于乘法的玩具数据

第 8 行和第 20 行是进行更改的地方,将加法运算符切换为乘法。

现在我们可以训练的是 NALU 网络。 我们唯一需要更改的地方是定义 NAC 网络改成 NALU(y_pred = NALU(in_dim = X,out_dim = 1))。

1# Define the placeholder to feed the value at run time

2X = tf.placeholder(dtype=tf.float32, shape =[None , 2]) # Number of samples x Number of features (number of inputs to be added)

3Y = tf.placeholder(dtype=tf.float32, shape=[None,])

4

5# Define the network

6# Here the network contains only one NAC cell (for testing)

7y_pred = NALU(in_dim=X, out_dim=1)

8y_pred = tf.squeeze(y_pred) # Remove extra dimensions if any

9

10# Mean Square Error (MSE)

11loss = tf.reduce_mean( (y_pred - Y) **2)

12

13

14# training parameters

15alpha = 0.05 # learning rate

16epochs = 22000

17

18optimize = tf.train.AdamOptimizer(learning_rate=alpha).minimize(loss)

19

20with tf.Session() as sess:

21

22#init = tf.global_variables_initializer()

23cost_history = []

24

25sess.run(tf.global_variables_initializer())

26

27# pre training evaluate

28print("Pre training MSE: ", sess.run (loss, feed_dict={X: x_test, Y: y_test}))

29print()

30for i in range(epochs):

31_, cost = sess.run([optimize, loss ], feed_dict={X: x_train, Y: y_train})

32print("epoch: {}, MSE: {}".format( i,cost) )

33cost_history.append(cost)

34

35# Plot the loss over each iteration

36plt.plot(np.arange(epochs),np.log(cost_history)) # Plot MSE on log scale

37plt.xlabel("Epoch")

38plt.ylabel("MSE")

39plt.show()

40

41

42# post training loss

43print("Post training MSE: ", sess.run(loss, feed_dict={X: x_test, Y: y_test}))

44

45print("Actual product: ", y_test[0:10])

46print()

47print("Predicted product: ", sess.run(y_pred[0:10], feed_dict={X: x_test, Y: y_test}))

NALU 训练后的成本

Actual product: [1000000. 1012032. 1024128. 1036288. 1048512. 1060800. 1073152. 1085568. 1098048. 1110592.]Predicted product: [1000000.2 1012032. 1024127.56 1036288.6 1048512.06 1060800.8 1073151.6 1085567.6 1098047.6 1110592.8 ]

在 TensorFlow 中全面实现

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4572

    浏览量

    98737
  • 深度学习
    +关注

    关注

    73

    文章

    5237

    浏览量

    119904

原文标题:想理解神经算术逻辑单元吗?

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数字电路中加法器和减法器逻辑图分析

    多位二进制减法器,是由加法电路构成的;在加法电路的基础上,减法加法采用同一套电路,实现加减法
    发表于 09-01 16:02 2.1w次阅读
    数字电路中<b class='flag-5'>加法</b>器和<b class='flag-5'>减法</b>器逻辑图分析

    4位带进位的加法+减法计算器

    前段时间动手做了个小项目,跟大家分享一下!可实现4位带进位加法/减法计算。目前负值无法显示,只显示负数绝对值。对实例1中的显示部分有优化。目前已实现计算器功能,但程序有待优化。遥控板测试说明(红外):—:表示减法+: 表示
    发表于 01-20 17:15

    LUT用作加法器或减法

    嗨,我正在尽可能使用压缩逻辑来执行加法减法。我有两个8位数据,我想有时添加或有时减去这两个数字。看起来像是Elelment有一个叫做“CYINIT”的输入,根据的值,它可以执行
    发表于 03-28 06:07

    DSP矩阵运算-加法

    第21章 DSP矩阵运算-加法减法和逆矩阵本期教程主要讲解矩阵运算中的初始化,加法,逆矩阵和减法。目录第21章 DSP矩阵运算-加法
    发表于 08-10 07:04

    什么是串行通信?工作原理是什么?

    什么是串行通信?工作原理是什么?
    发表于 10-29 08:00

    矩阵运算中的初始化/加法/逆矩阵和减法,看完你就懂了

    矩阵运算中的初始化/加法/逆矩阵和减法,看完你就懂了
    发表于 11-19 07:02

    减法运算

    减法运算   同加法运算一样,减法运算可采用减法器来实现。半减器和全减器的设计方法和步骤与设计加法器相同。实用上,为了简化系统结构,通常不
    发表于 04-07 10:38 1.3w次阅读
    <b class='flag-5'>减法</b>运算

    十进制加法器,十进制加法工作原理是什么?

    十进制加法器,十进制加法工作原理是什么?   十进制加法器可由BCD码(二-十进制码)来设计,它可以在二进制加法器的基础上加上适当的“
    发表于 04-13 10:58 1.3w次阅读

    本的二进制加法/减法器,本的二进制加法/减法器原理

    本的二进制加法/减法器,本的二进制加法/减法器原理   两个二进制数字Ai,Bi和一个进位输入Ci相加,产生一个和输出Si,以及一个进位
    发表于 04-13 11:11 5153次阅读

    补码减法,补码减法原理是什么?

    补码减法,补码减法原理是什么?    负数的减法运算也要设法化为加法来做,其所以使用这种方法而不使用直接减法,是因为它可以和常规的
    发表于 04-13 11:45 6406次阅读

    8位加法器和减法器设计实习报告

    8位加法器和减法器设计实习报告
    发表于 09-04 14:53 133次下载

    加法器与减法器_反相加法器与同相加法

    加法器是产生数的和的装置。加数和被加数为输入,和数与进位为输出的装置为半加器。减法电路是基本集成运放电路的一种,减法电路可以由反相加法电路构成,也可以由差分电路构成。基本集成运放电路有
    发表于 08-16 11:09 16w次阅读
    <b class='flag-5'>加法</b>器与<b class='flag-5'>减法</b>器_反相<b class='flag-5'>加法</b>器与同相<b class='flag-5'>加法</b>器

    加法减法运算电路性能特点及值计算方法

    4.1.3加法减法运算电路
    的头像 发表于 04-18 06:03 1.5w次阅读
    <b class='flag-5'>加法</b>和<b class='flag-5'>减法</b>运算电路性能特点及值计算方法

    指针的加法操作

    指针的加法操作我们见过很多,但是减法操作遇到的好像很少。
    的头像 发表于 03-29 10:12 420次阅读

    fpga实现加法减法运算的方法是什么

    FPGA实现加法减法运算非常简单,实现乘法和除法可以用IP,那实现对数和指数运算该用什么呢?
    发表于 08-05 09:37 923次阅读
    fpga实现<b class='flag-5'>加法</b>和<b class='flag-5'>减法</b>运算的方法是什么