有效地将函数应用于神经元输出然后求和,而不是将函数应用于求和
Efficiently apply function to neuron outputs then sum, not apply function to sum
我想对神经元的各个输入应用非线性并对结果求和,而不是对各个输入求和并应用非线性。我目前的实施速度很慢。
我有一个大小为 D 的输入层,批量大小为 B。下一层是 N
个神经元宽,因此权重矩阵 W = D x N
。调用我的非线性 f
.
在符号中,对于神经元 n,我想要 f(w_{1n}x_1) + ... + f(w_{Dn}x_D)
而不是我们通常使用的 f(w_{1n}x_1 + ... + w_{Dn}x_D)
。
我对这个过程的矢量化很慢。目前,它利用广播,我想知道是否有更快的方法来获得我想要的东西。
train = tf.placeholder(tf.float32, shape=(B, D, 1))
w1 = tf.Variable(tf.truncated_normal([D, N]))
b1 = tf.Variable(tf.zeros([N]))
h1 = tf.reduce_sum(tf.nn.relu(tf.mul(train, w1)), 1) + b1
h1 = tf.reshape(h1, [B, N, 1])
然后我继续将其提供给下一层。这样做几次很慢。我想知道是否有某种方法可以提高效率或以不同的方式计算它。
(只是为了理智检查我们是否在同一页上:重申您所要求的一种方法是能够将函数 f(x) 应用于每个标量元素*元素乘积矩阵乘法,在之前将这些乘积相加产生最终输出值。)
一个不令人满意的答案——也许有人可以证明我错了——答案是我认为最好的办法是不编写内核来实现它。核心挑战是,如果没有自定义内核(或从原始操作中实现块分解矩阵乘法,这听起来令人不快),我想不出一种方法来获取快速执行此操作所需的缓存位置。
我想对神经元的各个输入应用非线性并对结果求和,而不是对各个输入求和并应用非线性。我目前的实施速度很慢。
我有一个大小为 D 的输入层,批量大小为 B。下一层是 N
个神经元宽,因此权重矩阵 W = D x N
。调用我的非线性 f
.
在符号中,对于神经元 n,我想要 f(w_{1n}x_1) + ... + f(w_{Dn}x_D)
而不是我们通常使用的 f(w_{1n}x_1 + ... + w_{Dn}x_D)
。
我对这个过程的矢量化很慢。目前,它利用广播,我想知道是否有更快的方法来获得我想要的东西。
train = tf.placeholder(tf.float32, shape=(B, D, 1))
w1 = tf.Variable(tf.truncated_normal([D, N]))
b1 = tf.Variable(tf.zeros([N]))
h1 = tf.reduce_sum(tf.nn.relu(tf.mul(train, w1)), 1) + b1
h1 = tf.reshape(h1, [B, N, 1])
然后我继续将其提供给下一层。这样做几次很慢。我想知道是否有某种方法可以提高效率或以不同的方式计算它。
(只是为了理智检查我们是否在同一页上:重申您所要求的一种方法是能够将函数 f(x) 应用于每个标量元素*元素乘积矩阵乘法,在之前将这些乘积相加产生最终输出值。)
一个不令人满意的答案——也许有人可以证明我错了——答案是我认为最好的办法是不编写内核来实现它。核心挑战是,如果没有自定义内核(或从原始操作中实现块分解矩阵乘法,这听起来令人不快),我想不出一种方法来获取快速执行此操作所需的缓存位置。