Bài viết gồm có 2 phần:
1. Giới thiệu ý tưởng cơ bản về auto encoder
2. Hướng dẫn sử dụng auto encoder để lọc nhiễu ảnh ( denoise images )

1.Ý tưởng cơ bản về auto encoder

Trước hết chúng ta hãy cùng nhắc lại cấu trúc cơ bản về deep learning. 1 mạng deep learning cơ bản gồm có 3 loại layer chính là input, các lớp hidder layer và output.  Về cơ bản, 1 mô hình auto encoder không khác gì 1 mô hình deep learning truyền thống, ngoại trừ việc input của mô hình cũng chính là output của mô hình. Các bạn có thể xem hình sau để hiểu rõ hơn:

Các lớp hidden layer của chúng ta sẽ gồm 2 loại chính:

  • Encoder: những lớp hidder layer có nhiệm vụ ánh xạ input của chúng ta về một số lượng chiều không gian nhỏ hơn. Ví dụ như trong bức hình trên chúng ta có 1 bức ảnh số 4 là input (bức ảnh xem như 1 ma trận 256*256 ), giờ chúng ta nén nó về 1 vector h chỉ gồm có 128 phần tử vậy. Vector này sẽ chứa những đặc trưng quan trọng nhất của bức ảnh. Nói dân dã hơn, các bạn có thể hiểu là chúng ta đang nén 1 bức ảnh từ kích thước 1GB về chỉ còn là 1 vector zip ( hoặc rar, tag.gz, ... ) có 200MB.
Chú ý: Vector encoder h của chúng ta phải luôn luôn có số chiều nhỏ hơn đầu vào. Nếu như số chiều của h lớn hơn hoặc bằng số chiều của input, encoder sẽ chỉ đơn giản là copy nguyên input của chúng ta vào h, và sau đó chuyển qua decoder
  • Decoder: Từ vector đã được nén, giờ chúng ta giải nén ngược trở lại, để khôi phục bức ảnh ban đầu của chúng ta.

Nếu vậy chúng ta sẽ đặt câu hỏi là tại sao lại phải cần mất thời gian như vậy ? Khác với việc nén và giải nén file là 1 phép ánh xạ hoàn chỉnh ( không bị mất thông tin trong quá trình ), encoder của chúng ta là 1 phép ánh xạ không hoàn chỉnh, giống như bạn có 1 điểm trong hệ tọa độ (x, y) nhưng chúng ta lại bỏ x đi mà chỉ giữ lại y vậy, Trong quá trình hạ chiều input , hiện tượng mất mát thông tin sẽ xảy ra. Tuy nhiên, chỉ từ thông tin về số chiều được giữ lại ( vector h ), chúng ta lại muốn khôi phục lại bức ảnh gốc ban đầu, vậy thì tất yếu encoder của chúng ta buộc phải chọn lựa những đặc trưng tốt nhất để giữ lại trong vector h, còn những thứ không quan trọng khác nó sẽ buộc phải bỏ đi. Đây chính là ý tưởng cơ bản để chúng ta lọc nhiễu ra khỏi bức ảnh - encoder sẽ chỉ lựa chọn những phần quan trọng nhất của bức ảnh để ghi nhớ vào vector h, và nhiễu sẽ bị bỏ qua ở giai đoạn này

Mục tiêu của chúng ta là input và output của mô hình là giống nhau nhất có thể. Dưới đây là ví dụ của 1 input và output của mô hình này:

2. Hướng dẫn sử dụng auto encoder cho lọc nhiễu ảnh

Như đã trình bày ở trên, thông qua việc nén input về 1 vector có số chiều nhỏ hơn, chúng ta hi vọng rằng mô hình của chúng ta sẽ bỏ qua nhiễu và chỉ học những gì là đặc trưng nhất của bức ảnh.

Trong mô hình cũ, input và ouput của chúng ta cùng là ảnh gốc. Nhưng trong mô hình lọc nhiễu này, input của chúng ta sẽ là 1 bức ảnh bị nhiễu, và output của chúng ta sẽ là ảnh gốc ( đã được lọc nhiễu ). Cấu trúc mạng neural network không thay đổi.

Ví dụ với bộ ảnh MNIST, chúng ta sẽ cố tình tạo nhiễu cho các bức ảnh đầu vào :

Và đây là ảnh đầu ra của chúng ta:

uc?id=1W-Ry13W9FP45ehXIY8Vmz7_XuMGH6RC9&export=download

Kết quả trên cho chúng ta thấy là ngay cả những bức ảnh rất nhiều nhiễu cũng có thể được mô hình của chúng ta lọc rât đẹp.

Nguồn tham khảo:

  1. https://blog.keras.io/building-autoencoders-in-keras.html
  2. https://towardsdatascience.com/deep-inside-autoencoders-7e41f319999f
  3. https://towardsdatascience.com/denoising-autoencoders-explained-dbb82467fc2