Neural Network mengurai data string?


28

Jadi, saya baru mulai belajar bagaimana jaringan saraf dapat beroperasi untuk mengenali pola dan mengategorikan input, dan saya telah melihat bagaimana jaringan saraf tiruan dapat mengurai data gambar dan mengkategorikan gambar ( demo dengan convnetjs ), dan kuncinya ada adalah untuk mengecilkan gambar dan setiap piksel merangsang satu neuron input ke dalam jaringan.

Namun, saya mencoba membungkus kepala saya jika ini mungkin dilakukan dengan input string? Kasing yang saya pakai adalah "mesin rekomendasi" untuk film yang telah ditonton pengguna. Film memiliki banyak data string (judul, plot, tag), dan saya bisa membayangkan "downsampling" teks ke beberapa kata kunci yang menggambarkan film itu, tetapi bahkan jika saya memilah lima kata teratas yang menggambarkan film ini, saya pikir saya perlu input neuron untuk setiap kata bahasa Inggris untuk membandingkan satu set film? Saya dapat membatasi input neuron hanya untuk kata-kata yang digunakan dalam set, tetapi kemudian bisakah itu tumbuh / belajar dengan menambahkan film baru (pengguna menonton film baru, dengan kata-kata baru)? Sebagian besar perpustakaan yang saya lihat tidak mengizinkan penambahan neuron baru setelah sistem dilatih?

Apakah ada cara standar untuk memetakan data string / kata / karakter ke input ke jaringan saraf? Atau apakah jaringan saraf benar-benar bukan alat yang tepat untuk pekerjaan mengurai data string seperti ini (apa alat yang lebih baik untuk pencocokan pola dalam data string)?

Jawaban:


19

Menggunakan jaringan saraf untuk prediksi pada data bahasa alami bisa menjadi tugas yang rumit, tetapi ada metode yang sudah dicoba dan benar untuk memungkinkannya.

Di bidang Natural Language Processing (NLP), teks sering direpresentasikan menggunakan model kantong kata-kata. Dengan kata lain, Anda memiliki vektor panjang n , di mana n adalah jumlah kata dalam kosakata Anda, dan setiap kata sesuai dengan elemen dalam vektor. Untuk mengonversi teks menjadi data numerik, Anda cukup menghitung jumlah kemunculan setiap kata dan menempatkan nilai tersebut pada indeks vektor yang sesuai dengan kata tersebut. Wikipedia melakukan pekerjaan yang sangat baik untuk menggambarkan proses konversi ini. Karena panjang vektor sudah diperbaiki, sulit untuk berurusan dengan kata-kata baru yang tidak dipetakan ke indeks, tetapi ada cara untuk membantu mengurangi masalah ini (pencarian fitur hashing ).

Metode representasi ini memiliki banyak kelemahan - tidak mempertahankan hubungan antara kata-kata yang berdekatan, dan menghasilkan vektor yang sangat jarang. Melihat n-gram membantu memperbaiki masalah menjaga hubungan kata, tetapi untuk sekarang mari kita fokus pada masalah kedua, sparsity.

Sulit untuk berurusan langsung dengan vektor-vektor jarang ini (banyak perpustakaan aljabar linier melakukan pekerjaan yang buruk dalam menangani input jarang), sehingga seringkali langkah selanjutnya adalah pengurangan dimensi. Untuk itu kita dapat merujuk ke bidang pemodelan topik : Teknik seperti Latent Dirichlet Allocation (LDA) dan Latent Semantic Analysis (LSA) memungkinkan kompresi vektor jarang ini menjadi vektor padat dengan merepresentasikan dokumen sebagai kombinasi topik. Anda dapat memperbaiki jumlah topik yang digunakan, dan dengan melakukannya memperbaiki ukuran vektor output yang dihasilkan oleh LDA atau LSA. Proses pengurangan dimensionalitas ini secara drastis mengurangi ukuran vektor input sembari berusaha untuk kehilangan sejumlah informasi minimal.

Akhirnya, setelah semua konversi ini, Anda dapat memasukkan output dari proses pemodelan topik ke dalam input jaringan saraf Anda.


1
Beri tahu saya jika Anda memiliki pertanyaan lebih lanjut dan saya akan melakukan yang terbaik untuk memberikan lebih banyak detail.
Madison

Terima kasih, itu memberi saya beberapa syarat bagus untuk terus menjelajah bersama!
MidnightLightning

Kebetulan, saya bisa berhubungan dengan "fitur hashing" karena itu tampaknya sangat mirip dengan filter bloom , yang saya kenal dengan bekerja dengan kode cryptocurrency. Saya ingin tahu apakah lebih efektif untuk memiliki fungsi hashing menghubungkan fitur input ke beberapa posisi indeks (bloom-filter-style) daripada perlu fungsi hash kedua untuk mengatur tanda indeks ...
MidnightLightning

6

Baik jawaban dari @Emre dan @Madison May memberikan poin bagus tentang masalah yang dihadapi. Masalahnya adalah salah satu dari merepresentasikan string Anda sebagai vektor fitur untuk input ke NN.

Pertama, masalahnya tergantung pada ukuran string yang ingin Anda proses. String panjang yang berisi token mayor (biasanya kata-kata) sering disebut dokumen dalam pengaturan ini. Ada metode terpisah untuk berurusan dengan token / kata-kata individu.

Ada beberapa cara untuk mewakili dokumen. Banyak dari mereka membuat anggapan seperti kata-kata . Tipe paling sederhana merepresentasikan dokumen sebagai vektor dari jumlah kata, atau frekwensi istilah (tf). Untuk menghilangkan efek panjang dokumen, biasanya orang lebih suka menormalkan dengan jumlah dokumen yang muncul dalam istilah, frekuensi dokumen ( tf-idf ).

Pendekatan lain adalah pemodelan topik, yang mempelajari representasi data dimensi rendah laten. LDA dan LSI / LSA adalah pilihan umum, tetapi penting untuk diingat bahwa ini tidak diawasi. Representasi yang dipelajari belum tentu ideal untuk pembelajaran apa pun yang diawasi yang Anda lakukan dengan NN. Jika Anda ingin melakukan pemodelan topik, Anda juga dapat mencoba model topik yang diawasi .

Untuk kata-kata individual, Anda dapat menggunakan word2vec , yang memanfaatkan NNs untuk menanamkan kata-kata ke ruang berukuran sewenang-wenang. Kesamaan antara dua vektor kata dalam ruang yang dipelajari ini cenderung sesuai dengan kesamaan semantik.

Pendekatan yang lebih baru dirintis adalah bahwa dari vektor paragraf , yang pertama kali belajar model kata-seperti word2vec, kemudian dibangun di atas representasi itu untuk mempelajari representasi terdistribusi dari kumpulan kata-kata (dokumen dengan ukuran berapa pun). Ini menunjukkan hasil paling canggih dalam banyak aplikasi.

Saat menggunakan NN di NLP, orang sering menggunakan arsitektur yang berbeda, seperti Jaring Berulang Berulang (seperti jaringan Memori Jangka Pendek ). Dalam beberapa kasus orang bahkan menggunakan Neural Networks Konvolusional pada teks.


Saya pikir word2Vec benar-benar jawaban paling akurat untuk pertanyaan itu. Ada tutorial Kaggle yang sangat bagus tentang cara melatih & menggunakannya: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

Terima kasih, saya lupa tautan word2vec, saya akan menambahkan satu (selain yang Anda daftarkan di sini!)
jamesmf

3

Ini bukan masalah tentang jaringan saraf per se, tetapi tentang mewakili data tekstual dalam pembelajaran mesin. Anda dapat mewakili film, pemeran, dan tema sebagai variabel kategori. Plotnya lebih rumit; Anda mungkin menginginkan model topik untuk itu, tetapi saya akan membiarkannya sampai Anda memahami beberapa hal. Memang tepat bahwa "downsampling" tekstual yang Anda sebutkan.

Lihatlah tutorial ini untuk mempelajari cara menyandikan variabel kategori untuk jaringan saraf. Dan semoga beruntung!


Perlu dicatat bahwa ini bukan masalah eksplisit dalam semua pembelajaran mesin, tetapi hanya masalah ketika menghasilkan vektor fitur, yang tidak ada di mana-mana dalam pembelajaran mesin.
Slater Victoroff

Pembelajaran mesin seperti apa yang tidak menggunakan fitur?
Emre

Hutan acak adalah contoh yang baik dari sesuatu yang mendapatkan vektor fitur dari jenis yang Anda lihat di jaring saraf bukan masalah. Banyak metode yang tidak diawasi juga berfungsi pada kata-kata mentah daripada vektor fitur. Catatan: Saya tidak mengatakan ada metode yang tidak menggunakan fitur, hanya ada metode yang tidak bergantung pada vektor yang terstruktur dengan ketat.
Slater Victoroff

Saya tidak tahu apa yang Anda maksud dengan "terstruktur ketat".
Emre

terstruktur secara ketat adalah vektor 1d dari unint8 sebagai lawan dari daftar yang berisi kamus, matriks bobot, dan serangkaian string
Slater Victoroff

0

Saya sudah mencoba 2 cara berikut untuk implementasi uji coba-n dari jaringan saraf dengan teks. Yang terakhir bekerja dengan cukup baik, tetapi dengan keterbatasan.

  1. Buat kosakata menggunakan word2vect atau NLTK / token kata khusus dan tetapkan indeks untuk setiap kata. Indeks inilah yang mewakili kata sebagai angka.

    Tantangan:

    • Indeks harus "dinormalisasi" menggunakan penskalaan fitur.
    • Jika output dari jaringan saraf bahkan memiliki sedikit variasi, maka output mungkin indeks untuk kata yang tidak terduga (misalnya jika output yang diharapkan adalah 250; tetapi NN menghasilkan 249 atau 251, maka itu mungkin merupakan output yang dekat dari konteks numerik; tetapi mereka adalah indeks untuk kata-kata yang berbeda). NN berulang untuk menghasilkan indeks output dapat dimanfaatkan di sini.
    • Jika kata-kata baru ditambahkan ke kosakata, maka indeks token harus diubah skalanya. Model yang dilatih dengan nilai yang diskalakan sebelumnya mungkin menjadi tidak valid dan harus dilatih ulang.
  2. Gunakan matriks identitas, misalnya untuk kata "n", gunakan "nx n" atau (n-1 x n-1) matriks di mana setiap baris dan kolom mewakili kata. Masukkan "1" di sel persimpangan dan "0" di tempat istirahat. ( referensi )

    Tantangan:

    • Setiap nilai input dan output adalah vektor "nx 1". Untuk kosakata berukuran besar itu adalah perhitungan yang besar dan lebih lambat.
    • Jika kata-kata baru ditambahkan ke kosakata, maka matriks identitas (yaitu vektor kata) harus dihitung ulang. Model yang dilatih dengan vektor yang dihitung sebelumnya dapat menjadi tidak valid dan harus dilatih ulang.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.