single
Challenge: Implementing Feed-Forward Networks
Свайпніть щоб показати меню
Досліджуючи архітектуру Transformer для обробки природної мови, ви стикаєтеся з ключовим компонентом у кожному блоці Transformer: позиційно-незалежна feed-forward мережа (FFN). Після того як механізм самоуваги обробляє вхідні представлення, FFN додатково трансформує ці представлення на кожній позиції послідовності незалежно від інших позицій. Це означає, що для кожного токена в реченні застосовується одна й та сама невелика нейронна мережа, що дозволяє моделі вводити додаткову нелінійність і навчатися складнішим шаблонам у тексті. FFN є важливою для захоплення взаємозв'язків і уточнення інформації, закодованої самоувагою, особливо при роботі з тонкощами та неоднозначностями людської мови.
123456789101112131415161718192021222324252627282930313233import numpy as np def relu(x): return np.maximum(0, x) class PositionWiseFeedForward: def __init__(self, d_model, d_ff): # Initialize weights and biases for two linear layers self.W1 = np.random.randn(d_model, d_ff) * 0.01 self.b1 = np.zeros((1, d_ff)) self.W2 = np.random.randn(d_ff, d_model) * 0.01 self.b2 = np.zeros((1, d_model)) def __call__(self, x): # x shape: (batch_size, seq_len, d_model) # Apply first linear layer and ReLU activation out1 = relu(np.matmul(x, self.W1) + self.b1) # Apply second linear layer out2 = np.matmul(out1, self.W2) + self.b2 return out2 # Example usage: batch_size = 2 seq_len = 4 d_model = 8 d_ff = 16 # Example input: random tensor simulating text representations x = np.random.randn(batch_size, seq_len, d_model) ffn = PositionWiseFeedForward(d_model, d_ff) output = ffn(x) print("Output shape:", output.shape)
У наведеному вище коді показано просту реалізацію позиційно-незалежної feed-forward мережі з використанням numpy. Мережа складається з двох лінійних перетворень (матричних множень), розділених ReLU-функцією активації.
Функція активації ReLU: Активація ReLU (Rectified Linear Unit) визначається як relu(x) = max(0, x). Вона встановлює всі від’ємні значення в нуль, а додатні залишає без змін. ReLU використовується у feed-forward мережі для введення нелінійності, що дозволяє мережі навчатися складнішим шаблонам з даних.
Перша лінійна шар проєктує вхід із розмірності d_model (розмірність вектору кожного токена) у простір вищої розмірності d_ff, що дозволяє моделі захоплювати складніші ознаки. Друга лінійна шар проєктує результат назад до початкового розміру d_model. Зверніть увагу, що ця мережа застосовується незалежно до кожної позиції у послідовності, тобто перетворення для одного токена не впливає безпосередньо на інші. Така незалежність допомагає моделі обробляти представлення кожного токена паралельно, що робить Transformers дуже ефективними для текстових даних.
Проведіть, щоб почати кодувати
Реалізуйте функцію позиційної згортки feed-forward мережі з використанням numpy.
Визначте функцію position_wise_ffn(x, W1, b1, W2, b2), яка приймає:
x: масивnumpyрозміру(batch_size, seq_len, d_model);W1: масивnumpyрозміру(d_model, d_ff);b1: масивnumpyрозміру(1, d_ff);W2: масивnumpyрозміру(d_ff, d_model);b2: масивnumpyрозміру(1, d_model).
Для кожної позиції у послідовності застосуйте:
- Лінійне перетворення:
out1 = x @ W1 + b1; - ReLU-активацію:
out1 = relu(out1); - Друге лінійне перетворення:
out2 = out1 @ W2 + b2.
Поверніть вихідний масив out2 розміру (batch_size, seq_len, d_model).
Рішення
Дякуємо за ваш відгук!
single
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат