From b83f598e5ce5a0961b6a72eb52b1a798883eacba Mon Sep 17 00:00:00 2001 From: jimenezcarrero <128645677+jimenezcarrero@users.noreply.github.com> Date: Fri, 18 Apr 2025 10:39:17 +0200 Subject: [PATCH 1/2] [Term Entry] General Machine Learning: Epochs Added file on the title and an image --- .../machine-learning/terms/epochs/epochs.md | 107 ++++++++++++++++++ media/epochs.png | Bin 0 -> 35542 bytes 2 files changed, 107 insertions(+) create mode 100644 content/general/concepts/machine-learning/terms/epochs/epochs.md create mode 100644 media/epochs.png diff --git a/content/general/concepts/machine-learning/terms/epochs/epochs.md b/content/general/concepts/machine-learning/terms/epochs/epochs.md new file mode 100644 index 00000000000..2be0baa10f3 --- /dev/null +++ b/content/general/concepts/machine-learning/terms/epochs/epochs.md @@ -0,0 +1,107 @@ +--- +Title: 'epochs' +Description: 'Defines epochs in machine learning and explains their importance in training models.' +Subjects: + - 'Computer Science' + - 'Data Science' + - 'Machine Learning' +Tags: + - 'AI' + - 'Algorithms' + - 'Deep Learning' + - 'Machine Learning' + - 'Models' + - 'Neural Networks' + - 'Parameters' + - 'PyTorch' + - 'Scikit-learn' + - 'Stochastic Gradient Descent' + - 'Supervised Learning' + - 'TensorFlow' +CatalogContent: + - 'intro-to-deep-learning-with-tensor-flow' + - 'paths/machine-learning-ai-engineering-foundations' +--- + +When training a machine learning model, several hyperparameters play a crutial role in determining the model’s performance and convergence. **Epochs** are a fundamental one in machine learning, particularly in the training of a model. + +An epoch refers to one complete pass through the entire training dataset. During an epoch, the learning algorithm updates the model's parameters based on the training data. + +## Importance of Epochs in Training + +The number of epochs determine how many times the learning algorithm will work through the entire training dataset. + +Training for too few epochs may result in underfitting, where the model fails to capture the dominant trends in the data. This results in errors and poor performance. + +More epochs can lead to better model performance, as the model has more opportunities to learn from the data. However, too many epochs can lead to overfitting, where the model performs well on training data but poorly on unseen data. + +## Difference between Epochs, Iterations, Batches + +Understanding these concepts helps in effectively training machine learning models and optimizing their performance. + +- **Epochs**: One complete pass through the entire training dataset. + +- **Iterations**: The number of batches needed to complete one epoch. For example, if you have 1000 samples and a batch size of 100, it will take 10 iterations to complete one epoch. + +- **Batches**: A subset of the training dataset used to train the model in one iteration. Batch size determines the number of samples processed before the model's parameters are updated. + +## Example + +This example demonstrates how to train a neural network model using the Diabetes dataset and visualize the training and validation loss over multiple epochs: + +```python +import numpy as np +import matplotlib.pyplot as plt +from sklearn.datasets import load_diabetes +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.neural_network import MLPRegressor +from sklearn.metrics import mean_squared_error + +# Load the Diabetes dataset +diabetes = load_diabetes() +X, y = diabetes.data, diabetes.target + +# Split the data into training and test sets +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) + +# Standardize the data +scaler = StandardScaler() +X_train = scaler.fit_transform(X_train) +X_test = scaler.transform(X_test) + +# Build and train the neural network model +mlp = MLPRegressor(hidden_layer_sizes=(128,), max_iter=20, alpha=1e-4, + solver='adam', random_state=42, learning_rate_init=0.001) + +train_loss = [] +val_loss = [] + +for i in range(5000): + mlp.partial_fit(X_train, y_train) + train_loss.append(mean_squared_error(y_train, mlp.predict(X_train))) + val_loss.append(mean_squared_error(y_test, mlp.predict(X_test))) + +# Find the epoch with the minimum validation loss +minimum_validation_loss_epoch = np.argmin(val_loss) + +# Plot the training and validation loss with logarithmic scales +plt.figure(figsize=(10, 6)) +plt.plot(train_loss, label='Training Loss', color='blue') +plt.plot(val_loss, label='Validation Loss', color='orange') +plt.axvline(x=minimum_validation_loss_epoch, linestyle='--', color='red', label='Minimum Validation Loss') +plt.xlabel('Epochs') +plt.ylabel('Loss') +plt.title('Training and Validation Loss') +plt.legend() +plt.grid(True) +plt.yscale('log') +plt.show() +``` +The model is trained for 5000 epochs. During each epoch, the training and validation loss are recorded. The epoch with the minimum validation loss is identified to help determine the optimal number of epochs for training. + +The above code generates the following output: + +![Output of the above example, training and validation loss over multiple epochs](https://raw.githubusercontent.com/Codecademy/docs/main/media/epochs.png) + +This example helps in understanding how the model's performance evolves over time and helps to determine the optimal number of epochs to prevent underfitting or overfitting. diff --git a/media/epochs.png b/media/epochs.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c85997e66a708169b50d951665a61afb2ba5a4 GIT binary patch literal 35542 zcmeFZ_gj-$)HNJz*Z>vKu>dNdB5ec#=_n!u5HK|9D$+uS01~PdK?My>I!N!*rK^Za z?}T1NdX?UJ_rY=Id!Fz81HK>R;hcHG{(2j2O`Sj`Im6C_C8CMa7P5*+T@7+`MRC0LnR63k5Qowhfyu{E)@;N=qF z;^8=LOdwd<3UPCr|9b$JrHv6co6evcoMfMsjD{@+Lvt7XN0A^NZ-T*iNn)>GRe2CP z(e3bnu4VJvuezx?b^KnLeGHFODCn;%9g5kvn0DHp+S{OH2p-vv0s{) z-4ugf*OVlJ=X;!FdRgYy23SJOGN0@sRa?xuiq<(A+8f$07GAj{CTLW9g`+BS7u*2` zV>XywxcvenAwh{=eB?eXY1i2pf+=KnwB|3l*0X6?8!&Hc7lPMr{UbxsuL?oHDvyzILEfKw|srL9CcUspl( z+OpssSH5m1EiJ9$sI5iGilNSf z{-@^`dbo57M#y?@qJt-P=yVs@*)>QV8%<6xY3wiaP|Y%|x%W*zOh|Qfbo2xtzM0LX zb-+hF&1t%L$*

Y@z*RqpzY^;*%%4?8cfaOnVcxxiOgKlRJbkkt(%9;~eQ^yYW{4 zrcsXE;)Lw%%Tm{``>ooZ;5SQnMs+e=<<+H2m(Hie7yQMC_lvt366YhndE24ePCa7- z&L2M3k{ti(F(r)LWy_v*zaFQUl=e-7OV54(ePk8;#=!k#QBk^=g;?c z6Pj+4V(P@!X)A}_Xrokre?Pt{ z?p2S|v}pQ(GnF;drF&1_y?d8^w`>p9iOVv#Zr#E+C%j>N&_`ilXhNRhe*7Sm zQ3)8sXy|?$)Jw-=u`pGEXV0E(PSM~khU-+;)QI*waKC!_@}TJKcV>J?cH*^b*9aXZ z@h0;l4MH|QpOdX^hig?M#9UMg?aiNhcqCg7d@Y!7l=BY=7!n+U5mAG))6>((j*J-R zm^9sRTkGttj8(w6yG2sMtz(<2XE8A0j?S$>Pn` zaZmtT~T?tb_nW9c) z?qvYCUYa+9FmZ9vV{u(C+^p-vEu#pRTolaZU%%q30yv2aE$Vi)g2Tq;UiAB^skvGr z9#1*SM8Tt;B9kCrbrsGeK=_;Y%AE`f6ytTO| zG*``=Lm0)uiqX_5AT<1}@a41lDI>brrXS9@MIzQre;A-HUYjZ`fLXYF|N9~H_Dm@V z-w#7|5$W*6l8_F5ohme{W7Kh)%pvwYq`Yj=b>(J+n2wLg?DG?sjU!K5e28l9EsPO= z!Q{4n3%yHR7>k8qR)!&Lg1JkA+@%^771fbx@L~@QV~TDuakO};NBPwWzHHlJ1vKy) z8X725HYY0E4Tm|5O%+bJR&ked#5W~Uo#Z!O7;A}FVa9x{yN$twJ~?Sw)Zq2<<$OnL zp@XFyX#vt$z;X|)?5at7E%A+cU)BoE66buQ-VfFTDetzN@QpE^^hb{xns*npWO0g$ zb|%4CJ z5O^)(Xye(Nm@qM6hOXtZwwS|JvV5;@5ze4RN?Dxj)M{^U51)K-j60V_Bf@nx(Lf`> z-`7{4&$#~MSYzx9|B#SzK?|5%H7l$4EwGAcTi=^BovZ4%y1mq8>thtsIhp%oU?4SI z)M?dOanmgXZbXxmvbDKX8t&qIUJ=e3B4D{_R`~1d$zpsE+!|{Iap09eQSI79RvjD( z!N-u-1NX2QD*mv1>+mUtDU``co(_&7)zl2hI8oo6pajs6hv~BTb2>)oXY1%CaDQ&L6 zM~@%3!0cfSzb|+a#+tFOP6{j*Q6D&09W5!NfK+ zG?bq^Rk%8qtoUHldAexMyMQqI?*03}ckkZKcIC=#6rXj|0uN^H&fwybw7R1-4(N}y+^ zXn1uzoebb69wKP0QI13Y!X6h;>#*baEE+$;qAq_1Oz;;f= z8dmy{3snj^rsUQiCiZMKNHZlWMu-vDCi9AOnS|{pV#Wn~h68iYVGDke zNxKWcxz6i&h_W_H>mVOrCWdqH0}Ce zeS+uy^VU?Y;p4wBn7wB6kvlOLwOx(trdey3eB9Q{yltG(13*=Z3*t2*nnwuP;S+nN zt*&^vlp<)>Ha8%b46&J{S6U*rF|VuPmm)^X21H~_r z(PjRYfq{WZOOh(Rk|^dQ_3vl%VH8C()9t!8c|yP<6mrhOuWwAIE3C zO^~(XjlvyoaB61PR|oMfY%KN4HSROI$poVn?z(CMsY#*OX{i-z>q4`#Vxmb?TxD%7 zm#wHmyfVTR+xXl0S9!r;fEMBB_rtH4#7pEQyI6UvUEoep6>kBkknYshnQan{)+eBr z00RwFgi2P1LVOv8plfgobDGL0jzoF*1qUZV$c_QLZ17-my*<%(M)H|4f|LMnAr(gU zx^3xj7tiA|!l&V6>>?uCP<1mpa?O(gg+iT?0K9v_z82jF zYfHeuP+CiTS9QN-!6Moi7T;pa6+Lt2>M?DrhkFkG6}h!mx}^+olejoB8dP2k(5?V5 z4r@^UfuY*4WC(Wz?<&84pAotCUa!=Z6r*L4kHGg>dsaMTq;yfI#gUca2z4{F6m>-r zCemqJR-=^oFYFt~(ozJT4vh;m%{*P#_# z?d;u*Llszlc%mymOUPj=B~~twxDYOfgVGBFf3h30L&0QjCmo~}*Ns(^+E77V-&y~F zrqO2Tp;FhTOZCu&)YJlCFcOdR8YVyq)BRQgr5E5>E5uZ~pC27+KDKk6)5N9p0YJ_` z3`~z!oR3i1+T0klFXRKTRF_r%0%eXC$X6R{y<4qN_~}lbOg_L}q*N!qRaECxt5`l= zx|Ifyr>Jca@XamdIQa&3J(t*D1K&(%e^w9|+l^G?6&Q5fHWrA0a7CDR3fYatpjbl~ z3*Z7BAZ*k_0o2M_U7F^uIQTFE8cwmTbz258=i30{8U%+!qiMvJBilr$Fzz1*-|zPc z*@?mEq8f(KAS@v*&$=GqU#_U4_<3#g3rMaF&O#6w8AN&&w?0Cf)%1I zX0KnrK7v9B>c3x5P~z8DC&#xor?zFn{ry@X^F4TJceON@9VpxWqS2aU+`58$F!iiTICsOrl42M z(z4p(SEx6`u4-7@=IN!7{pYm>M6ax{NR1J zDyBtuQ*`+7;lupuJ5-of+?%nTOs&+rj%=3fK8mP?G26meHf8zb z9a%Sa?saxqoo{%1Nnh4w9ahv&t1H=N?V0VKeJDEa*P^E_aK(Y{ZQ5lU-$e^(NikpzH{tMg5Y#kE?5=T5-ppcq4xhL^Xu z8U*YDhPwsx!|CpmyiCrNm^NZFyw+5<{N`jOr_Kr&beaiRymYZLo5m^vZkRs zYt5bzvy7tr zH4k)<$>#bBl-wHY-Z|*3k{qUcNHM4$Kc=KnyK&}EQa9ACN?-bjOy`iLO54O&iCEBiIoXIIyRn6=UP?5_Xm(ZbRYEZ2FA$*;NWDHNgGrsTARU7OC`g%0Gdd|SD>9Iy5d z*3poLP^oV}dg@dPbQ`A79+IlL*|`8}>HyaV2|(1X zKr$o%FiCLR+B~m%KuHz4z1)gQ63~Hn9gf2k#K#!VxDNWOqoEv)@?dO)Yr-?~Q2q6{ zgvR*?Ue_Bc2H{z4Y;EN>!q&pf} zM9q1YdUeK+fZ{X;s)e{Z8t)$-p2nW`;aZ@MeLI%C6PEKl{vJRsS$TPtJd5rLE-BJV z>cacGTpN>?qB#$&1z&ORbRXD9rYmKK6)QLe9OAm^wXo=Kxe*1 zCC+Z5?G}tg6Et(|Q#*a40ra9ChMdbP7Z5tXqM2wFGw$|gt)+TrXL)6%A31OanP(KN+XzNHrw0~%5 zN?Y6Q!m3-h-_jj9YhbY3WZ6pYz%f})tqvV}_lxWoWD3@83X?HPPs(n&mQ`Fpk;9j+J=^BX&SUfRspKCq-bQ(mgJ3?&5-=w zzD+O+R{FZsm(%Z#fzH2M`95);o;#yO{6h2&*j7xm;AA$ zWH0m1BF8MW-Uo+<#!y$6q5rKp$5h>AYhx)%BP))D4Z3f{Isq~JZf3>`bwtoj`?EmF z8!bPk*9@~bXp@h~vYNM-%1muUBMWSA$J;RP-=W}2v)T|XP5%cqKzkA$PQ<(Oo7*I4 z37CA^aU_1h?*h3E?vX=ci8Yvuu0SeEjg&aQ(9P%~$_c;_qyYDQ zk%Oap%BE7v!Xl02>kH?mJ#=;M(E%7ByWmMXnYtSteUX-e!F71Clhs2qm{+=^sC^2LQQ3Fq zjN#GB3f~%lP3}x*Bg>{)SY%w*f)^@$%{g~Vs2)DW@#?R;npW?-Ti_JS*Cjmk3P#Um zt@C1f}TUcv#O1LRAYcg$*1m?I9Apr(!*tQqy&P5pd!K%Q(l_IFR1q-cOia8?O z1K)hqp*nk+_ZBof)Q$xZ%rWOU-kO^H{Q2|Q3%{NKKS+P# zgeF_W?!M+j^>=BiNOS3dE$25}+2$haB)N*4IpS|7e<^?g*?$~bSbzza4JzrDd%4Tx?o z57-oTljLa@k!S?t0Tkx=fCFFP+=6$9yo zvI(A?mI~45BsPBEtTXp!*)u9-6%{{}Fi{Ga?kNu6K-`Jra9BKO2jySBjJ)Kntp{+y zg4N2iXn|({QR^n?14&RwgD>fS1x&M?1#+1L-=NsV;ja#K=94N@+<~$iu728gbv+Iq zKPwp4Sn1!GYmOWE%HIOoa}q+|h^+~RUMU=^I5eKvMt~|&DJdK}wl#bmg%0T`W<=L# z%Dg;18-VwWN2>@`2Lv5H*L|<4X<-f2eh0a61gbu2p2-_yD}dYhVAxSZ&aReH&zaZt z4jw{uzFx8b09206pe&q14&wI>3-J9%g{3t$gSm=ku7%mPYRJmUHkP=o5fJW!ax}Zj z`lZNm4gomenH5j+o7Dr#N>m6F8ih>HHWv|Ppm9RX`NLUeW~2|Y0l9>*Oj^;bY)yo? z9*HoSLr#KD9<`v52mw^{>>j>3CP}TRwHtZ6f2F$T*-o^u2kYo)MP7J$Uc|v^@kdmzS3ZTw8%%O_`r3 zAf*j-0Y8?Tp;vB6dQi6@$q3j{ED5pDp0wvH2W=9e{+UFH$|h=V`Q$r zi51F*TR~_a1v=uQI{=Oy<+vS*ntGC-uW$5lxRU|`x%N|Ci69^$;c~}}ClvA$`G&wDyMoP74raddNSnp`8$n}P-fB-p0GKs`jT z%8`J9VC=U3#;^)q37khpgF|XI){vMSZ@fAY3&@{MP*4L@4K>8e1H8k=QLX};Oh$bHFb*JJ7@YX~j(cWi zrmUSs)i+)P1}Wl_+uEdnj$Ml?;{8yE!l_fB0xf`XqImR-5xr<$dR;Y>uI>Z9DeUIo z_C<9ZMK0^hzch33{z!R(vtGP(=~h#`VjxSm^IT0wwuvulZBlP%T!SQn*fK|44rbGv zke&fDxWOZd)$hHdUN9S59Se$dzucCUX^xoYjFgi&QN-2su{0GuK?sZtBaI z>#)dfB4*?99x9d~=@0aaKm#RUea{i0vlQ+0s^wrha^ziTXeg~~E09v@&CM!`+^f*@ zo&_idJ*$6GPiEzoYiFM2()_!0-C|9ERST=UC|kp0$AYq_2uxBA2+t`H5VuLtvM?h` zv|wYgbKyI)&j^C15ROy(6OX;86&;zO3Dfm^r-dCYj8&~8@>5dE6%&INwl?bGIxxFR zULP{~alPrn((*S763-mmQR!h@P1W&{$G}W!Je5N7cWZKx+pgfnJOI*M& zjFS}^gb4MhIYxpesB^7U0$q_k#ZJl470D_pl3`vD{SUP&brn{*pP%2)ebcD%04*jR zlEXL%qV=e4+Nh#AU4N*)pXt%r7_Ri7g&em)9KVzO!pPl#()D|iI+&zqeRoXejhnm< zcJ6X-M2MQ2Nh}5U#YF3 z=qypsJZ@M0{%#oo6ueO=12_N}*;f76Q0>+IrVSy7i~vZ*PK00;V_GOB_TK1L%U$MT|zWKMa3>JH9xHhb~1B7)EAID^X&b6XT+Guo8H3Rke92PRP z(1V#six2&Ka_}v(>e|*%0nH?wk8sA3_H9DHq6X7r*Z=fb5?~bKcxs+PzV1gRK@L5E z;>b!_;Lw2g^=1^+9KuRff|l9(@;L8h{Pa{O+Gh&(1JWdo*)R|2h+LPVV>`3%0ue%N3aIQfPuvG87a9$tf-*nPR!A zL?V1WJ~WtV&?SbPZjpGvu;PQ1^I>{&`R(}j#;zCP;asUYrj}qz1H^n7uBvD~EPEy= zrg~@NrruA&QF*$hZ%m5;$Q6g7e+cLPd61-V65r||AIM@idQbPrwvP-^Im_ucj)e?* zr?Ud(9{LDY;pbgVj~)Yn1-se#9YX8s#U&)>@6|)$nH9A4fn5GJwv(Jx67Kuq0dDL6I|EnIOSe%wH(VE3)?fdIS=xIooJ~0{0g`z9di$UqW8_&F+tNqTF+z@Y z>Ya1Z9l3ns>gUhPg$Q(N!C)qc0dsH$EHj;!rNwO}0Qr&u3?OaFs1sz4#P|r;g684> z2X$AhJ(eotv^1p(Oug9Z2y?`mC1egTG(=SoPeR2+3}0JYn=)sE9B^yfjkY;BH)28a zP)~~(kkfFxwNnNLq;R>!FyF}g(c{=$^O`Ev zV&mhTa)E<227(EBbjTU7_;CaRA+c`KCZ7&u+sMdBo8-KAAh;<40n`e-+KWj!$QzKT zz)F?C6CnUSD73_o?FVledVVe|qd#^`y+2}S=s_5HEobqpuC?gNf zn5piYzZV-tf?OaMzUxCq$@;8ZT`nRsK}5gUs;`|rd>OHIqD!F`(AG#vOC#}x2pzuY znvX!&8WaO{2xtVep~Ke$I=2b*E95ysSa~ctT@5fLd6;gJbE-Mf7i=igj+0hb=0WO{ zlzevZ7Bu2WHA3DDfRsw$;GsKyJQ324)=2>ik*SDsKm}me5&=wBZo1~SImZM;gw&fR zfFJ}grl17?&^s5bYPcVQE>zY?a6t4P@Xk6Qh@nhEcH+0_N&wL_5lkN-iK4`G*{JqZ z-KLn!sxhS7g6WbqV0uORd&!5E5Nih6R$WHsIjRnTJL*kKVa=6pE^wnW0;8=2<_RP@ zGcB$8ea$v$YEIJ;e){a$MHr~`qFFEUCa{%qz&;Ro96H51KImFCyS zZi7!gzozBOq0;9;n`4gReOd-9=*nJ|VPX<1ocq$E=+_O?w)b~iH#gQ&>+6+Ffnsb0 z4I%}aU{mNsTcKvA09g5C>kR)&1&~LcD*%Yr3gYpwV^~OtDJUTth@%F>Pmbf9p&SW$ zuBtLQOnZtP16WL9?8BEtpecseAOM7$BSR72osXFGIs|2k@Y8J>(c4;~DYjMLM|8+> z1C|yTdfc|wdc)0;kO>whwI2}`TN}Mw8pxUh+$m>OW(sr>8lal30$6upECo#lE`6`u z>qzMwIK|KbFuWZIDHPXQ0}-j2k&(gL>i_nwaWRO`;pCD{c|e8}cHuzr-p=c?c|pDe zIXNHt*3)(4@7yfd*w_Nf`rjMYhB|g>dg)TG0J2I!K?Q1W1bGp-I8EppK+kT4U`%=Y z_Ahop!Th#0SfdVbBd{U{TSl;EQ?LCv?MA^qlAlaZ-wu9)0w_cNx8O{Aqyhs(uPG}9`=ucPn^uFzJFJ;v6;25LkcmXlc5pzzfY`#l$YST zQ9bDi$*vjs7N8`tojZ2}hSQ%#ae8sP&q9toa44iJgNLGCl7F_%A1yYiEEwFqs;oV?Uk_Fdu5^B7EAl;oQlj@ zTgaIPa)=&9Jr~fEs7HBqN)V?I?|BUM%gD_GhAw5GmmA+nyH}c8>w_#v9ka~b5FjZhJM1Osu z9fQa8J|%b-*t7O5Bh#VkAfV}+q2Ee`s%^^aBbamqz>k|FDNNWIY z63*gq-o0@*=fv!LO9q&PZR3_Qv~po_&}oA?sj{*X2MRspG%MNRi&7YgcxU#&s2G!cPSK>a4@FuB#DMX-L6bGIm$-lZ5EzKFmF1}Fp7 z3*Z;-(UQT?ePMW);+?8vt0?ie=81+dH&C`bC^CHVYg zA7b5M{U5D+z8jzqERZoU1vEFt%F#nNH`)}he!Dn9WOIvy@^p3pU6ZD)E<3}rYJ7y4 zid?|kpsp9*L{NSyF7PyN>dRFO+BiNFE7VT&ow}O37s-y`QhojV0=tQ{C~?02$v#@d$szR$ zy0rlEC1is^s0>bD*>5!h)5yKp%M9gJ94tU-1!EVX+O8I{-UV8u;D;A`bFAF41qi`j z=ebu1z@#7VS43G{qAwC8BpV+x9jyZ%FaXjG1)ChFCz769PpTTCzhZOQd`?b|i!-6h_H zm`=UW$f-<$)xUfO9cPtI*Nr35kup_Qd@yj5ufdpI-t&af`KFt4ig|yUwY{hK=FV+g z;Hlo;M6-Pb>C~dNdKzw4WTC($*z6tIduoNYoIyhYJQAnfe;qm#IXkn&`TkJ-;VbtP z1*-H1GMrc-$cRp)}M3ZOej%LIjNfzq%bBYBXS#Sa8pWKL+PSis{!(j@Z~(6Y#eoqD`Ai z{i(~*N-%UjEbD)LuML?Li$d{fsxvus`z%CW=YpU+w+k-FWj@Um93ZWpD0P6gUcfvv zj|D?S#fc{n}C&;%#vC+0C$Jo%&2JY}mRF}3%)zK#CMgQqjiF}uUmrey5 z3*;61KpXt5kxiZrfjE#u0uzYr8Bra4M|1W(VOxBf@r0WtiTf7D80M(U@lbSUPH><; z8>7GgLwY_ghb2*AL`X0!j@N8jH^g)YeB!QrT|&Cg(}E4VUsfyq#;fXc&+^d%*-O|( z*cD#no~Az@RDl+eg#T4I@XYVk^9WXtNCRgz&-m*OesLBo=u=;ba1bW))UI|Npc<~e z!9Cc?<`UQ;pus&VPpqf#;{ermuJ(}~93=ilk!`Ph183~K4*saL1f|mcs3_2>?bSg) zQ#$+X1M}a5-5$E)_+l25VFfnkvf4-J)JWYq{C0K+@p>&$N(vjmYTk{vy@^>5G{CMc zg&1nstHXWwfo%4WjXP4Jg*`=SKKupP1D9N^UshQ z4>l9=Kwv4W*k%!!RPW6_CdHU{nx$-8wGDM<{v08Gxu`0UGU7b{^u(|_yfXnEFePK62{Ft^CP zC!zJ|pJ&$Iek-VJ{MoUC*29aiYZ0==b6A8&O^Ef;4Cf-_V`QYg+iugK4?-cC?9l2t ze`z~8Nt`|#$^2f5pTBCJ0pEB<{RnM2nv=cqSM85sLP;}wNT+aVS`3<# zO{Cs|(W{h7p;fFp_8OlcFCht(`Mu!dn=*>MiS{@1uwGp%}D zV!iiVc!%C~W-M-QwUZUwnb)ataQkjf!QJS^>>GJy8ggG@+lb~afnwps-?ZiBQbFzg zV0TiI$0z-?dK(ao|98ZeXP*ZR~7nk453MD@7l(e4*{qHAAR_Ty_ z8?FvLKxe0pr)y9mHRoQcyM`wC&|9>CE*v}jD#q^>Ubj~S|B8`-(beWMsgL{}WbiC4 zuLXRaqB~%L&YaUJ80dTuUuJ^ zlXV*2$6SCNZ}7pHsk`}|g9KTNyljW`8a|2{ro=?t{TP$P#DBw1RZ^FxfZ4ooj4TlH z*AVqbIn7|i;<b%FgS{i#J9YIZBuZv2*pmA{WpWSvystb-^Z^y#7wI^-eX9+6tx}hbpPCdY;WofDqB`- zCLwnb7?bXTxY)RkKbb~_;qEU|8Jk8sp8WZxc|0Y9`?rTX<6yv-*KY~eOgVE{8`FC`3V045V9g&8-@+&dzXGi)W}=?N$S7BA$or1R;NI>()wW30Vdj!`fqOr1R&1Kera4ybn54_ZsN z(5flgd|+XhHV>J4^F@C9cGsEUc72*ypOOPva`4869?{#2)V-7$R(<8kp`I8n3I_L> z?8}Kd!cC2h|2+28Rp}N8a-k103;GT+FySrX2H0fvW52;4vHlhxBogvLUeS??ibf!S zj&45}D>|o_@dfPuiXOneHRp&8Xi+Tl!lF0_R%-{)x3Vh#xi2u$sVYO9!dzSHXUT2{ z9meejj0~M_{o|ew89|4XBtw1Au5GD%no$|PP7N!V`i@3P_B z{ZuY0C${=AzQxJ|Mvm{;;WOs#_x{bhNohrQr*4h~OQ-%WwA=TTR^<8P2Rt9ie#+0r zW`bicTn*#x0|U*TPASU&ApX>K_*M#!LdeC7#>S^`atO@Hu^5S){dVDyzbEI=Sp zxUB0T{-S`oX6BddF71CyRucQ!ty`ud2T)#c--6*8+bUy#?G1CJx6pIj0#31`N2YbB4GJjE_;}_^5Zd zerG*&kHEURLAJeWANZs9kv^;X6P83f{W*^LnvltVA4<2vb#ujtia|&P8MlGD1?f?B z;w>U&q0dtVQWm)>IB&oIXu9>7Ml1pKGNg;tcc?v#-a0jXc;s%Ofie}p-Pl`*jK282 zBmNwGe5zoAY5w9#>oTcnzleLgdHI4K;9?uR8ea? zmURv2JAChd-Pj0wy3Eq{NesSt>9;s7z{%4HVh0A}yg#$heax`$<3kXW`>dBr!4-rQ zJG7$%+X(zy8j{lxs~7IJ=?HSEWw4N4Qpxg<1F~bvB39?=z&;uiD7k#8@hqJqyUSbTHmnHET(d5+I&VdTF{x^#J)` zrI+a*gL1ydnX~bxUzzak0v-mJ`p8_=9+J=_l4ttMwoSZfej#=3z(p6u#_NY&9{x0uxVf%$Oeww4b)tMNq@!puy`x~xMYrvVpCk?r-G40HqD$Q z@2OHZ&stH3`0iK~K)JGVa@#w2K<2v$p7$x6)5Q9XN*G;aMu35KG*4Gg4+lSxEpFKP z=NoAP81S5Q&!0b!tP{v7I_b8r8_aTb;i;^iP6v}^Q0YD;S4t&3bm!PuV5v`gj$xo`CMk6c5u_n%}7a2oA&~{TY=%M zH2JgJq52J2PBTPv4Ydq&(&c+!p3{c2U%spY+e*uGDJdyCH)*bw>`!G)@?@z9%8=vK ze9Lw$*W8xvN}KAX2oKqQMKbpe$@f*P!*$|vq)@KFFAI-p`+AY&c(AgPDeZWnI8*s0 zY$#Kra=bURWf?uQ;NhkpSCwWPtof0a9R^)T%51{6fo=1-`;;`=1^xB7kueO1Zl@7E zGB5#cDyr^PA>}A}UOuCBWIJ)YyWM;4#0sUQ0XDpdqziyY5T*_3_DJ%XD&2BLdpeMz zx>jt>4DG{();`3dbi@8+GWDG(Yf>4jh9KUxLl+xw(#a37dH;_wgopa1pI`7dt01u= zo?j$=?z|P+6N)THI*x<>NO}n;jETsh0o(Em63*@PZ6iJQlA&w6tze8D=}Wf1fJ>Wycxy};!7@qdcy z5~R5o)#Fzcdt;B*bdetAxRny-6X;Hwni^m($|-nX*1z!^GXq{y)w?ZPar~@CzL))^ zigQtWk!x|W0b27CcmKC%ICfSrboWwJyoG92fT3Nt(3&jNJ&gOiy(2AOK!nHvKLPAf zY}fG;-QVpI&QuQw9X{_<+&hxMIJ=YB!JmUSP}{c+Z`b!xFtkYC|8-{ScQ?EVplS)K7#vVKD(tc(%BsM3Y_X{fRKOR z@^|1G7W#uKT#|$N{b9q%Ji%mK&8Z3v69)S6F_xr6jW{!$((C4e9LIcOjtlGdNQ*&v z_DL`_49di2a^#qs{-azk??mrI8%fP3tXkQY{N;L9(C@Xy1bEBk!?oDwHw;A$m;s0= z01)w`YdU-O&%*#$VA99}CPiS{EI=Mg9~m-qOgSByuEDGk0GCbJMeRX%+$6Z{?w@WZ z*%QbwQ=q^>K+7zobCMd|JrC_f!?peUN!|>;_EXt;9OyX!Y!TV$>Lstm1aQ{K0Yjjw zZ5Vg?-V>9cpnox4i(J&1DbfcTh6Jw6tk|Vq0Z!r0-(>{=G?A_OG1osJfCip0aNRvT zU(beVZrA*_4vj7X?O{^L>)UMExf+V?2~COu$?R$}`T2|f+eQL_b>g>RCFWUhK7AG( z)RkwJk#iA!t>qLfD@Bz9St7Z*pFZIV?UBDAS9Kd3!Iva2nOD!YX=1@HGBh|lxafyK z0OklqaWm`~N`pfBK$ly$=r%I904r>&uX=?o!;xZRM2{5X%}^sptbcfsRUio*b*w9WA*nAMk;WJK}Nm~Fx!U3Mx|)q#i=M~g|7$Vn_mZC zzQnz?-joaO>6mJHX zgP_fIFr&ulIu6n!V?BZ_H7!xq_vWUqDt2GY_icF}MaRTF__O}SHr8c?5nY9iIcNhh z781c66YK<6M5bCwCg;df08;$w4)?&7hl6dF;Da=DVB0*ColEB$tRbFxjoQOc-2dZ` z^4|+Ja`kLvAP$@c;CN-lqJ4K<`9F^chAAK?YX>|`O-oqY|HzzM2@Rh(XhIS@f2YZb z>+mSB^=AbAQVpnJXajCC>?> z9Q?jY3nKVo{|6uZ(f}Ac(Jv^>gATziAV8j)wc-iAiZc_=()}qmFZIGK zX`e*7RbgzP9)Hbb?r-jUd!>m099{)wD)kr`^kFNApMeJQv7w(8LZ%HEk(|Qop)XG` z#7dURc?4o#aW`og1=WC?eQ?Mo8Ko8XN=cXo^wR@dtK?Dw{Bn?EE>a`VZ^|II!wzC3 z)bWn_a6!vcqn&-2mOUGfV+ru9BN0o%dGJFoU_;A{I_vkM z!zg(0Q#r{$x$h2}3q3dS**8=nv72$){+_C#;&l!Ud9L#IvjW82fw*MF}z-~6dMRUIDI7f?+ zWXIMEg4G+k&abrf$2eYd$k|+(;5-Z`kywzRA+jw@b;Abf)F#*?ehZZKa~20vzySwveiKl67Z2@FAVg;Q?Fn?cgrTNbF?NvGnK z@#Nae;StaquG5LfV&1%p{T@g1XP(@OU`cea%rc$Qw%zuhVN@>f5IT)rSbaO#vqFlo zt>asYvTQ$V-es(Q3sZShE#R_ik%`71Zg?p&;v;y|aX&WU5mgk(nEx2bv_*#Az@}Vv2UptO!EFJ zR2Sv7nX*LI3;pa=_Is*sZJvv)3+L>1j8APrMLuEA-jVYknVXY5zu&;A*s>W!XHOd? z_ABXFJ)9qj9uk|MFk^dO$_YneE*@Hn+`00D`|ql5URJD5flLk_3tj$?^4~tXNX^sm zF&NzfgiHN7JhWl4Lec({*o2iQ;NCUT)WYuQ1;aDl_^?V9%}DP|891awWD zWl2WjIZQkkNA-G~`LBCfkVX3t0dSYfLykI-Fyg@G7{+4K_IK9!c={y!fsbr9`7svV z^0xVZ>YtF(?b|wRV$)yeI3r|8Tm|2YLV2ZSu^GQFsmchKyx4ytt7|snz6PGGfNzzr ztoAdk%gwutInTx}2ii+h=6`IFl1f=WiT#>v`)P*T7d)cxyj@e*YuEV8-FL`djz;u; zaHshn!1M4O*z(S)2QS!JVo6;2Uy9bp*g;_k&qPnEV!n&;F;FeK#%AppZdG?-9Y6Pl>P?d>XKV1KCz{L3}UAJtd5KC%E3~%jg&1|S)H)Rl5b)UU1LFxT% zl%(KRowBu%d8)l4Tz6hkEF*mzf}vAi!1^ZN z2HpLX;sSl1R`BJD%X$Bzy`8a#n{Z<@*(_|%3x9RnZ`fnwjxk7JzE^^qtLpcDW$3M7 zEdA6%)?z!1uv7O%d$tS(Pvr*-sS4RwPyNO@yLS;HvqQN?Qz}U8@;N+i^#=q>-syjP z%YjByVg&-i;Be;+p#dsvqirR`P&F)F0_lPn~(#_ zg2j8M-ockKyM%z^RHODF3>89L@}(8u^tC(*TOvlcxpgc2-jR6oS2IqSpUjJU`s`o+w@)Se zL~2-C75yo{)To>^mDz`q_UgMn21cGXnYq*S=+U2W_+Q8!mviM*lK4bK2QeZ41i2^4 zWs9N0ZwlSG!hTQ?|AHTPLEBT{2WepQoK5K649%k}`8?fc@P{{ZGSy4)4p@wr&Gtre z+rmF!Pe_THt0?ZpSGTzWmWq|(GO*K5a_)7{OW`p2Df2&qi5i+1O{1Q)#8O?hcxJ6u zZgtrp%1N#RaCr#~2!Mk>b30F+SSv5o%qxsNWzrd|XX%%sUAW!x96AkIK+x0kjm2N| z(d<3z+ClA6u;U?yFTG9YC>lGoCBL%4WeIzdn$Xy-ylKJD;dUKLQ?V3EO?&skoS$k* zWbSs!o3C@sGyXbe3e4*2Af9df`EOcg#ug3<6`gUXJ3dFq0{t&3rkk~i#z!SCEJ{P_Ocpm zuH!^&(p?Y2j-I9Tn9D6(f~)+RlFc4D;nD#9n;C_dBUdYG14@=ZXHS^@=_06AUKiNK zUed2#6;&iCO^qss9CPbBA3K?u$`z>z=`QWV=j>|v|BjBNWby;R)td4~Y;}VoQBA$V zMP+rvqEHUSXrB=b{O+V%lEme^S({%zoHnpq$@{sNhqr(?d7GHOhCVMG=K>W9`qNRS z2)oxuw(2HiPH-A9IqIV& zWCB^Mrkl7dL)enlc#^g(W@?K^n155NgO}X%1D$1gH^kPyYu94p!+FNJi&+@<3rXW0 zJ=)(dA7vA+Df#ahY+8vXzE@X>s1p45Rb2eBnCH)MmFG;#uM}48Ov;6g6|?t$Z>)gp zf?-<;3)!~asAlz~rA+727n$xJ{*#+TRiO`GN`AN}ab3B6;?n2rzB~Vo*Sj;4F}lSu zU}XRGjWvw_I^HJd{-ErO8(2XN`#{7xe>?|E>4@N|#wzZR1?U?BIDH9UPvVTtN54lj z2Jf>Epj6RmZ*O$y4GIYRuY$<778ep)R7nO{{co~r#yX=fOGCogBLckBa`Pl2|4(se z9T(O1{`)~ij-a4Y2P6zSm6o(n8qQEk8ZdNsW5H1oaOf5tQc6-~l@qH5> zmNTkZSy+Ri^Ns7#&IDXzS^Sw_F^LWp{L;<0w-Uw|D?L>6tIju%M^*si=BYBM5fZot zjnBg`1*%-TLSakC%qMqHbtmQG)q$d0Xf@TWhAzx^c9N=9rR_W9MEA-Rj0O^w6O^kz zO1gER)%=twWxLQb%U2$zqIy%bn^j8p+&RLhXX#I$^#8j$`R|H!az!Z?uZBU+y*X0? zAq|^&l@NCj&2p6xnvb(H?Z0#W;|WG=a%*$9q07~FhLYfvk6u2 z7TyV1QM9u0XK+}3t&8G}BhclZR(7S+C{Bsx|ckyX4D%Cy-e|?~li!AFTV%z*p zofVaQW|Zf+1`K{(_7l=3c0(G@fg}jqWySSkhnP{t+9`;GCb4dQz|FeXQp$`BsF4bX zq{o7#UBm4wTXRNT!XlHB%HB?~qIb#B8bNC5+rskp$V*5^KW|GV}0;}aU5N6()91y;z?ApFIsv*3_yd#@)^p7 zzikDQR?8w-2O7y!+O?5wnb_xBS;`x7q+@#0V2Ka--Q zr{vi8!gg@gtNfL}`rcGvAoY>IAyfM(P4tjG~-EsTc4v^IQ~4`JK)086fVyER}4nyr_8>ge^o{y#5-h|Zk{Yt1<`f@rlIZaQ8`&-qGgsF!GEB_6-XpHc`gQus5! zeud(Y*0o1s_a5B|_>p?Ps6rL}_#wKlYO>~jRq_6UN)Gk%^}0I32d8v$ihnmBT+dz^ z_OBGX8^|>4-ztvAU|tCWMP87&cDL=->de}Ur$v%*Mm_{snDo+CUN+VQe? zvbAp+l&X2}IHo$W3xxX#`KBtm*8VYp93MO`xUTqDeAjYl7m_|>x2|5Qh zoO9c&jCAxH5hdh@Z|vSCx*aNQX^qm$6=}7>D8g+A(4h_u72G4_dPS6sIzDz?zWeGh ziv}@=gbQj&8&V@?oPz*mfrq|8)4RfTo0y)K@t?POP3gI=o2APSX-LG1IbYY4(vNY; zDJmy|V3V29&Uk4EIbmEDg;|91?~q7ntduk{m{x4E*XO3Ic^9+##Iicm(Du>AV`!_n znJ5!}xEeJI^Dup9>f<%{k*@B~VKM%jb#U>?tQnoGW^rtk;GT0-@wB<9Jdg@dfw{=V z&fi~>lir%Tyezg$2zv};}Kc;XCK z8g5hS3lUpU!|Udyi@iRu9J=g6Y}TS%HNl{coH|gmDt?z{ZQc+TStd71PMM{0Uzza6|Jd?-(;3p=~^-iDzK3{mO{|1sD^3;`I-#WX zWY^vuv}1_tvZNJ;+iGD{-4YpVwNjBeb zBFRVHVf$576k1s8oU;ogsH(M0F+#Kdr~qw@uWdXWQb{Z3MPQ{_v3Z|ZHmb3l{^cgY zO96roEcBk?R~v!+-H;o@jmtVRju`kTZ%RTM8!1yw`sCjM;>8)LBOB=#RAE{j~=IM5V# ziJhUSA%}Fjz^|v6`P5T{PO$L6Zc+WV$Eb3(Ps-TKQzu&A_Ll~53YM#?eB;<#qRhfD zW_7K?;Le4I-_+qOx96S9jC8y0%zmjQ=R%`tWthq$9q&$TWYYQa7Xs#9NfJtE3JX!? z2Yg#p=OCZsp*4pHI{vaYv%FEfXwws5MW}~u9}{O5Y9vKLsAaHP=(Pvix)Rd}AxwnubJM46FWicrXszo+?>M1bWI$xAd}ibowcslT6G6d%+tz;h z-MbhUI3D|$RUjaGFL&qmE0Z}w@rCqTm9j?^RnLj1g)@(|jP06-Y<=VA8KAAFr_(i) zyXG8Q`J!mpp0gEDB~#k0*?%7TXORU`5oG{Gy2l(+ILUzVZo3s4DZh0C^ki1B8%oSj zy=)+tljr)`23=XJJU1HMs~(9iQwbOn&izwZy!tO|d6n#M@88tI09{~cUrMywD31It zpjw&RQFFebLGwBH-9CXo`s?0%)k){mkLZi}ie5Vz_4m8nUu!lbbeWtq1HQq4G4<{h zrN85(^6rQN*$QWoB7Sbq^gyI~KJB!gzV*SAZugwxsSBdJaE4$toRAJNmH3%+;#Iew zTWY;Bg+`vJq>)a1*`^FF5HG@AeRtRozb0K7MxSGmF*$5%%p)~}i?`cq8NyQv4c$9b zqA%>uYv6doMV9Og*^_tlnV(sxyKF{s;#}u)3Ef$Q=k(C0&~v@!Qh#ZE=$>HcvZ?VY zEnYDtv>n8cF9k=(Hc!na3W`_gSi8Qb>&dCFp&irK3I}BsB*~ooBWLIu*=2{*g}dv! z$G*tUHN(4?d$zOxSFt7rn=!r}tR^%4Dw~<5E$QF929NpS>T=6ifUs$qfO@)!VRsK;4|7v)J zc}~<^hU8DSGTk44zDu0mcaqY)NOmWZwAY=i-16N1#ib@`<0);%K<6gSI+X0hcMyT3 zIeo{?q{O7FT?%`!L#j>N-_sob1XFnK&4g&DD+60Ei)SdT+F6h#r%jL*cB?K`gN8RR zMu)`G)xbt)!e&a-6Zb0>c3s--$2eK`<3#*KU4^BvTjxh(Paj?jl!uD-S>>Hjm%s}= z4(LK=w32O|UuWHW?tYU@#)M?6*8>m*E}y0|;|e(=ro?>d+CV{_Ecaf;94^L08)ZAr#O99+X{e{NYj5UBF)$h@zbdUD%ScJMoM)M9RB5~*P14cwOq!@0 zq`&&%sFpPx5zDX7^9mYr$?X=DyOCft&999Hxg4`xMdI`~XDJx^tlc9A&DmOH7cw{`d85!5mb;MiltZ_hXg=Z}xqT}oRj z*^u>r*Rg$UTDjS+vc$aWIHv>~2RTKIW-BUN5D-J(AwnAQ)vg#nDoVD2H*AE@cy)&xb_pxY}|Hqdl zLY*R^t`Qc}yk5Ch2?{)(0gflKZkpTB56JHg z`gN~qS#Zy+>#z&P=wRAsw_A z*I%1cx@3p@k`5=7ydtT0nL5MoOp^6q;8y)A&0{`YlJl6n?psnKDRHhU+Kof_Z+70> z!tEADGbAI5srI8Lo8{e|iuG=t<}a&8=5IIC8~BTpT@nANnTq;~yLqC^#=l(-lTHFb z@AjU@>h02Wb-*`?U!MSk?x#1F)_)>T%JAc3} zcj3Np)fnD*fQh2eDl{rPhL592%en3~7yPrAhCXK|cp3kAdNgf5Qv1L*STtXtvo)#EH6D4*S{V}a z!Uw$M2v1Y)B{5cAx1K&hk$>l+t1K@4*yIr#)E~FugJ$3~SXYPEVDU;Cje(eFdsUOz zK%;Ims8_LJfDF(Kg7bNLXsstYbH}@$7doe{$zkqSbmwvvWH8tp;*TiDQK-pOYWa5tsCn%&B5S&G zGM4Z@)v90nxy=_P!zjM8x5e-36Xg|fnA8pvj*pCX_uTL_2Wyd08kU)2=Ff+9Uvq$d z_S^JEWW8Wnhqt?Rs&Z>6oxo~eHCvC{8jefWMddjbS6}8rp-6vZVK;f9!$2|mDQSk> z5kmtIZ4eDyDR-8_iMER^^ysGv*NR=;YhrJ$o~=Ew_Z}Q9i3p;O3OfF(O}a(x+6;*$ z^buSBo9i=FMb52SeIeCeb}4r-i~OER0qs`PWV92UU4}7k{c4W-+1^I-^*#$#srj76 zW4FD3I6D8dplnxe@tM~%81Xh3x$q%0F0Ns?iLzI25KDzQ)~-xq{ggZOJZsQ~%gMC8 zE_5A#K6&9eAzxK*F2{v}PfBFu$pWn`#ThtyfYpQ6z55T+UR_WhtTm07P~V;x1>W0g zW+_b3j3(jMeE=R7S=e1|-CH1Q9T$@uy647GBD1nm{>_V2#Ktos^4xyV^kQ6Ol=iY} zU?Kf&$J$vZL&2ph>~vFd5iYM!G?fYPiudH)(uru2n3`6)oQ0JUmV#g!6 zxVgsSSUXM6w=D8=vfQ~pXFY;q%Q=khVMQH?lnPE?gy>4;nxfC$HMB3IE;nOq{u3{I z8Ukbby9)Qn{?KuogE*yZRESlY!|$MatyPkMj{_JxIVndKy|clUNm}4vUleTo)NknX z)aB^ZaEwXNsM@5NC#l|o?P6F$OUk8zuIE*4$}wj2Rq}W83aSd&ba|?7#al2?D8~Ej zt@ioZ@jJ;??fPtX5h&RN!?EWTZ$>X|sq#zSDjb@2x_$W$hS(#r>izb`ll%F0Sx-$E z4caw$Ef=dyW}iXjg-?U9mqpc6-v7OB(Hf2tWPbA7on z*?QiT;c^@&g{SGxP&0XTfu6>Q*UunM3pSpEC9b%R8T$D*l-^6KMnS54KUh5`Co@ep zPG5FsoZT80*M82kn^|?Onz$u57i}J7#7O<+vek6Ea9>Rr9c<(uM@ z=T#k0D;7{wZULcev53k-87KQ^&4uwO6$rnBO!JE)^~IK2D@Sy`~(yWq|Te zvo~Hnz7CuF`DJ#KtyWox!SpW!T%F$DJ2)kdoYntmu4^E-8ltJq_f z!)@L&IwQrtUUoOKA+GNX3vZS$h7#{oS#tOD@e{Mdh8k1DkNxY~H--^yk`{;#0|QUf zM}fPAzzL@NCNtA2bG>m*WrBC^N2|ufckH(ar%$;^r|IRY-EF5?V3ko>pA$U<5JVIZ zp%4FIsgc3dHj@4lU}_jc4UMaorZrWs7Y4ca)?=(v{PY|{rQMzfZ%EkTPO|yIsyI*u zVr{J{ICmT@O*i&1uG^6F!I`&IUEeVcP^O@!Q&Wi%mg-lN*BATHmltT5|JN~CK^L}A z{-c3{@wDU=yRflms?`>u3sw!3hkX14H8q6#_4=(cyn;727GS1QdmYS9MHK;uEQ?46 z$FC>mJ`GNY8?AH~?8n?8^yZE{^xJZVeLvXH>B8W7q~xXghX#{lEx{K9^R1AxVG_1d zw7g+r)FV{`!8J4b}Q`0JgWvcJ=69P><sQLClur1*iN&QYoMH(8nu&@{jysp z3p4Vd7mfDB!`bq(Dm+w*TqC0!_sr@r1%qvwfK^lIM5TL>inKzE#`|B z!cbuLp@w?CgGzYtYiCHRdwocX1vud8^vRKJg?PF7nnzIPV)tCDt_;SiCZbqfwV%&Y zZw?bJ_SdceJSp=AuzU(qtqvchL!Q)^_s^4l{IzNX*_c&6Lk$h;G(MeUCix~)0m4w3 ziEv_QMmY)y6XRm5{H# z>;cbOegMyU{m^P}htamZ`IUt2GW7x^_MMSb*&(UA%*5+$%C^SS(=0-Y^0#StrMn9L z0*3=plg`Syh6(Q9%*h9}wbhrrJI87qQjRUbZID6l=xdo77qYn4MTLpfREvz4nA&%T zM)nmBW&`Uy*3yA4hcipre?3MXYW_gaBLVtwBD=8Es zW~ueBmhA8q@so_)>kBp@7&QVM+asTW)j?>VOiVBar_(dgnX&Ce!&g6CHL5@<^j`&4 z@b$B^cALsdEYBJHI@N6?vcMVJQb+RW&)|-H6XRW@)&w6?DK}UAxlJ_;aajE%Ix?XKk3Z&!Aa1v z58R2EuK}_#-PrRUa^uE4?;rC|8+P{hKp&Xi8awV+6LjLm==bDU9?1VEYs^TGx9C@% z4)U#7C;KIuJB-qJ)^M&T-@#zqXNZ%wgNkBf7gcK$Q~V&s5pHp4`2X=iZN&?s>$ zCn7r9ozek5W~L|dm&Y?N-JYE-X*Xp36e0dd-AHy(94}@n53muZ`$M~ zM-r$NVDA;BQ^72bD{7a>Er_HOec=n=(JBIn)@!u~aeB91iK3Bd%2 zsy#)|>9$~PaF0kN43sqb4EN>7KrSkSphzy9O=h{xoo)Q&+G$!VvmW3zSX8u?0v<5S zn!6!~pl-&;An z6DZ?TBrBDSpW_B(92M6W7PS^^DjeW@^-XiN9rZ2{sfvU}RSn+P7uUmKaJ1kHO^v>a z5;_LG%cJlabsUf?iK3+gkq@W1oi(qNXZ6vfKCOX1!)TnYgG`CF_DbAT7^`TDxDD*I z3P{CtStTDcb;WE+*x|!{p~WJB7fQzulK6JFoRw6u$6}=W zf{0xk%M$6y)3}`>!!jYut??ui_?CzZqmExz78jE$G%~c=ByUQg25XkSa2KVFck$VR zd}G57m^ej5d^NSW}9X0nJ6Ybhf7l-*FTYO-mv9bLOlNBaTn0dso_#&x_VkH1Fw+Uv>8LzEHv81j-xKs_AtMSS1zRA&J(qg+gQT5xz3;vVS9*OdjLJNa zj19-)0(>g7{hh^c3JdWCUZ&%IU0l4PMPsL&YPz$hSo;$s1aCVG-KIR2)q#}qIqagK zPQJc&jgl*xpHH$6&toc8EbS(rFTUgE-#>%p zN29+2)C#OrP+IH1rGBR_vQUdYsWy=#0!DMmqf)(nd&PT{hD}VfM8@$WiQUJ4$-i@F zWHrXg>39k}QS-M}008Y+py134k)uwIJ$g*VHZ!g2T(~rrTq}6t`anfbvDfPJS_N4n zYr?1FsZeMEsbExc^;^IfeAG}NGPTg~m>xu2+MaH%E8FSYh$cYe;S$Ms~`qUU1$T~N!K|QC z*hf|m`&wrgTSr;d+)!jys7i5XhKzxa^3dH;a9(*Gi8fX_FT6ebk&$|F%Z_Bf`geI0 zzdFCr?eX!)-Bn)UeJ8i;=ftf$4%47A|3vQ6G6zkvpke&9>i!Wo#m7GWgGIMgG--s+ zeN6C~_ai6Old+)!BarbD)pPT9ENBI+YB;zn*T;hu-YG|n47|UP*?)1{ZwD{19Ydriwg06D?1y?sxfQ_zF?+Fz2Y{zyu*(w0PQ`T1+*WbNKl?;mXzPW6wS#hH74_k zkrkaX+M9EEe+&9vQ1_1Y)=qu>*MpryC}7UPi=mvQ@Hd>@=2ViTSr0yZKanL|HB{EV z_IXCrT_0;u63RZYYPc|<=176!hCCQB|A4rGO%Csk#xnh+)}c*fLZ?KTCzF|a{#l(L z{puX6wAsLO`X+@G2+CfDg$aWxpI2?$D8reS4sR4_LXa*Q&6#UrTmVvNB_(1|HzcAv z2ac9^$yy6>Hw|5{^&ve|kP%z^bWT1XX*8ECa~7HXP*Ok!JnoRMt7<*Ezu8nijQO%V zQk||ZUkfxIi?DKGdC?-*q8?R@#5V0yFgfY+Y5zWhI&vO)MM!vcbgZlX!HrE`WF7K* zx>@a`uIYO-$jg8C{R2YK32u3hT!XYT_f0cGnXojdeb}Uen+!n(ee76z)TctVi^9C0 z7){#Sgg)rYA1p?Hcao-Bj8XV&$@eAmkTA{b`@aMnV|^^ts{*9hKeKe-VZ&Nm#Ytad z=q6SNA0D3G-0kB&eHtxW+?PAo{qV4Q)T?o=h9L5tw{O1AR36SW`SpUCB8eKSv1J1# zY3>Uu@)9zGYStca&TaT?04X5$+hUoWXl|e?nxc9qk5qo)LYP8T&GMZ0I{tg=xx z?;%WhR_Fq16c%RW?R9mTS0Tq~dtU@?4p+JW=ys_n1jk1Uwe-{3|@%M^P*^x)l=F^VPYJ-xa|Z^}o<1*bZDyb>&~jw; z`_s+(e9}^kvopRFx{lHH@n=gavvFZBL`kH>JTm*UkXw!fw9Qxm17yB|X+U9K`p!7Urmk``n*fQN>3RDnk1J%q+LYFbD07CLH?*Uy!re>5HvTjf z0ku|OANtd)p+G*F3it(E5p9i)0CkV{wKa$*ee&QuQPSQfQFkx~Ij&!^?Pus= zh7Dt!w&}U=DYuI_{XtJod+~R8yo7izM|n9+r{oXi0?;z1g5o{Ln@np*im^|g(9tZ_ z)XPSUq>4CY!HNR4Y^aeD=b8ucir)@4OwJuIQ@}3V!7gpaW?W{MV8y+?TjBNsHc-ap z&%fENk<5l{Gt_JEOzoycIOn4mkRB-3%T`%v30IBbNd{B0mn%qBf8b-oH;T zu{Zwto|o5NJ*7s8KpurYbLd6aBCHKE9f?FFulJt}hS$tgC!+4(A99Z&Q&0q<_v=~6 zivT>*f0FLu7hyGkge&kjM)9j*LU8!cXNR!opWy*6xy#@IDuI)y?s*^ymYo00x?hxF zKkuJ~_NS9bu>Ze0Jn8tsx@oK~-Q4VV^4AdTJ7jJ{Iu4WQ?{)n@G?o9;BmehOVVv?Y z0xeh$PHyf&qi3KgMl{@Tno15@S7Yi!C`7k97vDS@n}}CiloI+cURKTRN49?ZSb_C! z1P5@5zD%n?_TLHSeq(4J{!`#V10bl9%HvATw|6UW2F;*C0gDxILlz8fxMw5S+}sSX zsaJ?#48T(V8fYO_S%}ZoZ&|KD3juNBczyNo<)op#d72+r^D&7U8NidY^k6ap2AAzY z)3Jw7e@mMuz=7+R*Va^g>da8>vJH~r^53g4*bZDK5e6a<#s-Wj4;_J5{8t(M`*ses z(@4XBZ-kf!BY*#QyYx~okX&{DgAyhp?g0Rro)slS4#(Sk5)yhK zj<1G&Fm&B0_0$58mGpshir7nk_#lNyvVeNIE*)fZ^l3Hd$Pu9nR1h64?OTMmDr(WT zHb3KC_Y46<0yzqC!LvBicY^Yaf`1jbRp&Sr$A3Fm+Tc0h# z%@~oiBTzeDPEJJx3k&8#GqK>8dJ{ma2yrUvil_cTBuG9PhbMVxCuWR?yZ zI)1=FAs*de%02UE9ur+JcuFA7(TFKdw7{J=2>cDK9aeW8@#~MEIdc-hen}U^K~<$L z!>=>JXT}OK<|@74NZBr*$C!AUs^BX8LoUFAhiwdjk(vXxOa1B3?@}luWKy|&7Z;aY zcoD?sc-eO6U}I4}{pg%r| zUM>;Ed{T9Q>+2pIJcE4+E|8$jl!|@X+pC8_7|*$YZ6a`dtHu(ir+;}%1C71zvX_?^ z3;~=Ew1+-^4CDaIGn3PCb&W}vU2giJBsrt*Uw@^7N)+*vu=wKc{CI^0 z`0D^RL73?cGzvKYR8%=H9Q$Fp*#woI0$9meAP@rwocdcbm>P|Yj3^t>CyouZ2UOXv zt*srIxdCiUAt8HwqD$G*!U9;X6JqzkoA}jxUOXOAl3D@87U9fth&)~)KSbtLZE}K! zW)4usy+DbKii=~~eH&dhb`6SXXJ-fA980m6k}VulpHeZ-f)KI;tZ>|RH=V$sN@Htl z3jmJnUUg6Y>bPVDivBNs7zxao^o#)PORAX=$&?UvJ3zC|&d(!mk8+q0{FpDeLHu>= zRxlWAq#>qaK%0f?rwol?Ok4u%z3jZaUg-E@pq#Bux@GUE0qV?UZ-7r$ndBqpX}smsgDW9^YcV@sbted6KgR|N&?nAcI-n^&9Y83FJN z#(v^rVoz)xEG@PC{r5R?DK)}DdkV<=aNCg3(Cn-%-q@FL5!l#0!C!`v0lDFJKC`mYFe@udw*Brz-m)?gB`UhQvj-6Sd%$Kb z$jcM*0dcS(=sy9VFZ)fk!CXR0%5q_0p?74&9%~CsRpdY9XFOXv{27yuE!2Y2ip7?mEo0FT-hY~FgIgSNJ|Mn^@N zgS20NcmMuGKbo zs6{Ube-N8VX&eq2I@=ALXFIS#D1;7TpsM-;2H)7G@5lC8RZT9QqH|S?mmKx&LY&54 zgoG56Q!yMlusgj!2u2@P*w045G{w*72WY}OJOKPI13kSta55{&4?PU`+XddM-km#E zz#5-+uLMQRC&bAl{4xUP-13!Q^^~1n@x;%p-U$deps$G8EDMRDS1yIU-Cw0gtOM#s z1p#=fr=@jLUOlp~4~S)`#*)K`8%5>Ow>cwogh z<^b;8eu)1{H5`Vm-udh_dwpI7%+BeHep7gJ{+&-_JLq!Y>A$p9?GwNZV>(# zmlY5=#++d!gy#wH@u@)loQr`eRyn|Lx2m*M4*-WC6^G$T-`Lpr%fjJ@fiMT12a88! zMnjBvVAf&~u>b^fJh(o?FCu=sP~qV#$lwLAZf#fBVsIgYZph9ux3m<~KBEm9Xz&1o zfBana8s0|e1UYQW@!A5fluuBw2XO>KNTV=aYI}H;aS&mW;^X5(gLmV`;_$nQ3Tbf( zi6FY=fdK1`KaF0`kez5b6cx-^TIt)U(hK6TY zT3TAVAl_L6|0QJ3g$v#x{=@)>SHgnQIUPa3f>($x>_j0HZ^Q!@sO!TYY#hst5R=)p zi5J2u*r1@G$raCHyFm%~5JZ@*bb+}KP+&(pE8${H9L0E&Ai*!J=%C>*d4>%-$@ezg_`T3XTR3o{3BpunjtQZ%-{ zGW}tAQFXxd#*I(0gTUI=!|E6rJw`2j`M+SXR*>eYwvQ6RHCf48<5njO-L19@}P z(#-LF2z#6ZF}q`BWo2e&rVItdH$t|Im-8uwA|WxJ-%2ARt-*DO*_OX=BJ5Xi-AFpN zK!XY-KKFpu?pW~Z)v5K3jUZbp8XB79zjO2QG|J1%5o#^s3I~d8ONfE694YM?@$t+s zW?BJsK-y{I35@ulj1A*MxIxA43kFd!F`)ENhGq-_K{sg0b#-;!l;?banGgjO9>f*L z% Date: Tue, 29 Apr 2025 12:01:53 +0530 Subject: [PATCH 2/2] minor fixes --- .../machine-learning/terms/epochs/epochs.md | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/content/general/concepts/machine-learning/terms/epochs/epochs.md b/content/general/concepts/machine-learning/terms/epochs/epochs.md index 2be0baa10f3..1d7f6b73412 100644 --- a/content/general/concepts/machine-learning/terms/epochs/epochs.md +++ b/content/general/concepts/machine-learning/terms/epochs/epochs.md @@ -1,6 +1,6 @@ --- -Title: 'epochs' -Description: 'Defines epochs in machine learning and explains their importance in training models.' +Title: 'Epochs' +Description: 'An epoch in machine learning is one complete pass through the entire training dataset by the learning algorithm to update the model’s weights.' Subjects: - 'Computer Science' - 'Data Science' @@ -23,33 +23,29 @@ CatalogContent: - 'paths/machine-learning-ai-engineering-foundations' --- -When training a machine learning model, several hyperparameters play a crutial role in determining the model’s performance and convergence. **Epochs** are a fundamental one in machine learning, particularly in the training of a model. +When training a machine learning model, several hyperparameters play a crucial role in determining the model’s performance and convergence. **Epochs** are a fundamental concept in machine learning, particularly in the training of a model. -An epoch refers to one complete pass through the entire training dataset. During an epoch, the learning algorithm updates the model's parameters based on the training data. +An epoch refers to one complete pass through the entire training dataset. During an epoch, the model processes every sample in the training data once and updates its parameters through backpropagation and gradient descent. ## Importance of Epochs in Training -The number of epochs determine how many times the learning algorithm will work through the entire training dataset. - -Training for too few epochs may result in underfitting, where the model fails to capture the dominant trends in the data. This results in errors and poor performance. - -More epochs can lead to better model performance, as the model has more opportunities to learn from the data. However, too many epochs can lead to overfitting, where the model performs well on training data but poorly on unseen data. +- Epochs define how often the model processes the entire training dataset during the learning phase. +- Training for too few epochs may result in underfitting, where the model fails to capture the dominant trends in the data, leading to errors and poor performance. +- TIncreasing the number of epochs gives the model additional chances to learn from the data, potentially enhancing its accuracy. However, too many epochs can lead to overfitting, where the model fits the training data too closely and performs poorly on unseen data. ## Difference between Epochs, Iterations, Batches Understanding these concepts helps in effectively training machine learning models and optimizing their performance. - **Epochs**: One complete pass through the entire training dataset. +- **Iterations**: Refer to how many batch updates are required to complete a single pass through the full dataset. +- **Batches**: A subset of the training dataset used to train the model in one iteration. The batch size controls how many data samples are used at once before updating the model’s weights. -- **Iterations**: The number of batches needed to complete one epoch. For example, if you have 1000 samples and a batch size of 100, it will take 10 iterations to complete one epoch. - -- **Batches**: A subset of the training dataset used to train the model in one iteration. Batch size determines the number of samples processed before the model's parameters are updated. - -## Example +## Example This example demonstrates how to train a neural network model using the Diabetes dataset and visualize the training and validation loss over multiple epochs: -```python +```py import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_diabetes @@ -72,15 +68,15 @@ X_test = scaler.transform(X_test) # Build and train the neural network model mlp = MLPRegressor(hidden_layer_sizes=(128,), max_iter=20, alpha=1e-4, - solver='adam', random_state=42, learning_rate_init=0.001) + solver='adam', random_state=42, learning_rate_init=0.001) train_loss = [] val_loss = [] for i in range(5000): - mlp.partial_fit(X_train, y_train) - train_loss.append(mean_squared_error(y_train, mlp.predict(X_train))) - val_loss.append(mean_squared_error(y_test, mlp.predict(X_test))) + mlp.partial_fit(X_train, y_train) # Each partial_fit call processes the entire training data once, simulating one epoch. + train_loss.append(mean_squared_error(y_train, mlp.predict(X_train))) + val_loss.append(mean_squared_error(y_test, mlp.predict(X_test))) # Find the epoch with the minimum validation loss minimum_validation_loss_epoch = np.argmin(val_loss) @@ -98,6 +94,7 @@ plt.grid(True) plt.yscale('log') plt.show() ``` + The model is trained for 5000 epochs. During each epoch, the training and validation loss are recorded. The epoch with the minimum validation loss is identified to help determine the optimal number of epochs for training. The above code generates the following output: