Трансформаторго негизделген моделдер татаал текстти талдоо жана чечмелөө жөндөмдүүлүгү менен белгилүү. Алар сөздөрдүн тартибин жана контекстти түшүнүүгө таянышат - салттуу позициялык коддоо ыкмалары өз чегин көрсөткөн тапшырмалар. Бул боштукту чечип, Rotary Position Embedding (RoPE) менен иштетилген ROFORMER модели позициялык коддоого болгон мамилебизди кайра аныктайт.
Салттуу позициялык коддоо
Трансформаторлор текстти бир катар токендер катары карашат жана эффективдүүлүгүн жогорулатуу үчүн ырааттуулуктарды параллелдүү иштетүүгө мүмкүндүк берет. Бирок, бул күч өзүнүн чакырыгын алып келди: моделге мүнөздүү агностицизм белги тартибине. Позициондук коддоо жооп болду, ар бир токенге анын ырааттуулугун билдирген уникалдуу колтамга берүү.
Абсолюттук позицияны орнотуу
Башында, BERT сыяктуу моделдер абсолюттук позицияны кыстарууларды колдонуп, ар бир позицияга ырааттуулукта туруктуу векторду дайындашкан. Бул ыкма жөнөкөй болсо да, табиятынан катар узундуктагы вариацияларга ыңгайлашууга же токендердин ортосундагы салыштырмалуу аралыктарды баса белгилөө жөндөмүнө ээ эмес, көптөгөн тилдик түзүлүштөрдү түшүнүү үчүн маанилүү.
Салыштырмалуу Позиция кыстаруу
Тилдин динамикалык табиятын чагылдыруу үчүн, алардын абсолюттук позицияларына эмес, токендердин ортосундагы аралыкка көңүл буруп, салыштырмалуу позицияларды кыстаруу киргизилген. Концептуалдык артыкчылыгына карабастан, бул орнотуулар эсептөө татаалдыгын киргизип, Transformers өзүнө көңүл буруу механизмине үзгүлтүксүз интеграциялана алган жок, бул алардын эффективдүүлүгүн чектеди.
ROFORMER жана Rotary Position Embedding
Учурдагы позициялык коддоо стратегияларынын чектөөлөрүн моюнга алуу менен, ROFORMER Rotary Position Embedding (Rotary Position Embedding) ыкмасын киргизет, ал абсолюттук жана салыштырмалуу позиция маалыматынын артыкчылыктарын алардын кемчиликтерисиз айкалыштырган.
Rotary Position Embedding
RoPE позициялык маалыматты айлануу матрицаларынын жардамы менен коддойт, бул моделге токендин кайда экенин гана эмес, анын ырааттуулуктагы ар бир башка токенге кандай байланышы бар экенин түшүнүүгө мүмкүндүк берет.
Credit: ArXiv
Ал геометриялык линза аркылуу иштейт, токендердин позицияларын алардын ырааттуу мамилелерин белгилөө үчүн бурулган көп өлчөмдүү мейкиндиктеги чекиттер катары карайт. Бул айлануу моделге өзүнө көңүл буруу механизминин алкагында абсолюттук жана салыштырмалуу позициялык сигналдарды сактоого жана пайдаланууга мүмкүндүк берет.
RoPE ишке ашыруу
RoPEди ишке ашыруу ар бир токендин абалын айлануу матрицасына коддоону жана бул матрицаны Трансформатордун өзүнө көңүл буруу механизминин ичинде колдонууну камтыйт. Бул процесс позициялык маалыматты ийкемдүү, динамикалык чечмелөөгө мүмкүндүк берет, ар кандай ырааттуулуктун узундугун камтыган жана олуттуу эсептөө чыгымдары жок токендердин өз ара байланыштарынын маңызын чагылдырат.
Биринчиден, сизге айланма кыстарууларды түзүү үчүн функция керек болот, андан кийин бул жалгаштырууларды моделиңизге бириктиресиз. Төмөнкү мисалда сиз Кераста ыңгайлаштырылган катмарларды түзүү менен таанышсыз деп болжолдойт.
1-кадам: Айлануучу кыстаруу функциясын аныктаңыз
Бул функция катардын максималдуу узундугун жана кыстаруулардын өлчөмдүүлүгүн эске алуу менен айлануучу кыстарууларды жаратат.
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))
Бул сызык позициянын индекстеринин негизинде экспоненциалдык масштабдуу жыштыктардын тескерисин эсептейт. Бул жыштыктар ротордук кыстаруу үчүн синусоидалдык схемаларды түзүүдө колдонулат, бул ырааттуулуктагы салыштырмалуу позициялык маалыматты коддоого жардам берет. Бул механизм өзгөчө элементтердин тартибин жана салыштырмалуу жайгашуусун түшүнүү өтө маанилүү болгон тапшырмаларда, мисалы, табигый тилди иштетүүдө же убакыт серияларын талдоодо пайдалуу.
Толук маалымат:
-
tf.range(0, dim, 2, dtype=tf.float32)
0дөн баштап 'dim'ге (эксклюзив) чейинки маанилердин диапазонун түзүп, 2ге кадам жасайт.dtype=tf.float32
аргументи аныктайт бул тензордун элементтери 32 биттик калкыма чекиттүү сандар. Эгердеdim
8 болсо, мисалы, бул[0, 2, 4, 6]
чыгарат. -
tf.range
тарабынан өндүрүлгөн тензор андан кийин кыстаруулардын өлчөмдүүлүгүнө (dim
) бөлүнөт. Бул операция бул индекстерди 0 жана 1 ортосундагы диапазонго чейин ылдыйлатат (эгердекүмүрлүү
жуп болсо, эксклюзивдүү, эгердекүңүрөйт
так болсо, бир аз камтылат, анткени диапазон кадамы башка бардык маанилерди өткөрүп жиберет). Мисалдыdim
= 8 менен улантуу, 8ге бөлүү[0,0, 0,25, 0,5, 0,75]
болот. -
10000 ** (...)
операциясы мурда масштабдуу тензордогу ар бир элементтин кубаттуулугуна 10 000 көтөрөт. 10 000дин базасы кандайдыр бир ыктыярдуу, бирок жыштыктар кеңири диапазондо өзгөрүп турушун камсыз кылуу үчүн тандалып алынган, бул моделге ар кандай позицияларды натыйжалуураак айырмалоого жардам берет.[0,0, 0,25, 0,5, 0,75]
үчүн, ал ар бирине кубаттуулук операциясын колдонот, натыйжада жогорку элементтер үчүн маанилер алда канча чоң болот. -
Акырында тескери жыштык мурунку кадамдагы маанилердин өз ара (1/х) алынышы менен алынат. Тескери жыштыктар жогорку индекстер үчүн кичирээк, демек, ырааттуулуктагы элементтер азыраак жыштыктарга ээ болуп, алардын позициялары моделге кантип коддолгонуна таасир этет. Бул кыстарууларды моделдин көңүл буруу механизмдери аркылуу салыштыруу позицияларын аныктоого мүмкүндүк берет.
сап:
freqs = tf.einsum('i,j->ij', t, inv_freq)
TensorFlow'тун "tf.einsum" функциясын колдонот, бул курал Эйнштейндин суммалоо нотасын колдонуу менен тензордук операцияларды кыска жана эффективдүү туюндуруп алууга мүмкүндүк берет.
Бул операция t
жана inv_freq
векторлорунун тышкы продуктусун эффективдүү эсептейт, натыйжада ар бир (i, j)
элементи t
жана
i-чу элементинин продуктусу болгон матрица пайда болот. j
- inv_freq
элементи. Бул матрица (freqs
) айланма кыстармалар үчүн синусоидалдык схемаларды түзүү үчүн колдонулган жыштыктарды билдирет.
2-кадам: Айлануучу кыстаруу үчүн ыңгайлаштырылган Керас катмары
Эми, кирүүчү тензорго айлануучу жалгаштырууларды колдонгон ыңгайлаштырылган Keras катмарын түзөлү. Бул катмар киргизүү тензору `(партиянын_өлчөмү, ырааттуулугу_узундугу, кыстаруу_чыгармалары)' формасында деп болжолдойт.
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]
сабы учурдагы киргизүү ырааттуулугунун узундугунун негизинде алдын ала эсептелген айлануучу кыстаруулардын тиешелүү ички топтомун тандайт. Ырааттуулуктун узундугу бир партиядан экинчисине ар кандай болушу мүмкүн болгондуктан, бул кесүү операциясы ырааттуулуктун чыныгы узундугуна туура келген кыстармалар гана колдонулушун камсыздайт.
Эми embeddings
өзгөрмөсүндө форманын тензору бар (seq_len, embedding_dim)
, мында seq_len
учурдагы партиядагы ырааттуулуктун узундугу, ал эми embedding_dim
кыстаруулардын өлчөмдүүлүгү. Бул тензор seq_len
ге чейинки ырааттуулуктагы ар бир позиция үчүн айлануучу позициялык кыстарууларды камтыйт.
emb = tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1)
позициялык жыштыктардын синус жана косинус трансформацияларын бир тензорго бириктирет:
-tf.cos(freqs)
жана tf.sin(freqs)
freqs
тензоруна тиешелүүлүгүнө жараша косинус жана синус трансформацияларын колдонот. freqs
тензору киргизүү ырааттуулугундагы ар бир позиция жана кыстаруу мейкиндигинин ар бир өлчөмү үчүн жыштык маанилерин камтыйт, алар ырааттуулуктун позицияларынын жана кыстаруу өлчөмдөрүнүн тескери жыштыктарынын негизинде эсептелинет. Синус жана косинус функциялары элементтер боюнча колдонулат, натыйжада freqs
менен бирдей формадагы эки тензор пайда болот. Бул трансформациялар позицияны коддоого жардам берип, позициялык мамилелердин циклдик мүнөзүн чагылдырып, моделдин салыштырмалуу позицияларды түшүнүү жөндөмүн жеңилдетет.
-tf.concat((tf.cos(freqs), tf.sin(freqs)), axis=-1)
акыркы огу боюнча косинус менен синус түрүндөгү тензорлорду бириктирет (ax=-1
менен белгиленет). Бул тензорлорду жанаша бириктирүү "freqs" тензорунун өлчөмдүүлүгүн эффективдүү эки эсеге көбөйтөт, анын биринчи жарымы косинус-трансформацияланган маанилерди, экинчи жарымы ар бир позиция үчүн синус-трансформацияланган маанилерди билдирет. Конкатенация ар бир позициялык коддоо синус жана косинус маалыматын камтууга кепилдик берет, бул позициялык сигналдардын амплитудасы жана фазасы жөнүндө маалыматты сактоого мүмкүндүк берет.
- Бириктирилген тензор
emb
азыр киргизүү позициялары үчүн толук айлануучу кыстарууларды камтыйт. "Emb" формасы анын алгачкы эки өлчөмүндөгү "freqs" менен бирдей болот (ырааттуулуктун позицияларына жана кыстаруу өлчөмдөрүнө туура келет), бирок анын акыркы өлчөмү синус жана косинус маанилерин эсепке алуу менен эки эсе чоң болот. Бул жалгаштыруу позициялык маалыматты айлануу эквиварианттык жол менен кошуу менен киргизилген киргизүүлөрдү модуляциялоо үчүн колдонулат.
-cos_emb = embeddings[:, None, :self.dim // 2]
:
-
Биринчи кош чекит
:
"бул өлчөмдөгү бардык элементтерди тандоо" дегенди билдирет, бул учурда ырааттуулуктагы бардык позицияларды билдирет. -
“Жок” кошумча өлчөм кошуу үчүн колдонулат, тензорду 3 өлчөмдүү кылат. Бул көп учурда белгилүү бир өлчөмдөгү киргизүүлөрдү күткөн белгилүү операциялар менен шайкештикти камсыз кылуу үчүн жасалат. Мисалы, 3 өлчөмдүү башка тензор менен элементтик көбөйтүүнү аткарганда, формалар берүү эрежелерине ылайык тегизделиши керек.
-
:self.dim // 2
, акыркы огундагы өлчөмдөрдүн биринчи жарымын тандайт. 'Embedding_dimension' эки эсеге көбөйтүлгөндүктөн, синус менен косинус маанилерин да камтыгандыктан, 2ге бөлүү натыйжалуу кыстаруулардын косинус компоненттерин гана тандайт.
3-кадам: Керас модели менен интеграция
"RotaryEmbeddingLayer" аныктагандан кийин, сиз аны Keras моделиңизге интеграциялай аласыз. Бул катмар кыстармаларыңызды көңүл катмарларына же ар кандай кийинки моделдик катмарларга киргизүүдөн мурун колдонушу керек.
Моделге айланма кыстармаларды кантип интеграциялоонун жөнөкөйлөштүрүлгөн мисалы:
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()