ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 124
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
y.backward ()
d2l.plot (x, x.grad, 'x', 'grad of relu', figsize = (5, 2.5))
ReLU пайдалану себебі оның туындылары айрықша жақсы әрекет етеді: олар жоғалып немесе дәлелді өткізіп жібереді. Бұл оңтайландыру тәртібін жақсартады және нейрондық желілердің алдыңғы нұсқаларында болған жақсы құжатталған градиенттің жойылу мәселесін жеңілдетеді (бұл туралы кейінірек айтылады).
ReLU функциясының көптеген нұсқалары бар екенін ескеріңіз, соның ішінде параметрленген ReLU (pReLU) (He et al., 2015). Бұл опция ReLU -ға сызықтық мүшені қосады, сондықтан дәлел теріс болса да, кейбір ақпараттар сонда да беріледі:
pReLU (x) = max (0, x) + α min (0, x). (5.1.5)
-
Сигмоидты функция
Сигмоидты функция өзінің кірістерін R аймағында орналасқан мәндерге (0, 1) аралықта орналасқан шығуларға түрлендіреді. Осы себепті сигмоид көбінесе сығымдау функциясы деп аталады: ол кез-келген кірісті (- inf, inf) диапазондағы (0, 1) мәнге дейін сығымдайды:
sigmoid(x) = 1/1 + exp(−x). (5.1.6)
Ең алғашқы нейрондық желілерде ғалымдар жұмыс істейтін немесе жұмыс істемейтін биологиялық нейрондарды модельдеуге қызығушылық танытты. Осылайша, жасанды нейронның өнертапқыштары Маккаллох пен Питтстен бастап, осы саладағы зерттеушілер шекті бірліктерге назар аударды. Шекті іске қосу кіріс сигналы белгілі бір шекті мәннен төмен болған кезде 0 мәнін, ал кіріс мәні шекті мәннен асқан кезде 1 мәнін алады.
Барлық назар градиент негізіндегі оқытуға аударылғанда, сигма тәрізді функция табиғи таңдау болды, өйткені ол шекті бірлікке біркелкі дифференциалданатын жуықтау болып табылады. Егер біз шығыстарды екілік жіктеу мәселелерінің ықтималдығы ретінде түсінгіміз келсе (сигмоидты softmax-тің ерекше жағдайы ретінде қарастыруға болады) сигмоидтарды қолдануға болады, себебі сигмоидтер әлі де шығу модульдерінде активация функциялары ретінде кеңінен қолданылады. Алайда, сигмоидты көбінесе жасырын қабаттарда қолдану жағдайлары үшін қарапайым және оңай оқытылатын ReLU алмастырды. Қайталанатын нейрондық желілерге арналған келесі тарауларда біз уақыт өте келе ақпарат ағынын басқару үшін сигмоидты блоктарды қолданатын архитектураларды сипаттаймыз.
Төменде сигма тәрізді функцияны құрастырамыз. Кіріс 0-ге жақын болғанда, сигма тәрізді функция сызықтық түрлендіруге жақындайтынын ескеріңіз:
with autograd.record():
y = npx.sigmoid(x)
d2l.plot(x, y, 'x', 'sigmoid(x)', figsize=(5, 2.5))
Сигма тәрізді функцияның туындысы келесі теңдеумен анықталады:
d/dx sigmoid(x) = exp(−x)/(1 + exp(−x))2
= sigmoid(x) (1 − sigmoid(x)). (5.1.7)
Сигмоидты функцияның туындысы төменде келтірілген. Кіріс 0 болған кезде сигма тәрізді функцияның туындысы максимум 0,25-ке жететінін ескеріңіз. Кіріс 0-ден кез-келген бағытта ауытқып кететіндіктен, туынды 0-ге жақындайды:
y.backward()
d2l.plot(x, x.grad, 'x', 'grad of sigmoid', figsize=(5, 2.5))
-
Гиперболалық тангенс функциясы
Сигмоидтық функция сияқты, tanh функциясы (гиперболалық тангенс) сонымен қатар кірістерін -1-ден 1-ге дейінгі аралықта элементтерге айналдыру арқылы сығады:
tanh (x) = 1 - ехр (−2x)/(1 + ехр (−2x)), (5.1.8)
Төменде біз tanh функциясының графигін жасаймыз. Кіріс 0-ге жақындағанда, tanh функциясы сызықтық түрлендіруге жақындайтынын ескеріңіз. Функцияның формасы сигма тәрізді функцияға ұқсас болғанымен, tanh функциясы координаттар жүйесінің басталуына қатысты нүктелік симметрияны көрсетеді.
with autograd.record():
y = np.tanh(x)
d2l.plot(x, y, 'x', 'tanh(x)', figsize=(5, 2.5))
Tanh функциясының туындысы:
d/dx tanh(x) = 1 − tanh2(x). (5.1.9)
Tanh функциясының туындысы төменде көрсетілген. Кіріс 0-ге жақындағанда, tanh функциясының туындысы 1-ге жақындайды. Сигмоидты функциямен көргеніміздей, кіріс 0-ден кез-келген бағытта қозғалса, tanh функциясының туындысы 0-ге жақындайды.
y.backward ()
d2l.plot (x, x.grad, 'x', 'grad of tanh', figsize = (5, 2.5))
Осылайша, енді біз экспрессивті көпқабатты нейрондық желі архитектурасын құру үшін бейсызықтылықты қалай пайдалану керектігін білеміз. Ескерту ретінде: сіздің біліміңіз 1990-шы жылдардағы тәжірибеге ұқсас құралдар жиынтығын басқаруға мүмкіндік береді. Сіз 1990-шы жылдары жұмыс істеген кез-келген адамнан артықшылыққа ие боласыз, өйткені сіз бірнеше кодты қолдана отырып, модельді тез құру үшін қуатты ашық бастапқы терең оқыту шеңберлерін қолдана аласыз. Бұрын бұл желілерді оқыту үшін зерттеушілерге C және Fortran тілдерінде мыңдаған жолдарды кодтау қажет болатын.
Түйіндеме
-
MLP шығыс және кіріс қабаттары арасында бір немесе бірнеше толығымен байланысқан жасырын қабаттарды қосады және активтендіру функциясы арқылы жасырын қабат шығысын түрлендіреді. -
Жиі қолданылатын активтендіру функцияларына ReLU функциясы, сигма тәрізді функция және tanh функциясы кіреді.
Жаттығулар
-
pReLU активтендіру функциясының туындысын есептеңіз. -
Тек ReLU (немесе pReLU) пайдаланатын MLP үзіліссіз бөліктік сызықтық функцияны жасайтынын көрсетіңіз. -
tanh(x) + 1 = 2 sigmoid(2x) екенін көрсетіңіз. -
Бізде бір уақытта бір шағын партияға қолданылатын сызықтық емес бар делік Сіз одан қандай мәселелер күтесіз?
Талқылау (https://discuss.d2l.ai/t/90 қараңыз)
-
Көп қабатты перцептрондарды нөлден іске асыру
Енді біз көп қабатты перцептрондарды (MLP) математикалық түрде сипаттадық, олардың біреуін өз бетімізше орындауға тырысайық. Softmax регрессиясы (3.6-бөлім) арқылы қол жеткізілген алдыңғы нәтижелермен салыстыру үшін біз Fashion-MNIST кескін классификациясының мәліметтер жиынтығымен жұмыс жасаймыз (3.5-бөлім).
from d2l import mxnet as d2l
from mxnet import gluon, np, npx
npx.set_np()
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
-
Модель параметрлерін инициализациялау
Естеріңізге сала кетейік, Fashion-MNIST құрамында 10 класс бар және әр кескін сұр реңктердегі 28 × 28 = 784 пиксель мәндерінен тұрады. Тағы да, біз қазір пикселдер арасындағы кеңістіктік құрылымға назар аудармаймыз, сондықтан біз оны 784 кіріс мүмкіндігі мен 10 класы бар қарапайым жіктеу деректер жинағы ретінде қарастыра аламыз. Ең алдымен біз бір жасырын қабаты және 256 жасырын модулі бар MLP енгіземіз. Бұл екі шаманы да гиперпараметр ретінде қарастыруға болатынын ескеріңіз. Біз әдетте қабат енін 2 қуатына таңдаймыз, ол жадтың аппараттық құралда қалай бөлінетініне және адрестелетініне байланысты әдетте есептеуде тиімді.
Қайтадан біз параметрлерімізді бірнеше тензорлармен көрсетеміз. Әрбір қабат үшін бір салмақ матрицасы мен бір ауытқу векторын қадағалау керек екенін ескеріңіз. Әдеттегідей, біз осы параметрлер бойынша жоғалту градиенттері үшін жадты бөлеміз.
num_inputs, num_outputs, num_hiddens = 784, 10, 256
W1 = np.random.normal(scale=0.01, size=(num_inputs, num_hiddens))
b1 = np.zeros(num_hiddens)
W2 = np.random.normal(scale=0.01, size=(num_hiddens, num_outputs))
b2 = np.zeros(num_outputs)
params = [W1, b1, W2, b2]
for param in params:
param.attach_grad()
-
Белсендіру функциясы
Істің қалай жұмыс істейтінін білу үшін біз кірістірілген relu функциясын тікелей шақырудың орнына максималды функцияны пайдаланып ReLU белсендіруін өзіміз жүзеге асырамыз:
def relu(X):
return np.maximum(X, 0)
-
Модель
Біз кеңістіктік құрылымды есепке алмағандықтан, біз әрбір 2D кескінді ұзындығын num_inputs жалпақ векторына түрлендіреміз. Соңында, біз модельді кодтың бірнеше жолы арқылы жүзеге асырамыз:
def net(X):
X = X.reshape((-1, num_inputs))
H = relu(np.dot(X, W1) + b1)
return np.dot(H, W2) + b2
-
Жоғалту функциясы
Сандық тұрақтылықты қамтамасыз ету үшін және біз softmax функциясын нөлден бастап енгізгендіктен (3.6-бөлім), біз softmax және кросс-энтропия жоғалуын есептеу үшін жоғары деңгейлі API интерфейстерінің біріктірілген функциясын қолданамыз. Осы күрделіліктерді 3.7.2-бөлімде бұрын қалай талқылағанымызды еске түсіріңіз.
Біз қызығушылық танытқан оқырманды іске асыру мәліметтері туралы білімін тереңдету үшін жоғалту функциясының бастапқы кодын зерттеуді ұсынамыз.
loss = gluon.loss.SoftmaxCrossEntropyLoss ()
-
Оқыту
Бақытымызға орай, MLP оқыту циклі softmax регрессиясымен бірдей. d2l бумасын пайдалана отырып, біз train_ch3 функциясын шақырамыз (3.6-бөлімді қараңыз), дәуірлер санын 10-ға және оқу жылдамдығын 0,5-ке орнатамыз:
num_epochs, lr = 10, 0.1
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs,
lambda batch_size: d2l.sgd(params, lr, batch_size))
Оқытылған модельді бағалау үшін біз оны кейбір сынақ деректеріне қолданамыз:
d2l.predict_ch3(net, test_iter)
Түйіндеме
-
Қарапайым MLP қолмен жасалса да, оны жүзеге асыру оңай екенін бақыладық. -
Алайда, көптеген деңгейлерде MLP-ді нөлден іске асыру әлі де шатасуға алып келуі мүмкін (мысалы, біздің модельдің атын беру және параметрлерін бақылау).
Жаттығулар
-
Num_hiddens гиперпараметрінің мәнін өзгертіңіз және бұл гиперпараметр сіздің нәтижелеріңізге қалай әсер ететінін көріңіз. Осы гиперпараметрдің ең жақсы мәнін анықтаңыз, қалғанының бәрін тұрақты ұстаңыз. -
Нәтижелерге қалай әсер ететінін көру үшін қосымша жасырын қабат қосып көріңіз. -
Оқу жылдамдығының өзгеруі сіздің нәтижелеріңізге қалай әсер етеді? Модель архитектурасын және басқа гиперпараметрлерді (соның ішінде дәуірлер санын) түзету арқылы сізге қандай оқу жылдамдығы жақсы нәтиже береді? -
Барлық гиперпараметрлерді (оқу жылдамдығы, дәуірлер саны, жасырын қабаттар саны, бір қабатқа жасырын бірліктер саны) оңтайландыру арқылы қандай нәтиже алуға болады? -
Неліктен бірнеше гиперпараметрлер қолдану әлдеқайда қиын екенін сипаттаңыз. -
Бірнеше гиперпараметрлер бойынша іздеуді құрылымдау үшін қандай стратегияны қолдануға болады?
Талқылау (https://discuss.d2l.ai/t/92 қараңыз)
-
Көп қабатты перцептрондардың қысқаша орындалуы
Сіз күткендей, жоғары деңгейлі API-ге сүйене отырып, біз MLP-ді одан да қысқаша жүзеге асыра аламыз.
implement MLPs even more concisely.
from d2l import mxnet as d2l
from mxnet import gluon, init, npx
from mxnet.gluon import nn
npx.set_np()
-
Модель
Softmax регрессиясын қысқаша енгізуімізбен салыстырғанда (3.7-бөлім), бұл жолғы іске асырудың жалғыз айырмашылығы - біз екі толық қосылған қабатты қосамыз (бұрын біз біреуін қосқанбыз). Біріншісі - біздің жасырын қабат, ол 256 жасырын бірліктен тұрады және ReLU белсендіру функциясын қолданады.
Екіншісі - біздің шығыс қабатымыз.
net = nn.Sequential()
net.add(nn.Dense(256, activation='relu'),
nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))
Жаттығу циклі біз softmax регрессиясын енгізген кездегідей. Бұл модульдік модель архитектурасының мәселелерін ортогональды ойлардан бөлуге мүмкіндік береді.
batch_size, lr, num_epochs = 256, 0.1, 10
loss = gluon.loss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': lr})
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
Түйіндеме
-
Жоғары деңгейлі API интерфейстерін пайдалану арқылы біз MLP-ті әлдеқайда қысқаша іске асыра аламыз. -
Бірдей жіктеу мәселесі үшін MLP іске асыру белсендіру функциялары бар қосымша жасырын қабаттарды қоспағанда, softmax регрессиясымен бірдей болып келеді.
Жаттығулар
-
Жасырын қабаттардың санын қосып, өзгертіп көріңіз (оқыту жылдамдығын өзгертуге де болады). Қай параметр жақсы жұмыс істейді? -
Әр түрлі белсендіру функцияларын қолданып көріңіз. Қайсысы жақсы жұмыс істейді? -
Масштабты инициализациялаудың әртүрлі схемаларын қолданып көріңіз. Қай әдіс жақсы жұмыс істейді??
Талқылау (https://discuss.d2l.ai/t/94 қараңыз)
-
Таңдау, шатастыру және қайта оқыту модельдері
Машиналық оқыту саласындағы ғалымдар ретіндегі мақсатымыз-заңдылықтарды анықтау. Бірақ біз деректерімізді жаттап қана қоймай, жалпы үлгіні тапқанымызға қалай сенімді бола аламыз? Мысалы, біз пациенттерді олардың деменция күйімен байланыстыратын генетикалық маркерлер арасында үлгілерді тапқымыз келді делік, мұнда белгілер жиынтықтан алынады (деменция – когнитивтік денсаулықтың жеңіл бұзылуы).