将a[2, 3]
表示为维度为2x3的矩阵。假设每个输入中有10个元素,网络是一个双元素分类器(例如猫或狗(。假设只有一个致密层。现在我忽略了偏差向量。我知道这是一个过于简化的神经网络,但它只是为了这个例子。神经网络密集层中的每个输出都可以计算为
output = matmul(input, weights)
其中,weights
是权重矩阵10x2,input
是输入向量1x10,并且output
是输出向量1x2。
我的问题是:用一个矩阵乘法可以同时计算整个输入序列吗?看起来你可以计算
output = matmul(input, weights)
其中总共有100个输入,input
为100x10,weights
为10x2,output
为100x2。
在反向传播中,你可以做类似的事情:
input_err = matmul(output_err, transpose(weights))
weights_err = matmul(transpose(input), output_err)
weights -= learning_rate*weights_err
其中weights
相同,output_err
为100x2,input
为100x10。
然而,我试图以这种方式从头开始实现神经网络,但目前没有成功。我想知道我是否还有其他错误,或者我的方法是否根本错误。
谢谢!
如果有其他人想知道,我找到了问题的答案。由于几个原因,这实际上并不奏效。从本质上讲,以这种方式计算所有输入就像运行一个批量大小等于输入数量的网络。权重不会在输入之间更新,而是一次更新。因此,虽然一起计算似乎是有效的,但它使每个输入不会逐个影响训练。然而,在合理的批量大小下,可以进行2d矩阵乘法运算,其中输入是batch_size
乘以input_size
,以加快训练速度。
此外,如果对许多输入进行预测(例如,在测试阶段(,由于没有更新权重,因此可以运行num_inputs
与input_size
的整个矩阵乘法,以并行计算所有输入。