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

PRODUCED BY RECRUIT

【イベントレポート】人工知能(AI)、機械学習のための数学入門-Pythonのコードを書きながら学ぶ人工知能/深層学習に必要な数学

この記事では、2019年11月22日に開催したイベント「人工知能(AI)、機械学習のための数学入門-Pythonのコードを書きながら学ぶ人工知能/深層学習に必要な数学」をレポートします。

さまざまなフレームワークの登場により、アルゴリズムや数学を理解しなくても機械学習を行うことが可能に。しかし、本当の意味で機械学習を理解するためには、数学とプログラミングを駆使してアルゴリズムを根幹から学ぶ必要があります。今回のイベントでは、書籍『Pythonで動かして学ぶ!あたらしい数学の教科書 機械学習・深層学習に必要な基礎知識』の著者である我妻幸長さんに、どのように数学を機械学習で活用するかを教えていただき、数式の攻略方法も解説していただきました。

■今回のイベントのポイント
・数式という「言語」を「プログラミング言語」に変換する
・コードにすることで、手軽に試行錯誤が可能になる
・NumPyで高速な演算、matplotlibで可視化

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

環境構築なしに試せるGoogle Colaboratory

今回のイベントでは、環境にGoogle Colaboratoryを用い、数式の記述に、文書処理システムのLaTeXを使用していきます。Google Colaboratoryは、Googleアカウントがあれば利用可能なサービスで、機械学習やディープラーニングなどを、煩わしい環境構築なしに試すことができます。Jupyter Notebookのように、記述したソースコードをインタラクティブに実行することができるなど、とても便利です。

f:id:itstaffing:20200210112226j:plain
▲Google Colaboratoryの画面

Google DriveからメニューでGoogle Colaboratoryを起動します。なお、Googleによれば、Google ColaboratoryはGoogle Chrome、Firefox、Safariのブラウザでは動作確認済みとのことですが、Windowsに標準のEdgeでは動かないこともあるようです。

ここではブラウザにGoogle Chromeを選び、Google Colaboratoryを使って、次のように入力してみます。

a = 3
b = 4
print( a + b )

Google Colaboratoryで[+コード]をクリックし、コードを入力していきます。コード入力欄の左側にある[セルを実行]ボタン(黒丸の中に白三角)をクリックすると、プログラムが実行され、結果として「7」と表示されます。

また、Google Colaboratoryのメニューから[+コード]をクリックするとコード用セルが追加され、[+テキスト]をクリックするとテキスト用セルが追加されます。

Notebook形式のファイルにしておけば、テキストを書き、プログラムのコードを記述して、勉強していくノートとして使うことができます。

さらに、Google Colaboratoryでは、LaTeX形式による数式の入力と出力も可能です。LaTeXは数式を表現するための言語で、論文や出版物などにも利用されています。LaTeXでの数式の記述は、LaTeXに則った数式表記法の前後は「$」あるいは「$$」で囲みます。文章中に数式を入れる場合は「$」で、数式を独立した行に表示する場合は「$$」で囲みます。

$y = x^2 + 3x + 5$
$$y = x^2 + \frac{1}{x} + 5$$

f:id:itstaffing:20200210112230j:plain
▲LaTeXは、このように数式を混在させる文章を書くときに便利なマークアップ言語

機械学習の勉強では行列式なども登場し、数式を参照する機会が多いため、LaTeXで記述した数式を併記しておく習慣をつけておくと良いそうです。

人工知能に必要な「線形代数」

次に線形代数についてです。線形代数とは、ベクトル、行列、テンソルによる演算など、多次元の構造を持った数値の並びを扱う数学の分野の一つです。

この分野では、数億、数十億といったパラメータを扱うこともあるそうですが、そうした計算も、数式を使えば簡単に記述することができます。

また、Pythonには「NumPy」という充実した数学用ライブラリパッケージがあり、行列演算や微積分、確率と統計などの計算に役立つ関数が多数用意されており、高速な演算を行うことができるそうです。

確率と統計の分野では、コードからグラフを描画すると分かりやすいのですが、その点も、Pythonの「matplotlib」というライブラリを利用することで、計算結果を手軽に可視化することができるとのこと。

数式という「言語」を「プログラミング言語」に変換することで、手軽に試行錯誤が可能になります。試行錯誤という意味では、いちいちコンパイルして実行するという手間のないPythonは向いており、ソースコードを入力し、すぐに同じアプリ内で結果を参照できるGoogle Colaboratoryを使う学習方法はお勧めであるそうです。

ニューラルネットワークの実装に必要な線形代数「行列積」

こうしたことを踏まえ、ここから先は我妻さんが、Google Colaboratoryを使って高等数学の説明をしてくださいました。

ディープラーニングにおける行列の処理そのものは、Pythonのライブラリを使えば、コマンド一発で答えを導きだせるのですが、もしライブラリを使わずに実装するならば、行列積と転置を理解しておく必要があるそうです。

行列積とは、前の行と後ろの列の各要素を掛けた総和のこと。実は、機械学習で各ニューロンが行っているのも、入力されたデータを当てはめた行列積の演算だそうで、何億もあるパラメータの積の総和も、Pythonでプログラムを書けば簡単に求められるということです。

f:id:itstaffing:20200210112205j:plain
▲2つの行列の互いの行と列を掛け算し、足していく

次のような行列積を求めてみます。

f:id:itstaffing:20200210112208j:plain
▲我妻さんの丁寧な解説と共に、実際に試された行列積

この答えを求めるプログラムをPythonで記述すると、次のようになります。また、NumPyでは、np.dot()命令で行列積を求めることができます。

import numpy as np
A = np.array([[1, 2, 3],[3, 2, 1]])
B = np.array([[3, 2],[2, 0],[1, 1]])
print (np.dot(A, B))

結果は次のようになります。

f:id:itstaffing:20200210112210j:plain
▲すぐに実行・結果を参照できるため、Google ColaboratoryはPythonと数学の学習に最適

ニューラルネットワークの実装に必要な線形代数「転置」

次は転置の例を学びます。転置とは、行列の行と列を入れ替えることで、こちらも機械学習では頻繁に登場するそうです。

行列式では、互いの行と列の要素数が同じでないと計算ができません。そうしたとき、転置を行うと計算ができるようになることがあります。

たとえば、次のプログラムは実行するとエラーになります。

import numpy as np
A = np.array([[1, 2, 3],[3, 2, 1]])
B = np.array([[3, 2, 0],[1, 1, 2]])
print (np.dot(A, B)) # エラーになる

これは行列Aと行列Bの互いの行と列の要素数が異なっているためです。そこで行列Bの行と列を入れ替える転置を行うことで、行列積が求められるようになります。

NumPyでは、行列に対してTというメソッドを使うことで転置が行えます。

print(B.T) # 行列Bが転置される

つまり、先ほどのプログラムの最終行を次のように書き換えると、エラーを出さずに行列積が求められるようになります。

print (np.dot(A, B.T))

人工知能に必要な数学「微分」

機械学習では「バックプロパゲーション」という処理が行われます。この処理は、数学的には偏微分が使われているそうです。いわゆる微分・積分は、選択によっては、高校での数学でもギリギリ習いますが、偏微分は、もはや大学で勉強する領域。この短い時間でのイベントでは、そこまで到達することはできません。

そこで、ここでは微分の復習をし、最後に偏微分とはこういうものといったプログラムを紹介してくださることになりました。

「極限」とは、関数における「ある変数」を「ある値」に近づけるとき、関数の値が近づく値のことを指します。

f:id:itstaffing:20200217124925j:plain
▲xを限りなく小さくして0に近づけていくという極限を式で表すとこうなる

たとえば、y = f(x)という関数において、変数x の微小な変化Δxは、y = f(x + Δx)と表されます。このときyの微小な変化Δyと、x の微小な変化Δxの割合は次の式で示されます。

f:id:itstaffing:20200210112216j:plain
▲Δxの変化に対するΔyの変化の割合

このとき、関数f(x)の値を最小化することを導関数f′(x)で表すことができます。関数f(x)から導関数f′(x)を求めるのが「微分」です。

f:id:itstaffing:20200210112218j:plain
▲f(x)から導関数f′(x)を求めるのが微分。いくつかの関数は公式を用いて微分することができる

機械学習では、1つのパラメータが全体に与える影響を求めますが、このときに偏微分を使います。機械学習で登場するバックプロパゲーションは、偏微分を使って、誤差に対して偏微分をかけ勾配の更新を行うことで、学習の精度を向上させていくのだそうです。

次に微分のプログラムについて解説していただきました。ここでは詳細を割愛しますが、「matplotlib」を使って結果をグラフに示せることは、とても興味深く感じた参加者の方も多かったようです。

f:id:itstaffing:20200210112220j:plain
▲matplotlibによる微分の接線描画プログラム

f:id:itstaffing:20200210112223j:plain
▲プログラムの実行結果

数字の基礎やLaTeXの使い方などが参考になったという声や、実際に数式の結果を見ることによって、よりわかりやすく感じ、本を見ながら、さらに勉強を進めていきたい意欲が湧きました、との声も参加者からいただきました。

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