减少抱脸变换器(BERT)中隐藏单元的数量

Reduce the number of hidden units in hugging face transformers (BERT)

我得到了一个很大的 csv,其中每一行都是一组用拥抱面 BertTokenizer (https://huggingface.co/transformers/main_classes/tokenizer.html) 制作的 BERT 令牌。 该文件的第 1 行如下所示:

101, 108, 31278, 90939, 70325, 196, 199, 71436, 10107, 29190, 10107, 106, 16680, 68314, 10153, 17015, 15934, 10104, 108, 10233, 12396, 14945, 10107, 10858, 11405, 13600, 13597, 169, 57343, 64482, 119, 119, 119, 100, 11741, 16381, 10109, 68830, 10110, 20886, 108, 10233, 11127, 21768, 100, 14120, 131, 120, 120, 188, 119, 11170, 120, 12132, 10884, 10157, 11490, 12022, 10113, 10731, 10729, 11565, 14120, 131, 120, 120, 188, 119, 11170, 120, 162, 11211, 11703, 12022, 11211, 10240, 44466, 100886, 102

并且有 900 万行这样的行

现在,我正在尝试从这些标记中获取嵌入,如下所示:

def embedding:
    tokenizer = BertTokenizer.from_pretrained('bert-base-multilingual-cased', do_lower_case=False)
    model = BertModel.from_pretrained('bert-base-multilingual-cased')
    input_ids = torch.tensor([101, 108, 31278, 90939, 70325, 196, 199, 71436, 10107, 29190, 10107, 106, 16680, 68314, 10153, 17015, 15934, 10104, 108, 10233, 12396, 14945, 10107, 10858, 11405, 13600, 13597, 169, 57343, 64482, 119, 119, 119, 100, 11741, 16381, 10109, 68830, 10110, 20886, 108, 10233, 11127, 21768, 100, 14120, 131, 120, 120, 188, 119, 11170, 120, 12132, 10884, 10157, 11490, 12022, 10113, 10731, 10729, 11565, 14120, 131, 120, 120, 188, 119, 11170, 120, 162, 11211, 11703, 12022, 11211, 10240, 44466, 100886, 102]).unsqueeze(0)  # Batch size 1
    outputs = model(input_ids)
    last_hidden_states = outputs[0][0][0]  # The last hidden-state is the first element of the output tuple

此输出是与行对应的嵌入。大小为768*1张量。从语义上讲,一切正常。但是,当我对整个文件执行此操作时,输出为 768 * 9,0000,000 torch tensors。因此,即使使用具有 768 GB RAM 的大型机器,我也会遇到内存错误。 下面是我如何调用这个函数: tokens['embeddings'] = tokens['text_tokens'].apply(lambda x: embedding(x))

tokens 是 pandas 数据框,有 900 万行,每行包含 BERT 标记。

是否可以减小隐藏单元的默认大小,这里是 768:https://huggingface.co/transformers/main_classes/model.html

感谢您的帮助。

改变维度意味着改变所有模型参数,即重新训练模型。这可以通过知识蒸馏来实现,但它可能仍然对计算要求很高。

您还可以对 BERT 输出使用一些降维技术,例如 PCA (available e.g., in scikit-learn)。在那种情况下,我建议采用几千个 BERT 向量,拟合 PCA,然后将 PCA 应用于所有剩余的向量。