데이터 정규화 종류 - deiteo jeong-gyuhwa jonglyu

정규화의 필요성

비정규화된 데이터 (Unnormalized Data)

다음 데이터 셋을 보자.

$x_1$$x_2$ $y$
4000 0.0005   5
4000 0.0009   9
8000 0.0004   4
8000 0.0001   1
7000 0.0006   6
6000 0.0005   5
8000 0.0002   2
2000 0.0004   4
3000 0.0005   5
4000 0.0005   5

이 데이터 셋은 독립변수 $x_1$, $x_2$와 종속변수 $y$에 대해,

  • $y = 0 \cdot x_1 + 10000 \cdot x_2$
  • $x_1 \in [1000, 9000]$
  • $x_2 \in [0.0001, 0.0009]$

의 관계가 성립하도록 만든 데이터이다. $x_1$과 $x_2$의 값의 범위 차이가 큰 것을 볼 수 있는데, 이렇게 데이터의 독립 변수(feature) 간 값의 범위의 차이가 큰 경우 데이터가 비정규화되었다(unnormalized)고 표현한다.

이제 이 데이터에 대해 다중 선형 회귀 모델을 만드는 상황을 생각해보자. 편의상 상수항(bias)은 없다고 하면 다음과 같이 $\boldsymbol{w} [w_1, w_2]$를 파라미터로 가지는 모델을 세울 수 있다.

\[y = \boldsymbol{w}^T \cdot \boldsymbol{x} = w_1 x_1 + w_2 x_2\]

모델이 위 데이터에 대해 정상적으로 학습된다면 $\boldsymbol{w} = [0, 10000]$을 학습할 것이다. 과연 그런지 알아보자.

우선 해석적 풀이법을 적용하면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import numpy as np

x = np.array([
    [4000, 0.0005],
    [4000, 0.0009],
    [8000, 0.0004],
    [8000, 0.0001],
    [7000, 0.0006],
    [6000, 0.0005],
    [8000, 0.0002],
    [2000, 0.0004],
    [3000, 0.0005],
    [4000, 0.0005]
])

y = np.array([
    [5],
    [9],
    [4],
    [1],
    [6],
    [5],
    [2],
    [4],
    [5],
    [5]
])

w = np.linalg.inv(x.T @ x) @ (x.T @ y)
print("[w1, w2] = [%f, %f]" % (w[0, 0], w[1, 0]))
[w1, w2] = [-0.000000, 10000.000000]

실행 결과 우리가 원하는 대로 $\boldsymbol{w} = [0, 10000]$를 학습함을 확인할 수 있다.

이젠 경사 하강법을 적용해보자. BGD를 이용하여 학습률 0.001로 100에폭을 학습시켜 보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np

np.random.seed(2020)

x = np.array([
    [4000, 0.0005],
    [4000, 0.0009],
    [8000, 0.0004],
    [8000, 0.0001],
    [7000, 0.0006],
    [6000, 0.0005],
    [8000, 0.0002],
    [2000, 0.0004],
    [3000, 0.0005],
    [4000, 0.0005]
])

y = np.array([
    [5],
    [9],
    [4],
    [1],
    [6],
    [5],
    [2],
    [4],
    [5],
    [5]
])

w = np.random.randn(2, 1)

epochs = 100
lr = 0.001

data_num = x.shape[0]
print("Initial : [w1, w2] = [%f, %f]" % (w[0, 0], w[1, 0]))

for epoch in range(epochs):
    predict_y = x @ w

    # calculate gradient
    gradient = -(2 / data_num) * x.T @ (y - predict_y)

    # update w
    w = w - lr * gradient

    print("Epoch %03d : [w1, w2] = [%f, %f]" % (epoch + 1, w[0, 0], w[1, 0]))

print("Result : [w1, w2] = [%f, %f]" % (w[0, 0], w[1, 0]))
Initial : [w1, w2] = [-1.768846, 0.075552]
Epoch 001 : [w1, w2] = [119617.600508, 0.083588]
Epoch 002 : [w1, w2] = [-8086030131.355637, -542.980313]
Epoch 003 : [w1, w2] = [546607550849557.625000, 36710033.816047]
Epoch 004 : [w1, w2] = [-36950123829879414784.000000, -2481561570823.194824]
Epoch 005 : [w1, w2] = [2497791420776029685284864.000000, 167751080626083040.000000]
Epoch 006 : [w1, w2] = [-168848202253039643116552847360.000000, -11339805299242635886592.000000]
Epoch 007 : [w1, w2] = [11413969624103279916572126442684416.000000, 766559498423506639679127552.000000]
Epoch 008 : [w1, w2] = [-771572932619761027570577866053782601728.000000, -51818655533930873133292090032128.000000]
Epoch 009 : [w1, w2] = [52157558672163456027139530419068186468024320.000000, 3502889295438207511013460637120462848.000000]
Epoch 010 : [w1, w2] = [-3525798808679593145480065801053250678616557092864.000000, -236791813482328444566207525809371710750720.000000]
Epoch 011 : [w1, w2] = [238340473667932904874878539965917171873122393534758912.000000, 16006889799591993199822206359096844243561349120.000000]
Epoch 012 : [w1, w2] = [-16111577679478665049897321485234288418319388444429194887168.000000, -1082049743562623970761900739908005923838705658757120.000000]
Epoch 013 : [w1, w2] = [1089126539555083017315303662657606826719373080551036285685334016.000000, 73145480615090116108037458657850664716099673709418119168.000000]
Epoch 014 : [w1, w2] = [-73623864947384394416002410428695999941926659179136365467410938986496.000000, -4944561344099498040416678618513533131839722198752663709941760.000000]
Epoch 015 : [w1, w2] = [4976899646578260611899170757770156719325712365928148442668432743370588160.000000, 334247402299783608626804869579660405057789543719150683367942389760.000000]
Epoch 016 : [w1, w2] = [-336433439209045363527744715953015055219380255966402472509449261471094009757696.000000, -22594790148063178162394058120090593268218727064495585331349354258104320.000000]
Epoch 017 : [w1, w2] = [22742564057092361286196188872689702044087320928989263612453426168358569929233924096.000000, 1527385219218929515871603174215559833522751645627189801663764821759649382400.000000]
Epoch 018 : [w1, w2] = [-1537374587695393307847739219934053181333512297076930500361901597913150271234725459787776.000000, -103249713433980876417399530032943720658875845706226027871366422420187551352487936.000000]
Epoch 019 : [w1, w2] = [103924984753621375300572963442662726187041912145540889123387592313126289483216535878476234752.000000, 6979577378423705580964299952486715509247405277320364201906578306281988670489087705088.000000]
Epoch 020 : [w1, w2] = [-7025225044360083162877845753003908351357762848633445203706799729852814165766889574985440130236416.000000, -471812451204066236173746790243638943617457402466503993438513956118098821552661857967276032.000000]
Epoch 021 : [w1, w2] = [474898187773699321103433417560100987574088137659444861152393445935256674307571953487870860376464687104.000000, 31894049888943808647813623498614446359895615936252168455738193489572370162821784438298613121024.000000]
Epoch 022 : [w1, w2] = [-32102642595314442821436793350211570907245013932458462990802114087616135289262617577208241108038287420817408.000000, -2156005878442722100687357953017211891542137599497159530839658753960372661603087368702756767274106880.000000]
Epoch 023 : [w1, w2] = [2170106536800671246373943942860532908430224058348197127292788721489348095396082961442883969193138841921702068224.000000, 145743841376850235774016462465110998524437255834697564297159089038408958293985377677931046116878501019648.000000]
Epoch 024 : [w1, w2] = [-146697031781189227452165810321471522198680336342329932490991499546088222226139093324926751141047450645220937240150016.000000, -9852137933233746286497768700393694335021534677394281015344201242509606696335036337355636173245571284051427328.000000]
Epoch 025 : [w1, w2] = [9916572651376655323952851120707811205444844896639634057887186426933092904777544309055582234642974971402229276473361956864.000000, 665994672148670976251764535297413687223010895663175699487647109418334510637843635302248491146808753645971641991168.000000]
Epoch 026 : [w1, w2] = [-670350394660413518999166746752190402417259998829743212977923659442628427128042486329880974440000099705668267264388881295867904.000000, -45020573842578215387541282375699904372035320849330573409118149366591797356541856368282435700137993719322774987268423680.000000]
Epoch 027 : [w1, w2] = [45315016328649497058277953905805671764599797971049689202222587556492541484562951773988365574199614913508706459702248479217697161216.000000, 3043345771184457564313154503668102089075068087672677997463669481044397761417871625845995205888791251478636487103205047533568.000000]
Epoch 028 : [w1, w2] = [-3063249788800391395995115033435741832325537437984333588490610912758986018634801252804293452487327074510803273511531014959101405386768384.000000, -205727130786299075159680671690751772734204590732808109784888938183728260878318720541543338059764808387856405965866121841132699648.000000]
Epoch 029 : [w1, w2] = [207072622473118579985040688874934373159835904184710013947225945074617987259393474026659598034436202293849639940679491800204292011075963977728.000000, 13906948314023094362412925905732714654837142958156070382288872511931125721823590089849227865937001492871843206563917449031484371369984.000000]
Epoch 030 : [w1, w2] = [-13997902206560408259715251315409084144558257046212648368532155727424879903747939481221723386029573396696013852809774761176455579989008483895738368.000000, -940095799079651401565722558441735206244414391557889725766566116539091807424503536550829681772200953066664825134325575479393236363740446720.000000]
Epoch 031 : [w1, w2] = [946244191261281506504967785316882229481743007162920958177599102000722930665850181061850276261914750679765591736014167272728019431975101238095630041088.000000, 63549535921985646658134233933174290441302141118834686688692559430389941729075036308531803867510423519743659028979521243292501111692345737216000.000000]
Epoch 032 : [w1, w2] = [-63965161085071650703212153112614302157801415314694443782704554659958827519227814529339515971948449915369731355217464635825541027593301285989221292413288448.000000, -4295885078790329113264753482022181608593756743806468299116592771158725549086051277946726271609935420353753086211763265363848649872145641790844698624.000000]
Epoch 033 : [w1, w2] = [4323980924189778119856188785878171948508731551446239564416956044531711876783850155775706239286028159282565265155348683742166788894741978203493889616846629371904.000000, 290397535441148646819411539085107035359881364183757176263414897690092500916030056093137212493203062460592953288881068546978713284033528271098575354593280.000000]
Epoch 034 : [w1, w2] = [-292296786494306182923489216743992758256657223846663582338749437350566926650631725736261270855561963865813916858703778348514556235572181799968280120898292297922248704.000000, -19630582998286300547068554481109968092646095983100163102346918660070394546992945579071121960501448811997935696042789580346391665309170948368485265384312668160.000000]
Epoch 035 : [w1, w2] = [19758970470228694606869276794847487961383703531709075558919265188248278692402337362388406140923558712860940291919288720717523847142018702602640462070599121328932309172224.000000, 1327007780101161909435245252997986351687848460879715366094156481241657506489601470805825318652643886560841380859805890057610530046351134891212436541996697806438400.000000]
Epoch 036 : [w1, w2] = [-1335686644816995272293889660793889187286171799952456269143272469540027088594718822424372648949417945732867981893034719818073384084155156818551332231399383085760893438662803456.000000, -89704398927058848949051853736012535331908405959246118167914062927735756693025790594634461929382315968813842139345911676445488726178421911145942792468584810820088627200.000000]
Epoch 037 : [w1, w2] = [90291081502984493890844359801025199321669761254415587367280608632459418108532733268270735487759770177073620757486486815834678319473614562366002415437612691718530928235064829411328.000000, 6063927663070276856063457026995620266481033707372817114279793069639185481458774084621352456684584253161961834768220214463992006254330172447042982700710576329711605216444416.000000]
Epoch 038 : [w1, w2] = [-6103586818520275672127864890826343715105611959287196042787531824883846400189734459787757855794204621339011980373733279308850025638836241938312916142874278162033583388442126296706711552.000000, -409915446095889598040902202487781732011371939466097412091950510556023199679986678370548429604981912377373476044293172695220662021672723506941670333978220382730581352327300513792.000000]
Epoch 039 : [w1, w2] = [412596365345153984600950089561327309694029453182073885997883969860026319924063150592674138610148653977962972746204229841326828215849480871171595067005519652205027877727008083357263351250944.000000, 27709874240636166868525118027808047376433525389284874685828452515473212304174398010215271082202383952919602564110921193034155370842324120983367818715571962088480763866555834760691712.000000]
Epoch 040 : [w1, w2] = [-27891101700967186587832230018476185955561635342379349853089463994704486277657845523854620184473292740366310113647966260815638924739196258556018105429606083060758416249735902082647606039775543296.000000, -1873159788792772625058233560404570804251115424978020701137750069144854161729106093644808604521693654335011049985296650348316046972658439584047599524704698986562015981053939799248754180096.000000]
Epoch 041 : [w1, w2] = [1885410583883689325702144970519023793259669533614857362899012632092530728149753958860172704672588956204250576439042123393695938861183015814363221571787110522949364796771449425062493513087035748909056.000000, 126623728562603171383070819831047569483241051840156664338132398352389150067284623314366903075718063644765174230168618053569502145981412066998852935671958356494160551466208132045966176205930496.000000]
Epoch 042 : [w1, w2] = [-127451870059954105200885137172308691349389477764109603024899246029799904554236706981131356470861247011644434250415052674419158249890370709519221325266533776296833505446694707541321177583254542400559775744.000000, -8559637427103451323735927551952676942494990413866662111221684787614633147295777397762351003766768150631854721516211202193516258244871363028826559995961369878880665969473519797639761336600683872256.000000]
Epoch 043 : [w1, w2] = [8615618964182876615401239752889575316803177846761942726155320313153692349092863099348840467293525312763389407490436529741276581175212759230762485168698885626297411251935723711179247401326811325781607769440256.000000, 578622930434768989423493303840280506556475522459670772142342990820512571486093665226554077794238434441458578051085198774444847764729097893197510450731721846433949272955904162343109107789570001757798400.000000]
Epoch 044 : [w1, w2] = [-582407226359801054523489423658078047376581828031681523760445266826789996815514790152186103585880797236595208624107086233029500217951860796119573988801929228948193964357974764609682012598296709113447758494397628416.000000, -39114331474460118740621858907409377368892538362028114231668118637910896235969941391934135503056204705840804295780709791325719303214446676570811053159601256942490444110299896803030743228089261031792729653248.000000]
Epoch 045 : [w1, w2] = [39370146094696372383713913566797297418886416565316333048610540589661669427750490197135764606761022659565568527420984997872978827359665148887899891968848232830215806693473881234103710203492510880105164401200316089892864.000000, 2644089693342042519591954112760185698355427859347068608520687969355650259705396509980992516699309480371018427764520221378481795080046111837361815816880321827253764670468943992885607975603858327853348736020250624.000000]
Epoch 046 : [w1, w2] = [-2661382505855391878534190698417847113488112929250945782939511189527036018114606156746934394963088223811872349525422694338118082624146081667616755464496923503713677284588356522372585249453261044427448377316499962380301631488.000000, -178737819180229566196178707167247151683680125771688704830298125510571432021700004833926344022719344208620963899831056782423258046726859120772690085893893368881262232213703933287241027166880615026546913565509511282688.000000]
Epoch 047 : [w1, w2] = [179906796013319445676582682037408058586098140230812134214331852631755053766641135223148867864117849686107339057712274130582043882528270614807509785937545392091326418868911342458246937229978462190935403608692585511603298818326528.000000, 12082497838764392545998508092566411176885035457264506370859024563560661130993123681134982337828898245533791342786404073167291498785029489235452878764483374451711048029398047609108181572411847879848101668148298317542981632.000000]
Epoch 048 : [w1, w2] = [-12161519503704436890827533897757085363742710778613492096919690039494924802093226568811729990612786018897843078807015479500447983392158503062957990725295713103878061164973764060843563594453003819031584010092057669764123891385113772032.000000, -816764771402637907825776413751834396500125306025848343904320881270842161724516900180284509977427226700967774736520462149852058922784246775136211973939078722870780342063499813238213636912006348061542032514632968003170311602176.000000]
Epoch 049 : [w1, w2] = [822106556930919900155807864391741772972793569189669520024404400471976687622755640582625545033978172252183292926308958098397800844251697795394572423510621689821731836019201207693479107196078070802691460173373637412926148305514811942240256.000000, 55212481782047154956123671184542583633756589786110151259150402937332616054027543663111379021218424220363238517428817850777859656261882116406579875790301557457501507819764226469777939276915294944164245529136187789320260332225036288.000000]
Epoch 050 : [w1, w2] = [-55573581141973503118580900051292481735975294660570643350093664551248785847181914299124831821757272253823801033181266802834701143935336581240836217667947778132042121682329465582515388425804916109119167386260523383091144766844191071134447304704.000000, -3732308555984622510988944170448625589296127335134510373204216312036567649378760321761887139323957870037314416681455984963131584176842515227096495868083685177746747428114886319098100689330751778756648840752697545575112590924640161890304.000000]
Epoch 051 : [w1, w2] = [3756718511616283745406660366707684424890437275927807835265284422528107584029776606855523149511055581629042787895610995807920507686444501037384555977177684054197315445096437276463711903349224634059721568637773713714908617756473693372896868564992000.000000, 252300326076005570304950239233678049308120235172643025363096754225702444241439987362553916424175360786765747781548422005100476482153040801829894292158595342320833619290884512222273989851332345624383525735728910493327542540091814420569653248.000000]
Epoch 052 : [w1, w2] = [-253950414666750322488074743014466149479658938872749122274422500161337955628253253678833647589386324746777340599027711236479429871178241518454984772212681555503385193878390352520571861716527412804404329808250902106710514473818429364035355173038688567296.000000, -17055249742411977003573727580741794009203176215089467458068818859577681419974214387343926403183118261834596612176694457455998502264183779360116868307848620538647720073884030968284493569778437955012082382723298549862749089401425324761272587124736.000000]
Epoch 053 : [w1, w2] = [17166794081057730984205523798267482468633187697616164240682070390815385078553606405910437667043940837061423072720827290189489999935255275875751615171856186360025777725854313063412066073850176239020150946798834866106205654189966449992953361445631774611734528.000000, 1152917827337312643841551245648987242612463123178475041087194568169410150542272349580920285370911061543376816499578968619204251154472810568486604424460987487077009192171581198237728558358378068878266950696330904798806417826629400966683259181950042112.000000]
Epoch 054 : [w1, w2] = [-1160458113085426602257784065490457771165230007167046791942995610676535356239760506774258247751983570444772126867918386133951598641082920002597981449058744557430371563423707952389049736287780950325885932458369366668591812986291173830094363431508583441139499008000.000000, -77936092210175336290819124894989683430470783455597089397611894347496961457382854998809559575229768445127936027071944123187027367741827806029013738080713080876900199332122994844650059027437341225755053112493339573618122597105603514835204342662624824000512.000000]
Epoch 055 : [w1, w2] = [78445807986462100410007280164548423749272231495933344795131273110751937167257357932480908926726834276258408592267353543065674753713382528016849744041785243669473087761210687420264488175903270112675190008001283358722700624223411833869549201116934467737143377506861056.000000, 5268401897315667215693469254530337611587703735818638308833411414097347401636505994852964187664629972511489685274058830225623268319735416251217000853240711571139701542893929386177484987827065019234392746598497215333593228470498872472920651772655389236338360320.000000]
Epoch 056 : [w1, w2] = [-5302858174076876192103554786898069534494724163496266364004975747391549240783968591481027324956689385218713327320328190837036321436196847548906417889480479143210525676851556349317510478542414354026789072364945882185539649441437850844401964054137257907778978472651518902272.000000, -356138699856643289379238069057428529007574307557500413893383820337534541869621743048229889250998074396022482564339235263671435534469179989297062072257868711650624004507232496239120340220860003505231503658260377325348430354593853558712880328152125062400417202176000.000000]
Epoch 057 : [w1, w2] = [358467909709424414499420078125292788463154391487520541636230391839251522460540281728747025133000578790148275283871401124361211023355706742368408233961050766279265526776058158020780059765360255772603513386142510702284616786267269433456049523711984192528133382518941972596523008.000000, 24074619971609345810515558272788123254692701820839858113179140939002877792992067059152905060342525993678204660547787405496689203102425896471358929994789406952415616658315489451767612014252976718673086902016868016073007068311062098389757349451985000302960420349232021504.000000]
Epoch 058 : [w1, w2] = [-24232072228447495429210660188639016028552853119795005149689527217998506681219094323905213413197223639120034737774791808514692935708290615780932726212141236111933856150967381492389544912332887226482741136755540954454814883905643203669775812880502776407572199540568158813565709451264.000000, -1627420235460827810097172946867038454532505978810438383964062981730255874030050537490607975551973105110235111625715584652162223470681834503546490604401409593743546229908921691892046002090310701893242188639468002757922945235632911897334354554544961446856758665098159485616128.000000]
Epoch 059 : [w1, w2] = [1638063850570829393882830259101022463187529896869039345844553857098998164003779586394860418467185252665199350889226255260138239326473749729108700121934524362822051362024846599421998621575982373403961023284697229642727675971593517951173409421918978081092238766773297056765477724385968128.000000, 110011980496916985301368422191824791201952760955552280423931961980371536582731738509477650120462741775668604759263040807538883342351892265355923695589184088912063488678823296552739138714229475329452360526394276492006497922194296706677821615956377241605882084509415299534406287360.000000]
Epoch 060 : [w1, w2] = [-110731478234737993309296025333143036505119115210122268115368036688502522007383652989694964693416262264429378436927013414516250817853586183594454996361926669496948378675317456431941854125723410673958572547230831116622821088480864407374368089559483983633695264156640090722100458230228912701440.000000, -7436699869611124579465089807170616772987948821197400207497289502800791747612146198043714429804239272492735702996181159439096170533843385956569038066205084345702285852848900411503977209339185633324806317123364741471203494080682261190612982282698004001452102202448125412424995649355776.000000]
Epoch 061 : [w1, w2] = [7485337197190086549554320999577117231153135046205573196921150654743232858528639394561025711484933051126129354788391311460837319371039771761077849060362320833878689471949318789707655588097223176533425048920743714494557121323141507379237473546405890410875382594825196595325537319343221500217917440.000000, 502713474485844553936283872444705442061847178015689431034778748908391565281415257942582437831863480594950047969921584351446847798559752527543039641446129198590716562436198677582679345837372988734165114621953600672908880949730591454330541292195912491934777791687914626496116950860512100352.000000]
Epoch 062 : [w1, w2] = [-506001309192854931480590096358346272690338500865015831791727169472637542981761865992256696397140987050410159305114511190455717781709954979889737746395974293617982001208212976562407790441463865041034522923664062658747481681759684053086728502484923559878030908416592726804410853426418590841274336542720.000000, -33982928161768755037398861738695841825561727518589493696372415329131387565576670978249129214305568101093531965086616321188234512520134631484823726077167141312703726417420545880146165082267338897550825116155189346742813081166835198679264818788209759130128930800029472838546011141460077804781568.000000]
Epoch 063 : [w1, w2] = [34205182500127966555843637606549094619729635734910590366013098539821154569999166572049844001959330634786942302878392859832792437337490817325282235855664647330889980122821735330419001934137976051581713068536942281569654784818513611359138767954573599486914049013772653797027116459208406484436177081688129536.000000, 2297211960807417450297385769054130800497455904565248763060158710007395614125899440577797836810542743209142509374937817202187744291558186924641092320117517715830876632432263884466025872170601820821834238564765204192254825746134767551902728110602410995963950413867433294994421151869802188893438607360.000000]
Epoch 064 : [w1, w2] = [-inf, -inf]
Epoch 065 : [w1, w2] = [nan, nan]
Epoch 066 : [w1, w2] = [nan, nan]
Epoch 067 : [w1, w2] = [nan, nan]
Epoch 068 : [w1, w2] = [nan, nan]
Epoch 069 : [w1, w2] = [nan, nan]
Epoch 070 : [w1, w2] = [nan, nan]
Epoch 071 : [w1, w2] = [nan, nan]
Epoch 072 : [w1, w2] = [nan, nan]
Epoch 073 : [w1, w2] = [nan, nan]
Epoch 074 : [w1, w2] = [nan, nan]
Epoch 075 : [w1, w2] = [nan, nan]
Epoch 076 : [w1, w2] = [nan, nan]
Epoch 077 : [w1, w2] = [nan, nan]
Epoch 078 : [w1, w2] = [nan, nan]
Epoch 079 : [w1, w2] = [nan, nan]
Epoch 080 : [w1, w2] = [nan, nan]
Epoch 081 : [w1, w2] = [nan, nan]
Epoch 082 : [w1, w2] = [nan, nan]
Epoch 083 : [w1, w2] = [nan, nan]
Epoch 084 : [w1, w2] = [nan, nan]
Epoch 085 : [w1, w2] = [nan, nan]
Epoch 086 : [w1, w2] = [nan, nan]
Epoch 087 : [w1, w2] = [nan, nan]
Epoch 088 : [w1, w2] = [nan, nan]
Epoch 089 : [w1, w2] = [nan, nan]
Epoch 090 : [w1, w2] = [nan, nan]
Epoch 091 : [w1, w2] = [nan, nan]
Epoch 092 : [w1, w2] = [nan, nan]
Epoch 093 : [w1, w2] = [nan, nan]
Epoch 094 : [w1, w2] = [nan, nan]
Epoch 095 : [w1, w2] = [nan, nan]
Epoch 096 : [w1, w2] = [nan, nan]
Epoch 097 : [w1, w2] = [nan, nan]
Epoch 098 : [w1, w2] = [nan, nan]
Epoch 099 : [w1, w2] = [nan, nan]
Epoch 100 : [w1, w2] = [nan, nan]
Result : [w1, w2] = [nan, nan]

보이는 바와 같이 파라미터들이 수렴하지 않고 발산해 버린다. 발산하지 않는 작은 학습률을 찾아 학습시켜보면 학습이 진행되지 않는다.

해석적 풀이법은 수학적으로 최적해를 찾는 풀이법이기에 비정규화된 데이터에 대해서도 잘 작동한다. 하지만 위에서 보였듯이 경사 하강법은 비정규화된 데이터에 대해 잘 작동하지 않는다.1 왜 이런 현상이 일어나는 것일까?

위 경사 하강법에서는 오차 함수로 평균 제곱 오차를 사용하고 있다. 평균 제곱 오차의 그라디언트는 다음과 같다.

\[\nabla J(\boldsymbol{w}) = \left[ \begin{array}\\ \displaystyle\frac{1}{n} \sum _{i=1} ^{n} { 2(y_i - (w_1 x_{i1} + w_2 x_{i2})) \cdot -x_{i1} }\\ \displaystyle\frac{1}{n} \sum _{i=1} ^{n} { 2(y_i - (w_1 x_{i1} + w_2 x_{i2})) \cdot -x_{i2} }\\ \end{array} \right]\]

이로부터 $w_1$, $w_2$의 변화량 $\Delta w_1$, $\Delta w_2$를 다음과 같이 표현할 수 있다.2

\[\begin{cases}\\ \Delta w_1 = -\eta \cdot \displaystyle\frac{1}{n} \sum _{i=1} ^{n} { 2(y_i - (w_1 x_{i1} + w_2 x_{i2})) \cdot -x_{i1} }\\ \Delta w_2 = -\eta \cdot \displaystyle\frac{1}{n} \sum _{i=1} ^{n} { 2(y_i - (w_1 x_{i1} + w_2 x_{i2})) \cdot -x_{i2} }\\ \end{cases}\]

주어진 데이터에서 $x_1$은 $x_2$에 비해 값이 약 10,000,000배 크므로, $\Delta w_1$이 $\Delta w_2$에 비해 10,000,000배 크다. 이런 $\Delta w_1$, $\Delta w_2$를 가지고 파리미터 업데이트를 한다면 어떤 일이 일어날까? $w_1$이 잘 학습되도록 학습률 $\eta$를 작게 하면 $\Delta w_2$가 너무 작아져 $w_2$는 거의 학습이 되지 않을 것이고, $w_2$가 잘 학습되게 $\eta$를 크게 하면 $\Delta w_1$이 너무 커져 $w_1$은 발산해버릴 것이다.

사실 비정규화된 데이터가 잘 학습되지 않는 이 문제는 오차 함수의 종류나 모델의 종류에 상관없이 발생한다. 이 문제는 경사 하강법이 가지고 있는 본질적인 한계라 볼 수 있다. 따라서 경사 하강법을 적용하기 전 데이터들이 비슷한 범위의 값을 가지게끔 조정해 줄 필요가 있는데, 이를 정규화(Normalization)3라 한다.

정규화를 잘 수행하면 학습이 안정적이면서도 빠르게 진행된다. 다만 조심할 것은 정규화 과정에서 각 데이터간 차이, 즉 데이터의 분포 상태는 왜곡하면 안된다는 것이다.

모든 데이터 셋에 정규화를 적용할 필요는 없다. 주어진 데이터 셋을 보고 상황에 맞춰 판단하면 되는 것이다.

정규화의 종류

정규화 방법으로는 최대-최소 정규화(Min-Max Normalization)과 z-점수 정규화(z-score Normalization)가 주로 많이 사용된다.

최대-최소 정규화 (Min-Max Normalization)4

최대-최소 정규화는 모든 데이터들을 [0, 1] 범위 안으로 만드는 정규화 방법으로, 가장 많이 사용되는 정규화 방법이다. 데이터 $\boldsymbol{x} = [x_1, x_2, \cdots, x_i, \cdots, x_n]$이 주어졌을 때, 최대-최소 정규화를 적용한 결과 $\boldsymbol{x}'$의 한 요소 $x_i'$은 다음과 같이 계산할 수 있다.

\[x_i' = \frac {x_i - \textrm{min}(\boldsymbol{x})} {\textrm{max}(\boldsymbol{x}) - \textrm{min}(\boldsymbol{x})}\]

최대-최소 정규화는 구현이 간단하고 연산이 빠른 장점이 있지만, 데이터의 이상치(Outlier, Noise)에 영향을 크게 받는다는 단점이 있다. 다음과 같이 이상치가 존재하는 데이터가 주어졌다고 해 보자.

데이터 정규화 종류 - deiteo jeong-gyuhwa jonglyu
Fig.01 이상치가 존재하는 데이터빨간 점은 이상치(outlier)를 나타낸다.

이 데이터에 최대-최소 정규화를 적용하면 다음과 같이 된다.

데이터 정규화 종류 - deiteo jeong-gyuhwa jonglyu
Fig.02 Fig.01 데이터에 최대-최소 정규화를 적용한 결과

범위 [0, 1] 안에 표현된 $y$축의 데이터와는 다르게 $x$축의 데이터는 단 하나의 이상치 때문에 대부분 [0, 0.4] 안에 표현되어 학습이 잘 진행되지 않는다. 이상치가 있는 데이터에서 정규화를 수행해야 한다면 이상치를 제거하고 최대-최소 정규화를 적용하던가, 아니면 아래의 z-점수 정규화를 사용하는 것이 좋다.

z-점수 정규화 (z-score Normalization)5

z-점수 정규화는 전체 데이터의 평균을 0, 표준편차를 1로 만드는 정규화 방법이다. 평균이 $m$, 표준편차가 $\sigma$인 데이터 $\boldsymbol{x} = [x_1, x_2, \cdots, x_i, \cdots, x_n]$이 주어졌을 때, z-점수 정규화를 적용한 결과 $\boldsymbol{x}'$의 한 요소 $x_i'$은 다음과 같이 계산할 수 있다.

\[x_i' = \frac {x_i - m} {\sigma}\]

z-점수 정규화는 비교적 이상치에 영향을 적게 받는다. 이상치가 존재하는 Fig.01의 데이터에 z-점수 정규화를 적용하면 다음과 같이 된다.

데이터 정규화 종류 - deiteo jeong-gyuhwa jonglyu
Fig.03 Fig.01 데이터에 z-점수 정규화를 적용한 결과

$x$축, $y$축의 데이터 모두 대부분 범위 [-1.5, 1.5] 안에 표현되므로 학습이 잘 진행될 수 있다.

z-점수 정규화로 스케일링이 되는 이유 : 체비셰프 부등식 (Chebyshev's Inequality)

정규화는 데이터들을 스케일링하기 위해 사용한다. 최대-최소 정규화가 데이터를 특정 범위([0, 1]) 안으로 스케일링한다는 것은 어렵지 않게 이해된다. 하지만 평균과 표준편차를 이용하는 z-점수 정규화가 데이터들을 특정 범위 안으로 반드시 스케일링시킬 수 있을까?

만약 데이터가 정규 분포를 따른다면, 범위 [-3, 3] 안에 99.7%의 데이터가 있는 것을 표준정규분포표로부터 쉽게 알 수 있다. 하지만 만약 데이터가 정규분포를 따르지 않는다면 어떨까?

데이터가 정규분포를 따르지 않는 경우에도 체비셰프 부등식(Chebyshev's Inequality)은 범위 [-4, 4] 안에 최소 94%의 데이터가 있는 것을 보장한다. 체비셰프 부등식은 다음과 같다.

Chebyshev's Inequality

임의의 확률변수 $X$의 평균이 $m$이고, 표준편차가 $\sigma$일 때, 다음이 성립한다.

\[P(|X - m| \ge k \sigma ) \le \frac{1}{k^2}\]

이 부등식으로부터 z-점수 정규화를 적용했을 때 특정 범위 안으로 데이터들을 스케일링할 수 있는 것을 어느 정도 보장할 수 있다.