基於Tensorflow Estimators的文本分類系列之三
來自:AI前線
詞向量
我們可以添加的下一步複雜性是詞嵌入。詞向量是稀疏高維數據的密集低維表示。這使我們的模型能夠學習每個標記的更有意義的表示,而不僅僅是一個索引。雖然單個維度沒有意義,但低維空間-從足夠大的語料庫中學習-已被證明可以捕捉關係,如時態,複數,性別,主題相關性等等。我們可以通過將現有的特徵列轉換為embedding_column來添加單詞嵌入。模型所看到的表示是每個標記嵌入的均值(請參閱文檔中的組合器參數)。我們可以將嵌入式功能插入預先封裝的DNNClassifier中。
敏銳的觀察者注意到embedding_column只是將完全連接的層應用到token的稀疏二進位特徵向量的有效方式,該向量乘以所選組合器的常量。這樣做的直接後果是在LinearClassifier中直接使用embedding_column是沒有意義的,因為兩個連續的線性圖層之間沒有非線性關係,不會為模型增加預測能力,除非嵌入是預先訓練好的。
embedding_size=50
word\_embedding\_column=tf.feature_column.embedding_column(
column,dimension=embedding_size)
classifier=tf.estimator.DNNClassifier(
hidden_units=[100],
feature_columns=[word_embedding_column],
train\_and\_evaluate(classifier)
我們可以使用TensorBoard來使用t-SNE將我們的50維單詞向量投影到?3中。我們期望類似的詞語彼此接近。這可以是檢查我們的模型權重並發現意外行為的有用方法。
卷積神經網路
在這一點上,一種可能的方法是更深入地進一步添加更多完全連接的層並訓練圖層大小和訓練功能。但是,通過這樣做,我們會增加額外的複雜性並忽略句子中的重要結構。生活中的言語不是單個憑空存在的,所表達的意思是言語和鄰居構成的。
卷積是利用這種結構的一種方式,類似於我們可以對用於圖像分類的突出像素集進行建模。直覺是,某些詞或n-gram序列通常具有相同的含義,而不管它們在句子中的整體位置如何。通過卷積運算引入結構先驗允許我們模擬相鄰單詞之間的相互作用,從而為我們提供了一種更好的方式來表達這樣的含義。
創建一個自定義估算器
從以前的博客文章可以看出,tf.estimator框架為培訓機器學習模型提供了一個高級API,定義了train(),evaluate()和predict()操作,處理點校驗,載入,初始化,服務,構建圖和開箱即用的會話。有一小部分預先製作的評估者,就像我們之前使用過的評估者一樣,但最有可能的是你需要建立自己的評估者。
編寫自定義估計器意味著編寫一個返回EstimatorSpec的model_fn(features,labels,mode,params)。第一步將把要素映射到我們的嵌入層:
features["x"],
vocab_size,
embedding_size,
initializer=params["embedding_initializer"])
我們使用tf.layers處理輸出向量。
training=(mode==tf.estimator.ModeKeys.TRAIN)
rate=0.2,
training=training)
inputs=dropout_emb,
filters=32,
kernel_size=3,
padding="same",
pool=tf.reduce_max(input_tensor=conv,axis=1)
最後,我們將使用Head來簡化我們最後一部分model_fn的編寫。頭部已經知道如何計算預測,損失,train_op,指標和輸出輸出,並且可以在模型之間重複使用。這也用於預先制定的估算器,並為我們提供跨所有模型的統一評估功能。我們將使用binary_classification_head,它是單標籤二進位分類的頭部,它使用sigmoid_cross_entropy_with_logits作為丟失函數。
optimizer=tf.train.AdamOptimizer()
def_train_op_fn(loss):
returnoptimizer.minimize(
loss=loss,
returnhead.create_estimator_spec(
features=features,
labels=labels,
mode=mode,
logits=logits,
train_op_fn=_train_op_fn)
模型輸出:
initializer=tf.random_uniform([vocab_size,embedding_size],-1.0,1.0))
params={"embedding_initializer":initializer}
params=params)
train\_and\_evaluate(cnn_classifier)
通過以上,我們可以預測我們的測試結果,接下來的章節,我們會繼續研究LSTM。
-加入人工智慧學院系統學習-
※人大代呼籲「本土人才」享受「海歸」同等待遇,不應區分對待!
※谷歌CEO:AI時代,每個人都必須學會保持終生學習!
TAG:AI講堂 |