Tác giả gốc: Steven Wang

Lời nói đầu
Hai anh em N.Coder và D.Coder điều hành một phòng trưng bày nghệ thuật. Một ngày cuối tuần, họ có một cuộc triển lãm đặc biệt kỳ lạ vì nó chỉ có một bức tường và không có tác phẩm nghệ thuật nào. Khi họ nhận được một bức tranh mới, N.Coder chọn một vị trí trên tường làm điểm đánh dấu cho bức tranh và sau đó vứt tác phẩm gốc đi. Khi một khách hàng yêu cầu được xem bức tranh, D.Coder đã cố gắng tạo lại tác phẩm nghệ thuật chỉ bằng cách sử dụng tọa độ của các dấu hiệu có liên quan trên tường.
Bức tường triển lãm như trong hình bên dưới, mỗi chấm đen là một dấu ấn được N.Coder đặt, tượng trưng cho một bức tranh. N.Coder đã dựng lại hình ảnh gốc của số 6 tại tọa độ [- 3.5, 1] trên tường.
Hình bên dưới minh họa thêm ví dụ, các số ở hàng trên là ảnh gốc, tọa độ ở hàng giữa là tọa độ nơi N.Coder treo tranh trên tường, hàng dưới là tác phẩm do D.Coder dựng lại dựa vào tọa độ.
Câu hỏi đặt ra là làm thế nào N.Coder xác định tọa độ tương ứng của từng bức tranh trên tường triển lãm để D.Coder có thể tái tạo lại bức tranh gốc chỉ bằng nó? Hóa ra hai anh em dần dần “thành thạo” việc đặt nhãn hiệu và làm việc qua nhiều năm “đào tạo” đã theo dõi cẩn thận việc thất thoát doanh thu tại phòng vé do khách hàng yêu cầu hoàn tiền do chất lượng tái thiết kém. giảm thiểu sự thất thoát doanh thu này. Như bạn có thể thấy khi so sánh giữa ảnh gốc và ảnh tái tạo trong ảnh trên, sự tương tác giữa hai anh em là khá tốt. Khách hàng đến xem nghệ thuật hiếm khi phàn nàn rằng những bức tranh được vẽ lại của D.Coder rất khác so với tác phẩm gốc mà họ đến xem.
Một ngày nọ, N.Coder nhìn vào bức tường triển lãm và nảy ra một ý tưởng táo bạo: Đối với những phần bức tường hiện chưa được đánh dấu, nếu D.Coder được phép xây dựng lại chúng thì có thể tạo ra những tác phẩm gì? Nếu thành công, họ có thể tổ chức triển lãm tranh gốc 100% của chính mình. Nghĩ đến thôi đã thấy phấn khích nên D.Coder đã chọn ngẫu nhiên những tọa độ chưa được đánh dấu trước đó (chấm đỏ) để xây dựng lại, kết quả được thể hiện trong hình bên dưới.
Như bạn có thể thấy, việc tái thiết rất kém và một số số liệu thậm chí không thể biết được con số đó là gì. Vậy điều gì đã xảy ra và anh em nhà Coder có thể cải thiện giải pháp của mình như thế nào?
1. Bộ mã hóa tự động
Câu chuyện ở lời nói đầu thực chất là một sự tương tựbộ mã hóa tự động(autoencode) thì D.Coder được phiên âm là bộ mã hóa, tức làMã hoá, công việc của nó là chuyển đổi hình ảnh thành tọa độ và N.Coder được phiên âm là bộ giải mã, nghĩa làbộ giải mã, công việc của nó là khôi phục tọa độ thành ảnh. Hàm mất thu nhập được hai anh em theo dõi ở phần trước thực chất là hàm mất thu nhập được sử dụng trong huấn luyện mô hình.
Câu chuyện là câu chuyện, chúng ta hãy xem mô tả chi tiết về bộ mã hóa tự động. Về cơ bản, nó là một mạng lưới thần kinh, bao gồm:
mộtMã hoá(encode): dùng để nén dữ liệu có chiều cao thành các vectơ biểu diễn có chiều thấp.
mộtbộ giải mã(bộ giải mã): Dùng để khôi phục các vectơ biểu diễn có chiều thấp thành dữ liệu có chiều cao.
Quá trình này được hiển thị trong hình bên dưới. Dữ liệu đầu vào ban đầu là dữ liệu hình ảnh có chiều cao. Hình ảnh chứa nhiều pixel và do đó có chiều cao, trong khi vectơ biểu diễn là vectơ biểu diễn có chiều thấp. Vectơ hai chiều [ -2.0, -0.5] được sử dụng trong ví dụ này là Thứ nguyên thấp.

Mạng được huấn luyện để tìm ra trọng số của bộ mã hóa và bộ giải mã nhằm giảm thiểu tổn thất giữa đầu vào ban đầu và việc tái tạo lại đầu vào sau khi nó được truyền qua bộ mã hóa và bộ giải mã. Vectơ biểu diễn nén ảnh gốc vào một không gian tiềm ẩn có chiều thấp hơn. theo sự lựa chọnkhông gian tiềm ẩn(không gian tiềm ẩn), chúng ta có thể tạo một hình ảnh mới bằng cách chuyển điểm đó tới bộ giải mã, vì bộ giải mã đã học cách chuyển đổi các điểm trong không gian tiềm ẩn thành hình ảnh có thể xem được.
Trong phần mô tả lời nói đầu, N.Coder và D.Coder mã hóa từng hình ảnh bằng cách sử dụng các vectơ biểu thị không gian tiềm ẩn hai chiều (các bức tường). Lý do sử dụng hai chiều là để hình dung không gian tiềm ẩn. Trong thực tế, không gian tiềm ẩn thường cao hơn hai chiều để dễ dàng nắm bắt được các sắc thái lớn hơn trong ảnh.
2. Phân tích mô hình
2.1 Cuộc gặp gỡ đầu tiên
Nói chung, tốt nhất là tạo lớp của mô hình trong một tệp riêng biệt, chẳng hạn như lớp Autoencoding bên dưới. Bằng cách này, các dự án khác có thể gọi lớp này một cách linh hoạt. Đoạn mã sau đây trước tiên hiển thị khung của Autoencoding. __init__() là hàm tạo. Mô hình được tạo bằng cách gọi _build(). Hàm biên dịch() được sử dụng để thiết lập trình tối ưu hóa. Hàm save() được sử dụng để lưu mô hình . Hàm Load_weights() Được sử dụng để tải trọng số vào lần sử dụng mô hình tiếp theo và hàm train() được sử dụng để huấn luyện mô hình.

Hàm xây dựng gồm 8 tham số bắt buộc và 2 tham số mặc định, input_dim là kích thước của ảnh, z_dim là kích thước của không gian tiềm ẩn, 6 tham số bắt buộc còn lại là số bộ lọc (filter) và bộ lọc của bộ mã hóa và giải mã. Kích thước hạt nhân (kernel_size), kích thước sải chân (sải bước).

Tạo bộ mã hóa tự động bằng hàm khởi tạo và đặt tên là AE. Dữ liệu đầu vào là hình ảnh đen trắng, kích thước của nó là (28, 28, 1) và không gian tiềm ẩn là mặt phẳng 2D, vì vậy z_dim = 2. Ngoài ra, các giá trị của sáu tham số đều có kích thước bằng4 danh sách thì cả mô hình mã hóa và mô hình giải mã đều chứa4 lớp.

Xác định hàm _build() trong lớp AutoEncode để xây dựng bộ mã hóa và bộ giải mã và kết nối cả hai. Khung mã như sau (ba phần tiếp theo sẽ phân tích từng cái một):

Trong hai phần tiếp theo, chúng ta sẽ phân tích từng mô hình mã hóa và mô hình giải mã trong bộ mã hóa tự động.
2.2 Mô hình mã hóa
Nhiệm vụ của bộ mã hóa là chuyển đổi hình ảnh đầu vào thành một điểm trong không gian tiềm ẩn, cách triển khai cụ thể mô hình mã hóa trong hàm _build() như sau:

Mã được giải thích dưới đây:
Dòng 2-3 xác định hình ảnh làm đầu vào cho bộ mã hóa.
Các dòng 5-17 xếp chồng các lớp chập theo thứ tự.
Dòng 19 ghi hình dạng của x. Kết quả trả về của K.int_shape là một bộ dữ liệu (None, 7, 7, 64). Phần tử thứ 0 là kích thước mẫu. Sử dụng [1:] để trả về hình dạng dữ liệu (7, 7, 64).
Dòng 20 làm phẳng lớp chập cuối cùng thành vectơ 1D.
Lớp dày đặc trên dòng 21 chuyển đổi vectơ này thành vectơ 1D khác có kích thước z_dim.
Dòng 22 xây dựng mô hình bộ mã hóa và xác định các tham số đầu vào tương ứng là bộ mã hóa_input và bộ mã hóa_output trong hàm Model().
Sử dụng hàm summary() để in ra thông tin của mô hình mã hóa, dùng để mô tả kiểu tên (layer (type)), hình dạng đầu ra (Output Shape) và số lượng tham số (Param #) của mỗi lớp.


2.3 Mô hình giải mã
Bộ giải mã là hình ảnh phản chiếu của bộ mã hóa, ngoại trừ việc thay vì sử dụng các lớp tích chập, nó được xây dựng bằng các lớp chuyển vị tích chập. Khi sải bước được đặt thành 2, lớp chập sẽ giảm một nửa chiều cao và chiều rộng của hình ảnh mỗi lần, trong khi lớp chuyển vị chập sẽ tăng gấp đôi chiều cao và chiều rộng của hình ảnh. Xem hình dưới đây để biết các hoạt động cụ thể.

Cách triển khai cụ thể của bộ giải mã trong hàm _build() như sau:

Mã được giải thích dưới đây:
Dòng 1 xác định đầu ra của bộ mã hóa là đầu vào của bộ giải mã.
Các dòng 2-3 định hình lại vectơ 1D thành một tensor có hình dạng (7, 7, 64).
Các dòng 6-15 xếp chồng các lớp chuyển vị tích chập theo thứ tự.
Dòng 7-22:
Nếu là lớp cuối cùng, hãy sử dụng hàm sigmoid để chuyển đổi và kết quả sẽ nằm trong khoảng 0-1 dưới dạng pixel.
Nếu đây không phải là lớp cuối cùng, hãy sử dụng hàm relu bị rò rỉ để chuyển đổi và thêm chuẩn hóa hàng loạt và xử lý loại bỏ ngẫu nhiên.
Các dòng 24-25 xây dựng mô hình bộ giải mã và xác định các tham số đầu vào là bộ giải mã_input và bộ giải mã_output trong hàm Model(), cái trước là đầu ra của bộ mã hóa, tức là các điểm trong không gian tiềm ẩn, còn cái sau là đầu ra được xây dựng lại hình ảnh.
Sử dụng hàm summary() để in ra thông tin mô hình giải mã.


2.4 Kết nối nối tiếp
Để huấn luyện bộ mã hóa và bộ giải mã cùng lúc, chúng ta cần kết nối cả hai với nhau,

Mã được giải thích dưới đây:
Dòng 1 sử dụng bộ mã hóa_input làm đầu vào model_input của mô hình tổng thể (bộ mã hóa_output sản phẩm trung gian là đầu ra của bộ mã hóa).
Dòng 2 sử dụng đầu ra của bộ giải mã làm đầu ra model_output của mô hình tổng thể (đầu vào của bộ giải mã là đầu ra của bộ mã hóa).
Dòng 3 xây dựng mô hình bộ mã hóa tự động và xác định các tham số đầu vào model_input và model_output tương ứng trong hàm Model().
Một bưc tranh đang gia ngan lơi noi.

2.5 Mô hình đào tạo
Sau khi xây dựng mô hình, bạn chỉ cần xác định hàm loss và biên dịch trình tối ưu hóa. Hàm mất mát thường được chọn là sai số bình phương trung bình (RMSE). Việc triển khai hàm biên dịch() như sau, sử dụng trình tối ưu hóa Adam và đặt tốc độ học thành 0,0005:


Sử dụng hàm fit() để huấn luyện mô hình, đặt kích thước lô thành 32 và đặt kỷ nguyên thành 200. Mã như sau:


Chọn ngẫu nhiên 10 trên tập kiểm tra để xem hiệu ứng:


Chỉ có 4 trong số 10 hình ảnh có kết quả tái tạo tốt.
3. Ba sai sót lớn
Sau khi huấn luyện mô hình, chúng ta có thể hình dung được hình ảnh trong không gian tiềm ẩn. Các tọa độ được tạo trong tập kiểm tra bởi bộ mã hóa trong mô hình được hiển thị dưới dạng biểu đồ phân tán 2D.


Có ba hiện tượng đáng chú ý trong bức tranh:
Một số số chiếm diện tích nhỏ, chẳng hạn như số 9 màu đỏ và một số số chiếm diện tích lớn, chẳng hạn như số 0 màu tím.
Các điểm trong biểu đồ không đối xứng với (0, 0), ví dụ: có nhiều điểm giá trị âm hơn điểm giá trị dương trên trục x và một số điểm thậm chí còn đạt tới x =-15.
Có những khoảng cách lớn giữa các màu chứa rất ít dấu chấm, giống như góc trên bên trái của hình trên.
Ba sai sót lớn ở trên khiến chúng tôi rất khó lấy mẫu từ không gian tiềm ẩn:
Đối với lỗi 1, vì số 9 chiếm diện tích lớn hơn 0 nên chúng ta lấy mẫu 9 dễ dàng hơn.
Đối với sai sót 2, về mặt kỹ thuật chúng ta có thể lấy mẫu bất kỳ điểm nào trên mặt phẳng. Nhưng sự phân bố của mỗi con số là không chắc chắn, nếu sự phân bố không đối xứng thì việc lấy mẫu ngẫu nhiên sẽ khó thực hiện.
Về khiếm khuyết 3, có thể thấy từ hình bên dưới rằng một số số phù hợp không thể được xây dựng lại từ các khoảng trống trong không gian tiềm ẩn.

Khuyết điểm 3: Dễ hiểu là việc tái tạo không thể tạo ra số khi nó trống, nhưng việc tái tạo được biểu thị bằng hai đường màu đỏ trong hình bên dưới là điều đáng lo ngại. Cả hai điểm đều không nằm trong lề, nhưng nó vẫn không giải mã được thành một con số hợp lý. Lý do cơ bản là bộ mã hóa tự động không thực thi đảm bảo rằng không gian tiềm ẩn được tạo ra là liên tục, ví dụ: ngay cả khi (2,-2) có thể tạo ra số 4 thỏa đáng, mô hình không có cơ chế để đảm bảo rằng điểm (2.1, – 2.1 ) cũng cho ra số 4 thỏa đáng.

Tóm tắt
Bộ mã hóa tự động chỉ yêu cầu các tính năng và không yêu cầu nhãn. Đây là mô hình học tập không giám sát dùng để tái tạo lại dữ liệu. Mô hình này là một mô hình tổng quát, nhưng do ba sai sót lớn được đề cập ở phần trước, mô hình tổng quát này không tốt cho các số đen trắng có chiều thấp và hiệu ứng đối với các mặt màu có chiều cao sẽ còn tệ hơn.
Khung bộ mã hóa tự động này tốt, vậy chúng ta nên giải quyết ba lỗ hổng này như thế nào để tạo ra một bộ mã hóa tự động mạnh mẽ. Đây là nội dung của bài viết tiếp theo,bộ mã hóa tự động biến thiên (Variational AutoEncoder, VAE)。

Bạn có thể tìm kiếm SignalPlus trong Plugin Store của ChatGPT 4.0 để lấy thông tin mã hóa theo thời gian thực. Nếu bạn muốn nhận thông tin cập nhật của chúng tôi ngay lập tức, vui lòng theo dõi tài khoản Twitter @SignalPlus_Web 3 của chúng tôi hoặc tham gia nhóm WeChat của chúng tôi (thêm trợ lý WeChat: SignalPlus 123), nhóm Telegram và cộng đồng Discord để liên lạc và tương tác với nhiều bạn bè hơn.
SignalPlus Official Website:https://www.signalplus.com


