はじめに
1章 機械学習で利用される主な数学知識について
2章:Pythonの環境構築と言語学習
3章:ゼロから作るDeep Learningを勉強してみた
4章:NNCを利用して学習モデルの構築
5章:Chainer
6章 クラウドサービスを使って機械学習環境の構築
7章 Pytorch
終わりに
本書では、著者が新卒SEとして入社後、独学で機械学習について勉強し、1年後に機械学習エンジニアとしてアサインされるまでに学んだ内容・読んだ書籍・実装した内容について紹介します。著者が勉強した内容を模倣すれば機械学習エンジニアになれる、と保証はできません。しかし、著者が学んだ内容について広く紹介するので、機械学習に興味がある人や学ぼうと思っている方に少しでも参考になればと思います。また、勉強した内容に関するサンプルのソースコードを載せておりますが、独学で機械学習の勉強を行なった時期のプログラムをそのまま載せているので、多少コーディングが汚い部分もあると思います。pythonの勉強を始めた人にも、機械学習の分野について興味を持って欲しいと思い、また一部プログラムについては未熟だった当時の著者に多少なりとも親近感を持って欲しいという思いから、当時のままの状態でプログラムを載せてあります。本書に対応したサンプルプログラムは以下のgithub上に公開しているので、合わせてご活用ください。
https://github.com/taka-baya/1styear_ml.git
※以下gitコマンドでのダウンロード
git clone https://github.com/taka-baya/1styear_ml.git
また、本書に記載されている用語の表現や数式の定義については、Ian Goodfellow(著),松尾 豊(監訳)「深層学習」をはじめとした書籍をベースに説明しております。こちらの本も合わせてお読みいただけると幸いです。
今現在、ニュースやITで言われる人工知能とはなんなのか、明確な定義はあるのか。有名な人工知能の研究者達が考えている定義の例を何個か紹介していきたいと思います。
研究者 | 所属 | 定義 |
松尾 豊 | 東京大学 | 人工的に作られた人間のような知能。ないしはそれを作る技術。人間のような知能であるとは、「気づくことのできる」コンピュータ、つまり、データの中から特徴量を生成し現象をモデル化することのできるコンピュータという意味である。 |
山川 宏 | ドワンゴ人工知能研究所 | 計算知能のうちで、人間が直接・関節に設計する場合を人工知能と呼んでいいのではないかと思う |
長尾 真 | 京都大学 | 人間の脳の活動を極限までシュミレートするシステムである |
武田 英明 | 国立情報学研究所 | 人工的に作られた知能を持つ実態。あるいはそれを作ろうとする事によって知能自体を研究する分野である |
※引用元:総務省 第1部 特集 第2節 人工知能(AI)の現状と未来(http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h28/html/nc142110.html)
上記の研究者による定義を見ると、「人工的に作られた知能」という大まかな定義こそどの研究者も似たような見解を示していますが、専門家や研究者の間でも「人工知能」に関する確立した学術的な定義、合意はありません。ですので、人工知能については今現在はっきりとした定義が存在するわけではありません。では、今現在よく耳にする人工知能、機械学習、深層学習(ディープラーニング)についてはどうでしょうか。よく使われる用語について、簡単に今現在の著者の知見と見解を説明したいと思います。よく以下のようなベン図で、人工知能の中に機械学習があり、機械学習の中に表現学習、更にその中に深層学習が定義されているのを見かけることと思います。
・人工知能(AI):人間の知識を「if then else」のロジックを用いて三段論法でつなげていくことにより、人間のやっている推論は再現できるという考えを元にすることで、人工知能を定義することが可能です。
・機械学習:過去のデータを対象に、主に確率などの統計数理を用いて物事を分類したり判断することを指します。代表的な例としては単回帰やロジスティック回帰になります。
・表現学習:大量の入力データを次元圧縮などを用いることで、データ生成過程において潜在する仮定や観測データの裏に潜む原因について調査を行います。代表的な例としては、教師なし学習やオートエンコーダと呼ばれるものがあります。
・深層学習:多層パーセプトロン、ニューラルネットワーク、ディープラーニングなど、多層のニューラルネットワークによる機械学習手法を指します。今日最も知られている初期の学習アルゴリズムは、人間や動物の脳の中でどのように学習が行なわれているのかをモデル化した人工ニューラルネットワークです。
本書では上記の定義を念頭に置いて説明を進めていきます。先ほど説明したように人工知能について明確な定義は今現在確立されていないので、知見や意見などの違いがあり得ることをあらかじめご了承ください。
◯教師あり学習
教師あり学習とは、正解のあるデータで機械学習を行うことです。例えば0〜9の手書き文字を認識できるように機械学習を行います。学習をする際に入力した画像データに正解ラベル(0〜9)を紐づけて学習を行います。ただし、正解以外の答えは得ることはできません。つまり0〜9の手書き文字を認識することができるが、aやbなどのアルファベットは認識することができません。
◯教師なし学習
教師なし学習とは、正解のないデータで機械学習を行うことです。データの背後にある本質的構造を見つけることができます。例えばオートエンコーダを利用して、データを次元圧縮することによって本質的構造を見つけたりします。ただし、本質的構造を何に使うのかは、人間が考えます。
◯強化学習
強化学習とは答えを与える代わりに報酬を与え、それを得るための方法を見つける手法です。人間が思いもよらなかった答を出すこともあり得ますが、報酬が計算可能(ゲームのルールや物理法則等)な場合に限られます。
深層学習を勉強するにあたっては、行列やベクトルの計算方法の知識は必要不可欠でした。著者は書籍「やさしく学べる線形代数」を購入し、問題を解きながら学びました。著者にとってこの本は少し内容がお堅めで、途中で何度も挫折しましたが、やはり実際に数式を手計算で解いてみることが一番理解しやすいと感じました。
ここで学んだ内容について簡単に紹介するのも兼ねて、後ほど「機械学習の学習アルゴリズム」について説明する際に用いる数式を定義しておきたいと思います。
ベクトルはある順序に並べられた数値の配列の集まりを示します。その数値の配列の集まりを、以下のように大文字で示したります。また、数値の配列の集まりの個々の要素は、以下のように小文字に任意の添字を添えて表したりします。
例えば、あるベクトルxの要素がn個ある場合、次のように表すことができます。
上記のベクトルを、以下のように横に倒した形の行ベクトルを転置ベクトルと呼びます。
そもそもベクトルとは何に使うのか?何のためにあるのか?と疑問に思うかもしれません。著者も最初は同じ疑問を持ち、最初は以下のように理解しました。
例えばある車Aがx座標に対して速度3km、y座標に対して2kmで走っていたとすると、ある車の二次元空間での速度のベクトルは
と表すことができます。ここでは二次元でベクトルの例を示しましたが、分野によってベクトルの定義の仕方はさまざまです。機械学習の用語数学などは特に難しいと思うので、まずは著者が車を例にしたように、自分が理解しやすい考え方で理解するように努め、徐々に本質について理解すると学びやすいと思います。著者は機械学習で使われるベクトルについて、車を例にするとx,y座標だけでなく更に高次元のある車Aの速度x,y,z,...,ω,φを示した様なものの集まりであると認識しています。
2つのベクトルxとyが存在する時、ベクトルxとyの内積について以下のように計算することができます。
まず、内積とは何なのか?と疑問に思いましたが、いろいろ調べてみるとこの単語も物理学・統計学などで定義が異なります。内積とは「ふたつのベクトルの要素を順番に、それぞれ掛け合わせたものを全部足したもの」として著者は理解しています。内積を使うことによって、ふたつのベクトル(方向)の大きさやベクトルの成す角度を知ることができます。以下に簡単なベクトルの内積の計算例を示します。ふたつのベクトルxとyが以下のように表せる時、
ベクトルxとyの内積は
と計算することができます。この時、ベクトルxの1番目の要素は3になります。機械学習ではこのベクトルに関する表現が多く出てくるので、あらかじめ勉強しておくと機械学習についても理解しやすくなると思います。
行列とは、各成分はひとつだけでなくふたつのインデックスで表される数値配列です。行列の変数名は以下のように大文字の太字で表されることが多いです。横を見たものを「行」、縦を見たものを「列」と呼び、以下の行列A内の要素dは二行二列目の要素と表現されます。
また行列の要素を示す場合は、行列名には太字は使わず、以下のようにコンマを使ってインデックスを表します。
そして、行列には重要な演算子として転置があります。行列の転置は、左の角から右下までの主体角と呼ばれる行列の対角線に対する鏡像になります。上記の行列Aの転置行列を以下に示します。
ある行列の転置行列の記載方法としては、行列名にtransposeのTを添字として表現します。この転置行列は行列同士の足し算や掛け算を行う目的として用いられることが多いです。
以下のようなふたつの行列AとBが存在する時、行列AとBの足し算、掛け算について以下のように計算することができます。
行列の掛け算の場合、右側の行列の1行目と左側の行列の1列目を掛け合わせた値が、算出される行列の1行1列目に相当します。また、右側の行列の1行目と左側の行列の2列目を掛け合わせた値が、算出される行列の1行2列目に相当します。この作業を繰り返すことによってふたつの行列の積の値を求めることができます。
ここまでの線形代数の知識で、以下のような線型方程式を記述することができます。
この時、行列Aはm行n列の実数全体の集合であることを表現する場合、以下のように表現することができます。(集合とは何かしらの数値などの集まりを意味します)
ベクトルbは要素m個の実数全体の集合であることを表現する場合、以下のように表現することができます。
この時、ベクトルxが求めたい未知である場合に、以下のように方程式として表現することができます。
ここで表現した
は、行列Aについてどのような行列を定義するための表現です。数式記号「∈」は集合とは何かしらの集まりであり、実数の集合とは実数の集まりです。ベクトルと行列の積の表記や計算方法については、深層学習で特によく用いられます。
機械学習においては、確率統計の分野も必要不可欠です。例えば深層学習の学習の最適化を行う場合に確率の分野が出てきますし、線形回帰を行う場合も統計数理の知識が必要になります。著者は、回帰については「マンガでわかる統計学 回帰分析編」で学習・その内容の実装を行い、統計数理については「改訂版 日本統計学会公式認定 統計検定2級対応 統計学基礎」で学習を行いました。
回帰問題とは過去のデータから数値を予想する問題であり、単回帰という手法はこの回帰問題を解決するための手法のひとつです。単回帰を勉強することにより、機械学習(人工知能)が学ぶ仕組みや二乗誤差(後ほど説明します)などについて、理解しやすくなりました。例として機械学習を学ぶにあたって学んだ(実装した)単回帰について紹介します。
単回帰とは、ある変数xが与えられたとき、相関関係のある変数yを説明・求める手法のひとつです。例えば変数xが家から駅までの距離、変数yが家賃の値段だとすると、家から駅までの距離が近くなる程に家賃の値段が上がることが想像できると思います。線形回帰では、家から駅の距離から家賃の相場がいくらになるかを統計的に予測することができます。これを数式で表すと以下のように表すことができます。
重みwとは、統計的に求める値のひとつです。例えば、家から駅までの距離と家賃の上がり具合について考えてみることにします。都心部なのか郊外なのかによって、家から駅までの距離と家賃の値上がり度の大きさは変わるでしょう。おそらく都心部の方が、家から駅までの距離が近いほど家賃の値上がりの傾きが大きくなると思います。ですので、重みwというのは、家賃の値上がりの傾きを示しているものだと捉えてください。あらかじめ与えられた説明変数と目的変数を用いて、重みwを求めることができます。
次に、バイアスbも統計的に求める値のひとつです。先ほどの例だと、都心部でも郊外でも、家から駅までの距離にかかわらず最低賃金があります。その最低賃金(切片)を示しているのがバイアスbだと思ってください。あらかじめ与えられた説明変数と目的変数を用いてバイアスbを求めることができます。
したがって、重みとバイアスを決定することにより、説明変数から、目的変数の値を求めることができるのが線形回帰です。では、実際に以下の例を用いて、単回帰の回帰式を求めたいと思います。例題として以下のような、日にち毎の最高気温とアイスティーの売り上げのデータがあるとします。
日付 | 最高気温 | 注文数 |
2017/7/1 | 29 | 76 |
2017/7/2 | 28 | 65 |
2017/7/3 | 34 | 93 |
2017/7/4 | 31 | 84 |
2017/7/5 | 25 | 59 |
2017/7/6 | 29 | 64 |
2017/7/7 | 32 | 80 |
2017/7/8 | 31 | 75 |
2017/7/9 | 24 | 53 |
2017/7/10 | 33 | 92 |
2017/7/11 | 25 | 54 |
2017/7/12 | 31 | 75 |
2017/7/13 | 26 | 65 |
2017/7/14 | 30 | 80 |
実際に上記の気温とアイスティーの売り上げをプロットすると、以下の図のようになります。
上記の図から、気温が高くなればなるほどアイスティーの販売数が上がる傾向にあることが想定できます。では最高気温とアイスティーの販売数にどのくらいの関係性があるのか、最高気温を説明変数とした時に、目的変数のアイスティーの売り上げ個数を求めるようなモデルの重みとバイアスを求めてみたいと思います。
今回求めるための単回帰のモデル式は以下のように表すことができます。
bは切片(バイアスパラメータ)です。説明変数は最高気温の要素ひとつのみとなるので、求める重みもひとつのパラメータのみとなります。よって、上記の単回帰モデル式は以下のように表せます。
と定義する時、単回帰式を求めるための偏差平方和・偏差積和は以下のように表すことができます。偏差平方和・偏差積和は単回帰式を求めるためのひとつの指標を示す数値だと思ってください。
この時、単回帰式の重みとバイアスは以下のような式を用いて求めることができます。