3.4 CBOWモデルの実装

3.4.1 学習コードの実装

カスタムデータセットを準備します。

from ivory.common.dataset import Dataset
from ivory.common.util import (convert_one_hot, create_contexts_target,
                               preprocess)

text = "You say goodbye and I say hello."
corpus, word_to_id, id_to_word = preprocess(text)
contexts, target = create_contexts_target(corpus, window_size=1)
vocab_size = len(word_to_id)
contexts = convert_one_hot(contexts, vocab_size)
data = Dataset((contexts, target))
data.batch_size = 3
data.epochs = 1000
data.shuffle()
data

[1] 2019-06-12 17:46:20 (194ms) python3 (194ms)

Dataset(batch_size=3, epochs=1000, len=2, column=0, size=(6,))

Ivoryライブラリでは重みを共有して複数入力をとるMatMulMeanレイヤを実装しています。これを使って、CBOWモデルを組み立てます。

from ivory.core.trainer import sequential

net = [("input", 2, 7), ("matmulmean", 5), ("matmul", 7, "softmax_cross_entropy")]
trainer = sequential(net, optimizer="adam").init(std=0.01)
trainer.model.layers

[2] 2019-06-12 17:46:20 (31.3ms) python3 (226ms)

[<MatMulMean('MatMulMean.1', (2, 7, 5)) at 0x11e323387f0>,
 <MatMul('MatMul.1', (5, 7)) at 0x11e33177668>,
 <SoftmaxCrossEntropy('SoftmaxCrossEntropy.1', (7,)) at 0x11e33177780>]

訓練を実行します。

df = trainer.fit(data, epoch_data=data[:]).to_frame()
df.tail()

[3] 2019-06-12 17:46:20 (422ms) python3 (647ms)

epoch loss
996 996 0.547879
997 997 0.547699
998 998 0.547519
999 999 0.547338
1000 1000 0.547158

可視化します。

import altair as alt

alt.Chart(df).mark_line().encode(x='epoch', y='loss').properties(width=200, height=160)

[4] 2019-06-12 17:46:20 (78.0ms) python3 (725ms)