背景
由於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...