データ拡張: データが限られている場合にディープラーニングをどのように使用するか? (下)

データ拡張: データが限られている場合にディープラーニングをどのように使用するか? (下)

私たちは皆、そこに行ったことがあります。機械学習の概念に精通しており、それを機械学習モデルに適用できます。ブラウザを開いて関連データを検索すると、一連のデータと何百枚もの関連写真が見つかるでしょう。

最も人気のあるデータセットには何千枚もの(またはそれ以上の)画像が含まれていることを思い出してください。また、大規模なデータセットを持つことがパフォーマンスにとって重要であると誰かがかつて言ったことを思い出すでしょう。あなたはがっかりして知りたいと思うでしょう: トップニューラルネットワークは限られた量のデータでもうまく機能できるのでしょうか?

答えは「はい」ですが、奇跡を目撃する前に、いくつかの基本的な質問について考える必要があります。

なぜ大量のデータが必要なのでしょうか?


一般的に使用されるニューラル ネットワークのパラメーターの数。

機械学習モデルをトレーニングする場合、実際には特定の入力 (画像) を出力 (ラベル) にマッピングするためにパラメータを調整します。最適化の目標はモデルの損失を最小限に抑えることであり、これは最適化パラメータを適切に調整することで達成できます。

成功したニューラル ネットワークには数百万のパラメーターがあります。

当然、パラメータの数が多い場合は、良好なパフォーマンスを得るために、機械学習モデルに同様にスケールされたインスタンスの数を提供する必要があります。必要なパラメータの数も、実行する必要があるタスクの複雑さに比例します。

データがあまりない場合に、より多くのデータを取得するにはどうすればよいでしょうか?

実際、データセットに大量の画像を追加する必要はありません。なぜでしょうか? ニューラル ネットワークは最初からインテリジェントではないからです。たとえば、十分にトレーニングされていないニューラル ネットワークは、次の 3 つのテニス ボールをそれぞれ異なる独立した画像だと認識します。


まったく同じテニスボールですが、ニューラル ネットワークによって異なる解釈が行われます。

したがって、より多くのデータを取得するには、既存のデータセットにわずかな調整を加えるだけで済みます。たとえば、反転、移動、回転などです。ニューラルネットワークはこのデータが異なると判断します。


動き続けるデータ拡張

畳み込みニューラル ネットワークには不変性と呼ばれる特性があり、これにより、畳み込みニューラル ネットワークが異なる方向に配置されている場合でもオブジェクトを分類できます。より具体的には、畳み込みニューラル ネットワークは、変換、視点、サイズ、照明 (またはこれらの組み合わせ) に対して不変です。

これがデータ拡張の基本的な前提です。現実の世界では、限られた条件下で撮影された一連の画像がある場合があります。ただし、私たちの対象アプリケーションは、方向、位置、スケール、明るさなど、変化する環境にある可能性があります。私たちは、こうした状況に対処するために、合成的に修正されたデータを使用してニューラル ネットワークをトレーニングします。

大量のデータがあっても、それを拡張することは役立ちますか?

確かに。これにより、データセット内の関連データの量が増えます。 これはニューラルネットワークの学習方法に関係しているので、例を挙げて説明しましょう。


データセットに 2 つのクラスがあると仮定します。左側はブランド A (Ford) を表し、右側はブランド B (Chevrolet) を表します。

トレーニングが完了し、上記の画像、つまりブランドAが入力されたとします。しかし、ニューラル ネットワークの出力は、それがブランド B の車であると考えています。高度なニューラル ネットワークを使用すれば、95% の精度が得られるはずではないでしょうか。誇張しているわけではありません。過去にも同様のことが起こっています。

[[228442]]
フォード車(ブランドA)ですが、右側を向いています。

なぜこのようなことが起こるのでしょうか? これは、ほとんどの機械学習アルゴリズムがこのように動作するからです。あるクラスを別のクラスと区別する最も明確な特徴を探します。この例では、ブランド A のすべての車は左を向き、ブランド B のすべての車は右を向いているという特徴があります。

ニューラル ネットワークの性能は、入力されるデータの品質によって決まります。

これを防ぐにはどうすればよいのでしょうか? データセット内の無関係な特徴の数を減らす必要があります。上記の車種分類器の簡単な解決策は、データセット内のクラスごとに異なる方向を向いている車の写真を追加することです。さらに良い方法としては、既存のデータセット内の写真を水平に反転して、車が反対方向を向くようにすることもできます。ここで、新しいデータセットを使用してニューラル ネットワークをトレーニングすると、必要な結果が得られます。

データセットを拡張することで、ニューラル ネットワークが無関係なパターンを学習するのを防ぎ、最終的に全体的なパフォーマンスを向上させることができます。

はじめる

さまざまな強化手法について詳しく説明する前に、まず 1 つの質問を検討する必要があります。

機械学習プロセスのどこでデータ拡張を実行しますか?

答えはかなり明白です。データセットをモデルに渡す前に拡張する、ということですね? はい、ただし、2 つのオプションがあります。1 つは、必要な変換をすべて事前に実行して、基本的にデータセットのサイズを増やすことです。もう 1 つは、機械学習モデルに入力する直前に、変換を小さなバッチで実行することです。

  • 1 つ目はオフライン拡張と呼ばれます。この方法は、比較的小さなデータ セットによく使用されます。実行した変換の数に等しい係数でデータセットのサイズが最終的に増加するためです (たとえば、すべての画像を反転すると、データセットは 2 倍に増加します)。
  • 2 番目のオプションは、オンライン拡張または動的拡張と呼ばれます。データ量の爆発的な増加に対応できないため、主に大規模なデータ セットに使用されます。代わりに、モデルに入力されるデータのミニバッチに対して対応する変更を実行することで、対応する変更を加えることができます。多くの機械学習アーキテクチャはすでにオンライン拡張をサポートしており、GPU を使用して高速化できます。

よく使われる強化技術

このセクションでは、現在広く使用されている、基本的でありながら強力な拡張テクニックをいくつか紹介します。これらのテクニックに入る前に、簡単にするために、画像の境界の外側については何も心配する必要がないと仮定しましょう。次の手法を使用すれば、私たちの仮定は有効になります。

使用した技術が画像の境界外の領域に焦点を当てた場合はどうなるでしょうか? この場合、何らかの情報を補間する必要があります。これについては、データ拡張の種類について説明した後でさらに詳しく説明します。

それぞれの手法について、データセットを拡張するための拡張係数(データ拡張係数とも呼ばれる)を定義します。

1. フリップ

画像を水平または垂直に反転できます。一部のアーキテクチャでは、画像の垂直反転がサポートされていません。ただし、画像を垂直方向に反転することは、画像を 180 度回転してから水平方向に反転することと同じです。以下は画像の反転の例です。


左から、元の画像、水平反転画像、垂直反転画像。

以下のコマンドを実行することで画像の反転が行えます。

2. 回転

この操作に関して注意すべき重要な点は、回転後に画像の寸法が保持されない可能性があることです。画像が正方形の場合、90 度回転しても画像サイズは維持されます。画像が長方形の場合、180 度回転しても画像サイズは保持されます。 ただし、画像をより小さな角度で回転させると、最終的な画像のサイズが変わります。次のセクションでは、この問題を解決する方法について説明します。以下は、90 度回転した正方形の画像の例です。


左から右に移動すると、画像は前の画像に対して時計回りに 90 度回転します。

次のいずれかのコマンドを実行して画像を回転できます。 データ増強係数 = 2~4倍

3. スケーリング

画像を拡大したり縮小したりできます。拡大すると、拡大された画像のサイズは元のサイズよりも大きくなります。ほとんどの画像処理フレームワークは、拡大された画像を元のサイズに切り取ります。画像の縮小については次のセクションで説明します。画像の縮小により画像のサイズが縮小されるため、画像の境界の外側にあるものについて想定する必要が生じるからです。以下は画像のスケーリングの例です。


左から: 元の画像、外側に 10% 拡大した画像、外側に 20% 拡大した画像。

以下のコマンドで画像の拡大縮小を実行します。データ増加係数 = 任意。

4. トリミング

スケーリングする代わりに、元の画像の一部をランダムにサンプリングします。画像のこの部分は、元の画像サイズに合わせてサイズ変更されます。この方法は、ランダム クロッピングとも呼ばれます。以下はランダムトリミングの例です。よく見ると、切り取りと拡大縮小の手法の違いに気付くでしょう。

左から、元の画像、左上隅から切り取られた正方形の部分、右下隅から切り取られた正方形の部分です。切り取られた部分は元の画像サイズに合わせてサイズ変更されます。

次の TensorFlow コマンドを使用してランダム プルーニングを実行できます。 データ増加係数 = 任意。

5. パン

移動は、画像を X 方向または Y 方向(または両方向に同時)に移動します。次の例では、画像の境界の外側に黒い背景があり、これも同期して移動していると想定しています。ほとんどのオブジェクトは画像内のどこにでも見つかるため、このデータ拡張方法は非常に便利です。これにより、畳み込みニューラル ネットワークはあらゆる場所を調べるようになります。


左から、元の画像、右に反転した画像、上に反転した画像。

TensorFlowでは、以下のコマンドで画像の変換を完了できます。データ増加係数 = 任意。

6. ガウスノイズ

過剰適合は、ニューラル ネットワークが高頻度の特徴 (つまり、非常に頻繁に出現する無意味なパターン) を学習しようとするときによく発生しますが、これらの高頻度の特徴を学習してもモデルの改善には役立ちません。

では、これらの高周波の特徴にはどのように対処すればよいのでしょうか。1 つの方法は、平均特性がゼロのガウス ノイズを使用することです。これにより、すべての周波数でデータ ポイントが生成され、高周波の特徴が効果的に歪められ、モデルへの影響が軽減されます。

しかし、これは低周波成分 (通常は重要な特徴) も影響を受けることを意味しますが、ニューラル ネットワークはそれらの影響を無視することを学習できます。適切な量​​のノイズを追加すると、ニューラル ネットワークの学習能力が効果的に向上することがわかりました。

「弱められた」バージョンは塩コショウノイズで、ランダムな白と黒のピクセルが画像全体に広がるように表示されます。これは、ガウス ノイズを追加するのと同じ効果を画像にもたらしますが、その効果はそれほど大きくありません。

左から、元の画像、ガウスノイズを追加した画像、塩コショウノイズを追加した画像。

TensorFlow では、次のコードを使用して画像にガウスノイズを追加できます。データ増強係数 = 2 倍。

高度な強化技術

現実の世界では、自然な状態のデータはさまざまな状況で存在しており、上記の単純な方法では処理できません。たとえば、写真内の風景を認識するタスク。風景には、凍ったツンドラ、草原、森林など、自然界で見られるものなら何でも当てはまります。かなり簡単な分類タスクのように思えますね。1 つを除いて、ほぼ問題ありません。モデルのパフォーマンスに影響を与える写真の重要な特徴、つまり写真が撮影された季節を見落としていました。

ニューラル ネットワークが、特定の風景がさまざまな条件 (雪、湿気、明るさなど) で存在する可能性があることを理解していないと、凍った湖畔を氷河と誤認したり、沼地を湿地と誤認したりする可能性があります。

これを軽減する 1 つの方法は、すべての季節変動を考慮できるように画像を追加することです。しかし、それは困難な仕事です。データ拡張の概念を拡張して、さまざまな季節を人工的に生成できたらどんなに素晴らしいか想像してみてください。

条件付き生成的敵対的ネットワークを見てみましょう

複雑な詳細に立ち入ることなく、条件付き生成的敵対的ネットワークは、画像をあるドメインから別のドメインに変換できます。これは漠然としすぎているように思われるかもしれませんが、そうではありません。これは実際には強力なニューラル ネットワークなのです。以下は、条件付き GAN を適用して夏の風景の写真を冬の風景に変換する例です。


CycleGANで季節を変える

(Github: https://junyanz.github.io/CycleGAN/)

上記の方法は堅牢ですが、計算負荷が高く、多くの計算パフォーマンスを必要とします。より安価なオプションは、Neural Style Transfer と呼ばれるものです。画像の質感/雰囲気/外観(別名「スタイル」)を捉え、それを他のものとミックスします。この強力な技術を使用することで、条件付き生成的敵対的ネットワークによって生成されるものと同様の効果が生成されます (実際、この方法は cGAN が発明される前に提案されました)。

このアプローチの唯一の欠点は、出力があまりにも芸術的すぎて現実的ではない可能性があることです。しかし、ディープラーニングに基づく画像スタイル転送などの分野では依然として独自の利点があり、少なくともその出力結果は印象的です。


ディープフォトスタイル転送。

これがデータセットに望ましい効果を生み出す方法に注目してください。

(出典:https://arxiv.org/abs/1703.07511)

私たちはこれらの技術の内部の仕組みに興味がないため、これらの技術を詳細に調査しませんでした。実際、既存のトレーニング済みモデルを使用し、転移学習の「魔法の力」を少し追加してデータ拡張を実行することができます。

補間入門

黒い背景のない画像を変換したい場合はどうすればよいでしょうか。画像を内側に拡大縮小したり、特定の角度に回転させたりしたいとします。これらの変換を完了した後、元の画像のサイズを維持する必要があります。画像には境界の外側の領域に関する情報が含まれていないため、いくつかの仮定を行う必要があります。一般的に、画像境界の外側の各ピクセルの値は定数 0 (RGB 値 0 は黒を意味します) であると想定します。この方法では、画像を変換した後、画像がカバーされていない黒い領域が得られます。


左から、反時計回りに 45 度回転した画像、右に反転した画像、内側に拡大した画像です。

しかし、その仮定は必ずしも正しいのでしょうか? 現実の世界では、その仮定はほとんどの場合当てはまりません。画像処理および機械学習フレームワークはいくつかの標準的な処理方法を提供しており、未知の空間をどのように埋めるかを決定できます。


左から、一定、エッジ、反射、対称、ラップの各モードです。

それらは次のように定義されます。

1. 一定の充填

最も単純な補間方法は、未知の領域を何らかの定数値で埋めることです。これは自然な画像には機能しないかもしれませんが、モノクロの背景で撮影された画像には機能します。

2. エッジ拡張

画像の端の値を境界を超えて拡張します。この方法は、わずかに平行移動した画像に使用できます。

3. 反省

画像のピクセル値は画像の境界に沿って反映されます。この方法は、木や山などを含む連続した背景や自然の背景に役立ちます。

4. 対称性

この方法は反射と似ていますが、エッジ ピクセルが反射境界を越えてコピーされる点が異なります。多くの場合、反射と対称性は同じ意味で使用されますが、非常に小さな画像やパターンを扱う場合には、違いが目立ちます。

5. パッケージ

画像をタイル状に並べるかのように、画像の境界を超えて画像を繰り返します。この方法は、多くのシナリオでは意味をなさないため、他の方法ほど一般的には使用されません。

未定義のスペースを処理するための独自の方法を設計することもできますが、一般的にこれらの方法はほとんどの分類問題に適しています。

これらすべての技術により、機械学習アルゴリズムの堅牢性を確保できるでしょうか?

適切なアプローチを使用している場合、この質問に対する答えは「はい」です。では、適切なアプローチとは何でしょうか。すべての拡張手法がデータセットに適しているとは限りません。再び車の例を考えてみましょう。画像を変更する方法はいくつかあります。

最初の画像(左から)は元の画像、2 番目の画像は水平反転、3 番目の画像は 180 度回転、最後の画像は 90 度(時計回り)回転しています。

確かに、同じ車の写真ですが、ターゲット アプリでは、その方向にある車が表示されない可能性があります。

たとえば、道路上のランダムな車を分類しようとしている場合、データセットにとって意味があるのは 2 番目の画像だけです。しかし、自動車事故を扱う保険会社を経営していて、事故でひっくり返って大破した自動車も特定したい場合は、3 番目の画像が適切です。最後の画像は、おそらく上記のどちらの場合も意味をなさないでしょう。

重要なのは、拡張技術を使用する際に、無関係なデータを追加しないようにすることです。

本当に価値があるのでしょうか?

何らかの結果が出ることを期待しているかもしれません。なるほど、私もそうしました。まず、データ拡張が実際に機能することを示す小さな例をお見せしましょう。信じられない場合は、この実験を再現して検証することができます。

データを猫、ライオン、ヒョウ、トラの 4 つのカテゴリのいずれかに分類する 2 つのニューラル ネットワークを作成しましょう。違いは、一方はデータ拡張を使用しないのに対し、もう一方は使用するという点です。データセットはこのリンクからダウンロードできます。

データセットを見ると、トレーニング セットとテスト セットの両方でクラスごとに 50 枚の画像しかないことがわかります。当然ながら、特定の分類器にブースティング技術を使用することはできません。公平を期すために、私たちは転移学習を使用して、データ不足に対してモデルの耐性を高めています。


データベース内の4つのカテゴリ

データ拡張のないニューラル ネットワークの場合、VGG19 ネットワーク アーキテクチャを使用します。この VGG19 実装に基づいて、TensorFlow を使用して最初のニューラル ネットワークを実装しました。私の Github リポジトリをクローンしたら、ここからデータセットを取得し、ここから VGG19.npy (転移学習用) をダウンロードできます。上記の作業が完了したら、モデルを実行してパフォーマンスを確認できます。

しかし、データ拡張のための追加コードを記述するのは、確かに時間がかかり、面倒な作業です。そこで、2 番目のモデルを構築する際には Nanonets を使用しました。最小限のデータで最良の結果を提供するために、内部で転移学習とデータ拡張を実装します。必要なのは、データを Web サイトにアップロードし、サーバーがデータをトレーニングするのを待つことだけです (通常約 30 分)。ご存知のとおり、これは私たちの比較実験に最適です。

トレーニングが完了したら、API を呼び出してテストの精度を計算できます。対応するサンプル コード スニペットは GitHub リポジトリにあります (スニペットにモデルの ID を挿入することを忘れないでください)。

素晴らしい結果ですね。実際、ほとんどのモデルはデータが多いほどパフォーマンスが向上します。具体的な証拠として、次の表を詳しく見てみましょう。これは、Cifar 10 (C10) および Cifar 100 (C100) データセットで一般的に使用されるニューラル ネットワークのエラー率を示しています。 C10+ 列と C100+ 列は、データ拡張後のエラー率です。

Cifar 10 および Cifar 100 データセットでのパフォーマンス

<<:  ハルビン工業大学人工知能研究所が設立され、4つのレベルと7つの方向でAIの発展をリードしています

>>:  NanoNets: データが限られている場合にディープラーニングを適用するにはどうすればよいでしょうか? (優れた)

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

人工知能の継続的な発展により、ロボットが人間に取って代わり、あらゆる労働を行うようになるのでしょうか?

[[385749]]写真はロボット最近、メディアの報道によると、人類の生存を脅かすと言われる米国の...

...

2022年にエネルギー・公益事業分野で注目すべき4つの技術トレンド

[[440332]]画像ソース: https://pixabay.com/images/id-425...

人工知能はクラウドストレージとデータサービスの革新を推進する

[[358649]]従来のストレージとデータ構造が、クラウドネイティブ アプリケーションに必要な移植...

...

宜春市はファーウェイと提携し、ビッグデータと人工知能で市のデジタル変革を推進

2019年11月21日〜22日、第一回ファーウェイ宜春市ビッグデータ・人工知能サミットフォーラムと宜...

役に立つ知識の無用性:AI技術は現代の錬金術か?

[[431348]]人工知能は新時代の錬金術となるのか?著名なAI研究者のアリ・ラヒミ氏らによると...

2024年はテクノロジー企業の終焉となるでしょうか?報告書:3年後には技術の80%が素人によって提供される

[[405703]]最近、アメリカの有名なテクノロジー調査・コンサルティング会社であるガートナーは、...

AI はどのようにしてよりスマートな建物を作り出すのでしょうか?

[[405913]]センサー、ビッグデータ、人工知能 (AI) を融合したスマート ビルの出現は、...

...

Nature: 地域や文化を超えて、AIはすべての人間に共通する16の表情を認識する

人々の間には大きな違いがしばしばありますが、私たちの存在にはほぼすべての人に共通する要素が数多くあり...

マスクを着用していても、AIはあなたが何を言っているか理解できる

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

機械学習を活用して産業オペレーションにおける運用リスクを管理する

センサーデータは、産業オペレーションにおける運用の安全性と効率性を確保する上で重要な役割を果たします...

機械学習を通じて実際のビジネス価値を掘り出すにはどうすればよいでしょうか?

運用効率の向上から継続的なイノベーションの実現まで、機械学習はビジネス開発に不可欠なものとなっていま...