چگونه سرعت الگوریتم خوشه بندی K-Means را نسبت به Scikit-Learn تا ۱۰ برابر بیشتر کنیم

خوشه بندی K-Means یکی از معروف ترین الگوریتم های خوشه بندی در یادگیری ماشین است. این خوشه بندی، الگوریتم یادگیری ماشین نظارت نشده است ، به این معنی که بدون نیاز به برچسب های قبلی و با حداقل دخالت انسان آموزش داده می شود.

در واقع ، برای استفاده از آن تنها کاری که باید انجام دهید تنظیم تعداد خوشه های مورد نظر K ، مقداردهی اولیه K مرکز و سپس الگوریتم می تواند برای به دست آوردن کلاس ها اجرا شود.

زیبایی K-Means در سادگی آن نهفته است: تمام آنچه که انجام می دهد ، محاسبه فاصله بین نقاط و مراکز گروه است و در نتیجه یک پیچیدگی خطی O(n) حاصل می شود. این کار در اکثر مجموعه های داده ای که میلیون ها نقطه داده را پردازش نمی کنند کاملاً مناسب است.

اما این همان جایی است که ما با یک مشکل روبرو می شویم: K-Means در مورد مجموعه داده های بزرگتر کند عمل می کند ، زیرا تعداد بسیاری از نقاط داده برای مقایسه وجود دارد. بدتر اینکه محبوب ترین اجرای خوشه بندی K-Means ، یعنی برنامه Scikit-Learn ، خیلی خوب بهینه سازی نشده است.

اما جای نگرانی نیست آنجاست که دوست جدید ما Faiss وارد می شود!

Faiss چیست؟

Faiss کتابخانه ای برای جستجوی سریع شباهت و خوشه بندی است. این کتابخانه توسط Facebook AI Research (FAIR) ایجاد شده است و با استفاده بسیار هوشمندانه از بردارها و همچنین همزمانی در هسته های پردازنده می تواند سرعت محاسبات را افزایش دهد. علاوه بر این ، دارای یک مولفه GPU است که برای مجموعه داده های بزرگ تر نیز استفاده می شود.

با تمام آن جادوهایی که در پشت صحنه اتفاق می افتد ، Faiss هنوز با رابط Python همراه است که کدگذاری را بسیار آسان می کند. در واقع ، پس از ورود به آن ، متوجه خواهید شد که طرح کد به طرز باورنکردنی به Scikit-Learn شباهت دارد.

نصب کتابخانه Faiss

ساده ترین راه برای نصب Faiss استفاده از conda است. ابتدا محیط conda خود را ایجاد کرده و فعال کنید:

حالا می توانید کتابخانه Faiss را در محیط خود نصب کنید. همچنین scikit-learn را نصب خواهیم کرد زیرا سرعت بین این دو را مقایسه خواهیم کرد. و در آخر ، Keras و TensorFlow را نصب خواهیم کرد – از یک مجموعه داده برای آن استفاده خواهیم کرد.

در زیر نسخه CPU کتابخانه  Faissرا نصب کردیم ، اما در صورت علاقه نسخه GPU نیز دارد. اگر می خواهید نصب بسیار فانتزی از منبع انجام دهید ، همیشه می توانید اسناد نصب را بررسی کنید.

عالی! اکنون ما آماده هستیم تا کار خود را انجام دهیم و K-Means خود را فوق العاده سریع بسازیم!

تنظیم داده ها و محک زدن با Scikit-Learn

اولین کاری که ما می خواهیم انجام دهیم اجرای Scikit-Learn است. این کار برای ایجاد معیار مشترک در مقایسه لازم است. به عنوان مرجع شما ، دستگاهی که این آزمایشات را روی آن اجرا می کنم دارای مشخصات زیر است:

  • پردازنده i7–۸۷۰۰k
  • ۳۲ گیگابایت RAM DDR4 3000 مگاهرتز

اولین کاری که باید انجام دهیم وارد کردن و بارگذاری اطلاعات است.

ما می خواهیم از داده های کلاسیک MNIST استفاده کنیم. MNIST یک مجموعه داده متشکل از ۶۰،۰۰۰ تصویر آموزشی و ۱۰،۰۰۰ عکس آزمایشی است. هر تصویر ۲۸*۲۸ پیکسل است و شامل یک رقم ( از ۰ تا ۹) در پیکسل سفید روی پس زمینه سیاه است. این مجموعه معمولاً به عنوان یک معیار سریع در یادگیری ماشین استفاده می شود – به اندازه کافی چالش برانگیز است که معنی دار باشد اما به اندازه کافی کوچک است و نیازی به یک تن قدرت محاسباتی ندارد.

کد زیر را بررسی کنید تا ببینید که چگونه این کار را انجام داده ایم. ما داده ها را مستقیماً از Keras بدست می آوریم ، آن ها را تغییر شکل می دهیم و ورودی را از نوع floating-point نرمالسازی می کنیم و مقادیری بین ۰ و ۱ به دست می آوریم.

مورد بعدی که ما قصد انجام آن را داریم اجرای Scikit-Learn در K-Means است. کد زیر را بررسی کنید تا ببینید که چگونه این کار را انجام داده ایم.

ما K-Means را برابر ۱۰ خوشه قرار داده ایم زیرا تعداد مجموعه برچسب مجموعه داده ما این عدد است. سپس ، تابع fit() خود را اجرا کردیم که در واقع خوشه ها را ایجاد می کند. ما مدت زمان این کار را به عنوان “زمان آموزش” اندازه گیری می کنیم. کار بعدی، پیش بینی هایی است که ما با استفاده از تابع predict() در مجموعه آزمون اجرا می کنیم. در اینجا ما کل زمان لازم برای پیش بینی روی همه نمونه ها را به عنوان “زمان پیش بینی” اندازه گیری می کنیم.

خوب!

در پایان ، آموزش روی این ۶۰۰۰۰ تصویر ۲۱٫۵۱ ثانیه طول کشید در حالی که کل زمان پیش بینی ۱۰ هزار تصویر ۰٫۰۲۰۳ ثانیه بود.

اجرا روی CPU با Faiss

اکنون می خواهیم ببینیم که چگونه می توان همان خوشه بندی را با Faiss انجام داد ، البته در CPU بسیار سریعتر. این کد مشابه کد scikit-learn فقط با چند نام متغیر مختلف است.

کد زیر را بررسی کنید تا ببینید که چگونه این کار را انجام داده ایم. یک بار دیگر ، تعداد خوشه ها را ۱۰ قرار داده ایم. همچنین باید دو متغیر تنظیم کنیم: niter که معادل max_iter از scikit-learn است و nredo که برابر است با n_init از scikit-learn. همچنین ، به جای fit() به تابع برای آموزش train() و به جای predict() به تابع برای پیش بینی search() می گویند.

یک بار دیگر ، ما هم زمان آموزش و هم پیش بینی ها را اندازه گیری می کنیم. در این مورد با کتابخانه Faiss ، آموزش روی این ۶۰،۰۰۰ تصویر ۲٫۳۳ ثانیه طول کشید در حالی که کل زمان پیش بینی ۰٫۰۱۱۲ ثانیه بود. این سرعت تقریباً ۱۰ برابر در آموزش و تقریباً ۲ برابر در پیش بینی است!

آیا همیشه فوق العاده سریع است؟

نه همیشه .

در تمام آزمایشاتی که ما روی مجموعه داده های کوچک تر مانند Boston ، iris و wine انجام دادیم ، هیچ بهبودی وجود نداشت. احتمالا به این دلیل است که Faiss وقت خود را صرف راه اندازی و به تصویر کشیدن همه داده ها می کند ، بنابراین پیشرفت ها فقط در مجموعه داده های بزرگ تر قابل مشاهده است.

اگر بخواهید روی GPU کار کنید ، تیم Faiss همچنین توصیه های بیشتری دارد و آن ها دوباره به مجموعه داده های بزرگتر اشاره می کنند. این مطمئناً منطقی است زیرا انتقال این داده ها از CPU به GPU همیشه هزینه زمانی دارد. بنابراین ، به طور معمول ، استفاده از GPU فقط باعث می شود سرعت شما برای مجموعه داده های بسیار بزرگ زیاد شود (یعنی میلیون ها نمونه).

کسب اطلاعات بیشتر

توصیه می کنیم برای کسب اطلاعات بیشتر در مورد نحوه استفاده از کتابخانه ، از Faiss Wiki استفاده کنید. کتابخانه برای جستجوی شباهت و بازیابی فوق العاده بهینه شده است (به عنوان مثال KNN) و نمونه های زیادی برای شروع وجود دارد.

بیشتر بخوانید :

درباره‌ی احمدرضا جعفری

همچنین ببینید

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

آیا می خواهید در زمینه یادگیری ماشین استخدام شوید؟

مسیر های شغلی زیادی در حوزه یادگیری ماشین وجود دارد، اما از کجا بفهمیم که …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *