.. _sec_deep_rnn:
Derin Yinelemeli Sinir Ağları
=============================
Ş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, :numref:`fig_deep_rnn`
şeklini inceleyerek ilgilendiğimiz model ailesini anlamak muhtemelen en
kolay yoldur. :math:`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_deep_rnn:
.. figure:: ../img/deep-rnn.svg
Derin RNN mimarisi.
Fonksiyonel Bağlılıklar
-----------------------
:numref:`fig_deep_rnn` içinde tasvir edilen :math:`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 :math:`t` zaman adımında
:math:`\mathbf{X}_t \in \mathbb{R}^{n \times d}` minigrup girdisine
sahip olduğumuzu varsayalım (örnek sayısı: :math:`n`, her örnekte girdi
sayısı: :math:`d`). Aynı zamanda adımda, :math:`l.` gizli katmanın
(:math:`l=1,\ldots,L`),
:math:`\mathbf{H}_t^{(l)} \in \mathbb{R}^{n \times h}` gizli durumunun
(gizli birimlerin sayısı: :math:`h`) ve
:math:`\mathbf{O}_t \in \mathbb{R}^{n \times q}` çıktı katmanı
değişkeninin (çıktı sayısı: :math:`q`) olduğunu varsayalım.
:math:`\mathbf{H}_t^{(0)} = \mathbf{X}_t`, :math:`\phi_l` etkinleştirme
işlevini kullanan :math:`l.` gizli katmanın gizli durumu aşağıdaki gibi
ifade edilir:
.. math:: \mathbf{H}_t^{(l)} = \phi_l(\mathbf{H}_t^{(l-1)} \mathbf{W}_{xh}^{(l)} + \mathbf{H}_{t-1}^{(l)} \mathbf{W}_{hh}^{(l)} + \mathbf{b}_h^{(l)}),
:label: eq_deep_rnn_H
burada :math:`\mathbf{W}_{xh}^{(l)} \in \mathbb{R}^{h \times h}` ve
:math:`\mathbf{W}_{hh}^{(l)} \in \mathbb{R}^{h \times h}` ağırlıkları
:math:`\mathbf{b}_h^{(l)} \in \mathbb{R}^{1 \times h}` ek girdisi ile
birlikte :math:`l.` gizli katmanın model parametreleridir.
Sonunda, çıktı katmanının hesaplanması yalnızca son :math:`L`. gizli
katmanın gizli durumuna dayanır:
.. math:: \mathbf{O}_t = \mathbf{H}_t^{(L)} \mathbf{W}_{hq} + \mathbf{b}_q,
burada ağırlık :math:`\mathbf{W}_{hq} \in \mathbb{R}^{h \times q}` ve ek
girdi :math:`\mathbf{b}_q \in \mathbb{R}^{1 \times q}`, çıktı katmanının
model parametreleridir.
MLP'lerde olduğu gibi, :math:`L` gizli katmanların sayısı ve :math:`h`
gizli birimlerin sayısı hiper parametrelerdir. Başka bir deyişle, bunlar
bizim tarafımızdan ayarlanabilir veya belirtilebilir. Buna ek olarak,
:eq:`eq_deep_rnn_H` denklemindeki gizli durum hesaplamalarını GRU
veya LSTM ile değiştirerek bir derin geçitli RNN elde edebiliriz.
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
:numref:`sec_lstm` 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.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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)
.. raw:: html
.. raw:: html
Hiper parametre seçimi gibi mimari kararlar :numref:`sec_lstm`
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.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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))
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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))
.. raw:: html
.. raw:: html
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.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
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
.. figure:: output_deep-rnn_d70a11_27_1.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, device)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
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
.. figure:: output_deep-rnn_d70a11_30_1.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
num_epochs, lr = 500, 2
d2l.train_ch8(model, train_iter, vocab, lr, num_epochs, strategy)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
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
.. figure:: output_deep-rnn_d70a11_33_1.svg
.. raw:: html
.. raw:: html
Ö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).
Alıştırmalar
------------
1. :numref:`sec_rnn_scratch` içinde tartıştığımız tek katmanlı
uygulamayı kullanarak sıfırdan iki katmanlı bir RNN uygulamaya
çalışın.
2. LSTM'yi GRU ile değiştirin ve doğruluk ve eğitim hızını
karşılaştırın.
3. Eğitim verilerini birden fazla kitap içerecek şekilde artırın.
Şaşkınlık ölçeğinde ne kadar düşüğe inebilirsin?
4. Metni modellerken farklı yazarların kaynaklarını birleştirmek ister
misiniz? Bu neden iyi bir fikir? Ne ters gidebilir ki?
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html