Python'da sıfırdan bir sinir ağı oluşturun

Leifeng.com AI Araştırma Enstitüsü Not: Bu makale, Leifeng.com'un altyazı grubu tarafından derlenen teknik bir blogdur.Orijinal makale başlığı: Python'da sıfırdan kendi Sinir Ağınızı nasıl kurabilirsiniz, yazar James Loy

Orijinal bağlantı: https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6

Tercüme | Liu Caihong ve Zhou Hui Redaksiyon | Yu Zhipeng Harmanlama | Kong Lingshuang

motivasyon : Derin öğrenme hakkında daha derin bir anlayışa sahip olmak için, Tensorflow gibi paketlenmiş bir çerçeve kullanmak yerine sıfırdan bir sinir ağı oluşturmak için python dilini kullanacağız. Veri bilimcileri için sinir ağlarının iç işleyişini anlamanın çok önemli olduğunu düşünüyorum.

Bu makalenin içeriği öğrendiklerimdir ve umarım size yardımcı olur.

Sinir ağı nedir?

Sinir ağlarını tanıtan çoğu makale bunu beyinle karşılaştıracaktır. Beyin ve sinir ağı arasındaki analojiyi derinlemesine incelemediyseniz, sinir ağını belirli bir girdiyi istenen çıktıya eşleyen matematiksel bir ilişki olarak anlamak daha kolaydır.

Sinir ağı aşağıdaki bileşenleri içerir

  • Bir girdi katmanı, x

  • Herhangi bir sayıda gizli katman

  • Bir çıktı katmanı,

  • Her katman, W ve b arasında bir dizi ağırlık ve önyargı vardır

  • Gizli katman için bir aktivasyon işlevi seçin, . Eğitimde Sigmoid aktivasyon fonksiyonunu kullanıyoruz

Aşağıdaki şekil 2 katmanlı bir sinir ağının yapısını göstermektedir (not: ağ katmanlarının sayısını hesaplarken genellikle giriş katmanını hariç tutarız)

2 katmanlı bir sinir ağının yapısı

Python ile sinir ağı sınıfları oluşturmak kolaydır

sınıf NeuralNetwork:

def __init __ (öz, x, y):

self.input = x

self.weights1 = np.random.rand (self.input.shape, 4)

self.weights2 = np.random.rand (4,1)

self.y = y

self.output = np.zeros (y.shape)

Bir sinir ağını eğitmek

Bu ağın çıktısı:

Yukarıdaki denklemde çıktısının W ve b'nin bir fonksiyonu olduğunu fark edebilirsiniz.

Bu nedenle, W ve b değerleri tahminin doğruluğunu etkiler Bu nedenle, W ve b'yi giriş verilerine göre ayarlama işlemine eğitim sinir ağı adı verilir.

Her eğitim yinelemesi aşağıdaki iki bölümden oluşur:

  • Tahmin sonucunu hesaplayın , bu adım ileriye doğru yayılma olarak adlandırılır

  • W ve b'yi güncelleyin, bu adım geri yayılım olur

Aşağıdaki sıra diyagramı bu süreci göstermektedir:

İleri yayılma

Yukarıdaki şekilde görebileceğimiz gibi, ileriye doğru yayılma sadece basit bir hesaplamadır. Temel 2 katmanlı bir ağ için çıktısı şu şekildedir:

NeuralNetwork sınıfında ileriye doğru yayılımı hesaplamak için bir fonksiyon ekliyoruz. Basit olması için, önyargı b'nin 0 olduğunu varsayıyoruz:

sınıf NeuralNetwork:

def __init __ (öz, x, y):

self.input = x

self.weights1 = np.random.rand (self.input.shape, 4)

self.weights2 = np.random.rand (4,1)

self.y = y

self.output = np.zeros (self.y.shape)

def feedforward (self):

self.layer1 = sigmoid (np.dot (self.input, self.weights1))

self.output = sigmoid (np.dot (self.layer1, self.weights2))

Ancak tahmin sonuçlarının kalitesini (yani, tahmin edilen değer ile gerçek değer arasındaki hata) değerlendirmek için bir yönteme de ihtiyacımız var. Bu, kayıp işlevini gerektirir.

Kayıp işlevi

Modelin ihtiyaçlarına göre seçilen, yaygın olarak kullanılan birçok kayıp işlevi vardır. Bu eğitimde, kayıp fonksiyonu olarak karelerin hata toplamını kullanıyoruz.

Hata karelerinin toplamı, tahmin edilen her değer ile gerçek değer arasındaki hatayı toplamaktır.Bu hata, hatanın mutlak değerini gözlemleyebilmemiz için farklarının karesidir.

Eğitimin amacı, kayıp fonksiyonunun en iyi küçük olması, yani tahmin edilen değer ile gerçek değer arasındaki mesafenin en küçük olması için bir W ve b kümesi bulmaktır.

Geri yayılım

Tahminin hatasını (kaybını) ölçtük ve şimdi hatayı yaymanın ve ağırlıkları ve önyargıları buna göre güncellemenin bir yolunu bulmalıyız.

Ağırlıkları ve önyargıları uygun şekilde nasıl ayarlayacağımızı bilmek için, W ve sapma b ağırlıklarına göre kayıp fonksiyonunun türevini bilmemiz gerekir.

Kalkülüsteki kavramı hatırlayın, bir fonksiyonun türevi, fonksiyonun eğimidir.

Dereceli alçalma

Türevi bulmuşsak, türev değerini artırarak veya azaltarak W ağırlığını ve bias'ı güncelleyebiliriz (yukarıdaki şekle bakın). Bu yol denir Dereceli alçalma .

Ancak kayıp fonksiyonunun türevini ağırlık ve önyargı açısından doğrudan hesaplayamayız, çünkü bunlar açıkça kayıp fonksiyonunun denklemine dahil edilmemiştir. Bu nedenle, türevi hesaplamaya yardımcı olması için zincir türevi kullanmamız gerekir.

Zincir kuralı, W ve b'ye göre kayıp fonksiyonunun türevini hesaplamak için kullanılır. Basitlik adına dikkat edin. Ağın yalnızca 1 katmanı olduğunu varsayarak yalnızca kısmi türevleri gösteririz.

Bu çok kaba olmasına rağmen, yine de istenen sonucu elde edebiliriz - kayıp fonksiyonunun türevi (eğimi) W ağırlığına göre, böylece ağırlığı buna göre ayarlayabiliriz.

Şimdi geri yayılım algoritmasının işlevini Python koduna ekliyoruz

sınıf NeuralNetwork:

def __init __ (öz, x, y):

self.input = x

self.weights1 = np.random.rand (self.input.shape, 4)

self.weights2 = np.random.rand (4,1)

self.y = y

self.output = np.zeros (self.y.shape)

def feedforward (self):

self.layer1 = sigmoid (np.dot (self.input, self.weights1))

self.output = sigmoid (np.dot (self.layer1, self.weights2))

def backprop (kendi):

# ağırlıklara2 ve ağırlıklara1 göre kayıp fonksiyonunun türevini bulmak için zincir kuralının uygulanması

d_weights2 = np.dot (self.layer1.T, (2 * (self.y-self.output) * sigmoid_derivative (self.output)))

d_weights1 = np.dot (self.input.T, (np.dot (2 * (self.y-self.output) * sigmoid_derivative (self.output), self.weights2.T) * sigmoid_derivative (self.layer1)) )

# ağırlıkları kayıp fonksiyonunun türevi (eğim) ile güncelleyin

self.weights1 + = d_weights1

self.weights2 + = d_weights2

Geri yayılımda kalkülüs ilkesi ve zincir türetme kuralı hakkında daha derin bir anlayışa sahip olmak için, 3Blue1Brown tarafından hazırlanan aşağıdaki eğitimleri şiddetle tavsiye ediyorum:

Youtube: https://youtu.be/tIeHLnjs5U8

Bir örneği entegre edin ve tamamlayın

Artık ileri yayılma ve geri yayılma dahil olmak üzere eksiksiz Python koduna sahip olduğumuza göre, nasıl çalıştığını görmek için bunu bir örneğe uygulayalım.

Sinir ağı, işlevin ağırlığını öğrenebilir. Fonksiyonun ağırlığını sadece gözlemle elde etmemiz pek olası değildir.

Sinir ağını 1500 yineleme için eğitelim ve ne olacağını görelim. Aşağıdaki her yinelemenin kayıp fonksiyonuna dikkat edin, kayıp fonksiyonunun monoton olarak minimuma düştüğünü açıkça görebiliriz. Bu, daha önce sunduğumuz gradyan iniş yöntemiyle tutarlıdır.

1500 yinelemeden sonra sinir ağının nihai tahmin sonuçlarına bakalım:

1500 eğitim yinelemesinden sonra tahmin sonucu

BAŞARDIK! İleri ve yön yayma algoritmalarını kullanarak sinir ağını başarıyla eğittik ve tahmin sonuçları gerçek değere yakınlaştı.

Öngörülen değer ile gerçek değer arasında küçük hatalara izin verildiğini unutmayın. Bu, modelin aşırı uymasını önleyebilir ve sinir ağının bilinmeyen veriler için daha güçlü bir genelleme yeteneğine sahip olmasını sağlayabilir.

Sıradaki ne?

Neyse ki, öğrenme yolculuğumuz henüz bitmedi ve sinir ağları ve derin öğrenme hakkında öğrenilecek çok şey var. Örneğin:

  • Sigmoid'e ek olarak, başka hangi aktivasyon fonksiyonları kullanılabilir?

  • Ağı eğitirken öğrenme oranını uygulayın

  • Görüntü sınıflandırma görevleriyle karşılaştığınızda evrişimli sinir ağlarını kullanın

Yakında bu konu hakkında daha fazla yazacağım, bizi izlemeye devam edin!

Son düşünceler

Ayrıca sıfırdan birçok sinir ağı kodu yazdım.

Bununla birlikte, dahili çalışma ilkelerini tam olarak anlamadan derin ağlar oluşturmak için Tensorflow ve Keras gibi derin öğrenme çerçevelerini kullanabilirsiniz. Ancak iç ilkeleri anlamanın gelecek vadeden veri bilimcileri için çok faydalı olduğunu düşünüyorum.

Bu tür bir uygulama benim için önemli bir zaman yatırımı haline geldi ve umarım size yardımcı olur.

Makale ilk olarak Leifeng.com AI Araştırma Enstitüsü'nde (okweiwu) yayınlandı.

Chongqing'in popüler check-in yerlerini ziyaret etmek
önceki
Riccardo Tisci × Nike'ın yepyeni serisi ortaya çıktı, Bella'nın yakışıklı üst gövdesi ilk kez ortaya çıktı
Sonraki
Marvel'in paralel evreni ortaya çıktı
MediaTek çabalarını yeniledi, vivo, OPPO ve Xiaomi MAX3 Helio P60 ile donatılabilir!
Xiaomi Mi 6 harika, Xiaomi 7 yıl bekledi
Chongqing'in popüler check-in yerlerini ziyaret edin | Hongqi Hegou'nun "kaleydoskop" binası var
BMW 2017'de Çin'de 14 yeni otomobil piyasaya sürdü, yeni 5 Serisi / X1 plug-in hibrit
Akıllı Ekolojik YapıVistanley Akıllı Çip Modülü Piyasaya Sürüldü
Zero One Technology Festival, dünyanın gözünü kamaştırmak için en önemli on önemli anı zorluyor, AI çağının gelişine tanık olmak için Shenzhen'de yüzlerce medya toplandı
Havalılığın ve tarzın dengelenemeyeceğini kim söyledi? ! Bu Pitti Uomo SS18 yazlık kıyafet setini kaçıramazsınız!
Alibaba'nın insansız sürüş konusundaki düşük anahtar kullanımı "yakında çıkacak"!
PCPI'nin final listesindeki ikinci ilerlemesi: Huya RNG ekibi listede, SnakeTC hayranlarını hayal kırıklığına uğratıyor
Bu çok hoş! iPhone 8 tasarım çizimleri ortaya çıktı
İleride doğru uyarı! "Büyük adamlar" bir araya geliyor
To Top