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

PRODUCED BY RECRUIT

【イベントレポート】AI向けの数学とPythonを基礎から学ぼう!

この記事では2020年3月24日に開催した、オンライン動画配信イベント「人工知能(AI)、機械学習のための数学の基礎-Pythonのコードと共に学ぶ人工知能/深層学習に必要な数学-」をレポートします。

昨年11月のイベントで「どのように数学を機械学習で活用するか」についてお話しいただいた、我妻幸長さん。今回のイベントでは、前回よりも一つレベルアップをした内容で、人工知能に必要な数学を我妻さんにご解説いただきました。

■今回のイベントのポイント
・人工知能の学習に必要な数学知識は、主に線形代数、微分、確率/統計
・特に線形代数と微分が大事
・Pythonには、AI向けの数学用ライブラリが用意されている

【講師プロフィール】
我妻 幸長さん
「ヒトとAIの共生」がミッションの会社、SAI-Lab株式会社の代表取締役。AI関連の教育と研究開発に従事。東北大学大学院理学研究科修了。理学博士(物理学)。興味の対象は、人工知能(AI)、脳科学、シンギュラリティなど。オンライン教育プラットフォームUdemyで、3.5万人以上にAIを教える人気講師。著書に、「はじめてのディープラーニング」「はじめてのディープラーニング2」(SBクリエイティブ)、「Pythonで動かして学ぶ!あたらしい数学の教科書 機械学習・深層学習に必要な基礎知識」(翔泳社)。共著に「No.1スクール講師陣による 世界一受けたいiPhoneアプリ開発の授業」(技術評論社)。

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

人工知能(AI)の定義は人によりさまざまですが、我妻さんによれば、次のような3つの大きな捉え方があるそうです。

・自ら考える力が備わっているコンピュータのプログラム
・コンピュータによる知的な情報処理システム
・生物の知能、もしくはその延長線上にあるものを再現する技術

また、AIには「強いAI」と「弱いAI」があるそうです。強いAIとは、テレビや映画に登場するロボットのようなものを指しますが、これらの共通点は、残念ながらまだ実現していないところだそうです。

一方で、ニュースなどでよく耳にする人間を打ち負かすようなチェスのプログラムは弱いAIに分類されるそうです。身近な存在としては、スマートフォンの操作を代わりに行ってくれるアシスタント機能のようなものも弱いAIに分類されます。

現在は第三次AIブームであると言われていますが、その主役はこうした弱いAIを指しています。もちろん、一口に「AI」と言っても、そのカテゴリは多岐にわたっているそうです。

「AI=機械学習」のイメージを持たれる方も多いかと思いますが、それ以外にも、アルゴリズムが交配して突然変異なども起こす「遺伝的アルゴリズム」、シロアリや鳥の群れのふるまいを再現する群知能といったものもAIのカテゴリに入るとのことでした。

f:id:itstaffing:20200605141101j:plain
▲人工知能は、流行りの機械学習だけではなく、分野は多岐にわたる

もちろん、今回のテーマは機械学習。機械学習の実現にも、強化学習、決定木、ニューラルネットワークなど、さまざまなアルゴリズムがありますが、今回紹介してくださったのは「ニューラルネットワーク」です。

これは脳の神経細胞をモデル化し、それらを多階層で結合したものです。

f:id:itstaffing:20200605141104j:plain
▲脳の神経細胞が層を形成して接続されたニューラルネットワークのモデル図。人によって見解は違うものの、一般には4層以上あるものがディープラーニングと呼ばれているとのこと

さらにニューラルネットワークにおいてもアルゴリズムがいくつかあり、たとえば、画像認識には「畳み込みニューラルネットワーク(CNN)」、画像生成には「敵対的生成ネットワーク(GAN)」、自然言語処理には「再帰型ニューラルネットワーク(RNN)」といったアルゴリズムが使われているそうです。

今回扱うのは、とてもシンプルなニューラルネットワークのモデルだそうです。

人工知能と数学

人工知能の学習に必要な数学知識には主に線形代数、微分、確率・統計という3つの分野があり、特に線形代数と微分が大事とのことで、今回は、そのうちの線形代数にフォーカスし、行列について、実際にプログラミングを交えながら解説してくださいました。

数式からコードへの変換は、数式という「言語」をプログラミング言語に変換していくこと。プログラミング言語のコード化をすることで、数式にさまざまな値を代入し、試行錯誤することができるようになります。しかもPythonには、そうしたAI向けの数学用ライブラリが用意されているため、AIの勉強に最適なのだそうです。

今回解説してくださったのは行列積と転置について。

行列積とは行列同士の掛け算のことですが、そもそもAIの学習で、なぜ行列積を求めるのでしょうか。実はAIの学習において積の総和を扱うことが多いのだそうです。

たとえば先ほど登場した脳の神経細胞であるニューロンでは、つながっている複数の神経細胞それぞれからの入力を基に、次の神経細胞に対して値を出力していきますが、このとき、それぞれの値の総和を求める必要があります。

そして積の総和を簡潔に記述できるのが行列積です。

f:id:itstaffing:20200605141107j:plain
▲行列積の考え方と計算方法

たとえば次のような行列式を考えます。

f:id:itstaffing:20200605141110j:plain
▲単純な行列式の例。行列aと行列bの行列積は、Pythonではnp.dot(a, b)で求められる

ただし、行列積で掛け算を行う際は、前の行列の行と、次の行列の列の要素数が一致していなければなりません。たとえば上図のような4行3列の行列と3行4列の行列の行列積は求められますが、4行3列同士の行列積は求めることができません。

そこで登場するのが転置です。転置とは、その名の通り、行列の行と列を置き換えます。

f:id:itstaffing:20200605141113j:plain
▲転置の例。行列bの転置は、Pythonではb.Tで求められる

ニューラルネットワークを数式で表す

最後に、簡単なニューラルネットワークのモデルを数式で表し、それをプログラムで実装・実行してくださいました。

ここで紹介しているディープラーニングでは、脳の神経細胞であるニューロンの動作を次の図のようなものと捉えます。

f:id:itstaffing:20200605141117j:plain
▲ニューロンへの入力に重み付けをし、バイアスをかけたあと、活性化関数で処理した結果を出力する。各入力は、そのままではなく重み付けされた上で処理される。バイアスとは、ニューロンの感度を調整するためのもので、後述する逆伝播でダイナミックに調整される。また、活性化関数は、このニューロンが興奮するかしないかを導き出すものとのこと

このとき、ニューロンへの入力をx、重みをwとすると、重み付けされた入力はxwとなり、k個の入力があるとすると、k個分のxwの総和を求め、そこにバイアス値bを加えたものをuとし、活性化関数をf(u)とすると、数式は上図のようになります。

活性化関数にはシグモイド関数というものを使用します。これはyが0のときはニューロンが興奮していない状態、yが1のときは興奮している状態を表します。

f:id:itstaffing:20200605141119j:plain
▲ここでは処理を簡潔にするため、シグモイド関数もシンプルなものを使用

一通りの流れを説明したあと、これらの処理をPythonのコードにしたものを実行してくださいました。

f:id:itstaffing:20200605141122j:plain
▲複雑な部分を可能な限りシンプルなものとし、動作の仕組みを理解できる形のプログラムで示してくださった

実際には、入力から各階層のニューロンへの順伝播が行われたあと、得られた結果を基に、バックプロパゲーションと呼ばれる逆伝播を行って各ニューロンのバイアス調整などを行っていく必要があるそうですが、そのためには偏微分など、さらなる高等数学の理解が必要になるそうです。

イベントにご参加いただいた方からは、「デモがあったので理解しやすかった。本を読むだけで手を動かして学んでいなかったのですが、実際に簡単なコードから書いてみようと思えました」という声や、「コードを一から書いてみたい」などの声をいただきました。

我妻さんによれば「コードを書くのはスポーツと一緒。練習で素振りをするように、何かを作ってみる。数式に落とし込んで、Pythonで書いていくことに慣れることが大切です」とのこと。そして、いきなり複雑で難しい4×4のルービックキューブよりも、2×2のルービックキューブから始めるのが簡単なように、プログラミングも、まずはシンプルな課題を解いていくことが、楽しむ秘訣だそうです。

▼本イベントは動画でも公開しています。ぜひこちらからご視聴ください
https://www.r-staffing.co.jp/engineer/entry/20200522_1

株式会社リクルートスタッフィングでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。