NLPでデータを単語の埋め込みに変換するタイミング
単語の埋め込みを使用してネットワークをトレーニングする場合、最初に入力ベクトルを埋め込みに変換するために埋め込みレイヤーを追加するのが標準です。
ただし、埋め込みが事前にトレーニングされて凍結されていると仮定すると、別のオプションがあります。モデルにデータを渡す前にトレーニングデータを前処理するだけで、埋め込みに変換されます。これにより、各エポックのオンザフライではなく、この変換を1回だけ実行する必要があるため、トレーニングがスピードアップします。
したがって、2番目のオプションの方が優れているようです。しかし、最初の選択はより一般的なようです。埋め込みが事前にトレーニングされて凍結されていると仮定すると、2番目のオプションよりも最初のオプションを選択する理由はありますか?
回答
トレーニング中に大量のデータを移動する必要がある場合(ディスク/ネットワーク/何を持っているかなど)、ランクとしてよりも[バッチ、ドキュメント、インデックス]のランク3テンソルとして移動する方がはるかに高速です。 -[バッチ、ドキュメント、インデックス、ベクトル]の4テンソル。この場合、埋め込みはどこに置いてもO(1)ですが、グラフの一部として行う方が効率的です。
コーパスから単語の埋め込みを取得する方法は複数あります。
- カウントベクトライザー:コーパスが文のリストに変換されている場合は、
CountVectorizer()
fromsklearn.feature_extraction.text
を使用してからfit_transform()
ifを使用できます - TF-IDF Vectorizer:
TfidfVectorizer
fromsklearn.feature_extraction.text
を使用してから、fit_transform()
文のリストで再びonを使用できます。 - word2vec:を使用して
word2vec
からモデルを作成できます。gensim.models
word2vec.Word2vec
モデルが作成する単語の辞書が、事前にトレーニングされた埋め込みのサブセットであると仮定すると、たとえば、Googleの事前にトレーニングされたword2vecの場合、モデルがそのサイズのディメンションを処理できるのであれば、これらの埋め込みに続くより良いオプションかもしれません。 。
ただし、問題の性質を考慮すると、それが常に最善の解決策であるとは限りません。たとえば、まれで特別な単語を含む医療テキストでNLPを使用しようとしている場合、適切なデータサイズ、またはその両方があると想定して、埋め込みレイヤーを使用する必要があります。それは私の考えです。確かに、埋め込み層を提案する必要がある他のいくつかのユースケースが存在する可能性があります。