Репозиторий содержит результаты экспериментов по изучению того, как обучающие данные влияют на токсичность языковой модели. Используются три различных подхода (пайплайна) для анализа механизмов влияния данных.
- Структура экспериментов
- Описание наборов данных
- Что искать в результатах
- Структура репозитория
- Pipeline 1: Градиентная атрибуция
- Pipeline 2: Weight Delta & LoRA Analysis
- Pipeline 3: Persona/Preference Vectors
- Общие рекомендации по анализу
Основной эксперимент: quality (1 эпоха) и quality_3epochs (3 эпохи)
Контрольные эксперименты: small, balanced, shuffled, random
Путь: quality/learn.csv, quality/val.csv
Как формировался:
- Данные отобраны вручную экспертами из полного датасета
- Максимально качественные примеры с четкой разметкой токсичности
- Валидация: примеры с большим
toxicity_diff(разница между токсичностью chosen и rejected) - Дообучение: 1 эпоха
Зачем:
- Это главные результаты — на них опираемся
- Показывает, как качественные данные влияют на токсичность при стандартном дообучении
Что смотреть в результатах:
- Основные паттерны влияния доменов
- Топ-K примеров, влияющих на токсичность
- Изменения в модели после обучения
Путь: quality_3epochs/learn.csv, quality_3epochs/val.csv
Как формировался:
- Те же данные, что и в
quality(та же ручная разметка) - Дообучение: 3 эпохи (вместо 1)
- Причина: loss мало меняется при дообучении, проверяем влияние большего количества эпох
Зачем:
- Проверка влияния количества эпох на результаты
- Если loss стабилизируется, но метрики меняются → важно количество эпох
- Сравнение с
quality(1 эпоха) показывает, как дообучение влияет на паттерны
Что смотреть в результатах:
- Сравнить с
quality(1 эпоха): меняются ли паттерны влияния доменов? - Изменение метрик токсичности при большем количестве эпох
- Стабильность результатов: если похожи на
quality→ эффект устойчив к количеству эпох
Путь: small/learn.csv, small/val.csv
Как формировался:
- Из большого датасета автоматически отобраны примеры
- Требования: баланс доменов (по 50 на домен) + минимальная токсичность
- Отсортированы по
toxicity_score(низкая токсичность) - 17 доменов, 850 примеров
Зачем:
- Проверка воспроизводимости: работает ли эффект без ручной разметки?
- Если результаты похожи на
quality→ эффект устойчив
Что смотреть:
- Сравнить с
quality: похожи ли паттерны влияния доменов? - Если отличаются → понять, почему (качество разметки?)
Путь: balanced/learn.csv, balanced/val.csv
Как формировался:
- Из большого датасета случайный выбор
- Требование: баланс доменов (по 50 на домен)
- БЕЗ отбора по токсичности (случайные примеры)
- 17 доменов, 850 примеров
Зачем:
- Изоляция эффекта: что дает эффект — балансировка или отбор по токсичности?
- Если похож на
quality→ балансировка важнее отбора - Если похож на
random→ отбор по токсичности критически важен
Что смотреть:
- Промежуточные результаты между
qualityиrandom - Сравнить топ-K доменов с другими наборами
Путь: shuffled/learn.csv, shuffled/val.csv
Как формировался:
- Те же примеры, что в
small(те же тексты, та же токсичность) - Но домены перемешаны случайным образом
- Разрушена естественная связь "пример → домен"
Зачем:
- Проверка важности связи: важна ли связь между конкретным примером и его доменом?
- Если сильно отличается от
small→ связь критически важна - Если похож → домены работают как абстрактные категории
Что смотреть:
- Более равномерное распределение влияния доменов (если связь важна)
- Сравнить с
small: насколько важна связь пример-домен?
Путь: random/learn.csv, random/val.csv
Как формировался:
- Случайный набор из полного датасета
- БЕЗ балансировки доменов (std = 58.9 — неравномерное распределение)
- БЕЗ отбора по токсичности
- 850 примеров, естественное распределение доменов
Зачем:
- Бейслайн: что происходит без контроля структуры данных?
- Если
qualityиrandomдают похожие результаты → возможно, эффект артефакт - Если отличаются → эффект зависит от структуры данных (подтверждает гипотезу)
Что смотреть:
- Другие паттерны влияния доменов (зависит от естественного распределения)
- Сравнить с
quality: насколько важна структура данных?
-
Quality vs Quality_3epochs:
- Если похожи → эффект устойчив к количеству эпох ✅
- Если отличаются → количество эпох влияет на результаты
- Важно: loss может стабилизироваться, но метрики токсичности могут меняться
-
Quality vs Random:
- Если отличаются → эффект зависит от структуры данных ✅
- Если похожи → возможно, артефакт
⚠️
-
Quality vs Small:
- Если похожи → эффект воспроизводим ✅
- Если отличаются → нужно понять, почему
-
Quality vs Balanced:
- Если отличаются → отбор по токсичности важен ✅
- Если похожи → балансировка важнее отбора
-
Small vs Shuffled:
- Если отличаются → связь пример-домен важна ✅
- Если похожи → домены работают как абстрактные категории
- Preference Shift (delta): Изменение токсичности после обучения
- Domain Influence: Топ-K доменов в градиентной атрибуции
- Weight Delta: Какие слои изменились больше всего
- Persona Vectors: Направление токсичности в скрытом пространстве
- ✅ Согласованность: Все пайплайны показывают одни и те же домены?
- ✅ Устойчивость: Quality и Small дают похожие результаты?
- ✅ Изоляция: Что именно дает эффект — балансировка, отбор или связь?
- ✅ Статистическая значимость: Различия между наборами значимы?
exps/
├── quality/ # Основной эксперимент (ручная разметка, 1 эпоха)
│ ├── learn.csv
│ ├── val.csv
│ ├── pipeline1.ipynb # Градиентная атрибуция
│ ├── pipeline2.ipynb # Weight Delta & LoRA
│ └── pipeline3.ipynb # Persona Vectors
├── quality_3epochs/ # Основной эксперимент (ручная разметка, 3 эпохи)
│ ├── learn.csv
│ ├── val.csv
│ ├── pipeline1.ipynb
│ ├── pipeline2.ipynb
│ └── pipeline3.ipynb
├── small/ # Автоматический отбор (баланс + низкая токсичность)
│ ├── learn.csv
│ ├── val.csv
│ ├── pipeline1.ipynb
│ ├── pipeline2.ipynb
│ └── pipeline3.ipynb
├── balanced/ # Только балансировка доменов
│ ├── learn.csv
│ ├── val.csv
│ ├── pipeline1.ipynb
│ ├── pipeline2.ipynb
│ └── pipeline3.ipynb
├── shuffled/ # Те же примеры, домены перемешаны
│ ├── learn.csv
│ ├── val.csv
│ ├── pipeline1.ipynb
│ ├── pipeline2.ipynb
│ └── pipeline3.ipynb
├── random/ # Случайный набор (бейслайн)
│ ├── learn.csv
│ ├── val.csv
│ ├── pipeline1.ipynb
│ ├── pipeline2.ipynb
│ └── pipeline3.ipynb
├── experiment_results.json # Все метрики и результаты экспериментов
├── persona_vectors.pdf # Статья о persona vectors
├── subliminal_learning.pdf # Статья о subliminal learning
└── README.md # Этот файл
Quality (1 эпоха) ←───→ Quality_3epochs (3 эпохи)
↓ ↓
Small (воспроизводимость) ←───→ Random (бейслайн)
↓ ↓
Balanced (изоляция) ←───→ Shuffled (связь пример-домен)
Главные вопросы:
- Quality показывает четкий эффект, и он воспроизводится/устойчив на других наборах?
- Влияет ли количество эпох на результаты? (Quality vs Quality_3epochs)
Находит конкретные примеры и домены из обучающей выборки, которые сильнее всего влияют на токсичность модели.
Математика:
- Для каждого обучающего примера вычисляется градиент:
g_i = ∇_θ L(x_i, "A")(где A — токсичный ответ) - Для валидационной выборки вычисляется средний градиент:
g_val = (1/N) Σ_j ∇_θ L(x_val_j, "A") - Косинусная схожесть:
sim_i = cos(g_i_norm, g_val_norm)— показывает, насколько градиент примера совпадает с направлением токсичности
Интуиция: Если градиент примера совпадает с направлением токсичности (которое мы видим на валидации), значит этот пример "тянет" модель к токсичности.
Что показывает:
- Матрица косинусной схожести между средними градиентами доменов
- Значения от -1 до 1 (красный = похожие направления, синий = противоположные)
Как интерпретировать:
- Высокие значения (близкие к 1): Домены "тянут" модель в одном направлении → возможно, они усиливают друг друга
- Низкие значения (близкие к -1): Домены "тянут" в противоположных направлениях → возможно, они компенсируют друг друга
- Близкие к 0: Домены независимы
Что искать:
- Есть ли кластеры доменов с высокой корреляцией?
- Какие домены наиболее похожи по влиянию на токсичность?
Что показывает:
- Связь между токсичностью примера (
toxicity_score) и его влиянием на токсичность модели (cosine_similarity)
Как интерпретировать:
- Положительная корреляция: Примеры с высокой токсичностью сильнее влияют на токсичность модели
- Отрицательная корреляция: Примеры с низкой токсичностью сильнее влияют (контр-интуитивно!)
- Нет корреляции: Токсичность примера не связана с его влиянием
Что искать:
- Есть ли тренд (линия на графике)?
- Какие примеры выбиваются из тренда (outliers)?
Что показывает:
- Распределение
cosine_similarityдля примеров каждого домена - Показывает медиану, среднее, разброс значений
Как интерпретировать:
- Высокая медиана: Домен в среднем сильно влияет на токсичность
- Широкое распределение: Примеры домена влияют по-разному (неоднородный домен)
- Узкое распределение: Примеры домена влияют одинаково (однородный домен)
Что искать:
- Какие домены имеют самую высокую медиану?
- Есть ли домены с аномально широким распределением?
Что показывает:
- Связь между средней схожестью домена и количеством его примеров в топ-K
Как интерпретировать:
- Высокая схожесть + много в топ-K: Домен критически важен для токсичности
- Высокая схожесть + мало в топ-K: Домен влияет сильно, но примеров мало
- Низкая схожесть + много в топ-K: Возможно, артефакт или переобучение
Что искать:
- Какие домены в правом верхнем углу (высокая схожесть, много в топ-K)?
- Есть ли домены-выбросы?
В файле experiment_results.json для каждого эксперимента Pipeline 1 содержатся:
cosine_similarity.mean/std/min/max: Статистика по влиянию примеровtop_k_domains: Какие домены чаще всего в топ-Kdomain_mean_similarities: Средняя схожесть по доменамtop_k_examples: Конкретные примеры с наибольшим влиянием
Что смотреть:
- Сравнить
top_k_domainsмежду наборами данных — одинаковые ли домены? - Проверить
domain_mean_similarities— есть ли статистически значимые различия?
Показывает, какие параметры модели изменились после обучения и в каких слоях происходят изменения.
Математика:
- Используется LoRA (Low-Rank Adaptation):
W = W_0 + ΔW, гдеΔW = B · A - Weight Delta:
Δw = |θ_final - θ_initial|(изменение весов LoRA) - Агрегация по слоям:
Δw_layer = mean(Δw для всех параметров слоя)
Интуиция: После обучения некоторые слои "перемешались" больше других. Если изменения концентрируются в определенных слоях (например, attention), это говорит о том, что модель учится обращать внимание на токсичные паттерны.
Что показывает:
- Горизонтальные полосы для каждого слоя, окрашенные по интенсивности изменений
- Цвет = интенсивность изменений (красный = больше изменений)
Как интерпретировать:
- Ярко-красные слои: Изменились больше всего → критически важны для обучения
- Бледные слои: Изменились мало → менее важны
- Паттерн изменений: Если изменения в attention-слоях → модель учится обращать внимание на токсичность
Что искать:
- Есть ли концентрация изменений в определенных типах слоев?
- Изменяются ли ранние или поздние слои больше?
Что показывает:
- Матрица: строки = слои, столбцы = типы параметров (q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj)
- Цвет = среднее изменение весов (желтый/красный = больше изменений)
Как интерпретировать:
- Яркие ячейки: Этот тип параметров в этом слое изменился сильно
- Паттерны: Если attention-параметры (q, k, v, o) яркие → модель учится обращать внимание
- Слои: Если определенные слои яркие → эти слои критически важны
Что искать:
- Есть ли паттерны по типам параметров (attention vs MLP)?
- Есть ли слои с особенно сильными изменениями?
Что показывает:
- Распределение изменений весов для Attention, MLP и Other параметров
- Показывает медиану, квартили, выбросы
Как интерпретировать:
- Высокая медиана: Этот тип параметров изменился больше
- Широкий разброс: Изменения неоднородны
- Выбросы: Некоторые параметры изменились аномально сильно
Что искать:
- Attention vs MLP: что изменилось больше?
- Есть ли статистически значимые различия (p-value в выводе)?
Что показывает:
- Связь между количеством примеров домена и средним изменением весов в связанных слоях
Как интерпретировать:
- Положительная корреляция: Больше примеров домена → больше изменений весов
- Отрицательная корреляция: Больше примеров → меньше изменений (возможно, переобучение)
- Нет корреляции: Количество примеров не связано с изменениями
Что искать:
- Есть ли домены-выбросы (много примеров, но мало изменений или наоборот)?
- Какие домены связаны с наибольшими изменениями?
В файле experiment_results.json для каждого эксперимента Pipeline 2 содержатся:
mean_delta/std_delta: Среднее и стандартное отклонение изменений весовtop_k_layers: Топ-K слоев с наибольшими изменениямиall_layer_deltas: Изменения для каждого слоя
Что смотреть:
- Сравнить
top_k_layersмежду наборами данных — одинаковые ли слои? - Проверить статистическую значимость различий Attention vs MLP
Представляет токсичность как направление в скрытом пространстве модели (latent space).
Математика:
- Извлекаются hidden states для токсичных и нейтральных промптов
- Вектор токсичности:
v_tox = (μ_toxic - μ_neutral) / ||μ_toxic - μ_neutral|| - Проекция примеров:
proj_i = h_i · v_tox(большая проекция = пример "близок" к токсичности) - Gap:
gap = mean(proj_toxic) - mean(proj_neutral)(разница проекций)
Интуиция: Токсичность — это направление в многомерном пространстве. Если мы найдем это направление, можем измерить, насколько "токсичны" примеры, и понять, как обучение сдвинуло это направление.
Что показывает:
- Вектор токсичности ДО и ПОСЛЕ обучения в 2D проекции (PCA)
- Стрелка показывает смещение вектора
Как интерпретировать:
- Большое смещение: Вектор токсичности сильно изменился → обучение повлияло на представление токсичности
- Малое смещение: Вектор почти не изменился → обучение не повлияло сильно
- Направление смещения: В какую сторону сдвинулся вектор
Что искать:
- Насколько велико смещение (длина стрелки)?
- В каком направлении сдвинулся вектор?
Что показывает:
- Cosine Similarity и Gap Δ для каждого слоя
- Показывает, как векторы меняются по слоям
Как интерпретировать:
- Cosine Similarity (близко к 1): Вектор почти не изменился в этом слое
- Cosine Similarity (далеко от 1): Вектор сильно изменился
- Gap Δ (положительный): Gap увеличился → модель лучше различает токсичное и нейтральное
- Gap Δ (отрицательный): Gap уменьшился → модель хуже различает
Что искать:
- В каких слоях вектор изменился больше всего?
- Увеличился ли gap после обучения?
Что показывает:
- Средняя проекция примеров каждого домена на вектор токсичности ДО и ПОСЛЕ обучения
Как интерпретировать:
- Высокая проекция: Домен "близок" к направлению токсичности
- Низкая проекция: Домен "далек" от токсичности
- Изменение проекции: Если проекция увеличилась → домен стал "токсичнее" после обучения
Что искать:
- Какие домены имеют самую высокую проекцию?
- Какие домены изменились больше всего после обучения?
Что показывает:
- Траектория вектора токсичности через слои ДО и ПОСЛЕ обучения (2D проекция)
Как интерпретировать:
- Траектория ДО: Как вектор меняется по слоям до обучения
- Траектория ПОСЛЕ: Как вектор меняется по слоям после обучения
- Смещение: Насколько траектория сдвинулась
Что искать:
- Есть ли паттерн в изменении вектора по слоям?
- Насколько сильно сдвинулась траектория?
Что показывает:
- Распределение проекций обучающих примеров на вектор токсичности по доменам
Как интерпретировать:
- Высокая медиана: Домен в среднем "близок" к токсичности
- Широкое распределение: Примеры домена разнообразны по токсичности
- Узкое распределение: Примеры домена однородны
Что искать:
- Какие домены имеют самую высокую медиану проекции?
- Есть ли домены с аномально широким распределением?
Что показывает:
- 2D проекция скрытого пространства, окрашенная по доменам или по проекции на v_tox
Как интерпретировать:
- Кластеры доменов: Если домены образуют кластеры → домены формируют подпространства
- Градиент по проекции: Если есть градиент цветов → проекция на v_tox коррелирует с положением в пространстве
Что искать:
- Образуют ли домены кластеры?
- Коррелирует ли проекция на v_tox с положением в пространстве?
В файле experiment_results.json для каждого эксперимента Pipeline 3 содержатся:
cos_sim: Косинусная схожесть вектора ДО и ПОСЛЕ (по слоям)gap_before/gap_after/gap_delta: Gap между токсичными и нейтральными примерамиtop_k_domains: Какие домены чаще всего в топ-K по проекцииdomain_projections: Средняя проекция по доменам
Что смотреть:
- Сравнить
gap_deltaмежду наборами данных — увеличился ли gap? - Проверить
top_k_domains— одинаковые ли домены в топ-K? - Сравнить
domain_projections— какие домены имеют самую высокую проекцию?
-
Сравнивайте между наборами данных:
- Одинаковые ли домены в топ-K?
- Похожи ли паттерны изменений?
-
Ищите согласованность между пайплайнами:
- Все три пайплайна должны указывать на одни и те же домены
- Если результаты различаются → нужно понять, почему
-
Проверяйте статистическую значимость:
- p-value < 0.05 → различия значимы
- Если различия не значимы → возможно, эффект случайный
-
Обращайте внимание на выбросы:
- Домены или примеры, которые выбиваются из общего паттерна
- Могут указывать на интересные находки или артефакты
persona_vectors.pdf— статья о методе persona vectorssubliminal_learning.pdf— статья о subliminal learningexperiment_results.json— все метрики и результаты экспериментов (очищены от дубликатов, оставлены только последние запуски)
Все результаты экспериментов сохранены в experiment_results.json. Для каждого эксперимента доступны:
- Параметры обучения
- Метрики предпочтений (baseline_score, post_score, delta)
- Результаты анализа по пайплайнам (градиенты, weight delta, persona vectors)
- Статистика по доменам
Для анализа используйте ноутбуки в соответствующих папках экспериментов или загрузите experiment_results.json в свой анализ.