ディープラーニングの仕組みを理解するための一番のポイントは「損失関数」と「勾配降下法」の考え方です。本講演では、線形回帰モデルを題材に、この2つの考え方についてPythonのコーディングも含めた形で説明します。講演者の著作「最短コースでわかるディープラーニングの数学」からエッセンスをお届けします。
Pythonで理解するディープラーニング⼊⾨⽇本アイ・ビー・エム データ & AI 事業部⾚⽯ 雅典✓uk+1vk+1◆=✓ukvk◆↵✓Lu(uk, vk)Lv(uk, vk)◆
View Slide
【主な経歴】1987年⽇本アイ・ビー・エムに⼊社。東京基礎研究所で数式処理システムの研究開発に従事する。1993年にSE部⾨に異動し、主にオープン系システムのインフラ設計・構築を担当。2013年よりスマーターシティ事業、2016年8⽉にワトソン事業部に異動し、今に⾄る。現在は、Watson Studio / Watson OpenScaleなどデータサイエンス系製品の提案活動が主体。いろいろな領域を幅広くやっているので、IT基盤系・アプリ開発・プログラム⾔語・SQLチューニングはもとよりWatsonや機械学習、ディープラーニングまで⼀通り語れるのが⾃慢。【社外講師】⾦沢⼯業⼤学⼤学院 ⻁ノ⾨キャンパス客員教授 「AI技術特論」講師【著作】「Watson Studioで始める機械学習・深層学習」 リックテレコム「最短コースでわかるディープラーニングの数学」 ⽇経BPこの他雑誌や qiita (https://qiita.com/makaishi2) 執筆多数⾚⽯ 雅典⽇本IBM Data & AI 事業部WatsonテクニカルセールスExecutive IT Specialist講演者紹介
⽬次第⼀部 AIと機械学習モデル⼈⼯知能と機械学習モデル機械学習モデルとは機械学習モデルの種類第⼆部 機械学習⼊⾨機械学習の実装⽅式第三部 線形回帰モデル実習問題設定座標系の平⾏移動前処理予測関数損失関数勾配降下法実装コード
第⼀部 AIと機械学習モデル第⼀部では、AI、機械学習、教師あり学習、分類モデルなどAIに関連した⽤語を整理します。
AIと機械学習モデル⼈⼯知能(AI)範囲が広く、指し⽰す内容があいまいで、⼈によって定義がまちまちです。機械学習モデルも含まれていますが、全く別のルールベースシステムも⼈⼯知能の⼀種となります。機械学習モデル・⼊⼒から出⼒を得る仕組み・仕組み(モデル)は学習によって作られるの原理を満たすものです。ディープラーニングモデルも、本⽇の講演で詳しく解説する線形単回帰モデルも機械学習モデルの⼀種です。ルールベースシステム事前に蓄積したルール(知識ベース)とif then else のロジックで動くルールエンジンの組み合わせで、問題から解答を得る仕組みです。
機械学習モデルとは次の2つの原則を満たすモデル(システム)のことです原則1 ⼊⼒データから出⼒データを返す原則2 モデルは学習により作られるモデル⼊⼒⾎液検査データ出⼒慢性腎疾患判定横画素数 縦画素数 分類結果200 300 縦⻑250 150 横⻑150 200 縦⻑右の学習データを観察して、⼈間が次のようなルールを作るのはNGif (横画素数) < (縦画素数) then (縦⻑)
機械学習モデルの種類学習の⽅式により、次の3つの種類に分類されます。このうち、本⽇の講演の対象は教師あり学習です。教師あり学習教師なし学習強化学習学習時は、常に正解データがわかっている。学習により完成したモデルは正解に近い値を予測する。正解データなしに、モデルはなんらかの判断をする。教師あり学習と異なり「学習フェーズ」「予測フェーズ」の区別はない。モデル出⼒は環境への働きかけになる。働きかけの善悪はすぐにはわからないが、しばらくすると「報酬」としてわかる。
教師あり学習 - 回帰モデル -教師あり学習には、予測結果から次の2つの種類に⼤別されます。回帰モデル: 数値を予測分類モデル: クラス(グループ)を予測回帰モデルの例 (売上げ予測システム)モデル天気︓雪気温: 3°C⽉曜⽇天気︓晴れ気温: 20°C⽇曜⽇1万円20万円(数値を予測)売上げ⾦額
教師あり学習 - 分類モデル -分類モデルは、分類先のクラスの数が2つ(⼆値分類)なのか、3個以上(多値分類)なのかで細分されます。下記の例は多値分類です。2値分類の例としては、正常メールとスパムメールを仕分けるモデルなどがあります。分類モデルの例 (画像分類システム)モデルウマイヌネコ⼊⼒データ
第⼆部 機械学習⼊⾨第⼀部では、「機械学習モデルとはどんな振る舞いをするか」つまりモデルをブラックボックスとして⾒た時の外部の振る舞いで定義しました。第⼆部は、このブラックボックスの中⾝に焦点を絞って説明します。
機械学習の実装⽅式機械学習モデルには、様々な実装⽅式がありますが、その中の⼀部のグループはディープラーニングと密接な関係があります。具体的には、下記のモデルが該当します。ニューラルネットワークの層の数を増やしてより複雑にしたのが、ディープラーニングということができます。・線形回帰・ロジスティック回帰・ニューラルネットワーク・ディープラーニング :.C,
機械学習の実装⽅式下図で右になるほどモデルの構造は複雑になりますが、学習の⽅式はすべて共通です。そこで、本講演では、この中で最も単純でわかりやすい「線形回帰モデル」を例に、機械学習のアルゴリズムを理解していきます。11× 0× 1 = ∙ 1 !" = %&+ %()(11× 2()(1) (2) (3) = 0+ 11+ 22 = ()1活性化関数重み× × × 011121 = ()0202 = ()× (隠れ層)u(出力層)112(入力層)× a1a2af(u1)f(u2)= () = = 線形回帰 ロジスティック回帰 ニューラルネットワーク
機械学習の実装⽅式この図が線形回帰モデルからディープラーニングまで共通の学習⽅式です。この中で、「損失関数」と「勾配降下法」の2つが重要な概念となります。学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)重要概念1:正解データと予測値の近さを数値で表現する関数重要概念2:「微分」を使って損失関数が最⼩になるパラーメータ値を決定するモデルの構造は決まっている。パラメータの値が学習対象。
第三部 線形単回帰モデル第三部では、簡単な線形単回帰の問題をPythonのコーディングで実際に解いてみることにします。ここでご紹介しているコードは 下記URLからダウンロード可能です。(Notebookをブラウザで確認する場合)https://github.com/makaishi2/sample-data/blob/master/notebooks/xpython-akaishi.ipynb短縮URL http://bit.ly/2mIDmlc(Notebookをコードとしてダウンロードする場合)https://raw.githubusercontent.com/makaishi2/sample-data/master/notebooks/xpython-akaishi.ipynb短縮URL http://bit.ly/2o9aOBT
Pythonと機械学習・ディープラーニングの関係Pythonと数値演算ライブラリNumpyを利⽤すると、機械学習、ディープラーニングのコーディングが⼤変簡単に実装できます。それは、PythonとNumpyが以下のような特徴を持っているからです。・配列、ベクトル、⾏列の部分集合の抽出が簡単に⾏える。・Numpy関数は、ベクトル、⾏列の全要素に同時に演算を実⾏できる。・Numpyのブロードキャスト機能で、サイズの異なる変数間の演算も可能。・@演算⼦で変数間の内積がシンプルに表現可能。→ループ処理のない、数式通りのコーディングで⾏列計算を実装可能 ※第三部では、機械学習のアルゴリズム(数式)とPythonコード実装を対⽐することで、このことを実際に確認していきます。※ 場合によっては、数式よりPython実装の⽅がシンプルな式になることもあります。
問題設定本⽇、例題で取りあげるのは線形単回帰モデルです。x(⾝⻑)からy(体重)を予測するモデルを想定しています。回帰モデル: 数値を予測単回帰︓ ⼊⼒変数が1つ線形: モデルの構造は1次関数x ⾝⻑(cm) y 体重(kg)166 58.7176 75.7171 62.1173 70.4169 60.1
データの散布図表⽰与えられたデータをNumpy配列(data)に⼊れ、散布図表⽰する実装は次の形になります。
座標系の平⾏移動機械学習の⼊⼒データは平均0、分散1程度の値が適切です。今回は、データを平⾏移動して平均が0になるように座標系を修正しました。平均値の計算:Numpyのmean関数を利⽤します。その際「axis=0」で向きを指定します。166 58.7176 75.7171 62.1173 70.4169 60.1171 65.4122.35125.85116.55121.7114.55mean(axis = 1)mean(axis = 0)
座標系の平⾏移動Numpyのブロードキャスト機能で、次元の違う変数同⼠で引き算ができます。166 58.7176 75.7171 62.1173 70.4169 60.1171 65.4-166 58.7176 75.7171 62.1173 70.4169 60.1-171 65.4171 65.4171 65.4171 65.4171 65.4ブロードキャスト機能で変数のサイズが⾃動調整される(data) (mean)
座標系の平⾏移動平⾏移動後は、x軸、y軸とも平均値が0になっていることがグラフから読み取れます。平⾏移動前 平⾏移動後(移動前)(移動前)(移動後)(移動後)原点を移動
前処理 ⼊⼒データの抽出学習データは、⼊⼒データ(⾝⻑)の列と、正解データ(体重)の列が含まれています。ここから⼊⼒データの列を抽出します。data1[:,0:1]すべての⾏を取得0番⽬の列をベクトルのままで取得学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)┽ = ┻ɾø + ┻┼ͱॻ͖͑ͯΈ·͢ɻ͢Δͱɺ͜ͷࣜͷӈล┻ ┻ͱ͍͏ϕΫτϧͱɺ┼ ┼ͱ͍͏ϕΫτϧੵ┻ɾ┼ͱද͢͜ͱ͕Ͱ͖·͢ɻɹ1ZUIPOͰ͔Βಋೖ͞Εͨ৽ػೳͱͯ͠ɺਤ˔ਖ਼ղσʔλZUͷઃఆਤ˔ֶशσʔλ͔Βೖྗσʔλྻநग़ਤ˔ೖྗσʔλྻʹμϛʔมՃਤ˔ֶशσʔਤ˔ֶशσʔλͷฏߦҠಈͱɺ/VN1ZͷϒϩʔυΩϟετػೳਤ˔ֶशσʔλ͔Βೖྗσʔλྻநग़ਤ˔ೖྗσʔλྻʹμϛʔมՃਤ˔ֶशσʔλͷฏߦҠಈͱɺ/VN1ZͷϒϩʔυΩϟετػೳɹɹɹɹɹɹɹɹɹɹベクトルでなく「5⾏1列」の⾏列にする。(後で⾏う列追加に備えて)
前処理 正解データの抽出学習データは、⼊⼒データ(⾝⻑)の列と、正解データ(体重)の列が含まれています。ここから正解データの列を抽出します。data1[:,1]すべての⾏を取得1番⽬の列をスカラーとして取得学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)┽ = ┻ɾø + ┻┼ͱॻ͖͑ͯΈ·͢ɻ͢Δͱɺ͜ͷࣜͷӈล┻ਤ˔༧ଌؔͷఆٛਤ˔ਖ਼ղσʔλZUͷઃఆਤ˔༧ଌؔͷςετਤ˔ֶशσʔਤ˔ֶशσʔλͷฏߦҠಈͱɺ/VN1ZͷϒϩʔυΩϟετػೳ┽ = ┻ɾø + ┻┼ͱॻ͖͑ͯΈ·͢ɻ͢Δͱɺ͜ͷࣜͷӈล┻ ┻ ┻ͱ͍͏ϕΫτϧͱɺ┼ ┼ͱ͍͏ϕΫτϧͷɺੵ┻ɾ┼ͱද͢͜ͱ͕Ͱ͖·͢ɻɹ1ZUIPOͰ͔Βಋೖ͞Εͨ৽ػೳͱͯ͠ɺ!ԋਤ˔༧ଌ༧ଌਤ˔ਖ਼ղσʔλZUͷઃఆग़Ճਤ˔༧ଌ正解データは単なる5次元ベクトル
予測関数(凡例)y については、予測値と実測値の両⽅があるので、以下の表記で区別します。予測値: (predict)実測値: (true)⼀次関数を利⽤した予測関数の式は次のとおりです。 = &+ (ポイント・モデルの構造は事前に決まっている。・パラメータの値のみ⾃由度がある・学習とは最適なパラメータ値を決めるプロセスこの原理はディープラーニングでも同じです学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)
予測関数と内積計算線形回帰モデルは⼀次関数なので、予測値を記号ypで表すと、予測値の式はyp = &+ (と書けます。この式を = (&, () 、 = &, ( = (1, )とすると、(&は常に1の値を持つダミー変数とする)yp = &2 1 + ( = 2 と2つのベクトルの内積の形で表現できます。学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)
ダミー変数列の追加予測値を単純な内積の形式で計算するため、⼊⼒変数に常に1の値を持つダミー変数列を追加します。np.insert(x1, 0, 1.0, axis=1)0番⽬に挿⼊値 1.0 を挿⼊列⽅向に挿⼊挿⼊されたダミー変数列学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)
予測関数と内積計算Python3 では、内積は記号@で表記できます。この記号を使って、予測関数を内積で表現します。学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)wに勝⼿な初期値を設定して、モデルの最初の予測値を計算してみます。結果は全然間違っていますが、5つの点に対する予測値が同時に得られることがわかります。
損失関数予測関数のグラフ(直線)を⻘で⽰しました。このとき、実測値に対応した予測値の値は実測値から直線に引いた垂線の⾜に相当します。線形回帰の場合、損失関数は、差が正負どちらでもいいように「実測値-予測値」の⼆乗で計算されます。絶対値を使わないのは、絶対値を使うとこの後の微分計算がややこしくなってしまうためです。学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)ਤͰɺݩͷֶशσʔλ͔ΒɺೖྗσʔλYʹ͋ΔྻͷΈΛநग़͍ͯ͠·͢ɻී௨ʹEBUB< >ͱ͍ίʔσΟϯάʹ͢Δͱɺ݁ՌϕΫτϧʹͳΔͷͰ͢ɺ͜͜Ͱߦྻͷੑ࣭Λอͬͨ··ʹ͍ͨͨ͠Ίɺ͑ͯEBUB< >ͱ͍͏ॻ͖ํʹ͍ͯ͠·͢ɻ/VN1Zͯ͢TIBQFͱ͍͏ϓϩύςΟΛ͍࣋ͬͯͯɺ͢Δม͕Կ࣍ݩσʔλͰཁૉ͕͍ͭ͘ͳͷ͕֬ೝͰ͖ΔͷͰɺͦͷ͜ͱΛར༻ͯ͠YྻͷཁΛද͍ࣔͯ͠·͢ɻ༧ଌؔͷੵͷར༻ͱμϛʔมͷՃઢܗ୯ճؼͷ߹ɺ༧ଌΛܭࢉ͢Δࣜ ┽ ━ ┻┼Ͱ͋Γɺ͜Ε͕͜ͷ··༧ଌؔͷࣜͱͳ·͢ɻ͔͠͠ɺ1ZUIPOͰͷ࣮Λ؆୯ʹ͢ΔͨΊɺͷࣜΛ͍ͯ·͢ɻલॲཧʢਖ਼ղσʔλͷʣɹਤͰɺֶशσʔλ͔Βਖ਼ղσʔλZUͷઃఆΛ͍ͯ͠·͢ɻ͜ͷ࣍ݩϕΫτϧͷͦΕͧΕͷɺ͜Ε͔Βߦ͏ػցֶशʹ͓͍ͯ࠷ऴతͳඪͱͳΓ·͢ɻਤ˔ଛࣦؔͷߟ͑ํ 9: ZUrZQZU࣮ଌZQ༧ଌ͔͠͠ɺʹ͜ͷΑࢉͯ݁ࣜ͠ΛXͨɻ͜ͷརͳͱ͜ɹੵ
損失関数損失関数 L を数式で表現すると、下のようになります。数式の(m)の表記は「m番⽬のデータ」(実習の例だと1から5)を意味しています。Mはデータの個数(今の例だと5)です。損失関数をMで割っているのは、損失関数値をデータの個数に関係ない値にするためです。更に2で割っているのは、その後で⾏う微分計算の結果を簡単にするためです。学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)予測値を内積で表現予測値ypと実測値ytの差を誤差ydとして新たに定義誤差ydを使って損失関数を定義
損失関数 学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)損失関数の数式は次のように書き換えることができます。⾚枠で囲んだ部分は(())の平均値なので、np.mean関数を利⽤できます。結局、損失関数はPythonの場合、次のコーディングで実装できます。現段階で予測値ypはパラメータ値は適当に決めて計算しているので、損失関数の値は約50.4とかなり⼤きな値になっています。
勾配降下法最後のステップの勾配降下法とは、損失関数を微分した結果を利⽤したアルゴリズムです。今回は、アルゴリズムの実装イメージを図で説明します。数学的にきちんと理解したい場合は、最後に紹介する書籍を参照して下さい。学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)微分すると(7 + 7 ′ = ( + ) と同じことまず、損失関数の微分を計算します。
勾配降下法2変数関数 (, )があるとき、Lを最⼩にする(u, v)の値を求めたい-> (1) Lの微分※の値が0になる(u, v)を求めればいい-> (2) Lの微分にマイナスを付けた結果は、斜⾯においたボールが斜⾯を降りる向きと同じ-> (3) 少しずつ斜⾯を降りると最後は底にたどり着く※ 厳密にいうと「偏微分」です
勾配降下法✓uk+1vk+1◆=✓ukvk◆↵✓Lu(uk, vk)Lv(uk, vk)◆(, )(, )θが最小値を取るときの(, )の向き = 90°のとき、の値は変化しない(の等高線の向き)結論(重要)前ページ(2)の詳細な説明 (イメージだけ持てればいいです)斜⾯を⼀歩降りるための式。この操作を繰り返すと斜⾯の底に達する!Lの微分結果学習率 (2ページ前の微分計算結果)
勾配降下法勾配降下法のPython実装は以下のとおりです。下の式の中で alphaは学習率と呼ばれる機械学習で最も重要なパラメータで通常は0.01や0.001といった値を利⽤します。損失関数の微分計算がなぜこのコードになるかは、右の図に概要を⽰しました。学習データ yt (正解データ)モデル(学習中)yp (予測値)損失関数学習(勾配降下法)x (入力データ)学習率 損失関数の微分結果1 23 45 6X = yd =123× ×やりたいこと (Xに対して列方向の内積)X . T =1 3 52 4 6yd =123@Xの転置行列をつくれば内積計算ができる× ×✓uk+1vk+1◆=✓ukvk◆↵✓Lu(uk, vk)Lv(uk, vk)◆
実装コード(初期化処理)最後に実装コード全体を⽰します。まず、初期化処理部分です。# 初期化処理# データ系列総数 (=5)M = x.shape[0]# ⼊⼒データ次元数(ダミー変数を含む) (=2)D = x.shape[1]# 繰り返し回数iters = 200# 学習率alpha = 0.01# 重みベクトルの初期値 (勝⼿な値を設定)w = np.array([2, -1])# 評価結果記録⽤ (損失関数値, w0, w1を記録)history = np.zeros((0,4))データ系列数 M、⼊⼒データ次元数 Dを⼊⼒変数のshapeから取得することで、汎⽤的な実装コードになっている。繰り返し回数(iter)と学習率(alpha)は、案件毎に最適な値に調整する必要がある。
実装コード(繰り返し処理)次に繰り返し処理部分です。# 繰り返しループfor k in range(iters):# 予測値の計算yp = pred(x, w)# 誤差の計算yd = yp - yt# 勾配降下法の実装w = w - alpha * (x.T @ yd) / M# 学習曲線描画⽤データの計算、保存# 重みベクトル値の取得w0 = float(w[0])w1 = float(w[1])# 損失関数値の計算L = np.mean(yd ** 2) / 2# 計算結果の記録line = np.array([k, L, w0, w1])history = np.vstack((history, line))# 画⾯表⽰print( "iter = %d L = %f w0 = %f w1 = %f" % (k, L, w0, w1))勾配降下法の本質的な部分はこの3⾏だけグラフ表⽰、途中経過表⽰のためのコード
実装コード(計算結果)計算結果は次のようになりました。左の画⾯から、損失関数値Lが最後は2.3程度の⼩さな値になっていることがわかります。右の画⾯から、正解値と近い値を予測値が取っていることがわかります。iter = 0 L = 50.416000 w0 = 1.980000 w1 = -0.672800iter = 1 L = 40.291163 w0 = 1.960200 w1 = -0.383555iter = 2 L = 32.371142 w0 = 1.940598 w1 = -0.127863iter = 3 L = 26.174246 w0 = 1.921192 w1 = 0.098169iter = 4 L = 21.324050 w0 = 1.901980 w1 = 0.297982iter = 5 L = 17.526391 w0 = 1.882960 w1 = 0.474616(途中略)iter = 195 L = 2.309214 w0 = 0.278951 w1 = 1.820690iter = 196 L = 2.308424 w0 = 0.276162 w1 = 1.820690iter = 197 L = 2.307650 w0 = 0.273400 w1 = 1.820690iter = 198 L = 2.306891 w0 = 0.270666 w1 = 1.820690iter = 199 L = 2.306147 w0 = 0.267959 w1 = 1.820690ループ処理出⼒ 予測値と正解値
実装コード(計算結果)機械学習において、横軸に繰り返し回数、縦軸に精度に関するなんらかの指標を取って書いたグラフを学習曲線と呼びます。左の図は今回の例題で、損失関数値を縦軸に取った学習曲線です。繰り返し回数が増えるにつれて損失関数値が⼩さな値に収束していることがわかります。右の図は、学習データと学習によって得られた回帰直線を重ねがきしたものです。正しく直線近似できていることがわかります。学習曲線 散布図と回帰直線損失関数値繰り返し回数
ディープラーニングに向けて「予測関数」「損失関数」「勾配降下法」を⽤いて、線形回帰モデルの解を求められることがわかったと思います。実は、ロジスティック回帰モデル、ニューラルネットワークモデル、そしてディープラーニングモデルも上の3つの概念を使って解くことができます。しかし、ロジスティック回帰モデルでは、予測関数と損失関数の数式は次のような複雑なものとなります。f(u) =11 + exp ( u)このような問題を解くためにはある程度まとまった数学の知識が必要です。
ディープラーニングの理解には⽋かせない数学を⾼校1年⽣レベルから、やさしく解説します。(微分、ベクトル、⾏列、確率など)更にディープラーニングのアルゴリズムについても、Pythonのコードで確かめながら⼀歩ずつ理解できます。書名︓最短コースでわかるディープラーニングの数学出版社︓⽇経BP社著者: ⾚⽯雅典価格: 本体価格 2900円 + 税Amazonリンク: https://www.amazon.co.jp/dp/4296102508ISBN978-4296102501 344⾴参考書籍ご紹介おかげさまで⼤好評です!販売後半年で3刷 1万部
ご静聴ありがとうございました。プレゼン資料は、下記リンク先で公開しています。https://speakerdeck.com/makaishi2/pythondeli-jie-surudeipuraninguru-men(短縮URL) http://bit.ly/3370o4O書籍「ディープラーニング」サポートページURLhttps://github.com/makaishi2/math_dl_book_info/blob/master/README.md(短縮URL) http://bit.ly/315YTm3