Hồi quy tuyến tính đơn giản trong máy ảnh


11

Sau khi xem Câu hỏi này: Cố gắng mô phỏng hồi quy tuyến tính bằng Keras , tôi đã cố gắng đưa ra ví dụ của riêng mình, chỉ cho mục đích học tập và phát triển trực giác của tôi.

Tôi đã tải xuống một tập dữ liệu đơn giản và sử dụng một cột để dự đoán một cột khác. Dữ liệu trông như thế này:

dữ liệu truyền hình

Bây giờ tôi chỉ tạo một mô hình máy ảnh đơn giản với một lớp tuyến tính một nút và tiến hành chạy giảm độ dốc trên nó:

from keras.layers import Input, Dense
from keras.models import Model

inputs = Input(shape=(1,))
preds = Dense(1,activation='linear')(inputs)

model = Model(inputs=inputs,outputs=preds)
sgd=keras.optimizers.SGD()
model.compile(optimizer=sgd ,loss='mse',metrics=['mse'])
model.fit(x,y, batch_size=1, epochs=30, shuffle=False)

Chạy mô hình như thế mang lại cho tôi nansự mất mát trên mỗi kỷ nguyên.

Liên kết đến máy tính xách tay jupyter

Vì vậy, tôi quyết định bắt đầu thử mọi thứ và tôi chỉ có được một mô hình khá nếu tôi sử dụng tỷ lệ học tập nhỏ một cách lố bịch sgd=keras.optimizers.SGD(lr=0.0000001) :

truyền hình-dữ liệu

Bây giờ tại sao điều này xảy ra? Tôi có phải tự điều chỉnh tỷ lệ học tập như thế này cho mọi vấn đề tôi gặp phải không? Tôi đang làm gì đó sai ở đây? Đây được cho là vấn đề đơn giản nhất có thể, phải không?

Cảm ơn!

Câu trả lời:


11

Điều này có lẽ là do không có bình thường hóa được thực hiện. Mạng lưới thần kinh rất nhạy cảm với dữ liệu không chuẩn hóa.

Một số trực giác: khi chúng tôi cố gắng tìm mức tối thiểu toàn cầu đa chiều của chúng tôi (như trong mô hình giảm độ dốc ngẫu nhiên), trong mỗi lần lặp, mỗi tính năng "kéo" vào chiều của nó (hướng vectơ) với một lực (độ dài của vectơ) ). Khi dữ liệu không được chuẩn hóa, một bước nhỏ về giá trị cho cột A có thể gây ra thay đổi lớn trong cột B.

Mã của bạn đã đối phó với việc sử dụng tỷ lệ học tập rất thấp của bạn, điều này đã "bình thường hóa" hiệu ứng trên mỗi cột, mặc dù gây ra quá trình học tập bị trì hoãn, đòi hỏi nhiều kỷ nguyên hơn để kết thúc.

Thêm mã chuẩn hóa này:

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
x = sc.fit_transform(x)
y = sc.fit_transform(y)

Và chỉ cần bỏ tham số học tập (lr) - hãy để nó chọn một giá trị tự động cho bạn. Tôi có biểu đồ mong muốn giống như bạn bây giờ :)


Trông gọn gàng ... điều duy nhất tôi không thích là tôi sẽ cần áp dụng tương tự tiêu chuẩn hóa này để kiểm tra đầu vào và sau đó đầu ra tôi nhận được cũng sẽ nằm trong một bộ đơn vị khác.
Felipe Almeida

2
Điều đó đúng @Felipe Almeida, kết quả đầu ra sẽ được "đảo ngược" trở lại, nhưng điều này thường được tích hợp vào các thư viện. Hãy nhìn vào inverse_transform scikit-learn.org/stable/modules/generated/... và một số phương pháp tiền xử lý khác scikit-learn.org/stable/modules/preprocessing.html
Mork

2

Bình thường hóa quan trọng hơn khi bạn có nhiều hơn một biến phụ thuộc. Nếu bạn nhìn vào cốt truyện phân tán, bạn có thể thấy các ngoại lệ. Một mạng lưới thần kinh không có các lớp ẩn giống như một mô hình hồi quy tuyến tính. Vì vậy, nó phù hợp với dòng tốt nhất để giảm thiểu khoảng cách của phần dư. Loại bỏ các ngoại lệ và nó sẽ trông phù hợp hơn.

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.