ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 129
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Модельді таңдау
Машиналық оқытуда біз әдетте бірнеше үміткер модельдерді бағалағаннан кейін соңғы модельді таңдаймыз.
Бұл процесс модельді таңдау деп аталады. Кейде салыстырылатын модельдер табиғаты бойынша түбегейлі ерекшеленеді (мысалы, шешім ағаштары және сызықтық модельдер). Басқа жағдайларда біз әртүрлі гиперпараметр параметрлерімен оқытылған үлгілердің бір класының мүшелерін салыстырамыз.
Мысалы, MLP көмегімен біз жасырын қабаттардың әртүрлі сандары, жасырын бірліктердің әртүрлі сандары және әрбір жасырын қабатқа қолданылатын белсендіру функцияларының әртүрлі вариациялары бар үлгілерді салыстыра аламыз. Үміткерлеріміздің ең жақсы модельді анықтау үшін біз әдетте тексеру деректер жинағын пайдаланамыз.
Тексеру деректер жинағы
Негізінде, біз барлық гиперпараметрлерімізді таңдамайынша, сынақ жинағымызға қол тигізбеуіміз керек.
Модельді таңдау процесінде сынақ деректерін пайдаланатын болсақ, сынақ деректерін асыра бағалау қаупі бар. Сонда бізде күрделі мәселелер туындайды. Егер біз жаттығу деректерін шамадан тыс толтыратын болсақ, біз әділ болуымыз үшін әрқашан сынақ деректерін бағалауымыз керек. Бірақ егер біз сынақ деректерін қайта реттесек, біз қайдан білеміз?
Осылайша, біз модельді таңдаған кезде ешқашан сынақ деректеріне сенбеуіміз керек. Дегенмен, біз модельді таңдау үшін тек оқыту деректеріне сене алмаймыз, өйткені біз модельді үйрету үшін пайдаланатын деректердің өзіндегі жалпылау қатесін бағалай алмаймыз.
Практикалық қолданбаларда сурет бұлыңғыр болып келеді. Ең жақсы модельді бағалау немесе аздаған модельдерді бір-бірімен салыстыру үшін сынақ деректеріне бір рет қолданған дұрыс, бірақ бір рет қолданғаннан кейін нақты сынақ деректері сирек жойылады. Біз эксперименттердің әрбір раунды үшін жаңа сынақтар жинағын сирек ала аламыз.
Бұл мәселені шешудің кең таралған тәжірибесі - оқыту және сынақ деректер жиындарына қосымша валидация деректер жинағын (немесе валидация деректер жиынын) қоса, деректерімізді үш жолмен бөлу. Нәтиже – валидация мен тестілеу деректері арасындағы шекаралар анық емес алаңдаушылық тудыратын анық емес тәжірибе. Егер басқаша анық көрсетілмесе, осы курстағы эксперименттерде біз нақты сынақ жиынтықтары жоқ оқу және тексеру деректерімен жұмыс істейміз. Сондықтан әрбір курстық экспериментте көрсетілген дәлдік сынақ жинағының шынайы дәлдігі емес, шын мәнінде валидация дәлдігі болып табылады.
K-Fold кросс-валидациясы
Жаттығу деректері тапшы болған кезде, біз дұрыс тексеру жинағын жасау үшін жеткілікті деректерді сақтай алмауымыз мүмкін. Бұл мәселенің танымал шешімдерінің бірі - K-еселі кросс-валидацияны пайдалану. Мұнда бастапқы жаттығу деректері бір-бірін қайталамайтын K- ішкі жиындарға бөлінеді. Содан кейін модель K- рет оқытылады және расталады, әр жолы «K» - 1 ішкі жиындары бойынша жаттығулар және басқа жиындар бойынша тестілеу (осы раундты оқыту үшін пайдаланылмаған). Ақырында, оқыту және валидация қателері K эксперименттерінің нәтижелерін орташалау арқылы бағаланады.
-
Жеткіліксіз немесе шамадан тыс оқыту?
Оқыту мен тексеру қателерін салыстырған кезде біз екі жалпы жағдайды есте сақтағымыз келеді. Біріншіден, біз оқыту қателігі мен тексеру қателігі маңызды болған жағдайларды қадағалағымыз келеді, бірақ олардың арасында кішкене алшақтық бар. Егер модель оқу қатесін азайта алмаса, бұл біздің модель модельдеуге тырысатын үлгіні алу үшін өте қарапайым (яғни экспрессивті емес) дегенді білдіруі мүмкін. Оның үстіне, біздің оқыту және тексеру қателеріміз арасындағы жалпылаудағы алшақтық аз болғандықтан, бізде күрделі модельді қолдана аламыз деп сенуге негіз бар. Бұл құбылыс жабдықтың жеткіліксіздігі деп аталады.
Екінші жағынан, жоғарыда талқылағанымыздай, біз жаттығу қателігіміз тексеру қателігінен айтарлықтай төмен болатын жағдайларға назар аударғымыз келеді, бұл қатты шамадан тыс орнатуды көрсетеді. Есіңізде болсын, шамадан тыс кию әрқашан жаман нәрсе емес. Атап айтқанда, терең оқытуға қатысты ең жақсы болжамды модельдер сақтау деректеріне қарағанда оқу деректерінде әлдеқайда жақсы нәтиже беретіні белгілі. Сайып келгенде, біз әдетте оқыту және валидация қателері арасындағы алшақтықтан гөрі валидация қатесіне көбірек алаңдаймыз.
Шамадан тыс немесе толық сәйкес келмеу біздің модельдің күрделілігіне де, қол жетімді оқу деректер жинағының өлшеміне де байланысты болуы мүмкін, бұл төменде талқылайтын екі тақырыпты қамтиды.
Модельдің күрделілігі
Қайта оқыту және модельдің күрделілігі туралы кейбір классикалық түйсіктерді суреттеу үшін біз көпмүшелерді қолдана отырып мысал келтіреміз. Бір x белгісінен және тиісті y белгісінен тұратын оқыту мәліметтерін ескере отырып, біз y белгілерін бағалау үшін d дәрежесінің көпмүшесін табуға тырысамыз:
yˆ = Σd
i = 0 xi wi (5.4.1)
Бұл жай сызықтық регрессияның міндеті, мұнда біздің сипаттамаларымыз x дәрежелерімен, модель салмағы wi, ал ығысу w0-мен беріледі, өйткені x0 = 1 барлық x үшін. Бұл тек сызықтық регрессияның міндеті болғандықтан, қателік квадратын жоғалту функциясы ретінде қолдана аламыз.
Жоғары ретті көпмүшелік функция төменгі ретті көпмүшелік функцияға қарағанда күрделірек, өйткені жоғары ретті көпмүшенің параметрлері көбірек, ал модельдік функцияны таңдау ауқымы кеңірек. Оқу деректерінің жиынтығын жазып алғаннан кейін, жоғары дәрежелі көпмүшелік функциялар төменгі дәрежелі көпмүшелерге қарағанда әрдайым төмен (нашар жағдайда тең) оқу қатесіне жетуі керек. Шын мәнінде, әр деректер нүктесінің x мәні әр түрлі болған кезде, деректер нүктелерінің санына тең дәрежесі бар көпмүшелік функция оқу үлгісіне өте жақсы сәйкес келеді. Біз суретте көпмүшелік дәрежесі мен артық сәйкестік арасындағы байланысты 5.4.1. суретте көреміз (кітаптағы суретті қараңыз).
Деректер жиынының өлшемі
Есте сақтау керек тағы бір маңызды мәселе - деректер жиынының өлшемі. Модельді түзеткенде, жаттығу деректер жинағында модельдер неғұрлым аз болса, соғұрлым біз шамадан тыс оқытуға тап боламыз. Жаттығу деректерінің көлемі ұлғайған сайын жалпылау қатесі әдетте азаяды.
Оның үстіне, жалпы алғанда, көп деректер ешқашан зиян тигізбейді. Бекітілген мәселе және деректерді тарату үшін әдетте модельдің күрделілігі мен деректер жиынының өлшемі арасында байланыс болады. Көбірек деректермен біз күрделі үлгіні қолдануға тырысамыз. Жеткілікті деректер болмаған жағдайда, қарапайым модельдерді жеңу қиынырақ болады. Көптеген есептер үшін мыңдаған оқыту мысалдары болғанда ғана терең оқыту сызықтық модельдерден асып түседі. Терең оқытудың қазіргі жетістігінің бір бөлігі интернет-компаниялардың, арзан жадтың, қосылған құрылғылардың және экономиканы кеңінен цифрландырудың арқасында ауқымды деректер жинақтарының қазіргі көптігімен байланысты.
-
Полиномдық регрессия
Енді деректерге көпмүшеліктерді орнату арқылы осы ұғымдарды интерактивті түрде зерттей аламыз.
from d2l import mxnet as d2l
from mxnet import gluon, np, npx
from mxnet.gluon import nn
import math
npx.set_np()
Деректер жиынын құру
Алдымен бізге деректер қажет. х-ті ескере отырып, біз келесі текшелік көпмүшені оқыту және тест деректері үшін белгілер жасау үшін қолданамыз:
у = 5 + 1,2х - 3,4x2/2! + 5,6x3/3! + ϵ где ϵ ∼ N (0, 0.12). (5.4.2)
ϵ - шу параметр орташа мәні 0 және стандартты ауытқуы 0,1 болатын қалыпты үлестірімге бағынады. Оңтайландыру үшін біз әдетте өте үлкен градиенттік мәндерден немесе шығындардан аулақ болғымыз келеді. Сондықтан функциялар xi -ден хi/i!-ге дейін масштабталады. Бұл үлкен дәрежелер үшін i- өте үлкен мәндерден аулақ болуға мүмкіндік береді. Біз оқыту жиыны мен тест жиыны үшін 100 жиынды синтездейміз.
max_degree = 20 # Maximum degree of the polynomial
n_train, n_test = 100, 100 # Training and test dataset sizes true_w = np.zeros(max_degree)
# Allocate lots of empty space
true_w[0:4] = np.array([5, 1.2, -3.4, 5.6])
features = np.random.normal(size=(n_train + n_test, 1))
np.random.shuffle(features)
poly_features = np.power(features, np.arange(max_degree).reshape(1, -1))
for i in range(max_degree):
poly_features[:, i] /= math.gamma(i + 1) # `gamma(n)` = (n-1)!
# Shape of `labels`: (`n_train` + `n_test`,)
labels = np.dot(poly_features, true_w)
labels += np.random.normal(scale=0.1, size=labels.shape)
рoly_features ішінде сақталған мономалдар гамма функциясы арқылы масштабталады, мұндағы Γ (n) = (n - 1)!. Жасалған деректер жиынынан алғашқы 2 модельді қараңыз. 1 мәні техникалық сипаттама, яғни орын ауыстыруға сәйкес тұрақты сипаттама..
features[:2], poly_features[:2, :], labels[:2]
(array([[2.2122064],
[1.1630787]]),
array([[1.00000000e+00, 2.21220636e+00, 2.44692850e+00, 1.80437028e+00,
9.97909844e-01, 4.41516489e-01, 1.62787601e-01, 5.14456779e-02,
1.42260585e-02, 3.49677517e-03, 7.73558859e-04, 1.55570160e-04,
2.86794402e-05, 4.88037267e-06, 7.71170789e-07, 1.13732597e-07,
1.57249964e-08, 2.04629069e-09, 2.51489857e-10, 2.92814419e-11],
[1.00000000e+00, 1.16307867e+00, 6.76375985e-01, 2.62226164e-01,
7.62474164e-02, 1.77363474e-02, 3.43812793e-03, 5.71259065e-04,
8.30524004e-05, 1.07329415e-05, 1.24832559e-06, 1.31990987e-07,
1.27929916e-08, 1.14455811e-09, 9.50865081e-11, 7.37287228e-12,
5.35951925e-13, 3.66678970e-14, 2.36931378e-15, 1.45036750e-16]]),
array([9.629796, 5.51997 ]))
Модельді оқыту және тестілеу
Алдымен берілген деректер жиыны үшін шығынды бағалау функциясын орындайық.
def evaluate_loss(net, data_iter, loss): #@save
"""Evaluate the loss of a model on the given dataset."""
metric = d2l.Accumulator(2) # Sum of losses, no. of examples
for X, y in data_iter:
l = loss(net(X), y)
metric.add(d2l.reduce_sum(l), l.size)
return metric[0] / metric[1]
Енді жаттығу функциясын анықтаңыз.
def train(train_features, test_features, train_labels, test_labels,
num_epochs=400):
loss = gluon.loss.L2Loss()
net = nn.Sequential()
# Отключаем смещение, поскольку мы уже учли его в полиноме
# функции
net.add(nn.Dense(1, use_bias=False))
net.initialize()
batch_size = min(10, train_labels.shape[0])
train_iter = d2l.load_array((train_features, train_labels), batch_size)
test_iter = d2l.load_array((test_features, test_labels), batch_size,
is_train=False)
trainer = gluon.Trainer(net.collect_params(), 'sgd',
{'learning_rate': 0.01})
animator = d2l.Animator(xlabel='epoch', ylabel='loss', yscale='log',
xlim=[1, num_epochs], ylim=[1e-3, 1e2],
legend=['train', 'test'])
for epoch in range(num_epochs):
d2l.train_epoch_ch3(net, train_iter, loss, trainer)
if epoch == 0 or (epoch + 1) % 20 == 0:
animator.add(epoch + 1, (evaluate_loss(net, train_iter, loss),
evaluate_loss(net, test_iter, loss)))
print('weight:', net[0].weight.data().asnumpy())
Үшіншіреттікөпмүшелікфункциясыарқылыжуықтау (қалыпты)
Біз деректерді генерациялау функциясы сияқты реті бар үшінші ретті көпмүшелік функцияны пайдаланудан бастаймыз. Нәтижелер осы модельдің оқытуу және тестілеу шығындарын тиімді түрде азайтуға болатындығын көрсетеді. Зерттелетін модельдің параметрлері де w = [5, 1.2, −3.4, 5.6] шынайы мәндерге жақын.
# Алғашқы төрт өлшемді таңдаңыз, мысалы: 1, x, x ^ 2/2 !, x ^ 3/3! бастап
# полиномиялық ерекшеліктері
train(poly_features[:n_train, :4], poly_features[n_train:, :4],
labels[:n_train], labels[n_train:])
weight: [[ 4.998419 1.2171801 -3.3890183 5.6006956]]
Сызықтық функцияны орнату (жеткіліксіз орнату)
Сызықтық функцияның жуықтауын тағы қарастырайық. Ерте дәуірлердің құлдырауынан кейін бұл модельді оқытудағы шығынды одан әрі азайту қиынға соғады. Дәуірдің соңғы итерациясы аяқталғаннан кейін оқудағы жоғалту әлі де жоғары болады. Сызықты емес үлгіні сәйкестендіру үшін пайдаланылғанда (мысалы, үшінші ретті көпмүшелік функция), сызықтық модельдер сәйкессіздікке бейім келеді.
# Көпмүшелік функциялардан алғашқы екі өлшемді таңдаңыз, яғни 1, x
train(poly_features[:n_train, :2], poly_features[n_train:, :2],
labels[:n_train], labels[n_train:])
weight: [[2.6286998 4.698787 ]]
Жоғары ретті көпмүшелік функцияны жуықтау (артық сәйкестік)
Теперь попробуем обучить модель, используя многочлен слишком высокой степени. Здесь недостаточно данных, чтобы узнать, что коэффициенты более высокой степени должны иметь значения, близкие к нулю. В результате наша чрезмерно сложная модель настолько восприимчива, что на нее влияет шум обучающих данных.
Хотя потери в обучении могут быть эффективно уменьшены, потери в тестах все же намного выше. Это показывает, что сложная модель перекрывает данные.
# Выберите все размеры из полиномиальных функций
train(poly_features[:n_train, :], poly_features[n_train:, :],
labels[:n_train], labels[n_train:], num_epochs=1500)
weight: [[ 4.9748263 1.342102 -3.316707 5.018786 -0.1572338 1.4567666
0.1706778 0.21786575 0.06556528 -0.01586925 0.00981885 -0.05114863
-0.02413981 -0.01499512 -0.04940709 0.06389925 -0.04761838 -0.04380166
-0.05188227 0.05655775]]
В следующих разделах мы продолжим обсуждение проблем переобучения и методов их решения, таких как снижение веса и отсев.