一、CBOW模型圖
CBOW模型是一種基於神經網路的詞向量表示學習方法。CBOW模型的結構如下圖所示:
<svg width="550" height="200">
<rect x="10" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="130" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="250" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="370" y="10" width="100" height="30" fill="#c7fffa" />
<rect x="490" y="10" width="50" height="30" fill="#c7fffa" />
<rect x="10" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="130" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="250" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="370" y="70" width="100" height="30" fill="#c7fffa" />
<rect x="490" y="70" width="50" height="30" fill="#c7fffa" />
<line x1="60" y1="40" x2="130" y2="40" stroke="black" stroke-width="1" />
<line x1="180" y1="40" x2="250" y2="40" stroke="black" stroke-width="1" />
<line x1="300" y1="40" x2="370" y2="40" stroke="black" stroke-width="1" />
<line x1="420" y1="40" x2="490" y2="40" stroke="black" stroke-width="1" />
<polyline points="25,80 90,80 90,100 60,100 60,110 90,110 90,130 25,130" fill="#c7fffa" />
<polyline points="145,80 210,80 210,100 180,100 180,110 210,110 210,130 145,130" fill="#c7fffa" />
<polyline points="265,80 330,80 330,100 300,100 300,110 330,110 330,130 265,130" fill="#c7fffa" />
<polyline points="385,80 450,80 450,100 420,100 420,110 450,110 450,130 385,130" fill="#c7fffa" />
<line x1="515" y1="80" x2="540" y2="80" stroke="black" stroke-width="1" />
<line x1="515" y1="95" x2="540" y2="95" stroke="black" stroke-width="1" />
<line x1="515" y1="110" x2="540" y2="110" stroke="black" stroke-width="1" />
<line x1="515" y1="125" x2="540" y2="125" stroke="black" stroke-width="1" />
<text x="45" y="25">w(t-2)</text>
<text x="165" y="25">w(t-1)</text>
<text x="285" y="25">w(t+1)</text>
<text x="405" y="25">w(t+2)</text>
<text x="525" y="25">w(t)</text>
<text x="57" y="103">w(t-2)</text>
<text x="177" y="103">w(t-1)</text>
<text x="297" y="103">w(t+1)</text>
<text x="417" y="103">w(t+2)</text>
<text x="527" y="103">→</text>
<text x="150" y="160">Embedding Layer</text>
<text x="320" y="160">Sum Layer</text>
<text x="510" y="160">Softmax Layer</text>
</svg>
CBOW模型的輸入是一個固定大小的窗口,將上下文中的詞表示成向量,向量之間進行加和或者平均操作,其輸出則是中心詞的概率分布。模型的學習目標是最大化訓練數據中每個樣本中間詞對應的概率。
二、CBOW模型公式
CBOW模型可以表示成以下的式子:
p(w_t | w_{t-2}, w_{t-1}, w_{t+1}, w_{t+2}) = softmax\left(\frac{1}{C}\sum_{-C\le j \le C,j\ne 0}\textbf{v}_{t+j}\right)
其中,$w_t$表示中心詞,$\textbf{v}_{t}$表示第$t$個詞的詞向量,$C$表示上下文窗口大小,$softmax(x_i)=\frac{e^{x_i}}{\sum_{j}e^{x_j}}$是softmax函數。
三、CBOW模型詳解
1. 輸入層
輸入層將上下文中的每個詞對應的詞向量相加或者平均,然後送入下一層。
2. Embedding層
該層是一個映射層,將每個輸入的詞向量映射到一個低維的空間中,這個空間是可以通過訓練來優化的。該層的參數是每個詞的詞向量表示,是模型需要學習的目標之一。
3. Sum層
該層將每個詞的Embedding向量進行累加(或者平均),然後輸出中心詞的向量表示。
4. Softmax層
該層接收Sum層的輸出,將其映射為一個概率分布,分布的每個元素表示中心詞為該元素對應的單詞的概率。
四、CBOW模型訓練詞向量的過程
CBOW模型和skip-gram模型都是基於神經網路的詞向量表示學習方法,其中訓練詞向量的過程是一樣的。以CBOW模型為例,訓練的流程如下:
1. 數據準備
準備好原始的文本數據,然後將其轉化為辭彙表並統計詞頻。在CBOW模型中,需要一個固定大小的窗口,即上下文的詞數(一般設置為3-5),然後將這個窗口作為一個樣本。
2. 初始化參數
首先,要將訓練數據中的每個詞映射到一個低維空間中,使得該空間中的向量可以表示這些詞的語義含義。這樣做的一個目的是在低維空間中保留語義上的相似性。通常來說,這個低維空間的維度在幾百到幾千之間,這個維度也稱為向量的長度或者特徵數。初始參數可以隨機生成。
3. 迭代訓練
CBOW模型的訓練過程是迭代的,對於每個樣本,模型將預測中心詞的概率最大化。這個最大化的過程可以用最小化negative log likelihood來實現:
-log p(w_c|w_o) = -log \frac{e^{u_c^T v_o}}{\sum_{w\in vocab} e^{u_w^T v_o}} = - u_c^T v_o + log \sum_{w \in vocab}e^{u_w^T v_o}
其中,$u_c$表示中心詞,$v_o$表示上下文中的一個詞,$vocab$表示整個辭彙表。通過梯度下降法來最小化negative log likelihood,同時更新參數。
五、CBOW模型和skipgram的區別
兩者的區別在於輸入和輸出的不同。在CBOW模型中,輸入是上下文中的多個詞,輸出是中心詞的概率分布。而skipgram模型中,輸入是中心詞,輸出是上下文中多個詞的概率分布。因此,兩者是對稱的。
另外,CBOW模型的訓練速度比skipgram快,但在大型語料庫上表現可能會略遜於skipgram模型。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259282.html