Apa itu pengodean posisi?

Apa itu pengodean posisi?

Pengodean posisi adalah teknik yang menginjeksi informasi tentang posisi kata-kata dalam urutan ke arsitektur transformator.

Urutan kata-kata memainkan peran mendasar dalam memahami makna semantik dari sebuah kalimat. Misalnya, "Allen menggiring anjing" dan "anjing menggiring Allen" memiliki arti yang sangat berbeda meskipun memiliki kata atau token yang sama. Ketika mengimplementasikan aplikasi pemrosesan bahasa alami (NLP) dengan menggunakan pembelajaran mendalam dan neural networks, kita perlu membuat mekanisme agar mesin dapat mempertahankan urutan kata dalam sebuah kalimat untuk menghasilkan output yang logis.  

Pada umumnya, model seperti recurrent neural networks (RNN) atau memori jangka pendek yang panjang (LSTM) memiliki mekanisme bawaan yang menangani urutan kata. RNN dan LSTM memproses input secara berurutan, satu token pada satu waktu, menghafal semua posisi kata dalam satu urutan. Dengan kata lain, vektor berdimensi n, yang juga disebut "vektor input" diproses satu demi satu, mempelajari urutan secara inheren. Sebaliknya, arsitektur lain yang memanfaatkan neural networks konvolusional (CNN) atau transformator (Vaswani et al. 2017) tidak mempertahankan urutan kata dan memproses token secara paralel. Oleh karena itu, kita perlu mengimplementasikan mekanisme yang dapat secara eksplisit dapat menggambarkan urutan kata dalam suatu urutan—teknik yang dikenal sebagai pengodean posisi. Pengodean posisi memungkinkan transformator mempertahankan informasi urutan kata yang memungkinkan paralelisasi dan pelatihan model yang efisien. Anda dapat sering menemukan implementasi pengodean posisi di GitHub.  

Tren AI terbaru, dipersembahkan oleh para pakar

Dapatkan kurasi insight tentang berita AI yang paling penting dan menarik. Berlangganan buletin Think mingguan. Lihat Pernyataan Privasi IBM.

Terima kasih! Anda telah berlangganan.

Langganan Anda akan dikirimkan dalam bahasa Inggris. Anda akan menemukan tautan berhenti berlangganan di setiap buletin. Anda dapat mengelola langganan atau berhenti berlangganan di sini. Lihat Pernyataan Privasi IBM kami untuk informasi lebih lanjut.

Mengapa pengodean posisi penting?

Urutan kata dalam kalimat atau urutan menentukan makna yang melekat dari kalimat dalam bahasa alami. Selain itu, untuk machine learning, pengodean urutan kata memberi kita "kamus" tentang di mana setiap kata seharusnya berada. Informasi ini dipertahankan dan dapat digeneralisasi di seluruh pelatihan model transformator, sehingga memungkinkan paralelisasi dan mengalahkan RNN dan LSTM dalam hal efisiensi pelatihannya.  

Mari kita lihat kembali contohnya:

  • "Allen menggiring anjing"
  • "anjing menggiring Allen"

Kedua kalimat dengan tiga token yang sama ini memiliki arti yang sama sekali berbeda berdasarkan urutan kata. Transformator yang mengandalkan perhatian diri dan mekanisme perhatian multi-head tidak memiliki representasi urutan kata yang melekat, dan akan memperlakukan setiap kata dalam urutan yang sama jika kita tidak memberikan informasi posisi yang jelas. Kita menginginkan agar model memahami siapa yang menggiring dan siapa yang digiring, yang sepenuhnya bergantung pada posisi.  

Kami mencapai tujuan ini dengan terlebih dahulu memproses setiap kata sebagai vektor yang menunjukkan maknanya—misalnya, "anjing" akan dikodekan dalam susunan berdimensi tinggi yang mengodekan konsepnya. Dalam istilah teknis, setiap kata atau subkata dipetakan ke penanaman input dengan panjang yang bervariasi. Namun, vektor makna itu sendiri tidak memberi tahu kita di mana kata anjing muncul dalam kalimat. Pengodean posisi menambahkan vektor kedua—vektor ini mengodekan indeks posisi, seperti "kata pertama", atau "kata kedua", dan seterusnya. Kedua vektor kemudian ditambahkan untuk menunjukkan kata dan posisinya. Vektor yang dihasilkan ini sering disebut sebagai vektor pengodean posisi.   

Ada beberapa cara untuk membuat pengodean posisi. Dalam artikel ini, kita akan menjelajahi contoh yang paling terkenal mengenai penggunaan fungsi sinusoidal yang diperkenalkan oleh para penulis dalam makalah Attention is all you need1 untuk membuat pengodean posisi.  

Gabungan Para Pakar | 28 Agustus, episode 70

Decoding AI: Rangkuman Berita Mingguan

Bergabunglah dengan panel insinyur, peneliti, pemimpin produk, dan sosok kelas dunia lainnya selagi mereka mengupas tuntas tentang AI untuk menghadirkan berita dan insight terbaru seputar AI.

Pengodean posisi dalam transformator

Dalam makalah asli yang diperkenalkan oleh Vaswani et al. 2017, konsep kuncinya adalah menghasilkan pengodean yang tetap dan deterministik untuk setiap posisi dalam suatu urutan dengan menggunakan fungsi sinusoidal—khususnya fungsi sinus sin(x) dan fungsi kosinus cos(x) .  

Apa itu fungsi sinusoidal?

Fungsi sinus adalah konsep matematika dasar yang menghasilkan pola panjang gelombang yang halus. Fungsi kosinus dan sinus digunakan secara khusus oleh penulis dalam fungsi transformator asli untuk membantu pengodean posisi.

Jika kita menggambar sin(x) dan  cos(x) , kita akan melihat kurva yang naik dan turun antara -1 dan 1 dalam pola periodik yang berulang.

Beberapa sifat sinus yang membuatnya efisien untuk pengodean posisi: 

  • Sifat berkala: Fungsi ini diulang secara teratur selama beberapa interval yang berguna untuk menunjukkan pola berulang.

  • Fungsi ini halus dan berkelanjutan: Perubahan kecil dalam input menghasilkan perubahan kecil dalam output yang memberi kita cara untuk menunjukkan posisi dalam ruang yang dapat dibedakan.

  • Dengan membedakan frekuensi panjang gelombang di seluruh dimensi, kita dapat menciptakan representasi posisi yang lengkap dan dengan banyak skala. 

Mari kita buat gelombang sinus dan kosinus untuk memvisualisasikan tampilannya:

import numpy as np 
import matplotlib.pyplot as plt 

# Create an array of 100 x values evenly spaced from 0 to 2π (approx 6.28)
x = np.linspace(0, 2 * np.pi, 100) 

# Compute the sine and cosine of each x value 
sin_values = np.sin(x) 

# Create the plot 
plt.figure(figsize=(5, 2)) 
plt.plot(x, sin_values, label='sin(x)', color='blue') 

# Customize the plot 
plt.title('Sine Function') 
plt.xlabel('x') 
plt.ylabel('Function value') 
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0 
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0 
#plt.grid(True, linestyle='--', alpha=0.5) 
plt.legend() 
plt.tight_layout() 

# Show the plot 
plt.show() 

Fungsi sinus

Grafik fungsi sinus, kurva berulang dengan rentang positif dan negatif.

Dan sekarang mari kita lihat bagaimana kita dapat membuat fungsi kosinus:

#apply the cosine function to the same array, x
cosine = np.cos(x) 

plt.figure(figsize = (5,2)) 
plt.plot(x, cosine, label = 'cos(x)', color = 'blue') 
plt.title('The Cosine Function') 
plt.xlabel('x') 
plt.ylabel('Function value') 
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0 
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0 
#plt.grid(True, linestyle='--', alpha=0.5) 
plt.legend() 
plt.tight_layout() 
Grafik fungsi kosinus, menggambarkan sifat periodik dan karakteristik kuncinya.

Rumus pengodean posisi sinusoidal yang didefinisikan oleh penulis makalah transformator asli (Vaswani et al. 2017), ditunjukkan sebagai berikut:

Untuk posisi genap:

 PEpos,2i=sin(pos100002i/dmodel) 

Untuk posisi ganjil:

 PEpos,2i+1=cos(pos100002i/dmodel) 

  •  k : Posisi kata dalam kalimat (misalnya, 0 untuk kata pertama, 1 untuk kata kedua, dan seterusnya.)

  •  i : Indeks dimensi vektor penanaman. petakan ke indeks kolom. 2i akan menunjukkan posisi genap dan 2i+1 akan menunjukkan posisi ganjil

  •  dmodel : Dimensi yang telah ditentukan sebelumnya dari penanaman token (misalnya, 512)

  •  n : nilai skalar yang ditentukan pengguna (misalnya, 10000)

  •  PE : fungsi posisi untuk memetakan posisi k dalam urutan input untuk mendapatkan pemetaan posisi

     

 

Dengan menggunakan rumus ini, setiap kata pada posisi k akan memiliki nilai penanaman berdasarkan posisi kata. Ambil contoh yang kita gunakan, "Allen menggiring anjing", kita dapat menghitung penanaman posisi untuk setiap kata:

-  k1 = "Allen"

-  k2 = "menggiring"

-  k3 ="anjing"

Mari kita tulis fungsi Python sederhana untuk menghitung nilai  PE(k) :

import numpy as np 

import matplotlib.pyplot as plt 

  

# create the positional encoding function using the formula above 

def getPositionEncoding(seq_len, d, n=10000): 

    # instantiate an array of 0s as a starting point 

    P = np.zeros((seq_len, d)) 

    # iterate through the positions of each word  

    for k in range(seq_len): 

        #calculate the positional encoding for even and odd position of each word 

        for i in np.arange(int(d/2)): 

            denominator = np.power(n, 2*i/d) 

            P[k, 2*i] = np.sin(k/denominator) 

            P[k, 2*i+1] = np.cos(k/denominator) 
    return P 

Setelah kita memanggil fungsi dan memasukkan nilai yang sesuai ke dalam contoh di mana panjang urutannya adalah 3 dengan dimensi yang disederhanakan  d=4 , dan  n=10000 

P = getPositionEncoding(seq_len=3, d=4, n=10000) 

print(P) 

Kita mendapatkan matriks pengodean berikut (disebut juga dengan tensor):

[[ 0.                      1.                      0.                       1.        ]

 [ 0.84147098  0.54030231  0.09983342  0.99500417]

 [ 0.90929743 -0.41614684  0.19866933  0.98006658]]

Untuk menunjukkan hasil ini secara lebih konkret, kami mendapatkan

Posisi KataDim 0
sin(pos ÷ 10000^(0 ÷ 4))
Dim 1
cos(pos ÷ 10000^(0 ÷ 4))
Dim 2
sin(pos ÷ 10000^(2 ÷ 4))
Dim 3
cos(pos ÷ 10000^(2 ÷ 4))
“Allen” k = 00.00000.00000.00001.0000
“menggiring” k = 10.8414710.5403020.0100000.999950
“anjing” k = 20.909297-0.4161470.0200000.999800

Di sini kita dapat melihat nilai konkret dari setiap kata dan nilai penanaman posisi yang sesuai. Namun, kita tidak dapat menggunakan penanaman kata ini secara langsung untuk menafsirkan urutan kata. Nilai yang dihitung di sini digunakan untuk menginjeksi informasi tentang posisi dalam vektor input transformator. Karena input  dansin(x)  dan  cos(x) berbeda, setiap   posisik  akan merespons fungsi sinusoidal yang berbeda. Posisi yang sesuai dari fungsi sinusoidal yang berbeda memberi kita informasi tentang posisi absolut dan posisi relatif kata dalam "Allen menggiring anjing". Dengan kata lain, informasi ini dapat digunakan oleh model sedemikian rupa sehingga model dapat belajar mengaitkan semua pola ini dengan urutan, jarak, dan struktur.  

Sekarang mari kita terapkan fungsi python untuk memvisualisasikan matriks posisi

import numpy as np 

import matplotlib.pyplot as plt 

  

def get_position_encoding(seq_len, d_model, n=10000): 

    P = np.zeros((seq_len, d_model)) 

    for pos in range(seq_len): 

        for i in range(d_model): 

            angle = pos / np.power(n, (2 * (i // 2)) / d_model) 

            P[pos, i] = np.sin(angle) if i % 2 == 0 else np.cos(angle) 

    return P 

  

# Parameters 

seq_len = 100   # Number of tokens 

d_model = 512   # Embedding dimensions 

  

# Generate positional encoding 

P = get_position_encoding(seq_len, d_model) 

  

# Plot 

plt.figure(figsize=(10, 6)) 

cax = plt.matshow(P, cmap='viridis', aspect='auto') 

plt.title("Sinusoidal Positional Encoding Heatmap") 

plt.xlabel("Embedding Dimension") 

plt.ylabel("Token Position") 

plt.colorbar(cax) 

plt.tight_layout() 

plt.show() 
Peta panas sinusoidal

Pemikiran terakhir

Seperti yang dapat kita lihat dengan frekuensi yang berbeda berdasarkan nilai x, setiap posisi yang sesuai dari kata input k akan berbeda pada skala [-1.1] —rentang fungsi  sin(x) . Dari sana, model transformator berbasis encoder dan decoder kami akan mempelajari dan mempertahankan pengodean posisi yang berbeda dari setiap kata, sehingga model dapat mempertahankan informasi untuk pelatihan. Vektor posisi yang dikodekan tetap statis selama pelatihan, sehingga memungkinkan komputasi paralel.

Solusi terkait
IBM watsonx.ai

Latih, validasi, lakukan tuning, dan terapkan AI generatif, model dasar, dan kemampuan machine learning dengan IBM watsonx.ai, studio perusahaan generasi berikutnya untuk pembangun AI. Bangun aplikasi AI dalam waktu singkat, dengan sedikit data.

Temukan watsonx.ai
Solusi kecerdasan buatan (AI)

Gunakan AI di bisnis Anda dalam perpaduan antara keahlian AI terdepan di industri dari IBM dan portofolio solusi Anda.

Jelajahi solusi AI
Konsultasi dan layanan AI

Temukan kembali alur kerja dan operasi yang penting dengan menambahkan AI untuk memaksimalkan pengalaman, pengambilan keputusan secara real-time, dan nilai bisnis.

Jelajahi layanan AI
Ambil langkah selanjutnya

Dapatkan akses satu atap ke kemampuan yang mencakup siklus hidup pengembangan AI. Hasilkan solusi AI yang kuat dengan antarmuka ramah pengguna, alur kerja yang efisien, serta akses ke API dan SDK berstandar industri.

Jelajahi watsonx.ai Pesan demo langsung
Catatan kaki

1. “Attention Is All You Need”, Ashish Vaswani et al., Prosiding Konferensi Internasional ke-31 tentang Sistem Pemrosesan Informasi Neural, arXiv:1706.03762v7, direvisi pada 2 Agustus 2023.

2. “Long Short-Term Memories”, Sepp Hochreiter dan Jürgen Schmidhuber. 1997. Long Short-Term Memory. Neural Comput. 9, 8 (15 November 1997), 1735–1780., 

3. “Foundations of Recurrent Neural Networks (RNNs) and Long Short-Term Memories” Alex Sherstinsky et al., jurnal “Physica D: Nonlinear Phenomena” Elsevier, Volume 404, Maret 2020: Edisi Khusus tentang Machine Learning dan Sistem Dinamis