Что вычисляет скрытый слой в нейронной сети?

187

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

Я понимаю входной слой и как нормализовать данные, я также понимаю единицу смещения, но когда дело доходит до скрытого слоя, каковы фактические вычисления в этом слое и как они отображаются на выход, просто немного туманно. Я видел диаграммы с вопросительными знаками в скрытом слое, логические функции, такие как AND / OR / XOR, функции активации и входные узлы, которые сопоставляются со всеми скрытыми единицами, и входные узлы, которые сопоставляются только с несколькими скрытыми единицами каждый и т. Д. У меня просто несколько вопросов по практическому аспекту. Конечно, было бы замечательно простое объяснение всего процесса нейронной сети, которое вы бы объяснили ребенку.

Какие вычисления сделаны в скрытом слое?

Как эти вычисления отображаются в выходной слой?

Как работает выходной слой? Денормализация данных из скрытого слоя?

Почему некоторые слои входного слоя подключены к скрытому слою, а некоторые нет?

FAtBalloon
источник
13
Люди здесь милые, я никогда не видел ответа «дай мне гугл, что для тебя», но много удивительно подробных и проницательных ответов на вопросы, которые поначалу казались базовыми. К сожалению, я не могу помочь вам с вашим, но это кажется весьма актуальным, поэтому я с удовольствием голосую за него.
Гала
4
Спасибо за комментарий и голосование, Гаэль, я, вероятно, немного измучен сообществом SO, так как мы все знаем, как эти люди могут получить :) Рад видеть больше духа сотрудничества здесь, в отличие от попыток заработать значки и очки путем редактирования / закрытия вопросов.
FAtBalloon
1
Я не являюсь экспертом в нейронных сетях конкретно, хотя я действительно участвую в их приложениях и методах. Мой, возможно, не очень полезный ответ будет состоять в том, что конкретные вычисления в скрытом виде зависят от «функции стоимости», которую вы навязываете своему результату, то есть того, что вы пытаетесь достичь. Например, если вы хотите сгруппировать входные элементы в кластерные наборы, вы будете вычислять расстояния между элементами в скрытом слое. Это может проходить различные итерации и циклы оптимизации на этом уровне, пока вы не встретите критерий ошибки, который позволяет процессу «покинуть» этот уровень.
Лукозаде

Ответы:

230

Версия из трех предложений:

  • Каждый слой может применить любую функцию, которую вы хотите, к предыдущему слою (обычно линейное преобразование, сопровождаемое нелинейностью сдвига).

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

  • Выходной слой преобразует активации скрытого слоя в любой масштаб, в котором вы хотите, чтобы ваш вывод был включен.

Как будто ты 5:

Если вы хотите, чтобы компьютер сообщал вам, есть ли на изображении автобус, компьютеру может быть легче, если у него есть нужные инструменты.

Таким образом, ваш детектор автобуса может состоять из колесного детектора (чтобы помочь вам сказать, что это автомобиль) и коробочного детектора (поскольку автобус имеет форму большой коробки) и детектора размера (чтобы сказать, что он слишком большой, чтобы быть автомобилем). ). Это три элемента вашего скрытого слоя: они не являются частью необработанного изображения, это инструменты, которые вы разработали, чтобы помочь вам идентифицировать шины.

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

Нейронные сети полезны, потому что есть хорошие инструменты (например, обратное распространение) для создания большого количества детекторов и их объединения.


Как будто ты взрослый

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

xhyfxhghy

f(x)g(f(x))

fg

g(f(x))fg


Пример с логическими функциями:

fg

Функции первого уровня:

  • Убедитесь, что хотя бы один элемент «ИСТИНА» (используя ИЛИ)
  • Убедитесь, что они не все «ИСТИНА» (используя NAND)

Функция второго слоя:

  • Убедитесь, что оба критерия первого уровня удовлетворены (используя AND)

Выход сети является просто результатом этой второй функции. Первый уровень преобразует входные данные во что-то, что второй уровень может использовать, чтобы вся сеть могла выполнять XOR.


Пример с изображениями:

Слайд 61 из этого доклада, который также доступен здесь как одно изображение, показывает (один из способов визуализации), что ищут различные скрытые слои в конкретной нейронной сети.

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

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

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

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

Таким образом, каждый слой уводит вас все дальше и дальше от необработанных пикселей и приближает к вашей конечной цели (например, обнаружение лица или обнаружение шины).


Ответы на разные вопросы

«Почему некоторые слои входного слоя подключены к скрытому слою, а некоторые нет?»

Отключенные узлы в сети называются узлами смещения. Там действительно хорошее объяснение здесь . Короткий ответ: они как термины перехвата в регрессии.

"Откуда берутся изображения" детектора глаза "в примере изображения?"

Я не проверил дважды конкретные изображения, с которыми я связан, но в целом эти визуализации показывают набор пикселей во входном слое, которые максимизируют активность соответствующего нейрона. Поэтому, если мы думаем о нейроне как о детекторе глаза, это изображение, которое нейрон считает наиболее похожим на глаза. Люди обычно находят эти наборы пикселей с помощью процедуры оптимизации (восхождения на гору).

В этой статье некоторые люди из Google с одной из крупнейших в мире нейронных сетей демонстрируют нейрон «детектора лица» и нейрон «детектора кошки», а также второй способ: они также показывают реальные изображения, которые активируют нейрон наиболее сильно (рисунок 3, рисунок 16). Второй подход хорош, потому что он показывает, насколько гибкой и нелинейной является сеть - эти «детекторы» высокого уровня чувствительны ко всем этим изображениям, даже если они не особенно похожи на уровне пикселей.


Дайте мне знать, если что-то здесь неясно или у вас есть еще вопросы.

Дэвид Дж. Харрис
источник
2
Так есть ли только один определенный алгоритм для каждого отдельного узла на данном слое, и весы делают выходные результаты разными? Или вы можете запрограммировать каждый узел на слое, чтобы он был разным?
FAtBalloon
3
@GeorgeMcDowd это решает ключевую проблему: смотреть на пиксели и идентифицировать шины сложно, как вы и предлагали. К счастью, смотреть на пиксели и находить края просто - это все, что пытается сделать первый скрытый слой. Следующий слой пытается сделать выводы на основе ребер, что гораздо проще, чем попытаться сделать это на основе пикселей.
Дэвид Дж. Харрис
4
ТАК должен дать вам другое вознаграждение (кроме просто баллов) за время и усилия, которые вы вложили в этот ответ!
Самсамара
1
@JoshuaEnfield Я думаю, что логика в 1980-х годах была комбинацией того, что люди думали, что мозг работает, что он везде дифференцируем, а ценности ограничены, как вы упомянули. С тех пор люди обнаружили, что f(x) = max(x, 0)(«выпрямленная линейная единица») часто работает лучше, даже если у нее нет многих из этих свойств.
Дэвид Дж. Харрис
2
Пример шины и цепочка функций просто прибили его. Не понимаю, почему учебники не могут быть такими описательными.
17
12

Я постараюсь добавить в интуитивное описание работы ...

Хороший интуитивный способ думать о нейронной сети - это думать о том, что пытается сделать модель линейной регрессии. Линейная регрессия будет принимать некоторые входные данные и получать линейную модель, которая принимает каждое входное значение, умноженное на некоторые модельные оптимальные весовые коэффициенты, и пытается отобразить сумму этих результатов в выходной отклик, который близко соответствует истинному результату. Коэффициенты определяются путем нахождения значений, которые минимизируют некоторую метрику ошибки между желаемым выходным значением и значением, полученным моделью. Другой способ сказать, что линейная модель будет пытаться создать множители коэффициентов для каждого входа и суммировать их все, чтобы попытаться определить взаимосвязь между (множественными) входными и (обычно одиночными) выходными значениями. Эта та же модель почти может рассматриваться как основной строительный блок нейронной сети;

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

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

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

Один из способов, который действительно помог мне узнать, как на самом деле работает нейронная сеть, - это изучить код реализации нейронной сети и построить его. Одно из лучших объяснений базового кода можно найти в главе о нейронных сетях (в свободном доступе) «Руководство для ученых и инженеров по DSP» гл. 26. Он в основном написан на очень простом языке (я думаю, что это был фортран), который действительно помогает вам увидеть, что происходит.

похлопывание
источник
12

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

Скрытый к выходной

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

Мне нравится думать о преобразовании между выходами этих скрытых нейронов и выходным слоем как просто перевод (в лингвистическом смысле, а не в геометрическом смысле). Это, безусловно, верно, если преобразование обратимо , а если нет, то что-то было потеряно при переводе. Но у вас просто скрытые выходы нейронов видятся с другой точки зрения.

Ввод-к-Hidden

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

hidden_1 = 10 * (input_1) + 0 * (input_2) + 2 * (input_3)

Это означает, что значение hidden_1очень чувствительно к значению input_1, совсем не чувствительно input_2и лишь слегка чувствительно к input_3.

Таким образом, вы можете сказать, что hidden_1захватывает определенный аспект ввода, который вы можете назвать input_1аспектом « важно».

Выходные данные hidden_1обычно формируются путем передачи входных данных через некоторую функцию, поэтому предположим, что вы используете сигмовидную функцию. Эта функция принимает значения от 0 до 1; так что думайте об этом как о переключателе, который говорит, что input_1это важно или нет.

Вот что делает скрытый слой! Он извлекает аспекты или особенности пространства ввода.

Теперь веса тоже могут быть отрицательными! Это означает, что вы можете получить такие аспекты, как « input_1важно, НО ТАКЖЕ input_2отнимает эту важность»:

hidden_2 = 10 * (input_1) - 10 * (input_2 ) + 0 * (input_3)

или input_1и input_3имеют «общую» важность:

hidden_3 = 5 * (input_1) + 0 * (input_2) + 5 * (input_3)

Больше геометрии

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

Давайте посмотрим hidden_1снова, сверху. Как только значение at input_1станет достаточно большим, выходной сигнал функции активации сигмоиды останется равным 1, он не станет больше . Другими словами, все больше и больше не input_1будет иметь никакого значения для вывода. Точно так же, если он движется в противоположном (то есть отрицательном) направлении, то после точки выход не будет затронут.

Хорошо. Но предположим, что нам не нужна чувствительность в направлении бесконечности в определенном направлении, и мы хотим, чтобы она активировалась только для определенного диапазона на линии. Значение для очень отрицательных значений не имеет никакого эффекта, а для очень положительных значений - никакого эффекта, но для значений между, скажем, от 5 до 16 вы хотите, чтобы оно проснулось. Здесь вы бы использовали радиальную базисную функцию для своей функции активации.

Резюме

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

РЕДАКТИРОВАТЬ: Эта страница с ее замечательными интерактивными графиками справляется с работой лучше, чем мой длинный и громоздкий ответ, приведенный выше: http://neuralnetworksanddeeplearning.com/chap4.html

Рохит Чаттерджи
источник
1
Как и ОП, я немного озадачен скрытым слоем в нейронных сетях. В вашем примере, как алгоритм NN находит веса для скрытых_1, скрытых_2 и скрытых_3 нейронов? А поскольку hidden_1, hidden_2 и hidden_3 получены из одних и тех же входных переменных, не сходятся ли веса к одному и тому же решению?
RobertF
5

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

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

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

jpmuc
источник