" belirteçleri de içerdiğini unutmayın.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
vocab = d2l.Vocab(sentences, min_freq=10)
f'vocab size: {len(vocab)}'
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'vocab size: 6719'
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
vocab = d2l.Vocab(sentences, min_freq=10)
f'vocab size: {len(vocab)}'
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'vocab size: 6719'
.. raw:: html
.. raw:: html
Alt Örnekleme
-------------
Metin verileri genellikle "the", "a" ve "in" gibi yüksek frekanslı
sözcüklere sahiptir: Hatta çok büyük külliyatta milyarlarca kez ortaya
çıkabilirler. Ancak, bu sözcükler genellikle bağlam pencerelerinde
birçok farklı sözcükle birlikte ortaya çıkar ve çok az yararlı sinyaller
sağlar. Örneğin, bir bağlam penceresinde ("çip") "chip" sözcüğünü göz
önünde bulundurun: Sezgisel olarak düşük frekanslı bir "intel"
sözcüğüyle birlikte oluşması, eğitimde yüksek frekanslı bir sözcük "a"
ile birlikte oluşmasından daha yararlıdır. Dahası, büyük miktarda
(yüksek frekanslı) sözcüklerle eğitim yavaştır. Böylece, sözcük gömme
modellerini eğitiyorken, yüksek frekanslı sözcükler *alt örneklenebilir*
:cite:`Mikolov.Sutskever.Chen.ea.2013`. Özellikle, veri kümesindeki
dizine alınmış her bir :math:`w_i` sözcüğü aşağıdaki olasılıkla
atılacaktır.
.. math:: P(w_i) = \max\left(1 - \sqrt{\frac{t}{f(w_i)}}, 0\right),
burada :math:`f(w_i)`, :math:`w_i` sözcüklerinin sayısının veri
kümelerindeki toplam sözcük sayısına oranıdır ve :math:`t` sabit
(deneyde :math:`10^{-4}`) bir hiper parametredir. Sadece göreli frekans
:math:`f(w_i) > t` (yüksek frekanslı) olursa :math:`w_i` sözcüğü
atılabilir ve sözcüğün göreli frekansı ne kadar yüksek olursa, atılma
olasılığı o kadar yüksektir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def subsample(sentences, vocab):
"""Yüksek frekanslı sözcükleri alt örnekle."""
# '' andıçlarını hariç tut
sentences = [[token for token in line if vocab[token] != vocab.unk]
for line in sentences]
counter = d2l.count_corpus(sentences)
num_tokens = sum(counter.values())
# Alt örnekleme sırasında `token` tutulursa True döndür
def keep(token):
return(random.uniform(0, 1) <
math.sqrt(1e-4 / counter[token] * num_tokens))
return ([[token for token in line if keep(token)] for line in sentences],
counter)
subsampled, counter = subsample(sentences, vocab)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def subsample(sentences, vocab):
"""Yüksek frekanslı sözcükleri alt örnekle."""
# '' andıçlarını hariç tut
sentences = [[token for token in line if vocab[token] != vocab.unk]
for line in sentences]
counter = d2l.count_corpus(sentences)
num_tokens = sum(counter.values())
# Alt örnekleme sırasında `token` tutulursa True döndür
def keep(token):
return(random.uniform(0, 1) <
math.sqrt(1e-4 / counter[token] * num_tokens))
return ([[token for token in line if keep(token)] for line in sentences],
counter)
subsampled, counter = subsample(sentences, vocab)
.. raw:: html
.. raw:: html
Aşağıdaki kod parçacığı, alt örnekleme öncesi ve sonrasında cümle başına
belirteç sayısının histogramını çizer. Beklendiği gibi, alt örnekleme,
yüksek frekanslı sözcükleri düşürerek cümleleri önemli ölçüde kısaltır
ve bu da eğitim hızlandırmasına yol açacaktır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
d2l.show_list_len_pair_hist(['origin', 'subsampled'], '# tokens per sentence',
'count', sentences, subsampled);
.. figure:: output_word-embedding-dataset_f77071_39_0.svg
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
d2l.show_list_len_pair_hist(['origin', 'subsampled'], '# tokens per sentence',
'count', sentences, subsampled);
.. figure:: output_word-embedding-dataset_f77071_42_0.svg
.. raw:: html
.. raw:: html
Bireysel belirteçler için, yüksek frekanslı "the" sözcüğünün örnekleme
oranı 1/20'den azdır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def compare_counts(token):
return (f'# of "{token}": '
f'before={sum([l.count(token) for l in sentences])}, '
f'after={sum([l.count(token) for l in subsampled])}')
compare_counts('the')
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'# of "the": before=50770, after=2045'
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
def compare_counts(token):
return (f'# of "{token}": '
f'before={sum([l.count(token) for l in sentences])}, '
f'after={sum([l.count(token) for l in subsampled])}')
compare_counts('the')
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'# of "the": before=50770, after=2090'
.. raw:: html
.. raw:: html
Buna karşılık, düşük frekanslı "join" sözcüğü tamamen tutulur.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
compare_counts('join')
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'# of "join": before=45, after=45'
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
compare_counts('join')
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'# of "join": before=45, after=45'
.. raw:: html
.. raw:: html
Alt örneklemeden sonra, belirteçleri külliyat için indekslerine
eşliyoruz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
corpus = [vocab[line] for line in subsampled]
corpus[:3]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[[], [2, 392, 32, 2115, 145, 406], [12, 5277, 3054, 1580]]
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
corpus = [vocab[line] for line in subsampled]
corpus[:3]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[[], [392, 2115, 18], [22, 5277, 3054, 1580]]
.. raw:: html
.. raw:: html
Merkezi Sözcükleri ve Bağlam Sözcüklerini Ayıklamak
---------------------------------------------------
Aşağıdaki ``get_centers_and_contexts`` işlevi, ``corpus``'ten tüm merkez
sözcükleri ve onların bağlam sözcüklerini ayıklar. Bağlam penceresi
boyutu olarak rastgele olarak 1 ile ``max_window_size`` arasında bir
tamsayıya eşit olarak örnekler. Herhangi bir merkez sözcük için,
uzaklığı örneklenen bağlam penceresi boyutunu aşmayan sözcükler, bağlam
sözcükleridir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def get_centers_and_contexts(corpus, max_window_size):
"""skip-gramdaki merkez sözcüklerini ve bağlam sözcüklerini döndürür."""
centers, contexts = [], []
for line in corpus:
# Bir "merkez sözcük-bağlam sözcüğü" çifti oluşturmak için
# her cümlede en az 2 kelime olması gerekir
if len(line) < 2:
continue
centers += line
for i in range(len(line)): # `i` merkezli bağlam penceresi
window_size = random.randint(1, max_window_size)
indices = list(range(max(0, i - window_size),
min(len(line), i + 1 + window_size)))
# Merkez sözcüğü bağlam sözcüklerinden çıkar
indices.remove(i)
contexts.append([line[idx] for idx in indices])
return centers, contexts
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def get_centers_and_contexts(corpus, max_window_size):
"""skip-gramdaki merkez sözcüklerini ve bağlam sözcüklerini döndürür."""
centers, contexts = [], []
for line in corpus:
# Bir "merkez sözcük-bağlam sözcüğü" çifti oluşturmak için
# her cümlede en az 2 kelime olması gerekir
if len(line) < 2:
continue
centers += line
for i in range(len(line)): # `i` merkezli bağlam penceresi
window_size = random.randint(1, max_window_size)
indices = list(range(max(0, i - window_size),
min(len(line), i + 1 + window_size)))
# Merkez sözcüğü bağlam sözcüklerinden çıkar
indices.remove(i)
contexts.append([line[idx] for idx in indices])
return centers, contexts
.. raw:: html
.. raw:: html
Ardından, sırasıyla 7 ve 3 sözcükten oluşan iki cümle içeren yapay bir
veri kümesi oluşturuyoruz. Maksimum bağlam penceresi boyutunun 2
olmasını sağlayın ve tüm merkez sözcüklerini ve onların bağlam
sözcüklerini yazdırın.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
tiny_dataset = [list(range(7)), list(range(7, 10))]
print('dataset', tiny_dataset)
for center, context in zip(*get_centers_and_contexts(tiny_dataset, 2)):
print('center', center, 'has contexts', context)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
dataset [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9]]
center 0 has contexts [1, 2]
center 1 has contexts [0, 2]
center 2 has contexts [0, 1, 3, 4]
center 3 has contexts [1, 2, 4, 5]
center 4 has contexts [2, 3, 5, 6]
center 5 has contexts [3, 4, 6]
center 6 has contexts [4, 5]
center 7 has contexts [8]
center 8 has contexts [7, 9]
center 9 has contexts [8]
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
tiny_dataset = [list(range(7)), list(range(7, 10))]
print('dataset', tiny_dataset)
for center, context in zip(*get_centers_and_contexts(tiny_dataset, 2)):
print('center', center, 'has contexts', context)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
dataset [[0, 1, 2, 3, 4, 5, 6], [7, 8, 9]]
center 0 has contexts [1, 2]
center 1 has contexts [0, 2]
center 2 has contexts [0, 1, 3, 4]
center 3 has contexts [1, 2, 4, 5]
center 4 has contexts [2, 3, 5, 6]
center 5 has contexts [4, 6]
center 6 has contexts [5]
center 7 has contexts [8, 9]
center 8 has contexts [7, 9]
center 9 has contexts [7, 8]
.. raw:: html
.. raw:: html
PTB veri kümesi üzerinde eğitim yaparken, maksimum bağlam penceresi
boyutunu 5'e ayarladık. Aşağıdaki, veri kümelerindeki tüm merkez
sözcüklerini ve onların bağlam sözcüklerini ayıklar.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
all_centers, all_contexts = get_centers_and_contexts(corpus, 5)
f'# center-context pairs: {sum([len(contexts) for contexts in all_contexts])}'
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'# center-context pairs: 1501007'
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
all_centers, all_contexts = get_centers_and_contexts(corpus, 5)
f'# center-context pairs: {sum([len(contexts) for contexts in all_contexts])}'
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
'# center-context pairs: 1500630'
.. raw:: html
.. raw:: html
Negatif Örnekleme
-----------------
Yaklaşıklama eğitim için negatif örnekleme kullanıyoruz. Gürültülü
sözcükleri önceden tanımlanmış bir dağıtıma göre örneklemek için
aşağıdaki ``RandomGenerator`` sınıfını tanımlıyoruz; burada (muhtemelen
normalleştirilmemiş) örnekleme dağılımı ``sampling_weights`` argümanı
üzerinden geçirilir.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
class RandomGenerator:
"""Örnekleme ağırlıklarına göre {1, ..., n} arasından rastgele çek."""
def __init__(self, sampling_weights):
# Hariç tut
self.population = list(range(1, len(sampling_weights) + 1))
self.sampling_weights = sampling_weights
self.candidates = []
self.i = 0
def draw(self):
if self.i == len(self.candidates):
# `k` rastgele örnekleme sonuçlarını önbelleğe al
self.candidates = random.choices(
self.population, self.sampling_weights, k=10000)
self.i = 0
self.i += 1
return self.candidates[self.i - 1]
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
class RandomGenerator:
"""Örnekleme ağırlıklarına göre {1, ..., n} arasından rastgele çek."""
def __init__(self, sampling_weights):
# Hariç tut
self.population = list(range(1, len(sampling_weights) + 1))
self.sampling_weights = sampling_weights
self.candidates = []
self.i = 0
def draw(self):
if self.i == len(self.candidates):
# `k` rastgele örnekleme sonuçlarını önbelleğe al
self.candidates = random.choices(
self.population, self.sampling_weights, k=10000)
self.i = 0
self.i += 1
return self.candidates[self.i - 1]
.. raw:: html
.. raw:: html
Örneğin, :math:`P(X=1)=2/9, P(X=2)=3/9` ve :math:`P(X=3)=4/9` örnekleme
olasılıkları ile 1, 2 ve 3 indeksleri arasından 10 adet :math:`X`
rasgele değişkenini çekebiliriz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
generator = RandomGenerator([2, 3, 4])
[generator.draw() for _ in range(10)]
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
[3, 1, 1, 3, 3, 2, 3, 1, 3, 1]
.. raw:: html
.. raw:: html
Bir çift merkez sözcük ve bağlam sözcüğü için, rastgele ``K`` (deneyde
5) gürültü sözcüğü örnekleriz. Word2vec makalesindeki önerilere göre,
:math:`w` gürültü sözcüğünün :math:`P(w)` örnekleme olasılığı, 0.75'in
:cite:`Mikolov.Sutskever.Chen.ea.2013` gücüne yükseltilmiş olarak
sözlükteki göreli frekansına ayarlanır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def get_negatives(all_contexts, vocab, counter, K):
"""Negatif örneklemede gürültü sözcüklerini döndür."""
# Sözlükte 1, 2, ... (dizin 0 hariç tutulan bilinmeyen belirteçtir)
# olan kelimeler için örnekleme ağırlıkları
sampling_weights = [counter[vocab.to_tokens(i)]**0.75
for i in range(1, len(vocab))]
all_negatives, generator = [], RandomGenerator(sampling_weights)
for contexts in all_contexts:
negatives = []
while len(negatives) < len(contexts) * K:
neg = generator.draw()
# Gürültü sözcükleri bağlam sözcükleri olamaz
if neg not in contexts:
negatives.append(neg)
all_negatives.append(negatives)
return all_negatives
all_negatives = get_negatives(all_contexts, vocab, counter, 5)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def get_negatives(all_contexts, vocab, counter, K):
"""Negatif örneklemede gürültü sözcüklerini döndür."""
# Sözlükte 1, 2, ... (dizin 0 hariç tutulan bilinmeyen belirteçtir)
# olan kelimeler için örnekleme ağırlıkları
sampling_weights = [counter[vocab.to_tokens(i)]**0.75
for i in range(1, len(vocab))]
all_negatives, generator = [], RandomGenerator(sampling_weights)
for contexts in all_contexts:
negatives = []
while len(negatives) < len(contexts) * K:
neg = generator.draw()
# Gürültü sözcükleri bağlam sözcükleri olamaz
if neg not in contexts:
negatives.append(neg)
all_negatives.append(negatives)
return all_negatives
all_negatives = get_negatives(all_contexts, vocab, counter, 5)
.. raw:: html
.. raw:: html
.. _subsec_word2vec-minibatch-loading:
Minigruplarda Eğitim Örneklerini Yükleme
----------------------------------------
Bağlam sözcükleri ve örneklenmiş gürültü sözcükleri ile birlikte tüm
merkezi sözcükler çıkarıldıktan sonra, eğitim sırasında yinelemeli
olarak yüklenebilecek örneklerin minigruplarına dönüştürülecektir.
Bir minigrupta, :math:`i.` örnek bir merkez sözcük ve onun :math:`n_i`
bağlam sözcükleri ve :math:`m_i` gürültü sözcükleri içerir. Değişen
bağlam penceresi boyutları nedeniyle :math:`n_i+m_i` farklı
:math:`i`'ler için değişiklik gösterir. Böylece, her örnek için bağlam
sözcüklerini ve gürültü sözcüklerini ``contexts_negatives`` değişkeninde
bitiştiririz ve bitiştirme uzunluğu :math:`\max_i n_i+m_i`'a
(``max_len``) ulaşana kadar sıfırlarla dolgularız. Kaybın
hesaplanmasında dolguları hariç tutmak için bir maske değişkeni,
``masks``, tanımlıyoruz. ``masks``'taki elemanlar ve
``contexts_negatives``'teki elemanlar arasında bire bir karşılık vardır,
burada ``masks``'daki sıfırlar (aksi takdirde birler)
``contexts_negatives``'teki dolgulara karşılık gelir.
Pozitif ve negatif örnekleri ayırt etmek için ``contexts_negatives``
içindeki gürültü sözcüklerinden ``labels`` değişkeni aracılığıyla bağlam
sözcüklerini ayırırız. ``masks``'e benzer şekilde, ``labels``'daki
elemanlar ve ``contexts_negatives``'teki elemanlar arasında bire bir
karşılık vardır ve ``labels``'daki birler (aksi takdirde sıfırlar)
``contexts_negatives``'teki bağlam sözcüklerine (olumlu örneklere)
karşılık gelir.
Yukarıdaki fikir aşağıdaki ``batchify`` işlevinde uygulanmaktadır. Girdi
``data`` toplu boyutuna eşit uzunlukta bir listedir; her öğesi
``center`` merkez sözcüklerinden, ``context`` bağlam sözcüklerinden ve
``negative`` gürültü sözcüklerinden oluşan bir örnektir. Bu işlev, maske
değişkeni de dahil olmak üzere eğitim sırasında hesaplamalar için
yüklenebilecek bir minigrup döndürür.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def batchify(data):
"""Negatif örnekleme ile skip-gram için bir minigrup örnek döndür."""
max_len = max(len(c) + len(n) for _, c, n in data)
centers, contexts_negatives, masks, labels = [], [], [], []
for center, context, negative in data:
cur_len = len(context) + len(negative)
centers += [center]
contexts_negatives += [context + negative + [0] * (max_len - cur_len)]
masks += [[1] * cur_len + [0] * (max_len - cur_len)]
labels += [[1] * len(context) + [0] * (max_len - len(context))]
return (np.array(centers).reshape((-1, 1)), np.array(
contexts_negatives), np.array(masks), np.array(labels))
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def batchify(data):
"""Negatif örnekleme ile skip-gram için bir minigrup örnek döndür."""
max_len = max(len(c) + len(n) for _, c, n in data)
centers, contexts_negatives, masks, labels = [], [], [], []
for center, context, negative in data:
cur_len = len(context) + len(negative)
centers += [center]
contexts_negatives += [context + negative + [0] * (max_len - cur_len)]
masks += [[1] * cur_len + [0] * (max_len - cur_len)]
labels += [[1] * len(context) + [0] * (max_len - len(context))]
return (torch.tensor(centers).reshape((-1, 1)), torch.tensor(
contexts_negatives), torch.tensor(masks), torch.tensor(labels))
.. raw:: html
.. raw:: html
Bu işlevi iki örnekten oluşan bir minigrup kullanarak test edelim.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
x_1 = (1, [2, 2], [3, 3, 3, 3])
x_2 = (1, [2, 2, 2], [3, 3])
batch = batchify((x_1, x_2))
names = ['centers', 'contexts_negatives', 'masks', 'labels']
for name, data in zip(names, batch):
print(name, '=', data)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
centers = [[1.]
[1.]]
contexts_negatives = [[2. 2. 3. 3. 3. 3.]
[2. 2. 2. 3. 3. 0.]]
masks = [[1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 0.]]
labels = [[1. 1. 0. 0. 0. 0.]
[1. 1. 1. 0. 0. 0.]]
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
x_1 = (1, [2, 2], [3, 3, 3, 3])
x_2 = (1, [2, 2, 2], [3, 3])
batch = batchify((x_1, x_2))
names = ['centers', 'contexts_negatives', 'masks', 'labels']
for name, data in zip(names, batch):
print(name, '=', data)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
centers = tensor([[1],
[1]])
contexts_negatives = tensor([[2, 2, 3, 3, 3, 3],
[2, 2, 2, 3, 3, 0]])
masks = tensor([[1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 0]])
labels = tensor([[1, 1, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0]])
.. raw:: html
.. raw:: html
Her Şeyi Bir Araya Getirmek
---------------------------
Son olarak, PTB veri kümesini okuyan ve veri yineleyicisini ve sözcük
dağarcığını döndüren ``load_data_ptb`` işlevini tanımlıyoruz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def load_data_ptb(batch_size, max_window_size, num_noise_words):
"""PTB veri kümesini indirin ve ardından belleğe yükleyin."""
sentences = read_ptb()
vocab = d2l.Vocab(sentences, min_freq=10)
subsampled, counter = subsample(sentences, vocab)
corpus = [vocab[line] for line in subsampled]
all_centers, all_contexts = get_centers_and_contexts(
corpus, max_window_size)
all_negatives = get_negatives(
all_contexts, vocab, counter, num_noise_words)
dataset = gluon.data.ArrayDataset(
all_centers, all_contexts, all_negatives)
data_iter = gluon.data.DataLoader(
dataset, batch_size, shuffle=True,batchify_fn=batchify,
num_workers=d2l.get_dataloader_workers())
return data_iter, vocab
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
#@save
def load_data_ptb(batch_size, max_window_size, num_noise_words):
"""Download the PTB dataset and then load it into memory."""
num_workers = d2l.get_dataloader_workers()
sentences = read_ptb()
vocab = d2l.Vocab(sentences, min_freq=10)
subsampled, counter = subsample(sentences, vocab)
corpus = [vocab[line] for line in subsampled]
all_centers, all_contexts = get_centers_and_contexts(
corpus, max_window_size)
all_negatives = get_negatives(
all_contexts, vocab, counter, num_noise_words)
class PTBDataset(torch.utils.data.Dataset):
def __init__(self, centers, contexts, negatives):
assert len(centers) == len(contexts) == len(negatives)
self.centers = centers
self.contexts = contexts
self.negatives = negatives
def __getitem__(self, index):
return (self.centers[index], self.contexts[index],
self.negatives[index])
def __len__(self):
return len(self.centers)
dataset = PTBDataset(all_centers, all_contexts, all_negatives)
data_iter = torch.utils.data.DataLoader(dataset, batch_size, shuffle=True,
collate_fn=batchify,
num_workers=num_workers)
return data_iter, vocab
.. raw:: html
.. raw:: html
Veri yineleyicisinin ilk minigrubunu yazdıralım.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
data_iter, vocab = load_data_ptb(512, 5, 5)
for batch in data_iter:
for name, data in zip(names, batch):
print(name, 'shape:', data.shape)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
centers shape: (512, 1)
contexts_negatives shape: (512, 60)
masks shape: (512, 60)
labels shape: (512, 60)
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
data_iter, vocab = load_data_ptb(512, 5, 5)
for batch in data_iter:
for name, data in zip(names, batch):
print(name, 'shape:', data.shape)
break
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
centers shape: torch.Size([512, 1])
contexts_negatives shape: torch.Size([512, 60])
masks shape: torch.Size([512, 60])
labels shape: torch.Size([512, 60])
.. raw:: html
.. raw:: html
Özet
----
- Yüksek frekanslı sözcükler eğitimde o kadar yararlı olmayabilir.
Eğitimde hızlanmak için onları alt örnekleyebiliriz.
- Hesaplama verimliliği için örnekleri minigruplar halinde yükleriz.
Dolguları dolgu olmayanlardan ve olumlu örnekleri olumsuz olanlardan
ayırt etmek için başka değişkenler tanımlayabiliriz.
Alıştırmalar
------------
1. Alt örnekleme kullanmıyorsa, bu bölümdeki kodun çalışma süresi nasıl
değişir?
2. ``RandomGenerator`` sınıfı ``k`` rasgele örnekleme sonuçlarını
önbelleğe alır. ``k``'yi diğer değerlere ayarlayın ve veri yükleme
hızını nasıl etkilediğini görün.
3. Bu bölümün kodundaki hangi diğer hiper parametreler veri yükleme
hızını etkileyebilir?
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html