Mục đích:
Tôi chưa quen với việc học máy và thử nghiệm với các mạng lưới thần kinh. Tôi muốn xây dựng một mạng lấy đầu vào là một chuỗi gồm 5 hình ảnh và dự đoán hình ảnh tiếp theo. Tập dữ liệu của tôi là hoàn toàn nhân tạo, chỉ cho thử nghiệm của tôi. Như một minh họa, đây là một vài ví dụ về đầu vào và đầu ra dự kiến:
Hình ảnh của các điểm dữ liệu và của các mục tiêu là từ cùng một nguồn: hình ảnh mục tiêu của một điểm dữ liệu xuất hiện trong các điểm dữ liệu khác và ngược lại.
Những gì tôi đã làm xong:
Hiện tại tôi đã xây dựng một perceptron với một lớp ẩn và lớp đầu ra cho các pixel của dự đoán. Hai lớp dày đặc và được tạo thành từ các nơ-ron sigmoid và tôi đã sử dụng sai số bình phương trung bình làm mục tiêu. Vì hình ảnh khá đơn giản và không thay đổi nhiều, điều này thực hiện rất tốt: với 200-300 ví dụ và 50 đơn vị ẩn, tôi nhận được giá trị lỗi tốt (0,06) và dự đoán tốt về dữ liệu thử nghiệm. Mạng được đào tạo với độ dốc giảm dần (với tỷ lệ học tập). Dưới đây là các loại đường cong học tập tôi nhận được và quá trình phát triển lỗi với số lượng kỷ nguyên:
Những gì tôi đang cố gắng làm:
Điều này là tốt, nhưng bây giờ tôi muốn giảm tính chiều của tập dữ liệu để nó sẽ mở rộng thành hình ảnh lớn hơn và nhiều ví dụ hơn. Vì vậy, tôi đã áp dụng PCA. Tuy nhiên tôi không áp dụng nó trong danh sách các điểm dữ liệu mà trong danh sách các hình ảnh , vì hai lý do:
- Trên toàn bộ dữ liệu được đặt, ma trận đối lưu sẽ là 24000x24000, không phù hợp với bộ nhớ của máy tính xách tay của tôi;
- Bằng cách thực hiện trên các hình ảnh, tôi cũng có thể nén các mục tiêu, vì chúng được làm từ cùng một hình ảnh.
Khi các hình ảnh trông giống nhau, tôi đã giảm kích thước của chúng từ 4800 (40x40x3) xuống 36 trong khi chỉ mất 1e-6 của phương sai.
Những gì không hoạt động:
Khi tôi cung cấp tập dữ liệu giảm và các mục tiêu giảm của nó vào mạng, độ dốc giảm dần hội tụ rất nhanh đến một lỗi cao (khoảng 50!). Bạn có thể thấy các ô tương đương như các ô trên:
Tôi đã không tưởng tượng rằng một đường cong học tập có thể bắt đầu ở một giá trị cao, sau đó đi xuống và sao lưu ... Và những nguyên nhân thông thường của việc giảm độ dốc dừng quá nhanh là gì? Nó có thể được liên kết với khởi tạo tham số (tôi sử dụng GlorotUniform, mặc định của thư viện lasagne).
Sau đó, tôi nhận thấy rằng nếu tôi cung cấp dữ liệu giảm nhưng các mục tiêu ban đầu (không nén), tôi sẽ lấy lại hiệu suất ban đầu. Vì vậy, có vẻ như áp dụng PCA trên hình ảnh mục tiêu không phải là một ý tưởng tốt. Tại sao vậy? Rốt cuộc, tôi chỉ nhân các đầu vào và các mục tiêu theo cùng một ma trận, vì vậy đầu vào và mục tiêu đào tạo vẫn được liên kết theo cách mà mạng lưới thần kinh có thể tìm ra, phải không? Tôi đang thiếu gì?
Ngay cả khi tôi giới thiệu và thêm lớp 4800 đơn vị để có cùng số lượng tế bào thần kinh sigmoid, tôi cũng nhận được kết quả tương tự. Tóm lại, tôi đã thử:
- 24000 pixel => 50 sigmoids => 4800 sigmoids (= 4800 pixel)
- 180 "pixel" => 50 sigmoids => 36 sigmoids (= 36 "pixel")
- 180 "pixel" => 50 sigmoids => 4800 sigmoids (= 4800 pixel)
- 180 "pixel" => 50 sigmoids => 4800 sigmoids => 36 sigmoids (= 36 "pixel")
- 180 "pixel" => 50 sigmoids => 4800 sigmoids => 36 tuyến tính (= 36 "pixel")
(1) và (3) hoạt động tốt; nhưng không phải (2), (4) và (5) và tôi không hiểu tại sao. Cụ thể, vì (3) hoạt động, (5) sẽ có thể tìm thấy các tham số tương tự như (3) và các vectơ riêng trong lớp tuyến tính cuối cùng. Điều đó là không thể đối với một mạng lưới thần kinh?