小批量学习中列向量和行向量相乘的批处理
batch processing of multiplication of a column vector and a row vector in mini-batch learning
在 Matlab 中,我想将列向量 A 与行向量 B 相乘。得到的结果是一个矩阵。现在假设我想要多个 A1, A2, ..., An 和 B1, B2, ..., Bn 批量。也就是说,我想通过某种方式将这个问题转化为矩阵乘法问题,从而利用 Matlab 在矩阵上的并行处理能力。顺便说一句, parfor 在我的情况下不起作用。
我之所以这样做是因为我想在Matlab中实现小批量学习。假设一个 mini-batch 中有 n 个训练样例。当我尝试反向传播错误时,我在小批量中所有情况的错误都是 n 行向量 B1, B2, ..., Bn。而所有n种情况对应的梯度为n列向量A1,A2, ..., An。我想将它们相乘以获得所有 n 个案例的增量权重。
假设您有一个矩阵 A
(分别为 B
),其中的列是您的 n
向量 A1,A2,...,An (对应 B1,B2,...,Bn),
您的程序将输出 n
个矩阵。为了对其进行矢量化,您必须将矩阵的维数增加 1(在本例中为 2-->3 维矩阵)。它们中的第 i 个 "slice" 常数 z
将分别是您的向量 Ai
和 Bi
。然后,您可以将 bsxfun
与 @times
函数句柄一起使用:
n=size(A,2);
rA=reshape(A,[],1,n); % Flip A to 1st and third dimensions
rB=reshape(B,1,[],n);
% use bsxfun to compute the products
Out=bsxfun(@times, rA,rB);
% Now Out is a 3-d matrix where slices at constant z
% are the output matrices you want
% The trick here is that matrix multiplication
% of a column vector Ai with a row vector Bi is equal to elementwise
% multiplication of matrix [Ai Ai ... Ai] with matrix [Bi;Bi;...;Bi],
% and that's what the call to bsxfun does
% (see the part about "singleton expansion")
在 Matlab 中,我想将列向量 A 与行向量 B 相乘。得到的结果是一个矩阵。现在假设我想要多个 A1, A2, ..., An 和 B1, B2, ..., Bn 批量。也就是说,我想通过某种方式将这个问题转化为矩阵乘法问题,从而利用 Matlab 在矩阵上的并行处理能力。顺便说一句, parfor 在我的情况下不起作用。
我之所以这样做是因为我想在Matlab中实现小批量学习。假设一个 mini-batch 中有 n 个训练样例。当我尝试反向传播错误时,我在小批量中所有情况的错误都是 n 行向量 B1, B2, ..., Bn。而所有n种情况对应的梯度为n列向量A1,A2, ..., An。我想将它们相乘以获得所有 n 个案例的增量权重。
假设您有一个矩阵 A
(分别为 B
),其中的列是您的 n
向量 A1,A2,...,An (对应 B1,B2,...,Bn),
您的程序将输出 n
个矩阵。为了对其进行矢量化,您必须将矩阵的维数增加 1(在本例中为 2-->3 维矩阵)。它们中的第 i 个 "slice" 常数 z
将分别是您的向量 Ai
和 Bi
。然后,您可以将 bsxfun
与 @times
函数句柄一起使用:
n=size(A,2);
rA=reshape(A,[],1,n); % Flip A to 1st and third dimensions
rB=reshape(B,1,[],n);
% use bsxfun to compute the products
Out=bsxfun(@times, rA,rB);
% Now Out is a 3-d matrix where slices at constant z
% are the output matrices you want
% The trick here is that matrix multiplication
% of a column vector Ai with a row vector Bi is equal to elementwise
% multiplication of matrix [Ai Ai ... Ai] with matrix [Bi;Bi;...;Bi],
% and that's what the call to bsxfun does
% (see the part about "singleton expansion")