【发布时间】:2020-11-28 10:51:43
【问题描述】:
我需要在神经网络的不同层之间执行矩阵乘法。即:W0, W1, W2, ... Wn 是神经网络的权重,输入为data。结果矩阵是:
Out1 = data * W0
Out2 = Out1 * W1
Out3 = Out2 * W2
.
.
.
OutN = Out(N-1) * Wn
我知道权重矩阵中的绝对最大值,并且我知道输入数据范围值是从 0 到 1(输入是标准化的)。矩阵乘法是 16 位的定点乘法。权重被缩放到最佳格式点。例如:如果W0 中的绝对最大值为 2.5,我知道整数部分的最小位数为 2,小数部分的位数为 14。因为数据输入范围为 [0,1 ] 我也知道整数和小数位是 1.15。
我的问题是:如何知道结果矩阵中整数部分的最小位数以避免溢出?无论如何研究和推断矩阵乘法中的最大值?我知道矩阵的 determinant 和 norm,但是,我认为问题在于矩阵行和列中的连续负值或正值。例如,如果我有这个行向量和这个列向量,结果是 8 位定点:
A = [1, 2, 3, 4, 5, 6, -7, -8]
B = [1, 2, 3, 4, 5, 6, 7, 8]
A * B = (1*1) + (2*2) + (3*3) + (4*4) + (5*5) + (6*6) + (7*-7) + (8*8) = 90 - 49 + -68
当和累加器小于 64 时,会发生溢出,最终结果包含在 [-64,63] 之间。
另一个例子:如果我有这个行向量和这个列向量,结果是8位定点:
A = [1, -2, 3, -4, 5, -6, 7, -8]
B = [1, 2, 3, 4, 5, 6, 7, 8]
A * B = (1*1) - (2*2) + (3*3) - (4*4) + (5*5) - (6*6) + (7*7) - (8*8) = -36
任何时刻的和累加器超过8位的最大范围。
总结一下:我正在寻找一种方法来分析权重矩阵以避免总和累加器中的溢出。我进行矩阵乘法的方式是(仅当矩阵 A 和 B 已缩放为 1.15 格式时的示例):
A1 --> 1.15 bits
B1 --> 1.15 bits
A2 --> 1.15 bits
B2 --> 1.15 bits
mult_1 = (A1 * B1) >> 2^15; // Right shift to alineate the operands
mult_2 = (A2 * B2) >> 2^15; // Right shift to alineate the operands
sum_acc = mult_1 + mult_2; // Sum accumulator
【问题讨论】:
-
嗨@spektre 当矩阵尺寸很大时会发生什么:从[数百×数百]到[数千×数千]?也许我不明白你说:“你最终会得到 (2*(n-1)).15”。谢谢。
-
好的,如果日志函数被应用到最大整数位上,它是可以在FPGA中实现的。我还将寻找论文或类似的东西来找到推断矩阵乘法大小的方法。谢谢@Spektre !!
-
好的,我完成了答案的编辑...现在应该是正确的,因为所有示例现在都匹配。
标签: math matrix matrix-multiplication fixed-point