昨年11月のイベントで「どのように数学を機械学習で活用するか」についてお話しいただいた、我妻幸長さん。今回のイベントでは、前回よりも一つレベルアップをした内容で、人工知能に必要な数学を我妻さんにご解説いただきました。
・人工知能の学習に必要な数学知識は、主に線形代数、微分、確率/統計
・特に線形代数と微分が大事
・Pythonには、AI向けの数学用ライブラリが用意されている
人工知能、ディープラーニングとは?
人工知能(AI)の定義は人によりさまざまですが、我妻さんによれば、次のような3つの大きな捉え方があるそうです。
・コンピュータによる知的な情報処理システム
・生物の知能、もしくはその延長線上にあるものを再現する技術
また、AIには「強いAI」と「弱いAI」があるそうです。強いAIとは、テレビや映画に登場するロボットのようなものを指しますが、これらの共通点は、残念ながらまだ実現していないところだそうです。
一方で、ニュースなどでよく耳にする人間を打ち負かすようなチェスのプログラムは弱いAIに分類されるそうです。身近な存在としては、スマートフォンの操作を代わりに行ってくれるアシスタント機能のようなものも弱いAIに分類されます。
現在は第三次AIブームであると言われていますが、その主役はこうした弱いAIを指しています。もちろん、一口に「AI」と言っても、そのカテゴリは多岐にわたっているそうです。
「AI=機械学習」のイメージを持たれる方も多いかと思いますが、それ以外にも、アルゴリズムが交配して突然変異なども起こす「遺伝的アルゴリズム」、シロアリや鳥の群れのふるまいを再現する群知能といったものもAIのカテゴリに入るとのことでした。
もちろん、今回のテーマは機械学習。機械学習の実現にも、強化学習、決定木、ニューラルネットワークなど、さまざまなアルゴリズムがありますが、今回紹介してくださったのは「ニューラルネットワーク」です。
これは脳の神経細胞をモデル化し、それらを多階層で結合したものです。
さらにニューラルネットワークにおいてもアルゴリズムがいくつかあり、たとえば、画像認識には「畳み込みニューラルネットワーク(CNN)」、画像生成には「敵対的生成ネットワーク(GAN)」、自然言語処理には「再帰型ニューラルネットワーク(RNN)」といったアルゴリズムが使われているそうです。
今回扱うのは、とてもシンプルなニューラルネットワークのモデルだそうです。
人工知能と数学
人工知能の学習に必要な数学知識には主に線形代数、微分、確率・統計という3つの分野があり、特に線形代数と微分が大事とのことで、今回は、そのうちの線形代数にフォーカスし、行列について、実際にプログラミングを交えながら解説してくださいました。
数式からコードへの変換は、数式という「言語」をプログラミング言語に変換していくこと。プログラミング言語のコード化をすることで、数式にさまざまな値を代入し、試行錯誤することができるようになります。しかもPythonには、そうしたAI向けの数学用ライブラリが用意されているため、AIの勉強に最適なのだそうです。
今回解説してくださったのは行列積と転置について。
行列積とは行列同士の掛け算のことですが、そもそもAIの学習で、なぜ行列積を求めるのでしょうか。実はAIの学習において積の総和を扱うことが多いのだそうです。
たとえば先ほど登場した脳の神経細胞であるニューロンでは、つながっている複数の神経細胞それぞれからの入力を基に、次の神経細胞に対して値を出力していきますが、このとき、それぞれの値の総和を求める必要があります。
そして積の総和を簡潔に記述できるのが行列積です。
たとえば次のような行列式を考えます。
ただし、行列積で掛け算を行う際は、前の行列の行と、次の行列の列の要素数が一致していなければなりません。たとえば上図のような4行3列の行列と3行4列の行列の行列積は求められますが、4行3列同士の行列積は求めることができません。
そこで登場するのが転置です。転置とは、その名の通り、行列の行と列を置き換えます。
ニューラルネットワークを数式で表す
最後に、簡単なニューラルネットワークのモデルを数式で表し、それをプログラムで実装・実行してくださいました。
ここで紹介しているディープラーニングでは、脳の神経細胞であるニューロンの動作を次の図のようなものと捉えます。
このとき、ニューロンへの入力をx、重みをwとすると、重み付けされた入力はxwとなり、k個の入力があるとすると、k個分のxwの総和を求め、そこにバイアス値bを加えたものをuとし、活性化関数をf(u)とすると、数式は上図のようになります。
活性化関数にはシグモイド関数というものを使用します。これはyが0のときはニューロンが興奮していない状態、yが1のときは興奮している状態を表します。
一通りの流れを説明したあと、これらの処理をPythonのコードにしたものを実行してくださいました。
実際には、入力から各階層のニューロンへの順伝播が行われたあと、得られた結果を基に、バックプロパゲーションと呼ばれる逆伝播を行って各ニューロンのバイアス調整などを行っていく必要があるそうですが、そのためには偏微分など、さらなる高等数学の理解が必要になるそうです。
イベントにご参加いただいた方からは、「デモがあったので理解しやすかった。本を読むだけで手を動かして学んでいなかったのですが、実際に簡単なコードから書いてみようと思えました」という声や、「コードを一から書いてみたい」などの声をいただきました。
我妻さんによれば「コードを書くのはスポーツと一緒。練習で素振りをするように、何かを作ってみる。数式に落とし込んで、Pythonで書いていくことに慣れることが大切です」とのこと。そして、いきなり複雑で難しい4×4のルービックキューブよりも、2×2のルービックキューブから始めるのが簡単なように、プログラミングも、まずはシンプルな課題を解いていくことが、楽しむ秘訣だそうです。
https://www.r-staffing.co.jp/engineer/entry/20200522_1
株式会社リクルートスタッフィングでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。