ホームページ >テクノロジー周辺機器 >AI >単語の継続的な袋(cbow)を理解する
NLPでは、研究されている単語間の関係であるため、セマンティクスが重要です。最も単純でありながら非常に効果的な手順の1つは、単語ベクトルと呼ばれる非常に意味のあるベクトルに単語をマップする単語の連続袋(CBOW)です。 CBOWはWord2Vecフレームワークで使用され、言語の意味的および構文的な意味をキャプチャする単語に基づいて単語を予測します。この記事では、読者はCBOWモデルの動作とその使用方法について学びます。
単語の連続袋(CBOW)は、ニューラルネットワークを使用して単語の埋め込みを決定するときに使用されるモデルでもあり、Tomas MikolovによるWord2VECモデルの一部です。 Cbowは、特定の文で観察する文脈単語に応じて、ターゲットワードを予測しようとします。このようにして、セマンティック関係をキャプチャすることができるため、密接な単語は高次元空間で密接に表されます。
たとえば、 「猫はマットに座っていた」という文で、コンテキストウィンドウのサイズが2の場合、 「sat」のコンテキスト単語は[「the」、「cat」、「on」、「the」です。モデルのタスクは「sat」という単語を予測することです。
CBOWは、コンテキスト単語(たとえば、埋め込みの平均)を集約し、この集計表現を使用してターゲットワードを予測することにより動作します。モデルのアーキテクチャには、コンテキスト単語の入力層、生成を埋め込むための隠されたレイヤー、および確率分布を使用してターゲットワードを予測する出力層が含まれます。
これは、頻繁な単語の処理に適した高速で効率的なモデルであり、テキスト分類、推奨システム、センチメント分析など、セマンティック理解を必要とするタスクに最適です。
CBOWは、単語の語彙全体がベクターにマッピングされる場合の単語埋め込みのコンテキストに従って、最も単純で効率的な手法の1つです。また、このセクションでは、CBOWシステムの動作については、最も基本的なレベルでメソッドを理解する手段として説明し、CBOWメソッドを支える主なアイデアについて議論し、CBOW HIT計算システムのアーキテクチャレイアウトの包括的なガイドを提供します。
CBOWは、コンテキストワードとターゲットワードの2つの重要な概念に依存しています。
CBOWは、コンテキストとターゲットワードの関係を大規模なコーパス間で分析することにより、単語間のセマンティックな関係をキャプチャする埋め込みを生成します。
CBOWの仕組みの内訳は次のとおりです。
コンテキストワードとターゲットワードを、語彙サイズに基づいて1ホットのベクトルに変換します。サイズ5の語彙の場合、「愛」という言葉の1つのホット表現は[0、1、0、0、0]のように見えるかもしれません。
埋め込み層を介して1ホットのエンコードされたコンテキストワードを渡します。このレイヤーは、各単語を密なベクトル表現にマッピングします。通常、語彙サイズよりも低い寸法です。
すべてのコンテキスト単語の埋め込み(たとえば、それらを平均化または合計すること)を集約して、単一のコンテキストベクトルを形成します。
モデルが収束するまで、コーパス内のすべてのコンテキストターゲットペアのプロセスを繰り返します。
単語の連続袋(CBOW)モデルのアーキテクチャは、周囲のコンテキストワードに基づいてターゲットワードを予測するように設計されています。これは、簡単でありながら効果的な構造を備えた浅いニューラルネットワークです。 CBOWアーキテクチャは、次のコンポーネントで構成されています。
入力:
文: 「私は機械学習が大好きです」 、ターゲットワード: 「マシン」 、コンテキストワード: [「私」、「愛」、「学習」] 。
ワンホットエンコーディング:
語彙: [「I」、「愛」、「マシン」、「学習」、「AI」]
埋め込み層:
埋め込み:
集約:
出力層:
入力レイヤー:["i"、 "love"、 "Learning"] - > 1ホットのエンコーディング - >埋め込み層 - >濃い埋め込み - >集約されたコンテキストベクトル - >完全に接続されたレイヤーソフトマックス 出力:予測された単語「マシン」
次に、PythonでCbowモデルをゼロから実装します。
最初のスパイクは、テキストをトークンに変換することです。これは、ターゲットワードを含む単語としてコンテキストを持つコンテキストターゲットペアに生成される単語です。
corpus = "クイックブラウンキツネが怠zyな犬を飛び越えます" corpus = corpus.lower()。split()#トークン化と小文字の変換 #コンテキストウィンドウサイズを定義します c = 2 Context_target_pairs = [] #コンテキストターゲットペアを生成します 範囲のIの場合(C、Len(Corpus)-C): コンテキスト=コーパス[i -c:i]コーパス[i 1:i c 1] ターゲット=コーパス[i] context_target_pairs.append((context、ターゲット)) print( "Context-Targetペア:"、Context_target_pairs)
出力:
コンテキストターゲットペア:[[['The'、 'Quick'、 'Fox'、 'Jumps']、 'Brown')、( 'Quick'、 'Brown'、 'Jumps' '、' over ')、' brown ']、' fox '、' fix '、' over '、' the ']、' jums ') (['ジャンプ'、「オーバー」、「怠zy」、「犬」]、「The ')]]
語彙(一意の単語のセット)を作成し、各単語を一意のインデックスにマッピングし、トレーニング中に効率的な検索に逆も同様です。
#語彙を作成し、各単語をインデックスにマップする vocab = set(corpus) word_to_index = {word:idx for idx、word in enumerate(vocab)}} index_to_word = {idx:word for word、word_to_index.items()}のidx print( "Word to Index Dictionary:"、word_to_index)
出力:
索引辞書への単語:{'Brown':0、 'Dog':1、 'Quick':2、 'Jumps':3、 'Fox':4、 'over':5、 'the':6、 'lazy':7}
ワンホットエンコーディングは、単語形成システムの各単語をベクトルに変換することで機能します。ここでは、単語の指標は「1」です。
def one_hot_encode(word、word_to_index): one_hot = np.zeros(len(word_to_index)) one_hot [word_to_index [word]] = 1 one_hotを返します #「Quick」という単語の使用例 context_one_hot = [one_hot_encode(word、word_to_index)for word in ['the'、 'Quick']]]] print( "" Quick 'の1ホットエンコード: "、context_one_hot [1])
出力:
「クイック」の1ホットエンコード:[0。 0。1。0。0。0。0。0。]
このステップでは、2つのレイヤーを備えた基本的なニューラルネットワークを作成します。1つはワード埋め込み用、もう1つはコンテキストワードに基づいて出力を計算し、コンテキストを平均してネットワークを通過させます。
クラスCBOW: def __init __(self、vocab_size、embedding_dim): #埋め込み層と出力層の重みをランダムに初期化します self.w1 = np.random.randn(vocab_size、embedding_dim) self.w2 = np.random.randn(bedding_dim、vocab_size) def forward(self、context_words): #隠されたレイヤーを計算します(コンテキストワードの平均) h = np.mean(context_words、axis = 0) #出力層(SoftMax確率)を計算する output = np.dot(h、self.w2) 返品出力 def backward(self、context_words、target_word、Learning_rate = 0.01): #フォワードパス h = np.mean(context_words、axis = 0) output = np.dot(h、self.w2) #エラーと勾配を計算します エラー=ターゲット_WORD-出力 self.w2 = learning_rate * np.outer(h、error) self.w1 = learning_rate * np.outer(context_words、エラー) #CBOWオブジェクトの作成例 vocab_size = len(word_to_index) Embedding_dim = 5#5次元の埋め込みを想定しましょう cbow_model = cbow(vocab_size、embedding_dim) #ランダムなコンテキストワードとターゲットを使用する(例として) context_words = [one_hot_encode(word、word_to_index)for word in ['the'、 'Quick'、 'fox'、 'Jumps']]]] context_words = np.array(context_words) context_words = np.mean(context_words、axis = 0)#平均的なコンテキストワード Target_word = one_hot_encode( 'brown'、word_to_index) #cbowモデルを通過します output = cbow_model.forward(context_words) print( "cbowフォワードパスの出力:"、output)
出力:
CBOWフォワードパスの出力:[[-0.20435729 -0.23851241 -0.08105261 -0.14251447 0.20442154 0.14336586 -0.06523201 0.0255063] [-0.0192184 -0.12958821 0.1019369 0.11101922 -0.17773069 -0.02340574 -0.22222151 -0.23863179] [0.21221977 -0.15263454 -0.015248 0.27618767 0.02959409 0.21777961 0.16619577 -0.20560026] [0.05354038 0.06903295 0.0592706 -0.13509918 -0.00439649 0.18007843 0.1611929 0.2449023] [0.01092826 0.19643582 -0.07430934 -0.16443165 -0.01094085 -0.27452367 -0.13747784 0.31185284]]
Tensorflowは、埋め込み層を使用して単語表現と出力用の密な層を学習するニューラルネットワークを定義し、コンテキストワードを使用してターゲットワードを予測することにより、プロセスを簡素化します。
tfとしてtensorflowをインポートします #TensorFlowを使用して、単純なCBOWモデルを定義します クラスcbowmodel(tf.keras.model): def __init __(self、vocab_size、embedding_dim): スーパー(cbowmodel、self).__ init __() self.embeddings = tf.keras.layers.embeding(input_dim = vocab_size、output_dim = embedding_dim) self.output_layer = tf.keras.layers.dense(vocab_size、activation = 'softmax') def call(self、context_words): embedded_context = self.embeddings(context_words) context_avg = tf.reduce_mean(embedded_context、axis = 1) output = self.output_layer(context_avg) 返品出力 #例の使用 Model = cbowModel(vocab_size = 8、embedding_dim = 5) context_input = np.random.randint(0、8、size =(1、4))#ランダムコンテキスト入力 context_input = tf.convert_to_tensor(context_input、dtype = tf.int32) #フォワードパス output = model(context_input) print( "tensorflow cbowモデルの出力:"、output.numpy())
出力:
Tensorflow CBOWモデルの出力:[[0.12362909 0.12616573 0.12758036 0.12601459 0.12477358 0.1237749 0.12319998 0.12486169]]
Gensimは、GensimがテキストのコーパスからWord Embeddingsを訓練するため、Word2vec()関数でCBOWの既製の実装を提供します。
EMENSIMをインポートします gensim.modelsからimport word2vecから #データを準備する(単語のリストのリスト) corpus = [["、" Quick "、" Brown "、" Fox "]、[" Jumps "、" over "、" the "、" lazy "、" dog "]]]]] #CBOWを使用してWord2Vecモデルをトレーニングします Model = word2vec(corpus、vector_size = 5、window = 2、min_count = 1、sg = 0) #単語のベクトル表現を取得します vector = model.wv ['fox'] print( "'fox'のベクトル表現:"、ベクトル)
出力:
「フォックス」のベクトル表現:[-0.06810732 -0.01892803 0.11537147 -0.15043275 -0.07872207]
ここで、単語の継続的な袋の利点を探ります。
CBOWの限界について説明しましょう。
連続した単語(CBOW)モデルは、周囲のコンテキストを活用することにより、単語の埋め込みを生成するための効率的で直感的なアプローチであることが証明されています。 Cbowは、シンプルで効果的なアーキテクチャを通じて、生のテキストと意味のあるベクトル表現の間のギャップを橋渡しし、幅広いNLPアプリケーションを可能にします。 CBOWの作業メカニズム、その強み、および制限を理解することにより、NLPテクニックの進化についてより深い洞察を得ます。生成の埋め込みにおける基本的な役割により、CBOWは高度な言語モデルを探索するための足がかりの石であり続けています。
A:CBOWはコンテキストワードを使用してターゲットワードを予測し、Skip-Gramはターゲットワードを使用してコンテキストワードを予測します。
Q2:Skip-GramよりもCBOWが計算高速なのはなぜですか?A:CBOWは複数のコンテキストワードを同時に処理しますが、スキップグラムは各コンテキスト単語を個別に評価します。
Q3:cbowはまれな単語を効果的に処理できますか?A:いいえ、Skip-Gramは一般に、まれな単語の表現を学習するのに優れています。
Q4:CBOWの埋め込み層の役割は何ですか?A:埋め込み層は、スパースの1つのホットベクトルを密な表現に変換し、単語のセマンティクスをキャプチャします。
Q5:Cbowは今日でも関連していますか?A:はい、Bertのような新しいモデルが存在しますが、CbowはWord Embeddingsの基本的な概念のままです。
以上が単語の継続的な袋(cbow)を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。