Khi theo dõi mạng lưới thần kinh của tôi, tôi thậm chí không thể học được khoảng cách Euclide, tôi đã đơn giản hóa hơn nữa và cố gắng huấn luyện một ReLU duy nhất (với trọng lượng ngẫu nhiên) thành một ReLU duy nhất. Đây là mạng đơn giản nhất có, và một nửa thời gian nó không hội tụ.
Nếu dự đoán ban đầu có cùng hướng với mục tiêu, nó sẽ học nhanh và hội tụ đúng trọng số 1:
Nếu dự đoán ban đầu là "ngược", nó sẽ bị kẹt ở mức 0 và không bao giờ đi qua vùng bị mất:
Tôi không hiểu tại sao. Không nên giảm độ dốc dễ dàng theo đường cong mất đến cực tiểu toàn cầu?
Mã ví dụ:
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()
Điều tương tự cũng xảy ra nếu tôi thêm sai lệch: Hàm mất 2D rất đơn giản và đơn giản, nhưng nếu Relu bắt đầu lộn ngược, nó sẽ quay vòng và bị kẹt (điểm bắt đầu màu đỏ) và không theo độ dốc xuống mức tối thiểu (như nó không cho điểm bắt đầu màu xanh):
Điều tương tự cũng xảy ra nếu tôi thêm trọng lượng đầu ra và thiên vị, quá. (Nó sẽ lật từ trái sang phải hoặc từ trên xuống, nhưng không lật cả hai.)