Apakah ada cara untuk mengukur kompleksitas Model Pembelajaran Mesin secara eksplisit dengan Python

Aug 20 2020

Saya tertarik dengan model debuggin dan salah satu poin yang direkomendasikannya adalah membandingkan model Anda dengan model yang "tidak terlalu rumit" untuk melihat apakah kinerjanya jauh lebih baik pada model yang paling kompleks.

Ini menimbulkan pertanyaan saya:

Misalkan Anda memiliki model Ensemble dan model Linear untuk tugas klasifikasi "Tampaknya wajar untuk berpikir bahwa model ensemble lebih kompleks daripada model linier"

  1. Tapi, apakah cara untuk mengukur kompleksitas model secara numerik agar dapat membandingkan dua atau lebih model dalam istilah seperti itu?

  2. Apakah ada implementasi python yang dapat membantu tugas seperti itu?

Jawaban

4 CarlosMougan Aug 24 2020 at 14:56

Saya belum pernah mendengar cara model agnostik untuk mengukur kompleksitas model. Ada beberapa strategi tetapi bergantung pada model.

Anda dapat mengatasi masalah ini menggunakan keluarga model yang berbeda.

  • Untuk model linier, Anda dapat menghitung jumlah parameter bukan nol yang digunakan. Jumlah fitur yang digunakan untuk prediksi.

  • Untuk pohon keputusan, Anda dapat menghitung kedalaman maksimum yang dicapai pohon tersebut.

  • Untuk Jaringan Neural, Anda dapat menghitung jumlah parameter yang dioptimalkan NN Anda.

  • Untuk metode ansambel (hutan acak, peningkatan gradien), Anda dapat menggunakan agregasi pelajar lemah yang berbeda yang digunakan dalam model.

Untuk implementasi python ada beberapa implementasi tergantung model mana yang ingin Anda ukur. Beberapa di antaranya jika Anda perhatikan sangat mudah diukur.

Sulit secara intuitif untuk membandingkan kompleksitas antara keluarga model yang berbeda. Apa yang lebih kompleks dari regresi linier dengan 4 koefisien atau pohon keputusan dengan max_depth = 3?

Pada topik kompleksitas pembelajaran yang mendalam, Hinton, Oriol, Jeff Dean menerbitkan makalah Distilling the knowledge of a Neural Network . Di mana mereka berbicara tentang menyederhanakan kompleksitas Jaringan Neural.

3 Erwan Aug 20 2020 at 03:26

Ini mungkin agak naif tetapi ide pertama yang muncul di benak adalah menghitung jumlah parameter yang harus diestimasi selama pelatihan: semakin banyak nilai yang perlu diestimasi, semakin kompleks modelnya, karena ruang hipotesis lebih besar . Misalnya model linier hanya perlu$n+1$ parameter (dengan $n$jumlah fitur), sedangkan jumlah parameter dalam model ansambel yang dibutuhkan adalah jumlah dari jumlah parameter untuk setiap peserta didik, jadi kemungkinan akan lebih tinggi. Ide ini dapat disempurnakan dengan mempertimbangkan rentang nilai parameter.

Sebagai pendekatan yang sangat kasar, seseorang dapat dengan mudah menghitung ukuran objek yang mewakili model dengan python (dengan asumsi representasi model hemat ruang, mungkin tidak selalu demikian).

3 cag51 Aug 23 2020 at 14:03

Seperti yang mungkin Anda ketahui, "kompleksitas" adalah istilah yang dimuat dalam ilmu komputer. Biasanya, kompleksitas diukur dalam "notasi O besar" dan berkaitan dengan bagaimana solusi berskala dalam waktu seiring dengan bertambahnya jumlah input. Misalnya, posting ini membahas kompleksitas komputasi lapisan konvolusional.

Namun, dalam pembelajaran mendalam, arsitektur jaringan neural yang bersaing umumnya menerapkan algoritme yang sama (propagasi balik) ke jenis masalah yang sama (misalnya, klasifikasi ImageNet); satu-satunya perbedaan adalah arsitekturnya. Lebih lanjut, kebanyakan arsitektur menggunakan elemen komputasi yang serupa (misalnya, lapisan konvolusional dan lapisan linier). Jadi, ini adalah kesepakatan untuk menggunakan jumlah parameter sebagai pengganti untuk kompleksitas. Memang benar ini hanyalah perkiraan: dua jaringan mungkin memiliki jumlah parameter yang sama tetapi memerlukan jumlah operasi yang berbeda. Namun secara umum ini merupakan perkiraan yang baik, mengingat bahwa arsitektur yang berbeda umumnya memiliki kesamaan yang disebutkan di atas, tetapi dapat memiliki ukuran yang berbeda dalam beberapa kali lipat.

Sebagai referensi, perhatikan Gambar 1 di EfficientNet Paper . Mereka menggunakan jumlah parameter yang dapat dilatih sebagai pengganti untuk "ukuran model" dan memperhatikan bahwa jumlah parameter kurang lebih berkorelasi linier dengan waktu proses.

Adapun fungsi Python yang menghitung jumlah parameter dilatih, ini akan tergantung apakah Anda menggunakan Keras, Tensorflow, PyTorch, dll Keras, ini adalah salah satu baris: model.count_params(). Di PyTorch, Anda dapat menghitungnya model.parameters()seperti yang dibahas di sini .

3 NicholasJamesBailey Aug 24 2020 at 15:43

Seperti yang disebutkan oleh jawaban lain di sini, ketika kita berbicara tentang kompleksitas model, kita biasanya memikirkan tentang jumlah parameter yang dipelajari model. Ketika seseorang berbicara tentang membandingkan dengan model yang kurang kompleks, yang mereka maksud sering kali adalah membandingkan dengan model yang kurang kompleks secara intuitif (baik model di kelas yang sama, misalnya jaringan saraf dengan neuron lebih sedikit, atau model dari kelas yang lebih sederhana, misalnya model linier bukan hutan acak).

Satu cara untuk memikirkan tentang kompleksitas model antara model yang sangat berbeda adalah Kompleksitas Kolmogorov , dan Anda dapat memperkirakannya dengan melihat jumlah ruang yang ditempati oleh model yang Anda simpan (misalnya, acar). Dalam contoh yang Anda berikan, ansambel akan menempati lebih banyak ruang disk daripada model linier, kecuali jika ansambel lebih sederhana daripada model linier (misalnya ansambel dari dua model linier dengan masing-masing 10 koefisien yang dipelajari versus model linier dengan 200 koefisien yang dipelajari).

2 BrianSpiering Aug 20 2020 at 03:56

Salah satu opsinya adalah Bayesian information criterion (BIC) yang merupakan kriteria pemilihan model yang mencoba menghargai kecocokan pemodelan, yang diukur dengan kemungkinan dimaksimalkan, sambil menghukum jumlah parameter.

Salah satu implementasi BIC ada di dalam RegscorePypaket.

2 Dhanushkumar Aug 27 2020 at 14:26

1. Tapi, apakah cara untuk mengukur kompleksitas model secara numerik agar dapat membandingkan dua atau lebih model dalam istilah seperti itu?

Anda dapat menggunakan dimensi VC untuk mengukur kompleksitas model dalam format numerik. Lihat dimensi Vapnik – Chervonenkis di Wikipedia .

2. Apakah ada implementasi python yang dapat membantu tugas seperti itu?

Sudah ada link stack exchange yang menjelaskan tentang dimensi VC. Bagaimana cara menghitung dimensi VC?