এই আর্টিকেলে যে বিষয়গুলো নিয়ে আলোচনা করা হবে।
১। Embedding
২। One-hot encoding
২। Word Embedding
৪। Word2Vec
৫। CBOW
৬। Skip Gram
Embeddings:
Natural Language Processing বা NLP হচ্ছে মেশিন লার্নিং এর একটি সাব-ফিল্ড। এই ফিল্ডে মূলত মানুষের ভাষা নিয়ে কাজ করা হয়। আমাদের লিখিত টেক্সট বা ডকুমেন্ট, অনেকগুলো শব্দ বা ক্যারেক্টারের সমন্বয়ে গঠিত। কম্পিউটারে এই টেক্সট ডেটা গুলো নিয়ে কাজ করাটা অনেক কঠিন কারণ মেশিন লার্নিং এর মডেল গুলো মানুষের মত পড়তে এবং বুঝতে পারে না। উদাহরণস্বরূপ, এই আর্টিকেলটি মূলত বাংলা এবং ইংলিশ শব্দের সমন্বয়ের লেখা। সুতরাং, আপনি যখন এই আর্টিকেলটি পড়া শুরু করেছেন তখন লেখাগুলো বুঝতে আপনার কোন সমস্যা হচ্ছে না, কিন্তু মেশিন লার্নিং এর মডেলগুলো আপনার এবং আমার মত পড়তে এবং বুঝতে পারে না।
যখন আমরা একটা শব্দ “গরু” দেখি তখন এর সাথে বিভিন্ন শব্দের সংযুক্তি থাকতে পারে। যেমন, গরুর মাংস খেতে সবাই পছন্দ করে, কোরবানির সময় অনেক গরু জবেহ করা হয় ইত্যাদি। কিন্তু এই ভাষাগত সংযুক্তি অনেক বছরের নিউরোলজিক্যাল কম্পিউটেশন এর ফলাফল। আপরদিকে মেশিন লার্নিং এর মডেলগুলো সদ্য ভুমিষ্ট শিশুর মত, যে আগে থেকে শব্দ সম্পর্কে কিছুই জানেনা। মডেলগুলোকে শেখানো হয়। এখন আমরা মডেলকে কিভাবে শেখাবো?
যেহেতু কম্পিউটার নিউরোমেরিকেল (নাম্বার) ডেটা বুঝে, সেহেতু আমরা টেক্সট ডেটাগুলোকে নিউরোমেরিকেল ইনপুট হিসেবে পাঠাবো। এখন আমরা কিভাবে এই ইনপুট টেক্সট গুলো নিউরোমেরিকেলি রি-প্রেজেন্ট করতে পারি ?
One Hot Embeddings:
মেশিন যেহেতু আমাদের মত শব্দ বুঝতে পারে না, তাই আমরা এই শব্দ গুলোকে নিউরোমেরিকেল ভ্যালু তে কনভার্ট করি যাতে ডেটা প্রসেস করতে কম্পিউটারের সুবিধা হয়। এখন, টেক্সট ডেটার উপর যেকোন কোন মেশিন লার্নিং এর অ্যালগরিদম ইউজ করার পূর্বে, আমাদের টেক্সট ডেটাকে (ক্যাটাগরিকেল ডেটা) নিউরোমেরিকেল ডেটায় কনভার্ট করতে হবে। One-hot-encoding ইউজ করে আমরা এই করভার্শনটা করি।
মনে করি, আমাদের কাছে একটা vocabulary আছে এবং আমাদের vocabulary তে শুধু মাত্র নিচের ৬ টি শব্দই রয়েছে।
এখন, আমরা আমাদের vocabulary এর শব্দগুলো দিয়ে একটা বাক্য নেই,
“আমার সোনার বাংলা”
লক্ষ্য করে দেখুন, উপরের শব্দগুলো একটি অন্যটি থেকে আলাদা। আমরা এইটা সহজেই বুঝতে পারি, কিন্তু মেশিন বুঝবে কিভাবে?
তাই আমরা One-hot-encoding করব। মনে রাখবেন যে,
* One-hot-encoding করে আমরা প্রতিটি শব্দের জন্য একটি ভেক্টর পাবো। ভেক্টরের সাইজ হবে আমাদের vocabulary এর সমান।
* একটি শব্দ আমাদের vocabulary তে যে পজিশনে আছে, সেই পজিশন এর ভ্যালু হবে 1 এবং বাকি শব্দ গুলোর পজিশনের ভ্যালু হবে 0 ।
আমাদের পুর্বের বাক্যটিকে যদি One-hot-encoding করি,
“আমার সোনার বাংলা” = [ “আমার”, “সোনার”, “ বাংলা” ]
যেহেতু আমাদের vocabulary সাইজ হচ্ছে ৬, তাই প্রতি শব্দের জন্য ভেক্টরের সাইজ হবে ৬।
এই প্রসেসটাকে বলা হয় One-hot-encoding। এই One-hot-encoding মাল্টি-ক্লাস ক্লাসিফিকেশন এর লেভেল কে রিপ্রেজেন্ট করার জন্য ও ইউজ করা হয়। এ ছাড়া মেশিন ট্রান্সলেশন মডেল এর ক্ষেত্রে ও One-hot-encoding ইউজ করা যায়।
এখন মেশিন লার্নিং এর লাইব্রেরী (sklearn) ইউজ করে কিভাবে One-hot-encoding করা হয় সেটা দেখবো,
এই প্রসেস টার মাধ্যমে আমরা একটি sparse feature/embedding ভেক্টর পাই, যেখানে একটি শব্দের পজিশন ছাড়া বাকী সবগুলোর ইনডেক্স 0 থাকে। যদিও একটি শব্দকে নিউরোমেরিকেল ভ্যালুতে কনভার্ট করার সহজ পদ্ধতি হচ্ছে One-hot-encoding, কিন্তু এর কিছু লিমিটেশন আছে।
- যদি আমাদের কর্পাসে এ vocabulary সাইজ বৃদ্ধি পায় তাহলে ফিচার ভেক্টর এর সাইজ ও বাড়বে। যদি vocabulary সাইজ ২০ লক্ষ হয়, তাহলে প্রতিটি শব্দের জন্য feature ভেক্টর এর সাইজ হবে ২০ লক্ষ।
- প্রতিটি শব্দের feature ভেক্টর এর অধিকাংশই 0, তাই অনেক মেশিন লার্নিং মডেল এই বিশাল ডাইমেনশনাল এবং sparse ভেক্টরের জন্যে ভালো কাজ করবেনা, এবং যেহেতু feature ভেক্টরের সাইজ বেশি, সেহেতু কম্পিউটারে অনেক মেমরির প্রয়োজন হবে।
- এছাড়া, Part-of-speech Tag (POS) বা Name-Entity Recognition এর মত কাজের জন্য, One-hot-encoding এর ফিচার vector এ কোন contextual ইনফরমেশন নেই।
One-hot-encoding এর লিমিটেশনগুলো দূর করার জন্য আমরা word embedding ইউজ করে থাকি।
Word Embedding:
Word embedding হচ্ছে একটি শব্দের ভেক্টর রিপ্রেজেন্টেশন। NLP তে, একটি ডকুমেন্টের শব্দকে রিপ্রেজেন্ট করার Word embedding এর ব্যবহার অনেক। কারণ, এটি একটি ডকুমেন্টের একটি শব্দের context (প্রসঙ্গ) ধারণ করতে পারবে, এছাড়া অন্য শব্দের সাথে এর গঠনগত ও অর্থগত সাদৃশ্য এবং সম্পর্ক ধারণ করতে পারে। এই জন্যে মেশিন ট্রান্সলেশন, টেক্সট ক্লাসিফিকেশন এবং সেন্টিমেন্ট অ্যানালাইসিস এর মত NLP এর বিভিন্ন কাজে Word embedding ব্যবহৃত হয়।
এখন একটা উদাহরণ দেখি,
মনে করি, আমাদের কাছে একটি vocabulary (V) আছে এবং vocabularyসাইজ হচ্ছে ৪ ।
V = [ “আজকের”, “দিনটি”, “শুভ”, “সুন্দর” ]
এখন, দুইটি বাক্য নেই,
আজকের দিনটি শুভ
আজকের দিনটি সুন্দর
এখন, উপরের দুইটি বাক্যের জন্য আমারা One-hot-encoding করে পাই,
এখন, আমরা যদি এই One-hot-encoding কে ৫-ডাইমেনশনাল space হিসেবে বিবেচনা করি, যেখানে প্রতিটি শব্দ একটি ডাইমেনশনে অবস্থান করে এবং একটি অপরটির সাথে সম্পর্ক নেই। তার মানে, “শুভ” এখন “সুন্দর” এই দুইটি শব্দের মধ্যে কোন সম্পর্ক নেই যেমনটা “আজকের” এবং “দিনটি” এর মধ্যে নেই।
আমাদের উদ্দেশ্য হচ্ছে যে শব্দগুলোর context একই, সেগুলো পাশাপাশি অবস্থান করবে। অর্থাৎ, দুইটা ভেক্টরের cosine angle হবে 1 এর কাছাকাছি।
Word embedding শেখার করা জন্য ২০১৩ সালে Mikolov word2vec নামে একটি টেকনিট ডেভেলপ করেন [ 1]।
Word2Vec এর আর্কিটেকচার,
Word2vec হচ্ছে একটি শব্দকে ভালোভাবে রিপ্রেজেন্ট করার জন্য word embedding তৈরির একটি পদ্ধতি। এটি মূলত দুই লেয়ার এর নিউরাল নেটওয়ার্ক। একটি হিডেন লেয়ার এবং একটি আউটপুট লেয়ার।
Word2vec এর দুইটি আর্কিটেকচার ইউজ করা হয়,
১। Continuous Bag of Word (CBOW)
২। Skip-Gram
Continuous Bag of Word (CBOW):
CBOW তে, একটি শব্দকে প্রেডিক্ট করা হয় তার চারপাশের শব্দগুলো ইউজ করে। এইক্ষেত্রে আমরা চারপাশের কয়টি শব্দকে বিবেচনা করবো তা সেট করে দিতে হয় এবং একে window সাইজ বলে।
মনে করি আমাদের window সাইজ হচ্ছ ২,
বৃষ্টি নেমেছে আজ আকাশ ভেঙ্গে
এখন আমরা যদি [ “বৃষ্টি”, “আকাশ” ] এই দুইটি শব্দের উপর ভিত্তি করে মাঝের শব্দটি প্রেডিক্ট চাই। এইক্ষেত্রে, আমারদের ডেটাসেট দেখতে যেমন হবে,
এখন, উপরের ব্যকের জন্য আমাদের vocabulary সাইজ হচ্ছে ৫ এবং X1…..X5 প্রতিটি হচ্ছে One-hot-vector কারণ wor2vec মডেল এর ইনপুট One-hot-vector ।
এখন, One-hot encoding করে পাই,
X1 = [ 1, 0, 0, 0, 0]
X3 = [ 0, 0, 1, 0, 0]
Y1 = [ 0, 1, 0, 0, 0]
এখন, এই One-hot-vector নিউরাল নেটওয়ার্কের হিডেন লেয়ারের ইনপুট হিসেবে যাবে এবং হিডেন লেয়ারের নিউরনের সংখ্যা হবে আমরা যত ডাইমেনশনের ভেক্টর পেতে চাই। নিচে CBOW মডেল এর আর্কিটেকচার দেখানো হল,
Skip-Gram :
CBOW তে, একটি শব্দকে প্রেডিক্ট করা হয় তার চারপাশের শব্দগুলো ইউজ করে। অপরদিকে, Skip-Gram এ, একটি শব্দকে ইউজ করে তার চারপাশের শব্দগুলোকে প্রেডিক্ট করা হয়। চারপাশের কয়টি শব্দকে প্রেডিক্ট করবে সেটা window সাইজ এর উপর নির্ভর করে।
উদাহরণস্বরূপ আমরা আগের বাক্যটি যদি নেই তাহলে Skip-Gram মডেল এর ডেটাসেট দেখতে যেমন হবে,
বৃষ্টি নেমেছে আজ আকাশ ভেঙ্গে
মনে করি, window সাইজ ২।
নোটঃ Skip-Gram মডেল এর ইনপুট হচ্ছে one hot vector।
এখন আপনি নিজের ডেটাসেট দিয়ে word2vec মডেল ট্রেইন করার জন্য নিচের কোডটি দেখুন, https://github.com/m-d-hasan/Bangla-Word2Vec
Word2Vec এর কিছু লিমিটেশন আছে এবং সেই লিমিটেশনগুলো দূর করার জন্য BERT, ELMo নামে দুইটি মডেল রয়েছে। পরবর্তিতে, BERT নিয়ে আলোচনা করবো।
আপনার যদি কোন প্রশ্ন বা সাজেশন থাকে তাহলে অবশ্যই আমাকে মেইল বা social মিডিয়ার মাধ্যমে জানাবেন।
References:
http://jalammar.github.io/illustrated-word2vec/
https://lilianweng.github.io/lil-log/2017/10/15/learning-word-embedding.html
