Chuqur o'rganish bo'yicha eng yaxshi amaliyotlar (1) - Og'irlikni boshlash

Asoslar, vaznni aniqlashdagi noxushliklar va eng yaxshi amaliyotlar

https://pixabay.com/photo-1600668/

Motivatsiya

Chuqur o'rganishni boshlayotgani uchun, shuni anglab etdimki, bir vaqtning o'zida barcha chuqur o'rganish fokuslarini qamrab oluvchi Internetda juda ko'p hujjatlar mavjud emas. Og'irlikni boshlash, muntazamlashtirish kabi oddiy usullardan tortib, mashq qilish va neyron tarmoqlarini tuzatishni osonlashtiradigan tsiklli o'rganish tezligi kabi bir qancha eng yaxshi tajribalar mavjud. Bu menga ushbu bloglar seriyasini yozishga ilhom berdi, bu erda siz uchun chuqur o'rganishni soddalashtirish uchun imkon qadar ko'proq nuanslarni yoritaman.

Ushbu blogni yozayotganda, siz neyron tarmoqlari qanday o'qitilganligi haqida asosiy tasavvurga egasiz, degan taxmin mavjud. Og'irliklar, noaniqliklar, yashirin qatlamlar, aktivatsiya va aktivizatsiya funktsiyalari haqida tushuncha tarkibni aniqroq qiladi. Agar siz chuqur o'rganishning asosiy poydevorini qurmoqchi bo'lsangiz, ushbu kursni tavsiya qilaman.

Eslatma - Men har doim neyron tarmoq qatlamlariga murojaat qilsam, u oddiy neyron tarmoqning qatlamlarini, ya'ni to'liq ulangan qatlamlarni anglatadi. Albatta, men gaplashadigan ba'zi usullar konvulsion va takroriy neyron tarmoqlarga ham tegishli. Ushbu blogda men vazn matritsalarini ishga tushirish va ularni yumshatish usullari haqida gaplashmoqchiman. Undan oldin keling, biz oldinga siljishda foydalanadigan ba'zi asoslar va tushunchalarni ko'rib chiqaylik.

Asoslar va eslatmalar

L-1 yashirin qatlamlari va 1 chiqish qatlamiga ega bo'lgan L qatlamli neyron tarmog'ini ko'rib chiqing. L sathining parametrlari (og'irlik va noaniqliklar) quyidagicha berilgan

Og'irliklar va noaniqliklar bilan bir qatorda, o'quv jarayonida quyidagi oraliq o'zgaruvchilar hisoblab chiqiladi

Neyron tarmog'ini o'qitish 4 bosqichdan iborat:

  1. Tarozi va noaniqlikni boshlang.
  2. Oldinga targ'ibot: X kirishidan foydalanib, B va og'irliklarni b, har bir qatlam uchun biz Z va A ni hisoblaymiz. Oxirgi qavatda f (A ^ (L-1)) ni sigmasimon, yumshoq dastur yoki chiziqli funktsiya bo'lishi mumkin. A ^ (L-1) va bu y_hatni bashorat qiladi.
  3. Yo'qotish funktsiyasini hisoblang: bu y va yorliqning taxminiy yorlig'i y_hat funktsiyasi. Bu bizning taxminlarimiz haqiqiy mo'ljaldan qanchalik uzoqligini aniqlaydi. Bizning maqsadimiz bu yo'qotish funktsiyasini minimallashtirishdir.
  4. Orqa tarafga tarqalish: Ushbu bosqichda f (y, y_hat) yo'qotish funktsiyasining gradientlarini A, W va b deb nomlangan dA, dW va db deb hisoblaymiz. Ushbu gradientlardan foydalanib, biz parametrlarning qiymatlarini oxirgi qavatdan birinchi darajagacha yangilaymiz.
  5. Yo'nalishlar / davrlar uchun 2-4 bosqichlarni takroriy takrorlang, chunki biz yo'qotish funktsiyasini minimallashtirganligimizga qadar, poezd ma'lumotlarini ortiqcha ishlamaymiz (bu haqda keyinroq!).

Bu erda 2, 3 va 4 bosqichlarni ko'rib chiqamiz, ya'ni 2 qavatli tarmoq, ya'ni bitta yashirin qatlam. (E'tibor bering, men bu erda soddaligi uchun noto'g'ri fikrlarni qo'shmaganman):

Oldinga targ'ibotOrqa tarafga tarqalish

Vaznni boshlash

Tarmoqni yaratishda ehtiyot bo'lish kerak bo'lgan boshlang'ich nuqtalardan biri bu sizning vazningizni to'g'ri boshlashdir. Modelni o'qitish paytida muammolarga olib keladigan 2 stsenariyni ko'rib chiqaylik:

1. Barcha og'irliklarni 0 ga boshlash

Keling, uni tashqariga chiqaraylik - bu sizning modelingizni chiziqli modelga tenglashtiradi. Agar siz barcha vaznni 0 ga qo'ygan bo'lsangiz, yo'qotish funktsiyasidan kelib chiqqan hosilal W ^ l har bir w uchun bir xil bo'ladi, shuning uchun keyingi iteratsiyada barcha og'irliklar bir xil qiymatga ega. Bu yashirilgan birliklarni nosimmetrik holga keltiradi va siz ishlaydigan barcha n-iteratsiyalar uchun davom etadi. Shunday qilib, og'irliklarni nolga o'rnatish sizning tarmoqni chiziqli modeldan yaxshiroq qiladi. Shuni ta'kidlash kerakki, 0 ga egilishni o'rnatish hech qanday muammo tug'dirmaydi, chunki nolga teng bo'lmagan og'irliklar simmetriyani buzish haqida g'amxo'rlik qiladi va agar nosog'lomlik 0 bo'lsa ham, har bir neyronda qiymatlar har xil bo'ladi.

2. Og'irlikni tasodifiy boshlash

Og'irlikni tasodifiy ravishda boshlash, Python-da normal normal taqsimotni (np.random.randn (size_l, size_l-1)) (chuqur) tarmoq bilan ishlash paytida ikki muammoga olib kelishi mumkin - yo'qolgan yoki yo'qolgan gradyanlar.

a) Yo'qoluvchi gradientlar - Chuqur tarmoqlar mavjud bo'lganda, har qanday faollashtirish funktsiyasi uchun abs (dW) kichrayib boraveradi, chunki biz orqaga tarqalish paytida har bir qatlam bilan orqaga qarab o'tamiz. Oldingi qatlamlar bunday holatda mashq qilishning eng sekinidir.

Kilogramm yangilanishi ahamiyatsiz va sekinroq konvergentsiyaga olib keladi. Bu yo'qotish funktsiyasini optimallashtirishni sekinlashtiradi. Eng yomon holatda, bu neyron tarmog'ini o'qishni butunlay to'xtatishi mumkin.

Aniqroq qilib aytganda, sigmasimon (z) va tanh (z) holatlarida, agar sizning vazningiz katta bo'lsa, unda gradient yo'qoladi, bu og'irliklarning qiymatini o'zgartirishga xalaqit beradi. Buning sababi shundaki, abs (dW) ozgina oshadi yoki ehtimol har iteratsiyada kichrayadi va kichrayadi. RELU (z) bilan yo'qolgan gradyanlar odatda muammo bo'lmaydi, chunki gradient salbiy (va nol) kirishlar uchun 0 va musbat kirishlar uchun 1 bo'ladi.

b) portlovchi gradyanlar - bu yo'qolayotgan gradyanlarning aksi. Sizda manfiy bo'lmagan va katta og'irliklar va A ning faol faolligi bor deb hisoblang (sigmasimon (z) kabi). Ushbu og'irliklar qatlamlar bo'ylab ko'paytirilsa, ular narxning katta o'zgarishiga olib keladi. Shunday qilib, gradientlar ham katta bo'ladi. Bu W - W * dW ga o'zgarishi juda katta bosqichda bo'lishini anglatadi, pastga tushish momenti oshadi.

Bu minima atrofida tebranishga yoki hatto eng maqbulini ag'darib tashlashga olib kelishi mumkin va model hech qachon o'rganmaydi!

Portlash gradyanlarining yana bir ta'siri shundaki, gradientlarning ulkan qiymatlari sonning ko'payishiga olib kelishi mumkin, bu noto'g'ri hisoblashlarga yoki NaN ning kiritilishiga olib keladi. Bu, shuningdek, NaN qiymatini olib, yo'qotishga olib kelishi mumkin.

Eng yaxshi amaliyotlar

1. RELU / oqayotgan RELU-ni faollashtirish funktsiyasi sifatida ishlatish, chunki u yo'qolib ketadigan / portlayotgan gradient muammosiga nisbatan ancha barqaror (ayniqsa juda chuqur bo'lmagan tarmoqlar uchun). Noqonuniy RELU bo'lsa, ularda 0 gradient bo'lmaydi. Shunday qilib ular hech qachon o'lmaydi va mashg'ulotlar davom etmoqda.

2. Chuqur tarmoqlarda biz chiziqli bo'lmagan faollashtirish funktsiyasiga qarab og'irliklarni boshlash uchun evristik usuldan foydalanishimiz mumkin. Bu erda odatdagi normal taqsimotni chizish o'rniga biz V ni normal taqsimotdan tortib k / n ga tenglashtiramiz, bu erda k aktivlashtirish funktsiyasiga bog'liq. Garchi bu evristikalar portlash / yo'q bo'lib ketadigan gradientlar masalasini to'liq hal qilmasa-da, ular uni engillashishiga yordam beradi. Eng keng tarqalganlari:

a) RELU (z) uchun - V ning tasodifiy hosil bo'lgan qiymatlarini quyidagiga ko'paytiramiz:

b) Tanh (z) uchun - evristik Xavier initsializatsiyasi deb nomlanadi. Bu avvalgisiga o'xshaydi, k 2 o'rniga 1 bo'ladi.

TensorFlow-da W = tf.get_variable ('W', [xira], initsializator), bu erda initializer = tf.contrib.layers.xavier_initializer ()

c) keng tarqalgan boshqa evristik:

Bular boshlang'ich uchun yaxshi boshlang'ich nuqtalar bo'lib xizmat qiladi va gradientlarning portlash yoki yo'qolish ehtimolini kamaytiradi. Ular vazni 1 dan ham kattaroq yoki 1 dan kam qilmadilar. Shunday qilib, gradientlar yo'qolmaydi yoki juda tez portlamaydi. Ular minimallashtirishni to'xtatmasligimizni ta'minlab, sekin konvergatsiyani oldini olishga yordam beradi. Yuqorida keltirilgan boshqa variantlar ham mavjud, ularda asosiy maqsad yana parametrlarning tafovutini minimallashtirishdir.

3. Gradientni kesish - bu portlovchi gradient muammosini hal qilishning yana bir usuli. Biz chegara qiymatini o'rnatamiz va agar gradientning tanlangan funktsiyasi bu qiymatdan katta bo'lsa, biz uni boshqa qiymatga qo'yamiz. Masalan, agar L2 me'yori ma'lum bir pol qiymatdan oshib ketsa, gradientlarni normalizatsiya qiling - W = W * pol / l2_norm (W), agar l2_norm (W)> pol qiymatlari

Ta'kidlash kerak bo'lgan muhim narsa shundaki, biz W ning turli xil initsializatsiyalari haqida gaplashdik, ammo b. Sababi, gradientlar tarafkashlik darajasi faqat chuqur qatlamlarning gradientlariga emas, balki faqat qatlamning chiziqli faollashuviga bog'liq. Shunday qilib, ikkiyuzlama atamalar uchun gradientlarning pasayishi yoki portlashi yo'q. Yuqorida aytib o'tilganidek, ular 0 ga ishonchli tarzda kiritilishi mumkin.

Xulosa

Ushbu blogda biz og'irliklarni initsializatsiyalashning buzilishlari va yumshatish usullarini yoritdik. Agar men ushbu mavzuga oid boshqa foydali fikrlarni o'tkazib yuborgan bo'lsam, uni sizdan o'rganishga juda xursand bo'laman! Keyingi blogda men haddan tashqari moslashishni va gradientni tekshirishni qisqartirish uchun tartibga solish usullari haqida gaplashaman - disk raskadrovka jarayonini soddalashtirish uchun hiyla!

Adabiyotlar

  1. https://www.coursera.org/learn/deep-neural-network/lecture/RwqYe/weight-initializatsiya-for-deep-networks
  2. Neyron tarmoqlar: orqa o'rindagi mashq - Jeremi Jordan
  3. Jeyson Braunlining "Neyron tarmoqlaridagi portlashlar" mavzusiga muloyim kirish
  4. Gradientning yo'qolishi muammosi
  5. https://www.quora.com/Why-is-it-a-problem-to-have-exploding-gradients-in-a-neural-net-especially-in-an-RNN

Men haqimda: MS Data Science-ni USF-da va Informatika magistri mutaxassisligini tugatgan va bashorat qilish va tavsiya qilish algoritmlarini tuzishda va moliya va chakana mijozlar uchun biznes tushunchalarini ishlab chiqarishda 2 yillik tajribam bor. Mashinada o'qitish va chuqur o'rganish bilimlarini haqiqiy muammolarga qo'llash imkoniyatlari meni juda hayajonlantiradi.
Bu erda mening boshqa bloglarimni ko'rib chiqing!
LinkedIn: https://www.linkedin.com/in/neerja-doshi/