目次
機械学習実装の全体的な流れと事前準備のおさらい
はじめに機械学習の実装と全体的な流れを把握して、事前準備に何が必要なのか確認しましょう。
機械学習を実装するための全体像は4つのステップに分かれています。
4つのステップは以下の通りです。
事前準備
前処理
モデルの学習(今回はココ)
モデルの評価
前回の日記で、「事前準備」と「前処理」に関しては学習してきました。
今回は、「モデルの学習」について学んでいきます。
少し、細かく難しいですががんばっていきましょう。
このブログは底辺フリーランサーがG検定を取得して人生を好転させようと努力する日記です。
モデルの学習
データを入力すれば機械学習の「学習」の段階に入ります。
しかしながら、データを入力するにしても「重み」などのパラメータに関しては学習によって自動更新されますが、学習前の初期値などは人間がチューニングしなければいけません。
人工知能も万能ではないのは、人間が設定しなければいけない部分があるからです。
人間がおこなわなければいけないチューリングの事を「ハイパーパラメータ」と呼びます。
ハイパーパラメータには絶対的な答えがある訳ではありません。
機械学習を使用する人間が思考錯誤をしながらチューリングしていくことになります。
パラメータ:「重み」や「バイアス」など学習によって更新されていくパラメータ。
機械学習が自動でおこなってくれる。
ハイパーパラメータ:学習での初期値やモデルのニューロン数などは、機械学習を始める前にあらかじめ決めておく必要がある。
人間が思考錯誤しながらチューリングする。
ここからは、人間がチューリングするハイパーパラメータで調整する値を細かく見ていきましょう。
ハイパーパラメータでは、「学習率」「パラメータの更新単位」を調整します。
学習率
「学習率」とは、一度の機械学習でどのくらいの重みを更新するかというパラメータ。
学習率を大きくした場合と小さくした場合の影響は以下の通りです。
学習率を大きくする
メリット:学習が早くなるので収束までの時間が短くなる
デメリット:発散する傾向が強くなり、細かい調整が難しい
学習率を小さくする
メリット:発散する傾向が弱いので、細かい調整も可能
デメリット:学習が遅くなるので収束までの時間が長くなってしまう
パラメータの更新単位
モデルの学習をおこなっていく上で、パラメータは変更されていきます。
しかし、このパラメータの更新頻度、更新のタイミングは学習を開始する前に決めておく必要があります。
このパラメータの学習単位を決めるために知っておく必要がある概念があります。
これらの概念は、「単位」を表します。
- バッチサイズ
- イテレーション数
- エポック数
それぞれの概念を解説していきます。
バッチサイズ
機械学習では訓練データを幾つかのデータセットに分割(「サブセット」と呼ぶ)し、分割したデータをひとまとめにして学習(「バッチ処理」と呼ぶ)します。
この分割されたデータセットに含まれているデータ数を「バッチサイズ」と呼びます。
つまり、1000件のデータセットを200件のデータセットに分割した場合、200件のデータセットのバッチサイズは200になります。
ちなみに、学習の回数はバッチサイズ単位です。
バッチサイズ200の学習を1回おこなうことを、学習1回とカウントします。
イテレーション数
イテレーション数とは、訓練データに含まれている個々のデータを少なくても1回は学習するのに必要な学習回数のことです。
例えば、1000件のデータを200件のバッチサイズに分けた場合は、200×5回の学習をすることで1回の学習をさせることが可能になります。
この場合は、イテレーション数は5です。
エポック数
エポック数は、全ての訓練データを学習した場合に使用する単位です。
全ての訓練データを学習することを1エポックと呼びます。
例えば、1000のデータからバッチサイズ200を全て学習した状態(イテレーションとしては5)を1エポックと呼びます。
パラメータの更新単位まとめ
「バッチサイズ」「イテレーション数」「エポック数」の関係をまとめてみましょう。
訓練データ1000件の場合を例にとって関係性を見てみましょう。
訓練データ(1000件)
⇒サブセット(200件)×5=バッチサイズ200
⇒それぞれに学習×5=イテレーション数5
⇒イテレーション数5(全ての訓練データを学習済み)=1エポック
学習
機械学習の文脈で「学習」とは、訓練データとして正解が与えられている時に、正解と機械学習の予想を近づけるために重みを更新することを言います。
この重みを更新する処理(学習)によって、機械学習は鍛えられていきます。
この時に大事なことは、正解と予測との間にあるズレ(差)を計測する事です。
このズレ(差)を測るために使用されるのが「汎化誤差」と「誤差関数」です。
汎化誤差:「未知のデータに対する予測と実際の差」を言う。機械学習の目的は未知の結果を正確に予測すること。そのため、機械学習は訓練データだけではなく、未知のデータに対する予測モデルが求められる。汎化誤差を確認するのは、未知のデータ予測をするため。
誤差関数:誤差関数は、正解と予想の近さを評価するための関数。機械学習は誤差関数から得られた評価を元に、誤差をできる限り小さくすることが学習の目的。
機械学習は、汎化誤差が良い値になるようにハイパーパラメータをチューニングすることです。
「汎化誤差」にも3つの要素があり、それぞれ「バイアス」「バリアンス」「ノイズ」があります。
ここからは「汎化誤差」の3つの要素を詳しく見ていきましょう。
バイアス
「バイアス」は、予測モデルと学習データとの差の平均を数値化します。
予測モデルと学習モデルとの差になるので、予測モデルが単純すぎた場合に大きくなってしまいます。
例えば飲食店の過去の売り上げを学習データとして入力してから予測値を出そうとしても、季節によって飲食店の売り上げはかなり上がり下がりしてしまいます。
そのため、季節によって予測値と実際の差が大きくなります。
このデータの差が大きい状態を「バイアスが大きな状態」と言い、汎化できていないと評価できます。
バリアンス
「バリアンス」は、予測モデルの複雑さを数値化したものです。
バイアスとは反対で、予測モデルが複雑すぎると大きくなります。
複雑さが大きすぎると汎化できていないモデルと評価できます。
ノイズ
「ノイズ」は削除不能な誤差であり、学習データ自体に余計なデータが混ざっている場合に大きくなります。
これまでに紹介してきたように予測モデルが単純すぎるとバイアスが増加し、複雑すぎるとバリアンスが増加します。
バイアスとバリアンスはトレードオフ関係であり、両者のバランスの良さを測る指標が汎化誤差です。
汎化誤差が小さくなるように調整していくことで、機械学習も目的や用途に合ったものになっていきます。
機械学習実装のテスト結果
機械学習の実装に関する学習には、「モデルの評価」が残っています。
しかし、一度テストを受けてみたのでその結果報告をおこないましょう。
今回のテスト結果は、コチラのテストと内容は同じなので、こちらを参考にしてください。
ちなみにテスト結果は34問中11問正解でした。
このブログは、学習しながらリマインダーとして日記につけています。
そのため、所々理解が怪しい点や、つながりがあるのに上手く説明できていない点などもあります。
今後も一通りの学習が済んだところで見直して修正と更新をしていきます。
これまでの学習についてはコチラをご参照ください。