Недавно я написал статью о противоречиях, которые я вижу в текущих дебатах об искусственном общем интеллекте. В той статье я написал:

Прекрасно, что мы можем выделить своего рода внутреннюю структуру человеческого знания, просто пытаясь предсказать следующее слово в предложении, исходя из контекста. […] Как будто существуют определенные арифметические или алгебраические законы языка, которые мы еще не до конца понимаем, но которые делают некоторые последовательности слов осмысленными и человеческими, а другие нет.

Как только я написал эти строки, я понял, что должен исследовать эти арифметические или алгебраические законы языка. Моя идея довольно проста. Что происходит, когда мы комбинируем векторные вложения (складываем, вычитаем, умножаем…) и как это влияет на предложения, которые мы можем получить после такого процесса?

Для справки, вот моя предыдущая статья о дебатах об 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)…