#python #machine-learning #deep-learning #correlation #feature-extraction
#python #машинное обучение #глубокое обучение #корреляция #извлечение функций
Вопрос:
Я извлекаю два отклика функций из двух отдельных фреймворков машинного / глубокого обучения. Теперь у меня есть две матрицы, которые имеют размеры NxF, где N — количество выборок, а F — количество функций. Я хочу провести сравнение того, насколько похожи изученные функции. Я пробовал несколько способов, но основная идея заключается в использовании корреляции (пробовал Pearson и Spearman) для сопоставления откликов функций в матрице FxF. Затем я беру абсолютное значение max по одной оси, а затем вычисляю среднее из этих максимальных значений. На самом деле у меня есть несколько фреймворков, которые я хотел бы сравнить, но я получаю очень похожие результаты. Кто-нибудь делал это? У кого-нибудь еще есть предложения получше? Мой пример кода приведен ниже.
from scipy.stats import spearmanr
import numpy as np
def similarity(resp1, resp2):
rho, p = spearmanr(resp1,resp2)
corr = rho[:resp1.shape[1],resp1.shape[1]:]
sim_mtrx = np.abs(corr)
feature_match = np.max(sim_mtrx,axis=1)
return np.mean(feature_match)
Ответ №1:
Кто-нибудь делал это? У кого-нибудь еще есть предложения получше? Мой пример кода приведен ниже.
Честно говоря, это не имеет смысла. Почему? Потому что в таких вещах, как deep nets, нет упорядочения функций. Следовательно, сравнение, которое вы проводите, не может быть использовано для того, чтобы сделать какие-либо разумные выводы. Ваша матрица N x F
, вероятно, является вашей матрицей веса из вашего первого уровня. Следовательно, каждый из векторов (столбцов) этих матриц представляет один нейрон. Хитрость в том, что i
-й нейрон в одной сети (обученный с помощью одного фреймворка) может не иметь ничего общего с i
-м нейроном в другой, хотя он может быть идентичен j
-му. Например, рассмотрим сеть, обученную на изображениях с помощью F=3
, вы можете обнаружить, что эти нейроны научились распознавать горизонтальные (нейрон 1), вертикальные (нейрон 2) линии и, возможно, круг (нейрон 3). Теперь вы снова тренируетесь, либо с другим фреймворком, либо даже с тем же самым, но другим случайным исходным кодом. Теперь, даже если эта вторая сеть изучает точно то же самое — для определения горизонтальной линии, вертикальной и круга — но просто в разных нейронах (например, horizontal-2, vertical-3, circle-1), ваш метод будет утверждать, что это совершенно разные модели, что, очевидно, неверно. Проблема «наличия похожих представлений» сама по себе является направлением исследований.
Минимум, что вам нужно сделать, это найти наилучшее соответствие между нейронами в двух сетях, прежде чем применять базовый анализ, который вы предлагаете. Вы можете сделать это методом перебора (F ^ 2 возможных сопоставления, просто выберите то, которое претендует на наибольшее сходство) или использовать что-то вроде венгерского алгоритма для поиска идеального соответствия.
Самое важное — сохранить сравнение ссылок, чтобы избежать проблем, подобных описанным выше, поэтому вместо обучения одной модели для каждого фреймворка, обучите по крайней мере 2 для каждого фреймворка. И теперь вместо того, чтобы утверждать, что «методы A и B создают (dis) похожие представления, потому что представления, сгенерированные в результате одного эксперимента с A и B, (dis) похожи», вы должны проверить, существует ли статистически значимая разница между (dis) сходством между двумя запусками (с разными начальными значениями) одного и того же алгоритма и отдельными запусками двух разных алгоритмов, другими словами:
- у вас есть 2 алгоритма A, B (фреймворки)
- вы создаете представления A1, A2, B1, B2
- вы проверяете, является ли mean(sim (A1, A2), sim(B1, B2)) != mean(sim (A1, B1), sim(A2, B2)) (в то время как ранее вы просто проверяли, является ли sim (A1, B1) «большим»)
Обновить
Просто чтобы показать, почему рассмотренная метрика неверна, давайте используем ее на:
>>> x
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
>>> y
array([[ 6, 0, 0],
[ 7, -1, -123],
[ 8, 0, 1000]])
>>> similarity(x,y)
1.0
В итоге вы получаете всего одно совпадение, вам все равно, что 90% данных совершенно разные — вы все равно сообщаете о максимальном сходстве.
Комментарии:
1. Я упростил проблему для Stack Overflow, но у меня действительно есть два фреймворка A и B. Я обучил эти фреймворки двум разным наборам данных, чтобы получить A1, A2, B1 и B2. Я предположил, что смогу найти показатель сходства, который даст нам то, что вы описали выше. Я бы предположил, что A1 ~ A2 и B1 ~ B2. Имеет ли смысл для этого метрика подобия, которую я предоставил выше? В статьях по нейробиологии, похоже, используется 1 — линейная (пирсоновская) корреляция для выявления различий в прошлом.
2. Как я уже говорил в первой части ответа — нет, это не так. Эта метрика не является инвариантной к перестановкам, и вам нужно это свойство. С другой стороны, код не реализует проверку корреляции, он выполняет максимальную проверку корреляции с точки зрения функциональности. Следовательно, он игнорирует 90% данных при присвоении значения.
3. Этот пример был полезен, чтобы показать, почему моя метрика неверна. Я запутался со ссылкой «наилучшее соответствие», поскольку думал, что это то, что я делаю с функцией max. Меня не столько волнует местоположение, сколько то, что я могу найти ответы функций, похожие друг на друга. Я пытался воспроизвести что-то похожее на рисунок 9 в ncbi.nlm.nih.gov/pmc/articles/PMC2605405/pdf/fnsys-02-004.pdf . Они пытаются найти различия между откликами моделей. Мне кажется, что они используют простую корреляцию для построения RDMS.
4. Опять же — то, что предлагается здесь, не работает, не для нейронных сетей. Найдите наилучшее соответствие (это означает, что вы находите для каждого нейрона в одной сети, какой из них наиболее похож во второй, и вычисляете корреляцию в этой паре). Таким образом, вы получите некоторое представление о сходстве (однако это все еще может давать ложноотрицательные результаты, поскольку существует много очень похожих «человеческих» смысловых фильтров / моделей, которые не имеют высоких корреляций. Например, если это изображения, вы можете просто перевести все на один пиксель, и корреляция будет случайной, но фильтры будут почти одинаковыми.