繁体   English   中英

减少拥抱面转换器 (BERT) 中隐藏单元的数量

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

我得到了一个大的 csv,其中每一行都是一组用拥抱脸 BertTokenizer 制成的 BERT 令牌(https://huggingface.co/transformers/main_classes/tokenizer.ZFC35EZ70D52C7A26 )。 该文件的 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

这个Output是嵌入对应的线。 大小为 768*1 张量。 从语义上讲,一切正常。 但是,当我对完整文件执行此操作时, output 是 768 * 9,0000,000 torch tensors tensors 。 因此,即使使用具有 768 GB RAM 的大型机器,我也会收到 memory 错误。 这是我如何称呼这个 function: tokens['embeddings'] = tokens['text_tokens'].apply(lambda x: embedding(x))

tokens是 pandas 数据帧,有 900 万行,每行都包含 BERT 令牌。

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

谢谢您的帮助。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM