Хочется понять физический смысл того, что физически пошагово происходит, когда обученная CNN-нейросеть обрабатывает входные данные. Опишу своё понимание, просьба не что-то заново объяснять, а указать на неточности и на отдалённость моего описания от истины. Попутно будут вопросы (выделены жырным).
Во многом пост пишется чтобы выговориться, ибо в процессе этого всегда сам лучше понимаешь чё сказать-то хотел.
Вот нарисовал картинку: http://savepic.ru/15045931.png
Вход - 9 нейронов x1...x9, которые не нейроны, а скорее «сенсоры», хотя почему-то везде называются «нейроны входного слоя». Нейрон - это то, что делает какую-то операцию со входами, а тут на X1...x9 входов нет, они сами уже чисто «выход», выдают прямо значения пикселей картинки, значит это скорее как сенсоры в глазу, а не нейроны. x1...x9 — сенсоры. Меня сильно смущает понятие нейрона, я всегда начинаю думать - «суммирование каких взвешенных входов делают эти нейроны? Никаких? Почему это тогда нейроны?». Короче, сенсоры. Далее.
Наша входная обрабатываемая картинка пускай будет 32*32, канал - 1 (ч/б).
9 сенсоров смотрят на фрагмент 3*3 входной картинки, нейрон X10 таким образом выполняет свёртку и математически совокупность весов w1...w9 являются ядром свёртки, верно? Потому нейросеть называется свёрточной. В русской википедии про CNN-нейросети тынц совокупность весов w1...w9 называется матрица весов.
Сенсоры x1-x9 «подключены» к входной кратинке именно так: в единицу времени смотрят на её окрестность: значение каждого пикселя умножается на соответствующий W, получаем SUM(x * w). В англоязычных статьях-видосах эта операция называется Dot Product https://en.wikipedia.org/wiki/Dot_product или скаярное произведение по-нашему. Это и есть свёртка? Выход этой операции (свёртки): скаляр (число). Мы «свернули» 9 пикселей в один. Кстати, свёрткой могут называть как одну операцию над 9 пикселями так и целую результирующую картинку, состоящую из множества результатов свёртки над каждыми 9-пиксельными регионами, когда мы пробежим этим 9-пиксельным окном по всему входному изображению (читать далее).
У меня на картинке показан только 1 нейрон «скрытого слоя» - X10.
В куче статей и видосов сказано, что нейрончик X10 (который ядро свёртки) называется filter. почему такой термин? Почему не ядро свёртки?
Итак, физически происходит следующее (насколько это верно?): мы пробегаем нашим ядром свёртки (окном 3*3 - можно 5*5, тогда входных сенсоров будет 25) по входной картинке с шагом, например 1 (настраивается): то есть ставим наше «окно захвата» - «окно свёртки» 3*3 на все возможные позиции на картинке и снимаем для каждой такой позиции значение на выходе X10, рисуя для каждой отдельной позиции окна (3*3) пиксель на выходнуй картинке. У меня показано как стрелка из X10 тычет (записывает) пиксель выходной картинки для данного 3*3 окна. Смещая наше входное окно 3*3 на 1 пиксель вправо, получаем значение следующего справа пикселя выходной картинки. Вот GIF из википедии: https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/3D_Convolution_Anim...
Эта вторая картинка называется feature map?
Нейрон X10 (с его весами входов w1...w9), т.е. filter, т.е. ядро свёртки, бегающее по входной картинке, можно интерпретировать как «признак». Т.е. совокупность весов w1...w9 как-бы кодирует некую графическую микро-фичу, признак. Например кодирует маленькую наклонную линию (веса w1...w9 будут по какой-то диагонали большими, остальное будет 0, например). Выходная картинка (картинка, куда пишет X10) - это будет как «карта признаков», т.е. на какой позиции входной картинки этот признак (наклонная линия) встретился (результат свёртки будет иметь высокое значение выше нуля) или не встретился (ноль или ниже). Т.е. мы на выходе получаем такую карту, которая показывает где (в каком квадрате 3*3) эта наклонная линия есть на входном изображении.
И это всё только с 1 нейроном входного слоя X10. Одно-нейронный слой (такое вы видите впервые только на нашей картинке!), а уже сколько важного.
Эта недо-нейросеть уже имеет смысл: например если X10 кодировал наклонную линию «от нихнего левого до верхнего правого» (знак слеш) (т.е. маленькую фичу, которая вписывается в 3*3), то если мы нарисуем на входной картинке одну длинную такую диагональ, то на выходной нейросетевой картинке получим точки по этой диагонали - нейросеть нашла много раз этот признак вдоль нашей «большой» диагонали (по-сути диагональ составлена из множества маленьких). Если линия на входной картинке была жирная, то тогда имеет смысл сначала найти края (edges), потом уже натравливать нашу фичу. Но это другая история. Причём края может выделять та же самая нейросеть...
Если у нас появится второй нейрон скрытого слоя - X11, то он должен будет кодировать уже другую фичу (другой признак), например точку, пустоту, заливку, вертикальную линию и т.п. И этот нейрон X11 уже выделит другой признак. И сгенерит отдельную карту признаков.
Самый интересный вопрос
Теперь посмотрим на типичную схему нейросети, которая рисуется на каждом углу: https://i.stack.imgur.com/9jzpy.jpg
Три нейрона входного слоя. Они же три фильтра. Каждый из них описанным выше способом бегает по входной картинке и создаёт карту признаков (feature map). Получаются 3 независимых карты признаков. Далее стоит выходной нейрон, который берёт входы со всех 3 нейронов. Как он это делает? На входы последнего выходного нейрона подаются результаты работы фильтров (нейронов скрытого слоя) когда каждый из них КУДА смотрит? Обязательно в одну и ту же область картинки? Т.е. вспоминая про feature map (карта признаков, которых у нас тут три - каждая на выходе своего фильтра), входной нейрон берёт значения из разных карт признаков (ведь 3 синапса выходного нейрона подключены на РАЗНЫЕ нейроны скрытого слоя - значит смотрят на разные карты признаков)? Но из какой именно точки этих карт признаков? Из точки с одной и той же кооринатой? То есть выходной нейрон умеет видеть только информацию вида "в какой мере 3 признака (реализованные 3-мя фильтрами) присутствуют в одном и том же месте картинки"? Выходной нейрон никогда не «увидит» ситуации вида «признак 1 в центре, признак 2 в углу, признак 3 в другом углу»? Скажем, если бы мы захотели сделать свёртку свёртки, то есть иметь второй скрытый слой до выходного нейрона, то есть наложить ещё какой-то фильтр на карту фич первого фильтра, то я теряюсь как это можно показать на подобной примитивной схеме нейросети и используется ли это вообще где-либо и если да, то как изображается схематически?
Объява: вступлю в приватную переписку по сабжу: data.structures@yandex.ru