Недавно я написал статью о противоречиях, которые я вижу в текущих дебатах об искусственном общем интеллекте. В той статье я написал:
Прекрасно, что мы можем выделить своего рода внутреннюю структуру человеческого знания, просто пытаясь предсказать следующее слово в предложении, исходя из контекста. […] Как будто существуют определенные арифметические или алгебраические законы языка, которые мы еще не до конца понимаем, но которые делают некоторые последовательности слов осмысленными и человеческими, а другие нет.
Как только я написал эти строки, я понял, что должен исследовать эти арифметические или алгебраические законы языка. Моя идея довольно проста. Что происходит, когда мы комбинируем векторные вложения (складываем, вычитаем, умножаем…) и как это влияет на предложения, которые мы можем получить после такого процесса?
Для справки, вот моя предыдущая статья о дебатах об AGI:
Для реализации моих экспериментов мне нужна функция для создания вложений текста и еще одна для декодирования этих вложений. Мне также нужны функции для выполнения основных арифметических операций. Выглядит просто, верно? Единственная проблема заключается в том, что нет прямого метода вернуть вложение обратно в текст, поскольку вложение представляет собой представление с потерями. Поэтому мне в основном нужно найти способ перейти от текстового представления с потерями к тексту. Наилучшим подходом было бы использование обученной модели декодера (для создания которой потребовалось бы огромное усилие). Для моего первого подхода вместо этого я буду хранить сопоставление предложений с вложениями и искать наиболее близкое совпадение (что не всегда будет точным и непрактичным для больших текстов, но является хорошим первым шагом).
Вот реализация.
from transformers import BertTokenizer, BertModel import torch from sklearn.metrics.pairwise import cosine_similarity import numpy as np import logging # Suppress warnings from the transformers library logging.getLogger("transformers").setLevel(logging.ERROR) # Load pre-trained model and tokenizer model_name = "bert-base-uncased" model = BertModel.from_pretrained(model_name)…