ReLU vs sigmoid trong ví dụ mnist


8

XIN LƯU Ý: Tôi không cố gắng cải thiện ví dụ sau. Tôi biết bạn có thể có được độ chính xác hơn 99%. Toàn bộ mã là trong câu hỏi. Khi tôi thử mã đơn giản này, tôi nhận được độ chính xác khoảng 95%, nếu tôi chỉ cần thay đổi chức năng kích hoạt từ sigmoid sang relu, nó sẽ giảm xuống dưới 50%. Có một lý do lý thuyết tại sao điều này xảy ra?

Tôi đã tìm thấy ví dụ sau đây trên mạng:

from keras.datasets import mnist
from keras.models import Sequential 
from keras.layers.core import Dense, Activation
from keras.utils import np_utils

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.reshape(60000, 784)     
X_test = X_test.reshape(10000, 784)

Y_train = np_utils.to_categorical(Y_train, classes)     
Y_test = np_utils.to_categorical(Y_test, classes)

batch_size = 100      
epochs = 15

model = Sequential()     
model.add(Dense(100, input_dim=784)) 
model.add(Activation('sigmoid'))     
model.add(Dense(10)) 
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='sgd')

model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1)

score = model.evaluate(X_test, Y_test, verbose=1)
print('Test accuracy:', score[1])

Điều này cho độ chính xác khoảng 95%, nhưng nếu tôi thay đổi sigmoid bằng ReLU, tôi nhận được độ chính xác dưới 50%. Tại sao vậy?


Hãy so sánh với keras' dụ relu riêng.
Emre

Tôi muốn hiểu tại sao, trong ví dụ này, relu sẽ làm điều tồi tệ hơn nhiều so với sigmoid. Họ sử dụng một trình tối ưu hóa khác nhau. Sgd không hoạt động tốt với relu?
người dùng

Mô hình của bạn không hội tụ và / hoặc nó quá phù hợp. Tôi sẽ nghiêng nhiều hơn về tùy chọn thứ hai vì tài liệu đã sử dụng bỏ học (chính quy) và bạn thì không. Bạn có thể gỡ lỗi vấn đề này bằng cách vẽ đường cong học tập cho các bộ kiểm tra và huấn luyện.
Emre

Câu hỏi rất đơn giản: tại sao nó hoạt động tốt với sigmoid và không relu? Không có ý kiến ​​nào thậm chí còn giải quyết câu hỏi.
người dùng

Độ chính xác đào tạo của bạn với RELU là gì?
Imran

Câu trả lời:


4

Tôi lấy mã chính xác của bạn, thay thế

model.add(Activation('sigmoid'))

bởi

model.add(Activation('relu'))

và thực sự tôi đã trải qua vấn đề tương tự như bạn: chỉ chính xác 55%, thật tệ ...

Giải pháp : Tôi đã định cỡ lại các giá trị hình ảnh đầu vào từ [0, 255] thành [0,1] và nó hoạt động: độ chính xác 93% với ReLU! (lấy cảm hứng từ https://github.com/keras-team/keras/blob/master/examples/mnist_mlp.py ):

from keras.datasets import mnist
from keras.models import Sequential 
from keras.layers.core import Dense, Activation
from keras.utils import np_utils

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.reshape(60000, 784)     
X_test = X_test.reshape(10000, 784)
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255

Y_train = np_utils.to_categorical(Y_train, 10)
Y_test = np_utils.to_categorical(Y_test, 10)

batch_size = 100
epochs = 15

model = Sequential()     
model.add(Dense(100, input_dim=784)) 
model.add(Activation('relu'))
model.add(Dense(10)) 
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='sgd')

model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1)

score = model.evaluate(X_test, Y_test, verbose=1)
print('Test accuracy:', score[1])

Đầu ra:

Kiểm tra độ chính xác: 0,934


Giải thích tiềm năng: khi sử dụng đầu vào trong [0, 255], sau đó khi thực hiện tổng trọng số cho lớp : , giá trị thường cũng sẽ lớn. Nếu thường lớn (hoặc thậm chí nếu nó thường> 0), giả sử khoảng 100, so với và chúng tôi hoàn toàn mất khía cạnh "phi tuyến tính" của chức năng kích hoạt này! Nói theo một cách khác: nếu đầu vào ở [0, 255], thì thường cách xa 0 và chúng tôi hoàn toàn tránh nơi "những điều phi tuyến tính thú vị" đang diễn ra (khoảng 0, hàm ReLU không tuyến tính và trông giống như ) ... Bây giờ khi đầu vào ở [0,1], thì tổng có trọng sốLz= =một(L-1)w(L)+b(L)zzReLBạn(z)= =zz__/z thường có thể gần bằng 0: đôi khi có thể xuống dưới 0 (vì các trọng số được khởi tạo ngẫu nhiên trên [-1, 1], điều đó là có thể!), đôi khi cao hơn 0, v.v ... Sau đó, việc kích hoạt / hủy kích hoạt nơ-ron sẽ xảy ra nhiều hơn. .. Đây có thể là một lời giải thích tiềm năng về lý do tại sao nó hoạt động tốt hơn với đầu vào trong [0, 1].


Cảm ơn bạn rất nhiều vì nỗ lực của bạn (+1). Câu hỏi của tôi mặc dù là tại sao vậy? Giải thích lý thuyết là gì?
người dùng

Lập luận của bạn có vẻ hợp lý. Nếu bạn muốn thêm một bình luận ngắn trong văn bản câu trả lời của bạn (vì vậy, không cần phải đọc các bình luận) tôi sẽ chấp nhận câu trả lời của bạn.
người dùng

@user Thế là xong!
Basj

1

Tôi có độ chính xác khoảng 98% khi sử dụng chức năng kích hoạt ReLu. Tôi đã sử dụng kiến ​​trúc sau:

  1. lớp kết nối đầy đủ với 300 đơn vị ẩn
  2. Kích hoạt lại ReLu
  3. lớp kết nối đầy đủ với 10 đơn vị ẩn
  4. Lớp Softmax
  5. Cắt đầu ra 1e-10 đến 0.999999 để tránh log (0) và giá trị lớn hơn 1
  6. Mất entropy chéo

Tôi nghĩ bạn nên thêm đầu ra và sau đó đào tạo nó, hy vọng rằng nó sẽ hoạt động tốt.


Cảm ơn bạn. Câu trả lời của bạn dường như đang xác nhận những gì @Basj nói trong các bình luận của anh ấy về lý do tại sao Relu không hội tụ trong khi sigmoid là. +1 nhưng vẫn không trả lời câu hỏi của tôi về lý do. Tôi nghĩ rằng các ý kiến ​​trong câu trả lời khác giải thích rằng.
người dùng

-1

Bởi vì với MNIST, bạn đang cố gắng dự đoán dựa trên xác suất.

Hàm sigmoid squishes x giá trị giữa 01. Điều này giúp chọn chữ số có thể xảy ra nhất phù hợp với nhãn.

Hàm ReLU không squish bất cứ thứ gì. Nếux giá trị nhỏ hơn 0, đầu ra là 0. Nếu nó nhiều hơn0, câu trả lời là xgiá trị bản thân. Không có xác suất đang được tạo ra.

Thành thật mà nói, tôi cho rằng bạn có bất cứ thứ gì hơn 10% khi bạn cắm nó vào.


1
Tôi nghĩ rằng anh ta có nghĩa là anh ta đã thay đổi kích hoạt lớp ẩn từ sigmoid thành RELU, đây không phải là vấn đề miễn là lớp đầu ra vẫn có softmax.
Imran

1
@daleadil như Imran đã nói, lớp ẩn có thể có relu là chức năng kích hoạt, điều này không liên quan gì đến xác suất
người dùng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.