post Image
ゲーマーの為のTensorFlow入門

Ⅰ. はじめに

機械学習を学ぶ動機は何ですか?
私はゲーマーなので最終的にゲーム関係に活かしたいですし、
入門ですらゲームのことを考えていたいです。
そのほうが具体性があり、学ぶのも苦ではありません。

例えば、スキルをご存知ですか?
通常攻撃とは別にあるアレです。
スキルを習得すると、スキルレベルによって敵に与えるダメージが変化します。
大体どのゲームでも同じ仕様だと思います。

しかし、
スキルレベル敵に与えるダメージについての内部的な実装は公開されていません。
本当の実装はゲームの開発者だけが知っています。

表1. スキル名「サークルオブマナⅠ」の例
(メイプルストーリーより)

スキルレベル 敵に与えるダメージ
1 132%
2 134%
3 136%
4 138%
5 140%
6 142%
7 144%
8 146%
9 148%
10 150%

Ⅱ. この記事のゴール

ゲームの開発者だけが知っているスキルレベル敵に与えるダメージの関係式をTensorFlowを使って求めることをゴールとします。

aaaaaaaaaaaaaaaa.png

なんて思った事はありませんか?
おめでとうございます🎉
その望みはこの記事で叶います:thumbsup:

結論からすると、表1の場合は以下の式が答えです。

y = 2x + 130
変数 変数の説明
$x$ スキルレベル
$y$ 敵に与えるダメージ

式が正しいか調べてみましょう。

スキルレベル 計算式
1 $y = 2 × 1 + 130 = 132%$
5 $y = 2 × 5 + 130 = 140%$
10 $y = 2 × 10 + 130 = 150%$

表1と一致しているので、式が正しいことが分かりました。

Ⅲ. TensorFlowで式を求める

実際にTensorFlowを使って式を求めてみましょう。

1. TensorFlow のインストール

調べればいくらでも出てくるので省略します。
公式のドキュメントはこちらです。
https://www.tensorflow.org/install/

2. プログラムを組む

求める式は 2変数の1次方程式であると仮定してプログラムを組みます。
(2変数の1次方程式とは、次のような式の形の事です。 $y = ax + b$ )

sample.py
# coding: UTF-8
import tensorflow as tf
import numpy as np

# スキルレベル
x_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 敵に与えるダメージ
y_data = [132, 134, 136, 138, 140, 142, 144, 146, 148, 150]

# 求める式は 2変数の1次方程式であると仮定する
a = tf.Variable(tf.zeros([1]))
b = tf.Variable(tf.zeros([1]))
y = a * x_data + b

loss = tf.reduce_mean(tf.square(y - y_data))
train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

init = tf.global_variables_initializer()

with tf.Session() as sess:
  sess.run(init)

  # 10,001回計算する
  for step in xrange(10001):
    sess.run(train)
    # 1,000回計算するごとにログを出力する
    if step % 1000 == 0:
      print(step, sess.run(a[0]), sess.run(b[0]))

3. 実行結果

答えである $a = 2, b = 130$ に近い値が計算できていることが分かります。

計算回数 $a$ $b$
0 15.839999 2.8199999
1000 2.2703271 128.11803
2000 2.004029 129.97195
3000 2.0002527 129.99823
4000 2.0002527 129.99823
5000 2.0002527 129.99823
6000 2.0002527 129.99823
7000 2.0002527 129.99823
8000 2.0002527 129.99823
9000 2.0002527 129.99823
10000 2.0002527 129.99823

4. プログラムの解説

4-1. はじめに入力値を決める

表1のとおり、スキルレベル敵に与えるダメージが入力値となります。
この入力値を元に式が求まります。

# スキルレベル
x_data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 敵に与えるダメージ
y_data = [132, 134, 136, 138, 140, 142, 144, 146, 148, 150]

また、今回は予め答えの式がわかっていたので以下のように書くことも出来ます。

x_data = np.arange(1, 11)
y_data = 2.0 * x_data + 130.0

4-2. 求めたい式を定義する

求める式は 2変数の1次方程式であると仮定してプログラムを組みます。

(2変数の1次方程式とは、次のような式の形の事です。 $y = ax + b$ )

もし収束しない場合は他の方程式に修正します。

a = tf.Variable(tf.zeros([1]))
b = tf.Variable(tf.zeros([1]))
y = a * x_data + b

4-3. Optimizerを設定する

1次方程式と仮定したので、
今回はOptimizerとして最急降下法(GradientDescent)を使います。
最急降下法は1次方程式で利用できる勾配法のアルゴリズムの1つです。
これにより、$a, b$の値が機械的に求まります。

reduce_mean関数で 実際の値と、4-2 で定義した式の計算データ差異を求めて、2乗した結果をlossとします。

loss = tf.reduce_mean(tf.square(y - y_data))

Optimizerの第1引数である学習率(learning_late)は1回に更新する数値の重みを決めるパラメータです。正の値で、小さければ小さいほど精度が上がり、計算時間も長くなります。
今回は適当に0.01を指定しました。

また、minize()の引数に先程のlossを指定します。
これは、lossが小さくなるように計算するという設定を行っています。
先程も書きましたが、lossは実際の値と計算値の差を求めています。
それが小さくなるように計算するという設定です。
つまり、重み($a$)やバイアス($b$)が調整されて、だんだん実際の値に近づくことを意味します。

train = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

4-4. すべての変数を初期化する

init = tf.global_variables_initializer()

定義した TensorFlow の変数(Variables)を初期化します。
実際の計算部分を示す Session を開始する前に必ず実行する必要があります。

また、Variablesを初期化するというのは、TensorFlow 特有のものです。
Theano(TensorFlow とは別のDeep Learning Framework)には存在しません。

4-5. Sessionを開始する

実際に計算を始める前に必ずSessionを開始する必要があります。

tf.Session() でSessionを開始できます。
また、sess.run(init)で初期化した変数をSessionに割り当てます。
以上で計算前の準備であるSessionが準備できました。

4-6. 計算する

今までのプログラムは全て準備です。
この段階で準備してきた内容に従って、初めて計算が行われます。
何回計算するかを決めるだけです。

今回は、何回計算すれば値が収束するか分からなかったので適当に10,001回にしました。
また、計算ログは1,000回ごとに出力するようにしました。

計算回数が10,000回ではない理由はログの出力にあります。
TensorFlowでも機械学習でもなく、Pythonの言語仕様の問題です。
10,000回の場合、xrange が0から数えて10,000回なので9,999で止まります。
1,000回ずつログ出力というのは割り算で行っています。
よって、10,000回目の計算ログが出ない為、1回足して10,001回としています。

また、range ではなく xrange を使う理由は xrange のほうがメモリ消費が少なく、処理速度も速い為です。
機械学習は何度も高速に繰り返し計算を行いますので、必ずxrangeを使うようにしましょう。

Ⅳ. まとめ、その他

ゲームを題材にした簡単な機械学習入門が無かった為作成しました。
線形な機械学習を体験し、そこから更に発展出来ることと思います。

間違っている所、こうした方がいいなどツッコミは何でも歓迎します!

Ⅴ. 参考文献


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。