二分类改进CBOW
解決問題二:中間層的神經(jīng)元和權重矩陣的乘積、Softmax 層的計算需要花費很多計算時間
第k個單詞的 Softmax 的計算式如下,其中Si是第i個單詞的得分。這個計算也與詞匯量成正比,所以需要一個替代Softmax的計算。
使用 Negative Sampling (負采樣) 替代 Softmax。也就是用二分類擬合多分類。
多分類問題:從100萬個單詞中選擇1個正確單詞。
二分類問題:處理答案為是或否的問題,比如目標詞是 say 嗎。
讓神經(jīng)網(wǎng)絡來回答:當上下文是 you 和 goodbye 時,目標詞是 say 嗎?
這時輸出層只需要一個神經(jīng)元,神經(jīng)元輸出的是 say 的得分。
僅計算目標詞得分的神經(jīng)網(wǎng)絡如下。
上面這個圖,中間層是one-hot 表示矩陣和權重矩陣的乘積,也就是權重矩陣的某個特定行。
當輸出側神經(jīng)元只有一個的時候,計算中間層和輸出側的權重矩陣的乘積,只需要提取輸出側權重矩陣的某一列(目標詞所在的列),將提取的這一列與中間層進行內積計算。示意圖如下圖。
輸出側的權重矩陣中保存了各個單詞ID對應的單詞向量,提取目標詞的單詞向量,再求這個向量和中間層神經(jīng)元 的內積,就是最終的得分。
多分類:輸出層使用Softmax函數(shù)將得分轉化為概率,損失函數(shù)使用交叉熵誤差。
二分類:輸出層使用sigmoid函數(shù)將得分轉化為概率,損失函數(shù)使用交叉熵誤差。
sigmoid 函數(shù)的輸出可以解釋為概率。
通過sigmoid函數(shù)得到概率后,可以由概率計算損失。
多分類交叉熵誤差數(shù)學表達:yk是神經(jīng)網(wǎng)絡的輸出,tk是正確解標簽,k表示數(shù)據(jù)的維數(shù)。如果標簽為one-hot表示,即tk中只有正確解標簽索引為1,其他均為0 。那么式子只計算對應正確解標簽的輸出的自然對數(shù)。
二分類的交叉熵誤差數(shù)學表達式:
y是sigmoid函數(shù)的輸出(神經(jīng)網(wǎng)絡判斷的目標詞是say的得分),t是正確解標簽,t取值為1或0。t=1,輸出-tlogy,求目標詞是say情況下的損失。t=0,求目標詞不是say情況下的損失。這個式子和多分類的其實是一回事:式子只計算對應標簽的輸出的自然對數(shù)。
Sigmoid層和Cross Entropy Error層的計算圖如下。y是神經(jīng)網(wǎng)絡輸出的概率,t是正確解標簽。y-t相當于誤差。誤差向前面的層傳播。誤差大時,模型學習得多(參數(shù)的更新力度增大)。
舉個例子,t=1,y接近1,誤差就小。
正確解標簽是1是什么意思,其實就是:正確答案就是這個詞,神經(jīng)網(wǎng)絡輸出的概率越接近于1,表示預測的越準確。
二分類的CBOW模型:向Sigmoid with Loss 層輸入正確解標簽1,表示現(xiàn)在正在處理的問題的答案是Yes。當答案是No時,向 Sigmoid with Loss 層輸入0。
Embedding Dot 層合并Embedding 層和 dot 運算(內積運算):
Embedding Dot 層實現(xiàn)代碼如下:
成員變量:params保存參數(shù),grads保存梯度。embed保存Embedding層,cache保存正向傳播時的計算結果。
正向傳播:參數(shù)接收中間層的神經(jīng)元h,單詞ID列表(idx)。首先調用Embedding層的forward(idx)方法,然后通過下面這種方式計算內積。
上面的例子,單詞列表有3個數(shù),表示mini-batch一并處理3個數(shù)據(jù)。
反向傳播:乘法節(jié)點需要將上游傳過來的導數(shù)dout乘正向傳播的翻轉值,然后傳給下游。
class EmbeddingDot:def __init__(self, W):self.embed = Embedding(W)self.params = self.embed.paramsself.grads = self.embed.gradsself.cache = Nonedef forward(self, h, idx):target_W = self.embed.forward(idx)out = np.sum(target_W * h, axis=1)self.cache = (h, target_W)return outdef backward(self, dout):h, target_W = self.cachedout = dout.reshape(dout.shape[0], 1)dtarget_W = dout * hself.embed.backward(dtarget_W)dh = dout * target_Wreturn dh目前,只是對正例say進行了二分類,如果此時模型有好的權重,則Sigmoid層的輸出概率將接近1。
真正要做的事是,對于正例say,使Sigmoid層的輸出接近1;對于負例(say 以外的單詞),使Sigmoid層的輸出接近0。
權重需要滿足:當輸入say時使Sigmoid層的輸出接近1,當輸入say以外的單詞時使輸出接近0。如下圖,當上下文是 you和goodbye時,目標詞是hello(錯誤答案)的概率要比較低。
總結
- 上一篇: 腐蚀国内稳定服务器_工控机箱和服务器机箱
- 下一篇: 定位系统服务器,android系统定位服