Parti normalizasyonu ile geri yayılımın matris formu


12

Parti normalizasyonu , derin sinir ağlarında önemli performans iyileştirmeleri ile kredilendirilmiştir. İnternetteki birçok malzeme, aktivasyon bazında nasıl uygulanacağını göstermektedir. Zaten matris cebiri kullanarak backprop uyguladım ve yüksek seviyeli dillerde çalıştığımı Rcpp(yoğun matris çarpımı için (ve sonunda forGPU'lara güvenerek) çalışırken , her şeyi kopyalayıp-döngülere başvurmak muhtemelen kodumu yavaşlatacaktır) büyük bir acıya ek olarak.

Toplu normalizasyon fonksiyonu olan

b(xp)=γ(xpμxp)σxp1+β
  • pxp , etkinleştirilmeden önceki düğümüdürp
  • βγ ve skaler parametrelerdirβ
  • σ x p x pμxp ve ortalaması ve . (Varyansın karekökü artı bir geçiştirme faktörünün normal olarak kullanıldığını unutmayın - kompaktlık için sıfır olmayan öğeleri varsayalım)σxpxp

Matris biçiminde, tüm katmanın toplu normalleştirmesi burada

b(X)=(γ1p)(XμX)σX1+(β1p)
  • X olanN×p
  • 1N , bunların sütun vektörüdür
  • γ ve artık katman başına normalleştirme parametrelerinin satır vektörleripβp
  • μX ve olan , her sütun a, matrisler, -vector columnwise ortalama ve standart sapma N × p NσXN×pN
  • Kronecker ürünü ve elementwise (Hadamard) ürünü

normalizasyonu ve sürekli sonucu olmayan çok basit bir tek katmanlı sinir ağı

y=a(XΓ1)Γ2+ϵ

nerede

  • Γ1 olanp1×p2
  • p 2 × 1Γ2 olanp2×1
  • a(.) etkinleştirme işlevidir

Kayıp , degradeler RR=N1(yy^)2

RΓ1=2VTϵ^RΓ2=XT(a(XΓ1)2ϵ^Γ2T)

nerede

  • V=a(XΓ1)
  • ϵ^=yy^

Toplu normalleştirme altında, net veya Hadamard ve Kronecker ürünlerinin türevlerini nasıl hesaplayacağımı bilmiyorum. Kronecker ürünleri konusunda, literatür oldukça gizlidir. y = a ( ( γ 1 N )( X Γ 1 - μ X Γ 1 )σ - 1 X Γ 1

y=a(b(XΓ1))Γ2
y=a((γ1N)(XΓ1μXΓ1)σXΓ11+(β1N))Γ2

Matris çerçevesi içinde , ve hesaplamanın pratik bir yolu var mı ? Düğüm başına hesaplamaya başvurmadan basit bir ifade?R /β R /Γ 1R/γR/βR/Γ1

Güncelleme 1:

Ben - tür anladım . Bu: Bazı R kodları bunun döngüsel yolla eşdeğer olduğunu gösterir. Önce sahte verileri ayarlayın:1 T N ( a ( X Γ 1 ) - 2R/β

1NT(a(XΓ1)2ϵ^Γ2T)
set.seed(1)
library(dplyr)
library(foreach)

#numbers of obs, variables, and hidden layers
N <- 10
p1 <- 7
p2 <- 4
a <- function (v) {
  v[v < 0] <- 0
  v
}
ap <- function (v) {
  v[v < 0] <- 0
  v[v >= 0] <- 1
  v
}

# parameters
G1 <- matrix(rnorm(p1*p2), nrow = p1)
G2 <- rnorm(p2)
gamma <- 1:p2+1
beta <- (1:p2+1)*-1
# error
u <- rnorm(10)

# matrix batch norm function
b <- function(x, bet = beta, gam = gamma){
  xs <- scale(x)
  gk <- t(matrix(gam)) %x% matrix(rep(1, N))
  bk <- t(matrix(bet)) %x% matrix(rep(1, N))
  gk*xs+bk
}
# activation-wise batch norm function
bi <- function(x, i){
  xs <- scale(x)
  gk <- t(matrix(gamma[i]))
  bk <- t(matrix(beta[i]))
  suppressWarnings(gk*xs[,i]+bk)
}

X <- round(runif(N*p1, -5, 5)) %>% matrix(nrow = N)
# the neural net
y <- a(b(X %*% G1)) %*% G2 + u

Sonra türevleri hesaplayın:

# drdbeta -- the matrix way
drdb <- matrix(rep(1, N*1), nrow = 1) %*% (-2*u %*% t(G2) * ap(b(X%*%G1)))
drdb
           [,1]      [,2]    [,3]        [,4]
[1,] -0.4460901 0.3899186 1.26758 -0.09589582
# the looping way
foreach(i = 1:4, .combine = c) %do%{
  sum(-2*u*matrix(ap(bi(X[,i, drop = FALSE]%*%G1[i,], i)))*G2[i])
}
[1] -0.44609015  0.38991862  1.26758024 -0.09589582

Eşleşiyorlar. Ama hala kafam karıştı, çünkü bunun neden işe yaradığını gerçekten bilmiyorum. @ Mark L. Stone tarafından başvurulan MatCalc notlar türevi söylemek olmalıdırβ1N

ABA=(InqTmp)(Invec(B)Im)
burada , ve , abonelikleri ve boyutlarıdır . , sadece 1 olan komütasyon matrisidir, çünkü her iki giriş de vektörlerdir. Bunu denemek ve yararlı görünmüyor bir sonuç elde:mnpqABT
# playing with the kroneker derivative rule
A <- t(matrix(beta)) 
B <- matrix(rep(1, N))
diag(rep(1, ncol(A) *ncol(B))) %*% diag(rep(1, ncol(A))) %x% (B) %x% diag(nrow(A))
     [,1] [,2] [,3] [,4]
 [1,]    1    0    0    0
 [2,]    1    0    0    0
 snip
[13,]    0    1    0    0
[14,]    0    1    0    0
snip
[28,]    0    0    1    0
[29,]    0    0    1    0
[snip
[39,]    0    0    0    1
[40,]    0    0    0    1

Bu uygun değil. Açıkçası şu Kronecker türev kurallarını anlamıyorum. Bunlara yardım etmek harika olurdu. ve için diğer türevler üzerinde hala takılı - bunlar daha zordur çünkü gibi ek olarak .γΓ1β1

Güncelleme 2

Ders kitaplarını okurken, ve operatörün kullanılmasını gerektireceğinden oldukça eminim . Ama görünüşe göre onları koda çevirmek için türevleri yeterince takip edemiyorum. Örneğin, türevi alınarak dahil olacak göre , burada (bu an için sabit bir matris olarak değerlendirebiliriz). R/Γ1R/γvec()R/Γ1wXΓ1Γ1w(γ1)σXΓ11

İçgüdülerim basitçe "cevabı demek ki " nedeniyle, ama besbelli değil o işin ile uyumlu değildir .wXwX

Biliyorum

(AB)=AB+AB

ve gelen bu , o

vec(wXΓ1)vec(Γ1)T=vec(XΓ1)Ivec(w)vec(Γ1)T+vec(w)Ivec(XΓ1)vec(Γ1)T
Ama bunu nasıl değerlendireceğime emin değilim.

Güncelleme 3

Burada ilerleme kaydediyoruz. Dün gece saat 2'de bu fikirle uyandım. Matematik uyku için iyi değildir.

İşte bazı notasyonel şekerden sonra :R/Γ1

  • w(γ1)σXΓ11
  • "stub"a(b(XΓ1))2ϵ^Γ2T

Zincir kuralının sonuna geldikten sonra sahip olduklarınız: Bunu döngüsel bir şekilde yaparak başlayın - ve , alt sütunları ve uyumlu bir kimlik matrisidir:

RΓ1=wXΓ1Γ1("stub")
ijI
RΓij=(wiXi)T("stub"j)
RΓij=(IwiXi)T("stub"j)
RΓij=XiTIwi("stub"j)
tl; dr, temel olarak saplamayı batchnorm ölçek faktörleriyle önceden çarpıyorsunuz. Bu eşdeğer olmalıdır:
RΓ=XT("stub"w)

Ve aslında:

stub <- (-2*u %*% t(G2) * ap(b(X%*%G1)))
w <- t(matrix(gamma)) %x% matrix(rep(1, N)) * (apply(X%*%G1, 2, sd) %>% t %x% matrix(rep(1, N)))
drdG1 <- t(X) %*% (stub*w)

loop_drdG1 <- drdG1*NA
for (i in 1:7){
  for (j in 1:4){
    loop_drdG1[i,j] <- t(X[,i]) %*% diag(w[,j]) %*% (stub[,j])
  }
}

> loop_drdG1
           [,1]       [,2]       [,3]       [,4]
[1,] -61.531877  122.66157  360.08132 -51.666215
[2,]   7.047767  -14.04947  -41.24316   5.917769
[3,] 124.157678 -247.50384 -726.56422 104.250961
[4,]  44.151682  -88.01478 -258.37333  37.072659
[5,]  22.478082  -44.80924 -131.54056  18.874078
[6,]  22.098857  -44.05327 -129.32135  18.555655
[7,]  79.617345 -158.71430 -465.91653  66.851965
> drdG1
           [,1]       [,2]       [,3]       [,4]
[1,] -61.531877  122.66157  360.08132 -51.666215
[2,]   7.047767  -14.04947  -41.24316   5.917769
[3,] 124.157678 -247.50384 -726.56422 104.250961
[4,]  44.151682  -88.01478 -258.37333  37.072659
[5,]  22.478082  -44.80924 -131.54056  18.874078
[6,]  22.098857  -44.05327 -129.32135  18.555655
[7,]  79.617345 -158.71430 -465.91653  66.851965

Güncelleme 4

Burada, sanırım . İlkR/γ

  • XΓ~(XΓμXΓ)σXΓ1
  • γ~γ1N

Daha önce olduğu gibi, zincir kuralı sizi Döngü size Daha önce olduğu gibi temel olarak saplamayı önceden çarpıyor. Bu nedenle:

Rγ~=γ~XΓ~γ~("stub")
Rγ~i=(XΓ~)iTIγ~i("stub"i)
Rγ~=(XΓ~)T("stub"γ~)

Bir çeşit eşleşme:

drdg <- t(scale(X %*% G1)) %*% (stub * t(matrix(gamma)) %x% matrix(rep(1, N)))

loop_drdg <- foreach(i = 1:4, .combine = c) %do% {
  t(scale(X %*% G1)[,i]) %*% (stub[,i, drop = F] * gamma[i])  
}

> drdg
           [,1]      [,2]       [,3]       [,4]
[1,]  0.8580574 -1.125017  -4.876398  0.4611406
[2,] -4.5463304  5.960787  25.837103 -2.4433071
[3,]  2.0706860 -2.714919 -11.767849  1.1128364
[4,] -8.5641868 11.228681  48.670853 -4.6025996
> loop_drdg
[1]   0.8580574   5.9607870 -11.7678486  -4.6025996

Birincideki köşegen, ikincideki vektörle aynıdır. Ancak gerçekten de türev, belirli bir yapıya sahip olsa da, bir matrise göre olduğu için, çıktı aynı yapıya sahip benzer bir matris olmalıdır. Matris yaklaşımının köşegenini almalı ve basitçe mı almalıyım ? Emin değilim.γ

Görünüşe göre kendi sorumu cevapladım ama doğru olup olmadığımdan emin değilim. Bu noktada, birlikte hacklendiğim şeyi titizlikle kanıtlayan (veya çürüten) bir yanıtı kabul edeceğim.

while(not_answered){
  print("Bueller?")
  Sys.sleep(1)
}

2
Magnus ve Neudecker tarafından yayınlanan "İstatistik ve Ekonometride Uygulamalarla Matris Diferansiyel Hesaplaması" Bölüm 9 bölüm 14, 3. baskı janmagnus.nl/misc/mdc2007-3dition , Kronecker ürünlerinin diferansiyellerini kapsar ve Hadamard ürününün diferansiyeli üzerine bir çalışma ile sonuçlanır. L. Fackler Paul tarafından "Matrix Matematik Üzerine Notlar" www4.ncsu.edu/~pfackler/MatCalc.pdf Kronceker ürünlerini farklılaştırarak üzerinde malzemenin bir yeri vardır
Mark L. Taş

Referanslar için teşekkürler. Bu MatCalc notlarını daha önce buldum, ancak Hadamard'ı kapsamıyor ve yine de matris dışı hesaptan bir kuralın geçerli olup olmadığından veya matris davasına uygulanmadığından emin değilim. Ürün kuralları, zincir kuralları vb. Kitaba bakacağım. Kendimi kalemle
doldurmam

Bunu neden yapıyorsun? neden Keras / TensorFlow gibi framewroks kullanmıyorsunuz? Gerçek sorunların çözümünde kullanabileceğiniz bu düşük seviyeli algoritmaları uygulamak için verimli bir zaman kaybı
Aksakal

1
Daha doğrusu, hem girdi verilerinin parametrelerdeki doğrusal gösterimleri hem de boyuna / panel yapısı açısından bilinen parametrik yapıyı kullanan ağlar yerleştiriyorum. Oluşturulan çerçeveler, hackleme / değiştirme yeteneğimin ötesinde olacak şekilde çok optimize edilmiştir. Artı matematik genellikle yardımcı olur. Çok sayıda kodonun ne yaptıkları hakkında hiçbir fikri yok. Aynı şekilde Rcppverimli bir şekilde uygulamak için yeterince öğrenme de faydalıdır.
generic_user

1
@ MarkL.Stone sadece teorik olarak sağlam değil, pratik olarak kolay! Az çok mekanik bir süreç! &% # $!
generic_user

Yanıtlar:


1

Değil tam bir cevap, ama benim yorumunda önerdi göstermek için eğer nerede , ve oluşan bir vektördür, daha sonra olduğunu kaydeden ve , söz konusu bakınız

b(X)=(XeNμXT)ΓΣX1/2+eNβT
Γ=diag(γ)ΣX1/2=diag(σX11,σX21,)eN
βR=[2ϵ^(Γ2TI)JX(a)(IeN)]T
2ϵ^(Γ2TI)=vec(2ϵ^Γ2T)TJX(a)=diag(vec(a(b(XΓ1))))
βR=(IeNT)vec(a(b(XΓ1))2ϵ^Γ2T)=eNT(a(b(XΓ1))2ϵ^Γ2T)
kimlik ile . Benzer şekilde, burada ("saplama") ve birvec(AXB)=(BTA)vec(X) W,=bir'(b(xΓ1))-2 s Γ T 2 KN
γR=[2ϵ^(Γ2TI)JX(a)(ΣXΓ11/2(XΓ1eNμXΓ1T))K]T=KTvec((XΓ1eNμXΓ1T)TWΣXΓ11/2)=diag((XΓ1eNμXΓ1T)TWΣXΓ11/2)
W=a(b(XΓ1))2ϵ^Γ2TKNp×pKronecker ürününün bir kare matrisin köşegen elemanlarına karşılık gelen sütunlarını seçen ikili matris. Bu, olmasından kaynaklanmaktadır . İlk gradyandan farklı olarak, bu ifade türettiğiniz ifadeye eşdeğer değildir. Bu göz önüne alındığında doğrusal bir fonksiyonu wrt olan , bir faktör olmamalıdır gradyanı içinde. gradyanını , ancak sabit ile türetme için makalenin yazarlarının kaçınmaya çalıştığı "patlamayı" yarattığını söyleyeceğim . Uygulamada, aynı zamanda ve wrt Jacobian'larını bulmanız gerekecektir.b γ i γ i Γ 1 wdΓij=0bγiγiΓ1wμ X XΣXμXX ve ürün kuralını kullanın.
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.