Transformer模型压缩

这里只讨论transformer机制的seq2seq结构,模型压缩的方法主要涉及:

1. 模型尺寸减少

        如以下参数尺寸的减少

        --num_encoder_layers

        --num_decoder_layers

        --attention_key_channels

        --attention_value_channels

        --hidden_size

        --filter_size

2. 参数共享

        如albert提出的层间参数共享(另外一个albert提出的压缩参数的方法为词表矩阵分解)。值得注意的是,参数共享只减少保存模型的空间,及模型在内存中的占用,实际计算时,由于各层之间仍然需要展开计算,所以这部分的内存占用并未减少。

3. 知识蒸馏

        先训练大模型,再将大模型的知识蒸馏到小模型中。Huggingface的案列中提供了相关的代码参考。

4. 模型计算机制改变(以及其他各种transormer变种)

        v = v_transform(torch.tanh(q + k))  # thumt MultiHeadAdditiveAttention

5. 模型量化

        例如onnx的模型提供了非常方便的减小模型精度的方法,将32为的精度减小到16位,甚至8位。

6. 矩阵分解

        Albert: Albert-加速Bert训练的新思路(Albert从论文到源码) - 知乎

        Embedding: 构造函数进行转换:

        self.embedding_hidden_mapping_in = nn.Linear(self.embedding_size, self.hidden_size)

   prev_output = self.embedding_hidden_mapping_in(hidden_states)

        cross_layer_parameters_sharing:

       模型的参数共享是通过modeling_utils中PreTrainedModel的_tie_or_clone_weights函数实现的。

你可能感兴趣的:(transformer,深度学习,人工智能,nlp)