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.
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.
Dapatkan kurasi insight tentang berita AI yang paling penting dan menarik. Berlangganan buletin Think mingguan. Lihat Pernyataan Privasi IBM.
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:
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.
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 dan fungsi kosinus .
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 dan , 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:
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
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()
Rumus pengodean posisi sinusoidal yang didefinisikan oleh penulis makalah transformator asli (Vaswani et al. 2017), ditunjukkan sebagai berikut:
Untuk posisi genap:
Untuk posisi ganjil:
: Posisi kata dalam kalimat (misalnya, 0 untuk kata pertama, 1 untuk kata kedua, dan seterusnya.)
: Indeks dimensi vektor penanaman. petakan ke indeks kolom. 2i akan menunjukkan posisi genap dan 2i+1 akan menunjukkan posisi ganjil
: Dimensi yang telah ditentukan sebelumnya dari penanaman token (misalnya, 512)
: nilai skalar yang ditentukan pengguna (misalnya, 10000)
: 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:
- = "Allen"
- = "menggiring"
- ="anjing"
Mari kita tulis fungsi Python sederhana untuk menghitung nilai :
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 , dan
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 Kata | Dim 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 = 0 | 0.0000 | 0.0000 | 0.0000 | 1.0000 |
| “menggiring” k = 1 | 0.841471 | 0.540302 | 0.010000 | 0.999950 |
| “anjing” k = 2 | 0.909297 | -0.416147 | 0.020000 | 0.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 dan dan berbeda, setiap posisi 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()
Seperti yang dapat kita lihat dengan frekuensi yang berbeda berdasarkan nilai x, setiap posisi yang sesuai dari kata input k akan berbeda pada skala —rentang fungsi . 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.
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.
Gunakan AI di bisnis Anda dalam perpaduan antara keahlian AI terdepan di industri dari IBM dan portofolio solusi Anda.
Temukan kembali alur kerja dan operasi yang penting dengan menambahkan AI untuk memaksimalkan pengalaman, pengambilan keputusan secara real-time, dan nilai bisnis.
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