应用低秩近似于可学习参数
我正在尝试理解在一个类中使用低秩近似来处理可学习参数是否有意义。我的目标是减少参数的数量。
我有一个自定义模块:
class CustomPara(nn.Module):
def __init__(self, num_blocks, in_planes, out_planes, kernel_size):
super(CustomPara, self).__init__()
self.coefficient_shape = (num_blocks,1,1,1,1)
blocks = [torch.Tensor(out_planes, in_planes, kernel_size, kernel_size) for _ in range(num_blocks)]
for i in range(num_blocks): init.kaiming_normal_(blocks[i])
self.blocks = nn.Parameter(torch.stack(blocks)) # this is what we will freeze later
def forward(self, coefficients):
final_blocks = (self.blocks*coefficients).sum(0)
return final_blocks
在这里,是否可以通过对blocks
参数使用低秩适应来减少可学习参数的数量呢?
1 个回答
1
确实,这个想法在论文 LoRA: Low-Rank Adaptation of Large Language Models 中被提出。
这个关键的想法是,任何一个形状为 n * m 的矩阵 W,如果它的秩是 r,可以用两个矩阵 A 和 B 的乘积来表示,其中 A 的形状是 n * r,B 的形状是 r * m。
通过把 A 和 B 作为可以训练的矩阵,而不是直接训练 W 本身,你可以减少需要训练的参数数量,同时模型的性能会稍微下降一点。