派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】注目のテーマ、ディープラーニングを知識ゼロから学ぼう

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年10月31日のイベントでは「知識0から始めるディープラーニング 本格的AI開発」を開催。書籍『はじめてのディープラーニング』の著者である我妻幸長さんが、ごくシンプルなディープラーニングモデルを使って、ディープラーニングの基礎からわかりやすく解説してくださいました。

■今回のイベントのポイント

・人工知能、ディープラーニングとは
・人工知能と数学
・ディープラーニングの実演
・Swiftによる深層強化学習

【講師プロフィール】
我妻 幸長さん
「ヒトとAIの共生」がミッションの会社、SAI-Lab株式会社の代表取締役。AI関連の教育と研究開発に従事。東北大学大学院理学研究科修了。理学博士(物理学)。著書に「はじめてのディープラーニング」(SBクリエイティブ)、「No.1スクール講師陣による 世界一受けたいiPhoneアプリ開発の授業」(技術評論社)。オンライン教育プラットフォームUdemyで、2万人以上を指導する人気講師。エンジニアとして、VR、ゲーム、SNSなどジャンルを問わず様々なアプリを開発し、数々の技術関連イベントに登壇。

人工知能、ディープラーニングとは

最初にディープラーニングについての紹介がありました。その中でも面白かったのが「AIには強いAIと弱いAIがある」というお話。強いAIは、生物の知能に迫るAIで、ドラえもんや鉄腕アトム、スターウォーズに登場するC3POのような汎用的なものですが、これはまだ実現していません。いっぽうの弱いAIとは、限定的な問題解決や推論に使われるもので、こちらは画像処理や機械制御、音声による会話、文章の認識や作成など、各分野での利用が始まっています。

AIのカテゴリの中には、機械学習のような脳の神経細胞を模倣するものだけでなく、神経細胞でなく遺伝子を模倣するものや、生物の群れを模倣するものなどもあるそうです。

今回は機械学習がテーマなので、まずは機械学習の基礎から説明してくださいました。

ニューラルネットワークは、脳の神経細胞(ニューロン)を模したモデルで、ニューロンが、層を形成していて、同一階層ではつながっていないが、前と後の層とはすべてつながっているという特徴があり、「多層」で構成されるニューラルネットワークで行う学習をディープラーニングと呼ぶそうです。

f:id:itstaffing:20181219133723j:plain
▲ヒトの脳には1000億の神経細胞と100兆個のシナプスがあるそう

そして、ニューラルネットワークでは、入力に対して重み付けやバイアスをかけ出力をしますが、その結果に対して、ニューロンの結びつきの重要度を変えていく、バックプロパゲーションという考え方もポイントです。

f:id:itstaffing:20181219133726j:plain
▲バックプロパゲーションは、結果に基づいてニューロンの重み付けやバイアスを調整していくこと

人工知能と数学

人工知能の根本を理解するには数学が欠かせません。では、人工知能を知るのに必要な数学とは何でしょうか。我妻さんによれば、次のものだそうです。

[線形代数]ベクトル・行列・テンソルによる演算など
[微分]常微分・偏微分・連鎖など
[確率・統計]標準偏差・正規分布など

ディープラーニングは、Pythonと相性がいいと言われていますが、それはNumPyとmatplotlibいうライブラリが用意されており、上記の数学分野の演算が高速で処理できる関数群や、結果を手軽に可視化できるからだそうです。

「数学が何の役に立つのかわからなかった人も多いかもしれませんが、コードにすると手軽に試行錯誤が可能になります」とのことで、さっそく行列積をコード化してみることに。

f:id:itstaffing:20181219133729j:plain
▲PythonにライブラリNumPyを読み込んでいればこの行列積の計算も簡単に記述できる

123
456

という行列と、

11
11
11

という行列の積ならば次のようになります。

import numpy as np

a = np.array([{1,2,3},[4,5,6]})
b = np.array([[1,1],[1,1][1,1])

c = np.dot(a, b)
print(c)

行列の行と列の要素を入れ替える処理を転置と呼びます。

f:id:itstaffing:20181219133733j:plain
▲行列の要素数が増えると転置の処理も時間がかかるが……

NumPyを読み込んでおけば、次のように記述できます。

d = a,T
print(d)

ディープラーニングの実演

いよいよ実際にニューラルネットワークによる機械学習を実装します。とはいえ多層になると難しいので、ここでは単一ニューロンのモデルを使用しました。

f:id:itstaffing:20181219133737j:plain
▲単一のニューロンでも基本原理は変わらない。順伝播と逆伝播があり、逆伝播によりシナプスの結合が強化される
f:id:itstaffing:20181219133739j:plain
▲各ニューロンで入力に対して重み付けやバイアスをかけ、その結果を活性化関数で処理して出力を得る

内容はsin関数のx座標とy座標の値から、ニューロンにゼロから学習させていき、x座標の値からsin関数の結果導かれるy座標を予測させるというシンプルなものでした。

我妻さんがそれぞれの機能や役割を紹介しながら、実際にコード化していきます。3層で入力と出力が1つのニューロン、中間層のみ3つのニューロンというモデルです。

単純化すると入力値xに対して重みwを掛け、バイアスbを加える。これを活性化関数fに入力して出力値yを得ます。

u = xw + b
y = f(u)

活性化関数には、ニューラルネットワークに欠かせないもので、さまざまな関数が用いられますが、ここでは、古くから使われているシグモイド関数を使用します。

y = 1 / (1 + exp(-u))

実際には上記をベースに行列の演算を行っていきます。単一ニューロンによるニューラルネットワークであれば、主要な部分は3~4行で書けてしまうということに驚かされました。

Swiftによる深層強化学習

機械学習と言えばPythonを使うというイメージがありますが、他のプログラミング言語でも実装は可能です。実際に我妻さんが、Swiftでの実装を示してくれました。

内容は「強化学習」です。試行錯誤を通じて、ある環境においてエージェントが最も報酬が得られやすい行動をとるように学習していくもので、有名なものだとチェスやオセロの強化に利用されています。

強化学習に必要な概念には、行動、状態、報酬があります。行動は、エージェントが環境に働きかけること(たとえば迷路内を移動する)。状態はエージェントが環境におかれた状態(進める方向)。報酬は結果に与えられるもの(ゴールに到達すれば+1、罠にはまると-1のような)です。

これを実装する前に、この問題を解くための代表的なアルゴリズムであるQ学習について知っておきます。

f:id:itstaffing:20181219133742j:plain
▲各状態と行動の組み合わせにQ値を設定し、エージェントは最もQ値の高い行動を選択するようにし、Q-Tableの各値が最適化されることで学習を行う

Q値は、次の式に基づいて更新されます。

Q値の更新量=学習係数×(報酬+割引率×次の状態での最大のQ値-現在のQ値)

ただし、扱う状態の数が多いとQ-Tableが巨大になり学習がうまく進まなくなるという問題点があるため、Q-Tableの代わりにニューラルネットワークを使うのだそうです。これをDeep Q-Network(DQN)と呼びます。

f:id:itstaffing:20181219133745j:plain
▲DQNを使うことで状態の数が多い場合の学習もスムーズに進むようになる

そうして我妻さんがデモをしてくれたのが、Cart Pole問題という簡単なゲーム。これは、よく学校の掃除の時間に一度はしたであろう、箒を手のひらの上に立てて、バランスを取り、箒が倒れないようにするというあの遊びです。カートの上に乗せた棒を倒れないように左右に動かすというもので、棒が45度以上傾いたら報酬-1、200フレーム保てたら報酬+1としてSwiftで実装し、iPhoneで動作するものでした。

何回かデモをしてくださり、それを見ているだけでも面白かったのですが、我妻さんによれば、これまで何度も動かしてきた中で、さまざまな戦略が試みられていることが分かったということです。

たとえば「ぶるぶる移動作戦」は、小刻みに左右への動きを繰り返し、バランスを取るという手法、「カウンターアタック作成」は、まず大きくどちらか片方に動かし、すぐに逆に大きく動かすことでバランスを取ろうとする手法だそうで、他にもいくつも特徴的な学習の試みがなされているそうです。

今回のイベントでは、難しい数式も出てきましたが、機械学習の中身に踏み込んだものであり、考え方をコードに落とし込むというプログラミングの根源的な面白さもありました。数学とあわせて、よりディープラーニングへの理解を深めていきましょう。