9.6. Kiến trúc Mã hoá - Giải mã

Kiến trúc mã hoá - giải mã (encoder-decoder architecture) là một khuôn mẫu thiết kế mạng nơ-ron. Kiến trúc này có 2 phần: bộ mã hoá và bộ giải mã, có thể thấy trong Fig. 9.6.1 Bộ mã hoá đóng vai trò mã hoá đầu vào thành trạng thái chứa vài tensor. Tiếp đó, trạng thái được truyền vào bộ giải mã để sinh đầu ra. Trong dịch máy, bộ mã hoá biến đổi một câu nguồn, ví dụ như “Hello world.”, thành trạng thái, chẳng hạn là một vector chứa thông tin ngữ nghĩa của câu đó. Sau đó bộ giải mã sử dụng trạng thái này để dịch câu sang ngôn ngữ đích, ví dụ sang tiếng Pháp “Bonjour le monde.”.

../_images/encoder-decoder.svg

Fig. 9.6.1 Kiến trúc mã hoá - giải mã

Phần này trình bày một giao diện (interface) để lập trình kiến trúc mã hoá - giải mã.

9.6.1. Bộ mã hoá

Bộ mã hoá là một mạng nơ-ron thông thường, nhận đầu vào, ví dụ như một câu nguồn, và trả về đầu ra.

from mxnet.gluon import nn

# Saved in the d2l package for later use
class Encoder(nn.Block):
    """The base encoder interface for the encoder-decoder architecture."""
    def __init__(self, **kwargs):
        super(Encoder, self).__init__(**kwargs)

    def forward(self, X, *args):
        raise NotImplementedError

9.6.2. Bộ giải mã

Bộ giải mã có thêm phương thức init_state nhằm phân tích đầu ra của bộ mã hoá với những thông tin bổ sung (nếu có), như độ dài hợp lệ của đầu vào, để đưa ra trạng thái cần thiết. Trong lan truyền xuôi, bộ giải mã nhận hai đầu vào, ví dụ như một câu đích và trạng thái. Nó trả về đầu ra với trạng thái nhiều khả năng đã thay đổi nếu bộ mã hoá chứa các tầng RNN.

# Saved in the d2l package for later use
class Decoder(nn.Block):
    """The base decoder interface for the encoder-decoder architecture."""
    def __init__(self, **kwargs):
        super(Decoder, self).__init__(**kwargs)

    def init_state(self, enc_outputs, *args):
        raise NotImplementedError

    def forward(self, X, state):
        raise NotImplementedError

9.6.3. Mô hình

Mô hình mã hoá - giải mã bao gồm một bộ mã hoá và một bộ giải mã. Chúng ta lập trình phương thức truyền xuôi cho quá trình huấn luyện. Phương thức này nhận cả đầu vào bộ mã hoá và đầu vào bộ giải mã cùng các đối số bổ sung không bắt buộc. Mô hình tính đầu ra của bộ mã hoá để khởi tạo trạng thái bộ giải mã, sau đó trả về đầu ra của bộ giải mã.

# Saved in the d2l package for later use
class EncoderDecoder(nn.Block):
    """The base class for the encoder-decoder architecture."""
    def __init__(self, encoder, decoder, **kwargs):
        super(EncoderDecoder, self).__init__(**kwargs)
        self.encoder = encoder
        self.decoder = decoder

    def forward(self, enc_X, dec_X, *args):
        enc_outputs = self.encoder(enc_X, *args)
        dec_state = self.decoder.init_state(enc_outputs, *args)
        return self.decoder(dec_X, dec_state)

9.6.4. Tóm tắt

  • Kiến trúc mã hoá - giải mã là một khuôn mẫu thiết kế mạng nơ-ron chủ yếu được sử dụng trong xử lý ngôn ngữ tự nhiên.
  • Bộ mã hoá là một mạng (kết nối đầy đủ - FC, nơ-ron tích chập - CNN, nơ-ron hồi tiếp - RNN, …) nhận đầu vào và trả về một ánh xạ đặc trưng là một vector hay một tensor.
  • Bộ giải mã là một mạng (thường giống kiến trúc mạng của bộ mã hoá) nhận vector đặc trưng từ bộ mã hoá và đưa ra kết quả gần khớp nhất với đầu vào thực tế hoặc đầu ra mong muốn.

9.6.5. Bài tập

  1. Ngoài dịch máy, bạn còn biết thêm những ứng dụng nào khác của kiến trúc mã hoá - giải mã không?
  2. Bạn có thể thiết kế một kiến trúc mã hoá - giải mã sâu không?

9.6.6. Thảo luận

9.6.7. Những người thực hiện

Bản dịch trong trang này được thực hiện bởi:

  • Đoàn Võ Duy Thanh
  • Nguyễn Thanh Hòa
  • Lê Khắc Hồng Phúc
  • Nguyễn Văn Cường
  • Phạm Hồng Vinh