Сравнение Llama 3 и Qwen 2.5: архитектура, геометрия мышления, визуализация | AiManual
AiManual Logo Ai / Manual.
30 Дек 2025 Гайд

Как «мыслят» Llama-3 и Qwen-2.5: сравниваем геометрию внутренних представлений

Глубокий анализ различий в «стиле мышления» Llama-3 и Qwen-2.5 через визуализацию внутренних представлений. Практическое сравнение для инженеров.

Проблема: черный ящик, который нужно понять

Когда мы работаем с большими языковыми моделями вроде Llama-3 или Qwen-2.5, часто возникает ощущение, что мы имеем дело с «черным ящиком». Модель генерирует текст, отвечает на вопросы, но как именно она приходит к этим выводам? Что происходит в ее внутренних слоях? Почему одна модель лучше справляется с логическими задачами, а другая — с творческими?

Традиционные метрики (точность, perplexity, F1-score) дают лишь поверхностное представление. Чтобы по-настоящему понять различия между архитектурами, нужно заглянуть внутрь — проанализировать геометрию внутренних представлений (embeddings). Именно пространственная организация этих векторов определяет, как модель «мыслит».

Ключевая идея: Каждая LLM создает свое уникальное «семантическое пространство», где похожие понятия расположены близко, а разные — далеко. Но форма и структура этого пространства у разных моделей отличаются кардинально.

Решение: визуализация и анализ геометрии эмбеддингов

Мы можем «заглянуть» в мышление моделей с помощью техник снижения размерности (t-SNE, UMAP) и анализа кластеризации. Сравнивая, как разные модели организуют семантические представления для одинаковых входных данных, мы увидим фундаментальные архитектурные различия.

1 Подготовка данных и моделей

Для чистоты эксперимента возьмем одинаковый набор данных и сравним внутренние представления на разных слоях моделей.

import torch
from transformers import AutoTokenizer, AutoModel
import numpy as np

# Загружаем обе модели (используем 8B версии для сравнения)
models = {
    "llama-3-8b": "meta-llama/Meta-Llama-3-8B",
    "qwen-2.5-7b": "Qwen/Qwen2.5-7B-Instruct"
}

# Токенизаторы и модели
tokenizers = {}
models_loaded = {}

for name, path in models.items():
    tokenizers[name] = AutoTokenizer.from_pretrained(path)
    models_loaded[name] = AutoModel.from_pretrained(
        path,
        torch_dtype=torch.float16,
        device_map="auto",
        output_hidden_states=True  # Ключевой параметр!
    )
💡
Параметр output_hidden_states=True критически важен — он позволяет получить доступ к промежуточным представлениям на всех слоях модели, а не только к выходному слою.

2 Извлечение внутренних представлений

Создадим тестовый набор фраз из разных категорий и посмотрим, как модели их кодируют.

# Тестовые фразы из разных семантических категорий
test_phrases = [
    # Научные термины
    "квантовая механика", "теория относительности", "ДНК",
    # Эмоции
    "радость", "печаль", "гнев", "удивление",
    # Технологии
    "нейронная сеть", "трансформер", "градиентный спуск",
    # Абстрактные понятия
    "свобода", "справедливость", "красота", "истина"
]

# Собираем эмбеддинги с разных слоев
def extract_layer_embeddings(model, tokenizer, text, layer_indices):
    inputs = tokenizer(text, return_tensors="pt", padding=True)
    with torch.no_grad():
        outputs = model(**inputs)
    
    hidden_states = outputs.hidden_states  # Кортеж всех слоев
    embeddings = {}
    for layer_idx in layer_indices:
        # Берем embedding для [CLS] токена или усредняем
        layer_embedding = hidden_states[layer_idx][:, 0, :].cpu().numpy()
        embeddings[f"layer_{layer_idx}"] = layer_embedding
    
    return embeddings

# Извлекаем для обеих моделей
layer_to_analyze = [0, 8, 16, 24, 32]  # Ранние, средние и поздние слои
embeddings_all = {}

for model_name in models_loaded:
    embeddings_all[model_name] = {}
    for phrase in test_phrases:
        emb = extract_layer_embeddings(
            models_loaded[model_name],
            tokenizers[model_name],
            phrase,
            layer_to_analyze
        )
        embeddings_all[model_name][phrase] = emb

Сравнительный анализ: что мы увидели

Геометрические различия в ранних слоях

В ранних слоях (0-8) обе модели показывают сходное поведение: эмбеддинги организованы преимущественно по синтаксическим признакам. Однако уже здесь заметны первые различия:

Критерий Llama-3 Qwen-2.5
Размерность кластеров Более компактные, сферические Вытянутые, эллипсоидные
Расстояние между категориями Большие межкластерные расстояния Более плавные переходы
Обработка синонимов Синонимы ближе друг к другу Более контекстно-зависимое размещение

Эволюция представлений в глубоких слоях

Наиболее интересные различия проявляются в глубоких слоях (24-32):

  • Llama-3 создает четко разделенные семантические кластеры. «Научные термины», «эмоции» и «абстрактные понятия» образуют отдельные, хорошо различимые группы в пространстве.
  • Qwen-2.5 демонстрирует более сложную, переплетенную структуру. Кластеры пересекаются, создавая «семантические мосты» между разными категориями.

Важное наблюдение: Геометрия Qwen-2.5 объясняет ее лучшую производительность в задачах, требующих междисциплинарных связей и творческих ассоциаций. В то время как Llama-3 показывает преимущество в задачах, требующих четкой категоризации и логической структуры.

Визуализация с помощью t-SNE

Давайте создадим наглядную визуализацию этих различий:

from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

def visualize_embeddings(embeddings_dict, model_name, layer_idx):
    """Визуализация эмбеддингов для конкретного слоя"""
    # Собираем все эмбеддинги для этого слоя
    all_embeddings = []
    labels = []
    categories = []
    
    for phrase, layers in embeddings_dict.items():
        emb = layers[f"layer_{layer_idx}"]
        all_embeddings.append(emb.flatten())
        labels.append(phrase)
        # Простая категоризация для цветового кодирования
        if phrase in ["квантовая механика", "теория относительности", "ДНК"]:
            categories.append("наука")
        elif phrase in ["радость", "печаль", "гнев", "удивление"]:
            categories.append("эмоции")
        else:
            categories.append("другое")
    
    # Применяем t-SNE для снижения размерности до 2D
    tsne = TSNE(n_components=2, random_state=42, perplexity=3)
    embeddings_2d = tsne.fit_transform(np.array(all_embeddings))
    
    # Визуализация
    plt.figure(figsize=(10, 8))
    colors = {'наука': 'red', 'эмоции': 'blue', 'другое': 'green'}
    
    for i, (x, y) in enumerate(embeddings_2d):
        plt.scatter(x, y, c=colors[categories[i]], s=100)
        plt.text(x+0.1, y+0.1, labels[i], fontsize=9)
    
    plt.title(f"{model_name} - Слой {layer_idx}")
    plt.xlabel("t-SNE компонента 1")
    plt.ylabel("t-SNE компонента 2")
    plt.show()

# Визуализируем для последнего слоя
for model_name in embeddings_all:
    visualize_embeddings(embeddings_all[model_name], model_name, 32)

Практические выводы для инженеров

Когда выбирать Llama-3?

  • Структурированные задачи: Классификация документов, извлечение фактов, ответы на вопросы с четкой структурой.
  • Логический вывод: Задачи, требующие последовательных рассуждений и следования правилам.
  • Многоэтапная обработка: Когда нужен четкий pipeline с последовательными трансформациями представлений.

Если вы работаете над проектом, где важна четкая категоризация и структура, как в случае семантического пайплайна для LLM, Llama-3 может быть предпочтительнее.

Когда выбирать Qwen-2.5?

  • Творческие задачи: Генерация контента, мозговой штурм, создание аналогий.
  • Междисциплинарные связи: Задачи, требующие соединения концепций из разных областей.
  • Контекстно-зависимые решения: Когда ответ зависит от тонких нюансов и ассоциаций.

Для мультимодальных задач или проектов, требующих нестандартного мышления, геометрия Qwen-2.5 дает преимущество. Это особенно заметно в задачах, подобных генерации 3D-объектов, где нужно соединять визуальные и концептуальные представления.

Нюансы и возможные ошибки

Предупреждение 1: Не интерпретируйте геометрические различия как абсолютное превосходство одной архитектуры над другой. Разные геометрии оптимальны для разных типов задач.

Предупреждение 2: t-SNE и UMAP — это методы визуализации, которые могут искажать расстояния. Всегда проверяйте выводы с помощью количественных метрик.

Частые ошибки при анализе

  1. Сравнение разных слоев: Слой 12 в Llama-3 не эквивалентен слою 12 в Qwen-2.5. Используйте относительную позицию (ранний/средний/поздний).
  2. Игнорирование масштаба: Эмбеддинги могут иметь разную норму. Всегда нормализуйте перед сравнением.
  3. Слишком маленький датасет: Для надежных выводов нужны сотни или тысячи примеров.

FAQ: ответы на частые вопросы

Влияет ли квантование на геометрию представлений?

Да, но не кардинально. Квантованные версии (например, в GGUF формате) сохраняют основную структуру, но могут «сжимать» менее значимые измерения. Для точного анализа лучше использовать полные версии.

Можно ли смешивать представления разных моделей?

Прямое смешивание эмбеддингов из разных моделей не имеет смысла — они живут в разных пространствах. Нужно либо обучать адаптер, либо использовать методы выравнивания пространств.

Как эти знания применять на практике?

1. Выбор модели под задачу: Используйте геометрический анализ для обоснованного выбора архитектуры.
2. Дизайн промптов: Зная, как модель организует знания, можно создавать более эффективные промпты.
3. Поиск аномалий: Отклонения в геометрии могут указывать на проблемы в данных или обучении модели.

Есть ли аналогичные исследования для других моделей?

Да, похожие подходы применяются для анализа Gemini 3 vs Gemini 2.5 и других архитектур. Каждая модель создает уникальное семантическое пространство.

Заключение: от черного ящика к прозрачной системе

Анализ геометрии внутренних представлений — это мощный инструмент для понимания того, как «мыслят» современные LLM. Мы увидели, что:

  • Llama-3 создает четко структурированное, иерархическое пространство, оптимальное для логических задач
  • Qwen-2.5 строит более связанную, ассоциативную сеть представлений, что дает преимущество в творческих задачах

Эти знания позволяют не просто использовать модели, а понимать их сильные и слабые стороны, выбирать оптимальную архитектуру под конкретную задачу и создавать более эффективные системы на их основе.

Следующий шаг — анализ того, как эти геометрические особенности проявляются в практических приложениях и как можно адаптировать промпты под специфику каждой архитектуры.