RoFormer: Fırlanan Mövqe Yerləşdirmə ilə Təkmilləşdirilmiş Transformator

September 27, 2024 yeniləndi 7 dəqiqə oxundu

RoFormer: Fırlanan Mövqe Yerləşdirmə ilə Təkmilləşdirilmiş Transformator

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.

Reformer.pngCredit: 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şlayaraq dim (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ər dim 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əni dim = 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ə tinv_freq vektorlarının xarici hasilini hesablayır, nəticədə hər bir (i, j) elementinin t 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)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]:

  1. 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.

  2. 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.

  3. :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()