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.)