企業が人工知能(またはディープラーニング)を始めるのに必要なヒト、モノ、コト
企業が、自社のビジネスに人工知能を取り込むには、どんなリソースがあればよいかまとめてみました。
1) ニューラルネットワーク開発部隊 (ヒト)
2) 分散システムのインフラストラクチャ (モノ)
3) ビジネスモデリング (コト)
1) ニューラルネットワーク開発部隊 (ヒト)
ビジネス要件から適切なネットワークを選択できる人材
動体検知や文字認識などの画像処理であれば畳み込みネットワーク、文字認識や時系列データであればリカレントニューラルネットワーク等、ニューラルネットワークは応用したい分野毎に異なります。目的に応じて最適なネットワークを選択できる人材がまずはなにより必要です。
IT開発でいう「SE」の領域にあたりますし、後述の通りニューラルネットワークで求められる人材は、従来のIT開発のメンバーと親和性が高いので、従来までの「SE」と同じスキルセットと見なされやすいですが、少し違うと思います。
IT革命により、近年のIT開発の技術選択は体系化がなされた知識を学ぶ事で進行可能でしたが、人工知能の場合は、まだ発展途上な面もあり、数理的な知識が求められます。加えて、適切なITシステムを選択するセンスも従来通り求められてくるでしょう。プロセスマネジメントは別のメンバーに任せて、ビジネス要件に最適なテクノロジーを追い求めることに特化した方が、当面の間は効率的だと思います。
- 数学的な理解/知識
既に確立されている仕組みを使うのであれば、理系大学程度の基礎的な知識でいけると思います。これは高校時代に数学が好きだった理系出身ならある程度は標準搭載している知識です。
ただし(少し前の私を含め)多くの社会人は学生時代の学びの記憶を忘却の彼方においやってしまっているので、高校数学あたりからノートを片手に数週間復習するような機会を取る必要はあると思います。
分野としては、行列計算や偏微分などの知識になると思います。代数や複素解析はあまり出てこないです。
新しいロジックを考えたり、ロジックを組み合わせる必要がある領域に手を出す必要があれば、より詳しい数学的な知識を持つ人材がやはり重要になってきます。競合する企業も人工知能を採用しているような分野なら、体系的な学問を更に深く習得している人材までが求められるでしょう。
この章はヒトをテーマにまとめましたが、人工知能のフレームワークはソフトウェアの重要な概念なのでここで紹介させてください。
実際にデータを扱い、開発を効率的に進めていく為には、人工知能に向けた開発フレームワークを利用することになります。ニューラルネットワークでよく使う関数などがビルトインされているツールがあれば、毎回作らずに済むので便利だからです。TensorFlow、Chainerなどの実装があります。
フレームワークは少なからず実装に影響を及ぼします。例えば、文字認識などで利用されるリカレントニューラルネットワークの1つであるLSTMををとっても、幾つかの種類があり、ツールにより実装されているものが異なるようです。私は当面、TensorFlowを使おうと思います。
言語はフレームワークがサポートしているプログラミング言語を使えばよいです。昔はC言語や業界に特化した言語が使われており、言語自体の知識が求められましたが、最近はWeb開発などで積極的に使われてきたライトウェト系の言語(Pythonなど)でも扱えるのでとっつきやすくなっています。Web開発の経験があるレベルでも手をつけることができると思います。数学的な知識と合わせて、「高校時代に数学が好きだった理系出身のWebプログラマ」であれば戦える分野になりました。
ただし、プロダクトレベルに耐え得るようにするには、開発を効率に進める為にも、また開発したプロダクトに問題が発生しない為にも、テストや開発の方法論(MVCのようないわゆる開発フレームワーク)といったプログラミング開発における実装上の課題に取り組めることが重要になっていきす。
2) 分散システムのインフラストラクチャ (モノ)
- ハードウェア
マシンリソース、CPU&GPUです。処理すべきデータと処理するネットワークの構造により変わってきます。チュートリアルであつかうMNIST程度のものを扱うにはラップトップでも可能ですが、膨大なデータを複雑なロジックで計算する際は、クラウドを利用することになります。
自社でインフラを構築するのは、少なくとも組織を構築する直後にはあまり得策ではないと思います。Webのように常にリソースを使い続けるものと比較しても、資産化しておく意味があまりないからです。
- 分散フレームワーク
Map&Reduce / Hardoopのようなものを指しています。複数のハードウェアを同時に
扱う為には必要です。既存のフレームワークを採用しても、自社で構築するとするとそれなりに労を要します。
- データベース
データを格納する為に、DBを使います。初期においては、ポータブルに使えるという意味でcsvやsqliteのようなものを使ってもいいかもしれません。また、従来からLAMPなどで開発をしていたWebエンジニアであれば、MySQLのような馴染みのあるDBを使ってもいいと思いますが、あらかじめ膨大なデータを扱うことを前提として、NoSQL系がよく利用されているようです。
総じて言えば、ローカル環境で試験的なアプローチをするのであれば、ラップトップでも問題ありません。それを超えるタイミングで、スケールアウト可能なクラウドのシステムを採用するのが、分散システムの賢い採用方式だと思います。
3) ビジネスモデリング (コト)
従来から数理的なアプローチ存在する分野、例えば金融や画像処理といった分野では、方法論が揃いつつあります。また、ビジネス上の適応目的も明らかになっていますので、応用も比較的容易です。
Google Cloud Plathomeには、金融に対して適応するデモがありますが、これは従来まで市場間分析などで利用されていた自己相関分析に対してニューラルネットワークを応用した例です。
Machine Learning with Financial Time Series Data - Solutions — Google Cloud Platform
余談ですが、この例ではフィードフォワードネットワークと呼ばれるディープラーニングの中でも比較的シンプルなものを採用しています。それでもそれなりのパフォーマンスが出ているあたり、人工知能の未来を感じさせてくれます。
今まであまり適応されていない分野に向けた適応となると、ビジネスモデルを発見するようなセンスも必要になります。IT技術とビジネスの両方を経験されたスペシャリストを見つけることが近道かもしれません。
いままでは人間の経験と勘(あるいはその道の天才)に頼っていた部分を機械化することで、新たなビジネスチャンスを生み出せることが人工知能の本質です。自社への適応を検討する企業としては、この本質に向けて目的意識を持ち続けておくことが、ビジネスへの応用向けた近道だと思います。
ニューラルネットワークを使っているかは不明ですが、Dentsu Media LabとPanasonicによる東京オリンピックに向けたアプローチはこういった意味で興味深いと思います。
MNIST for ML Beginnersの数学的な意味合い
Tensor flowの初めの一歩のチュートリアルであるMNIST For ML Beginners
について、数学的な意味合いを書いてみようと思います。
(ブログに不慣れなもので、修正/継ぎ足しながら公開していくことをお許しください)
まず、このチュートリアルで実行していることは、
入力がn次元の配列 (は実数)が複数個あった時 、個々の出力 ()を得る写像を用意して、出力が 個々のに対する解 (あるz=1以外はz=0) に近い結果を得れるように、Fを最適化することです。
ここで、の各要素 は実数と書きましたが、これは概念上の話であり、プログラムの実装上ではfloatになります。以後、集合(つまり配列)の要素は数学上は実数ですが、プログラム上はfloatであると考えて下さい。は、となるm個の(実数の)集合です。また任意の要素は0以上であり、したがって、は0から1までの値をとることになります。0%から100%の確率的な値だと考えると分かりやすいと思います(確率分布と言います)。解は (1, 0, .. , 0) , (0, 1, .. , 0) , (0,0, .. , 1) のような1つだけが1で残りが全て0のm個の集合(=配列)です。これも、1つが100%で、残りが0%ということを示していると考えてください(この1つだけが1の集合はone hotな集合と呼ばれています。)。結果が近いかどうかの評価は、複数の入力 が与えられた時の各々のxに対する出力 が解 に対するしてどれだけ正解したか(=正解率)で判断します(はのI番目の要素という意味ではなく、入力集合の1つの要素であるという意味です)。
各集合() に対して、正解()、つまり教師が与えてられている状態で、写像 の最適化を行うプロセスであることから、このチュートリアルは「教師付き」学習と呼ばれるものになります。
ML Beginnersでは、入力 に28x28ピクセルの画像(つまり、n=784次元のベクトル(=配列))を用いており、正解と出力に0から9までの数字(つまり、yおよびzはm=10次元の0から1までの実数をとるベクトル)を用いています。正解率はおよそ91%程度で、これは機械学習界隈ではあまり優秀な結果ではないようです。なお、Expert向けのチュートリアルでは、正解率は99.2%程度になります。
両者の何が違うかというと、写像を作りこむロジックです。写像の方法としてはBeginners/Expertsのいずれも、行列 (重み) とベクトル (バイアス)を用いて、m=784次元のベクトルxからn=10次元のベクトルeを得る為の、 という変換をおこないますが、最適なの組み合わせを選ぶまでのロジックが違います。Beginnersでは、この(W,b)の組み合わせを得る為に、 活性化関数(activation function)としてsoftmax関数を、解と比較するための定量的な尺度として交差エントロピー (cross entropy)を、尺度の最適解の探索に勾配降下法を用いています。
このような数式から、Wは(784x10)の行列であり、bは10次元のベクトルになります。
各xごとにFを更新していく(=最適化していく、つまり学習していく)プロセスは以下のステップで進めます。(BeginnersとExpertsの違いは、このステップ自体の違いにあり、選択する関数の違いなどではありません)
1) 学習前の(W,b)の組み合わせが存在する。 (Wはnxm=784x10の行列(=2次元配列)、bはm=10のベクトル(=要素10の配列))
2) xを入力として、 e = Wx + b の解を得る。(eはm=10のベクトルです)
3) 得た解 eを活性化関数を用いて、yに変換する。(ここでは、活性化関数にsoftmax関数を用いています)
4) 正しい解 z と y に対して「差」を定量化する。(ここでは交差エントロピーを用いています)
5) 一定のアルゴリズムを用いて「差」が最小化させる。(ここでは勾配降下法を用いています)
6) 差が最小化された(W,b)の組み合わせを「学習結果」として次のxに対する初期値として与える。
最終的に得た、(W,b)の組み合わせにより、他のデータ x からの出力 y = F(x) = softmax(Wx+b) がZと適合しているか を確認することで得た正解率が、このプロセスに対する評価となります。
以降、各関数の意味合いについて書きたいと思います。
入力に対する最初の変換 e= Wx + b
e=Wx+bが行おうとしていることは、あらかじめ持っている入力の次元を求める出力の次元に合わせることです。チュートリアルの例では、ピクセルの要素である28x28=784個の数値から、0から9までの数値に対する判断をする必要があるので、784個の配列(=実数集合)を10個の配列に変換します。Wは(m,n)行列であり、Wxという行列変換により、m(=784)次元の実数集合からn(=10)次元の実数集合へ変換します。その後、n次元の配列bによりバイアスをかけて、n次の実数集合である出力eを得ます。式が一次方程式の形をなすところからわかるように、これはいわゆる線形変換であり、m次元の入力からn次元の出力を得る手段は他にもありえますが、この形式を用いるのが一般的です。ニューラルネットワークでは、このような線形変換を複数回繰り返すことで、様々な変換の表現を得ることになります。
活性化関数 softmax
次にsoftmax関数についてです。まず、softmax関数の定義は あるm次元の実数のベクトル を入力とし、同じ次元の出力を得る関数で、要素 に対応する出力が となるものです。分母から見て明らかなように、となります。つまり、総和が常に1 (=100%)になるように設計された関数と言えます。
softmaxはシグモイド関数の多変量版です。シグモイド関数は、実数に対して という形の関数で、グラフにすると以下のようなものになります(このグラフはa=1の時のものです)。
この関数は、、sigmoid(0)=0.5となっています。これは日本語にすると、「全ての実数を0%から100%の間に写し込む。マイナスであればあるほど0%になり、プラスであればあるほど100%になる。真ん中の0は50%」という表現になり、与えられた値を確率に変換する為の関数であると考えることができます。
つぎに、なぜsoftmaxがsigmoidの多変量版なのかということを考えたいと思います。
aは空間を横に狭める作用をもたらす程度のものなので、以後a=1として考えます。
まず、をと表現し、シグモイド関数の分母分子にをかけることで、となります。この関数は、xの値が0の場合、となり、50%の確率に落ち着くことになります。
この確率空間の変量が実は2、つまりベクトル だったらと考えます。はの時に1ですから、sigmoidは実は、の状態と考えるとと考えることができます。を0に固定せず、実数に拡張すると、と解釈することができます。
この関数は、例えばとが同じ値だと、0.5=50%となります。2つの変量がある際、どちらに対する定量的な尺度が同じだとすると、片側に対する可能性が50%であるという風に解釈することができます。一方で、片方が片方よりも大きい値だとすると、に対する可能性が高くなると解釈できます。
では、次にこれを変量がn個ある状態と解釈するにはどうすればいいでしょうか。に対しては、であるという解釈を入れるとわかりやすいと思います。3以上のiに対して、 が成り立ちますから、
とみなし、これを実数値を持つ変数と考えることで、
を得ることができます。
これは、n個の変量、例えばn=10として、0から9までの整数をとる正解があった際に、0と1をとる確率までは考えたが、それ以外のことはまるで考えていない(つまり、定量的には、2から9まではである)と考えていた状態から、それ以外(2から9までの数字のことです)を考慮に入れて拡張させたと考えると、わかりやすいと思います。
参考までに、2変量(x,y)のxに関するsoftmax関数の3次元画像はこのような形になります。
交差エントロピーは以下の記事に書き足しました。
勾配降下法はまた別の記事に書きたいと思います。
softmax(ソフトマックス)関数
softmaxの数学的な意味合いは こちらの記事 に書きました。
TensorFlowのMNIST(チュートリアル)でよく出てくるsoftmax関数について調べたのでメモ。
softmax関数は、シグモイド関数の多変量版。正規化指数関数ともいう。
シグモイド関数と同様、アクティベーション関数の一種だが、多変量版なので、例えば、多クラスのフィードフォアワード型のニューラルネットの活性化関数として利用される。
参考: ソフトマックス関数 - 機械学習の「朱鷺の杜Wiki」
シグモイド関数は、教師あり学習で一般的に利用されるアルゴリズムであるバックプロゲーションを伴うニューラルネットワークでアクティベーション関数としてよく利用される。アクティベーション関数としてシグモイドが利用されるのは、比較的単純な非線形関数であり、微分も容易であるという数学的な理由による。
参考:活性化関数 - Wikipedia のシグモイド関数の項
フィードフォワードニューラルネットは、最初に考案された人口のニューラルネットで、ループを持たず、入力→中間→出力という単方向で信号が伝搬される。
単に入力と出力からなるものを単純パーセプトロン、入力・中間・出力のように複数の層からなるものを複層パーセプトロンという。
ニューラルネットワーク
ニューラルネットワークは脳機能の特性を計算機上のシミュレーションにより表現することを目指した数学モデル。
もともとは、脳をモデル化することから始まったが、次第に実際の脳のモデルから乖離していったため、人口ニューラルネットワークとも言われている。
ニューラルネットワークは、教師あり学習という教師信号の入力によって、問題に対して最適化されていくものと、教師信号を必要としない教師なし学習がある。明確な回答が用意される場合には、教師あり学習が用いられ、データのクラスタリングには、教師なし学習が用いられる。(アルファ碁のような勝ち負けのための人口知能については、教師あり学習が、複数の画像に対してパターン分析をかけるような場合は、教師なし学習が使われるようなイメージかな?)
教師あり学習のアルゴリズムはバックプロパゲーションが一般的。
(ニューラルネットワーク - Wikipedia の学習方法より)
ニューラルネットワークには、幾つかの種類がある。
*自己組織化写像
*畳み込みニューラルネットワーク
*リカレントニューラルネットワーク (再帰型ニューラルネットワーク)
*確率的ニューラルネット
*スパイキングニューラルネットワーク
ニューラルネットワークでは、線形変換を施した後、非線形関数を通す仕組みがあるが、この非線形関数をアクティベーション関数(あるいは活性化関数)という。
アクティベーション関数にも、幾つかの種類がある。以前から用いられていたのはステップ関数(場合分けによりより0、1に分かれる関数)だが、他にシグモイド関数、ソフトサイン関数、ソフトプラス、ReLU(ランプ関数)などがある。
TensorFlowにおいて、softmaxという関数が出てくるが、
Neural Networkをちょっとかじった人のための、はじめてのTensorFlow - Qiita
これも、アクティベーション関数の一つ。ただし、出力層のアクティベーション関数らしい。
次に調べるもの:
* オートエンコーダー