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


20

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

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

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


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

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

Ответы:


16

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

,Ii=σij=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.