Як саме конволюційні нейронні мережі використовують згортку замість множення матриці?


13

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

Конволюційні мережі - це просто нейронні мережі, які використовують згортку замість загального множення матриць принаймні в одному з їх шарів.

однак я не був на 100% впевнений у тому, як «замінити матричне множення на згортку» в математично точному сенсі.

Що мене дійсно цікавить, це визначити це для векторів введення в 1D (як у ), тому я не буду мати введення як зображення та намагаюся уникати згортки в 2D.xRd

Так, наприклад, у «нормальних» нейронних мережах операції та схема подачі даних можуть бути стисло виражені, як у примітках Ендрю Нґ:

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

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

де - обчислюється вектор перед тим, як пропустити його через нелінійність . Нелінійність діє перо введення на вектор а - вихід / активація прихованих одиниць для відповідного шару. f z ( l )z(l)fz(l)a(l+1)

Це обчислення мені зрозуміло, оскільки множення матриць для мене чітко визначено, однак, просто замінити множення матриці на згортку мені здається незрозумілим. тобто

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

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

Я хочу переконатися, що я розумію вищевказане рівняння математично точно.

Перше питання, що виникає з заміною множення матриці на згортку, полягає в тому, що, як правило, один ідентифікує один рядок з точковим твором. Отже, чітко відомо, як ціле стосується ваг і що відображає вектор розмірності, як зазначено . Однак, коли хтось замінює його згортаннями, мені не зрозуміло, який рядок чи ваги відповідає яким записам у . Для мене навіть не зрозуміло, що має сенс представляти ваги вже як матриця насправді (я наведу приклад, щоб пояснити цю точку пізніше) a ( l ) z ( l + 1 ) W ( l ) a ( l )W(l)a(l)z(l+1)W(l)a(l)

У випадку, коли вхід і виходи всі в 1D, чи просто обчислюють згортку відповідно до його визначення, а потім передають її через особливість?

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

x=[1,2,3,4]

і у нас були такі ваги (можливо, ми це навчилися із задньою опорою):

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, я думаю, обрізає краї, де згортання чомусь поєднується з 0, чи потрібно нам це обрізати?)

Це як має працювати? Принаймні для вхідного вектора в 1D? Чи не вектор?W

Я навіть намалював нейронну мережу, як це, мабуть, виглядає так, як я думаю:

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

Відповіді:


3

Мені це здається, що ти на правильному шляху, але, можливо, я можу допомогти уточнити.

Один вихід

Давайте уявимо собі традиційний шар нейронної мережі з вхідними одиницями та 1 виведенням (припустимо також, що немає упереджень). Цей шар має вектор ваг який можна дізнатися, використовуючи різні методи (backprop, генетичні алгоритми та ін.), Але ми будемо ігнорувати навчання та зосередитись на прямому поширенні.nwRn

Шар приймає вхід і відображає його до активації , обчислюючи крапковий добуток з а потім застосовуючи нелінійність :xRnaRxwσ

a=σ(xw)

Тут елементи задають, скільки важить відповідні елементи для обчислення загальної активації вихідного блоку. Ви навіть можете подумати про це як "згортку", де вхідний сигнал ( ) має таку ж довжину, що і фільтр ( ).wxxw

У згорткових умовах більше значень у ніж у ; припустимо, тепер наш вхід для . Ми можемо обчислити активацію вихідного блоку в цьому налаштуванні, обчисливши крапковий добуток із суміжними підмножинами :xwxRmm>nwx

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

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

Ви вже ставите це у своєму питанні в основному, але я намагаюся пройти зв'язок із шарами ванільної нейромережі, використовуючи крапковий продукт, щоб визначити крапку. Основна відмінність шарів ванільної мережі полягає в тому, що якщо вхідний вектор довший за ваговим вектором, згортка перетворює вихід мережевого шару у векторний - у мережах згортки це вектори вниз! Цей вихідний вектор називається "картою характеристик" для блоку виводу цього шару.

Кілька виходів

Гаразд, давайте уявимо, що ми додамо новий вихід до нашого мережевого шару, щоб він мав входів і 2 виходи. Буде вектор для першого виводу, а вектор для другого виводу. (Я використовую надписи для позначення виходів шару.)nw1Rnw2Rn

Для шару ванілі вони зазвичай укладаються разом у матрицю де окремі вектори ваги є стовпцями матриці. Тоді, обчислюючи вихід цього шару, обчислюємо або у коротших позначеннях матриць, де нелінійність застосовується поелементно.W=[w1w2]

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

У згортковому випадку виходи нашого шару все ще пов'язані з тими ж векторами параметрів і . Так само, як і у випадку з одним виходом, шар згортки генерує векторні виходи для кожного виходу шару, тому існує і (знову припускаючи "дійсні" згортки). Ці фільтрувальні карти, по одній для кожного виходу шару, зазвичай складаються разом у матрицю .w1w2a1=[a11a21amn+11]a2=[a12a22amn+12]A=[a1a2]

Якщо ви подумаєте про це, вхід у згортковому випадку також можна розглядати як матрицю, що містить лише один стовпець ("один канал введення"). Таким чином , ми могли б написати перетворення для цього шару , як , де «згортка» насправді є крос-кореляції і відбувається тільки уздовж стовпців і .

A=σ(XW)
XW

Ці ярлики позначення насправді є дуже корисними, тому що тепер це легко бачити , що додати ще один вихід до шару, ми просто додати ще один стовпець ваг .W

Сподіваємось, це корисно!


1

Звитий шар - це сувора підмножина повністю пов'язаної мережі, тобто матричне множення. Звитий шар у прямому проході насправді еквівалентний множенню матриць, де:

  • деякі ваги прив’язуються / поділяються
  • деякі ваги дорівнюють нулю

У зворотному проході ваги будуть оновлюватися відповідно до того, які ваги зробили внесок, скільки в прохідному напрямку тобто ваги, які були нульовими, досі дорівнюють нулю. Ваги, які були прив’язані до декількох результатів, отримають градієнт від усіх цих результатів (градієнти підсумовані разом, щоб отримати остаточне оновлення градієнта для цієї ваги).


0

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

Це просто елементарне множення. Виконуючи згортання на перших трьох елементах входу, вихід буде output . (див. для прикладу deeplearning.stanford.edu )15+26+37=38


ви спробували conv ([1, 2, 3, 4], [5,6,7]) у матлабі? Зайдіть до терміналу і перевірте це самостійно. Якщо ви використовуєте звичайне визначення згортки, ви можете обчислити вектор [5,16,34,52,45,28]. Вектор не завжди стискається. Це залежить від того, з чого ви почнете робити згортку, і якщо ви ставитесь до речей поза діапазону індексу як до нуля. Якщо ви зробите це так, як я запропонував у цій публікації, ви отримаєте вектор розміром . Якщо обрізати ребра (бо індекс, що виходить за межі діапазону), ви отримаєте вектор розміром , де N і n - розмір розглянутих векторів. N - n + 1N+n1Nn+1
Чарлі Паркер

Згортання, що використовується в цій веб-сторінці, не є визначенням математичної згортки.
Чарлі Паркер

2
nnn1

1
Я бачу, я думаю, що це має сенс зараз, коли я його подивив. Однак є одна крихітна помилка. Вхід не завжди робить його меншим, я знаю про різний тип згортків зараз, і навіть у CNN, згідно з книгою Йошуа Бенджо, є 3 типи згортків (повна, дійсна, однакова) iro.umontreal.ca/ ~ bengioy / dlbook . Я не розумію їх докладно, але принаймні я їх знаю! Дякую Фелбо. Спільнота бачення не повинна вживати слово згортки, його заплутане і дратівливе. У будь-якому випадку, дякую.
Чарлі Паркер

2
@CharlieParker Функція conv у Matlab має такі ж 3 типи "фігур" (повне, дійсне, те саме), Matlab просто за замовчуванням "full" - див. Документи на mathworks.com/help/matlab/ref/conv.html . Згортання без перегортання ядра є перехресною кореляцією, так xcorr(x, y) = conv(x, fliplr(y)). Спільнота NN схильна говорити про згортання, коли вони насправді роблять перехресну кореляцію, але це досить схоже.
lmjohns3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.