Mã thông báo biến đổi và nhúng vị trí với Keras PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Mã thông báo biến áp và Nhúng vị trí với Keras

Giới thiệu

Có rất nhiều hướng dẫn giải thích cách hoạt động của máy biến áp và cách xây dựng trực giác về yếu tố chính của chúng – nhúng mã thông báo và vị trí.

Việc nhúng các mã thông báo theo vị trí cho phép các máy biến áp thể hiện mối quan hệ không cứng nhắc giữa các mã thông báo (thường là các từ), điều này tốt hơn nhiều trong việc mô hình hóa lời nói theo ngữ cảnh của chúng ta trong mô hình hóa ngôn ngữ. Mặc dù quy trình này tương đối đơn giản nhưng lại khá chung chung và việc triển khai nhanh chóng trở thành bản mẫu.

Trong hướng dẫn ngắn này, chúng ta sẽ xem cách chúng ta có thể sử dụng KerasNLP, tiện ích bổ sung chính thức của Keras, để thực hiện PositionEmbeddingTokenAndPositionEmbedding.

Máy ảnhNLP

KerasNLP là một sự bổ sung theo chiều ngang cho NLP. Khi viết, nó vẫn còn rất non trẻ, ở phiên bản 0.3 và tài liệu vẫn còn khá ngắn gọn, nhưng gói này không chỉ có thể sử dụng được.

Nó cung cấp quyền truy cập vào các lớp Keras, chẳng hạn như TokenAndPositionEmbedding, TransformerEncoderTransformerDecoder, giúp việc xây dựng máy biến áp tùy chỉnh dễ dàng hơn bao giờ hết.

Để sử dụng KerasNLP trong dự án của chúng tôi, bạn có thể cài đặt nó qua pip:

$ pip install keras_nlp

Sau khi được nhập vào dự án, bạn có thể sử dụng bất kỳ keras_nlp lớp như một lớp Keras tiêu chuẩn.

Mã thông báo

Máy tính làm việc với những con số. Chúng ta nói lên suy nghĩ của mình bằng lời nói. Để cho phép máy tính xử lý chúng, chúng ta sẽ phải ánh xạ các từ thành các con số ở một dạng nào đó.

Một cách phổ biến để làm điều này là chỉ cần ánh xạ các từ thành các số trong đó mỗi số nguyên đại diện cho một từ. Một kho ngữ liệu tạo ra một từ vựng và mỗi từ trong từ vựng sẽ có một chỉ mục. Do đó, bạn có thể biến một chuỗi các từ thành một chuỗi các chỉ số được gọi là thẻ:

def tokenize(sequence):
    
    return tokenized_sequence

sequence = ['I', 'am', 'Wall-E']
sequence = tokenize(sequence)
print(sequence) 

Chuỗi mã thông báo này sau đó có thể được nhúng vào một vectơ dày đặc xác định các mã thông báo trong không gian tiềm ẩn:

[[4], [26], [472]] -> [[0.5, 0.25], [0.73, 0.2], [0.1, -0.75]]

Điều này thường được thực hiện với Embedding lớp trong Keras. Máy biến áp không chỉ mã hóa bằng cách sử dụng một tiêu chuẩn Embedding lớp. Họ biểu diễn EmbeddingPositionEmbeddingvà thêm chúng lại với nhau, thay thế các nhúng thông thường theo vị trí của chúng trong không gian tiềm ẩn.

Với KerasNLP – hoạt động TokenAndPositionEmbedding kết hợp nhúng mã thông báo thông thường (Embedding) với tính năng nhúng vị trí (PositionEmbedding).

Chức vụ Đám cưới

Hãy xem PositionEmbedding Đầu tiên. Nó chấp nhận các tensors và tensors rách nát, và giả định rằng kích thước cuối cùng đại diện cho các tính năng, trong khi kích thước thứ hai đến cuối cùng đại diện cho chuỗi.

# Seq
(5, 10)
     # Features

Lớp chấp nhận một sequence_length đối số, biểu thị độ dài của chuỗi đầu vào và đầu ra. Hãy tiếp tục và nhúng một tensor thống nhất ngẫu nhiên vào vị trí:

seq_length = 5
input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.PositionEmbedding(sequence_length=seq_length)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data)

Kết quả này trong:

<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[ 0.23758471, -0.16798696, -0.15070847,  0.208067  , -0.5123104 ,
        -0.36670157,  0.27487397,  0.14939266,  0.23843127, -0.23328197],
       [-0.51353353, -0.4293166 , -0.30189738, -0.140344  , -0.15444171,
        -0.27691704,  0.14078277, -0.22552207, -0.5952263 , -0.5982155 ],
       [-0.265581  , -0.12168896,  0.46075982,  0.61768025, -0.36352775,
        -0.14212841, -0.26831496, -0.34448475,  0.4418767 ,  0.05758983],
       [-0.46500492, -0.19256318, -0.23447984,  0.17891657, -0.01812166,
        -0.58293337, -0.36404118,  0.54269964,  0.3727749 ,  0.33238482],
       [-0.2965023 , -0.3390794 ,  0.4949159 ,  0.32005525,  0.02882379,
        -0.15913549,  0.27996767,  0.4387421 , -0.09119213,  0.1294356 ]],
      dtype=float32)>

TokenAndPositionNhúng

Mã thông báo và vị trí nhúng bắt đầu sử dụng Embedding trên chuỗi đầu vào, PositionEmbedding trên các mã thông báo được nhúng, và sau đó cộng hai kết quả này lại với nhau, thay thế một cách hiệu quả việc nhúng mã thông báo trong không gian để mã hóa các mối quan hệ có ý nghĩa tương đối của chúng.

Về mặt kỹ thuật, điều này có thể được thực hiện như:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
embedding = keras.layers.Embedding(vocab_size, embed_dim)(input_tensor)
position = keras_nlp.layers.PositionEmbedding(seq_length)(embedding)
output = keras.layers.add([embedding, position])
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

Các đầu vào được nhúng, sau đó được nhúng theo vị trí, sau đó chúng được thêm vào với nhau, tạo ra một hình dạng được nhúng theo vị trí mới. Ngoài ra, bạn có thể tận dụng TokenAndPositionEmbedding lớp, thực hiện điều này dưới mui xe:

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

... 
def call(self, inputs):
        embedded_tokens = self.token_embedding(inputs)
        embedded_positions = self.position_embedding(embedded_tokens)
        outputs = embedded_tokens + embedded_positions
        return outputs

Điều này làm cho việc thực hiện trở nên sạch sẽ hơn nhiều TokenAndPositionEmbedding:

seq_length = 10
vocab_size = 25
embed_dim = 10

input_data = tf.random.uniform(shape=[5, 10])

input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.TokenAndPositionEmbedding(vocabulary_size=vocab_size, 
                                                     sequence_length=seq_length, 
                                                     embedding_dim=embed_dim)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
    
model(input_data).shape 

Dữ liệu chúng tôi đã chuyển vào lớp hiện được nhúng vào vị trí trong không gian tiềm ẩn gồm 10 chiều:

model(input_data)
<tf.Tensor: shape=(5, 10, 10), dtype=float32, numpy=
array([[[-0.01695484,  0.7656435 , -0.84340465,  0.50211895,
         -0.3162892 ,  0.16375223, -0.3774369 , -0.10028353,
         -0.00136751, -0.14690581],
        [-0.05646318,  0.00225556, -0.7745967 ,  0.5233861 ,
         -0.22601983,  0.07024342,  0.0905793 , -0.46133494,
         -0.30130145,  0.451248  ],
         ...

Tiến xa hơn - Dự án từ đầu đến cuối được cầm tay chỉ việc

Bản tính ham học hỏi của bạn khiến bạn muốn tiến xa hơn? Chúng tôi khuyên bạn nên kiểm tra Dự án có hướng dẫn: “Chú thích hình ảnh với CNN và Transformers với Keras”.

Trong dự án được hướng dẫn này – bạn sẽ tìm hiểu cách xây dựng mô hình chú thích hình ảnh, mô hình này chấp nhận hình ảnh làm đầu vào và tạo chú thích văn bản làm đầu ra.

Bạn sẽ học cách:

  • Tiền xử lý văn bản
  • Vectơ hóa đầu vào văn bản dễ dàng
  • Làm việc với tf.data API và xây dựng Tập dữ liệu hiệu quả
  • Xây dựng Transformers từ đầu với TensorFlow/Keras và KerasNLP – sự bổ sung theo chiều ngang chính thức cho Keras để xây dựng các mô hình NLP hiện đại
  • Xây dựng kiến ​​trúc kết hợp trong đó đầu ra của một mạng được mã hóa cho mạng khác

Làm thế nào để chúng tôi đóng khung chú thích cho hình ảnh? Hầu hết đều coi đây là một ví dụ về học sâu tổng quát, bởi vì chúng tôi đang dạy mạng cách tạo mô tả. Tuy nhiên, tôi muốn xem nó như một ví dụ về dịch máy thần kinh - chúng tôi đang dịch các đặc điểm trực quan của hình ảnh thành từ ngữ. Thông qua dịch thuật, chúng tôi đang tạo ra một cách thể hiện mới cho hình ảnh đó, thay vì chỉ tạo ra ý nghĩa mới. Xem nó dưới dạng bản dịch và chỉ bằng cách tạo tiện ích mở rộng, sẽ xác định phạm vi nhiệm vụ theo một cách khác và làm cho nó trực quan hơn một chút.

Đóng khung vấn đề như một bản dịch giúp dễ dàng tìm ra kiến ​​trúc nào chúng ta muốn sử dụng. Transformers chỉ có bộ mã hóa rất giỏi trong việc hiểu văn bản (phân tích tình cảm, phân loại, v.v.) vì Bộ mã hóa mã hóa các cách trình bày có ý nghĩa. Các mô hình chỉ dành cho bộ giải mã rất phù hợp để tạo (chẳng hạn như GPT-3), vì bộ giải mã có thể suy ra các biểu diễn có ý nghĩa thành một chuỗi khác có cùng ý nghĩa. Bản dịch thường được thực hiện bởi kiến ​​trúc bộ mã hóa-giải mã, trong đó bộ mã hóa mã hóa cách trình bày có ý nghĩa của một câu (hoặc hình ảnh, trong trường hợp của chúng tôi) và bộ giải mã học cách biến chuỗi này thành một cách trình bày có ý nghĩa khác mà chúng ta dễ hiểu hơn (chẳng hạn như một câu).

Kết luận

Người vận chuyển đã tạo ra một làn sóng lớn kể từ năm 2017 và nhiều hướng dẫn tuyệt vời cung cấp thông tin chi tiết về cách chúng hoạt động, tuy nhiên, chúng vẫn khó nắm bắt đối với nhiều người do chi phí triển khai tùy chỉnh. KerasNLP giải quyết vấn đề này, cung cấp các khối xây dựng cho phép bạn xây dựng các hệ thống NLP linh hoạt, mạnh mẽ, thay vì cung cấp các giải pháp đóng gói sẵn.

Trong hướng dẫn này, chúng tôi đã xem xét cách nhúng mã thông báo và vị trí với Keras và KerasNLP.

Dấu thời gian:

Thêm từ xếp chồng lên nhau