Deep Learning UB 2021 — summer school : Day#6

2B | +1% better 2day | ai.010

--

Day#6 Семинар #3 гүнзгий сургалтын үндэс лекцийг “жинхэнээсээ” код дээр ажиллуулна аа. Хичээлийн хувьд Шугаман регресс, Ложистик регресс (ангилал), СофтМакс регресс (MLP/DNN) 3-г кодчилно.

Семинар эхлэхдээ өмнөх хичээлийг давтлага маягаар ярьсан байгаа.

y=wx+b → Neural Network → DAG

Дээрх y=wx+b Шугаман регрессийг Ньюроны сүлжээ дээрх 1 давхарга гэж ойлгож болно.

1. Шугаман регресс

Өмнөх семинар #2 дээр хийсэн зүйлээ илүү амархнаар хийцгээнэ ээ. Шууд torch ашиглана.

Өгөгдөл бэлдэх

Түүний дараа загвараа үүсгэх хэсгийг бас хялбаршуулсан байдлаар хийе. Torch дотор бэлэн байгаа nn, parameters-г ашиглан шинээр бичье.

Create Model → Загвар үүсгэх

Бэлэн болсон загварын классыг дуудаад үзвэл

Model Instance → plot model

За ингээд сургалтаа эхлэнэ дээ. Өмнөх кодоо бага зэрэг өөрчлөөд адилхан 1000 epoch-оор сургаад үзье. (S.item() = S-н скаляр утгыг авч байгаа)

Model training

За тэгээд сургалтын явцад алдаа нь анх 253.63-аас эхлээд 900-дэх алхам дээр 12.31 болж багассан байна.

Энэ хүртэл 50 минут болсон бөгөөд дахиад 2 цагийн хичээл үлдлээ. Өнөөдрийн хичээл хамгийн удаан нь болж байх шиг байна даа. :)

2. Ложистик регресс

Дараагийн хэсэгт ангилалын талаар кодчилохоор болсон. 2-хон сонголтын аль нь вэ гэдгийг шийдэхэд хэрэглэнэ.

Regression VS Classification

Кодчилохдоо өмнөх шугаман давхарга дээр Сигмойд функцийг нэмээд л болчихно.

За тэгээд кодруугаа ороод шууд хэрэгтэй сангуудаа оруулж ирнэ. Дараа нь өгөгдлөө бэлдээд, тенсор луу хөрвүүлээд, plot хийж дүрсэлнэ.

Import libraries → Prepare data → Plot (scatter)

Дараа нь загвараа кодчилоод, түүнийгээ харцгаая.

Model class → Instance

Одоогийн байдлаар model үүссэн байгаа. Эхлэх үед дүрслэл маань ямар байгааг харья.

Plot model → 1st time

Цэнхэр болон улбар шарыг зөв ялгахын тулд одоо сургалтаа хийх хэрэгтэй. Өмнөх бичиглэлээс 1 ялгаатай нь Binary Cross Entropy Loss-г ашиглаж байгаа.

Training

Суралцаж байх үеийн дүрслэлийг харвал эхлээд далийн явж байснаа бага багаар засаад 900 дэх epoch дээр нилээн сайн хувааж/ангилж байгаа нь харагдаж байна.

Plot model → epoch at 100s

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-ы өгөгдөл бий.

Yann Lecun → MNIST (1 of 3 Neural Network godfathers)

Дараа нь тухайн өгөгдлийг дүрсжүүлж болон array хэлбэрээр нь утгыг нь хэвлэж харья.

Image show → Print data array

Бас арай өөрөөр өгөгдлийг харахдаа. 10х8 25ш зурагнаас бүтэхээр 5x5 хэмжээстэй 1 том plot дүрсэлж үзүүлж байна.

10x8 subplots → 5x5 plot

Дараа нь нийт өгөгдлийн 1000 ширхэгийг, 50–50-аар нь ашиглаж сургалтаа хийнэ ээ. Багаар авч байгаа шалтгаан нь их хэмжээний өгөгдөл дээр шууд сургалт хийхэд хэцүү, эсвэл удаан зэрэг шалтгааны улмаас сургалтыг олон алхамд хувааж болдог.

Prepare data → Model class → Instance

За тэгээд жинхнээсээ сургалтаа эхэлье. Сургалтын явцад алдаа (loss) нь хэд байгааг, мөн оновчлол (accuracy) нь хэр байгааг харцгаана аа. Анзаарвал алдаа (loss) нь багасаад оновчлол (accuracy) нь өсөөд явж байна.

Model training → Epoch 1-100

Эхний удаа ажиллуулсны дараа 90% гарантай сайн таньдаг болчих шиг боллоо. Харин 10 удаа ажиллуулахад алдаа нь 0.1176, оновчлол нь 98.6% болж байдаг шүү. Аймар уу? эсвэл Overfit болж байгаам бол уу?

Underfit VS Overfit

Дараагийн хэсэгт нь MLP буюу ганцхан давхарга байсныгаа олон давхаргатай болгоцгооё. Тэгэхийн тулд давхарга нэмэхдээ activation функц ашиглаж шугаман биш хамааралтай болгож байгаа. (Ex: relu)

MLP (activation function) → Code

Энэ дээр нэмэх нь 1 асуудал байгаа. Тэр нь зөвхөн сургалтын өгөгдөл дээрээ ажиллаад байхгүйгээр сургасан загвараа (model) өмнө нь огт харж байгаагүй validation өгөгдөл дээр хэр сайн ажиллаж байгааг шалгана аа. Validation өгөгдөл дээр тооцоолол хийхдээ gradient-ээ шинэчлэхгүй гэсэн үг.

Training → Validation

Сургалтын үед оновчлол 76.9 байхад validation өгөгдөл дээр 70.8 байна. Цаашлаад 200 epoch сургахад сургалтын өгөгдөл дээр бараг 97.7 оновчтой байгаа ч бодит байдал дээр 84.6 болж буурсан байгаа нь харагдана.

Training accuracy VS Validation accuracy

Мэдээж харсан өгөгдөл дээрээ хэт сайн ажиллаад хараагүй бол муу ажиллаад байвал Overfit болж байгаа гэсэн үг. Аа харин сургалтын өгөгдлөө угаасаа сайн оновчлолтой биш байвал Underfit болчихно.

Хэрвээ Overfit болоод байгаа бол янз бүрийн аргаар сайжруулах боломжтой. 1 жишээ нь өмнөх лекц дээр ярьсан шиг Dropout ашиглаж болно.

Dropout → Code

Ингэснээр Training болон Validation хоёрын оновчлол, алдааны ялгааг багасгаж ойролцоо болгоно. Цаашлаад сургалтын өгөгдөл биш шинээр орж ирсэн, өмнө нь харж байгаагүй өгөгдөл дээр л ИЛҮҮ сайн ажиллах ёстой.

Epoch → Training & Validation Accuracy → Training & Validation loss

Сүүлийн Dropout ашигласан, 10000ш өгөгдөл дээр сургасан загвар маань Training өгөгдөл дээр 99.37%, Validation өгөгдөл дээр 95.11%-н оновчлолтой болсон байгаа шүү.

Бараг л хүн шиг?

Ингээд 3 цагийн семинар маань дууслаа.
Одоо дахиад 1 лекц хоцролттой л явна шүү.

Gotta go faster

--

--

Билигүн.Б (Програмч аав)
2B +1% better 2day

I am who I am... || өөрийнхөөрөө байхаас ичихгүй