こんにちは､ そしてコースとディープラーニングにようこそ｡
さて､ ニューラルネットワークの動きを見てきましたが､ 次は学習方法についてです｡
では､ さっそく飛び込んでみましょう｡
プログラムを思い通りに動かすには､ 2つの根本的なアプローチがあります｡
一つはハードコーディングで､ プログラムに具体的なルールや求める結果を伝え､ 全体を通してガイドし､
プログラムが対処しなければならないすべての可能な選択肢を考慮するものです｡
一方で､ ニューラルネットワークを作るところがありますよね｡
プログラムが自分で必要なことを理解できるようにするための設備｡
つまり､ ニューラルネットワークを作り､ 入力を与え､ 出力として欲しいものを指示し､
あとは自分ですべてを解決させるということです｡
根本的に異なる2つのアプローチ｡
このことは､ このチュートリアルを進めていく上で､ 心に留めておくべきことです｡
私たちが目指しているのは､ このネットワークを作り､ 自ら学習していくことです｡
ルールを入れようというのは避けようと思っています｡
今すぐできる良い例として､ これはコースの後半で出てきますが､ 非常に視覚的な例です｡
例えば､ 左側の犬4匹と猫4匹はどのように区別するのですか？
左図のようなアプローチで､ 猫の耳はこうでなければならない､ というようなことをプログラムしていくわけです｡
ひげに注目､ こんな鼻に注目｡
このような顔の形に注目してください｡
この色に注目してください｡
耳がとがっていたら猫､ 耳が垂れていたら犬といった具合に､
いろいろと条件をつけていくんですね｡
一方､ ニューラルネットワークの場合は､ ニューラルネットワークをコーディングし､ アーキテクチャをコーディングし､
そして､ すでに分類された猫や犬の画像があるフォルダに､ ニューラルネットワークを向けるだけでいいんです｡
そして､ 「よし､ つかまえた」と言い聞かせるのです｡
猫や犬の画像もあるんだけどね｡
猫とは何か､ 勉強してこい｡
犬とは何かを学んできてください｡
そして､ ニューラルネットワークは､ 理解すべきことはすべて自力で理解する｡
そして､ さらにその下､ トレーニングが進んだら､ 新たに猫や犬の画像を与えると､ それが何であったかを理解できるようになるのです｡
そこで
この2つは､ 根本的に異なるアプローチです｡
そして今日は､ その2つ目のアプローチがどのように機能するのか､ ゆっくりと解説していきます｡
わかりました｡
では､ ここで本題に入りましょう｡
1層の非常に基本的なニューラルネットワークがありますが､ これは1層のフィードフォワードニューラルネットワークと呼ばれ､
パーセプトロンとも呼ばれます｡
さて､ 話を進める前に､ ひとつだけ調整する必要があるのは､
今の出力値です｡
その理由は､ 通常Yは実際の値を表し､ それを使うことになるからです｡
つまり､ Yは実際に見ることができる値になるわけです｡
実際には､ 出力値とは､ アルゴリズムによって､ ニューラルネットワークによって､ 予測された値であり､
yハットは､ 出力値である｡
基本的には出力値に対するデノミです｡
そしてパーセプトロンは､ 1957年にフランク・ローゼンブラットによって初めて発明された｡
そして､ 彼のアイデアは､ 実際に学習して調整することができるものを作ることでした｡
そしてこれが､ これから見ていくことになるのです｡
そこで､ パーセプトロンを導入しました｡
パーセプトロンの学習の仕方を見てみましょう｡
では､ パーセプトロン､ つまりニューラルネットワークに供給される入力値があるとしましょう｡
そして活性化関数が適用され､ 出力が得られます｡ 今度はその出力をグラフにプロットしてみましょう｡
そこで､ 私たちの出力yハットです｡
さて､ 学習するために必要なことは､ 出力値と､ ニューラルネットワークに正しく学習させたい実際の値とを比較することです｡
そして､ それが価値観のYです｡
それで､ ここにプロットしてみると､ 少し違いがあることがわかると思います｡
ここで､ コスト関数と呼ばれる関数を計算します｡ これは､ 実際の値と出力値との差の2乗の半分として計算されます｡
さて､ コスト関数を考えるには､ いろいろな方法があります｡
コスト関数にはさまざまなものがあります｡
これはおそらく最もよく使われるクラス関数で､ なぜ特にこの関数を使うかというと､ この関数があるからです｡
この先の勾配降下の話で分かると思います｡
しかし､ 今はこれがコスト関数であることに同意することにしよう｡
そして､ 基本的にコスト関数が教えてくれるのは､ 予測にどの程度の誤差があるかということです｡
そして､ コスト関数が低いほどYハットがYに近くなるので､ コスト関数を最小化することが目的です｡
だから､ それに同意する限り､ 話を進めましょう｡
つまり､ 基本的にここから先は､ コスト関数になります｡
そしてここから先は､ 一度比較した情報をニューラルネットワークにフィードバックすることになります｡
そうそう､ そうなんです｡
ニューラルネットワークに情報が戻され､ それが重みになり､ 重みが更新されるのです｡
基本的に､ この非常にシンプルなニューラルネットワークで制御できるのは重みw1､
w2､ wmまでのすべてで､ 目標はコスト関数を最小化することです｡
だから､ 私たちにできることは､ 重さを更新することだけなんです｡
そのため､ ウェイトを更新し､ 少し調整します｡ 具体的にどのように調整するかは､ 今後の課題ですが､ 今のところ､ ウェイトがあることに合意しています｡
重さ､ そして続ける｡
しかし､ このデータのスクリーンショットは､ この実験全体を通して､ 今やっていることはすべて､ たった1つの行を扱っているということを明確にするためのものなのです｡
つまり､ 1行のデータセットで､ 例えば「どのくらい勉強したか」を扱っているわけです｡
私たちが予測する変数は､ 試験でどんな結果が出るか､ というものです｡
そして､ 従属変数である独立変数は､ 何時間勉強したのか？
学期半ばの小テストで､ 何時間寝て､ 何点取ったか？
そこで学期の半ばに小テストがありました｡
何パーセントで行ったのですか？
それらの変数をもとに､ 試験で何点取れるかを予測するわけです｡
そして受験では､ 93％というのが実測値です｡
というわけで､ この3つの値をもう一度ニューラルネットワークに送り込み､ その結果をYと比較するのが2回目です｡
では､ その仕組みを見てみましょう｡
これらの値をニューラルネットワークに投入する｡
すべてが調整され､ ウェイトも調整される｡
ですから､ ご覧のように､ これもまた､ 値を送り込むことになります｡
ここでもポイントは､ このように同じ価値観で食べさせていることです｡
だから､ 1列しかないんです｡
私たちは､ 1列でトレーニングするようにしています｡
なぜなら､ これはごく簡単な基本的な例に過ぎないからです｡
あとは､ 列が増えたらどうなるか｡
このように､ コスト関数を調整するために､ これらの行をフィードします｡
ご覧のように､ またその線上にすべてが起こるのです｡
このように､ 重みを微調整したためにホワイトハットが変化し､ ハイヘッドが変化し､ コスト関数が変化していることがおわかりいただけると思います｡
もう一度､ 見てみましょう｡
そのため､ ホワイトハットが変化し､ コスト関数が変化している中で､ それらを投入しています｡
私たちは､ 情報をウェイトにフィードバックして､ ウェイトを再び調整するのです｡
毎回同じ値を投入して､ すべてが調整されてウェイトに戻り､
もう1回投入して､ もう1回投入する｡
そこで､ ウェイトを調整し､ 情報を投入して完成です｡
そこで今度は､ yハットはyイコール関数ゼロになる｡
通常､ コスト関数がゼロになることはありません｡
しかし､ これは非常にシンプルな例です｡
というのも､ 今回は1つの行をニューラルネットワークに取り込むだけだからです｡
そして､ 重みは､ 活性化関数の適用方法によって､ 値が乗算されるようになる｡
yと比較して､ yのハットを得る｡
そして､ コスト関数がどのように変化したかを確認します｡
その情報をニューラルネットワークにフィードバックして､ 重みを再び調整し､
また同じ行で同じプロセスを繰り返します｡
そのコスト関数を最小化しようとしているのです｡
だから今までは､ その1列だけを扱っていたんです｡
複数行の場合はどうなるのか見てみましょう｡
では､ その全データをご紹介しましょう｡
何時間寝たとか､ これは同じ試験を受けても別の生徒なんですが､ 8列あります｡
他に何時間勉強したか､ 試験前に何時間寝たか､ 小テストで何が出たか､
テストの最終結果はどうだったか｡
そして､ この左側にあるように､ 私はこの認識を8つ持っているのです｡
実は､ これらはすべて同じパーセプトロンなのです｡
だから､ これも理解することが大切です｡
ただ､ 概念的に理解できるように､ 8倍にしただけのことです｡
しかし､ ここで重要なのは､ 同じニューラルネットワークであることです｡
これを1つの同じニューラルネットワークに投入していくのです｡
では､ 行ってみましょう｡
さっそく始めてみましょう｡
アランが1エポックと言ったように､ 1エポックとは､ データセット全体を通して､ これらの行すべてに対してニューラルネットワークを学習させることです｡
では､ 行ってみましょう｡
さっそく始めてみましょう｡
そこで､ 最初の行と､ 最初の行のためのYハットがあります｡
2列目もあるんですよ｡
2列目にはホワイトハットがあります｡
つまり､ 毎回同じニューラルネットワークに投入されているわけです｡
このような状況を視覚的に確認できるように､ 何度かコピーしてみたところです｡
そしてまた､ それが繰り返されるのです｡
それが3列目です｡
4列目
4列目には私たちの白い帽子がある､ というように｡
基本的には､ その後､ 残りの4行も同じ値が得られます｡
つまり､ ニューラルネットワークに行を入力するたびに､ 値が得られるわけです｡
そして､ 実際の値と比較するのです｡
つまり､ 実際の値なんですね｡
そのため､ 1行ごとに実際の値が表示されます｡
そして今､ ホワイトハットとyの間のこれらの差のすべてに基づいて､ コスト関数を計算することができます｡
これは､ ホワイトハットとyの間のこれらの二乗差のすべての合計であり､ そのすべてが半分になるのです｡
そして､ これがコスト関数です｡
コスト関数が完成したら､ 今度は重みを更新して､ aw1､ w2､
w3を更新します｡
ここで重要なのは､ これらのパーセプトロン､ ニューラルネットワークはすべて､ 実は一つのニューラルネットワークであるということです｡
だから､ 8人もいないんです｡
1つだけあります｡
そして､ 重みを更新するときは､ その1つのニューラルネットワークの重みを更新することになるのです｡
だから､ 基本的に重さは全部の列で同じになるんです｡
だから､ すべての行にそれぞれの重みがあるかというと､ そうではありません｡
これで､ すべての行が重みを共有することになります｡
そこで､ 差の二乗の和であるコスト関数に着目し､ 重みを更新したわけです｡
そして今､ ここから先は一つの反復に過ぎなかったのです｡
次に､ この全体をもう一度実行します｡
すべての行をニューラルネットワークに送り込み､ コスト関数を求め､ このプロセスをもう一度繰り返すのです｡
以前､ 1つの行だけで､ 何度も何度も同じことを繰り返したのと同じです｡
しかし､ これからは8列､ 800列､ 8000列とやっていくことになります｡
データセットに何行あっても､ この処理をしてから､ コスト関数を計算するのです｡
そして､ ここでの目標は､ コスト関数を最小化することであり､ コスト関数の最小値を見つけたらすぐに､ それが最終的なニューラルネットワークとなるのです｡
つまり､ 重みが調整され､ 学習対象のデータセットに最適な重みが見つかったので､ テスト段階または応用段階に進む準備ができたということです｡
そして､ この一連のプロセスをバックプロパゲーションと呼びます｡
そこで､ コスト関数について､ いくつか追加で読んでおくとよいでしょう｡
そして､ 今､ 1つの話をしましたが､ いろいろなものがあります｡
クロスバリデーションに良い記事があります｡
ニューラルネットワークのアプリケーションと並行して使われるコスト関数のリストと呼ばれるものです｡
そのため､ URLはありますが､ その検索語や検索フレーズをそのままGoogleで検索すると､ こちらが最初に出てくることがわかります｡
この本には､ さまざまなコスト関数に関する良い例やアプリケーション､ ユースケースが紹介されています｡
そこで､ コスト関数について詳しく知りたい方は､ こちらの記事をご覧ください｡
というわけで､ 本日のチュートリアルをお楽しみください｡
次回､ お会いできるのを楽しみにしています｡
それまでは､ ディープラーニングを楽しんでください｡