Sebagai tindak lanjut dari jaringan saraf saya, saya bahkan tidak bisa mempelajari jarak Euclidean. Saya menyederhanakan lebih banyak lagi dan mencoba melatih satu ReLU tunggal (dengan berat acak) menjadi satu ReLU tunggal. Ini adalah jaringan paling sederhana yang ada, namun separuh dari waktu gagal untuk bertemu.
Jika tebakan awal berada dalam orientasi yang sama dengan target, ia akan belajar dengan cepat dan menyatu dengan bobot yang benar dari 1:
Jika tebakan awal adalah "mundur", macet dengan berat nol dan tidak pernah melewatinya ke wilayah kehilangan yang lebih rendah:
Saya tidak mengerti mengapa. Bukankah seharusnya gradient descent dengan mudah mengikuti kurva kehilangan ke minimum global?
Kode contoh:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, ReLU
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
batch = 1000
def tests():
while True:
test = np.random.randn(batch)
# Generate ReLU test case
X = test
Y = test.copy()
Y[Y < 0] = 0
yield X, Y
model = Sequential([Dense(1, input_dim=1, activation=None, use_bias=False)])
model.add(ReLU())
model.set_weights([[[-10]]])
model.compile(loss='mean_squared_error', optimizer='sgd')
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.losses = []
self.weights = []
self.n = 0
self.n += 1
def on_epoch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
w = model.get_weights()
self.weights.append([x.flatten()[0] for x in w])
self.n += 1
history = LossHistory()
model.fit_generator(tests(), steps_per_epoch=100, epochs=20,
callbacks=[history])
fig, (ax1, ax2) = plt.subplots(2, 1, True, num='Learning')
ax1.set_title('ReLU learning ReLU')
ax1.semilogy(history.losses)
ax1.set_ylabel('Loss')
ax1.grid(True, which="both")
ax1.margins(0, 0.05)
ax2.plot(history.weights)
ax2.set_ylabel('Weight')
ax2.set_xlabel('Epoch')
ax2.grid(True, which="both")
ax2.margins(0, 0.05)
plt.tight_layout()
plt.show()
Hal serupa terjadi jika saya menambahkan bias: Fungsi kehilangan 2D halus dan sederhana, tetapi jika relu mulai terbalik, berputar dan macet (titik awal merah), dan tidak mengikuti gradien ke minimum (seperti itu tidak untuk titik awal biru):
Hal serupa terjadi jika saya menambah bobot dan bias keluaran. (Ini akan beralih dari kiri ke kanan, atau turun ke atas, tetapi tidak keduanya.)
Jawaban:
Ini terkait dengan fenomena relu yang sekarat; untuk beberapa diskusi, lihat Jaringan ReLU saya gagal diluncurkan
Suatu pendekatan yang mungkin lebih berhasil adalah dengan menggunakan nonlinier yang berbeda seperti relu bocor, yang tidak memiliki apa yang disebut masalah "lenyapnya gradien". Fungsi relu yang bocor adalah
LeakyReLU
ReLU
Kode yang relevan di bawah ini; gunakan
opt_sgd
atauopt_adam
.sumber