Mengapa gradient descent tidak efisien untuk kumpulan data besar?


13

Katakanlah kumpulan data kami berisi 1 juta contoh, yaitu, , dan kami ingin menggunakan gradient descent untuk melakukan regresi logistik atau linear pada kumpulan data ini.x1,,x106

Ada apa dengan metode gradient descent yang membuatnya tidak efisien?

Ingat bahwa langkah gradient descent pada waktu diberikan oleh:t

wt+1=wt+ηtf(x)

di mana adalah fungsi kerugian.f

Saya tidak melihat sesuatu yang luar biasa dengan langkah di atas yang menyebabkan algoritma menjadi tidak efisien. Apakah ini perhitungan ? Tidak bisakah operasi ini dihitung sebelumnya, yaitu, setiap sudah dihitung, dan cukup mengevaluasi mereka di setiap titik dataff(x) xi?fxxi?


1
Tidak efisien relatif terhadap ...? Bahkan kotak kuadrat tidak efisien untuk dataset besar. Anda membutuhkan notasi O besar untuk memiliki ide yang bermakna tentang apa yang dilakukan terhadap algoritma. Tidak semua algoritma GD memiliki O besar yang sama (ya?)n
AdamO

Jawaban:


7

Akan membantu jika Anda memberikan konteks pada klaim bahwa gradient descent tidak efisien. Tidak efisien relatif terhadap apa?

Saya kira konteks yang hilang di sini adalah perbandingan dengan penurunan gradien stokastik atau batch dalam pembelajaran mesin. Inilah cara menjawab pertanyaan dalam konteks ini. Anda mengoptimalkan parameter model, bahkan hiperparameter. Jadi, Anda memiliki fungsi biaya , di mana - data Anda, dan - vektor parameter, dan - fungsi rugi. Untuk meminimalkan biaya ini, Anda menggunakan gradient descent di atas parameter : x i Θ L ( ) θ j i=1nL(xi|Θ)xiΘL() θj

θji=1nL(Θ|xi)

Jadi, Anda melihat bahwa Anda perlu mendapatkan penjumlahan dari semua data . Ini sangat disayangkan, karena itu berarti Anda terus mengulang-ulang data untuk setiap langkah gradient descent Anda. Begitulah keturunan batch dan stochastic gradient muncul: bagaimana jika kita mengambil sampel dari kumpulan data, dan menghitung gradien pada sampel, bukan set lengkap? Di sini, adalah jumlah pengamatan dalam sampel . Jadi, jika sampel Anda 1/100 dari total yang ditetapkan, Anda mempercepat perhitungan Anda sebanyak 100 kali! Jelas, ini memperkenalkan kebisingan, yang memperpanjang pembelajaran, tetapi kebisingan berkurang pada tingkatxi=1,,nnss

θjk=1nsL(Θ|xk)
nss nnsementara jumlah perhitungan meningkat pada , jadi trik ini mungkin berhasil.n

Atau, alih-alih menunggu hingga jumlah penuh dihitung, Anda dapat membaginya menjadi batch, dan melakukan langkah untuk setiap batch . Dengan cara ini Anda akan melakukan langkah-langkah M pada saat jumlah seluruh kumpulan data dihitung. Ini akan menjadi langkah yang lebih ribet, tetapi kebisingan akan hilang seiring waktu.M s = 1n s i s = 1i=1ns=1Mis=1ns


19

Ada dua cara di mana gradient descent mungkin tidak efisien. Menariknya, mereka masing-masing mengarah ke metode mereka sendiri untuk memperbaiki, yang merupakan solusi yang hampir berlawanan. Dua masalah tersebut adalah:

(1) Diperlukan terlalu banyak pembaruan gradient descent.

(2) Setiap langkah gradient descent terlalu mahal.

Berkenaan dengan (1), membandingkan gradient descent dengan metode yang mempertimbangkan informasi tentang turunan orde kedua, gradient descent cenderung sangat tidak efisien dalam hal meningkatkan kerugian pada setiap iterasi. Metode yang sangat standar, Metode Newton , umumnya membutuhkan iterasi yang jauh lebih sedikit untuk bertemu, yaitu untuk regresi logistik, 10 iterasi dari Metode Newton akan sering memiliki kerugian yang lebih rendah daripada solusi yang disediakan oleh 5.000 iterasi penurunan gradien. Untuk regresi linier, ini bahkan lebih ekstrem; ada solusi bentuk tertutup! Namun, karena jumlah prediktor menjadi sangat besar (yaitu 500+), Metode Newton / penyelesaian langsung untuk regresi linier bisa menjadi terlalu mahal per iterasi karena jumlah operasi matriks yang diperlukan, sedangkan gradient descent akan memiliki biaya per iterasi yang jauh lebih rendah.

Sehubungan dengan (2), dimungkinkan untuk memiliki dataset yang sedemikian besar sehingga setiap iterasi gradient descent terlalu mahal untuk dihitung. Komputasi gradien akan membutuhkan operasi ( = ukuran sampel, = jumlah kovariat). Sementara sama sekali tidak menjadi masalah pada komputer modern untuk nilai , tentunya sesuatu seperti , akan menjadi. Dalam hal ini, metode yang memperkirakan turunan berdasarkan subset data yang lebih kecil lebih menarik, seperti penurunan gradien stokastik .n k n = 10 6 k < 100 n = 10O(nk)nkn=106k<100n=1012k=103

Saya mengatakan bahwa perbaikan ini hampir berlawanan, dalam sesuatu seperti metode Newton lebih mahal tetapi lebih efisien (dalam hal perubahan kehilangan) per pembaruan, sedangkan penurunan gradien stokastik sebenarnya kurang efisien tetapi jauh lebih murah secara komputasi per pembaruan.


Terima kasih atas jawaban yang luar biasa. Apa yang Anda maksud dengan = jumlah kovariat? Saya tidak terbiasa dengan terminologi inik
Carlos - the Mongoose - Bahaya

2
@Learningonepageatatime: covariates = variabel prediktor.
Cliff AB

10

Pertama izinkan saya menyarankan peningkatan pada notasi Anda. Secara khusus, mari kita tunjukkan fungsi kerugian dengan daripada . Menggunakan huruf hanyalah preferensi pribadi saya karena mengingatkan saya bahwa kita sedang berurusan dengan L oss. Perubahan yang lebih substantif adalah membuatnya jelas bahwa kerugian adalah fungsi dari bobot daripada data . Yang penting, gradien sehubungan dengan tidak . Jadi mana adalah dimensi dari Anda data.L(w)f(x)Lwxwx

L(w)=(Lw1,,LwD),
D

Terlepas dari kenyataan bahwa kita harus memikirkan kerugian sebagai fungsi dari bobot , fungsi kerugian wajar masih akan tergantung pada seluruh dataset (jika tidak, itu tidak akan mungkin untuk belajar sesuatu dari data! ). Dalam regresi linier, misalnya, kami biasanya menggunakan fungsi jumlah penjumlahan kuadrat Jadi mengevaluasi gradien untuk satu set bobot tertentu akan membutuhkan penjumlahan atas semua titik dalam dataset . Jika , maka setiap langkah inkremental dalam optimasi gradient descent akan diperlukan pada urutan satu juta operasi, yang cukup mahal.x L ( w ) = N i = 1 ( y i - w T x i ) 2 . L ( w ) w N x N = 10 6wx

L(w)=i=1N(yiwTxi)2.
L(w)wNxN=106

3

Jawaban singkat: Menghitung gradien harus dijumlahkan di semua titik data. Jika kita memiliki jumlah data yang besar, maka itu membutuhkan waktu yang lama.

Saya punya jawaban terinci di sini.

Bagaimana penurunan gradien stokastik dapat menghemat waktu dibandingkan dengan penurunan gradien standar?


Di sisi lain, selalu perlu diingat ada metode langsung selain metode iteratif (gradien yang layak). Jika kita ingin menyelesaikan masalah kuadrat terkecil, metode langsung bisa sangat efisien. Misalnya, dekomposisi QR. Jika kita tidak memiliki terlalu banyak fitur, itu sangat cepat.

Ketika Anda memverifikasinya, mungkin akan mengejutkan Anda: 5 juta titik data dengan 2 fitur, Memecahkan regresi linier / kuadrat terkecil membutuhkan beberapa detik!

x=matrix(runif(1e7),ncol=2)
y=runif(5e6)
start_time <- Sys.time()
lm(y~x)
end_time <- Sys.time()
end_time - start_time
# Time difference of 4.299081 secs

1

Meskipun dua contoh yang Anda sebutkan biasanya cembung saya akan menambahkan satu poin tentang masalah non-cembung. Menurut pendapat saya ada dua alasan utama mengapa (batch) gradient descent dapat dianggap "tidak efisien". Poin pertama tentang upaya komputasi untuk menghitung gradien dari sejumlah besar fungsi telah diuraikan dengan sangat jelas dalam jawaban lainnya. Untuk masalah non-cembung namun GD memiliki masalah biasanya terjebak dalam minimum lokal "dekat". Minimum ini mungkin sangat buruk dibandingkan dengan minimum global. SGD atau mini-batch GD memiliki "keuntungan" berkeliaran (setidaknya sebagian) secara acak dan dengan demikian mungkin memiliki peluang untuk menemukan minimum lokal yang lebih baik. Lihat jawaban CV ini di sini . Atau pos CV lainnya ini menguraikan bagaimana keacakan mungkin bermanfaat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.