Recurrent Neural Networks
جلسات پیش با RNN ها آشنا شدیم و با ساختن یک language مدل توانستیم مدلی طراحی کنیم که یک کلمه را دریافت کند و کلمات بعدی را حدس بزند.
در ادامه به بررسی شبکه های LSTM و GRU میپردازیم.
یادآوری:
شبکه ی RNNشامل تعدادی Hidden نورون است که این Hidden نورون ها تکرار میشوند به طوری که انگار در طول زمان باز و تکرار میشوند.
Notations:
X1,X2,….Xn ورودی های شبکه هستند که به مرور زمان به شبکه میدهیم به طور مثال اگر بخواهیم کلمه کلمه به شبکه بدهیم ابتدا X1 , … الی آخر پشت هم می آیند. این ورودی ها شامل یک سری وزن هستند که با Wax نمایش میدهیم و یک سری وزن که از state مرحله ی قبلی ورودی میگیرد که همان حافظه ی ما و خروجی را تشکیل میداد .
a : خلاصه ای از ورودی های قبلی است که دار ی حافظه است و براسا ورودی هی قبلی و ورودی فعلی تصمبم میگیرد.
Simple syntax RNN:
برای ساده تر شدن از این پس تنها یک بردار وزن برای X و a خواهیم داشت که در کنار هم این دو Concatمیشوند.
در نهایت :
مشکل RNNها :
استفاده از این شبکه برای جملات کوتاه مشکلی ایجاد نمی کند.اما اگر جمله ی ما ادامه پیدا کند این شبکه نمیتواند به صورت Long Term جمله را حفظ کند و اصطلاحا مشکل Wanishing Gradiant به وجود میاید .
RNN Unit:
مطابق شکل یک وزنی داریم که در concat شده ی ورودی و stateقبلی ضرب میشود و به activation function داده میشوند که y hatما را تشکیل میدهد.
GRU:
برای حل مشکل Wanishing Gradiant برای جملاتی مثل :
The cat, which already ate …, was full.
برای اینکه بدانیم در جای خالی با توجه به ضمیر چه چیزی به کار ببریم نیاز داریم حافظه ی طولانی تری داشته باشیم .
در gru به state که داریم c میگوییم که مخفف cell است .به عبارتی cهمان <a<t قبلی است .
بجای مشخص شدن stateجاری یک stateپیشنهادی داریم~C که کاندیدی برای stateجاری است که هنوز به صورت قطعی قرار نیست stateجاری باشد.
ورودی جاری و state قبلی در هم concatشده و در وزن Wc ضرب میشوند.
GRU Simplified:
تفاوت با RNNساده :
یک سری گیت اضافه شده برای بررسی پذیرش کاندید state
برای بررسی آپدیت گیت یک activation function sigmoid داریم .(0:بروز نکن ,1:بروز کن)
رای تعیین <C<t اگر Г آپدیت برابر با 1 بود بروز رسانی صورت میگیرد و اگر 0 باشد , کاندید state را نمیپذیرد و stateمرحله قبل را در نظر میگیرد.
Full Gru:
در Full GRU یک گیت جدید اضافه میکنیم که بررسی میکند stateمرحله قبل چقدر به context جاری مربوط میشود.
activation function گیت جدید یک sigmoid است که مقدار 0 یا 1 برمیگرداند و تصمیم میگیرد حافظه قبلی چقدر به ورودی جاری مربوط میشود و براساس ورودی میتواند تصمیم بگیرد ,گیت حافظه را برای خروجی دادن این state در نظر بگیرد یا خیر.
LSTM:
شبکههای LSTM که خلاصه شده عبارت “Long Short Term Memory” هستند، نوع خاصی از شبکههای عصبی بازگشتی هستند که توانائی یادگیری وابستگیهای بلندمدت را دارند و مشکل wanishing gradiant حل کردند.این شبکهها برای اولین بار توسط Hochreiter و Schmidhuber در سال ۱۹۹۷ معرفی شدند.
در حقیقت هدف از طراحی شبکههای LSTM، حل کردن مشکل وابستگی بلندمدت بود. به این نکته مهم توجه کنید که به یاد سپاری اطلاعات برای بازههای زمانی بلند مدت، رفتار پیشفرض و عادی شبکههای LSTM است و ساختار آنها به صورتی است که اطلاعات خیلی دور را به خوبی یاد میگیرند که این ویژگی در ساختار آنها نهفته است.
مقایسه بین LSTM و GRU
در lstm گیت Γr نداریم این گیت مشخص میکند چه میزان از حافظه را دخیل کند اگر 0 باشد به طور کلی اثر حافظه را از بین میبرد,میتوان قرار داد اما ضروری نیست.
lstmدر مقایسه با gru تعداد گیت های بیشتری دارد. در lstm برای فراموش کردن هم یک گیت اضافه شده و مشخص میکند برای برای بازنویسی< C<t چه میزان کاندید state را تاثیر بدهیم به عبارتی چقدر بخاطر بسپرد و چقدر فراموش کند.
Bidirectional RNN:
ماژول تکرار در RNN دو طرفه می تواند RNN معمولی، LSTM یا GRU باشد. ساختار و اتصالات یک RNN دو طرفه در شکل زیر نشان داده شده است. دو نوع ارتباط وجود دارد که یکی از آن ها در زمان پیش می رود که به ما کمک می کند تا از بازنمایی های قبلی یاد بگیریم و دیگر به عقب بازگردیم، که به ما در بازنمایی های آینده کمک می کند. مثلا ما دیتای آفلاین داریم مثل ویدیو یا یک متن
Deep Rnn:
مطابق شکل state مرحله قبل که رسیده توی کروشه 1 در نظر گرفته شده یعنی برای لایه اول و برای هر لایه عدد کروشه متفاوت است .در هر مرحله state ایجاد میکنند و به مرحله ی بعدی میروند .میتوانیم این state را به یک softmax و یا sigmiodوصل کنیم .این state ها زمانی که شروع میشوند با 0 مقدار دهی میشوند ,لایه ها روی هم stack شده و یک شبکه دیپ ایجاد میکنند .y های خروجی قرار است برای ما چیزی حساب کنند در طول زمان X دریافت کرده اند و یک state خود yهم چند لایه است ,میتوانیم مستقل از دیپ بودن قبلش خروجی لایه را به یک شبکه cnnبدهیم :
استفاده از خروجی y :
تولید متن با شبکه بازگشتی LSTM در Keras
در این مثال به پیاده سازی یک شبکه lstm میپردازیم که بر روی کتاب فیلسوف آلمانی نیچه به صورت
character-level پیاده سازی شده.
ابتدا مجموعه داده را بارگذاری میکنیم:
1 2 3 4 5 6 7 8 |
import keras import numpy as np path = keras.utils.get_file( 'nietzsche.txt', origin='https://s3.amazonaws.com/text-datasets/nietzsche.txt') text = open(path).read().lower() print('Corpus length:', len(text)) |
توسط maxlen مشخص میکنیم به شبکه چند حرف چند حرف بدیم . در این مثال طول کلمات 60 تایی است و ممکن است این 60 تا وسط کلمه تمام شود یا بیشنر از طول رشته ی ورودی باشد.
در for زیر کاراکتر 61 ام به عنوان label در نظر گرفته میشود.
توسط setنیز تعداد کاراکتر های یونیک را مشخص میکنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# Length of extracted character sequences maxlen = 60 # We sample a new sequence every `step` characters step = 3 # This holds our extracted sequences sentences = [] # This holds the targets (the follow-up characters) next_chars = [] for i in range(0, len(text) - maxlen, step): sentences.append(text[i: i + maxlen]) next_chars.append(text[i + maxlen]) print('Number of sequences:', len(sentences)) # List of unique characters in the corpus chars = sorted(list(set(text))) print('Unique characters:', len(chars)) # Dictionary mapping unique characters to their index in `chars` char_indices = dict((char, chars.index(char)) for char in chars) # Next, one-hot encode the characters into binary arrays. print('Vectorization...') x = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool) y = np.zeros((len(sentences), len(chars)), dtype=np.bool) for i, sentence in enumerate(sentences): for t, char in enumerate(sentence): x[i, t, char_indices[char]] = 1 y[i, char_indices[next_chars[i]]] = 1 |
ایجاد شبکه (Building the network)
1 2 3 4 5 6 7 |
from keras import layers model = keras.models.Sequential() model.add(layers.LSTM(128, input_shape=(maxlen, len(chars)))) model.add(layers.Dense(len(chars), activation='softmax')) optimizer = keras.optimizers.RMSprop(lr=0.01) model.compile(loss='categorical_crossentropy', optimizer=optimizer) |
این کدی است که ما برای توزیع احتمالی اصلی خارج از مدل استفاده می کنیم و یک شاخص کاراکتر را از آن به دست می آوریم. میدانیم predict دقیقا 0 و 1 نیست .در این جا نقش temperature این است که براساس احتمالات رندم انتخاب کند.هر چقدر temperature بیشتر باشد احتمال نفر اول را بیشتر نشان میدهد.
1 2 3 4 5 6 7 |
def sample(preds, temperature=1.0): preds = np.asarray(preds).astype('float64') preds = np.log(preds) / temperature exp_preds = np.exp(preds) preds = exp_preds / np.sum(exp_preds) probas = np.random.multinomial(1, preds, 1) return np.argmax(probas) |
و در نهایت ایجاد متن
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import random import sys for epoch in range(1, 60): print('epoch', epoch) # Fit the model for 1 epoch on the available training data model.fit(x, y, batch_size=128, epochs=1) # Select a text seed at random start_index = random.randint(0, len(text) - maxlen - 1) generated_text = text[start_index: start_index + maxlen] print('--- Generating with seed: "' + generated_text + '"') for temperature in [0.2, 0.5, 1.0, 1.2]: print('------ temperature:', temperature) sys.stdout.write(generated_text) # We generate 400 characters for i in range(400): sampled = np.zeros((1, maxlen, len(chars))) for t, char in enumerate(generated_text): sampled[0, t, char_indices[char]] = 1. preds = model.predict(sampled, verbose=0)[0] next_index = sample(preds, temperature) next_char = chars[next_index] generated_text += next_char generated_text = generated_text[1:] sys.stdout.write(next_char) sys.stdout.flush() print() |
نمونه خروجی متن ایجاد شده :
1 2 3 |
self in the self in the self in the self in the self in the same and perhaps of the man of make one consupertaon of the whole of the religion and continter the are my, and here of a free in the gan the self-contition of the belief and the pruble of the religious fact, the most the perhaps and and perhaps the the different to the complice of the are the present the gard every provioning of the german destranged us the one of the probleass of the soul in the |
شبکه های اجتماعی