本篇文章是在之前文章《【nlp】bert模型解析記錄》的基礎上,主要記錄bert模型的相關細節問題,並以qa形式表述。
bert結構大體上可分為輸入、n層transformer的encoder和輸出三部分組成。
輸入由token embedding
、segment embedding
和position embedding
三部分相加組成;
n層transformer的encoder,在bert_base中n=12,bert_large中n=24
輸出有model.get_sequence_out()
和model.get_pooling_out()
兩種輸出,其shape分別為[batch_size, seq_length, hidden_size]和[batch_size, hidden_size]。
model.get_sequence_out()
輸出主要用於特徵提取再處理的序列任務,而model.get_pooling_out()
輸出可直接接softmax進行分類(當然需要外加一層dense層將hidden_size轉換為num_tag)。
self.word_embeddings = embedding(config.vocab_size, config.hidden_size)
self.position_embeddings = embedding(config.max_position_embeddings, > config.hidden_size)
self.token_type_embeddings = embedding(config.type_vocab_size, config.hidden_size)
上述bert pytorch**來自:結構層次非常清晰。
而在bert config中
"max_position_embeddings": 512
"type_vocab_size": 2
因此,在直接使用google 的bert預訓練模型時,輸入最多512個詞(還要除掉[cls]> 和[sep]),最多兩個句子合成一句。這之外的詞和句子會沒有對應的embedding。
當然,如果有足夠的硬體資源自己重新訓練bert,可以更改 bert config,設定更大max_position_embeddings 和 type_vocab_size值去滿足自己的需求。
為什麼選它呢,因為與文字中已有的其它詞相比,這個無明顯語義資訊的符號會更「公平」地融合文字中各個詞的語義資訊,從而更好的表示整句話的語義。
具體來說,self-attention是用文字中的其它詞來增強目標詞的語義表示,但是目標詞本身的語義還是會佔主要部分的,因此,經過bert的12層,每次詞的embedding融合了所有詞的資訊,可以去更好的表示自己的語義。
而[cls]位本身沒有語義,經過12層,得到的是attention後所有詞的加權平均,相比其他正常詞,可以更好的表徵句子語義。
當然,也可以通過對最後一層所有詞的embedding做pooling去表徵句子語義。
在這裡想用乙個例子再嘗試解釋一下:
假設 token embedding 矩陣維度是 [4,768];position embedding 矩陣維度是 [3,768];segment embedding 矩陣維度是 [2,768]。
對於乙個字,假設它的 token one-hot 是[1,0,0,0];它的 position one-hot 是[1,0,0];它的 segment one-hot 是[1,0]。
那這個字最後的 word embedding,就是上面三種 embedding 的加和。
如此得到的 word embedding,和concat後的特徵:[1,0,0,0,1,0,0,1,0],再過維度為 [4+3+2,768] = [9, 768] 的全連線層,得到的向量其實就是一樣的。
再換乙個角度理解:
直接將三個one-hot 特徵 concat 起來得到的 [1,0,0,0,1,0,0,1,0] 不再是one-hot了,但可以把它對映到三個one-hot 組成的特徵空間,空間維度是 432=24 ,那在新的特徵空間,這個字的one-hot就是[1,0,0,0,0…] (23個0)。
此時,embedding 矩陣維度就是 [24,768],最後得到的 word embedding 依然是和上面的等效,但是三個小embedding 矩陣的大小會遠小於新特徵空間對應的embedding 矩陣大小。
當然,在相同初始化方法前提下,兩種方式得到的 word embedding 可能方差會有差別,但是,bert還有layer norm,會把 embedding 結果統一到相同的分布。
bert的三個embedding相加,本質可以看作乙個特徵的融合,強大如 bert 應該可以學到融合後特徵的語義資訊的。
參考:bert適合於自然語言理解(natural language understanding, nlu)類任務,如文字分類、資訊抽取等;
bert不適合於自然語言生成(natural language generation, nlg)類任務。
因為bert採用的是雙向的語言模型,除了被mask的詞語外,該詞語前後的詞語都可以看到。
而nlg任務的目標是在已知當前詞與之前詞語的情況下,**出下乙個詞語,直至所有詞語**完成。
Oracle常見問題彙總
1 如果建立了多個oracle例項,那麼訪問em的時候預設訪問的是第乙個例項的,如何訪問第二個呢?看下這個檔案就會明白了 oracle home install portlist.ini enterprise manager console http 埠 shili1 1158 enterprise...
ab常見問題彙總
測試伺服器ab 被測試伺服器apache apache版本2.2.25 問題一 socket too many open files 24 解決 在測試伺服器操作 1 檢視當前系統設定 open files n 1024為1024 root localhost ulimit a core file ...
knn常見問題彙總
knn演算法又稱為k最近鄰 k nearest neighbor class ification 分類演算法。所謂的k最近鄰,就是指最接近的k個鄰居 資料 即每個樣本都可以由它的k個鄰居來表達。knn演算法的核心思想是,在乙個含未知樣本的空間,可以根據離這個樣本最鄰近的k個樣本的資料型別來確定樣本的...