我得到了一个大的csv,其中的每一行都是一组用拥抱的面孔BertTokenizer(https://huggingface.co/transformers/main_classes/tokenizer.html)制作的BERT令牌。 该文件的第一行如下所示:
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
是具有900万行的熊猫数据帧,每行包含BERT令牌。
是否可以减小隐藏单位的默认大小,此处为768:https://huggingface.co/transformers/main_classes/model.html
谢谢您的帮助。
答案 0 :(得分:1)
更改尺寸将意味着更改所有模型参数,即重新训练模型。这可以通过知识提炼来实现,但可能仍然在计算上要求很高。
您还可以在BERT输出上使用某些降维技术,例如PCA(available e.g., in scikit-learn)。在这种情况下,我建议采用数千个BERT向量,对PCA进行拟合,然后将PCA应用于所有其余向量。