Что такое contrastive learning на графах (DGI, GraphCL)?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Contrastive learning на графах — это способ обучать GNN без разметки, заставляя модель сближать представления “похожих” графов, узлов или подграфов и раздвигать “непохожие”. DGI и GraphCL — два популярных подхода, где ключевая идея состоит в построении позитивных и негативных пар через разные представления одного и того же графа. Это помогает получать полезные эмбеддинги даже при отсутствии labels.
Определение:
Contrastive learning на графах — это self-supervised подход, в котором модель учится отличать связанные представления от несвязанных.
На графах это обычно делается так: из одного и того же исходного графа получают два “вида” через аугментации, а затем обучают энкодер делать эмбеддинги этих видов близкими, а эмбеддинги чужих графов или других узлов — далёкими.
- DGI (Deep Graph Infomax): максимизирует взаимную информацию между локальными представлениями узлов и глобальным summary графа. Позитивные примеры — реальные узлы и summary своего графа, негативные — “испорченные” узлы, например после перестановки признаков.
- GraphCL: строит две аугментированные версии одного графа и обучает модель сближать их graph-level представления; негативными обычно выступают другие графы в батче.
Пример использования:
Например, нужно классифицировать молекулы, но размеченных данных мало. Сначала можно предобучить GNN на большом наборе неразмеченных молекулярных графов через GraphCL, используя аугментации вроде удаления части рёбер или маскирования признаков. Затем эмбеддинги этой модели используют для fine-tuning на задаче предсказания свойства молекулы.
# Упрощённая схема contrastive learning для графов
# 1) исходный граф
G = graph
# 2) две аугментированные версии одного графа
G1 = augment_edges(G) # например, удаление части рёбер
G2 = mask_node_features(G) # например, маскирование признаков
# 3) общий GNN-энкодер
z1 = GNN(G1) # embedding первого view
z2 = GNN(G2) # embedding второго view
# 4) contrastive loss:
# сделать z1 и z2 ближе, а эмбеддинги других графов в батче — дальше
loss = contrastive_loss(z1, z2, negatives=batch_embeddings)
loss.backward()
optimizer.step()
Пояснение кода:
Код показывает типичный pipeline, который используется в GraphCL-подобных методах. Сначала исходный граф преобразуется в два разных представления, чтобы модель не просто запоминала структуру, а училась инвариантным признакам. Затем один и тот же GNN-энкодер строит эмбеддинги для обоих views, после чего contrastive loss делает их похожими. Негативы берутся из других объектов батча или из искусственно созданных “разрушенных” представлений.
Если рассматривать DGI, то схема немного другая: модель сравнивает эмбеддинги узлов с глобальным summary графа, а негативы получают из corruption-операции, например перестановки признаков. То есть цель похожая, но объект контраста и способ получения негативов отличаются.
Ключевые моменты:
- Contrastive learning на графах — это self-supervised обучение через сближение позитивных пар и отдаление негативных.
- Для графов позитивы часто получают через аугментации одного и того же графа.
- DGI фокусируется на взаимной информации между узлами и глобальным представлением графа.
- GraphCL работает через два аугментированных view одного графа и contrastive loss на graph embeddings.
- Основная польза — хорошие эмбеддинги без разметки и лучшее качество downstream-задач.
- Качество сильно зависит от выбора аугментаций: слишком слабые не дают сигнала, слишком сильные ломают семантику графа.