Makine Öğreniminde En İyi Hack'lerden Birisini Tanıtmak: Hashing Hile

2018, istenmeyen postaların ölmeye başlayacağı yıl gibi çeşitli satış yerleri tarafından karşılandı çünkü makine öğrenimi algoritmaları, gerçek postanın neyin ne olup olmadığını bulmakta neredeyse mükemmel olacak. Bunun olacağına ikna olmadım (makine öğrenmedeki gelişmeler her iki yolu da kesti), ancak ML tabanlı basit spam sınıflandırıcılarının nasıl oluşturulduğu ve önemli bir sorunun nasıl üstesinden gelineceği hakkında genel düşünceleri paylaşmak istiyorum. Makine öğreniminde en iyi hacklerden birini kullanarak: karma hile. Dış spam tespitinde de yararlıdır.

Basit bir spam sınıflandırıcısı oluşturmak

Spam sınıflandırması da dahil olmak üzere belge sınıflandırma görevleri için, genellikle bir sözcük ifadesi (BOW) gösterimi olarak bilinen şeyin oluşturulmasıyla başlanır. Bilinen bir dizi spam ve istenmeyen e-posta e-postası verildiğinde, her benzersiz kelime bir kelimeye eklenir ve tipik olarak 0'dan başlayarak benzersiz bir dizin atanır. Spam olan ve meşru olan başka:

haftada on bin dolar kazanıyorum, sadece internette dolaşıyorum! (istenmeyen e)
Gelecek haftanın başlarında bir toplantı için boş musun? (spam değil)

Veri kümesini tarar ve sözlüğümüzü oluşturmaya başlarsak, bunun gibi bir şeyle sonuçlanabiliriz:

ben: 0
Yap: 1
on: 2
bin: 3
dolar: 4
başına: 5
hafta: 6
sadece: 7
sörf: 8
9
web: 10
11:
siz: 12
Ücretsiz: 13
için: 14
a: 15
Toplantı: 16
erken: 17
sonraki: 18

Toplamda 19 benzersiz kelime var ve her birine benzersiz bir dizin atandı (hafta kelimesinin her iki örnekte de göründüğünü unutmayın). Bir sonraki adım, makine öğrenme modelimiz için özellik vektörleri oluşturmaktır. Her örnekte, kelime hazinemizdeki sözcüklerle aynı sayıda öğeyle sıfır sütun vektörü oluşturarak başlıyoruz:

haftada on bin dolar kazanıyorum, sadece internette dolaşıyorum! (istenmeyen e)
-> [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Gelecek haftanın başlarında bir toplantı için boş musun? (spam değil)
-> [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

Daha sonra, her örnekteki her kelime için, dizini almak ve bu dizindeki değeri bir artırmak için bir kelime araması gerçekleştiririz:

haftada on bin dolar kazanıyorum, sadece internette dolaşıyorum! (istenmeyen e)
-> [1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0]
Gelecek haftanın başlarında bir toplantı için boş musun? (spam değil)
-> [0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1]

Sonuçta ortaya çıkan özellik vektörleri, bir kelime kelimesi temsilidir. BOW gösterimleri genellikle noktalama işaretleri ve kelime sıralaması hakkında bilgi verir, ancak birçok sorun için bu bir sorun değildir. Daha sofistike BOW sunumları, ham kelime sayısı yerine TF-IDF ağırlıklarını ve / veya n-gramını kullanır, fakat temel fikir aynıdır.

BOW özellik vektörlerimizi aldıktan sonra, bir spam filtresi oluşturmak için ikili bir sınıflandırıcı hazırlayabiliriz. Öğrenme algoritmaları ile ilgili birçok seçenek var, ancak en yaygın şüpheliler Naif Bayes, rastgele ormanlar, lojistik regresyon ve giderek artan bir şekilde sinir ağları. Eğitimli bir model göz önüne alındığında, BOW vektörü olarak yeni bir e-postayla beslemek için sözlüğü kullanabilir ve örneğin spam olup olmadığını tahmin edebiliriz. Gerçek zamanlı çıkarım için, RAM'deki kelimeleri mümkün olduğunca hızlı tutmamız gerektiğini unutmayın.

Sorun: filtre çevresi

Spam gönderenler kurnazdır. İstenmeyen postaların filtrelenmediğinden emin olmanın popüler bir yolu, sınıflandırıcıyı öğrenmek için kullanılan kelimelerde olmayan kelimeleri karıştırmaktır. Örneğin, aşağıdakileri hafifçe kararlaştırılmış bir cümleyi düşünün:

ii mayke sen önümüzdeki hafta başında bir $$$ s sörf1ing teh webz toplantı için binlerce ücretsiz

Açıkçası, bu meşru bir e-posta düşünün bir şey değil. Fakat bu örnekte bir BOW vektörü oluşturmak için kelime bilgimizi kullanırsak ne olur? İlk sekiz kelime bizim kelime hazinemizin içinde değil ve başaramayacak. Geri kalan, aşağıdaki vektörle sonuçlanan:

ii mayke sen önümüzdeki hafta başında bir $$$ s sörf1ing teh webz toplantı için binlerce ücretsiz
-> [0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1]

Bu vektör meşru bir örnekle aynıdır, gelecek hafta başında toplantı yapmak için boş musunuz? . Örneklerimizde eğitilen herhangi bir sınıflandırıcı bu spam’in meşru olduğunu düşünüyor. Bu önemli bir sorundur ve çözülmesi düşündüğünüz kadar kolay değildir. Yeni kelimeleri kelime haznemize ekleyebiliriz, ancak bu, sonuçta ortaya çıkan özellik vektörlerinin boyutunun, kelimelerin kendisi gibi değişeceği anlamına gelir. Makine öğrenimi modelleri genellikle sabit boyutlu eğitim örneklerini öğrenir, bu nedenle modelimizi sıfırdan yeniden eğitmemiz gerekir. Bu zaman alır ve bunu yaparken, eski sınıflandırıcı spam kabul etmeye devam edecektir. A) kelime dışı kelimelerle başa çıkabilecek bir çözüme ihtiyacımız var, b) yeni bir kelime veya yanlış yazımla karşılaştığımızda her zaman modellerimizi sıfırdan incelememize gerek kalmıyor ve c) mümkün olduğu kadar doğru. RAM'de büyük bir kelime hazinesi olmadan kaçabilirsek, daha da iyi.

Karma hile tanıtımı

Karma fonksiyonlar bilgisayar bilimleri için esastır. Çok sayıda farklı karma işlevi vardır, ancak hepsi aynı şeyi yapar: isteğe bağlı boyutlardaki verileri sabit bir boyuttaki verilerle eşler. Tipik olarak, bir sayı tükürürler (karma olarak bilinir):

"John Doe" -> karma işlevi -> 34
"Jane Doe" -> karma işlevi -> 48

Bir karma değerinin hesaplandığı mantık, karma fonksiyonunun kendisine bağlıdır, ancak tüm karma fonksiyonlar aynı ortak özellikleri paylaşır:

  • Aynı girişi bir karma işleve beslersek, her zaman aynı çıktıyı verir.
  • Karma işlevinin seçimi olası çıktıların aralığını belirler, yani aralık her zaman sabittir (örneğin, 0-1024 arasındaki sayılar).
  • Karma işlevleri tek yönlüdür: karma verildiğinde, girdinin ne olduğunu belirlemek için geriye doğru arama yapamayız.
  • Karma fonksiyonlar, farklı girişler için aynı değeri verebilir (çarpışma).

Hash işlevleri hemen hemen bilgisayar bilimlerinin herhangi bir alanında inanılmaz derecede faydalıdır, ancak spam sınıflandırıcımızın kelime dışı sorununu çözmek için nasıl kullanılabilirler? Bu sorunun cevabı hemen belli değil, ancak ilk adım, kelime hazinemizden tamamen kurtulmak. Bunun yerine, BOW sunumlarımızı oluştururken, eğitim örneklerimizin her biri için çok sayıda (örneğin, 2²) element içeren sıfır sütunlu bir vektör yaparak başlayacağız:

haftada on bin dolar kazanıyorum, sadece internette dolaşıyorum! (istenmeyen e)
-> [0 0 0 0 ... 0 0 0 0] (2 ^ 28 öğe)
Gelecek haftanın başlarında bir toplantı için boş musun? (spam değil)
-> [0 0 0 0 ... 0 0 0 0] (2 ^ 28 öğe)

Daha sonra, dizeleri yiyen ve [0, 2²⁸] aralığındaki değerleri çıkaran bir karma işlevi seçeceğiz. Başka bir deyişle, karma işlevimizin hiçbir zaman özellik vektörlerimizin boyutlarının dışında bir dizine yönelik olmayacağından emin oluyoruz.

Bu ilklendirmeden sonra, her bir eğitim örneği için, her bir kelimeyi, hash fonksiyonumuz aracılığıyla birer birer besliyoruz ve verilen endeksteki değeri daha önce olduğu gibi birer birer artırıyoruz. Bunun gibi seyrek vektörlerle bitebiliriz:

haftada on bin dolar kazanıyorum, sadece internette dolaşıyorum! (istenmeyen e)
-> [0 ... 0 1 1 1 0 1 1 0 ... 0 1 1 1 1 1 0 1 1 0] (2 ^ 28 öğe)
Gelecek haftanın başlarında bir toplantı için boş musun? (spam değil)
-> [0 1 0 1 0 ... 0 1 0 ... 0 1 0 ... 0 1 1 0 1 1 0 1] (2 ^ 28 öğe)

Bu işlem karma numara olarak bilinir.

Şimdi BOW temsilimiz var ve veriler üzerinde daha önce olduğu gibi bir sınıflandırıcı yetiştirebiliriz. Basit, hayır? Ayrı bir sözlüğün kullanılmasından vazgeçtik; bu, potansiyel olarak büyük bir sözcük listesini RAM’de tutmamız gerekmediği anlamına gelir. Ancak bu sadece hoş bir yan etkidir - ele almak istediğimiz asıl konu, kelime dışı kelimeleri kullanarak filtre atmadır. Peki karma numara nasıl yardımcı olur?

Diyelim ki bir avuç seyrek 2² BOW özellik vektörü üzerinde eğitilmiş bir spam sınıflandırıcımız var. Yeni bir posta parçası göz önüne alındığında, daha önce yaptığımız gibi bir 2²⁸ vektör başlatıp her bir kelimeyi karma fonksiyonumuzdan geçiriyoruz. Önceden farklı olarak, her bir kelime bir miktar özellik değerini artırarak sona erer. BOW vektörümüze göre, her kelime - hatta yenileri - tahmin zamanında dikkate alınır. Yeni kelimeler sınıflandırıcımızın doğruluğunu daha da kötüleştiriyor, ancak spam filtresini tamamen yeni kelimeler oluşturarak atlamak artık mümkün değil. BOW vektörlerinin hepsi aynı boyutta kaldığından, her şeyi sıfırdan yeniden denemeden modelimize aşamalı olarak yeni spam / spam olmayan örneklerle yerleştirebiliriz. Bu bir çevrimiçi öğrenme şeklidir: bir kullanıcı bir e-postayı spam olarak işaretlediğinde, model tüm süreci yeniden başlatmadan bu aşamalı olarak öğrenebilir. Spam filtreleme gibi pratik bir uygulama için bu özellik özelliklerinin netleştirilmesinin açık bir faydasıdır: yeni spam / spam olmayan örnekler gelir gelmez öğrenerek saldırılara hızlı bir şekilde tepki verebiliriz.

Ama ya çarpışmalar, sorduğunu duydum? Bazı kasıtlı yanlış yazımların, hash işlevinden geçtiği gibi bazı meşru kelimelerin endeksini arttırması mümkün değil mi? Evet, olabilir, ancak vektör boyutunuzu (olabildiğince büyük yap) ve hash fonksiyonunu dikkatli bir şekilde seçtiyseniz, bunun gerçekleşmesi olasılığı göz ardı edilebilir ve öyle olsa bile, genellikle öğrenmeyi etkilemez (veya doğruluğunu etkilemez). ) bu kadar. Standart karma fonksiyonlar için dokümantasyon tipik olarak çarpışma olasılıkları içerir, bu nedenle kendi karma hile çözümünüzü yaparken bunları aradığınızdan emin olun.

Bazı durumlarda, çarpışmalar (örneğin, benzer meşru kelimeleri gruplamak için) isteyebileceğinize dikkat edin, bu durumda karma çekmeden önce bunları kovalamak isteyebilirsiniz.

Bazı son düşünceler

Karma numarası, makinenin öğrenmesinde neredeyse hak ettiği kadar sevgi almayan düzgün numaralardan biridir. Tek dezavantajı tek yönlü ters aramaların (girdi çıktısı) mümkün olmamasıdır, ancak birçok sorun için bu bir zorunluluk değildir. Daha genel terimlerle düşünmek, karma numara, standart öğrenme algoritmaları (değişken regresyon, rastgele ormanlar, ileri beslemeli sinir ağları, SVM'ler, matris çarpanları vb.) İle değişken boyutlu özellik vektörlerini kullanmanızı sağlar. Bu, çoğu makine öğrenimi uygulayıcısını en azından biraz heyecanlandırmak için yeterli olmalıdır.