みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

機械学習に必要なデータ数の検討

前回の記事でRNNのモデルを用いて加算と減算を学習しましたが,最低限必要なデータ数はどれぐらいなのか検討してみました.

教師データは24896個ありましたので,全部使用(1),1/2を使用(2),1/5を使用(5),1/10を使用(10),1/20を使用(20),1/50を使用(50),1/100を使用(100)した場合に学習がどれぐらいできるか確認しました.

データの準備

以下のソースコードで,ratioを1から100まで指定しました.

import math
import random

import numpy as np
import tensorflow as tf
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split

d = {
    # 0: padding
    "1": 1,
    "2": 2,
    "3": 3,
    "4": 4,
    "5": 5,
    "6": 6,
    "7": 7,
    "8": 8,
    "9": 9,
    "0": 10,
    "+": 11,
    "-": 12,
}

vocab_num = len(d.keys()) + 1


def str2v(text: str) -> list:
    return [d[u] for u in text]


rd = {v: k for k, v in d.items()}


def v2str(input: list[int]) -> str:
    return "".join(rd.get(u, "") for u in input)


ratio = 100
# data
ymax = 256
data = []
for j in range(0, 128):
    data.append((str2v(f"{j}"), j))
    for i in range(j, 128):
        data.append((str2v(f"{i}+{j}"), i + j))
        data.append((str2v(f"{j}+{i}"), i + j))
        data.append((str2v(f"{i}-{j}"), i - j))

original_data_length = len(data)
data = random.sample(data, math.floor(original_data_length / ratio))

残りは前回の記事と同じです.

結果

データが多い程よく学習できることが分かりました.validatation_lossとデータ数を両対数グラフにプロットしたところ,直線に近似できました.

Embedding LayerのWeightsはこのようになりました.1/20までならば特徴が捉えられている印象でしたが,1/50以下だと不十分な印象でした.

1

1/2

1/5

1/10

1/20

1/50

1/100