معرفی
راهنماهای زیادی وجود دارد که توضیح میدهند چگونه ترانسفورماتورها کار میکنند، و برای ایجاد شهود بر روی یک عنصر کلیدی از آنها - توکن و جاسازی موقعیت.
توکنهای جاسازی موضعی به ترانسفورماتورها اجازه میدهد تا روابط غیر صلب بین نشانهها (معمولاً کلمات) را نشان دهند، که در مدلسازی گفتار مبتنی بر زمینه ما در مدلسازی زبان بسیار بهتر است. در حالی که فرآیند نسبتاً ساده است، نسبتاً عمومی است و پیادهسازیها به سرعت تبدیل به بویلر میشوند.
در این راهنمای کوتاه، به نحوه استفاده از KerasNLP، افزونه رسمی Keras، برای اجرا نگاهی خواهیم انداخت.
PositionEmbedding
وTokenAndPositionEmbedding
.
KerasNLP
KerasNLP افزودنی افقی برای NLP است. در زمان نگارش، هنوز خیلی جوان است، در نسخه 0.3، و مستندات هنوز نسبتاً مختصر است، اما بسته فراتر از این است که فقط قابل استفاده باشد.
دسترسی به لایه های Keras را فراهم می کند، مانند TokenAndPositionEmbedding
, TransformerEncoder
و TransformerDecoder
، که ساخت ترانسفورماتورهای سفارشی را آسان تر از همیشه می کند.
برای استفاده از KerasNLP در پروژه ما، می توانید آن را از طریق نصب کنید pip
:
$ pip install keras_nlp
پس از وارد شدن به پروژه، می توانید از هر کدام استفاده کنید keras_nlp
لایه به عنوان یک لایه استاندارد Keras.
از Tokenization
کامپیوترها با اعداد کار می کنند. ما افکارمان را با کلمات بیان می کنیم. برای اینکه به رایانه اجازه دهیم از میان آنها عبور کند، باید کلمات را به شکلی به اعداد نگاشت کنیم.
یک راه معمول برای انجام این کار این است که به سادگی کلمات را به اعدادی که هر عدد صحیح نشان دهنده یک کلمه است، نگاشت کنید. مجموعه ای از کلمات یک واژگان ایجاد می کند و هر کلمه در واژگان یک نمایه می گیرد. بنابراین، میتوانید دنبالهای از کلمات را به دنبالهای از شاخصها تبدیل کنید نشانه:
def tokenize(sequence):
return tokenized_sequence
sequence = ['I', 'am', 'Wall-E']
sequence = tokenize(sequence)
print(sequence)
سپس این دنباله از نشانه ها را می توان در یک بردار متراکم جاسازی کرد که توکن ها را در فضای پنهان تعریف می کند:
[[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
لایه، که این کار را در زیر هود انجام می دهد:
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
...
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 ],
...
رفتن به جلو - پروژه دستی به پایان
طبیعت کنجکاو شما باعث می شود که بخواهید جلوتر بروید؟ توصیه می کنیم ما را بررسی کنید پروژه هدایت شده: زیرنویس تصویر با CNN و ترانسفورماتور با Keras.
در این پروژه هدایت شده - شما یاد خواهید گرفت که چگونه یک مدل شرح تصویر بسازید، که یک تصویر را به عنوان ورودی می پذیرد و یک عنوان متنی را به عنوان خروجی تولید می کند.
شما یاد خواهید گرفت که چگونه:
- پیش پردازش متن
- بردار کردن ورودی متن به راحتی
- کار با
tf.data
API و ایجاد مجموعه داده های عملکردی - ترانسفورماتورها را از ابتدا با TensorFlow/Keras و KerasNLP بسازید – افزودنی رسمی افقی به Keras برای ساخت مدل های پیشرفته NLP
- معماری های ترکیبی بسازید که در آن خروجی یک شبکه برای شبکه دیگر کدگذاری شود
چگونه کپشن عکس را قاب کنیم؟ بیشتر آن را نمونه ای از یادگیری عمیق مولد می دانند، زیرا ما به شبکه ای برای تولید توضیحات آموزش می دهیم. با این حال، من دوست دارم به آن به عنوان نمونه ای از ترجمه ماشین عصبی نگاه کنم - ما ویژگی های بصری یک تصویر را به کلمات ترجمه می کنیم. از طریق ترجمه، ما به جای اینکه صرفاً معنای جدیدی تولید کنیم، بازنمایی جدیدی از آن تصویر ایجاد می کنیم. مشاهده آن بهعنوان ترجمه، و تنها با تولید برنامههای افزودنی، کار را از منظری متفاوت انجام میدهد و آن را کمی شهودیتر میکند.
قاب بندی مسئله به عنوان یکی از ترجمه ها، تشخیص اینکه از کدام معماری می خواهیم استفاده کنیم را آسان تر می کند. ترانسفورماتورهای فقط رمزگذار در درک متن (تحلیل احساسات، طبقه بندی و غیره) عالی هستند زیرا رمزگذارها نمایش های معنی دار را رمزگذاری می کنند. مدلهای فقط رمزگشا برای تولید عالی هستند (مانند GPT-3)، زیرا رمزگشاها میتوانند نمایشهای معنیداری را به دنبالهای دیگر با همان معنی استنتاج کنند. ترجمه معمولاً توسط معماری رمزگذار-رمزگشا انجام می شود، جایی که رمزگذارها نمایش معنیداری از یک جمله (یا تصویر، در مورد ما) را رمزگذاری میکنند و رمزگشاها یاد میگیرند که این دنباله را به نمایش معنادار دیگری تبدیل کنند که برای ما قابل تفسیرتر است (مانند یک جمله).
نتیجه گیری
ترانسفورماتورها از سال 2017 موج بزرگی ایجاد کردهاند، و بسیاری از راهنماهای عالی بینشی در مورد نحوه کار آنها ارائه میدهند، با این حال، به دلیل هزینههای بالای پیادهسازی سفارشی، هنوز برای بسیاری گریزان بودند. KerasNLP این مشکل را برطرف می کند و بلوک های ساختمانی را ارائه می دهد که به شما امکان می دهد به جای ارائه راه حل های از پیش بسته بندی شده، سیستم های NLP انعطاف پذیر و قدرتمند بسازید.
در این راهنما، نگاهی به توکن و جاسازی موقعیت با Keras و KerasNLP انداختهایم.