Dikkat mekanizmaları tam olarak nedir?


23

Son birkaç yılda çeşitli Derin Öğrenme makalelerinde dikkat mekanizmaları kullanılmıştır. Open AI araştırma başkanı Ilya Sutskever onları coşkuyla övdü: https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0

Purdue Üniversitesi'nden Eugenio Culurciello, RNN'lerin ve LSTM'lerin tamamen dikkat odaklı sinir ağları lehine terk edilmesi gerektiğini iddia etti:

https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0

Bu bir abartı gibi gözüküyor, ancak tamamen dikkat temelli modellerin sıra modelleme görevlerinde oldukça başarılı olduğu inkar edilemez: hepimiz Google'dan uygun bir şekilde adlandırılmış kağıt hakkında hepimiz biliyoruz, Dikkat etmeniz gereken tek şey

Bununla birlikte, dikkat temelli modeller tam olarak nedir? Bu modellerin açık bir açıklamasını henüz bulamadım. Diyelim ki tarihsel değerler göz önüne alındığında çok değişkenli bir zaman serisinin yeni değerlerini tahmin etmek istiyorum. LSTM hücrelerine sahip olan bir RNN ile bunun nasıl yapılacağı oldukça açık. Dikkate dayalı bir modelle aynı şeyi nasıl yaparım?

Yanıtlar:


20

Dikkat, bir dizi vektörünü sadece bir vektörde, genellikle bir arama vektörü aracılığıyla birleştirmek için kullanılan bir yöntemdir . Genellikle, ya modele girişler ya da önceki zaman adımlarının gizli durumları veya gizli durumları bir seviye aşağıya (üst üste LSTM'lerde) gelir.viuvi

Sonuç, geçerli zaman adımına ilişkin bağlamı içerdiğinden , genellikle bağlam vektörü olarak adlandırılır .c

Bu ilave vektörü daha sonra RNN / LSTM'ye de beslenir (orijinal girdiyle birleştirilebilir). Bu nedenle, bağlam öngörmeye yardımcı olmak için kullanılabilir.c

Bunu yapmanın en basit yolu, olasılık vektörünü ve burada , önceki tüm . Yaygın bir arama vektörü , mevcut gizli durum .p=softmax(VTu)c=ipiviVviuht

Bunda birçok değişiklik var ve istediğiniz kadar karmaşık hale getirebilirsiniz. Örneğin, olarak kullanmak yerine, kişi yerine , burada isteğe bağlı bir sinir ağıdır.viTuf(vi,u)f

Dizi-to-dizisi model için yaygın bir ilgi mekanizması kullanır , burada kodlayıcının gizli durumları, ve gizli akım kod çözücünün durumu. ve her iki s de parametredir.p=softmax(qTtanh(W1vi+W2ht))vhtqW

Dikkat fikrinde farklı varyasyonlar gösteren bazı makaleler:

Pointer Networks , kombinasyonel optimizasyon problemlerini çözmek için referans girişlerine dikkat eder.

Tekrarlayan Varlık Ağları , metin okurken farklı varlıklar (insanlar / nesneler) için ayrı hafıza durumlarını korur ve dikkatini kullanarak doğru hafıza durumunu günceller.

Transformatör modelleri de dikkatleri büyük ölçüde kullanır. Dikkat formülasyonları biraz daha geneldir ve aynı zamanda anahtar vektörlerini de içerir : dikkat ağırlıklarının gerçekte anahtarlar ve arama arasında hesaplanması ve bağlam sonra .kipvi


Bazı basit testlerden geçmesi gerçeğinin ötesinde doğruluğu garanti edemesem de, bir dikkat biçiminin hızlı bir uygulaması.

Temel RNN:

def rnn(inputs_split):
    bias = tf.get_variable('bias', shape = [hidden_dim, 1])
    weight_hidden = tf.tile(tf.get_variable('hidden', shape = [1, hidden_dim, hidden_dim]), [batch, 1, 1])
    weight_input = tf.tile(tf.get_variable('input', shape = [1, hidden_dim, in_dim]), [batch, 1, 1])

    hidden_states = [tf.zeros((batch, hidden_dim, 1), tf.float32)]
    for i, input in enumerate(inputs_split):
        input = tf.reshape(input, (batch, in_dim, 1))
        last_state = hidden_states[-1]
        hidden = tf.nn.tanh( tf.matmul(weight_input, input) + tf.matmul(weight_hidden, last_state) + bias )
        hidden_states.append(hidden)
    return hidden_states[-1]

Dikkatle, yeni gizli durum hesaplanmadan önce sadece birkaç satır ekleriz:

        if len(hidden_states) > 1:
            logits = tf.transpose(tf.reduce_mean(last_state * hidden_states[:-1], axis = [2, 3]))
            probs = tf.nn.softmax(logits)
            probs = tf.reshape(probs, (batch, -1, 1, 1))
            context = tf.add_n([v * prob for (v, prob) in zip(hidden_states[:-1], tf.unstack(probs, axis = 1))])
        else:
            context = tf.zeros_like(last_state)

        last_state = tf.concat([last_state, context], axis = 1)

        hidden = tf.nn.tanh( tf.matmul(weight_input, input) + tf.matmul(weight_hidden, last_state) + bias )

tam kod


p=softmax(VTu)ic=ipivipiVTvVTv

1
zi=viTup=softmax(z)pi=eizjejz

ppi

1
evet, demek istediğim bu
shimao

@shimao Bir sohbet odası hazırladım , konuşmak istersen haberim olsun (bu soru hakkında değil)
DeltaIV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.