Siamese Network: Neural network untuk menguji kemiripan

Bayangkan kita diminta membuat model machine learning yang akan digunakan untuk presensi mahasiswa menggunakan foto wajah. Universitas yang meminta dibuatkan model tersebut memiliki 10,000 mahasiswa. Jika kita mengasumsikan ini adalah permasalahan klasifikasi, apakah itu berarti ini adalah klasifikasi citra dengan jumlah kelas 10,000?

Klasifikasi dengan 10,000 class??

Itu jauh lebih banyak daripada data benchmark yang biasa digunakan klasifikasi citra, Imagenet, yang hanya 1000 kelas! Selain itu, tidak mudah juga untuk mendapatkan data per kelasnya. Apakah setiap mahasiswa harus difoto ratusan kali agar dapat data latih yang representatif? lalu bagaimana jika ada mahasiswa baru? nah, di sinilah Siamese Network bisa jadi salah satu solusinya.

Siamese Network

Siamese network adalah jenis arsitektur neural network di mana menerima dua input, yang masing-masingnya masuk ke subnetwork yang sama lalu digabungkan untuk dihitung kemiripan antara dua input tersebut.

Siamese network
Siamese Network untuk identifikasi wajah

Siamese network digunakan untuk menghitung kemiripan dua data. Kemiripan antara dua data di sini tergantung pada kasusnya, misal kemiripan wajah dari orang yang sama namun memiliki dua foto yang berbeda, atau kemiripan gaya berpakaian dari dua orang yang berbeda, dll. Model dilatih dengan menerima input pasangan data, dengan output yang dihasilkan bisa berupa biner (sama atau tidak) atau sebuah real value yang merepresentasikan tingkat tingkat kemiripan.

Siamese network tidak menspesifikkan arsitektur pada bagian subnetwork, asalkan dua arsitektur yang digunakan adalah sama (bentuk dan bobotnya). Kita bisa memakai konsep ini untuk beragam jenis data. Misalnya kita ingin mengecek kemiripan pertanyaan maka kita bisa menggunakan subnetwork berupa LSTM network, jika ingin mengecek kemiripan foto kita bisa gunakan CNN sebagai subnetworknya. Output dari subnetwork ini adalah vektor, dengan ukuran bebas (sebagai hyperparameter yang kita tentukan sendiri)

Ada banyak metode yang bisa dilakukan di bagian penggabungan (Merge) hasil dari dua subnetwork. Beberapa yang pernah saya tahu:

  • Hitung selisih absolut antar vektor output subnetwork lalu masukkan vektor selisihnya ke sebuah neural net,
  • Concat atau gabungkan kedua output lalu masukkan vektor gabungannya ke sebuah neural net,

Contoh Kasus

Siamese network cocok digunakan jika dataset memiliki banyak sekali class, tapi sampel tiap class sangat sedikit. Misalnya jika kita akan membuat sistem verifikasi wajah untuk presensi.

Langkah pertama yang perlu kita lakukan adalah dengan membuat pasangan-pasangan dari data yang kita miliki. Sebagai ilustrasi anggap kita memiliki foto wajah 5 orang {A, B, C, D, E} dan masing-masing orang memiliki 3 foto {A1, A2, A3, B1, B2, …, E3} maka kita bisa buat pasangan seperti di bawah, dan memberi label “1” untuk yang artinya kedua foto menunjukkan orang yang sama, dan “0” untuk sebaliknya.

Setiap sample di dataset terdiri dari dua citra wajah, lalu label bernilai 1 jika itu foto orang yang sama, dan 0 jika sebaliknya

Setelah itu model dilatih dengan data tersebut. Inputnya adalah sepasang foto dan outputnya akan diukur menggunakan label yang ada.

Setelah model terlatih, proses verifikasi foto ketika presensi bisa dilakukan dengan mencocokkan sampel yang baru ke foto yang ada di database kita. Jika model memberi output True, maka orang tersebut berhasil teridentifikasi.

Implementasi di PyTorch

Implementasi arsitektur Siamese Network di PyTorch tidak terlalu sulit, tergantung seperti apa subnetwork yang digunakan dan cara penggabungan yang dipilih.

Di bawah ini adalah contoh implementasi Class SiameseNetwork di PyTorch yang sederhana dengan linear layer biasa. Proses merge dilakukan dengan menghitung selisih absolut, lalu memasukkan ke neural net sederhana yang memberi output biner (True / False).

class SiameseNetwork(nn.Module):
    def __init__(self, h, input_size):
        super(SiameseNetwork, self).__init__()
        self.subnet = nn.Linear(input_size, h)
        self.mergenet = nn.Linear(h, 2)
    
    def forward(self, x1, x2):
        output1 = F.relu(self.subnet(x1))
        output2 = F.relu(self.subnet(x2))
        diff = torch.abs(output1 - output2)
        output = self.mergnet(diff)
        return output

Penutup

Sederhananya konsep siamese network di atas bukan berarti model ini adalah model yang “selalu sederhana”. Dalam implementasi ada beberapa hal yang kadang perlu ditambahkan untuk memperbaiki hasil Siamese Network. Salah satunya adalah pemakaian Contrastive Loss. Selain itu, di luar sana juga banyak cara berbeda implementasi proses Merge yang bisa dicoba. Artikel ini hanyalah pengantar Siamese Network.

Selamat bereksplorasi, semoga bermanfaat!


Photo by Skyler Smith on Unsplash

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

Leave a Reply