{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Medical AI Course Materials : 01_Basic_Math_for_ML.ipynb", "version": "0.3.2", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "cells": [ { "metadata": { "colab_type": "text", "id": "_atjBBsxuKH7" }, "cell_type": "markdown", "source": [ "# 機械学習に必要な数学の基礎\n", "\n", "本章では,ディープラーニングを含めた機械学習に必要な数学の基礎である「微分」「線形代数」「確率・統計」の3つについて,簡潔に紹介していきます.\n", "\n", "\n", "\n", "## 機械学習とは\n", "\n", "機械学習は,コンピュータがデータから学習することで,そのデータに含まれる規則や判断基準などのパターンを抽出する関数を獲得し,その関数を用いて新たなデータについて予測を行う手法です.機械学習技術は現在では,画像認識,音声認識,文書分類,医療診断,迷惑メール検知,商品推薦など,幅広い分野に応用されています.\n", "\n", "ここで,学習によって獲得される関数(**モデル**ともよばれます)は多くの場合**パラメータ**によって特徴づけられており,パラメータを決めればその関数の挙動が決まります.最も単純な例として直線の関数を考えると,これは傾き$a$と切片$b$の2つのパラメータで特徴づけられ,$f(x; a, b) = ax + b$のように表記します.(ここで$x$は関数の**入力変数**とよびます.また$;$の後ろにパラメータを表記します).機械学習の目標は,データを使ってこれらのパラメータを決定することです.\n", "\n", "機械学習は,**目的関数**とよばれる関数を最小化(または最大化)することで学習,つまり望ましい挙動をするようなパラメータを決定します.そのため,目的関数はモデルの出力値が望ましい場合には小さな(または大きな)値をとり,そうでない場合は大きな(または小さな)値をとるように設計します.\n", "\n", "例えば,モデルの入力と出力のペアからなるデータセット$D=\\left((x_1, y_1), (x_2, y_2), \\ldots, (x_n, y_n) \\right)$が与えられたとします.ここで,$x_{i}$は$i$番目のサンプルの入力,$y_{i}$は$i$番目のサンプルの出力を表します.これらの点の近くをできる限り通るような直線$f(x; a, b) = ax + b$を求めたいとします.出力が実数値の場合,パラメータ$\\theta = (a, b)$とおいて,次のような目的関数がよく利用されます.\n", "\n", "$L( \\theta) = \\sum_{i=1}^n (y_i - f(x_i; \\theta))^2$\n", "\n", "この関数を最小化することを考えます.上式では,モデルの予測値$f(x_i; \\theta)$と正解$y_i$との二乗誤差を求め,その合計値を計算しています.全てのデータで予測と正解が一致する時だけ$0$,それ以外は,大きく間違えるほど大きな正の値をとります.間違えた度合いを測る関数を,特に**損失関数**とよぶこともあります.また,与えられたデータセット全体に対するペナルティの合計値を求めるような目的関数は**コスト関数**ともよばれることもあります.目的関数の引数は$\\theta$となっており,目的関数を最小化する最適な$\\theta$を求めることで,データセット$D$を精度良く予測する関数$f(x; \\theta)$が得られることになります\n", "\n", "目的関数の最小化問題を解くためには微分と線形代数の知識が必要になります.ただし,微分と線形代数の全ての知識は必要ありません.以降,機械学習の理解に必要な最低限の知識を説明します.\n", "\n", "## 微分\n", "\n", "関数のある入力値における微分は,その点におけるグラフの**接線の傾き**に相当し,下図のように関数に接する直線として表すことができます.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/01.png)\n", "\n", "例えば上図の関数においては,$a$の点における接線は赤い直線であり,その傾きは$+3$となっています.右肩上がりな直線の傾きは正の値になります.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/02.png)\n", "\n", "それに対し,次の図の$b$の点においては,傾きは$-1$であり,接線は右肩下がりの直線となっています.\n", "\n", "もし目的関数の値が全てのパラメータについて計算できているならば,その中から目的関数の最小値を選び出すのは可能ですが,そのようなことは通常不可能です.しかし,ある点でのパラメータに関する微分を計算できれば,接線の傾きを求めることができ,パラメータ全域のグラフ形状がわからなくても,パラメータを変化させた時に目的関数がどう変化するのかが分かります.この情報に基づいて,目的関数を小さくするようにパラメータを更新することができます.\n", "\n", "再度,微分の説明に戻り,その定義や多変数入力,多変数出力の場合について詳しくみていきます.\n", "\n", "### 2点間を通る直線の傾き\n", "\n", "はじめに,微分の原理を理解していくために,下図に示す2点間を通る直線の傾き$a$を求めてみましょう.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/04.png)\n", "\n", "この時,傾き$a$は,\n", "\n", "$$\n", "a = \\dfrac{f(x_{2}) - f(x_{1})}{x_{2}-x_{1}}\n", "$$\n", "\n", "と求まります.\n", "\n", "### 1点での接線の傾き\n", "\n", "次に,与えられた関数の接線の傾きを求めていきます.そのためには,**極限**の考えが必要になります.極限では,変数がある値に限りなく近づくとき,その変数によって記述される関数がどのような振る舞いをするか考えます.極限を表すために,$\\lim$ という記号が一般的に用いられます.例えば,\n", "\n", "$$\n", "\\displaystyle \\lim _{x\\rightarrow 0}3x=3\\times 0=0\n", "$$\n", "\n", "は,$x$という変数を$0$に近づけていったときに式の値がどのような値になるかを与えます.\n", "\n", "それでは,下図のある点$x$における接線の傾き$a$を求めていきましょう.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/05.png)\n", "\n", "さきほど考えた2点を通る直線と極限を組み合わせて,接線を求めることができます.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/06.png)\n", "\n", "はじめに,$x$から$h$だけ離れた点$x+h$を考え,2点を通る直線の傾きを求めてみます.次に$h$を$h \\rightarrow 0$のように小さくしていけば,直線の開始点と終了点の2点が1点に収束し,1点での接線として考えることができます.これを式でみると\n", "$$\n", "\\begin{aligned}\n", "f'(x) &=\\lim _{h\\rightarrow 0}\\dfrac {f\\left( x+h\\right) -f\\left( x\\right) }{\\left( x+h\\right) -x}\\\\\n", "&=\\lim _{h\\rightarrow 0}\\dfrac {f\\left( x+h\\right) -f\\left( x\\right) }{h}\\\\\n", "\\end{aligned}\n", "$$\n", "\n", "となります.上の式を**導関数**とよびます.また導関数を求めることを**微分する**といいます.また,記号の使い方として,\n", "$$\n", "f'(x) = \\dfrac{d}{dx} f(x)\n", "$$\n", "\n", "のように表しても構いません.この$d$という記号はある変数における微小変化量を表しており,$df(x)$が対象の値の変化量,$dx$が$x$の変化量を表し,それらを小さくしていった時の極限を表します.この記法は煩雑ですが,変数が$x$,$y$など複数ある場合に,$x$で微分しているか,$y$で微分しているかが明確になるため,正確な表現をすることができます.\n", "\n", "### 微分の公式\n", "\n", "覚えておくと便利な微分の公式がありますので,以下に幾つか紹介していきます($c$は定数,$x$は変数を表します).\n", "\n", "$$\n", "\\begin{align}\n", "\\left( c\\right) ^{'}&=0 \\\\\n", "\\left( x\\right)^{'}&=1\\\\\n", "\\left( cf(x) \\right)^{'} &= c f'(x) \\\\\n", "\\left( x^{n} \\right)^{'} &=nx^{n-1} \\\\\n", "\\left( f(x) + g(x) \\right) ^{'} &=f^{'}(x)+g^{'}(x) \\\\\n", "\\left( f(x) g(x) \\right) ^{'} &= f^{'}(x)g(x) + f(x)g^{'}(x) \\\\\n", "\\left( f(g(x)) \\right) ^{'} &= \\frac{df(u)}{du}\\frac{du}{dx} = f^{'}(g(x)) \\cdot g^{'}(x) \\\\\n", "\\end{align}\n", "$$\n", "\n", "例えば,以下の微分を考えてみましょう.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\left( 3x^{2} + 4x + 5 \\right)' &= \\left( 3x^{2} \\right)' + \\left( 4x \\right)' + \\left( 5 \\right)' \\\\ \n", "&= 3 \\times \\left( x^{2} \\right)' + 4 \\times \\left( x \\right)' + 5 \\times \\left( 1 \\right)' \\\\ \n", "&= 3 \\times 2x + 4 \\times 1 + 5 \\times 0 \\\\ \n", "&= 6x + 4 \n", "\\end{aligned}\n", "$$\n", "\n", "このように,各項の和に対する微分の計算は,各項に対して微分した後に和をとるようにしても等式の関係が成立します.また,各項の微分を行う際に,定数の係数(変数にかかる数)は微分演算の外側に出すことができます.これらは微分の**線形性**とよばれる性質であり,この性質を使うことで,微分を簡単に計算できるようになります.\n", "\n", "### 合成関数の微分\n", "\n", "後の章で詳しく述べますが,一般的に機械学習においては複雑な**合成関数の微分**を考える必要が出てきます.簡単な例として,\n", "\n", "$$\n", "\\left\\{ (3x + 4)^{2} \\right\\}'\n", "$$\n", "\n", "を計算することを考えます.この式は$3x+4$という内側の部分と$(\\cdot)^{2}$という外側の部分で構成されています.この式を$(9x^2 + 24x + 16)'$のように展開してから微分を計算してもよいのですが,3乗や4乗となってくると展開するのも大変になります.ここで役に立つ考え方が合成関数の微分です.先程紹介した微分の公式の最後に登場していた式です.合成関数の微分は,内側の微分と外側の微分をそれぞれ行い,その結果をかけ合わせることで求めることができます.外側の微分の際には関数の引数を入力とみなし,その入力について微分をとります.\n", "\n", "それでは先程の$(3x+4)^2$という関数の微分を考えてみます.\n", "\n", "まず内側の関数を$u = (3x+4)$とおいて,\n", "\n", "$$\n", "\\left\\{ (3x + 4)^{2} \\right\\}' = (u^{2})'\n", "$$\n", "\n", "とします.ここで,$(\\cdot)'$ をもう少し厳密に考える必要が出てきます.今は$x$と$u$の2つの変数が登場しており,$(\\cdot)'$では,$x$で微分しているのか$u$で微分しているのかの区別がつきません.そこで,多少複雑に見えますが,先程紹介した$d$を使った記法で微分する変数を厳密に記述すると,\n", "\n", "$$\n", "\\begin{aligned}\n", "\\left\\{ (3x + 4)^{2} \\right\\}' &= \\dfrac{d}{dx} \\left\\{ (3x + 4)^{2} \\right\\} \\\\\n", "&= \\dfrac{du}{dx} \\dfrac{d}{du} (u^2) \\\\\n", "&= \\dfrac{d}{du} (u^{2}) \\cdot \\dfrac{d}{dx} (3x + 4) \\\\ \n", "&= 2u \\cdot 3 \\\\ \n", "&= 6u = 6(3x + 4) = 18x + 24 \\\\ \n", "\\end{aligned}\n", "$$\n", "\n", "となります.\n", "\n", "ニューラルネットワークを訓練する際には合成関数の微分を使用する場面が何度も登場するため,この計算方法をしっかりと覚えておきましょう.\n", "\n", "### 偏微分\n", "\n", "機械学習では,1つの入力変数$x$から出力変数$y$を予測するケースは稀であり,基本的には,複数の入力変数$x_{1}, x_{2}, \\ldots, x_{M}$を用いて出力変数$y$を予測する多変数関数を扱います.例えば,家賃を予測する場合,部屋の広さだけではなく,駅からの距離や犯罪発生率なども考慮した方がより正確に予測できると期待されます.複数の入力$x_1, x_2, \\ldots, x_M$を考慮した関数$f(x_1, x_2, \\ldots, x_M)$を多変数関数とよびます.この多変数関数において,ある入力$x_m$にのみ注目して微分することを**偏微分**とよび,\n", "\n", "$$\n", "\\dfrac{\\partial}{\\partial x_{m}} f(x_{1}, x_{2}, \\ldots, x_{M})\n", "$$\n", "\n", "のように表します.微分を表す記号が,$d$から$\\partial$に変わり,計算としては$\\dfrac{\\partial}{\\partial x_{m}}$の場合は$x_{m}$以外は定数と考え$x_{m}$にのみ着目して微分を行います.(ただし,入力変数が他の入力変数と独立ではない場合は定数と考えることはできません.本講義ではそのようなケースは出てきません).\n", "\n", "例題で具体的な計算の流れを確認していきましょう.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\dfrac {\\partial }{\\partial x_{1}}\\left( 3x_{1}+4x_{2}\\right) &=\\dfrac {\\partial }{\\partial x_{1}}\\left( 3x_{1}\\right) +\\dfrac {\\partial }{\\partial x_{1}}\\left( 4x_{2}\\right) \\\\\n", "&=3\\times \\dfrac {\\partial }{\\partial x_{1}}\\left( x_{1}\\right) +4x_{2}\\times \\dfrac {\\partial }{\\partial x_{1}}\\left( 1\\right) \\\\\n", "&=3\\times 1+4x_{2}\\times 0\\\\\n", "&= 3\n", "\\end{aligned}\n", "$$\n", "\n", "偏微分でも微分と同じ公式を適用できます.今回のケースでは,$x_{1}$にだけ着目するため,$x_{2}$は定数として扱うことを把握しておけば上記の計算の流れが理解できるはずです.\n", "\n", "## 線形代数\n", "\n", "### 線形代数とは\n", "\n", "次に,ベクトル,行列,逆行列などが登場する数学の一分野である**線形代数**について解説していきます.\n", "\n", "線形代数を導入することで,複数の変数間の関係をシンプルに記述可能となるため,機械学習の中でも度々登場してきます.ぜひ身に着けていきましょう.\n", "\n", "### スカラー,ベクトル,行列,テンソル\n", "\n", "最初に線形代数で使われるスカラー,ベクトル,行列,テンソルの4つを解説します.\n", "\n", "**スカラー**は,1つの値もしくは変数のことです.例えば,\n", "\n", "$$\n", "x, \\ y,\\ M,\\ N\n", "$$\n", "\n", "のように表します.スカラーは例えば温度や身長といった単一の量を表すことに使われます.\n", "\n", "**ベクトル**は,複数のスカラーを縦方向(もしくは横方向)に集めて並べたものであり,\n", "\n", "$$\n", "\\bf{x}=\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2} \\\\\n", "x_{3}\n", "\\end{bmatrix}, \\\n", "\\bf{y}=\\begin{bmatrix}\n", "y_{1} \\\\\n", "y_{2} \\\\\n", "\\vdots \\\\\n", "y_{N}\n", "\\end{bmatrix}\n", "$$\n", "\n", "のように表します.ベクトルの表記は太文字とする場合が多く,スカラーかベクトルかを区別できるようにしています.ベクトルを表現する際,縦方向に並べたものを列ベクトル,横方向に並べたものを行ベクトルとよびます.数学や機械学習では列ベクトルを利用する論文や参考書が多いため,特に明示しない限り,単にベクトルと表現した場合には列ベクトルを指すこととします.\n", "\n", "**行列**は複数の同じサイズのベクトルを並べたものであり,\n", "\n", "$$\n", "\\bf{X}=\\begin{bmatrix}\n", "x_{11} & x_{12} \\\\\n", "x_{21} & x_{22} \\\\\n", "x_{31} & x_{32}\n", "\\end{bmatrix}\n", "$$\n", "\n", "のように表します.行列のサイズは行と列で表現します.例えば,この$\\bf{X}$は3行2列であり,サイズが(3, 2)の行列と言います.多くの場合,行列は大文字,または大文字の太文字で表記されます.\n", "\n", "**テンソル**はベクトルや行列を一般化した概念であり,ベクトルは1階のテンソル,行列は2階のテンソルと表現することができます.また,図のように行列を奥行き方向にさらに並べたものは3階のテンソルとなります.例えば,カラー画像をデジタル表現する場合,画像を構成する各ピクセルはRGB (Red Green Blue) などの色空間を用いるのが一般的であり,(行番号,列番号,色)の3つの軸で1つの値を指定するため,3階のテンソルで表現されます.本講座を含めて,単にテンソルと表現されている場合には,3階以上のテンソルを指すことが多いので,注意してください.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/07.png)\n", "\n", "\n", "\n", "線形代数では $\\bf{y}$ や $\\bf{X}$ といった文字だけで式変形をしていくため,どのような形の数値が取り扱われているかわかりくいのですが,これはベクトルなどと常に意識しておくことでその形を見失わないように注意しましょう.\n", "\n", "スカラー,ベクトル,行列,テンソルの一般的な記法をまとめると下表の通りです.本講座でもこの記法を用いています.\n", "\n", "\n", "| | 小文字 | 大文字 |\n", "| ------ | -------------- | -------------- |\n", "| 細文字 | スカラーの変数 | スカラーの定数 |\n", "| 太文字 | ベクトル | 行列,テンソル |\n", "\n", "\n", "### 足し算・引き算\n", "\n", "行列やベクトルの演算について覚えていきましょう.足し算は同じサイズの行列,ベクトル間だけで成立し,次のように計算されます.\n", "\n", "$$\n", "\\begin{aligned}&\\begin{bmatrix}\n", "1 \\\\\n", "2 \\\\\n", "3\n", "\\end{bmatrix}+\\begin{bmatrix}\n", "4 \\\\\n", "5 \\\\\n", "6\n", "\\end{bmatrix}=\\begin{bmatrix}\n", "1+4 \\\\\n", "2+5 \\\\\n", "3+6\n", "\\end{bmatrix}=\\begin{bmatrix}\n", "5 \\\\\n", "7 \\\\\n", "9\n", "\\end{bmatrix}\\\\\n", "&\\begin{bmatrix}\n", "1 & 2 & 3 \\\\\n", "4 & 5 & 6\n", "\\end{bmatrix}+\\begin{bmatrix}\n", "7 & 8 & 9 \\\\\n", "10 & 11 & 12 \n", "\\end{bmatrix}=\\begin{bmatrix}\n", "1+7 & 2+8 & 3+9 \\\\\n", "4+10 & 5+11 & 6+12\n", "\\end{bmatrix}=\\begin{bmatrix}\n", "8 & 10 & 12 \\\\\n", "14 & 16 & 18\n", "\\end{bmatrix}\\end{aligned}\n", "$$\n", "\n", "このように行列やベクトルの中の**要素**で対応する場所を足し合わせます.引き算も同様です.**同じサイズでないと計算が成立しない**ということを覚えておきましょう.\n", "\n", "### 転置\n", "\n", "ベクトルは縦向きの列ベクトルを基本としていましたが,横向きのベクトルを使いたい場合もあります.そこで縦向きのベクトルを横向きのベクトルに,横向きのベクトルを縦向きのベクトルに入れ替える演算を**転置(Transpose)**とよび,$T$で表記します.例えば,\n", "\n", "$$\n", "\\begin{aligned} \\bf{x} &= \\begin{bmatrix} \n", "1 \\\\ \n", "2 \\\\ \n", "3\n", "\\end{bmatrix}, \\ \n", "\\bf{x}^{T}= \\begin{bmatrix} 1 & 2 & 3 \\\\ \n", "\\end{bmatrix} \\end{aligned}\n", "$$\n", "\n", "のようになります.\n", "行列に対する転置では,サイズが$(N, M)$から$(M, N)$になり,$i$行$j$列目の値が転置後には$j$行$i$列目の値になります.\n", "\n", "$$\n", "\\begin{aligned} \\bf{X} &= \\begin{bmatrix} \n", "1 & 4 \\\\ \n", "2 & 5 \\\\ \n", "3 & 6 \n", "\\end{bmatrix}, \\ \n", "\\bf{X}^{T} = \\begin{bmatrix} \n", "1 & 2 & 3 \\\\ \n", "4 & 5 & 6 \n", "\\end{bmatrix} \\end{aligned}\n", "$$\n", "\n", "転置の公式として次を覚えておくとよいでしょう.\n", "\n", "$$\n", "\\begin{aligned}& \\left( 1 \\right) \\ \\left( \\bf{A}^{T} \\right)^{T} = \\bf{A}\\\\ \n", "&\\left( 2 \\right) \\ \\left( \\bf{A} \\bf{B} \\right) ^{T}= \\bf{B}^{T} \\bf{A}^{T}\\\\ \n", "&\\left( 3 \\right) \\ \\left( \\bf{A} \\bf{B} \\bf{C} \\right) ^{T}= \\bf{C}^{T} \\bf{B}^{T} \\bf{A}^{T} \\end{aligned} \n", "$$\n", "\n", "\n", "### 内積\n", "\n", "同じサイズのベクトル間では内積が定義できます.内積は同じ位置の対応する値同士を掛けていき,それらを足し合わせたものです.\n", "\n", "$$\n", "\\begin{aligned}& \\begin{bmatrix}\n", "1 & 2 & 3\n", "\\end{bmatrix} \\begin{bmatrix}\n", "4 \\\\ \n", "5 \\\\ \n", "6\n", " \\end{bmatrix} = 1 \\times 4 + 2 \\times 5 + 3 \\times 6 = 32 \\end{aligned}\n", "$$\n", "\n", "### 掛け算(行列積)\n", "\n", "行列の掛け算には,行列積,外積,要素積(アダマール積)など複数種あります.ここではそのうち最もよく使われる**行列積**について説明します.以降では明示しない限り行列の掛け算は行列積を指すこととします.\n", "\n", "行列$A$と行列$B$の行列積は$A$の各行と$B$の各列の内積を並べたものとして定義されます.例えば行列Aの2行目の行ベクトルと行列Bの3列目の列ベクトルの内積は結果の行列Cの2行3列目に対応します.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/08.png)\n", "\n", "そして,内積が定義される条件はベクトルのサイズが等しいということでしたが,ここでもそれが成り立つために,Aの行のサイズ(=Aの列数)とBの列のサイズ(=Bの行数)が一致する必要があります.また,結果はAの行数とBの列数からなる行列となります.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/09.png)\n", "\n", "また,行列積がスカラー積と大きく異なる性質のひとつとして,$AB$と$BA$が等しいとは限らないということが挙げられます.\n", "\n", "行列積は線形代数や機械学習の多くの問題で使われます.また,行列では割り算に相当する演算はありませんが,後述する逆行列を使って$4 / 2 = 4 \\times \\dfrac{1}{2}$のように割り算を逆数(逆行列)の掛け算として記述します.\n", "\n", "それでは,計算条件の確認も踏まえて,下記の3つを練習問題として解いてください.\n", "\n", "$$\n", "\\begin{aligned}\n", "&\\left( 1\\right) \n", "\\begin{bmatrix}\n", "1 & 2\n", "\\end{bmatrix}\n", "\\begin{bmatrix}\n", "3 \\\\ \n", "4\n", "\\end{bmatrix}\\\\ \n", "&\\left( 2\\right) \n", "\\begin{bmatrix}\n", "1 & 2 \\\\ \n", "3 & 4 \n", "\\end{bmatrix}\\begin{bmatrix}\n", "5 \\\\ \n", "6 \n", "\\end{bmatrix}\\\\ \n", "&\\left( 3\\right) \n", "\\begin{bmatrix} \n", "1 & 2 \n", "\\end{bmatrix}\\begin{bmatrix} \n", "3 & 4 \\\\ \n", "5 & 6 \n", "\\end{bmatrix}\\begin{bmatrix} \n", "3 \\\\ \n", "1\n", "\\end{bmatrix} \n", "\\end{aligned} \n", "$$ \n", "\n", "こちらが解答です.\n", "\n", "$$\n", "\\begin{aligned} \n", "&\\left( 1\\right) \n", "\\begin{bmatrix} \n", "1 & 2 \n", "\\end{bmatrix}\\begin{bmatrix} \n", "3 \\\\ \n", "4 \n", "\\end{bmatrix} = 1\\times 3 + 2 \\times 4 = 11\\\\ \n", "&\\left( 2\\right) \n", "\\begin{bmatrix} \n", "1 & 2 \\\\ \n", "3 & 4\n", "\\end{bmatrix}\\begin{bmatrix} \n", "5 \\\\ \n", "6\n", "\\end{bmatrix} = \\begin{bmatrix} \n", "1 \\times 5 + 2 \\times 6 \\\\ \n", "3 \\times 5 + 4 \\times 6 \n", "\\end{bmatrix} = \\begin{bmatrix} \n", "17 \\\\ \n", "39 \n", "\\end{bmatrix}\\\\ \n", "&\\left( 3\\right) \n", "\\begin{bmatrix} \n", "1 & 2 \n", "\\end{bmatrix}\\begin{bmatrix} \n", "3 & 4 \\\\ \n", "5 & 6 \n", "\\end{bmatrix}\\begin{bmatrix} \n", "3 \\\\ \n", "1 \n", "\\end{bmatrix} \n", "=\\begin{bmatrix} \n", "1 & 2 \n", "\\end{bmatrix}\\begin{bmatrix} \n", "3 \\times 3 + 4 \\times 1 \\\\ \n", "5 \\times 3 + 6 \\times 1 \n", "\\end{bmatrix} = \\begin{bmatrix} \n", "1 & 2 \n", "\\end{bmatrix}\\begin{bmatrix} \n", "13 \\\\ \n", "21 \n", "\\end{bmatrix}\n", "= 1 \\times 13 + 2 \\times 21 \n", "=55\n", "\\end{aligned} \n", "$$\n", "\n", "この形の計算は,機械学習においてよく登場してきます.行列積は,演算後に形が変わる場合があることを覚えておきましょう.\n", "\n", "### ベクトル,行列のサイズ\n", "\n", "行列積を行った後は行列サイズが変わります.サイズが$(L, M)$の行列と$(M ,N)$の行列の行列積の結果は$(L, N)$となります.例えば先ほどの3つの練習問題のサイズがどのように変化したかをまとめると,\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/10.png)\n", "\n", "となります.(3)は最初のベクトルと行列の結果が横方向のベクトルであり(1)に帰着することに注意してください.また,ある次元のサイズが1となった場合,その次元を削除しベクトルがスカラーに,行列がベクトルになる場合があります.\n", "\n", "### 単位行列\n", "\n", "スカラー値の$1$は,$10 \\times 1 = 10$といったように,その数を任意の数に乗じても変わらないという性質を持ちます.行列の演算において,これと同様の働きをする行列が**単位行列**です.\n", "\n", "$$\n", "\\bf{I}=\\begin{bmatrix}\n", "1 & 0 & \\ldots & 0 \\\\\n", "0 & 1 & \\ldots & 0 \\\\\n", "\\vdots & \\vdots & \\ddots & \\vdots \\\\\n", "0 & 0 & \\ldots & 1\n", "\\end{bmatrix}\n", "$$\n", "\n", "上記のような形をしており,記号$\\bf{I}$で表されるのが一般的です.行列の斜めの要素を**対角要素**とよび,それ以外の要素を非対角要素とよびます.単位行列は,対角要素が1で,非対角要素が0であるような**正方行列**(行要素の数と列要素の数が一致する行列)です.例えば, $2 \\times 2$行列の場合は,\n", "\n", "$$\n", "\\bf{I} =\\begin{bmatrix}\n", "1 & 0 \\\\\n", "0 & 1\n", "\\end{bmatrix}\n", "$$\n", "\n", "であり,$3 \\times 3$行列の場合は,\n", "\n", "$$\n", "\\bf{I}=\\begin{bmatrix}\n", "1 & 0 & 0 \\\\\n", "0 & 1 & 0 \\\\\n", "0 & 0 & 1\n", "\\end{bmatrix}\n", "$$\n", "\n", "となります.行列のサイズを明示したい場合は,$I_{n}$ ($n \\times n$行列の場合)と添字を付けて区別します.\n", "\n", "単位行列は任意の正方行列$\\bf{A}$に対し,以下が成立します.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\bf{A}\\bf{I}&=\\bf{A}\\\\\n", "\\bf{I}\\bf{A}&=\\bf{A}\n", "\\end{aligned}\n", "$$\n", "\n", "先程説明したように,行列の掛け算が成立するためには,$I$のサイズは$A$と同じである必要があります.\n", "\n", "実際に計算して,元の行列と値が変わらないかを確認してみると,\n", "\n", "$$\n", "\\begin{aligned}\\begin{bmatrix}\n", "1 & 2 \\\\\n", "3 & 4\n", "\\end{bmatrix}\\begin{bmatrix}\n", "1 & 0 \\\\\n", "0 & 1\n", "\\end{bmatrix}\n", "&=\\begin{bmatrix}\n", "1\\times 1+2\\times 0 & 1\\times 0+2\\times 1 \\\\\n", "3\\times 1+4\\times 0 & 3\\times 0+4\\times 1\n", "\\end{bmatrix}\\\\\n", "&=\n", "\\begin{bmatrix}\n", "1 & 2 \\\\\n", "3 & 4\n", "\\end{bmatrix}\n", "\\end{aligned}\n", "$$\n", "\n", "のように,元の値と一致することが確認できます.\n", "\n", "### 逆行列\n", "\n", "**逆行列**とは,元の正方行列にかけると単位行列になるような行列であり,スカラーにおける逆数($2 \\times 2^{-1} = 1$)に対応するような行列です.行列$\\bf{A}$に対し,その逆行列は$\\bf{A}^{-1}$のように表記します.\n", "\n", "逆行列の定義を数式で表すと,\n", "\n", "$$\n", "\\begin{aligned}\n", "\\bf{A}\\bf{A}^{-1}=\\bf{I}\\\\\n", "\\bf{A}^{-1}\\bf{A}=\\bf{I}\n", "\\end{aligned}\n", "$$\n", "\n", "となります.ここで,$\\bf{I}$ は先程の単位行列です.サイズが$2 \\times 2$や$3 \\times 3$といった小さな行列の場合には,逆行列計算に公式がありますが,機械学習ではより大きなサイズの行列($1000 \\times 1000$など)を扱う必要が出てくるため,逆行列を効率的に求める計算手法が提案されています.\n", "\n", "逆行列は常に存在するとは限りません.逆行列が存在するような行列のことを**正則行列**とよびます(行列が正則であるための条件については今回は説明しません).\n", "\n", "### 線形結合と二次形式\n", "\n", "機械学習の式によく出てくる形式として,$\\bf{b}^{T}\\bf{x}$と$\\bf{x}^{T}\\bf{A}\\bf{x}$の2つの形式があります.前者は**線形結合**もしくは**一次結合**,後者は**二次形式**とよばれています.スカラーの場合,一次式($ax+b$)や二次式($ax^2+bx+c$)がありますが,それをベクトルに拡張したものです.\n", "\n", "線形結合の計算の中身を見てみると,\n", "\n", "$$\n", "\\begin{aligned}\n", "\\bf{b}&=\\begin{bmatrix}\n", "1 \\\\\n", "2\n", "\\end{bmatrix},\\ \n", "\\bf{x}=\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2}\n", "\\end{bmatrix}\\\\\n", "\\bf{b}^{T}\\bf{x}&=\\begin{bmatrix}\n", "1 & 2\n", "\\end{bmatrix}\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2}\n", "\\end{bmatrix}=x_{1}+2x_{2}\\end{aligned}\n", "$$\n", "\n", "のように$\\bf{x}$の要素である$x_{1}$もしくは$x_{2}$に関して,一次式となっていることがわかります.\n", "\n", "また,二次形式も同様に計算の中身を確認してみると,\n", "\n", "$$\n", "\\begin{aligned}\n", "\\bf{A}&=\\begin{bmatrix}\n", "1 & 2 \\\\\n", "3 & 4\n", "\\end{bmatrix},\\ \n", "\\bf{x}=\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2}\n", "\\end{bmatrix}\\\\\n", "\\bf{x}^{T}\\bf{A}\\bf{x}\n", "&=\\begin{bmatrix} x_{1} & x_{2}\\end{bmatrix}\n", "\\begin{bmatrix}\n", "1 & 2 \\\\\n", "3 & 4\n", "\\end{bmatrix}\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2}\n", "\\end{bmatrix}\\\\\n", "&=\\begin{bmatrix}x_{1} & x_{2}\\end{bmatrix} \\begin{bmatrix}\n", "x_{1}+2x_{2} \\\\\n", "3x_{1}+4x_{2}\n", "\\end{bmatrix}\\\\\n", "&=x_{1}\\left( x_{1}+2x_{2}\\right) +x_{2}\\left( 3x_{1}+4x_{2}\\right) \\\\\n", "&=x^{2}_{1}+5x_{1}x_{2}+4x_{2}^{2}\\end{aligned}\n", "$$\n", "\n", "となり,各要素において二次式となっていることがわかります.\n", "\n", "従って,任意の二次関数を\n", "\n", "$$\n", "\\bf{x}^{T}\\bf{A}\\bf{x} + \\bf{b}^{T}\\bf{x} + c\n", "$$\n", "\n", "の形で表現できます.ここで,$c$はスカラーの定数項です.\n", "\n", "### ベクトルによる微分と勾配\n", "\n", "微分は入力を変えた場合の関数値の変化量と説明しました.同様に関数の入力がベクトルである場合,ベクトルによる微分を考えることができます.関数のそれぞれのベクトルの成分毎に偏微分を計算し,それらを並べてベクトルにしたものを**勾配**とよびます.\n", "\n", "勾配の計算を紹介する前に,下記の例題を計算しましょう.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\bf{b}&=\\begin{bmatrix}\n", "3 \\\\\n", "4\n", "\\end{bmatrix}, \\ \n", "\\bf{x}=\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2}\n", "\\end{bmatrix}\\\\\n", "\\bf{b}^{T}\\bf{x}&=\\begin{bmatrix}\n", "3 & 4\n", "\\end{bmatrix}\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2}\n", "\\end{bmatrix}\n", "=3x_{1}+4x_{2}\\end{aligned}\n", "$$\n", "\n", "この$\\bf{b}^{T}\\bf{x}$を ベクトル$\\bf{x}$で微分したものを,\n", "\n", "$$\n", "\\dfrac {\\partial }{\\partial \\bf{x}}\\left( \\bf{b}^{T}\\bf{x}\\right)\n", "$$\n", "\n", "と表し.これを**ベクトルで微分**すると言います.今回の例では,\n", "\n", "$$\n", "\\begin{aligned}\n", "\\dfrac {\\partial }{\\partial \\bf{x}}\\left( \\bf{b}^{T}\\bf{x}\\right) &=\\dfrac {\\partial }{\\partial \\bf{x}}\\left( 3x_{1}+4x_{2}\\right) \\\\\n", "&=\\begin{bmatrix}\n", "\\dfrac {\\partial }{\\partial x_{1}} \\left( 3x_{1}+4x_{2}\\right) \\\\\n", "\\dfrac {\\partial }{\\partial x_{2}} \\left( 3x_{1}+4x_{2}\\right) \n", "\\end{bmatrix}\n", "\\end{aligned}\n", "$$\n", "\n", "のようになり,計算を進めると\n", "\n", "$$\n", "\\begin{aligned}\\dfrac {\\partial }{\\partial x_{1}}\\left( 3x_{1}+4x_{2}\\right) &=\\dfrac {\\partial }{\\partial x_{1}}\\left( 3x_{1}\\right) +\\dfrac {\\partial }{\\partial x_{1}}\\left( 4x_{2}\\right) \\\\\n", "&=3\\times \\dfrac {\\partial }{\\partial x_{1}}\\left( x_{1}\\right) +4x_{2}\\times \\dfrac {\\partial }{\\partial x_{1}}\\left( 1\\right) \\\\\n", "&=3\\times 1+4x_{2}\\times 0\\\\\n", "&=3\\end{aligned}\n", "$$\n", "\n", "$$\n", "\\begin{aligned}\\dfrac {\\partial }{\\partial x_{2}}\\left( 3x_{1}+4x_{2}\\right)&=\\dfrac {\\partial }{\\partial x_{2}}\\left( 3x_{1}\\right) +\\dfrac {\\partial }{\\partial x_{2}}\\left( 4x_{2}\\right) \\\\\n", "&=3x_{1}\\times \\dfrac {\\partial }{\\partial x_{2}}\\left( 1\\right) +4\\times \\dfrac {\\partial }{ax_{2}}\\left( x_{2}\\right) \\\\\n", "&=3x_{1} \\times 0 + 4 \\times 1 \\\\\n", "&= 4\n", "\\end{aligned}\n", "$$\n", "\n", "となり,下記の計算結果が得られます.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\dfrac {\\partial }{\\partial \\bf{x}}\\left( \\bf{b}^{T}\\bf{x}\\right) \n", "&=\\begin{bmatrix}\n", "\\dfrac {\\partial }{\\partial x_{1}} \\left( 3x_{1}+4x_{2}\\right) \\\\\n", "\\dfrac {\\partial }{\\partial x_{2}} \\left( 3x_{1}+4x_{2}\\right) \n", "\\end{bmatrix} =\\begin{bmatrix}\n", "3 \\\\\n", "4\n", "\\end{bmatrix} = \\bf{b}\n", "\\end{aligned}\n", "$$\n", "\n", "もう一問,以下の例題を考えましょう.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\bf{b}&=\\begin{bmatrix}\n", "3 \\\\\n", "4\n", "\\end{bmatrix}, \\ \n", "\\bf{x}=\\begin{bmatrix}\n", "x_{1} \\\\\n", "x_{2}\n", "\\end{bmatrix}\\\\\n", "\\dfrac {\\partial }{\\partial \\bf{x}}\\left( \\bf{b}\\right) &=\\begin{bmatrix}\n", "\\dfrac {\\partial }{\\partial x_{1}}\\left( 3 \\right) \\\\\n", "\\dfrac {\\partial }{\\partial x_{2}}\\left( 4 \\right) \n", "\\end{bmatrix}\n", "=\\begin{bmatrix}\n", "0 \\\\\n", "0\n", "\\end{bmatrix}=\\bf{0}\\end{aligned}\n", "$$\n", "\n", "偏微分を行う対象の変数が含まれていない場合,その偏微分は$0$となります.要素が$0$のみで構成されたベクトルを**零(ゼロ)ベクトル**と言います.\n", "\n", "これらを踏まえて,公式としてまとめておきましょう.\n", "\n", "$$\n", "\\begin{aligned}\n", "&\\left( 1\\right) \\ \\dfrac {\\partial}{\\partial \\bf{x}}\\left( \\bf{c} \\right) = \\bf{0}\\\\\n", "&\\left( 2\\right) \\ \\dfrac {\\partial }{\\partial \\bf{x}}\\left( \\bf{b}^{T}\\bf{x}\\right) = \\bf{b}\\\\\n", "&\\left( 3\\right) \\ \\dfrac {\\partial }{\\partial \\bf{x}}\\left( \\bf{x}^{T}\\bf{A}\\bf{x}\\right) =\\left( \\bf{A}+\\bf{A}^{T}\\right) \\bf{x}\\end{aligned}\n", "$$\n", "\n", "(1)と(2) はすでに導出済みです.(3) は導出が少し複雑なので省略しますが,数値を代入して確認してみてください.この3つの公式は機械学習を学んでいく上で非常に重要な公式となりますので,必ず覚えておきましょう.\n", "\n", "こういった行列などにおける公式は他にもたくさんあり,論文などを読む際にはどういった公式があるのかを知っておくことも重要です.例えば,[The Matrix Cookbook](https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf)などを参考にしてみてください.\n", "\n", "また,今回は多入力単出力関数の微分として勾配まで紹介しましたが,多入力多出力関数の微分であるヤコビ行列(ヤコビアン)もニューラルネットワークの誤差逆伝播法を理解するために必要となります.さらに詳しく知りたい方は,例えば[The Matrix Calculus You Need For Deep Learning](https://arxiv.org/abs/1802.01528)などを参考にしてみてください.\n", "\n", "\n", "\n", "## 確率・統計\n", "\n", "### 確率や統計は何に使えるのか\n", "\n", "機械学習といえば確率や統計といったイメージで勉強する人も多いと思いますが,簡単なアルゴリズムであれば,微分と線形代数を理解しておくだけで説明することができ,確率や統計が出てくることはありません.それでは,確率,統計はなぜ必要なのでしょうか?\n", "\n", "機械学習の目的はそのデータの背後にある普遍性,法則を捉えることです.確率はデータの分布や不確実性といった概念を数式化することができます.また統計によって,ある集団に対する様々な統計量を得ることができ,それらを使ってデータを扱いやすいように正規化したり,モデルが妥当なのか,各データが外れ値ではないのかといった判断をすることができます.\n", "\n", "### 確率\n", "\n", "確率は様々な可能性がある事象に対し,その事象が起こることが期待される度合いを表します.パラメータ推定の文脈では確率はどれくらい起きそうだという信念を表す場合もあります.確率は$p(x)$のような関数の形で表し,$x$を**確率変数**とよびます.確率変数は起きうる事象のいずれかの値をとるような変数です.確率変数には離散型と連続型がありますが,本節では離散型の確率変数を扱います.確率変数$x$の値が$u$であった時の確率は$p(x=u)$,もしくは$p(u)$と省略して表わされます.確率は,「全ての事象の確率の和が$1$になる」,「全ての事象の確率は$0$以上である」という2つの制約を満たします.これを式で書くと,\n", "\n", "$$\n", "\\begin{align}\n", "\\sum_{x } p(x) &= 1 \\\\\n", "p(x) & \\geq 0\n", "\\end{align}\n", "$$\n", "\n", "となります.\n", "\n", "2つの事象が同時に起きる確率を**同時確率**とよび$p(x, y)$のように表します.例えばサイコロを2回振り,1回目の目が$1$,2回目の目が$5$となる確率は同時確率で表すことができます.\n", "\n", "同時確率のうち,特定の確率変数のみに注目し,それ以外の確率変数について和を取って消去する操作を**周辺化**とよびます(周辺化という言葉は,行を1つ目の確率変数,列を2つ目の確率変数に対応させて同時確率を表で書いた場合,その行の合計,列の合計を表の周辺に書いたことからそうよばれています).周辺化の結果は,注目した確率変数の確率に一致します.\n", "\n", "$$\n", "p(x) = \\sum_y p(x, y) \\\\\n", "p(y) = \\sum_x p(x, y)\n", "$$\n", "\n", "片方の確率変数がある値で固定されている条件下で,もう片方の確率がどうなるのかを表した確率分布を**条件付き確率**とよび,$p(y|x)$のように表します.例えば$y$を外で雨が降っているかを表す確率変数,$x$を部屋に入ってきた人が傘を持っていたかを表す確率変数とします($y=1$を雨が降っている,$y=0$を雨が降っていない,のように割り当てます).この時$p(y|x)$は,部屋に入ってきた人が傘をもっていた場合に外で雨が降っている条件付き確率を表します.\n", "\n", "条件付き確率は,同時確率を条件の確率で割った値と一致します.\n", "\n", "$$\n", "p(y|x) = \\frac{p(x, y)}{p(x)}\n", "$$\n", "\n", "ここで,条件付確率の式を変形させた$p(y|x)p(x) = p(x, y)$に注意すると,\n", "\n", "$$\n", "p(x|y) = \\frac{p(x, y)}{p(y)} = \\frac{p(y | x)p(x)}{p(y)}\n", "$$\n", "\n", "が得られます.これを**ベイズの定理**とよびます.重要な定理なので,ぜひ覚えておきましょう.\n", "\n", "例えば,ベイズの定理の応用事例として,スパム(迷惑)メールフィルターがあります.メールに単語$i$が含まれるか否かを表す確率変数を$x_{i}$,メールがスパムであるか否かを表す確率変数を$y$とおくと,$p(x_{i}=1)$は「メールが単語$i$を含む確率」,$p(y=1)$は「メールがスパムである確率」,$p(x_{i}=1|y=1)$は「メールがスパムであった場合に,その中に単語$i$が含まれる確率」となります.受信済みの大量のメールからそれぞれの割合を集計して求め,ベイズの定理を適用することで,$p(y=1|x_{i}=1)$として,「メールに単語$i$が出現した場合に,そのメールがスパムである確率」を求めることができます.\n", "\n", "### 尤度と最尤推定\n", "\n", "パラメータ$\\theta$で特徴付けられた確率モデルをパラメトリックなモデルとよび,$p(x; \\theta)$のように表記します.確率モデル$p(x)$上で事象$u$が観測される確率$p(x=u; \\theta)$を事象$u$の**尤度**とよびます.尤度の尤は「尤(もっと)もらしい」という意味であり,その事象の起きやすさを表します.\n", "\n", "ここで,$N$個のデータ$X = \\left( x^{(1)}, x^{(2)}, \\ldots, x^{(N)} \\right)$が与えられ,そのデータ$X$を生成するような確率分布を推定する問題を考えます.この場合,**最尤(さいゆう)推定**とよばれる手法がよく使われます.最尤推定は観測データ$X$を最も生成しそうなパラメータ$\\theta$を推定する手法です.観測するデータがそれぞれ独立に生成されている場合,その尤度は\n", "\n", "$$\n", "L(\\theta) = p(X; \\theta) = \\prod_{i=1}^N p(x^{(i)}; \\theta)\n", "$$\n", "\n", "のように表されます.この$\\prod$という記号は$\\sum$の掛け算版で全ての値を掛け合わせるという意味です.複数データに対する尤度は,$1$より小さな値の積となるため非常に小さな数になりコンピュータ上で扱うことが困難になります.また尤度を最大化したい場合,積の形の式の最大化は難しいことが知られています.そこで尤度の代わりにその対数をとった対数尤度を考えます.\n", "\n", "$$\n", "\\log L(\\theta) = \\log p(X; \\theta) = \\sum_{i=1}^N \\log p(x^{(i)}; \\theta)\n", "$$\n", "\n", "この対数尤度を最大化するパラメータ$\\theta$を求めることができれば,その値がデータ$X$を最も生成しそうな確率モデルのパラメータとなります.\n", "\n", "ここで,わかりやすい具体例として,コインの表・裏が出る確率を推定する問題を考えてみます.コインの表・裏を表す確率変数を$x$とおき,$x = 1$であれば表,$x = 0$であれば裏とします.また,表($x = 1$)となる確率を表すパラメータを$\\theta$とおきます.コインを$10$回投げた結果,以下の観測結果$X$が得られたとします.\n", "\n", "$$\n", "X = \\left(1, 0, 1, 1, 1, 0, 0, 1, 0, 0 \\right)\n", "$$\n", "\n", "すると,その尤度は,\n", "\n", "$$\n", "\\begin{aligned}\n", "L(\\theta) &= \\theta \\cdot (1 - \\theta) \\cdot \\theta \\cdot \\theta \\cdot \\theta \\cdot (1 - \\theta) \\cdot (1 - \\theta) \\cdot \\theta \\cdot (1 - \\theta) \\cdot (1 - \\theta) \\\\ \n", "&= \\theta^{5} \\cdot (1 - \\theta)^{5}\n", "\\end{aligned}\n", "$$\n", "\n", "と計算され,その対数尤度は,\n", "\n", "$$\n", "\\log L(\\theta) = 5 \\log \\theta + 5 \\log \\left( 1 - \\theta \\right)\n", "$$\n", "\n", "となります.この関数は上に凸となっています.$\\theta$と$\\log L(\\theta)$の関係を図示すると下図のようになります.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/11.png)\n", "\n", "これを$\\theta$で微分して$0$になる条件を求めると,\n", "\n", "$$\n", "\\frac{5}{\\theta} - \\frac{5}{\\left( 1 - \\theta \\right)} = 0 \n", "$$\n", "\n", "より,$\\theta = 0.5$が最尤推定により得られます.\n", "\n", "回帰モデルの目的関数として真値と予測値の二乗誤差の和を使う場合(**最小二乗法**とよばれています),モデルの出力値に正規分布(後述)の誤差を仮定した最尤推定を行っているのと等価であることが知られています.\n", "\n", "### 事後確率最大化推定(MAP推定)\n", "\n", "最尤推定は多くの場合有効ですが,求めるパラメータに何らかの事前情報がある場合,最尤推定ではその事前情報を扱うことができません.そのため,試行回数が少ない中でパラメータを推定しようとすると,最尤推定ではうまくいかない場合があります.\n", "\n", "先程と同様に,コインの表・裏が出る確率を推定する例を考えてみましょう.コインを$5$回投げたところ,たまたま$5$回とも表($x = 1$)が出たとします.この場合,最尤推定では,表が出る確率が$100$%(裏が出る確率が$0$%)であると推定してしまいます.しかし,明らかに裏が出る確率は$0$よりも大きいはずという事前情報があれば,より良い推定ができそうです.\n", "\n", "このような場合に,事前情報も考慮しながら,観測データに基づいてパラメータを推定する方法が**事後確率最大化(Maximum A Posteriori, MAP)推定**です.MAP推定においては,パラメータ$\\theta$も確率変数であり,その分布(**事前確率**ともよばれます)$p\\left( \\theta \\right)$が存在すると考えます.その上で,観測データ$X$が与えられた条件での,パラメータ$\\theta$の条件付き確率(**事後確率**ともよばれます)$p\\left( \\theta|X\\right)$を最大化するような$\\theta$を求めることになります.\n", "\n", "ここでベイズの定理を思い出しましょう.ベイズの定理を用いると事後確率は,\n", "\n", "$$\n", "p(\\theta|X) = \\frac{p(X|\\theta)p(\\theta)}{p(X)}\n", "$$\n", "\n", "となります.これをパラメータについて最大化することを考えると,$P(X)$はパラメータとは関係が無いので無視することができ,\n", "\n", "$$\n", "p(X|\\theta) p(\\theta)\n", "$$\n", "\n", "を最大化するようなパラメータを求めることになります.$p(X|\\theta)$の部分は最尤推定と同じですが,MAP推定ではさらにパラメータの事前確率$p(\\theta)$を掛けた確率を最大化することになります.(ここではMAP推定の解を求める過程については説明しません.)\n", "\n", "機械学習においてパラメータを最適化する際,正則化とよばれる,パラメータの値が大きいことに対する罰則項を設けたりしますが,これはパラメータの事前確率(の対数)とみなすことができ,パラメータをMAP推定していると解釈できます.\n", "\n", "### 統計量\n", "\n", "本節では,データ解析を行う際によく用いられる基本的な統計量を紹介していきます.\n", "\n", "統計量を求める際には,**母集団**に対する解析か**標本集団**に対する解析かを意識することが重要です.母集団とは解析を行いたい想定の範囲に対して,すべてのデータが揃っている場合であり,標本集団はそのうちの一部を抽出する場合です.例えば,全国の小学生の身長と体重を集計する際,全国の小学生を一人の抜け漏れもなく集められれば母集団ですが,各都道府県で100人ずつ抜き出して集計すると,標本集団となります.母集団のデータを集めることは現実的に難しいことが多く,標本集団のデータから母集団の分布を推定することが一般的です.そうなると,基本的には母集団の統計量ではなく,標本集団向けの統計量を使用することになります.サンプル数$N$が多い場合には,母集団の統計量と標本集団の統計量に差は殆どありませんが,サンプル数が小さい場合は大きな差となるので注意しましょう.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/12.png)\n", "\n", "ここでは,代表的な統計量である平均,分散,標準偏差について紹介していきます.\n", "\n", "最初は,**平均**を紹介します.たとえば,300円, 400円, 500円の平均は,\n", "\n", "$$\n", "\\dfrac{300 + 400 + 500}{3} = 400\n", "$$\n", "\n", "となり,すべてを足し合わせて対象の数で割ります.これを定式化すると,\n", "\n", "$$\n", "\\begin{aligned}\\overline {x}=\\dfrac {x_{1}+x_{2}+\\ldots +x_{N}}{N}\n", "=\\dfrac {1}{N}\\sum ^{N}_{n=1}x_{n}\\end{aligned}\n", "$$\n", "\n", "のようになります.$N$は**サンプルの数**を表します.平均は,$\\bar{x}$や$\\mu$といった記号で表わされるのが一般的です.データ分布において,平均はその重心に相当する値です.\n", "\n", "次に,**分散**を紹介します.分散はデータのばらつきを表す統計量であり,その定義は\n", "\n", "$$\n", "\\begin{aligned}\\sigma ^{2}=\\dfrac {1}{N}\\sum ^{N}_{n=1}\\left( x_{n}-\\overline {x}\\right) ^{2}\\end{aligned}\n", "$$\n", "\n", "となります.各サンプルの平均$\\bar{x}$からの差分$x - \\bar{x}$を計算し,それらの二乗誤差の平均の値を計算します.分散にはもう一つ定義があり,\n", "\n", "$$\n", "\\begin{aligned}\n", "\\sigma ^{2}=\\dfrac {1}{N-1}\\sum ^{N}_{n=1}\\left( x_{n}-\\overline {x}\\right) ^{2}\n", "\\end{aligned}\n", "$$\n", "\n", "と表す場合もあります.前者は**標本分散**といい,後者は**不偏分散**といいます.これらの式の導出は他書に譲ることにします.\n", "\n", "例えば,実験を行った際に結果にばらつきが多ければ,各実験で再現性が確保できていない可能性が考えられるため,多数の試行結果がある値に集まっていることが望ましい状況において,分散を評価することが重要となってきます.他に,データのばらつき具合にもよりますが,分散を使えばスケールの違いも評価することができます.\n", "\n", "最後に**標準偏差**を紹介します.分散は各サンプルの平均からの差の二乗の平均であり,単位は元の単位の二乗となっています.例えば元の単位がkgであれば,分散はkgの二乗という単位になります.そこで分散の平方根をとった$\\sigma$を用いることで,元の単位と等しくなり,解釈が容易になります.これを標準偏差とよびます.\n", "\n", "練習問題で具体的な計算手順の確認を行いましょう.以下の①と②のデータに対して,平均,分散,標準偏差を求めてください.ただし,今回は標本分散を使用することとします.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/13.png)\n", "\n", "①の解答は以下の通りです.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\bar{x}&=\\dfrac {1}{5}\\left( -2-1+0+1+2\\right) =0\\\\\n", "\\sigma ^{2}&=\\dfrac {1}{5}\\left\\{ \\left( -2-0\\right) ^{2}+\\left( -1-0\\right) ^{2}+(0-0)^{2}+(1-0)^{2}+(2-0)^{2}\\right\\} \\\\\n", "&=\\dfrac {1}{5}\\times 10=2\\\\\n", "\\sigma &=\\sqrt {2}\n", "\\end{aligned}\n", "$$\n", "\n", "また,②の解答は以下の通りです.\n", "\n", "$$\n", "\\begin{aligned}\n", "\\overline {x}&=\\dfrac {1}{5}\\left( -4-2+0+2+4\\right) =0\\\\\n", "\\sigma ^{2}&=\\dfrac {1}{5}\\left\\{ \\left( -4-0\\right) ^{2}+\\left( -2-0\\right) ^{2}+\\left( 0-0\\right) ^{2}+\\left( 2-0\\right) ^{2}+\\left( 4-0\\right) ^{2}\\right\\} \\\\\n", "&=\\dfrac {1}{5}\\times 40=8\\\\\n", "\\sigma &=\\sqrt {8}=2\\sqrt {2}\n", "\\end{aligned}\n", "$$\n", "\n", "これより,②のケースの方が分散が大きく,データのばらつきが大きいことがわかります.\n", "\n", "### 正規分布\n", "\n", "ここでは,確率で度々登場する**正規分布**について紹介します.正規分布は**ガウス分布**ともよばれます.横軸に確率変数,縦軸に確率密度をとって図示すると,平均$\\mu$,標準偏差$\\sigma$を持つ正規分布は以下のような形をしています.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/14.png)\n", "\n", "なぜこの正規分布がよく登場するのでしょうか.その理由として,以下のような物理的・数学的背景があります.\n", "\n", "- 多数の独立な因子の和で表される確率変数は正規分布に近似的に従う\n", "- 数式が扱いやすい\n", "\n", "世の中でみられる多くのデータが正規分布に従うことが知られています(例えば,性年代別の身長,試験の点数,物理実験の測定誤差など).一方で必ずしもデータは正規分布に従うとは限りません.正規分布ではないような分布に対し正規分布にあてはめて考えてしまい誤った結論を導く場合も多々あります.データの分布は図示化するなどして正規分布として扱ってよいかは常に考えましょう.\n", "\n", "正規分布では平均$\\mu$と標準偏差$\\sigma$に対して,何%がその分布に入っているかといった議論を良く行います.例えば,$\\mu \\pm 3\\sigma$の範囲内に,データの全体の99.7%が入るため,この$\\mu \\pm 3 \\sigma$に入らない領域を外れ値(他の値から大きく外れた値)として定義するといった使い方ができます.\n", "\n", "### 標準偏差を利用したスケーリング\n", "\n", "スケーリングは,大抵の機械学習手法における前処理として重要です,\n", "\n", "なぜスケーリングが重要かを説明するために,2点間の距離を計算する例題を取りあげます.スケールが異なる変数$x_{1}$と$x_{2}$があった場合に,下記の図のような状況になります.ここで,縦軸と横軸のスケールが大きく異なっていることに注意してください.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/15.png)\n", "\n", "この2点間の距離$d$を求めると,\n", "\n", "$$\n", "\\begin{aligned}\n", "d&=\\sqrt {\\left( 100-1000\\right) ^{2}+\\left( 0.1-1\\right) ^{2}}\\\\\n", "&= \\sqrt {900^{2}+0.9^{2}}\\\\\n", "&= \\sqrt {810000+0.81} \\\\\n", "&= \\sqrt {810000.81}\n", "\\end{aligned}\n", "$$\n", "\n", "のようになります.距離$d$の中で$x_{1}$の影響量が大きく$x_{2}$ に関しては,スケールが小さいが故にほとんど影響を与えていません.これでは$x_{2}$がデータの意味として重要な場合においても考慮できません.こうした問題を解決する方法の一つが,ここで紹介する**スケーリング**です.代表的なスケーリングの方法としては2つあります.\n", "\n", "1つ目が,サンプル集合を**最小値0**,**最大値1**にスケーリングする方法です.これを**Min-Max スケーリング**とよびます.この方法では,各変数ごとに最小値$x_{\\min}$と最大値$x_{\\max}$を求めておき,すべてのデータに対して,\n", "\n", "$$\n", "\\widetilde{x} = \\dfrac{x - x_{\\min}}{x_{\\max} - x_{\\min}}\n", "$$\n", "\n", "の計算を行います.Min-Maxスケーリングには計算が単純というメリットがある反面,下図の例ように$x_1$で外れ値を持つデータ点が存在するような場合,$x_{\\max}$が外れ値に大きく引っ張られてしまうという弱点があります.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/16.png)\n", "\n", "もうひとつのスケーリングの方法として,**平均0**,**標準偏差1**にスケーリングする方法があります.これは一般的に**標準化(正規化)**とよばれています.全てのデータから平均を引くと平均$0$になり,標準偏差で割ると標準偏差は$1$になります.\n", "\n", "$$\n", "\\widetilde{x} = \\dfrac{x - \\bar{x}}{\\sigma}\n", "$$\n", "\n", "分散を計算した例題の①に対して,このスケーリングを適用してみると,\n", "\n", "$$\n", "\\begin{aligned}\n", "x_{1}&=\\dfrac {-2-0}{\\sqrt {2}}=-\\dfrac {2}{\\sqrt {2}}\\\\\n", "x_{2}&=\\dfrac {-1-0}{\\sqrt {2}}=-\\dfrac {1}{\\sqrt {2}}\\\\\n", "x_{3}&=\\dfrac {0-0}{\\sqrt {2}}=0\\\\\n", "x_{4}&=\\dfrac {1-0}{\\sqrt {2}}=\\dfrac {1}{\\sqrt {2}}\\\\\n", "x_{5}&=\\dfrac {2-0}{\\sqrt {2}}=\\dfrac {2}{\\sqrt {2}}\n", "\\end{aligned}\n", "$$\n", "\n", "のように,データが変換されます.この時の平均と標準偏差を求めてみると,\n", "\n", "$$\n", "\\begin{aligned}\n", "\\overline {x}&=\\dfrac {1}{5}\\left( -\\dfrac {2}{\\sqrt {2}}-\\dfrac {1}{\\sqrt {2}}+0+\\dfrac {1}{\\sqrt {2}}+\\dfrac {2}{\\sqrt {2}}\\right) =0\\\\\n", "\\sigma ^{2}&=\\dfrac {1}{5}\\left\\{ \\left( -\\dfrac {2}{\\sqrt {2}}-0\\right) ^{2}+\\left( -\\dfrac {1}{\\sqrt {2}}-0\\right) ^{2}+\\left( 0-0\\right) ^{2}\n", " +\\left( \\dfrac {1}{\\sqrt {2}}-0\\right) ^{2}+\\left( \\dfrac {2}{\\sqrt {2}}-0\\right) ^{2}\\right\\} =1\\\\\n", "\\sigma &=\\sqrt {\\sigma ^{2}}=1\n", "\\end{aligned}\n", "$$\n", "\n", "のように,平均0,標準偏差1にスケーリングできていることがわかります.この方法であれば,Min-Maxスケーリングと比較して,少数の外れ値には強いスケーリングが実現できます.\n", "\n", "### 外れ値除去\n", "\n", "以下のように時間によって変動するようなデータを扱うとしましょう.例えば,横軸が時刻,縦軸が温度だとします.また,平均的な温度は一定であり,温度はランダムに変動しているものと仮定します.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/17.png)\n", "\n", "このデータに対して,温度計の異常や不具合による温度の異常(外れ値)を検出したい場合,どのようにこの外れ値を定義して検出すれば良いでしょうか.一つの方法として,値の**頻度**に着目する方法があります.\n", "\n", "![](https://github.com/japan-medical-ai/medical-ai-course-materials/raw/master/notebooks/images/1/18.png)\n", "\n", "上図のように,平均に対して線を引き,それぞれの値において頻度を算出してヒストグラムを描いてみると正規分布が現れます.ここでは,データが従う分布に正規性を仮定できるとします(データが正規分布に従うかどうかを統計的に確認したい場合は,正規性検定などの方法があります).外れ値を定義するために,データの平均$\\mu$と標準偏差$\\sigma$を計算し,$\\mu \\pm 3\\sigma$の値に線を引けば,外れ値除去を行うことができます.これを**3σ法**とよびます.ただし,外れ値の回数が多かったり,外れ値が極端な値を持つ場合には平均や標準偏差がその外れ値に引っ張られ,3σ法ではうまく対処できないことがあります.\n", "\n", "その場合には,データを大きい順に並べて上位5%,下位5%を取り除くといった処理をすることもできます." ] } ] }