Online Learning

یادگیری آنلاین

یکی از مسائلی که با داده‌های حجیم سر و کار دارد، مسئله یادگیری آنلاین است. در آن مسائلی را مدل می‌کنیم که ورودی داده‌های ما به صورت یک جریان پیوسته است و می‌خواهیم الگوریتم یادگیری ما روی این داده‌ها عمل کند.

وب‌سایت‌های بزرگ یا نسبتاً بزرگ از این مسئله برای یادگیری رفتار کاربران استفاده می‌کنند و برخی تصمیمات روی وب‌سایت را بر اساس این یادگیری بهینه‌سازی می‌کنند.

فرض کنید یک وب‌سایت خدماتی مربوط به ارسال محصولات دارید. کاربران به سایت شما مراجعه می‌کنند و نقطه مبداء و مقصد را برای ارسال بسته مورد نظر خود انتخاب می‌کنند. شما هم برای ارسال بسته مورد نظر قیمتی را پیشنهاد می‌دهید. بعضی اوقات کاربران بر اساس قیمت ارائه شده شما سرویس را خریداری می‌کنند \((y=1)\) و بعضی اوقات خریداری نمی‌کنند \((y = 0)\). بر اساس الگوریتم یادگیری می‌خواهیم بدانیم که چه قیمتی را به کاربران خود پیشنهاد دهیم.

به صورت خاص: خصوصیت‌های \(x\) بیانگر ویژگی‌های کاربر، مبداء، مقصد و قیمت درخواست شده است. می‌خواهیم \(P(y = 1|x;\theta)\) را طوری یاد بگیریم که قیمت‌ها را بهینه کند.

برای این هدف می‌توانیم از یکی از الگوریتم‌های رگرسیون لجستیک، شبکه‌‌های عصبی و ... استفاده کنیم. در اینحا از الگوریتم رگرسیون لجستیک استفاده می‌کنیم. اگر وب‌سایت به صورت مداوم کار کند، یادگیری آنلاین به صورت زیر مدل می‌شود:

$$\begin{eqnarray} \text{Repeat forever} &\{& \nonumber \\ &\quad& Get(x,y) \quad \text{corresponding to user} \nonumber \\ &\quad& \text{update} \quad \theta \quad \text{using} \quad (x,y) \nonumber \\ &\quad& \theta_j := \theta_j - \alpha(h_{\theta}(x) - y)x_j \nonumber \\ &\quad& \quad \quad (j = 0, 1, ..., n) \nonumber \\ &\}& \end{eqnarray}$$

تا قبل از این به جای \((x,y)\) از نماد \((x^{(i)},y^{(i)})\) استفاده می‌کردیم. اما در یادگیری آنلاین، بالانویس i را نمی‌نویسیم. زیرا دیگر یک مجموعه ثابت از داده‌ها را نداریم و اتفاقی که می‌افتد این است که نمونه \((x,y)\) را دریافت می‌کنیم، این نمونه را یاد می‌گیریم و سپس این نمونه را دور می‌اندازیم و دیگر از روی آن یاد نخواهیم گرفت و به همین دلیل است که در هر تکرار تنها از یک نمونه استفاده می‌کنیم.

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

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

جستجوی محصول: فرض کنید می‌خواهیم الگوریتم یادگیری را طوری طراحی کنیم که یک لیست از جستجوهای مناسب را برای کاربران فراهم کند. مثلاً فرض کنید یک فروشگاه آنلاین دارید که محصولات موبایل را می‌فروشید. در وب‌سایت خود یک رابط کاربری دارید که در آن کاربر می‌تواند مثلاً عبارت "Android phone 1080p camera" را جستجو کند. از 100 موبایلی که در فروشگاه وجود دارد، جستجو 10 نتیجه را جهت پیشنهاد به کاربر نمایش می‌دهد. می‌خواهیم یاد بگیریم که از میان این 100 تلفن کدام 10 تلفن را جهت نمایش به کاربر انتخاب کنیم.

در اینجا \(x\) شامل خصوصیت‌های موبایل، تعداد کلمات موجود در جستجوی کاربر، اسم موبایل و ... است. یعنی \(x\) خصوصیت‌هایی را ثبت می‌کند که مربوط به تلفن همراه باشد. آنچه که ما می‌خواهیم، طراحی الگوریتمی است که \(P(y=1|x;\theta)\) را برایمان مدل کند. \(y = 1\) زمانی است که کاربر روی لینک کلیک کند و در غیر این صورت \(y = 0\) .

این مسئله را پیش‌بینی Click Through Rate یا CTR می‌گویند. یعنی به دست‌آوردن احتمال اینکه کاربر روی لینکی کلیک کند. با به دست‌آوردن CTR می‌توانیم 10 موبایل را به کاربر نشان دهیم که احتمال کلیک کردن روی آنها بیشترین باشد.

پس برای هر جستجوی کاربر 10 نمونه داده \((x,y)\) خواهیم داشت. زیرا 10 نتیجه را نمایش می‌دهیم و برای هر یک از این 10 نمونه، مقدار \(y\) را با کلیک کردن کردن یا نکردن کاربر روی لینک خواهیم داشت. بنابراین به ازای هر کاربر 10 نمونه داریم که الگوریتم آنلاین ما می‌تواند از روی آن‌ها یاد بگیرد و سپس آن‌ها را دور بریزیم.