Sinir Ağı ayrıştırma dize veri?


28

Böylece, bir sinir ağının kalıpları tanımak ve girdileri sınıflandırmak için nasıl çalışabileceğini öğrenmeye başladım ve yapay bir sinir ağının görüntü verilerini nasıl toplayabildiğini ve görüntüleri kategorize edebileceğini gördüm ( convnetj'lerle demo ) ve burada anahtar görüntünün altını çizmektir ve her piksel bir giriş nöronunu ağa uyarır.

Ancak, bu dize girişleriyle yapılabilir mümkünse kafamı sarmaya çalışıyorum? Elimdeki kullanım durumu, bir kullanıcının izlediği filmler için bir "öneri motoru". Filmlerde çok sayıda dize verisi (başlık, arsa, etiket) vardır ve bu filmi tanımlayan birkaç anahtar kelimeye kadar metni "alt örnekleme" yapabileceğimi hayal edebiliyorum, ancak bu filmi tanımlayan ilk beş kelimeyi çözümlesem de, I Bir dizi filmi karşılaştırmak için her ingilizce kelime için giriş nöronlarına ihtiyacım olacağını mı düşünüyorsunuz? Giriş nöronlarını sadece sette kullanılan kelimelerle sınırlandırabilirim, ancak daha sonra yeni filmler ekleyerek büyüyebilir / öğrenebilir mi (kullanıcı yeni bir kelime izliyor, yeni kelimelerle)? Gördüğüm kütüphanelerin çoğu, sistem eğitildikten sonra yeni nöronların eklenmesine izin vermiyor mu?

Dize / sözcük / karakter verilerini bir sinir ağına girişlerle eşlemenin standart bir yolu var mı? Yoksa sinir ağı gerçekten de böyle bir dize verilerini ayrıştırma işi için doğru bir araç değil mi (dize verisinde desen eşleştirme için daha iyi bir araç nedir)?

Yanıtlar:


19

Doğal dil verisine ilişkin tahmin için bir sinir ağı kullanmak zor bir iş olabilir, ancak bunu mümkün kılmak için denenmiş ve doğru yöntemler vardır.

Doğal Dil İşleme (NLP) alanında, metin genellikle kelimeler modeli çantası kullanılarak temsil edilir. Başka bir deyişle, n'nin kelime hazinenizdeki kelime sayısı olduğu ve her bir kelimenin vektördeki bir öğeye karşılık geldiği n uzunluğuna sahip bir vektörünüz vardır. Metni sayısal verilere dönüştürmek için, her kelimenin oluşum sayısını sayarsınız ve bu değeri kelimeye karşılık gelen vektörün dizinine yerleştirirsiniz. Wikipedia bu dönüşüm sürecini tanımlamak için mükemmel bir iş yapıyor. Vektörün uzunluğu sabit olduğundan, bir dizine eşlenmeyen yeni sözcüklerle uğraşmak zordur, ancak bu sorunun azaltılmasına yardımcı olmanın yolları vardır (arama özelliği hash ).

Bu temsil yönteminin birçok dezavantajı vardır - bitişik kelimeler arasındaki ilişkiyi korumaz ve çok seyrek vektörlerle sonuçlanır. N-gram'a bakmak, kelime ilişkilerini koruma sorununu gidermeye yardımcı olur, ama şimdilik ikinci soruna odaklanalım.

Doğrudan bu seyrek vektörlerle uğraşmak zordur (birçok lineer cebir kütüphanesi, seyrek girdilerin işlenmesinde kötü bir iş çıkarır), bu nedenle çoğu zaman bir sonraki adım boyutluluk azaltmadır. Bunun için konu modelleme alanına başvurabiliriz : Latent Dirichlet Allocation (LDA) ve Latent Semantic Analysis (LSA) gibi teknikler , bu seyrek vektörlerin yoğun bir vektöre sıkıştırılmasını, bir dokümanın konuların bir kombinasyonu olarak temsil edilmesini sağlar. Kullanılan konu sayısını ve bunu yaparken LDA veya LSA tarafından üretilen çıktı vektörünün boyutunu düzeltebilirsiniz. Bu boyutsallık azaltma işlemi, minimum miktarda bilgi kaybetmeye çalışırken girdi vektörünün boyutunu büyük ölçüde azaltır.

Son olarak, tüm bu dönüşümlerden sonra, konu modelleme sürecinin çıktılarını sinir ağınızın girdilerine besleyebilirsiniz.


1
Başka sorularınız varsa bana bildirin ve daha fazla ayrıntı sağlamak için elimden geleni yapacağım.
Madison Mayıs

Teşekkürler, bu araştırmaya devam etmek için bana harika terimler verir!
MidnightLightning,

Bu arada, "özellik hash" ile ilgili olabilir, çünkü bu kripto para birimi koduyla çalışmaktan aşina olduğum bir çiçek filtresine çok benziyor . Bir karma işleve sahip olmanın bir girdi özelliğinin bir indeks işaretini ayarlamak için ikinci bir karma işlevine ihtiyaç duymak yerine, birden fazla dizin konumuna (çiçek-filtre tarzı) bağlanması daha etkili olup olmadığını merak ediyorum ...
MidnightLightning

6

@Emre ve @Madison May'ın cevapları, eldeki sorun hakkında iyi puan veriyor. Sorun dizginizi NN'ye giriş için bir özellik vektörü olarak temsil etmektir.

İlk olarak, sorun işlemek istediğiniz dizenin boyutuna bağlıdır. Uzun dizgiler, belirteçleri (genellikle kelimeler) içeren bu ayarda genellikle belge olarak adlandırılır. Bireysel belirteçlerle / kelimelerle ilgilenmek için ayrı yöntemler vardır.

Belgeleri temsil etmenin çeşitli yolları vardır. Birçoğu sözcüklerin varsayımını yapar. En basit türler, belgeyi sözcük sayısının bir vektörü veya terim sıklığı (tf) olarak temsil eder. Belge uzunluğunun etkilerini ortadan kaldırmak için, genellikle insanlar bir terimin gösterdiği belge sayısı, belge sıklığı ( tf-idf ) ile normalleşmeyi tercih eder .

Başka bir yaklaşım, verinin gizli alt boyutlu gösterimini öğrenen konu modellemesidir. LDA ve LSI / LSA tipik seçimlerdir, ancak denetimsiz olduğunu hatırlamak önemlidir. Öğrenilen temsil, NN'nizle yaptığınız her denetimli öğrenme için mutlaka ideal olmayacaktır. Konu modellemesi yapmak istiyorsanız, denetimli konu modellerini de deneyebilirsiniz .

Tek tek kelimeler için, kelimeleri keyfi bir alana yerleştirmek için NN'lerden yararlanan word2vec'i kullanabilirsiniz . Bu öğrenilen uzaydaki iki kelime vektörü arasındaki benzerlik, anlamsal benzerliğe karşılık gelme eğilimindedir.

Daha yakın zamanda öncülük eden bir yaklaşım, ilk önce word2vec benzeri bir kelime modelini öğrenen paragraf vektörleridir , daha sonra sözcük kümelerinin (herhangi bir boyuttaki belgenin) dağıtılmış bir gösterimini öğrenmek için bu gösterimi temel alır. Bu, birçok uygulamada son teknoloji sonuçları göstermiştir.

NLP'de NN'ler kullanılırken, insanlar Genellikle Tekrarlayan Sinir Ağları ( Uzun Kısa Süreli Bellek ağları gibi) gibi farklı mimariler kullanırlar . Gelen bazı durumlarda insanların bile kullanmış Evrişimsel Sinir Ağları metin üzerinde.


Word2Vec gerçekten soruya en doğru cevap olduğunu düşünüyorum. Nasıl eğitileceği ve nasıl kullanılacağı hakkında gerçekten güzel bir Kaggle öğreticisi var: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

Teşekkürler, word2vec bağlantısını unuttum, bir tane ekleyeceğim (burada listelenene ek olarak!)
jamesmf 28:15

3

Bu, sinir ağları ile ilgili bir sorun değil, makine öğrenmesinde metinsel verileri temsil etmekle ilgili bir problemdir. Filmleri, oyuncuları ve temayı kategorik değişkenler olarak temsil edebilirsiniz. Arsa daha karmaşıktır; Muhtemelen bunun için bir konu modeli istersiniz , ama siz bir şeyleri bulana kadar bunu dışarıda bırakırdım. Bahsettiğiniz metinsel "alt örnekleme" tam olarak öyle.

Yapay sinir ağları için kategorik değişkenleri nasıl kodlayacağınızı öğrenmek için bu eğitime bakın . Ve iyi şanslar!


Bunun tüm makine öğreniminde açıkça bir sorun olmadığını, sadece makine öğreniminde her yerde bulunmayan özellik vektörleri üretmeye gelince bir sorun olduğunu kaydetmeye değer.
Slater Victoroff

Ne tür bir makine öğrenmesi özellikleri kullanmaz?
Emre,

Rastgele orman, sinir ağlarında gördüğünüz türden bir özellik vektörünü almanın sorun olmadığı bir şeye iyi bir örnektir. Birçok denetimsiz yöntem de özellik vektörlerinden ziyade ham kelimeler üzerinde çalışır. Not: Özellikleri kullanmayan yöntemler olduğunu söylemedim, yalnızca katı bir şekilde yapılandırılmış vektörlere dayanmayan yöntemler olduğunu söylemedim.
Slater Victoroff

"Tamamen yapılandırılmış" derken ne demek istediğini anlamadım.
Emre,

kesinlikle yapılandırılmış bir sözlük, bir ağırlık matrisi ve bir dizi karakter dizisine karşılık unint8'lerin 1d vektörüdür
Slater Victoroff

0

Metin ile sinir ağlarının deneme-sınama uygulaması için aşağıdaki 2 yolu denedim. Sonuncusu oldukça iyi çalışır, ancak sınırlamaları vardır.

  1. Word2vect veya NLTK / custom word jetonlarını kullanarak kelime hazinesi oluşturun ve her kelimeye bir dizin atayın. Kelimeyi sayı olarak temsil eden bu indekstir.

    Zorluklar:

    • Dizinlerin özellik ölçeklendirme kullanılarak "normalize edilmesi" gerekir.
    • Sinir ağının çıktısı küçük bir değişime bile sahipse, çıktı beklenmeyen kelimeye bir endeks olabilir (örneğin, beklenen çıktı 250 ise; ancak NN 249 ya da 251 çıktı verirsa, o zaman sayısal bağlamdan yakın bir çıktı olabilir; farklı kelimelerin indeksleridir). Burada çıkış endeksi oluşturmak için tekrarlayan NN'den yararlanılabilir.
    • Kelimelere yeni kelimeler eklenirse, belirteç endeksleri yeniden ölçeklendirilmelidir. Önceden ölçeklendirilmiş değerlerle eğitilmiş model geçersiz olabilir ve yeniden eğitilmiş olması gerekir.
  2. Kimlik matrisini kullanın, örneğin "n" kelimeleri "nx n" veya (n-1 x n-1) matrisini kullanır; burada her satır ve sütun bir kelimeyi temsil eder. Kavşak hücresine "1" ve dinlenme yerlerine "0" koyun. ( referans )

    Zorluklar:

    • Her giriş ve çıkış değeri "nx 1" vektörüdür. Büyük boyutlu bir kelime için onun hantal bir hesaplama ve yavaş.
    • Eğer sözlüğe yeni kelimeler eklenirse, kimlik matrisi (yani kelime vektörü) yeniden hesaplanmalıdır. Önceden hesaplanmış vektörlerle eğitilmiş model geçersiz olabilir ve yeniden eğitilmiş olması gerekir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.