مکانیزم توجه (Attention Mechanism) و استفاده از آن در ترجمه ماشین (Machine Translation)

این مبحث در جلسه ۱۳ام از کلاس مباحث ویژه ۲ تدریس و بررسی شده است +ویدئوی جلسه در آپارات + اسلاید‌ها

 

توجه (Attention) درواقع یک وکتور است که معمولا خروجی‌های یک لایه تمام‌متصل (Dense) با تابع فعال‌ساز Softmax است. Attention به ماشین مترجم کمک می‌کند تا تمامی اطلاعاتی که زبان مبدا دارد را بررسی کرده و کلمه خروجی را بر اساس کلمه‌ فعلی در حال کار و کل متن -یا جمله- انتخاب کند. درواقع Attention این امکان را به مترجم ماشینی می‌دهد تا در محدوده‌های محلی و عمومی متمرکز شود و عمل ترجمه را علاوه بر توجه به مکان فعلی کلمه، با در نظر داشتن کل جمله انجام دهد.

ادامه خواندن مکانیزم توجه (Attention Mechanism) و استفاده از آن در ترجمه ماشین (Machine Translation)

pix2pix & cyclegan

به نام خدا

کلاس نوت – محمد حسین نیکی ملکی
مقدمه ای بر cyclegan & pix2pix

ساختار شبکه ای pix2pix از ساختار شبکه های شرطی GAN برای ساخت دیتا ها و تبدیل و generate کردن آن هااستفاده میکند .
فرض کنید تصاویری ورودی شبکه ما باینری شده و انتظار خروجی شبکه امان هم از همان جنس دیتا رنگی rgb باشد .طبیعتا انتظار داریم که generator در اینجا یاد بگیرد که چطور رمگ امیزی کند .و همچنین discriminator هم تلاش میکند تا تفاوت بین رنگی که generator تولید کرده و رنگ اصلی به نظر صحیح که در بین دیتاست ها بوده را محاسبه کند .

ساختار generator بصورت “encoder-decoder” است و pix2pix هم تقریبا مانند همین (در شکل پایین هم میبینید ) است .

مقادیر دایمنشن های هر لایه در کنار آن نوشته شده است .در اینجا ورودی شبکه ما یک 256*256*3 است و پس از اعمال تغییرات دوباره به همان شیپ ابتدایی در خروجی باز میگردد .
در اینجا generator ورودی هارا میگیرد وبا انکودر ها مقادیرش را کم میکند ( لازم به یاداوری است که انکودر محصولی از کانولوشن و اکتیویشن فانکشن مربوطه است .) همچنین در ادامه ی مسیر هم از دیکودر برای بازگشت ز مسیر استفاده میکنیم .
نکته : برای بهبود \رفورمنس شبکه و سرعت پردازش میتونیم از شبکه unet هم به جای encoder-decoder استفاده کنیم . شبکه unet در واقع همون encoder-decoder است اما بصورت موازی هر لایه encoder را به لایه decoder مربوطه اش متصل میکند و سودش در این است که ممکن است به برخی از لایه ها احتیاجی نداشته باشیم و از آنها ب\ریم و گذر نکنیم .
Descriminator :

کار descriminator این است که دو عکس یکی از ورودی و یکی از خروجی یا عکس هدف میگیرد و تصمیم میگیرد که ایا عکس دوم توسط generator ساخته شده است یا خیر .

ساختار DISCRIMINATOR شبیه به ENCODER-DECODER به نظر میرسد اما فرق دارد .

خروجی اش یک عکس ۳۰ در ۳۰ باینری است که مشخص میکند چقدر قسمت های مختلف عکس دوم به اول شبیه هستند . در پیاده سازی PIX2PIX هر پیکسل ۳۰ در ۳۰ به یک قسمت ۷۰ در ۷۰ عکس ورودی مپ میشود .

How to train :

برای ترین این شبکه باید هم discriminator و هم generator را اموزش بدهیم .
برای اموزس دیسکریمینیتور ابتدا جنریتور خروجی را تولید میکند و دیسکریمینیتور هر دفه خروجی هارا با ورودی ها مقایسه میکند و یاد میگیرد و میتواند حدس بزند که چقدر آنها طبیعی هستند . پس وزن های دیسکریمینیتور براسا ورودی و خروجی های شبکه ی جنریتور ما تعیین میگردد .
همینطور وزن های جنریتور هم براساس خروجی های دیسکریمینیتور اپدیت میشود هر دفعه .

cyclegans :

pipx2pix میتواند خروجی های بینظیری را تولید کند . چالش اصلی در قسمت ترین است . قسمت لیبل زدن و دو عکسی برای عملیات ترینینگ باید به ورودی شبکه بدهیم به عنوان x و y .
که ممکن است کار را برا ی ما بسیار سخت و گاها غیر ممکن کند.
به خاطر همین از سایکل گن ها استفاده میکنیم .
نکته اصلی انها این است که میتوانند بر اساس معماری pix2pix هم پیاده سازی بشوند اما به شما اجازه دهند که به دو مجموعه از تصاویر اشاره کنید و فراخوانی کنید .
در اینجا بعنوان مثال فرض کنید دو دسته عکس از ساحل دارید یکی در زمان صبح و دیگری در عصر هنگام غروب . سایکل گن میتواند یادبگیرد که چگونه عکس های مربوط به صبح را به عصر تبدیل کند و برعکس بدون آنکه نیاز باشد تا بصورت یک در یک مقابل هم قرارشان دهیم . دلیل اصلی که سایکل را تا این حد قدرتمند کرده پیاده سازی این فرضیه است که بطور کامل تبدیل رفت و برگشتی صورت میپذیرد که باعث میشود هردو جنریتور هم بطور همزمان تقویت شوند .

Loss function :

قدرت سایکل گن در این است که loss function ای برای هر سایکل رفت و برگشت ست میکند و آن را به عنوان یک optimizer اضافی در مسله قرار میدهد .
در این قسمت نحوه ی محاسبه ی loss function برای generator را میبینیم :


g_loss_G_disc = tf.reduce_mean((discY_fake — tf.ones_like(discY_fake)) ** 2)
g_loss_F_dicr = tf.reduce_mean((discX_fake — tf.ones_like(discX_fake)) ** 2)


g_loss_G_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))
g_loss_F_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))

در این قسمت نحوه ی محاسبه ی loss function برای discriminator را بررسی میکنیم :


DY_loss_real = tf.reduce_mean((DY — tf.ones_like(DY))** 2)
DY_loss_fake = tf.reduce_mean((DY_fake_sample — tf.zeros_like(DY_fake_sample)) ** 2)
DY_loss = (DY_loss_real + DY_loss_fake) / 2
DX_loss_real = tf.reduce_mean((DX — tf.ones_like(DX)) ** 2)
DX_loss_fake = tf.reduce_mean((DX_fake_sample — tf.zeros_like(DX_fake_sample)) ** 2)
DX_loss = (DX_loss_real + DX_loss_fake) / 2

تجربه شرکت در یکی از چالش‌‌های کگل (Kaggle)

نوشته‌شده توسط عاطفه ولی‌پور، المیرا قربانی، نفیسه داوری، مینا جی‌رودی، امیرمحمد قریشی و محمدحسن ستاریان

کگل (Kaggle) یکی از بزرگترین جامعه‌های مهندسان، محصلان و حتی شرکت‌های حوزه داده و یادگیری ماشین و یادگیری عمیق است که اصلی‌ترین و معروف‌ترین فعالیت آن بسترسازی برای برگزاری چالش‌های مختلف یادگیری ماشین است که در آن‌ها شرکت‌ها و موسسات مختلف این حوزه باهدف برطرف کردن مسائل مختلف، چالش‌هایی را تعریف می‌کنند و با در اختیار گذاشتن اطلاعات مربوط به مسئله، جوایزی را برای نفرات برتر حل‌کننده آن چالش‌ها انتخاب می‌کنند. از اقدامات دیگر کگل می‌توان به ارائه سرویس‌های محاسباتی ابری (کرنل کگل)، مجموعه داده‌های عمومی (Public Datasets) و آموزش‌های یادگیری ماشین هستند.

در این مقاله، تجربه شرکت در چالش طبقه‌بندی سوالات غیرعملی Quora را به اشتراک می‌گذاریم.

ادامه خواندن تجربه شرکت در یکی از چالش‌‌های کگل (Kaggle)

Connectionist Temporal Classification – CTC

CTC الگوریتمی است که در آموزش deep neural network ها در حوزه تشخیص گفتار و تشخیص دست خط و تشخیص عمل(action recognition) و  دیگر مسائل ترتیبی (sequence problems)  به عنوان loss function مورد استفاده قرار می گیرد. 

بطور کلی می توان گفت که CTC  قادر است تا خروجی deep neural network ها را گرفته و با محاسبه loss ، آموزش شبکه را ممکن سازد و همچین برای یک input sequence که تا به حال توسط شبکه رویت نشده خروجی تولید کند. بطور مثال برای یک ورودی صوتی بدون اینکه مشخص باشد چه کلمه ای بیان شده، کلمه را حدس بزند.

برای آشنایی  با  CTC در ادامه نحوه عملکرد آن بر روی صوت و دست نوشته بررسی خواهد شد

ادامه خواندن Connectionist Temporal Classification – CTC

مقدمه‌ای بر سیستم‌های توصیه‌گر (Recommender System)

سیستم‌های توصیه‌گر (Recommender Systems) با تحلیل رفتار کاربر، اقدام به پیشنهاد مناسب‌ترین اقلام (داده، اطلاعات، کالا و…) میکنه. این سیستم کمک زیادی به مشکلات سیستم‌های دارای حجم زیاد اطلاعات می‌کنه و به کاربرش کمک می‌کنه تا در بین حجم زیاد اطلاعات سریع‌تر به هدفش نزدیک بشه.

+ ویدیو آموزشی این مطلب

+ کد ها در Jupyter Notebook

مقدمه:

فرض کنید یک سایت شبیه GoodReads داریم که کاربران میتونند در مورد کتاب های مختلف در سایت نظرشونو بنویسند. ما اطلاعاتی در مورد اینکه هر کاربر به چه کتابی چه امتیازی داده داریم، فرض کنید کاربر الف به کتاب های a , b , c رای بالا داده، و ما میخوایم پیش‌بینی کنیم این کاربر به کتاب d احتمالا چه امتیازی میده، برای این‌کار با تحلیل داده‌های بقیه کاربرهایی که امتیازشون به a, b , c شبیه کاربر الف بوده میشه فهمید احتمالا کاربر الف به کتاب d چه امتیازی میده.

ادامه خواندن مقدمه‌ای بر سیستم‌های توصیه‌گر (Recommender System)

مقدمه ای بر شبکه‌های مولد تخاصمی (Generative Adversarial Networks)

یادگیری بدون نظارت (Unsupervised Learning)
همان‌طور که پیش‌تر بحث شده بود، یکی از حوزه های یادگیری ماشین، یادگیری بدون نظارت است که در آن داده‌ها برچسب ندارند. در یادگیری بدون نظارت هدف اصلی، یادگیری ساختار داده‌ها می‌باشد.

 

ادامه خواندن مقدمه ای بر شبکه‌های مولد تخاصمی (Generative Adversarial Networks)

Neural Style Transfer

 Style Transferیکی از کاربردهای Deep Learning در هنر است که مشابه Deep Dream می‌باشد.

در این کاربرد یک عکس content و یک عکس style داریم. هدف این شکه ساختن عکسی است که image آن از عکس content و style آن از عکس style گرفته شده باشد. یعنی content را حفظ کرده و آنرا به سبک style ببرد.

به طور کلی به object ها content و به  .pattern,texture,color,. ها style گفته می‌شود.

نمونه ای از خروجی‌های این شبکه :

آن‌چه ConvNet ها یاد می‌گیرند

همان‌طور که میدانید لایه‌های اول به featureهای generalتر مانند خط و لبه و لایه‌های آخر ه feature‌های abstractتر حساس‌اند.

از visualization برای درک اینکه هر لایه چه تفسیری از image دارد، استفاده می‌شود. و این به عنوان hyper parameter برای style trafnsfer استفاده می‌شود. (برای مثال: استفاده از کدام لایه style را بهتر حفظ می‌کند.)

در مقاله Zeiler & Fergus سه متد درباره visualization معرفی شده است.

ادامه خواندن Neural Style Transfer

آشنایی با شبکه های عصبی بازگشتی – RNN

برای درک بهتر این مبحث ابتدا برخی از مساله هایی که با کمک RNN ها قابل حل است را بررسی می کنیم:

  • Music generation : در این نوع از مسائل ما به شبکه یک نت تصادفی (random token) و یا بخشی از یک موسیقی را می دهیم و شبکه ادامه آن موسیقی را برای ما تولید می کند.
  • Sentiment classification : در این مسائل شبکه با داده های افرادی که درباره موارد مختلف هم نظر و هم امتیاز داده اند آموزش می بیند تا بتواند پس از آن با مشاهده نظر هر کاربر با هر تعداد کلمه ای امتیازی که احتمالا وی به آن محصول می داده را مشخص کند.
  • DNA sequence analysis : در این نوع از مسائل معمولا یک رشته DNA نویزی به شبکه داده می شود تا شبکه نویزهای آن را حذف کند و رشته DNA سالم را تحویل بدهد. (کلیک کنید.)
  • Machine Translation : با کمک شبکه های RNN می توان این کار را به صورت دقیق تری از ترجمه لغت به لغت انجام داد. در اصل شبکه پس از آموزش باید بتواند عبارت ها با تعداد کلمات متفاوت را از یک زبان به زبان دیگر ترجمه کند.
  • Video activity recognition : در این نوع از مسائل تلاش می شود تا شبکه طوری آموزش ببیند که پس از مشاهده چندین فریم از یک فیلم بتواند فعالیتی که در آن صحنه اتفاق می افتد تشخیص دهد.
  • Name entity recognition : در تمامی زبان ها بسیاری از کلمات می توانند اسم خاص باشند یا نباشند. (مثلا روحانی یا Harry Potter) در این مسائل هدف آموزش شبکه ای است که بتواند اسامی خاص را در جملات تشخیص دهد.
  • Speech Recognition : در این مساله برای آموزش شبکه ای تلاش می شود که بتواند صدا یا گفتار را به متن یا نوشتار تبدیل کند.

ادامه خواندن آشنایی با شبکه های عصبی بازگشتی – RNN

تشخیص اشیا در تصویر با YOLO object detection

Object detection یا تشخیص شی در تصویر چیست ؟

تشخیص اشیا یک فناوری کامپیوتری است که در ارتباط با کامپیوتر ویژن و پردازش تصویر است که با شناسایی نمونه هایی از اشیاء معنایی یک کلاس خاص (مانند انسان ها، ساختمان ها و اتومبیل ها) در تصاویر و فیلم های دیجیتال مورد بررسی قرار می گیرد.

در واقع در این فناوری ماشین تصویر را میبیند و پس از پردازش هایی مکان اشیا تعریف شده و کلاس یا دسته بندی آنها را نیز مشخص میکند.

در واقع در این فناوری ماشین تصویر را میبیند و پس از پردازش هایی مکان اشیا تعریف شده و کلاس یا دسته بندی آنها را نیز مشخص میکند.

وظایف اصلی بینایی ماشین را می‌توان به موارد زیر تقسیم کرد:

  • شناسایی یا دسته‌بندی شیء: در شناسایی شیء، یک تصویر خام را تحویل می‌گیرید و باید تشخیص دهید که مربوط به کدام دسته می‌شود.
  • دسته‌بندی و مکان‌شناسی: در این حالت شما یک تصویر دارید که فقط یک شیء در آن وجود دارد و باید جای آن شیء را پیدا کنید. به این کار «مساله‌ مکان‌شناسی» نیز می‌گویند.
  • پیداکردن شیء: در این حالت شما باید موقعیت شیء در تصویر را پیدا کنید. این اشیا می‌توانند از کلاس‌های متفاوت باشند.
  • تقسیم‌بندی تصویر: تقسیم‌بندی تصویر وظیفه‌ سنگین‌تری است. در این حالت باید تمام پیکسل‌ها را بر اساس دسته‌ درست آن پیدا کنید.

 

روش ها و الگوریتم های موجود :

1 – روش های اولیه و سنتی :

در این روش ها مسئله را با رویکرد های ساده تری انجام میدهند. بعنوان مثال ابتدا تصویر را به یک شبکه سگمنتیشن داده و با روش های موجود به سگمنت کردن اشیا موجود در تصویر پرداخته و پس از مشخص شدن محدوده اشیا در تصویر هر کدام را جداگانه به یک شبکه دسته بند میدهیم تا کلاس آن نیز مشخص شود.
این روش ها زمان بر بوده و عملا برای تشخیص اشیا به صورت real time کارآمد نیستند. برای مثال روش selective search

بعد از مدت ها و برای بهبود عملکرد این روش ها ایده هایی برای نحوه سگمنت کردن و در نهایت تشخیص اشیا مطرح شد که از جمله آنها میتوان روش roi pooling را نامبرد. که برای سگمت کردن تصویر ورودی از لایه ای کانولوشنالی شبکه های عمیق بهره میبردند. زیرا روش های قبلی با استفاده از محاسبه میزان تفاوت بین پیکسل های تصویر و تمایز قائل شدن بین آنها انجام میشد که دیگر منسوخ شدند.

2 – روش های مدرن و پیشرفته :

در این الگوریتم ها ایده هایی برای این مسئله مطرح شد که سعی بر این داشتند تا ماشین تصویر ورودی را فقط یک بار دیده و با استفاده از ترکیب شبکه های عمیق کانولوشنالی و تمام متصل به صورت موازی فیچر های لازم از تصویر استخراج شده و درنهایت به دسته بندی پرداخته شود تا از لحاظ دقت و سرعت پیشرفت بسیاری داشته باشد.

از جمله این روش ها و الگوریتم ها میتوان روش YOLO و SSD را نامبرد.

که در ادامه به بررسی آنها میپردازیم.

 

YOLO : You Only Look Once

کامل‌ترین سیستم‌ بلادرنگ (Real time) در یادگیری عمیق و حل مسائل تشخیص تصویر است. همان‌طور که در تصویر زیر مشاهده می‌کنید، این الگوریتم ابتدا تصویر را به بخش‌های مختلف تقسیم می‌کند و هر بخش را علامت‌گذاری می‌کند، سپس الگوریتم شناسایی را به صورت موازی برای تمامی این بخش‌ها اجرا می‌کند تا ببیند هر بخش به کدام دسته‌بندی تعلق می‌گیرد. بعد از شناسایی کامل اشیا، آن‌ها را به هم متصل می‌کند تا دو هر شیء اصلی یک جعبه باشد.

همه‌ این کارها به صورت موازی انجام می‌شوند؛ در نتیجه به صورت بلادرنگ است و می‌تواند تا 40 تصویر را در یک ثانیه پردازش کند. با اینکه این مدل کمی نسبت به RCNN عملکرد ضعیف‌تری دارد، ولی به دلیل بلادرنگ بودن آن، می‌توان از آن برای حل مشکلات روزانه استفاده کرد. در زیر تصویری از معماری YOLO را مشاهده می‌کنید.

نحوه تشخیص شی در تصویر توسط الگوریتم yolo :

در شبکه ی YOLO تصاویر به صورت فرضی به N در N ناحیه تقسیم می شوند. به ازای هر کدام از این نواحی فرض می شود که K شی امکان حضور دارند. شبکه به صورتی طراحی شده است که در نهایت به ازای تمامی نواحی امکان وجود اشیا در آن ناحیه ها – دسته ی آن شی و همچنین مختصات کادر دور شی را پیش بینی می کند.

با توجه به اینکه کادر دور هر شی ۴ مختصات دارد و همچنین دسته ی مورد نظر شی یک بردار C تایی هست و همین طور یک عدد برای احتمال وجود شی داریم پس به ازای هر شی یک تنزور (4 + 1 + C) تایی مورد نیاز است.

با توجه به اینکه فرض شد در هر تصویر N در N ناحیه وجود دارد و هر ناحیه احتمال حضور K شی به صورت بیشینه وجود دارد و هر شی نیز تزوری (4 + 1 + C) نیاز دارد پس در انتهای شبکه تنزوری KNN(C+1+4) وجود دارد که به پیشبینی کادر اشیا و احتمال آنها و دسته آنها می پردازد.

در نسخه نخست این شبکه پس از لایه های کانولوشن ویژگی ها خطی شده و به لایه های تمام متصل تحویل داده شده و در نهایت پیشبینی ها انجام می شوند در حالی که در نسخه های بعدی به جای ایجاد تنزوری به این ابعاد حجیم یک کرنل کانولوشن با ابعاد K(C+1+4) به نحوی بر روی ویژگی های آخرین لایه ی کانولوشن کانوالو می شود که ناحیه های ادراکی آن (Receptive Field) بر روی هر یک از N*N ناحیه از تصور ورودی قرار بگیرند و عملیات پیشبینی انجام شود.

 

تفاوت عمده این شبکه با شبکه ی RCNN این است که این شبکه به صورت سراسری (End-to-End) کار می کند و بحث تشخیص مکان اشیا را بدون نیاز به الگوریتم های بیرونی (Selective Search در RCNN) حل می کند و سرعت بسیار بالایی دارد و تماما با استفاده از شبکه های عصبی پیاده سازی شده و در نتیجه قابلیت موازی سازی بسیار مناسبی بر روی پردازنده هایی مثل GPU ها و FPGAها را داراست.

در فرایند اموزش شبکه yolo مختصات نقاطی را که میابد به صورت زیر تقسیم شده و با کاست فانکشن مناسب سعی در بهبود پبش بینی اشیا موجود در تصویر میکند

Cost function :

نتایج نهایی تشخیص اشیا روی تصویر توسط YOLO :

word2vec & glove

word2vec

الگوریتم Word2vec یک گروه از مدل‌های مرتبط با پردازش متن است که برای تولید کلمه جاسازی استفاده می‌شود. این مدل‌ها شبکه‌های عصبی هستند که برای آموزش بازسازی مفاهیم زبانی کلمات به کار می‌روند.

حال به روش های زیرتوجه کنید:

می دانیم که context به nتعدادکلماتی که برای پیش بینی شبکه لازم است واین n تعداد هایپر پارامتر هستند.

مثلا در شکل بالا n = 4قرار داده ایم وبرای پیش بینی juice ،چهار کلمه قبل از آن را انتخاب کرده ایم این روشی است که در سال 2003توسطBengioمطرح گردیدودر حال حاضر روش های بهتری ارایه شده است که به آن ها می پردازیم.

 

بعنوان مثال در شکل بالا هدف این است که juice راپیش بینی کنیم وبراساس contextهای متفاوت که در شکل بالا اورده شده میتوان به این هدف رسید.(همان طورکه در شکل قبل Last 4 wordsرا مشاهده کردیم.)

روش 4words on left & right :در این روش علاوه بر 4کلمه قبل،4کلمه ی بعدی رو هم context در نظر میگیریم.

روش Last 1 word:یک کلمه مونده به targetروcontext در نظرمی گیریم.

روش Nearby 1 word: یک پنجره context را 5 تا کلمه ای یا 10 تایی قبل وبعد targetبرمیداریم وسپس از این پنجره بعنوان رندوم یک کلمه انتخاب می شود،که درمثال بالا glass به عنوان context به صورت رندوم انتخاب شده است.به این روش skip-grams گویندکه همان word2vec راتشکیل می دهد.این ایده خیلی ساده ای است ولی در نهایت embedding خوبی خواهیم داشت.

پس در این روش یکسری context و target داریم که با n تا کلمه قبل وبعد وبا انتخاب یک کلمه ازمیانn تا به صورت رندوم میتوان targetرا تشخیص داد.این ایده در 2013 توسط Micolov مطرح گردید.

در شکل بالا یک Fake Task داریم که اگر یک context را بدهیم target را پیش بینی خواهد کردمثلا در شکل بالا در پنجره های ابی رنگ context ودر سفید رنگ targetرا خواهیم داشت وپنجره اول دو کلمه quick ,brown هم targetهستند.درپنجره های دیگر شکل هایپر پارامتر های متفاوتی را بسته به سلیقه های کد نویسی متفاوت مشاهده می کنیم.دراین شکل چون وزن های شبکه بروز می شوند target هم میتواند دو مقدار داشته باشد وهیچ مشکلی پیش نمی اید چون هدف بدست اوردن بردارembedding بامعنی است.

 

در نهایت شبکه شکل بالا را خواهیم داشت که

input vector: بسته به دیکشنری سایزمتفاوتی دارد که در شکل بالا 10000تایی ست.

hidden layer:به یک لایه embeddingوصل می شودکه مقدارآن هایپرپارامتراست وچون googleاین مقدار را300درنظر گرفته ماهم همان مقدار را درنظر می گیریم.

output layer:بردار one-hotاست که 10000تا مقدار نورون داردکه هر کدام به ازای یک کلمه تنها یکی ازآن ها مقدار یک می شود.

در این taskکه در شکل بالا توضیح داده شد برخلاف لایه های FC های قدیم activation نمی گزاریم و برای هر چه راحت شدن وپیچیدگی کمتر liner استفاده کردیم.

به مدل زیر توجه کنید که

دراین مدل vocab size=10000 است که از context که orange است ودر دیکشنری شماره6257 را دارد،می خواهیم به target  که juice است ودر index=4834 است برسیم که در واقع از X به Y یک Mapping خواهیم داشت.

 Ocبرابر one hot کلمه ی c است که در یک بردار embedding رندوم ضرب می شود وec که embedding کلمه c است سپس از یک لایه softmax عبور می دهیم ودر نهایت کلمه predict شده به دست می اید.

در فرمول softmax عکس می بینیم که مقدار خیلی بزرگی دارد که ممکن است train نشود چون سیگما مخرج یک جمع فوق العاده سنگینی است که علاوه بر آن ضرب وکتورایز هم داخلش داریم وتمام این عملیات های ریاضی فوق العاده باعث کاهش سرعت می شوند.

برای حل  مشکل بالا ایده های زیر ارایه شده است:

استفاذه از softmax باینری یعنی برای رسیدن به 10000 تا داده یک درخت می سازیم وآن را به دو قسمت مساوی تقسیم میکنیم که هر شاخه درخت5000 داده خواهد داشت، برای یافتن داده ابتدا بررسی میکنیم در کدام شاخه درخت باید بگردیم سپس ان شاخه را ادامه ودر مرحله ی بعدی 2500 تا داده ی بعدی را بررسی میکنیم وهمین طوری میگردیم تا به کلمه نهایی برسیم که در شکل با رنگ بنفش نشان داده شده است با این روش سرعت بالا تر می رود.

ایده ی دیگر همانند درخت Decision Tree می توان بر اساس احتمالات درخت را چید وبعنوان مثال کلمات پر تکرار همانند the و a را در ابتدای درخت قرار داد وکلماتی که خیلی پر تکرار نیستند رو درانتهای درخت بگزاریم.

Negative Sampling

بازهم ایده های بالا مشکلاتی دارند وروش بهتری به نام Negative Sampling مطرح شد:

دراین روش کار را ساده تر کردیم چون قبلا برای softmax سختی محاسبه را داشتیم حال ان راتبدیل به sigmoid میکنیم، همانطور که در شکل بالا میبینیم لغت juice به صورت رندوم به عنوان target انتخاب و مقدارش در جدول یک می شود وبقیه ی حروف مقدار صفر را میگیرند.البته لازم به ذکر است که در این روش چون به صورت رندوم target انتخاب می شود ممکن است target اشتباه انتخاب شود وبا مشکل مواجه شویم،ولی چون دیتا ست بزرگی در اختیار داریم این مشکل در مراحل بعدتر حل می شود.

مدل تبدیل به شکل بالا می شود که یکی از کلمات context است وفقط یکی از بقیه کلمات بعنوان target انتخاب میشود ومقدار یک میگیرد پس درواقع یکsigmoid tag خواهیم داشت وبا دادن کلمه ی orange کلمه juiceحاصل می شود.اگر لغت king داده شود همان sigmoid مخصوص این کلمه خطا را برمیگرداند که متوجه میشویم این کلمه sampleنیست وغلط است.درواقع دراین مثال هر بار 5نورون سیگموید دخیل هستند وخطا ها را برمیگردانند.یعنی با دادن کلمه orange در شبکه تمام 10000نورون در شکل یک مقداری میگیرند وبرای انتخاب کلمه juice یا king برای خروجی هرکدام که مقدار بیشتری داشت بامقدارtarget مقایسه ودر نهایت انتخاب میشود و اختلاف این مقدار ها در شبکه backpropagat  میشود.

برای انتخاب کلمات براساس احتمالاتی که درجمله کلمات داشتند بیشترین راانتخاب میکردیم،حال میخواهیم کلماتی که در دیکشنری پرتکرار هستند نسبت به هم نزدیکتر باشند واحتمال بیشتری برای انتخاب داشته باشند.برای این روش مشکلی که داریم این است که کلمات پر تکرار همانند aو the و of همیشه پرتکرارهستند و negative هارا همیشه تشکیل خواهند دادپس کلمات پرتکرار با احتمال (f(Wi، احتمال بیشتری خواهند داشت.روش دیگر این است به تمام کلمات احتمال برابری را نسبت می دهیم ولی مشکل این روش این است که کلمات پرتکرار بهتر یاد گرفته نمی شود.

برای حل دو روش بالا فرمول (P(Wi مطرح شد که نسبت احتمال کلمات را نسبت به کلمات پرتکرار حفظ می کند وکلماتی که بیشترانتخاب می شدند احتمال بیشتری نسبت به کم تکرار ها خواهند گرفت.(برای درک فرمول ونسبت ها میتوانید تابع xبه توان 3/4وxرا باهم ببینید)

GloVe word vectors

gloveروشی برای word embedding درست کردن است دریک task است که بعدها این word embeddingبتواند مورد استفاده قرار بگیرد.این روش درسال 2014 توسط استندفوری ها مطرح شد.

به صورت کامل نمی توان گفت که gloveبهترازword2vecهست.

 

درجمله ای که در شکل بالا می بینیم همانطور که قبلا گفته شد یک context و target انتخاب می کردیم دراین روش الگوریتمی ساخته می شود که embeddingها را باروش ساده تر یاد بگیریم:

Xij=تعداددفعاتی که در کل دیتا ست context iام با context jام دیده شده است.

Xij=Xjiتنها در صورتی این دو باهم برابرندکه پنجره ای که برایcontextدر نظر گرفته می شود n لغت قبل وبعد را شامل شودمثلا یک لغت قبل وبعد یادرمثال های قبل 4لغت قبل وبعد را بعنوان پنجره contextدر نظر گرفته بودیم.

درفرمول بالا

ej= بردارembadding لغت ای که اندیس jدارد.

θi=وزن های پارامترهای یک نورون iهست.

(f(Xij=وزن (اطلاعات بیشتر در کورس deep learning nlp استندفوردجلسه سوم)

هدف به دست اوردن وابستگی بین iوjاست که log آن برابر تعداددفعاتی است که i و j با هم دیده شده اند.

در ابتدا هم i و j به ازای تمام کلمات minimize می شوند.

bi و bj هم بایاس هستند.

کاربرد(f(Xij :

  1. ممکن است دوکلمه ی i و j با هم دیده نشده باشند پس Xij=0 میشود ودر نهایت (log(0 تعریف نشده است ومی دانیم در برنامه نویسی برای محاسبه عبارت ریاضی اگر مقدار ابتدای صفر شود دیگر عبارت محاسبه نمی شود ومقدار صفر خواهد گرفت پس برای حل مشکل تعریف نشده بودن=0 (f(Xij می شود وبرنامه به ارورنمی خورد.
  2. همانند روش negative sampling با وجود (f(Xij برای کلمات پرتکرار وزن بیشتری نسبت میدهیم واحتمال انتخاب شدن ان ها را افزایش میدهیم وکلمات کم تکرار هم احتمال انتخاب شدنشان نیز کنترل میشود.

اگر پنجره context اندازه قبل وبعد از context برابری داشته باشندej و θi هردو یک چیز یکسانی را یادمیگیرندوهردو خواصیتی که می خواستیم را پیدا می کنند پس در فرمول نهایی میانگین این دو را در نظرمیگیریم.

دانلود word embedding از قبل آموزش داده شده توسط Glove

چون با مشکل کوچک بودن دیتا ست مواجه هستیم پس در این قسمت word embedding ازقبل اموزش داده شده ی glove را انتخاب میکنیم.

Pre-process the embeddings

ابتدا دیتا ست را دانلود میکنیم و ان را unzip کرده وسپس وکتورهای 100 بعدی این مجموعه را انتخاب می کنیم دراین مرحله ابتدا هر خط از دیتا ست را با line.split جدا کرده وخود لغت را از دیتاست که [value[0 دارد داخل word می ریزیم و [:values[1 که vectorهای تکرارword را تشکیل میدهندو در اینجا embadding_index را شامل می شوند.درنهایت فایل باز شده را  میبندیم.

در این گام یک ماتریس embedding vector را شامل می شود یعنی از فضای دیکشنری موجود به فضای embedding تبدیل کنیم.از قبل می دانیم max_word=10000 تا لغت پرکاربرد دیکشنری هست وبرای این ها ماتریس embedding vectorرا می سازیم که  (len=10000 , shap=(10000 ,100 است.

Define a model

مدل زیر را برای شبکه در نظر گرفتیم:

Load the GloVe embeddings in the model

لایه ی embedding_matri را به صورت رندوم با تابع set_weighte وزن هایش را لود میکنیم.

trainable = False قرارمی دهیم چون در ابتدا خطا زیاد است و می خواهیم بردار pre_train را خراب نکند.

Train and evaluate

مدل را compile , fit کرده ودر نهایت مدل را save میکنیم.در نهایت با مشکل overfitting مواجه میشویم چون accuracy دیتای train=1و validation=0.57 میشود چون مدل شبکه به خوبی ساخته نشده وترتیب کلمات را یاد نمی گیرد.

 

دراینده با مباحث RNN ها خواهیم دید که perfomance را بهبود خواهیم داد.