Jaringan Syaraf Berulang vs Rekursif: Mana yang lebih baik untuk NLP?

48

Ada Jaringan Syaraf Berulang dan Jaringan Syaraf Rekursif. Keduanya biasanya dilambangkan dengan akronim yang sama: RNN. Menurut Wikipedia , NN Berulang sebenarnya adalah NN Rekursif, tapi saya tidak begitu mengerti penjelasannya.

Selain itu, saya sepertinya tidak menemukan yang lebih baik (dengan contoh atau lebih) untuk Pemrosesan Bahasa Alami. Faktanya adalah, meskipun Socher menggunakan NN Rekursif untuk NLP dalam tutorialnya , saya tidak dapat menemukan implementasi yang baik dari jaringan saraf rekursif, dan ketika saya mencari di Google, sebagian besar jawabannya adalah tentang NN Berulang.

Selain itu, apakah ada DNN lain yang berlaku lebih baik untuk NLP, atau tergantung pada tugas NLP? Deep Belief Nets atau Autoencoder bertumpuk? (Sepertinya saya tidak menemukan util khusus untuk ConvNets di NLP, dan sebagian besar implementasinya dengan visi mesin dalam pikiran).

Akhirnya, saya benar-benar lebih suka implementasi DNN untuk C ++ (lebih baik lagi jika memiliki dukungan GPU) atau Scala (lebih baik jika memiliki dukungan Spark) daripada Python atau Matlab / Oktaf.

Saya sudah mencoba Deeplearning4j, tetapi sedang dalam pengembangan konstan dan dokumentasinya agak ketinggalan jaman dan sepertinya saya tidak bisa membuatnya bekerja. Sayang sekali karena memiliki "kotak hitam" seperti cara melakukan sesuatu, sangat mirip scikit-belajar atau Weka, yang adalah apa yang saya inginkan.

crscardellino
sumber

Jawaban:

42

Jaringan Syaraf Berulang berulang dari waktu ke waktu. Misalnya jika Anda memiliki urutan

x = ['h', 'e', ​​'l', 'l']

Urutan ini diumpankan ke neuron tunggal yang memiliki koneksi tunggal ke dirinya sendiri.

Pada waktu langkah 0, huruf 'h' diberikan sebagai input. Pada waktu langkah 1, 'e' diberikan sebagai input. Jaringan ketika dibuka dari waktu ke waktu akan terlihat seperti ini.

RNN

Jaringan rekursif hanyalah generalisasi dari jaringan berulang. Dalam jaringan berulang bobot dibagi (dan dimensi tetap konstan) di sepanjang panjang urutan karena bagaimana Anda akan berurusan dengan bobot tergantung posisi ketika Anda menemukan urutan pada waktu uji panjang berbeda dengan apa pun yang Anda lihat di waktu kereta . Dalam jaringan rekursif bobot dibagi (dan dimensi tetap konstan) di setiap node karena alasan yang sama.

Ini berarti bahwa semua bobot W_xh akan sama (dibagi) dan demikian juga bobot W_hh. Ini hanya karena itu adalah neuron tunggal yang telah dibuka pada waktunya.

Ini adalah apa yang tampak seperti Jaringan Syaraf Rekursif . Jaringan Syaraf Rekursif

Sangat sederhana untuk melihat mengapa itu disebut Jaringan Syaraf Rekursif. Anak-anak setiap simpul orangtua hanyalah sebuah simpul yang mirip dengan simpul itu.

Jaringan saraf yang ingin Anda gunakan tergantung pada penggunaan Anda. Dalam blog Karpathy , ia menghasilkan karakter satu per satu sehingga jaringan saraf berulang bagus.

Tetapi jika Anda ingin membuat pohon parse, maka menggunakan Jaringan Syaraf Rekursif lebih baik karena membantu untuk membuat representasi hierarkis yang lebih baik.

Jika Anda ingin melakukan pembelajaran mendalam dalam c ++, maka gunakan CUDA. Ini memiliki basis pengguna yang bagus, dan cepat. Saya tidak tahu lebih banyak tentang itu jadi tidak bisa berkomentar lebih banyak.

Dalam python, Theano adalah pilihan terbaik karena menyediakan diferensiasi otomatis, yang berarti bahwa ketika Anda membentuk NN yang besar dan canggung, Anda tidak perlu menemukan gradien dengan tangan. Theano melakukannya secara otomatis untukmu. Fitur ini tidak dimiliki oleh Torch7.

Theano sangat cepat karena menyediakan pembungkus C untuk kode python dan dapat diimplementasikan pada GPU. Ini juga memiliki basis pengguna yang luar biasa, yang sangat penting saat mempelajari sesuatu yang baru.

Azrael
sumber
11

Jaringan Syaraf Berulang Besar dianggap mungkin model yang paling kuat untuk NLP. Sebuah artikel hebat yang ditulis oleh A. Karpathy tentang Jaringan Syaraf Berulang dan pemodelan level karakter tersedia di http://karpathy.github.io/2015/05/05/21/rnn-effectiveness/

Setelah mencoba sejumlah besar perpustakaan untuk pembelajaran mendalam (theano, caffe dll). Saya akan sangat menyarankan penggunaan Torch7 yang dianggap alat canggih untuk NN dan didukung oleh NYU, Facebook AI dan Google DeepMind. Torch7 didasarkan pada lua dan ada begitu banyak contoh yang dapat Anda biasakan dengan mudah. Banyak kode dapat ditemukan di github, awal yang baik adalah https://github.com/wojzaremba/lstm .

Akhirnya, keindahan lua adalah bahwa LuaJIT dapat disuntikkan dengan sangat mudah di Jawa, Python, Matlab dll.

Yannis Assael
sumber
2
Sarankan membaca blog Karpathy. Benar-benar hebat dalam memahami RNN.
SolessChong
1

Recurrent Neural Networks (RNN) pada dasarnya terungkap seiring waktu. Ini digunakan untuk input berurutan di mana faktor waktu adalah faktor pembeda utama antara elemen-elemen urutan. Sebagai contoh, berikut adalah jaringan saraf berulang yang digunakan untuk pemodelan bahasa yang telah dibuka dari waktu ke waktu. Pada setiap langkah waktu, selain input pengguna pada langkah waktu itu, ia juga menerima output dari lapisan tersembunyi yang dihitung pada langkah waktu sebelumnya.

RNN


Jaringan Syaraf Rekursif lebih seperti jaringan hierarkis di mana sebenarnya tidak ada aspek waktu untuk urutan input tetapi input harus diproses secara hierarkis dengan cara pohon. Berikut adalah contoh bagaimana jaringan saraf rekursif terlihat. Ini menunjukkan cara untuk mempelajari pohon parse kalimat dengan secara rekursif mengambil output dari operasi yang dilakukan pada potongan teks yang lebih kecil.

Recursice Neural Networks


[ CATATAN ]:

LSTM dan GRU adalah dua tipe RNN yang diperluas dengan gerbang lupa, yang sangat umum di NLP.

LSTM

LSTM dan GRU


Formula Sel-LSTM:

masukkan deskripsi gambar di sini

Benyamin Jafari
sumber