Jaringan saraf dan filosofi bahasa

Mengapa teori Wittgenstein tetap menjadi dasar dari semua NLP modern

Representasi vektor kata-kata mungkin salah satu ide paling indah dan romantis dalam sejarah kecerdasan buatan. Filsafat bahasa adalah cabang filsafat yang mengeksplorasi hubungan antara bahasa dan realitas dan bagaimana membuat pembicaraan bermakna dan dimengerti. Representasi vektor kata adalah metode yang sangat spesifik dalam Pemrosesan Bahasa Alami (NLP) modern. Dalam arti tertentu, ini adalah bukti empiris dari teori Ludwig Wittgenstein, salah satu filsuf paling relevan di abad terakhir. Bagi Wittgenstein, penggunaan kata-kata adalah langkah dalam permainan bahasa sosial yang dimainkan oleh anggota komunitas yang saling memahami. Arti kata hanya tergantung pada kegunaannya dalam suatu konteks, itu tidak sesuai satu dengan satu dengan objek dari dunia nyata.

Untuk kelas besar kasus di mana kita menggunakan kata "makna", itu dapat didefinisikan sebagai arti dari kata itu penggunaannya dalam bahasa .

Tentu saja, memahami makna kata yang tepat sangat sulit. Ada banyak aspek yang perlu dipertimbangkan:

  • objek mana kata dapat merujuk;
  • bagian mana dari pidato itu;
  • apakah itu ekspresi idiomatik;
  • semua nuansa makna;
  • dan sebagainya.

Semua aspek ini, pada akhirnya, datang ke satu hal: untuk mengetahui cara menggunakan kata.

Konsep makna dan mengapa serangkaian karakter yang diperintahkan memiliki konotasi yang pasti dalam bahasa tidak hanya pertanyaan filosofis, tetapi juga mungkin masalah terbesar yang harus ditangani oleh spesialis AI yang bekerja dengan NLP. Sangat jelas bagi orang yang berbahasa Rusia bahwa "anjing" adalah "hewan", dan itu lebih mirip "kucing" daripada "lumba-lumba", tetapi tugas ini jauh dari sederhana untuk solusi sistematis.

Setelah sedikit mengoreksi teori Wittgenstein, kita dapat mengatakan bahwa anjing terlihat seperti kucing karena mereka sering muncul dalam konteks yang sama: Anda mungkin dapat menemukan anjing dan kucing yang terkait dengan kata "rumah" dan "taman" daripada dengan kata "laut" dan "lautan". Intuisi inilah yang mendasari Word2Vec , salah satu implementasi vektor representasi kata yang paling terkenal dan sukses. Saat ini, mesin jauh dari pemahaman nyata teks panjang dan bagian, tetapi representasi vektor kata tidak diragukan lagi satu-satunya metode yang memungkinkan kita untuk mengambil langkah terbesar ke arah ini selama dekade terakhir.

Dari BoW ke Word2Vec


Dalam banyak masalah komputer, masalah pertama adalah menyajikan data dalam bentuk numerik; kata-kata dan kalimat mungkin yang paling sulit dibayangkan dalam bentuk ini. Dalam pengaturan kami, kata-kata D dipilih dari kamus, dan setiap kata dapat diberi indeks angka i .

Selama beberapa dekade, pendekatan klasik telah diambil untuk mewakili setiap kata sebagai vektor dimensi-D numerik dari semua nol kecuali satu di posisi i. Sebagai contoh, pertimbangkan kamus tiga kata: "anjing", "kucing" dan "lumba-lumba" (D = 3). Setiap kata dapat direpresentasikan sebagai vektor tiga dimensi: "anjing" sesuai dengan [1,0,0], "kucing" hingga [0,1,0], dan "lumba-lumba", jelas, [0,0,1]. Dokumen dapat direpresentasikan sebagai vektor dimensi-D, di mana setiap elemen menghitung kemunculan kata ke-i dalam dokumen. Model ini disebut Bag-of-words (BoW), dan telah digunakan selama beberapa dekade.

Meskipun sukses di tahun 90-an, BoW tidak memiliki satu-satunya fungsi kata yang menarik: artinya. Kita tahu bahwa dua kata yang sangat berbeda dapat memiliki arti yang sama, bahkan jika mereka sama sekali berbeda dari sudut pandang ejaan. "Kucing" dan "anjing" keduanya adalah hewan peliharaan, "raja" dan "ratu" dekat satu sama lain, "apel" dan "rokok" sama sekali tidak terkait. Kita tahu ini, tetapi dalam model BoW, semua kata ini berada pada jarak yang sama dalam ruang vektor: 1.

Masalah yang sama berlaku untuk dokumen: menggunakan BoW, kita dapat menyimpulkan bahwa dokumen hanya serupa jika mengandung kata yang sama beberapa kali. Dan inilah Word2Vec, yang memperkenalkan istilah pembelajaran banyak pertanyaan filosofis yang dibahas Wittgenstein dalam Studi Filosofisnya 60 tahun yang lalu.

Dalam kamus ukuran D, di mana kata itu diidentifikasi oleh indeksnya, tujuannya adalah untuk menghitung representasi vektor N-dimensi dari setiap kata untuk N << D. Idealnya, kami ingin itu menjadi vektor padat yang mewakili beberapa aspek makna semantik tertentu. Sebagai contoh, kami idealnya ingin "anjing" dan "kucing" memiliki representasi yang sama, dan "apel" dan "rokok" sangat jauh dalam ruang vektor.

Kami ingin melakukan beberapa operasi aljabar dasar pada vektor, seperti +−= . Saya ingin jarak antara vektor "aktor" dan "aktris" untuk secara substansial bertepatan dengan jarak antara "pangeran" dan "putri". Meskipun hasil ini sangat utopis, percobaan menunjukkan bahwa vektor Word2Vec menunjukkan properti yang sangat dekat dengan ini.

Word2Vec tidak secara langsung mempelajari pandangan dari ini, tetapi menerimanya sebagai produk sampingan dari klasifikasi tanpa guru. Rata-rata dataset kata corpus NLP terdiri dari serangkaian kalimat; setiap kata dalam kalimat muncul dalam konteks kata-kata di sekitarnya. Tujuan dari pengklasifikasi adalah untuk memprediksi kata target, dengan mempertimbangkan kata-kata kontekstual sebagai input. Untuk kalimat "brown dog plays in the garden" kata-kata [brown, plays, in, garden] disediakan untuk model sebagai input, dan dia harus memprediksi kata "dog". Tugas ini dianggap sebagai pembelajaran tanpa guru, karena corpus tidak perlu ditandai dengan sumber kebenaran eksternal: jika Anda memiliki serangkaian kalimat, Anda selalu dapat secara otomatis membuat contoh positif dan negatif. Melihat “anjing coklat bermain di kebun” sebagai contoh positif, kita dapat membuat banyak pola negatif, seperti “pesawat cokelat bermain di taman” atau “bermain anggur coklat di kebun”, menggantikan kata target “anjing” dengan kata-kata acak dari kumpulan data.

Dan sekarang penerapan teori Wittgenstein sangat jelas: konteksnya sangat penting untuk representasi vektor kata-kata, karena penting untuk melampirkan makna pada kata dalam teorinya. Jika dua kata memiliki makna yang sama, mereka akan memiliki representasi yang sama (jarak kecil dalam ruang dimensi N) hanya karena mereka sering muncul dalam konteks yang sama. Dengan demikian, "kucing" dan "anjing" pada akhirnya akan memiliki vektor dekat karena mereka sering muncul dalam konteks yang sama: berguna bagi model untuk menggunakan representasi vektor yang sama untuk mereka, karena ini adalah hal yang paling nyaman yang bisa dia lakukan, untuk mendapatkan hasil yang lebih baik dalam memprediksi dua kata berdasarkan konteksnya.

Artikel asli menawarkan dua arsitektur yang berbeda: CBOW dan Skip-gram. Dalam kedua kasus, representasi verbal diajarkan bersama dengan tugas klasifikasi tertentu, memberikan representasi vektor kata terbaik yang memaksimalkan kinerja model.


Gambar 1. Perbandingan arsitektur CBOW dan Skip-gram

CBOW adalah singkatan dari Continuous Bag of Words, dan tugasnya adalah menebak kata dengan konteks sebagai input. Input dan output direpresentasikan sebagai vektor dimensi-D yang diproyeksikan dalam ruang dimensi-N dengan bobot yang sama. Kami hanya mencari bobot proyeksi. Bahkan, representasi vektor kata adalah matriks D × N, di mana setiap baris mewakili kata kamus. Semua kata konteks diproyeksikan dalam satu posisi, dan representasi vektornya dirata-ratakan; oleh karena itu, urutan kata tidak mempengaruhi hasilnya.

Lewati-gram melakukan hal yang sama, tetapi sebaliknya: mencoba untuk memprediksi kata konteks C , mengambil kata target sebagai input. Tugas memprediksi beberapa kata kontekstual dapat dirumuskan kembali menjadi satu set masalah klasifikasi biner independen, dan sekarang tujuannya adalah untuk memprediksi keberadaan (atau tidak adanya) kata-kata kontekstual.

Sebagai aturan, Skip-gram membutuhkan lebih banyak waktu untuk pelatihan dan sering memberikan hasil yang sedikit lebih baik, tetapi, seperti biasa, aplikasi yang berbeda memiliki persyaratan yang berbeda, dan sulit untuk memperkirakan sebelumnya mana yang akan menunjukkan hasil terbaik. Meskipun konsepnya sederhana, mempelajari arsitektur semacam ini adalah mimpi buruk karena jumlah data dan daya pemrosesan yang diperlukan untuk mengoptimalkan bobot. Untungnya, di Internet Anda dapat menemukan beberapa representasi vektor pra-terlatih kata-kata, dan Anda dapat mempelajari ruang vektor - yang paling menarik - hanya dengan beberapa baris kode Python.

Kemungkinan peningkatan: GloVe dan fastText


Selama Word2Vec klasik dalam beberapa tahun terakhir, banyak kemungkinan perbaikan telah diusulkan. Dua yang paling menarik dan umum digunakan adalah GloVe (Stanford University) dan fastText (dikembangkan oleh Facebook). Mereka berusaha mengidentifikasi dan mengatasi keterbatasan algoritma asli.

Dalam sebuah artikel ilmiah asli , penulis GloVe menekankan bahwa pelatihan model pada konteks lokal yang terpisah membuat penggunaan statistik korpus global yang buruk. Langkah pertama untuk mengatasi batasan ini adalah membuat matriks global X , di mana setiap elemen i, j menghitung jumlah referensi ke kata j dalam konteks kata i . Gagasan penting kedua dari dokumen ini adalah pemahaman bahwa hanya probabilitas saja tidak cukup untuk prediksi nilai yang andal, dan matriks co-kejadian juga diperlukan, dari mana aspek-aspek tertentu dari nilai dapat langsung diekstraksi.

Pertimbangkan dua kata i dan j yang sangat menarik. Untuk konkret, anggaplah kita tertarik pada konsep keadaan termodinamika, yang dengannya kita dapat mengambil i = dan j = . Hubungan kata-kata ini dapat diselidiki dengan mempelajari rasio probabilitas mereka untuk kejadian bersama menggunakan kata-kata yang terdengar berbeda, k. Untuk kata-kata k yang terkait dengan es tetapi bukan uap, katakan k = [padatan, keadaan materi], kami berharap bahwa rasio Pik / Pjk akan lebih besar. Demikian pula, untuk kata k yang terkait dengan uap, tetapi tidak dengan es, katakan k = , rasionya harus kecil. Untuk kata-kata seperti "air" atau "mode", yang sama-sama terkait dengan es dan uap, atau tidak ada hubungannya dengan mereka, rasio ini harus dekat dengan persatuan.

Rasio probabilitas ini menjadi titik awal untuk mempelajari representasi vektor kata-kata. Kami ingin dapat menghitung vektor yang, dalam kombinasi dengan fungsi spesifik F, menjaga rasio ini konstan dalam ruang representasi vektor.


Gambar 2. Rumus paling umum untuk representasi vektor kata-kata dalam model GloVe

Fungsi F dan ketergantungan pada kata k dapat disederhanakan dengan mengganti eksponensial dan perbaikan offset, yang memberikan fungsi meminimalkan kesalahan dengan metode kuadrat terkecil J :


Gambar 3. Fungsi akhir dari komputasi representasi vektor kata-kata dalam model GloVe

Fungsi f adalah fungsi penghitungan yang mencoba untuk tidak membebani kecocokan yang sangat sering dan langka, sedangkan bi dan bj adalah offset untuk mengembalikan simetri fungsi. Dalam paragraf terakhir artikel ini terlihat bahwa pelatihan model ini pada akhirnya tidak jauh berbeda dengan pelatihan model Skip-gram klasik, meskipun dalam tes empiris GloVe lebih unggul daripada kedua implementasi Word2Vec.

Di sisi lain, fastText mengoreksi kelemahan Word2Vec yang sama sekali berbeda: jika pelatihan model dimulai dengan pengkodean langsung satu vektor dimensi-D, maka struktur internal kata-kata diabaikan. Alih-alih langsung menyandikan kode kata yang mempelajari representasi verbal, fastText menawarkan untuk mempelajari N-gram karakter dan mewakili kata-kata sebagai jumlah vektor N-gram. Misalnya, dengan N = 3, kata "bunga" dikodekan sebagai 6 gram 3 berbeda [<fl, flo, low, Debt, wer, er>] ditambah urutan khusus <flower>. Perhatikan bagaimana kurung sudut digunakan untuk menunjukkan awal dan akhir kata. Dengan demikian, sebuah kata diwakili oleh indeksnya dalam kamus kata-kata dan sekumpulan N-gram yang dikandungnya, dipetakan ke bilangan bulat menggunakan fungsi hash. Peningkatan sederhana ini memungkinkan Anda untuk membagi representasi N-gram antara kata-kata dan menghitung representasi vektor kata-kata yang tidak ada dalam kasus pembelajaran.

Eksperimen dan kemungkinan aplikasi


Seperti yang telah kami katakan, untuk menggunakan representasi vektor ini, Anda hanya perlu beberapa baris kode Python. Saya melakukan beberapa percobaan dengan model GloVe 50-dimensi , dilatih pada 6 miliar kata dari kalimat Wikipedia, serta dengan model fastText 300-dimensi, dilatih pada Common Crawl (yang memberikan 600 miliar token). Bagian ini menyediakan tautan ke hasil dari kedua percobaan hanya untuk membuktikan konsep dan memberikan pemahaman umum tentang topik tersebut.

Pertama-tama, saya ingin memeriksa beberapa kesamaan dasar kata-kata, fitur paling sederhana tetapi penting dari representasi vektor mereka. Seperti yang diharapkan, kata yang paling mirip dengan kata "anjing" adalah "kucing" (0,92), "anjing" (0,85), "kuda" (0,79), "anak anjing" (0,78) dan "hewan peliharaan" (0,77). Perhatikan bahwa bentuk jamak memiliki arti yang hampir sama dengan bentuk tunggal. Sekali lagi, cukup sepele bagi kita untuk mengatakan itu, tetapi untuk mobil itu sama sekali bukan fakta. Sekarang makanan: kata-kata yang paling mirip untuk "pizza" adalah "sandwich" (0,87), "sandwich" (0,86), "camilan" (0,81), "makanan yang dipanggang" (0,79), "kentang goreng" (0,79) dan "burger" ( 0,78). Masuk akal, hasilnya memuaskan, dan modelnya berperilaku cukup baik.

Langkah selanjutnya adalah melakukan beberapa perhitungan dasar dalam ruang vektor dan memeriksa seberapa benar model telah memperoleh beberapa properti penting. Memang, sebagai hasil dari penghitungan vektor +- , hasilnya adalah “aktris” (0,94), dan sebagai hasil dari penghitungan +- , kata “raja” (0,86) diperoleh. Secara umum, jika nilainya adalah a:b=c:d , maka kata d harus diperoleh sebagai d=b-a+c . Pindah ke tingkat berikutnya, tidak mungkin untuk membayangkan bagaimana operasi vektor ini bahkan menggambarkan aspek geografis: kita tahu bahwa Roma adalah ibu kota Italia, karena Berlin adalah ibu kota Jerman, bahkan +-= (0.88) , dan +-= (0.83) .

Dan sekarang untuk bagian yang menyenangkan. Mengikuti ide yang sama, kami akan mencoba menambah dan mengurangi konsep. Misalnya, Apa yang setara dengan pizza Amerika untuk Italia? +-= (0.60) , lalu (0.59) . Sejak saya pindah ke Belanda, saya selalu mengatakan bahwa negara ini adalah campuran dari tiga hal: sedikit kapitalisme Amerika, dingin dan kualitas hidup Swedia, dan, akhirnya, sejumput kekayaan Neapolitan. Dengan sedikit mengubah teorema asli, menghilangkan sedikit presisi Swiss, kita mendapatkan Holland (0,68) sebagai hasil dari ++- : cukup mengesankan, jujur.


Gambar 4. Untuk semua pembaca Belanda: anggap ini sebagai pujian, oke?

Sumber daya praktis yang baik dapat ditemukan di sini dan di sini untuk menggunakan representasi vektor pra-terlatih ini. Gensim adalah perpustakaan Python sederhana dan lengkap dengan beberapa fungsi aljabar dan kesamaan siap pakai. Representasi vektor pra-terlatih ini dapat digunakan dengan berbagai cara (dan berguna), misalnya, untuk meningkatkan kinerja penganalisa suasana hati atau model bahasa. Apa pun tugasnya, menggunakan vektor dimensi-N akan secara signifikan meningkatkan efisiensi model dibandingkan dengan pengkodean langsung. Tentu saja, pelatihan representasi vektor dalam area spesifik akan semakin meningkatkan hasilnya, tetapi ini mungkin memerlukan, mungkin, upaya dan waktu yang berlebihan.

Source: https://habr.com/ru/post/id435984/


All Articles