Tá clú ar samhlacha atá bunaithe ar chlaochladán as a gcumas téacs casta a pharsáil agus a léirmhíniú. Braitheann siad ar ord agus ar chomhthéacs na bhfocal a thuiscint - tascanna ar léirigh modhanna traidisiúnta ionchódaithe suímh a dteorainneacha. Agus aghaidh á tabhairt ar an mbearna seo, déanann samhail ROFORMER, arna chumhachtú ag an Leabú Seasamh Rothlach (RoPE), ár gcur chuige maidir le hionchódú suímh a athshainiú.
Ionchódú Traidisiúnta ar Phoist
Caitheann trasfhoirmeoirí le téacs mar shraith comharthaí, agus ceadaíonn siad seichimh a phróiseáil go comhuaineach ar mhaithe le héifeachtúlacht níos fearr. Mar sin féin, thug an láidreacht seo a dhúshlán: agnosticism dúchasach na samhla in ord comharthaí. Ba é ionchódú poist an freagra, síniú uathúil a sholáthar do gach comhartha ag léiriú a shuíomh sa seicheamh.
Leabú Seasaimh Iomlán
Ar dtús, d'úsáid samhlacha ar nós CRET leabaithe suímh iomlána, ag sannadh veicteoir fosaithe do gach suíomh i seicheamh. Cé go bhfuil an modh seo simplí, go bunúsachníl an cumas ann oiriúnú d’éagsúlachtaí faid, nó béim a chur ar na faid choibhneasta idir comharthaí, rud atá ríthábhachtach chun go leor de na struchtúir theangeolaíocha a thuiscint.
Leabú Seasaimh Choibhneasta
Chun nádúr dinimiciúil na teanga a léiriú, tugadh isteach leabú suímh choibhneasta, ag díriú ar an achar idir comharthaí seachas a ndearbhshuímh. In ainneoin a mbuntáiste coincheapúil, thug na leabaithe seo isteach castacht ríomhaireachtúil, agus níor éirigh leo comhtháthú gan uaim i meicníocht féin-aird na gClaochladáin, rud a chuir srian lena n-éifeachtúlacht.
ROFORMER agus Leabú Seasamh Rothlach
Agus teorainneacha na straitéisí ionchódaithe suímh atá ann cheana féin á n-aithint, tugann ROFORMER isteach Leabú Seasamh Rothlach (RoPE), cur chuige a chomhcheanglaíonn na buntáistí a bhaineann le faisnéis maidir le seasamh iomlán agus coibhneasta gan a gcuid míbhuntáistí faoi seach.
Leabú Seasamh Rothlach
Ionchódaíonn RoPE faisnéis suímh trí úsáid a bhaint as maitrísí rothlaithe, rud a chuireann ar chumas an mhúnla a thuiscint ní hamháin cá bhfuil comhartha, ach conas a bhaineann sé le gach comhartha eile i seicheamh.
Credit: ArXiv
Feidhmíonn sé trí lionsa geoiméadrach, ag déileáil le suímh chomharthaí mar phointí i spás iltoiseach atá rothlaithe chun a gcaidreamh seicheamhach a mharcáil. Ligeann an rothlú seo don mhúnla leideanna suímh iomlána agus coibhneasta araon a chaomhnú agus a shaothrú laistigh dá meicníocht féin-aire.
RoPE a chur i bhfeidhm
Is éard atá i gceist le RoPE a chur i bhfeidhm suíomh gach comhartha a ionchódú isteach i maitrís uainíochta, agus an maitrís seo a chur i bhfeidhm laistigh de mheicníocht féin-aire an Trasfhoirmeora. Ligeann an próiseas seo do léirmhíniú solúbtha, dinimiciúil ar fhaisnéis suímh, a fhreastalaíonn ar fhaid éagsúla seichimh agus a ghabháil le croílár na n-idirghaolmhaireachtaí comharthaí gan forchostais ríomhaireachtúla suntasacha.
Ar dtús, beidh feidhm uait chun na leabaithe rothlacha a ghiniúint, agus ansin déanfaidh tú na leabaithe seo a chomhtháthú isteach i do mhúnla. Glacann an sampla thíos leis go bhfuil tú eolach ar shraitheanna saincheaptha a chruthú i Keras.
Céim 1: Sainmhínigh an Fheidhm Leabaithe Rothlach
Gineann an fheidhm seo na leabaithe rothlacha nuair a thugtar an t-uasfhad seicheamh, agus toiseacht na leabaithe.
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))
Ríomhann an líne seo inbhéartach na minicíochtaí de réir scála easpónantúil bunaithe ar na hinnéacsanna suímh. Úsáidtear na minicíochtaí seo chun patrúin sinusoidal a ghiniúint le haghaidh leabaithe rothlacha, rud a chabhraíonn leis an eolas suímh choibhneasta a ionchódú i seichimh. Tá an mheicníocht seo an-úsáideach i dtascanna ina bhfuil sé ríthábhachtach ord agus suíomh coibhneasta na n-eilimintí a thuiscint, mar shampla i bpróiseáil teanga nádúrtha nó in anailís amshraitheanna.
I sonraí:
-
cruthaíonn
tf.range(0, dim, 2, dtype=tf.float32)
raon luachanna ag tosú ó 0 go dtídim
(eisiach), céim ar 2. Sonraíonn an argóintdtype=tf.float32
gur uimhreacha snámhphointe 32-giotán iad eilimintí an tensor seo. Más édim
ná 8, mar shampla, thairgfeadh sé seo[0, 2, 4, 6]
. -
Roinntear an tensor a tháirgtear le
tf.range
ansin ar thoise (dim
) na leabaithe. Scálaíonn an oibríocht seo na hinnéacsanna seo síos go dtí raon idir 0 agus 1 (seachas má tádim
cothrom, rud beag cuimsitheach má tádim
corr, toisc go scipeann céim an raoin gach luach eile). Ag leanúint leis an sampla ledim
= 8, á roinnt ar 8 toradh[0.0, 0.25, 0.5, 0.75]
. -
Ardaíonn an oibríocht
10000 ** (...)
10,000 go dtí cumhacht gach eilimint sa tensor scálaithe roimhe seo. Tá bonn 10,000 beagán treallach, ach roghnaítear é chun a chinntiú go n-athraíonn na minicíochtaí thar raon leathan, rud a chabhraíonn leis an tsamhail idirdhealú níos éifeachtaí a dhéanamh idir seasaimh éagsúla. I gcás[0.0, 0.25, 0.5, 0.75]
, chuirfeadh sé an oibríocht chumhachta i bhfeidhm ar gach ceann acu, rud a d'fhág go mbeadh luachanna i bhfad níos mó le haghaidh eilimintí níos airde. -
Ar deireadh, faightear an mhinicíocht inbhéartach trí chómhalartach (1/x) na luachanna a ghlacadh ón gcéim roimhe seo. Tá na minicíochtaí inbhéartacha níos lú le haghaidh innéacsanna níos airde, rud a chiallaíonn go mbeidh minicíochtaí níos lú ag eilimintí níos faide sa seicheamh, rud a chuireann isteach ar an gcaoi a ndéantar a suíomhanna a ionchódú sa mhúnla. Ligeann sé seo do na leabaithe scála a dhéanamh ar bhealach inar féidir seasaimh choibhneasta a thuiscint trí mheicníochtaí aird na samhla.
An líne:
freqs = tf.einsum('i,j->ij', t, inv_freq)
Úsáideann TensorFlow feidhm tf.einsum
, uirlis a ligeann do léiriú gonta agus éifeachtach ar oibríochtaí tensor ag baint úsáide as nodaireacht suimiúcháin Einstein.
Ríomhann an oibríocht seo go héifeachtach táirge seachtrach na veicteoirí t
agus inv_freq
, agus mar thoradh air sin bíonn maitrís ann inarb ionann gach eilimint (i, j)
agus táirge na heiliminte i
-ú det
agus `` j-ú eilimint de
inv_freq. Léiríonn an maitrís seo (
freqs`) na minicíochtaí a úsáidtear chun na patrúin sinusoidal a ghiniúint do na leabaithe rothlacha.
Céim 2: Ciseal Keras Saincheaptha le haghaidh Leabaithe Rothlacha
Anois, déanaimis ciseal Keras saincheaptha a chruthú a chuireann leabaithe rothlacha i bhfeidhm ar an tensor ionchuir. Glacann an ciseal seo leis gur cruth (batch_size, sequence_length, embedding_dim)
atá san tensor ionchuir.
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
Roghnaíonn an líne leabaithe = self.rotary_embeddings[:seq_len]
an fothacar cuí de leabaithe rothlacha réamhríofa bunaithe ar fhad an tseichimh ionchuir reatha. Ós rud é gur féidir le fad na sraitheanna a bheith éagsúil ó bhaisc amháin go ceann eile, cinntíonn an oibríocht slicing seo nach n-úsáidtear ach na leabaithe a fhreagraíonn don fhad seicheamh iarbhír.
Coinníonn an athróg leabaithe
tensor cruth (seq_len, leabú_dim)
anois, áit arb é seq_len
fad na seicheamh sa bhaisc reatha, agus is é embedding_dim
toiseachas na leabaithe. Cuimsítear sa tensor seo na leabaithe suímh rothlacha do gach suíomh sa seicheamh suas go dtí seq_len
.
Comhcheanglaíonn emb = tf.concat((tf.cos(freqs), tf.sin(minics)), ais=-1)
claochluithe sín agus comhshíneas de mhinicíochtaí suímh in aon teanntóir amháin:
Baineann -tf.cos(freqs)
agus tf.sin(freqs)
na claochluithe comhshíne agus sínis, faoi seach, leis an tensor freqs
. Cuimsítear sa tensor freqs
luachanna minicíochta do gach suíomh sa seicheamh ionchuir agus do gach toise den spás leabaithe, arna ríomh bunaithe ar shuímh an tseichimh agus ar mhinicíochtaí inbhéartacha na dtoisí leabaithe. Cuirtear na feidhmeanna sín agus cosine i bhfeidhm ar bhonn eiliminteach, rud a fhágann go mbíonn dhá thoisitheoir den chruth céanna le freqs
. Cabhraíonn na claochluithe seo le hionchódú an tsuímh ar bhealach a thugann léargas ar nádúr timthriallach na gcaidrimh shuímh, ag éascú cumas na samhla chun suíomhanna coibhneasta a thuiscint.
- tf.concat((tf.cos(freqs), tf.sin(freqs)), ais=-1)
comhdhlúthaíonn sé na teannasóirí cósine agus síonchlaochlaithe feadh na haise deiridh (arna sonrú ag ais=-1
). Má dhéantar na teanntóirí seo a chomhchalú taobh le taobh, déantar toise an tensor freqs
a dhúbailt go héifeachtach, agus seasann an chéad leath do luachanna comhshóite agus seasann an dara leath do luachanna sínis-chlaochlaithe do gach suíomh. Cinntíonn an comhghatánú go bhfuil faisnéis sín agus comhshíneas i ngach ionchódú suímh, rud a cheadaíonn faisnéis a chaomhnú faoi aimplitiúid agus faoi chéim na gcomharthaí suímh.
- Tá na leabaithe rothlacha iomlána do na suíomhanna ionchuir anois ag an
emb
tensor comhtháite. Beidh cruthemb
mar an gcéanna lefreqs
sa chéad dá thoise (a fhreagraíonn do shuímh seichimh agus toisí leabú), ach beidh a thoise deiridh dhá uair chomh mór, ag cur san áireamh luachanna sínis agus comhshíne araon. Úsáidtear na leabaithe seo chun na leabaithe ionchuir a mhodhnú trí fhaisnéis suímh a chur leis ar mhodh coibhéiseach rothlach.
-cos_emb = leabaithe[:, Dada, :self.dim // 2]
:
-
Ciallaíonn an chéad idirstad
:
"roghnaigh gach eilimint sa ghné seo," a thagraíonn, sa chás seo, do gach seasamh sa seicheamh. -
Ní úsáidtear
none
chun gné bhreise a chur leis, rud a fhágann go bhfuil an tensor 3-thoiseach. Is minic a dhéantar é seo chun comhoiriúnacht le hoibríochtaí áirithe a bhfuiltear ag súil le hionchuir de líon sonrach toisí a áirithiú. Mar shampla, nuair a bhíonn iolrú gné-chiallmhar á déanamh le tensor eile atá 3-tríthoiseach, ní mór na cruthanna a ailíniú de réir rialacha craolacháin. -
:self.dim // 2
, roghnaíonn an chéad leath de na toisí san ais dheireanach. Ós rud é go ndéantar an `toise_leabú' a dhúbailt chun luachanna sínis agus comhshíne a chur san áireamh, ní roghnaíonn roinnt ar 2 ach comhpháirteanna an chomhshíne sna leabaithe.
Céim 3: Comhtháthú le Múnla Keras
Tar éis duit an RotaryEmbeddingLayer
a shainiú, is féidir leat é a chomhtháthú isteach i do mhúnla Keras. Ba chóir an ciseal seo a chur i bhfeidhm ar do leabaithe sula gcuirtear iad i sraitheanna aird nó i sraitheanna múnla ar bith ina dhiaidh sin.
Seo sampla simplithe de conas na leabaithe rothlacha a chomhtháthú i múnla:
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()