bert 大白话
keras 版本的bert源碼
tensorflow版本的bert源碼
大家記住768這個數字
我只問一個問題,那就是bert 詞向量化輸出的是什么?
在這個問題之前,大家可以想想,word2vec 輸出的是什么?
大家可以看看這篇文章大白話講解word2vec到底在做些什么
我們要獲取的dense vector其實就是Hidden Layer的輸出單元。有的地方定為Input Layer和Hidden Layer之間的權重
我看了bert的tensorflow 源碼,大家可以看看bert tensorflow 源碼的36行和877行,都出現了 hidden_size=768
def __init__(self,vocab_size,#大家看看下面這個768hidden_size=768,num_hidden_layers=12,num_attention_heads=12,intermediate_size=3072,hidden_act="gelu",hidden_dropout_prob=0.1,attention_probs_dropout_prob=0.1,max_position_embeddings=512,type_vocab_size=16,initializer_range=0.02): # Down-project back to `hidden_size` then add the residual.with tf.variable_scope("output"):layer_output = tf.layers.dense(intermediate_output,hidden_size,kernel_initializer=create_initializer(initializer_range))layer_output = dropout(layer_output, hidden_dropout_prob)layer_output = layer_norm(layer_output + attention_output)prev_output = layer_outputall_layer_outputs.append(layer_output)我又看了bert keras 版本,在源碼的47行和121行都出現了 embed_dim=768
def get_model(token_num,pos_num=512,seq_len=512,embed_dim=768,transformer_num=12,head_num=12,feed_forward_dim=3072,dropout_rate=0.1,attention_activation=None,feed_forward_activation='gelu',training=True,trainable=None,output_layer_num=1): mlm_dense_layer = keras.layers.Dense(units=embed_dim,activation=feed_forward_activation,name='MLM-Dense',)(transformed)mlm_norm_layer = LayerNormalization(name='MLM-Norm')(mlm_dense_layer)mlm_pred_layer = EmbeddingSimilarity(name='MLM-Sim')([mlm_norm_layer, embed_weights])masked_layer = Masked(name='MLM')([mlm_pred_layer, inputs[-1]])extract_layer = Extract(index=0, name='Extract')(transformed)nsp_dense_layer = keras.layers.Dense(units=embed_dim,activation='tanh',name='NSP-Dense',)(extract_layer)nsp_pred_layer = keras.layers.Dense(units=2,activation='softmax',name='NSP',)(nsp_dense_layer)結論:
word2vec本質上就是一個三層的神經網絡,word2vec輸出的是隱藏層到輸出層權重矩陣的某一行,
bert是一個8層的神經網絡,分別是
1.Dense=>
2.LayerNormalization=>
3.EmbeddingSimilarity=>
5.Masked=>
6Extract=>
7Dense=>(這一層的神經元個數是768)
8Dense=>
bert的深度更加深,所以訓練的時間要長,并且bert 詞向量的長度是固定的,要想改變,需要改變網絡參數,重新訓練
總結
- 上一篇: Adaboost、GBDT与XGBoos
- 下一篇: ubuntu 安装 opengl