Pola apa yang ditemukan jaringan saraf?

Dalam posting ini saya ingin berbicara tentang pola yang dapat ditemukan oleh jaringan saraf. Banyak panduan untuk pemula yang fokus pada teknik penulisan kode untuk jaringan saraf, sementara pertanyaan tentang "logika" (apa yang bisa jaringan saraf? Arsitektur mana yang lebih cocok untuk tugas mana dan mengapa?) Sering kali tetap berada di sela-sela. Saya berharap posting saya akan membantu pemula lebih memahami kemampuan jaringan saraf. Untuk melakukan ini, kami akan mencoba melihat bagaimana mereka mengatasi beberapa tugas model. Kode contoh akan diberikan dalam python menggunakan perpustakaan keras.

Tugas 1. Mari kita mulai dengan yang sederhana. Kami membangun jaringan saraf yang mendekati sinus.

import numpy as np import matplotlib import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense def get_X_y(n): X = np.random.uniform(0, np.pi, n) y = np.sin(X) return X, y n = 40 X, y = get_X_y(n) print("X shape:", X.shape) model = Sequential() model.add(Dense(6, input_dim=1, activation='relu')) model.add(Dense(4, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error']) model.fit(X, y, epochs=1000, batch_size=4) X_test = np.linspace(start=0, stop=np.pi, num=500) print("X test shape:", X_test.shape) y_test = model.predict(X_test) font = {'weight': 'bold', 'size': 25} matplotlib.rc('font', **font) axes = plt.gca() axes.set_ylim(0, 1) plt.plot(X_test, y_test, c='green', marker='o', markersize=5) plt.title("Sinus approximated by neural network") plt.yticks(np.arange(0, 1, 0.1)) plt.grid() plt.show() 

Kami mendapatkan bagan berikut:



Seperti yang Anda lihat, jaringan saraf berhasil diatasi dengan tugas mendekati fungsi sederhana.

Tugas 2. Mari kita lihat bagaimana jaringan saraf akan mengatasi tugas yang lebih kompleks. Kami akan memasukkan nilai x yang didistribusikan secara seragam pada interval [0, 1], dan y akan ditetapkan secara acak: untuk x <0,6, y akan menjadi variabel acak yang mengambil nilai 0 dengan probabilitas 0,75 dan 1 dengan probabilitas 0,25 (yaitu, nilai acak binomial dengan p = 0,25). Untuk x> 0,6, y akan menjadi variabel acak yang mengambil nilai 0 dengan probabilitas 0,3 dan nilai 1 dengan probabilitas 0,7. Sebagai fungsi yang dioptimalkan, kami mengambil kesalahan standar.

 import numpy as np import matplotlib import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense def get_X_y(n): X = np.random.uniform(0, 1, n) y0 = np.random.binomial(size=n, n=1, p=0.25) y1 = np.random.binomial(size=n, n=1, p=0.7) y = np.where(X < 0.6, y0, y1) return X, y n_inputs = 1 n_hidden1 = 100 n_hidden2 = 50 n_outputs = 1 n = 2000 X, y = get_X_y(n) print("X shape:", X.shape) model = Sequential() model.add(Dense(n_hidden1, input_dim=1, activation='relu')) model.add(Dense(n_hidden2, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) model.fit(X, y, epochs=200, batch_size=100) X_test = np.linspace(start=0, stop=1, num=100) print("X test shape:", X_test.shape) y_test = model.predict(X_test) font = {'weight': 'bold', 'size': 25} matplotlib.rc('font', **font) axes = plt.gca() axes.set_ylim(0, 1) plt.plot(X_test, y_test, c='green', marker='o', markersize=5) plt.title("Binomial distribution approximated by neural network") plt.yticks(np.arange(0, 1, 0.1)) plt.grid() plt.show() 

Kami mendapatkan grafik berikut dari fungsi jaringan saraf yang diperkirakan:



Seperti yang Anda lihat, jaringan saraf mendekati perkiraan matematika dari variabel acak kami y. Jadi, jaringan saraf dapat (pada prinsipnya) memperkirakan nilai rata-rata dari variabel acak yang bergantung pada parameter. Misalnya, kita dapat mengharapkan mereka untuk memecahkan masalah berikut: orang-orang dengan pendapatan hingga $ 1.000 rata-rata tidak bahagia, dan orang-orang dengan pendapatan di atas $ 1.000 rata-rata bahagia; seseorang harus belajar memprediksi "tingkat kebahagiaan" tergantung pada pendapatan. Jaringan saraf akan dapat menemukan ketergantungan dari tingkat kebahagiaan rata-rata pada pendapatan, meskipun pada kenyataannya orang-orang dengan tingkat pendapatan apa pun ada yang bahagia dan tidak bahagia.

Masalah 3. Sekarang kita beralih ke prediksi urutan. Kami akan mempertimbangkan urutan 0 dan 1 yang diberikan oleh aturan berikut: 10 anggota - sama dengan 0 atau 1, dan kesebelas sama dengan 1 jika istilah sebelumnya 0, dan kemungkinan sama 0 atau 1 jika istilah sebelumnya 1. Kami akan menghasilkan urutan panjang 11 (10 input) urutan anggota dan satu, yang terakhir, kami prediksi) dan latih mereka pada jaringan saraf berulang kami. Dan setelah pelatihan, mari kita periksa bagaimana dia mengatasi prediksi urutan baru (juga panjang 11).

 import numpy as np from keras.models import Sequential from keras.layers import LSTM, Dense def get_X_y(m, n): X = np.random.binomial(size=(m,n), n=1, p=0.5) y0 = np.ones(m) y1 = np.random.binomial(size=m, n=1, p=0.5) y = np.where(X[:, n-1]==0, y0, y1) X = np.reshape(X, (X.shape[0], X.shape[1], 1)) return X, y model = Sequential() model.add(LSTM(units=50)) model.add(Dense(units=1)) model.compile(optimizer = 'adam', loss = 'mean_squared_error') X_train, y_train = get_X_y(1000, 10) model.fit(X_train, y_train, epochs = 20, batch_size = 32) m_test = 12 n_test = 10 X_test, y_test = get_X_y(m_test, n_test) y_predicted = model.predict(X_test) for i in range(m_test): print("x_last=", X_test[i, n_test-1, 0], "y_predicted=", y_predicted[i, 0]) 

Mari kita lihat ramalan apa yang diberikan jaringan saraf kita pada urutan yang diuji (Anda akan memiliki hasil yang berbeda, karena ada kebetulan dalam pemilihan urutan dan dalam melatih jaringan saraf).

Nomor urutAnggota urutan terakhir dari belakangNilai yang diprediksi
100,96
200,95
300,97
400,96
500,96
610,45
700,94
810,50
900,96
1010,42
1110,44
1200,92


Seperti yang Anda lihat, jika anggota kedua dari urutan adalah 0, maka jaringan saraf memprediksi nilai mendekati 1, dan jika itu 1, maka nilai mendekati 0,5. Ini dekat dengan perkiraan optimal. Contoh serupa dari "kehidupan" bisa terlihat seperti ini: "jika saya pergi ke bioskop hari ini, maka besok saya akan makan siang di restoran; jika saya pergi ke teater hari ini, maka besok saya akan makan siang di mana saja. " Seperti yang telah kita lihat, jaringan saraf dapat menangkap pola jenis ini dan memprediksi perjalanan ke restoran dengan pergi ke bioskop (dan dengan pergi ke teater untuk memprediksi "sesuatu di antaranya").

Tugas 4. Kami menyulitkan tugas jaringan saraf. Biarkan semuanya seperti pada contoh sebelumnya, hanya anggota urutan kesebelas yang akan ditentukan bukan oleh yang sebelumnya, tetapi oleh anggota kedua dari urutan (dengan aturan yang sama). Kami tidak akan memberikan kode di sini, karena praktis tidak berbeda dari yang sebelumnya. Percobaan saya menunjukkan bahwa jaringan saraf masih menemukan pola, tetapi untuk lebih banyak waktu (saya harus menggunakan 100 zaman bukan 20 untuk pelatihan).
Dengan demikian, jaringan saraf dapat (sekali lagi, pada prinsipnya, mengklarifikasi) menangkap ketergantungan jangka panjang (dalam "contoh kehidupan" kita, mereka dapat menangkap pola seperti "Saya pergi ke restoran hari ini jika saya berada di film seminggu yang lalu").

Tugas 5. Mari kita lihat bagaimana jaringan saraf menggunakan informasi yang tersedia untuk peramalan.
Untuk melakukan ini, kami akan melakukan pelatihan tentang urutan panjang 4. Secara total, kami akan memiliki 3 urutan yang sama kemungkinannya:

0, 0, 1, 1
0, 1, 0, 1
0, 1, 1, 0


Jadi, setelah kombinasi awal 0, 0, kita selalu bertemu dua unit, setelah kombinasi 0, 1 kita sama-sama cenderung bertemu 0 atau 1, tetapi kita pasti tahu angka terakhir pasti. Kami sekarang akan meminta jaringan saraf kami untuk mengembalikan urutan dengan mengatur return_afterences = Benar. Sebagai urutan yang diprediksi, kami mengambil urutan yang sama bergeser satu langkah dan ditambah dengan nol di sebelah kanan. Sekarang kita sudah dapat mengasumsikan apa yang akan terjadi: pada langkah pertama, jaringan saraf akan menghasilkan angka mendekati 2/3 (karena dengan probabilitas 2/3 istilah kedua adalah 1), dan kemudian untuk kombinasi 0, 0 akan menghasilkan dua angka dekat dengan unit, dan untuk 0, 1 pertama akan memberikan angka mendekati 0,5, dan kemudian akan memberikan angka dekat dengan 0 atau 1, tergantung pada apakah kita mendapatkan urutan 0, 1, 0 atau 0, 1, 1. Pada akhir jaringan saraf akan selalu menghasilkan angka mendekati 0. Memeriksa dengan kode berikut menunjukkan bahwa asumsi kami sudah benar.

 import numpy as np from keras.models import Sequential from keras.layers import LSTM, Dense import random def get_X_y(n): X = np.zeros((n, 4)) z = np.array([random.randint(0, 2) for i in range(n)]) X[z == 0, :] = [0, 0, 1, 1] X[z == 1, :] = [0, 1, 0, 1] X[z == 2, :] = [0, 1, 1, 0] y = np.zeros((n, 4)) y[:, :3] = X[:, 1:] X = np.reshape(X, (X.shape[0], X.shape[1], 1)) y = np.reshape(y, (y.shape[0], y.shape[1], 1)) return X, y model = Sequential() model.add(LSTM(units=20, return_sequences=True)) model.add(Dense(units=1)) model.compile(optimizer = 'adam', loss = 'mean_squared_error') X_train, y_train = get_X_y(1000) model.fit(X_train, y_train, epochs = 100, batch_size = 32) X_test = np.zeros((3, 4)) X_test[0, :] = [0, 0, 1, 1] X_test[1, :] = [0, 1, 0, 1] X_test[2, :] = [0, 1, 1, 0] X_test = np.reshape(X_test, (3, 4, 1)) y_predicted = model.predict(X_test) print(y_predicted) 


Dari contoh ini, kita melihat bahwa jaringan saraf dapat secara dinamis mengubah perkiraan tergantung pada informasi yang diterima. Kami akan melakukan hal yang sama, mencoba memprediksi urutan tertentu: ketika informasi yang tersedia memungkinkan kami untuk memperkirakan probabilitas hasil pada langkah berikutnya, kami memperkirakan berdasarkan informasi ini; tetapi ketika kami menemukan informasi tambahan di langkah berikutnya, kami mengubah perkiraan tergantung pada itu.
Jadi, jika kita melihat seseorang datang kepada kita dari kegelapan, maka kita mengatakan "ini adalah seseorang, kita tidak tahu secara lebih detail"; ketika kita mulai membedakan rambut panjang dalam gelap, kita berkata "ini mungkin seorang wanita." Tetapi jika setelah itu kita menganggap bahwa seseorang memiliki kumis, maka kita mengatakan bahwa ini mungkin laki-laki (walaupun berambut panjang). Seperti yang telah kita lihat, jaringan saraf bertindak serupa, menggunakan keseluruhan informasi yang tersedia saat ini untuk peramalan.

Jadi, kami melihat contoh sederhana tentang cara kerja jaringan saraf dan pola apa yang dapat mereka temukan. Secara umum, kami melihat bahwa jaringan saraf yang sering berperilaku cukup "cukup", membuat prediksi yang dekat dengan yang akan dibuat seseorang. Meskipun, perlu dicatat, untuk menangkap pola sederhana, mereka membutuhkan lebih banyak data daripada orang.

Source: https://habr.com/ru/post/id467895/


All Articles