日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

当Bert遇上Keras:这可能是Bert最简单的打开姿势

發(fā)布時(shí)間:2024/10/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当Bert遇上Keras:这可能是Bert最简单的打开姿势 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


作者丨蘇劍林

研究方向丨NLP,神經(jīng)網(wǎng)絡(luò)

個(gè)人主頁(yè)丨kexue.fm


Bert 是什么,估計(jì)也不用筆者來(lái)諸多介紹了。雖然筆者不是很喜歡Bert,但不得不說(shuō),Bert 確實(shí)在 NLP 界引起了一陣軒然大波。現(xiàn)在不管是中文還是英文,關(guān)于 Bert 的科普和解讀已經(jīng)滿天飛了,隱隱已經(jīng)超過(guò)了當(dāng)年 Word2Vec 剛出來(lái)的勢(shì)頭了。有意思的是,Bert 是 Google 搞出來(lái)的,當(dāng)年的 word2vec 也是 Google 搞出來(lái)的,不管你用哪個(gè),都是在跟著 Google 大佬的屁股跑。


Bert 剛出來(lái)不久,就有讀者建議我寫(xiě)個(gè)解讀,但我終究還是沒(méi)有寫(xiě)。一來(lái),Bert 的解讀已經(jīng)不少了,二來(lái)其實(shí) Bert 也就是基于 Attention 搞出來(lái)的大規(guī)模語(yǔ)料預(yù)訓(xùn)練的模型,本身在技術(shù)上不算什么創(chuàng)新,而關(guān)于 Google 的 Attention 我已經(jīng)寫(xiě)過(guò)解讀了,所以就提不起勁來(lái)寫(xiě)了。


?Bert的預(yù)訓(xùn)練和微調(diào)(圖片來(lái)自Bert的原論文)


總的來(lái)說(shuō),我個(gè)人對(duì) Bert 一直也沒(méi)啥興趣,直到上個(gè)月末在做信息抽取比賽時(shí),才首次嘗試了 Bert。畢竟即使不感興趣,終究也是得學(xué)會(huì)它,畢竟用不用是一回事,會(huì)不會(huì)又是另一回事。再加上在 Keras 中使用(fine tune)Bert,似乎還沒(méi)有什么文章介紹,所以就分享一下自己的使用經(jīng)驗(yàn)。


當(dāng)Bert遇上Keras


很幸運(yùn)的是,已經(jīng)有大佬封裝好了 Keras 版的 Bert,可以直接調(diào)用官方發(fā)布的預(yù)訓(xùn)練權(quán)重,對(duì)于已經(jīng)有一定 Keras 基礎(chǔ)的讀者來(lái)說(shuō),這可能是最簡(jiǎn)單的調(diào)用 Bert 的方式了。所謂“站在巨人的肩膀上”,就是形容我們這些 Keras 愛(ài)好者此刻的心情了。?


keras-bert


個(gè)人認(rèn)為,目前在 Keras 下對(duì) Bert 最好的封裝是:?


keras-bert:

https://github.com/CyberZHG/keras-bert?


本文也是以此為基礎(chǔ)的。 順便一提的是,除了 keras-bert 之外,CyberZHG 大佬還封裝了很多有價(jià)值的 keras 模塊,比如 keras-gpt-2(你可以用像用 Bert 一樣用 GPT2 模型了)、keras-lr-multiplier(分層設(shè)置學(xué)習(xí)率)、keras-ordered-neurons(就是前不久介紹的 ON-LSTM)等等。看來(lái)也是一位 Keras 鐵桿粉絲,致敬大佬。


匯總可以看:

https://github.com/CyberZHG/summary?


事實(shí)上,有了 keras-bert 之后,再加上一點(diǎn)點(diǎn) Keras 基礎(chǔ)知識(shí),而且 keras-bert 所給的 demo 已經(jīng)足夠完善,調(diào)用、微調(diào) Bert 都已經(jīng)變成了意見(jiàn)沒(méi)有什么技術(shù)含量的事情了。所以后面筆者只是給出幾個(gè)中文的例子,來(lái)讓讀者上手 keras-bert 的基本用法。?


Tokenizer


正式講例子之前,還有必要先講一下 Tokenizer 相關(guān)內(nèi)容。我們導(dǎo)入 Bert 的 Tokenizer 并重構(gòu)一下它:


from?keras_bert?import?load_trained_model_from_checkpoint,?Tokenizerimport?codecsconfig_path?=?'../bert/chinese_L-12_H-768_A-12/bert_config.json'checkpoint_path?=?'../bert/chinese_L-12_H-768_A-12/bert_model.ckpt'dict_path?=?'../bert/chinese_L-12_H-768_A-12/vocab.txt'token_dict?=?{}with?codecs.open(dict_path,?'r',?'utf8')?as?reader:????for?line?in?reader:????????token?=?line.strip()????????token_dict[token]?=?len(token_dict)class?OurTokenizer(Tokenizer):????def?_tokenize(self,?text):????????R?=?[]????????for?c?in?text:????????????if?c?in?self._token_dict:????????????????R.append(c)????????????elif?self._is_space(c):????????????????R.append('[unused1]')?#?space類用未經(jīng)訓(xùn)練的[unused1]表示????????????else:????????????????R.append('[UNK]')?#?剩余的字符是[UNK]????????return?Rtokenizer?=?OurTokenizer(token_dict)tokenizer.tokenize(u'今天天氣不錯(cuò)')#?輸出是?['[CLS]',?u'今',?u'天',?u'天',?u'氣',?u'不',?u'錯(cuò)',?'[SEP]']import?load_trained_model_from_checkpoint,?Tokenizer
import?codecs


config_path?=?'../bert/chinese_L-12_H-768_A-12/bert_config.json'
checkpoint_path?=?'../bert/chinese_L-12_H-768_A-12/bert_model.ckpt'
dict_path?=?'../bert/chinese_L-12_H-768_A-12/vocab.txt'

token_dict?=?{}
with?codecs.open(dict_path,?'r',?'utf8')?as?reader:
????for?line?in?reader:
????????token?=?line.strip()
????????token_dict[token]?=?len(token_dict)

class?OurTokenizer(Tokenizer):
????def?_tokenize(self,?text):
????????R?=?[]
????????for?c?in?text:
????????????if?c?in?self._token_dict:
????????????????R.append(c)
????????????elif?self._is_space(c):
????????????????R.append('[unused1]')?#?space類用未經(jīng)訓(xùn)練的[unused1]表示
????????????else:
????????????????R.append('[UNK]')?#?剩余的字符是[UNK]
????????return?R

tokenizer?=?OurTokenizer(token_dict)
tokenizer.tokenize(u'今天天氣不錯(cuò)')
#?輸出是?['[CLS]',?u'今',?u'天',?u'天',?u'氣',?u'不',?u'錯(cuò)',?'[SEP]']


這里簡(jiǎn)單解釋一下 Tokenizer 的輸出結(jié)果。首先,默認(rèn)情況下,分詞后句子首位會(huì)分別加上 [CLS] 和 [SEP] 標(biāo)記,其中 [CLS] 位置對(duì)應(yīng)的輸出向量是能代表整句的句向量(反正 Bert 是這樣設(shè)計(jì)的),而 [SEP] 則是句間的分隔符,其余部分則是單字輸出(對(duì)于中文來(lái)說(shuō))。


本來(lái) Tokenizer 有自己的 _tokenize 方法,我這里重寫(xiě)了這個(gè)方法,是要保證 tokenize 之后的結(jié)果,跟原來(lái)的字符串長(zhǎng)度等長(zhǎng)(如果算上兩個(gè)標(biāo)記,那么就是等長(zhǎng)再加 2)?Tokenizer 自帶的 _tokenize 會(huì)自動(dòng)去掉空格,然后有些字符會(huì)粘在一塊輸出,導(dǎo)致 tokenize 之后的列表不等于原來(lái)字符串的長(zhǎng)度了,這樣如果做序列標(biāo)注的任務(wù)會(huì)很麻煩。


而為了避免這種麻煩,還是自己重寫(xiě)一遍好了。主要就是用 [unused1] 來(lái)表示空格類字符,而其余的不在列表的字符用 [UNK] 表示,其中 [unused*] 這些標(biāo)記是未經(jīng)訓(xùn)練的(隨即初始化),是 Bert 預(yù)留出來(lái)用來(lái)增量添加詞匯的標(biāo)記,所以我們可以用它們來(lái)指代任何新字符。


三個(gè)例子


這里包含 keras-bert 的三個(gè)例子,分別是文本分類、關(guān)系抽取和主體抽取,都是在官方發(fā)布的預(yù)訓(xùn)練權(quán)重基礎(chǔ)上進(jìn)行微調(diào)來(lái)做的。?


Bert官方Github:

https://github.com/google-research/bert?


官方的中文預(yù)訓(xùn)練權(quán)重:

https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip


例子所在Github:

https://github.com/bojone/bert_in_keras/?


根據(jù)官方介紹,這份權(quán)重是用中文維基百科為語(yǔ)料進(jìn)行訓(xùn)練的。?


文本分類


作為第一個(gè)例子,我們做一個(gè)最基本的文本分類任務(wù),熟悉做這個(gè)基本任務(wù)之后,剩下的各種任務(wù)都會(huì)變得相當(dāng)簡(jiǎn)單了。這次我們以之前已經(jīng)討論過(guò)多次的文本感情分類任務(wù) [1] 為例,所用的標(biāo)注數(shù)據(jù) [2] 也是以前所整理的。?


讓我們來(lái)看看模型部分全貌,完整代碼見(jiàn):


https://github.com/bojone/bert_in_keras/blob/master/sentiment.py


bert_model?=?load_trained_model_from_checkpoint(config_path,?checkpoint_path)for?l?in?bert_model.layers:????l.trainable?=?Truex1_in?=?Input(shape=(None,))x2_in?=?Input(shape=(None,))x?=?bert_model([x1_in,?x2_in])x?=?Lambda(lambda?x:?x[:,?0])(x)?#?取出[CLS]對(duì)應(yīng)的向量用來(lái)做分類p?=?Dense(1,?activation='sigmoid')(x)model?=?Model([x1_in,?x2_in],?p)model.compile(????loss='binary_crossentropy',????optimizer=Adam(1e-5),?#?用足夠小的學(xué)習(xí)率????metrics=['accuracy'])model.summary()
for?l?in?bert_model.layers:
????l.trainable?=?True

x1_in?=?Input(shape=(None,))
x2_in?=?Input(shape=(None,))

x?=?bert_model([x1_in,?x2_in])
x?=?Lambda(lambda?x:?x[:,?0])(x)?#?取出[CLS]對(duì)應(yīng)的向量用來(lái)做分類
p?=?Dense(1,?activation='sigmoid')(x)

model?=?Model([x1_in,?x2_in],?p)
model.compile(
????loss='binary_crossentropy',
????optimizer=Adam(1e-5),?#?用足夠小的學(xué)習(xí)率
????metrics=['accuracy']
)
model.summary()


在 Keras 中調(diào)用 Bert 來(lái)做情感分類任務(wù)就這樣寫(xiě)完了。


是不是感覺(jué)還沒(méi)有盡興,模型代碼就結(jié)束了?Keras 調(diào)用 Bert 就這么簡(jiǎn)短。事實(shí)上,真正調(diào)用 Bert 的也就只有 load_trained_model_from_checkpoint 那一行代碼,剩下的只是普通的 Keras 操作(再次感謝 CyberZHG 大佬)。所以,如果你已經(jīng)入門(mén)了 Keras,那么調(diào)用 Bert 是無(wú)往不利啊。?


如此簡(jiǎn)單的調(diào)用,能達(dá)到什么精度?經(jīng)過(guò)5個(gè)epoch的fine tune后,驗(yàn)證集的最好準(zhǔn)確率是95.5%+!之前我們?cè)凇段谋厩楦蟹诸?#xff08;三):分詞 OR 不分詞》[1] 中死調(diào)爛調(diào),也就只有 90% 上下的準(zhǔn)確率;而用了 Bert 之后,寥寥幾行,就提升了 5 個(gè)百分點(diǎn)多的準(zhǔn)確率!也難怪 Bert 能在 NLP 界掀起一陣熱潮。


在這里,用筆者的個(gè)人經(jīng)歷先回答讀者可能關(guān)心的兩個(gè)問(wèn)題。?


第一個(gè)問(wèn)題應(yīng)該是大家都很關(guān)心的,那就是“要多少顯存才夠?”。事實(shí)上,這沒(méi)有一個(gè)標(biāo)準(zhǔn)答案,顯存的使用取決于三個(gè)因素:句子長(zhǎng)度、batch size、模型復(fù)雜度。像上面的情感分析例子,在筆者的 GTX1060 6G 顯存上也能跑起來(lái),只需要將 batch size 調(diào)到 24 即可。


所以,如果你的顯存不夠大,將句子的 maxlen 和 batch size 都調(diào)小一點(diǎn)試試。當(dāng)然,如果你的任務(wù)太復(fù)雜,再小的 maxlen 和 batch size 也可能 OOM,那就只有升級(jí)顯卡了。?


第二個(gè)問(wèn)題是“有什么原則來(lái)指導(dǎo) Bert 后面應(yīng)該要接哪些層?”。答案是:用盡可能少的層來(lái)完成你的任務(wù)。


比如上述情感分析只是一個(gè)二分類任務(wù),你就取出第一個(gè)向量然后加個(gè) Dense(1) 就好了,不要想著多加幾層 Dense,更加不要想著接個(gè) LSTM 再接 Dense;如果你要做序列標(biāo)注(比如 NER),那你就接個(gè) Dense+CRF 就好,也不要多加其他東西。


總之,額外加的東西盡可能少。一是因?yàn)?Bert 本身就足夠復(fù)雜,它有足夠能力應(yīng)對(duì)你要做的很多任務(wù);二來(lái)你自己加的層都是隨即初始化的,加太多會(huì)對(duì) Bert 的預(yù)訓(xùn)練權(quán)重造成劇烈擾動(dòng),容易降低效果甚至造成模型不收斂。


關(guān)系抽取


假如讀者已經(jīng)有了一定的 Keras 基礎(chǔ),那么經(jīng)過(guò)第一個(gè)例子的學(xué)習(xí),其實(shí)我們應(yīng)該已經(jīng)完全掌握了 Bert 的 fine tune 了,因?yàn)閷?shí)在是簡(jiǎn)單到?jīng)]有什么好講了。所以,后面兩個(gè)例子主要是提供一些參考模式,讓讀者能體會(huì)到如何“用盡可能少的層來(lái)完成你的任務(wù)”。?


在第二個(gè)例子中,我們介紹基于 Bert 實(shí)現(xiàn)的一個(gè)極簡(jiǎn)的關(guān)系抽取模型,其標(biāo)注原理跟《基于 DGCNN 和概率圖的輕量級(jí)信息抽取模型》[3] 介紹的一樣,但是得益于 Bert 強(qiáng)大的編碼能力,我們所寫(xiě)的部分可以大大簡(jiǎn)化。


在筆者所給出的一種參考實(shí)現(xiàn)中,模型部分如下,完整模型見(jiàn):


https://github.com/bojone/bert_in_keras/blob/master/relation_extract.py


t?=?bert_model([t1,?t2])ps1?=?Dense(1,?activation='sigmoid')(t)ps2?=?Dense(1,?activation='sigmoid')(t)subject_model?=?Model([t1_in,?t2_in],?[ps1,?ps2])?#?預(yù)測(cè)subject的模型k1v?=?Lambda(seq_gather)([t,?k1])k2v?=?Lambda(seq_gather)([t,?k2])kv?=?Average()([k1v,?k2v])t?=?Add()([t,?kv])po1?=?Dense(num_classes,?activation='sigmoid')(t)po2?=?Dense(num_classes,?activation='sigmoid')(t)object_model?=?Model([t1_in,?t2_in,?k1_in,?k2_in],?[po1,?po2])?#?輸入text和subject,預(yù)測(cè)object及其關(guān)系train_model?=?Model([t1_in,?t2_in,?s1_in,?s2_in,?k1_in,?k2_in,?o1_in,?o2_in],????????????????????[ps1,?ps2,?po1,?po2])1,?activation='sigmoid')(t)
ps2?=?Dense(1,?activation='sigmoid')(t)

subject_model?=?Model([t1_in,?t2_in],?[ps1,?ps2])?#?預(yù)測(cè)subject的模型


k1v?=?Lambda(seq_gather)([t,?k1])
k2v?=?Lambda(seq_gather)([t,?k2])
kv?=?Average()([k1v,?k2v])
t?=?Add()([t,?kv])
po1?=?Dense(num_classes,?activation='sigmoid')(t)
po2?=?Dense(num_classes,?activation='sigmoid')(t)

object_model?=?Model([t1_in,?t2_in,?k1_in,?k2_in],?[po1,?po2])?#?輸入text和subject,預(yù)測(cè)object及其關(guān)系


train_model?=?Model([t1_in,?t2_in,?s1_in,?s2_in,?k1_in,?k2_in,?o1_in,?o2_in],
????????????????????[ps1,?ps2,?po1,?po2])


如果讀者已經(jīng)讀過(guò)《基于 DGCNN 和概率圖的輕量級(jí)信息抽取模型》一文 [3],了解到不用 Bert 時(shí)的模型架構(gòu),那么就會(huì)理解到上述實(shí)現(xiàn)是多么的簡(jiǎn)介明了。?


可以看到,我們引入了 Bert 作為編碼器,然后得到了編碼序列 t,然后直接接兩個(gè) Dense(1),這就完成了 subject 的標(biāo)注模型;接著,我們把傳入的 s 的首尾對(duì)應(yīng)的編碼向量拿出來(lái),直接加到編碼向量序列 t 中去,然后再接兩個(gè) Dense(num_classes),就完成 object 的標(biāo)注模型(同時(shí)標(biāo)注出了關(guān)系)。?


這樣簡(jiǎn)單的設(shè)計(jì),最終 F1 能到多少?答案是:線下 dev 能接近 82%,線上我提交過(guò)一次,結(jié)果是 85%+(都是單模型)!


相比之下,《基于 DGCNN 和概率圖的輕量級(jí)信息抽取模型》[3]?中的模型,需要接 CNN,需要搞全局特征,需要將 s 傳入到 LSTM 進(jìn)行編碼,還需要相對(duì)位置向量,各種拍腦袋的模塊融合在一起,單模型也只比它好一點(diǎn)點(diǎn)(大約 82.5%)。


要知道,這個(gè)基于 Bert 的簡(jiǎn)單模型我只寫(xiě)了一個(gè)小時(shí)就寫(xiě)出來(lái)了,而各種技巧和模型融合在一起的 DGCNN 模型,我前前后后調(diào)試了差不多兩個(gè)月!Bert 的強(qiáng)悍之處可見(jiàn)一斑。


注:這個(gè)模型的 fine tune 最好有 8G 以上的顯存。另外,因?yàn)槲以诒荣惣磳⒔Y(jié)束的前幾天才接觸的 Bert,才把這個(gè)基于 Bert 的模型寫(xiě)出來(lái),沒(méi)有花心思好好調(diào)試,所以最終的提交結(jié)果并沒(méi)有包含 Bert。


用 Bert 做關(guān)系抽取的這個(gè)例子,跟前面情感分析的簡(jiǎn)單例子,有一個(gè)明顯的差別是學(xué)習(xí)率的變化。情感分析的例子中,只是用了恒定的學(xué)習(xí)率訓(xùn)練了幾個(gè) epoch,效果就還不錯(cuò)了。


在關(guān)系抽取這個(gè)例子中,第一個(gè) epoch 的學(xué)習(xí)率慢慢從 0 增加到(這樣稱為 warmup),第二個(gè) epoch 再?gòu)慕档?#xff0c;總的來(lái)說(shuō)就是先增后減,Bert 本身也是用類似的學(xué)習(xí)率曲線來(lái)訓(xùn)練的,這樣的訓(xùn)練方式比較穩(wěn)定,不容易崩潰,而且效果也比較好。


事件主體抽取


最后一個(gè)例子來(lái)自 CCKS 2019 面向金融領(lǐng)域的事件主體抽取 [4],這個(gè)比賽目前還在進(jìn)行,不過(guò)我也已經(jīng)沒(méi)有什么動(dòng)力和興趣做下去了,所以放出我現(xiàn)在的模型(準(zhǔn)確率為 89%+)供大家參考,祝繼續(xù)參賽的選手取得更好的成績(jī)。?


簡(jiǎn)單介紹一下這個(gè)比賽的數(shù)據(jù),大概是這樣的:


輸入:“公司 A 產(chǎn)品出現(xiàn)添加劑,其下屬子公司 B 和公司 C 遭到了調(diào)查”, “產(chǎn)品出現(xiàn)問(wèn)題”?


輸出:“公司 A”?


也就是說(shuō),這是個(gè)雙輸入、單輸出的模型,輸入是一個(gè) query 和一個(gè)事件類型,輸出一個(gè)實(shí)體(有且只有一個(gè),并且是 query 的一個(gè)片段)。其實(shí)這個(gè)任務(wù)可以看成是 SQUAD 1.0 [5] 的簡(jiǎn)化版,根據(jù)這個(gè)輸出特性,輸出應(yīng)該用指針結(jié)構(gòu)比較好(兩個(gè) softmax 分別預(yù)測(cè)首尾)。剩下的問(wèn)題是:雙輸入怎么搞??


前面兩個(gè)例子雖然復(fù)雜度不同,但它們都是單一輸入的,雙輸入怎么辦呢?當(dāng)然,這里的實(shí)體類型只有有限個(gè),直接 Embedding 也行,只不過(guò)我使用一種更能體現(xiàn) Bert 的簡(jiǎn)單粗暴和強(qiáng)悍的方案:直接用連接符將兩個(gè)輸入連接成一個(gè)句子,然后就變成單輸入了!


比如上述示例樣本處理成:?


輸入:“___產(chǎn)品出現(xiàn)問(wèn)題___公司 A 產(chǎn)品出現(xiàn)添加劑,其下屬子公司 B 和公司 C 遭到了調(diào)查”?


輸出:“公司 A”?


然后就變成了普通的單輸入抽取問(wèn)題了。說(shuō)到這個(gè),這個(gè)模型的代碼也就沒(méi)有什么好說(shuō)的了,就簡(jiǎn)單幾行,完整代碼請(qǐng)看:


https://github.com/bojone/bert_in_keras/blob/master/subject_extract.py


x?=?bert_model([x1,?x2])ps1?=?Dense(1,?use_bias=False)(x)ps1?=?Lambda(lambda?x:?x[0][...,?0]?-?(1?-?x[1][...,?0])?*?1e10)([ps1,?x_mask])ps2?=?Dense(1,?use_bias=False)(x)ps2?=?Lambda(lambda?x:?x[0][...,?0]?-?(1?-?x[1][...,?0])?*?1e10)([ps2,?x_mask])model?=?Model([x1_in,?x2_in],?[ps1,?ps2])1,?use_bias=False)(x)
ps1?=?Lambda(lambda?x:?x[0][...,?0]?-?(1?-?x[1][...,?0])?*?1e10)([ps1,?x_mask])
ps2?=?Dense(1,?use_bias=False)(x)
ps2?=?Lambda(lambda?x:?x[0][...,?0]?-?(1?-?x[1][...,?0])?*?1e10)([ps2,?x_mask])

model?=?Model([x1_in,?x2_in],?[ps1,?ps2])


另外加上一些解碼的 trick,還有模型融合,提交上去,就可以做到 89%+ 了。在看看目前排行榜,發(fā)現(xiàn)最好的結(jié)果也就是 90% 多一點(diǎn)點(diǎn),所以估計(jì)大家都差不多是這樣做的了。這個(gè)代碼重復(fù)實(shí)驗(yàn)時(shí)波動(dòng)比較大,大家可以多跑幾次,取最優(yōu)結(jié)果。


這個(gè)例子主要告訴我們,用 Bert 實(shí)現(xiàn)自己的任務(wù)時(shí),最好能整理成單輸入的模式,這樣一來(lái)比較簡(jiǎn)單,二來(lái)也更加高效。


比如做句子相似度模型,輸入兩個(gè)句子,輸出一個(gè)相似度,有兩個(gè)可以想到的做法,第一種是兩個(gè)句子分別過(guò)同一個(gè) Bert,然后取出各自的 [CLS] 特征來(lái)做分類;第二種就是像上面一樣,用個(gè)記號(hào)把兩個(gè)句子連接在一起,變成一個(gè)句子,然后過(guò)一個(gè) Bert,然后將輸出特征做分類,后者顯然會(huì)更快一些,而且能夠做到特征之間更全面的交互。


文章小結(jié)


本文介紹了 Keras 下 Bert 的基本調(diào)用方法,其中主要是提供三個(gè)參考例子,供大家逐步熟悉 Bert 的 fine tune 步驟和原理。其中有不少是筆者自己閉門(mén)造車的經(jīng)驗(yàn)之談,如果有所偏頗,還望讀者指正。?


事實(shí)上有了 CyberZHG 大佬實(shí)現(xiàn)的 keras-bert,在 Keras 下使用 Bert 也就是小菜一碟,大家折騰個(gè)半天,也就上手了。最后祝大家用得痛快~


相關(guān)鏈接


[1]?https://kexue.fm/archives/3863

[2] https://kexue.fm/archives/3414

[3] https://kexue.fm/archives/6671

[4] https://biendata.com/competition/ccks_2019_4/

[5] https://rajpurkar.github.io/SQuAD-explorer/explore/1.1/dev/




點(diǎn)擊以下標(biāo)題查看作者其他文章:?


  • 變分自編碼器VAE:原來(lái)是這么一回事 | 附源碼

  • 再談變分自編碼器VAE:從貝葉斯觀點(diǎn)出發(fā)

  • 變分自編碼器VAE:這樣做為什么能成?

  • 簡(jiǎn)單修改,讓GAN的判別器秒變編碼器

  • 深度學(xué)習(xí)中的互信息:無(wú)監(jiān)督提取特征

  • 全新視角:用變分推斷統(tǒng)一理解生成模型

  • 細(xì)水長(zhǎng)flow之NICE:流模型的基本概念與實(shí)現(xiàn)

  • 細(xì)水長(zhǎng)flow之f-VAEs:Glow與VAEs的聯(lián)姻

  • 深度學(xué)習(xí)中的Lipschitz約束:泛化與生成模型




#投 稿 通 道#

?讓你的論文被更多人看到?



如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。


總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。


PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來(lái)。


??來(lái)稿標(biāo)準(zhǔn):

? 稿件確系個(gè)人原創(chuàng)作品,來(lái)稿需注明作者個(gè)人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?

? 如果文章并非首發(fā),請(qǐng)?jiān)谕陡鍟r(shí)提醒并附上所有已發(fā)布鏈接?

? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會(huì)添加“原創(chuàng)”標(biāo)志


? 投稿郵箱:

? 投稿郵箱:hr@paperweekly.site?

? 所有文章配圖,請(qǐng)單獨(dú)在附件中發(fā)送?

? 請(qǐng)留下即時(shí)聯(lián)系方式(微信或手機(jī)),以便我們?cè)诰庉嫲l(fā)布時(shí)和作者溝通




?


現(xiàn)在,在「知乎」也能找到我們了

進(jìn)入知乎首頁(yè)搜索「PaperWeekly」

點(diǎn)擊「關(guān)注」訂閱我們的專欄吧



關(guān)于PaperWeekly


PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。


▽ 點(diǎn)擊 |?閱讀原文?| 查看作者博客

總結(jié)

以上是生活随笔為你收集整理的当Bert遇上Keras:这可能是Bert最简单的打开姿势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。