Filtre matrisinin elemanları nasıl başlatılır?


24

Daha iyi (Convnet veya TensorFlow gibi) kütüphanelere bağlı olmayan Python kodunu yazarak kıvrımlı sinir ağlarını daha iyi anlamaya çalışıyorum ve ne zaman çekirdek matris için değerleri seçmek için literatürde sıkışıp kalıyorum görüntü üzerinde evrişim yapmak.

Bir CNN katmanları gösteren aşağıdaki resimde özellik haritaları arasındaki adımda uygulama ayrıntılarını anlamaya çalışıyorum .

Evrişimli sinir ağı katmanları

Bu şemaya göre:

Bir görüntüyü dönüştürme

Çekirdek matris çekirdeği görüntünün üzerine "adım atar" ve bir özellik haritası oluşturur; burada her piksel, çekirdeğin (veya filtre matrisinin) her bir ağırlığı ile giriş görüntüsünün karşılık gelen piksel değeri arasındaki tüm elemanlar arası ürünlerin toplamıdır.

Sorum şu: Çekirdek (veya filtre) matrisinin ağırlıklarını nasıl başlatırız?

Yukarıdaki gösteride, bunlar sadece 1'ler ve 0'lardır, ancak bunun şema aşkından basitleştirildiğini varsayıyorum.

Bu ağırlıklar bazı önişleme adımlarında eğitilmiş mi? Veya kullanıcı tarafından açıkça mi seçilmiş?

Yanıtlar:


19

Biri tipik olarak bir ağı rastgele bir dağılımdan başlatır, tipik olarak sıfır anlamına gelir ve varyansının seçilmesi konusunda biraz özen gösterilir. Bu günlerde optimizasyon tekniklerinde (diğer yöntemler arasında SGD + Momentum) ve aktivasyon doğrusalsızlıklarında (ReLU'lar ve ReLU benzeri aktivasyonlar) ilerlemelerle birlikte, daha derin ağlarda bile gradyan sinyallerinin daha iyi geri ilerlemesine izin verir), günümüzün en gelişmiş evrimsel durumunu eğitebilir randomize bir başlangıçtan nöral ağlar.

Anahtar özellikler şunlardır:

  • Neden rastgele? Neden hepsini 0 olarak başlatmıyorsunuz? Burada önemli bir kavram simetri kırmadır . Tüm nöronlar aynı ağırlıklara sahipse, aynı çıktıları üretecekler ve farklı özellikler öğrenmeyeceğiz. Farklı özellikler öğrenmeyeceğiz çünkü geri yayılım adımı sırasında tüm ağırlık güncellemeleri tamamen aynı olacaktır. Rastgele bir dağılımla başlamak, nöronları farklı (çok yüksek olasılıkla) olarak başlatmamızı ve zengin ve çeşitli bir özellik hiyerarşisini öğrenmemizi sağlar.

  • Neden sıfır demek? Makine öğreniminde yaygın bir uygulama olarak, giriş verilerini sıfır ortalamak veya normalleştirmek, böylece ham giriş özellikleri (görüntü verileri için bunlar piksel olacaktır) ortalama sıfıra eşittir.

    Verilerimizi sıfır merkezli hale getirdik ve ağımızın ağırlıklarını (bunlara değindiğiniz matrisler) rastgele başlatacağız. Ne tür bir dağıtım seçmeliyiz? Girdi verilerinin ağımıza dağılımı, sıfır merkezli olduğumuz için ortalama sıfırdır. Diyelim ki önyargı şartlarımızı sıfır olarak başlattık. Ağımızın eğitimini başlattığımızda, hepsi rastgele olduğu için bir nöronu diğerine tercih etme nedenimiz yok. Bir uygulama, ağırlıklarımızı, beklentilerinde sıfır aktivasyon çıktısı olacak şekilde rastgele başlatmaktır. Bu şekilde hiç bir nöron, rastgele başlatma nedeniyle simetriyi eşzamanlı kırarken, diğer nöronlardan daha fazla "aktive etmek" (pozitif çıkış değerine sahip olmak) için tercih edilmez. Bunu başarmanın basit bir yolu, ortalama sıfır dağılımı seçmektir.

  • Varyansları nasıl seçeriz?Ortalama sıfır olsa bile, varyansı çok büyük olarak seçmek istemezsiniz. Derin ağ ağırlıklarındaki aşırı değerler, katlanarak büyüklükte artan aktivasyon çıktıları ile sonuçlanabilir ve bu sorun ağın derinliği ile birleşebilir. Bu, ağımızın eğitimine zarar verebilir. Ayrıca çok küçük olmasını seçmek de istemezsiniz, çünkü bu çok küçük degrade değerleri hesapladığımız için öğrenmeyi yavaşlatabilir. Bu nedenle, özellikle ileri veya geri yayılımlarımızın katlanarak derinlemesine artmasını veya azalmasını istemediğimizden, özellikle daha derin ağlar söz konusu olduğunda bir denge var.

    İki popüler ağırlık başlatma şeması vardır: Glorot Uniform ( Derin ileri beslemeli sinir ağlarını eğitmenin zorluğunu anlama ) ve He Normal başlatıcı ( Doğrultuculara Derinlemesine Bilgi Verme: ImageNet Sınıflandırmasında İnsan Seviyesinde Performansı Aşmak ).

    Her ikisi de , aşağıdaki temel prensibi göz önünde bulundurarak derin ağları eğitmek amacıyla inşa edilmiştir (alıntı Derinlemenin Doğrultuculara Delinmesi makalesinden alınmıştır):

    "Uygun bir başlatma yöntemi, giriş sinyallerinin büyüklüğünü katlanarak azaltmaktan veya büyütmekten kaçınmalıdır."

    Kabaca söylemek gerekirse, bu iki başlatma şeması her bir katmanın varyansını başlatır, böylece her nöronun çıkış dağılımı aynı olur. Doğrultuculara Derinlemesine İnceleme Bölüm 2.2 ayrıntılı bir analiz sunmaktadır.

Son bir not: bazen insanların tüm katmanlarda .005 veya .01'e eşit standart sapma veya başka bir "küçük" standart sapma ile Gaussian kullandığını da görürsünüz. Diğer zamanlarda, insanların eldeki varyanslarla uğraştığını görürsünüz, temel olarak en iyi performans gösteren bir konfigürasyon bulmak için çapraz doğrulama gerçekleştirir.


1
Peki yukarıdaki GIF'deki sarı filtrenin "X" şekli (1'ler tarafından yapılmıştır) ne olacak? Resimde herhangi bir yerde "X" şekillerini tespit etmek için kullanmak istediğim şey bu, ama "X" 'in istediğim şekil olduğunu nasıl bilebilirim? Filtre şeklinin otomatik olarak öğrenildiği izlenimini edindim, ama nasıl yapacağımı bilmiyorum. Belki bu OP'nin sorusuydu?
Felipe Almeida

2

Düşük itibar nedeniyle yorum yapamam ve bu yüzden Felipe Almeida'nın sorusuna yanıt olarak yazıyorum. Indie AI'nin mükemmel cevabından sonra, eklenecek çok şey yok. Belirli şekilleri (X gibi) tespit etmek istiyorsanız, kenar algılamayla olduğu gibi belirli bir filtreyi önceden tanımlayabilirsiniz. Ama bu derin öğrenmenin güzelliği, çok fazla katman, çok fazla filtre ve o kadar çok iterasyon var ki, filtreler kendi başına gerekli olan her nesne şeklini öğreniyor. Teorik olarak, tespit edilecek bir X varsa, filtrelerden biri bir X'i (sarı filtre olarak) tespit etmeyi öğrenecektir.

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.