Embedding改进CBOW
假設詞匯量為 100 萬個時的 CBOW 模型如下,輸入層和輸出層存在 100 萬個神經元。
下面兩個問題導致耗時嚴重。
問題一、輸入層的 one-hot 表示和權重矩陣的乘積。one-hot 表示占用內存過多,計算 one-hot 表示與權重矩陣 的乘積,需要花費大量時間。
問題二、中間層和權重矩陣的乘積以及 Softmax 層的計算。需要大量的計算,花費大量時間。
解決問題一:
計算one-hot 表示矩陣和權重矩陣的乘積,其實就是將權重矩陣的某個特定的行取出來。如下圖所示。
Embedding 層:一個從權重矩陣中抽取單詞ID對應行(向量)的層。
使用 params 和 grads 作為成員變量,params中保存要學習的參數,grads中保存梯度。并在成員變量 idx 中以數組的形式保存需要提取的行的索引(單詞ID)。
正向傳播:從權重矩陣W中提取特定的行,并將特定行的神經元原樣傳給下一層。
反向傳播:上一層(輸出側的層)傳過來的梯度將原樣傳給下一層(輸入側的層)。上一層傳來的梯度會被應用到權重梯度dW的特定行(idx)。
反向傳播里面,將梯度累加到對應索引上,用于處理idx 中出現了重復的索引的情況。dW[…] = 0的目的是保持dW的形狀不變,將它的元素設為0。
將原來CBOW模型中輸入側的 MatMul 層換成 Embedding 層,減少內存使用量,避免不必要的矩陣計算。
class Embedding:def __init__(self, W):self.params = [W]self.grads = [np.zeros_like(W)]self.idx = Nonedef forward(self, idx):W, = self.paramsself.idx = idxout = W[idx]return outdef backward(self, dout):dW, = self.gradsdW[...] = 0if GPU:np.scatter_add(dW, self.idx, dout)else:np.add.at(dW, self.idx, dout)return None 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Embedding改进CBOW的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常量缓存与integer比较_Integ
- 下一篇: 两数的和与差的简单函数