RoFormer: Fırlanan Mövqe Yerləşdirmə ilə Təkmilləşdirilmiş Transformator
September 27, 2024 yeniləndi 7 dəqiqə oxundu

Transformator əsaslı modellər mürəkkəb mətni təhlil etmək və şərh etmək bacarığı ilə məşhurdur. Onlar sözlərin sırasını və kontekstini başa düşməyə etibar edirlər - ənənəvi mövqe kodlaşdırma üsullarının öz sərhədlərini göstərdiyi vəzifələr. Bu boşluğu aradan qaldıraraq, Rotary Position Embedding (RoPE) ilə təchiz edilmiş ROFORMER modeli mövqe kodlaşdırmasına yanaşmamızı yenidən müəyyənləşdirir.
Ənənəvi Mövqe Kodlaşdırma
Transformatorlar mətnə bir sıra əlamətlər kimi yanaşır və daha yüksək effektivlik üçün ardıcıllıqların paralel işlənməsinə imkan verir. Bununla belə, bu güc öz çətinliyini gətirdi: modelin əlamət nizamına xas olan aqnostisizmi. Mövqe kodlaşdırması cavab idi, hər bir nişanə onun ardıcıl mövqeyini bildirən unikal imza təqdim edir.
Mütləq Mövqe Yerləşdirmələri
Əvvəlcə, BERT kimi modellər ardıcıl olaraq hər mövqeyə sabit vektor təyin edərək mütləq mövqe yerləşdirmələrindən istifadə edirdilər. Bu üsul sadə olsa da, mahiyyət etibarilə ardıcıllıq uzunluğu dəyişikliyinə uyğunlaşmaq və ya işarələr arasında nisbi məsafələri vurğulamaq qabiliyyətinə malik deyil, bir çox dil konstruksiyalarını başa düşmək üçün vacibdir.
Nisbi Mövqe Yerləşdirmələri
Dilin dinamik təbiətini ələ keçirmək üçün nisbi mövqe yerləşdirmələri təqdim edildi, onların mütləq mövqelərindən çox, işarələr arasındakı məsafəyə diqqət yetirildi. Konseptual üstünlüyünə baxmayaraq, bu daxiletmələr hesablama mürəkkəbliyi təqdim etdi və Transformatorların özünə diqqət mexanizminə problemsiz inteqrasiya edə bilmədi və onların effektivliyini məhdudlaşdırdı.
ROFORMER və Rotary Position Yerləşdirmə
Mövcud mövqe kodlaşdırma strategiyalarının məhdudiyyətlərini dərk edərək, ROFORMER, müvafiq çatışmazlıqlar olmadan mütləq və nisbi mövqe məlumatının faydalarını birləşdirən Rotary Position Embedding (İp) yanaşmasını təqdim edir.
Rotary Mövqe Yerləşdirmə
RoPE fırlanma matrislərindən istifadə edərək mövqe məlumatını kodlayır, bu, modelə təkcə tokenin harada olduğunu deyil, həm də ardıcıllıqla hər bir digər nişanə ilə necə əlaqəli olduğunu başa düşməyə imkan verir.
Credit: ArXiv
O, həndəsi obyektiv vasitəsilə fəaliyyət göstərir, işarə mövqelərini çoxölçülü məkanda onların ardıcıl əlaqələrini qeyd etmək üçün fırlanan nöqtələr kimi qəbul edir. Bu fırlanma modelə özünə diqqət mexanizmi daxilində həm mütləq, həm də nisbi mövqe işarələrini qoruyub saxlamağa və istifadə etməyə imkan verir.
İpin həyata keçirilməsi
RoPE-nin tətbiqi hər bir işarənin mövqeyinin fırlanma matrisinə kodlanmasını və bu matrisin Transformatorun özünə diqqət mexanizmi daxilində tətbiqini nəzərdə tutur. Bu proses müxtəlif ardıcıllıq uzunluqlarına uyğunlaşaraq və əhəmiyyətli hesablama xərcləri olmadan mö’cüzə qarşılıqlı əlaqələrin mahiyyətini ələ keçirərək mövqe məlumatının çevik, dinamik şərhinə imkan verir.
Əvvəlcə fırlanan yerləşdirmələri yaratmaq üçün bir funksiyaya ehtiyacınız olacaq və sonra bu daxiletmələri modelinizə birləşdirəcəksiniz. Aşağıdakı nümunə Keras-da fərdi təbəqələrin yaradılması ilə tanış olduğunuzu güman edir.
Addım 1: Fırlanan Yerləşdirmə funksiyasını təyin edin
Bu funksiya maksimum ardıcıllıq uzunluğu və daxiletmələrin ölçüləri nəzərə alınmaqla fırlanan yerləşdirmələri yaradır.
from tensorflow.keras.layers import Layer
import numpy as np
def get_rotary_embedding(dim, max_seq_len):
inv_freq = 1.0 / (10000 ** (tf.range(0, dim, 2, dtype=tf.float32) / dim))
t = tf.range(max_seq_len, dtype=tf.float32)
freqs = tf.einsum('i,j->ij', t, inv_freq)
emb = tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1)
return emb
inv_freq = 1.0 / (10000 ** (tf.range(0, dim, 2, dtype=tf.float32) / dim))
Bu xətt mövqe indeksləri əsasında eksponensial miqyaslı tezliklərin tərsini hesablayır. Bu tezliklər fırlanan yerləşdirmələr üçün sinusoidal nümunələrin yaradılmasında istifadə olunur ki, bu da nisbi mövqe məlumatının ardıcıllıqla kodlaşdırılmasına kömək edir. Bu mexanizm elementlərin nizamının və nisbi yerləşdirilməsinin başa düşülməsinin vacib olduğu tapşırıqlarda, məsələn, təbii dildə emal və ya zaman sıralarının təhlili zamanı xüsusilə faydalıdır.
Təfərrüatlarda:
-
tf.range(0, dim, 2, dtype=tf.float32)
0-dan başlayaraqdim
(eksklüziv) 2-ə qədər olan dəyərlər diapazonu yaradır.dtype=tf.float32
arqumenti müəyyən edir bu tensorun elementləri 32 bitlik üzən nöqtəli ədədlərdir. Əgərdim
8-dirsə, məsələn, bu,[0, 2, 4, 6]
çıxaracaq. -
tf.range
tərəfindən yaradılan tensor sonra yerləşdirmələrin ölçüsünə (dim
) bölünür. Bu əməliyyat bu indeksləri 0 və 1 arasında diapazona qədər azaldır (“tut” cütdürsə, eksklüziv, “tutqun” təkdirsə, bir qədər əhatəlidir, çünki diapazon addımı bütün digər dəyəri atlayır). Məsələnidim
= 8 ilə davam etdirərək, 8-ə bölmək[0,0, 0,25, 0,5, 0,75]
əldə edir. -
10000 ** (...)
əməliyyatı əvvəllər miqyaslı tenzorda hər bir elementin gücünə 10,000-i artırır. 10,000 bazası bir qədər ixtiyaridir, lakin tezliklərin geniş diapazonda dəyişməsini təmin etmək üçün seçilir ki, bu da modelə müxtəlif mövqeləri daha effektiv şəkildə ayırmağa kömək edir.[0,0, 0,25, 0,5, 0,75]
üçün o, güc əməliyyatını hər birinə tətbiq edəcək, nəticədə daha yüksək elementlər üçün daha böyük dəyərlər olacaq. -
Nəhayət, əvvəlki addımdan qiymətlərin qarşılıqlı (1/x) alınması ilə tərs tezlik əldə edilir. Daha yüksək indekslər üçün tərs tezliklər daha kiçikdir, yəni ardıcıllığın sonrakı elementləri daha kiçik tezliklərə malik olacaq və onların mövqelərinin modelə kodlaşdırılmasına təsir edəcək. Bu, modelin diqqət mexanizmləri vasitəsilə nisbi mövqelərin əldə oluna bildiyi tərzdə yerləşdirmələrə miqyas verməyə imkan verir.
Xətt:
freqs = tf.einsum('i,j->ij', t, inv_freq)
TensorFlow-un tf.einsum
funksiyasından, Eynşteynin cəmləmə notasiyasından istifadə edərək tenzor əməliyyatlarının qısa və səmərəli ifadəsinə imkan verən alətdən istifadə edir.
Bu əməliyyat effektiv şəkildə t
və inv_freq
vektorlarının xarici hasilini hesablayır, nəticədə hər bir (i, j)
elementinin t
və
i-ci elementinin məhsulu olduğu matris əldə edilir.
inv_freq j
-ci elementi. Bu matris (“tezliklər”) fırlanan yerləşdirmələr üçün sinusoidal nümunələri yaratmaq üçün istifadə olunan tezlikləri təmsil edir.
Addım 2: Fırlanan Yerləşdirmələr üçün Xüsusi Keras Layer
İndi, giriş tensoruna fırlanan yerləşdirmələri tətbiq edən fərdi Keras qatını yaradaq. Bu qat giriş tensorunun `(toplama_ölçüsü, ardıcıllıq_uzunluğu, yerləşdirmə_dimi)’ formasında olduğunu qəbul edir.
class RotaryEmbeddingLayer(Layer):
def __init__(self, dim, max_seq_len, **kwargs):
super().__init__(**kwargs)
self.dim = dim
self.max_seq_len = max_seq_len
self.rotary_embeddings = get_rotary_embedding(dim, max_seq_len)
def call(self, inputs):
seq_len = tf.shape(inputs)[1]
embeddings = self.rotary_embeddings[:seq_len]
cos_emb = embeddings[:, None, :self.dim // 2]
sin_emb = embeddings[:, None, self.dim // 2:]
# Decompose inputs into sine and cosine components
inputs_cos = inputs[..., :self.dim // 2]
inputs_sin = inputs[..., self.dim // 2:]
# Apply rotary embeddings
rotated_cos = inputs_cos * cos_emb - inputs_sin * sin_emb
rotated_sin = inputs_sin * cos_emb + inputs_cos * sin_emb
return tf.concat([rotated_cos, rotated_sin], axis=-1)
def get_config(self):
config = super().get_config()
config.update({
"dim": self.dim,
"max_seq_len": self.max_seq_len
})
return config
embeddings = self.rotary_embeddings[:seq_len]
xətti cari daxiletmə ardıcıllığının uzunluğuna əsasən əvvəlcədən hesablanmış fırlanan yerləşdirmələrin müvafiq alt çoxluğunu seçir. Ardıcıllıqların uzunluğu bir partiyadan digərinə dəyişə bildiyindən, bu dilimləmə əməliyyatı yalnız ardıcıllığın həqiqi uzunluğuna uyğun olan əlavələrin istifadə edilməsini təmin edir.
yerləşdirilmələr
dəyişəni indi (seq_len, embedding_dim)
forma tenzoruna malikdir, burada seq_len
cari topludakı ardıcıllıqların uzunluğu, embedding_dim
isə daxiletmələrin ölçüləridir. Bu tensor seq_len
-ə qədər ardıcıllıqla hər mövqe üçün fırlanan mövqe yerləşdirmələrini ehtiva edir.
emb = tf.concat((tf.cos(tezliklər), tf.sin(tezliklər)), axis=-1)
mövqe tezliklərinin sinus və kosinus çevrilmələrini tək tenzorda birləşdirir:
-tf.cos(freqs)
və tf.sin(freqs)
müvafiq olaraq freqs
tensoruna kosinus və sinus çevrilmələrini tətbiq edir. freqs
tensoru ardıcıllıq mövqeləri və yerləşdirmə ölçülərinin tərs tezlikləri əsasında hesablanmış daxiletmə ardıcıllığında hər mövqe və yerləşdirmə məkanının hər ölçüsü üçün tezlik qiymətlərini ehtiva edir. Sinus və kosinus funksiyaları element baxımından tətbiq edilir, nəticədə “tezliklər” ilə eyni formalı iki tensor yaranır. Bu çevrilmələr modelin nisbi mövqeləri anlamaq qabiliyyətini asanlaşdıraraq, mövqe münasibətlərinin dövri xarakterini ələ keçirən şəkildə mövqeyi kodlamağa kömək edir.
-tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1)
sonuncu ox boyunca kosinus və sinus çevrilmiş tensorları birləşdirir (axis=-1
ilə işarələnir). Bu tensorların yan-yana birləşdirilməsi “tezliklər” tensorunun ölçülərini effektiv şəkildə ikiqat artırır, birinci yarısı kosinusla çevrilmiş dəyərləri, ikinci yarısı isə hər mövqe üçün sinusla çevrilmiş dəyərləri təmsil edir. Konkatenasiya hər bir mövqe kodlaşdırmasının həm sinus, həm də kosinus məlumatlarını ehtiva etməsini təmin edir ki, bu da mövqe siqnallarının həm amplitudası, həm də fazası haqqında məlumatın saxlanmasına imkan verir.
- Birləşdirilmiş tensor
emb
indi giriş mövqeləri üçün tam fırlanan yerləşdirmələri saxlayır. “Emb” forması ilk iki ölçüsündə “tezliklər” ilə eyni olacaq (ardıcıllıq mövqelərinə və yerləşdirmə ölçülərinə uyğundur), lakin onun son ölçüsü həm sinus, həm də kosinus qiymətlərini nəzərə alaraq iki dəfə böyük olacaq. Bu daxiletmələr fırlanma ekvivariant şəkildə mövqe məlumatı əlavə etməklə daxiletmə daxiletmələrini modulyasiya etmək üçün istifadə olunur.
-cos_emb = daxiletmələr[:, Yoxdur, :self.dim // 2]
:
-
Birinci iki nöqtə
:
“bu ölçüdə bütün elementləri seçin” deməkdir, bu halda ardıcıllıqdakı bütün mövqelərə istinad edir. -
Tensoru 3 ölçülü etmək üçün əlavə ölçü əlavə etmək üçün
Yox
istifadə olunur. Bu, tez-tez müəyyən sayda ölçülərin daxil edilməsini gözləyən müəyyən əməliyyatlarla uyğunluğu təmin etmək üçün edilir. Məsələn, 3-ölçülü başqa bir tensorla elementlər üzrə vurma həyata keçirərkən, formalar yayım qaydalarına uyğun düzülməlidir. -
:self.dim // 2
, sonuncu oxda ölçülərin birinci yarısını seçir. Həm sinus, həm də kosinus dəyərlərini daxil etmək üçün “yerləşdirilmə_ölçüsü” ikiqat artırıldığından, 2-yə bölmək, yalnız daxiletmələrin kosinus komponentlərini effektiv şəkildə seçir.
Addım 3: Keras Modeli ilə İnteqrasiya
RotaryEmbeddingLayer
-ı təyin etdikdən sonra onu Keras modelinizə inteqrasiya edə bilərsiniz. Diqqət qatlarına və ya hər hansı sonrakı model qatlarına daxil edilməzdən əvvəl bu təbəqə daxiletmələrinizə tətbiq edilməlidir.
Budur, fırlanan yerləşdirmələri modelə necə inteqrasiya etməyin sadələşdirilmiş nümunəsi:
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Embedding, Dense
max_seq_len = 512
embedding_dim = 64
inp = Input(shape=(max_seq_len,))
x = Embedding(input_dim=10000, output_dim=embedding_dim)(inp)
x = RotaryEmbeddingLayer(dim=embedding_dim, max_seq_len=max_seq_len)(x)
# Add your model's layers here, e.g., Transformer blocks
x = Dense(1, activation='sigmoid')(x)
model = Model(inputs=inp, outputs=x)
model.summary()