Januari 2020, waktu terbaik untuk mempelajari hal-hal baru untuk meningkatkan keahlian kita. Jadi, saya memutuskan untuk belajar PyTorch bersama.

Bagi yang masih asing dengan PyTorch, lihat tautan di bawah ini, situs resmi perpustakaan.



PyTorch adalah platform pembelajaran mendalam sumber terbuka yang terutama dikembangkan oleh Facebook Artificial Intelligence Research Lab, FAIR.

Berdasarkan pengalaman pribadi, menurut saya PyTorch menyediakan baris kode yang lebih mudah dan intuitif untuk mengimplementasikan model pembelajaran mesin.

Dalam postingan ini, kita akan melihat sekilas apa itu Recurrent Neural Networks, dan mempelajari teknik pemrosesan data utama dan banyak digunakan, yaitu penyematan kata.

Konten

1. Pengenalan singkat: Jaringan Neural Berulang

2. Pemrosesan awal teks: Enkode one-hot & Penyematan Kata
— 2.1 Enkode one-hot
— 2.2 Penyematan Kata dengan PyTorch

1. Pengenalan singkat: Jaringan Neural Berulang

Apa itu Jaringan Neural Berulang (RNN)?

Saya pikir cara termudah untuk mempelajari hal baru adalah dengan melangkah dari hal yang sudah kita ketahui. Jadi, mari kita bayangkan jaringan saraf biasa dan sederhana yang mengklasifikasikan gambar ke dalam label tertentu.

Katakanlah kita sedang menonton film dokumenter tentang dunia laut. Dan kami ingin jaringan saraf kami mengklasifikasikan setiap objek dalam film ke dalam kategori tertentu.

Seperti yang dapat kita lihat dari gambar di atas (saya menggambarnya sendiri!), tidak ada hubungan antara setiap gambar berbeda yang dimasukkan ke dalam model jaringan saraf. Jadi, meskipun terdapat petunjuk atau informasi tambahan dari rangkaian data itu sendiri, jaringan saraf tidak memiliki sumber daya untuk memanfaatkannya guna meningkatkan kinerja.

Namun, dalam jaringan saraf berulang, yang disingkat RNN, dimungkinkan untuk mendapatkan petunjuk dari data yang dimasukkan sebelumnya dan menggunakan informasi tambahan dalam tugas saat ini.

Pada dasarnya, RNN berbeda dari jaringan saraf biasa karena memiliki memori hasil jaringan sebelumnya. Dengan kata lain, RNN memasukkan ketergantungan data masukan ke dalam modelnya.

2. Pemrosesan awal teks:

Pengodean satu-panas & Penyematan Kata

Mungkin data teks, seperti artikel di surat kabar, ulasan film, atau postingan media seperti ini, akan menjadi bentuk data yang paling memadai untuk menguji penggabungan ketergantungan setiap unit data yang benar-benar meningkatkan performa model.

Namun karena komputer hanya dapat memahami informasi numerik seperti vektor, skalar, atau tensor, maka kita perlu mengubah data teks manusia ke dalam format tensor agar komputer dapat mengikuti perintah atau perintah kita.

Misalkan kita mempunyai sebuah kalimat yang perlu diubah. “Kucing itu duduk di atas matras.”

Ada dua titik awal yang berbeda; tingkat karakter, atau tingkat kata. Di sini, saya akan mulai dengan kata tersebut. Kalimat di atas dapat dipecah menjadi

a = “The cat sat on the mat.”
list(a.split())
#   ['The', 'cat', 'sat', 'on', 'the', 'mat.']

['The', 'cat', 'sat', 'on', 'the', 'mat.'].

Kami baru saja memecah sebuah kalimat menjadi kata-kata yang berbeda. Secara umum, proses ini disebut 'tokenisasi', dan setiap kata yang terkandung disebut 'token'.

Mari kita beri indeks pada setiap kata sehingga kita dapat mengindikasikan setiap kata hanya dengan angka.

import numpy as np
samples = ['The cat sat on the mat.', 'The dog ate my homework.']
token_index = {}
for sample in samples:
    for word in sample.split():
        if word not in token_index:
        token_index[word] = len(token_index) + 1

Dan variabel kamus hasil dengan nama “token_index” memiliki hasil sebagai berikut.

{'The': 1,  'ate': 8,  'cat': 2,  'dog': 7,  'homework.': 10,  'mat.': 6,  'my': 9,  'on': 4,  'sat': 3,  'the': 5}

2.1 Pengkodean satu-panas

Berkat tokenisasi, kita dapat mengganti setiap kata dengan nomor indeksnya sendiri. Bilangan indeks bilangan bulat juga dapat direpresentasikan dalam format vektor, khususnya vektor one-hot. Bentuk vektor ini hanya terdiri dari dua bilangan bulat, 0 dan 1. Misalnya, format vektor one-hot untuk kata 'cat' yang nomor indeksnya 2 adalah sebagai berikut.

[0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]

Dalam contoh mainan kami di sini, kami hanya akan mempertimbangkan 10 kata pertama yang akan ditetapkan dengan nama variabel “panjang maksimum”.

max_length = 10
results = np.zeros(shape=(len(samples),
                          max_length,
                          max(token_index.values()) + 1))
for i, sample in enumerate(samples):
    for j, word in list(enumerate(sample.split()))[:max_length]:
        index = token_index.get(word)
        results[i, j, index] = 1.

Dan “hasilnya” adalah sebagai berikut.

# 'The cat sat on the mat.'
array([[[0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],
#'The dog ate my homework.'       
       [[0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],         
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]])

2.2 Penyematan Kata dengan PyTorch

Pada bagian pengkodean one-hot 2.1 di atas, kumpulan data mainan yang kami miliki hanya terdiri dari 10 kata berbeda. Namun, bagaimana jika kita ingin memberi token pada karya William Shakespeare? Jumlah kata yang berbeda dalam karyanya jelas lebih dari 10 kata. Mungkin 8.000? atau 12.000? Saya tidak punya ide.

Dalam keadaan ini, ukuran dimensi setiap vektor one-hot akan sangat panjang. Untuk mengatasi masalah ini, muncullah metode 'penyematan kata' yang paling banyak digunakan dan efisien.

Seperti nama metodenya, penyematan kata menyematkan sebuah kata ke dalam vektor dengan ukuran tetap. Besarannya biasanya pangkat 2, misalnya 32, 64, atau 256.

Dengan menggunakan variabel tokenized dengan nama variabel 'token_index' yang kita gunakan dalam pengkodean one-hot 2.1, kita akan melihat cara kerja penyematan kata di PyTorch. Kode-kodenya berikut ini.

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)  
          # random seed
word_to_ix = token_index
embeds = nn.Embedding(10, 8)  
          # 10 different words are fed into the Embedding layer 
          # and 8-dimension embeddings come out.
lookup_tensor = torch.tensor([word_to_ix["cat"]], dtype=torch.long)
cat_embed = embeds(lookup_tensor)
print(cat_embed)

Dan hasil penyematan kata dari kata 'kucing' adalah sebagai berikut.

tensor([[-0.6970, -1.1608,  0.6995,  0.1991,  0.8657,  0.2444, -0.6629,  0.8073]],        grad_fn=<EmbeddingBackward>)

Dalam contoh di atas, kita menetapkan dimensi penyematan sebagai 5, namun angka berapa pun dapat dimasukkan ke dalamnya.

Jadi, dalam postingan ini, kita telah mempelajari dua tindakan prapemrosesan teks yang berbeda, pengkodean one-hot, dan penyematan kata. Semoga ini bermanfaat bagi Anda dan layak untuk dibaca. Terima kasih! 🚀 😺 🐶 ⛄️

Oh, aku hampir lupa, selamat tahun baru! 🙌