Lei Feng.com: Bu, Skip-Gram modeli üzerine üç bölüme ayrılmış bir dizi öğreticidir: yapı, eğitim ve uygulama Bu makale son bölümdür: uygulama. Orijinal yazar Tian Yusu, orijinal olarak yazarda yayınlandı Sütunu bilin Leifeng.com yetkilendirildi.
Önceki sütun, Word2Vec'te Skip-Gram modelini tanıttı. Gördüyseniz, kendi Word2Vec modelinizi uygulamak için TensorFlow'u kullanmaya başlayabilirsiniz. Bu makale, Skip-Gram modelini tamamlamak için TensorFlow'u kullanacaktır. Skip-Gram'ın fikirlerine henüz aşina olmayan arkadaşlar bir önceki sütunun içeriğine göz atabilirler.
Bu gerçek savaş kodunun amacı, Skip-Gram modelindeki bazı fikirlerin ve püf noktalarının anlaşılmasını derinleştirmektir. Derlem boyutunun, derlem kalitesinin, algoritma ayrıntılarının ve eğitim maliyetinin sınırlandırılması nedeniyle, eğitim sonuçları açıkça gensim tarafından paketlenen Word2Vec ile karşılaştırılamaz. Bu kod, yeni başlayanların Skip-Gram modelinin fikirlerini anlaması ve uygulaması için uygundur.
Dil: Python 3
Paket: TensorFlow (sürüm 1.0) ve diğer veri işleme paketleri (koda bakın)
Editör: jupyter not defteri
Çevrimiçi GPU: floyd (https://www.floydhub.com/)
Veri kümesi: önceden işlenmiş Wikipedia makaleleri (İngilizce)
Makale, kod yapımı için temel olarak aşağıdaki dört bölümden oluşmaktadır:
-Veri ön işleme
-Eğitim örnek yapımı
-Model yapımı
-Model doğrulama
Burada paketlerin içe aktarılması ve verilerin yüklenmesi hakkında yazmayacağım, nispeten basit, lütfen git üzerindeki koda bakın.
Veri ön işleme bölümü temel olarak şunları içerir:
Metindeki özel sembolleri değiştirin ve düşük frekanslı kelimeleri kaldırın
Kelime segmentasyonu
Korpus oluştur
Dünya haritası
İlk olarak, ilk iki adımı tamamlamak için bir fonksiyon tanımlıyoruz, yani metin temizleme ve kelime bölütleme işlemleri.
Yukarıdaki işlev, noktalama işaretlerini değiştirme ve düşük frekanslı sözcükleri silme işlemlerini gerçekleştirir ve sözcük bölümlemesinden sonra metni döndürür.
Temizledikten sonra verilere bir göz atalım:
Kelime bölütlemeden sonraki metin ile haritalama tablomuzu oluşturabiliriz, kod tekrarlanmayacaktır, herkes aşina olmalıdır.
Metin ve sözlüğün boyutuna da bakabiliriz:
Metnin tamamındaki kelimelerin boyutu yaklaşık 16.6 milyon ve sözlüğün boyutu yaklaşık 60.000'dir Bu ölçek aslında eğitilmiş kelime vektörü için yeterli değildir, ancak biraz daha iyi bir model eğitilebilir.
Skip-gram'da, eğitim örneklerinin formunun (giriş kelimesi, çıkış kelimesi) olduğunu biliyoruz, burada çıkış kelimesi giriş kelimesinin bağlamıdır. Model gürültüsünü azaltmak ve eğitimi hızlandırmak için, durdurma kelimeleri gibi gürültü faktörlerini ortadan kaldırmak için gruplar oluşturmadan önce örnekleri örneklememiz gerekir.
örnekleme
Modelleme sürecinde, "the" ve "a" gibi birçok yaygın kelime (aynı zamanda durdurma kelimeleri olarak da adlandırılır) eğitim metninde görünecek ve bu kelimeler eğitimimize çok fazla gürültü getirecektir. Son makale olan Word2Vec'te, modelin gürültüsünü azaltmak ve eğitimi hızlandırmak için örneklerin örneklenmesi ve yüksek frekanslı durdurma kelimelerinin kaldırılması gerektiğinden bahsedilmişti.
Silinen her kelimenin olasılığını hesaplamak için aşağıdaki formülü kullanıyoruz:
Bunlar arasında f (wi) wi kelimesinin görülme sıklığını temsil eder. t, genellikle 1e-3 ile 1e-5 arasında bir eşiktir.
Yukarıdaki kod, örnekteki her bir kelimenin silinme olasılığını hesaplar ve örnekler olasılığa dayanır Şimdi elimizde örneklenen kelime listesi var.
Toplu oluştur
Önce skip-gram'ın örnek formatını inceleyelim. skip-gram, içeriğe dayalı olarak geçerli girdi sözcüğünü tahmin eden CBOW'dan farklıdır. Skip-gram, bağlamı bir girdi sözcüğüne göre tahmin eder, böylece bir girdi sözcüğü birden çok bağlama karşılık gelir. "Hızlı kahverengi tilki tembel köpeğin üzerinden atlar" şeklinde bir kestane alalım. Skip_window = 2'yi sabitlersek, o zaman tilki bağlamı, eğer bizim batch_size = 1 ise, o zaman bir grupta aslında dört eğitim örneği vardır.
Yukarıdaki analiz, iki adımda koda dönüştürülür: Birincisi, her bir giriş kelimesinin bağlamını bulmak ve ikincisi, bağlama dayalı bir toplu iş oluşturmaktır.
Birincisi, giriş kelimesinin bağlam kelime listesini bulmaktır:
Kelime listesinde karşılık gelen bağlamı bulmak için bu indeks numarasına dayalı olarak bir kelime indeks numarasını almak için bir get_targets işlevi tanımlarız (varsayılan window_size = 5). Lütfen burada küçük bir numara olduğunu unutmayın.Giriş kelimesi bağlamını gerçekten seçtiğimde, kullanılan pencere boyutu aralıkta rastgele bir sayıdır. Buradaki amaç, modelin giriş kelimesine daha yakın kelimelere daha fazla dikkat etmesini sağlamaktır.
Yukarıdaki işleve sahip olduktan sonra, bağlam kelimesini giriş kelimesine göre kolayca bulabiliriz. Bu sözlerle eğitim için grubumuzu oluşturabiliriz:
Yukarıdaki kodun toplu işlemesine dikkat edin. Her girdi sözcüğü için birden çok çıktı sözcüğü (bağlam) olduğunu biliyoruz. Örneğin, girdimiz "tilki" dir ve bağlam şu şekildedir, o zaman bir tilki partisi içinde dört eğitim örneği vardır ,,,.
Veri ön işleme bittikten sonra modelimizi oluşturmamız gerekiyor. Eğitimi hızlandırmak ve modeldeki kelime vektörlerinin kalitesini iyileştirmek için, ağırlıkları güncellemek için negatif örnekleme kullanıyoruz.
Gömme katmanına giriş katmanı
Girdi katmanından gizli katmana kadar olan ağırlık matrisinin boyutu gömme katmanı olarak verilmelidir.Genellikle embeding_size 50-300 arasında ayarlanır.
Gömme katmanının aranması TensorFlow'da gömülme_bakarak gerçekleştirilir, bakınız:
Katmanı çıktı katmanına gömme
Atlama gramında, her bir giriş kelimesinin birden fazla bağlam kelimesi aslında bir ağırlık matrisini paylaşır ve her bir (giriş kelimesi, çıkış kelimesi) eğitim örneğini girdi olarak kullanırız. Eğitimi hızlandırmak ve kelime vektörlerinin kalitesini artırmak için ağırlıkları güncellemek için negatif örnekleme kullanıyoruz.
TensorFlow'daki sampled_softmax_loss, negatif örnekleme nedeniyle, aslında modelin eğitim kaybını hafife alacağız. Daha fazla ayrıntı için:
Lütfen koddaki softmax_w boyutunun vocab_size x embedding_size olduğunu unutmayın, bunun nedeni TensorFlow'daki sampled_softmax_loss içindeki parametre ağırlıklarının boyutudur.
Yukarıdaki adımlarda modelin çerçevesini oluşturduk, aşağıdaki modeli eğitip eğitelim. Eğitimin her aşamasını daha sezgisel olarak gözlemleyebilmek için. Birkaç kelime seçelim ve benzer kelimelerin eğitim sürecinde nasıl değiştiğini görelim.
Eğitim modeli:
Lütfen buraya dikkat edin, doğrulama setinde kod basımı benzer kelimeleri sık sık yapmamaya çalışın çünkü burada fazladan bir hesaplama adımı olacak yani hesaplama kaynaklarını tüketecek olan benzerliğin hesaplanması ve hesaplama süreci çok yavaş. Bu yüzden kodda, sonucu bir kez yazdırmak için 1000 tur ayarladım.
Nihai eğitim sonuçlarından model, bir gibi kelimeleri ve altın gibi metal kelimeleri saymak gibi bazı yaygın kelimelerin anlamlarını öğrenmeye devam etti ve hayvanlarda benzer kelimeler nispeten doğrudur.
Eğitim sonuçlarımızı daha kapsamlı gözlemleyebilmek için, yüksek boyutlu kelime vektörlerini görselleştirmek için sklearn'de TSNE kullanıyoruz. Daha fazla ayrıntı için:
Yukarıdaki resimde yüksek boyutlu kelime vektörü, TSNE'den geçen mesafeye göre iki boyutlu bir koordinat sisteminde gösterilmektedir.Resim halihazırda git kütüphanesindedir.Orijinal resmi görmek isteyenler gitmek için git ~
Ayrıntılara bakalım:
Yukarıda, tüm büyük görüntünün kısmi bir alanı gösterilmektedir ve etkinin oldukça iyi olduğunu görebilirsiniz.
Etkiyi iyileştirmek için ipuçları:
Eğitim örneklerini artırmak, külliyat ne kadar büyükse model o kadar öğrenilebilir bilgi öğrenebilir.
Pencere boyutunu artırarak daha fazla bağlamsal bilgi elde edilebilir.
Gömme boyutunu artırmak, boyutsal bilgi kaybını azaltabilir, ancak çok büyük olmamalıdır.Genellikle 50-300 arası bir ölçek kullanırım.
Çince kelime vektör hesaplama kodu da git kodunda sağlanmıştır. Aynı zamanda, bir Çince eğitim külliyatı sağlanır. Derleme, bir işe alım web sitesinden taradığım işe alım verileridir ve kelime segmentasyonu ve durdurma kelimelerinin kaldırılmasını gerçekleştirdim (git'den temin edilebilir), ancak külliyat çok küçük ve eğitim etkisi değil bu iyi.
Yukarıdakiler modelle eğittiğim Çince verilerdir. Word ve excel, office gibi bazı anlambilimlerin çok yakın olduğunu, ppt ve proje, kelime işleme vb. Mantıksal düşünme ve dil ifadesi gibi bazı anlambilimlerin çıkarıldığını görebilirsiniz, ancak genel etki hala devam ediyor Çok kötü. Bir yandan, külliyatın boyutu çok küçük (sadece 70 megabaytlık bir külliyat), diğer yandan model ayarlanmamış. İlgilenen öğrenciler daha iyi sonuçlar olup olmayacağını görmeye çalışabilirler.
Kodun tamamını görün:
Leifeng.com'da İlgili Okumalar:
Doğal dil işlemeye (NLP) başlayamayacağınızdan değil, ancak onu açmanın doğru yolunu bulamadınız
Yüz algılama-OpenCV teknik öğreticisine ulaşmak için 25 satır Python kodu