Garfield
YZF Admin
TensorFlow modeline attention eklemek için sorgu, anahtar ve değer tensörlerini uygun şekillerde bir attention katmanına bağlayın.
Girdi genellikle
Key ve value uzunlukları aynı olmalıdır.
Aşağıdaki örnek, beş konum ve sekiz özellikten oluşan iki varsayımsal diziyi işler. İlk çağrıdaki iki aynı girdi query ve value’dur; key varsayılan olarak value’dan alınır:
Varsayılan çıktı genişliği sorgunun son boyutu olan 8’e döner. Bu nedenle
Sorgu ile kaynak dizinin uzunluğu aynı olmak zorunda değildir. Örneğin üç sorgu konumunun yedi kaynak konumunu kullanması şöyle yazılabilir:
Bu katman sorgu, anahtar ve değerleri kendi öğrenilen izdüşümleriyle işler. Sonuç sorgunun üç konumuna karşılık gelir; kaynak uzunluğu olan yedi, çıktı dizisinin uzunluğu olmaz.
Dolgu konumları gerçek veri olarak kullanılmamalıdır. Gerekli durumda
Query uzunluğunu, çıktı genişliğini ve artık bağlantıya verilen tensörün şeklini kontrol edin. Farklı kaynak uzunluğunu sorgu uzunluğuyla karıştırmayın. Attention çıktısının
tf.keras.layers.MultiHeadAttention, girdileri başlıklara ayırıp ilişkili konumların bilgisini birleştirir. Aynı dizi query, key ve value olarak kullanılırsa self-attention; sorgu başka bir kaynaktaki bilgilere bakıyorsa cross-attention oluşur.Tensörlerin görevini belirleyin
Girdi genellikle
(batch, uzunluk, özellik) biçimindedir. Attention, veri sırasının yerine geçmez; görevde konum önemliyse uygun konum bilgisini de modele ekleyin. Temel giriş ve çıktı sözleşmesi resmî MultiHeadAttention belgesinde açıklanır.| Tensör | Görevi | Tipik şekil |
|---|---|---|
| query | Hangi konumlar için bilgi aranacağını belirler. | (B, T, Dq) |
| key | Sorguyla karşılaştırılacak anahtarları taşır. | (B, S, Dk) |
| value | Dikkat ağırlıklarıyla birleştirilecek bilgiyi taşır. | (B, S, Dv) |
| çıktı | Her sorgu konumu için bir temsil verir. | Varsayılan output_shape ile (B, T, Dq) |
Key ve value uzunlukları aynı olmalıdır.
key verilmezse value hem anahtar hem değer olarak kullanılır. key_dim, bütün modelin genişliği değil, her attention başlığının sorgu/anahtar boyutudur.Self-attention ve artık bağlantı ekleme
Aşağıdaki örnek, beş konum ve sekiz özellikten oluşan iki varsayımsal diziyi işler. İlk çağrıdaki iki aynı girdi query ve value’dur; key varsayılan olarak value’dan alınır:
Python:
import tensorflow as tf
inputs = tf.keras.Input(shape=(None, 8))
attention = tf.keras.layers.MultiHeadAttention(num_heads=2, key_dim=4)
attended = attention(query=inputs, value=inputs)
x = tf.keras.layers.Add()([inputs, attended])
x = tf.keras.layers.LayerNormalization()(x)
model = tf.keras.Model(inputs=inputs, outputs=x)
sample = tf.random.normal((2, 5, 8))
output = model(sample, training=False)
print(output.shape) # (2, 5, 8)
Varsayılan çıktı genişliği sorgunun son boyutu olan 8’e döner. Bu nedenle
Add() için giriş ve attention çıktısının şekilleri eşleşir. Çıktı genişliğini değiştirdiyseniz artık bağlantıya eklemeden önce uygun bir Dense izdüşümüyle boyutları eşitleyin. Model çağrısının şekil üretmesi, attention ağırlıklarının görevi öğrendiğini göstermez; görev için çıkış katmanı, kayıp ve eğitim verisi ayrıca tanımlanmalıdır.Cross-attention nasıl farklıdır?
Sorgu ile kaynak dizinin uzunluğu aynı olmak zorunda değildir. Örneğin üç sorgu konumunun yedi kaynak konumunu kullanması şöyle yazılabilir:
Python:
import tensorflow as tf
query = tf.random.normal((2, 3, 8))
source = tf.random.normal((2, 7, 12))
attention = tf.keras.layers.MultiHeadAttention(num_heads=2, key_dim=4)
result = attention(query=query, value=source, key=source)
print(result.shape) # (2, 3, 8)
Bu katman sorgu, anahtar ve değerleri kendi öğrenilen izdüşümleriyle işler. Sonuç sorgunun üç konumuna karşılık gelir; kaynak uzunluğu olan yedi, çıktı dizisinin uzunluğu olmaz.
Maske ve gelecek bilgisi
Dolgu konumları gerçek veri olarak kullanılmamalıdır. Gerekli durumda
(B, T, S) biçiminde boolean attention_mask verin; True erişime izin verir, False engeller. Bir sonraki öğeyi geçmişten tahmin eden self-attention kullanımında gelecekteki konumlara bakılmaması için çağrıya use_causal_mask=True ekleyin. Dizinin tamamı mevcutken yapılan bir sınıflandırmanın maske gereksinimi farklı olabilir.Sık sorulan soru
Attention eklediğimde Add katmanı neden şekil hatası veriyor?
Query uzunluğunu, çıktı genişliğini ve artık bağlantıya verilen tensörün şeklini kontrol edin. Farklı kaynak uzunluğunu sorgu uzunluğuyla karıştırmayın. Attention çıktısının
shape değeri ve eklenecek tensör uyumlu olduktan sonra modeli küçük bir örnek üzerinde kontrol edin.
Son düzenleme: