Transfer Learning: Solusi Deep Learning dengan Data Sedikit

Salah satu permasalahan yang sering dialami ketika menggunakan deep learning adalah jumlah data yang sedikit. Di luar sana, sebenernya ada banyak solusi yang ditawarkan untuk mengatasi masalah ini. Nah, di sini kita akan bahas salah satunya, yakni Transfer Learning. Artikel ini akan berfokus pada teori di baliknya, sedangkan untuk implementasi akan ada di artikel selanjutnya.

Model Deep Learning

Sebelum masuk lebih dalam ke transfer learning, saya ingin mengingatkan sedikit tentang bagaimana konsep deep learning (secara umum machine learning) bekerja.

Suatu agen cerdas yang menggunakan deep learning bekerja menggunakan data. Kita berikan data yang banyak untuk dipelajari, kita lakukan proses training/belajar, lalu kita akan mendapat model/agen yang cerdas.

Lalu muncul pertanyaan..

Proses pencarian data itu rumit, proses training itu makan waktu, kenapa kita tidak download saja model cerdas yang ada di internet lalu kita gunakan untuk masalah kita? tidak perlu train, dan tidak perlu ada data, beres kan?

Transfer Learning

Ide utama dari transfer learning ini kira-kira seperti ini,

Kita gunakan model yang sudah dicerdaskan orang lain untuk permasalahan kita, yang bahkan bisa jadi berbeda

Sebagai contoh, kita mau membuat sistem untuk menghitung kendaraan beserta jenisnya menggunakan kamera CCTV. Jika jenis kendaraannya yang ingin dideteksi cukup umum, semisal “mobil” atau “truk”, kita bisa jadi cukup browsing-browsing, dan kita akan menemukan orang yang sudah membuat model deep learningnya. Kita tinggal download, pakai, dan selesai! Kita telah memiliki model cerdas deep learning yang mampu mendeteksi mobil atau truk. Tanpa perlu mencari data, tanpa perlu melatih model.

Tapi seringnya permasalahan yang kita miliki sedikit berbeda. Sedikit saja perbedaan, maka kita sudah tidak bisa lagi pakai model orang lain ini. Contohnya, kita tidak hanya ingin mendeteksi “mobil” dan “truk” tapi juga “becak”. Permasalahannya, “becak” itu bukan kendaraan yang di mana-mana ada. Sangat mungkin model yang kita download tadi belum bisa mendeteksi becak.

Di sinilah, kita butuh transfer learning. Kembali ke ide utama di atas, dengan transfer learning, kita bisa memanfaatkan model orang lain yang sudah dilatih, untuk permasalahan kita yang berbeda.

Jadi ada 3 poin yang kita bahas di sini:

  • Model yang sudah dicerdaskan
  • Cara menggunakan model tersebut
  • Permasalahan yang (bisa jadi) berbeda

Oh ya, sebelum masuk lebih dalam, konsep Transfer Learning ini berlaku tidak hanya untuk arsitektur CNN saja. Tapi pada tutorial ini saya akan banyak mencontohkan menggunakan CNN karena lebih mudah dibayangkan.

1. Model yang sudah cerdas

User (warna merah) mendownload model dari internet buatan orang lain

Pada transfer learning, kita membutuhkan model yang sudah terlatih, entah itu dilatih oleh orang lain, atau kita melatihnya terlebih dahulu. Model yang sudah terlatih ini disebut dengan Pre-Trained Model. Pre-trained model biasanya sudah dilatih pada dataset yang besar dan merupakan dataset benchmark, sehingga kualitas pre-trained model harusnya sudah sangat baik.

Saat ini sudah banyak pre-trained model yang disediakan untuk beragam kebutuhan. Misalnya pada halaman ini PyTorch menunjukkan pre-trained model yang tersedia secara resmi untuk image classification yang telah dilatih menggunakan dataset ImageNet. Pada halaman ini Tensorflow juga menunjukkan model-model yang tersedia untuk object detection. Kumpulan pre-trained model ini juga biasa disebut dengan Model Zoo.

Alternatif lain selain menggunakan model resmi dari framework, kita juga bisa browsing-browsing dan pakai pre-trained model yang disediakan peneliti-peneliti lain, misalnya model SiameseFC ini. Atau kita juga bisa saja membuat pre-trained model sendiri.

2. Cara menggunakan

Diambil dari paper How transferable are features in deep neural networks? di baris keempat tampak model yang sudah dilatih sebagian dengan data A (Hijau) digunakan untuk menyelesaikan permasalahan pada data B (Ungu)

Secara umum ada dua cara menggunakan model pre-trained untuk transfer learning. Kedua cara ini pada ilustrasi diatas ditunjukkan dengan simbol gembok terbuka atau tertutup:

2.1. Fixed Feature Extractor

Pada metode ini kita menggunakan pre-trained model yang telah dilatih tanpa melatih ulang model tersebut, atau istilahnya kita membekukan (freeze) bobot pre-trained model ini. Cara pemakaian yang umum untuk freezed model adalah sebagai feature extractor.

Ilustrasi Fixed Feature Extractor. Gambar sebelah kiri adalah ilustrasi pembuatan pre-trained model. Model deep learning CNN biasanya terdiri dari layer konvolusi (hijau) dan fully connected layer (merah) di akhir. Pada gambar sebelah kanan, kita hanya menggunakan layer konvolusinya saja yang kita bekukan, sehingga outputnya masih berupa vektor

Sebagai contoh, kita download pre-trained model resnet18 yang sudah dilatih ke data ImageNet. Arsitektur Resnet18 sama seperti arsitektur CNN pada umumnya memiliki bagian “konvolusi” dan memiliki bagian “klasifikasi”. Karena arsitektur Resnet ini sudah dilatih maka semua bobot-bobotnya sudah memiliki nilai yang bagus untuk klasifikasi citra di dataset ImageNet. Data imagenet terdiri dari sekitar 1000 kelas.

Jika kita buang layer klasifikasi terakhirnya (diilustrasikan warnah merah di gambar di atas), ketika kita inputkan citra, model akan mengoutputkan suatu vektor nilai dari proses konvolusi. Vektor ini bisa kita anggap sebagai fitur citra yang diekstrak menggunakan pre-trained model. Fitur vektor yang dihasilkan ini nantinya bisa dimanfaatkan untuk beragam kebutuhan. Misal karena vektor itu dianggap fitur, jadinya bisa masuk ke classifier lain (misalnya SVM), lalu classifier tersebut di train (tanpa melatih pre-trained modelnya ya, kan sedang di freeze) untuk klasifikasi.

Dengan mengganti layer terakhir pre-trained model, jumlah class pada classifier ini tidak harus sama dengan pre-trained model, misalnya di pre-trained model ada 1000 kelas dan kita hanya ingin membuat model yang mampu mengklasifikasi 2 kelas (mobil atau truk) ya cukup kita ataur di classifier ini hanya 2 kelas.

2.2. Fine Tuning

Pada metode ini kita menggunakan pre-trained model yang telah dilatih namun tidak kita freeze. Jadi meskipun model sudah dilatih, nantinya pre-trained model ini akan dilatih lagi untuk kebutuhan yang baru.

Sebagai contoh, kita ingin melatih model untuk mendeteksi jenis-jenis kendaraan di Indonesia, “motor”, “andong”, dan “becak”. Anggap kita memiliki pre-trained model yang sudah bisa membedakan “truk” dan “mobil”. Kita bisa melatih ulang model ini menggunakan data citra “motor”, “andong”, dan “becak” dengan bobot pre-trained model tadi sebagai bobot awal pelatihan. Proses melatih model dengan nilai awal bobot adalah berasal dari pre-trained model disebut dengan Fine Tuning.

Loh kok bisa model yang awalnya digunakan untuk mendeteksi “mobil” dan “truk” digunakan untuk mendeteksi “motor”, “andong”, dan “becak”? Bisa loh :D, karena pre-trained model yang mampu mendeteksi “mobil” dan “truk”, setidaknya memiliki “pengetahuan” yang bisa dimanfaatkan untuk mendeteksi objek lain. Misalnya, model tersebut sudah paham mana yang objek mana yang latar belakang; mana yang pohon mana yang bukan; dsb. Kita melakukan transfer pengetahuan tersebut untuk kebutuhan baru. Karenanya kita masih perlu melatih lagi (walau kebanyakan proses pelatihan jauh lebih cepat karena model sudah sedikit cerdas).

Ilustrasi metode pertengahan. Ada layer yang di freeze (diarsir) ada yang tidak.

2.3. Metode Pertengahan

Selain dua metode di atas, ada juga yang pertengahan yang seakan mengkombinasikan keduanya. Alias, sebagian layer di-freeze, sebagian layer tidak di-freeze. Biasanya layer yang di-freeze adalah beberapa layer yang di depan (yang dekat dengan input layer dan menyimpan informasi yang low-level) sedangkan layer yang di belakang, yang menyimpan informasi yang lebih high-level, tidak di-freeze untuk di-fine tune. Ini biasanya digunakan ketika data yang digunakan untuk melatih pre-trained model dirasa sedikit berbeda dengan data yang baru. Selain itu ini juga kadang dilakukan untuk menghindari fine tuning semua layer. Karena melakukan fine tuning secara tidak hati-hati di semua layer dapat “membodohkan” model yang sudah cerdas.

Permasalahan seperti apa

Berdasarkan kondisi dataset yang akan digunakan dan pre-trained model yang kita miliki, ada sedikit “aturan” yang bisa kita ikuti, kapan dan teknik seperti apa yang bisa digunakan untuk transfer learning. Saya tidak akan menjelaskan detailnya, bisa dibaca di bagian “When and how to fine-tune?” dari https://cs231n.github.io/.

Sekian untuk artikel ini, semoga bermanfaat! InsyaAllah implementasinya menyusul 🙂

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

6 Comments

  • Ingin bertanya pak. jadi saya melakukan training model dengan pretrained model. saya ingin membuat deteksi kerusakan permukaan pada bangunan. Untuk pendeteksian berhasil, tetapi jika iseng di tes dengan gambar orang, akan menunjukan bouding box pada wajahnya. Apakah ada solusi agar model tidak mendeteksi wajah pak ?
    Terimakasih

    • Sebenarnya ini masalah yang umum karena model machine learning didesain untuk spesifik tugas tertentu. Jadi selalu akan ada celah jika data yang ditemui setelah model terlatih memiliki karakteristik yang berbeda dengan data latih.

      Ada beberapa solusi yang bisa dipakai:
      1. Lakukan pengecekan di awal apakah itu permukaan bangunan atau bukan sebelum dideteksi kerusakannya. Ini bisa dilakukan dengan rule-based, pengecekan warna, atau bisa juga menggunakan machine learning (klasifikasi 2 kelas, bangunan atau bukan)
      2. Tambah data latih dengan citra yang tidak relevan. Sehingga model semakin terlatih dengan mana yang kerusakan bangunan mana yang bukan. Sebagai contoh pada kasus mas Ahmad bisa dengan menambah data latih gambar wajah, pemandangan, dll.

  • Terima kasih atas ilmunya, mohon izin untuk bertanya.

    Saya memiliki data dari sensor akselerometer dan giroskop smartphone dan ingin menggunakan transfer learning serta metode LSTM untuk klasifikasinya.

    Pertanyaan saya, saya ingin melakukan pretrained pada data saya terlebih dahulu, lalu menggunakan data tersebut untuk klasifikasi LSTM, apakah hal tersebut memungkinkan? Mengingat saya hanya memiliki 1 dataset saja.

    Terima kasih

    • Maksudnya pretraining dengan data sendiri itu seperti apa ya?

      Di paper “How transferable are features in deep neural networks?” yang dibahas di artikel ini juga ada jenis transfer learning dengan data sendiri. Jadi nanti nanti di-train 2x, dengan train kedua sebagian layernya di-freeze, namanya Selffer Network (lihat ilustrasi ketiga di artikel ini, lalu cek bagian yang ungu di baris ketiga). Apakah seperti itu yang dimaksud?

Leave a Reply