எளிய தமிழில் Generative AI – 4

By | April 12, 2025

Neural Network 

நியூரல் நெட்வொர்க்கும் லாஜிஸ்டிக் ரெக்ரேஷனும் ஒரே மாதிரிதான் கற்றுக் கொள்கிறது. ஆனால் ட்ரெய்னிங் டேட்டாவை ஒன்று ஒன்றாகப் பயன்படுத்தி, அதனடிப்படையில் அடுத்தடுத்த ரெக்கார்டுக்கு பெராமீட்டரை மாற்றுவது, பல ஜோடி பெராமீட்டர்களினால் உருவாக்கப்படும் மதிப்புகளை திறம்படக் கையாள்வது என்பது போன்ற பல விதத்தில் நியூரல் நெட்வொர்க் வேறுபடுகிறது.

“லாஜிஸ்டிக் ரெக்ரேஷன் என்பது லீனியர் ரெக்ரேஷன் முறையிலேதான் கற்றுக் கொள்கிறது. ஆனால் predict செய்ய வேண்டிய மதிப்பினை மட்டும் 1 அல்லது 0 என மாற்ற sigmoid ஃபங்ஷனைப் பயன்படுத்துகிறது” என்று ஏற்கனவே கண்டோம் அல்லவா! நியூரல் நெட்வொர்க்கும் இதே வேலையைத் தான் செய்கிறது. லீனியர் ரெக்ரேஷன் உருவாக்கும் மதிப்பை ஆக்டிவேஷன் யூனிட் என்ற பெயரில் அழைத்து பின்னர்,  சிக்மாய்டு ஃபங்க்ஷன் மூலம் 0 அல்லது 1 என ப்ரெடிக்ட் செய்கிறது. இதற்கு forward propagation என்று பெயர். முதல் ரெக்கார்டுக்கான இந்த ப்ரெடிக்க்ஷன் சரியில்லையெனில், அடுத்த ரெக்கார்டுக்கு பெராமீட்டர்ஸை மாற்றும் முறைக்கு backward propagation என்று பெயர். பெராமீட்டர்ஸ் இங்கு வெயிட்ஸ் மற்றும் பயாஸ் என்ற பெயரில் அழைக்கப்படுகின்றன. இதை சரி செய்ய அதே கிரேடியன்ட் டெசன்ட் முறைதான் இங்கும் பயன்படுத்தப்படுகிறது. முதல் லேயரில் features-ம், அடுத்த லேயரில் ஆக்டிவேஷன் மதிப்பும், கடைசி லேயரில் ஜீரோ அல்லது ஒன்று எனும் ப்ரெடிக்க்ஷனும் காணப்படும்.

Basic Perceptron

நம்முடைய ட்ரெய்னிங் டேட்டாவில் 50 ஃபீச்சர்ஸ் இருக்கிறதெனில் முதல் லேயரில் 50 நியூரான்களை அமைத்து, அவற்றை 50 பெராமீட்டர்களுடன் இணைத்து ஒரு ஆக்டிவேஷன் மதிப்பை உருவாக்கி, அதனடிப்படையில் 0 அல்லது 1 என ப்ரெடிக்ட் செய்யும் முறைக்கு Perceptron என்று பெயர். MLP(மல்டி லேயர் perceptron) என்பது non-லீனியர் தரவுகளுக்கானது. இவ்விரண்டும் ஒரே ஒரு ஆக்டிவேஷன் யூனிட்டை மட்டுமே உருவாக்கும்.

Neural Network Architecture

மேற்கண்ட அதே எடுத்துக்காட்டில் ஐம்பது ஐம்பதாக பல்வேறு பெராமீட்டர்களை உருவாக்கி பல்வேறு ஆக்டிவேஷன் யூனிட்களை அமைக்கும் முறைக்கு simple நியூரல் நெட்வொர்க் என்று பெயர். உதாரணத்துக்கு ஐம்பது ஐம்பதாக 10 முறை பெராமீட்டர்களை அமைக்கும்போது பத்து ஆக்டிவேஷன் யூனிட்ஸ் உருவாக்கப்படும். இவற்றின் மீது நேரடியாக சிக்மாய்டு ஃபங்ஷனைப் பயன்படுத்தி ஜீரோ அல்லது ஒன்று என ப்ரெடிக்ட் செய்யலாம் இல்லையெனில் ஜீரோ அல்லது அந்த ஆக்டிவேஷன் யூனிட் மதிப்பையே வெளியிடக்கூடிய Relu ஃபங்ஷனைப் பயன்படுத்தி அடுத்தகட்ட லேயரை உருவாக்கலாம். இது போன்ற அடுத்தடுத்த லெவல் லேயர்கள் கொஞ்சமாக இருப்பது Shallow Neural Network என்றும், அதிகமாக இருப்பது Deep Neural Network என்றும் அழைக்கப்படும். இடையில் எத்தனை லேயர்கள் இருக்க வேண்டும், அவற்றில் எத்தனை ஆக்டிவேஷன் யூனிட்ஸ் இருக்க வேண்டும் என்பதெல்லாம் hyper parameters. அதாவது நமது  விருப்பத்திற்கேற்ப நாமே வரையறுக்கலாம். இருந்தாலும் இவற்றை வரையறுக்க grid search, random search, linear scale, log scale போன்ற விதிமுறைகள் நமக்கு  உதவுகின்றன.

ஆகவே நியூரல் நெட்வொர்க்கின் முதல் லேயரில் உள்ள நியூரான்கள் லீனியர் ரெக்ரேஷன் சமன்பாட்டையும், கடைசி லேயரில் உள்ள நியூரான்கள் சிக்மாய்டு ஃபங்ஷனையும், இடைப்பட்ட லேயரில் உள்ள நியூரான்கள் Relu ஃபங்ஷனையும் பயன்படுத்துவதைக் கண்டோம். இவை தவிர -1 முதல் +1 வரை வெளியிடக்கூடிய tanh() எனும் ஃபங்ஷனும் உள்ளது. அது பொதுவாக எந்த லேயரிலும் பயன்படுத்தப்படுவதில்லை. ஏனெனில் back propagation-ன் போது வெயிட்ஸ் அட்ஜஸ்ட் செய்யப்படுவதற்கு ஏதுவாக அந்த ஆக்டிவேஷன் யூனிட் மதிப்பு கிடைத்தால் மட்டுமே நமக்கு உதவியாக இருக்கும். எனவே தான் இடைப்பட்ட லேயர்களில் Relu பயன்படுத்தப்படுகிறது.

நாம் செய்ய வேண்டியது பைனரி கிளாசிபிகேஷன் எனில் சிக்மாய்டு ஃபங்ஷனையும், மல்டி கிளாஸ் கிளாசிபிகேஷன் எனில் softmax() ஃபங்ஷனையும் பயன்படுத்தலாம். softmax() என்பது நமது அவுட்புட் ஒவ்வொரு வகையின் கீழும் அமைவதற்கான சாத்தியக் கூறுகளை வரையறுத்து, பின் எதன் மதிப்பு அதிகமாக உள்ளதோ அதன் கீழ் அமைகிறது. அனைத்து மதிப்புகளையும் கூட்டிப் பார்த்தால் 100% என வருவதைக் காணலாம். அதாவது நூறு சதவிகிதம் உறுதியாகக் கூற வேண்டிய ஒரு விஷயத்தை, பிரித்து உறுதியளிக்கிறது என்று அர்த்தம்.

Key Aspects to Observe in Neural Networks

  • Weights, Bias போன்ற பெராமீட்டரின் துவக்க மதிப்புகள் மிகவும் குறைவாக இருப்பின், ஒரு சில சுற்றுகளுக்கு மேல் அந்த மதிப்புகள் மறைந்துவிடும் அபாயம் உள்ளது. அதற்காக, மிக அதிகமான துவக்க மதிப்புகளை அளிப்பதும் அபாயமே!  இதுவே Vanishing or exploding gradient problem எனப்படுகிறது. இதைத் தவிர்ப்பதற்காக உள்ளதே Xavier Initialization போன்ற முறைகள் ஆகும். இது அதன் துவக்க மதிப்புகள் மிகவும் குறைவாகவோ அல்லது அதிகமாகவோ இல்லாதபடி பார்த்துக் கொள்கிறது.
  • 500 சுற்றுகளில் (epochs) வெயிட்ஸ் மற்றும் பயாசுக்கான சரியான மதிப்பை நாம் கண்டுபிடிக்கப் போவதாக வைத்துக் கொண்டால், ஒவ்வொரு சுற்றுக்கும் நம்முடைய ட்ரெயினிங் ரெக்கார்டுகள் அனைத்தையும் பயன்படுத்துவது Stochastic Gradient Descent எனப்படும். இவ்வாறில்லாமல் நம்முடைய ட்ரெய்னிங் டேட்டாவை பல்வேறு பகுதிகளாகப் பிரித்து, ஒவ்வொரு சுற்றுக்கும் ஒவ்வொரு பகுதியை பயன்படுத்துவது  Mini-batch Gradient Descent எனப்படும்.  இதில் ஒவ்வொரு epoch-லும் ஒரு பேட்ச் பயன்படுத்தப்படுவதால், அதில் உள்ள டேட்டா வெவ்வேறு ரேஞ்சில் அமையும். ஆகவே முதல் பேட்சுக்கு ஏற்றவாறு அட்ஜஸ்ட் செய்யப்பட்ட weights அடுத்த பேட்சுக்கு முழுவதுமாக மாற்றி அட்ஜஸ்ட் செய்யப்படும். இதனால் ஏற்படுவதே covariance shift எனும் பிரச்சினை ஆகும்.  ஆகவே அனைத்து batch -ஐயும்  -1 முதல் +1 வரை அமைப்பதே Batch Normalization ஆகும்.
  • Batch by batch-ஆக வெயிட்ஸ் அட்ஜஸ்ட் செய்யப்படும்போது, அதற்கான Gradient Descent பல்வேறு oscillations- ஐக் கொண்டிருக்கும் என்று ஏற்கனவே பார்த்தோம். ஆகவே அதைக் கட்டுப்படுத்துவதற்காக வந்ததே gradient descent with momentum, RMS prop, Adam optimization போன்ற முறைகளாகும். இவைகளைப் பயன்படுத்தி weights- ஐ அட்ஜெஸ்ட் செய்யும்போது, அது பயன்படுத்தும் average மதிப்பு அனைத்து ரெக்கார்டுக்குமான constant சராசரி மதிப்பாக இல்லாமல்,  moving முறையில் (exponential moving average) தொடர்ச்சியாக கணக்கிடப்படும். இதனால் oscillations குறையும். அதேபோல learning rate மதிப்பினையும் constant-ஆக அமைக்காமல் moving முறையில் கொஞ்சம் கொஞ்சமாக குறைத்துக் கொண்டே வருவதற்கு learning rate decay என்று பெயர்.
  • இங்கும் அதிக features இருந்தால் overfitting பிரச்சனை ஏற்படும். அதாவது இன்புட் லேயரில் அதிக நியூரான்கள் இருப்பின் ஓவர் ஃபிட்டிங். இதனைத் தவிர்க்க ஒருசில நியூரான்களை நீக்குவது dropout optimization எனப்படும்.  இதற்கு பதிலாக, L1 (sum of absolute values) அல்லது  L2 (sum of squared values) போன்ற ரெகுலரைசேஷன் பெராமீட்டரைப் பயன்படுத்துவதன் மூலமும் ஃபீச்சர்ஸின் பங்களிப்பைக் குறைக்கலாம். டேட்டாவை அதிகரிக்க உதவும் முறைக்கு Data Augmentation என்று பெயர்.
  • Underfitting பிரச்சனை இருப்பின் அதில் நியூரான்களை அதிகரிக்க உதவும் டெக்னிக்குக்கு Pruning என்று பெயர். இது நெட்வொர்க்கின் செயல் திறன் பாதிக்கப்படாதவாறு, கொஞ்சம் கொஞ்சமாக நியூரான்களை அதிகரிக்கும்.

 

Exclusive Languages

நியூரல் நெட்வொர்க்கைப் பொறுத்தவரை எல்லாக் கணக்கீடுகளும் அணி (Eg: 1000 rows × 50 features) வடிவில் தான் நிகழும். ஆகவே இத்தகைய அணிகளைக் கூட்டுவதற்கும், பெருக்குவதற்கும், திருப்புவதற்கும் (transpose) பிரத்தியேகமாக உருவாக்கப்பட்ட கட்டமைப்பே Tensorflow, Pytorch போன்றவை ஆகும்.

Tensorflow

ஒரு சாதாரண எண் ஸ்கேலார் எனில், எண்களின் தொகுப்பு வெக்டார் என்றும், வெக்டார்களின் தொகுப்பு டென்சார் என்றும் அழைக்கப்படும். இந்த ப்ரோக்ராமிங் லாங்குவேஜில் print (“hello world”)  என்று கொடுத்தால் கூட, அது ‘0 டைமென்ஷன் கொண்ட ஸ்ட்ரிங் வகை டென்சார்’ என்பதைத்தான் வெளிப்படுத்தும். அதாவது எல்லா வகையான டென்சார்களுக்கிடையே நிகழும் செயல்பாடுகள் தான் டென்சார்ஃப்ளோ ஆகும்.  இதில் வரையறுக்கப்படும் ஒவ்வொன்றும் Name, type, shape என்ற மூன்று பண்புகளைக் கொண்டு விளங்கும். இவற்றின் மதிப்புகளைக் காண விரும்பினால் ஒரு session-ஐ உருவாக்கி அதற்குள் இந்த டென்சாரை run() செய்ய வேண்டும். variable, constant, placeholder என அனைத்துக்கும் இதே முறை தான்! Placeholder என்பது இதில் உள்ள புதிய வகை டேட்டா type ஆகும். கான்ஸ்டன்ட் மதிப்பினை மாற்ற இயலாது, variable மதிப்பினை மாற்ற இயலும் என்பது நாம் அனைவரும்  அறிந்ததே! ஆனால் இந்த ப்ளேஸ்ஹோல்டருக்கு மதிப்பே அளிக்கத் தேவையில்லை. அதனுடைய ஷேப் மட்டும் வரையறுத்துவிட்டு, session இயங்கிக் கொண்டிருக்கும் பொழுது, இதற்குறிய மதிப்புகளை அளித்தால் போதுமானது. variables-க்கான மதிப்பினையும் a=1 என்பது போல இங்கு அளிக்க முடியாது. assign() எனும் ஃபங்ஷனைப் பயன்படுத்த வேண்டும். மேலும், global_variable_initializer() எனும் ஃபங்க்ஷன் மூலம் அதற்கு துவக்க மதிப்பாக ஏதேனும் ஒரு மதிப்பினை அளிக்க வேண்டும். பொதுவாக வெயிட்ஸ், பயாஸ்  போன்றவற்றை வரையறுக்க முறையே variables, constants பயன்படுகின்றன. முதல் லேயரில் உள்ள nodes வழியே வரவிருக்கும் ட்ரெய்னிங் டேட்டாவைக் குறிக்க ப்ளேஸ்ஹோல்டர் பயன்படுகிறது. ஃபார்வேர்ட், பேக்வேர்ட் ப்ராபகேஷன் வழியே வெயிட்ஸை அட்ஜஸ்ட் செய்யும் நிகழ்வானது இதில் Gradientdescentoptimizer() எனும் ஒற்றை ஃபங்க்ஷன் மூலம் நிகழ்த்தப்படுகிறது. Tensorboard என்பது டென்சார்களுக்கிடையே நிகழும் கணக்கீடுகளை வரைபடமாக வரைந்து காட்ட உதவும்.

Pytorch 

Pytorch என்பதும் இதே போன்ற மற்றொரு கட்டமைப்பாகும். இதுவும் dtype, device, layout என்ற மூன்று பண்புகளைப் பெற்று விளங்கும். Layout எனும் பண்பு மெமரி லேஅவுட்டை வெளிப்படுத்தும். டிவைஸ் எனும் பண்பு கணக்கீடுகள் சிபியூவில் நிகழ்கின்றதா அல்லது ஜிபியூவில் நிகழ்கின்றதா என்பதை வெளிப்படுத்தும். GPU என்பது CPU-வை விட பல மடங்கு செயல் திறன் அதிகமாகக் கொண்டது. Google collab எனும் ஆன்லைன் டூல்  மூலம் ஜிபியூவை அணுகலாம். cuda.is_available () எனும் ஃபங்ஷன் ஜிபியூ இருக்கின்றதா என்பதை வெளிப்படுத்தும். ஒவ்வொரு variable- ஐயும் .cuda() எனக் கொடுத்து, அவற்றை ஜிபியூ-வில் இயங்குமாறு செய்யலாம்.

Convolutional for training data compression

மிகப்பெரிய அளவில் இருக்கும் ட்ரெய்னிங் டேட்டாவை சற்று சிறிய அளவில் மாற்றி நெட்வொர்க்குக்கு அனுப்புவது convolutional நியூரல் நெட்வொர்க் (CNN) எனப்படும். பொதுவாக ஒரு படத்தை அடையாளம் காணுவதற்கான டேட்டா மிக அதிகமாக இருக்கும். ஏனெனில் அந்தப் படத்தில் உள்ள ஒவ்வொரு பிக்சலும், ஒரு எண்ணாக மாறி பெரிய மேட்ரிக்ஸ் வடிவ ட்ரெய்னிங் டேட்டாவை உருவாக்கும். ஆனால் அதில் உள்ள உருவம் இன்னதுதான் என்பதைக் கண்டுபிடிக்க இவ்வளவு அடர்த்தியான ட்ரெய்னிங் டேட்டா தேவையில்லை. ஆகவே ஒரு சில பிக்சல்களை மங்கடிப்பதன் மூலம் டேட்டாவை குறைத்து, நியூரல் நெட்வொர்க்குக்கு அனுப்ப இது உதவுகிறது. Convolutional எனில் ஒரு சின்ன ஃபில்டரை எடுத்துக்கொண்டு அதை பெரிய மேட்ரிக்ஸ் மீது பொருத்தி தேய்த்துக் கொண்டே வந்து, அதில் பதியும் எண்களை மட்டும் எடுத்து பயிற்சிக்குப் பயன்படுத்துவதாகும்.பெரிய மேட்ரிக்ஸ் என்பது மிகப்பெரிய அளவில் இருக்கும் ட்ரெய்னிங் டேட்டாவைக் குறிக்கும். சின்ன ஃபில்டர் என்பது 2×2 அல்லது 3×3 அளவில் இருக்கும் சின்ன மேட்ரிக்ஸை குறிக்கும். இந்தச் சின்ன அணியில் ஒரு சில இடங்களில் மட்டும் ஜீரோ இருக்கும். ஆகவே இதனை நகர்த்திக் கொண்டே வரும்போது ஜீரோ இருக்கும் இடத்தில் பதியும் டேட்டா மட்டும் நீக்கப்பட்டு, ஜீரோ இல்லாத இடத்தில் பதியும் எண்களிலிருந்து ஒரு எண் மட்டும் தேர்ந்தெடுக்கப்படுவதால் டேட்டா சுருக்கப்படும். அந்த ஒரு எண் எது என்பதைத் தேர்வு செய்ய Min pooling, Max pooling, Avg pooling போன்ற பல்வேறு strategies பயன்படுகின்றன. மேலும், ஃபில்டரை நகர்த்தும்போது இடைவெளி எந்த அளவுக்கு விட வேண்டும் என்பதை striding எனும் பண்பு குறிக்கிறது. படத்தின் நான்கு மூலைகளிலும் border போன்று அமைக்க padding எனும் பண்பு உதவுகிறது. இது ஜீரோ எனும் எண்ணால் நிரப்பப்படுவதால் கருப்பு நிறத்தில் அமையும் zero padding ஆகும்.

RNN for Interrelated training data

இதுவரை நாம் கண்ட அனைத்தும் feed forward neural network ஆகும். அதாவது அதன் பயிற்சித் தரவுகள் அனைத்தும் தனித்தனியானவை (IID – Independently Identically Distributed). முதல் ரெக்கார்டின் அவுட்புட் பின்னோக்கி வந்து அடுத்த ரெக்கார்டுக்கு இன்புட் ஆக அமையாது. ஆனால் RNN பயிற்சித் தரவுகள் இவ்வாறு அல்ல. அவை ஒன்றையொன்று சார்ந்தவை. ட்ரெய்னிங் டேட்டாவில் உள்ள ஒவ்வொரு ரெக்கார்டின் prediction-ம், அதற்கு முந்தைய ரெக்கார்டுகளை சார்ந்து இருக்குமெனில், Recurrent நியூரல் நெட்வொர்க்கை (RNN) பயன்படுத்தலாம். பொதுவாக Chat GPT போல, ஒரு பெரிய சொற்றொடரை கணிக்க முயலும் நியூரல் நெட்வொர்க் இம்முறையைப் பயன்படுத்தும். நமது கேள்விக்கு ஏற்ப முதல் வார்த்தையைக் கணித்த பின்னர், முதல் வார்த்தையைப் பொறுத்து இரண்டாவது வார்த்தையை கணிக்கும். பின்னர் முதல் இரண்டு வார்த்தைகளை சேர்த்து மூன்றாவதை கணிக்கும். இதுபோல ஒவ்வொன்றாக சேர்த்துக்கொண்டே சென்று ஒரு பெரிய சொற்றொடரை உருவாக்கும்.

Reinforcement Learning

Reinforcement Learning என்பது gaming / self driving cars துறைக்கு உதவும் அடிப்படை அல்காரிதம் ஆகும். Deepmind இதற்கு ஒரு சிறந்த உதாரணமாக அமையும். இது Environment, Agent, state, action, reward, penalty, policy (best strategies) போன்றவைகளை முதலில் வரையறுத்துக் கொள்ளும். பின்னர், ஒவ்வொரு action-க்கும் ஒரு ஸ்கோரை வெளியிட்டு, state x action என்ற வடிவமைப்பில் Q-Table ஒன்றை உருவாக்கும். இவைகளில் எந்த ஆக்க்ஷனுக்கான ஸ்கோர் அதிகமாக உள்ளதோ, அதுவே தேர்ந்தெடுக்கப்படும். ஒவ்வொரு முறையும் அதிக ஸ்கோர் கொண்ட அதே ஆக்க்ஷனை நாம் தேர்ந்தெடுப்பதால், ஓவர்ஃப்பிட்டிங் நடைபெற வாய்ப்புள்ளது. ஆகவே அதனைத் தவிர்க்க epsilon எனும் பெராமீட்டர் மூலம், சில சமயம் random-ஆக ஆக்க்ஷன் தேர்ந்தெடுக்கப்பட்டும்.

 

நித்யா துரைசாமி

nithyadurai87@gmail.com

 

தொடரும்.

 

 

முந்தைய பகுதிகள் –

எளிய தமிழில் Generative AI – 1
எளிய தமிழில் Generative AI – 2
எளிய தமிழில் Generative AI – 3