9.3. Derin Yinelemeli Sinir Ağları¶ Open the notebook in SageMaker Studio Lab
Şimdiye kadar, tek bir tek yönlü gizli katmanlı RNN’leri tartıştık. İçinde gizli değişkenlerin ve gözlemlerin nasıl etkileşime girdiğinin özgül fonksiyonel formu oldukça keyfidir. Farklı etkileşim türlerini modellemek için yeterli esnekliğe sahip olduğumuz sürece bu büyük bir sorun değildir. Bununla birlikte, tek bir katman ile, bu oldukça zor olabilir. Doğrusal modellerde, daha fazla katman ekleyerek bu sorunu düzelttik. RNN’ler içinde bu biraz daha zor, çünkü öncelikle ek doğrusal olmayanlığın nasıl ve nerede ekleneceğine karar vermemiz gerekiyor.
Aslında, birden fazla RNN katmanını üst üste yığabiliriz. Bu, birkaç basit katmanın kombinasyonu sayesinde esnek bir mekanizma ile sonuçlanır. Özellikle, veriler yığının farklı düzeylerinde alakalı olabilir. Örneğin, finansal piyasa koşulları (hisse alım ve satım piyasası) ile ilgili üst düzey verileri elimizde mevcut tutmak isteyebiliriz, ancak daha düşük bir seviyede yalnızca kısa vadeli zamansal dinamikleri kaydederiz.
Yukarıdaki soyut tartışmaların ötesinde, Fig. 9.3.1 şeklini inceleyerek ilgilendiğimiz model ailesini anlamak muhtemelen en kolay yoldur. \(L\) adet gizli katmanlı derin bir RNN’yı göstermektedir. Her gizli durum, hem geçerli katmanın bir sonraki zaman adımına hem de bir sonraki katmanın şu anki zaman adımına sürekli olarak iletilir.
Fig. 9.3.1 Derin RNN mimarisi.¶
9.3.1. Fonksiyonel Bağlılıklar¶
Fig. 9.3.1 içinde tasvir edilen \(L\) gizli katmanın derin mimarisi içindeki işlevsel bağımlıkları formülize edebiliriz. Aşağıdaki tartışmamız öncelikle sıradan RNN modeline odaklanmaktadır, ancak diğer dizi modelleri için de geçerlidir.
Bir \(t\) zaman adımında \(\mathbf{X}_t \in \mathbb{R}^{n \times d}\) minigrup girdisine sahip olduğumuzu varsayalım (örnek sayısı: \(n\), her örnekte girdi sayısı: \(d\)). Aynı zamanda adımda, \(l.\) gizli katmanın (\(l=1,\ldots,L\)), \(\mathbf{H}_t^{(l)} \in \mathbb{R}^{n \times h}\) gizli durumunun (gizli birimlerin sayısı: \(h\)) ve \(\mathbf{O}_t \in \mathbb{R}^{n \times q}\) çıktı katmanı değişkeninin (çıktı sayısı: \(q\)) olduğunu varsayalım. \(\mathbf{H}_t^{(0)} = \mathbf{X}_t\), \(\phi_l\) etkinleştirme işlevini kullanan \(l.\) gizli katmanın gizli durumu aşağıdaki gibi ifade edilir:
burada \(\mathbf{W}_{xh}^{(l)} \in \mathbb{R}^{h \times h}\) ve \(\mathbf{W}_{hh}^{(l)} \in \mathbb{R}^{h \times h}\) ağırlıkları \(\mathbf{b}_h^{(l)} \in \mathbb{R}^{1 \times h}\) ek girdisi ile birlikte \(l.\) gizli katmanın model parametreleridir.
Sonunda, çıktı katmanının hesaplanması yalnızca son \(L\). gizli katmanın gizli durumuna dayanır:
burada ağırlık \(\mathbf{W}_{hq} \in \mathbb{R}^{h \times q}\) ve ek girdi \(\mathbf{b}_q \in \mathbb{R}^{1 \times q}\), çıktı katmanının model parametreleridir.
MLP’lerde olduğu gibi, \(L\) gizli katmanların sayısı ve \(h\) gizli birimlerin sayısı hiper parametrelerdir. Başka bir deyişle, bunlar bizim tarafımızdan ayarlanabilir veya belirtilebilir. Buna ek olarak, (9.3.1) denklemindeki gizli durum hesaplamalarını GRU veya LSTM ile değiştirerek bir derin geçitli RNN elde edebiliriz.
9.3.2. Kısa Uygulama¶
Neyse ki, bir RNN’nin birden fazla katmanını uygulamak için gerekli olan lojistik detayların çoğu, üst düzey API’lerde kolayca mevcuttur. İşleri basit tutmak için sadece bu tür yerleşik işlevleri kullanarak uygulamayı gösteriyoruz. Örnek olarak bir LSTM modelini ele alalım. Kod, daha önce Section 9.2 içinde kullandığımıza çok benzer. Aslında, tek fark, tek bir katmanlı varsayılanı seçmek yerine açıkça katman sayısını belirtmemizdir. Her zamanki gibi, veri kümesini yükleyerek başlıyoruz.
from d2l import mxnet as d2l
from mxnet import npx
from mxnet.gluon import rnn
npx.set_np()
batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
import torch
from torch import nn
from d2l import torch as d2l
batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
import tensorflow as tf
from d2l import tensorflow as d2l
batch_size, num_steps = 32, 35
train_iter, vocab = d2l.load_data_time_machine(batch_size, num_steps)
Hiper parametre seçimi gibi mimari kararlar Section 9.2
içindekine çok benzer. Farklı andıçlara sahip olduğumuz için aynı sayıda
girdi ve çıktı seçiyoruz, yani vocab_size
. Gizli birimlerin sayısı
hala 256’dır. Tek fark, şimdi apaçık olmayan gizli katmanların sayısını
num_layers
değerini belirterek seçmemizdir.
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
device = d2l.try_gpu()
lstm_layer = rnn.LSTM(num_hiddens, num_layers)
model = d2l.RNNModel(lstm_layer, len(vocab))
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
num_inputs = vocab_size
device = d2l.try_gpu()
lstm_layer = nn.LSTM(num_inputs, num_hiddens, num_layers)
model = d2l.RNNModel(lstm_layer, len(vocab))
model = model.to(device)
vocab_size, num_hiddens, num_layers = len(vocab), 256, 2
num_inputs = vocab_size
device_name = d2l.try_gpu()._device_name
strategy = tf.distribute.OneDeviceStrategy(device_name)
rnn_cells = [tf.keras.layers.LSTMCell(num_hiddens) for _ in range(num_layers)]
stacked_lstm = tf.keras.layers.StackedRNNCells(rnn_cells)
lstm_layer = tf.keras.layers.RNN(stacked_lstm, time_major=True,
return_sequences=True, return_state=True)
with strategy.scope():
model = d2l.RNNModel(lstm_layer, len(vocab))
9.3.3. Eğitim ve Tahmin¶
Şu andan itibaren LSTM modeli ile iki katman oluşturuyoruz, bu oldukça karmaşık mimari eğitimi önemli ölçüde yavaşlatıyor.
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
perplexity 1.1, 112786.7 tokens/sec on gpu(0)
time travelleryou can show black is white by argument said filby
traveller are you sure we can move freely inspace right and
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
perplexity 1.0, 215250.2 tokens/sec on cuda:0
time travelleryou can show black is white by argument said filby
traveller with a slight accession ofcheerfulness really thi
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, strategy)
perplexity 1.0, 4248.7 tokens/sec on /GPU:0
time traveller for so it will be convenient to speak of himwas e
travelleryou can show black is white by argument said filby
9.3.4. Özet¶
Derin RNN’lerde, gizli durum bilgileri şu anki katmanın sonraki zaman adımına ve sonraki katmanın şu anki zaman adımına geçirilir.
LSTM’ler, GRU’lar veya sıradan RNN gibi derin RNN’lerin birçok farklı seçenekleri vardır. Bu modellerin tümü, derin öğrenme çerçevesinin üst düzey API’lerinin bir parçası olarak mevcuttur.
Modellerin ilklenmesi dikkat gerektirir. Genel olarak, derin RNN’ler doğru yakınsamayı sağlamak için önemli miktarda iş gerektirir (öğrenme hızı ve kırpma gibi).
9.3.5. Alıştırmalar¶
Section 8.5 içinde tartıştığımız tek katmanlı uygulamayı kullanarak sıfırdan iki katmanlı bir RNN uygulamaya çalışın.
LSTM’yi GRU ile değiştirin ve doğruluk ve eğitim hızını karşılaştırın.
Eğitim verilerini birden fazla kitap içerecek şekilde artırın. Şaşkınlık ölçeğinde ne kadar düşüğe inebilirsin?
Metni modellerken farklı yazarların kaynaklarını birleştirmek ister misiniz? Bu neden iyi bir fikir? Ne ters gidebilir ki?