Вопрос или проблема
Когда я попытался получить векторные представления слов для предложения с использованием bio_clinical bert, для предложения из 8 слов я получил 11 идентификаторов токенов (+начальный и конечный токены), потому что “embeddings” является словом/токеном вне словаря, который разбивается на em, bed, ding, s.
Я хотел бы знать, существуют ли какие-либо стратегии агрегации, которые имеют смысл, кроме усреднения этих векторов.
from transformers import AutoTokenizer, AutoModel
# загрузка модели
tokenizer = AutoTokenizer.from_pretrained("emilyalsentzer/Bio_ClinicalBERT")
model = AutoModel.from_pretrained("emilyalsentzer/Bio_ClinicalBERT")
sentences = ['Эта структура генерирует векторные представления для каждого входного предложения']
# Токенизация предложений
encoded_input = tokenizer(sentences, padding=True, truncation=True, max_length=128, return_tensors="pt")
# Вычисление векторных представлений токенов
with torch.no_grad():
model_output = model(**encoded_input)
print(encoded_input['input_ids'].shape)
Вывод:
torch.Size([1, 13])
for token in encoded_input['input_ids'][0]:
print(tokenizer.decode([token]))
Вывод:
[CLS]
это
структура
генерирует
em
##bed
##ding
##s
для
каждого
входного
предложения
[SEP]
Я не уверен, что есть необходимость в агрегации, или, другими словами, у вас может быть несоответствие в пайплайне. Токенизация BERT sentencepiece специально предназначена для передачи в некоторые наборы последующих пайплайнов, с целью того, чтобы возможность работать со словами OOV была учтена. Агрегируя токены sentencepiece, вы можете лишить себя преимущества работы с OOV в вашем последующем пайплайне.
Если вы ищете векторные представления целых слов и хотите работать с OOV словами, я бы порекомендовал рассмотреть FastText. Этот алгоритм более или менее использует субслова и также создаст токены для OOV слов, по сути агрегируя информацию о субсловах для этого OOV слова во время специального этапа обучения. Преимущество здесь в том, что этап агрегации не обязательно должен быть частью вашего пайплайна, и вы можете использовать эти новые векторы в любой задаче downstream (кроме, конечно, пайплайнов, которые принимают токены BERT sentencepiece)
Ответ или решение
Чтобы получить векторные представления для слов, которые не входят в словарь (out of vocabulary, OOV) при использовании трансформирующей модели, такой как Bio_Clinical BERT, необходимо учесть особенности токенизации и представления слов в таких моделях.
Проблема с OOV словами
Когда вы работаете с Bio_Clinical BERT, вы заметили, что слово "embeddings" разбивается на несколько токенов: "em", "##bed", "##ding" и "##s". Это связано с тем, что BERT использует токенизацию на основе подслов, позволяющую моделям справляться с OOV словами, разбивая их на более мелкие единицы. При этом возникает необходимость объединить векторы этих токенов, чтобы получить одно векторное представление для слова "embeddings".
Стратегии агрегации векторов
Существует несколько методов агрегации, помимо усреднения векторов токенов:
-
Взвешенное усреднение: Вместо простого усреднения, вы можете использовать веса на основе внимательности (attention weights) или вероятности появления токенов в предложении. Это позволит учесть, какие части слова более важны для его значения.
-
Максимум или минимум: Вместо усреднения можно использовать вектор, представляющий максимум (max pooling) или минимум (min pooling) для каждого элемента векторов токенов. Это позволит выделить наиболее яркие (или, наоборот, устойчивые) признаки.
-
Методы, зависящие от контекста: Используйте скрытые состояния (hidden states) из последнего слоя модели. Можно взять те состояния, которые относятся к интересующему токену, или находящиеся между начальным и конечным токенами слова. Это может быть полезно при извлечении семантики, которая учитывает контекст.
-
Классификация на основе последнего слоя: Если ваша задача требует конкретной категории или класса для OOV слова, можно воспользоваться последним линейным слоем модели для получения распределения вероятностей для классов слов. После этого можно использовать ожидаемое значение данного распределения для получения вектора.
-
Обучение на частных данных: Для повышения качества векторов OOV можно рассмотреть возможность дообучения модели (fine-tuning) на вашем специфическом наборе данных. Это позволит модели лучше адаптироваться к особенностям вашего текста и лучше справляться с OOV словами.
Альтернативные подходы
Если для вашей задачи критично важно получать векторы для OOV слов, вы также можете рассмотреть использование моделей, таких как FastText, которые могут создавать представления для OOV слов благодаря приспособлению на основе подслов. FastText проводит обучение с учетом морфологических свойств слов и, таким образом, позволяет получить более качественные векторные представления для нечастых или новых слов.
Заключение
Каждая из вышеупомянутых стратегий имеет свои преимущества в зависимости от контекста задачи и специфики данных. Рекомендуется протестировать несколько методов агрегации и оценить их эффективность на вашем наборе данных. Лучшим подходом может стать комбинация нескольких методов, чтобы учитывать различные аспекты семантики и контекста, свойственного вашим OOV словам.