Глубокое обучение: Как узнать, какие переменные важны?


20

С точки зрения языка нейронной сети (у = вес * х + смещение), как я узнаю, какие переменные являются более важными, чем другие?

У меня есть нейронная сеть с 10 входами, 1 скрытый слой с 20 узлами и 1 выходной слой с 1 узлом. Я не уверен, как узнать, какие входные переменные являются более влиятельными, чем другие переменные. Я думаю, что, если вход важен, он будет иметь высоко взвешенную связь с первым слоем, но вес может быть положительным или отрицательным. Итак, что я могу сделать, это взять абсолютное значение весов ввода и суммировать их. Более важные входы будут иметь более высокие суммы.

Так, например, если длина волос является одним из входных данных, то он должен иметь 1 соединение с каждым из узлов в следующем слое, то есть 20 соединений (и, следовательно, 20 весов). Могу ли я просто взять абсолютное значение каждого веса и сложить их вместе?


3
Вы, конечно, можете это сделать, но неясно, что это означает на самом деле, кроме «суммы всех весов для этой переменной по всем соединениям». Называть это «важность» совершенно произвольно.
— Мэтью Друри

1
Мне просто нужна ЛЮБАЯ информация, которая бы указала на важность переменной, и я думаю, что это может быть хорошим способом.
— user1367204

Ответы:


16

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

,Ii=σi∑j=1nhidden|wij|

Здесь - стандартное отклонение i- го входа, I i - значение i- го входа, w i j - вес, соединяющий i- й вход с j- м скрытым узлом в первом слое, а n hidden - число скрытых узлов в первом слое.σiiIiiwijijnhidden

Другой метод заключается в использовании производной отображения нейронной сети по отношению к рассматриваемому входу, усредненной по входам.

Ii=σi⟨|dydxi|⟩

Здесь - i- й вход, y - выход, а ожидаемое значение берется относительно вектора входов x .xiiyx


Будет ли это работать, если я буду использовать только соединения между входами и первым скрытым слоем (а не использовать все скрытые слои)?
— user1367204

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

Я вспомнил другой подход и добавил его к ответу.
— Сэм Маринелли

11

Несколько грубая сила, но эффективное решение:

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


Это, безусловно, возможность.
— SmallChess

6
Однако есть подводный камень: даже если функция чрезвычайно важна, если есть другая функция, сильно связанная с первой, ни одна из них не будет считаться важной по вашим критериям (отсутствие первой компенсируется наличием последней, хотя менее информативно, но таким образом, более «уникальные» функции будут более важными)
— Firebug

Это иногда называют тестированием абляции (точнее,
— микроабляцией

7

105

Для мелкой сети это дает пример определения важности переменной.

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


Я отредактировал свой комментарий, чтобы отразить то, что я имел в виду. Я имел в виду 20 узлов на первом уровне, а не 5 узлов. Большая доля и спасибо за различение мелких / глубоких сетей.
— user1367204

9
@ hxd1011 не быть педантичным ханжем, но глубокий означает больше слоев, а не тысячи скрытых юнитов :).
— Рафаэль

3

Максимум, что я нашел по этому поводу, детально перечислено на этом сайте, более конкретно, вы можете посмотреть на это . Если вы говорите только о линейных моделях, то вам нужно нормализовать веса, чтобы сделать их интерпретируемыми, но даже это может ввести в заблуждение больше об этом по упомянутой ссылке. Некоторые люди пытались сделать сложные весовые функции для интерпретации важности входных данных (Гарсона, Гедеона и Милна), но даже это может вводить в заблуждение, вы можете узнать об этом больше, прокрутив первую ссылку, которую я упомянул. В общем, я бы посоветовал продолжать интерпретировать результаты с недоверием.

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

PS: извините, не могу публиковать больше ссылок или комментариев, здесь не так много репутации.


1

Учитывая, что у вас есть:

  1. Задача классификации
  2. Обученная модель
  3. Нормализованные функции (от 0 до 1)

Кто-нибудь пробовал:

  1. Обнуление предубеждений
  2. Передавайте каждый раз как объекты один горячий вектор, где все объекты равны нулю, кроме одного.
  3. Изучите вывод.

В этом случае, я думаю, что выходом будет число, обозначающее «важность» функции, поскольку этот выход также будет представлять выход пути этого 1 сигнала внутри сети.

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


Я не думаю, что это сильно поможет. То , что вы хотели бы оценить, сколько изменение этого входа будет влиять на результат (сам по себе или в сочетании с другими признаками)
— elachell
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.