NLP自然言語処理理論解説(単語分散表現、共起行列、word2vec、CBOWモデル詳細解説)

自然言語処理: コンピューターが人間の言語を理解できるようにする技術。言い換えれば、自然言語処理の目標は、コンピューターが人間の言ったことや言葉の意味を理解できるようにすることです。コンピューターが言語を理解するには、まず人間が理解する必要があります

私たちの言葉には、1. シソーラスベースの方法、2. カウントベースの方法、3. 推論ベースの方法 (word2vec) の 3 つの方法があります。

単語の分散表現

色の表現はR、G、Bであり、その三原色の数が正確に表現されていることは誰もが知っていますが、色を表す三次元ベクトルの数と同じ数の色が何色あるのか、というベクトル表現方法は、単語表現には類似した色が使用され単語の分散表現です。

分散仮説

単語の分散表現を構築するにはどうすればよいですか?
方法: 分散仮定。単語の意味は周囲の単語によって形成され、単語自体には意味はなく、前後の文脈、つまり単語の左側と右側の単語によって生成されます。

共起行列


分散仮説では単語をベクトルで表現しており、対象単語の周囲の単語の出現数を直接カウントし、全単語の共起単語を表にまとめる数え上げ手法をベースとしています。このテーブルの各行は、対応する単語のベクトルに対応します。表は行列の形式になっているので、共起行列と呼ばれます。
ここに画像の説明を挿入
ここに画像の説明を挿入

ニューラル ネットワークの予測方法

ニューラル ネットワークによるテキスト推論。通常は小さなテキスト バッチを通じてテキストを学習し、重みを繰り返し更新するため、大きなテキスト データを処理できるという利点があります。

推論ベースの手法の概要

周囲の単語 (文脈情報) を考慮して、真ん中の単語にどの単語が現れるかを予測する、これが
ここに画像の説明を挿入
ここに画像の説明を挿入
推論です。文脈情報を入力すると、モデルは各単語の確率を出力します。これが、分散仮説が
計数法よりも優れている理由です。重要なのは、小さなバッチでフィードできることです モデルのトレーニング、
推論ベースのアプローチ モデルを導入し、このモデルにニューラル ネットワークを使用します。このモデルはコンテキスト情報を入力として受け取り、それぞれの頻度 (発生の可能性) を出力します。このようなフレームワークでは、コーパスを使用してモデルが正しく予測できるようにモデルを学習します。モデルの結果として、推論ベースの手法の全体像である単語の分散表現が得られます。
分散した仮想的な単語の共起をモデル化するにはどうすればよいですか?

ニューラル ネットワークにおける文書処理

ニューラル ネットワークを使用して単語を処理しますが、ニューラル ネットワークは「you」や「say」などの単語を直接処理することはできません。ニューラル ネットワークを使用して単語を処理するには、まず単語を固定長のベクトルに変換します。このための 1 つの方法は、単語を 1 つのベクトルに変換することです。ベクトルで単語を
ここに画像の説明を挿入
表現するには、数えることに基づく方法と推論に基づく方法の大きく 2 つがあります。 2 つは分散仮定です

word2vec

word2vec という用語は、もともとプログラムまたはツールを指すために使用されていましたが、この言葉が普及するにつれて、一部の文脈ではニューラル ネットワーク モデルも指すようになりました。正しくは、CBOW モデルとスキップグラム モデルは、word2vec で使用される 2 つのニューラル ネットワークです。主に CBOW モデルについて説明します。この2モデルの違いについてですが、

CBOW モデル連続バッグオブワード (CBOW)

CBOW モデルは、文脈に応じてターゲット単語を予測するニューラル ネットワークです (ターゲット単語は中央の単語、そのコンテキストは周囲の単語です)。できるだけ正確に予測できるように CBOW モデルをトレーニングします。 CBOW
モデルの入力はコンテキストです。このコンテキストは、 ['you', 'goodbye'] のような単語のリストで表されます。CBOW モデルが処理できるように、これをワンホット表現に変換します。これに基づいて、CBOW モデルのネットワークは
ここに画像の説明を挿入
CBOW モデルのネットワーク構造として描くことができます。これには 2 つの入力層があり、中間層に到達し、その後出力層に渡ります。入力層から中間層への変換は、層は同じ全結合層 (重みは Win ) によって実行され、中間層から出力層ニューロンへの変換は別の全結合層 (重み Wout ) によって実行されます。
ここではコンテキストとして 2 つの単語のみを考慮するため、出力層には 2 つの単語が存在し、コンテキストとして N 個の単語が考慮される場合、入力層には N 個の単語が存在します。中間層のニューロンは、全結合層で変換後の各入力層の平均値です 上記の例では、全結合層の変換後、最初の出力は h1 に変換され、2 番目の出力は h1 に変換されます層は h2 に変換されます。すると、中間層のニューロンは 1/2 (h1+h2) になります。この出力層には 7 つのニューロンがあります。ここで最も重要なことは、これらのニューロンが各単語に対応しているということです。出力層のニューロンは、各層のスコア 単語数が多いほど、対応する単語の頻度が高いほど、対応する単語の出現頻度が高くなります スコアとは、確率として解釈される前の値を指します これらのスコアにソフトマックス関数を適用すると、確率を取得します。スコアがソフトマックス層を通過した後のニューロンは、出力層と呼ばれることもあります。ここでは、スコアを出力するノードを出力層と呼びます。入力層から中間層への変換は
、全結合層 このとき、全結合層の重み w は 7*3 の行列になります この重み行列が我々が望むものです 単語の分散表現、重みの各行は各単語の分散表現に対応し
ます
学習を繰り返すことにより、各単語の分散表現が継続的に更新され、文脈から出現する単語を正確に予測し、得られたベクトルが単語の意味をよくエンコードします。これが word2vec です。中央のニューロンの数層は入力よりも上位です 層が少ないことが重要です 中間層は、予測された単語に必要な情報を圧縮して保存する必要があります。これにより、パズルのベクトル表現が生成されます。 このとき、中間層は、中間層の情報から目的の結果を得る処理を、人間が理解できないコードに戻す作業を「デコード」といい、暗号化された情報を人間が理解できる形に復元します。

いわゆるモデルベクトル化プロセス。テキストがネットワークの中間層に渡された後、密なベクトル表現が出力されます。

ここに画像の説明を挿入
図に示すように、モデルの 2 つの層の出力結果を加算し、その加算値に 0.5 を乗じて平均すると、中間層のニューロンが得られ、別の層に適用されます。中間層のニューロン 出力スコアは、
ここに画像の説明を挿入
上の図に示すように、コンテキストは「you」と「goodbay」です。この時点でニューロンによって正しく予測された単語は、ニューロンの重みが適切であれば、ニューロンは次のようになります。確率は正しい解に対応します ニューロンのスコアはより高いはずです cbow
モデルの学習は、正しい予測を行うために重みを調整することです 結果は win と wout であり、単語の出現パターンのベクトルはCBOWとskip-gramは単語の分散表現を取得 CBOWモデル コーパス内の単語のパターンを学習 同じ単語でもコーパスが異なれば単語の分散表現は大きく異なるさまざまな予測の下で. 次に, ニューラル ネットワークの学習について理解します. ここではマルチカテゴリ ニューラル ネットワークを実行するモデルを扱っています
, 学習するにはソフトマックス関数とクロスエントロピー誤差を使用するだけです. まず, ソフトマックス関数は次のように変換しますスコアを確率に変換し、これらの確率と教師付きラベルの間のクロスエントロピー誤差を求め、それを損失として使用します。学習はネットワークの前方伝播に対応します。
ここに画像の説明を挿入

word2vec の重みと分散表現

woed2vec で使用されるネットワークには、入力側の全結合層 Win と出力側の Wout の 2 つの重みがあります。一般的に、入力層の重みの各行は各単語の分散表現に対応し、出力側の重みは、単語の意味をエンコードする A ベクトルも保存します。
ここに画像の説明を挿入


入力層と出力側の両方の重みを単語の分散表現とみなすことができるので、どちらを単語の分散表現として使用すればよいでしょうか? A.入力側の重みのみを使用します B. 出力側の重みのみを使用し
ます
C. 入力側と出力側での重みの同時使用
スキーム C で 2 つの重みを同時に使用する方法のほとんどは、単純に 2 つを加算することです。
word2vec に関する限り、最も一般的なのは入力層の重みのみを使用することであり、この考えに従って、Win を単語の分散表現として使用します。

データの準備を学ぶ

1. word2vec におけるニューラルネットワークの入力は文脈と対象単語であり、その正解ラベルは文脈に囲まれた中間単語、つまり対象単語です。 , ニューラルネットワークがコンテキストを入力すると、ターゲットを作成します 単語が出現する確率が高くなります
. 実装ステップは、まずテキストを単語IDに変換し、コーパスが与えられたときにコンテキストとターゲットを返す関数を実装します。

ここに画像の説明を挿入
このようにして、コンテキストとターゲット単語がコーパスから生成され、CBOW モデルに割り当てるだけで済みます。ただし、これらのコンテキストおよびターゲット単語の要素は依然として単語 ID であるため、ワンホット表現に変換する必要があります。


ここに画像の説明を挿入
CBOW ネットワーク構造を表すためにワンホットに変換
ここに画像の説明を挿入

必要なレイヤーを作成していきます。まず、入力側に 2 つの MatMul 層、出力側に 1 つの MatMul 層、および損失を伴う Softmax 層を 1 つ生成します。ここで、入力側でコンテキストを処理するために使用される MatMul レイヤーの数は、コンテキスト内の単語の数と同じです (この場合は 2 つ)。また、同じ重みを使用して MatMul レイヤーを初期化します。
最後に、ニューラル ネットワークで使用される重みパラメーターと勾配を、リスト型のメンバー変数 params と grads にそれぞれ保存します。
次に順伝播を実装します
ここに画像の説明を挿入

スキップグラム モデルは
CBOW の正反対で、スキップグラムは中央の単語からその周囲のより多くの単語を予測します。
ここに画像の説明を挿入

	skip-gram 模型的输入层只有一个,输出层的数量则与上下文的单词个数相等。因此,首先要分别求出各个输出层的损失(通过 Softmax with Loss 层等),然后将它们加起来作为最后的损失。
word2vecを高速化する

前述のCBOWは2つの文脈単語を受け取り、それらに基づいて対象単語を予測しますが、このとき中間層は入力層と入力層側の重みと中間層の重みの行列積で計算されます。中間層側と中間層側を計算する 間の行列積により各単語のスコアを計算する これらのスコアをソフトマックス関数で変換し、各単語の出現確率を求める この確率と正の解ラベルから損失値を計算するただし、語彙サイズが
10,000 要素の場合、one-hot 自体が 10,000 要素分のメモリサイズを占有する必要があり、重み行列を計算する際にも多くの計算リソースを必要とするため、この問題を解決するために埋め込み層を導入しますが、同時に中間層の出力結果もソフトマックスの計算量が増加するため、
これらの計算ボトルネックを解消するために新たな損失関数を導入する必要があります。

埋め込み層

語彙サイズが 100,000 の場合、ワンホット エンコーディングは多くのコンピューティング リソースを必要とするため、図に示すように、重みパラメーター レイヤーから単語 ID に対応する行ベクトルを抽出するレイヤーを作成します。これを埋め込みレイヤーと呼びます。下の図のように、行列の特定の行を取り出すだけです。
ここに画像の説明を挿入
自然言語処理の分野では、単語の密なベクトル表現を単語埋め込み (単語埋め込み) または単語の分散表現 (分散表現) と呼びます。

埋め込み層の実装

行列から特定の行を取り出す処理は非常に簡単に実装できます。行列インデックス付けの方法を使用して、重み W が NumPy の 2 次元配列であると仮定します。この重みから特定の行を取得したい場合は、W[2] または W[5] と書くだけです。

class Embedding:
    def __init__(self, W):
        self.params = [W]
        self.grads = [np.zeros_like(W)]
        self.idx = None

    def forward(self, idx):
        W, = self.params
        self.idx = idx
        out = W[idx]
        return out
    def backward(self, dout):
	    dW, = self.grads
	    dW[...] = 0
	    for i, word_id in enumerate(self.idx):
    	dW[word_id] += dout[i]
		# np.add.at(dW, self.idx, dout)
		return None

Embedding 層の順伝播は、重み行列 W から特定の行を取り出し、その特徴行のニューロンを次の層の入力側に渡すことですが、前の層からの勾配は次の層に渡されます。重み勾配 dw の特定の行に適用する必要がありますが、
それでも多くの計算時間を必要とする箇所が 2 か所あります
。1. 中間層ニューラル ネットワークと重み行列 Product、 2. 中間層ベクトル
のサイズソフトマックス層
は 100、重み行列のサイズは 100*100,000 です。このような巨大な製品は多くの計算時間を必要とします。また、バックプロパゲーションにも同様の時間がかかるため、非常に便利です。行列計算を軽量化するために必要です。
第二に、softmax にも同じ問題が発生します。

ネガティブ サンプリング: 二値分類を使用した複数のクラスの適合

二項分類では、「はい/いいえ」で答えられる質問を扱います。例えば、「これは数字の7ですか?」「これは猫ですか?」「
対象の単語は言いますか?」などの質問は「はい/いいえ」で答えられベクトル、ここでは単語ベクトルを抽出し、このベクトルと中間層のニューロンの内積を求め、これがスコアとなり、シグモイド関数を使用して確率に変換します。ニューラルネットワークがバイナリ分類を処理するには、シグモイドを使用する必要があります 関数はそれを確率に変換します 損失を見つけるために、損失関数としてクロスエントロピー関数を使用します これらはニューラルネットワークバイナリの古いルーチンです分類。多分類ニューラル ネットワークでは、多分類を確率に変換するためにソフトマックスが使用され、損失関数としてもクロス エントロピーが使用されます。次の図は、cbow モデルの 2 分類の全体プロセスを示しています。ニューロンを h として記録し、それを積の単語ベクトルで計算し、最後にその結果を損失関数に入力して損失結果を計算します。
ここに画像の説明を挿入

ここに画像の説明を挿入


ここに画像の説明を挿入

陰性サンプルのサンプリングでは、陽性サンプルの予測確率が限りなく 1 に近いことを望み、陰性サンプルの数が限りなく 0 に近いことも望みますが、陰性サンプルが多すぎるため、いくつかのデータを収集する必要があります。サンプル、これは負のサンプル サンプリングです。
複数のカテゴリの問題を 2 つのカテゴリの問題として扱います。正解 (正の例) と誤った答え (負の例) について、2 つの分類を正しく実行する必要があります。 2 つの分類を学習する必要があるでしょうか? 答えはもちろんノーです。多数の否定例が選択されます。つまり、
否定サンプルは対象単語としての肯定例の欠落を見つけることができるだけでなく、多数の負の例をサンプリングし、これらの負の例の損失を計算し、これらのデータの損失を合計し、その結果を最終的な損失として計算します。

おすすめ

転載: blog.csdn.net/dream_home8407/article/details/129694569