Transformer Token and Position Embedding with Keras PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Transformer Token and Position Embedding with Keras

Вступ

Є багато посібників, які пояснюють, як працюють трансформатори, і для створення інтуїції щодо їхнього ключового елемента – вбудовування токенів і позицій.

Позиційне вбудовування токенів дозволило трансформаторам представляти нежорсткі зв’язки між лексемами (як правило, словами), що набагато краще моделює наше контекстне мовлення в мовному моделюванні. Хоча процес відносно простий, він досить загальний, і реалізації швидко стають шаблонними.

У цьому короткому посібнику ми розглянемо, як можна використовувати 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.

Часова мітка:

Більше від Stackabuse