از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ترانسفورماتور توکن و جاسازی موقعیت با Keras
سرفصلهای مطلب
معرفی
راهنماهای زیادی وجود دارد که روش عملکرد ترانسفورماتورها و ایجاد شهود را توضیح می دهد روی یک عنصر کلیدی از آنها – توکن و جاسازی موقعیت.
توکنهای جاسازی موقعیتی به ترانسفورماتورها اجازه میدهد تا روابط غیر صلب بین نشانهها (معمولاً کلمات) را نشان دهند، که در مدلسازی گفتار مبتنی بر زمینه ما در مدلسازی زبان بسیار بهتر است. در حالی که 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