動動發(fā)財(cái)?shù)男∈?,點(diǎn)個贊吧!
針對任何領(lǐng)域微調(diào)預(yù)訓(xùn)練 NLP 模型的分步指南
簡介
在當(dāng)今世界,預(yù)訓(xùn)練 NLP 模型的可用性極大地簡化了使用深度學(xué)習(xí)技術(shù)對文本數(shù)據(jù)的解釋。然而,雖然這些模型在一般任務(wù)中表現(xiàn)出色,但它們往往缺乏對特定領(lǐng)域的適應(yīng)性。本綜合指南[1]旨在引導(dǎo)您完成微調(diào)預(yù)訓(xùn)練 NLP 模型的過程,以提高特定領(lǐng)域的性能。
動機(jī)
盡管 BERT 和通用句子編碼器 (USE) 等預(yù)訓(xùn)練 NLP 模型可以有效捕獲語言的復(fù)雜性,但由于訓(xùn)練數(shù)據(jù)集的范圍不同,它們在特定領(lǐng)域應(yīng)用中的性能可能會受到限制。當(dāng)分析特定領(lǐng)域內(nèi)的關(guān)系時(shí),這種限制變得明顯。
例如,在處理就業(yè)數(shù)據(jù)時(shí),我們希望模型能夠識別“數(shù)據(jù)科學(xué)家”和“機(jī)器學(xué)習(xí)工程師”角色之間的更接近,或者“Python”和“TensorFlow”之間更強(qiáng)的關(guān)聯(lián)。不幸的是,通用模型常常忽略這些微妙的關(guān)系。
下表展示了從基本多語言 USE 模型獲得的相似性的差異:

為了解決這個問題,我們可以使用高質(zhì)量的、特定領(lǐng)域的數(shù)據(jù)集來微調(diào)預(yù)訓(xùn)練的模型。這一適應(yīng)過程顯著增強(qiáng)了模型的性能和精度,充分釋放了 NLP 模型的潛力。
?在處理大型預(yù)訓(xùn)練 NLP 模型時(shí),建議首先部署基本模型,并僅在其性能無法滿足當(dāng)前特定問題時(shí)才考慮進(jìn)行微調(diào)。
?
本教程重點(diǎn)介紹使用易于訪問的開源數(shù)據(jù)微調(diào)通用句子編碼器 (USE) 模型。
可以通過監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí)等各種策略來微調(diào) ML 模型。在本教程中,我們將專注于一次(幾次)學(xué)習(xí)方法與用于微調(diào)過程的暹羅架構(gòu)相結(jié)合。
理論框架
可以通過監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí)等各種策略來微調(diào) ML 模型。在本教程中,我們將專注于一次(幾次)學(xué)習(xí)方法與用于微調(diào)過程的暹羅架構(gòu)相結(jié)合。
方法
在本教程中,我們使用暹羅神經(jīng)網(wǎng)絡(luò),它是一種特定類型的人工神經(jīng)網(wǎng)絡(luò)。該網(wǎng)絡(luò)利用共享權(quán)重,同時(shí)處理兩個不同的輸入向量來計(jì)算可比較的輸出向量。受一次性學(xué)習(xí)的啟發(fā),這種方法已被證明在捕獲語義相似性方面特別有效,盡管它可能需要更長的訓(xùn)練時(shí)間并且缺乏概率輸出。
連體神經(jīng)網(wǎng)絡(luò)創(chuàng)建了一個“嵌入空間”,其中相關(guān)概念緊密定位,使模型能夠更好地辨別語義關(guān)系。

-
雙分支和共享權(quán)重:該架構(gòu)由兩個相同的分支組成,每個分支都包含一個具有共享權(quán)重的嵌入層。這些雙分支同時(shí)處理兩個輸入,無論是相似的還是不相似的。 -
相似性和轉(zhuǎn)換:使用預(yù)先訓(xùn)練的 NLP 模型將輸入轉(zhuǎn)換為向量嵌入。然后該架構(gòu)計(jì)算向量之間的相似度。相似度得分(范圍在 -1 到 1 之間)量化兩個向量之間的角距離,作為它們語義相似度的度量。 -
對比損失和學(xué)習(xí):模型的學(xué)習(xí)以“對比損失”為指導(dǎo),即預(yù)期輸出(訓(xùn)練數(shù)據(jù)的相似度得分)與計(jì)算出的相似度之間的差異。這種損失指導(dǎo)模型權(quán)重的調(diào)整,以最大限度地減少損失并提高學(xué)習(xí)嵌入的質(zhì)量。
數(shù)據(jù)概覽
為了使用此方法對預(yù)訓(xùn)練的 NLP 模型進(jìn)行微調(diào),訓(xùn)練數(shù)據(jù)應(yīng)由文本字符串對組成,并附有它們之間的相似度分?jǐn)?shù)。
訓(xùn)練數(shù)據(jù)遵循如下所示的格式:

在本教程中,我們使用源自 ESCO 分類數(shù)據(jù)集的數(shù)據(jù)集,該數(shù)據(jù)集已轉(zhuǎn)換為基于不同數(shù)據(jù)元素之間的關(guān)系生成相似性分?jǐn)?shù)。
?準(zhǔn)備訓(xùn)練數(shù)據(jù)是微調(diào)過程中的關(guān)鍵步驟。假設(shè)您有權(quán)訪問所需的數(shù)據(jù)以及將其轉(zhuǎn)換為指定格式的方法。由于本文的重點(diǎn)是演示微調(diào)過程,因此我們將省略如何使用 ESCO 數(shù)據(jù)集生成數(shù)據(jù)的詳細(xì)信息。
ESCO 數(shù)據(jù)集可供開發(fā)人員自由使用,作為各種應(yīng)用程序的基礎(chǔ),這些應(yīng)用程序提供自動完成、建議系統(tǒng)、職位搜索算法和職位匹配算法等服務(wù)。本教程中使用的數(shù)據(jù)集已被轉(zhuǎn)換并作為示例提供,允許不受限制地用于任何目的。
?
讓我們首先檢查訓(xùn)練數(shù)據(jù):
import?pandas?as?pd
#?Read?the?CSV?file?into?a?pandas?DataFrame
data?=?pd.read_csv("./data/training_data.csv")
#?Print?head
data.head()

起點(diǎn):基線模型
首先,我們建立多語言通用句子編碼器作為我們的基線模型。在進(jìn)行微調(diào)過程之前,必須設(shè)置此基線。
在本教程中,我們將使用 STS 基準(zhǔn)和相似性可視化示例作為指標(biāo)來評估通過微調(diào)過程實(shí)現(xiàn)的更改和改進(jìn)。
?STS 基準(zhǔn)數(shù)據(jù)集由英語句子對組成,每個句子對都與相似度得分相關(guān)聯(lián)。在模型訓(xùn)練過程中,我們評估模型在此基準(zhǔn)集上的性能。每次訓(xùn)練運(yùn)行的持久分?jǐn)?shù)是數(shù)據(jù)集中預(yù)測相似性分?jǐn)?shù)和實(shí)際相似性分?jǐn)?shù)之間的皮爾遜相關(guān)性。
這些分?jǐn)?shù)確保當(dāng)模型根據(jù)我們特定于上下文的訓(xùn)練數(shù)據(jù)進(jìn)行微調(diào)時(shí),它保持一定程度的通用性。
?
#?Loads?the?Universal?Sentence?Encoder?Multilingual?module?from?TensorFlow?Hub.
base_model_url?=?"https://tfhub.dev/google/universal-sentence-encoder-multilingual/3"
base_model?=?tf.keras.Sequential([
????hub.KerasLayer(base_model_url,
???????????????????input_shape=[],
???????????????????dtype=tf.string,
???????????????????trainable=False)
])
#?Defines?a?list?of?test?sentences.?These?sentences?represent?various?job?titles.
test_text?=?['Data?Scientist',?'Data?Analyst',?'Data?Engineer',
?????????????'Nurse?Practitioner',?'Registered?Nurse',?'Medical?Assistant',
?????????????'Social?Media?Manager',?'Marketing?Strategist',?'Product?Marketing?Manager']
#?Creates?embeddings?for?the?sentences?in?the?test_text?list.?
#?The?np.array()?function?is?used?to?convert?the?result?into?a?numpy?array.
#?The?.tolist()?function?is?used?to?convert?the?numpy?array?into?a?list,?which?might?be?easier?to?work?with.
vectors?=?np.array(base_model.predict(test_text)).tolist()
#?Calls?the?plot_similarity?function?to?create?a?similarity?plot.
plot_similarity(test_text,?vectors,?90,?"base?model")
#?Computes?STS?benchmark?score?for?the?base?model
pearsonr?=?sts_benchmark(base_model)
print("STS?Benachmark:?"?+?str(pearsonr))

微調(diào)模型
下一步涉及使用基線模型構(gòu)建暹羅模型架構(gòu),并使用我們的特定領(lǐng)域數(shù)據(jù)對其進(jìn)行微調(diào)。
#?Load?the?pre-trained?word?embedding?model
embedding_layer?=?hub.load(base_model_url)
#?Create?a?Keras?layer?from?the?loaded?embedding?model
shared_embedding_layer?=?hub.KerasLayer(embedding_layer,?trainable=True)
#?Define?the?inputs?to?the?model
left_input?=?keras.Input(shape=(),?dtype=tf.string)
right_input?=?keras.Input(shape=(),?dtype=tf.string)
#?Pass?the?inputs?through?the?shared?embedding?layer
embedding_left_output?=?shared_embedding_layer(left_input)
embedding_right_output?=?shared_embedding_layer(right_input)
#?Compute?the?cosine?similarity?between?the?embedding?vectors
cosine_similarity?=?tf.keras.layers.Dot(axes=-1,?normalize=True)(
????[embedding_left_output,?embedding_right_output]
)
#?Convert?the?cosine?similarity?to?angular?distance
pi?=?tf.constant(math.pi,?dtype=tf.float32)
clip_cosine_similarities?=?tf.clip_by_value(
????cosine_similarity,?-0.99999,?0.99999
)
acos_distance?=?1.0?-?(tf.acos(clip_cosine_similarities)?/?pi)
#?Package?the?model
encoder?=?tf.keras.Model([left_input,?right_input],?acos_distance)
#?Compile?the?model
encoder.compile(
????optimizer=tf.keras.optimizers.Adam(
????????learning_rate=0.00001,
????????beta_1=0.9,
????????beta_2=0.9999,
????????epsilon=0.0000001,
????????amsgrad=False,
????????clipnorm=1.0,
????????name="Adam",
????),
????loss=tf.keras.losses.MeanSquaredError(
????????reduction=keras.losses.Reduction.AUTO,?name="mean_squared_error"
????),
????metrics=[
????????tf.keras.metrics.MeanAbsoluteError(),
????????tf.keras.metrics.MeanAbsolutePercentageError(),
????],
)
#?Print?the?model?summary
encoder.summary()

-
Fit model
#?Define?early?stopping?callback
early_stop?=?keras.callbacks.EarlyStopping(
????monitor="loss",?patience=3,?min_delta=0.001
)
#?Define?TensorBoard?callback
logdir?=?os.path.join(".",?"logs/fit/"?+?datetime.now().strftime("%Y%m%d-%H%M%S"))
tensorboard_callback?=?keras.callbacks.TensorBoard(log_dir=logdir)
#?Model?Input
left_inputs,?right_inputs,?similarity?=?process_model_input(data)
#?Train?the?encoder?model
history?=?encoder.fit(
????[left_inputs,?right_inputs],
????similarity,
????batch_size=8,
????epochs=20,
????validation_split=0.2,
????callbacks=[early_stop,?tensorboard_callback],
)
#?Define?model?input
inputs?=?keras.Input(shape=[],?dtype=tf.string)
#?Pass?the?input?through?the?embedding?layer
embedding?=?hub.KerasLayer(embedding_layer)(inputs)
#?Create?the?tuned?model
tuned_model?=?keras.Model(inputs=inputs,?outputs=embedding)
評估結(jié)果
現(xiàn)在我們有了微調(diào)后的模型,讓我們重新評估它并將結(jié)果與基本模型的結(jié)果進(jìn)行比較。
#?Creates?embeddings?for?the?sentences?in?the?test_text?list.?
#?The?np.array()?function?is?used?to?convert?the?result?into?a?numpy?array.
#?The?.tolist()?function?is?used?to?convert?the?numpy?array?into?a?list,?which?might?be?easier?to?work?with.
vectors?=?np.array(tuned_model.predict(test_text)).tolist()
#?Calls?the?plot_similarity?function?to?create?a?similarity?plot.
plot_similarity(test_text,?vectors,?90,?"tuned?model")
#?Computes?STS?benchmark?score?for?the?tuned?model
pearsonr?=?sts_benchmark(tuned_model)
print("STS?Benachmark:?"?+?str(pearsonr))

基于在相對較小的數(shù)據(jù)集上對模型進(jìn)行微調(diào),STS 基準(zhǔn)分?jǐn)?shù)與基線模型的分?jǐn)?shù)相當(dāng),表明調(diào)整后的模型仍然具有普適性。然而,相似性可視化顯示相似標(biāo)題之間的相似性得分增強(qiáng),而不同標(biāo)題的相似性得分降低。
總結(jié)
微調(diào)預(yù)訓(xùn)練的 NLP 模型以進(jìn)行領(lǐng)域適應(yīng)是一種強(qiáng)大的技術(shù),可以提高其在特定上下文中的性能和精度。通過利用高質(zhì)量的、特定領(lǐng)域的數(shù)據(jù)集和暹羅神經(jīng)網(wǎng)絡(luò),我們可以增強(qiáng)模型捕獲語義相似性的能力。
本教程以通用句子編碼器 (USE) 模型為例,提供了微調(diào)過程的分步指南。我們探索了理論框架、數(shù)據(jù)準(zhǔn)備、基線模型評估和實(shí)際微調(diào)過程。結(jié)果證明了微調(diào)在增強(qiáng)域內(nèi)相似性得分方面的有效性。
通過遵循此方法并將其適應(yīng)您的特定領(lǐng)域,您可以釋放預(yù)訓(xùn)練 NLP 模型的全部潛力,并在自然語言處理任務(wù)中取得更好的結(jié)果
Reference
Source: https://towardsdatascience.com/domain-adaption-fine-tune-pre-trained-nlp-models-a06659ca6668文章來源:http://www.zghlxwxcb.cn/news/detail-544172.html
本文由 mdnice 多平臺發(fā)布文章來源地址http://www.zghlxwxcb.cn/news/detail-544172.html
到了這里,關(guān)于微調(diào)預(yù)訓(xùn)練的 NLP 模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!