El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Birkaç ay önce Google'daki meslektaşlarımız yürütülen Sansasyonel bir şekilde elde edilen görüntüler için bir sınıflandırıcı oluşturmak amacıyla Kaggle'da bir yarışma oyun "Hızlı çizim!" Aralarında Yandex geliştiricisi Roman Vlasov'un da bulunduğu ekip yarışmada dördüncü oldu. Ocak ayı makine öğrenimi eğitiminde Roman, ekibinin fikirlerini, sınıflandırıcının son uygulamasını ve rakiplerinin ilginç uygulamalarını paylaştı.


- Herkese selam! Benim adım Roma Vlasov, bugün size Quick, Draw'dan bahsedeceğim! Doodle Tanıma Yarışması.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Ekibimizde beş kişi vardı. Birleşme son tarihinden hemen önce katıldım. Biz şanssızdık, biraz sarsıldık ama biz para pozisyonundan sarsıldık, onlar da altın pozisyonundan sarsıldılar. Ve onurlu bir dördüncülük elde ettik.

(Yarışma sırasında takımlar, önerilen veri setinin bir bölümünde gösterilen sonuçlara göre oluşturulan bir derecelendirmede kendilerini gözlemlediler. Nihai derecelendirme ise veri setinin başka bir bölümünde oluşturuldu. Bu şekilde yapıldı. yarışma katılımcılarının algoritmalarını belirli verilere göre ayarlamadıklarını, bu nedenle finallerde derecelendirmeler arasında geçiş yaparken pozisyonlar biraz sarsılıyor (İngilizce sarsıntısından - karıştırmaya): diğer verilerde sonuç ortaya çıkabilir farklı olmak için. Roman'ın takımı ilk üçte yer aldı. Bu durumda, ilk üç para, parasal derecelendirme bölgesi, çünkü yalnızca ilk üçe para ödülü verildi. Değişiklikten sonra takım zaten dördüncü sırada. Aynı şekilde diğer takım da galibiyeti, altın sırayı kaybetti. - Ed.)

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Yarışma aynı zamanda Evgeniy Babakhnin'in büyük usta alması, Ivan Sosin'in usta olması, Roman Soloviev'in büyük usta olarak kalması, Alex Parinov'un usta olması, benim uzman olmam ve şimdi zaten bir usta olması açısından da önemliydi.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Nedir bu Hızlı, Beraberlik? Bu Google'ın bir hizmetidir. Google'ın amacı yapay zekayı popülerleştirmekti ve bu hizmetle sinir ağlarının nasıl çalıştığını göstermek istiyordu. Oraya gidiyorsunuz, Hadi çizelim'e tıklıyorsunuz ve size söylendiği yeni bir sayfa açılıyor: bir zikzak çizin, bunu yapmak için 20 saniyeniz var. Mesela buradaki gibi 20 saniyede zikzak çizmeye çalışıyorsunuz. Başarılı olursanız ağ bunun bir zikzak olduğunu söylüyor ve yolunuza devam ediyorsunuz. Böyle sadece altı resim var.

Google'ın ağı çizdiğiniz şeyi tanıyamazsa göreve bir çarpı işareti konurdu. Daha sonra size bir çizimin ağ tarafından tanınıp tanınmamasının gelecekte ne anlama geleceğini anlatacağım.

Bu hizmet oldukça fazla sayıda kullanıcı topladı ve kullanıcıların çizdiği tüm resimler günlüğe kaydedildi.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Yaklaşık 50 milyon görsel toplamayı başardık. Yarışmamızın antrenman ve test tarihi bundan oluşturuldu. Bu arada, testteki veri miktarı ve sınıf sayısının kalın harflerle vurgulanmasının bir nedeni var. Biraz sonra size onlardan bahsedeceğim.

Veri formatı aşağıdaki gibiydi. Bunlar sadece RGB görüntüleri değil, kabaca söylemek gerekirse kullanıcının yaptığı her şeyin bir kaydıdır. Hedefimiz Word'dür, ülke kodu doodle'ın yazarının geldiği yerdir, zaman damgası ise zamandır. Tanınan etiket yalnızca ağın görseli Google'dan tanıyıp tanımadığını gösterir. Çizimin kendisi de bir dizidir; kullanıcının noktalarla çizdiği bir eğrinin yaklaşık değeridir. Ve zamanlamaları. Bu, resmin çizilmeye başladığı andan itibaren geçen zamandır.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Veriler iki formatta sunuldu. Bu ilk formattır ve ikincisi basitleştirilmiştir. Oradan zamanlamaları kestiler ve bu nokta kümesini daha küçük bir nokta kümesiyle yaklaştırdılar. Bunun için kullandılar Douglas-Pecker algoritması. Basitçe düz bir çizgiye yaklaşan geniş bir nokta kümeniz var, ancak aslında bu çizgiye yalnızca iki noktayla yaklaşabilirsiniz. Algoritmanın fikri bu.

Veriler şu şekilde dağıtıldı. Her şey aynı ama bazı aykırılıklar da var. Sorunu çözerken bakmadık. Önemli olan, gerçekten az sayıda sınıf olmamasıydı; ağırlıklı örnekleyiciler ve aşırı veri örneklemesi yapmak zorunda değildik.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Resimler neye benziyordu? Bu, “uçak” sınıfı ve tanınan ve tanınmayan etiketlerle bu sınıftan örneklerdir. Oranları 1'e 9 civarındaydı. Gördüğünüz gibi veriler oldukça gürültülü. Bunun bir uçak olduğunu tahmin ediyorum. Tanınmayan bir şeye bakarsanız, çoğu durumda bu sadece gürültüdür. Birisi "uçak" yazmayı bile denedi ama görünüşe göre Fransızca.

Katılımcıların çoğu basitçe ızgaraları aldı, bu çizgi dizisinden verileri RGB resimleri olarak çekti ve bunları ağa attı. Yaklaşık olarak aynı şekilde çizdim: Bir renk paleti aldım, ilk çizgiyi bu paletin başlangıcındaki bir renkle, son çizgiyi paletin sonundaki başka bir renkle ve aralarına çizdim. Bu paleti kullanarak her yere enterpolasyon yaptım. Bu arada, bu, ilk slaytta olduğu gibi sadece siyah olarak çizmenizden daha iyi bir sonuç verdi.

Ivan Sosin gibi diğer ekip üyeleri çizim konusunda biraz farklı yaklaşımlar denediler. Bir kanalla basitçe gri bir resim çizdi, başka bir kanalla her konturu baştan sona 32'den 255'e kadar bir eğimle çizdi ve üçüncü kanalla da 32'den 255'e kadar tüm konturların üzerine bir degrade çizdi.

Bir başka ilginç şey ise Alex Parinov'un ülke kodunu kullanarak bilgileri ağa yüklemesidir.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Yarışmada kullanılan metrik Ortalama Ortalama Hassasiyettir. Rekabet açısından bu metriğin özü nedir? Üç tahmin verebilirsiniz ve bu üçünde doğru tahmin yoksa 0 alırsınız. Doğru tahmin varsa sırası dikkate alınır. Ve hedef sonuç, tahmininizin sırasına göre 1'e bölünerek sayılacaktır. Mesela üç tahmin yaptınız, doğru olan ilki, sonra 1'i 1'e bölersiniz ve 1 elde edersiniz. Tahmin doğruysa ve sırası 2 ise 1'i 2'ye bölerseniz 0,5 elde edersiniz. Peki, vb.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Veri ön işleme ile - resimlerin nasıl çizileceği vb. - biraz karar verdik. Hangi mimarileri kullandık? PNASNet, SENet gibi kalın mimarileri ve SE-Res-NeXt gibi zaten klasik olan mimarileri kullanmaya çalıştık, giderek yeni rekabetlere giriyorlar. ResNet ve DenseNet de vardı.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Bunu nasıl öğrettik? Çektiğimiz tüm modeller imagenet üzerinde önceden eğitildi. Çok fazla veri, 50 milyon görüntü olmasına rağmen, yine de imagenet üzerinde önceden eğitilmiş bir ağ alırsanız, onu sıfırdan eğittiğinizden daha iyi sonuçlar verdi.

Hangi öğretim tekniklerini kullandık? Bu, biraz sonra bahsedeceğim Sıcak Yeniden Başlatmalarla Cosing Tavlamasıdır. Bu, neredeyse tüm son yarışmalarımda kullandığım bir teknik ve onlarla birlikte, iyi bir minimum seviyeye ulaşmak için ızgaraları oldukça iyi eğittiğim ortaya çıktı.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Sonraki Platoda Öğrenme Oranını Azaltın. Ağı eğitmeye başlıyorsunuz, belli bir öğrenme oranı belirliyorsunuz, öğretmeye devam ediyorsunuz ve kaybınız yavaş yavaş belli bir değere yaklaşıyor. Bunu kontrol ediyorsunuz, örneğin on dönem boyunca kayıp hiç değişmedi. Öğrenme oranınızı bir miktar azaltırsınız ve öğrenmeye devam edersiniz. Tekrar biraz düşer, minimumda yakınsar ve siz yine öğrenme oranını düşürürsünüz ve bu böyle devam eder, ta ki ağınız nihayet birleşene kadar.

Sırada ilginç bir teknik var: Öğrenme oranını düşürmeyin, parti boyutunu artırın. Aynı isimde bir makale var. Bir ağı eğitirken öğrenme oranını azaltmanıza gerek yoktur; yalnızca toplu iş boyutunu artırabilirsiniz.

Bu teknik, bu arada, Alex Parinov tarafından kullanıldı. 408'e eşit bir partiyle başladı ve ağı belli bir seviyeye ulaştığında parti büyüklüğünü ikiye katladı, vs.

Aslında parti büyüklüğünün hangi değere ulaştığını hatırlamıyorum ama ilginç olan Kaggle'da aynı tekniği kullanan ekipler vardı, parti büyüklükleri yaklaşık 10000'di.Bu arada, derin öğrenme için modern çerçeveler, örneğin Örneğin PyTorch bunu çok kolay bir şekilde yapmanızı sağlar. Grubunuzu oluşturur ve onu olduğu gibi değil, bütünüyle ağa gönderirsiniz, ancak video kartınıza sığacak şekilde parçalara bölersiniz, degradeleri hesaplar ve tüm grup için degradeyi hesapladıktan sonra güncellersiniz. ağırlıklar.

Bu arada, veriler oldukça gürültülü olduğundan ve büyük parti boyutu, eğimi daha doğru bir şekilde tahmin etmenize yardımcı olduğundan, bu yarışmaya hala büyük parti boyutları dahil edildi.

Çoğunlukla Roman Soloviev tarafından kullanılan sahte etiketleme de kullanıldı. Testteki verilerin yaklaşık yarısını gruplar halinde örnekledi ve ızgarayı bu tür gruplar üzerinde eğitti.

Resimlerin boyutu önemliydi ama gerçek şu ki, çok fazla veriniz var, uzun süre antrenman yapmanız gerekiyor ve resim boyutunuz oldukça büyükse o zaman çok uzun bir süre antrenman yapacaksınız. Ancak bu, son sınıflandırıcınızın kalitesine fazla bir katkı sağlamadı, dolayısıyla bir çeşit ödünleşim kullanmaya değerdi. Ve sadece boyutları çok büyük olmayan resimleri denedik.

Her şey nasıl öğrenildi? İlk önce küçük boyutlu fotoğraflar çekildi, üzerlerinde birkaç dönem çalıştırıldı, bu oldukça zaman aldı. Daha sonra büyük boyutlu resimler verildi, ağ eğitildi, daha sonra daha da fazlası, onu sıfırdan eğitmemek ve çok fazla zaman kaybetmemek için.

Optimize ediciler hakkında. SGD ve Adam'ı kullandık. Bu sayede genel sıralamada 0,941-0,946 hız veren tek bir model elde etmek mümkün oldu ki bu oldukça iyi.

Modelleri bir şekilde birleştirirseniz 0,951 civarında bir yere ulaşırsınız. Bir teknik daha kullanırsanız, tıpkı bizim gibi, genel kurulda 0,954'lük bir final puanı alacaksınız. Ancak daha sonra bunun hakkında daha fazla bilgi vereceğiz. Şimdi size modelleri nasıl monte ettiğimizi ve bu kadar son bir hıza nasıl ulaştığımızı anlatacağım.

Daha sonra Sıcak Yeniden Başlatmalarla Cosing Tavlama veya Sıcak Yeniden Başlatmalarla Stokastik Gradyan İnişi hakkında konuşmak istiyorum. Kabaca konuşursak, prensipte herhangi bir optimize ediciyi kullanabilirsiniz, ancak mesele şu: yalnızca bir ağı eğitirseniz ve yavaş yavaş minimuma yakınsarsa, o zaman her şey yolunda gider, bir ağ elde edersiniz, belirli hatalar yapar, ancak siz onu biraz farklı şekilde eğitebiliriz. Başlangıçta bir öğrenme hızı belirleyeceksiniz ve bu formüle göre yavaş yavaş azaltacaksınız. Bunu düşürürsünüz, ağınız minimum seviyeye gelir, sonra ağırlıkları kaydedersiniz ve eğitimin başlangıcındaki öğrenme oranını yeniden ayarlarsınız, böylece bu minimumdan yukarıya doğru bir yere gidersiniz ve öğrenme oranınızı tekrar düşürürsünüz.

Böylece, kaybınızın artı veya eksi aynı olacağı birkaç minimum seviyeyi aynı anda ziyaret edebilirsiniz. Ancak gerçek şu ki, bu ağırlıklara sahip ağlar, tarihinizde farklı hatalar verecektir. Bunların ortalamasını alarak bir tür yaklaşım elde edersiniz ve hızınız daha yüksek olur.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

Modellerimizi nasıl monte ettiğimiz hakkında. Sunumun başında testteki veri miktarına ve ders sayısına dikkat etmem gerektiğini söyledim. Test setindeki hedef sayısına 1 eklerseniz ve sınıf sayısına bölerseniz 330 sayısını elde edersiniz ve bu, forumda testteki sınıfların dengeli olduğu yazıyordu. Bu kullanılabilir.

Buna dayanarak, Roman Soloviev bir ölçüm ortaya çıkardı, biz buna Proxy Skoru adını verdik ve bu skor tablosuyla oldukça iyi bir korelasyona sahipti. Önemli olan şu: bir tahmin yaparsınız, tahminlerinizden ilk 1'ini alırsınız ve her sınıf için nesne sayısını sayarsınız. Daha sonra her değerden 330 çıkarın ve elde edilen mutlak değerleri toplayın.

Aşağıdaki değerler elde edildi. Bu, araştırma yapan bir skor tablosu oluşturmamıza değil, yerel olarak doğrulama yapmamıza ve topluluklarımız için katsayılar seçmemize yardımcı oldu.

Bir toplulukla böyle bir hıza ulaşabilirsin. Başka ne yapabilirdim? Diyelim ki testinizdeki sınıfların dengeli olduğu bilgisini kullandınız.

Dengeleme farklıydı. Bunlardan birine bir örnek - birinci olan adamlardan dengeleme.

Biz ne yaptık? Dengelememiz oldukça basitti, bunu Evgeny Babakhnin önerdi. İlk önce tahminlerimizi ilk 1'e göre sıraladık ve sınıf sayısı 330'u geçmeyecek şekilde adayları seçtik. Ancak bazı sınıflar için 330'dan az tahminciyle karşılaşıyorsunuz. Tamam, hadi ilk 2 ve ilk 3'e göre de sıralama yapalım. Adayları da biz seçeceğiz.

Dengelememiz ilk etaptaki dengelemeden nasıl farklıydı? Yinelemeli bir yaklaşım kullandılar, en popüler sınıfı aldılar ve o sınıfın olasılıklarını, o sınıf artık en popüler olmayana kadar küçük bir sayı kadar azalttılar. Bir sonraki en popüler dersi aldık. Böylece tüm sınıfların sayısı eşit oluncaya kadar düşürmeye devam ettiler.

Herkes ağları eğitmek için artı veya eksi bir yaklaşım kullandı ancak herkes dengelemeyi kullanmadı. Dengelemeyi kullanarak altına, şanslıysanız paraya girebilirsiniz.

Bir tarih nasıl ön işleme alınır? Herkes tarihi artı veya eksi olarak aynı şekilde önceden işledi - el yapımı özellikler yapmak, zamanlamaları farklı vuruş renkleriyle kodlamaya çalışmak vb. 8. sırayı alan Alexey Nozdrin-Plotnitsky bunun hakkında konuştu.

El yazısı çizimlerinin sınıflandırılması. Yandex'de rapor edin

O bunu farklı şekilde yaptı. Bütün bu el emeği özelliklerinizin bir işe yaramadığını, bunu yapmanıza gerek olmadığını, ağınızın bunları kendi başına öğrenmesi gerektiğini söyledi. Bunun yerine verilerinizi önceden işleyen öğrenme modülleri buldu. Nokta koordinatları ve zamanlamalar gibi ön işleme gerek kalmadan orijinal verileri bunlara attı.

Daha sonra koordinatlara göre farkı aldı ve zamanlamalara göre hepsinin ortalamasını aldı. Ve oldukça uzun bir matris buldu. 1xn boyutunda bir matris elde etmek için ona birkaç kez 64D evrişim uyguladı; burada n, toplam nokta sayısıdır ve elde edilen matrisi, kanal sayısını kabul eden herhangi bir evrişimli ağın katmanına beslemek için 64 yapılır. - 64. 64xn'lik bir matris elde etti, daha sonra bundan kanal sayısını 64'e eşit olacak şekilde belirli büyüklükte bir tensör oluşturmak gerekiyordu. 0'dan 32'ye kadar olan aralıktaki tüm X, Y noktalarını normalize ederek bir 32x32 boyutunda tensör. Neden 32x32 istediğini bilmiyorum, öyle oldu. Ve bu koordinata bu matrisin 64xn boyutunda bir parçasını yerleştirdi. Böylece evrişimli sinir ağınıza daha da yerleştirebileceğiniz 32x32x64'lük bir tensör elde edildi. Söylemek istediğim tek şey buydu.

Kaynak: habr.com

Yorum ekle