Belajar multi tugas dalam Keras

12

Saya mencoba menerapkan lapisan bersama di Keras. Saya memang melihat bahwa Keras memiliki keras.layers.concatenate, tetapi saya tidak yakin dari dokumentasi tentang penggunaannya. Bisakah saya menggunakannya untuk membuat beberapa lapisan bersama? Apa cara terbaik untuk mengimplementasikan jaringan saraf berbagi sederhana seperti yang ditunjukkan di bawah ini menggunakan Keras?Shared Neural network

Perhatikan bahwa semua bentuk input, output, dan lapisan bersama untuk ketiga NN adalah sama. Ada beberapa lapisan bersama (dan lapisan non-berbagi) di tiga NN. Lapisan berwarna unik untuk setiap NN, dan memiliki bentuk yang sama.

Pada dasarnya, angka tersebut mewakili 3 NN identik dengan beberapa lapisan tersembunyi yang dibagi, diikuti oleh beberapa lapisan tersembunyi yang tidak dibagi.

Saya tidak yakin bagaimana cara berbagi banyak lapisan seperti pada contoh Twitter, hanya ada satu lapisan bersama (contoh dalam API doc).

Aditya
sumber

Jawaban:

10

Dengan menggunakan API fungsional Anda dapat dengan mudah berbagi bobot antara berbagai bagian jaringan Anda. Dalam kasus Anda, kami memiliki yang merupakan input kami, maka kami akan memiliki layer yang disebut shared. Kemudian kita akan memiliki tiga lapisan berbeda yang disebut sub1, sub2 dan sub3 dan kemudian tiga lapisan keluaran disebut out1, out2 dan out3.Input xDenseDense

x = Input(shape=(n, ))
shared = Dense(32)(x)
sub1 = Dense(16)(shared)
sub2 = Dense(16)(shared)
sub3 = Dense(16)(shared)
out1 = Dense(1)(sub1)
out2 = Dense(1)(sub2)
out3 = Dense(1)(sub3)

Kita dapat mendefinisikan model kita sekarang seperti ini:

model = Model(inputs=x, outputs=[out1, out2, out3])

Ini akan mengharapkan tuple / daftar tiga elemen sekarang, satu untuk setiap output.

Anda dapat melangkah lebih jauh dengan konsep-konsep ini. Katakanlah kita ingin mempelajari bobot individu untuk lapisan orang tetapi masih ingin memiliki bobot yang sama untuk kombinasi linier terhadap lapisan keluaran, kita dapat mencapainya dengan melakukan ini:

out = Dense(1)
out1 = out(sub1)
out2 = out(sub2)
out3 = out(sub3)

EDIT: Menggabungkan pada dasarnya adalah kebalikan dari apa yang ingin Anda lakukan, itu menempelkan (intermediate) output dari berbagai bagian jaringan Anda ke lapisan baru. Anda sebenarnya ingin memisahkan diri ke beberapa bagian berbeda.

Jan van der Vegt
sumber
Terima kasih banyak. Ketika kita melakukan model.fit([data1, data2], [labels1, labels2]), ini akan dilatih (propagasi belakang) sebagai model tunggal, bukan?
Aditya
1
Ya itu hanya akan menjadi satu hal, jika label memiliki kerugian yang berbeda terkait Anda perlu melakukan lebih banyak pekerjaan, itu tidak super mudah di Keras tetapi bukan tidak mungkin, jika mereka berbagi fungsi kerugian yang sama tanpa reweighting itu hanya bekerja di luar kotak
Jan van der Vegt
Ini akan membutuhkan pelatihan ulang model terpadu. Bagaimana jika Anda sudah memiliki bobot pelatihan untuk sub-model? Apakah ada cara untuk menggunakan bobot tersebut untuk membuat wieghts untuk model gabungan?
shahar_m
@shahar_m maaf saya tidak yakin apa gunanya. jika bobot pelatihan dari model terpadu diperbaiki, Anda dapat memuat dan membekukan lapisan tersebut.
Aditya