あまり機械学習に詳しくないのだが、とりあえずChainerを動かしてMNISTのサンプルコードを動かすことはできた。
一方でTensorFlowでもMNISTを動作させたことがある。コード的に両方ともPythonを使っており似通っているが、どのように違うのか比較してみると、アルゴリズムの詳細が見えてくるかもしれない。
ChainerのDeep MNISTのソースコード
TensorFlowのDeep MNISTのソースコード
Chainerの方が比較的短めに見えるが、Optimizerに最初からMnistMLP()など存在しており、TensorFlowは自分でモデルを作り上げている印象だ。 TensorFlowはSoftmax()や最適化の方式などをプログラム中に記述してモデルを作り上げているが、Chainerの場合はそこが隠蔽されている。
- Chainer
# Prepare multi-layer perceptron model, defined in net.py if args.net == 'simple': model = L.Classifier(net.MnistMLP(784, n_units, 10)) if args.gpu >= 0: cuda.get_device(args.gpu).use() model.to_gpu() xp = np if args.gpu < 0 else cuda.cupy elif args.net == 'parallel': cuda.check_cuda_available() model = L.Classifier(net.MnistMLPParallel(784, n_units, 10)) xp = cuda.cupy
- TensorFlow
... W_fc2 = weight_variable([1024, 10]) b_fc2 = bias_variable([10]) y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv)) train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
Optimizer Adamとは何か
有名な最適化更新式およびアルゴリズムのことを指すらしい。下記のページがあるが数式は正直良く分からない。
ただ、ChainerのAdamの実装を見ると、
chainer.optimizers.adam — Chainer 1.16.0 documentation
def update_one_cpu(self, param, state): m, v = state['m'], state['v'] grad = param.grad m += (1 - self.beta1) * (grad - m) v += (1 - self.beta2) * (grad * grad - v) param.data -= self.lr * m / (numpy.sqrt(v) + self.eps)
Wikipediaの方の式に似ている。