def __init__(self, Wx, Wh, b, stateful=False): self.params = [Wx, Wh, b] self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] self.layers = None self.h, self.dh = None, None self.stateful = stateful
def __init__(self, Wx, Wh, b): ''' Parameters ---------- Wx: 入力`x`用の重みパラーメタ(4つ分の重みをまとめる) Wh: 隠れ状態`h`用の重みパラメータ(4つ分の重みをまとめる) b: バイアス(4つ分のバイアスをまとめる) ''' self.params = [Wx, Wh, b] self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] self.cache = None
def backward(self, dh): dhs = np.zeros_like(self.hs) dhs[:, -1, :] = dh dout = self.lstm.backward(dhs) self.embed.backward(dout) return None
def update(self, params, grads): if self.m is None: self.m, self.v = [], [] for param in params: self.m.append(np.zeros_like(param)) self.v.append(np.zeros_like(param)) self.iter += 1 for i in range(len(params)): self.m[i] = self.beta1 * self.m[i] + (1 - self.beta1) * grads[i] self.v[i] = self.beta2 * self.v[i] + (1 - self.beta2) * (grads[i]** 2) m_i_hat = self.m[i] / (1 - self.beta1**self.iter) v_i_hat = self.v[i] / (1 - self.beta2**self.iter) params[i] -= self.lr * m_i_hat / (np.sqrt(v_i_hat) + 1e-8)
def ppmi(C, verbose=False, eps=1e-8): '''PPMI(正の相互情報量)の作成 :param C: 共起行列 :param verbose: 進行状況を出力するかどうか :return: ''' M = np.zeros_like(C, dtype=np.float32) N = np.sum(C) S = np.sum(C, axis=0) total = C.shape[0] * C.shape[1] cnt = 0 for i in range(C.shape[0]): for j in range(C.shape[1]): pmi = np.log2(C[i, j] * N / (S[i] * S[j]) + eps) M[i, j] = max(0, pmi) if verbose: cnt += 1 if cnt % (total // 100) == 0: print('%.1f%% done' % (100 * cnt / total)) return M
def __init__(self, Wx, Wh, b): self.params = [Wx, Wh, b] self.grads = [np.zeros_like(Wx), np.zeros_like(Wh), np.zeros_like(b)] self.cache = None
def __init__(self, W, b): self.params = [W, b] self.grads = [np.zeros_like(W), np.zeros_like(b)] self.x = None
def __init__(self, W): self.params = [W] self.grads = [np.zeros_like(W)] self.layers = None self.W = W
def __init__(self, W): self.params = [W] self.grads = [np.zeros_like(W)] self.x = None