TensorFlowで始める深層学習 (3)機械学習から深層学習の扉を開く

 こんにちは!かわしま@食を楽しむエンジニアです。

 先日クッキーの詰め合わせをいただきました。 「クッキーなんて」と思わないで下さい。注文から2か月待ち、初めて買うには紹介が必要な、麹町にある老舗洋菓子店・村上開新堂のクッキーなのです。

* 京都にある同名のお店とは違います

f:id:gnavi-kawashima:20160527180826j:plain:w650

 食後にもかかわらず、全27種類を食べてしまいました (甘いものは別腹とか言いますが、人によります。私は別にならない側ですw)。そんな私でも、このクッキーは食べやすく飽きがこないことにびっくり。素朴な風味を守りつつ、時代に合わせて少しずつ改良をしていると想像できます。 村上開新堂の歴史が始まったのが明治1年、その頃の日本のお菓子の歴史をみてみると

  • 1868年(明治1年) 村上光保(むらかみみつやす)が、国家政策の一環として洋菓子製造技術習得を命じられたことが、村上開新堂の歴史のはじまり
  • 1875年(明治8年) 米津風月堂で機械を使い本格的なビスケットを製造を開始
  • 1899年(明治32年)東京赤坂で森永太一郎キャンデーを作る(のちの森永製菓)
  • 1910年(明治43年)横浜元町に「不二家」開店
  • 1916年(大正5年) 東京製菓が設立される(1924年に明治製菓となる)
  • 1921年(大正10年)グリコ創業
  • 1924年(大正13年)大竹製菓と東京菓子製菓が合併して明治製菓と改称
    引用 日本のお菓子歴史年表 | お菓子何でも情報館

 明治時代後半から大正時代の初め頃に、現在の大手製菓メーカーの多くが登場していますね。
 こ、これはまるで お菓子会社のカンブリア大爆発 ∑( ̄ロ ̄)なんと!?
 ・・・

前回のおさらい

 前回はTensorflowにおけるデータフロー演算の仕組みを見ていきました。その際、最急降下法や学習、loss(損失)など聞き慣れない用語が出てきたと思います。それらは機械学習に共通する用語です。深層学習は機械学習の一種であり、深層学習を理解するには機械学習の知識が欠かせません。 今回は機械学習に共通の用語・仕組みを整理してみたいと思います。

はじめに:機械学習の目的を知る

 私たちの周りには処理手順が不明確な、なぜか分からないがそうなるものがたくさんありますね。たとえばスーパーに行けば、私たちは売り場のリンゴをなぜか「リンゴだ」と認識できますし、自転車は練習することでなぜか乗れるようになります。

 なぜ認識できるのか、なぜ乗れるようになるか、過程がはっきりしていません。でも私たちは学習し、行動に移せています。 このような、理由や処理手順が明らかでない事象をコンピュータでも処理できないのか……こうした考えのもと研究されてきたのが機械学習です。

 たとえば、リンゴを認識できる能力を何らかの手法でモデル化して、コンピュータで再現しようとする技術は、機械学習の一種であるパターン認識と呼ばれる問題になります。

 一方、処理手順がはっきりしているものは自動化・効率化しやすいですよね。人間が1つ1つ処理手順を決め、その1つ1つが常に同じ結果になるようプログラミングすれば、コンピュータにより処理の自動化を図れます。私たちの生活のいたる場所で活用されているほとんどのシステムは、処理手順がはっきりしているものになります。

 目的に応じて適した処理の方法・システムがあるということです。

機械学習の活用例

 機械学習を「明示的にプログラムしなくても学習する能力をコンピュータに与える研究分野」と初めて定義したのはアーサー・サミュエルと言われています。彼が機械学習を定義したのは1959年のことです。現在では多くの分野で活用されています。

    • 迷惑メールフィルタ
    • 商品の推薦
    • 株価予想
    • クレジットカードの悪用検知

 最近特にホットなのは

    • 音声アシスタントやチャットボット
    • スマートホーム端末
    • 自動運転

 多くの企業が人工知能分野への投資を活発化させています。それがAIなのかDeep Learningなのか、呼び方は本質的な問題ではないと思います。色々な機械がネットワークで繋がり、相互に作用し始めていること。そして、その制御やUIなどに、機械学習を利用していることが重要なのですね。

機械学習の仕組み

 目的と活用例にふれたところで、機械学習の仕組みを見ていきます。

 機械学習と聞くと「機械が勝手に学習する・勉強する」との印象を受けますね。

[f:id:gnavi-kawashima:20160407100606p:plain:W600]

 おとぎの世界だと小人が夜中にやってくれそうですが、現実には、そんな都合の良いことはなさそうです。

 機械学習には、規則性やパターンを見つけ出す仕組みをプログラムした学習器と、学習器に投入する訓練データを用意する必要があります。学習器が訓練データから抽出した規則性やパターンは学習モデルと呼ばれます。この学習モデルを活用してさまざまなデータの解を出していきます。

 機械学習のプロセスは学習処理判定処理に分類できます。

1. 学習処理

 訓練データを学習器に投入して学習モデルを生成します。

f:id:gnavi-kawashima:20160527174249p:plain:w500

2. 判定処理

 学習処理で生成した学習モデルを利用して未知のデータを判定します。

f:id:gnavi-kawashima:20160527174310p:plain:w500

 このように、手続きが明確でないタスクに対して、そのタスクを遂行するための学習モデルを訓練データから作成し、その作成した学習モデルを利用して未知のデータを判断すること、これが機械学習の基本的な仕組み・定義になります。

機械学習の学習手法

 学習処理で用いる訓練データにもいくつか種類があります。手法で分類してみましょう。

  • 教師あり学習
  •  入力データとそのデータが何かが分かるラベル(教師データ)をペアで用意し、学習器に投入します。初めは間違った解答を出していきますが、何らかのパラメータを変化させることで解答を正解に近づけるように学習します。

  • 教師なし学習
  •  教師データは用意せず入力データのみを学習器に投入します。入力データ間の距離や類似度、統計的な性質に基づいてクラスを生成(クラスタリング)することが主な目的になります。

  • 半教師あり学習
  •  教師あり学習は教師データを揃えるのが大変です。半教師あり学習では、教師データがある入力データと、教師データがない入力データの両方を用いて学習します。

  • 強化学習
  •  なんらかの評価の基準により報酬を与え、その報酬を増やしていくように学習します。一連の行動の最後に評価が与えられるような場合に用いる学習方法です。
     強化学習は教師あり学習・教師なし学習両方の特徴をあわせ持つ中間的な学習方法とも考えられます。決定した正解を持たない(教師なし学習)、かつ報酬がある(正解を与えている、というのは教師あり学習と同じ手法)からです。
     強化学習はゲームの勝敗を通じて戦略知識を獲得するなどに利用できます。

機械学習アルゴリズムの分類

 では、実際に機械学習をする際にどのようなアルゴリズムを選択すれば良いのでしょうか?scikit-learnのマップによると、機械学習のアルゴリズムは4つに分類できます。

  • 分類 (Classification)
  •  入力したデータに対してデータの属性や種類を返す手法です。予測対象はカテゴリです。
     例 スパムメールの判定

  • 回帰 (Regression)
  •  入力したデータに対して値を出力する手法です。予測対象は数値です。
     例 既存のレストランのデータを利用して、新規レストランの消費電気量を予測

  • クラスタリング (Clustering)
  •  投入したデータのグルーピング結果を返す手法です。
     例 購買データやプロフィール情報を何らかの意味でグループ分けして、その特徴・傾向を発見

  • 次元削減 (Dimensionality Reduction)
  •  多変数のデータを要約する手法です。厳密には、できるだけ元の情報量を損なわないように 低次元のデータに変換します。
     特徴量が多くなればなるほど調整すべきパラメータの数が増えて、過学習のリスクが高まります。過学習のリスクとは、学習を重ねて訓練データに特化しすぎることで、かえって未知のデータに対する汎化性を失ってしまうことです。
     一方、データをまだ正しく掴み取れていない状態を未学習と言います。過学習と未学習はトレードオフの関係になることに注意しましょう。

 ここまで機械学習の手法・分類を紹介してきました。おおよその利用割合イメージは以下のとおりです。カッコ内は代表的なアルゴリズムになります。

f:id:gnavi-kawashima:20160530131746p:plain:w500

深層学習のアルゴリズム

 お気づきかもしれませんが、ここまでで深層学習に関することが出てきてません。深層学習にも色々な種類があります。ここでは主なものを5つ紹介します。

  • CNN (Convolutional Neural Network) / 畳込みニューラルネットワーク
  •  畳込み層とプーリング層を含む順伝播型ネットワークで、もっぱら画像認識に利用されます。

  • RNN (Recurrent Neural Network) / 再帰型ニューラルネットワーク
  •  音声や言語、動画像といった系列データは、系列内の要素の並び(文脈)に関連性があります。こうした系列データを扱うニューラルネットです。

  • AE (AutoEncoder) / 自動符号化器
  •  データをよく表す特徴を獲得することを目標とするニューラルネットです。深層学習の事前学習で重みの初期値をとることなどに利用されます。

  • DBM (Deep Boltzmann Machine) / 深層ボルツマンマシン
  •  ユニット間結合が双方向性を持つニューラルネットです。ネットワークの挙動を確率的に記述できるので、データの生成モデルとして利用されます。

  • DQN (Deep Q-Network) / 深層強化学習
  •  Googleの子会社Deepmindが開発した、深層学習と強化学習を組み合わせたアルゴリズム。例えば囲碁AIのAlphaGoは、自分の選択した手に対して、有利になったか不利になったかを定量的な報酬として与え、増やすように学習しているはずです。


f:id:gnavi-kawashima:20160613092743p:plain:w500

 他にも分類の仕方があります。ここでは、機械学習の手法では教師あり学習がよく使われていること、手法に対して代表的なアルゴリズムがどのように当てはまるかが伝わればと考えています。

サンプルコード:機械学習の特徴を整理

 簡単なプログラムで機械学習の基本的な仕組みを整理してみましょう。機械学習アルゴリズムの「Hello World」と呼ばれるmnistは、githubにソースコードがあります。

mnistは下記のような0から9の手書き数字画像データセットです。その画像が数字の何を表すかというラベルデータも含んでいます。

f:id:gnavi-kawashima:20160505080225p:plain:w300

実行してみると
$ python mnist_softmax.py

結果として下記が表示されます。
0.9167

この数値は何を表しているのでしょうか?実際にソースコードを見てみましょう。

"""A very simple MNIST classifier.

See extensive documentation at
http://tensorflow.org/tutorials/mnist/beginners/index.md
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# 1.Import data
from tensorflow.examples.tutorials.mnist import input_data

import tensorflow as tf

flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('data_dir', '/tmp/data/', 'Directory for storing data')

mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)

sess = tf.InteractiveSession()

# 2.Create the model
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)

# 3.Define loss and optimizer
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

# 4.Train
tf.initialize_all_variables().run()
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    train_step.run({x: batch_xs, y_: batch_ys})

# 5.Test trained model
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))

 とてもシンプルなMNIST分類器の例とコメントされてます。短いコードですが、重要な事が沢山詰まっていますので整理してみましょう。

処理の大まかな流れ

 コード内で学習処理と判定処理をしており、機械学習の一般的な処理と同じです。全体的な処理の流れは下記のようになります。

f:id:gnavi-kawashima:20160530181140p:plain:w500

ポイント

 処理段階ごとのポイントをおさえましょう。

 ※ 数式や関数、ニューラルネットの説明をかなり省略しています。段階的に詳しく説明できればと考えています。

1. データ準備

 mnistのデータ管理用の別ファイルinput_data.pyを利用しています。このファイルはデータが3つに区分されダウンロードされます。

    • train
    • validation
    • test

 機械学習では訓練と試験でデータを分けることが重要です。モデル作成時に利用した訓練データで試験(評価)するのでは、汎用的な計測精度とは言えません。そのためtrainとtestの2つのデータが準備されています。
 validation は今回のサンプルコードでは利用していませんが、パラメータをさらに調整するためのデータになります。

2. モデル作成

 このサンプルコードで作成する数理モデルは下記。ノードとエッジの内積の組合せの和に、バイアスを足したものをSoftmax関数の引数にしています。順伝播ネットワークです。

{ \displaystyle
  evidence_i = \sum_j W_{i,~ j} x_j + b_i
}

W:重み、x:学習データ、 b:バイアス

 組合せは、下記参照

f:id:gnavi-kawashima:20160530152833p:plain

{ \displaystyle
softmax(x) = \frac{\exp(x_i)}{\sum_j \exp(x_j)}
}

 softmax関数の戻り値、ここではyは、0.87666・・などの確率の値となります。ですのでy1、y2、y3・・・を全部足すと常に1 になります。

3. 損失と最適化手法定義

 損失としてクロスエントロピーを利用しています。
y:予測確率分布、y':真の分布

{ \displaystyle
H_y'(y) = -\sum_i y'_i \log(y_i)
}

 最適化手法は勾配降下アルゴリズム、サンプル内の0.5は学習係数になります。 多クラス分類の場合はクロスエントロピー関数がよく使われ、回帰問題は二乗誤差関数が使われます。

 順伝播ネットワークの学習とは、学習データで計算される誤差関数を、ネットワークのパラメータについて最小化することです。つまり学習の目的も、選んだ誤差関数(=損失関数)を最小にするネットワークのパラメータを求めることと言えます。

 極小解は何らかの値を出発点に、パラメータを反復計算することで求めます。この反復計算方法として、(非線形関数の最小化手法で)もっとも単純な方法が勾配降下法になります。
 勾配降下法は、ネットワークのパラメータを負の勾配(ベクトル)方向に少しずつ動かし、更新していきます。この際の更新量の大きさを定める定数が学習係数(学習率)になります。

4. モデルの訓練

 今回のサンプルコードはミニバッチ学習で、100のランダムなデータを取得しています。この数値(100)はバッチサイズです。 機械学習での学習データの与え方は3パターンに分けられます。

    • バッチ学習
    •  全ての学習サンプルを用いて更新量を求める方法です。学習サンプルの誤差は、クロスエントロピー関数や二乗誤差関数を用います。
    • オンライン学習(逐次学習)
    •  1つのサンプルでネットワークを更新した後、次のサンプルを更新されたネットワークで評価する、学習サンプルを1つずつ与える方法です。
    • ミニバッチ学習
    •  学習セットを少量のサブセットに分け、1回の更新にそのサブセットを用いる、バッチ学習とオンライン学習の中間的な方法です。計算を並列化して、数値計算を効率化します。
5. モデルを評価

 正解データと比較して、精度を算出。学習モデルを評価しています。
 この評価結果を指標にしてモデルやデータを変更・改善していきます。



おわりに

 機械学習を利用したシステムは今後ますます身近なものとなってくるはずです。
 深層学習も機械学習の一種。機械学習の必要性や仕組みのイメージが湧けば、深層学習の理解もスムーズになるかと思います。

 話変わりますが、最近オフィスを増設しました。今までの日比谷に加え、新しいオフィスは新橋駅、内幸町駅近くになります。そしてここ、イベントスペースがあるのです。このピカピカのスペースを使わずにはいられず・・・勉強会します。

勉強会概要

Deep Learningを中心とした機械学習で

    • 何ができるのか分からない
    • これから開発してみたいけど、どこから手をつけて良いか分からない
    • 少し開発してみたけど、なかなか上手くいかない

このような方を対象に、Deep Learningの理解や開発が、今より少しでも進む場になれれば嬉しいです。
今回は、別途、具体的なプロダクトの苦労話や、スタートアップの方の構想話のLTもあります。

勉強会申込

日時:2016年7月28(木)
場所:東京都千代田区内幸町1-3-1幸ビルディング8階

    • 18:45 - 19:30 受付
    • 19:30 - 20:45 勉強会
    • 20:45 - 21:45 懇親会

20時以降会場ビルに入れません。遅れてくる方は注意して下さい。



参考
深層学習:機械学習プロフェッショナルシリーズ
機械学習と深層学習 ―C言語によるシミュレーション―
初めてのディープラーニング
ITエンジニアのための機械学習理論入門
フリーソフトではじめる機械学習入門

TensorFlow, the TensorFlow logo and any related marks are trademarks of Google Inc.

お知らせ
ぐるなびでは一緒に働く仲間を募集しています。


かわしま

深層学習がメインのフルスタックエンジニア。
週末は子供の頃より続けている剣道でリフレッシュしてます。
美味しいお店探しも好きで、妻とよく食べ歩きをします。