Han Chen, Analytics Vidhya'dan derlendi
Qubit Üretildi | Genel Hesap QbitAI
Geleneksel denetimli makine öğrenimi algoritmalarıyla karşılaştırıldığında, derin sinir ağlarının en büyük dezavantajı nedir?
pahalı.
Özellikle gerçek hayatta görüntü tanıma ve ses tanıma gibi pratik problemlerle uğraşmaya çalışırken. Modeliniz bazı gizli katmanlar içerdiğinde, daha fazla gizli katman eklemek büyük bilgi işlem kaynaklarına mal olacaktır.
Neyse ki, başkaları tarafından eğitilen modeller temelinde küçük değişiklikler yapmamızı ve bunları kullanıma sokmamızı sağlayan "transfer öğrenme" adı verilen bir yöntem var. Bu yazıda, problem çözme sürecini hızlandırmak için önceden eğitilmiş modellerin nasıl kullanılacağını anlatacağım.
Not: Bu makale, okuyucuların sinir ağları ve derin öğrenme konusunda belirli bir anlayışa sahip olduğunu varsaymaktadır. Derin öğrenmeyi anlamıyorsanız, önce derin öğrenmenin temel kavramlarını anlamanızı şiddetle tavsiye ederim:
Derin öğrenmede yeni başlayanlar için mutlaka görülmesi gereken: Bilmeniz gereken 25 kavram
1. Transfer öğrenimi nedir?
2. Önceden eğitilmiş model nedir?
3. Neden önceden eğitilmiş modeller kullanıyoruz? -Hayat örneklerini birleştirin
4. Önceden eğitilmiş modeli nasıl kullanabiliriz?
Özellikleri ayıkla
Modeli ince ayarlayın
5. Modeli optimize etmenin yolları
6. Rakam tanımada önceden eğitilmiş modelleri kullanın
Yalnızca çıktı yoğun katmanı için yeniden eğitim
Ağın ilk katmanlarının ağırlık faktörlerini dondurun
Transfer öğrenmenin sezgisel bir anlayışına sahip olmak için, öğretmenler ve öğrenciler arasındaki ilişkiyi bir benzetme olarak da alabiliriz.
Bir öğretmen genellikle öğrettiği alanda uzun yıllara dayanan zengin deneyime sahiptir.Bu birikimler temelinde, öğretmen öğrencilere alandaki en özlü ve öz içeriği öğretebilir. Bu süreç, gaziler ve acemiler arasında bir "bilgi aktarımı" olarak görülebilir.
Bu süreç aynı zamanda sinir ağlarında da geçerlidir.
Sinir ağlarının verilerle eğitilmesi gerektiğini biliyoruz, verilerden bilgi alır ve ardından bunları karşılık gelen ağırlıklara dönüştürür. Bu ağırlıklar çıkarılabilir ve diğer sinir ağlarına aktarılabilir Bu öğrenilmiş özellikleri "aktardığımız" için, sıfırdan bir sinir ağını eğitmemize gerek yok.
Şimdi, bu aktarım öğrenmenin önemini kendi evrimimiz açısından tartışalım. Bu, Tim Urban'ın waitbutwhy.com'daki son makalesinde değindiği noktadır.
Tim, dilin icadından önce, her insan neslinin kendi başına birçok bilgiyi yeniden edinmesi gerektiğini, bu nedenle bilginin önceki nesilden diğerine yavaş yavaş büyüdüğünü söyledi.
Daha sonra, nesiller arasında bilgi aktarımı için bir taşıyıcı sağlayan dili icat ettik Aşağıdaki şekil, dilin icadından sonra aynı zaman ölçeği altında bilgi büyüme oranının şematik bir diyagramıdır.
Harika görünmüyor mu? Aktarım öğrenimi gerçekleştirmek için ağırlık aktarımı ve kuşak geçişinde insanların dil yoluyla bilgiyi yayması bir gerçektir.
Basitçe söylemek gerekirse, önceden eğitilmiş model, benzer sorunları çözmek için öncekiler tarafından oluşturulmuş bir modeldir. Bir problemi çözdüğünüzde sıfırdan yeni bir model eğitmek zorunda değilsiniz, benzer problemlerde eğitilmiş bir modelle başlayabilirsiniz.
Örneğin, kendi kendine giden bir araba yapmak istiyorsanız, sıfırdan mükemmel performansa sahip bir görüntü tanıma algoritması oluşturmak için birkaç yıl harcayabilir veya Google'dan ImageNet veri kümesinde eğitilmiş başlangıç modelini (önceden eğitilmiş bir model) alabilirsiniz. Başlamak için, görüntüyü tanımak.
Önceden eğitilmiş bir model uygulamanız için% 100 doğru olmayabilir, ancak size çok fazla çaba harcamadan tasarruf sağlayabilir.
Daha sonra açıklamak için bir örnek vereceğim.
Geçen hafta Crowdanalytix platformundaki bir sorunu çözmeye çalışıyordum: sahneleri cep telefonu resimlerinden ayırmak.
Bu bir görüntü sınıflandırma problemidir Eğitim veri setinde 4591 resim ve test setinde 1.200 resim bulunmaktadır. Görevimiz resimleri buna göre 16 kategoriye ayırmaktır. Resmin bir miktar ön işlemesinden sonra, önce basit bir MLP (Multi-later Perceptron) modelini benimsedim, yapı aşağıdaki şekilde gösterildiği gibidir:
Giriş görüntüsünü (224 * 224 * 3) düzleştirdikten sonra, yukarıdaki yapıyı basitleştirmek için her biri 500 nöron içeren üç gizli katman kullandım. Çıktı katmanında 16 kategoriye karşılık gelen 16 nöron vardır.
Eğitimin doğruluğunu yalnızca% 6,8 oranında kontrol edebiliyorum, bu çok yetersiz bir sonuç. Gizli katmanı, gizli katmandaki nöron sayısını ve bırakma oranını ayarlamaya çalıştım, ancak doğruluk pek gelişmedi. Ancak içerisindeki gizli katman ve nöron sayısı artarsa, her döngünün çalışma süresi 20 saniyeden fazla artacaktır. (Geliştirme ortamım 12GB VRAM, Titan X GPU)
Aşağıdakiler, yukarıdaki yapının MLP modelini kullandım eğitimin sonucudur.
Eğitim süresi katlanarak artırılmadıkça MLP modelinin bana daha iyi sonuçlar sağlayamayacağı görülüyor. Bu nedenle, bu veri setindeki performanslarını ve eğitimin doğruluğunu iyileştirip iyileştiremeyeceğini görmek için CNN'e (Convolutional Neural Network) döndüm.
CNN'in yapısı aşağıdaki gibidir:
Her biri aşağıdaki bölümlerden oluşan 3 evrişimli modül kullandım:
325 * 5 filtre
Aktivasyon fonksiyonu olarak doğrusal düzeltme fonksiyonu (ReLU)
4 * 4 maksimum havuz katmanı
Son evrişim modülünün çıktısı düzleştirilir ve 64 nöronlu gizli bir katmana geçirilir ve ardından bir bırakma oranı = 0.5 işlemle çıktı katmanına geçirilir.
Final eğitiminin sonuçları şu şekilde kaydedilir:
Doğruluk oranı% 15,75'tir MLP modeli ile karşılaştırıldığında her döngünün çalışma süresi de artmıştır.
Ve daha da önemlisi, veri setindeki en büyük kategoride yer alan görsellerin sayısı toplamın yaklaşık% 17,6'sını oluşturmaktadır.
Tüm resimler en büyük kategoride sınıflandırıldığı sürece MLP ve CNN ( ,) tarafından eğitilmiş modellerden daha iyi sonuçlar alabiliriz.
Ek olarak, daha fazla evrişim modülü eklemek de eğitim süresini büyük ölçüde artıracaktır.
Bu yüzden, önceden eğitilmiş bir modele geçtim, böylece tüm yapımı yeniden eğitmeme gerek kalmadı, sadece birkaç katman için eğitmem gerekiyor.
Bu nedenle, Keras kütüphanesinde bulunan ImageNet veri setinde önceden eğitilmiş VGG16 modelini kullandım.
Modelin yapısı aşağıdaki gibidir:
VGG16 yapısına dayanarak, problemimizin senaryosuna uyum sağlamak için softmax katmanının yalnızca 1000 çıktısını 16 olarak değiştirdim ve ardından yoğun katmanı yeniden eğittim.
MLP ve CNN ile karşılaştırıldığında bu yapının doğruluğu% 70'e ulaşabilir. Aynı zamanda, VGG16 kullanmanın en büyük avantajı eğitim süresini büyük ölçüde azaltmasıdır.Sadece yoğun katman için eğitilmesi gerekir ve gereken süre temelde göz ardı edilebilir.
Ağı eğitirken amacımız nedir? Ağın çoklu ileri ve geri yinelemeler sırasında uygun ağırlıkları bulabileceğini umuyoruz.
Daha önce büyük veri kümeleri üzerinde eğitilmiş önceden eğitilmiş modelleri kullanarak, karşılaştığımız sorunlara bunları uygulamak için doğrudan ilgili yapıları ve ağırlıkları kullanabiliriz. Buna "transfer öğrenimi" denir, bu da önceden eğitilmiş modelin ilgilendiğimiz spesifik soruna "aktarıldığı" anlamına gelir.
Eğitim öncesi model seçerken çok dikkatli olmalısınız.Sorununuz eğitim öncesi model eğitim senaryosundan çok farklı ise modelin elde ettiği tahmin sonuçları çok yanlış olacaktır.
Örneğin, başlangıçta konuşma tanıma için kullanılan bir model kullanıcı tanıma için kullanılıyorsa, sonuç kesinlikle ideal değildir.
Neyse ki, Keras kütüphanesinde bu tür önceden eğitilmiş birçok yapı var.
ImageNet veri kümesi, evrensel modellerin eğitilmesine yardımcı olacak kadar büyük olduğundan (1,2 milyon görüntü dahil) bir eğitim seti olarak yaygın bir şekilde kullanılmaktadır. ImageNet'in eğitim hedefi, tüm görüntüleri 1000 sınıflandırma öğesi olarak doğru şekilde sınıflandırmaktır. Bu 1000 kategori, temel olarak kedi ve köpek türleri, çeşitli ev eşyaları, günlük işe gidip gelme araçları vb. Gibi günlük yaşamlarımızdan türetilmiştir.
Transfer öğrenmede, bu önceden eğitilmiş ağlar, ImageNet veri kümesinin dışındaki görüntüler için de iyi genelleme performansı gösterir.
Ön eğitim modeli iyi eğitildiğinden, çok fazla ağırlığı kısa bir süre içinde değiştirmeyeceğiz.Göç öğrenmede kullanıldığında, genellikle ince ayar yapılır.
Modeli değiştirme sürecinde, genel eğitim modelinden daha düşük bir öğrenme oranı benimseyeceğiz.
Özellik çıkarma
Önceden eğitilmiş modeli bir özellik çıkarma cihazı olarak kullanabiliriz. Spesifik yöntem, çıktı katmanını kaldırmak ve ardından kalan tüm ağı yeni veri kümesine uygulamak için sabit bir özellik çıkarma makinesi olarak kullanmaktır.
Önceden eğitilmiş modele sahip yapı
Ayrıca ön eğitim modelinin yapısını da kullanabiliriz, ancak önce tüm ağırlıkları rastgele hale getirip ardından kendi veri setimize göre egzersiz yapabiliriz.
Belirli katmanları eğitin, diğer katmanları dondurun
Önceden eğitilmiş bir modeli kullanmanın başka bir yolu, onu kısmen eğitmektir. Spesifik yöntem, modelin bazı ilk katmanlarının ağırlıklarını değiştirmeden tutmak ve yeni ağırlıklar elde etmek için sonraki katmanları yeniden eğitmektir. Bu süreçte, donmuş katmanlar arasındaki en iyi eşleşmeyi bulmaya ve sonuçlara göre katmanları yeniden eğitmeye birçok kez deneyebiliriz.
Modelin nasıl kullanılacağı ve eğitileceği, veri kümesinin boyutuna ve eski ve yeni veri kümeleri arasındaki verilerin benzerliğine (önceden eğitilmiş veri kümesi ve çözmek istediğimiz veri kümesi) göre belirlenir.
Aşağıdaki grafik, önceden eğitilmiş modelin çeşitli durumlarda nasıl kullanılacağını gösterir:
Senaryo 1: Veri seti küçük ve veri benzerliği yüksek (önceden eğitilmiş modelin eğitim verileriyle karşılaştırıldığında)
Bu durumda, veriler önceden eğitilmiş modelin eğitim verilerine çok benzediğinden, modeli yeniden eğitmemize gerek yoktur. Sadece çıktı katmanını problem durumuna uygun bir yapıya dönüştürmemiz gerekiyor.
Ön işleme modelini desen çıkarıcı olarak kullanıyoruz.
Örneğin, yeni bir fotoğraf setinde yavru kedileri ve yavruları tanımak için ImageNet üzerinde eğitilmiş bir model kullanıyoruz. Burada, tanınması gereken resim ImageNet kitaplığındaki resme benzer, ancak çıktı kedi veya köpeğimizde yalnızca iki öğeye ihtiyacımız var.
Bu örnekte tek yapmamız gereken, yoğun katmanın çıktısını ve son softmax katmanını 1000 kategoriden 2 kategoriye değiştirmektir.
Senaryo 2: Veri kümesi küçük ve veri benzerliği yüksek değil
Bu durumda, ön eğitim modelinde ilk k katmandaki ağırlıkları dondurabilir ve ardından sonraki n-k katmanlarını yeniden eğitebiliriz.Elbette, son katmanın da ilgili çıktı formatına göre değiştirilmesi gerekir.
Verilerin benzerliği yüksek olmadığı için yeniden eğitim süreci çok kritik hale geliyor. Yeni veri seti boyutunun olmaması, eğitim öncesi modelin ilk k katmanının dondurulmasıyla telafi edilir.
Senaryo 3: Büyük veri kümesi, düşük veri benzerliği
Bu durumda büyük bir veri setine sahip olduğumuz için sinir ağının eğitim süreci daha verimli olacaktır. Ancak, önceden eğitilmiş modelin gerçek verileriyle eğitim verileri arasında büyük bir fark olduğu için önceden eğitilmiş modeli kullanmak verimli bir yol olmayacaktır.
Bu nedenle, en iyi yöntem, ön işleme modelindeki tüm ağırlıkları başlatmak ve yeni veri seti temelinde eğitime baştan başlamaktır.
Senaryo 4: Büyük veri kümesi, yüksek veri benzerliği
Bu ideal durumdur ve önceden eğitilmiş modellerin kullanımı çok verimli hale gelecektir. Bunu kullanmanın en iyi yolu, modelin orijinal yapısını ve başlangıç ağırlığını değiştirmeden korumak ve ardından yeni veri seti üzerinde yeniden çalışmaktır.
Şimdi basit bir problemi önceden eğitilmiş modelle çözmeye çalışalım.
Vgg16'yı önceden eğitilmiş bir model yapısı olarak kullandım ve el yazısı rakam tanımaya uyguladım.
Önce bu sorunun önceki dört senaryodan hangisine karşılık geldiğine bakalım. Eğitim setimiz (MNIST) el yazısıyla yazılmış yaklaşık 60.000 resimden oluşuyor.Böyle bir veri seti açıkça küçük. Yani bu soru birinci veya ikinci senaryoya ait olmalıdır.
Nihai etkiyi görmek için karşılık gelen iki yöntemi kullanmayı deneyebiliriz.
Yalnızca çıktı katmanını ve yoğun katmanı yeniden eğitin
Burada özellik çıkarıcı olarak vgg16 kullanıyoruz. Bu özellikler daha sonra veri setimiz üzerinde eğitilen yoğun katmana aktarılacaktır. Çıktı katmanı da bizim problemimize karşılık gelen softmax katman işlevi ile değiştirilir.
Vgg16'da çıktı katmanı 1000 kategori içeren bir softmax katmanıdır. Bu katmanı kaldırdık ve onu sadece 10 kategori içeren bir softmax katmanı ile değiştirdik. Sadece bu katmanları eğitiyoruz ve sonra sayıları tanımaya çalışıyoruz.
# gerekli kütüphaneleri keras.models'ten içe aktarma Sıralı içe aktarma scipy.misc'den içe aktarma imreadAğın ilk birkaç katmanının ağırlıklarını dondurun
Burada vgg16 ağının ilk 8 katmanını donduracağız ve ardından aşağıdaki ağı yeniden eğiteceğiz. Bu, ağın ilk birkaç katmanının sorunumuzla ilgili olan eğrilerin ve kenarların ortak özelliklerini yakalaması nedeniyle yapılır. Bu ağırlıkların değişmeden kalmasını sağlamak istiyoruz, böylece ağ, sonraki ağı ayarlamak için öğrenme sürecinde bu veri setinin bazı benzersiz özelliklerine odaklanacaktır.
keras.models'den Sequentialfrom scipy.misc'den import imreadorijinal:
https://www.analyticsvidhya.com/blog/2017/06/transfer-learning-the-art-of-fine-tuning-a-pre-trained-model/
VGG-16:
https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3
Keras kitaplığında ImageNet önceden eğitilmiş model:
https://keras.io/applications/
El yazısı rakam veri seti MNIST:
Bitiş
Bir uyarı
Qubit'ler, otonom sürüşle ilgili alanlarda çalışan öğrenciler veya ön saflardaki mühendisler için otonom bir sürüş teknolojisi grubu oluşturuyor. Li Kaifu, Wang Yonggang, Wang Naiyan, Wang Tao Grupta büyük sığırları bekliyorlar. Herkese qubit WeChat (qbitbot) eklemeye hoş geldiniz, ha'ya katılmak için başvurmak için "otomatik sürüş" diyor ~
İşe Alım
Qubit, editörleri, muhabirleri, operasyonları, ürünleri ve diğer pozisyonları işe alıyor ve çalışma yeri Pekin, Zhongguancun'da bulunuyor. İlgili ayrıntılar için lütfen şu yanıtı verin: resmi hesabın diyalog arayüzünde "İşe Alım".