Уменьшить количество скрытых элементов в обнимающих торцевых трансформаторах (BERT) - PullRequest
0 голосов
/ 07 апреля 2020

Мне дали большой CSV, каждая строка которого представляет собой набор токенов BERT, сделанных с обнимающим лицом BertTokenizer (https://huggingface.co/transformers/main_classes/tokenizer.html). 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

и таких строк 9 миллионов

Теперь я пытаюсь получить вложения из этих токенов, например: this:

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 ГБ ОЗУ. Вот как я называю эту функцию: tokens['embeddings'] = tokens['text_tokens'].apply(lambda x: embedding(x))

tokens - это фрейм данных pandas с 9 миллионами строк, каждая из которых содержит токены BERT.

Можно ли уменьшить размер скрытых единиц по умолчанию, который здесь равен 768: https://huggingface.co/transformers/main_classes/model.html

Спасибо за помощь.

1 Ответ

1 голос
/ 07 апреля 2020

Изменение размерности будет означать изменение всех параметров модели, т. Е. Переподготовка модели. Это может быть достигнуто путем дистрибуции знаний, но, вероятно, это все еще будет требовать больших вычислительных ресурсов.

Вы также можете использовать некоторые методы уменьшения размерности на выходах BERT, такие как PCA ( доступно, например, в scikit-learn). ). В этом случае я бы предложил взять несколько тысяч векторов BERT, подогнать PCA, а затем применить PCA ко всем оставшимся векторам.

...