وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

ترانسفورماتور توکن و جاسازی موقعیت با Keras

0 1
زمان لازم برای مطالعه: 4 دقیقه


معرفی

راهنماهای زیادی وجود دارد که روش عملکرد ترانسفورماتورها و ایجاد شهود را توضیح می دهد روی یک عنصر کلیدی از آنها – توکن و جاسازی موقعیت.

توکن‌های جاسازی موقعیتی به ترانسفورماتورها اجازه می‌دهد تا روابط غیر صلب بین نشانه‌ها (معمولاً کلمات) را نشان دهند، که در مدل‌سازی گفتار مبتنی بر زمینه ما در مدل‌سازی زبان بسیار بهتر است. در حالی که process نسبتا ساده است، نسبتاً عمومی است و پیاده سازی ها به سرعت تبدیل به دیگ بخار می شوند.

در این راهنمای کوتاه، روش استفاده از KerasNLP، افزونه رسمی Keras را بررسی خواهیم کرد.روی، اجرا کردن PositionEmbedding و TokenAndPositionEmbedding.

KerasNLP

KerasNLP افزودنی افقی برای NLP است. در زمان نگارش، هنوز خیلی جوان است، در نسخه 0.3، و مستندات هنوز نسبتاً مختصر است، اما بسته فراتر از این است که فقط قابل استفاده باشد.

دسترسی به لایه های Keras را فراهم می کند، مانند TokenAndPositionEmbedding، TransformerEncoder و TransformerDecoder، که ساخت ترانسفورماتورهای سفارشی را آسان تر از همیشه می کند.

برای استفاده از KerasNLP در پروژه ما، می توانید آن را از طریق نصب کنید pip:

$ pip install keras_nlp

پس از وارد شدن به پروژه، می توانید از هر کدام استفاده کنید keras_nlp لایه به عنوان یک لایه استاندارد Keras.

توکن سازی

کامپیوترها با اعداد کار می کنند. ما افکارمان را با کلمات بیان می کنیم. برای اینکه به رایانه‌ها اجازه دهیم آنها را به هم بریزند، باید کلمات را به شکلی به اعداد نگاشت کنیم.

یک راه معمول برای انجام این کار این است که به سادگی کلمات را به اعدادی که هر عدد صحیح نشان دهنده یک کلمه است، نگاشت کنید. مجموعه ای از کلمات یک واژگان ایجاد می کند و هر کلمه در واژگان یک نمایه می گیرد. بنابراین، می‌توانید دنباله‌ای از کلمات را به دنباله‌ای از شاخص‌ها تبدیل کنید توکن ها:

def tokenize(sequence):
    
    return tokenized_sequence

sequence = ('I', 'am', 'Wall-E')
sequence = tokenize(sequence)
print(sequence) 

با Keras، توکن‌سازی معمولاً از طریق آن انجام می‌شود TextVectorization لایه، که به طرز شگفت انگیزی برای طیف گسترده ای از ورودی ها کار می کند و چندین حالت خروجی را پشتیبانی می کند (که حالت پیش فرض وجود دارد int که همانطور که قبلا توضیح داده شد کار می کند):


vectorize = keras.layers.TextVectorization(
    max_tokens=max_features,
    output_mode='int',
    output_sequence_length=max_len)


vectorize.adapt(text_dataset)

vectorized_text = vectorize(('some input'))

می‌توانید از این لایه به‌عنوان یک لایه مستقل برای پیش‌پردازش یا به‌عنوان بخشی از مدل Keras استفاده کنید تا پیش‌پردازش واقعاً سرتاسر باشد و ورودی خام به مدل ارائه شود. هدف این راهنما نشانه است تعبیه کردن، نه نشانه گذاری، بنابراین من بیشتر به لایه، که موضوع اصلی راهنمای دیگری خواهد بود، فرو نخواهم رفت.

سپس این دنباله از نشانه ها را می توان در یک بردار متراکم جاسازی کرد که توکن ها را در فضای پنهان تعریف می کند:

((4), (26), (472)) -> ((0.5, 0.25), (0.73, 0.2), (0.1, -0.75))

این کار معمولا با Embedding لایه در کراس. ترانسفورماتورها فقط با استفاده از یک استاندارد کدگذاری نمی کنند Embedding لایه. اجرا می کنند Embedding و PositionEmbedding، و آنها را با هم جمع کنید، جاسازی های منظم را با موقعیت آنها در فضای پنهان جابه جا کنید.

با KerasNLP – اجرا TokenAndPositionEmbedding ترکیبی از تعبیه نشانه های منظم (Embedding) با تعبیه موقعیتی (PositionEmbedding).

جاسازی موقعیت

بیایید نگاهی به PositionEmbedding اولین. تانسورها و تانسورهای ژنده‌دار را می‌پذیرد و فرض می‌کند که بعد نهایی نمایانگر ویژگی‌ها است، در حالی که بعد دوم تا آخر نشان‌دهنده دنباله است.

# Seq
(5, 10)
     # Features

لایه a را می پذیرد sequence_length آرگومان، نشان دهنده طول توالی ورودی و خروجی است. بیایید جلو برویم و یک تانسور یکنواخت تصادفی را به صورت موقعیتی جاسازی کنیم:

seq_length = 5
input_data = tf.random.uniform(shape=(5, 10))

input_tensor = keras.Input(shape=(None, 5, 10))
output = keras_nlp.layers.PositionEmbedding(sequence_length=seq_length)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data)

این نتیجه در:

<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array((( 0.23758471, -0.16798696, -0.15070847,  0.208067  , -0.5123104 ,
        -0.36670157,  0.27487397,  0.14939266,  0.23843127, -0.23328197),
       (-0.51353353, -0.4293166 , -0.30189738, -0.140344  , -0.15444171,
        -0.27691704,  0.14078277, -0.22552207, -0.5952263 , -0.5982155 ),
       (-0.265581  , -0.12168896,  0.46075982,  0.61768025, -0.36352775,
        -0.14212841, -0.26831496, -0.34448475,  0.4418767 ,  0.05758983),
       (-0.46500492, -0.19256318, -0.23447984,  0.17891657, -0.01812166,
        -0.58293337, -0.36404118,  0.54269964,  0.3727749 ,  0.33238482),
       (-0.2965023 , -0.3390794 ,  0.4949159 ,  0.32005525,  0.02882379,
        -0.15913549,  0.27996767,  0.4387421 , -0.09119213,  0.1294356 )),
      dtype=float32)>

TokenAndPositionEmbedding

توکن و جاسازی موقعیت به استفاده خلاصه می شود Embedding روی دنباله ورودی، PositionEmbedding روی نشانه‌های تعبیه‌شده، و سپس افزودن این دو نتیجه با هم، به طور موثر جاسازی‌های نشانه را در فضا جابه‌جا می‌کنند تا روابط معنی‌دار نسبی آنها را رمزگذاری کنند.

این از نظر فنی می تواند به صورت زیر انجام شود:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=(5, 10))

input_tensor = keras.Input(shape=(None, 5, 10))
embedding = keras.layers.Embedding(vocab_size, embed_dim)(input_tensor)
position = keras_nlp.layers.PositionEmbedding(seq_length)(embedding)
output = keras.layers.add((embedding, position))
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

ورودی ها تعبیه می شوند و سپس به صورت موقعیتی جاسازی می شوند، پس از آن با هم جمع می شوند و یک شکل جاسازی شده در موقعیت جدید ایجاد می کنند. به طور متناوب، می توانید از اهرم استفاده کنید TokenAndPositionEmbedding لایه، که این کار را در زیر هود انجام می دهد:

... 
def call(self, inputs):
        embedded_tokens = self.token_embedding(inputs)
        embedded_positions = self.position_embedding(embedded_tokens)
        outputs = embedded_tokens + embedded_positions
        return outputs

این باعث می شود عملکرد آن بسیار تمیزتر شود TokenAndPositionEmbedding:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=(5, 10))

input_tensor = keras.Input(shape=(None, 5, 10))
output = keras_nlp.layers.TokenAndPositionEmbedding(vocabulary_size=vocab_size, 
                                                     sequence_length=seq_length, 
                                                     embedding_dim=embed_dim)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

داده‌هایی که به لایه منتقل کرده‌ایم اکنون به صورت موقعیتی در یک فضای پنهان از 10 بعد جاسازی شده‌اند:

model(input_data)
<tf.Tensor: shape=(5, 10, 10), dtype=float32, numpy=
array((((-0.01695484,  0.7656435 , -0.84340465,  0.50211895,
         -0.3162892 ,  0.16375223, -0.3774369 , -0.10028353,
         -0.00136751, -0.14690581),
        (-0.05646318,  0.00225556, -0.7745967 ,  0.5233861 ,
         -0.22601983,  0.07024342,  0.0905793 , -0.46133494,
         -0.30130145,  0.451248  ),
         ...

نتیجه گیری

ترانسفورماتورها از سال 2017 موج بزرگی ایجاد کرده‌اند، و بسیاری از راهنماهای عالی بینشی در مورد روش کار آنها ارائه می‌دهند، با این حال، به دلیل هزینه‌های بالای پیاده‌سازی سفارشی، هنوز برای بسیاری گریزان هستند. KerasNLP با ارائه بلوک‌های ساختمانی که به شما امکان می‌دهد سیستم‌های NLP انعطاف‌پذیر و قدرتمند بسازید، به جای ارائه راه‌حل‌های از پیش بسته‌بندی شده، این مشکل را برطرف می‌کند.

در این راهنما، نگاهی به توکن و جاسازی موقعیت با Keras و KerasNLP انداخته‌ایم.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-04 08:58:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید