Вступ
Є багато посібників, які пояснюють, як працюють трансформатори, і для створення інтуїції щодо їхнього ключового елемента – вбудовування токенів і позицій.
Позиційне вбудовування токенів дозволило трансформаторам представляти нежорсткі зв’язки між лексемами (як правило, словами), що набагато краще моделює наше контекстне мовлення в мовному моделюванні. Хоча процес відносно простий, він досить загальний, і реалізації швидко стають шаблонними.
У цьому короткому посібнику ми розглянемо, як можна використовувати KerasNLP, офіційне доповнення Keras, щоб
PositionEmbedding
таTokenAndPositionEmbedding
.
KerasNLP
KerasNLP є горизонтальним доповненням для НЛП. На момент написання, він ще дуже молодий, у версії 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)
Потім цю послідовність токенів можна вставити в щільний вектор, який визначає токени в прихованому просторі:
[[4], [26], [472]] -> [[0.5, 0.25], [0.73, 0.2], [0.1, -0.75]]
Зазвичай це робиться за допомогою Embedding
шар у Keras. Трансформери кодують не лише за стандартом Embedding
шар. Вони виконують Embedding
та PositionEmbedding
, і додайте їх разом, зміщуючи звичайні вкладення їхньою позицією в прихованому просторі.
З KerasNLP – виконання TokenAndPositionEmbedding
поєднує звичайне вбудовування маркерів (Embedding
) з позиційним вбудовуванням (PositionEmbedding
).
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 з передовими методами, прийнятими в галузі стандартами та включеною шпаргалкою. Припиніть гуглити команди 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 і Transformers за допомогою Keras».
У цьому керованому проекті ви дізнаєтеся, як створити модель підписів до зображень, яка приймає зображення як вхідні дані та створює текстові підписи як вихідні дані.
Ви дізнаєтесь, як:
- Попередня обробка тексту
- Легко векторизуйте введений текст
- Робота з
tf.data
API та створення ефективних наборів даних - Створюйте Transformers з нуля за допомогою TensorFlow/Keras і KerasNLP – офіційного горизонтального доповнення до Keras для створення найсучасніших моделей NLP
- Створюйте гібридні архітектури, де вихідні дані однієї мережі кодуються для іншої
Як ми створюємо рамки для підписів до зображень? Більшість вважає це прикладом генеративного глибокого навчання, оскільки ми навчаємо мережу створювати описи. Однак мені подобається дивитися на це як на приклад нейронного машинного перекладу – ми перекладаємо візуальні характеристики зображення в слова. Завдяки перекладу ми створюємо нове представлення цього образу, а не просто створюємо нове значення. Перегляд цього як перекладу та лише генерації розширень показує задачу в іншому світлі та робить її трохи інтуїтивнішою.
Розглядаючи проблему як проблему перекладу, легше буде зрозуміти, яку архітектуру ми хочемо використовувати. Трансформери лише для кодувальників чудово розуміють текст (аналіз настроїв, класифікація тощо), оскільки кодувальники кодують осмислені представлення. Моделі лише з декодером чудово підходять для генерації (наприклад, GPT-3), оскільки декодери здатні виводити значущі представлення в іншу послідовність із тим самим значенням. Переклад зазвичай виконується за допомогою архітектури кодера-декодера, де кодери кодують значуще представлення речення (або зображення, у нашому випадку), а декодери вчаться перетворювати цю послідовність в інше значуще представлення, яке ми краще інтерпретуємо (наприклад, речення).
Висновки
З 2017 року Transformers викликали велику хвилю, і багато чудових посібників пропонують уявлення про те, як вони працюють, але вони все ще були невловимі для багатьох через накладні витрати на користувальницькі реалізації. KerasNLP вирішує цю проблему, надаючи будівельні блоки, які дозволяють створювати гнучкі, потужні системи NLP, а не надавати готові рішення.
У цьому посібнику ми розглянули вбудовування токенів і позицій за допомогою Keras і KerasNLP.