خودرمزگذار

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

در یک خودرمزگذار می‌توان ۳ یا تعداد بیشتری لایه داشت:
* لایه‌ی ورودی
* لایه (ها)‌ی پنهان
* لایه‌ی خروجی
بندانگشتی|شکل و ساختار کلی خودرمزگذار (Autoencoder)|288x288پیکسلدر ساده‌­ترین حالت یک خودرمزگذار شامل یک encoder (رمزگذار) و decoder (رمزگشا) به همراه تنها یک لایه پنهان می­باشد. ورودی به encoder داده شده و خروجی از decoder استخراج می­شود. در این نوع شبکه به جای آموزش شبکه و پیش­بینی مقدار تابع هدف در ازای ورودی X ، خودرمزگذار آموزش می­بیند که ورودی خود را بازسازی کند؛ بنابراین بردار خروجی همان ابعاد بردار ورودی X را خواهد داشت؛ یعنی تعداد نورون­‌های موجود در لایه ورودی و خروجی با یکدیگر برابر است. همانطور که گفته شد در این شبکه خروجی بازسازی ورودی بوده و از الگوریتم پس ­انتشار   خطا برای یادگیری استفاده می­شود. خودرمزگذارها با حداقل کردن خطای بازسازی  شبکه را آموزش می‌دهند. معمولا تعداد نورون­های موجود در لایه پنهان کمتر از لایه encoder/decoder می­باشد. لایه پنهان یا کد در حقیقت representation یا نمایش داده در فضای بعد کاهش یافته آن می­باشد و عملا متناظر با ویژگی های استخراج شده است. پس از آموزش شبکه بخش decoder حذف شده و خروجی میانی­‌ترین لایه پنهان  به عنوان ویژگی های استخراج شده در نظر گرفته می­‌شود. به منظور کاهش بیشتر ابعاد می‌بایست از تعداد لایه ­های پنهان بیشتری در شبکه استفاده کرد که در اصطلاح خودرمزگذار عمیق نامیده می­شود.

در صورتی که در لایه میانی تنها از توابع خطی استفاده شود یا اینکه تنها از یک لایه سیگموید استفاده شود، عملکرد شبکه مطابق با تحلیل مؤلفه‌های اصلی است.

## تاریخچه
خودرمزگذار‌ها اولین بار در حدود سال 1980 توسط Hinton و گروه PDP معرفی شد که در تلاش بودند تا مسئله‌ی پس ­انتشار بدون معلم  را حل کنند. نخستین استفاده‌های خودرمزگذار‌ها در بحث کاهش ابعاد یا یادگیری ویژگی بود اما امروزه در بسیاری از حوزه‌های دیگر در هوش مصنوعی و یادگیری ماشین همچون یادگیری انتقالی کاربرد دارند. از حدود سال 2010 با پیشرفت حوزه‌ی یادگیری ژرف از آن‌ها در بسیاری از مسائل یادگیری ماشین مخصوصا در روش‌های مبتنی بر معماری عمیق استفاده می‌شود.

## کاربرد‌ها
همانطور که در بالا ذکر کردیم از امروزه از خودرمزگذار‌ها در بسیاری از مسائل استفاده می‌شود که در زیر به چند تا از مهم‌ترین آن‌ها می‌پردازیم.

### [[کاهش ابعاد]]
----
بندانگشتی|مقایسه روش تحلیل مؤلفه‌های اصلی (PCA) با خودرمزگذار در کاهش ابعاد از فضایی با بعد 784 به فضایی با بعد 3|440x440پیکسل
کاهش ابعاد روندی است که در آن تعداد ابعاد داده را کاهش می‌دهیم. به عبارت دیگر داده‌ها را از فضای برداری ابعاد بالاتر به فضای ابعاد پایین‌تر می‌بریم یا تنها تعدادی از ویژگی‌ها و ابعاد را انتخاب می‌کنیم. دلیل این کار خیلی جاها برای جلوگیری از بیش برازش یا کار کردن راحت‌تر با داده‌ها یا مصور‌سازی می‌باشد. به کمک خودرمزگذار‌ها می‌توان داده‌ها را از ابعاد بالاتر به ابعاد پایین‌تر برد و استخراج ویژگی را انجام داد. در واقع همانطور که در بخش‌های بالاتر توضیح داده شد می‌توان لایه‌ی کد (که به آن در برخی منابع لایه‌ی تنگنا یا bottleneck نیز گفته می‌شود) را به عنوان بازنمایی جدیدی از داده در نظر گرفت که در فضای برداری با ابعاد کمتری قرار دارد. در واقع بعد از آموزش کامل خودرمزگذار، کافی است تا بخش decoder (رمزگشا) را جدا کرد و تنها بخش encoder (رمزگذار) را نگه داشت و به عنوان شبکه‌ای از آن استفاده کرد که داده را ورودی می‌گیرد و خروجی آن بازنمایی جدیدی از داده در ابعاد پایین‌تر است.در واقع با این کار عملاً استخراج ویژگی را نیز انجام داده‌ایم.
بندانگشتی|406x406پیکسل|مقایسه‌ی روش تحلیل مؤلفه‌های اصلی (PCA) با خودرمزگذار خطی در کاهش ابعاد که عملکرد تقریباً مشابهی با هم دارند.
خود رمزگذار‌ها در مقایسه با روش‌های دیگر کاهش ابعاد مثل PCA یا همان تحلیل مؤلفه‌های اصلی معمولا از قدرت بهتری برخوردارتر هستند و طبق آزمایش‌ها نتایج منطقی‌تری می‌دهند. برای نمونه می‌توانید به عکس بالا دقت کنید.

البته دقت کنید که استفاده از توابع غیر خطی در میان لایه‌های خودرمزگذار قدرت آن را بیشتر از روش‌هایی مثل تحلیل مؤلفه‌های اصلی می‌کند. در صورتی که تمام لایه‌ها در خودرمزگذار خطی باشند تفاوت آن‌چنان و کاهش ابعاد بهتری در مقایسه با روش‌های سنتی نخواهیم داشت.

### [[روش تشخیص ناهنجاری|تشخیص ناهنجاری]]
----در تحلیل داده‌ها، تشخیص ناهنجاری (به انگلیسی: Anomaly detection) به فرایند تشخیص الگو‌ها یا آیتم‌های منحصر به فرد که از عموم دیتا فاصله‌ی بسیار زیادی دارند و با رفتار نرمال از پیش مقررشده‌ی داده مطابقت ندارند، اشاره دارد. خیلی ساده می‌توان از خودرمزگذار‌ها برای این کار استفاده کرد. فرض کنید یک خودرمزگذار داریم که بر روی عکس‌های داده‌هایی مربوط به سگ‌ها آموزش داده شده است. در نتیجه این خودرمزگذار قادر است تا با گرفتن عکس یک سگ تا حد خوبی و با مقدار تابع هزینه‌ی کم، آن را بازسازی کند. در نتیجه اگر یک عکس از دامنه‌ی دیگری به آن داده شود، هم این تابع هزینه بسیار بالا می‌رود و هم نمی‌تواند به خوبی عکس را بازسازی کند. زیرا فضای نهفته‌ای که آموزش دیده شده مربوط به دامنه‌ی سگ‌ها بوده و در نتیجه با این روش به سادگی می‌توان ناهنجاری را تشخیص داد.

### رفع نویز در عکس
----
بندانگشتی|388x388پیکسل|نمونه‌ای از یک مدل خودرمزگذار که نویز عکس را می‌تواند از بین ببرد.
در دینای امروزه، دیتایی که در دست ما برای حل مسائل قرار دارد اغلب دارای نویز است و مدل‌هایمان برای آموزش درست و صحیح به داده‌ای بهتر و تا حد امکان نویز کمتر نیاز دارند. دسته‌ای از خودرمزگذار‌ها که به آن‌ها رمزگذار‌های رفع نویز نیز گفته می‌شود، در این جا می‌توانند استفاده شوند تا به خوبی و با عملکرد قابل قبولی نویز‌های درون عکس را حذف کنند. برخلاف متد‌های سنتی که برای حذف نویز استفاده می‌شود، خودرمزگذار‌ها دنبال نویز درون عکس نمی‌گردند بلکه آن‌ها با یادگیری بازنمایی صحیحی از عکس سعی می‌کنند تا از دست این نویز‌ها راحت شوند و در نهایت با ساختن دوباره‌ی عکس این بار بدون نویز این کار را انجام دهند. در واقع برای آموزش این دسته‌ از خودرمزگذار‌ها معمولا از تعداد زیادی عکس در دو حالت با نویز و بدون نویز استفاده می‌کنند.

### تولید عکس‌
----
[بندانگشتی|ساختار ابتدایی [خودرمزگذار متغیر که در لایه‌ی پنهان از یک توزیع احتمال استفاده می‌کند.|440x440پیکسل]]
یک دسته‌ی خاصی از خودرمزگذار‌ها که به آن‌ها خودرمزگذار متغیر   گفته می‌شود، می‌توانند استفاده شوند تا به ما در تولید عکس‌های متنوع و جدیدی کمک کنند. در واقع این نوع مدل‌ها از دسته‌ی مدل سازنده می‌باشند که برای تولید عکس می‌توان از آن‌ها کمک گرفت. ایده‌ی کار به این ترتیب است که از روی تعدادی عکس ورودی برای مثال تعدادی عکس صورت انسان، می‌تواند عکس‌های جدیدی از صورت‌ها درست کند که بسیار طبیعی و شبیه به عکس‌های داده شده باشند ولی همچین آدم‌هایی یا همچین عکس‌هایی در حقیقت وجود ندارند. در خودرمزگذار متغیر سعی می‌شود تا با استفاده از یک دانش پیشین شروطی روی فضای نهفته  تولید شده توسط رمزگذار قرار داده شود تا نقاط نزدیک هم در فضا، داده‌هایی نزدیک به هم در فضای ورودی تولید کنند. در این روش رمزگذار می‌تواند چندین داده‌ی جدید از هر ورودی تولید کند که همه از یک توزیع آماری (به انگلیسی: Probability distribution) نمونه‌برداری شده‌اند.

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

در ادامه سعی می‌کنیم تا کمی از نظر ریاضی یک خودرمزگذار ساده را توضیح دهیم. اگر ورودی x باشد، به کمک رمز‌گذار h=f(x) را محاسبه می‌کند و فضای نهفته  تولید می‌شود. سپس رمزگشا با گرفتن h به عنوان ورودی سعی می‌کند تا ورودی را بازسازی کند. به طور ریاضی می‌توان گفت: \hat{x} = g(h) = g(f(x)) 

تابع هزینه‌ی ما به کمک تفاوت میان x و \hat{x} محاسبه می‌شود و در طول آموزش تلاش می‌شود تا توابع f و g را به نحوی بدست آورد که تابع هزینه‌ کمینه شود. به طور معمول تابع هزینه را خطای میانگین مربعات بین ورودی و خروجی بازسازی شده یا همان \hat{x} در نظر می‌گیرند.

## منابع

## جستارهای وابسته
* ماشین بولتزمن محدود شده

رده:تقلیل ابعاد
رده:شبکه‌های عصبی مصنوعی
رده:شبکه‌های عصبی
رده:معماری شبکه‌های عصبی
رده:یادگیری بی‌نظارت