Bagaimana tepatnya jaringan saraf convolutional menggunakan konvolusi menggantikan multiplikasi matriks?

13

Saya sedang membaca Buku Yoshua Bengio tentang pembelajaran mendalam dan dikatakan di halaman 224:

Jaringan konvolusional hanyalah jaringan saraf yang menggunakan konvolusi sebagai pengganti perkalian matriks umum dalam setidaknya satu lapisannya.

Namun, saya tidak 100% yakin bagaimana "mengganti perkalian matriks dengan konvolusi" dalam arti yang tepat secara matematis.

Yang benar-benar menarik bagi saya adalah mendefinisikan ini untuk vektor input dalam 1D (seperti pada xRd ), jadi saya tidak akan memiliki input sebagai gambar dan mencoba untuk menghindari konvolusi dalam 2D.

Jadi misalnya, dalam jaringan saraf "normal", operasi dan pola ruang makan dapat secara ringkas diungkapkan seperti dalam catatan Andrew Ng:

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

di mana z(l) adalah vektor yang dihitung sebelum melewatinya melalui non-linearitas f . Non-linearitas bertindak entri pero pada vektor z(l) dan a(l+1) adalah output / aktivasi unit tersembunyi untuk layer yang dimaksud.

Komputasi ini jelas bagi saya karena perkalian matriks didefinisikan dengan jelas bagi saya, namun, hanya mengganti perkalian matriks dengan konvolusi tampaknya tidak jelas bagi saya. yaitu

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

Saya ingin memastikan saya memahami persamaan di atas secara matematis dengan tepat.

Masalah pertama yang saya miliki dengan hanya mengganti perkalian matriks dengan konvolusi adalah bahwa biasanya, seseorang mengidentifikasi satu baris W(l) dengan produk titik. Jadi, seseorang dengan jelas tahu bagaimana keseluruhan a(l) berhubungan dengan bobot dan memetakan ke vektor z(l+1) dari dimensi seperti yang ditunjukkan oleh W(l) . Namun, ketika salah satu menggantikannya dengan convolutions, yang tidak jelas bagi saya yang baris atau bobot bersesuaian yang entri dalam a(l). Itu bahkan tidak jelas bagi saya bahwa masuk akal untuk mewakili bobot sebagai matriks lagi sebenarnya (saya akan memberikan contoh untuk menjelaskan hal itu nanti)

Dalam kasus di mana input dan output semua dalam 1D, apakah orang hanya menghitung konvolusi sesuai dengan definisi dan kemudian meneruskannya melalui singularitas?

Sebagai contoh jika kita memiliki vektor berikut sebagai input:

x=[1,2,3,4]

dan kami memiliki bobot berikut (mungkin kami mempelajarinya dengan backprop):

W=[5,6,7]

maka konvolusi adalah:

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

apakah benar untuk melewatkan non-linearitas melaluinya dan memperlakukan hasilnya sebagai layer / representasi tersembunyi (anggap tidak ada penyatuan untuk saat ini)? yaitu sebagai berikut:

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

( tutorial UDLF Stanford saya pikir memotong tepi di mana konvolusi menyatu dengan 0 untuk beberapa alasan, apakah kita perlu memotong itu?)

Apakah ini cara kerjanya? Setidaknya untuk vektor input dalam 1D? Apakah bukan vektor lagi?W

Saya bahkan menggambar jaringan saraf tentang bagaimana ini seharusnya terlihat seperti yang saya pikirkan:

masukkan deskripsi gambar di sini

Charlie Parker
sumber

Jawaban:

3

Bagi saya sepertinya Anda berada di jalur yang benar, tetapi mungkin saya bisa membantu memperjelas.

Output tunggal

Mari kita bayangkan layer neural network tradisional dengan unit input dan 1 output (mari kita asumsikan juga tidak ada bias). Lapisan ini memiliki vektor bobot w R n yang dapat dipelajari dengan menggunakan berbagai metode (backprop, algoritma genetika, dll), tapi kami akan mengabaikan belajar dan hanya fokus pada propagasi maju.nwRn

Lapisan mengambil input dan memetakannya ke aktivasi a R dengan menghitung titik produk x dengan w dan kemudian menerapkan nonlinier σ : a = σ ( x w )xRnaRxwσ

a=σ(xw)

Di sini, elemen-elemen menentukan berapa banyak untuk menimbang elemen-elemen yang sesuai dari x untuk menghitung keseluruhan aktivasi unit output. Anda bahkan bisa memikirkan ini seperti "konvolusi" di mana sinyal input ( x ) sama panjangnya dengan filter ( w ).wxxw

Dalam pengaturan convolutional, ada lebih banyak nilai di daripada di w ; anggaplah sekarang input kita x R m untuk m > n . Kita dapat menghitung aktivasi unit output dalam pengaturan ini dengan menghitung titik produk w dengan himpunan bagian berdekatan x : a 1xwxRmm>nwx

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

(Di sini saya mengulangi kebingungan menjengkelkan yang sama antara korelasi silang dan konvolusi yang dibuat oleh banyak penulis neural; jika kita membuat konvolusi yang tepat ini, kita akan membalik elemen . Saya juga mengasumsikan "valid" konvolusi yang hanya mempertahankan elemen yang dikomputasi di mana sinyal input dan filter tumpang tindih sepenuhnya, yaitu tanpa bantalan.)w

Anda sudah menempatkan ini dalam pertanyaan Anda pada dasarnya, tapi saya mencoba untuk berjalan melalui koneksi dengan lapisan jaringan saraf vanilla menggunakan produk titik untuk membuat titik. Perbedaan utama dengan lapisan jaringan vanila adalah bahwa jika vektor input lebih panjang dari vektor bobot, konvolusi mengubah output dari lapisan jaringan menjadi vektor - dalam jaringan konvolusi, itu adalah vektor sepanjang jalan turun! Vektor keluaran ini disebut "peta fitur" untuk unit keluaran pada lapisan ini.

Beragam keluaran

Ok, jadi mari kita bayangkan bahwa kita menambahkan output baru ke lapisan jaringan kita, sehingga memiliki input dan 2 output. Akan ada vektor w 1R n untuk output pertama, dan vektor w 2R n untuk output kedua. (Saya menggunakan superskrip untuk menunjukkan keluaran layer.)nw1Rnw2Rn

Untuk lapisan vanila, ini biasanya ditumpuk bersama menjadi matriks mana vektor bobot individu adalah kolom dari matriks. Kemudian ketika menghitung output dari lapisan ini, kita menghitung sebuah 1W=[w1w2] atau dalam notasi matriks yang lebih pendek,a=[a1a2]=σ(xW) dimana nonlinier diterapkan secara elemen.

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

Dalam kasus convolutional, output dari lapisan kami masih berhubungan dengan vektor parameter yang sama dan w 2 . Sama seperti dalam kasus tunggal-output, lapisan lilit menghasilkan output vektor-dihargai untuk setiap output lapisan, sehingga ada suatu 1 = [ a 1 1 a 1 2 ... a 1 m - n + 1 ] dan sebuah 2 = [ a 2 1 a 2 2a 2 m - n +w1w2a1=[a11a21amn+11](lagi dengan asumsi konvolusi "valid"). Peta-peta filter ini, satu untuk setiap output lapisan, biasanya ditumpuk bersama ke dalam matriksA=[a1a2].a2=[a12a22amn+12]A=[a1a2]

Jika Anda memikirkannya, input dalam kasus konvolusional juga dapat dianggap sebagai matriks, yang hanya berisi satu kolom ("satu saluran input"). Jadi kita bisa menulis transformasi untuk lapisan ini sebagai di mana "lilit" sebenarnya adalah sebuah cross-korelasi dan terjadi hanya di sepanjang kolom X dan W .

A=σ(XW)
XW

W

Semoga bermanfaat!

lmjohns3
sumber
1

Lapisan convolutional adalah subset ketat dari jaringan yang terhubung penuh, yaitu perkalian matriks. Lapisan konvolusional dalam forward pass sebenarnya setara dengan perkalian matriks di mana:

  • beberapa bobot diikat / dibagikan
  • beberapa bobot adalah nol

Di backward pass, bobot akan diperbarui sesuai dengan bobot yang telah berkontribusi berapa banyak di forward pass. yaitu, bobot yang nol masih nol. Bobot yang diikat di beberapa output akan menerima gradien dari semua output (gradien yang dijumlahkan bersama, untuk menghasilkan pembaruan gradien akhir untuk bobot itu).

Hugh Perkins
sumber
0

Tidak, itu tidak seharusnya bekerja. Operasi konvolusi selalu membuat input lebih kecil (untuk filter dengan ukuran> 1), tidak lebih besar seperti pada contoh Anda.

15+26+37=38. (lihat deeplearning.stanford.edu untuk contoh)

pir
sumber
apakah Anda mencoba conv ([1, 2, 3, 4], [5,6,7]) di matlab? Pergi ke terminal dan periksa sendiri. Jika Anda menggunakan definisi konvolusi konvensional, Anda dapat menghitung dengan tangan vektor [5,16,34,52,45,28]. Vektor tidak selalu menyusut. Itu tergantung di mana Anda mulai melakukan konvolusi dan jika Anda memperlakukan hal-hal di luar kisaran indeks sebagai nol. Jika Anda melakukannya seperti yang saya sarankan dalam posting ini, Anda mendapatkan vektor ukuranN+n-1. Jika Anda memotong tepi (karena indeks yang keluar kisaran) Anda mendapatkan vektor ukuranN-n+1, di mana N dan n adalah ukuran vektor yang dimaksud.
Charlie Parker
Konvolusi yang digunakan dalam webapge itu bukanlah definisi konvolusi matematis.
Charlie Parker
1
Ya, konvolusi yang digunakan untuk CNN bukanlah konvolusi biasa. Itu membingungkan semua orang, tapi begitulah :) Mengingat sifat CNN yaitu menganalisis gambar, itu akan selalu dimulai dengan yang pertaman elemen, dimana nadalah ukuran filter dan kemudian diteruskan input. Namun, itu tidak akan diperpanjang melampaui akhir, sehingga output akan menyusutn-1.
pir
1
Saya mengerti, saya pikir itu masuk akal sekarang karena saya mencarinya. Namun, ada satu kesalahan kecil. Masukan tidak selalu membuatnya lebih kecil, saya menyadari jenis konvolusi yang berbeda sekarang dan bahkan di CNN, menurut buku Yoshua Bengio ada 3 jenis konvolusi (lengkap, valid, sama) iro.umontreal.ca/ ~ bengioy / dlbook . Saya tidak mengerti mereka secara detail tetapi setidaknya saya menyadarinya! Terima kasih Felbo. Komunitas visi tidak boleh menggunakan kata konvolusi, ini membingungkan dan menjengkelkan. Bagaimanapun, terima kasih.
Charlie Parker
1
@CharlieParker Fungsi conv di Matlab memiliki 3 jenis "bentuk" yang sama (penuh, valid, sama), Matlab hanya default ke "penuh" - lihat dokumen di mathworks.com/help/matlab/ref/conv.html . Konvolusi tanpa membalik kernel adalah korelasi silang, jadi xcorr(x, y) = conv(x, fliplr(y)). Komunitas NN cenderung mengatakan konvolusi ketika mereka benar-benar melakukan korelasi silang, tetapi sangat mirip.
lmjohns3