CBOW模型正向传播、矩阵乘积层实现
生活随笔
收集整理的這篇文章主要介紹了
CBOW模型正向传播、矩阵乘积层实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
把矩陣乘積稱為MatMul節(jié)點:
下面這個圖表示矩陣乘積y=xW的計算圖 。因為考慮了mini-batch 處理,假設x中保存了N個數(shù)據(jù)。此時x 、W、y 的形狀分別是 N×D、D×H 、N×H 。
下面是推反向傳播的數(shù)學式:
用代碼表述MatMul層:params 中保存要學習的參數(shù),梯度保存在 grads 中。
下面這句話是設置梯度的值,使用省略號可以固定 NumPy 數(shù)組的內(nèi)存地址,覆蓋 NumPy 數(shù)組的元素。a=b 和 a[…]=b 的區(qū)別:使用省略號時數(shù)據(jù)被覆蓋,變量a指向的內(nèi)存地址不變,在 a = b 的情況下,a 指向的內(nèi)存地址轉(zhuǎn)到和b一樣了。
self.grads[0][...] = dW class MatMul:def __init__(self, W):self.params = [W]#w就是權(quán)重矩陣self.grads = [np.zeros_like(W)]#構(gòu)造一個和W矩陣維度一致,但是全為0的矩陣。self.x = Nonedef forward(self, x):W, = self.paramsout = np.dot(x, W)#矩陣x和矩陣w相乘self.x = xreturn outdef backward(self, dout):W, = self.paramsdx = np.dot(dout, W.T)#dout是上游傳來的;W.T是把W轉(zhuǎn)置了dW = np.dot(self.x.T, dout)self.grads[0][...] = dWreturn dxCBOW 模型一開始有兩個 MatMul 層,這兩個層的輸出被加在一起。然后,對這個相加后得到的值乘以 0.5 求平均,可以得到中間層的神經(jīng)元。最后,將另一個 MatMul 層應用于中間層的神經(jīng)元,輸出得分。
MatMul 層的正向傳播其實也就是求矩陣乘積。
CBOW 模型網(wǎng)絡結(jié)構(gòu):
python實現(xiàn) CBOW 模型的推理:這里面輸入側(cè)的 MatMul 層共享權(quán)重 W_in。
import sys sys.path.append('..') import numpy as np from common.layers import MatMul# 樣本的上下文數(shù)據(jù) c0 = np.array([[1, 0, 0, 0, 0, 0, 0]]) c1 = np.array([[0, 0, 1, 0, 0, 0, 0]])# 初始化權(quán)重 W_in = np.random.randn(7, 3) W_out = np.random.randn(3, 7)# 生成層 in_layer0 = MatMul(W_in) in_layer1 = MatMul(W_in) out_layer = MatMul(W_out)# 正向傳播 h0 = in_layer0.forward(c0) h1 = in_layer1.forward(c1) h = 0.5 * (h0 + h1) s = out_layer.forward(h) print(s)輸出:
[[-0.78101945 -0.63278993 0.62227128 1.97029862 0.51288306 -0.481098630.6403517 ]]總結(jié)
以上是生活随笔為你收集整理的CBOW模型正向传播、矩阵乘积层实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝塔php扩展fil_宝塔面板安装Red
- 下一篇: Java 使用反射处理注解