รูปแบบเมทริกซ์ของการแพร่กระจายย้อนกลับพร้อมการทำให้เป็นมาตรฐาน


12

การทำให้เป็นมาตรฐานของแบทช์ได้รับเครดิตด้วยการปรับปรุงประสิทธิภาพอย่างมากในอวนตาข่ายประสาท วัสดุจำนวนมากบนอินเทอร์เน็ตแสดงวิธีใช้งานบนพื้นฐานการเปิดใช้งานโดยการเปิดใช้งาน ฉันใช้ backprop ไปแล้วโดยใช้พีชคณิตเมทริกซ์และเนื่องจากฉันทำงานในภาษาระดับสูง (ในขณะที่พึ่งพาRcpp(และในที่สุด GPU ของ) สำหรับการคูณเมทริกซ์หนาแน่น) การฉีกทุกอย่างออกไปและหันไปใช้forลูปของฉัน อย่างมีนัยสำคัญนอกเหนือไปจากความเจ็บปวดขนาดใหญ่

ฟังก์ชั่นการปรับสภาพแบทช์คือ โดยที่

b(xp)=γ(xpμxp)σxp1+β
  • คือ Pโหนด, th ก่อนที่มันจะได้รับการเปิดใช้งานxpp
  • และ βเป็นพารามิเตอร์สเกลาร์γβ
  • และ σ x พีมีค่าเฉลี่ยและ SD ของ xพี (โปรดสังเกตว่าปกติใช้สแควร์รูทของความแปรปรวนบวกกับฟัดจ์แฟคเตอร์ - สมมติว่าองค์ประกอบที่ไม่ใช่ศูนย์เพื่อความกะทัดรัด)μxpσxpxp

ในรูปแบบเมทริกซ์ฟื้นฟูชุดสำหรับชั้นทั้งจะ ที่

b(X)=(γ1p)(XμX)σX1+(β1p)
  • คือ N × pXN×p
  • คือเวกเตอร์คอลัมน์ของอัน1N
  • และ βเป็นแถว p -vector ของพารามิเตอร์การทำให้เป็นมาตรฐานสำหรับแต่ละชั้นγβp
  • และ σ Xคือเมทริกซ์ N × pโดยที่แต่ละคอลัมน์คือ N -vector ของค่าเฉลี่ยของคอลัมน์และส่วนเบี่ยงเบนมาตรฐานμXσXN×pN
  • เป็นผลิตภัณฑ์ของ Kronecker และเป็นผลิตภัณฑ์ที่เป็นองค์ประกอบ (Hadamard)

โครงข่ายประสาทเดี่ยวชั้นเดียวที่ไม่มีการทำแบตช์ให้เป็นมาตรฐานและผลลัพธ์ต่อเนื่องคือ

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

ที่ไหน

  • คือ p 1 × p 2Γ1p1×p2
  • คือ p 2 × 1Γ2p2×1
  • เป็นฟังก์ชั่นการเปิดใช้งานa(.)

หากการสูญเสียคือแล้วการไล่ระดับสีที่มี RR=N1(yy^)2

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

ที่ไหน

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

ภายใต้การฟื้นฟูชุดสุทธิจะกลายเป็น หรือ Y = ( (แกมมา1 N )( X Γ 1 - μ X Γ 1 )σ - 1 X Γ 1 + (บีตา1 N ) ) Γ 2

y=a(b(XΓ1))Γ2
y=a((γ1N)(XΓ1μXΓ1)σXΓ11+(β1N))Γ2
ฉันไม่รู้ว่าจะคำนวณอนุพันธ์ของผลิตภัณฑ์ Hadamard และ Kronecker ได้อย่างไร ในเรื่องของผลิตภัณฑ์ Kronecker วรรณกรรมได้รับความลับอย่างเป็นธรรม

มีวิธีการปฏิบัติของการคำนวณ , R /บีตาและR /แกมมา1ภายในกรอบเมทริกซ์? นิพจน์ง่าย ๆ โดยไม่ต้องใช้การคำนวณแบบโหนดต่อโหนด?R/γR/βR/Γ1

อัปเดต 1:

R/β

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

จากนั้นคำนวณอนุพันธ์:

# 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

β1N

ABA=(InqTmp)(Invec(B)Im)
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

γΓ1β1

อัปเดต 2

R/Γ1R/γvec()R/Γ1wXΓ1Γ1w(γ1)σXΓ11

wXwX

(AB)=AB+AB

และจากนี้สิ่งนั้น

vec(wXΓ1)vec(Γ1)T=vec(XΓ1)Ivec(w)vec(Γ1)T+vec(w)Ivec(XΓ1)vec(Γ1)T

อัปเดต 3

สร้างความก้าวหน้าที่นี่ เมื่อคืนนี้ฉันตื่นนอนตอน 2AM ด้วยความคิดนี้ คณิตศาสตร์ไม่ดีสำหรับการนอนหลับ

R/Γ1

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

RΓ1=wXΓ1Γ1("stub")
ijI
RΓij=(wiXi)T("stub"j)
RΓij=(IwiXi)T("stub"j)
RΓij=XiTIwi("stub"j)
RΓ=XT("stub"w)

และในความเป็นจริงมันคือ:

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

อัปเดต 4

R/γ

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

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

มันเรียงลำดับของการแข่งขัน:

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

γ

ดูเหมือนว่าฉันได้ตอบคำถามของฉันเอง แต่ฉันไม่แน่ใจว่าถูกต้องหรือไม่ ณ จุดนี้ฉันจะยอมรับคำตอบที่พิสูจน์อย่างจริงจัง (หรือหักล้าง) สิ่งที่ฉันเรียงลำดับของการแฮ็กเข้าด้วยกัน

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

2
บทที่ 9 ตอนที่ 14 ของ "แคลคูลัสเชิงอนุพันธ์ของเมทริกซ์ที่มีการประยุกต์ใช้ในสถิติและเศรษฐมิติ" โดย Magnus และ Neudecker, รุ่นที่ 3 janmagnus.nl/misc/mdc2007-3rdedition ครอบคลุมส่วนต่างของผลิตภัณฑ์ของ Kronecker "Notes on Matrix แคลคูลัส" โดย Paul L. Fackler www4.ncsu.edu/~pfackler/MatCalc.pdf มีเนื้อหามากมายเกี่ยวกับผลิตภัณฑ์ Kronceker ที่แตกต่าง
Mark L. Stone

ขอบคุณสำหรับการอ้างอิง ฉันได้พบ MatCalc เหล่านั้นมาก่อนแล้ว แต่มันไม่ครอบคลุม Hadamard และฉันไม่เคยแน่ใจเลยว่ากฎจากแคลคูลัสที่ไม่ใช่เมทริกซ์จะใช้หรือไม่ใช้กับกรณีเมทริกซ์ กฎผลิตภัณฑ์กฎลูกโซ่ ฯลฯ ฉันจะดูในหนังสือ ฉันยอมรับคำตอบที่ชี้ให้ฉันเห็นถึงส่วนผสมทั้งหมดที่ฉันต้องใช้ในการวาดด้วยตัวเอง ...
generic_user

ทำไมคุณทำเช่นนี้? ทำไมไม่ใช้ framewroks เช่น Keras / TensorFlow มันเสียเวลาอย่างมีประสิทธิผลในการใช้อัลกอริธึมระดับต่ำเหล่านี้ซึ่งคุณสามารถใช้ในการแก้ปัญหาที่แท้จริง
Aksakal

1
แม่นยำยิ่งขึ้นฉันเป็นเครือข่ายที่เหมาะสมที่ใช้ประโยชน์จากโครงสร้างแบบพาราเมตริกที่เป็นที่รู้จักทั้งในแง่ของการแสดงข้อมูลเชิงเส้นในพารามิเตอร์ของข้อมูลอินพุตรวมถึงโครงสร้างตามยาว / แผง เฟรมเวิร์กที่กำหนดไว้นั้นได้รับการปรับแต่งอย่างหนักเพื่อให้เกินความสามารถในการแฮ็ค / ดัดแปลง คณิตศาสตร์บวกมีประโยชน์โดยทั่วไป codemonkeys จำนวนมากไม่รู้ว่ากำลังทำอะไรอยู่ การเรียนรู้ที่Rcppจะนำไปใช้อย่างมีประสิทธิภาพก็มีประโยชน์
generic_user

1
@ MarkL.Stone ไม่เพียง แต่มันฟังดูเป็นหลักแล้วมันง่ายมาก! กระบวนการทางกลมากหรือน้อย! &% # $!
generic_user

คำตอบ:


1

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)Tและเราเห็นว่าผ่านตัวตน(X) ในทำนองเดียวกันJX(a)=diag(vec(a(b(XΓ1))))
βR=(IeNT)vec(a(b(XΓ1))2ϵ^Γ2T)=eNT(a(b(XΓ1))2ϵ^Γ2T)
vec(AXB)=(BTA)vec(X)
γ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)
โดยที่ ("ต้นขั้ว") และเป็นเมทริกซ์ไบนารีที่เลือกคอลัมน์ของผลิตภัณฑ์ Kronecker ที่สอดคล้องกับองค์ประกอบเส้นทแยงมุมของเมทริกซ์จตุรัส นี้ต่อไปจากข้อเท็จจริงที่ว่า 0 ไม่เหมือนกับการไล่ระดับสีแรกนิพจน์นี้ไม่เท่ากับนิพจน์ที่คุณได้รับ เมื่อพิจารณาแล้วว่าW=a(b(XΓ1))2ϵ^Γ2TKNp×pb γ i γ i Γ 1 w Σ X μ X XdΓij=0bเป็นฟังก์ชันเชิงเส้น wrtไม่ควรมีปัจจัยในการไล่ระดับสี ผมออกจากการไล่ระดับสีของเพื่อ OP แต่ฉันจะบอกว่าสำหรับที่มาพร้อมกับการแก้ไขสร้าง "ระเบิด" นักเขียนของบทความพยายามที่จะหลีกเลี่ยง ในทางปฏิบัติคุณจะต้องค้นหา Jacobians ofและ wrtและใช้กฎผลิตภัณฑ์γiγiΓ1wΣXμXX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.