Perhatian untuk boneka dan implementasi di Keras

Tentang artikel tentang kecerdasan buatan dalam bahasa Rusia


Terlepas dari kenyataan bahwa mekanisme Perhatian dijelaskan dalam literatur bahasa Inggris, saya masih belum melihat deskripsi yang layak tentang teknologi ini di sektor berbahasa Rusia. Ada banyak artikel tentang Kecerdasan Buatan (AI) dalam bahasa kita. Namun, artikel-artikel yang ditemukan hanya mengungkapkan model AI paling sederhana, misalnya, jaringan konvolusi, jaringan generatif. Namun, menurut perkembangan terkini yang mutakhir di bidang AI, ada sangat sedikit artikel di sektor berbahasa Rusia.

Kurangnya artikel dalam bahasa Rusia tentang perkembangan terakhir menjadi masalah bagi saya ketika saya memasuki topik tersebut, mempelajari keadaan terkini di bidang AI. Saya tahu bahasa Inggris dengan baik, saya membaca artikel dalam bahasa Inggris tentang topik AI. Namun, ketika konsep baru atau prinsip baru AI keluar, pemahamannya dalam bahasa asing menyakitkan dan panjang. Mengetahui Bahasa Inggris, untuk menembus ke dalam non-pribumi dalam objek yang kompleks masih bernilai lebih banyak waktu dan usaha. Setelah membaca deskripsi, Anda bertanya pada diri sendiri pertanyaan: berapa persen yang Anda mengerti? Jika ada artikel dalam bahasa Rusia, saya akan mengerti 100% setelah bacaan pertama. Ini terjadi dengan jaringan generatif, yang mana ada serangkaian artikel yang sangat baik: setelah membaca semuanya menjadi jelas. Namun dalam dunia jaringan, ada banyak pendekatan yang hanya dijelaskan dalam bahasa Inggris dan yang harus ditangani selama berhari-hari.

Saya akan secara berkala menulis artikel dalam bahasa ibu saya, membawa pengetahuan ke bidang bahasa kami. Seperti yang Anda ketahui, cara terbaik untuk memahami suatu topik adalah menjelaskannya kepada seseorang. Jadi siapa lagi selain saya yang harus memulai serangkaian artikel tentang AI arsitektur yang paling modern, kompleks, canggih. Pada akhir artikel, saya sendiri akan memahami pendekatan 100%, dan itu akan berguna bagi seseorang yang membaca dan meningkatkan pemahaman mereka (omong-omong, saya suka Gesser, tetapi lebih baik ** Blanche de bruxelles **).

Saat Anda memahami subjek, ada 4 level pemahaman:

  1. Anda memahami prinsip dan input serta output dari Algoritma / Level
  2. Anda memahami pertemuan yang keluar dan secara umum cara kerjanya
  3. Anda memahami semua hal di atas, serta perangkat dari setiap tingkat jaringan (misalnya, dalam model VAE Anda memahami prinsipnya, dan Anda juga memahami inti dari trik reparameterisasi)
  4. Saya mengerti segalanya, termasuk setiap level, saya juga mengerti mengapa semuanya belajar, dan pada saat yang sama saya dapat memilih parameter hiper untuk tugas saya, daripada salin-rekatkan solusi yang sudah jadi.

Untuk arsitektur baru, transisi dari level 1 ke level 4 sering sulit: penulis menekankan bahwa mereka lebih dekat menggambarkan berbagai detail penting secara dangkal (apakah mereka memahaminya sendiri?). Atau otak Anda tidak mengandung konstruksi, jadi bahkan setelah membaca deskripsi itu tidak menguraikan dan tidak berubah menjadi keterampilan. Ini terjadi jika selama tahun-tahun siswa Anda tidur di pelajaran matan yang sama, setelah pesta malam hari  di mana Anda memberikan tikar yang tepat. aparatur. Dan di sini kita membutuhkan artikel dalam bahasa asli kita yang mengungkapkan nuansa dan kehalusan dari setiap operasi.

Konsep dan aplikasi perhatian


Di atas adalah skenario tingkat pemahaman. Untuk memilah Perhatian, mari kita mulai dari tingkat satu. Sebelum menjelaskan input dan output, kami akan menganalisis esensi: di mana konsep dasar, dapat dipahami bahkan untuk seorang anak, konsep ini didasarkan. Dalam artikel ini kita akan menggunakan istilah bahasa Inggris Perhatian, karena dalam formulir ini juga merupakan panggilan ke fungsi perpustakaan Keras (tidak secara langsung diterapkan di dalamnya, modul tambahan diperlukan, tetapi lebih pada yang di bawah). Untuk membaca lebih lanjut, Anda harus memiliki pemahaman tentang pustaka Keras dan python, karena kode sumber akan disediakan.

Perhatian diterjemahkan dari bahasa Inggris sebagai "perhatian". Istilah ini dengan tepat menggambarkan esensi dari pendekatan: jika Anda seorang pengendara mobil dan polisi lalu lintas umum ditampilkan di foto, Anda secara intuisi mementingkan itu, terlepas dari konteks foto. Anda cenderung melihat lebih dekat pada sang jenderal. Anda saring mata Anda, lihat tali pengikat hati-hati: berapa banyak bintang yang ada di sana secara khusus. Jika jendral tidak terlalu tinggi, abaikan dia. Kalau tidak, anggap itu sebagai faktor kunci dalam pengambilan keputusan. Beginilah cara otak kita bekerja. Dalam budaya Rusia, kita telah dilatih dari generasi ke generasi untuk memperhatikan peringkat tinggi, otak kita secara otomatis menempatkan prioritas tinggi pada objek-objek tersebut.

Perhatian adalah cara untuk memberi tahu jaringan apa yang harus Anda perhatikan, yaitu, untuk melaporkan probabilitas hasil tertentu tergantung pada keadaan neuron dan data input. Lapisan Attention yang diimplementasikan dalam Keras sendiri mengidentifikasi faktor-faktor berdasarkan pada set pelatihan, perhatian yang mengurangi kesalahan jaringan. Identifikasi faktor-faktor penting dilakukan melalui metode propagasi kesalahan kembali, mirip dengan bagaimana hal ini dilakukan untuk jaringan konvolusi.

Dalam pelatihan, Perhatian menunjukkan sifat probabilistiknya. Mekanisme itu sendiri membentuk matriks skala kepentingan. Jika kita tidak melatih Perhatian, kita dapat menetapkan pentingnya, misalnya, secara empiris (umum lebih penting daripada panji). Tetapi ketika kita melatih jaringan pada data, kepentingan menjadi fungsi dari probabilitas hasil tertentu, tergantung pada data yang diterima pada input jaringan. Sebagai contoh, jika kita bertemu dengan seorang jenderal yang tinggal di Rusia Tsar, maka kemungkinan mendapatkan tantangan akan tinggi. Setelah memastikan ini, akan dimungkinkan melalui beberapa pertemuan pribadi, mengumpulkan statistik. Setelah itu, otak kita akan memberi bobot yang sesuai pada fakta pertemuan subjek ini dan memberi tanda pada tali dan garis bahu. Perlu dicatat bahwa penanda yang ditetapkan tidak mungkin: sekarang pertemuan jenderal akan membawa konsekuensi yang sama sekali berbeda untuk Anda daripada itu, di samping itu, bobotnya mungkin lebih dari satu. Tapi, berat badan bisa dikurangi menjadi probabilitas dengan menormalkannya.

Sifat probabilistik mekanisme Attention dalam pembelajaran dimanifestasikan dalam tugas penerjemahan mesin. Sebagai contoh, mari kita beri tahu jaringan bahwa ketika menerjemahkan dari bahasa Rusia ke bahasa Inggris, kata Cinta diterjemahkan dalam 90% kasus sebagai Cinta, dalam 9% kasus sebagai Seks, dalam 1% kasus seperti sebaliknya. Jaringan segera menandai banyak opsi, menunjukkan kualitas pelatihan terbaik. Saat menerjemahkan, kami memberi tahu jaringan: "ketika menerjemahkan kata cinta, beri perhatian khusus pada kata bahasa Inggris Cinta, lihat juga apakah itu masih Seks."

Pendekatan Attention diterapkan untuk bekerja dengan teks, serta seri suara dan waktu. Untuk pemrosesan teks, jaringan saraf berulang (RNN, LSTM, GRU) banyak digunakan. Perhatian dapat melengkapi atau menggantinya, memindahkan jaringan ke arsitektur yang lebih sederhana dan lebih cepat.

Salah satu kegunaan Perhatian yang paling terkenal adalah menggunakannya untuk meninggalkan jaringan perulangan dan beralih ke model yang sepenuhnya terhubung. Jaringan berulang memiliki serangkaian kelemahan: ketidakmampuan untuk memberikan pelatihan tentang GPU, pelatihan ulang cepat. Dengan menggunakan mekanisme Attention, kita dapat membangun jaringan yang mampu mempelajari urutan berdasarkan jaringan yang sepenuhnya terhubung, melatihnya pada GPU, menggunakan droput.

Perhatian banyak digunakan untuk meningkatkan kinerja jaringan perulangan, misalnya, dalam bidang terjemahan dari bahasa ke bahasa. Saat menggunakan pendekatan encoding / decoding, yang sering digunakan dalam AI modern (misalnya, auto-encoder variasional). Ketika lapisan Attention ditambahkan antara encoder dan decoder, hasil operasi jaringan terasa membaik.

Dalam artikel ini, saya tidak mengutip arsitektur jaringan spesifik menggunakan Perhatian, ini akan menjadi subjek pekerjaan yang terpisah. Daftar semua kemungkinan penggunaan perhatian layak untuk artikel terpisah.

Menerapkan Perhatian dalam Keras Out of the Box


Ketika Anda memahami pendekatan seperti apa, sangat berguna untuk mempelajari prinsip dasar. Namun seringkali pemahaman penuh datang hanya dengan melihat implementasi teknis. Anda melihat aliran data yang membentuk fungsi operasi, menjadi jelas apa yang sebenarnya dihitung. Tetapi pertama-tama Anda harus menjalankannya dan menulis "Attention hello word".

Perhatian saat ini tidak diterapkan di Keras itu sendiri. Tetapi sudah ada implementasi pihak ketiga, seperti attention-keras, yang dapat diinstal dengan github. Maka kode Anda akan menjadi sangat sederhana:

from attention_keras.layers.attention import AttentionLayer attn_layer = AttentionLayer(name='attention_layer') attn_out, attn_states = attn_layer([encoder_outputs, decoder_outputs]) 

Implementasi ini mendukung fungsi visualisasi skala Perhatian. Setelah melatih Perhatian, Anda bisa mendapatkan pensinyalan matriks, yang, menurut jaringan, sangat penting tentang jenis ini (gambar dari github dari halaman perpustakaan attention-keras).


Pada dasarnya, Anda tidak memerlukan yang lain: sertakan kode ini di jaringan Anda sebagai salah satu level dan nikmati belajar jaringan Anda. Jaringan apa pun, algoritma apa pun dirancang pada tahap pertama pada tingkat konseptual (seperti database, omong-omong), setelah itu implementasi ditentukan dalam representasi logis dan fisik sebelum implementasi. Metode desain ini belum dikembangkan untuk jaringan saraf (oh ya, ini akan menjadi topik artikel saya berikutnya). Anda tidak mengerti bagaimana lapisan konvolusi bekerja di dalam? Prinsipnya dijelaskan, Anda menggunakannya.

Implementasi keras Attention rendah


Untuk akhirnya memahami topik tersebut, di bawah ini kami akan menganalisis secara rinci penerapan Perhatian di bawah tenda. Konsepnya bagus, tetapi bagaimana tepatnya kerjanya dan mengapa hasilnya diperoleh persis seperti yang dinyatakan?

Implementasi paling sederhana dari mekanisme Attention dalam Keras hanya membutuhkan 3 baris:

 inputs = Input(shape=(input_dims,)) attention_probs = Dense(input_dims, activation='softmax', name='attention_probs')(inputs) attention_mul = merge([inputs, attention_probs], output_shape=32, name='attention_mul', mode='mul' 

Dalam hal ini, lapisan Input dideklarasikan di baris pertama, kemudian muncul lapisan yang sepenuhnya terhubung dengan fungsi aktivasi softmax dengan jumlah neuron yang sama dengan jumlah elemen di lapisan pertama. Lapisan ketiga mengalikan hasil dari lapisan yang sepenuhnya terhubung dengan elemen data input oleh elemen.

Di bawah ini adalah seluruh kelas Attention, yang mengimplementasikan mekanisme perhatian diri yang sedikit lebih kompleks, yang dapat digunakan sebagai level penuh dalam model, kelas mewarisi kelas lapisan Keras.

 # Attention class Attention(Layer): def __init__(self, step_dim, W_regularizer=None, b_regularizer=None, W_constraint=None, b_constraint=None, bias=True, **kwargs): self.supports_masking = True self.init = initializers.get('glorot_uniform') self.W_regularizer = regularizers.get(W_regularizer) self.b_regularizer = regularizers.get(b_regularizer) self.W_constraint = constraints.get(W_constraint) self.b_constraint = constraints.get(b_constraint) self.bias = bias self.step_dim = step_dim self.features_dim = 0 super(Attention, self).__init__(**kwargs) def build(self, input_shape): assert len(input_shape) == 3 self.W = self.add_weight((input_shape[-1],), initializer=self.init, name='{}_W'.format(self.name), regularizer=self.W_regularizer, constraint=self.W_constraint) self.features_dim = input_shape[-1] if self.bias: self.b = self.add_weight((input_shape[1],), initializer='zero', name='{}_b'.format(self.name), regularizer=self.b_regularizer, constraint=self.b_constraint) else: self.b = None self.built = True def compute_mask(self, input, input_mask=None): return None def call(self, x, mask=None): features_dim = self.features_dim step_dim = self.step_dim eij = K.reshape(K.dot(K.reshape(x, (-1, features_dim)), K.reshape(self.W, (features_dim, 1))), (-1, step_dim)) if self.bias: eij += self.b eij = K.tanh(eij) a = K.exp(eij) if mask is not None: a *= K.cast(mask, K.floatx()) a /= K.cast(K.sum(a, axis=1, keepdims=True) + K.epsilon(), K.floatx()) a = K.expand_dims(a) weighted_input = x * a return K.sum(weighted_input, axis=1) def compute_output_shape(self, input_shape): return input_shape[0], self.features_dim 

Di sini kita melihat kira-kira hal yang sama yang diterapkan di atas melalui lapisan Keras yang sepenuhnya terhubung, hanya dilakukan melalui logika yang lebih dalam di tingkat yang lebih rendah. Level parametrik (self.W) dibuat dalam fungsi, yang kemudian dikalikan secara skal (K.dot) dengan vektor input. Logika kabel dalam varian ini sedikit lebih rumit: pergeseran (jika parameter bias diungkapkan), garis singgung hiperbolik, eksposur, mask (jika ditentukan), normalisasi diterapkan pada vektor input kali sendiri.W, maka vektor input lagi ditimbang oleh hasil yang didapat. Saya tidak memiliki penjelasan tentang logika yang ditetapkan dalam contoh ini, saya mereproduksi operasi membaca kode. Ngomong-ngomong, silakan tulis di komentar jika Anda mengenali beberapa fungsi matematika tingkat tinggi dalam logika ini.

Kelas memiliki parameter "bias" yaitu bias. Jika parameter diaktifkan, maka setelah menerapkan layer Dense, vektor akhir akan ditambahkan ke vektor parameter layer "self.b", yang akan memungkinkan tidak hanya untuk menentukan "bobot" untuk fungsi perhatian kita, tetapi juga untuk menggeser tingkat perhatian dengan angka. Contoh kehidupan: kita takut pada hantu, tetapi belum pernah bertemu mereka. Jadi, kami melakukan koreksi untuk ketakutan -100 poin. Yaitu, hanya jika rasa takut keluar dari skala untuk 100 poin, kami akan membuat keputusan untuk melindungi terhadap hantu, memanggil agen penghantu hantu, membeli perangkat menakut-nakuti, dll.

Kesimpulan


Mekanisme perhatian memiliki variasi. Opsi Attention paling sederhana yang diterapkan pada kelas di atas disebut Self-Attention. Self-attention adalah mekanisme yang dirancang untuk memproses data sekuensial, dengan mempertimbangkan konteks setiap cap waktu. Ini paling sering digunakan untuk bekerja dengan informasi tekstual. Implementasi self-attention dapat dilakukan dengan mengimpor perpustakaan keras-self-attention. Ada variasi lain dari Perhatian. Mempelajari materi berbahasa Inggris, dimungkinkan untuk menghitung lebih dari 5 variasi.

Ketika menulis bahkan artikel yang relatif singkat ini, saya mempelajari lebih dari 10 artikel berbahasa Inggris. Tentu saja, saya tidak dapat mengunduh semua data dari semua artikel ini menjadi 5 halaman, saya hanya membuat perasan untuk membuat "panduan untuk boneka". Untuk memahami semua nuansa mekanisme Perhatian, Anda memerlukan buku halaman 150-200. Saya benar-benar berharap bahwa saya dapat mengungkapkan esensi dasar dari mekanisme ini sehingga mereka yang baru mulai memahami pembelajaran mesin memahami bagaimana semua ini bekerja.

Sumber


  1. Mekanisme perhatian dalam Jaringan Saraf Tiruan dengan Keras
  2. Perhatian di Deep Networks dengan Keras
  3. Sequence-to-Sequence berbasis Attention di Keras
  4. Klasifikasi Teks menggunakan Mekanisme Perhatian dalam Keras
  5. Pervasive Attention: Jaringan Syaraf Konvolusional 2D untuk Prediksi Sequence-to-Sequence
  6. Bagaimana cara mengimplementasikan Attention Layer di Keras?
  7. Perhatian? Perhatian!
  8. Terjemahan Mesin Saraf dengan Perhatian

Source: https://habr.com/ru/post/id458992/


All Articles