ব্যাচ নরমালাইজেশন গভীর নিউরাল নেটগুলিতে যথেষ্ট পারফরম্যান্স উন্নতির জন্য জমা দেওয়া হয়েছে। ইন্টারনেটে প্রচুর পরিমাণে উপাদান দেখায় যে কীভাবে এটি অ্যাক্টিভেশন-বাই-অ্যাক্টিভেশন ভিত্তিতে প্রয়োগ করা যায়। আমি ইতিমধ্যে ম্যাট্রিক্স বীজগণিত ব্যবহার করে ব্যাকপ্রপ বাস্তবায়ন করেছি এবং দিয়েছি যে আমি উচ্চ স্তরের ভাষায় Rcpp
(এবং শেষ পর্যন্ত for
জিপিইউ'র উপর নির্ভর করে ঘন ম্যাট্রিক্স গুণনের জন্য) কাজ করছি, সবকিছু ছিঁড়ে ফেলেছি এবং লুপগুলিতে অবলম্বন করার ফলে আমার কোডটি ধীর হয়ে যাবে যথেষ্ট পরিমাণে ব্যথা ছাড়াও।
ব্যাচের সাধারণকরণের ফাংশনটি হল যেখানে
- এটি সক্রিয় হওয়ার আগে হ'ল ম নোড
- এবং স্কেলার পরামিতি
- এবং গড় এবং এর এসডি হয় । (নোট করুন যে বৈকল্পিকের বর্গমূল মূল এবং একটি ফজ ফ্যাক্টর সাধারণত ব্যবহৃত হয় - আসুন কমপ্যাক্টনেসের জন্য ননজারো উপাদানগুলি ধরে নিই)
ম্যাট্রিক্স ফর্মে, পুরো স্তরের ব্যাচের সাধারণকরণ হবে যেখানে
- হ'ল
- একটি কলাম ভেক্টর
- এবং এখন প্রতি-স্তর স্বাভাবিককরণের পরামিতিগুলির সারি ভেক্টরপি
- এবং হল ম্যাট্রিক্স, যেখানে প্রতিটি কলামটি কলাম অনুসারে মানে এবং মানক বিচ্যুতির একটি -ভেক্টর where এন × পি এন
- ক্রোনেকার পণ্য এবং এলিমেন্টওয়াইজ (হাদামারড) পণ্য
একটি খুব সাধারণ এক-স্তরীয় নিউরাল নেট যা কোনও ব্যাচের সাধারণকরণ এবং একটি অবিচ্ছিন্ন ফলাফল হ'ল
কোথায়
- হয়
- পি 2 × 1 হয়
- হল অ্যাক্টিভেশন ফাংশন
লোকসানটি যদি , তবে গ্রেডিয়েন্টগুলি ∂ আর
কোথায়
ব্যাচের সাধারণকরণের অধীনে বা ডেরাইভেটিভগুলি কীভাবে গণনা করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই। ক্রোনেকার পণ্যগুলির বিষয়ে, সাহিত্যটি মোটামুটি আরকেন হয়। y = a ( ( γ ⊗ 1 এন ) ⊙ ( এক্স Γ 1 - μ এক্স Γ 1 ) ⊙ σ - 1 এক্স Γ 1 + ( β ⊗ 1 এন ) ) Γ 2
ম্যাট্রিক্স কাঠামোর মধ্যে , এবং গণনা করার ব্যবহারিক উপায় কি ? নোড-বাই-নোডের গণনা অবলম্বন না করে একটি সাধারণ অভিব্যক্তি?∂ আর / ∂ β ∂ আর / ∂ Γ 1
আপডেট 1:
আমি বের করেছি - সাজানো। এটি হ'ল: কিছু আর কোড দেখায় যে এটি করা লুপিংয়ের সমতুল্য। প্রথমে জাল তথ্য সেট আপ করুন:1 টি এন ( একটি ' ( এক্স Γ 1 ) ⊙ - 2 ε Γ টি 2 )
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
তারা মিলছে। তবে আমি এখনও বিভ্রান্ত, কারণ আমি জানি না কেন এটি কাজ করে। @ মার্ক এল স্টোন দ্বারা রেফারেন্সযুক্ত ম্যাটকাল্যাক নোটগুলি বলে যে হওয়া উচিত
এমএনপিকিএবিটি
# 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
এটি উপযুক্ত নয়। স্পষ্টতই আমি ক্রোনেকার ডেরিভেটিভ বিধিগুলি বুঝতে পারছি না। যারা সাহায্য করবে দুর্দান্ত হবে। এবং - এর জন্য আমি এখনও অন্যান্য ডেরাইভেটিভগুলিতে পুরোপুরি আটকে আছি - এগুলি আরও শক্ত কারণ তারা করে না।
আপডেট 2
পাঠ্যপুস্তক পড়া, আমি মোটামুটি নিশ্চিত যে এবং অপারেটরের ব্যবহারের প্রয়োজন হবে । তবে কোডগুলিতে তাদের অনুবাদ করতে সক্ষম হওয়ায় আমি স্পষ্টতই ডেরাইভেশনগুলি অনুসরণ করতে অক্ষম। উদাহরণস্বরূপ, of এর ডেরিভেটিভকে সাথে গ্রহণ করার ক্ষেত্রে জড়িত হতে , যেখানে (যা আমরা এই মুহুর্তের জন্য ধ্রুবক ম্যাট্রিক্স হিসাবে বিবেচনা করতে পারি)। vec()
আমার প্রবৃত্তি কেবল বলতে "উত্তর হল ", কিন্তু কাজ স্পষ্টত এই নয় যে কারণ সঙ্গে অনুরূপ নয় ।
আমি জানি যে
এবং এই থেকে , যে
আপডেট 3
এখানে অগ্রগতি হচ্ছে। এই ধারণাটি নিয়ে আমি গতকাল রাত 2 টা বেজে উঠি। ঘুমের জন্য ম্যাথ ভাল হয় না।
কিছু চিনির পরে এখানে :
শৃঙ্খলা নিয়মের শেষে পাওয়ার পরে আপনার কাছে যা আছে তা এখানে: এই লুপিং শুরু করে শুরু করুন - এবং কলাম সাবস্ক্রিপ্ট করবে এবং a একটি উপযোগী পরিচয় ম্যাট্রিক্স:
এবং, বাস্তবে এটি:
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
এখানে, আমি মনে করি, এটি । প্রথম
আগের মত, শৃঙ্খলা নিয়ম আপনাকে লুপিং আপনাকে যা পূর্বের মত মূলত প্রাক-গুণিত করে। সুতরাং এটি সমান হতে হবে:
এটি মিলের ধরণের:
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
প্রথমটির তির্যকটি দ্বিতীয়টিতে ভেক্টরের সমান। তবে সত্য যেহেতু ডেরাইভেটিভ একটি ম্যাট্রিক্সের সাথে সম্মানজনক - যদিও একটি নির্দিষ্ট কাঠামোযুক্ত একটি, আউটপুট একই কাঠামোর সাথে একই ম্যাট্রিক্স হওয়া উচিত। আমি কি ম্যাট্রিক্স পদ্ধতির ডায়াগোনালটি নিয়ে এটিকে সহজভাবে হতে পারি? আমি নিশ্চিত নই.
দেখে মনে হচ্ছে আমি নিজের প্রশ্নের উত্তর দিয়েছি তবে আমি সঠিক কিনা তা নিয়ে আমি নিশ্চিত নই। এই মুহুর্তে আমি এমন একটি উত্তর গ্রহণ করব যা আমি কাকে একসাথে হ্যাক করেছি তা দৃ rig়তার সাথে প্রমাণ করে (বা অস্বীকার করে)।
while(not_answered){
print("Bueller?")
Sys.sleep(1)
}
Rcpp
দক্ষতার সাথে এটি বাস্তবায়নের জন্য যথেষ্ট শেখা দরকারী।