Albert zh轉化為pytorch版本

2021-10-05 19:52:05 字數 2721 閱讀 6696

背景

由於google提供bert_base_zh的引數太多,模型大太,大約400m,無論是使用bert進行fine-tuning或者是對bert進行再訓練的訓練成本會變大。所以就對bert進行了一些優化。

主要從以下幾個點對bert進行了優化:

詞嵌入向量的因式分解

o (v

∗h)−

>o(

v∗e+

e∗h)

o(v*h)->o(v*e +e*h)

o(v∗h)

−>o(

v∗e+

e∗h)

其中v為字典中詞的個數,h為隱藏層size,e是albert中因式分解的的乙個變數。以albert_xxlarge為例,v=30000,h=4096,e=128,那麼原來的個數是vh=300004096=1.23億個引數,現在變為ve+eh = 30000128 + 1284096=436萬,縮小為原來的1/28.

跨層引數共享

引數共享能夠顯著的減小引數。共享引數分為全連線層、注意力層的引數共享,但是注意力層的引數對效果的減弱影響小一些。

段落連續任務

除了bert的mask任務及nsp任務,增加了乙個段落連續任務。正例:使用乙個文件中連續的兩個文字段落,負例是使用乙個文件的連續的兩個段落,但是位置調換了。

去掉了dropout

發現最大的模型訓練了100萬步後,還是沒有過擬合,說明模型的容量還可以更大一些,就移除了dropout。其實dropout是隨機失活一些節點,本質上還是減小模型。

為了加快訓練,使用了lamb作為優化器,可以使用大的batch_size。

使用了n-gram來做mask語音模型。

但是有乙個問題如何把tensorflow版本的albert轉化為pytorch可以使用的呢?

git clone albert_pytorch:

使用如下命令進行轉化:

python convert_albert_tf_checkpoint_to_pytorch.py \

--tf_checkpoint_path=./prev_trained_model/albert_tiny_zh \

--bert_config_file=./prev_trained_model/albert_tiny_zh/albet_config_tiny_g.json \

--pytorch_dump_path=./prev_trained_model/albet_tiny_zh/pytorch_model.bin

使用transformers載入模型並使用

albert的輸出的是乙個tuple,第乙個值的shape是[batch_size, sequence_len, hidden_size],是最後乙個transforer層出來的hidden state,也就是通過albert編碼之後的值,相當於是每個token被編碼了,當然這包含cls和sep兩個向量。當我們需要用cls來做後面的分類時,output[0][:,0,:]就是整個句子的cls向量了。它的size是[batch_size,hidden_size]。

輸出的tuple的第二值是shape是[batch_size,hidden_size], pooler layer的輸出,是把序列的cls向量經過liner變化並經過tanh啟用之後的向量。

# -*- encoding: utf-8 -*-

import warnings

warnings.filterwarnings(

'ignore'

)from transformers import albertmodel, berttokenizer, automodel, autotokenizer

import os

from os.path import dirname, abspath

import torch

root_dir = dirname(dirname(dirname(abspath(__file__)))

)if __name__ ==

'__main__'

: albert_path = os.path.join(root_dir,

'pretrained/albert_tiny_zh_pytorch'

)# 載入模型

model = automodel.from_pretrained(albert_path)

# 載入tokenizer,這裡使用berttokenizer,如果使用autotokenizer會報錯。

tokenizer = berttokenizer.from_pretrained(albert_path)

print

(model)

tokens = tokenizer.encode(

'我愛中國共產黨'

,add_special_tokens=

true

)print

(tokens)

predict = model(torch.tensor(tokens)

.unsqueeze(0)

)print

(predict[0]

.size())

# this is the last hidden_state with size of [batch_size, seq_len, hidden_size]

print

(predict[1]

.size(

))

base64轉化為blob,blob轉化為file

背景 最近在做乙個移動端手寫簽名的功能。需求是將手寫簽名生成存到後台,實現步驟 canvas畫圖,生成base64,將base64轉為file物件。1,canvas具體怎麼實現手寫簽名,不在細講,主要是touchmove.touchstart,touchend事件和canvas畫筆工具結合,生成ba...

獲取當前時間並轉化為轉化為各種格式

在專案中直接把 複製成乙個fortime.js檔案,然後在需要用到的時候import或者require一下,根據需要用 例如 var fortime require utils fortime.js 然後根據需要選擇是 fortime.formattime new date fortime.form...

map轉化為物件

如何把map 轉化為指定物件呢?先看測試 test public void test convertmap2obj throws instantiationexception,illegalacces ception,securityexception,nosuchfieldexception,il...