Как именно сверточные нейронные сети используют свертку вместо умножения матриц?

13

Я читал Книгу Йошуа Бенжио по глубокому обучению, и на странице 224 написано:

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

однако я не был уверен на 100% в том, как «заменить умножение матриц сверткой» в математически точном смысле.

Что меня действительно интересует, так это определение входных векторов в 1D (как в ), поэтому я не буду вводить данные в виде изображений и постараюсь избежать свертки в 2D.xRd

Так, например, в «нормальных» нейронных сетях операции и схема подачи можно кратко выразить, как в примечаниях Эндрю Нга:

W(l)a(l)=z(l+1)
f(z(l+1))=a(l+1)

где z(l) - вектор, вычисленный до прохождения его через нелинейность f . Нелинейность действует pero entry на векторе z(l) а a(l+1) - это вывод / активация скрытых единиц для рассматриваемого слоя.

Это вычисление ясно для меня, потому что умножение матриц четко определено для меня, однако, просто замена умножения матриц на свертку кажется мне неясным. т.е.

W(l)a(l)=z(l+1)
f(z(l+1))=a(l+1)

Я хочу убедиться, что я понимаю математически точное уравнение выше.

Первая проблема, с которой я столкнулся при простой замене умножения матриц на свертку, состоит в том, что обычно идентифицируют одну строку W(l) с помощью точечного произведения. Таким образом, ясно известно, как целое a(l) относится к весам, и это отображается на вектор z(l+1) измерения, как указано W(l) . Однако, когда один заменяет его сверток, его мне не ясно , какая строка или гири соответствует какому записи в a(l), Мне даже не ясно, что на самом деле имеет смысл представлять веса в виде матрицы (я приведу пример, чтобы объяснить этот момент позже)

В случае, когда все входы и выходы находятся в 1D, можно ли просто вычислить свертку в соответствии с ее определением и затем передать ее через сингулярность?

Например, если у нас был следующий вектор на входе:

x=[1,2,3,4]

и у нас были следующие веса (возможно, мы узнали это с backprop):

W=[5,6,7]

тогда свертка это:

xW=[5,16,34,52,45,28]

Было бы правильно просто пропустить нелинейность и обработать результат как скрытый слой / представление ( на данный момент не объединяя )? то есть следующим образом:

f(xW)=f([5,16,34,52,45,28])=[f(5),f(16),f(34),f(52),f(45),f(28)])

( я думаю, что учебник по Стенфордскому UDLF обрезает края, где свёртка по каким-то причинам сворачивается с нулями, нужно ли её обрезать?)

Это как это должно работать? Хотя бы для входного вектора в 1D? Разве не вектор?W

Я даже нарисовал нейронную сеть о том, как это выглядит так, как я думаю:

введите описание изображения здесь

Чарли Паркер
источник

Ответы:

3

Для меня это звучит так, как будто вы на правильном пути, но, возможно, я могу помочь уточнить.

Один выход

Давайте представим себе традиционный уровень нейронной сети с входными единицами и 1 выходом (также предположим, что нет смещения). Этот слой имеет вектор весов ш R п , которые могут быть изучены с использованием различных методов (backprop, генетические алгоритмы и т.д.), но мы будем игнорировать обучения и сосредоточиться только на прямом распространении.nwRn

Слой принимает входной сигнал и отображает его активации в R путем вычисления скалярного произведения х с ш , а затем применяя нелинейности сг : = σ ( х ш )xRnaRxwσ

a=σ(xw)

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

В сверточной установке в больше значений, чем в w ; Предположим теперь, что наш вход x R m для m > n . Мы можем вычислить активацию выходной единицы в этой настройке, вычислив скалярное произведение w с непрерывными подмножествами x : a 1xwxRmm>nwx

a1=σ(x1:nw)a2=σ(x2:n+1w)a3=σ(x3:n+2w)amn+1=σ(xmn+1:mw)

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

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

Несколько выходов

nw1Rnw2Rn

W=[w1w2]

a1=σ(xw1)a2=σ(xw2)
a=[a1a2]=σ(xW)

w1w2a1=[a11a21amn+11]a2=[a12a22amn+12]A=[a1a2]

A=σ(XW)
XW

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

Надеюсь, это полезно!

lmjohns3
источник
1

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

  • некоторые веса связаны / разделены
  • некоторые веса равны нулю

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

Хью Перкинс
источник
0

Нет, это не так, как это должно работать. Операция свертки всегда делает вход меньше (для фильтров с размером> 1), а не больше, как в вашем примере.

Это просто поэлементное умножение. При выполнении свертки на первых 3 элементах ввода, вывод будет1*5+2*6+3*7знак равно38, (см. например, deeplearning.stanford.edu )

PIR
источник
Вы пробовали использовать conv ([1, 2, 3, 4], [5,6,7]) в matlab? Зайдите в терминал и проверьте сами. Если вы используете традиционное определение свертки, вы можете вручную вычислить вектор [5,16,34,52,45,28]. Вектор не всегда сжимается. Это зависит от того, где вы начнете выполнять свертку, и будете ли вы относиться к вещам вне диапазона индекса как к нулю. Если вы сделаете это, как я предложил в этом посте, вы получите вектор размераN+n1. If you trim the edges (cuz of index that go out the range) you get a vector of size Nn+1, where N and n are the size of the vectors in question.
Charlie Parker
The convolution used in that webapge is not the definition of the mathematical convolution.
Charlie Parker
2
Да, свертка, используемая для CNN, не является обычной сверткой. Это сбивает с толку всех, но это только так :) Учитывая природу CNN, то есть проанализировать изображение, оно всегда будет начинаться с первогоN элементы, где Nразмер фильтра, а затем будет передан на вход. Тем не менее, он не будет расширяться до конца, поэтому вывод будет сокращен наN-1,
пир
1
I see, I think that makes sense now that I looked it up. However, there is one tiny mistake. The input doesn't always make it smaller, I am aware of the different type of convolutions now and even in the CNN, according to Yoshua Bengio's book there are 3 types of convolutions (full, valid, same) iro.umontreal.ca/~bengioy/dlbook. I don't understand them in detail but at least I am aware of them! Thanks Felbo. The vision community should not be using the word convolutions, its confusing and irritating. Anyway, thanks.
Charlie Parker
2
@CharlieParker The conv function in Matlab has the same 3 types of "shapes" (full, valid, same), Matlab just defaults to "full" -- see docs at mathworks.com/help/matlab/ref/conv.html. A convolution without flipping the kernel is a cross-correlation, so xcorr(x, y) = conv(x, fliplr(y)). The NN community tends to say convolution when they are actually doing a cross-correlation, but it's pretty similar.
lmjohns3