টেক্সট টাস্কের জন্য সাধারণ সেভডমডেল এপিআই

এই পৃষ্ঠাটি বর্ণনা করে যে কীভাবে পাঠ্য-সম্পর্কিত কাজের জন্য TF2 সংরক্ষিত মডেলগুলি পুনরায় ব্যবহারযোগ্য SavedModel API প্রয়োগ করা উচিত। (এটি এখন অবচ্যুত TF1 হাব ফর্ম্যাটের জন্য পাঠ্যের জন্য সাধারণ স্বাক্ষরগুলিকে প্রতিস্থাপন করে এবং প্রসারিত করে।)

ওভারভিউ

টেক্সট এম্বেডিং গণনা করার জন্য বেশ কয়েকটি API আছে (টেক্সটের ঘন উপস্থাপনা, বা পাঠ্য বৈশিষ্ট্য ভেক্টর হিসাবেও পরিচিত)।

  • টেক্সট ইনপুট থেকে টেক্সট এম্বেডিংয়ের জন্য API একটি SavedModel দ্বারা প্রয়োগ করা হয় যা এমবেডিং ভেক্টরের একটি ব্যাচে স্ট্রিংয়ের একটি ব্যাচ ম্যাপ করে। এটি ব্যবহার করা খুবই সহজ, এবং TF হাবের অনেক মডেল এটি প্রয়োগ করেছে। যাইহোক, এটি TPU-তে মডেলটিকে ফাইন-টিউনিং করার অনুমতি দেয় না।

  • প্রিপ্রসেসড ইনপুট সহ টেক্সট এম্বেডিংয়ের জন্য API একই কাজ সমাধান করে, কিন্তু দুটি পৃথক সংরক্ষিত মডেল দ্বারা প্রয়োগ করা হয়:

    • একটি প্রিপ্রসেসর যা একটি tf.data ইনপুট পাইপলাইনের ভিতরে চলতে পারে এবং স্ট্রিং এবং অন্যান্য পরিবর্তনশীল-দৈর্ঘ্যের ডেটাকে সংখ্যাসূচক টেনসরে রূপান্তরিত করে,
    • একটি এনকোডার যা প্রিপ্রসেসরের ফলাফল গ্রহণ করে এবং এমবেডিং গণনার প্রশিক্ষণযোগ্য অংশ সম্পাদন করে।

    এই বিভাজনটি প্রশিক্ষণ লুপে খাওয়ানোর আগে ইনপুটগুলিকে অ্যাসিঙ্ক্রোনাসভাবে প্রিপ্রসেস করার অনুমতি দেয়। বিশেষ করে, এটি টিপিইউ -তে চালানো এবং সূক্ষ্ম-টিউন করা যায় এমন এনকোডার তৈরি করার অনুমতি দেয়।

  • ট্রান্সফরমার এনকোডারের সাথে টেক্সট এম্বেডিংয়ের API প্রি-প্রসেসড ইনপুট থেকে BERT এবং অন্যান্য ট্রান্সফরমার এনকোডারের নির্দিষ্ট ক্ষেত্রে টেক্সট এম্বেডিংয়ের API প্রসারিত করে।

    • ইনপুট টেক্সটের একাধিক সেগমেন্ট থেকে এনকোডার ইনপুট তৈরি করতে প্রিপ্রসেসরকে প্রসারিত করা হয়।
    • ট্রান্সফরমার এনকোডার পৃথক টোকেনের প্রসঙ্গ-সচেতন এম্বেডিংগুলিকে প্রকাশ করে।

প্রতিটি ক্ষেত্রে, টেক্সট ইনপুট UTF-8 এনকোডেড স্ট্রিং, সাধারণত প্লেইন টেক্সটের, যদি না মডেল ডকুমেন্টেশন অন্যথায় প্রদান করে।

API নির্বিশেষে, বিভিন্ন মডেলকে বিভিন্ন ভাষা এবং ডোমেন থেকে পাঠ্যের উপর এবং বিভিন্ন কাজকে মাথায় রেখে প্রি-প্রশিক্ষিত করা হয়েছে। অতএব, প্রতিটি টেক্সট এমবেডিং মডেল প্রতিটি সমস্যার জন্য উপযুক্ত নয়।

টেক্সট ইনপুট থেকে টেক্সট এমবেডিং

টেক্সট ইনপুটগুলি থেকে টেক্সট এমবেডিংয়ের জন্য একটি সংরক্ষিত মডেল আকৃতির একটি স্ট্রিং টেনসরে ইনপুটগুলির একটি ব্যাচ গ্রহণ করে [batch_size] এবং ইনপুটগুলির ঘন উপস্থাপনা (ফিচার ভেক্টর) সহ আকৃতির একটি ফ্লোট32 টেনসর [batch_size, dim] এ ম্যাপ করে।

ব্যবহারের সংক্ষিপ্তসার

obj = hub.load("path/to/model")
text_input = ["A long sentence.",
              "single-word",
              "http://example.com"]
embeddings = obj(text_input)

পুনরায় ব্যবহারযোগ্য SavedModel API থেকে স্মরণ করুন যে ট্রেনিং মোডে মডেলটি চালানোর জন্য (যেমন, ড্রপআউটের জন্য) একটি কীওয়ার্ড আর্গুমেন্ট obj(..., training=True) প্রয়োজন হতে পারে এবং সেই obj .variables , .trainable_variables এবং .regularization_losses প্রযোজ্য হিসাবে প্রদান করে .

কেরাসে, এই সব দ্বারা যত্ন নেওয়া হয়

embeddings = hub.KerasLayer("path/to/model", trainable=...)(text_input)

প্রশিক্ষণ বিতরণ করা হয়

যদি পাঠ্য এমবেডিং একটি মডেলের অংশ হিসাবে ব্যবহৃত হয় যা একটি বিতরণ কৌশলের সাথে প্রশিক্ষিত হয়, hub.load("path/to/model") বা hub.KerasLayer("path/to/model", ...) এ কল করুন। hub.KerasLayer("path/to/model", ...) , resp., বিতরণ করা পদ্ধতিতে মডেলের ভেরিয়েবল তৈরি করার জন্য DistributionStrategy স্কোপের মধ্যে ঘটতে হবে। উদাহরণ স্বরূপ

  with strategy.scope():
    ...
    model = hub.load("path/to/model")
    ...

উদাহরণ

প্রিপ্রসেসড ইনপুট সহ টেক্সট এম্বেডিং

প্রিপ্রসেসড ইনপুট সহ একটি পাঠ্য এমবেডিং দুটি পৃথক সংরক্ষিত মডেল দ্বারা প্রয়োগ করা হয়:

  • একটি প্রিপ্রসেসর যা একটি স্ট্রিং টেনসর আকৃতির [batch_size] সংখ্যাসূচক টেনসরের ডিক্টে ম্যাপ করে,
  • একটি এনকোডার যা প্রিপ্রসেসর দ্বারা প্রত্যাবর্তিত টেনসরের একটি নির্দেশ গ্রহণ করে, এমবেডিং গণনার প্রশিক্ষণযোগ্য অংশ সম্পাদন করে এবং আউটপুটগুলির একটি নির্দেশ প্রদান করে। কী "default" এর অধীনে আউটপুট হল আকৃতির একটি float32 Tensor [batch_size, dim]

এটি একটি ইনপুট পাইপলাইনে প্রিপ্রসেসর চালানোর অনুমতি দেয় তবে একটি বড় মডেলের অংশ হিসাবে এনকোডার দ্বারা গণনা করা এমবেডিংগুলিকে সূক্ষ্ম-টিউন করে। বিশেষ করে, এটি এনকোডার তৈরি করতে দেয় যা টিপিইউ -তে চালানো এবং সূক্ষ্ম-টিউন করা যায়।

এটি একটি বাস্তবায়নের বিবরণ যা টেনসরগুলি প্রিপ্রসেসরের আউটপুটে রয়েছে এবং কোনটি (যদি থাকে) অতিরিক্ত টেনসরগুলি "default" ছাড়াও এনকোডারের আউটপুটে থাকে।

এনকোডারের ডকুমেন্টেশন অবশ্যই উল্লেখ করবে যে এটির সাথে কোন প্রিপ্রসেসর ব্যবহার করতে হবে। সাধারণত, ঠিক একটি সঠিক পছন্দ আছে।

ব্যবহারের সংক্ষিপ্তসার

text_input = tf.constant(["A long sentence.",
                          "single-word",
                          "http://example.com"])
preprocessor = hub.load("path/to/preprocessor")  # Must match `encoder`.
encoder_inputs = preprocessor(text_input)

encoder = hub.load("path/to/encoder")
encoder_outputs = encoder(encoder_inputs)
embeddings = encoder_outputs["default"]

পুনরায় ব্যবহারযোগ্য SavedModel API থেকে স্মরণ করুন যে প্রশিক্ষণ মোডে এনকোডার চালানোর জন্য (যেমন, ড্রপআউটের জন্য) একটি কীওয়ার্ড আর্গুমেন্ট encoder(..., training=True) , এবং সেই encoder .variables , .trainable_variables এবং .regularization_losses প্রযোজ্য হিসাবে প্রদান করে .

preprocessor মডেলে .variables থাকতে পারে তবে এটি আরও প্রশিক্ষণের জন্য নয়। প্রিপ্রসেসিং মোড-নির্ভর নয়: যদি preprocessor() একটি training=... আর্গুমেন্ট আদৌ থাকে, তবে এর কোন প্রভাব নেই।

কেরাসে, এই সব দ্বারা যত্ন নেওয়া হয়

encoder_inputs = hub.KerasLayer("path/to/preprocessor")(text_input)
encoder_outputs = hub.KerasLayer("path/to/encoder", trainable=True)(encoder_inputs)
embeddings = encoder_outputs["default"]

প্রশিক্ষণ বিতরণ করা হয়

যদি এনকোডারটি এমন একটি মডেলের অংশ হিসাবে ব্যবহার করা হয় যা একটি বিতরণ কৌশলের সাথে প্রশিক্ষিত হয়, hub.load("path/to/encoder") বা hub.KerasLayer("path/to/encoder", ...) এ কল করুন। , resp., ভিতরে ঘটতে হবে

  with strategy.scope():
    ...

বিতরণ করা উপায়ে এনকোডার ভেরিয়েবল পুনরায় তৈরি করার জন্য।

একইভাবে, যদি প্রিপ্রসেসর প্রশিক্ষিত মডেলের অংশ হয় (উপরের সাধারণ উদাহরণের মতো), এটি বিতরণ কৌশলের সুযোগের অধীনে লোড করা প্রয়োজন। যাইহোক, যদি প্রিপ্রসেসর একটি ইনপুট পাইপলাইনে ব্যবহার করা হয় (যেমন, tf.data.Dataset.map() তে পাঠানো কলেবলে), তার ভেরিয়েবল স্থাপন করার জন্য এটির লোডিং অবশ্যই বিতরণ কৌশলের সুযোগের বাইরে ঘটতে হবে (যদি থাকে) ) হোস্ট সিপিইউতে।

উদাহরণ

ট্রান্সফরমার এনকোডার সহ পাঠ্য এম্বেডিং

টেক্সটের জন্য ট্রান্সফরমার এনকোডারগুলি ইনপুট সিকোয়েন্সের একটি ব্যাচে কাজ করে, প্রতিটি সিকোয়েন্সে n ≥ 1 টোকেনাইজড টেক্সট সেগমেন্ট থাকে, কিছু মডেল-নির্দিষ্ট এন- এ আবদ্ধ থাকে। BERT এবং এর অনেক এক্সটেনশনের জন্য, সেই সীমা 2, তাই তারা একক সেগমেন্ট এবং সেগমেন্ট জোড়া গ্রহণ করে।

ট্রান্সফরমার এনকোডারের সাথে টেক্সট এম্বেডিংয়ের API এই সেটিংয়ে প্রি-প্রসেসড ইনপুট সহ টেক্সট এমবেডিংয়ের জন্য API প্রসারিত করে।

প্রিপ্রসেসর

ট্রান্সফরমার এনকোডারগুলির সাথে টেক্সট এম্বেডিংয়ের জন্য একটি প্রিপ্রসেসর সেভডমডেল প্রিপ্রসেসড ইনপুটগুলির সাথে টেক্সট এম্বেডিংয়ের জন্য একটি প্রিপ্রসেসর সেভডমডেলের API প্রয়োগ করে (উপরে দেখুন), যা সরাসরি এনকোডার ইনপুটগুলিতে একক-সেগমেন্ট টেক্সট ইনপুট ম্যাপ করার একটি উপায় প্রদান করে।

এছাড়াও, প্রিপ্রসেসর সেভডমডেল টোকেনাইজেশনের জন্য কলযোগ্য সাবজেক্ট tokenize (বিচ্ছিন্নভাবে প্রতি সেগমেন্ট) এবং এন টোকেনাইজড সেগমেন্টগুলিকে এনকোডারের জন্য একটি ইনপুট সিকোয়েন্সে প্যাক করার জন্য bert_pack_inputs প্রদান করে। প্রতিটি সাবজেক্ট পুনরায় ব্যবহারযোগ্য সংরক্ষিত মডেল API অনুসরণ করে।

ব্যবহারের সংক্ষিপ্তসার

পাঠ্যের দুটি অংশের জন্য একটি সুনির্দিষ্ট উদাহরণ হিসাবে, আসুন আমরা একটি বাক্য এনটেইলমেন্ট টাস্ক দেখি যা জিজ্ঞাসা করে যে একটি ভিত্তি (প্রথম বিভাগ) একটি হাইপোথিসিস (দ্বিতীয় সেগমেন্ট) বোঝায় বা না করে।

preprocessor = hub.load("path/to/preprocessor")

# Tokenize batches of both text inputs.
text_premises = tf.constant(["The quick brown fox jumped over the lazy dog.",
                             "Good day."])
tokenized_premises = preprocessor.tokenize(text_premises)
text_hypotheses = tf.constant(["The dog was lazy.",  # Implied.
                               "Axe handle!"])       # Not implied.
tokenized_hypotheses = preprocessor.tokenize(text_hypotheses)

# Pack input sequences for the Transformer encoder.
seq_length = 128
encoder_inputs = preprocessor.bert_pack_inputs(
    [tokenized_premises, tokenized_hypotheses],
    seq_length=seq_length)  # Optional argument.

কেরাসে, এই গণনাটি হিসাবে প্রকাশ করা যেতে পারে

tokenize = hub.KerasLayer(preprocessor.tokenize)
tokenized_hypotheses = tokenize(text_hypotheses)
tokenized_premises = tokenize(text_premises)

bert_pack_inputs = hub.KerasLayer(
    preprocessor.bert_pack_inputs,
    arguments=dict(seq_length=seq_length))  # Optional argument.
encoder_inputs = bert_pack_inputs([tokenized_premises, tokenized_hypotheses])

tokenize বিশদ বিবরণ

preprocessor.tokenize() এ একটি কল আকৃতির একটি স্ট্রিং টেনসর গ্রহণ করে [batch_size] এবং আকৃতির একটি RaggedTensor প্রদান করে [batch_size, ...] যার মানগুলি ইনপুট স্ট্রিংগুলিকে প্রতিনিধিত্ব করে int32 টোকেন আইডি। batch_size পরে r ≥ 1 র্যাগড ডাইমেনশন থাকতে পারে কিন্তু অন্য কোন ইউনিফর্ম ডাইমেনশন নেই।

  • r =1 হলে, আকৃতিটি হয় [batch_size, (tokens)] , এবং প্রতিটি ইনপুটকে টোকেনের সমতল ক্রমানুসারে টোকেনাইজ করা হয়।
  • যদি r >1 হয়, সেখানে r -1 গ্রুপিং এর অতিরিক্ত স্তর রয়েছে। উদাহরণস্বরূপ, tensorflow_text.BertTokenizer r =2 ব্যবহার করে টোকেনগুলিকে শব্দ দ্বারা গোষ্ঠীভুক্ত করতে এবং আকৃতি [batch_size, (words), (tokens_per_word)] তৈরি করে। এই অতিরিক্ত স্তরের মধ্যে কতটি (গুলি) বিদ্যমান, যদি থাকে, এবং তারা কোন গোষ্ঠীর প্রতিনিধিত্ব করে তা হাতের মডেলের উপর নির্ভর করে৷

ব্যবহারকারী টোকেনাইজড ইনপুটগুলি পরিবর্তন করতে পারে (কিন্তু প্রয়োজন নেই), যেমন, এনকোডার ইনপুট প্যাকিংয়ে প্রয়োগ করা seq_length সীমা মিটমাট করতে। টোকেনাইজার আউটপুটে অতিরিক্ত মাত্রা এখানে সাহায্য করতে পারে (যেমন, শব্দের সীমানাকে সম্মান করা) কিন্তু পরবর্তী ধাপে অর্থহীন হয়ে যায়।

পুনঃব্যবহারযোগ্য SavedModel API- এর পরিপ্রেক্ষিতে, preprocessor.tokenize অবজেক্টে .variables থাকতে পারে কিন্তু এটি আরও প্রশিক্ষণের জন্য নয়। টোকেনাইজেশন মোড-নির্ভর নয়: যদি preprocessor.tokenize() একটি training=... আর্গুমেন্ট আদৌ থাকে তবে এটির কোন প্রভাব নেই।

bert_pack_inputs এর বিশদ বিবরণ

preprocessor.bert_pack_inputs() এ একটি কল টোকেনাইজড ইনপুটগুলির একটি পাইথন তালিকা গ্রহণ করে (প্রতিটি ইনপুট অংশের জন্য আলাদাভাবে ব্যাচ করা) এবং ট্রান্সফরমার এনকোডার মডেলের জন্য নির্দিষ্ট দৈর্ঘ্যের ইনপুট ক্রমগুলির একটি ব্যাচের প্রতিনিধিত্বকারী টেনসরগুলির একটি ডিক্ট প্রদান করে৷

প্রতিটি টোকেনাইজড ইনপুট হল আকৃতির একটি int32 RaggedTensor [batch_size, ...] , যেখানে batch_size-এর পরে র্যাগড ডাইমেনশনের r সংখ্যা হয় 1 বা preprocessor.tokenize(). (পরবর্তীটি শুধুমাত্র সুবিধার জন্য; প্যাকিংয়ের আগে অতিরিক্ত মাত্রাগুলি সমতল করা হয়।)

প্যাকিং এনকোডার দ্বারা প্রত্যাশিত ইনপুট অংশগুলির চারপাশে বিশেষ টোকেন যোগ করে। bert_pack_inputs() কলটি আসল BERT মডেল এবং তাদের অনেক এক্সটেনশন দ্বারা ব্যবহৃত প্যাকিং স্কিমটি ঠিকভাবে প্রয়োগ করে: প্যাকড সিকোয়েন্সটি একটি স্টার্ট-অফ-সিকোয়েন্স টোকেন দিয়ে শুরু হয়, তারপরে টোকেনাইজড সেগমেন্ট, প্রতিটি শেষ-অফ-সেগমেন্ট দ্বারা সমাপ্ত হয়। টোকেন. seq_length পর্যন্ত অবশিষ্ট অবস্থান, যদি থাকে, প্যাডিং টোকেন দিয়ে পূর্ণ করা হয়।

যদি একটি প্যাক করা ক্রম seq_length অতিক্রম করে, bert_pack_inputs() তার অংশগুলিকে প্রায় সমান আকারের উপসর্গে ছোট করে যাতে প্যাক করা ক্রমটি seq_length-এর মধ্যে ঠিক ফিট করে।

প্যাকিং মোড-নির্ভর নয়: যদি preprocessor.bert_pack_inputs() একটি training=... যুক্তি থাকে, তবে এটির কোন প্রভাব নেই। এছাড়াও, preprocessor.bert_pack_inputs ভেরিয়েবল থাকবে বা ফাইন-টিউনিং সমর্থন করবে বলে আশা করা যায় না।

এনকোডার

এনকোডারটিকে encoder_inputs এর ডিক্টে বলা হয় যেভাবে এপিআই-তে প্রি-প্রসেসড ইনপুট সহ টেক্সট এম্বেডিংয়ের জন্য (উপরে দেখুন), পুনঃব্যবহারযোগ্য সেভডমডেল API- এর বিধানগুলি সহ।

ব্যবহারের সংক্ষিপ্তসার

encoder = hub.load("path/to/encoder")
encoder_outputs = encoder(encoder_inputs)

বা সমানভাবে কেরাসে:

encoder = hub.KerasLayer("path/to/encoder", trainable=True)
encoder_outputs = encoder(encoder_inputs)

বিস্তারিত

encoder_outputs হল নিম্নোক্ত কী সহ টেনসরের একটি নির্দেশ।

  • "sequence_output" : আকৃতির একটি float32 Tensor [batch_size, seq_length, dim] প্রতিটি প্যাক করা ইনপুট সিকোয়েন্সের প্রতিটি টোকেনের প্রসঙ্গ-সচেতন এম্বেডিং সহ।
  • "pooled_output" : একটি ফ্লোট 32 আকৃতির টেনসর [batch_size, dim] যা সামগ্রিকভাবে প্রতিটি ইনপুট সিকোয়েন্সের এমবেডিং সহ, কিছু প্রশিক্ষণযোগ্য পদ্ধতিতে সিকোয়েন্স_আউটপুট থেকে উদ্ভূত।
  • "default" , প্রি-প্রসেসড ইনপুট সহ টেক্সট এম্বেডিংয়ের জন্য API দ্বারা প্রয়োজনীয়: প্রতিটি ইনপুট সিকোয়েন্সের এমবেডিংয়ের সাথে আকৃতির একটি ফ্লোট32 টেনসর [batch_size, dim] । (এটি পুলড_আউটপুটের একটি উপনাম হতে পারে।)

encoder_inputs এর বিষয়বস্তু এই API সংজ্ঞা দ্বারা কঠোরভাবে প্রয়োজন হয় না। যাইহোক, যে এনকোডারগুলি BERT-স্টাইল ইনপুট ব্যবহার করে, তাদের জন্য নিম্নলিখিত নামগুলি ব্যবহার করার পরামর্শ দেওয়া হয় ( টেনসরফ্লো মডেল গার্ডেনের NLP মডেলিং টুলকিট থেকে) এনকোডারগুলিকে আদান-প্রদান এবং প্রিপ্রসেসর মডেলগুলি পুনরায় ব্যবহার করার ক্ষেত্রে ঘর্ষণ কমাতে:

  • "input_word_ids" : প্যাক করা ইনপুট সিকোয়েন্সের টোকেন আইডি সহ আকৃতির একটি int32 টেনসর [batch_size, seq_length] (অর্থাৎ, একটি স্টার্ট-অফ-সিকোয়েন্স টোকেন, সেগমেন্টের শেষ টোকেন এবং প্যাডিং সহ)।
  • "input_mask" : একটি int32 আকৃতির টেনসর [batch_size, seq_length] যার মান 1 প্যাডিংয়ের আগে উপস্থিত সমস্ত ইনপুট টোকেনের অবস্থানে এবং প্যাডিং টোকেনের জন্য মান 0।
  • "input_type_ids" : একটি int32 আকৃতির টেনসর [batch_size, seq_length] ইনপুট সেগমেন্টের সূচক সহ যা সংশ্লিষ্ট অবস্থানে ইনপুট টোকেনকে জন্ম দিয়েছে। প্রথম ইনপুট সেগমেন্ট (ইনডেক্স 0) এর মধ্যে স্টার্ট-অফ-সিকোয়েন্স টোকেন এবং এর শেষ-অফ-সেগমেন্ট টোকেন রয়েছে। দ্বিতীয় এবং পরবর্তী সেগমেন্টে (যদি উপস্থিত থাকে) তাদের নিজ নিজ সেগমেন্টের শেষের টোকেন অন্তর্ভুক্ত করে। প্যাডিং টোকেন আবার সূচক 0 পায়।

প্রশিক্ষণ বিতরণ করা হয়

প্রিপ্রসেসর এবং এনকোডার অবজেক্ট লোড করার জন্য ডিস্ট্রিবিউশন স্ট্র্যাটেজি স্কোপের ভিতরে বা বাইরে, প্রিপ্রসেসড ইনপুট সহ টেক্সট এম্বেডিংয়ের জন্য API-এর মতো একই নিয়ম প্রযোজ্য (উপরে দেখুন)।

উদাহরণ