class EmbeddingDot:
    def __init__(self, W):
        self.embed = Embedding(W)
        self.params = self.embed.params
        self.grads = self.embed.grads
        self.cache = None

    def forward(self, h, idx):
        target_W = self.embed.forward(idx)  # (N, H) = (指定した単語ID数, 内部の重みの次元)
        out = np.sum(target_W * h,
                     axis=1)  # (N, H) * (N, H) -> (N, H) -> (N, 1)
        self.cache = (h, target_W)
        return out

    def backward(self, dout):
        h, target_W = self.cache

        dout = dout.reshape(dout.shape[0], 1)

        # target_Wの勾配
        dtarget_W = dout * h
        self.embed.backward(dtarget_W)

        # 下流に伝搬させる勾配
        dh = dout * target_W
        return dh
Esempio n. 2
0
    def forward(self, xs):
        N, T = xs.shape
        V, D = self.W.shape

        out = np.empty((N, T, D), dtype='f')
        self.layers = []

        for t in range(T):
            layer = Embedding(self.W)
            out[:, t, :] = layer.forward(xs[:, t])
            self.layers.append(layer)

        return out
Esempio n. 3
0
    def forward(self, xs):
        N, T = xs.shape  # バッチサイズ、T個の時系列データ
        _, D = self.W.shape  # vocab_size, wordvec_size

        out = np.empty((N, T, D), dtype='f')
        self.layers = []

        for t in range(T):
            layer = Embedding(self.W)
            out[:, t, :] = layer.forward(xs[:, t])
            self.layers.append(layer)

        return out
Esempio n. 4
0
    def forward(self, xs):
        N, T = xs.shape  # hoho_todo, 如何传xs参数?(xs没有了D维) || xs的每一行只是文字ID的序列,形状如:[[1, 3, 2], [45, 2, 3], ...]
        V, D = self.W.shape

        out = np.empty((N, T, D), dtype='f')
        self.layers = []

        for t in range(T):
            layer = Embedding(self.W)
            out[:, t, :] = layer.forward(xs[:, t])
            self.layers.append(layer)

        return out
Esempio n. 5
0
class EmbeddingDot:
    def __init__(self, W):
        self.embed = Embedding(W)
        self.params = self.embed.params
        self.grads = self.embed.grads
        self.cache = None

    def forward(self, h, idx):
        target_W = self.embed.forward(idx)
        out = np.sum(target_W * h, axis=1)
        self.cache = (h, target_W)
        return out

    def backward(self, dout):
        h, target_W = self.cache
        dout = dout.reshape(dout.shape[0], 1)
        dtarget_W = dout * h
        self.embed.backward(dtarget_W)
        dh = dout * target_W
        return dh
class EmbeddingDot:
    def __init__(self, W):
        self.embed = Embedding(W)
        self.params = self.embed.params
        self.grads = self.embed.grads
        self.cache = None

    def forward(self, h, idx):
        target_W = self.embed.forward(idx)
        # Wを反転させてないため、複雑な形だが、内積をしたいだけ。
        out = np.sum(target_W * h, axis=1)
        self.cache = (h, target_W)

        return out

    def backward(self, dout):
        h, target_W = self.cache
        # Wを反転させてなかったため、ここで辻褄合わせをしている。
        dout = dout.reshape(dout.shape[0], 1)

        dtarget_W = dout * h
        self.embed.backward(dtarget_W)
        dh = dout * target_W
        return dh
Esempio n. 7
0
class EmbeddingDot:
    # TODO 헷갈리지만 우선 넘어긴다.
    def __init__(self, W):
        self.embed = Embedding(W)
        self.params = self.embed.params
        self.grads = self.embed.grads
        self.cache = None  # forward propagation 시 계산결과를 잠시 유지하기 위한 용도

    def forward(self, h, idx):
        target_W = self.embed.forward(idx)
        out = np.sum(target_W * h, axis=1)  # 내적 계산

        self.cache = (h, target_W)
        return out

    def backward(self, dout):
        h, target_W = self.cache

        dout = dout.reshape(dout.shape[0], 1)

        dtarget_W = dout * h
        self.embed.backward(dtarget_W)  # grads 계산
        dh = dout * target_W
        return dh
Esempio n. 8
0
class EmbeddingDot:
    def __init__(self, W):
        # 총 4개의 인스턴스 변수
        self.embed = Embedding(W)  # Embedding 계층
        self.params = self.embed.params  # 매개변수 저장
        self.grads = self.embed.grads  # 기울기 저장
        self.cache = None  # 순전파 시의 계산 결과를 잠시 유지하기 위해 사용되는 변수

    # 순전파 메서드에서는 은닉층 뉴런과 단어 ID의 넘파이 배열(미니배치)을 받는다.
    def forward(self, h, idx):
        target_W = self.embed.forward(idx)  # embedding 계층의 forward(idx)를 호출하여 idx에 해당하는 행 추출
        out = np.sum(target_W * h, axis=1)  # 내적 계산 이후 행마다 더하여 최종결과 out 반환

        self.cache = (h, target_W)
        return out

    def backward(self, dout):
        h, target_W = self.cache
        dout = dout.reshape(dout.shape[0], 1)

        dtarget_W = dout * h
        self.embed.backward(dtarget_W)
        dh = dout * target_W
        return dh