RNN چیست و چگونه با LSTM و GRU تکامل یافت؟
- RNN چرا به وجود آمد؟
- ساختار ملموس RNN
- مثال پردازش جمله
- RNN چگونه یاد می گیرد؟ Backpropagation Through Time
- تصور کنید یک فیلم دارید
- فرمول
- مشکل بزرگ: ناپدید شدن گرادیان
- تأثیر عملی
- راهکارهای عملی: LSTM و GRU
- LSTM (Long Short-Term Memory)
- GRU (Gated Recurrent Unit)
- کدام را انتخاب کنید؟
- کاربردهای شبکه عصبی بازگشتی در دنیای واقعی
- ۱. بازشناسی گفتار (Speech Recognition)
- ۲. تولید متن (Text Generation)
- ۳. پیش بینی سری زمانی (Time Series Forecasting)
- ۴. پردازش زبان فارسی
- Transformers در مقابل RNN
- محدودیت های RNN
- رهبر جدید: Transformer
- آیا RNN هنوز ارزش دارد؟
- شروع عملی با کد
- چه باید بکنید؟
- پیشنهاد لرنادو برای شما:
وقتی گوشی شما زبان شما را می فهمد! فرض کنید به سیری می گویید: “فردا صبح ساعت هفت مرا بیدار کن.” این دستگاه چگونه متوجه می شود که “فردا” به زمان آینده، “صبح” به بازه زمانی، و “هفت” به ساعت خاص اشاره دارد؟ یا فرض کنید در گوگل ترنسلیت جمله ای انگلیسی وارد می کنید و یک باره ترجمه دقیق فارسی را دریافت می کنید. اینجاست که شبکه عصبی بازگشتی (Recurrent Neural Network) وارد عمل می شود.
RNN ها ابزارهای تخصصی هوش مصنوعی هستند که مانند مغز انسان می توانند اطلاعات قبلی را به خاطر بسپارند و بر اساس آنچه قبلاً دیده اند، تصمیم بگیرند. برخلاف شبکه های عصبی معمولی که هر ورودی را مستقل از بقیه پردازش می کنند، RNN ها به دنباله داده ها زندگی می بخشند و ارتباط بین لحظات مختلف را درک می کنند.
در این مقاله از دانشنامه لرنادو، شما با ماهیت واقعی RNN، نحوه کارکرد آن، مشکلات بزرگش و راهکارهای عملی آشنا می شوید تا بتوانید این فناوری را در پروژه های خود به کار بگیرید.
RNN چرا به وجود آمد؟
قبل از RNN، شبکه های عصبی پیش خور (Feedforward) بر کارهایی مانند تشخیص تصویر تمرکز داشتند. این شبکه ها فرض می کردند هر ورودی مستقل است. اما در دنیای واقعی، بیشتر داده ها دنباله ای هستند: جملات یک متن، کلمات یک گفتگو، قیمت های سهام در طول زمان، یا نت های موسیقی.
تصور کنید می خواهید کلمه بعدی این جمله را پیش بینی کنید: “من به بازار رفتم و …” اگر فقط به کلمه آخر “و” نگاه کنید، نمی توانید حدس بزنید که چه کلمه ای می آید. اما اگر کل جمله را به خاطر بیاورید، می فهمید که احتمالاً “خرید کردم” یا “میوه خریدم” می آید.
RNN دقیقاً برای حل این مشکل طراحی شد: حافظه. RNN یک حالت پنهان (hidden state) دارد که اطلاعات مراحل قبلی را نگه می دارد و در هر مرحله، این حافظه را به روز می کند.
ساختار ملموس RNN
یک RNN سه لایه اصلی دارد:
- لایه ورودی (Input Layer): داده دنباله ای را در هر گام زمانی می گیرد. مثلاً کلمه اول یک جمله.
- لایه پنهان (Hidden Layer): این قلب RNN است. یک برداری به نام حالت پنهان (hidden state) دارد که مانند حافظه کوتاه مدت عمل می کند.
- لایه خروجی (Output Layer): بر اساس ورودی فعلی و حالت پنهان، پیش بینی می کند.
مثال پردازش جمله
فرض کنید جمله “من هوش مصنوعی دوست دارم” را بخواهید پردازش کنید. RNN این جمله را گام به گام می خواند:
- گام ۱: کلمه “من” وارد می شود. حالت پنهان h₁ را می سازد.
- گام ۲: کلمه “هوش” وارد می شود. RNN حالت قبلی h₁ را به خاطر دارد و با ترکیب آن با “هوش”، حالت جدید h₂ را می سازد.
- گام ۳: کلمه “مصنوعی” وارد می شود. h₂ به h₃ تبدیل می شود.
- این فرآیند تا آخر جمله ادامه دارد.
فرمول دقیق به این صورت است:
h_t = tanh(W_hh × h_(t-۱) + W_xh × x_t + b_h)
y_t = W_hy × h_t + b_y
که در آن:
- h_t: حالت پنهان در گام t
- x_t: ورودی در گام t
- W ها: ماتریس های وزن (که در تمام گام ها مشترک هستند)
- tanh: تابع فعالساز (مقدار بین -۱ و ۱)
نکته کلیدی: وزن ها (W ها) در تمام گام های زمانی یکسان هستند. یعنی RNN یک لایه پنهان می سازد و آن را به تعداد گام های زمانی تکرار می کند.
RNN چگونه یاد می گیرد؟ Backpropagation Through Time
تمرین RNN متفاوت از شبکه های عصبی معمولی است. اینجا از Backpropagation Through Time (BPTT) استفاده می شود.
تصور کنید یک فیلم دارید
BPTT مانند بازبینی یک فیلم است. شما باید خطای پیش بینی در هر فریم را محاسبه کنید و این خطا را به عقب، به تمام فریم های قبلی منتقل کنید.
در یک جمله ۱۰ کلمه ای:
- خطای کلمه ۱۰م به کلمه ۹م برمی گردد.
- از کلمه ۹م به ۸م.
- این زنجیره تا کلمه اول ادامه می یابد.
فرمول
اگر L تابع خطا باشد، گرادیان وزن ها به این صورت محاسبه می شود:
∂L/∂W = Σ(∂L/∂h_T × ∂h_T/∂h_k × ∂h_k/∂W)
این جمع بندی روی تمام گام های زمانی (k=۱ تا T) انجام می شود. مشکل اینجاست که اگر ۱۰۰ گام زمانی داشته باشید، باید ۱۰۰ مشتق زنجیره ای محاسبه کنید. این باعث می شود BPTT کند و حافظه بر باشد .
مشکل بزرگ: ناپدید شدن گرادیان
مهم ترین چالش RNN، Vanishing Gradient Problem است. فرض کنید از تابع فعالساز Sigmoid استفاده می کنید. مشتق این تابع حداکثر ۰.۲۵ است.
اگر یک جمله ۱۰ کلمه ای داشته باشید، گرادیان باید ۹ بار ضرب شود:
(۰.۲۵)^۹ = ۰.۰۰۰۰۰۳۸
این عدد بسیار کوچک است! یعنی وزن های لایه های اولیه تقریباً هیچ یاد نمی گیرند . در عمل، اگر فاصله بین دو کلمه معنادار بیش از ۱۰-۱۵ کلمه باشد، RNN استاندارد آن را فراموش می کند.
تأثیر عملی
در جمله “من دیروز به کتابخانه رفتم و کتاب مورد علاقه ام را پیدا کردم، امروز…” اگر RNN نتواند ارتباط بین “دیروز” و “کتاب” را حفظ کند، متن را بد ترجمه می کند.
راهکارهای عملی: LSTM و GRU
برای حل این مشکل، دو نوع RNN پیشرفته ساخته شدند.
LSTM (Long Short-Term Memory)
LSTM یک سلول حافظه (cell state) دارد که مانند یک بزرگراه اطلاعات عمل می کند. سه دروازه (gate) دارد:
- دروازه فراموشی (Forget Gate): تصمیم می گیرد چه اطلاعاتی از حافظه حذف شود.
- دروازه ورودی (Input Gate): اطلاعات جدید را به حافظه اضافه می کند.
- دروازه خروجی (Output Gate): تصمیم می گیرد چه اطلاعاتی به عنوان خروجی استفاده شود.
مثال: در جمله “من سیب، موز و پرتقال می خرم. میوه ها سالم هستند.”، LSTM با دروازه فراموشی می تواند از حذف “سیب” جلوگیری کند و با دروازه ورودی، “میوه ها” را به حافظه اضافه کند.
GRU (Gated Recurrent Unit)
GRU ساده تر است و دو دروازه دارد:
- دروازه به روزرسانی (Update Gate): ترکیبی از دروازه ورودی و فراموشی LSTM
- دروازه بازنشانی (Reset Gate): کنترل می کند چه اطلاعاتی از حافظه قبلی استفاده شود
تفاوت ملموس :
- LSTM: ۳ دروازه + سلول حافظه جداگانه → پیچیده تر، دقت بالاتر در دنباله های خیلی طولانی
- GRU: ۲ دروازه، حافظه ادغام شده → سریع تر، ۳۰٪ پارامتر کمتر، مناسب برای دستگاه های کم حافظه
کدام را انتخاب کنید؟
- برای ترجمه ماشینی طولانی → LSTM
- برای دستیار صوتی روی موبایل → GRU
کاربردهای شبکه عصبی بازگشتی در دنیای واقعی
RNN در دنیای فناوری زیاد استفاده میشود در ادامه به بعضی از این کاربردها اشاره خواهیم کرد.
۱. بازشناسی گفتار (Speech Recognition)
در سرویس هایی مانند Google Assistant، صدای شما به دنباله ای از سیگنال های صوتی تبدیل می شود. RNN این دنباله را پردازش می کند و به کلمات متنی تبدیل می کند. GRU معمولاً در اینجا استفاده می شود چون سرعت پاسخ سریع مهم است .
۲. تولید متن (Text Generation)
در پروژه تنسورفلو، RNN روی تمام آثار شکسپیر آموزش دیده است. وقتی “ROMEO:” را به آن می دهد، متن زیر را تولید می کند:
QUEENE:
I had thought thou hadst a Roman; for the oracle,
Thus by All bids the man against the word...
با وجود اینکه جملات کامل معنادار نیستند، ساختار نمایشنامه ای (نام شخصیت + دیالوگ) را یاد گرفته است .
۳. پیش بینی سری زمانی (Time Series Forecasting)
برای پیش بینی قیمت سهام، RNN (شبکه عصبی بازگشتی) ۶۰ روز قیمت قبلی را می خواند و روز ۶۱ام را پیش بینی می کند. کد عملی در Python:
# ساخت دیتاست با پنجره ۶۰ روزه
def create_dataset(data, time_step=۶۰):
X, y = [], []
for i in range(len(data) - time_step - ۱):
X.append(data[i:(i + time_step), ۰])
y.append(data[i + time_step, ۰])
return np.array(X), np.array(y)
# ساخت مدل RNN
model = Sequential()
model.add(SimpleRNN(units=۵۰, return_sequences=True,
input_shape=(X_train.shape[۱], ۱)))
model.add(SimpleRNN(units=۵۰))
model.add(Dense(units=۱))
این کد دقیقاً همان است که در پروژه های مالی استفاده می شود .
۴. پردازش زبان فارسی
در پروژه های تحلیل احساسات فارسی (مثل نظرات کاربران دیجی کالا)، RNN کلمات را یک به یک پردازش می کند. کلمه “عالی” در انتهای جمله با توجه به کلمات قبلی مثل “محصول” و “کیفیت” معنای مثبت پیدا می کند.
Transformers در مقابل RNN
شبکه های عصبی بازگشتی (RNN) سال ها ابزار اصلی برای پردازش داده های دنباله ای بودند. آن ها توانستند در حوزه هایی مثل ترجمه ماشینی، بازشناسی گفتار و پیش بینی سری زمانی نقش مهمی ایفا کنند. اما با گذشت زمان، محدودیت های جدی RNN آشکار شد و پژوهشگران به دنبال معماری های جدیدی رفتند. همین جاست که Transformer وارد صحنه شد و با رویکردی متفاوت توانست بسیاری از مشکلات RNN را برطرف کند.
محدودیت های RNN
- پردازش متوالی: RNN باید کلمه ۱ را پردازش کند، بعد ۲، بعد ۳… این مانند خواندن کتاب با چشم بسته روی یک کلمه. نمی توانید کل صفحه را یک باره ببینید.
- حافظه محدود: حتی LSTM بعد از ۵۰-۱۰۰ کلمه دچار مشکل می شود .
- کندی: نمی تواند از GPU برای پردازش موازی استفاده کند.
رهبر جدید: Transformer
Transformer با Self-Attention تمام کلمات جمله را هم زمان نگاه می کند. مثلاً در جمله “The cat sat on the mat”، برای کلمه “sat” می فهمد که بیشترین ارتباط را با “cat” دارد.
مقایسه:
| ویژگی | RNN | Transformer |
|---|---|---|
| سرعت | ۱۰ روز برای آموزش مدل زبان | ۲ روز (با GPU) |
| حافظه | فراموش کردن بعد ۱۰۰ کلمه | درک ارتباط بین ۵۰۰۰ کلمه |
| پارامتر | ۱۰۰ میلیون | ۱۷۵ میلیارد (GPT-۳) |
آیا RNN هنوز ارزش دارد؟
بله! برای:
- دستگاه های IoT کم حافظه → GRU ساده تر است
- پیش بینی سری زمانی کوتاه → RNN سریع تر
- پروژه های دانشجویی → نیاز به منابع کمتر
شروع عملی با کد
در کد زیر، یک RNN برای تولید متن ساخته ایم:
# لایه StringLookup: تبدیل کاراکتر به عدد
ids_from_chars = tf.keras.layers.StringLookup(
vocabulary=list(vocab), mask_token=None)
# مدل RNN با ۲ لایه
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim),
tf.keras.layers.GRU(rnn_units, return_sequences=True),
tf.keras.layers.Dense(vocab_size)
])
# تولید متن
one_step_model = OneStep(model, chars_from_ids, ids_from_chars)
states = None
next_char = tf.constant(['ROMEO:'])
result = [next_char]
for n in range(۱۰۰۰):
next_char, states = one_step_model.generate_one_step(
next_char, states=states)
result.append(next_char)
این کد دقیقاً همان الگویی است که در ChatGPT اولیه استفاده شد .
چه باید بکنید؟
شما اکنون فهمیدید که:
- RNN ابزار حافظه دار برای داده های دنباله ای است
- LSTM/GRU مشکل ناپدید شدن گرادیان را حل می کنند
- Transformers قدرتمندتر اما سنگین تر هستند
پیشنهاد لرنادو برای شما:
- برای پروژه های کوتاه مدت: از GRU در Keras شروع کنید.
- برای زبان فارسی: مجموعه داده های ParsBERT را بررسی کنید.
- برای یادگیری عمیق: تمرین تولید متن شکسپیر را در TensorFlow اجرا کنید .
RNN ممکن است دیگر ستاره اصلی نباشد، اما مانند چکش در جعبه ابزار هوش مصنوعی، برای کارهای خاص هنوز ضروری است. شما تصمیم می گیرید چه زمانی از آن استفاده کنید .