تنسورفلو ۱۰ : شبکه های عصبی

شبکه های عصبی مصنوعی چیست؟

یک شبکه عصبی مصنوعی از چهار قسمت تشکیل شده است.


  • لایه ها: تمام یادگیری داخل لایه ها شکل می گیرد. سه نوع لایه وجود داره 1) ورودی 2) مخفی و 3) خروجی
  • ویژگی ها و برچسب ها: ورودی های شبکه و خروجی آن
  • تابع کاهش: معیار اندازی گیری در فاز یادگیری
  • بهبود دهنده: بهبود یادگیری با افزایش دانش در شبکه


با توجه به تصویر بالا برنامه با گرفتن ورودی ها آن ها رو به دو لایه کاملا متصل وارد می کنه.مثلا فرض کنید یک مشکل ریاضی دارید اولین کاری که می کنید صورت سوال رو می خونید. دانش های خودتون رو برای حل سوال به کار می برید و احتمالا حل نمیشه :دی برای شبکه هم همینطوره سپس مثلا با مطالعه بیشتر سعی می کنید دانشتون رو بهبود بدید. برنامه هم همین کار رو می کنه تا وقتی که خطاش به کمترین حد ممکن برسه. و مثلا اگه به جایی برسه که نتونه بهبود بده مثل اینه که یک کتاب رو هزار بار خوندید فایده نداشته مثلا می تونید یک کتاب دیگه رو تست کنید. - چه مثالی شد!




ساختار شبکه های عصبی

لایه ها

یک لایه جایی هست که تمام یادگیری شکل می گیره. داخل یک لایه تعدادی نورون وجود داره. یک نوع از شبکه های عصبی شبکه های عصبی هست که تمام نورون های دو لایه همسایه بهم دیگه متصل میشند.

یک شبکه عصبی معمولی یک آرایه از ورودی ها میگیره و یک مقدار عددی به عنوان خروجی یا برچسب.

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

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

  1. ند های اولی ورودی هستند
  2. هر نورون به بخش های ورودی و تابع فعالسازی تقسیم میشه. قسمت چپ ورودی ها رو از لایه قبل می گیره و قسمت راست مجموع قسمت ورودی رو به تابع فعالسازی میده.
  3. مقدار خروجی از لایه مخفی محسابه میشه. و برای دسته بندی برابر با تعداد دسته هاست. برای رگرسیون فقط عدد تخمین زده میشه.

تابع فعالسازی

تابع فعالسازی یک ند خروجی آن ند رو مشخص می کنه. شما برای یادگیری الگو های غیر خطی به تابع فعالسازی نیاز دارید. یک فعال ساز معرو Relu هست یا Rectified linear unit که برای اعداد منفی مقدار صفر رو بر می گردونه.

توابع فعال سازی دیگه مثل:

  • Piecewise Linear
  • Sigmoid
  • Tanh
  • Leaky Relu

تصمیات حساس در زمان ساخت شبکه عصبی این هست که

  • تعداد لایه ها
  • چه تعداد ند در هر لایه

البته هرچی لایه ها و ند ها بیشتر باشه می تونه پترن های پیچیده ای یاد بگیره ولی هزینه یادگیری زیاد میشه و در نتیجه زمان بیشتری باید سپری بشه.

تابع کاهش

برای دسته بندی دوگانه می تونید از تابع کاهش زیر استفاده کنید

cross entropy loss function

و برای رگرسیون خطی از:

mean square error

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


بهبود دهنده

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

برخی از بهبود دهنده ها در زیر می تونید ببینید:

  • Stochastic Gradient Descent
  • Momentum optimization,
  • Nesterov Accelerated Gradient,
  • AdaGrad,
  • Adam optimization

محدودیت شبکه های عصبی

بیش برازش (Overfitting)

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

اینجا یک کم و زیاد کردنی بین بهبود و تعمیم مدل وجود داره که بهبود برای کاهش تابع هزینه مدل و تعمیم برای چگونگی برخورد مدل با داده های مشاهده نشده هست.

برای اینکه مدل یک سری از الگو های ناخواسته رو داخل داده ها کشف نکنه و دچار مشکل overfit نشه یک سری راهکار تحت عنوان regularization وجود داره


اندازه شبکه

یک راه برای کاهش هزینه تعلیم و بیش برازش کاهش اندازه مدل هست در واقع قانونی برای اندازه و تعداد لایه ها وجود نداره ولی شما می تونید با مدل های کوچک شروع کنید تا وقتی که به over fit نخوردید.

تنظیم وزن ها

یک راه استاندارد برای مقابله با overfitting افزودن یک سری ثابت به وزن های شبکه هست. مثلا


L1: Lasso: متناسب با قدر مطلق وزن ها

L2: Ridge: متناسب با مربع وزن ها

لایه خارج کننده

اگه یک لایه drop put داشته باشه ینی به صورت رندم با یه احتمال که بهش میدیم بعضی از وزن ها ۰ میشه.


تعلیم یک شبکه عصبی با تنسورفلو

خب می خواییم به وسیله DNNClassifier یک شبکه عصبی بر روی مجموعه داده MNIST بسازیم. خیلی ساده:

البته این رو با کراس می زنیم

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

خلاصه

یک شبکه عصبی شامل موارد زیر هست:

  • تعداد لایه های مخفی
  • تعداد ند های کاملا مرتبط
  • تابع فعال سازی
  • بهبود دهنده
  • تعداد دسته ها