Deep Learning UB 2021 — summer school : Day#6
2B | +1% better 2day | ai.010
Day#6 Семинар #3 гүнзгий сургалтын үндэс лекцийг “жинхэнээсээ” код дээр ажиллуулна аа. Хичээлийн хувьд Шугаман регресс, Ложистик регресс (ангилал), СофтМакс регресс (MLP/DNN) 3-г кодчилно.
Семинар эхлэхдээ өмнөх хичээлийг давтлага маягаар ярьсан байгаа.
Дээрх y=wx+b
Шугаман регрессийг Ньюроны сүлжээ дээрх 1 давхарга гэж ойлгож болно.
1. Шугаман регресс
Өмнөх семинар #2 дээр хийсэн зүйлээ илүү амархнаар хийцгээнэ ээ. Шууд torch ашиглана.
Түүний дараа загвараа үүсгэх хэсгийг бас хялбаршуулсан байдлаар хийе. Torch дотор бэлэн байгаа nn, parameters-г ашиглан шинээр бичье.
Бэлэн болсон загварын классыг дуудаад үзвэл
За ингээд сургалтаа эхлэнэ дээ. Өмнөх кодоо бага зэрэг өөрчлөөд адилхан 1000 epoch-оор сургаад үзье. (S.item() = S-н скаляр утгыг авч байгаа)
За тэгээд сургалтын явцад алдаа нь анх 253.63-аас эхлээд 900-дэх алхам дээр 12.31 болж багассан байна.
Энэ хүртэл 50 минут болсон бөгөөд дахиад 2 цагийн хичээл үлдлээ. Өнөөдрийн хичээл хамгийн удаан нь болж байх шиг байна даа. :)
2. Ложистик регресс
Дараагийн хэсэгт ангилалын талаар кодчилохоор болсон. 2-хон сонголтын аль нь вэ гэдгийг шийдэхэд хэрэглэнэ.
Кодчилохдоо өмнөх шугаман давхарга дээр Сигмойд функцийг нэмээд л болчихно.
За тэгээд кодруугаа ороод шууд хэрэгтэй сангуудаа оруулж ирнэ. Дараа нь өгөгдлөө бэлдээд, тенсор луу хөрвүүлээд, plot хийж дүрсэлнэ.
Дараа нь загвараа кодчилоод, түүнийгээ харцгаая.
Одоогийн байдлаар model үүссэн байгаа. Эхлэх үед дүрслэл маань ямар байгааг харья.
Цэнхэр болон улбар шарыг зөв ялгахын тулд одоо сургалтаа хийх хэрэгтэй. Өмнөх бичиглэлээс 1 ялгаатай нь Binary Cross Entropy Loss-г ашиглаж байгаа.
Суралцаж байх үеийн дүрслэлийг харвал эхлээд далийн явж байснаа бага багаар засаад 900 дэх epoch дээр нилээн сайн хувааж/ангилж байгаа нь харагдаж байна.
Phew… Одоо тэгээд hot dog, NOT hot dog хийчихээр болоо ш дээ?
3. СофтМакс регресс
За өмнөхөө 1 шат ахиулаад [1,0], Тийм/Үгүй биш илүү олон ангиудад хувааж ангилах руу орно оо. Hotdog, Burger, Taco 3-г ялгадаг болчуул тэ?
Шинээр torchvision санг оруулж ирээд, мөн Google Colab-н runtime-г GPU ашигладаг болгож тохируулах хэрэгтэй. (Runtime → Change runtime type)
Дараа нь сургалтад хэрэглэх өгөгдлийг татаж аваар харцгаая. MNIST нэртэй гараар бичсэн тоонуудын өгөгдөл. (TorchVision дотроос оруулж ирсэн) Нийтдээ 60к сургалтын, 10к validation-ы өгөгдөл бий.
Дараа нь тухайн өгөгдлийг дүрсжүүлж болон array хэлбэрээр нь утгыг нь хэвлэж харья.
Бас арай өөрөөр өгөгдлийг харахдаа. 10х8 25ш зурагнаас бүтэхээр 5x5 хэмжээстэй 1 том plot дүрсэлж үзүүлж байна.
Дараа нь нийт өгөгдлийн 1000 ширхэгийг, 50–50-аар нь ашиглаж сургалтаа хийнэ ээ. Багаар авч байгаа шалтгаан нь их хэмжээний өгөгдөл дээр шууд сургалт хийхэд хэцүү, эсвэл удаан зэрэг шалтгааны улмаас сургалтыг олон алхамд хувааж болдог.
За тэгээд жинхнээсээ сургалтаа эхэлье. Сургалтын явцад алдаа (loss) нь хэд байгааг, мөн оновчлол (accuracy) нь хэр байгааг харцгаана аа. Анзаарвал алдаа (loss) нь багасаад оновчлол (accuracy) нь өсөөд явж байна.
Эхний удаа ажиллуулсны дараа 90% гарантай сайн таньдаг болчих шиг боллоо. Харин 10 удаа ажиллуулахад алдаа нь 0.1176, оновчлол нь 98.6% болж байдаг шүү. Аймар уу? эсвэл Overfit болж байгаам бол уу?
Дараагийн хэсэгт нь MLP буюу ганцхан давхарга байсныгаа олон давхаргатай болгоцгооё. Тэгэхийн тулд давхарга нэмэхдээ activation функц ашиглаж шугаман биш хамааралтай болгож байгаа. (Ex: relu)
Энэ дээр нэмэх нь 1 асуудал байгаа. Тэр нь зөвхөн сургалтын өгөгдөл дээрээ ажиллаад байхгүйгээр сургасан загвараа (model) өмнө нь огт харж байгаагүй validation өгөгдөл дээр хэр сайн ажиллаж байгааг шалгана аа. Validation өгөгдөл дээр тооцоолол хийхдээ gradient-ээ шинэчлэхгүй гэсэн үг.
Сургалтын үед оновчлол 76.9 байхад validation өгөгдөл дээр 70.8 байна. Цаашлаад 200 epoch сургахад сургалтын өгөгдөл дээр бараг 97.7 оновчтой байгаа ч бодит байдал дээр 84.6 болж буурсан байгаа нь харагдана.
Мэдээж харсан өгөгдөл дээрээ хэт сайн ажиллаад хараагүй бол муу ажиллаад байвал Overfit болж байгаа гэсэн үг. Аа харин сургалтын өгөгдлөө угаасаа сайн оновчлолтой биш байвал Underfit болчихно.
Хэрвээ Overfit болоод байгаа бол янз бүрийн аргаар сайжруулах боломжтой. 1 жишээ нь өмнөх лекц дээр ярьсан шиг Dropout ашиглаж болно.
Ингэснээр Training болон Validation хоёрын оновчлол, алдааны ялгааг багасгаж ойролцоо болгоно. Цаашлаад сургалтын өгөгдөл биш шинээр орж ирсэн, өмнө нь харж байгаагүй өгөгдөл дээр л ИЛҮҮ сайн ажиллах ёстой.
Сүүлийн Dropout ашигласан, 10000ш өгөгдөл дээр сургасан загвар маань Training өгөгдөл дээр 99.37%, Validation өгөгдөл дээр 95.11%-н оновчлолтой болсон байгаа шүү.
Бараг л хүн шиг?
Ингээд 3 цагийн семинар маань дууслаа.
Одоо дахиад 1 лекц хоцролттой л явна шүү.