ムラウチドットコム エンジニアブログ

日本最大級ブログランキング「にほんブログ村」、シンプルなブログサービス「muragon」を運営するムラウチドットコム メディアグループのエンジニアブログです。

機械学習の勉強を始めました


はじめに

ここ数年話題によく出る機械学習
最近機械学習の勉強を始め、講義やフレームワークに簡単に触れてみましたので、復習も含め記事を書いてみました。


機械学習とは

wikipedia参照

機械学習(きかいがくしゅう、英: machine learning)とは、人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである。

機械学習の手法は世界中で研究されており、様々な手法が御座います。

  • 深層学習(ディープラーニング):音声、画像の認識、解析等を高精度で行える。自動運転にも応用されている
  • 強化学習:囲碁のAlpha Go、将棋のponanza等で利用されており、現在の状態と行動の報酬から行動を決定する

等があります。



機械学習の学習方法

私は下記の3つを使っております

1. 本

ディープラーニングの基礎的から書いてあり、ソースコードも載っているので手を動かしながら学べます。
最近は機械学習系の本が増えてきましたので、自分の用途にあった本を探してみてもいいかもしれません。


2. Coursera


機械学習で有名なAndrew Ng氏の無料動画講義。
ある程度日本語字幕がついていて、毎週テストやプログラミングの提出があります。


教え方が上手く、図や数式を分解しながら教えてくれるので、数学が苦手でもわかりやすいです。
octaveというプログラミング言語を利用していますが、利用方法はpythonに似ているので、慣れればそこまで大変ではありません。
複雑な式が出てきても、ここは深く把握するのは大変だから概要だけ覚えればいいよ。等と認知負荷を下げてくれるので、勉強していて楽しいです。


3. Udemy


様々なジャンルの学習動画を販売しています。
プログラミング、料理、写真、外国語等、一流の講師陣の動画が買えます。
セールを定期的(通年)にやっているので、安いセール時にまとめ買いがお得です。
私は機械学習系やセキュリティの動画を購入致しました。



フレームワーク


世界中で機械学習の研究、利用が進んでおり、それに伴ってフレームワークも色々と出ております。

  • Pytorch:FB製のフレームワーク
  • TensorFlow: Google製のフレームワーク。世界中で使われている
  • Keras: TensorFlowをラッパーしたフレームワーク
  • Chainer : 日本のPreferred Networks社製のフレームワーク

最近ですとクラウドサービスとしても提供されています

  • Neural Network Console: Sony社製のブラウザからNNを設計、学習出来るサービス
  • Amazon Rekognition Video: AWS提供 コードを書くこと無く、画像認識、分析を提供してくれるサービス。ディープラーニングを利用してモデルが作成されている。
  • Google AutoML: Google製 こちらもコーディング無しでモデル構築が出来るサービス。最近テキスト分析や翻訳がサポートされた

Kerasを試してみる


有名なのはTensorFlowなのですが、勉強コストや統計学の知識が必要になります。
それを補って簡単に使えるようにしたKerasが最近では流行っているようなので、簡単に試してみました。


ドキュメントはこちら


多層パーセプトロン (Multilayer perceptron)

脳の神経細胞を模して、値を受け入れる入力機能、特定の処理後に出力する機能を持つパーセプトロンを並列的に並び合わせ、
入力層、中間層(隠れ層)、出力層と多層的に組み合わせたモデルを多層パーセプトロンといいます。
ディープラーニングとは、真ん中の中間層をより多くしたモデルになります。


イメージ図


人気のフレームワークkerasでは、上記の様なモデルも簡単に作成することが出来ます。



こちらのサンプルコードをローカルのjupyter notebookで試してみます。
機械学習の練習でよく使うMNISTを簡単に取り込めるようすでに準備されています。
MNISTとは以下の様な手書き数字画像の学習データになります。
テスト用データと正解のラベルがセットになっており、それを元に学習をしながら正解とどれだけ離れているか等を基準に学習を行います。

上の画像は人間であれば簡単に読めますが、機械に判別させるには難しいですね。
その様な画像を機械学習で判定させてみます。




import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import RMSprop
from keras.callbacks import EarlyStopping, CSVLogger
import matplotlib.pyplot as plt

batch_size = 128
num_classes = 10
epochs = 20

'''データ読み込み '''
(x_train, y_train), (x_test, y_test) = mnist.load_data()

''' 前処理
入力用に 2次元(28*28)データを 784の1次元に変換 '''
x_train = x_train.reshape(60000, 784).astype('float32')
x_test = x_test.reshape(10000, 784).astype('float32')

''' ピクセルの数値幅を0 ~ 1 に正規化'''
x_train /= 255
x_test /= 255

''' one-hotラベルの作成 '''
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

''' モデルの作成 '''
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
model.summary()

history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))

''' 評価 '''
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])



モデル

上記コードで作成したモデルになります。



_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_12 (Dense) (None, 512) 401920
_________________________________________________________________
dropout_9 (Dropout) (None, 512) 0
_________________________________________________________________
dense_13 (Dense) (None, 512) 262656
_________________________________________________________________
dropout_10 (Dropout) (None, 512) 0
_________________________________________________________________
dense_14 (Dense) (None, 10) 5130
=================================================================
Total params: 669,706
Trainable params: 669,706
Non-trainable params: 0
_________________________________________________________________


結果

loss (損失度) : 損失関数を使い、推測した結果と正解の乖離具合を表します。一般的にはこの値が小さいほど良いとされています
accuracy (精度) : 推測結果と正解が合っているかの割合

Test loss: 0.09924841750166101

Test accuracy: 0.9849

損失も小さく、精度も98%と上々です。

図に表すと精度が上がっていく様子が見れますね。
accは学習データ、val_accはテストデータに対しての精度になります。
これだけのコードでMNIST識別のモデルを構築出来るのはすごいですね。
コードによってはTensorlFlowの半分になる可能性もあるそうです。

model.save(path) 

keras.models.load_model(path)

モデルの保存、読み込みも簡単に出来ますので、サービスへの展開も簡単そうですね。


githubには他にもRNNやCNNのコードもありますので、興味のある方は是非見てみてください。


ビッグデータや処理速度の向上により発展している機械学習
弊社サービスのmuragonやブログ村でも今後活用できるかもしれませんので、引き続き勉強を続けていきます。

×

非ログインユーザーとして返信する