fasttext原理、実戦と調整経験の共有

5442 ワード

fasttext理論知識・参考文献○https://heleifz.github.io/14732610572844.html•fasttext公式ドキュメントでは、すでに訓練されている語ベクトルがたくさんあります.•embeddingは、fasttextがタスクを分類する際に発生する副産物です.fasttestの主な考え方○(1)文字レベルのn-gram word 2 vecは、コーパス内の単語を原子とし、単語ごとにベクトルを生成します.これは、「apple」と「apples」、「達観データ」と「達観」のような単語の内部形態の特徴を無視し、この2つの例では、2つの単語は共通文字が多く、すなわち内部形態が類似しているが、従来のword 2 vecでは、このような単語の内部形態情報は、異なるidに変換されて失われているためである.この問題を克服するためにfastTextは文字レベルのn-gramsを用いて単語を表す.単語「apple」について、nの値が3であると仮定すると、そのtrigramは
“”
ここで、接尾辞を表します.そこで,これらのtrigramで「apple」という単語を表すことができ,さらに,この5つのtrigramのベクトルを重ねて「apple」の語ベクトルを表すことができる.
これは2つのメリットをもたらします:1.低周波数語で生成される語ベクトルの方が効果的です.n-gramは他の語と共有できるからです.2.トレーニング辞書以外の単語についても、それらの単語ベクトルを構築することができる.それらの文字レベルn-gramベクトルを重畳することができます.
からhttps://blog.csdn.net/u010417185/article/details/80649009
○(2)モデルアーキテクチャは前述したようにfastTextモデルアーキテクチャとword 2 vecのCBOWモデルアーキテクチャが非常に類似している.次はfastTextモデルアーキテクチャ図です.
注:このアーキテクチャ図には、語ベクトルのトレーニング手順は示されていません.CBOWと同様にfastTextモデルも3層のみである:入力層、暗黙層、出力層(Hierarchical Softmax)、入力はいずれも複数のベクトルで表される単語であり、出力はいずれも特定のtargetであり、暗黙層はいずれも複数の語ベクトルに対する重畳平均である.違いは、CBOWの入力はターゲット単語のコンテキストであり、fastTextの入力は複数の単語とそのn-gramの特徴であり、これらの特徴は単一のドキュメントを表すために使用される.CBOWの入力単語はonehotで符号化され、fastTextの入力特徴はembeddingされた.CBOWの出力はターゲット語彙,fastTextの出力は文書に対応するクラスタグである.
fastTextは入力時に単語の文字レベルのn-gramベクトルを追加の特徴とすることに注目すべきである.出力時にfastTextは階層型Softmaxを採用し,モデルトレーニング時間を大幅に低減した.この二つの知識点は前文ですでに述べたが,ここではこれ以上述べない.
からhttps://blog.csdn.net/u010417185/article/details/80649009
○3)コア思想は現在、あまり好まれていない公式の導きを捨てて、fastTextテキスト分類のコア思想とは何かを考えてみましょう.
モデルの後半、すなわち隠しレイヤから出力レイヤへの出力をよく観察すると、softmax線形多カテゴリ分類器であり、分類器の入力は現在のドキュメントを特徴付けるベクトルであることがわかります.モデルの前半、すなわち入力レイヤから暗黙レイヤ出力セクションに入力し、主にドキュメントをキャラクタリゼーションするためのベクトルを生成します.どうやって作ったのでしょうか?このドキュメントを構成するすべての語とn-gramの語ベクトルを重ねて平均します.重ね合わせ語ベクトルの背後にある思想は伝統的な語袋法であり,文書を語からなる集合と見なす.
そこでfastTextの核心思想は,文書全体の語とn-gramベクトルを重ねて平均して文書ベクトルを得,文書ベクトルを用いてsoftmax多分類を行うことである.これは,文字レベルn-gramの特徴の導入と階層化Softmax分類の2つのテクニックに関連する.
からhttps://blog.csdn.net/u010417185/article/details/80649009
○(4)分類効果についてもう一つ問題があるが,なぜfastTextの分類効果は従来の非線形分類器に負けないことが多いのか.
私たちは2つのテキストを持っています.私は達観データに来ました.私は達観情報科学技術に行きました.
この2つのテキストの意味はほとんど同じで、分類するには、必ず同じクラスに分けなければなりません.しかし、従来の分類器では、この2つのテキストを特徴付けるためのベクトルの差が非常に大きい可能性があります.従来のテキスト分類では、tfidf値などの各語の重みを計算する必要があります.「私」と「私」が算出したtfidf値の差が大きい可能性があります.他の語は似ています.そこで、VSM(ベクトル空間モデル)でこの2つのテキストを特徴付けるテキストベクトルの差が大きい可能性があります.しかしfastTextは異なり、単語のembeddingを重ねて得られるドキュメントベクトルであり、単語ベクトルの重要な特徴は、ベクトルの距離が単語間の意味の類似度を測定するために使用できることであり、fastTextモデルでは、この2つのテキストのベクトルは非常に類似しているはずであり、したがって、それらは大きな確率で同じクラスに分けられる.
単語自体ではなくembeddingを特徴として使用することはfastTextの効果が良い原因の一つである.もう1つの理由は,文字レベルn-gramの特徴の導入が分類効果を向上させることである.
からhttps://blog.csdn.net/u010417185/article/details/80649009•fasttext主要手順○各単語の単語位置○各ドキュメントの単語の位置ベクトルを取得し、1つのドキュメントを1つのベクトルとして表す[10,30,80,1000]は、「私は昨日達観データに来ました」という短いテキストを表す可能性があり、そのうち「私」、「昨日」、「来ました」、「達観データ」の語彙表のインデックスはそれぞれ10、30、80、1000である.(通常はn-gram処理も追加すべき)○ドキュメント内の単語ごとにembedding処理を行う○複数の単語ベクトルの重畳平均により、1つのドキュメントが1つの単語ベクトルになる
からhttps://blog.csdn.net/u010417185/article/details/80649009○単一ドキュメントで合成されたワードベクトルをsoftmax多分類•fasttextとword 2 vecの区別○Word 2 vecは1つのワードのコンテキストのすべてのワードベクトルの和を用いてワード自体(CBOWモデル)を予測し、fasttextは短いテキストのワードベクトルの和を用いてテキストを分類するように変更した.
からhttps://heleifz.github.io/14732610572844.html○fastTextのembeddingはsupervised方式でテキスト分類器を訓練し、同時にembeddingを学習すると、このembeddingの学習過程には監督があり、word 2 vecなどの監督のないモデルとは一定の違いがある.2つ目はfastTextがn-gram(ここのn-gramは実はchar-n-gramとword-n-gramの2種類があり、展開しないで、本当に興味があればソースコードを読むことができます)のembeddingを勉強し、語順情報をある程度捉えることができます.スペースを節約するためにfastTextは,原作者の実装ではn-gramごとに個別のembeddingを学習するのではなく,まずn-gramをhashし,hashを同じ位置に持つ複数のn-gramは1つのembeddingを共有する.
からhttps://zhuanlan.zhihu.com/p/32965521○モデルの出力層:word 2 vecの出力層は、termごとに対応し、あるtermを計算する確率が最も大きい.fasttextの出力層は分類されたlabelに対応する.しかし、出力層がどんな内容に対応しているかにかかわらず、対応するvectorは保持され、使用されません.○モデルの入力層:word 2 vecの出力層は、context window内のtermである.fasttextに対応するsentence全体の内容はtermも含まれ、n-gramの内容も含まれている.
○両者の本質の違いは、h-softmaxの使用に現れる.Wordvecの目的は,最終的には入力層で得られ,出力層に対応するh−softmaxも一連のベクトルを生成するが,最終的には捨てられ,使用されない語ベクトルを得ることである.fasttextはh-softmaxの分類機能を十分に利用し,分類ツリーのすべての葉ノードを遍歴し,確率最大のlabel(1つまたはN個)を見つけた.
fasttext実戦gensimのfasttextチュートリアルfasttext JAVAバージョンAPI•githubで探したfasttextの再訓練の方法○c+:./fasttext [supervised | skipgram | cbow] -input train.data -inputModel trained.model.bin -output re-trained [other options] -incr
からhttps://github.com/facebookresearch/fastText/pull/423
	-incr stands for incremental training.
	
	When training word embedding, one could do 
	it from scratch with all data at each time, 
	or just on the new data. For classification, 
	one could train it from scratch with pre-trained 
	word embedding with all data, or only the new one, 
	with no changing of the word embedding.
	
	Incremental training actually means, having finished 
	training model with data we got before, and retrain 
	the model with newer data we get, not from scratch.
	• python
	
	import fastText as ft
	
	# train the model with the first document:
	model = ft.train_unsupervised(
	    input="my-first-document.txt",
	    ...
	    incr=False
	    inputModel=""
	)
	
	# save the model:
	model.save_model("my-model.bin")
	
	# then, later... update the model with the new documents:
	model = ft.train_unsupervised(
	    input="my-second-document.txt",
	    ...
	    incr=True
	    inputModel="my-model.bin"
	)
	
	# and save the model over the previous:
	model.save_model("my-model.bin")