رفتن به محتوا

توابع فعالیت در شبکه‌ی عصبی: پله، سیگموید، tanh و ReLU

در پرسپترون تابع فعالیت یک کار ساده داشت: بگوید نورون فعال شود یا نه. وقتی نورون‌ها را لایه‌لایه کنار هم می‌گذاریم، نقش تابع فعالیت عوض می‌شود و خیلی مهم‌تر می‌شود.

تابع پله می‌گوید: اگر z=wx+bz = wx + b مثبت بود ۱، وگرنه ۰. دو ایراد دارد:

  1. تغییرهای کوچک دیده نمی‌شوند. اگر وزن‌ها کمی تغییر کنند و zz از ۳ به ۲٫۹ برسد، خروجی همان ۱ است. شبکه نمی‌فهمد تغییر وزن‌ها اوضاع را بهتر کرده یا بدتر.
  2. مشتق به درد نمی‌خورد. در همه‌جا شیب تابع صفر است و درست در نقطه‌ی صفر، مشتق تعریف نشده. روش‌های آموزش شبکه بر پایه‌ی مشتق‌اند و مشتق‌ها در طول شبکه در هم ضرب می‌شوند؛ یک صفر کافی است تا همه‌چیز صفر شود.

اگر تابع فعالیت را کلاً حذف کنیم؟

Section titled “اگر تابع فعالیت را کلاً حذف کنیم؟”

ایده‌ی وسوسه‌انگیزی است: تابعی که مشتقش مشکل دارد را برداریم و نورون‌های لایه‌های پنهان فقط wx+bwx + b را حساب کنند. ولی نتیجه‌اش این است که کل شبکه به یک خط تبدیل می‌شود.

دلیلش ریاضی است: ترکیب خطی چند تابع خطی، باز هم خطی است. اگر سه خط

y1=3x+4,y2=−2x−1,y3=0.5x+2y_1 = 3x + 4, \quad y_2 = -2x - 1, \quad y_3 = 0.5x + 2

را با هر ضریبی جمع کنید، مثلاً y1+0.5 y2−2 y3+1y_1 + 0.5\,y_2 - 2\,y_3 + 1، باز به یک خط می‌رسید. نورونی که ورودی‌اش از پنج نورون خطی دیگر می‌آید، معادل یک نورون است. اگر یک خط می‌خواستیم، یک نورون کافی بود؛ این همه لایه را برای چه گذاشتیم؟

حالا اگر به هر خط یک شکستگی بدهیم، مثلاً منفی‌ها را صفر کنیم، ترکیب آن‌ها دیگر خط نیست:

جمع وزن‌دار سه خط: باز یک خطجمع وزن‌دار سه ReLU: یک منحنی شکسته
چپ: سه خط (خط‌چین) و جمع وزن‌دارشان (پررنگ) که باز یک خط است. راست: سه خط که منفی‌هایشان صفر شده و جمعشان، که یک منحنی شکسته است.

هر نورون یک شکستگی می‌سازد و با ترکیب چند نورون می‌شود چندضلعی و مرزهای پیچیده ساخت. پس تابع فعالیت در لایه‌های پنهان رسالت تازه‌ای دارد: غیرخطی کردن. در لایه‌ی آخر همچنان می‌گوید کدام خروجی فعال است، ولی در لایه‌های میانی کارش ساختن غیرخطی بودن است. شاید اسم بهتری برایش «تابع غیرخطی‌ساز» بود.

1پلهz > 0 ? 1 : 01سیگموید1 / (1 + e⁻ᶻ)1−1تانژانت هذلولویtanh(z)1ReLUmax(0, z)
چهار تابع فعالیت رایج. محور افقی z = wx + b است.

اولین راه‌حل این بود که خود تابع پله را نرم کنیم تا مشتق‌پذیر شود. سیگموید همین است: شکلی شبیه پله دارد ولی بدون پرش.

σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}

خروجی‌اش بین ۰ و ۱ است، تغییرهای کوچک zz را منعکس می‌کند و مشتقش هم ساده است: σ′(z)=σ(z) (1−σ(z))\sigma'(z) = \sigma(z)\,(1 - \sigma(z)). سال‌ها تابع فعالیت اصلی شبکه‌های عصبی بود.

گروهی گفتند بهتر است خروجی نورون‌ها حول صفر باشد، نه همیشه مثبت؛ این برای محاسبات شبکه ویژگی خوبی است. تابع tanh شکل سیگموید را دارد ولی خروجی‌اش بین ۱- و ۱ است:

tanh⁡(z)=sinh⁡zcosh⁡z=ez−e−zez+e−z\tanh(z) = \frac{\sinh z}{\cosh z} = \frac{e^{z} - e^{-z}}{e^{z} + e^{-z}}

سیگموید و tanh هنوز به شکل پله وفادار بودند. ولی هدف در لایه‌های میانی ساختن پله نبود، فقط غیرخطی بودن بود. جفری هینتون، که به خاطر نقش بزرگش در شبکه‌های عصبی از او با لقب «پدرخوانده‌ی یادگیری عمیق» یاد می‌شود، و همکارانش تابعی خیلی ساده را رایج کردند: واحد یکسوساز خطی (Rectified Linear Unit):

ReLU(z)=max⁡(0,z)\text{ReLU}(z) = \max(0, z)

مثبت‌ها همان‌طور می‌مانند و منفی‌ها صفر می‌شوند. ساده است، سریع حساب می‌شود و در عمل بهتر از سیگموید کار می‌کند. مشتقش هم ساده است: در بخش مثبت ۱ و در بخش منفی ۰. مشتق ۱ یعنی ضرب شدن پشت سر هم در لایه‌های زیاد سیگنال را کوچک نمی‌کند، و این برای آموزش شبکه‌های عمیق خیلی مهم است. صفر بودن در بخش منفی یعنی نورون فقط به بودن یک ویژگی حساس است، نه نبودنش.

امروز ReLU (و نسخه‌های مشابهش) انتخاب پیش‌فرض لایه‌های پنهان است.

1سیگموید1 / (1 + e⁻ᶻ)1ReLUmax(0, z)
خط پر: خود تابع. خط‌چین: مشتق آن. مشتق سیگموید حداکثر ۰٫۲۵ است و در دو طرف به صفر می‌رسد؛ مشتق ReLU در بخش مثبت همیشه ۱ است.
  • تابع فعالیت در لایه‌ی آخر تعیین می‌کند کدام خروجی فعال است؛ در لایه‌های پنهان کارش غیرخطی کردن شبکه است.
  • بدون تابع فعالیت، هر شبکه‌ای با هر تعداد لایه معادل یک خط است.
  • تابع پله مشتق مفیدی ندارد؛ سیگموید نسخه‌ی نرم آن است، tanh خروجی حول صفر دارد و ReLU ساده‌ترین و پرکاربردترین است.
  • مشتق ReLU در بخش مثبت ۱ است و همین آموزش شبکه‌های عمیق را ممکن کرد.

مقدمه‌ای بر یادگیری عمیق، آموزش رایگان و فارسی یادگیری عمیق.