学習曲線において精度の意味

ヘルプセンターの「深層学習を使用したsequence-to-sequence分類」の例を少しいじりました。
この例ではもともとスマートフォンから得られる加速度データを使用して、[座る→立つ→歩く→走る→踊る]という1連の流れを1つのデータにしています。この1つのデータに含まれる5つの動作を1動作づつ切り出して、1動作を1データとして作成しました。
図1 (5動作6個の加速度データ)   図2 (図1の2行目のセル配列のデータ5動作を1動作づつに分けたもの)
図1の通りにセル配列として5動作のデータを1つのデータとして格納されているのを、図2のように1動作づつを5つのデータに分けて作成し、ネットワークに学習させました。ラベルもセル配列として同じように格納しています。
図3
図4
もともとこの例にあったような構成である図1の5つの動作データが1つのデータとなっているものを学習させたところ、図3のような結果になり、学習精度は100%ですが、図2の1動作づつを5つのデータに分けて作成したものを学習させたところ、図4のように学習精度100%にはならず、精度は落ちてしまいました。
学習条件はMATLABの例をそのまま使いました。エポック数を60→100に変更しただけです。
この原因が分からずに悩んでいるのですが何かお分かりでしょうか?
また、この図3,4の青色のグラフの縦軸にある精度とは何を表しているのかを教えていただけると幸いです。
よろしくお願い致します。

 Accepted Answer

Hiro Yoshino
Hiro Yoshino on 9 Nov 2022

3 votes

恐らく悩んでいるポイントは、時系列のデータを"全部並べて学習する"のと、"分けてそれぞれ学習する" ことで結果が異なるのは何故なのか?という事だと思うんですが、それで良いですか?
そうだと仮定して、2つの場合で比較します:
[全部並べて学習する]
trainNetwork の sequences を見ていただくと分かりますが、1つの cell に入った系列データは、一続きのデータとして見なされます。従って、全データを素直に使って学習を実行することになります (図3に相当)。この場合は全データがメモリに収まるサイズであることが必要です。ディープラーニングで学習する場合は、全データがメモリに収まる場合だけではないので、"データを分割する"アイディアがあります。(もしくは、モデルの過学習を防ぐためにあえて分割するというアイディアもありますがそれはここでは、言及しません)
[データを分けてそれぞれ学習する]
データを分割して、分割されたデータ毎にネットワークパラメータを更新します。この分割単位が trainingOptions で既定される、"MiniBatchSize" です。デフォルトですと 128 なので、今回の分割5は場合は、パラメータの更新の方法としては全データを使った学習のタイミングと同じになり、見かけ上は [全部並べて学習する] と差が無いように見えます。しかし、実は MiniBatch に分けることで (今回は5) 、trainingOptions の SequenceLength の設定が適用されて、元のデータに一部 "0" の値が入って学習が進みます。MiniBatch は同じ方式でデータを処理していくため、5つに分けたデータの長さがそれぞれ異なる場合、0 等を入れて長さを揃えてしまいます(padding と言います) 。デフォルトだと一番長いデータに合わせて、短いデータには 0 が入っています。この部分が結果を悪くしているのでは?と思います。図2を見ると、5つの時系列データの長さが異なっているので、短いデータの右側に "0" が挿入されて学習が進んでいると思われます。
グラフの学習精度は今回は分類問題なので、正解率になります。正しく分類出来た数 / 全データ数 です。
損失はデフォルトでは、分類問題では一般的なクロスエントロピーです (この辺に解説があります)。

6 Comments

陽太 黒尾
陽太 黒尾 on 9 Nov 2022
回答ありがとうございます。
確かにsequenceの長さを['sequenceLength','shotest',...]を使って短いデータに合わせたところ
図5
図5のように安定して精度100%を維持することができました。
質問には書いてなかったのですが,評価データを使って動作ごとの識別結果を見たところ、識別精度が悪くなってしまいました。これは短いデータに合わせた分学習できていない箇所があるからだと考えられます。この問題を埋め合わせる解決方法などございましたら意見を頂けると幸いです。
ちなみに['sequenceLength','longest',...]で学習を行った場合は学習精度は図4の結果になり、識別精度はほぼ100%識別できていました。
学習精度100%に近づけてなお、識別精度を上げたいです。
Hiro Yoshino
Hiro Yoshino on 9 Nov 2022
Edited: Hiro Yoshino on 9 Nov 2022
(1) >質問には書いてなかったのですが,評価データを使って動作ごとの識別結果を見たところ、識別精度が悪くなってしまいました。これは短いデータに合わせた分学習できていない箇所があるからだと考えられます。この問題を埋め合わせる解決方法などございましたら意見を頂けると幸いです。
質問の意味が十分くみ取れませんでした:
[データを分けてそれぞれ学習する] の場合に、
('sequenceLength','shortest')
とすると、一部のデータが使われ無いが故に、識別精度が低下したと仰っていますか? 一応その前提で ....
解決方法以下です:
  • メモリにデータが全て乗るなら [全部並べて学習する]
  • もしくは、長いデータを平等に5分割 (任意の分割でもいいかと思います) してラベルも与える
  • MiniBatchSize = 1 にする。(ただし、この場合ミニバッチ毎にパラメータが更新されます)
(2) > ちなみに['sequenceLength','longest',...]で学習を行った場合は学習精度は図4の結果になり、識別精度はほぼ100%識別できていました。学習精度100%に近づけてなお、識別精度を上げたいです。
スミマセン。この部分も意図が十分くみ取れていません。
図4のどこを指して 100% 識別と仰っていますか? (最終的に80%くらいに見えますが) 前半部を指していますか?
一般論を申し上げると、前半部で検証データの分類精度 (100%?) が良いと思うので、この部分で学習を打ち切って良いかと思います。つまりepoch を小さくするのが良いかと。その後、学習データに対しても性能が落ちているのが気になりますが、このあたりは過学習になっていると思います。もう1つアドバイス出来るとしたら、学習率を段階的に小さくしていくと良いと思います。trainingOptions の LearnRateDropPeriod 等で学習率を制御してください。そうすると徐々に更新幅が小さくなり、良い解に細かくアプローチできると思います。
陽太 黒尾
陽太 黒尾 on 10 Nov 2022
すみません自分の説明不足,資料不足です。
図6(評価データ)
図6のデータを評価データとして識別しました。その識別結果が図7となります。
図7
'test data'という赤い線が正解の線で青い線(点)が実際の評価データとなります。結果を見るとかなりきれいに識別できています。図4のように学習精度が80%に対して識別精度が99.81%でした。この識別できる意味が不明ということで質問させていただきました。
しかし、
('sequenceLength','shortest')
を学習条件に取り入れて学習を行ったところ学習精度100%にはなりましたが識別結果が図8となります。
図8
識別精度が100%ではないことが明らかです。
この原因が分からず質問させていただきました。
Hiro Yoshino
Hiro Yoshino on 10 Nov 2022
学習精度が上がらないのは、"0" padding が理由です。0 の値で、ラベルを予測するのは無理ですよね。そこで学習データに対する評価が悪くなっています。当然、"shortest" にすれば 0 のデータが無くなるので学習データに対する評価は良くなります。test データには "0" が入っていないので、おのずと評価が良くなっているかと思います。
一方、図8では仰る通り、data が足りていない部分が有ると思われ、例えば standing のデータが学習データに無いかも知れません。その部分では学習データの一部がそのまま無い状態なので、学習データに対する評価は良くなりますが、テストデータを使うと学習時に無かったデータが入ってきてモデルは正しく分類出来なくなっていると考えられます。
解決方法は、データを全部並べて一気に学習するか、データを均等に5分割して学習するか、などが考えられます。
陽太 黒尾
陽太 黒尾 on 11 Nov 2022
ありがとうございます。
すみません最後の質問なんですけど
図9
図9のように動作データを全て並べたデータを複数学習させた場合、sequenceの長さはそれぞれバラバラですが学習精度は100%でした。デフォルトで条件は"longest"に合わせているのでデータが足りない分0で埋め合わせされているはずなのですが...
Hiro Yoshino
Hiro Yoshino on 11 Nov 2022
それも有り得るかと思います。
図2 と 図9 の大きな違いは、データ長さのバラつきです。図2 の方は "0" padding になる部分が余りに多くて、恐らく破綻したのだと思います。一方 図9 だとバラつきが少ないです。その場合はpadding の影響が少なくなる方向に作用します。今回のお使いのモデルは LSTM だと思うので、都度都度のデータだけを見て判断をしている訳ではなく、過去のデータポイントを参考にしながら判断を行っています。そこが LSTM が精度が良い理由でも有ります。恐らく学習の次点で、"0" padding がある場合、ある程度直前のデータの情報を引き継ぐように学習されたのでは?と思われます。
そもそも、"0" padding がデフォルトで適用されるという事は、この手法がある程度”使える”手法であり、極端にデータの長さが異なる状況で無ければ実用的であるということだと思います。注意点は、極力データバッチ毎のサイズを近づけるという事です。

Sign in to comment.

More Answers (1)

Hernia Baby
Hernia Baby on 9 Nov 2022

1 vote

Q1. 学習条件はMATLABの例をそのまま使いました。エポック数を60→100に変更しただけです。
この原因が分からずに悩んでいるのですが何かお分かりでしょうか?
A1. エポック数とは、「一つの訓練データを何回繰り返して学習させるか」の数です。
今回はやりすぎて過学習を起こし、精度が悪くなったと考えられます。
Q2. 図3,4の青色のグラフの縦軸にある精度とは何を表しているのか。
A2. 分類において精度とはクラスAと判断したすべてのデータのうち、実際にAであった割合です。

Categories

Find more on Deep Learning Toolbox in Help Center and File Exchange

Products

Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!